texlive[57247] Master/texmf-dist: expkv (28dec20)

commits+karl at tug.org commits+karl at tug.org
Mon Dec 28 23:32:43 CET 2020


Revision: 57247
          http://tug.org/svn/texlive?view=revision&revision=57247
Author:   karl
Date:     2020-12-28 23:32:43 +0100 (Mon, 28 Dec 2020)
Log Message:
-----------
expkv (28dec20)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/expkv/README.md
    trunk/Master/texmf-dist/doc/latex/expkv/expkv.pdf
    trunk/Master/texmf-dist/source/latex/expkv/expkv.dtx
    trunk/Master/texmf-dist/tex/generic/expkv/expkv.tex

Modified: trunk/Master/texmf-dist/doc/latex/expkv/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/expkv/README.md	2020-12-28 22:32:26 UTC (rev 57246)
+++ trunk/Master/texmf-dist/doc/latex/expkv/README.md	2020-12-28 22:32:43 UTC (rev 57247)
@@ -1,7 +1,7 @@
 -------------------------------------------------------------------------------
 # expkv -- an expandable key=val implementation
 
-Version 2020-10-10 v1.5
+Version 2020-12-28 v1.6
 
 Released under the LaTeX Project Public License v1.3c or later
 See http://www.latex-project.org/lppl.txt

Modified: trunk/Master/texmf-dist/doc/latex/expkv/expkv.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/source/latex/expkv/expkv.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/expkv/expkv.dtx	2020-12-28 22:32:26 UTC (rev 57246)
+++ trunk/Master/texmf-dist/source/latex/expkv/expkv.dtx	2020-12-28 22:32:43 UTC (rev 57247)
@@ -423,15 +423,17 @@
 %
 % \begin{function}{\ekvparse}
 %   \begin{syntax}
-%     \cs{ekvparse}\meta{cs1}\meta{cs2}\{\kv,\ldots\}
+%     \cs{ekvparse}\marg{code1}\marg{code2}\{\kv,\ldots\}
 %   \end{syntax}
 %   This macro parses the \kv\ pairs and provides those list elements which are
-%   only keys as the argument to \meta{cs1}, and those which are a \kv\ pair to
-%   \meta{cs2} as two arguments. It is fully expandable as well and returns the
-%   parsed list in |\unexpanded|, which has no effect outside of an |\expanded|
-%   or |\edef| context\footnotemark.
+%   only keys as an argument to \meta{code1}, and those which are a \kv\ pair
+%   to \meta{code2} as two arguments. It is fully expandable as well and returns
+%   each element of the parsed list in |\unexpanded|, which has no effect
+%   outside of an |\expanded| or |\edef| context\footnotemark.
 %   If you need control over the necessary steps of expansion you
-%   can use |\expanded| around it.
+%   can use |\expanded| around it. You can use multiple tokens in \meta{code1}
+%   and \meta{code2} or just a single control sequence name. In both cases the
+%   found \key\ and \val\ are provided as a brace group following them.
 %
 %   |\ekvbreak|, |\ekvsneak|, and |\ekvchangeset| and their relatives don't work
 %   in |\ekvparse|.  It is analogue to \pkg{expl3}'s |\keyval_parse:NNn|, but
@@ -438,14 +440,23 @@
 %   not with the same parsing rules -- |\keyval_parse:NNn| throws an error on
 %   multiple equal signs per \kv\ pair and on empty \key\ names in a \kv\ pair,
 %   both of which |\ekvparse| doesn't deal with.
+% \end{function}
+% \footnotetext 
+%   {^^A
+%     This is a change in behaviour, previously (v0.3 and before) \cs{ekvparse}
+%     would expand in exactly two steps. This isn't always necessary, but makes
+%     the parsing considerably slower. If this is necessary for your application
+%     you can put an \cs[no-index]{expanded} around it and will still be faster
+%     since you need only a single \cs[no-index]{expandafter} this way.^^A
+%   }
 %
 %   As a small example:
 % \begin{lstlisting}
-% \ekvparse\handlekey\handlekeyval{foo = bar, key, baz={zzz}}
+% \ekvparse{\handlekey{S}}{\handlekeyval{S}}{foo = bar, key, baz={zzz}}
 % \end{lstlisting}
-%   would expand to
+%   would be equivalent to
 % \begin{lstlisting}
-% \handlekeyval{foo}{bar}\handlekey{key}\handlekeyval{baz}{zzz}
+% \handlekeyval{S}{foo}{bar}\handlekey{S}{key}\handlekeyval{S}{baz}{zzz}
 % \end{lstlisting}
 %   and afterwards |\handlekey| and |\handlekeyval| would have to further handle
 %   the \key. There are no macros like these two contained in \expkv, you have
@@ -460,15 +471,6 @@
 % \begin{lstlisting}
 % \handle\kv{foo}{bar}\k{key}\kv{baz}{zzz}
 % \end{lstlisting}
-% \end{function}
-% \footnotetext 
-%   {^^A
-%     This is a change in behaviour, previously (v0.3 and before) \cs{ekvparse}
-%     would expand in exactly two steps. This isn't always necessary, but makes
-%     the parsing considerably slower. If this is necessary for your application
-%     you can put an \cs[no-index]{expanded} around it and will still be faster
-%     since you need only a single \cs[no-index]{expandafter} this way.^^A
-%   }.
 %
 % \subsection{Miscellaneous}
 %
@@ -1082,8 +1084,8 @@
 % \begin{macro}{\ekvVersion,\ekvDate}
 % We're on our first input, so lets store the version and date in a macro.
 %    \begin{macrocode}
-\def\ekvVersion{1.5}
-\def\ekvDate{2020-10-10}
+\def\ekvVersion{1.6}
+\def\ekvDate{2020-12-28}
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1262,25 +1264,30 @@
           ##1\ekv at nil
           \ekv at mark#1%
           #1\ekv at nil
-        \ekv at stop
       }%
     \long\def\ekv at strip@a##1\ekv at mark#1{\ekv at strip@b##1\ekv at mark}%
-    \long\def\ekv at strip@b##1#1\ekv at nil {\ekv at strip@c##1\ekv at nil}%
   }
 \ekv at strip{ }
