summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/expkv-cs
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2021-07-07 20:54:41 +0000
committerKarl Berry <karl@freefriends.org>2021-07-07 20:54:41 +0000
commit2f38e8ed1192942335217b421d275f24843aae07 (patch)
treecf5ae3d7b82c4f99949064487030ef2fac1dcda3 /Master/texmf-dist/tex/generic/expkv-cs
parentf32d2ecd625131cb9d544f2be290f59e7c501918 (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.tex136
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}}