diff options
Diffstat (limited to 'Master/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex')
-rw-r--r-- | Master/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex | 1239 |
1 files changed, 620 insertions, 619 deletions
diff --git a/Master/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex b/Master/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex index 1a413536783..7c6d6e49cef 100644 --- a/Master/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex @@ -6,13 +6,13 @@ % 2. under the GNU Public License. % % See the file doc/generic/pgf/licenses/LICENSE for more details. -% +% % This file contains additions to pgfkeys.code.tex (loaded % automatically at the end of pgfkeys.code.tex) % % Improvements: % -% - option filtering +% - option filtering % you provide % - a boolean predicate % - a "filter handler" which will be invoked for non-matching options, @@ -50,44 +50,44 @@ % Performs 'filtered' key settings. % -% For every option for which the path prefixing has already been done, +% For every option for which the path prefixing has already been done, % the current key filter predicate will be invoked. If the predicate % returns true, pgfkeys will process this key in the normal manner. % If not, a key filter handler will be invoked. % % The *predicate* and *handler* semantics are as follows: % PRECONDITION: -% 1. The variables -% \pgfkeyscurrentkey (full path including name) -% \pgfkeyscurrentkeyRAW (the current key as it has been -% found in the key=value list -% without path modification) -% \pgfkeyscurrentvalue -% are all set. If the current key is a handler variable, -% \pgfkeyscurrentname -% and -% \pgfkeyscurrentpath -% are also set. -% 2. The type of option has already been checked, that means -% case (1) whether '.@cmd' exists -% case (2) whether the key as such has its value -% case (3) it is a handler like '.code', '.cd' or whatever. -% case (0) it is unknown. -% The actual case number (0-3) will be provided as contents -% of the macro -% \pgfkeyscasenumber. -% It is always a one-character token, so it may be compared -% with both, \ifnum or \if. -% Please note that unknown options will be processed with -% the usual '.unknown' handlers unless the key filter takes -% control over unknown options as well. +% 1. The variables +% \pgfkeyscurrentkey (full path including name) +% \pgfkeyscurrentkeyRAW (the current key as it has been +% found in the key=value list +% without path modification) +% \pgfkeyscurrentvalue +% are all set. If the current key is a handler variable, +% \pgfkeyscurrentname +% and +% \pgfkeyscurrentpath +% are also set. +% 2. The type of option has already been checked, that means +% case (1) whether '.@cmd' exists +% case (2) whether the key as such has its value +% case (3) it is a handler like '.code', '.cd' or whatever. +% case (0) it is unknown. +% The actual case number (0-3) will be provided as contents +% of the macro +% \pgfkeyscasenumber. +% It is always a one-character token, so it may be compared +% with both, \ifnum or \if. +% Please note that unknown options will be processed with +% the usual '.unknown' handlers unless the key filter takes +% control over unknown options as well. % % POSTCONDITION: -% the predicate sets -% \pgfkeysfiltercontinuetrue -% or -% \pgfkeysfiltercontinuefalse -% (the boolean \ifpgfkeysfiltercontinue). +% the predicate sets +% \pgfkeysfiltercontinuetrue +% or +% \pgfkeysfiltercontinuefalse +% (the boolean \ifpgfkeysfiltercontinue). % Depending on this 'if', option processing will be continued or % skipped. % @@ -107,43 +107,43 @@ % invoke \pgfkeyssplitpath. In any other case, neither path nor name % are required for the options processing - if you need them for % predicates/handlers, you need to compute them by hand. -% +% % % Example: % \def\unmatched{} % \pgfkeys{/pgf/key filters/is descendant of/.install key filter=/my group} % \pgfkeys{/pgf/key filter handlers/append filtered to/.install key filter handler=\unmatched} % \pgfkeysfiltered% -% {/my group/option 1=value 1,/tikz/option 2=value 2} +% {/my group/option 1=value 1,/tikz/option 2=value 2} % -> % will set '/my group/option 1' as usual, but '/tikz/option 2' will not -% be set. Instead, it will be appended to '\unmatched' such that +% be set. Instead, it will be appended to '\unmatched' such that % \unmatched = {/tikz/option 2=value2} % after the operation. % % Arguments: % #1: key-value list. \def\pgfkeysfiltered{% - % produce - % '{<default path>}' - % each expanded exactly one time into the register: - \expandafter\pgfkeysfiltered@@install\expandafter{\pgfkeysdefaultpath}% + % produce + % '{<default path>}' + % each expanded exactly one time into the register: + \expandafter\pgfkeysfiltered@@install\expandafter{\pgfkeysdefaultpath}% } % #1: old value of default path. % #2: key-value-list. \long\def\pgfkeysfiltered@@install#1#2{% - \pgfkeys@install@filter@and@invoke{% - \let\pgfkeysdefaultpath\pgfkeys@root% - \pgfkeys@parse#2,\pgfkeys@mainstop% - \def\pgfkeysdefaultpath{#1}% - }% + \pgfkeys@install@filter@and@invoke{% + \let\pgfkeysdefaultpath\pgfkeys@root% + \pgfkeys@parse#2,\pgfkeys@mainstop% + \def\pgfkeysdefaultpath{#1}% + }% } % Assuming that macro #1 contains a key=value list, this command % performs an \pgfkeysalso command for the content of macro #1. % -% It can be used in conjunction with +% It can be used in conjunction with % - \pgfkeysfiltered and % - \pgfkeysappendfilterednamestomacro: % the first pass fill only process options matching the filter, then, @@ -153,17 +153,17 @@ % Example: % \pgfkeys{/my group/.cd,/utils/exec=\pgfkeysalsofrom\filtered} \long\def\pgfkeysalsofrom#1{% - \expandafter\pgfkeysalso\expandafter{#1}% + \expandafter\pgfkeysalso\expandafter{#1}% } % The same as \pgfkeysalsofrom, but it invokes \pgfkeysalsofiltered. \long\def\pgfkeysalsofilteredfrom#1{% - \expandafter\pgfkeysalsofiltered\expandafter{#1}% + \expandafter\pgfkeysalsofiltered\expandafter{#1}% } % #1 = options \long\def\pgfkeysalsofiltered#1{% - \pgfkeys@install@filter@and@invoke{\pgfkeysalso{#1}}% + \pgfkeys@install@filter@and@invoke{\pgfkeysalso{#1}}% }% % The same like \pgfkeysfiltered, but with quick search path setting. @@ -171,28 +171,28 @@ % #1: default path % #2: key-value-pairs \long\def\pgfqkeysfiltered#1{% - \expandafter\pgfqkeysfiltered@@install\expandafter{\pgfkeysdefaultpath}{#1}% + \expandafter\pgfqkeysfiltered@@install\expandafter{\pgfkeysdefaultpath}{#1}% } % #1: old value of default path. % #2: default path % #3: key-value-list. \long\def\pgfqkeysfiltered@@install#1#2#3{% - \pgfkeys@install@filter@and@invoke{% - \def\pgfkeysdefaultpath{#2/}\pgfkeys@parse#3,\pgfkeys@mainstop\def\pgfkeysdefaultpath{#1}% - }% + \pgfkeys@install@filter@and@invoke{% + \def\pgfkeysdefaultpath{#2/}\pgfkeys@parse#3,\pgfkeys@mainstop\def\pgfkeysdefaultpath{#1}% + }% } % Family management % % The family code provides the following features: % 1. every key can be associated with 0 or 1 'family'. -% 2. Families are a loose association which are independend of the key +% 2. Families are a loose association which are independent of the key % hierarchy. % For example, /my tree/key1 can belong to family /tikz. % % 3. It is possible to "activate" or "deactivate" single families. -% Furthermore, it is possible to set only keys which belong to +% Furthermore, it is possible to set only keys which belong to % active families (using \pgfkeysfiltered). % 4. Runtime complexities: % If you have N options and you only want to process K active @@ -206,10 +206,10 @@ % % #1 maybe a macro. \def\pgfkeysactivatefamily#1{% - \pgfkeysiffamilydefined - {#1}% - {\csname pgfk@#1/familyactivetrue\endcsname}% - {\pgfkeysvalueof{/errors/family unknown/.@cmd}{#1}\pgfeov}% + \pgfkeysiffamilydefined + {#1}% + {\csname pgfk@#1/familyactivetrue\endcsname}% + {\pgfkeysvalueof{/errors/family unknown/.@cmd}{#1}\pgfeov}% %\message{[ACTIVATING FAMILY #1]}% } @@ -217,10 +217,10 @@ % % #1 maybe a macro. \def\pgfkeysdeactivatefamily#1{% - \pgfkeysiffamilydefined - {#1}% - {\csname pgfk@#1/familyactivefalse\endcsname}% - {\pgfkeysvalueof{/errors/family unknown/.@cmd}{#1}\pgfeov}% + \pgfkeysiffamilydefined + {#1}% + {\csname pgfk@#1/familyactivefalse\endcsname}% + {\pgfkeysvalueof{/errors/family unknown/.@cmd}{#1}\pgfeov}% %\message{[DEACTIVATING FAMILY #1]}% } @@ -232,26 +232,26 @@ % #1: a comma-separated list of fully qualified family names. % #2: a command which will be filled with a deactivate-all command. \def\pgfkeysactivatefamilies#1#2{% - \pgfkeyssavekeyfilterstateto\pgfkeys@cur@state - \expandafter\pgfkeysactivatefamilies@impl\expandafter{\pgfkeys@cur@state}{#1}{#2}% + \pgfkeyssavekeyfilterstateto\pgfkeys@cur@state + \expandafter\pgfkeysactivatefamilies@impl\expandafter{\pgfkeys@cur@state}{#1}{#2}% } % #1: commands needed to restore the old filtering state % #2: family name list % #3: macro name for de-activate command \def\pgfkeysactivatefamilies@impl#1#2#3{% - \pgfkeysinstallkeyfilter{/pgf/key filters/false}{}% - \let#3=\pgfkeys@empty% - \def\pgfkeys@filtered@handler{\pgfkeys@family@activate@handler{#3}}% - \pgfkeysalsofiltered{#2}% - #1% + \pgfkeysinstallkeyfilter{/pgf/key filters/false}{}% + \let#3=\pgfkeys@empty% + \def\pgfkeys@filtered@handler{\pgfkeys@family@activate@handler{#3}}% + \pgfkeysalsofiltered{#2}% + #1% } \def\pgfkeys@family@activate@handler#1{% - \pgfkeysactivatefamily{\pgfkeyscurrentkey}% - % produce - % <old list> '\pgfkeysdeactivatefamily{' <current key> '}' - \pgfkeys@tmptoks=\expandafter\expandafter\expandafter{\expandafter#1\expandafter\pgfkeysdeactivatefamily\expandafter{\pgfkeyscurrentkey}}% - \edef#1{\the\pgfkeys@tmptoks}% + \pgfkeysactivatefamily{\pgfkeyscurrentkey}% + % produce + % <old list> '\pgfkeysdeactivatefamily{' <current key> '}' + \pgfkeys@tmptoks=\expandafter\expandafter\expandafter{\expandafter#1\expandafter\pgfkeysdeactivatefamily\expandafter{\pgfkeyscurrentkey}}% + \edef#1{\the\pgfkeys@tmptoks}% } % If for testing whether a family exists. @@ -266,18 +266,18 @@ % called. \long\def\pgfkeysiffamilydefined#1#2#3{\pgfkeys@ifcsname ifpgfk@#1/familyactive\endcsname#2\else#3\fi} -% Sets the TeX boolean +% Sets the TeX boolean % \ifpgfkeysfiltercontinue := ( family #1 is active ) -% +% % Argument: % #1 the family name. Maybe a macro. \def\pgfkeysisfamilyactive#1{% - \pgfkeysiffamilydefined{#1}{% - \expandafter\let\expandafter\ifpgfkeysfiltercontinue\csname ifpgfk@#1/familyactive\endcsname - }{% - \pgfkeysvalueof{/errors/family unknown/.@cmd}{#1}\pgfeov% - \expandafter\expandafter\expandafter\let\csname ifpgfkeysfiltercontinue\endcsname\csname iffalse\endcsname - }% + \pgfkeysiffamilydefined{#1}{% + \expandafter\let\expandafter\ifpgfkeysfiltercontinue\csname ifpgfk@#1/familyactive\endcsname + }{% + \pgfkeysvalueof{/errors/family unknown/.@cmd}{#1}\pgfeov% + \expandafter\expandafter\expandafter\let\csname ifpgfkeysfiltercontinue\endcsname\csname iffalse\endcsname + }% }% % Retrieve the family of full key #1 into macro #2. @@ -292,33 +292,33 @@ % macro. % #2: a macro name which will be filled with the result. \def\pgfkeysgetfamily#1#2{% - \pgfkeysifdefined{#1/family}{\pgfkeysgetvalue{#1/family}{#2}\pgfkeyssuccesstrue}{\pgfkeyssuccessfalse}% + \pgfkeysifdefined{#1/family}{\pgfkeysgetvalue{#1/family}{#2}\pgfkeyssuccesstrue}{\pgfkeyssuccessfalse}% } % Equivalent to \pgfkeys{#1/.belongs to family=#2} \def\pgfkeyssetfamily#1#2{% - \pgfkeysiffamilydefined{#2}{% - \pgfkeyssetvalue{#1/family}{#2}% - }{% - \pgfkeysalso{/errors/family unknown=#2}% - }% + \pgfkeysiffamilydefined{#2}{% + \pgfkeyssetvalue{#1/family}{#2}% + }{% + \pgfkeysalso{/errors/family unknown=#2}% + }% }% % Sets \ifpgfkeysfiltercontinue to true iff the current key belongs to % the /errors tree. \long\def\pgfkeys@cur@is@descendant@of@errors{% - \expandafter\pgfkeys@cur@is@descendant@of@errors@impl\pgfkeyscurrentkey/errors\pgf@@eov + \expandafter\pgfkeys@cur@is@descendant@of@errors@impl\pgfkeyscurrentkey/errors\pgf@@eov }% \long\def\pgfkeys@cur@is@descendant@of@errors@impl#1/errors#2\pgf@@eov{% - \def\pgfkeyspred@TMP{#1}% - \ifx\pgfkeyspred@TMP\pgfkeys@empty + \def\pgfkeyspred@TMP{#1}% + \ifx\pgfkeyspred@TMP\pgfkeys@empty %\message{[SPECIAL CHECK] '\pgfkeyscurrentkey' is descendant of '/errors': TRUE.}% - \pgfkeysfiltercontinuetrue - \else + \pgfkeysfiltercontinuetrue + \else %\message{[SPECIAL CHECK] '\pgfkeyscurrentkey' is descendant of '/errors': FALSE.}% - \pgfkeysfiltercontinuefalse - \fi + \pgfkeysfiltercontinuefalse + \fi }% % \pgfkeysinterruptkeyfilter @@ -333,19 +333,19 @@ % \pgfkeysinterruptkeyfilter...\endpgfkeysinterruptkeyfilter does NOT % introduce a \TeX-group. \def\pgfkeysinterruptkeyfilter{% - \ifpgfkeysfilteringisactive - \let\pgfkeys@case@one=\pgfkeys@orig@case@one - \let\pgfkeys@try=\pgfkeys@orig@try - \let\pgfkeys@unknown=\pgfkeys@orig@unknown - \fi + \ifpgfkeysfilteringisactive + \let\pgfkeys@case@one=\pgfkeys@orig@case@one + \let\pgfkeys@try=\pgfkeys@orig@try + \let\pgfkeys@unknown=\pgfkeys@orig@unknown + \fi } \def\endpgfkeysinterruptkeyfilter{% - \ifpgfkeysfilteringisactive - \let\pgfkeys@case@one=\pgfkeys@case@one@filtered - \let\pgfkeys@try=\pgfkeys@try@filtered - \let\pgfkeys@unknown=\pgfkeys@unknown@filtered - \fi + \ifpgfkeysfilteringisactive + \let\pgfkeys@case@one=\pgfkeys@case@one@filtered + \let\pgfkeys@try=\pgfkeys@try@filtered + \let\pgfkeys@unknown=\pgfkeys@unknown@filtered + \fi } % Activates families #1, calls \pgfkeysfiltered and deactivates the @@ -359,9 +359,9 @@ % % @see \pgfkeysactivatefamiliesandfilteroptions \def\pgfkeysactivatefamiliesandfilteroptions#1#2{% - \pgfkeysactivatefamilies{#1}{\pgfkeys@family@deactivation}% - \pgfkeysfiltered{#2}% - \pgfkeys@family@deactivation + \pgfkeysactivatefamilies{#1}{\pgfkeys@family@deactivation}% + \pgfkeysfiltered{#2}% + \pgfkeys@family@deactivation } % The "quick" variant of \pgfkeysactivatefamiliesandfilteroptions: it @@ -371,9 +371,9 @@ % #2: default path % #3: key-value pairs \def\pgfqkeysactivatefamiliesandfilteroptions#1#2#3{% - \pgfkeysactivatefamilies{#1}{\pgfkeys@family@deactivation}% - \pgfqkeysfiltered{#2}{#3}% - \pgfkeys@family@deactivation + \pgfkeysactivatefamilies{#1}{\pgfkeys@family@deactivation}% + \pgfqkeysfiltered{#2}{#3}% + \pgfkeys@family@deactivation } % Public version of split path: @@ -386,9 +386,9 @@ % #1: family (maybe a macro) % #2: key-value pairs \def\pgfkeysactivatesinglefamilyandfilteroptions#1#2{% - \pgfkeysactivatefamily{#1}% - \pgfkeysfiltered{#2}% - \pgfkeysdeactivatefamily{#1}% + \pgfkeysactivatefamily{#1}% + \pgfkeysfiltered{#2}% + \pgfkeysdeactivatefamily{#1}% } % The "quick" variant of \pgfkeysactivatesinglefamilyandfilteroptions @@ -397,9 +397,9 @@ % #2: default path % #3: key-value pairs \def\pgfqkeysactivatesinglefamilyandfilteroptions#1#2#3{% - \pgfkeysactivatefamily{#1}% - \pgfqkeysfiltered{#2}{#3}% - \pgfkeysdeactivatefamily{#1}% + \pgfkeysactivatefamily{#1}% + \pgfqkeysfiltered{#2}{#3}% + \pgfkeysdeactivatefamily{#1}% } % Installs the key filter '#1' with argument '#2'. @@ -416,20 +416,20 @@ % #2: optional arguments for the key. If the key expects more than one % argument, supply '{{first}{second}}' \def\pgfkeysinstallkeyfilter#1#2{% - \pgfkeysifdefined{#1/.@cmd}{% - \edef\pgfkeyscurrentkeyfilter{#1}% - \def\pgfkeyscurrentkeyfilterargs{#2}% - \pgfkeysgetvalue{#1/.@cmd}{\pgfkeys@key@predicate@}% - \def\pgfkeys@key@predicate{\pgfkeys@key@predicate@#2\pgfeov}% - }{% - \pgfkeysvalueof{/errors/no such key filter/.@cmd}{#1}{#2}\pgfeov% - }% + \pgfkeysifdefined{#1/.@cmd}{% + \edef\pgfkeyscurrentkeyfilter{#1}% + \def\pgfkeyscurrentkeyfilterargs{#2}% + \pgfkeysgetvalue{#1/.@cmd}{\pgfkeys@key@predicate@}% + \def\pgfkeys@key@predicate{\pgfkeys@key@predicate@#2\pgfeov}% + }{% + \pgfkeysvalueof{/errors/no such key filter/.@cmd}{#1}{#2}\pgfeov% + }% } % Installs the key filter handler '#1' with argument '#2'. % This is equivalent to % \pgfkeys{#1/.install key filter handler=#2} -% +% % The current values of the key filter handler is stored into the public % macros % \pgfkeyscurrentkeyfilterhandler @@ -440,332 +440,333 @@ % #2: optional arguments for the handler. If the handler expects more than one % argument, supply '{{first}{second}}' \def\pgfkeysinstallkeyfilterhandler#1#2{% - \pgfkeysifdefined{#1/.@cmd}{% - \edef\pgfkeyscurrentkeyfilterhandler{#1}% - \def\pgfkeyscurrentkeyfilterhandlerargs{#2}% - \pgfkeysgetvalue{#1/.@cmd}{\pgfkeys@filtered@handler@}% - \def\pgfkeys@filtered@handler{\pgfkeys@filtered@handler@#2\pgfeov}% - }{% - \pgfkeysvalueof{/errors/no such key filter handler/.@cmd}{#1}{#2}\pgfeov% - }% + \pgfkeysifdefined{#1/.@cmd}{% + \edef\pgfkeyscurrentkeyfilterhandler{#1}% + \def\pgfkeyscurrentkeyfilterhandlerargs{#2}% + \pgfkeysgetvalue{#1/.@cmd}{\pgfkeys@filtered@handler@}% + \def\pgfkeys@filtered@handler{\pgfkeys@filtered@handler@#2\pgfeov}% + }{% + \pgfkeysvalueof{/errors/no such key filter handler/.@cmd}{#1}{#2}\pgfeov% + }% } % Creates a macro which contains commands to re-activate the current % key filter and key filter handler. It can be used to temporarily % switch the key filter. \def\pgfkeyssavekeyfilterstateto#1{% - % produce the string - % \pgfkeysinstallkeyfilter{...}{...} - % \pgfkeysinstallkeyfilterhandler{...}{...} - % where each argument is expanded once - % FIXME: Do the same with less overhead! - \pgfkeys@tmptoks={\pgfkeysinstallkeyfilter}% - \pgfkeys@tmptoks=\expandafter\expandafter\expandafter{\expandafter\the\expandafter\pgfkeys@tmptoks\expandafter{\pgfkeyscurrentkeyfilter}}% - \pgfkeys@tmptoks=\expandafter\expandafter\expandafter{\expandafter\the\expandafter\pgfkeys@tmptoks\expandafter{\pgfkeyscurrentkeyfilterargs}\pgfkeysinstallkeyfilterhandler}% - \pgfkeys@tmptoks=\expandafter\expandafter\expandafter{\expandafter\the\expandafter\pgfkeys@tmptoks\expandafter{\pgfkeyscurrentkeyfilterhandler}}% - \pgfkeys@tmptoks=\expandafter\expandafter\expandafter{\expandafter\the\expandafter\pgfkeys@tmptoks\expandafter{\pgfkeyscurrentkeyfilterhandlerargs}}% - \edef#1{% - \the\pgfkeys@tmptoks - }% + % produce the string + % \pgfkeysinstallkeyfilter{...}{...} + % \pgfkeysinstallkeyfilterhandler{...}{...} + % where each argument is expanded once + % FIXME: Do the same with less overhead! + \pgfkeys@tmptoks={\pgfkeysinstallkeyfilter}% + \pgfkeys@tmptoks=\expandafter\expandafter\expandafter{\expandafter\the\expandafter\pgfkeys@tmptoks\expandafter{\pgfkeyscurrentkeyfilter}}% + \pgfkeys@tmptoks=\expandafter\expandafter\expandafter{\expandafter\the\expandafter\pgfkeys@tmptoks\expandafter{\pgfkeyscurrentkeyfilterargs}\pgfkeysinstallkeyfilterhandler}% + \pgfkeys@tmptoks=\expandafter\expandafter\expandafter{\expandafter\the\expandafter\pgfkeys@tmptoks\expandafter{\pgfkeyscurrentkeyfilterhandler}}% + \pgfkeys@tmptoks=\expandafter\expandafter\expandafter{\expandafter\the\expandafter\pgfkeys@tmptoks\expandafter{\pgfkeyscurrentkeyfilterhandlerargs}}% + \edef#1{% + \the\pgfkeys@tmptoks + }% } \pgfkeys{% - /errors/family unknown/.code=\pgfkeys@error{% - Sorry, I do not know family '#1' and can't work with any assoicated family handling. Perhaps you misspelled it?}, - /errors/no such key filter/.code 2 args=\pgfkeys@error{Sorry, there is no such key filter '#1'.}, - /errors/no such key filter handler/.code 2 args=\pgfkeys@error{Sorry, there is no such key filter handler '#1'.}, - % HANDLERS: - % - % .is family should - % 1. '.cd' into the families' path, - % 2. define booleans to activate/deactive the family - % (see \pgfkeysisfamilyactive) - % 3. make sure that \pgfkeyshasactivefamily returns true for - % the family itsself. - /handlers/.is family/.append code={% - %\newif is an \outer macro in plain tex, so this here is not portable: - %\expandafter\newif\csname if\pgfkeyscurrentpath/familyactive\endcsname - \edef\pgfkeyspred@TMP{pgfk@\pgfkeyscurrentpath/familyactive}% - \expandafter\pgfkeys@non@outer@newif\expandafter{\pgfkeyspred@TMP}% - \edef\pgfkeyspred@TMP{\pgfkeyscurrentpath/.belongs to family=\pgfkeyscurrentpath}% - \expandafter\pgfkeysalso\expandafter{\pgfkeyspred@TMP}% - },% - /handlers/.activate family/.code=\pgfkeysactivatefamily{\pgfkeyscurrentpath}, - /handlers/.deactivate family/.code=\pgfkeysdeactivatefamily{\pgfkeyscurrentpath}, - /handlers/.belongs to family/.code={\pgfkeyssetfamily{\pgfkeyscurrentpath}{#1}},% - % - % - % An addition to the '.try' and '.retry' handlers: - % - % It is the same as '.retry', but if the option is still unknown, the - % usual handlers for unknown keys will be invoked. - /handlers/.lastretry/.code={% - \ifpgfkeyssuccess\else - \pgfkeys@try - \ifpgfkeyssuccess\else - % discard the '.lastretry' suffix: - \edef\pgfkeyscurrentkey{\pgfkeyscurrentpath}% - \pgfkeys@split@path% - \pgfkeys@unknown - \fi - \fi - }, - % - % - /handlers/.install key filter/.code={% - \pgfkeysinstallkeyfilter{\pgfkeyscurrentpath}{#1}% - },% - /handlers/.install key filter handler/.code={% - \pgfkeysinstallkeyfilterhandler{\pgfkeyscurrentpath}{#1}% - },% - % - % - % KEY FILTER HANDLERS: - % - /pgf/key filter handlers/append filtered to/.code={% - % Produce - % <orig key> '={' <value> '}' - % where both, the key and the value are expanded just ONCE: - \pgfkeys@tmptoks=\expandafter\expandafter\expandafter{\expandafter\pgfkeyscurrentkeyRAW\expandafter=\expandafter{\pgfkeyscurrentvalue}}% - \ifx#1\pgfkeys@empty - \else - % Produce <old list> ',' <orig key> '={' <value> '}' - \pgfkeys@tmptoks=\expandafter\expandafter\expandafter{\expandafter#1\expandafter,\the\pgfkeys@tmptoks}% - \fi - \edef#1{\the\pgfkeys@tmptoks}% - },% - /pgf/key filter handlers/ignore/.code={}, - /pgf/key filter handlers/ignore/.install key filter handler, - /pgf/key filter handlers/log/.code={% - \pgf@typeout{LOG: the option '\pgfkeyscurrentkey' (was originally '\pgfkeyscurrentkeyRAW') (case \pgfkeyscasenumber) has not been processed due to pgfkeysfiltered.}% - }, - % - % - % KEY FILTER PREDICATES: - % - % Returns true iff the currently processed key belongs to an active family. - % A family is active if it has been activated before. - /pgf/key filters/active families/.code={% - \if\pgfkeyscasenumber0% - % unknown options shall be processed with the - % unknown-handlers. - \pgfkeysfiltercontinuetrue - \else - \if\pgfkeyscasenumber3% - \pgfkeysgetfamily\pgfkeyscurrentpath\pgfkeyspred@TMP - \else - \pgfkeysgetfamily\pgfkeyscurrentkey\pgfkeyspred@TMP - \fi - \ifpgfkeyssuccess - \pgfkeysisfamilyactive{\pgfkeyspred@TMP}% - \else% Ok, it does not belong to any family. - \pgfkeysfiltercontinuefalse - \fi - \fi - },% - % - % - % - % This filter works as follows: - % 1. if the current key belongs to a family: - % return whether its family is active, - % 2. if the current key does NOT belong to a family: - % return the result of criterion '#1', - % 3. the current key is unknown: - % return the result of criterion '#2'. - % - % Arguments: - % #1: the predicate which will be invoked in case 2. - % It will be invoked with the current case number as argument. - % #2: the predicate which will be invoked in case 3 with - % the current case number as argument. - /pgf/key filters/active families or no family/.code 2 args={% - \if\pgfkeyscasenumber0% - \pgfkeysevalkeyfilterwith{#2}% - \else - \if\pgfkeyscasenumber3% - \pgfkeysgetfamily\pgfkeyscurrentpath\pgfkeyspred@TMP - \else - \pgfkeysgetfamily\pgfkeyscurrentkey\pgfkeyspred@TMP - \fi - \ifpgfkeyssuccess - \pgfkeysisfamilyactive{\pgfkeyspred@TMP}% - \else% Ok, it does not belong to any family. - \pgfkeysevalkeyfilterwith{#1}% - \fi - \fi - }, - /pgf/key filters/active families or no family DEBUG/.code 2 args={% - \if\pgfkeyscasenumber0% - \pgf@typeout{[pgfkeyshasactivefamilyornofamily(\pgfkeyscurrentkey, \pgfkeyscasenumber) invoking unknown handler '#2']}% - \pgfkeysevalkeyfilterwith{#2}% - \else - \if\pgfkeyscasenumber3% - \pgfkeysgetfamily\pgfkeyscurrentpath\pgfkeyspred@TMP - \else - \pgfkeysgetfamily\pgfkeyscurrentkey\pgfkeyspred@TMP - \fi - \ifpgfkeyssuccess - \pgfkeysisfamilyactive{\pgfkeyspred@TMP}% - \ifpgfkeysfiltercontinue - \pgf@typeout{[pgfkeyshasactivefamilyornofamily(\pgfkeyscurrentkey, \pgfkeyscasenumber) family is ACTIVE]}% - \else - \pgf@typeout{[pgfkeyshasactivefamilyornofamily(\pgfkeyscurrentkey, \pgfkeyscasenumber) family is NOT active.]}% - \fi - \else% Ok, it does not belong to any family. - \pgf@typeout{[pgfkeyshasactivefamilyornofamily(\pgfkeyscurrentkey, \pgfkeyscasenumber) invoking has-no-family-handler '#1']}% - \pgfkeysevalkeyfilterwith{#1}% - \fi - \fi - }, - % - % A (faster) shortcut for - % /pgf/key filters/active families or no family= - % {/pgf/keys filters/false} - % {/pgf/keys filters/false} - /pgf/key filters/active families and known/.code={% - \if\pgfkeyscasenumber0% - \pgfkeysfiltercontinuefalse - \else - \if\pgfkeyscasenumber3% - \pgfkeysgetfamily\pgfkeyscurrentpath\pgfkeyspred@TMP - \else - \pgfkeysgetfamily\pgfkeyscurrentkey\pgfkeyspred@TMP - \fi - \ifpgfkeyssuccess - \pgfkeysisfamilyactive{\pgfkeyspred@TMP}% - \else% Ok, it does not belong to any family. - \pgfkeysfiltercontinuefalse - \fi - \fi - }, - % A (faster) shortcut for - % /pgf/key filters/active families or no family= - % {/pgf/key filters/is descendant of=#1}% for keys without family - % {/pgf/keys filters/false} - /pgf/key filters/active families or descendants of/.code={% - \if\pgfkeyscasenumber0% - \pgfkeysfiltercontinuefalse - \else - \if\pgfkeyscasenumber3% - \pgfkeysgetfamily\pgfkeyscurrentpath\pgfkeyspred@TMP - \else - \pgfkeysgetfamily\pgfkeyscurrentkey\pgfkeyspred@TMP - \fi - \ifpgfkeyssuccess - \pgfkeysisfamilyactive{\pgfkeyspred@TMP}% - \else% Ok, it does not belong to any family. - % the 'is descendendant of' implementation has been - % COPY PASTED here: - % - % string prefix comparison: - \def\pgfkeysisdescendantof@impl##1#1##2\pgf@@eov{% - \def\pgfkeyspred@TMP{##1}% - \ifx\pgfkeyspred@TMP\pgfkeys@empty - \pgfkeysfiltercontinuetrue - \else - \pgfkeysfiltercontinuefalse - \fi - }% - \expandafter\pgfkeysisdescendantof@impl\pgfkeyscurrentkey#1\pgf@@eov - \fi - \fi - }, - % - % Processes only options which are childs of #1. - % Example: - % is descendant of/.install key filter=/foo - % will be true for - % /foo/bar/x=y - % /foo/.cd - % /foo/bar/.style=... - % but not for - % /bar/foo/... - /pgf/key filters/is descendant of/.code={% - \if\pgfkeyscasenumber0% + /errors/family unknown/.code=\pgfkeys@error{% + Sorry, I do not know family '#1' and can't work with any assoicated family handling. Perhaps you misspelled it?}, + /errors/no such key filter/.code 2 args=\pgfkeys@error{Sorry, there is no such key filter '#1'.}, + /errors/no such key filter handler/.code 2 args=\pgfkeys@error{Sorry, there is no such key filter handler '#1'.}, + % HANDLERS: + % + % .is family should + % 1. '.cd' into the families' path, + % 2. define booleans to activate/deactive the family + % (see \pgfkeysisfamilyactive) + % 3. make sure that \pgfkeyshasactivefamily returns true for + % the family itself. + /handlers/.is family/.append code={% + %\newif is an \outer macro in plain tex, so this here is not portable: + %\expandafter\newif\csname if\pgfkeyscurrentpath/familyactive\endcsname + \edef\pgfkeyspred@TMP{pgfk@\pgfkeyscurrentpath/familyactive}% + \expandafter\pgfkeys@non@outer@newif\expandafter{\pgfkeyspred@TMP}% + \edef\pgfkeyspred@TMP{\pgfkeyscurrentpath/.belongs to family=\pgfkeyscurrentpath}% + \expandafter\pgfkeysalso\expandafter{\pgfkeyspred@TMP}% + },% + /handlers/.activate family/.code=\pgfkeysactivatefamily{\pgfkeyscurrentpath}, + /handlers/.deactivate family/.code=\pgfkeysdeactivatefamily{\pgfkeyscurrentpath}, + /handlers/.belongs to family/.code={\pgfkeyssetfamily{\pgfkeyscurrentpath}{#1}},% + % + % + % An addition to the '.try' and '.retry' handlers: + % + % It is the same as '.retry', but if the option is still unknown, the + % usual handlers for unknown keys will be invoked. + /handlers/.lastretry/.code={% + \ifpgfkeyssuccess\else + \pgfkeys@try + \ifpgfkeyssuccess\else + % discard the '.lastretry' suffix: + \edef\pgfkeyscurrentkey{\pgfkeyscurrentpath}% + \pgfkeys@split@path% + \pgfkeys@unknown + \fi + \fi + }, + % + % + /handlers/.install key filter/.code={% + \pgfkeysinstallkeyfilter{\pgfkeyscurrentpath}{#1}% + },% + /handlers/.install key filter handler/.code={% + \pgfkeysinstallkeyfilterhandler{\pgfkeyscurrentpath}{#1}% + },% + % + % + % KEY FILTER HANDLERS: + % + /pgf/key filter handlers/append filtered to/.code={% + % Produce + % <orig key> '={' <value> '}' + % where both, the key and the value are expanded just ONCE: + \pgfkeys@tmptoks=\expandafter\expandafter\expandafter{\expandafter\pgfkeyscurrentkeyRAW\expandafter=\expandafter{\pgfkeyscurrentvalue}}% + \ifx#1\pgfkeys@empty + \else + % Produce <old list> ',' <orig key> '={' <value> '}' + \pgfkeys@tmptoks=\expandafter\expandafter\expandafter{\expandafter#1\expandafter,\the\pgfkeys@tmptoks}% + \fi + \edef#1{\the\pgfkeys@tmptoks}% + },% + /pgf/key filter handlers/ignore/.code={}, + /pgf/key filter handlers/ignore/.install key filter handler, + /pgf/key filter handlers/log/.code={% + \pgf@typeout{LOG: the option '\pgfkeyscurrentkey' (was originally '\pgfkeyscurrentkeyRAW') (case \pgfkeyscasenumber) has not been processed due to pgfkeysfiltered.}% + }, + % + % + % KEY FILTER PREDICATES: + % + % Returns true if the currently processed key belongs to an active family. + % A family is active if it has been activated before. + /pgf/key filters/active families/.code={% + \if\pgfkeyscasenumber0% + % unknown options shall be processed with the + % unknown-handlers. + \pgfkeysfiltercontinuetrue + \else + \if\pgfkeyscasenumber3% + \pgfkeysgetfamily\pgfkeyscurrentpath\pgfkeyspred@TMP + \else + \pgfkeysgetfamily\pgfkeyscurrentkey\pgfkeyspred@TMP + \fi + \ifpgfkeyssuccess + \pgfkeysisfamilyactive{\pgfkeyspred@TMP}% + \else% Ok, it does not belong to any family. + \pgfkeysfiltercontinuefalse + \fi + \fi + },% + % + % + % + % This filter works as follows: + % 1. if the current key belongs to a family: + % return whether its family is active, + % 2. if the current key does NOT belong to a family: + % return the result of criterion '#1', + % 3. the current key is unknown: + % return the result of criterion '#2'. + % + % Arguments: + % #1: the predicate which will be invoked in case 2. + % It will be invoked with the current case number as argument. + % #2: the predicate which will be invoked in case 3 with + % the current case number as argument. + /pgf/key filters/active families or no family/.code 2 args={% + \if\pgfkeyscasenumber0% + \pgfkeysevalkeyfilterwith{#2}% + \else + \if\pgfkeyscasenumber3% + \pgfkeysgetfamily\pgfkeyscurrentpath\pgfkeyspred@TMP + \else + \pgfkeysgetfamily\pgfkeyscurrentkey\pgfkeyspred@TMP + \fi + \ifpgfkeyssuccess + \pgfkeysisfamilyactive{\pgfkeyspred@TMP}% + \else% Ok, it does not belong to any family. + \pgfkeysevalkeyfilterwith{#1}% + \fi + \fi + }, + /pgf/key filters/active families or no family DEBUG/.code 2 args={% + \if\pgfkeyscasenumber0% + \pgf@typeout{[pgfkeyshasactivefamilyornofamily(\pgfkeyscurrentkey, \pgfkeyscasenumber) invoking unknown handler '#2']}% + \pgfkeysevalkeyfilterwith{#2}% + \else + \if\pgfkeyscasenumber3% + \pgfkeysgetfamily\pgfkeyscurrentpath\pgfkeyspred@TMP + \else + \pgfkeysgetfamily\pgfkeyscurrentkey\pgfkeyspred@TMP + \fi + \ifpgfkeyssuccess + \pgfkeysisfamilyactive{\pgfkeyspred@TMP}% + \ifpgfkeysfiltercontinue + \pgf@typeout{[pgfkeyshasactivefamilyornofamily(\pgfkeyscurrentkey, \pgfkeyscasenumber) family is ACTIVE]}% + \else + \pgf@typeout{[pgfkeyshasactivefamilyornofamily(\pgfkeyscurrentkey, \pgfkeyscasenumber) family is NOT active.]}% + \fi + \else% Ok, it does not belong to any family. + \pgf@typeout{[pgfkeyshasactivefamilyornofamily(\pgfkeyscurrentkey, \pgfkeyscasenumber) invoking has-no-family-handler '#1']}% + \pgfkeysevalkeyfilterwith{#1}% + \fi + \fi + }, + % + % A (faster) shortcut for + % /pgf/key filters/active families or no family= + % {/pgf/keys filters/false} + % {/pgf/keys filters/false} + /pgf/key filters/active families and known/.code={% + \if\pgfkeyscasenumber0% + \pgfkeysfiltercontinuefalse + \else + \if\pgfkeyscasenumber3% + \pgfkeysgetfamily\pgfkeyscurrentpath\pgfkeyspred@TMP + \else + \pgfkeysgetfamily\pgfkeyscurrentkey\pgfkeyspred@TMP + \fi + \ifpgfkeyssuccess + \pgfkeysisfamilyactive{\pgfkeyspred@TMP}% + \else% Ok, it does not belong to any family. + \pgfkeysfiltercontinuefalse + \fi + \fi + }, + % A (faster) shortcut for + % /pgf/key filters/active families or no family= + % {/pgf/key filters/is descendant of=#1}% for keys without family + % {/pgf/keys filters/false} + /pgf/key filters/active families or descendants of/.code={% + \if\pgfkeyscasenumber0% + \pgfkeysfiltercontinuefalse + \else + \if\pgfkeyscasenumber3% + \pgfkeysgetfamily\pgfkeyscurrentpath\pgfkeyspred@TMP + \else + \pgfkeysgetfamily\pgfkeyscurrentkey\pgfkeyspred@TMP + \fi + \ifpgfkeyssuccess + \pgfkeysisfamilyactive{\pgfkeyspred@TMP}% + \else% Ok, it does not belong to any family. + % the 'is descendant of' implementation has been + % COPY PASTED here: + % + % string prefix comparison: + \def\pgfkeysisdescendantof@impl##1#1##2\pgf@@eov{% + \def\pgfkeyspred@TMP{##1}% + \ifx\pgfkeyspred@TMP\pgfkeys@empty + \pgfkeysfiltercontinuetrue + \else + \pgfkeysfiltercontinuefalse + \fi + }% + \expandafter\pgfkeysisdescendantof@impl\pgfkeyscurrentkey#1\pgf@@eov + \fi + \fi + }, + % + % Processes only options which are children of #1. + % Example: + % is descendant of/.install key filter=/foo + % will be true for + % /foo/bar/x=y + % /foo/.cd + % /foo/bar/.style=... + % but not for + % /bar/foo/... + /pgf/key filters/is descendant of/.code={% + \if\pgfkeyscasenumber0% %\message{'\pgfkeyscurrentkey' (case \pgfkeyscasenumber) is UNKNOWN. Calling unknown handler.}% - % unknown options shall be processed with the - % unknown-handlers. - \pgfkeysfiltercontinuetrue - \else - % string prefix comparison: - % [ note : this has been COPY-PASTED to - % |active families or descendants of| ] - \def\pgfkeysisdescendantof@impl##1#1##2\pgf@@eov{% - \def\pgfkeyspred@TMP{##1}% - \ifx\pgfkeyspred@TMP\pgfkeys@empty + % unknown options shall be processed with the + % unknown-handlers. + \pgfkeysfiltercontinuetrue + \else + % string prefix comparison: + % [ note : this has been COPY-PASTED to + % |active families or descendants of| ] + \def\pgfkeysisdescendantof@impl##1#1##2\pgf@@eov{% + \def\pgfkeyspred@TMP{##1}% + \ifx\pgfkeyspred@TMP\pgfkeys@empty %\message{'\pgfkeyscurrentkey' (case \pgfkeyscasenumber) is descendant of '#1': TRUE.}% - \pgfkeysfiltercontinuetrue - \else + \pgfkeysfiltercontinuetrue + \else %\message{'\pgfkeyscurrentkey' (case \pgfkeyscasenumber) is descendant of '#1': FALSE.}% - \pgfkeysfiltercontinuefalse - \fi - }% - \expandafter\pgfkeysisdescendantof@impl\pgfkeyscurrentkey#1\pgf@@eov - \fi - },% - % - % - % - % Returns true if the currently processed full key equals #2. - /pgf/key filters/equals/.code={% - \if\pgfkeyscasenumber0% - % Unknown option: - \pgfkeysfiltercontinuetrue - \else - \def\pgfkeyspred@TMP{#1}% - \ifx\pgfkeyscurrentkey\pgfkeyspred@TMP - \pgfkeysfiltercontinuetrue - \else - \pgfkeysfiltercontinuefalse - \fi - \fi - },% - % - % - % Argument #1 can be any other (evaluated) filter predicate, its logical return - % value will be inverted. - % Example: - % not/.install key filter={is descendend of=/tikz} - % will install a key filter which evaluates 'is descendant of' with argument '/tikz' and returns the logical negation of the result. - % - /pgf/key filters/not/.code={% - \pgfkeysevalkeyfilterwith{#1}% - \ifpgfkeysfiltercontinue - \pgfkeysfiltercontinuefalse - \else - \pgfkeysfiltercontinuetrue - \fi - },% - /pgf/key filters/and/.code 2 args={% - \pgfkeysevalkeyfilterwith{#1}% - \ifpgfkeysfiltercontinue - \pgfkeysevalkeyfilterwith{#2}% - \fi - },% - /pgf/key filters/or/.code 2 args={% - \pgfkeysevalkeyfilterwith{#1}% - \ifpgfkeysfiltercontinue - \else - \pgfkeysevalkeyfilterwith{#2}% - \fi - },% - /pgf/key filters/true/.code={\pgfkeysfiltercontinuetrue},% - /pgf/key filters/true/.install key filter, - /pgf/key filters/false/.code={% - \pgfkeysfiltercontinuefalse - },% - % - % Returns false if the current key is unknown, which avoids calling - % the unknown handlers. - /pgf/key filters/defined/.code={% - \if\pgfkeyscasenumber0% - \pgfkeysfiltercontinuefalse - \else - \pgfkeysfiltercontinuetrue - \fi - }, + \pgfkeysfiltercontinuefalse + \fi + }% + \expandafter\pgfkeysisdescendantof@impl\pgfkeyscurrentkey#1\pgf@@eov + \fi + },% + % + % + % + % Returns true if the currently processed full key equals #2. + /pgf/key filters/equals/.code={% + \if\pgfkeyscasenumber0% + % Unknown option: + \pgfkeysfiltercontinuetrue + \else + \def\pgfkeyspred@TMP{#1}% + \ifx\pgfkeyscurrentkey\pgfkeyspred@TMP + \pgfkeysfiltercontinuetrue + \else + \pgfkeysfiltercontinuefalse + \fi + \fi + },% + % + % + % Argument #1 can be any other (evaluated) filter predicate, its logical return + % value will be inverted. + % Example: + % not/.install key filter={is descendant of=/tikz} + % will install a key filter which evaluates 'is descendant of' with argument + % '/tikz' and returns the logical negation of the result. + % + /pgf/key filters/not/.code={% + \pgfkeysevalkeyfilterwith{#1}% + \ifpgfkeysfiltercontinue + \pgfkeysfiltercontinuefalse + \else + \pgfkeysfiltercontinuetrue + \fi + },% + /pgf/key filters/and/.code 2 args={% + \pgfkeysevalkeyfilterwith{#1}% + \ifpgfkeysfiltercontinue + \pgfkeysevalkeyfilterwith{#2}% + \fi + },% + /pgf/key filters/or/.code 2 args={% + \pgfkeysevalkeyfilterwith{#1}% + \ifpgfkeysfiltercontinue + \else + \pgfkeysevalkeyfilterwith{#2}% + \fi + },% + /pgf/key filters/true/.code={\pgfkeysfiltercontinuetrue},% + /pgf/key filters/true/.install key filter, + /pgf/key filters/false/.code={% + \pgfkeysfiltercontinuefalse + },% + % + % Returns false if the current key is unknown, which avoids calling + % the unknown handlers. + /pgf/key filters/defined/.code={% + \if\pgfkeyscasenumber0% + \pgfkeysfiltercontinuefalse + \else + \pgfkeysfiltercontinuetrue + \fi + }, }% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -779,192 +780,192 @@ % but it applies filtering whenever it identified the type of an % option. \def\pgfkeys@case@one@filtered{% - \pgfkeys@cur@is@descendant@of@errors - \ifpgfkeysfiltercontinue - \pgfkeys@orig@case@one - \else - \pgfkeysfiltercontinuetrue - \pgfkeysifdefined{\pgfkeyscurrentkey/.@cmd}{% - % CASE ONE: a command option - \def\pgfkeyscasenumber{1}% - \pgfkeys@key@predicate% - \ifpgfkeysfiltercontinue + \pgfkeys@cur@is@descendant@of@errors + \ifpgfkeysfiltercontinue + \pgfkeys@orig@case@one + \else + \pgfkeysfiltercontinuetrue + \pgfkeysifdefined{\pgfkeyscurrentkey/.@cmd}{% + % CASE ONE: a command option + \def\pgfkeyscasenumber{1}% + \pgfkeys@key@predicate% + \ifpgfkeysfiltercontinue %\message{PROCESSING KEY \pgfkeyscurrentkey!}% - \pgfkeysgetvalue{\pgfkeyscurrentkey/.@cmd}{\pgfkeys@code}% - \expandafter\pgfkeys@code\pgfkeyscurrentvalue\pgfeov - \else + \pgfkeysgetvalue{\pgfkeyscurrentkey/.@cmd}{\pgfkeys@code}% + \expandafter\pgfkeys@code\pgfkeyscurrentvalue\pgfeov + \else %\message{FILTERED OUT KEY \pgfkeyscurrentkey!}% - \pgfkeys@filtered@handler% - \fi - }{% - % CASE TWO: a normal value option - \pgfkeysifdefined{\pgfkeyscurrentkey}{% - \def\pgfkeyscasenumber{2}% - \pgfkeys@key@predicate% - \ifpgfkeysfiltercontinue + \pgfkeys@filtered@handler% + \fi + }{% + % CASE TWO: a normal value option + \pgfkeysifdefined{\pgfkeyscurrentkey}{% + \def\pgfkeyscasenumber{2}% + \pgfkeys@key@predicate% + \ifpgfkeysfiltercontinue %\message{PROCESSING KEY \pgfkeyscurrentkey!}% - \pgfkeys@case@two@extern - \else -%\message{FILTEReD OUT KEY \pgfkeyscurrentkey!}% - \pgfkeys@filtered@handler% - \fi - }{% - \pgfkeys@split@path - % CASE THREE: a handler - \pgfkeysifdefined{/handlers/\pgfkeyscurrentname/.@cmd}{% - \pgfkeys@ifexecutehandler{% - \def\pgfkeyscasenumber{3}% - \pgfkeys@key@predicate% - \ifpgfkeysfiltercontinue + \pgfkeys@case@two@extern + \else +%\message{FILTERED OUT KEY \pgfkeyscurrentkey!}% + \pgfkeys@filtered@handler% + \fi + }{% + \pgfkeys@split@path + % CASE THREE: a handler + \pgfkeysifdefined{/handlers/\pgfkeyscurrentname/.@cmd}{% + \pgfkeys@ifexecutehandler{% + \def\pgfkeyscasenumber{3}% + \pgfkeys@key@predicate% + \ifpgfkeysfiltercontinue %\message{PROCESSING KEY \pgfkeyscurrentkey!}% - \pgfkeysgetvalue{/handlers/\pgfkeyscurrentname/.@cmd}{\pgfkeys@code}% - \expandafter\pgfkeys@code\pgfkeyscurrentvalue\pgfeov - \else + \pgfkeysgetvalue{/handlers/\pgfkeyscurrentname/.@cmd}{\pgfkeys@code}% + \expandafter\pgfkeys@code\pgfkeyscurrentvalue\pgfeov + \else %\message{FILTERED OUT KEY \pgfkeyscurrentkey!}% - \pgfkeys@filtered@handler% - \fi - }{% - \pgfkeys@unknown - }% - }{% - \pgfkeys@unknown - }% - }% - }% - \fi + \pgfkeys@filtered@handler% + \fi + }{% + \pgfkeys@unknown + }% + }{% + \pgfkeys@unknown + }% + }% + }% + \fi }% \def\pgfkeys@unknown@filtered{% - % CASE ZERO: an unknown option. - \def\pgfkeyscasenumber{0}% - \pgfkeys@key@predicate% - \ifpgfkeysfiltercontinue + % CASE ZERO: an unknown option. + \def\pgfkeyscasenumber{0}% + \pgfkeys@key@predicate% + \ifpgfkeysfiltercontinue %\message{PROCESSING KEY \pgfkeyscurrentkey!}% - % start normal 'unknown' handlers: - \pgfkeys@orig@unknown - \else -%\message{FILTEReD OUT KEY \pgfkeyscurrentkey!}% - \pgfkeys@filtered@handler% - \fi + % start normal 'unknown' handlers: + \pgfkeys@orig@unknown + \else +%\message{FILTERED OUT KEY \pgfkeyscurrentkey!}% + \pgfkeys@filtered@handler% + \fi } % Does the same as \pgfkeys@try, but it also invokes the key filters. \def\pgfkeys@try@filtered{% - \ifpgfkeysfiltercontinue - \pgfkeys@orig@try - \else - \pgfkeysfiltercontinuetrue - \edef\pgfkeyscurrentkey{\pgfkeyscurrentpath}% make sure that \pgfkeys@code doesn't know about 'try'. Important for .is choice - \ifx\pgfkeyscurrentvalue\pgfkeysnovalue@text% Hmm... no value - \pgfkeysifdefined{\pgfkeyscurrentpath/.@def}% - {\pgfkeysgetvalue{\pgfkeyscurrentpath/.@def}{\pgfkeyscurrentvalue}} - {}% no default, so leave it - \fi% - \pgfkeysifdefined{\pgfkeyscurrentpath/.@cmd}% - {% - % CASE ONE: a command option - \def\pgfkeyscasenumber{1}% - \pgfkeys@key@predicate% - \ifpgfkeysfiltercontinue - \pgfkeysgetvalue{\pgfkeyscurrentkey/.@cmd}{\pgfkeys@code}% - \expandafter\pgfkeys@code\pgfkeyscurrentvalue\pgfeov% - \else - \pgfkeys@filtered@handler% - \fi - \pgfkeyssuccesstrue% - }% - {% - \pgfkeysifdefined{\pgfkeyscurrentpath}% - {% CASE TWO: a normal value option - \def\pgfkeyscasenumber{2}% - \pgfkeys@key@predicate% - \ifpgfkeysfiltercontinue - \ifx\pgfkeyscurrentvalue\pgfkeysnovalue@text% - \pgfkeysvalueof{\pgfkeyscurrentpath}% - \else% - \pgfkeyslet{\pgfkeyscurrentpath}\pgfkeyscurrentvalue% - \fi% - \else - \pgfkeys@filtered@handler% - \fi - \pgfkeyssuccesstrue% - }% - {% - \pgfkeys@split@path% - \pgfkeysifdefined{/handlers/\pgfkeyscurrentname/.@cmd}{% - % CASE THREE: a handled key - % - % in the standard configuration, this check here is redundand - % because pgfkeys@ifexecutehandler === true. - % It is only interesting for 'handle only existing'. - \pgfkeys@ifexecutehandler{% - \def\pgfkeyscasenumber{3}% - \pgfkeys@key@predicate% - \ifpgfkeysfiltercontinue + \ifpgfkeysfiltercontinue + \pgfkeys@orig@try + \else + \pgfkeysfiltercontinuetrue + \edef\pgfkeyscurrentkey{\pgfkeyscurrentpath}% make sure that \pgfkeys@code doesn't know about 'try'. Important for .is choice + \ifx\pgfkeyscurrentvalue\pgfkeysnovalue@text% Hmm... no value + \pgfkeysifdefined{\pgfkeyscurrentpath/.@def}% + {\pgfkeysgetvalue{\pgfkeyscurrentpath/.@def}{\pgfkeyscurrentvalue}} + {}% no default, so leave it + \fi% + \pgfkeysifdefined{\pgfkeyscurrentpath/.@cmd}% + {% + % CASE ONE: a command option + \def\pgfkeyscasenumber{1}% + \pgfkeys@key@predicate% + \ifpgfkeysfiltercontinue + \pgfkeysgetvalue{\pgfkeyscurrentkey/.@cmd}{\pgfkeys@code}% + \expandafter\pgfkeys@code\pgfkeyscurrentvalue\pgfeov% + \else + \pgfkeys@filtered@handler% + \fi + \pgfkeyssuccesstrue% + }% + {% + \pgfkeysifdefined{\pgfkeyscurrentpath}% + {% CASE TWO: a normal value option + \def\pgfkeyscasenumber{2}% + \pgfkeys@key@predicate% + \ifpgfkeysfiltercontinue + \ifx\pgfkeyscurrentvalue\pgfkeysnovalue@text% + \pgfkeysvalueof{\pgfkeyscurrentpath}% + \else% + \pgfkeyslet{\pgfkeyscurrentpath}\pgfkeyscurrentvalue% + \fi% + \else + \pgfkeys@filtered@handler% + \fi + \pgfkeyssuccesstrue% + }% + {% + \pgfkeys@split@path% + \pgfkeysifdefined{/handlers/\pgfkeyscurrentname/.@cmd}{% + % CASE THREE: a handled key + % + % in the standard configuration, this check here is redundant + % because pgfkeys@ifexecutehandler === true. + % It is only interesting for 'handle only existing'. + \pgfkeys@ifexecutehandler{% + \def\pgfkeyscasenumber{3}% + \pgfkeys@key@predicate% + \ifpgfkeysfiltercontinue %\message{PROCESSING KEY \pgfkeyscurrentkey!}% - \pgfkeysgetvalue{/handlers/\pgfkeyscurrentname/.@cmd}{\pgfkeys@code}% - \expandafter\pgfkeys@code\pgfkeyscurrentvalue\pgfeov - \else + \pgfkeysgetvalue{/handlers/\pgfkeyscurrentname/.@cmd}{\pgfkeys@code}% + \expandafter\pgfkeys@code\pgfkeyscurrentvalue\pgfeov + \else %\message{FILTERED OUT KEY \pgfkeyscurrentkey!}% - \pgfkeys@filtered@handler% - \fi - \pgfkeyssuccesstrue% - }{% - \pgfkeyssuccessfalse - }% - }{% - \pgfkeyssuccessfalse - }% - }% - }% - \fi + \pgfkeys@filtered@handler% + \fi + \pgfkeyssuccesstrue% + }{% + \pgfkeyssuccessfalse + }% + }{% + \pgfkeyssuccessfalse + }% + }% + }% + \fi } % #1 the code to invoke after init and before cleanup \long\def\pgfkeys@install@filter@and@invoke#1{% - \ifpgfkeysfilteringisactive - \pgfkeys@error{Sorry, nested calls to key filtering routines are not allowed. (reason: It is not possible to properly restore the previous filtering state after returning from the nested call)}% - \fi - \pgfkeysfilteringisactivetrue - \let\pgfkeys@case@one=\pgfkeys@case@one@filtered - \let\pgfkeys@try=\pgfkeys@try@filtered - \let\pgfkeys@unknown=\pgfkeys@unknown@filtered - #1% - \let\pgfkeys@case@one=\pgfkeys@orig@case@one - \let\pgfkeys@try=\pgfkeys@orig@try - \let\pgfkeys@unknown=\pgfkeys@orig@unknown - \pgfkeysfilteringisactivefalse + \ifpgfkeysfilteringisactive + \pgfkeys@error{Sorry, nested calls to key filtering routines are not allowed. (reason: It is not possible to properly restore the previous filtering state after returning from the nested call)}% + \fi + \pgfkeysfilteringisactivetrue + \let\pgfkeys@case@one=\pgfkeys@case@one@filtered + \let\pgfkeys@try=\pgfkeys@try@filtered + \let\pgfkeys@unknown=\pgfkeys@unknown@filtered + #1% + \let\pgfkeys@case@one=\pgfkeys@orig@case@one + \let\pgfkeys@try=\pgfkeys@orig@try + \let\pgfkeys@unknown=\pgfkeys@orig@unknown + \pgfkeysfilteringisactivefalse } %-------------------------------------------------- % \def\pgfkeys@eval@key@filter@subroutine@case@one{% -% \pgfkeysifdefined{\pgfkeyscurrentkey/.@cmd}{% -% \pgfkeysgetvalue{\pgfkeyscurrentkey/.@cmd}{\pgfkeys@code}% -% \let\pgfkeyspred@TMP=\pgfkeyscurrentvalue -% \pgfkeys@eval@key@filter@subroutine@restorestate -% \expandafter\pgfkeys@code\pgfkeyspred@TMP\pgfeov -% }{% -% \pgfkeysvalueof{/errors/no such key filter/.@cmd}\pgfkeyscurrentkey\pgfkeyscurrentvalue\pgfeov% -% }% +% \pgfkeysifdefined{\pgfkeyscurrentkey/.@cmd}{% +% \pgfkeysgetvalue{\pgfkeyscurrentkey/.@cmd}{\pgfkeys@code}% +% \let\pgfkeyspred@TMP=\pgfkeyscurrentvalue +% \pgfkeys@eval@key@filter@subroutine@restorestate +% \expandafter\pgfkeys@code\pgfkeyspred@TMP\pgfeov +% }{% +% \pgfkeysvalueof{/errors/no such key filter/.@cmd}\pgfkeyscurrentkey\pgfkeyscurrentvalue\pgfeov% +% }% % } % % THIS VERSION IS TOO SLOW. See below. % \def\pgfkeysevalkeyfilterwith#1{% -% \edef\pgfkeys@eval@key@filter@subroutine@restorestate{% -% \noexpand\def\noexpand\pgfkeyscurrentkey{\pgfkeyscurrentkey}% -% \noexpand\def\noexpand\pgfkeyscurrentkeyRAW{\pgfkeyscurrentkeyRAW}% -% \noexpand\def\noexpand\pgfkeyscurrentname{\pgfkeyscurrentname}% -% \noexpand\def\noexpand\pgfkeyscurrentvalue{\pgfkeyscurrentvalue}% -% \noexpand\pgfkeys@pathtoks={\pgfkeyscurrentpath}% -% }% -% \pgfkeysinterruptkeyfilter -% \let\pgfkeys@case@one=\pgfkeys@eval@key@filter@subroutine@case@one -% \pgfkeysalso{#1}% -% \endpgfkeysinterruptkeyfilter% this here also restored \pgfkeys@case@one. -% \pgfkeys@eval@key@filter@subroutine@restorestate +% \edef\pgfkeys@eval@key@filter@subroutine@restorestate{% +% \noexpand\def\noexpand\pgfkeyscurrentkey{\pgfkeyscurrentkey}% +% \noexpand\def\noexpand\pgfkeyscurrentkeyRAW{\pgfkeyscurrentkeyRAW}% +% \noexpand\def\noexpand\pgfkeyscurrentname{\pgfkeyscurrentname}% +% \noexpand\def\noexpand\pgfkeyscurrentvalue{\pgfkeyscurrentvalue}% +% \noexpand\pgfkeys@pathtoks={\pgfkeyscurrentpath}% +% }% +% \pgfkeysinterruptkeyfilter +% \let\pgfkeys@case@one=\pgfkeys@eval@key@filter@subroutine@case@one +% \pgfkeysalso{#1}% +% \endpgfkeysinterruptkeyfilter% this here also restored \pgfkeys@case@one. +% \pgfkeys@eval@key@filter@subroutine@restorestate % }% -%-------------------------------------------------- +%-------------------------------------------------- % Evaluates a key filter '#1'. Example: @@ -977,40 +978,40 @@ % % The implementation employs a subset of the \pgfkeysalso code. \long\def\pgfkeysevalkeyfilterwith#1{% - \pgfkeys@eval@key@filter@subroutine@unpack#1=\pgfkeysnovalue=\pgfkeys@stop + \pgfkeys@eval@key@filter@subroutine@unpack#1=\pgfkeysnovalue=\pgfkeys@stop }% \long\def\pgfkeys@eval@key@filter@subroutine@unpack#1=#2=#3\pgfkeys@stop{% - \pgfkeys@spdef\pgfkeyspred@TMP{#1}% - \edef\pgfkeyspred@TMP{\pgfkeyspred@TMP}% - \pgfkeys@spdef\pgfkeyspred@TMPB{#2}% TMPB=value - \ifx\pgfkeyspred@TMPB\pgfkeysnovalue@text% Hmm... no value - \pgfkeysifdefined{\pgfkeyspred@TMP/.@def}% - {\pgfkeysgetvalue{\pgfkeyspred@TMP/.@def}{\pgfkeyspred@TMPB}} - {}% no default, so leave it - \fi% - \ifx\pgfkeyspred@TMPB\pgfkeysvaluerequired% - \pgfkeysvalueof{/errors/value required/.@cmd}\pgfkeyspred@TMP\pgfkeyspred@TMPB\pgfeov% - \else% - \pgfkeysifdefined{\pgfkeyspred@TMP/.@cmd}{% - \pgfkeysgetvalue{\pgfkeyspred@TMP/.@cmd}{\pgfkeys@code}% - \expandafter\pgfkeys@code\pgfkeyspred@TMPB\pgfeov - }{% - \pgfkeysvalueof{/errors/no such key filter/.@cmd}\pgfkeyspred@TMP\pgfkeyspred@TMPB\pgfeov% - }% - \fi% + \pgfkeys@spdef\pgfkeyspred@TMP{#1}% + \edef\pgfkeyspred@TMP{\pgfkeyspred@TMP}% + \pgfkeys@spdef\pgfkeyspred@TMPB{#2}% TMPB=value + \ifx\pgfkeyspred@TMPB\pgfkeysnovalue@text% Hmm... no value + \pgfkeysifdefined{\pgfkeyspred@TMP/.@def}% + {\pgfkeysgetvalue{\pgfkeyspred@TMP/.@def}{\pgfkeyspred@TMPB}} + {}% no default, so leave it + \fi% + \ifx\pgfkeyspred@TMPB\pgfkeysvaluerequired% + \pgfkeysvalueof{/errors/value required/.@cmd}\pgfkeyspred@TMP\pgfkeyspred@TMPB\pgfeov% + \else% + \pgfkeysifdefined{\pgfkeyspred@TMP/.@cmd}{% + \pgfkeysgetvalue{\pgfkeyspred@TMP/.@cmd}{\pgfkeys@code}% + \expandafter\pgfkeys@code\pgfkeyspred@TMPB\pgfeov + }{% + \pgfkeysvalueof{/errors/no such key filter/.@cmd}\pgfkeyspred@TMP\pgfkeyspred@TMPB\pgfeov% + }% + \fi% } \def\pgfkeys@non@outer@newif@#1#2{% - \expandafter\edef\csname #2true\endcsname{\noexpand\let\noexpand#1=\noexpand\iftrue}% - \expandafter\edef\csname #2false\endcsname{\noexpand\let\noexpand#1=\noexpand\iffalse}% - \csname #2false\endcsname + \expandafter\edef\csname #2true\endcsname{\noexpand\let\noexpand#1=\noexpand\iftrue}% + \expandafter\edef\csname #2false\endcsname{\noexpand\let\noexpand#1=\noexpand\iffalse}% + \csname #2false\endcsname }% % For latex and context, this here has the same effect as a \newif % applied to 'if#1'. For plain tex, it has also the same effect, but % it is not an \outer macro as the plain-tex \newif. \def\pgfkeys@non@outer@newif#1{% - \expandafter\pgfkeys@non@outer@newif@\csname if#1\endcsname{#1}% + \expandafter\pgfkeys@non@outer@newif@\csname if#1\endcsname{#1}% } \endinput |