texlive[59340] Master/texmf-dist: expkv-cs (25may21)

commits+karl at tug.org commits+karl at tug.org
Tue May 25 22:46:32 CEST 2021


Revision: 59340
          http://tug.org/svn/texlive?view=revision&revision=59340
Author:   karl
Date:     2021-05-25 22:46:32 +0200 (Tue, 25 May 2021)
Log Message:
-----------
expkv-cs (25may21)

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

Modified: trunk/Master/texmf-dist/doc/latex/expkv-cs/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/expkv-cs/README.md	2021-05-25 20:46:10 UTC (rev 59339)
+++ trunk/Master/texmf-dist/doc/latex/expkv-cs/README.md	2021-05-25 20:46:32 UTC (rev 59340)
@@ -1,7 +1,7 @@
 -------------------------------------------------------------------------------
 # expkv-cs -- define expandable key=val macros using expkv
 
-Version 2021-04-12 v0.8
+Version 2021-05-24 v0.9
 
 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-cs/expkv-cs.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/source/latex/expkv-cs/expkv-cs.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/expkv-cs/expkv-cs.dtx	2021-05-25 20:46:10 UTC (rev 59339)
+++ trunk/Master/texmf-dist/source/latex/expkv-cs/expkv-cs.dtx	2021-05-25 20:46:32 UTC (rev 59340)
@@ -64,6 +64,19 @@
 \RequirePackage[oldstylenums,nott]{kpfonts}
 \input{glyphtounicode}
 \pdfgentounicode=1
