summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/expkv/expkv.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/generic/expkv/expkv.tex')
-rw-r--r--Master/texmf-dist/tex/generic/expkv/expkv.tex131
1 files changed, 116 insertions, 15 deletions
diff --git a/Master/texmf-dist/tex/generic/expkv/expkv.tex b/Master/texmf-dist/tex/generic/expkv/expkv.tex
index 79cbaac18b9..99171b0f1de 100644
--- a/Master/texmf-dist/tex/generic/expkv/expkv.tex
+++ b/Master/texmf-dist/tex/generic/expkv/expkv.tex
@@ -13,7 +13,7 @@
%% See http://www.latex-project.org/lppl.txt
%% --------------------------------------------------------------
%%
-%% Copyright (C) 2020 Jonathan P. Spratte
+%% Copyright (C) 2020-2021 Jonathan P. Spratte
%%
%% This work may be distributed and/or modified under the conditions of the
%% LaTeX Project Public License (LPPL), either version 1.3c of this license or
@@ -39,8 +39,8 @@
\errmessage{expkv requires e-TeX}
\expandafter\endinput
\fi
-\def\ekvVersion{1.6}
-\def\ekvDate{2020-12-28}
+\def\ekvVersion{1.7}
+\def\ekvDate{2021-04-09}
\csname ekv@tmp\endcsname
\expandafter\chardef\csname ekv@tmp\endcsname=\catcode`\@
\catcode`\@=11
@@ -130,6 +130,21 @@
\long\def\ekv@exparg@#1#2{#2{#1}}%
\long\def\ekv@expargtwice#1#2{\expandafter\ekv@expargtwice@\expandafter{#2}{#1}}
\def\ekv@expargtwice@{\expandafter\ekv@exparg@\expandafter}
+\ekv@exparg{\long\def\ekv@csv@loop#1#2,}%
+ {%
+ \expandafter
+ \ekv@gobble@from@mark@to@stop
+ \expandafter#\expandafter2\expandafter\ekv@csv@loop@end\expandafter
+ \ekv@stop
+ \ekv@strip{#2}{\ekv@csv@loop@do{#1}}%
+ \ekv@csv@loop{#1}\ekv@mark
+ }
+\long\def\ekv@csv@loop@do#1#2{\unexpanded{#1{#2}}}
+\long\expandafter\def\expandafter\ekv@csv@loop@end
+ \expandafter\ekv@stop
+ \ekv@strip{#1}#2%
+ \ekv@csv@loop#3\ekv@mark
+ {}
\def\ekv@name@set#1{ekv#1(}
\def\ekv@name@key#1{#1)}
\edef\ekv@name
@@ -225,8 +240,95 @@
\unexpanded\expandafter{\ekv@undefined@set{#1}\endcsname{#1}}%
}%
{\unexpanded\expandafter{\ekv@name{#3}{#4}}}%
- }%
+ }
\expandafter\ekvdef\ekvdefNoVal
+\protected\def\ekvredirectunknown
+ {%
+ \ekv@defredirectunknown
+ \ekv@redirect@kv
+ \ekv@err@redirect@kv@notfound
+ {\long\ekvdefunknown}%
+ \ekv@redirectunknown@aux
+ }
+\protected\def\ekvredirectunknownNoVal
+ {%
+ \ekv@defredirectunknown
+ \ekv@redirect@k
+ \ekv@err@redirect@k@notfound
+ \ekvdefunknownNoVal
+ \ekv@redirectunknownNoVal@aux
+ }
+\protected\def\ekv@defredirectunknown#1#2#3#4#5#6%
+ {%
+ \begingroup
+ \edef\ekv@tmp
+ {%
+ \ekv@csv@loop#1\ekv@mark#6,\ekv@stop,%
+ \unexpanded{#2}%
+ {\ekv@csv@loop{}\ekv@mark#5,#6,\ekv@stop,}%
+ }%
+ \ekv@expargtwice
+ {\endgroup#3{#5}}%
+ {\expandafter#4\ekv@tmp\ekv@stop}%
+ }
+\def\ekv@redirectunknown@aux#1{#1{##1}{##2}}
+\def\ekv@redirectunknownNoVal@aux#1{#1{##1}}
+\def\ekv@redirect@k#1#2#3#4%
+ {%
+ \ekv@if@lastnamedcs
+ {%
+ \def\ekv@redirect@k##1##2##3%
+ {%
+ \ifcsname#1\endcsname\ekv@redirect@k@a\fi
+ ##3{##1}%
+ }%
+ \def\ekv@redirect@k@a\fi{\fi\expandafter\ekv@redirect@k@b\lastnamedcs}%
+ \long\def\ekv@redirect@kv##1##2##3##4%
+ {%
+ \ifcsname#2\endcsname\ekv@redirect@kv@a\fi\@gobble{##1}%
+ ##4{##1}{##2}%
+ }
+ \def\ekv@redirect@kv@a\fi\@gobble
+ {\fi\expandafter\ekv@redirect@kv@b\lastnamedcs}%
+ }
+ {%
+ \def\ekv@redirect@k##1##2##3%
+ {%
+ \ifcsname#1\endcsname\ekv@redirect@k@a\fi\ekv@redirect@k@a@
+ #1\endcsname
+ ##3{##1}%
+ }%
+ \def\ekv@redirect@k@a@#3\endcsname{}%
+ \def\ekv@redirect@k@a\fi\ekv@redirect@k@a@
+ {\fi\expandafter\ekv@redirect@k@b\csname}%
+ \long\def\ekv@redirect@kv##1##2##3##4%
+ {%
+ \ifcsname#2\endcsname\ekv@redirect@kv@a\fi\ekv@redirect@kv@a@
+ #2\endcsname{##1}%
+ ##4{##1}{##2}%
+ }
+ \long\def\ekv@redirect@kv@a@#4\endcsname##3{}%
+ \def\ekv@redirect@kv@a\fi\ekv@redirect@kv@a@
+ {\fi\expandafter\ekv@redirect@kv@b\csname}%
+ }
+ }
+\def\ekv@redirect@kv#1\detokenize#2#3\ekv@stop{\unexpanded{#1#2#3}}
+\edef\ekv@redirect@kv
+ {%
+ {\expandafter\ekv@redirect@kv\ekv@name{#2}{#1}N\ekv@stop}%
+ {\expandafter\ekv@redirect@kv\ekv@name{#3}{#2}\ekv@stop}%
+ {\expandafter\ekv@redirect@kv\ekv@name{#1}{#2}N\ekv@stop}%
+ {\expandafter\ekv@redirect@kv\ekv@name{#1}{#2}\ekv@stop}%
+ }
+\expandafter\ekv@redirect@k\ekv@redirect@kv
+\def\ekv@redirect@k@b#1%
+ {\ifx\relax#1\ekv@redirect@k@c\fi\ekv@redirect@k@d#1}
+\def\ekv@redirect@k@c\fi\ekv@redirect@k@d#1{\fi}
+\def\ekv@redirect@k@d#1#2\ekv@stop{#1}
+\def\ekv@redirect@kv@b#1%
+ {\ifx\relax#1\ekv@redirect@kv@c\fi\ekv@redirect@kv@d#1}
+\long\def\ekv@redirect@kv@c\fi\ekv@redirect@kv@d#1#2{\fi}
+\long\def\ekv@redirect@kv@d#1#2#3\ekv@stop{#1{#2}}
\edef\ekv@defsetmacro
{%
\unexpanded{\ifx#1\relax\edef#1##1}%
@@ -540,24 +642,23 @@
\ekv@exparg{\ekv@zero\ekv@exparg{\long\def#1##1}}%
{\ekvsetSneaked{#2}{#3}{##1}}%
}
-\begingroup
-\edef\ekv@err
+\def\ekv@err#1%
{%
- \endgroup
- \unexpanded{\long\def\ekv@err}##1%
- {%
- \unexpanded{\expandafter\ekv@err@\@firstofone}%
- {\unexpanded\expandafter{\csname ! expkv Error:\endcsname}##1.}%
- \unexpanded{\ekv@stop}%
- }%
+ \long\def\ekv@err##1{\expandafter\ekv@err@\@firstofone{#1##1.}\ekv@stop}%
}
-\ekv@err
+\begingroup\expandafter\endgroup
+\expandafter\ekv@err\csname ! expkv Error:\endcsname
\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')}}
+\ekv@exparg{\long\def\ekv@err@common@#1`#2' #3.#4#5}%
+ {\ekv@err{#4 (`#5', set `#2')}}
\ekv@exparg{\long\def\ekv@err@unknown#1}{\ekv@err@common{unknown key}{#1}}
\ekv@exparg{\long\def\ekv@err@noarg #1}{\ekv@err@common{value forbidden}{#1}}
\ekv@exparg{\long\def\ekv@err@reqval #1}{\ekv@err@common{value required}{#1}}
+\ekv@exparg{\long\def\ekv@err@redirect@kv@notfound#1#2#3\ekv@stop}%
+ {\ekv@err{no key `#2' in sets #3}}
+\ekv@exparg{\def\ekv@err@redirect@k@notfound#1#2\ekv@stop}%
+ {\ekv@err{no NoVal key `#1' in sets #2}}
\catcode`\@=\ekv@tmp
%%
%%