From 594d9d83472299aca8bfbe9f123b418cbc40d4ca Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sun, 11 Oct 2020 20:49:36 +0000 Subject: expkv (11oct20) git-svn-id: svn://tug.org/texlive/trunk@56634 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/tex/generic/expkv/expkv.tex | 592 ++++++++++++++++---------- 1 file changed, 356 insertions(+), 236 deletions(-) (limited to 'Master/texmf-dist/tex') diff --git a/Master/texmf-dist/tex/generic/expkv/expkv.tex b/Master/texmf-dist/tex/generic/expkv/expkv.tex index 84898302138..5897ca8c924 100644 --- a/Master/texmf-dist/tex/generic/expkv/expkv.tex +++ b/Master/texmf-dist/tex/generic/expkv/expkv.tex @@ -39,11 +39,23 @@ \errmessage{expkv requires e-TeX} \expandafter\endinput \fi -\def\ekvVersion{1.4} -\def\ekvDate{2020-07-04} +\def\ekvVersion{1.5} +\def\ekvDate{2020-10-10} \csname ekv@tmp\endcsname \expandafter\chardef\csname ekv@tmp\endcsname=\catcode`\@ \catcode`\@=11 +\begingroup + \edef\ekv@tmpa{\string \lastnamedcs} + \edef\ekv@tmpb{\meaning\lastnamedcs} + \ifx\ekv@tmpa\ekv@tmpb + \def\ekv@if@lastnamedcs{\long\def\ekv@if@lastnamedcs##1##2{##1}} + \else + \def\ekv@if@lastnamedcs{\long\def\ekv@if@lastnamedcs##1##2{##2}} + \fi + \expandafter +\endgroup +\ekv@if@lastnamedcs +\def\ekv@empty{} \long\def\@gobble#1{} \long\def\@firstofone#1{#1} \long\def\@firstoftwo#1#2{#1} @@ -74,135 +86,184 @@ \ekv@ifempty@A\ekv@ifempty@B\@secondoftwo } \long\def\ekv@ifblank@\ekv@mark#1{\ekv@ifempty@\ekv@ifempty@A} -\def\ekv@ifdefined#1% +\ekv@if@lastnamedcs {% - \expandafter - \ifx\csname\ifcsname #1\endcsname #1\else relax\fi\endcsname\relax - \ekv@fi@secondoftwo - \fi - \@firstoftwo + \def\ekv@ifdefined#1{\ifcsname#1\endcsname\ekv@ifdef@\fi\@secondoftwo} + \def\ekv@ifdef@\fi\@secondoftwo + {% + \fi + \expandafter\ifx\lastnamedcs\relax + \ekv@fi@secondoftwo + \fi + \@firstoftwo + } } -\def\ekv@name#1#2{\ekv@name@set{#1}\ekv@name@key{\detokenize{#2}}} -\def\ekv@name@set#1{ekv#1(} -\def\ekv@name@key#1{#1)} -\def\ekv@undefined@set#1{! expkv Error: Set `#1' undefined.} -\protected\def\ekv@checkvalid#1#2% {% - \ekv@ifempty{#1}% - {% - \def\ekv@tmp{}% - \errmessage{expkv Error: empty set name not allowed}% - }% + \def\ekv@ifdefined#1% {% - \ekv@ifempty{#2}% - {% - \def\ekv@tmp{}% - \errmessage{expkv Error: empty key name not allowed}% - }% - \@secondoftwo - }% - \@gobble + \ifcsname#1\endcsname\ekv@ifdef@\fi\ekv@ifdef@false#1\endcsname\relax + \ekv@fi@secondoftwo + \fi + \@firstoftwo + } + \def\ekv@ifdef@\fi\ekv@ifdef@false{\fi\expandafter\ifx\csname} + \long\def\ekv@ifdef@false + #1\endcsname\relax\ekv@fi@secondoftwo\fi\@firstoftwo#2#3% + {#3} } -\def\ekvifdefined#1#2{\ekv@ifdefined{\ekv@name{#1}{#2}}} -\def\ekvifdefinedNoVal#1#2{\ekv@ifdefined{\ekv@name{#1}{#2}N}} -\protected\long\def\ekvdef#1#2#3% +\def\ekv@strip#1% {% - \ekv@checkvalid{#1}{#2}% + \long\def\ekv@strip##1% {% - \expandafter\def\csname\ekv@name{#1}{#2}\endcsname##1{#3}% - \expandafter\ekv@defsetmacro\csname\ekv@undefined@set{#1}\endcsname{#1}% + \ekv@strip@a + ##1\ekv@nil + \ekv@mark#1% + #1\ekv@nil + \ekv@stop }% + \long\def\ekv@strip@a##1\ekv@mark#1{\ekv@strip@b##1\ekv@mark}% + \long\def\ekv@strip@b##1#1\ekv@nil {\ekv@strip@c##1\ekv@nil}% } -\protected\long\def\ekvdefNoVal#1#2#3% +\ekv@strip{ } +\long\def\ekv@strip@c\ekv@mark#1\ekv@nil\ekv@mark#2\ekv@nil\ekv@stop#3{#3{#1}} +\long\def\ekv@expB@unbraceA#1#2% {% - \ekv@checkvalid{#1}{#2}% - {% - \expandafter\def\csname\ekv@name{#1}{#2}N\endcsname{#3}% - \expandafter\ekv@defsetmacro\csname\ekv@undefined@set{#1}\endcsname{#1}% - }% + \expandafter\ekv@expB@unbraceA@\expandafter{#2}{#1}% } -\protected\def\ekvlet#1#2#3% +\long\def\ekv@expB@unbraceA@#1#2{#2{#1}}% +\def\ekv@name@set#1{ekv#1(} +\def\ekv@name@key#1{#1)} +\edef\ekv@name {% - \ekv@checkvalid{#1}{#2}% - {% - \expandafter\let\csname\ekv@name{#1}{#2}\endcsname#3% - \expandafter\ekv@defsetmacro\csname\ekv@undefined@set{#1}\endcsname{#1}% - }% + \unexpanded\expandafter{\ekv@name@set{#1}}% + \unexpanded\expandafter{\ekv@name@key{\detokenize{#2}}}% } -\protected\def\ekvletNoVal#1#2#3% +\ekv@expB@unbraceA{\def\ekv@name#1#2}{\ekv@name} +\def\ekv@undefined@set#1{! expkv Error: Set `#1' undefined.} +\edef\ekv@checkvalid {% - \ekv@checkvalid{#1}{#2}% + \unexpanded\expandafter{\ekv@ifempty{#1}}% + \unexpanded + {{% + \def\ekv@tmp{}% + \errmessage{expkv Error: empty set name not allowed}% + }}% {% - \expandafter\let\csname\ekv@name{#1}{#2}N\endcsname#3% - \expandafter\ekv@defsetmacro\csname\ekv@undefined@set{#1}\endcsname{#1}% + \unexpanded\expandafter{\ekv@ifempty{#2}}% + \unexpanded + {% + {% + \def\ekv@tmp{}% + \errmessage{expkv Error: empty key name not allowed}% + }% + \@secondoftwo + }% }% - } -\protected\def\ekvletkv#1#2#3#4% - {% - \ekv@checkvalid{#1}{#2}% + \unexpanded{\@gobble}% + } +\ekv@expB@unbraceA{\protected\def\ekv@checkvalid#1#2}{\ekv@checkvalid}% +\ekv@expB@unbraceA{\ekv@expB@unbraceA{\def\ekvifdefined#1#2}}% + {\expandafter\ekv@ifdefined\expandafter{\ekv@name{#1}{#2}}} +\ekv@expB@unbraceA{\ekv@expB@unbraceA{\def\ekvifdefinedNoVal#1#2}}% + {\expandafter\ekv@ifdefined\expandafter{\ekv@name{#1}{#2}N}} +\def\ekvdef#1#2#3#4% + {% + \protected\long\def\ekvdef##1##2##3% + {#1{\expandafter\def\csname#2\endcsname####1{##3}#3}}% + \protected\long\def\ekvdefNoVal##1##2##3% + {#1{\expandafter\def\csname#2N\endcsname{##3}#3}}% + \protected\def\ekvlet##1##2##3% + {#1{\expandafter\let\csname#2\endcsname##3#3}}% + \protected\def\ekvletNoVal##1##2##3% + {#1{\expandafter\let\csname#2N\endcsname##3#3}}% + \ekv@expB@unbraceA{\ekv@expB@unbraceA{\ekv@expB@unbraceA{% + \protected\long\def\ekvdefunknown##1##2}}}% {% - \expandafter\let\csname\ekv@name{#1}{#2}\expandafter\endcsname - \csname\ekv@name{#3}{#4}\endcsname - \expandafter\ekv@defsetmacro\csname\ekv@undefined@set{#1}\endcsname{#1}% + \expandafter\ekv@expB@unbraceA@\expandafter + {% + \expandafter\expandafter\expandafter + \def\expandafter\csname\ekv@name{##1}{}u\endcsname####1####2{##2}% + #3% + }% + {\ekv@checkvalid{##1}.}% }% - } -\protected\def\ekvletkvNoVal#1#2#3#4% - {% - \ekv@checkvalid{#1}{#2}% + \ekv@expB@unbraceA{\ekv@expB@unbraceA{\ekv@expB@unbraceA{% + \protected\long\def\ekvdefunknownNoVal##1##2}}}% {% - \expandafter\let\csname\ekv@name{#1}{#2}N\expandafter\endcsname - \csname\ekv@name{#3}{#4}N\endcsname - \expandafter\ekv@defsetmacro\csname\ekv@undefined@set{#1}\endcsname{#1}% + \expandafter\ekv@expB@unbraceA@\expandafter + {% + \expandafter\expandafter\expandafter + \def\expandafter\csname\ekv@name{##1}{}uN\endcsname####1{##2}% + #3% + }% + {\ekv@checkvalid{##1}.}% }% - } -\protected\def\ekvdefunknown#1#2% - {% - \ekv@checkvalid{#1}{.}% + \protected\def\ekvletkv##1##2##3##4% {% - \expandafter\def\csname\ekv@name{#1}{}u\endcsname##1##2{#2}% - \expandafter\ekv@defsetmacro\csname\ekv@undefined@set{#1}\endcsname{#1}% + #1% + {% + \expandafter\let\csname#2\expandafter\endcsname + \csname#4\endcsname + #3% + }% }% - } -\protected\def\ekvdefunknownNoVal#1#2% - {% - \ekv@checkvalid{#1}{.}% + \protected\def\ekvletkvNoVal##1##2##3##4% {% - \expandafter\def\csname\ekv@name{#1}{}uN\endcsname##1{#2}% - \expandafter\ekv@defsetmacro\csname\ekv@undefined@set{#1}\endcsname{#1}% + #1% + {% + \expandafter\let\csname#2N\expandafter\endcsname + \csname#4N\endcsname + #3% + }% }% } -\protected\def\ekv@defsetmacro#1#2% +\edef\ekvdefNoVal {% - \ifx#1\relax - \edef#1##1{\ekv@name@set{#2}\ekv@name@key{\noexpand\detokenize{##1}}}% - \fi + {\unexpanded\expandafter{\ekv@checkvalid{#1}{#2}}}% + {\unexpanded\expandafter{\ekv@name{#1}{#2}}}% + {% + \unexpanded{\expandafter\ekv@defsetmacro\csname}% + \unexpanded\expandafter{\ekv@undefined@set{#1}\endcsname{#1}}% + }% + {\unexpanded\expandafter{\ekv@name{#3}{#4}}}% + }% +\expandafter\ekvdef\ekvdefNoVal +\edef\ekv@defsetmacro + {% + \unexpanded{\ifx#1\relax\edef#1##1}% + {% + \unexpanded\expandafter{\ekv@name@set{#2}}% + \unexpanded\expandafter{\ekv@name@key{##1}}% + }% + \unexpanded{\fi}% } -\def\ekvifdefinedset#1% +\ekv@expB@unbraceA{\protected\def\ekv@defsetmacro#1#2}{\ekv@defsetmacro} +\ekv@expB@unbraceA{\ekv@expB@unbraceA{\def\ekvifdefinedset#1}}% {% - \ekv@ifdefined{\ekv@undefined@set{#1}}% + \expandafter\ekv@ifdefined\expandafter{\ekv@undefined@set{#1}}% } +\begingroup \def\ekvset#1#2{% \endgroup -\long\def\ekvset##1##2% +\ekv@expB@unbraceA{\long\def\ekvset##1##2}% {% - \expandafter\ekv@set\csname\ekv@undefined@set{##1}\endcsname + \expandafter\expandafter\expandafter + \ekv@set\expandafter\csname\ekv@undefined@set{##1}\endcsname \ekv@mark##2#1\ekv@stop#1{}% } \long\def\ekv@set##1##2#1% {% \ekv@gobble@from@mark@to@stop##2\ekv@endset\ekv@stop \ekv@set@other##1##2,\ekv@stop,% - \ekv@set##1\ekv@mark } \long\def\ekv@endset - \ekv@stop\ekv@set@other##1,\ekv@stop,\ekv@set##2\ekv@mark - ##3% - {##3} -\long\def\ekv@eq@other##1=##2\ekv@mark##3##4\ekv@stop + \ekv@stop\ekv@set@other##1\ekv@mark\ekv@stop,\ekv@stop,##2% + {##2} +\long\def\ekv@eq@other##1=##2\ekv@mark##3% {% ##3##1\ekv@stop\ekv@mark##2% } -\long\def\ekv@eq@active##1#2##2\ekv@mark##3##4\ekv@stop +\long\def\ekv@eq@active##1#2##2\ekv@mark##3% {% ##3##1\ekv@stop\ekv@mark##2% } @@ -210,51 +271,70 @@ {% \ekv@gobble@from@mark@to@stop##2\ekv@endset@other\ekv@stop \ekv@eq@other##2\ekv@nil\ekv@mark\ekv@set@eq@other@a - =\ekv@mark\ekv@set@eq@active\ekv@stop + =\ekv@mark\ekv@set@eq@active ##1% - \ekv@set@other##1\ekv@mark + \ekv@mark } \long\def\ekv@set@eq@other@a##1\ekv@stop {% - \ekv@eq@active##1\ekv@nil\ekv@mark\ekv@set@eq@other@active@a - #2\ekv@mark\ekv@set@eq@other@b\ekv@stop + \ekv@eq@active##1\ekv@nil\ekv@mark\ekv@set@eq@other@active + #2\ekv@mark\ekv@set@eq@other@b } -\long\def\ekv@set@eq@other@b - ##1\ekv@nil\ekv@mark\ekv@set@eq@other@active@a\ekv@stop\ekv@mark +\ekv@expB@unbraceA {% - \ekv@strip{##1}\ekv@set@pair - } -\long\def\ekv@set@eq@other@active@a##1\ekv@stop##2\ekv@nil\ekv@mark + \long\def\ekv@set@eq@other@b + ##1\ekv@nil\ekv@mark\ekv@set@eq@other@active\ekv@stop\ekv@mark + ##2\ekv@nil=\ekv@mark\ekv@set@eq@active + }% + {\ekv@strip{##1}{\expandafter\ekv@set@pair\detokenize}\ekv@mark##2\ekv@nil} +\ekv@expB@unbraceA {% - \ekv@set@eq@other@active@b{##1}##2=% - } -\long\def\ekv@set@eq@other@active@b##1% - {% - \ekv@strip{##1}\ekv@set@pair - } + \long\def\ekv@set@eq@other@active + ##1\ekv@stop##2\ekv@nil#2\ekv@mark + \ekv@set@eq@other@b\ekv@mark##3=\ekv@mark\ekv@set@eq@active + }% + {\ekv@strip{##1}{\expandafter\ekv@set@pair\detokenize}\ekv@mark##2=##3} \long\def\ekv@set@eq@active ##1\ekv@nil\ekv@mark\ekv@set@eq@other@a\ekv@stop\ekv@mark {% \ekv@eq@active##1\ekv@nil\ekv@mark\ekv@set@eq@active@ - #2\ekv@mark\ekv@set@noeq\ekv@stop + #2\ekv@mark\ekv@set@noeq } -\long\def\ekv@set@eq@active@##1\ekv@stop +\ekv@expB@unbraceA + {\long\def\ekv@set@eq@active@##1\ekv@stop##2\ekv@nil#2\ekv@mark\ekv@set@noeq}% {% - \ekv@strip{##1}\ekv@set@pair + \ekv@strip{##1}{\expandafter\ekv@set@pair\detokenize}\ekv@mark##2\ekv@nil } -\long\def\ekv@set@noeq##1\ekv@nil\ekv@mark\ekv@set@eq@active@\ekv@stop\ekv@mark +\edef\ekv@set@noeq {% - \ekv@ifblank@##1\ekv@nil\ekv@ifempty@B\ekv@ifempty@true@F@gobble - \ekv@ifempty@A\ekv@ifempty@B\@firstofone - {\ekv@strip{##1}\ekv@set@key}% + \unexpanded + {% + \ekv@ifblank@##1\ekv@nil\ekv@ifempty@B\ekv@set@was@blank + \ekv@ifempty@A\ekv@ifempty@B + }% + \unexpanded\expandafter + {\ekv@strip{##1}{\expandafter\ekv@set@key\detokenize}\ekv@mark}% + } +\ekv@expB@unbraceA + {% + \long\def\ekv@set@noeq + ##1\ekv@nil\ekv@mark\ekv@set@eq@active@\ekv@stop\ekv@mark + }% + {\ekv@set@noeq} +\def\ekv@set@was@blank##1% + {% + \def\ekv@set@was@blank + \ekv@ifempty@A\ekv@ifempty@B + \ekv@strip@a\ekv@mark####1\ekv@nil\ekv@mark##1##1\ekv@nil\ekv@stop + ####2\ekv@mark + {\ekv@set@other}% } +\ekv@set@was@blank{ } \long\def\ekv@endset@other \ekv@stop - \ekv@eq@other##1\ekv@nil\ekv@mark\ekv@set@eq@other@a - =\ekv@mark\ekv@set@eq@active\ekv@stop - ##2% - \ekv@set@other##3\ekv@mark - {} + \ekv@eq@other\ekv@mark\ekv@stop\ekv@nil\ekv@mark\ekv@set@eq@other@a + =\ekv@mark\ekv@set@eq@active + {\ekv@set} \long\def\ekvbreak##1##2\ekv@stop#1##3{##1} \long\def\ekvbreakPreSneak ##1##2\ekv@stop#1##3{##1##3} \long\def\ekvbreakPostSneak##1##2\ekv@stop#1##3{##3##1} @@ -274,167 +354,229 @@ {% \ekv@gobble@from@mark@to@stop##3\ekv@endparse\ekv@stop \ekv@parse@other##1##2##3,\ekv@stop,% - \ekv@parse##1##2\ekv@mark } \long\def\ekv@endparse - \ekv@stop\ekv@parse@other##1,\ekv@stop,\ekv@parse##2\ekv@mark + \ekv@stop\ekv@parse@other##1\ekv@mark\ekv@stop,\ekv@stop,% {} \long\def\ekv@parse@other##1##2##3,% {% \ekv@gobble@from@mark@to@stop##3\ekv@endparse@other\ekv@stop \ekv@eq@other##3\ekv@nil\ekv@mark\ekv@parse@eq@other@a - =\ekv@mark\ekv@parse@eq@active\ekv@stop + =\ekv@mark\ekv@parse@eq@active ##1##2% - \ekv@parse@other##1##2\ekv@mark + \ekv@mark } \long\def\ekv@parse@eq@other@a##1\ekv@stop {% - \ekv@eq@active##1\ekv@nil\ekv@mark\ekv@parse@eq@other@active@a - #2\ekv@mark\ekv@parse@eq@other@b\ekv@stop - } -\long\def\ekv@parse@eq@other@b - ##1\ekv@nil\ekv@mark\ekv@parse@eq@other@active@a\ekv@stop\ekv@mark - {% - \ekv@strip{##1}\ekv@parse@pair + \ekv@eq@active##1\ekv@nil\ekv@mark\ekv@parse@eq@other@active + #2\ekv@mark\ekv@parse@eq@other@b } -\long\def\ekv@parse@eq@other@active@a##1\ekv@stop##2\ekv@nil\ekv@mark +\ekv@expB@unbraceA {% - \ekv@parse@eq@other@active@b{##1}##2=% - } -\long\def\ekv@parse@eq@other@active@b##1% + \long\def\ekv@parse@eq@other@b + ##1\ekv@nil\ekv@mark\ekv@parse@eq@other@active\ekv@stop\ekv@mark + ##2\ekv@nil=\ekv@mark\ekv@parse@eq@active + }% + {\ekv@strip{##1}\ekv@parse@pair##2\ekv@nil} +\ekv@expB@unbraceA {% - \ekv@strip{##1}\ekv@parse@pair - } + \long\def\ekv@parse@eq@other@active + ##1\ekv@stop##2\ekv@nil#2\ekv@mark + \ekv@parse@eq@other@b\ekv@mark##3=\ekv@mark\ekv@parse@eq@active + }% + {\ekv@strip{##1}\ekv@parse@pair##2=##3} \long\def\ekv@parse@eq@active ##1\ekv@nil\ekv@mark\ekv@parse@eq@other@a\ekv@stop\ekv@mark {% \ekv@eq@active##1\ekv@nil\ekv@mark\ekv@parse@eq@active@ - #2\ekv@mark\ekv@parse@noeq\ekv@stop + #2\ekv@mark\ekv@parse@noeq + } +\ekv@expB@unbraceA + {\long\def\ekv@parse@eq@active@##1\ekv@stop##2#2\ekv@mark\ekv@parse@noeq}% + {% + \ekv@strip{##1}\ekv@parse@pair##2% } -\long\def\ekv@parse@eq@active@##1\ekv@stop +\edef\ekv@parse@noeq {% - \ekv@strip{##1}\ekv@parse@pair + \unexpanded + {% + \ekv@ifblank@##1\ekv@nil\ekv@ifempty@B\ekv@parse@was@blank + \ekv@ifempty@A\ekv@ifempty@B + }% + \unexpanded\expandafter{\ekv@strip{##1}\ekv@parse@key}% } -\long\def\ekv@parse@noeq - ##1\ekv@nil\ekv@mark\ekv@parse@eq@active@\ekv@stop\ekv@mark +\ekv@expB@unbraceA + {% + \long\def\ekv@parse@noeq + ##1\ekv@nil\ekv@mark\ekv@parse@eq@active@\ekv@stop\ekv@mark + }% + {\ekv@parse@noeq} +\def\ekv@parse@was@blank##1% {% - \ekv@ifblank@##1\ekv@nil\ekv@ifempty@B\ekv@ifempty@true@F@gobbletwo - \ekv@ifempty@A\ekv@ifempty@B\@firstofone - {\ekv@strip{##1}\ekv@parse@key}% + \def\ekv@parse@was@blank + \ekv@ifempty@A\ekv@ifempty@B + \ekv@strip@a\ekv@mark####1\ekv@nil\ekv@mark##1##1\ekv@nil\ekv@stop + \ekv@parse@key + {\ekv@parse@other}% } +\ekv@parse@was@blank{ } \long\def\ekv@endparse@other \ekv@stop - \ekv@eq@other##1\ekv@nil\ekv@mark\ekv@parse@eq@other@a - =\ekv@mark\ekv@parse@eq@active\ekv@stop - ##2% - \ekv@parse@other##3\ekv@mark - {} -\long\def\ekv@parse@pair##1##2\ekv@nil + \ekv@eq@other\ekv@mark\ekv@stop\ekv@nil\ekv@mark\ekv@parse@eq@other@a + =\ekv@mark\ekv@parse@eq@active + {\ekv@parse} +\ekv@expB@unbraceA{\long\def\ekv@parse@pair##1##2\ekv@nil}% {% \ekv@strip{##2}\ekv@parse@pair@{##1}% } \long\def\ekv@parse@pair@##1##2##3##4% {% \unexpanded{##4{##2}{##1}}% + \ekv@parse@other##3##4% } \long\def\ekv@parse@key##1##2##3% {% \unexpanded{##2{##1}}% + \ekv@parse@other##2##3% } } -\begingroup \catcode`\,=13 \catcode`\==13 \ekvset,= -\def\ekvchangeset#1% +\edef\ekvsetSneaked {% - \expandafter\ekv@changeset\csname\ekv@undefined@set{#1}\endcsname\ekv@mark + \unexpanded{\ekvsneak{#2}}% + \unexpanded\expandafter{\ekvset{#1}{#3}}% } -\long\def\ekv@changeset#1#2\ekv@set@other#3#4\ekv@set#5% +\ekv@expB@unbraceA{\ekv@expB@unbraceA{\long\def\ekvsetSneaked#1#2#3}}% + {\ekvsetSneaked} +\ekv@expB@unbraceA{\def\ekvchangeset#1}% {% - \ekv@gobble@mark#2\ekv@set@other#1#4\ekv@set#1% + \expandafter\expandafter\expandafter + \ekv@changeset\expandafter\csname\ekv@undefined@set{#1}\endcsname\ekv@empty } -\long\def\ekv@set@pair#1#2\ekv@nil#3% +\long\def\ekv@changeset#1#2\ekv@set@other#3% {% - \expandafter\ekv@set@pair@ - \csname - \ifcsname #3{#1}\endcsname - #3{#1}% - \else - relax% - \fi - \endcsname - {#2}% + #2\ekv@set@other#1% + } +\ekv@if@lastnamedcs + {% + \long\def\ekv@set@pair#1\ekv@mark#2\ekv@nil#3% {% - \expandafter\ekv@set@pair@ - \csname - \ifcsname #3{}u\endcsname - #3{}u% - \else - relax% - \fi - \endcsname + \ifcsname #3{#1}\endcsname\ekv@set@pair@a\fi\@secondoftwo {#2}% {% - \ekv@ifdefined{#3{#1}N}% - \ekv@err@noarg - \ekv@err@unknown - #3% + \ifcsname #3{}u\endcsname\ekv@set@pair@a\fi\@secondoftwo + {#2}% + {% + \ekv@ifdefined{#3{#1}N}% + \ekv@err@noarg + \ekv@err@unknown + #3% + }% + {#1}% }% - {#1}% - }% + \ekv@set@other#3% + } + \def\ekv@set@pair@a\fi\@secondoftwo + {\fi\expandafter\ekv@set@pair@b\lastnamedcs} + } + {% + \long\def\ekv@set@pair#1\ekv@mark#2\ekv@nil#3% + {% + \ifcsname #3{#1}\endcsname + \ekv@set@pair@a\fi\ekv@set@pair@c#3{#1}\endcsname + {#2}% + {% + \ifcsname #3{}u\endcsname + \ekv@set@pair@a\fi\ekv@set@pair@c#3{}u\endcsname + {#2}% + {% + \ekv@ifdefined{#3{#1}N}% + \ekv@err@noarg + \ekv@err@unknown + #3% + }% + {#1}% + }% + \ekv@set@other#3% + } + \def\ekv@set@pair@a\fi\ekv@set@pair@c{\fi\expandafter\ekv@set@pair@b\csname} + \long\def\ekv@set@pair@c#1\endcsname#2#3{#3} } -\long\def\ekv@set@pair@#1#2% +\long\def\ekv@set@pair@b#1% {% \ifx#1\relax - \ekv@fi@secondoftwo + \ekv@set@pair@e \fi - \@firstoftwo - {\ekv@strip{#2}#1}% + \ekv@set@pair@d#1% } -\long\def\ekv@set@key#1#2% +\ekv@expB@unbraceA{\long\def\ekv@set@pair@d#1#2#3}{\ekv@strip{#2}#1} +\long\def\ekv@set@pair@e\fi\ekv@set@pair@d#1#2#3{\fi#3} +\ekv@if@lastnamedcs {% - \expandafter\ekv@set@key@ - \csname - \ifcsname #2{#1}N\endcsname - #2{#1}N% - \else - relax% - \fi - \endcsname + \long\def\ekv@set@key#1\ekv@mark#2% {% - \expandafter\ekv@set@key@ - \csname - \ifcsname #2{}uN\endcsname - #2{}uN% - \else - relax% - \fi - \endcsname + \ifcsname #2{#1}N\endcsname\ekv@set@key@a\fi\@firstofone {% - \ekv@ifdefined{#2{#1}}% - \ekv@err@reqval - \ekv@err@unknown - #2% + \ifcsname #2{}uN\endcsname\ekv@set@key@a\fi\@firstofone + {% + \ekv@ifdefined{#2{#1}}% + \ekv@err@reqval + \ekv@err@unknown + #2% + }% + {#1}% }% - {#1}% - }% + \ekv@set@other#2% + } + \def\ekv@set@key@a\fi\@firstofone{\fi\expandafter\ekv@set@key@b\lastnamedcs} + } + {% + \long\def\ekv@set@key#1\ekv@mark#2% + {% + \ifcsname #2{#1}N\endcsname + \ekv@set@key@a\fi\ekv@set@key@c#2{#1}N\endcsname + {% + \ifcsname #2{}uN\endcsname + \ekv@set@key@a\fi\ekv@set@key@c#2{}uN\endcsname + {% + \ekv@ifdefined{#2{#1}}% + \ekv@err@reqval + \ekv@err@unknown + #2% + }% + {#1}% + }% + \ekv@set@other#2% + } + \def\ekv@set@key@a\fi\ekv@set@key@c{\fi\expandafter\ekv@set@key@b\csname} + \long\def\ekv@set@key@c#1N\endcsname#2{#2} } -\def\ekv@set@key@#1% +\long\def\ekv@set@key@b#1% {% \ifx#1\relax \ekv@fi@secondoftwo \fi \@firstoftwo#1% } -\protected\def\ekvsetdef#1#2% +\ekv@expB@unbraceA{\ekv@expB@unbraceA{\ekv@expB@unbraceA{\ekv@expB@unbraceA{% +\protected\def\ekvsetdef#1#2}}}}% {% - \expandafter\expandafter\expandafter - \ekv@setdef\expandafter\expandafter\expandafter{\ekvset{#2}{##1}}#1% + \ekv@expB@unbraceA{\ekv@expB@unbraceA{\long\def#1##1}}% + {\ekvset{#2}{##1}}% + } +\ekv@expB@unbraceA{\ekv@expB@unbraceA{\ekv@expB@unbraceA{\ekv@expB@unbraceA{% +\protected\def\ekvsetSneakeddef#1#2}}}}% + {% + \ekv@expB@unbraceA{\ekv@expB@unbraceA{\long\def#1##1##2}}% + {\ekvsetSneaked{#2}{##1}{##2}}% } -\protected\def\ekv@setdef#1#2% +\ekv@expB@unbraceA{\ekv@expB@unbraceA{\ekv@expB@unbraceA{\ekv@expB@unbraceA{% +\protected\def\ekvsetdefSneaked#1#2#3}}}}% {% - \long\def#2##1{#1}% + \ekv@expB@unbraceA{\ekv@expB@unbraceA{\long\def#1##1}}% + {\ekvsetSneaked{#2}{#3}{##1}}% } \begingroup \edef\ekv@err @@ -451,34 +593,12 @@ \def\ekv@err@{\expandafter\ekv@gobbleto@stop} \long\def\ekv@err@common #1#2{\expandafter\ekv@err@common@\string#2{#1}} \long\def\ekv@err@common@#1`#2' #3.#4#5{\ekv@err{#4 (`#5', set `#2')}} -\long\def\ekv@err@unknown#1#2{\ekv@err@common{unknown key}#1{#2}} -\long\def\ekv@err@noarg #1#2{\ekv@err@common{value forbidden}#1{#2}} -\long\def\ekv@err@reqval #1#2{\ekv@err@common{value required}#1{#2}} -\def\ekv@strip#1% - {% - \long\def\ekv@strip##1% - {% - \ekv@strip@a - ##1% - \ekv@nil - \ekv@mark#1% - #1\ekv@nil{}% - \ekv@stop - }% - \long\def\ekv@strip@a##1\ekv@mark#1##2\ekv@nil##3% - {% - \ekv@strip@b##3##1##2\ekv@nil - }% - \long\def\ekv@strip@b##1#1\ekv@nil - {% - \ekv@strip@c##1\ekv@nil - }% - \long\def\ekv@strip@c\ekv@mark##1\ekv@nil##2\ekv@stop##3% - {% - ##3{##1}% - }% - } -\ekv@strip{ } +\ekv@expB@unbraceA{\long\def\ekv@err@unknown#1}% + {\ekv@err@common{unknown key}{#1}} +\ekv@expB@unbraceA{\long\def\ekv@err@noarg #1}% + {\ekv@err@common{value forbidden}{#1}} +\ekv@expB@unbraceA{\long\def\ekv@err@reqval #1}% + {\ekv@err@common{value required}{#1}} \catcode`\@=\ekv@tmp %% %% -- cgit v1.2.3