texlive[54680] Master/texmf-dist: expkv-def (4apr20)

commits+karl at tug.org commits+karl at tug.org
Sun Apr 12 00:52:02 CEST 2020


Revision: 54680
          http://tug.org/svn/texlive?view=revision&revision=54680
Author:   karl
Date:     2020-04-12 00:52:02 +0200 (Sun, 12 Apr 2020)
Log Message:
-----------
expkv-def (4apr20)

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

Modified: trunk/Master/texmf-dist/doc/latex/expkv-def/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/expkv-def/README.md	2020-04-11 22:51:41 UTC (rev 54679)
+++ trunk/Master/texmf-dist/doc/latex/expkv-def/README.md	2020-04-11 22:52:02 UTC (rev 54680)
@@ -1,7 +1,7 @@
 -------------------------------------------------------------------------------
 # expkv-def -- a key-defining frontend for expkv
 
-Version 2020-02-29 v0.1a
+Version 2020-04-04 v0.2a
 
 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-def/expkv-def.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/source/latex/expkv-def/expkv-def.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/expkv-def/expkv-def.dtx	2020-04-11 22:51:41 UTC (rev 54679)
+++ trunk/Master/texmf-dist/source/latex/expkv-def/expkv-def.dtx	2020-04-11 22:52:02 UTC (rev 54680)
@@ -167,9 +167,10 @@
 \hypersetup{linkcolor=red!80!black,urlcolor=purple!80!black}
 \DoNotIndex{\def,\edef,\,,\=,\begingroup,\catcode,\chardef,\csname,\endcsname}
 \DoNotIndex{\endgroup,\endinput,\errmessage,\expandafter,\input,\let,\long}
-\DoNotIndex{\noexpand,\protected,\ProvidesFile,\ProvidesPackage,\relax,\space}
+\DoNotIndex{\protected,\ProvidesFile,\ProvidesPackage,\relax,\space}
 \DoNotIndex{\@,\unexpanded,\string,\expanded,\dimexpr,\global,\glueexpr,\hbox}
-\DoNotIndex{\numexpr,\RequirePackage,\setbox,\the,\unless,\xdef}
+\DoNotIndex{\numexpr,\RequirePackage,\setbox,\the,\unless,\xdef,\@firstofone}
+\DoNotIndex{\@firstoftwo,\@gobble,\@secondoftwo}
 \DoNotIndex{\ifcsname}
 \DoNotIndex{\ifx}
 \DoNotIndex{\ifdefined}
@@ -322,12 +323,15 @@
 %   \key-code with \meta{definition} as its argument inside of an |\edef|.
 % \end{function}
 %
-% \begin{function}{initial}
+% \begin{function}{initial,oinitial,einitial}
 %   \begin{syntax}
 %     initial \key\ = \{\val\} \prefixes33
 %   \end{syntax}
 %   With |initial| you can set an initial \val\ for an already defined argument
-%   taking \key. It'll just call the key-macro of \key\ and pass it \val.
+%   taking \key. It'll just call the key-macro of \key\ and pass it \val. The
+%   |einitial| variant will expand \val\ using an |\edef| expansion prior to
+%   passing it to the key-macro and the |oinitial| variant will expand the first
+%   token in \val\ once.
 % \end{function}
 %
 % \begin{function}{bool,gbool,boolTF,gboolTF}
@@ -365,6 +369,32 @@
 %   parameters inside of them by using |\unexpanded|.
 % \end{function}
 %
+% \begin{function}{data,edata,gdata,xdata}
+%   \begin{syntax}
+%     data \key\ = \meta{cs} \prefixes12
+%   \end{syntax}
+%   The \meta{cs} should be a single control sequence, such as |\foo|. This will
+%   define \key\ to store \val\ inside of the control sequence. But unlike the
+%   |store| type, the macro \meta{cs} will be a switch at the same time, it'll
+%   take two arguments and if \key\ was used expands to the first argument
+%   followed by \val\ in braces, if \key\ was not used \meta{cs} will expand to
+%   the second argument (so behave like |\@secondoftwo|). The idea is that with
+%   this type you can define a key which should be typeset formatted. The
+%   |edata| and |xdata| variants will fully expand \val, the |gdata| and |xdata|
+%   variants will store \val\ inside \meta{cs} globally. The |p|-prefixes will
+%   only affect the key-macro, \meta{cs} will always be expandable and |\long|.
+% \end{function}
+%
+% \begin{function}{dataT,edataT,gdataT,xdataT}
+%   \begin{syntax}
+%     dataT \key\ = \meta{cs} \prefixes12
+%   \end{syntax}
+%   Just like |data|, but instead of \meta{cs} grabbing two arguments it'll only
+%   grab one, so by default it'll behave like |\@gobble|, and if a \val\ was
+%   given to \key\ the \meta{cs} will behave like |\@firstofone| appended by
+%   \marg{value}.
+% \end{function}
+%
 % \begin{function}{int,eint,gint,xint}
 %   \begin{syntax}
 %     int \key\ = \meta{cs} \prefixes12