+\RequirePackage{tcolorbox}
+\newtcolorbox{exresult}[2][]
+  {colback=expkvgrey!10!white,colframe=expkvgrey,fontupper=\small,width={#2},#1}
+\newtcbox\exres[1][]
+  {
+     colback=expkvgrey!10!white
+    ,colframe=expkvgrey
+    ,size=small
+    ,nobeforeafter
+    ,tcbox raise base
+    ,fontupper=\small
+    ,#1
+  }
 \RequirePackage{listings}
 \RequirePackage{booktabs}
 \RequirePackage{array}
@@ -73,26 +86,127 @@
 \RequirePackage{caption}
 \RequirePackage{microtype}
 \RequirePackage{accsupp}
+\lstdefinelanguage{expkvd}[primitive]{TeX}
+  {
+    ,moretexcs=[4]^^A e-TeX
+      {
+        expanded,
+        numexpr,
+        protected,
+      }
+    ,moretexcs=[5]^^A plain/LaTeX
+      {
+        approx,
+        begin,
+        empty,
+        item,
+        LaTeX,
+        makeatletter,makeatother,multicolumn,
+        newcommand,newdimen,
+        RequirePackage,
+        rule,
+        TeX,
+        textit,texttt,
+        usepackage,
+      }
+    ,moretexcs=[6]^^A used packages
+      {
+        ^^A xfp
+        fpeval,
+        ^^A keyval
+        setkeys,
+        ^^A yax
+        defactiveparameter,storevalue,setparameterlist
+      }
+    ,moretexcs=[2]^^A expkv-cs macros
+      {
+        ekvcSplit,ekvcSplitAndForward,ekvcSplitAndUse,
+        ekvcHash,ekvcHashAndForward,ekvcHashAndUse,
+        ekvcValue,ekvcValueFast,ekvcValueSplit,ekvcValueSplitFast,
+        ekvcSecondaryKeys,
+        ekvcFlagNew,
+        ekvcFlagHeight,
+        ekvcFlagRaise,
+        ekvcFlagSetTrue,ekvcFlagSetFalse,
+        ekvcFlagIf,ekvcFlagIfRaised,
+        ekvcFlagReset,
+        ekvcFlagGetHeight,ekvcFlagGetHeights
+      }
+    ,moretexcs=[3]^^A expkv-pkg macros
+      {
+        ^^A expkv
+        ekvdef,ekvdefNoVal,^^A
+        ekvlet,ekvletNoVal,ekvletkv,ekvletkvNoVal,^^A
+        ekvdefunknown,ekvdefunknownNoVal,^^A
+        ekvredirectunknown,ekvredirectunknownNoVal,^^A
+        ekvset,ekvsetSneaked,^^A
+        ekvsetdef,ekvsetSneakeddef,ekvsetdefSneaked,^^A
+        ekvparse,^^A
+        ekvVersion,ekvDate,^^A
+        ekvifdefined,ekvifdefinedNoVal,ekvifdefinedset,^^A
+        ekvbreak,ekvbreakPreSneak,ekvbreakPostSneak,^^A
+        ekvsneak,ekvsneakPre,^^A
+        ekvchangeset,^^A
+        ekvoptarg,ekvoptargTF,^^A
+        ekverr,
+        ^^A expkv-def
+        ekvdefinekeys
+      }
+  }
+\colorlet{codeparam}{cyan!65!black}
+\def\mylstwd{.55em}
 \lstset
   {
+    ,language=expkvd
     ,flexiblecolumns=false
-    ,basewidth=.53em
+    ,basewidth=\mylstwd
     ,gobble=2
     ,basicstyle=\fontfamily{jkp}\itshape
-    ,morekeywords=^^A
-      {^^A
-        \ekvcSplit,\ekvcSplitAndForward,\ekvcSplitAndUse
-        \ekvcHash,\ekvcHashAndForward,\ekvcHashAndUse
-        \ekvcValue,\ekvcValueFast,
-        \ekvcSecondaryKeys
-      }
-    ,morecomment=[l]\%
+    ,texcsstyle=*[1]{\bfseries\color{expkvgrey}} ^^A primitives
+    ,texcsstyle=*[2]{\bfseries\color{expkvred}}  ^^A expkv
+    ,texcsstyle=*[3]{\color{expkvred}}           ^^A expkv-pkg
+    ,texcsstyle=*[4]{\bfseries\color{expkvgrey}} ^^A e-TeX
+    ,texcsstyle=*[5]{\bfseries\color{expkvgrey}} ^^A plain/LaTeX macros
+    ,texcsstyle=*[6]{}                           ^^A macros of other packages
     ,commentstyle=\color[gray]{0.4}
-    ,literate={\{}{{\CodeSymbol\{}}{1}
-              {\}}{{\CodeSymbol\}}}{1}
+    ,literate=
+              {\{} {{\CodeUpBf\{}}{1}
+              {\}} {{\CodeUpBf\}}}{1}
+              {$}  {{\CodeUpBf\$}}{1}
+              {[}  {{\CodeUp[}}{1}
+              {]}  {{\CodeUp]}}{1}
+              {(}  {{\CodeUp(}}{1}
+              {)}  {{\CodeUp)}}{1}
+              {*}  {{$*$}}{1}
+              {1}  {{\CodeUp{1}}}{1}
+              {2}  {{\CodeUp{2}}}{1}
+              {3}  {{\CodeUp{3}}}{1}
+              {4}  {{\CodeUp{4}}}{1}
+              {5}  {{\CodeUp{5}}}{1}
+              {6}  {{\CodeUp{6}}}{1}
+              {7}  {{\CodeUp{7}}}{1}
+              {8}  {{\CodeUp{8}}}{1}
+              {9}  {{\CodeUp{9}}}{1}
+              {0}  {{\CodeUp{0}}}{1}
+              {##} {{\CodeColored{codeparam}{1}{\#}}}{1}
+              {##1}{{\CodeColored{codeparam}{2}{\#1}}}{2}
+              {##2}{{\CodeColored{codeparam}{2}{\#2}}}{2}
+              {##3}{{\CodeColored{codeparam}{2}{\#3}}}{2}
+              {##4}{{\CodeColored{codeparam}{2}{\#4}}}{2}
+              {##5}{{\CodeColored{codeparam}{2}{\#5}}}{2}
+              {##6}{{\CodeColored{codeparam}{2}{\#6}}}{2}
+              {##7}{{\CodeColored{codeparam}{2}{\#7}}}{2}
+              {##8}{{\CodeColored{codeparam}{2}{\#8}}}{2}
+              {##9}{{\CodeColored{codeparam}{2}{\#9}}}{2}
+              {<key>}{{$\langle$}key{$\rangle$}}{5}
+              {<set>}{{$\langle$}set{$\rangle$}}{5}
+              {<set1>}{{$\langle$}set1{$\rangle$}}{6}
+              {<set2>}{{$\langle$}set2{$\rangle$}}{6}
     ^^A,literate=*{<key>}{\key}{4}{<set>}{\set}{4}
   }
-\newcommand*\CodeSymbol[1]{\kern-1pt\textbf{#1}\kern1pt}
+\newcommand*\CodeColored[3]{\textcolor{#1}{\makebox[\dimexpr\mylstwd*#2]{#3}}}
+\newcommand*\CodeUpBf[1]{\makebox[\mylstwd]{\textup{\textbf{#1}}}}
+\newcommand*\CodeUp[1]{\makebox[\mylstwd]{\textup{#1}}}
 \RequirePackage{randtext}
 \let\metaORIG\meta
 \protected\def\meta #1{\texttt{\metaORIG{#1}}}
@@ -705,7 +819,7 @@
 %     alias pos = possessive,
 %     nmeta me =
 %       {
-%         name=Jonathan P. Spratte,
+%         name=Jonathan,
 %         age=a young,
 %         nationality=Germany,
 %         hobby=\TeX\ coding,
@@ -738,15 +852,54 @@
 % As one might see, the |lady| key could actually have been an |nmeta| key as
 % well, as all that is done with the argument is using it as a \kv\ list.
 %
-% Using \pkg{xparse} and forwarding arguments one can easily define \kv\ macros
-% with actual optional and mandatory arguments as well. A small nonsense example
-% (which should perhaps use |\ekvcSplitAndForward| instead of
-% |\ekvcHashAndForward| since it only uses four keys and one other argument --
-% and isn't expandable since it uses a \env{tabular} environment):
+% The result of all the first two usages would be:
+% \begin{exresult}{\linewidth}
+%   \ekvcSplit\character
+%     {
+%       name=John Doe,
+%       age=any,
+%       nationality=the Universe,
+%       hobby=to exist,
+%       type=Mister,
+%       pronoun=He,
+%       possessive=his,
+%     }
+%     {#1 is a #5 from #3. #6 is of #2 age and #7 hobby is #4.\par}
+%   \ekvcSecondaryKeys\character
+%     {
+%       alias pro = pronoun,
+%       alias pos = possessive,
+%       nmeta me =
+%         {
+%           name=Jonathan,
+%           age=a young,
+%           nationality=Germany,
+%           hobby=\TeX\ coding,
+%         },
+%       meta lady =
+%         {type=Lady, pronoun=She, possessive=her, name=Jane Doe, #1},
+%       nmeta paulo =
+%         {
+%           name=Paulo,
+%           type=duck,
+%           age=a young,
+%           nationality=Brazil,
+%           hobby=to quack,
+%         }
+%     }
+%   \character{}
+%   \character{me}
+% \end{exresult}
+%
+% Using \pkg{xparse} or \expkv's \cs{ekvoptarg} or \cs{ekvoptargTF} and
+% forwarding arguments one can easily define \kv\ macros with actual optional
+% and mandatory arguments as well. A small nonsense example (which should
+% perhaps use |\ekvcSplitAndForward| instead of |\ekvcHashAndForward| since it
+% only uses four keys and one other argument -- and isn't expandable since it
+% uses a \env{tabular} environment):
 % \begin{lstlisting}
-% \usepackage{xparse}
 % \makeatletter
-% \NewExpandableDocumentCommand\nonsense{O{} m}{\nonsense at a{#1}{#2}}
+% \newcommand*\nonsense{\ekvoptarg\nonsense at a{}}
 % \ekvcHashAndForward\nonsense at a\nonsense at b
 %   {
 %     keyA = A,
@@ -762,11 +915,11 @@
 %           & C & \ekvcValue{keyC}{#1} \\
 %           & D & \ekvcValue{keyD}{#1} \\
 %       \multicolumn{2}{l}{mandatory} & #2 \\
-%     \end{tabular}\par
+%     \end{tabular}%
 %   }
 % \makeatother
 % \end{lstlisting}
-% And then we would be able to do some nonsense:
+% And then we would be able to do some nonsense
 % \begin{lstlisting}
 % \nonsense{}
 % \nonsense[keyA=hihi]{haha}
@@ -773,6 +926,33 @@
 % \nonsense[keyA=hihi, keyB=A]{hehe}
 % \nonsense[keyC=huhu, keyA=hihi, keyB=A]{haha}
 % \end{lstlisting}
+% resulting in
+% \begin{exresult}{\linewidth}
+%   \makeatletter
+%   \newcommand*\nonsense{\ekvoptarg\nonsense at a{}}
+%   \ekvcHashAndForward\nonsense at a\nonsense at b
+%     {
+%       keyA = A,
+%       keyB = B,
+%       keyC = c,
+%       keyD = d,
+%     }
+%   \newcommand*\nonsense at b[2]
+%     {%
+%       \begin{tabular}{lll}
+%         key & A & \ekvcValue{keyA}{#1} \\
+%             & B & \ekvcValue{keyB}{#1} \\
+%             & C & \ekvcValue{keyC}{#1} \\
+%             & D & \ekvcValue{keyD}{#1} \\
+%         \multicolumn{2}{l}{mandatory} & #2 \\
+%       \end{tabular}%
+%     }
+%   \makeatother
+%   \nonsense{}
+%   \nonsense[keyA=hihi]{haha}
+%   \nonsense[keyA=hihi, keyB=A]{hehe}
+%   \nonsense[keyC=huhu, keyA=hihi, keyB=A]{haha}
+% \end{exresult}
 %
 %
 % \subsection{Speed Considerations}\label{sec:speed}
@@ -945,8 +1125,8 @@
 % \begin{macro}{\ekvcVersion,\ekvcDate}
 % We're on our first input, so lets store the version and date in a macro.
 %    \begin{macrocode}
-\def\ekvcVersion{0.8}
-\def\ekvcDate{2021-04-12}
+\def\ekvcVersion{0.9}
+\def\ekvcDate{2021-05-24}
 %    \end{macrocode}
 % \end{macro}
 %
@@ -993,11 +1173,29 @@
 %   Some macros will have to be defined long. These two will be let to |\long|
 %   when this should be the case.
 %    \begin{macrocode}
-\def\ekvc at long{}
-\def\ekvc at any@long{}
+\let\ekvc at long\ekv at empty
+\let\ekvc at any@long\ekv at empty
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}[internal]{\ekvc at ifdefined}
+%   We want to test whether a macro is already defined. This test checks for a
+%   defined macro that isn't |\relax|.
+%    \begin{macrocode}
+\long\def\ekvc at ifdefined#1%
+  {%
+    \ifdefined#1%
+      \ifx\relax#1%
+        \ekv at fi@gobble
+      \fi
+      \@firstofone
+      \ekv at fi@firstoftwo
+    \fi
+    \@secondoftwo
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}[internal]
 %   {
 %     \ekvc at ekvset@pre at expander,
@@ -1009,7 +1207,8 @@
 %   a little magic trick to get the macro parameter |#1| for the macro
 %   definition this is used in, even though we're calling |\unexpanded|. We do
 %   that by splitting the expanded |\ekvset| at some marks and place |##1| in
-%   between.
+%   between. At this spot we also add |\ekv at alignsafe| and |\ekv at endalignsafe|
+%   to ensure that macros created with \expkvc\ are alignment safe.
 %    \begin{macrocode}
 \def\ekvc at ekvset@pre at expander#1%
   {%
@@ -1021,7 +1220,9 @@
   }
 \def\ekvc at ekvset@pre at expander@b#1\ekvc at stop#2\ekvc at stop
   {%
+    \unexpanded\expandafter{\ekv at alignsafe}%
     \unexpanded{#1}##1\unexpanded{#2}%
+    \unexpanded\expandafter{\ekv at endalignsafe}%
   }
 %    \end{macrocode}
 % \end{macro}
@@ -1035,7 +1236,7 @@
 \protected\long\def\ekvcSplitAndUse#1#2%
   {%
     \let\ekvc at helpers@needed\@firstoftwo
-    \ekv at ifdefined{\expandafter\@gobble\string#1}%
+    \ekvc at ifdefined#1%
       {\ekvc at err@already at defined#1}%
       {\ekvcSplitAndUse@#1{}{#2}}%
   }
@@ -1083,7 +1284,7 @@
 \protected\long\def\ekvcSplitAndForward#1#2#3%
   {%
     \let\ekvc at helpers@needed\@firstoftwo
-    \ekv at ifdefined{\expandafter\@gobble\string#1}%
+    \ekvc at ifdefined#1%
       {\ekvc at err@already at defined#1}%
       {\ekvcSplitAndUse@#1{{#2}}{#3}}%
   }
@@ -1098,7 +1299,7 @@
 \protected\long\def\ekvcSplit#1#2#3%
   {%
     \let\ekvc at helpers@needed\@secondoftwo
-    \ekv at ifdefined{\expandafter\@gobble\string#1}%
+    \ekvc at ifdefined#1%
       {\ekvc at err@already at defined#1}%
       {%
         \expandafter
@@ -1154,8 +1355,8 @@
 \protected\long\def\ekvc at SetupSplitKeys
   {%
     \ekvc at keycount=0
-    \def\ekvc at any@long{}%
-    \def\ekvc at initials{}%
+    \let\ekvc at any@long\ekv at empty
+    \let\ekvc at initials\ekv at empty
     \ekvparse\ekvc at err@value at required\ekvc at SetupSplitKeys@a
   }
 %    \end{macrocode}
@@ -1165,7 +1366,7 @@
 \protected\def\ekvc at SetupSplitKeys@a#1%
   {%
     \advance\ekvc at keycount1
-    \def\ekvc at long{}%
+    \let\ekvc at long\ekv at empty
     \ekvc at ifspace{#1}%
       {\ekvc at SetupSplitKeys@b#1\ekvc at stop}%
       {\ekvc at SetupSplitKeys@c{#1}}%
@@ -1355,7 +1556,7 @@
 \protected\long\def\ekvcHashAndUse#1#2%
   {%
     \let\ekvc at helpers@needed\@firstoftwo
-    \ekv at ifdefined{\expandafter\@gobble\string#1}%
+    \ekvc at ifdefined#1%
       {\ekvc at err@already at defined#1}%
       {\ekvcHashAndUse@#1{}{#2}}%
   }
@@ -1398,7 +1599,7 @@
 \protected\long\def\ekvcHashAndForward#1#2#3%
   {%
     \let\ekvc at helpers@needed\@firstoftwo
-    \ekv at ifdefined{\expandafter\@gobble\string#1}%
+    \ekvc at ifdefined#1%
       {\ekvc at err@already at defined#1}%
       {\ekvcHashAndUse@#1{{#2}}{#3}}%
   }
@@ -1413,7 +1614,7 @@
 \protected\long\def\ekvcHash#1#2#3%
   {%
     \let\ekvc at helpers@needed\@secondoftwo
-    \ekv at ifdefined{\expandafter\@gobble\string#1}%
+    \ekvc at ifdefined#1%
       {\ekvc at err@already at defined#1}%
       {%
         \expandafter
@@ -1441,13 +1642,13 @@
 %    \begin{macrocode}
 \protected\long\def\ekvc at SetupHashKeys#1%
   {%
-    \def\ekvc at any@long{}%
-    \def\ekvc at initials{}%
+    \let\ekvc at any@long\ekv at empty
+    \let\ekvc at initials\ekv at empty
     \ekvparse\ekvc at err@value at required\ekvc at SetupHashKeys@a{#1}%
   }
 \protected\def\ekvc at SetupHashKeys@a#1%
   {%
-    \def\ekvc at long{}%
+    \let\ekvc at long\ekv at empty
     \ekvc at ifspace{#1}%
       {\ekvc at SetupHashKeys@b#1\ekvc at stop}%
       {\ekvc at SetupHashKeys@c{#1}}%
@@ -1687,7 +1888,7 @@
   }
 \protected\def\ekvcSecondaryKeys at a#1%
   {%
-    \def\ekvc at long{}%
+    \let\ekvc at long\ekv at empty
     \ekvc at ifspace{#1}%
       {\ekvcSecondaryKeys at b#1\ekvc at stop}%
       {\ekvc at err@missing at type{#1}\@gobble}%
@@ -2137,15 +2338,10 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[internal]{\ekvc at err,\ekvc at err@}
+% \begin{macro}[internal]{\ekvc at err}
 %   We need a way to throw error messages expandably in some contexts.
 %    \begin{macrocode}
-\def\ekvc at err#1%
-  {%
-    \long\def\ekvc at err##1{\expandafter\ekv at err@\@firstofone{#1##1.}\ekv at stop}%
-  }
-\begingroup\expandafter\endgroup
-\expandafter\ekvc at err\csname ! expkv-cs Error:\endcsname
+\ekv at exparg{\long\def\ekvc at err#1}{\ekverr{expkv-cs}{#1}}
 %    \end{macrocode}
 % \end{macro}
 %

Modified: trunk/Master/texmf-dist/tex/generic/expkv-cs/expkv-cs.tex
===================================================================
--- trunk/Master/texmf-dist/tex/generic/expkv-cs/expkv-cs.tex	2021-05-25 20:46:10 UTC (rev 59339)
+++ trunk/Master/texmf-dist/tex/generic/expkv-cs/expkv-cs.tex	2021-05-25 20:46:32 UTC (rev 59340)
@@ -35,14 +35,25 @@
 \else
   \expandafter\endinput
 \fi
-\def\ekvcVersion{0.8}
-\def\ekvcDate{2021-04-12}
+\def\ekvcVersion{0.9}
+\def\ekvcDate{2021-05-24}
 \csname ekvc at tmp\endcsname
 \expandafter\chardef\csname ekvc at tmp\endcsname=\catcode`\@
 \catcode`\@=11
 \newcount\ekvc at keycount
-\def\ekvc at long{}
-\def\ekvc at any@long{}
+\let\ekvc at long\ekv at empty
+\let\ekvc at any@long\ekv at empty
+\long\def\ekvc at ifdefined#1%
+  {%
+    \ifdefined#1%
+      \ifx\relax#1%
+        \ekv at fi@gobble
+      \fi
+      \@firstofone
+      \ekv at fi@firstoftwo
+    \fi
+    \@secondoftwo
+  }
 \def\ekvc at ekvset@pre at expander#1%
   {%
     \expandafter\ekvc at ekvset@pre at expander@a\ekvset{#1}\ekvc at stop\ekvc at stop
@@ -53,12 +64,14 @@
   }
 \def\ekvc at ekvset@pre at expander@b#1\ekvc at stop#2\ekvc at stop
   {%
+    \unexpanded\expandafter{\ekv at alignsafe}%
     \unexpanded{#1}##1\unexpanded{#2}%
+    \unexpanded\expandafter{\ekv at endalignsafe}%
   }
 \protected\long\def\ekvcSplitAndUse#1#2%
   {%
     \let\ekvc at helpers@needed\@firstoftwo
-    \ekv at ifdefined{\expandafter\@gobble\string#1}%
+    \ekvc at ifdefined#1%
       {\ekvc at err@already at defined#1}%
       {\ekvcSplitAndUse@#1{}{#2}}%
   }
@@ -88,7 +101,7 @@
 \protected\long\def\ekvcSplitAndForward#1#2#3%
   {%
     \let\ekvc at helpers@needed\@firstoftwo
-    \ekv at ifdefined{\expandafter\@gobble\string#1}%
+    \ekvc at ifdefined#1%
       {\ekvc at err@already at defined#1}%
       {\ekvcSplitAndUse@#1{{#2}}{#3}}%
   }
@@ -95,7 +108,7 @@
 \protected\long\def\ekvcSplit#1#2#3%
   {%
     \let\ekvc at helpers@needed\@secondoftwo
-    \ekv at ifdefined{\expandafter\@gobble\string#1}%
+    \ekvc at ifdefined#1%
       {\ekvc at err@already at defined#1}%
       {%
         \expandafter
@@ -135,14 +148,14 @@
 \protected\long\def\ekvc at SetupSplitKeys
   {%
     \ekvc at keycount=0
-    \def\ekvc at any@long{}%
-    \def\ekvc at initials{}%
+    \let\ekvc at any@long\ekv at empty
+    \let\ekvc at initials\ekv at empty
     \ekvparse\ekvc at err@value at required\ekvc at SetupSplitKeys@a
   }
 \protected\def\ekvc at SetupSplitKeys@a#1%
   {%
     \advance\ekvc at keycount1
-    \def\ekvc at long{}%
+    \let\ekvc at long\ekv at empty
     \ekvc at ifspace{#1}%
       {\ekvc at SetupSplitKeys@b#1\ekvc at stop}%
       {\ekvc at SetupSplitKeys@c{#1}}%
@@ -276,7 +289,7 @@
 \protected\long\def\ekvcHashAndUse#1#2%
   {%
     \let\ekvc at helpers@needed\@firstoftwo
-    \ekv at ifdefined{\expandafter\@gobble\string#1}%
+    \ekvc at ifdefined#1%
       {\ekvc at err@already at defined#1}%
       {\ekvcHashAndUse@#1{}{#2}}%
   }
@@ -305,7 +318,7 @@
 \protected\long\def\ekvcHashAndForward#1#2#3%
   {%
     \let\ekvc at helpers@needed\@firstoftwo
-    \ekv at ifdefined{\expandafter\@gobble\string#1}%
+    \ekvc at ifdefined#1%
       {\ekvc at err@already at defined#1}%
       {\ekvcHashAndUse@#1{{#2}}{#3}}%
   }
@@ -312,7 +325,7 @@
 \protected\long\def\ekvcHash#1#2#3%
   {%
     \let\ekvc at helpers@needed\@secondoftwo
-    \ekv at ifdefined{\expandafter\@gobble\string#1}%
+    \ekvc at ifdefined#1%
       {\ekvc at err@already at defined#1}%
       {%
         \expandafter
@@ -325,13 +338,13 @@
 \long\def\ekvc at hash@pack at argument#1\ekvc at stop#2{#2{#1}}
 \protected\long\def\ekvc at SetupHashKeys#1%
   {%
-    \def\ekvc at any@long{}%
-    \def\ekvc at initials{}%
+    \let\ekvc at any@long\ekv at empty
+    \let\ekvc at initials\ekv at empty
     \ekvparse\ekvc at err@value at required\ekvc at SetupHashKeys@a{#1}%
   }
 \protected\def\ekvc at SetupHashKeys@a#1%
   {%
-    \def\ekvc at long{}%
+    \let\ekvc at long\ekv at empty
     \ekvc at ifspace{#1}%
       {\ekvc at SetupHashKeys@b#1\ekvc at stop}%
       {\ekvc at SetupHashKeys@c{#1}}%
@@ -489,7 +502,7 @@
   }
 \protected\def\ekvcSecondaryKeys at a#1%
   {%
-    \def\ekvc at long{}%
+    \let\ekvc at long\ekv at empty
     \ekvc at ifspace{#1}%
       {\ekvcSecondaryKeys at b#1\ekvc at stop}%
       {\ekvc at err@missing at type{#1}\@gobble}%
@@ -749,12 +762,7 @@
     \errmessage
       {expkv-cs Error: Unknown key `\unexpanded{#1}' for macro `\ekvc at set'}%
   }
-\def\ekvc at err#1%
-  {%
-    \long\def\ekvc at err##1{\expandafter\ekv at err@\@firstofone{#1##1.}\ekv at stop}%
-  }
-\begingroup\expandafter\endgroup
-\expandafter\ekvc at err\csname ! expkv-cs Error:\endcsname
+\ekv at exparg{\long\def\ekvc at err#1}{\ekverr{expkv-cs}{#1}}
 \long\def\ekvc at err@unknown at hash#1{\ekvc at err{unknown hash `#1'}}
 \long\def\ekvc at err@missing at hash#1{\ekvc at err{hash `#1' not found}}
 \long\def\ekvc at err@empty at hash{\ekvc at err{empty hash}}



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