diff options
author | Karl Berry <karl@freefriends.org> | 2021-07-07 20:54:41 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2021-07-07 20:54:41 +0000 |
commit | 2f38e8ed1192942335217b421d275f24843aae07 (patch) | |
tree | cf5ae3d7b82c4f99949064487030ef2fac1dcda3 /Master/texmf-dist/tex/generic/expkv-cs | |
parent | f32d2ecd625131cb9d544f2be290f59e7c501918 (diff) |
expkv-cs (7jul21)
git-svn-id: svn://tug.org/texlive/trunk@59864 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/generic/expkv-cs')
-rw-r--r-- | Master/texmf-dist/tex/generic/expkv-cs/expkv-cs.tex | 136 |
1 files changed, 134 insertions, 2 deletions
diff --git a/Master/texmf-dist/tex/generic/expkv-cs/expkv-cs.tex b/Master/texmf-dist/tex/generic/expkv-cs/expkv-cs.tex index 55ed7f01041..0dfc0198e0a 100644 --- a/Master/texmf-dist/tex/generic/expkv-cs/expkv-cs.tex +++ b/Master/texmf-dist/tex/generic/expkv-cs/expkv-cs.tex @@ -35,8 +35,8 @@ \else \expandafter\endinput \fi -\def\ekvcVersion{1.0} -\def\ekvcDate{2021-06-20} +\def\ekvcVersion{1.1} +\def\ekvcDate{2021-07-07} \csname ekvc@tmp\endcsname \expandafter\chardef\csname ekvc@tmp\endcsname=\catcode`\@ \catcode`\@=11 @@ -690,6 +690,115 @@ }% {\ekvc@err@unknown@key{#1}}% } +\protected\def\ekvc@t@aggregate#1% + {% + \ekvc@assert@not@long{aggregate #1}% + \ekvc@type@aggregate + \ekvc@type@aggregate@long\ekvc@type@aggregate@short + {process}% + {#1}% + } +\protected\long\def\ekvc@type@aggregate#1#2#3#4#5% + {% + \ekvc@assert@twoargs{#5}{#3 #4}{\ekvc@type@aggregate@a#1#2{#4}#5}% + } +\protected\long\def\ekvc@type@aggregate@a#1#2#3#4#5% + {% + \ekvifdefined\ekvc@set{#4}% + {% + \def\ekvc@type@aggregate@tmp##1##2{#5}% + \begingroup\expandafter\endgroup + \expandafter\ekvc@type@aggregate@b + \csname\ekv@name\ekvc@set{#4}\expandafter\endcsname + \csname ekvc@\ekvc@set(#4)\endcsname + #1#2% + {#3}% + }% + {\ekvc@err@unknown@key{#4}}% + } +\protected\long\def\ekvc@type@aggregate@b#1#2#3#4% + {% + \ekvc@type@aggregate@check@long#1#2% + {#3#1}% + {#4#2}% + } +\protected\long\def\ekvc@type@aggregate@check@long#1#2% + {\expandafter\ekvc@type@aggregate@check@long@a\detokenize{#2}\ekv@stop#1} +\protected\long\def\ekvc@type@aggregate@check@long@a#1\ekv@stop#2% + {% + \def\ekvc@type@aggregate@check@long@@##1#1{}% + \expandafter\ekvc@type@aggregate@check@long@b\meaning#2\ekv@stop{#1}% + } +\protected\def\ekvc@type@aggregate@check@long@b#1\ekv@stop#2% + {\expandafter\ekv@ifempty\expandafter{\ekvc@type@aggregate@check@long@@#1#2}} +\protected\long\def\ekvc@type@aggregate@long#1% + {% + \begingroup\expandafter\endgroup\expandafter + \ekvc@type@aggregate@long@ + \csname\ekvc@extract@mark#1\expandafter\endcsname + \expandafter{\ekvc@type@aggregate@tmp{##3}{##1}}% + } +\protected\long\def\ekvc@type@aggregate@long@#1#2#3% + {% + \long\def\ekvc@type@aggregate@tmp##1##2#1##3{##2#1{#2}} + \ekvlet\ekvc@set{#3}\ekvc@type@aggregate@tmp + } +\protected\long\def\ekvc@type@aggregate@short#1#2% + {% + \begingroup\expandafter\endgroup\expandafter + \ekvc@type@aggregate@short@ + \csname\ekvc@extract@mark#1\expandafter\endcsname + \csname ekvc@\ekvc@set(#2)\expandafter\endcsname + \expandafter{\ekvc@type@aggregate@tmp{##3}{##1}}% + {#2}% + } +\protected\long\def\ekvc@type@aggregate@short@#1#2#3#4% + {% + \ekvdef\ekvc@set{#4}{#2{##1}}% + \long\def#2##1##2#1##3{##2#1{#3}}% + } +\protected\def\ekvc@t@process + {% + \ifx\ekvc@long\long + \ekv@fi@firstoftwo + \fi + \@secondoftwo + {% + \ekvc@type@aggregate + \ekvc@type@process@long\ekvc@type@process@long + }% + {% + \ekvc@type@aggregate + \ekvc@type@process@short\ekvc@type@process@short + }% + {process}% + } +\protected\long\def\ekvc@type@process@long#1% + {% + \begingroup\expandafter\endgroup\expandafter + \ekvc@type@process@long@ + \csname\ekvc@extract@mark#1\expandafter\endcsname + \expandafter{\ekvc@type@aggregate@tmp{##3}{##1}}% + } +\protected\long\def\ekvc@type@process@long@#1#2#3% + {% + \long\def\ekvc@type@aggregate@tmp##1##2#1##3{#2##2#1{##3}}% + \ekvlet\ekvc@set{#3}\ekvc@type@aggregate@tmp + } +\protected\long\def\ekvc@type@process@short#1#2% + {% + \begingroup\expandafter\endgroup\expandafter + \ekvc@type@process@short@ + \csname\ekvc@extract@mark#1\expandafter\endcsname + \csname ekvc@\ekvc@set(#2)\expandafter\endcsname + \expandafter{\ekvc@type@aggregate@tmp{##3}{##1}}% + {#2}% + } +\protected\long\def\ekvc@type@process@short@#1#2#3#4% + {% + \ekvdef\ekvc@set{#4}{#2{##1}}% + \long\def#2##1##2#1##3{#3##2#1{##3}}% + } \protected\expandafter\def\csname ekvc@t@flag-bool\endcsname#1#2% {% \ekvc@assert@not@long{flag-bool #1}% @@ -831,7 +940,22 @@ {% \ekv@ifempty@\ekv@ifempty@A } +\long\def\ekvc@ifnottwoargs#1% + {% + \ekvc@ifempty@gtwo#1\ekv@ifempty@B + \ekv@ifempty@false\ekv@ifempty@A\ekv@ifempty@B\@firstoftwo + } +\long\def\ekvc@ifempty@gtwo#1#2{\ekv@ifempty@\ekv@ifempty@A} +\def\ekvc@extract@mark#1{\expandafter\ekvc@extract@mark@\meaning#1\ekv@stop} +\begingroup +\lccode`;=`\# +\lccode`/=`\\ +\lowercase{\endgroup +\def\ekvc@extract@mark@#1:#2/#3 ;#4\ekv@stop{#3}% +} \long\def\ekvc@assert@not@long#1{\ifx\ekvc@long\long\ekvc@err@no@long{#1}\fi} +\protected\long\def\ekvc@assert@twoargs#1#2% + {\ekvc@ifnottwoargs{#1}{\ekvc@err@not@two{#2}}} \protected\def\ekvc@err@toomany#1% {% \errmessage{expkv-cs Error: Too many keys for macro `\string#1'}% @@ -865,6 +989,14 @@ } \long\def\ekvc@err@no@key@macro#1% {\errmessage{expkv-cs Error: \string#1 is no key=val macro}} +\protected\long\def\ekvc@err@not@two#1% + {% + \errmessage + {% + expkv-cs Error: Definition of `\unexpanded{#1}' doesn't contain exactly + two arguments% + }% + } \ekv@exparg{\long\def\ekvc@err#1}{\ekverr{expkv-cs}{#1}} \long\def\ekvc@err@unknown@hash#1{\ekvc@err{unknown hash `#1'}} \long\def\ekvc@err@missing@hash#1{\ekvc@err{hash `#1' not found}} |