summaryrefslogtreecommitdiff
path: root/macros/generic/expkv-cs/expkv-cs.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/generic/expkv-cs/expkv-cs.dtx')
-rw-r--r--macros/generic/expkv-cs/expkv-cs.dtx137
1 files changed, 99 insertions, 38 deletions
diff --git a/macros/generic/expkv-cs/expkv-cs.dtx b/macros/generic/expkv-cs/expkv-cs.dtx
index fe782e6d94..c450ae626d 100644
--- a/macros/generic/expkv-cs/expkv-cs.dtx
+++ b/macros/generic/expkv-cs/expkv-cs.dtx
@@ -309,15 +309,35 @@ and the derived files expkv-cs.pdf
%
% \begin{function}{\ekvcSplitAndForward}
% \begin{syntax}
-% \cs{ekvcSplit}\meta{cs_1}\meta{cs_2}\marg{primary keys}
+% \cs{ekvcSplitAndForward}\meta{cs}\marg{after}\marg{primary keys}
% \end{syntax}
-% This defines \meta{cs_1} to be a macro taking one mandatory argument which
+% This defines \meta{cs} to be a macro taking one mandatory argument which
% should contain a \kv\ list. You can use as many primary keys as you want
-% with this. The primary keys will be forwarded to \meta{cs_2} as braced
+% with this. The primary keys will be forwarded to \meta{after} as braced
% arguments (as many as necessary for your primary keys). The order of the
-% braced arguments will be the order of your primary key definitions.
+% braced arguments will be the order of your primary key definitions. In
+% \meta{after} you can use just a single control sequence, or some arbitrary
+% stuff which will be left in the input stream before your braced values (with
+% one set of braces stripped from \meta{after}), so both of the following
+% would be fine:
+% \begin{lstlisting}
+% \ekvcSplitAndForward\foo\foo@aux{keyA = A, keyB = B}
+% \ekvcSplitAndForward\foo{\foo@aux{more args}}{keyA = A, keyB = B}
+% \end{lstlisting}
% \end{function}
%
+% \begin{function}{\ekvcSplitAndUse}
+% \begin{syntax}
+% \cs{ekvcSplitAndUse}\meta{cs}\marg{primary keys}
+% \end{syntax}
+% This will roughly do the same as |\ekvcSplitAndForward|, but instead of
+% specifying what will be used after splitting the keys, \meta{cs} will use
+% what follows the \kv\ list. So its syntax will be
+% \end{function}
+% \begin{syntax}
+% \meta{cs}\{\key=\val, \ldots\}\marg{after}
+% \end{syntax}
+%
% \subsubsection{Hash}
%
% The hash variants will provide the key values as a single argument in which
@@ -343,17 +363,31 @@ and the derived files expkv-cs.pdf
%
% \begin{function}{\ekvcHashAndForward}
% \begin{syntax}
-% \cs{ekvcHashAndForward}\meta{cs_1}\meta{cs_2}\marg{primary keys}
+% \cs{ekvcHashAndForward}\meta{cs}\marg{after}\marg{primary keys}
% \end{syntax}
-% This defines \meta{cs_1} to be a macro taking one mandatory argument which
+% This defines \meta{cs} to be a macro taking one mandatory argument which
% should contain a \kv\ list. You can use as many primary keys as you want.
% The primary keys will be forwarded as a single argument containing every key
-% to the underlying macro. For the underlying macro \meta{cs_2} is used (so
-% this will provide the key list as a single argument to \meta{cs_2}). In the
-% underlying macro you can access the \val\ of a \key\ by using
-% \texttt{\cs[no-index]{ekvcValue}\{\key\}\{\#1\}}.
+% to \meta{after}. You can use a single macro for \meta{after} or use some
+% arbitrary stuff, which will be left in the input stream before the hashed
+% \kv\ list with one set of braces stripped. In the
+% macro called in \meta{after} you can access the \val\ of a \key\ by using
+% \texttt{\cs[no-index]{ekvcValue}\{\key\}\{\#1\}} (or whichever argument the
+% hashed \kv\ list will be).
% \end{function}
%
+% \begin{function}{\ekvcHashAndUse}
+% \begin{syntax}
+% \cs{ekvcHashAndUse}\meta{cs}\marg{primary keys}
+% \end{syntax}
+% This will roughly do the same as |\ekvcHashAndForward|, but instead of
+% specifying what will be used after hashing the keys, \meta{cs} will use what
+% follows the \kv\ list. So its syntax will be
+% \end{function}
+% \begin{syntax}
+% \meta{cs}\{\key=\val, \ldots\}\marg{after}
+% \end{syntax}
+%
% \begin{function}{\ekvcValue}
% \begin{syntax}
% \cs{ekvcValue}\{\key\}\marg{key list}
@@ -361,10 +395,10 @@ and the derived files expkv-cs.pdf
% This is a safe (but slow) way to access your keys in a hash variant. \key\
% is the key which's \val\ you want to use out of the \meta{key list}.
% \meta{key list} should be the key list argument forwarded to your underlying
-% macro by |\ekvcHash| or |\ekvcHashAndForward|. It will be tested whether the
-% hash function to access that \key\ exists, the \key\ argument is not empty,
-% and that the \meta{key list} really contains a \val\ of that \key. This
-% macro needs exactly two steps of expansion.
+% macro by |\ekvcHash|, |\ekvcHashAndForward|, or |\ekvcHashAndUse|. It will
+% be tested whether the hash function to access that \key\ exists, the \key\
+% argument is not empty, and that the \meta{key list} really contains a \val\
+% of that \key. This macro needs exactly two steps of expansion.
% \end{function}
%
% \begin{function}{\ekvcValueFast}
@@ -766,8 +800,8 @@ and the derived files expkv-cs.pdf
% \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.3}
-\def\ekvcDate{2020-04-29}
+\def\ekvcVersion{0.4}
+\def\ekvcDate{2020-08-08}
% \end{macrocode}
% \end{macro}
%
@@ -832,28 +866,29 @@ and the derived files expkv-cs.pdf
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\ekvcSplitAndForward}
+% \begin{macro}{\ekvcSplitAndUse}
% The first user macro we want to set up can be reused for
-% \cs[no-index]{ekvcSplit}. We'll split this one up so that the test whether
-% the macro is already defined doesn't run twice.
+% \cs[no-index]{ekvcSplitAndForward} and \cs[no-index]{ekvcSplit}. We'll split
+% this one up so that the test whether the macro is already defined doesn't
+% run twice.
% \begin{macrocode}
-\protected\long\def\ekvcSplitAndForward#1#2#3%
+\protected\long\def\ekvcSplitAndUse#1#2%
{%
\ekv@ifdefined{\expandafter\@gobble\string#1}%
- {\ekvc@err@already@defined{#1}}%
- {\ekvcSplitAndForward@{#1}{#2}{#3}}%
+ {\ekvc@err@already@defined#1}%
+ {\ekvcSplitAndUse@#1{}{#2}}%
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[internal]{\ekvcSplitAndForward@}
+% \begin{macro}[internal]{\ekvcSplitAndUse@}
% The actual macro setting up things. We need to set some variables, forward
% the key list to |\ekvc@SetupSplitKeys|, and afterwards define the front
% facing macro to call |\ekvset| and put the initials and the argument sorting
% macro behind it. The internals |\ekvc@any@long|, |\ekvc@initials| and
% |\ekvc@keycount| will be set correctly by |\ekvc@SetupSplitKeys|.
% \begin{macrocode}
-\protected\long\def\ekvcSplitAndForward@#1#2#3%
+\protected\long\def\ekvcSplitAndUse@#1#2#3%
{%
\edef\ekvc@set{\string#1}%
\ekvc@SetupSplitKeys{#3}%
@@ -868,6 +903,20 @@ and the derived files expkv-cs.pdf
% \end{macrocode}
% \end{macro}
%
+%
+% \begin{macro}{\ekvcSplitAndForward}
+% This just reuses |\ekvcSplitAndUse@| with a non-empty second argument,
+% resulting in that argument to be called after the splitting.
+% \begin{macrocode}
+\protected\long\def\ekvcSplitAndForward#1#2#3%
+ {%
+ \ekv@ifdefined{\expandafter\@gobble\string#1}%
+ {\ekvc@err@already@defined#1}%
+ {\ekvcSplitAndUse@#1{{#2}}{#3}}%
+ }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\ekvcSplit}
% The first half is just |\ekvcSplitAndForward| then we define the macro to
% which the parsed key list is forwarded. There we need to allow for up to
@@ -876,10 +925,10 @@ and the derived files expkv-cs.pdf
\protected\long\def\ekvcSplit#1#2#3%
{%
\ekv@ifdefined{\expandafter\@gobble\string#1}%
- {\ekvc@err@already@defined{#1}}%
+ {\ekvc@err@already@defined#1}%
{%
\expandafter
- \ekvcSplitAndForward@\expandafter#1\csname ekvc@\string#1\endcsname{#2}%
+ \ekvcSplitAndUse@\expandafter#1\csname ekvc@\string#1\endcsname{#2}%
\ifnum\ekvc@keycount=0
\def\ekvc@tmp##1##{}%
\else
@@ -907,12 +956,12 @@ and the derived files expkv-cs.pdf
% These macros parse the list of keys and set up the key macros. First we need
% to initialise some macros and start |\ekvparse|.
% \begin{macrocode}
-\protected\long\def\ekvc@SetupSplitKeys#1%
+\protected\long\def\ekvc@SetupSplitKeys
{%
\ekvc@keycount=0
\def\ekvc@any@long{}%
\def\ekvc@initials{}%
- \ekvparse\ekvc@err@value@required\ekvc@SetupSplitKeys@a{#1}%
+ \ekvparse\ekvc@err@value@required\ekvc@SetupSplitKeys@a
}
% \end{macrocode}
% Then we need to step the key counter for each key. Also we have to check
@@ -1052,24 +1101,24 @@ and the derived files expkv-cs.pdf
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\ekvcHashAndForward}
-% |\ekvcHashAndForward| works just like |\ekvcSplitAndForward|.
+% \begin{macro}{\ekvcHashAndUse}
+% |\ekvcHashAndUse| works just like |\ekvcSplitAndUse|.
% \begin{macrocode}
-\protected\long\def\ekvcHashAndForward#1#2#3%
+\protected\long\def\ekvcHashAndUse#1#2%
{%
\ekv@ifdefined{\expandafter\@gobble\string#1}%
- {\ekvc@err@already@defined{#1}}%
- {\ekvcHashAndForward@{#1}{#2}{#3}}%
+ {\ekvc@err@already@defined#1}%
+ {\ekvcHashAndUse@#1{}{#2}}%
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[internal]{\ekvcHashAndForward@}
-% This is more or less the same as |\ekvcHashAndForward@|. Instead of an empty
+% This is more or less the same as |\ekvcSplitAndUse@|. Instead of an empty
% group we place a marker after the initials, we don't use the sorting macros
% of |split|, but instead pack all the values in one argument.
% \begin{macrocode}
-\protected\long\def\ekvcHashAndForward@#1#2#3%
+\protected\long\def\ekvcHashAndUse@#1#2#3%
{%
\edef\ekvc@set{\string#1}%
\ekvc@SetupHashKeys{#3}%
@@ -1083,6 +1132,18 @@ and the derived files expkv-cs.pdf
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\ekvcHashAndForward}
+% |\ekvcHashAndForward| works just like |\ekvcSplitAndForward|.
+% \begin{macrocode}
+\protected\long\def\ekvcHashAndForward#1#2#3%
+ {%
+ \ekv@ifdefined{\expandafter\@gobble\string#1}%
+ {\ekvc@err@already@defined#1}%
+ {\ekvcHashAndUse@#1{{#2}}{#3}}%
+ }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\ekvcHash}
% |\ekvcHash| does the same as |\ekvcSplit|, but has the advantage of not
% needing to count arguments, so the definition of the internal macro is a bit
@@ -1091,10 +1152,10 @@ and the derived files expkv-cs.pdf
\protected\long\def\ekvcHash#1#2#3%
{%
\ekv@ifdefined{\expandafter\@gobble\string#1}%
- {\ekvc@err@already@defined{#1}}%
+ {\ekvc@err@already@defined#1}%
{%
\expandafter
- \ekvcHashAndForward@\expandafter#1\csname ekvc@\string#1\endcsname{#2}%
+ \ekvcHashAndUse@\expandafter#1\csname ekvc@\string#1\endcsname{#2}%
\ekvc@any@long\expandafter\def\csname ekvc@\string#1\endcsname##1{#3}%
}%
}
@@ -1292,7 +1353,7 @@ and the derived files expkv-cs.pdf
% \end{macro}
%
% \begin{macro}{\ekvcValueSplit}
-% This splits off a single version
+% This splits off a single value.
% \begin{macrocode}
\long\def\ekvcValueSplit#1#2#3%
{%