diff options
author | Karl Berry <karl@freefriends.org> | 2016-12-06 00:28:11 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2016-12-06 00:28:11 +0000 |
commit | 98c0bc5c3d62d24f3f39fcc797792e70029c65aa (patch) | |
tree | 25cf0a9b31ec1d1c699632069b6a07cd2fcb8446 /Master/texmf-dist/tex/latex/forest/forest-index.sty | |
parent | 0490ce6a2a0e554c8e241df1699801decea844b8 (diff) |
forest (5dec16)
git-svn-id: svn://tug.org/texlive/trunk@42640 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/forest/forest-index.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/forest/forest-index.sty | 158 |
1 files changed, 123 insertions, 35 deletions
diff --git a/Master/texmf-dist/tex/latex/forest/forest-index.sty b/Master/texmf-dist/tex/latex/forest/forest-index.sty index e470d5ffe9e..6bd6fb774ed 100644 --- a/Master/texmf-dist/tex/latex/forest/forest-index.sty +++ b/Master/texmf-dist/tex/latex/forest/forest-index.sty @@ -8,7 +8,7 @@ %% %% `forest-index' is an indexing system for the documentation of package `forest', using the package itself. %% -%% Copyright (c) 2015 Saso Zivanovic +%% Copyright (c) 2016 Saso Zivanovic %% (Sa\v{s}o \v{Z}ivanovi\'{c}) %% saso.zivanovic@guest.arnes.si %% @@ -42,10 +42,8 @@ {\let\forestindex@resolvekey\forestindex@resolvekey@shortorlong}% \forestindex@index{example}{#1}{#3}} \DeclareDocumentCommand\indexitem{D(){} O{} t> m}{% - \IfBooleanTF{#3} - {\let\forestindex@resolvekey\forestindex@resolvekey@long} - {\let\forestindex@resolvekey\forestindex@resolvekey@shortorlong}% - \forestindex@index{definition}{default={#1},print format=item,#2}{#4}} + \let\forestindex@resolvekey\forestindex@resolvekey@long + \forestindex@index{definition}{default={#1},#2,print format+=item}{#4}} \DeclareDocumentCommand\indexset{O{} t> m}{% \IfBooleanTF{#2} {\let\forestindex@resolvekey\forestindex@resolvekey@long} @@ -58,15 +56,24 @@ \forestindex@index{#1}{#2}{#4}% } \def\forestindex@index#1#2#3{% - \forcsvlist{\forestindex@forkey{#1}{#2}}{#3}% + {\forcsvlist{\forestindex@forkey{#1}{#2}}{#3}}% } \def\forestindex@forkey#1#2#3{% \forestindex@resolvekey{#3}% - \forestset{@index/.process args={__o}{#1}{#2}{\forestindex@fullkey}}% + %\forestset{@index/.process={__o}{#1}{#2}{\forestindex@fullkey}} + \edef\forest@marshal{% + \noexpand\forestindex@index@{% + {\unexpanded{#1}}% + {\unexpanded{#2}}% + {\expandonce{\forestindex@fullkey}}% + }% + }\forest@marshal } +\def\forestindex@index@#1{\forestset{@index/.process={__o}#1}} \forestset{ declare boolean register=print, declare boolean register=index, + declare boolean register=short, short, declare toks={key}{}, declare toks={argument}{}, declare toks={index key}{}, @@ -99,10 +106,11 @@ if n=0{ content/.option=key, }{ - content/.wrap 2 pgfmath args={##1>##2}{content("!parent")}{key}, + content/.process={OOw2} {!parent.content} {key} {##1>##2}, } }{}, for root'={ + if strequal/.process={O}{!root.name}{@unknown}{TeX=\global\forest@memoizing@ok@false}{}, for tree={ print form/.option=key, index key/.option=key, @@ -113,7 +121,7 @@ every index begin, #1, }, - for reverse={ancestors}{on invalid={fake}{@@index/\forestoption{name}/.try}}, + for reverse={current and ancestors}{on invalid={fake}{@@index/\forestoption{name}/.try}}, if index entry type={definition}{}{% on invalid={fake}{@@index/\forestoption{name}/.try}, }, @@ -125,11 +133,11 @@ if index entry type={definition}{save@foridx}{}, }, stage={}, - if={index()||print()}{ + if index={ index@hypertarget/.expanded={.\forestoption{index key}}, for descendants={ - index@hypertarget/.wrap 2 pgfmath args={##1.##2}% - {index@hypertarget("!parent")}{index_key}, + index@hypertarget/.process= {OOw2} + {!parent.index@hypertarget} {index key} {##1.##2}, }, }{}, if index={ @@ -164,11 +172,11 @@ }, }, temptoksa={}, - result={}, + result'={}, if n children=0{tempboola}{not tempboola}, where index form={}{}{ - if tempboola={temptoksd/.expanded={\noexpand\protect\noexpand\hypertarget{% - \forestoption{index@hypertarget}}{}}}{temptoksd={}}, + temptoksd/.expanded={\noexpand\protect\noexpand\hypertarget{% + \forestoption{index@hypertarget}}{}}, result+/.expanded={% \forestregister{temptoksa}% \forestoption{index key}% @@ -180,7 +188,7 @@ temptoksb={}, }, result+/.expanded={|indexpagenumber\forestregister{index entry type}}, - TeX/.expanded={\noexpand\forestindex@LaTeX@index{\forestregister{result}}}, + TeX and memoize/.expanded={\noexpand\forestindex@LaTeX@index{\forestregister{result}}}, }, endgroup }{}, @@ -192,7 +200,7 @@ process keylist'={print format}{current}, print form/.register=result, }, - for first leaf'={TeX={\forestoption{print form}}}, + for first leaf'={TeX and memoize/.expanded={\forestoption{print form}}}, endgroup, }{}, } @@ -216,8 +224,8 @@ name'/.option=key, content={#1}, }{ - name'/.wrap 2 pgfmath args={##1>##2}{name("!parent")}{key}, - content/.wrap pgfmath arg={##1>#1}{content("!parent")}, + name'/.process={OOw2} {!parent.name} {key} {##1>##2}, + content/.process={Ow1} {!parent.content} {##1>#1}, }, } }, @@ -227,29 +235,33 @@ Autoforward register={set}{##1}, save@session/.style={@@index/\forestoption{name}/.global style/.register=set}, save@foridx/.style={ - if={strequal(name("!root"),"@unknown")}{}{ + if strequal/.process={O}{!root.name}{@unknown}{}{ if set={}{}{ - TeX={% - \immediate\write\forestindex@out{% - \string\indexloadsettings{\forestoption{name}}{\forestregister{set}}% + TeX and memoize/.expanded={% + \noexpand\immediate\noexpand\write\noexpand\forestindex@out{% + \noexpand\string\noexpand\indexloadsettings\noexpand\unexpanded{{\forestoption{name}}{\forestregister{set}}}% }% }, }, - if={strequal(key(),content())}{}{ - TeX={% - \immediate\write\forestindex@out{% - \string\indexdefineshortkey{\forestoption{key}}{\forestoption{content}}% + }, + if key/.process={O}{content} {} {% + if short={ + TeX and memoize/.expanded={% + \noexpand\immediate\noexpand\write\noexpand\forestindex@out{% + \noexpand\string\noexpand\indexdefineshortkey\noexpand\unexpanded{{\forestoption{key}}{\forestoption{content}}}% }% - } + }{}% } } - }, + } } \def\indexloadsettings#1#2{% \pgfkeysifdefined{/forest/@@index/#1/.@cmd}{% \forestindex@loadsettings@warning{#1}% }{}% - \forestset{@@index/#1/.global style={#2}}% + % #s in #2 are doubled; the following \def removes one layer of doubling + \def\forest@temp{#2}% + \forestset{@@index/#1/.global style/.expand once=\forest@temp}% } \def\forestindex@loadsettings@warning#1{% \PackageWarning{forest-index}{Forest index key "#1" was configured more than once! @@ -304,8 +316,8 @@ normal color/.initial=blue, definition color/.initial=red, example color/.initial=darkgreen, - print in color/.style={if stage={print}{result=\protect\textcolor{% - \pgfkeysvalueof{/forest/#1 color}}{##1}}{}}, + print in color/.style={if stage={print}{result/.expanded=\noexpand\protect\noexpand\textcolor{% + \pgfkeysvalueof{/forest/#1 color}}{\unexpanded{##1}}}{}}, print in color/.default=\forestregister{index entry type}, hyper/.style={ if stage={index}{}{ @@ -340,9 +352,10 @@ \forestset{ declare toks register=default, default={}, - item/.style={result/.wrap 4 pgfmath args={% - \item[,##2,##3]{##4}% - }{}{default}{print_form("!parent")}{result}, + item/.style={ + result/.process= {_RORw4} + {} {default} {!parent.print form} {result} + {\item[,##2,##3]{##4}}, }, } \pgfkeys{/handlers/.global style/.code=\pgfkeys{\pgfkeyscurrentpath/.global code=\pgfkeysalso{#1}}} @@ -359,9 +372,84 @@ \pgfkeys@temptoks{#2}\expandafter\xdef\csname pgfk@#1\endcsname{\the\pgfkeys@temptoks}% } \forestset{ + % unlike pgfmath function strequal, |if strequal| does not expand the compared args! + if strequal/.code n args={4}{\ifstrequal{#1}{#2}{\pgfkeysalso{#3}}{\pgfkeysalso{#4}}}, +} +\forestset{ begingroup/.code={\begingroup}, endgroup/.code={\endgroup}, } +\newtoks\forest@memo@key +\newtoks\forest@memo +\newif\ifforest@memoizing@now@ +\newif\ifforest@memoizing@ok@ +\newif\ifforest@execandmemoize@ +\def\forest@memoize#1{% #1 = \cs + \cslet{forest@memo@orig@\string#1}#1% + \def#1##1{% + \ifforest@memoizing@now@ + \forest@globalsaveandrestoreifcs{forest@execandmemoize@}{% + \global\forest@execandmemoize@false + \csname forest@memo@orig@\string#1\endcsname{##1}% + }% + \else + \expandafter\global\expandafter\forest@memo@key\expandafter{\detokenize{forest@memo@#1{##1}}}% + \ifcsname\the\forest@memo@key\endcsname + \@escapeifif{\csname\the\forest@memo@key\endcsname}% + \else + \@escapeifif{% + \global\forest@memo{}% + \global\forest@memoizing@ok@true + \global\forest@memoizing@now@true + \global\forest@execandmemoize@true + \csname forest@memo@orig@\string#1\endcsname{##1}% + \global\forest@execandmemoize@false + \global\forest@memoizing@now@false + \ifforest@memoizing@ok@ + \csxdef{\the\forest@memo@key}{\the\forest@memo}% + \immediate\write\forest@memo@out{% + \noexpand\forest@memo@load{\the\forest@memo@key}{\the\forest@memo}% + }% + \fi + }% + \fi + \fi + }% +} +\def\forest@memo@load#1#2{% + \def\forest@temp@key{#1}% + \def\forest@temp@value{#2}% + \csxdef{\detokenize\expandafter{\forest@temp@key}}{\expandonce\forest@temp@value}% + \immediate\write\forest@memo@out{% + \noexpand\forest@memo@load{\detokenize\expandafter{\forest@temp@key}}{\detokenize\expandafter{\forest@temp@value}}% + }% +} +\forestset{ + TeX and memoize/.code={\forest@execandmemoize{#1}}, +} +\def\forest@execandmemoize#1{% + \ifforest@execandmemoize@ + \let\forest@memo@next\forest@execandmemoize@ + \else + \let\forest@memo@next\@gobble + \fi + \forest@memo@next{#1}% + #1% +} +\def\forest@execandmemoize@#1{% + \gapptotoks\forest@memo{#1}% +} +\def\forest@memo@filename{\jobname.memo} +\newwrite\forest@memo@out +\immediate\openout\forest@memo@out=\forest@memo@filename.tmp +\IfFileExists{\forest@memo@filename}{% + \input\forest@memo@filename\relax +}{}% +\AtEndDocument{% + \immediate\closeout\forest@memo@out + \forest@file@copy{\forest@memo@filename.tmp}{\forest@memo@filename}% +} +\forest@memoize\forestindex@index@ \index(not print,not index)[% set={ index key=unknown, |