From 1535dded3abe5cf9a26354e80ba3e9e9ab8baa26 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Thu, 23 Jan 2020 21:56:50 +0000 Subject: expkv (23jan20) git-svn-id: svn://tug.org/texlive/trunk@53516 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/tex/generic/expkv/expkv.tex | 380 ++++++++++++++++++++++++++ 1 file changed, 380 insertions(+) create mode 100644 Master/texmf-dist/tex/generic/expkv/expkv.tex (limited to 'Master/texmf-dist/tex/generic') diff --git a/Master/texmf-dist/tex/generic/expkv/expkv.tex b/Master/texmf-dist/tex/generic/expkv/expkv.tex new file mode 100644 index 00000000000..ca05bd10ae3 --- /dev/null +++ b/Master/texmf-dist/tex/generic/expkv/expkv.tex @@ -0,0 +1,380 @@ +%% +%% 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'. -- cgit v1.2.3