@@ -491,14 +521,16 @@
 %     ,bool      keyB = \keyB
 %     ,boolTF    keyC = \keyC
 %     ,store     keyD = \keyD
-%     ,int       keyE = \keyE
-%     ,dimen     keyF = \keyF
-%     ,skip      keyG = \keyG
-%     ,toks      keyH = \keyH
-%     ,default   keyH = \empty test
-%     ,box       keyI = \keyI
-%     ,qdefault  keyI = text
-%     ,choice    keyJ =
+%     ,data      keyE = \keyE
+%     ,dataT     keyF = \keyF
+%     ,int       keyG = \keyG
+%     ,dimen     keyH = \keyH
+%     ,skip      keyI = \keyI
+%     ,toks      keyJ = \keyJ
+%     ,default   keyJ = \empty test
+%     ,box       keyK = \keyK
+%     ,qdefault  keyK = text
+%     ,choice    keyL =
 %       {
 %         ,protected 1 = \texttt{a}
 %         ,2 = b
@@ -506,12 +538,65 @@
 %         ,4 = d
 %         ,5 = e
 %       }
-%     ,edefault  keyJ = 2
-%     ,meta      keyK = {keyA={#1},keyB=false}
-%     ,set       setB = B
+%     ,edefault  keyL = 2
+%     ,meta      keyM = {keyA={#1},keyB=false}
+%     ,data
 %   }
 % \end{lstlisting}
 %
+% \bigskip
+% Since the |data| type might be a bit strange, here is another usage example
+% for it.
+% \begin{lstlisting}
+% \ekvdefinekeys{ex}
+%   {
+%     ,data  name  = \Pname
+%     ,data  age   = \Page
+%     ,dataT hobby = \Phobby
+%   }
+% \newcommand\Person[1]
+%   {%
+%     \begingroup
+%     \ekvset{ex}{#1}%
+%     \begin{description}
+%       \item[\Pname{}{\errmessage{A person requires a name}}]
+%       \item[Age] \Page{\textit}{\errmessage{A person requires an age}}
+%       \Phobby{\item[Hobbies]}
+%     \end{description}
+%     \endgroup
+%   }
+% \Person{name=Jonathan P. Spratte, age=young, hobby=\TeX\ coding}
+% \Person{name=Some User, age=unknown, hobby=Reading Documentation}
+% \Person{name=Anybody, age=any}
+% \end{lstlisting}
+% In this example a person should have a name and an age, but doesn't have to
+% have hobbies. The name will be displayed as the description item and the age
+% in Italics. If a person has no hobbies the description item will be silently
+% left out.  The result of the above code looks like this:
+%
+% \begingroup
+% \ekvdefinekeys{ex}
+%   {
+%     ,data  name  = \Pname
+%     ,data  age   = \Page
+%     ,dataT hobby = \Phobby
+%   }
+% \newcommand\Person[1]
+%   {%
+%     \begingroup
+%     \ekvset{ex}{#1}%
+%     \begin{description}
+%       \item[\Pname{}{\errmessage{A person requires a name}}]
+%       \item[Age] \Page{\textit}{\errmessage{A person requires an age}}
+%       \Phobby{\item[Hobbies]}
+%     \end{description}
+%     \endgroup
+%   }
+% \Person{name=Jonathan P. Spratte, age=young, hobby=\TeX\ coding}
+% \Person{name=Some User, age=unknown, hobby=Reading Documentation}
+% \Person{name=Anybody, age=any}
+% \endgroup
+%
 % \subsection{License}
 %
 % Copyright \textcopyright\ 2020\unless\ifnum\year=2020--\the\year\fi\
@@ -583,8 +668,8 @@
 % \begin{macro}{\ekvdVersion,\ekvdDate}
 % We're on our first input, so lets store the version and date in a macro.
 %    \begin{macrocode}
-\def\ekvdVersion{0.1a}
-\def\ekvdDate{2020-02-29}
+\def\ekvdVersion{0.2a}
+\def\ekvdDate{2020-04-04}
 %    \end{macrocode}
 % \end{macro}
 %
@@ -810,7 +895,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[internal]{\ekvd at t@initial}
+% \begin{macro}[internal]{\ekvd at t@initial,\ekvd at t@oinitial,\ekvd at t@einitial}
 %    \begin{macrocode}
 \long\def\ekvd at t@initial#1#2%
   {%
@@ -825,6 +910,34 @@
           {\ekvd at err@undefined at key{#1}}%
       }%
   }
+\long\def\ekvd at t@oinitial#1#2%
+  {%
+    \ekvd at assert@arg{oinitial #1}{#2}%
+      {%
+        \ekvifdefined\ekvd at set{#1}%
+          {%
+            \ekvd at assert@not at long{oinitial #1}%
+            \ekvd at assert@not at protected{oinitial #1}%
+            \csname\ekv at name\ekvd at set{#1}\expandafter\endcsname\expandafter{#2}%
+          }%
+          {\ekvd at err@undefined at key{#1}}%
+      }%
+  }
+\long\def\ekvd at t@einitial#1#2%
+  {%
+    \ekvd at assert@arg{einitial #1}{#2}%
+      {%
+        \ekvifdefined\ekvd at set{#1}%
+          {%
+            \ekvd at assert@not at long{einitial #1}%
+            \ekvd at assert@not at protected{einitial #1}%
+            \edef\ekvd at tmp{#2}%
+            \csname\ekv at name\ekvd at set{#1}\expandafter\endcsname\expandafter
+              {\ekvd at tmp}%
+          }%
+          {\ekvd at err@undefined at key{#1}}%
+      }%
+  }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -858,6 +971,30 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}[internal]
+%   {
+%     \ekvd at type@data,\ekvd at t@data,\ekvd at t@gdata,\ekvd at t@dataT,\ekvd at t@gdataT
+%   }
+%    \begin{macrocode}
+\protected\def\ekvd at type@data#1#2#3#4#5#6#7%
+  {%
+    \ekvd at assert@filledarg{#1data#2 #6}{#7}%
+      {%
+        \ekvd at newlet#7#3%
+        \protected\ekvd at long\ekvdef\ekvd at set{#6}{\long#4#7####1#5{####1{##1}}}%
+      }%
+  }
+\protected\def\ekvd at t@data{\ekvd at type@data{}{}\@secondoftwo\def{####2}}
+\protected\def\ekvd at t@edata{\ekvd at type@data e{}\@secondoftwo\edef{####2}}
+\protected\def\ekvd at t@gdata{\ekvd at type@data g{}\@secondoftwo\gdef{####2}}
+\protected\def\ekvd at t@xdata{\ekvd at type@data x{}\@secondoftwo\xdef{####2}}
+\protected\def\ekvd at t@dataT{\ekvd at type@data{}T\@gobble\def{}}
+\protected\def\ekvd at t@edataT{\ekvd at type@data eT\@gobble\edef{}}
+\protected\def\ekvd at t@gdataT{\ekvd at type@data gT\@gobble\gdef{}}
+\protected\def\ekvd at t@xdataT{\ekvd at type@data xT\@gobble\xdef{}}
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}[internal]{\ekvd at type@box,\ekvd at t@box,\ekvd at t@gbox}
 % Set up our boxes. Though we're a generic package we want to be colour safe, so
 % we put an additional grouping level inside the box contents, for the case that
@@ -1354,7 +1491,7 @@
     \unexpanded{\long\def\ekvd at err}##1%
       {%
         \unexpanded{\expandafter\ekv at err@\@firstofone}%
-        {\expandafter\noexpand\csname ! expkv-def Error:\endcsname ##1.}%
+        {\unexpanded\expandafter{\csname ! expkv-def Error:\endcsname}##1.}%
         \unexpanded{\ekv at stop}%
       }%
   }

Modified: trunk/Master/texmf-dist/tex/generic/expkv-def/expkv-def.tex
===================================================================
--- trunk/Master/texmf-dist/tex/generic/expkv-def/expkv-def.tex	2020-04-11 22:51:41 UTC (rev 54679)
+++ trunk/Master/texmf-dist/tex/generic/expkv-def/expkv-def.tex	2020-04-11 22:52:02 UTC (rev 54680)
@@ -35,8 +35,8 @@
 \else
   \expandafter\endinput
 \fi
-\def\ekvdVersion{0.1a}
-\def\ekvdDate{2020-02-29}
+\def\ekvdVersion{0.2a}
+\def\ekvdDate{2020-04-04}
 \csname ekvd at tmp\endcsname
 \expandafter\chardef\csname ekvd at tmp\endcsname=\catcode`\@
 \catcode`\@=11
@@ -162,6 +162,34 @@
           {\ekvd at err@undefined at key{#1}}%
       }%
   }
+\long\def\ekvd at t@oinitial#1#2%
+  {%
+    \ekvd at assert@arg{oinitial #1}{#2}%
+      {%
+        \ekvifdefined\ekvd at set{#1}%
+          {%
+            \ekvd at assert@not at long{oinitial #1}%
+            \ekvd at assert@not at protected{oinitial #1}%
+            \csname\ekv at name\ekvd at set{#1}\expandafter\endcsname\expandafter{#2}%
+          }%
+          {\ekvd at err@undefined at key{#1}}%
+      }%
+  }
+\long\def\ekvd at t@einitial#1#2%
+  {%
+    \ekvd at assert@arg{einitial #1}{#2}%
+      {%
+        \ekvifdefined\ekvd at set{#1}%
+          {%
+            \ekvd at assert@not at long{einitial #1}%
+            \ekvd at assert@not at protected{einitial #1}%
+            \edef\ekvd at tmp{#2}%
+            \csname\ekv at name\ekvd at set{#1}\expandafter\endcsname\expandafter
+              {\ekvd at tmp}%
+          }%
+          {\ekvd at err@undefined at key{#1}}%
+      }%
+  }
 \protected\def\ekvd at type@bool#1#2#3#4#5#6#7%
   {%
     \ekvd at assert@filledarg{#1bool#2 #6}{#7}%
@@ -182,6 +210,22 @@
 \protected\def\ekvd at t@boolTF{\ekvd at type@bool{}{TF}{}\@firstoftwo\@secondoftwo}
 \protected\def\ekvd at t@gboolTF
   {\ekvd at type@bool g{TF}\global\@firstoftwo\@secondoftwo}
+\protected\def\ekvd at type@data#1#2#3#4#5#6#7%
+  {%
+    \ekvd at assert@filledarg{#1data#2 #6}{#7}%
+      {%
+        \ekvd at newlet#7#3%
+        \protected\ekvd at long\ekvdef\ekvd at set{#6}{\long#4#7####1#5{####1{##1}}}%
+      }%
+  }
+\protected\def\ekvd at t@data{\ekvd at type@data{}{}\@secondoftwo\def{####2}}
+\protected\def\ekvd at t@edata{\ekvd at type@data e{}\@secondoftwo\edef{####2}}
+\protected\def\ekvd at t@gdata{\ekvd at type@data g{}\@secondoftwo\gdef{####2}}
+\protected\def\ekvd at t@xdata{\ekvd at type@data x{}\@secondoftwo\xdef{####2}}
+\protected\def\ekvd at t@dataT{\ekvd at type@data{}T\@gobble\def{}}
+\protected\def\ekvd at t@edataT{\ekvd at type@data eT\@gobble\edef{}}
+\protected\def\ekvd at t@gdataT{\ekvd at type@data gT\@gobble\gdef{}}
+\protected\def\ekvd at t@xdataT{\ekvd at type@data xT\@gobble\xdef{}}
 \protected\def\ekvd at type@box#1#2#3#4%
   {%
     \ekvd at assert@filledarg{#1box #3}{#4}%
@@ -479,7 +523,7 @@
     \unexpanded{\long\def\ekvd at err}##1%
       {%
         \unexpanded{\expandafter\ekv at err@\@firstofone}%
-        {\expandafter\noexpand\csname ! expkv-def Error:\endcsname ##1.}%
+        {\unexpanded\expandafter{\csname ! expkv-def Error:\endcsname}##1.}%
         \unexpanded{\ekv at stop}%
       }%
   }



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