%% %% This is file `expkv.tex', %% generated with the docstrip utility. %% %% The original source files were: %% %% expkv.dtx (with options: `tex') %% %% -------------------------------------------------------------- %% expkv -- an expandable key=val implementation %% E-mail: jspratte@yahoo.de %% Released under the LaTeX Project Public License v1.3c or later %% See http://www.latex-project.org/lppl.txt %% -------------------------------------------------------------- %% %% Copyright (C) 2020 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 %% (at your option) any later version. The latest version of this license is in %% the file: %% %% http://www.latex-project.org/lppl.txt %% %% This work is "maintained" (as per LPPL maintenance status) by %% Jonathan P. Spratte. %% %% This work consists of the file expkv.dtx %% and the derived files expkv.pdf %% expkv.sty %% expkv.tex %% \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname numexpr\endcsname\relax \errmessage{expkv requires e-TeX} \expandafter\endinput \fi \expandafter\ifx\csname ekvVersion\endcsname\relax \else \expandafter\endinput \fi \def\ekvVersion{0.3} \def\ekvDate{2020-01-22} \csname ekv@tmp\endcsname \expandafter\chardef\csname ekv@tmp\endcsname=\catcode`\@ \catcode`\@=11 \long\def\@gobble#1{} \long\def\@firstofone#1{#1} \long\def\@firstoftwo#1#2{#1} \long\def\@secondoftwo#1#2{#2} \long\def\ekv@gobbletostop#1\ekv@stop{} \long\def\ekv@fi@gobble\fi\@firstofone#1{\fi} \long\def\ekv@fi@secondoftwo\fi\@firstoftwo#1#2{\fi#2} \long\def\ekv@ifempty#1% {% \ekv@ifempty@\ekv@ifempty@A#1\ekv@ifempty@B\ekv@ifempty@true \ekv@ifempty@A\ekv@ifempty@B\@secondoftwo } \long\def\ekv@ifempty@#1\ekv@ifempty@A\ekv@ifempty@B{} \long\def\ekv@ifempty@true\ekv@ifempty@A\ekv@ifempty@B\@secondoftwo#1#2{#1} \long\def\ekv@ifempty@false\ekv@ifempty@A\ekv@ifempty@B\@firstoftwo#1#2{#2} \long\def\ekv@ifempty@true@F\ekv@ifempty@A\ekv@ifempty@B\@firstofone#1{} \long\def\ekv@ifblank@\ekv@mark#1{\ekv@ifempty@\ekv@ifempty@A} \def\ekv@ifdefined#1% {% \expandafter \ifx\csname\ifcsname #1\endcsname #1\else relax\fi\endcsname\relax \ekv@fi@secondoftwo \fi \@firstoftwo } \def\ekv@ifdefined@pair#1#2% {% \expandafter\ekv@ifdefined@pair@ \csname \ifcsname #1{#2}\endcsname #1{#2}% \else relax% \fi \endcsname } \def\ekv@ifdefined@pair@#1% {% \ifx#1\relax \ekv@fi@secondoftwo \fi \@firstoftwo {\ekv@set@pair@#1\ekv@mark}% } \def\ekv@ifdefined@key#1#2% {% \expandafter\ekv@ifdefined@key@ \csname \ifcsname #1{#2}N\endcsname #1{#2}N% \else relax% \fi \endcsname } \def\ekv@ifdefined@key@#1% {% \ifx#1\relax \ekv@fi@secondoftwo \fi \@firstoftwo#1% } \def\ekv@name#1#2{\ekv@name@set{#1}\ekv@name@key{#2}} \def\ekv@name@set#1{ekv#1(} \def\ekv@name@key#1{#1)} \protected\def\ekv@checkvalid#1#2% {% \ekv@ifempty{#1}% {% \def\ekv@tmp{}% \errmessage{expkv Error: empty set name not allowed}% }% {% \ekv@ifempty{#2}% {% \def\ekv@tmp{}% \errmessage{expkv Error: empty key name not allowed}% }% \@secondoftwo }% \@gobble } \def\ekvifdefined#1#2{\ekv@ifdefined{\ekv@name{#1}{#2}}} \def\ekvifdefinedNoVal#1#2{\ekv@ifdefined{\ekv@name{#1}{#2}N}} \protected\long\def\ekvdef#1#2#3% {% \ekv@checkvalid{#1}{#2}% {% \expandafter\def\csname\ekv@name{#1}{#2}\endcsname##1{#3}% \ekv@defset{#1}% }% } \protected\long\def\ekvdefNoVal#1#2#3% {% \ekv@checkvalid{#1}{#2}% {% \expandafter\def\csname\ekv@name{#1}{#2}N\endcsname{#3}% \ekv@defset{#1}% }% } \protected\def\ekvlet#1#2#3% {% \ekv@checkvalid{#1}{#2}% {% \expandafter\let\csname\ekv@name{#1}{#2}\endcsname#3% \ekv@defset{#1}% }% } \protected\def\ekvletNoVal#1#2#3% {% \ekv@checkvalid{#1}{#2}% {% \expandafter\let\csname\ekv@name{#1}{#2}N\endcsname#3% \ekv@defset{#1}% }% } \protected\def\ekvletkv#1#2#3#4% {% \ekv@checkvalid{#1}{#2}% {% \expandafter\let\csname\ekv@name{#1}{#2}\expandafter\endcsname \csname\ekv@name{#3}{#4}\endcsname \ekv@defset{#1}% }% } \protected\def\ekvletkvNoVal#1#2#3#4% {% \ekv@checkvalid{#1}{#2}% {% \expandafter\let\csname\ekv@name{#1}{#2}N\expandafter\endcsname \csname\ekv@name{#3}{#4}N\endcsname \ekv@defset{#1}% }% } \protected\def\ekv@defset#1% {% \expandafter\edef\csname\ekv@name@set{#1}\endcsname##1% {\ekv@name@set{#1}\ekv@name@key{##1}}% } \def\ekvset#1#2{% \endgroup \long\def\ekvset##1##2% {% \expandafter\ekv@set\csname\ekv@name@set{##1}\endcsname \ekv@mark##2#1\ekv@stop#1{}% } \long\def\ekv@set##1##2#1% {% \ekv@ifstop##2\ekv@endset\ekv@mark\ekv@stop \ekv@set@other##1##2,\ekv@stop,% \ekv@set##1\ekv@mark } \long\def\ekv@endset \ekv@mark\ekv@stop\ekv@set@other##1,\ekv@stop,\ekv@set##2\ekv@mark ##3% {##3} \long\def\ekv@set@other##1##2,% {% \ekv@ifblank@##2\ekv@nil\ekv@ifempty@B\ekv@ifempty@true@F \ekv@ifempty@A\ekv@ifempty@B\@firstofone {% \ekv@ifhas@eq@other##2=\ekv@ifempty@B\ekv@ifempty@false \ekv@ifempty@A\ekv@ifempty@B\@firstoftwo {\ekv@set@eq@other##1##2\ekv@stop}% {% \ekv@ifhas@eq@active##2#2\ekv@ifempty@B\ekv@ifempty@false \ekv@ifempty@A\ekv@ifempty@B\@firstoftwo {\ekv@set@eq@active##1##2\ekv@stop}% {% \ekv@ifstop##2\ekv@endset@other\ekv@mark\ekv@stop \ekv@strip{##2}\ekv@set@key##1% }% }% }% \ekv@set@other##1\ekv@mark% } \long\def\ekv@set@eq@other##1##2=% {% \ekv@ifhas@eq@active##2#2\ekv@ifempty@B\ekv@ifempty@false \ekv@ifempty@A\ekv@ifempty@B\@firstoftwo {\ekv@set@eq@active##1##2=}% {\ekv@strip{##2}\ekv@set@pair##1}% } \long\def\ekv@set@eq@active##1##2#2% {% \ekv@strip{##2}\ekv@set@pair##1% } \long\def\ekv@ifhas@eq@other\ekv@mark##1={\ekv@ifempty@\ekv@ifempty@A} \long\def\ekv@ifhas@eq@active\ekv@mark##1#2{\ekv@ifempty@\ekv@ifempty@A} \long\def\ekv@endset@other \ekv@mark\ekv@stop\ekv@strip##1\ekv@set@key##2% \ekv@set@other##3\ekv@mark {} \long\def\ekvbreak##1##2\ekv@stop#1##3{##1} \long\def\ekvbreakPreSneak ##1##2\ekv@stop#1##3{##1##3} \long\def\ekvbreakPostSneak##1##2\ekv@stop#1##3{##3##1} \long\def\ekvsneak##1##2\ekv@stop#1##3% {% ##2\ekv@stop#1{##3##1}% } \long\def\ekvsneakPre##1##2\ekv@stop#1##3% {% ##2\ekv@stop#1{##1##3}% } \long\def\ekvparse##1##2##3% {% \expanded{\ekv@parse##1##2\ekv@mark##3#1\ekv@stop#1}% } \long\def\ekv@parse##1##2##3#1% {% \ekv@ifstop##3\ekv@endparse\ekv@mark\ekv@stop \ekv@parse@other##1##2##3,\ekv@stop,% \ekv@parse##1##2\ekv@mark } \long\def\ekv@endparse \ekv@mark\ekv@stop\ekv@parse@other##1,\ekv@stop,\ekv@parse##2\ekv@mark {} \long\def\ekv@parse@other##1##2##3,% {% \ekv@ifblank@##3\ekv@nil\ekv@ifempty@B\ekv@ifempty@true@F \ekv@ifempty@A\ekv@ifempty@B\@firstofone {% \ekv@ifhas@eq@other##3=\ekv@ifempty@B\ekv@ifempty@false \ekv@ifempty@A\ekv@ifempty@B\@firstoftwo {\unexpanded{##2}\ekv@parse@eq@other##3\ekv@stop}% {% \ekv@ifhas@eq@active##3#2\ekv@ifempty@B\ekv@ifempty@false \ekv@ifempty@A\ekv@ifempty@B\@firstoftwo {\unexpanded{##2}\ekv@parse@eq@active##3\ekv@stop}% {% \ekv@ifstop##3\ekv@endparse@other\ekv@mark\ekv@stop \unexpanded{##1}{\ekv@strip{##3}\unexpanded}% }% }% }% \ekv@parse@other##1##2\ekv@mark } \long\def\ekv@parse@eq@other##1=% {% \ekv@ifhas@eq@active##1#2\ekv@ifempty@B\ekv@ifempty@false \ekv@ifempty@A\ekv@ifempty@B\@firstoftwo {\ekv@parse@eq@active##1=}% {{\ekv@strip{##1}\unexpanded}\ekv@parse@pair\ekv@mark}% } \long\def\ekv@parse@eq@active##1#2% {% {\ekv@strip{##1}\unexpanded}\ekv@parse@pair\ekv@mark } \long\def\ekv@endparse@other \ekv@mark\ekv@stop\unexpanded##1% \ekv@parse@other##2\ekv@mark {} \long\def\ekv@parse@pair##1\ekv@stop {% {\ekv@strip{##1}\unexpanded}% } } \begingroup \catcode`\,=13 \catcode`\==13 \ekvset,= \long\def\ekv@ifstop#1\ekv@mark\ekv@stop{} \long\def\ekv@set@pair#1#2% {% \ekv@ifdefined@pair#2{#1}% {% \ekv@ifdefined{#2{#1}N}% \ekv@err@noarg \ekv@err@unknown #2{#1}% \ekv@gobbletostop }% } \long\def\ekv@set@pair@#1#2\ekv@stop {% \ekv@strip{#2}#1% } \long\def\ekv@set@key#1#2% {% \ekv@ifdefined@key#2{#1}% {% \ekv@ifdefined{#2{#1}}% \ekv@err@reqval \ekv@err@unknown #2{#1}% }% } \begingroup \edef\ekv@err {% \endgroup \unexpanded{\long\def\ekv@err}##1% {% \unexpanded{\expandafter\ekv@err@\@firstofone}% {\expandafter\noexpand\csname ! expkv Error:\endcsname ##1.}% \unexpanded{\ekv@stop}% }% } \ekv@err \def\ekv@err@{\expandafter\ekv@gobbletostop} \long\def\ekv@err@common #1#2{\expandafter\ekv@err@common@\string#2{#1}} \long\def\ekv@err@common@#1#2#3#4#5(#6#7{\ekv@err{#6 (`#7', set `#5')}} \long\def\ekv@err@unknown#1#2{\ekv@err@common{unknown key}#1{#2}} \long\def\ekv@err@noarg #1#2{\ekv@err@common{value forbidden}#1{#2}} \long\def\ekv@err@reqval #1#2{\ekv@err@common{value required}#1{#2}} \def\ekv@strip#1% {% \long\def\ekv@strip##1% {% \ekv@strip@a ##1% \ekv@nil \ekv@mark#1% #1\ekv@nil{}% \ekv@stop }% \long\def\ekv@strip@a##1\ekv@mark#1##2\ekv@nil##3% {% \ekv@strip@b##3##1##2\ekv@nil }% \long\def\ekv@strip@b##1#1\ekv@nil {% \ekv@strip@c##1\ekv@nil }% \long\def\ekv@strip@c\ekv@mark##1\ekv@nil##2\ekv@stop##3% {% ##3{##1}% }% } \ekv@strip{ } \catcode`\@=\ekv@tmp %% %% %% End of file `expkv.tex'.