diff options
Diffstat (limited to 'Master/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex')
-rw-r--r-- | Master/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex | 441 |
1 files changed, 275 insertions, 166 deletions
diff --git a/Master/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex b/Master/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex index 86e0499ded7..3d79735459d 100644 --- a/Master/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex @@ -25,8 +25,14 @@ % This is useful: +\newif\ifpgfkeys@csname@test% + +\def\pgfkeys@ifcsname#1\endcsname#2\else#3\fi{% + \pgfkeys@csname@testfalse% + \expandafter\ifx\csname#1\endcsname\relax\else\expandafter\ifx\csname#1\endcsname\@undefined\else\pgfkeys@csname@testtrue\fi\fi% + \ifpgfkeys@csname@test#2\else#3\fi% +}% -\def\pgfkeys@ifcsname#1\endcsname#2\else#3\fi{\expandafter\ifx\csname#1\endcsname\relax#3\else#2\fi}% \ifx\eTeXrevision\undefined% \else% \expandafter\let\expandafter\pgfkeys@ifcsname\csname ifcsname\endcsname% @@ -37,7 +43,7 @@ % This also: \ifx\PackageError\undefined - \def\pgfkeys@error#1{\immediate\write-1{Package pgfkeys: Error! #1.}}% + \def\pgfkeys@error#1{\errmessage{Package pgfkeys Error: #1.}}% \else \def\pgfkeys@error#1{\PackageError{pgfkeys}{#1}{}}% \fi @@ -180,10 +186,10 @@ % for handled keys). \long\def\pgfkeysifassignable#1#2#3{% \pgfkeysifdefined{#1}% - {#2} - {\pgfkeysifdefined{#1/.@cmd}% - {#2}% - {#3}}% + {#2} + {\pgfkeysifdefined{#1/.@cmd}% + {#2}% + {#3}}% }% @@ -286,14 +292,37 @@ \expandafter\pgfkeys@normal% \fi% } -\long\def\pgfkeys@normal#1,{% +\newif\ifpgfkeys@syntax@handlers +\def\pgfkeys@normal{% + \ifpgfkeys@syntax@handlers% + \expandafter\pgfkeys@syntax@handlers% + \else% + \expandafter\pgfkeys@@normal% + \fi% +} +\def\pgfkeys@syntax@handlers{\pgf@keys@utilifnextchar\relax\pgfkeys@syntax@@handlers\pgfkeys@syntax@@handlers}%get rid of spaces +\def\pgfkeys@syntax@@handlers{\futurelet\pgfkeys@first@char\pgfkeys@syntax@handlers@test} +\def\pgfkeys@syntax@handlers@test{% + \pgfkeysgetvalue{/handlers/first char syntax/\meaning\pgfkeys@first@char}\pgfkeys@the@handler% + \ifx\pgfkeys@the@handler\relax% + \expandafter\pgfkeys@@normal% + \else% + \expandafter\pgfkeys@use@handler% + \fi% +} +\long\def\pgfkeys@use@handler#1,{% + \pgfkeys@the@handler{#1}% + \pgfkeys@parse% +} + +\long\def\pgfkeys@@normal#1,{% \pgfkeys@unpack#1=\pgfkeysnovalue=\pgfkeys@stop% \pgfkeys@parse% } \def\pgfkeys@cleanup\pgfkeys@mainstop{} \def\pgfkeys@mainstop{\pgfkeys@mainstop} % equals only itself -\def\pgfkeys@novalue{} % equals only itself +\def\pgfkeys@novalue{} \def\pgfkeysnovalue{\pgfkeys@novalue} % equals only itself \def\pgfkeysnovalue@text{\pgfkeysnovalue} \def\pgfkeysvaluerequired{\pgfkeysvaluerequired} % equals only itself @@ -312,7 +341,8 @@ {}% no default, so leave it \fi% \ifx\pgfkeyscurrentvalue\pgfkeysvaluerequired% - \pgfkeysvalueof{/errors/value required/.@cmd}\pgfkeyscurrentkey\pgfkeyscurrentvalue\pgfeov% + \def\pgf@marshal{\pgfkeysvalueof{/errors/value required/.@cmd}}% + \expandafter\pgf@marshal\expandafter{\pgfkeyscurrentkey}{}\pgfeov% \else% \pgfkeys@case@one% \fi% @@ -356,30 +386,30 @@ \pgfkeys@split@path% \pgfkeysifdefined{/handlers/\pgfkeyscurrentname/.@cmd}{% \pgfkeys@ifexecutehandler{% - \pgfkeysgetvalue{/handlers/\pgfkeyscurrentname/.@cmd}{\pgfkeys@code}% + \pgfkeysgetvalue{/handlers/\pgfkeyscurrentname/.@cmd}{\pgfkeys@code}% \expandafter\pgfkeys@code\pgfkeyscurrentvalue\pgfeov - }{% + }{% % this here is necessary: /my search path/key/.code % won't be called, so \pgfkeyscurrentpath == '/my search path/key' % -> it should be one directory higher! We want to invoke the - % .unknown handler in - % '/my search path' - % - % Idea: - % set - % - path := '/my search path' - % - name := 'key/.code' - % - key = '/my search path/key/.code' - \let\pgfkeys@temp=\pgfkeyscurrentkey - \let\pgfkeys@tempb=\pgfkeyscurrentname + % .unknown handler in + % '/my search path' + % + % Idea: + % set + % - path := '/my search path' + % - name := 'key/.code' + % - key = '/my search path/key/.code' + \let\pgfkeys@temp=\pgfkeyscurrentkey + \let\pgfkeys@tempb=\pgfkeyscurrentname \edef\pgfkeyscurrentkey{\pgfkeyscurrentpath}% \pgfkeys@split@path% - \let\pgfkeyscurrentkey=\pgfkeys@temp - \edef\pgfkeyscurrentname{\pgfkeyscurrentname/\pgfkeys@tempb}% - \pgfkeys@unknown - }% + \let\pgfkeyscurrentkey=\pgfkeys@temp + \edef\pgfkeyscurrentname{\pgfkeyscurrentname/\pgfkeys@tempb}% + \pgfkeys@unknown + }% }{% - \pgfkeys@unknown + \pgfkeys@unknown }% } @@ -394,37 +424,31 @@ \else % implement the 'only existing' feature here: \pgfkeysifdefined{\pgfkeyscurrentpath}{#1}{% - \pgfkeysifdefined{\pgfkeyscurrentpath/.@cmd}{#1}{#2}% + \pgfkeysifdefined{\pgfkeyscurrentpath/.@cmd}{#1}{#2}% }{}% \fi% }% \def\pgfkeys@ifexecutehandler@handlefullorexisting#1#2{% \ifpgfkeysaddeddefaultpath \pgfkeys@ifcsname pgfk@excpt@\pgfkeyscurrentname\endcsname% -%\message{ifexecutehandler(\pgfkeyscurrentkeyRAW, path \pgfkeysdefaultpath): '\pgfkeyscurrentname' is an exception; processing it (on \pgfkeyscurrentpath).}% #1% ok, this particular key handler is known and be processed in any case (for example .try) \else % implement the 'only existing' feature here: \pgfkeysifdefined{\pgfkeyscurrentpath}{% -%\message{ifexecutehandler(\pgfkeyscurrentkeyRAW, path \pgfkeysdefaultpath): '\pgfkeyscurrentpath' does exist. Executing '\pgfkeyscurrentname'.}% - #1% - }{% - \pgfkeysifdefined{\pgfkeyscurrentpath/.@cmd}{% -%\message{ifexecutehandler(\pgfkeyscurrentkeyRAW, path \pgfkeysdefaultpath): '\pgfkeyscurrentpath/.@cmd' does exist. Executing '\pgfkeyscurrentname'.}% - #1% - }{% -%\message{ifexecutehandler(\pgfkeyscurrentkeyRAW, path \pgfkeysdefaultpath): '\pgfkeyscurrentpath' does NOT exist. Skipping '\pgfkeyscurrentname'.}% - #2% - }% - }% + #1% + }{% + \pgfkeysifdefined{\pgfkeyscurrentpath/.@cmd}{% + #1% + }{% + #2% + }% + }% \fi% \else -%\message{ifexecutehandler(\pgfkeyscurrentkeyRAW, path \pgfkeysdefaultpath): Fully qualified key provided. Executing '\pgfkeyscurrentname'.}% #1% ok, always true if the USER explicitly provided the full key path. \fi }% -\def\pgfkeysaddhandlyonlyexistingexception#1{\expandafter\def\csname pgfk@excpt@#1\endcsname{1}}% - +\def\pgfkeysaddhandleonlyexistingexception#1{\expandafter\def\csname pgfk@excpt@#1\endcsname{1}}% \def\pgfkeys@unknown{% \pgfkeysifdefined{\pgfkeyscurrentpath/.unknown/.@cmd}% @@ -579,10 +603,12 @@ \long\def\pgfkeysdef#1#2{% \long\def\pgfkeys@temp##1\pgfeov{#2}% \pgfkeyslet{#1/.@cmd}{\pgfkeys@temp}% + \pgfkeyssetvalue{#1/.@body}{#2}% } \long\def\pgfkeysedef#1#2{% \long\edef\pgfkeys@temp##1\pgfeov{#2}% \pgfkeyslet{#1/.@cmd}{\pgfkeys@temp}% + \pgfkeyssetvalue{#1/.@body}{#2}% } @@ -628,27 +654,27 @@ % % defnargs: % \pgfkeysdefnargs{/a}{2}{1=`#1', 2=`#2'} % \pgfkeys{ -% /a= -% {1} -% {2} +% /a= +% {1} +% {2} % } % ->defnargs: 1=`1', 2=`2' % % defargs: % \pgfkeysdefargs{/b}{#1#2}{1=`#1', 2=`#2'} % \pgfkeys{ -% /b= -% {1} -% {2} +% /b= +% {1} +% {2} % } % ->defargs: 1=`1', 2=` 2' (note the space!) % % defargs: % \pgfkeysdefargs{/b}{#1#2}{1=`#1', 2=`#2'} % \pgfkeys{ -% /b= -% {1}% -% {2} +% /b= +% {1}% +% {2} % } % ->defargs: 1=`1', 2=`2' %-------------------------------------------------- @@ -656,32 +682,30 @@ \long\def\pgfkeysedefnargs#1#2#3{\pgfkeysdefnargs@{#1}{#2}{#3}{\edef}}% \long\def\pgfkeysdefnargs@#1#2#3#4{% \ifcase#2\relax - \pgfkeyssetvalue{#1/.@args}{}% + \pgfkeyssetvalue{#1/.@args}{}% \or - \pgfkeyssetvalue{#1/.@args}{##1}% + \pgfkeyssetvalue{#1/.@args}{##1}% \or - \pgfkeyssetvalue{#1/.@args}{##1##2}% + \pgfkeyssetvalue{#1/.@args}{##1##2}% \or - \pgfkeyssetvalue{#1/.@args}{##1##2##3}% + \pgfkeyssetvalue{#1/.@args}{##1##2##3}% \or - \pgfkeyssetvalue{#1/.@args}{##1##2##3##4}% + \pgfkeyssetvalue{#1/.@args}{##1##2##3##4}% \or - \pgfkeyssetvalue{#1/.@args}{##1##2##3##4##5}% + \pgfkeyssetvalue{#1/.@args}{##1##2##3##4##5}% \or - \pgfkeyssetvalue{#1/.@args}{##1##2##3##4##5##6}% + \pgfkeyssetvalue{#1/.@args}{##1##2##3##4##5##6}% \or - \pgfkeyssetvalue{#1/.@args}{##1##2##3##4##5##6}% + \pgfkeyssetvalue{#1/.@args}{##1##2##3##4##5##6##7}% \or - \pgfkeyssetvalue{#1/.@args}{##1##2##3##4##5##6##7}% + \pgfkeyssetvalue{#1/.@args}{##1##2##3##4##5##6##7##8}% \or - \pgfkeyssetvalue{#1/.@args}{##1##2##3##4##5##6##7##8}% - \or - \pgfkeyssetvalue{#1/.@args}{##1##2##3##4##5##6##7##8##9}% + \pgfkeyssetvalue{#1/.@args}{##1##2##3##4##5##6##7##8##9}% \else - \pgfkeys@error{\string\pgfkeysdefnargs: expected <= 9 arguments, got #2}% + \pgfkeys@error{\string\pgfkeysdefnargs: expected <= 9 arguments, got #2}% \fi \pgfkeysgetvalue{#1/.@args}\pgfkeys@tempargs - \def\pgfkeys@temp{\expandafter#4\csname pgfk@#1/.@@body\endcsname}% + \def\pgfkeys@temp{\expandafter\long\expandafter#4\csname pgfk@#1/.@@body\endcsname}% \expandafter\pgfkeys@temp\pgfkeys@tempargs{#3}% % eliminate the \pgfeov at the end such that TeX gobbles spaces % by using @@ -712,34 +736,37 @@ % Find out, whether with args or not. \pgfkeysifdefined{\pgfkeyscurrentpath/.@args}% {% Yes, so add to body and reuse args - \pgfkeysaddvalue{\pgfkeyscurrentpath/.@body}{#1}{#2}% - % Redefine code - {% - \pgfkeysgetvalue{\pgfkeyscurrentpath/.@args}{\pgfkeys@tempargs}% - \pgfkeysgetvalue{\pgfkeyscurrentpath/.@body}{\pgfkeys@tempbody}% - \def\pgfkeys@marshal{\expandafter\gdef\expandafter\pgfkeys@global@temp\pgfkeys@tempargs}% - \expandafter\pgfkeys@marshal\expandafter{\pgfkeys@tempbody}% - }% + \pgfkeysaddvalue{\pgfkeyscurrentpath/.@body}{#1}{#2}% + % Redefine code + {% + \pgfkeysgetvalue{\pgfkeyscurrentpath/.@args}{\pgfkeys@tempargs}% + \pgfkeysgetvalue{\pgfkeyscurrentpath/.@body}{\pgfkeys@tempbody}% + \def\pgfkeys@marshal{\expandafter\gdef\expandafter\pgfkeys@global@temp\pgfkeys@tempargs}% + \expandafter\pgfkeys@marshal\expandafter{\pgfkeys@tempbody}% + }% \pgfkeysifdefined{\pgfkeyscurrentpath/.@@body}{% - % support for \pgfkeysndefargs: - \pgfkeyslet{\pgfkeyscurrentpath/.@@body}{\pgfkeys@global@temp}% - }{% - % support for \pgfkeysdefargs: + % support for \pgfkeysndefargs: + \pgfkeyslet{\pgfkeyscurrentpath/.@@body}{\pgfkeys@global@temp}% + }{% + % support for \pgfkeysdefargs: \pgfkeyslet{\pgfkeyscurrentpath/.@cmd}{\pgfkeys@global@temp}% - }% + }% }% {% % No, so single argument (simple \pgfkeysdef). Redefine accordingly. + \edef\pgf@expanded@path{\pgfkeyscurrentpath}% {% \toks0{#1}% - \pgfkeysifdefined{\pgfkeyscurrentpath/.@cmd}% - {\pgfkeys@temptoks\expandafter\expandafter\expandafter{\csname pgfk@\pgfkeyscurrentpath/.@cmd\endcsname##1\pgfeov}}% - {\pgfkeys@temptoks{}}% + \pgfkeysifdefined{\pgf@expanded@path/.@cmd}% + {\expandafter\expandafter\expandafter\pgfkeys@temptoks\expandafter\expandafter\expandafter{\csname pgfk@\pgf@expanded@path/.@body\endcsname}}% + {\expandafter\pgfkeys@temptoks\expandafter{\expandafter\pgfkeyssetvalue\expandafter{\pgf@expanded@path}{##1}}}% \toks1{#2}% \xdef\pgfkeys@global@temp{\the\toks0 \the\pgfkeys@temptoks \the\toks1 }% }% - \expandafter\def\expandafter\pgfkeys@temp\expandafter##\expandafter1\expandafter\pgfeov\expandafter{\pgfkeys@global@temp}% - \pgfkeyslet{\pgfkeyscurrentpath/.@cmd}\pgfkeys@temp% + \def\pgf@temp{\pgfkeyssetvalue{\pgf@expanded@path/.@body}}% + \expandafter\pgf@temp\expandafter{\pgfkeys@global@temp}% + \expandafter\long\expandafter\def\expandafter\pgfkeys@temp\expandafter##\expandafter1\expandafter\pgfeov\expandafter{\pgfkeys@global@temp}% + \pgfkeyslet{\pgf@expanded@path/.@cmd}\pgfkeys@temp% }% } \pgfkeys{/handlers/.prefix code/.code=\pgfkeys{\pgfkeyscurrentpath/.add code={#1}{}}}% @@ -780,7 +807,8 @@ {% \ifx\pgfkeyscurrentvalue\pgfkeysnovalue@text% \else% - \pgfkeysvalueof{/errors/value forbidden/.@cmd}\pgfkeyscurrentkey\pgfkeyscurrentvalue\pgfeov% + \def\pgf@marshal{\pgfkeysvalueof{/errors/value forbidden/.@cmd}}% + \expandafter\expandafter\expandafter\pgf@marshal\expandafter\expandafter\expandafter{\expandafter\pgfkeyscurrentkey\expandafter}\expandafter{\pgfkeyscurrentvalue}\pgfeov% \fi% }{}}} @@ -799,23 +827,32 @@ \pgfkeys@ifcsname#1#2\endcsname% \csname#1#2\endcsname% \else% - \pgfkeysvalueof{/errors/boolean expected/.@cmd}\pgfkeyscurrentkey{#2}\pgfeov% + \def\pgf@marshal{\pgfkeysvalueof{/errors/boolean expected/.@cmd}}% + \expandafter\pgf@marshal\expandafter{\pgfkeyscurrentkey}{#2}\pgfeov% \fi } \pgfkeys{/handlers/.is choice/.code=% \pgfkeys{% \pgfkeyscurrentpath/.cd,% - .code=\expandafter\pgfkeysalso\expandafter{\pgfkeyscurrentkey/##1}, - .unknown/.style={/errors/unknown choice value=\pgfkeyscurrentkey\pgfkeyscurrentvalue}}} + .code=\def\pgfkeys@was@choice{##1}\expandafter\pgfkeysalso\expandafter{\pgfkeyscurrentkey/##1}, + .unknown/.code={% + \def\pgf@marshal{\pgfkeysvalueof{/errors/unknown choice value/.@cmd}}% + {\expandafter\expandafter\expandafter\pgf@marshal\expandafter\expandafter\expandafter{\expandafter\the\expandafter\pgfkeys@pathtoks\expandafter}\expandafter{\pgfkeys@was@choice}\pgfeov}% + }% + }% +} % Repeatedly setting a key \pgfkeys{/handlers/.list/.code=% {% + \ifx\foreach\@undefined% + \pgfkeys@error{You need to load the pgffor package to use the .list key syntax.}% + \fi% % Use foreach to unfold the list - \let\pgf@keys@temp=\pgfutil@empty% + \def\pgf@keys@temp{}% \foreach \pgf@keys@key in{#1}% {\expandafter\expandafter\expandafter\gdef% \expandafter\expandafter\expandafter\pgf@keys@temp% @@ -825,10 +862,16 @@ \expandafter\expandafter\expandafter{\expandafter\pgf@keys@list@path\expandafter}\pgf@keys@temp\pgf@stop% }% } -\def\pgf@keys@do@list#1{\pgfutil@ifnextchar\bgroup{\pgf@keys@do@list@item{#1}}\pgfutil@gobble} +\def\pgf@keys@do@list#1{\pgf@keys@utilifnextchar\bgroup{\pgf@keys@do@list@item{#1}}\pgf@keys@gobble} \def\pgf@keys@do@list@item#1#2{\pgfkeysalso{#1={#2}}\pgf@keys@do@list{#1}} +% Forwarding + +\pgfkeys{/handlers/.forward to/.code=% + \pgfkeys{\pgfkeyscurrentpath/.add code={}{\pgfkeys{#1={##1}}}} +} + % Inspection handlers @@ -836,6 +879,9 @@ \pgfkeys{/handlers/.show code/.code=\pgfkeysgetvalue{\pgfkeyscurrentpath/.@cmd}{\pgfkeysshower}\show\pgfkeysshower} % inspect the body of the command +% First char syntax handlers +\pgfkeys{/handlers/first char syntax/.is if=pgfkeys@syntax@handlers} + % Path handling % Prepares the .unknown handler used by '.search also'. @@ -844,22 +890,23 @@ \global\def\pgfkeys@global@temp##1\pgfeov{}% \pgfkeys@searchalso@parse#1,\pgfkeys@mainstop {% - \toks0=\expandafter{\pgfkeys@global@temp##1\pgfeov}% - \toks1={\def\pgfutilnext{\pgfkeysvalueof{/handlers/.unknown/.@cmd}##1\pgfeov}\pgfutilnext}% - \xdef\pgfkeys@global@temp{% - \noexpand\ifpgfkeysaddeddefaultpath - \noexpand\pgfkeyssuccessfalse - \noexpand\let\noexpand\pgfkeys@searchalso@name=\noexpand\pgfkeyscurrentkeyRAW - \the\toks0 % one or more /.try things; one for each path. The last element won't have a /.try - %\noexpand\ifpgfkeyssuccess - %\noexpand\else - % \the\toks1 % invoke /handlers/.unknown handler - %\noexpand\fi - \noexpand\else - \the\toks1 % invoke /handlers/.unknown handler - \noexpand\fi - }% - \expandafter\gdef\expandafter\pgfkeys@global@temp\expandafter##\expandafter1\expandafter\pgfeov\expandafter{\pgfkeys@global@temp}% + \toks0=\expandafter{\pgfkeys@global@temp##1\pgfeov}% + \toks1={\pgfkeysalso{/handlers/.unknown/.@cmd/.expand once=\pgfkeys@searchalso@temp@value}}% + \xdef\pgfkeys@global@temp{% + \noexpand\def\noexpand\pgfkeys@searchalso@temp@value{####1}% + \noexpand\ifpgfkeysaddeddefaultpath + \noexpand\pgfkeyssuccessfalse + \noexpand\let\noexpand\pgfkeys@searchalso@name=\noexpand\pgfkeyscurrentkeyRAW + \the\toks0 % one or more /.try things; one for each path. The last element won't have a /.try + %\noexpand\ifpgfkeyssuccess + %\noexpand\else + % \the\toks1 % invoke /handlers/.unknown handler + %\noexpand\fi + \noexpand\else + \the\toks1 % invoke /handlers/.unknown handler + \noexpand\fi + }% + \expandafter\gdef\expandafter\pgfkeys@global@temp\expandafter##\expandafter1\expandafter\pgfeov\expandafter{\pgfkeys@global@temp}% }% }% @@ -876,36 +923,36 @@ \pgfkeys@spdef\pgfkeys@temp{#1}% {% \toks0=\expandafter{\pgfkeys@global@temp##1\pgfeov}% - \toks1=\expandafter{\pgfkeys@temp}% - \toks2={##1}% - \xdef\pgfkeys@global@temp{% - \the\toks0 % the space is important! - \noexpand\ifpgfkeyssuccess\noexpand\else - \noexpand\pgfqkeys{\the\toks1 }{\noexpand\pgfkeys@searchalso@name - \ifx\pgfkeys@searchalso@nexttok\pgfkeys@mainstop\else/.try\fi={\the\toks2 }}% - \noexpand\fi}% - \expandafter\gdef\expandafter\pgfkeys@global@temp\expandafter##\expandafter1\expandafter\pgfeov\expandafter{\pgfkeys@global@temp}% + \toks1=\expandafter{\pgfkeys@temp}% + \xdef\pgfkeys@global@temp{% + \the\toks0 % the space is important! + \noexpand\ifpgfkeyssuccess\noexpand\else + \noexpand\pgfqkeys{\the\toks1 }{\noexpand\pgfkeys@searchalso@name + \ifx\pgfkeys@searchalso@nexttok\pgfkeys@mainstop\else/.try\fi /.expand once=\noexpand\pgfkeys@searchalso@temp@value}% + \noexpand\fi}% + \expandafter\gdef\expandafter\pgfkeys@global@temp\expandafter##\expandafter1\expandafter\pgfeov\expandafter{\pgfkeys@global@temp}% }% \pgfkeys@searchalso@parse#2% } \pgfkeys{% - /handlers/.is family/.code=\pgfkeys{\pgfkeyscurrentpath/.ecode=\edef\noexpand\pgfkeysdefaultpath{\pgfkeyscurrentpath/}},% - /handlers/.cd/.code=\edef\pgfkeysdefaultpath{\pgfkeyscurrentpath/},% - /handlers/.search also/.code={% - \pgfkeys@searchalso@prepare@unknown@handler{#1}% + /handlers/.is family/.code=\pgfkeys{\pgfkeyscurrentpath/.ecode=\edef\noexpand\pgfkeysdefaultpath{\pgfkeyscurrentpath/}},% + /handlers/.cd/.code=\edef\pgfkeysdefaultpath{\pgfkeyscurrentpath/},% + /handlers/.search also/.code={% + \pgfkeys@searchalso@prepare@unknown@handler{#1}% %\message{I prepared the '\pgfkeyscurrentpath/.unknown' handler \meaning\pgfkeys@global@temp\space for '#1'.}% - \pgfkeyslet{\pgfkeyscurrentpath/.unknown/.@cmd}{\pgfkeys@global@temp}% - } + \pgfkeyslet{\pgfkeyscurrentpath/.unknown/.@cmd}{\pgfkeys@global@temp}% + } }% % Value expansion \pgfkeys{/handlers/.expand once/.code=\expandafter\pgfkeys@exp@call\expandafter{#1}} +\pgfkeys{/handlers/.expand two once/.code 2 args=\expandafter\expandafter\expandafter\pgfkeys@exp@call\expandafter\expandafter\expandafter{\expandafter#1\expandafter}\expandafter{#2}} \pgfkeys{/handlers/.expand twice/.code=\expandafter\expandafter\expandafter\pgfkeys@exp@call\expandafter\expandafter\expandafter{#1}} \pgfkeys{/handlers/.expanded/.code=\edef\pgfkeys@temp{#1}\expandafter\pgfkeys@exp@call\expandafter{\pgfkeys@temp}} -\def\pgfkeys@exp@call#1{\pgfkeysalso{\pgfkeyscurrentpath={#1}}} +\long\def\pgfkeys@exp@call#1{\pgfkeysalso{\pgfkeyscurrentpath={#1}}} % Try to set a key and do nothing if not define @@ -938,20 +985,20 @@ {% \pgfkeys@split@path% \pgfkeysifdefined{/handlers/\pgfkeyscurrentname/.@cmd}{% - % in the standard configuration, this check here is redundand - % because pgfkeys@ifexecutehandler === true. - % It is only interesting for 'handle only existing'. + % in the standard configuration, this check here is redundand + % because pgfkeys@ifexecutehandler === true. + % It is only interesting for 'handle only existing'. \pgfkeys@ifexecutehandler{% - \pgfkeysgetvalue{/handlers/\pgfkeyscurrentname/.@cmd}{\pgfkeys@code}% + \pgfkeysgetvalue{/handlers/\pgfkeyscurrentname/.@cmd}{\pgfkeys@code}% \expandafter\pgfkeys@code\pgfkeyscurrentvalue\pgfeov \pgfkeyssuccesstrue% - }{% - \pgfkeyssuccessfalse - }% }{% - \pgfkeyssuccessfalse + \pgfkeyssuccessfalse }% - }% + }{% + \pgfkeyssuccessfalse + }% + }% }% } @@ -962,49 +1009,111 @@ % Errors -\pgfkeys{/errors/boolean expected/.code 2 args=\pgfkeys@error{% - Boolean parameter of key '#1' must be 'true' or 'false', not - '#2'. I am going to ignore it}} -\pgfkeys{/errors/value required/.code 2 args=\pgfkeys@error{% - The key '#1' requires a value. I am going to ignore this key}{}} -\pgfkeys{/errors/value forbidden/.code 2 args=\pgfkeys@error{% - You may not specify a value for the key '#1'. I am going to ignore - the value '#2' that you provided}} -\pgfkeys{/errors/unknown choice value/.code 2 args=\pgfkeys@error{% - Choice '\pgfkeyscurrentname' unknown in key - '\pgfkeyscurrentpath'. I am going to ignore this key}} -\pgfkeys{/errors/unknown key/.code 2 args=\pgfkeys@error{% - I do not know the key '#1' and I am going to ignore it. Perhaps - you misspelled it}} +\pgfkeys{ + /errors/boolean expected/.code 2 args=% + { + \toks1={#1} + \toks2={#2} + \pgfkeys@error{% + Boolean parameter of key '\the\toks1' must be 'true' or 'false', not + '\the\toks2'. I am going to ignore it% + } + }, + /errors/value required/.code 2 args=% + { + \toks1={#1} + \pgfkeys@error{% + The key '\the\toks1' requires a value. I am going to ignore this + key% + } + }, + /errors/value forbidden/.code 2 args=% + { + \toks1={#1} + \toks2={#2} + \pgfkeys@error{% + You may not specify a value for the key '\the\toks1'. I am going to ignore + the value '\the\toks2' that you provided% + } + }, + /errors/unknown choice value/.code 2 args=% + { + \toks1={#1} + \toks2={#2} + \pgfkeys@error{% + Choice '\the\toks2' unknown in choice key '\the\toks1'. I am + going to ignore this key% + } + }, + /errors/unknown key/.code 2 args=% + { + \toks1={#1} + \toks2={#2} + \def\pgf@temp{#2}% + \pgfkeys@error{% + I do not know the key '\the\toks1'\ifx\pgf@temp\pgfkeysnovalue@text\space\else, to which you passed + '\the\toks2', \fi and I am going to ignore it. Perhaps you + misspelled it% + } + } +} \pgfkeys{/handlers/.unknown/.code=% {% - \let\pgfkeys@orig@key=\pgfkeyscurrentkey% - \pgfkeysalso{/errors/unknown key=\pgfkeys@orig@key{}}% - } + \def\pgf@marshal{\pgfkeysvalueof{/errors/unknown key/.@cmd}}% + {\expandafter\expandafter\expandafter\pgf@marshal\expandafter\expandafter\expandafter{\expandafter\pgfkeyscurrentkey\expandafter}\expandafter{\pgfkeyscurrentvalue}\pgfeov}% + }% } \pgfkeys{ - /handler config/.is choice, - /handler config/all/.code={% - \let\pgfkeys@case@three=\pgfkeys@case@three@handleall - \let\pgfkeys@ifexecutehandler=\pgfkeys@ifexecutehandler@handleall - }, - /handler config/only existing/.code={% - \let\pgfkeys@case@three=\pgfkeys@case@three@handle@restricted - \let\pgfkeys@ifexecutehandler=\pgfkeys@ifexecutehandler@handleonlyexisting - }, - /handler config/full or existing/.code={% - \let\pgfkeys@case@three=\pgfkeys@case@three@handle@restricted - \let\pgfkeys@ifexecutehandler=\pgfkeys@ifexecutehandler@handlefullorexisting - }, - /handler config/only existing/add exception/.code={\pgfkeysaddhandlyonlyexistingexception{#1}}, + /handler config/.is choice, + /handler config/all/.code={% + \let\pgfkeys@case@three=\pgfkeys@case@three@handleall + \let\pgfkeys@ifexecutehandler=\pgfkeys@ifexecutehandler@handleall + }, + /handler config/only existing/.code={% + \let\pgfkeys@case@three=\pgfkeys@case@three@handle@restricted + \let\pgfkeys@ifexecutehandler=\pgfkeys@ifexecutehandler@handleonlyexisting + }, + /handler config/full or existing/.code={% + \let\pgfkeys@case@three=\pgfkeys@case@three@handle@restricted + \let\pgfkeys@ifexecutehandler=\pgfkeys@ifexecutehandler@handlefullorexisting + }, + /handler config/only existing/add exception/.code={\pgfkeysaddhandleonlyexistingexception{#1}}, }% -\pgfkeysaddhandlyonlyexistingexception{.cd}% -\pgfkeysaddhandlyonlyexistingexception{.try}% -\pgfkeysaddhandlyonlyexistingexception{.retry}% -\pgfkeysaddhandlyonlyexistingexception{.lastretry}% -\pgfkeysaddhandlyonlyexistingexception{.unknown}% +\pgfkeysaddhandleonlyexistingexception{.cd}% +\pgfkeysaddhandleonlyexistingexception{.try}% +\pgfkeysaddhandleonlyexistingexception{.retry}% +\pgfkeysaddhandleonlyexistingexception{.lastretry}% +\pgfkeysaddhandleonlyexistingexception{.unknown}% +\pgfkeysaddhandleonlyexistingexception{.expand once}% +\pgfkeysaddhandleonlyexistingexception{.expand two once}% +\pgfkeysaddhandleonlyexistingexception{.expand twice}% +\pgfkeysaddhandleonlyexistingexception{.expanded}% + + +% Utilities for self-containment +\def\pgf@keys@gobble#1{} +\long\def\pgf@keys@utilifnextchar#1#2#3{% + \let\pgf@keys@utilreserved@d=#1% + \def\pgf@keys@utilreserved@a{#2}% + \def\pgf@keys@utilreserved@b{#3}% + \futurelet\pgf@keys@utillet@token\pgf@keys@utilifnch} +\def\pgf@keys@utilifnch{% + \ifx\pgf@keys@utillet@token\pgf@keys@utilsptoken + \let\pgf@keys@utilreserved@c\pgf@keys@utilxifnch + \else + \ifx\pgf@keys@utillet@token\pgf@keys@utilreserved@d + \let\pgf@keys@utilreserved@c\pgf@keys@utilreserved@a + \else + \let\pgf@keys@utilreserved@c\pgf@keys@utilreserved@b + \fi + \fi + \pgf@keys@utilreserved@c} +{% + \def\:{\global\let\pgf@keys@utilsptoken= } \: + \def\:{\pgf@keys@utilxifnch} \expandafter\gdef\: {\futurelet\pgf@keys@utillet@token\pgf@keys@utilifnch} +} \input pgfkeysfiltered.code.tex |