From f1991724088484845cc165c43948922dc85da9bf Mon Sep 17 00:00:00 2001
From: Karl Berry <karl@freefriends.org>
Date: Sat, 10 Apr 2021 21:10:10 +0000
Subject: expkv (10apr21)

git-svn-id: svn://tug.org/texlive/trunk@58815 c570f23f-e606-0410-a88d-b1316a301751
---
 Master/texmf-dist/tex/generic/expkv/expkv.tex | 131 +++++++++++++++++++++++---
 1 file changed, 116 insertions(+), 15 deletions(-)

(limited to 'Master/texmf-dist/tex/generic/expkv/expkv.tex')

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
 %% 
 %%
-- 
cgit v1.2.3