-\long\def\ekv at strip@c\ekv at mark#1\ekv at nil\ekv at mark#2\ekv at nil\ekv at stop#3{#3{#1}}
+\long\def\ekv at strip@b#1 \ekv at nil{\ekv at strip@c#1\ekv at nil}
+\long\def\ekv at strip@c\ekv at mark#1\ekv at nil\ekv at mark#2\ekv at nil#3{#3{#1}}
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[internal]{\ekv at expB@unbraceA,\ekv at expB@unbraceA@}
-% To reduce some code doublets while gaining some speed, it is often useful to
-% expand the first token in a definition once. Let's define a wrapper for this.
+% \begin{macro}[internal]
+%   {\ekv at exparg,\ekv at exparg@,\ekv at expargtwice,\ekv at expargtwice@,\ekv at zero}
+% To reduce some code doublets while gaining some speed (and also as convenience
+% for other packages in the family), it is often useful to expand the first
+% token in a definition once. Let's define a wrapper for this.
+%
+% Also, to end a |\romannumeral| expansion, we want to use |\z@|, which is
+% contained in both plain \TeX\ and \LaTeX, but we use a private name for it to
+% make it easier to spot and hence easier to manage.
 %    \begin{macrocode}
-\long\def\ekv at expB@unbraceA#1#2%
-  {%
-    \expandafter\ekv at expB@unbraceA@\expandafter{#2}{#1}%
-  }
-\long\def\ekv at expB@unbraceA@#1#2{#2{#1}}%
+\let\ekv at zero\z@
+\long\def\ekv at exparg#1#2{\expandafter\ekv at exparg@\expandafter{#2}{#1}}
+\long\def\ekv at exparg@#1#2{#2{#1}}%
+\long\def\ekv at expargtwice#1#2{\expandafter\ekv at expargtwice@\expandafter{#2}{#1}}
+\def\ekv at expargtwice@{\expandafter\ekv at exparg@\expandafter}
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1294,7 +1301,7 @@
     \unexpanded\expandafter{\ekv at name@set{#1}}%
     \unexpanded\expandafter{\ekv at name@key{\detokenize{#2}}}%
   }
-\ekv at expB@unbraceA{\def\ekv at name#1#2}{\ekv at name}
+\ekv at exparg{\def\ekv at name#1#2}{\ekv at name}
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1340,7 +1347,7 @@
       }%
     \unexpanded{\@gobble}%
   }
-\ekv at expB@unbraceA{\protected\def\ekv at checkvalid#1#2}{\ekv at checkvalid}%
+\ekv at exparg{\protected\def\ekv at checkvalid#1#2}{\ekv at checkvalid}%
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1347,9 +1354,9 @@
 % \begin{macro}{\ekvifdefined,\ekvifdefinedNoVal}
 % And provide user-level macros to test whether a key is defined.
 %    \begin{macrocode}
-\ekv at expB@unbraceA{\ekv at expB@unbraceA{\def\ekvifdefined#1#2}}%
+\ekv at expargtwice{\def\ekvifdefined#1#2}%
   {\expandafter\ekv at ifdefined\expandafter{\ekv at name{#1}{#2}}}
-\ekv at expB@unbraceA{\ekv at expB@unbraceA{\def\ekvifdefinedNoVal#1#2}}%
+\ekv at expargtwice{\def\ekvifdefinedNoVal#1#2}%
   {\expandafter\ekv at ifdefined\expandafter{\ekv at name{#1}{#2}N}}
 %    \end{macrocode}
 % \end{macro}
@@ -1372,27 +1379,27 @@
       {#1{\expandafter\let\csname#2\endcsname##3#3}}%
     \protected\def\ekvletNoVal##1##2##3%
       {#1{\expandafter\let\csname#2N\endcsname##3#3}}%
-    \ekv at expB@unbraceA{\ekv at expB@unbraceA{\ekv at expB@unbraceA{%
-        \protected\long\def\ekvdefunknown##1##2}}}%
+    \ekv at expargtwice{\protected\long\def\ekvdefunknown##1##2}%
       {%
-        \expandafter\ekv at expB@unbraceA@\expandafter
+        \romannumeral
+        \expandafter\ekv at exparg@\expandafter
           {%
             \expandafter\expandafter\expandafter
             \def\expandafter\csname\ekv at name{##1}{}u\endcsname####1####2{##2}%
             #3%
           }%
-          {\ekv at checkvalid{##1}.}%
+          {\ekv at zero\ekv at checkvalid{##1}.}%
       }%
-    \ekv at expB@unbraceA{\ekv at expB@unbraceA{\ekv at expB@unbraceA{%
-        \protected\long\def\ekvdefunknownNoVal##1##2}}}%
+    \ekv at expargtwice{\protected\long\def\ekvdefunknownNoVal##1##2}%
       {%
-        \expandafter\ekv at expB@unbraceA@\expandafter
+        \romannumeral
+        \expandafter\ekv at exparg@\expandafter
           {%
             \expandafter\expandafter\expandafter
             \def\expandafter\csname\ekv at name{##1}{}uN\endcsname####1{##2}%
             #3%
           }%
-          {\ekv at checkvalid{##1}.}%
+          {\ekv at zero\ekv at checkvalid{##1}.}%
       }%
     \protected\def\ekvletkv##1##2##3##4%
       {%
@@ -1441,16 +1448,14 @@
       }%
     \unexpanded{\fi}%
   }
-\ekv at expB@unbraceA{\protected\def\ekv at defsetmacro#1#2}{\ekv at defsetmacro}
+\ekv at exparg{\protected\def\ekv at defsetmacro#1#2}{\ekv at defsetmacro}
 %    \end{macrocode}
 % \end{macro}
 %
 % \begin{macro}{\ekvifdefinedset}
 %    \begin{macrocode}
-\ekv at expB@unbraceA{\ekv at expB@unbraceA{\def\ekvifdefinedset#1}}%
-  {%
-    \expandafter\ekv at ifdefined\expandafter{\ekv at undefined@set{#1}}%
-  }
+\ekv at expargtwice{\def\ekvifdefinedset#1}%
+  {\expandafter\ekv at ifdefined\expandafter{\ekv at undefined@set{#1}}}
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1466,7 +1471,7 @@
 \begingroup
 \def\ekvset#1#2{%
 \endgroup
-\ekv at expB@unbraceA{\long\def\ekvset##1##2}%
+\ekv at exparg{\long\def\ekvset##1##2}%
   {%
     \expandafter\expandafter\expandafter
     \ekv at set\expandafter\csname\ekv at undefined@set{##1}\endcsname
@@ -1515,14 +1520,8 @@
 %   fast branching based on \TeX's argument grabbing rules and we don't have to
 %   split after the branching if the equal sign was there.
 %    \begin{macrocode}
-\long\def\ekv at eq@other##1=##2\ekv at mark##3%
-  {%
-    ##3##1\ekv at stop\ekv at mark##2%
-  }
-\long\def\ekv at eq@active##1#2##2\ekv at mark##3%
-  {%
-    ##3##1\ekv at stop\ekv at mark##2%
-  }
+\long\def\ekv at eq@other##1=##2\ekv at mark##3{##3##1\ekv at stop\ekv at mark##2}
+\long\def\ekv at eq@active##1#2##2\ekv at mark##3{##3##1\ekv at stop\ekv at mark##2}
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1568,7 +1567,7 @@
 %   needed to delimit |\ekv at set@pair|'s argument anyway, so we just leave it
 %   there.
 %    \begin{macrocode}
-\ekv at expB@unbraceA
+\ekv at exparg
   {%
     \long\def\ekv at set@eq at other@b
         ##1\ekv at nil\ekv at mark\ekv at set@eq at other@active\ekv at stop\ekv at mark
@@ -1585,7 +1584,7 @@
 %   |##2| everything that remains until the first found other equal sign. It has
 %   to reinsert the equal sign and forward things to |\ekv at set@pair|.
 %    \begin{macrocode}
-\ekv at expB@unbraceA
+\ekv at exparg
   {%
     \long\def\ekv at set@eq at other@active
         ##1\ekv at stop##2\ekv at nil#2\ekv at mark
@@ -1610,11 +1609,9 @@
 %   If an active equal sign was found in |\ekv at set@eq at active| we'll have to pass
 %   the now split \kv\ pair on to |\ekv at set@pair|.
 %    \begin{macrocode}
-\ekv at expB@unbraceA
+\ekv at exparg
   {\long\def\ekv at set@eq at active@##1\ekv at stop##2\ekv at nil#2\ekv at mark\ekv at set@noeq}%
-  {%
-    \ekv at strip{##1}{\expandafter\ekv at set@pair\detokenize}\ekv at mark##2\ekv at nil
-  }
+  {\ekv at strip{##1}{\expandafter\ekv at set@pair\detokenize}\ekv at mark##2\ekv at nil}
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1635,21 +1632,16 @@
     \unexpanded\expandafter
       {\ekv at strip{##1}{\expandafter\ekv at set@key\detokenize}\ekv at mark}%
   }
-\ekv at expB@unbraceA
+\ekv at exparg
   {%
     \long\def\ekv at set@noeq
         ##1\ekv at nil\ekv at mark\ekv at set@eq at active@\ekv at stop\ekv at mark
   }%
   {\ekv at set@noeq}
-\def\ekv at set@was at blank##1%
-  {%
-    \def\ekv at set@was at blank
-        \ekv at ifempty@A\ekv at ifempty@B
-        \ekv at strip@a\ekv at mark####1\ekv at nil\ekv at mark##1##1\ekv at nil\ekv at stop
-        ####2\ekv at mark
-      {\ekv at set@other}%
-  }
-\ekv at set@was at blank{ }
+\expandafter\def\expandafter\ekv at set@was at blank
+    \expandafter\ekv at ifempty@A\expandafter\ekv at ifempty@B
+    \ekv at strip{\ekv at mark##1}##2\ekv at mark
+  {\ekv at set@other}
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1679,14 +1671,8 @@
 % One last thing we want to do for |\ekvset| is to provide macros that just
 % smuggle stuff after |\ekvset|'s effects.
 %    \begin{macrocode}
-\long\def\ekvsneak##1##2\ekv at stop#1##3%
-  {%
-    ##2\ekv at stop#1{##3##1}%
-  }
-\long\def\ekvsneakPre##1##2\ekv at stop#1##3%
-  {%
-    ##2\ekv at stop#1{##1##3}%
-  }
+\long\def\ekvsneak##1##2\ekv at stop#1##3{##2\ekv at stop#1{##3##1}}
+\long\def\ekvsneakPre##1##2\ekv at stop#1##3{##2\ekv at stop#1{##1##3}}
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1697,10 +1683,7 @@
 % |\unexpanded| here and there instead of other macros to stop the |\expanded|
 % on our output.
 %    \begin{macrocode}
-\long\def\ekvparse##1##2##3%
-  {%
-    \ekv at parse##1##2\ekv at mark##3#1\ekv at stop#1%
-  }
+\long\def\ekvparse##1##2##3{\ekv at parse{##1}{##2}\ekv at mark##3#1\ekv at stop#1}
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1709,7 +1692,7 @@
 \long\def\ekv at parse##1##2##3#1%
   {%
     \ekv at gobble@from at mark@to at stop##3\ekv at endparse\ekv at stop
-    \ekv at parse@other##1##2##3,\ekv at stop,%
+    \ekv at parse@other{##1}{##2}##3,\ekv at stop,%
   }
 %    \end{macrocode}
 % \end{macro}
@@ -1729,7 +1712,7 @@
     \ekv at gobble@from at mark@to at stop##3\ekv at endparse@other\ekv at stop
     \ekv at eq@other##3\ekv at nil\ekv at mark\ekv at parse@eq at other@a
       =\ekv at mark\ekv at parse@eq at active
-    ##1##2%
+    {##1}{##2}%
     \ekv at mark
   }
 %    \end{macrocode}
@@ -1742,7 +1725,7 @@
     \ekv at eq@active##1\ekv at nil\ekv at mark\ekv at parse@eq at other@active
       #2\ekv at mark\ekv at parse@eq at other@b
   }
-\ekv at expB@unbraceA
+\ekv at exparg
   {%
     \long\def\ekv at parse@eq at other@b
         ##1\ekv at nil\ekv at mark\ekv at parse@eq at other@active\ekv at stop\ekv at mark
@@ -1754,7 +1737,7 @@
 %
 % \begin{macro}[internal]{\ekv at parse@eq at other@active}
 %    \begin{macrocode}
-\ekv at expB@unbraceA
+\ekv at exparg
   {%
     \long\def\ekv at parse@eq at other@active
         ##1\ekv at stop##2\ekv at nil#2\ekv at mark
@@ -1772,11 +1755,9 @@
     \ekv at eq@active##1\ekv at nil\ekv at mark\ekv at parse@eq at active@
       #2\ekv at mark\ekv at parse@noeq
   }
-\ekv at expB@unbraceA
+\ekv at exparg
   {\long\def\ekv at parse@eq at active@##1\ekv at stop##2#2\ekv at mark\ekv at parse@noeq}%
-  {%
-    \ekv at strip{##1}\ekv at parse@pair##2%
-  }
+  {\ekv at strip{##1}\ekv at parse@pair##2}
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1791,21 +1772,16 @@
       }%
       \unexpanded\expandafter{\ekv at strip{##1}\ekv at parse@key}%
   }
-\ekv at expB@unbraceA
+\ekv at exparg
   {%
     \long\def\ekv at parse@noeq
         ##1\ekv at nil\ekv at mark\ekv at parse@eq at active@\ekv at stop\ekv at mark
   }%
   {\ekv at parse@noeq}
-\def\ekv at parse@was at blank##1%
-  {%
-    \def\ekv at parse@was at blank
-        \ekv at ifempty@A\ekv at ifempty@B
-        \ekv at strip@a\ekv at mark####1\ekv at nil\ekv at mark##1##1\ekv at nil\ekv at stop
-        \ekv at parse@key
-      {\ekv at parse@other}%
-  }
-\ekv at parse@was at blank{ }
+\expandafter\def\expandafter\ekv at parse@was at blank
+    \expandafter\ekv at ifempty@A\expandafter\ekv at ifempty@B
+    \ekv at strip{\ekv at mark##1}\ekv at parse@key
+  {\ekv at parse@other}
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1821,14 +1797,12 @@
 %
 % \begin{macro}[internal]{\ekv at parse@pair,\ekv at parse@pair@}
 %    \begin{macrocode}
-\ekv at expB@unbraceA{\long\def\ekv at parse@pair##1##2\ekv at nil}%
-  {%
-    \ekv at strip{##2}\ekv at parse@pair@{##1}%
-  }
+\ekv at exparg{\long\def\ekv at parse@pair##1##2\ekv at nil}%
+  {\ekv at strip{##2}\ekv at parse@pair@{##1}}
 \long\def\ekv at parse@pair@##1##2##3##4%
   {%
     \unexpanded{##4{##2}{##1}}%
-    \ekv at parse@other##3##4%
+    \ekv at parse@other{##3}{##4}%
   }
 %    \end{macrocode}
 % \end{macro}
@@ -1835,10 +1809,10 @@
 %
 % \begin{macro}[internal]{\ekv at parse@key}
 %    \begin{macrocode}
-\long\def\ekv at parse@key##1##2##3%
+\long\def\ekv at parse@key##1##2%
   {%
     \unexpanded{##2{##1}}%
-    \ekv at parse@other##2##3%
+    \ekv at parse@other{##2}%
   }
 %    \end{macrocode}
 % \end{macro}
@@ -1861,8 +1835,7 @@
     \unexpanded{\ekvsneak{#2}}%
     \unexpanded\expandafter{\ekvset{#1}{#3}}%
   }
-\ekv at expB@unbraceA{\ekv at expB@unbraceA{\long\def\ekvsetSneaked#1#2#3}}%
-  {\ekvsetSneaked}
+\ekv at expargtwice{\long\def\ekvsetSneaked#1#2#3}{\ekvsetSneaked}
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1875,7 +1848,7 @@
 % switch out the set expandably, so this works similar to the |\ekvsneak| macros
 % reading and reinserting the remainder of the \kv\ list.
 %    \begin{macrocode}
-\ekv at expB@unbraceA{\def\ekvchangeset#1}%
+\ekv at exparg{\def\ekvchangeset#1}%
   {%
     \expandafter\expandafter\expandafter
     \ekv at changeset\expandafter\csname\ekv at undefined@set{#1}\endcsname\ekv at empty
@@ -1888,10 +1861,7 @@
 % leading |\ekv at empty| so that braces aren't stripped accidentally, but that
 % will not hurt and just expand to nothing in one step.
 %    \begin{macrocode}
-\long\def\ekv at changeset#1#2\ekv at set@other#3%
-  {%
-    #2\ekv at set@other#1%
-  }
+\long\def\ekv at changeset#1#2\ekv at set@other#3{#2\ekv at set@other#1}
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1964,7 +1934,7 @@
     \fi
     \ekv at set@pair at d#1%
   }
-\ekv at expB@unbraceA{\long\def\ekv at set@pair at d#1#2#3}{\ekv at strip{#2}#1}
+\ekv at exparg{\long\def\ekv at set@pair at d#1#2#3}{\ekv at strip{#2}#1}
 \long\def\ekv at set@pair at e\fi\ekv at set@pair at d#1#2#3{\fi#3}
 %    \end{macrocode}
 % \end{macro}
@@ -2028,13 +1998,13 @@
 % \begin{macro}{\ekvsetdef}
 %   Provide a macro to define a shorthand to use |\ekvset| on a specified \set.
 %   To gain the maximum speed |\ekvset| is expanded twice by
-%   |\ekv at expB@unbraceA| so that during runtime the macro storing the set name
+%   |\ekv at exparg| so that during runtime the macro storing the set name
 %   is already built and one |\expandafter| doesn't have to be used.
 %    \begin{macrocode}
-\ekv at expB@unbraceA{\ekv at expB@unbraceA{\ekv at expB@unbraceA{\ekv at expB@unbraceA{%
-\protected\def\ekvsetdef#1#2}}}}%
+\ekv at expargtwice{\protected\def\ekvsetdef#1#2}%
   {%
-    \ekv at expB@unbraceA{\ekv at expB@unbraceA{\long\def#1##1}}%
+    \romannumeral
+    \ekv at exparg{\ekv at zero\ekv at exparg{\long\def#1##1}}%
       {\ekvset{#2}{##1}}%
   }
 %    \end{macrocode}
@@ -2044,16 +2014,16 @@
 % And do the same for |\ekvsetSneaked| in the two possible ways, with a fixed
 % sneaked argument and with a flexible one.
 %    \begin{macrocode}
-\ekv at expB@unbraceA{\ekv at expB@unbraceA{\ekv at expB@unbraceA{\ekv at expB@unbraceA{%
-\protected\def\ekvsetSneakeddef#1#2}}}}%
+\ekv at expargtwice{\protected\def\ekvsetSneakeddef#1#2}%
   {%
-    \ekv at expB@unbraceA{\ekv at expB@unbraceA{\long\def#1##1##2}}%
+    \romannumeral
+    \ekv at exparg{\ekv at zero\ekv at exparg{\long\def#1##1##2}}%
       {\ekvsetSneaked{#2}{##1}{##2}}%
   }
-\ekv at expB@unbraceA{\ekv at expB@unbraceA{\ekv at expB@unbraceA{\ekv at expB@unbraceA{%
-\protected\def\ekvsetdefSneaked#1#2#3}}}}%
+\ekv at expargtwice{\protected\def\ekvsetdefSneaked#1#2#3}%
   {%
-    \ekv at expB@unbraceA{\ekv at expB@unbraceA{\long\def#1##1}}%
+    \romannumeral
+    \ekv at exparg{\ekv at zero\ekv at exparg{\long\def#1##1}}%
       {\ekvsetSneaked{#2}{#3}{##1}}%
   }
 %    \end{macrocode}
@@ -2090,12 +2060,9 @@
 %    \begin{macrocode}
 \long\def\ekv at err@common #1#2{\expandafter\ekv at err@common@\string#2{#1}}
 \long\def\ekv at err@common@#1`#2' #3.#4#5{\ekv at err{#4 (`#5', set `#2')}}
-\ekv at expB@unbraceA{\long\def\ekv at err@unknown#1}%
-  {\ekv at err@common{unknown key}{#1}}
-\ekv at expB@unbraceA{\long\def\ekv at err@noarg  #1}%
-  {\ekv at err@common{value forbidden}{#1}}
-\ekv at expB@unbraceA{\long\def\ekv at err@reqval #1}%
-  {\ekv at err@common{value required}{#1}}
+\ekv at exparg{\long\def\ekv at err@unknown#1}{\ekv at err@common{unknown key}{#1}}
+\ekv at exparg{\long\def\ekv at err@noarg  #1}{\ekv at err@common{value forbidden}{#1}}
+\ekv at exparg{\long\def\ekv at err@reqval #1}{\ekv at err@common{value required}{#1}}
 %    \end{macrocode}
 % \end{macro}
 %

Modified: trunk/Master/texmf-dist/tex/generic/expkv/expkv.tex
===================================================================
--- trunk/Master/texmf-dist/tex/generic/expkv/expkv.tex	2020-12-28 22:32:26 UTC (rev 57246)
+++ trunk/Master/texmf-dist/tex/generic/expkv/expkv.tex	2020-12-28 22:32:43 UTC (rev 57247)
@@ -39,8 +39,8 @@
   \errmessage{expkv requires e-TeX}
   \expandafter\endinput
 \fi
-\def\ekvVersion{1.5}
-\def\ekvDate{2020-10-10}
+\def\ekvVersion{1.6}
+\def\ekvDate{2020-12-28}
 \csname ekv at tmp\endcsname
 \expandafter\chardef\csname ekv at tmp\endcsname=\catcode`\@
 \catcode`\@=11
@@ -119,18 +119,17 @@
           ##1\ekv at nil
           \ekv at mark#1%
           #1\ekv at nil
-        \ekv at stop
       }%
     \long\def\ekv at strip@a##1\ekv at mark#1{\ekv at strip@b##1\ekv at mark}%
-    \long\def\ekv at strip@b##1#1\ekv at nil {\ekv at strip@c##1\ekv at nil}%
   }
 \ekv at strip{ }
-\long\def\ekv at strip@c\ekv at mark#1\ekv at nil\ekv at mark#2\ekv at nil\ekv at stop#3{#3{#1}}
-\long\def\ekv at expB@unbraceA#1#2%
-  {%
-    \expandafter\ekv at expB@unbraceA@\expandafter{#2}{#1}%
-  }
-\long\def\ekv at expB@unbraceA@#1#2{#2{#1}}%
+\long\def\ekv at strip@b#1 \ekv at nil{\ekv at strip@c#1\ekv at nil}
+\long\def\ekv at strip@c\ekv at mark#1\ekv at nil\ekv at mark#2\ekv at nil#3{#3{#1}}
+\let\ekv at zero\z@
+\long\def\ekv at exparg#1#2{\expandafter\ekv at exparg@\expandafter{#2}{#1}}
+\long\def\ekv at exparg@#1#2{#2{#1}}%
+\long\def\ekv at expargtwice#1#2{\expandafter\ekv at expargtwice@\expandafter{#2}{#1}}
+\def\ekv at expargtwice@{\expandafter\ekv at exparg@\expandafter}
 \def\ekv at name@set#1{ekv#1(}
 \def\ekv at name@key#1{#1)}
 \edef\ekv at name
@@ -138,7 +137,7 @@
     \unexpanded\expandafter{\ekv at name@set{#1}}%
     \unexpanded\expandafter{\ekv at name@key{\detokenize{#2}}}%
   }
-\ekv at expB@unbraceA{\def\ekv at name#1#2}{\ekv at name}
+\ekv at exparg{\def\ekv at name#1#2}{\ekv at name}
 \def\ekv at undefined@set#1{! expkv Error: Set `#1' undefined.}
 \edef\ekv at checkvalid
   {%
@@ -161,10 +160,10 @@
       }%
     \unexpanded{\@gobble}%
   }
-\ekv at expB@unbraceA{\protected\def\ekv at checkvalid#1#2}{\ekv at checkvalid}%
-\ekv at expB@unbraceA{\ekv at expB@unbraceA{\def\ekvifdefined#1#2}}%
+\ekv at exparg{\protected\def\ekv at checkvalid#1#2}{\ekv at checkvalid}%
+\ekv at expargtwice{\def\ekvifdefined#1#2}%
   {\expandafter\ekv at ifdefined\expandafter{\ekv at name{#1}{#2}}}
-\ekv at expB@unbraceA{\ekv at expB@unbraceA{\def\ekvifdefinedNoVal#1#2}}%
+\ekv at expargtwice{\def\ekvifdefinedNoVal#1#2}%
   {\expandafter\ekv at ifdefined\expandafter{\ekv at name{#1}{#2}N}}
 \def\ekvdef#1#2#3#4%
   {%
@@ -176,27 +175,27 @@
       {#1{\expandafter\let\csname#2\endcsname##3#3}}%
     \protected\def\ekvletNoVal##1##2##3%
       {#1{\expandafter\let\csname#2N\endcsname##3#3}}%
-    \ekv at expB@unbraceA{\ekv at expB@unbraceA{\ekv at expB@unbraceA{%
-        \protected\long\def\ekvdefunknown##1##2}}}%
+    \ekv at expargtwice{\protected\long\def\ekvdefunknown##1##2}%
       {%
-        \expandafter\ekv at expB@unbraceA@\expandafter
+        \romannumeral
+        \expandafter\ekv at exparg@\expandafter
           {%
             \expandafter\expandafter\expandafter
             \def\expandafter\csname\ekv at name{##1}{}u\endcsname####1####2{##2}%
             #3%
           }%
-          {\ekv at checkvalid{##1}.}%
+          {\ekv at zero\ekv at checkvalid{##1}.}%
       }%
-    \ekv at expB@unbraceA{\ekv at expB@unbraceA{\ekv at expB@unbraceA{%
-        \protected\long\def\ekvdefunknownNoVal##1##2}}}%
+    \ekv at expargtwice{\protected\long\def\ekvdefunknownNoVal##1##2}%
       {%
-        \expandafter\ekv at expB@unbraceA@\expandafter
+        \romannumeral
+        \expandafter\ekv at exparg@\expandafter
           {%
             \expandafter\expandafter\expandafter
             \def\expandafter\csname\ekv at name{##1}{}uN\endcsname####1{##2}%
             #3%
           }%
-          {\ekv at checkvalid{##1}.}%
+          {\ekv at zero\ekv at checkvalid{##1}.}%
       }%
     \protected\def\ekvletkv##1##2##3##4%
       {%
@@ -237,15 +236,13 @@
       }%
     \unexpanded{\fi}%
   }
-\ekv at expB@unbraceA{\protected\def\ekv at defsetmacro#1#2}{\ekv at defsetmacro}
-\ekv at expB@unbraceA{\ekv at expB@unbraceA{\def\ekvifdefinedset#1}}%
-  {%
-    \expandafter\ekv at ifdefined\expandafter{\ekv at undefined@set{#1}}%
-  }
+\ekv at exparg{\protected\def\ekv at defsetmacro#1#2}{\ekv at defsetmacro}
+\ekv at expargtwice{\def\ekvifdefinedset#1}%
+  {\expandafter\ekv at ifdefined\expandafter{\ekv at undefined@set{#1}}}
 \begingroup
 \def\ekvset#1#2{%
 \endgroup
-\ekv at expB@unbraceA{\long\def\ekvset##1##2}%
+\ekv at exparg{\long\def\ekvset##1##2}%
   {%
     \expandafter\expandafter\expandafter
     \ekv at set\expandafter\csname\ekv at undefined@set{##1}\endcsname
@@ -259,14 +256,8 @@
 \long\def\ekv at endset
     \ekv at stop\ekv at set@other##1\ekv at mark\ekv at stop,\ekv at stop,##2%
   {##2}
-\long\def\ekv at eq@other##1=##2\ekv at mark##3%
-  {%
-    ##3##1\ekv at stop\ekv at mark##2%
-  }
-\long\def\ekv at eq@active##1#2##2\ekv at mark##3%
-  {%
-    ##3##1\ekv at stop\ekv at mark##2%
-  }
+\long\def\ekv at eq@other##1=##2\ekv at mark##3{##3##1\ekv at stop\ekv at mark##2}
+\long\def\ekv at eq@active##1#2##2\ekv at mark##3{##3##1\ekv at stop\ekv at mark##2}
 \long\def\ekv at set@other##1##2,%
   {%
     \ekv at gobble@from at mark@to at stop##2\ekv at endset@other\ekv at stop
@@ -280,7 +271,7 @@
     \ekv at eq@active##1\ekv at nil\ekv at mark\ekv at set@eq at other@active
       #2\ekv at mark\ekv at set@eq at other@b
   }
-\ekv at expB@unbraceA
+\ekv at exparg
   {%
     \long\def\ekv at set@eq at other@b
         ##1\ekv at nil\ekv at mark\ekv at set@eq at other@active\ekv at stop\ekv at mark
@@ -287,7 +278,7 @@
         ##2\ekv at nil=\ekv at mark\ekv at set@eq at active
   }%
   {\ekv at strip{##1}{\expandafter\ekv at set@pair\detokenize}\ekv at mark##2\ekv at nil}
-\ekv at expB@unbraceA
+\ekv at exparg
   {%
     \long\def\ekv at set@eq at other@active
         ##1\ekv at stop##2\ekv at nil#2\ekv at mark
@@ -300,11 +291,9 @@
     \ekv at eq@active##1\ekv at nil\ekv at mark\ekv at set@eq at active@
       #2\ekv at mark\ekv at set@noeq
   }
-\ekv at expB@unbraceA
+\ekv at exparg
   {\long\def\ekv at set@eq at active@##1\ekv at stop##2\ekv at nil#2\ekv at mark\ekv at set@noeq}%
-  {%
-    \ekv at strip{##1}{\expandafter\ekv at set@pair\detokenize}\ekv at mark##2\ekv at nil
-  }
+  {\ekv at strip{##1}{\expandafter\ekv at set@pair\detokenize}\ekv at mark##2\ekv at nil}
 \edef\ekv at set@noeq
   {%
     \unexpanded
@@ -315,21 +304,16 @@
     \unexpanded\expandafter
       {\ekv at strip{##1}{\expandafter\ekv at set@key\detokenize}\ekv at mark}%
   }
-\ekv at expB@unbraceA
+\ekv at exparg
   {%
     \long\def\ekv at set@noeq
         ##1\ekv at nil\ekv at mark\ekv at set@eq at active@\ekv at stop\ekv at mark
   }%
   {\ekv at set@noeq}
-\def\ekv at set@was at blank##1%
-  {%
-    \def\ekv at set@was at blank
-        \ekv at ifempty@A\ekv at ifempty@B
-        \ekv at strip@a\ekv at mark####1\ekv at nil\ekv at mark##1##1\ekv at nil\ekv at stop
-        ####2\ekv at mark
-      {\ekv at set@other}%
-  }
-\ekv at set@was at blank{ }
+\expandafter\def\expandafter\ekv at set@was at blank
+    \expandafter\ekv at ifempty@A\expandafter\ekv at ifempty@B
+    \ekv at strip{\ekv at mark##1}##2\ekv at mark
+  {\ekv at set@other}
 \long\def\ekv at endset@other
     \ekv at stop
     \ekv at eq@other\ekv at mark\ekv at stop\ekv at nil\ekv at mark\ekv at set@eq at other@a
@@ -338,22 +322,13 @@
 \long\def\ekvbreak##1##2\ekv at stop#1##3{##1}
 \long\def\ekvbreakPreSneak ##1##2\ekv at stop#1##3{##1##3}
 \long\def\ekvbreakPostSneak##1##2\ekv at stop#1##3{##3##1}
-\long\def\ekvsneak##1##2\ekv at stop#1##3%
-  {%
-    ##2\ekv at stop#1{##3##1}%
-  }
-\long\def\ekvsneakPre##1##2\ekv at stop#1##3%
-  {%
-    ##2\ekv at stop#1{##1##3}%
-  }
-\long\def\ekvparse##1##2##3%
-  {%
-    \ekv at parse##1##2\ekv at mark##3#1\ekv at stop#1%
-  }
+\long\def\ekvsneak##1##2\ekv at stop#1##3{##2\ekv at stop#1{##3##1}}
+\long\def\ekvsneakPre##1##2\ekv at stop#1##3{##2\ekv at stop#1{##1##3}}
+\long\def\ekvparse##1##2##3{\ekv at parse{##1}{##2}\ekv at mark##3#1\ekv at stop#1}
 \long\def\ekv at parse##1##2##3#1%
   {%
     \ekv at gobble@from at mark@to at stop##3\ekv at endparse\ekv at stop
-    \ekv at parse@other##1##2##3,\ekv at stop,%
+    \ekv at parse@other{##1}{##2}##3,\ekv at stop,%
   }
 \long\def\ekv at endparse
     \ekv at stop\ekv at parse@other##1\ekv at mark\ekv at stop,\ekv at stop,%
@@ -363,7 +338,7 @@
     \ekv at gobble@from at mark@to at stop##3\ekv at endparse@other\ekv at stop
     \ekv at eq@other##3\ekv at nil\ekv at mark\ekv at parse@eq at other@a
       =\ekv at mark\ekv at parse@eq at active
-    ##1##2%
+    {##1}{##2}%
     \ekv at mark
   }
 \long\def\ekv at parse@eq at other@a##1\ekv at stop
@@ -371,7 +346,7 @@
     \ekv at eq@active##1\ekv at nil\ekv at mark\ekv at parse@eq at other@active
       #2\ekv at mark\ekv at parse@eq at other@b
   }
-\ekv at expB@unbraceA
+\ekv at exparg
   {%
     \long\def\ekv at parse@eq at other@b
         ##1\ekv at nil\ekv at mark\ekv at parse@eq at other@active\ekv at stop\ekv at mark
@@ -378,7 +353,7 @@
         ##2\ekv at nil=\ekv at mark\ekv at parse@eq at active
   }%
   {\ekv at strip{##1}\ekv at parse@pair##2\ekv at nil}
-\ekv at expB@unbraceA
+\ekv at exparg
   {%
     \long\def\ekv at parse@eq at other@active
         ##1\ekv at stop##2\ekv at nil#2\ekv at mark
@@ -391,11 +366,9 @@
     \ekv at eq@active##1\ekv at nil\ekv at mark\ekv at parse@eq at active@
       #2\ekv at mark\ekv at parse@noeq
   }
-\ekv at expB@unbraceA
+\ekv at exparg
   {\long\def\ekv at parse@eq at active@##1\ekv at stop##2#2\ekv at mark\ekv at parse@noeq}%
-  {%
-    \ekv at strip{##1}\ekv at parse@pair##2%
-  }
+  {\ekv at strip{##1}\ekv at parse@pair##2}
 \edef\ekv at parse@noeq
   {%
     \unexpanded
@@ -405,39 +378,32 @@
       }%
       \unexpanded\expandafter{\ekv at strip{##1}\ekv at parse@key}%
   }
-\ekv at expB@unbraceA
+\ekv at exparg
   {%
     \long\def\ekv at parse@noeq
         ##1\ekv at nil\ekv at mark\ekv at parse@eq at active@\ekv at stop\ekv at mark
   }%
   {\ekv at parse@noeq}
-\def\ekv at parse@was at blank##1%
-  {%
-    \def\ekv at parse@was at blank
-        \ekv at ifempty@A\ekv at ifempty@B
-        \ekv at strip@a\ekv at mark####1\ekv at nil\ekv at mark##1##1\ekv at nil\ekv at stop
-        \ekv at parse@key
-      {\ekv at parse@other}%
-  }
-\ekv at parse@was at blank{ }
+\expandafter\def\expandafter\ekv at parse@was at blank
+    \expandafter\ekv at ifempty@A\expandafter\ekv at ifempty@B
+    \ekv at strip{\ekv at mark##1}\ekv at parse@key
+  {\ekv at parse@other}
 \long\def\ekv at endparse@other
     \ekv at stop
     \ekv at eq@other\ekv at mark\ekv at stop\ekv at nil\ekv at mark\ekv at parse@eq at other@a
     =\ekv at mark\ekv at parse@eq at active
   {\ekv at parse}
-\ekv at expB@unbraceA{\long\def\ekv at parse@pair##1##2\ekv at nil}%
-  {%
-    \ekv at strip{##2}\ekv at parse@pair@{##1}%
-  }
+\ekv at exparg{\long\def\ekv at parse@pair##1##2\ekv at nil}%
+  {\ekv at strip{##2}\ekv at parse@pair@{##1}}
 \long\def\ekv at parse@pair@##1##2##3##4%
   {%
     \unexpanded{##4{##2}{##1}}%
-    \ekv at parse@other##3##4%
+    \ekv at parse@other{##3}{##4}%
   }
-\long\def\ekv at parse@key##1##2##3%
+\long\def\ekv at parse@key##1##2%
   {%
     \unexpanded{##2{##1}}%
-    \ekv at parse@other##2##3%
+    \ekv at parse@other{##2}%
   }
 }
 \catcode`\,=13
@@ -448,17 +414,13 @@
     \unexpanded{\ekvsneak{#2}}%
     \unexpanded\expandafter{\ekvset{#1}{#3}}%
   }
-\ekv at expB@unbraceA{\ekv at expB@unbraceA{\long\def\ekvsetSneaked#1#2#3}}%
-  {\ekvsetSneaked}
-\ekv at expB@unbraceA{\def\ekvchangeset#1}%
+\ekv at expargtwice{\long\def\ekvsetSneaked#1#2#3}{\ekvsetSneaked}
+\ekv at exparg{\def\ekvchangeset#1}%
   {%
     \expandafter\expandafter\expandafter
     \ekv at changeset\expandafter\csname\ekv at undefined@set{#1}\endcsname\ekv at empty
   }
-\long\def\ekv at changeset#1#2\ekv at set@other#3%
-  {%
-    #2\ekv at set@other#1%
-  }
+\long\def\ekv at changeset#1#2\ekv at set@other#3{#2\ekv at set@other#1}
 \ekv at if@lastnamedcs
   {%
     \long\def\ekv at set@pair#1\ekv at mark#2\ekv at nil#3%
@@ -511,7 +473,7 @@
     \fi
     \ekv at set@pair at d#1%
   }
-\ekv at expB@unbraceA{\long\def\ekv at set@pair at d#1#2#3}{\ekv at strip{#2}#1}
+\ekv at exparg{\long\def\ekv at set@pair at d#1#2#3}{\ekv at strip{#2}#1}
 \long\def\ekv at set@pair at e\fi\ekv at set@pair at d#1#2#3{\fi#3}
 \ekv at if@lastnamedcs
   {%
@@ -560,22 +522,22 @@
     \fi
     \@firstoftwo#1%
   }
-\ekv at expB@unbraceA{\ekv at expB@unbraceA{\ekv at expB@unbraceA{\ekv at expB@unbraceA{%
-\protected\def\ekvsetdef#1#2}}}}%
+\ekv at expargtwice{\protected\def\ekvsetdef#1#2}%
   {%
-    \ekv at expB@unbraceA{\ekv at expB@unbraceA{\long\def#1##1}}%
+    \romannumeral
+    \ekv at exparg{\ekv at zero\ekv at exparg{\long\def#1##1}}%
       {\ekvset{#2}{##1}}%
   }
-\ekv at expB@unbraceA{\ekv at expB@unbraceA{\ekv at expB@unbraceA{\ekv at expB@unbraceA{%
-\protected\def\ekvsetSneakeddef#1#2}}}}%
+\ekv at expargtwice{\protected\def\ekvsetSneakeddef#1#2}%
   {%
-    \ekv at expB@unbraceA{\ekv at expB@unbraceA{\long\def#1##1##2}}%
+    \romannumeral
+    \ekv at exparg{\ekv at zero\ekv at exparg{\long\def#1##1##2}}%
       {\ekvsetSneaked{#2}{##1}{##2}}%
   }
-\ekv at expB@unbraceA{\ekv at expB@unbraceA{\ekv at expB@unbraceA{\ekv at expB@unbraceA{%
-\protected\def\ekvsetdefSneaked#1#2#3}}}}%
+\ekv at expargtwice{\protected\def\ekvsetdefSneaked#1#2#3}%
   {%
-    \ekv at expB@unbraceA{\ekv at expB@unbraceA{\long\def#1##1}}%
+    \romannumeral
+    \ekv at exparg{\ekv at zero\ekv at exparg{\long\def#1##1}}%
       {\ekvsetSneaked{#2}{#3}{##1}}%
   }
 \begingroup
@@ -593,12 +555,9 @@
 \def\ekv at err@{\expandafter\ekv at gobbleto@stop}
 \long\def\ekv at err@common #1#2{\expandafter\ekv at err@common@\string#2{#1}}
 \long\def\ekv at err@common@#1`#2' #3.#4#5{\ekv at err{#4 (`#5', set `#2')}}
-\ekv at expB@unbraceA{\long\def\ekv at err@unknown#1}%
-  {\ekv at err@common{unknown key}{#1}}
-\ekv at expB@unbraceA{\long\def\ekv at err@noarg  #1}%
-  {\ekv at err@common{value forbidden}{#1}}
-\ekv at expB@unbraceA{\long\def\ekv at err@reqval #1}%
-  {\ekv at err@common{value required}{#1}}
+\ekv at exparg{\long\def\ekv at err@unknown#1}{\ekv at err@common{unknown key}{#1}}
+\ekv at exparg{\long\def\ekv at err@noarg  #1}{\ekv at err@common{value forbidden}{#1}}
+\ekv at exparg{\long\def\ekv at err@reqval #1}{\ekv at err@common{value required}{#1}}
 \catcode`\@=\ekv at tmp
 %% 
 %%



More information about the tex-live-commits mailing list.