%% %% This is file `expkv-def.tex', %% generated with the docstrip utility. %% %% The original source files were: %% %% expkv-def.dtx (with options: `tex') %% %% ---------------------------------------------------------------- %% expkv-bundle -- an expandable key=val implementation and friends %% 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-2023 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 files expkv-bundle.ins %% expkv.dtx %% expkv-cs.dtx %% expkv-def.dtx %% expkv-opt.dtx %% expkv-pop.dtx %% and the derived files expkv.sty %% expkv.tex %% t-expkv.tex %% expkv-cs.sty %% expkv-cs.tex %% t-expkv-cs.tex %% expkv-def.sty %% expkv-def.tex %% t-expkv-def.tex %% expkv-opt.sty %% expkv-pop.sty %% expkv-pop.tex %% t-expkv-pop.tex %% %% as well as any documentation files shipped with it. %% \input expkv-pop \expandafter\ifx\csname ekvdVersion\endcsname\relax \else \expandafter\endinput \fi \def\ekvdVersion{1.0} \def\ekvdDate{2023-01-23} \csname ekvd@tmp\endcsname \expandafter\chardef\csname ekvd@tmp\endcsname=\catcode`\@ \catcode`\@=11 \protected\long\def\ekvd@ifprimitive#1% {% \begingroup \edef\ekvd@tmpa{\string #1}% \edef\ekvd@tmpb{\meaning#1}% \expandafter \endgroup \ifx\ekvd@tmpa\ekvd@tmpb \ekv@fi@firstoftwo \fi \@secondoftwo } \protected\def\ekvd@clear@prefixes {% \let\ekvd@long\ekv@empty \let\ekvd@prot\ekv@empty \let\ekvd@ifalso\@secondoftwo \let\ekvd@do@new\@gobbletwo } \ekvd@clear@prefixes \ekvpNewParser{ekvd@definekeys} \ekvpDefNoValuePrefix{ekvd@definekeys} {\let\ekvd@ifnoarg\@firstoftwo} {\let\ekvd@ifnoarg\@secondoftwo} \ekvpDefPrefixLet{ekvd@definekeys}{long} \ekvd@long\long \ekv@empty \ekvpDefPrefixLet{ekvd@definekeys}{protected}\ekvd@prot\protected\ekv@empty \ekvpDefPrefixLet{ekvd@definekeys}{protect} \ekvd@prot\protected\ekv@empty \ekvpDefPrefixLet{ekvd@definekeys}{also}\ekvd@ifalso\@firstoftwo\@secondoftwo \ekvpDefPrefixLet{ekvd@definekeys}{new}\ekvd@do@new\ekvd@assert@new\@gobbletwo \ekvpDefAutoPrefix{ekvd@definekeys}{\edef\ekvd@cur{\detokenize{#3}}}{} \protected\edef\ekvdefinekeys#1% {% \ekv@unexpanded{\def\ekvd@set}{#1}% \ekv@unexpanded{\ekvpParse@unsafe@auto\ekvp@@p@ekvd@definekeys}% \ekv@unexpanded\expandafter{\csname\ekvp@@p@ekvd@definekeys{ppa}\endcsname}% } \protected\def\ekvd@def@type#1#2% {% \ekv@exparg{\ekvpDefType{ekvd@definekeys}{#1}} {% \expandafter\expandafter\csname ekvd@th@#1\endcsname \detokenize{##1}\ekv@stop{##2}{##3}% }% \long\expandafter\def\csname ekvd@th@#1\endcsname##1\ekv@stop##2##3{#2}% } \protected\long\def\ekvd@def@type@fwd#1#2% {\ekvpDefType{ekvd@definekeys}{#1}{\ekv@exparg{#2}{\detokenize{##1}}{##3}}} \ekvd@def@type{set} {\ekvd@ifnoarg{\ekvd@type@set{#1}{#1}}{\ekvd@type@set{#1}{#3}}} \protected\def\ekvd@type@set#1#2% {% \ekvd@assert@not@long \ekvd@assert@not@protected \ekvd@do@new{NoVal}{#1}% \ekv@ifempty{#2}% {\ekvd@err@missing@definition}% {% \ekvd@ifalso {% \ekv@expargtwice{\ekvd@add@noval{#1}}% {\ekvchangeset{#2}}% \ekvd@assert@not@protected@also }% {\ekv@expargtwice{\ekvdefNoVal\ekvd@set{#1}}{\ekvchangeset{#2}}}% }% } \ekvd@def@type@fwd{noval}{\ekvd@type@noval\def} \ekvd@def@type@fwd{enoval}{\ekvd@type@noval\edef} \protected\long\def\ekvd@type@noval#1#2#3% {% \ekvd@do@new{NoVal}{#2}% \ekvd@assert@arg \ekvd@assert@not@long \ekvd@prot#1\ekvd@tmp{#3}% \ekvd@ifalso {\ekv@exparg{\ekvd@add@noval{#2}}\ekvd@tmp{}}% {\ekvletNoVal\ekvd@set{#2}\ekvd@tmp}% } \ekvd@def@type@fwd{code}{\ekvd@type@code\def} \ekvd@def@type@fwd{ecode}{\ekvd@type@code\edef} \protected\long\def\ekvd@type@code#1#2#3% {% \ekvd@do@new{}{#2}% \ekvd@assert@arg \ekvd@prot\ekvd@long#1\ekvd@tmp##1{#3}% \ekvd@ifalso {\ekv@exparg{\ekvd@add@val{#2}}{\ekvd@tmp{##1}}{}}% {\ekvlet\ekvd@set{#2}\ekvd@tmp}% } \ekvd@def@type@fwd{default}{\ekvd@type@default{\ekv@unexpanded\expandafter}{}} \ekvd@def@type@fwd{odefault} {\ekvd@type@default{\ekv@unexpanded\expandafter\expandafter\expandafter}{}} \ekvpLet{ekvd@definekeys}{type}{qdefault}{odefault} \ekvd@def@type@fwd{fdefault} {\ekvd@type@default{\ekv@unexpanded\expandafter}{\romannumeral`\^^@}} \protected\long\def\ekvd@type@default#1#2#3#4% {% \ekvd@assert@arg \ekvd@do@new{NoVal}{#3}% \ekvd@assert@not@long \ekvifdefined\ekvd@set{#3}% {% \ekvd@prot\edef\ekvd@tmp {#1{#2\csname\ekv@name\ekvd@set{#3}\endcsname{#4}}}% \ekvd@ifalso {\ekv@exparg{\ekvd@add@noval{#3}}\ekvd@tmp{}}% {\ekvletNoVal\ekvd@set{#3}\ekvd@tmp}% }% {\ekvd@err@undefined@key{#3}}% } \ekvd@def@type{edefault} {% \ekvd@assert@arg \ekvd@do@new{NoVal}{#1}% \ekvd@assert@not@long \ekvifdefined\ekvd@set{#1}% {% \ekvd@prot\edef\ekvd@tmp {% \ekv@unexpanded\ekv@expanded {{\csname\ekv@name\ekvd@set{#1}\endcsname{#3}}}% }% \ekvd@ifalso {\ekv@exparg{\ekvd@add@noval{#1}}\ekvd@tmp{}}% {\ekvletNoVal\ekvd@set{#1}\ekvd@tmp}% }% {\ekvd@err@undefined@key{#1}}% } \ekvd@def@type@fwd{initial}{\ekvd@type@initial\@firstofone} \ekvd@def@type@fwd{oinitial}{\ekvd@type@initial\ekv@exparg} \ekvd@def@type@fwd{einitial}{\ekvd@type@initial\ekv@expandedarg} \ekvd@def@type@fwd{finitial}{\ekvd@type@initial\ekv@fexparg} \long\def\ekvd@type@initial#1#2#3% {% \ekvd@assert@not@new \ekvd@assert@not@also \ekvd@assert@not@long \ekvd@assert@not@protected \ekvd@ifnoarg {% \ekvifdefinedNoVal\ekvd@set{#2}% {\csname\ekv@name\ekvd@set{#2}N\endcsname}% {\ekvd@err@undefined@noval{#2}}% }% {% \ekvifdefined\ekvd@set{#2}% {#1{\csname\ekv@name\ekvd@set{#2}\endcsname}{#3}}% {\ekvd@err@undefined@key{#2}}% }% } \ekvd@def@type@fwd{bool}{\ekvd@type@bool{}\iftrue\iffalse} \ekvd@def@type@fwd{gbool}{\ekvd@type@bool\global\iftrue\iffalse} \ekvd@def@type@fwd{boolTF}{\ekvd@type@bool{}\@firstoftwo\@secondoftwo} \ekvd@def@type@fwd{gboolTF}{\ekvd@type@bool\global\@firstoftwo\@secondoftwo} \ekvd@def@type@fwd{invbool}{\ekvd@type@bool{}\iffalse\iftrue} \ekvd@def@type@fwd{ginvbool}{\ekvd@type@bool\global\iffalse\iftrue} \ekvd@def@type@fwd{invboolTF}{\ekvd@type@bool{}\@secondoftwo\@firstoftwo} \ekvd@def@type@fwd{ginvboolTF}{\ekvd@type@bool\global\@secondoftwo\@firstoftwo} \protected\def\ekvd@type@bool#1#2#3#4#5% {% \ekvd@do@new{}{#4}% \ekvd@do@new{NoVal}{#4}% \ekvd@assert@filledarg{#5}% \ekvd@newlet#5#3% \ekvd@type@choice{#4}% \protected\ekvdefNoVal\ekvd@set{#4}{#1\let#5#2}% \protected\expandafter\def \csname\ekvd@choice@name\ekvd@set{#4}{true}\endcsname {#1\let#5#2}% \protected\expandafter\def \csname\ekvd@choice@name\ekvd@set{#4}{false}\endcsname {#1\let#5#3}% } \ekvd@def@type{boolpair} {\ekvd@assert@twoargs{#3}\ekvd@type@boolpair{}\iftrue\iffalse{#1}#3} \ekvd@def@type{gboolpair} {\ekvd@assert@twoargs{#3}\ekvd@type@boolpair\global\iftrue\iffalse{#1}#3} \ekvd@def@type{boolpairTF} {\ekvd@assert@twoargs{#3}\ekvd@type@boolpair{}\@firstoftwo\@secondoftwo{#1}#3} \ekvd@def@type{gboolpairTF} {% \ekvd@assert@twoargs{#3}% \ekvd@type@boolpair\global\@firstoftwo\@secondoftwo{#1}#3% } \protected\def\ekvd@type@boolpair#1#2#3#4#5#6% {% \ekvd@do@new{}{#4}% \ekvd@do@new{NoVal}{#4}% \ekvd@newlet#5#3% \ekvd@newlet#6#2% \ekvd@type@choice{#4}% \protected\ekvdefNoVal\ekvd@set{#4}{#1\let#5#2#1\let#6#3}% \protected\expandafter\def \csname\ekvd@choice@name\ekvd@set{#4}{true}\endcsname {#1\let#5#2#1\let#6#3}% \protected\expandafter\def \csname\ekvd@choice@name\ekvd@set{#4}{false}\endcsname {#1\let#5#3#1\let#6#2}% } \ekvd@def@type@fwd{data} {\ekvd@type@data\@secondoftwo\edef{####2}{\ekv@unexpanded{##1}}} \ekvd@def@type@fwd{edata} {% \ekvd@type@data\@secondoftwo\edef {####2}{\ekv@unexpanded\ekv@expanded{{##1}}}% } \ekvd@def@type@fwd{gdata} {\ekvd@type@data\@secondoftwo\xdef{####2}{\ekv@unexpanded{##1}}} \ekvd@def@type@fwd{xdata} {% \ekvd@type@data\@secondoftwo\xdef {####2}{\ekv@unexpanded\ekv@expanded{{##1}}}% } \ekvd@def@type@fwd{dataT}{\ekvd@type@data\@gobble\edef{}{\ekv@unexpanded{##1}}} \ekvd@def@type@fwd{edataT} {\ekvd@type@data\@gobble\edef{}{\ekv@unexpanded\ekv@expanded{{##1}}}} \ekvd@def@type@fwd{gdataT}{\ekvd@type@data\@gobble\xdef{}{\ekv@unexpanded{##1}}} \ekvd@def@type@fwd{xdataT} {\ekvd@type@data\@gobble\xdef{}{\ekv@unexpanded\ekv@expanded{{##1}}}} \protected\def\ekvd@type@data#1#2#3#4#5#6% {% \ekvd@do@new{}{#5}% \ekvd@assert@filledarg{#6}% \ekvd@newlet#6#1% \ekvd@ifalso {% \let\ekvd@prot\protected \ekvd@add@val{#5}{\long#2#6####1#3{####1{#4}}}{}% }% {% \protected\ekvd@long\ekvdef\ekvd@set{#5}% {\long#2#6####1#3{####1{#4}}}% }% } \ekvd@def@type@fwd{box}{\ekvd@type@box{}} \ekvd@def@type@fwd{gbox}{\ekvd@type@box\global} \protected\def\ekvd@type@box#1#2#3% {% \ekvd@do@new{}{#2}% \ekvd@assert@filledarg{#3}% \ekvd@newreg#3{box}% \ekvd@ifalso {% \let\ekvd@prot\protected \ekvd@add@val{#2}{#1\setbox#3=\hbox{\begingroup##1\endgroup}}{}% }% {% \protected\ekvd@long\ekvdef\ekvd@set{#2}% {#1\setbox#3=\hbox{\begingroup##1\endgroup}}% }% } \ekvd@def@type@fwd{toks}{\ekvd@type@toks{}} \ekvd@def@type@fwd{gtoks}{\ekvd@type@toks\global} \protected\def\ekvd@type@toks#1#2#3% {% \ekvd@do@new{}{#2}% \ekvd@assert@filledarg{#3}% \ekvd@newreg#3{toks}% \ekvd@ifalso {% \let\ekvd@prot\protected \ekvd@add@val{#2}{#1#3={##1}}{}% }% {\protected\ekvd@long\ekvdef\ekvd@set{#2}{#1#3={##1}}}% } \ekvd@ifprimitive\toksapp {% \ekvd@def@type@fwd{apptoks}{\ekvd@type@preapptoks\toksapp} \ekvd@def@type@fwd{gapptoks}{\ekvd@type@preapptoks\gtoksapp} \ekvd@def@type@fwd{pretoks}{\ekvd@type@preapptoks\tokspre} \ekvd@def@type@fwd{gpretoks}{\ekvd@type@preapptoks\gtokspre} \protected\def\ekvd@type@preapptoks#1#2#3% {% \ekvd@do@new{}{#2}% \ekvd@assert@filledarg{#3}% \ekvd@newreg#3{toks}% \ekvd@ifalso {% \let\ekvd@prot\protected \ekvd@add@val{#2}{#1#3{##1}}{}% }% {\protected\ekvd@long\ekvdef\ekvd@set{#2}{#1#3{##1}}}% } } {% \ekvd@def@type@fwd{apptoks}{\ekvd@type@apptoks{}} \ekvd@def@type@fwd{gapptoks}{\ekvd@type@apptoks\global} \protected\def\ekvd@type@apptoks#1#2#3% {% \ekvd@do@new{}{#2}% \ekvd@assert@filledarg{#3}% \ekvd@newreg#3{toks}% \ekvd@ifalso {% \let\ekvd@prot\protected \ekvd@add@val{#2}{#1#3=\expandafter{\the#3##1}}{}% }% {% \protected\ekvd@long\ekvdef\ekvd@set{#2}% {#1#3=\expandafter{\the#3##1}}% }% } \ekvd@def@type@fwd{pretoks}{\ekvd@type@pretoks{}} \ekvd@def@type@fwd{gpretoks}{\ekvd@type@pretoks\global} \newtoks\ekvd@toks \protected\def\ekvd@type@pretoks#1#2#3% {% \ekvd@do@new{}{#2}% \ekvd@assert@filledarg{#3}% \ekvd@newreg#3{toks}% \ekvd@ifalso {% \let\ekvd@prot\protected \ekvd@add@val{#2}% {#1#3=\ekv@expanded{{\ekv@unexpanded{##1}\the#3}}}% {}% }% {% \protected\ekvd@long\ekvdef\ekvd@set{#2}% {#1#3=\ekv@expanded{{\ekv@unexpanded{##1}\the#3}}}% }% } } \ekvd@def@type@fwd {int}{\ekvd@type@register{count}{}{}} \ekvd@def@type@fwd{eint}{\ekvd@type@register{count}{}\numexpr} \ekvd@def@type@fwd{gint}{\ekvd@type@register{count}\global{}} \ekvd@def@type@fwd{xint}{\ekvd@type@register{count}\global\numexpr} \ekvd@def@type@fwd {dimen}{\ekvd@type@register{dimen}{}{}} \ekvd@def@type@fwd{edimen}{\ekvd@type@register{dimen}{}\dimexpr} \ekvd@def@type@fwd{gdimen}{\ekvd@type@register{dimen}\global{}} \ekvd@def@type@fwd{xdimen}{\ekvd@type@register{dimen}\global\dimexpr} \ekvd@def@type@fwd {skip}{\ekvd@type@register{skip}{}{}} \ekvd@def@type@fwd{eskip}{\ekvd@type@register{skip}{}\glueexpr} \ekvd@def@type@fwd{gskip}{\ekvd@type@register{skip}\global{}} \ekvd@def@type@fwd{xskip}{\ekvd@type@register{skip}\global\glueexpr} \protected\def\ekvd@type@register#1#2#3#4#5% {% \ekvd@do@new{}{#4}% \ekvd@assert@filledarg{#5}% \ekvd@newreg#5{#1}% \ekvd@ifalso {% \let\ekvd@prot\protected \ekvd@add@val{#4}{#2#5=#3##1\relax}{}% }% {\protected\ekvd@long\ekvdef\ekvd@set{#4}{#2#5=#3##1\relax}}% } \ekvd@def@type@fwd{store}{\ekvd@type@store\edef{\ekv@unexpanded{##1}}} \ekvd@def@type@fwd{gstore}{\ekvd@type@store\xdef{\ekv@unexpanded{##1}}} \ekvd@def@type@fwd{estore} {\ekvd@type@store\edef{\ekv@unexpanded\ekv@expanded{{##1}}}} \ekvd@def@type@fwd{xstore} {\ekvd@type@store\xdef{\ekv@unexpanded\ekv@expanded{{##1}}}} \protected\def\ekvd@type@store#1#2#3#4% {% \ekvd@do@new{}{#3}% \ekvd@assert@filledarg{#4}% \ekvd@newlet#4\ekv@empty \ekvd@ifalso {% \let\ekvd@prot\protected \ekvd@add@val{#3}{#1#4{#2}}{}% }% {\protected\ekvd@long\ekvdef\ekvd@set{#3}{#1#4{#2}}}% } \ekvd@def@type@fwd{meta} {\ekvd@type@meta{}{##1}\ekvd@add@val{{##1}}{}\ekv@exparg} \ekvd@def@type@fwd{nmeta} {% \ekvd@assert@not@long \ekvd@type@meta {NoVal}{}\ekvd@add@noval{}\ekvd@assert@not@long@also\ekv@expargtwice } \protected\long\def\ekvd@type@meta#1#2#3#4#5#6#7#8% {% \ekvd@do@new{#1}{#7}% \ekvd@assert@filledarg{#8}% #6{\ekvd@prot\ekvd@long\def\ekvd@tmp#2}{\ekvmorekv{#8}}% \ekvd@ifalso {\ekv@exparg{#3{#7}}{\ekvd@tmp#4}{#5}}% {\csname ekvlet#1\endcsname\ekvd@set{#7}\ekvd@tmp}% } \ekvd@def@type@fwd{smeta}{\ekvd@type@smeta{}{##1}\ekvd@add@val{{##1}}{}} \ekvd@def@type@fwd{snmeta} {% \ekvd@assert@not@long \ekvd@type@smeta{NoVal}{}\ekvd@add@noval{}\ekvd@assert@not@long@also } \protected\long\def\ekvd@type@smeta#1#2#3#4#5#6#7% {% \ekvd@do@new{#1}{#6}% \ekvd@assert@twoargs{#7}% \ekvd@type@smeta@#7{#2}% \ekvd@ifalso {\ekv@exparg{#3{#6}}{\ekvd@tmp#4}{#5}}% {\csname ekvlet#1\endcsname\ekvd@set{#6}\ekvd@tmp}% } \protected\long\def\ekvd@type@smeta@#1#2#3% {\ekvd@prot\ekvd@long\ekv@expargtwice{\def\ekvd@tmp#3}{\ekvset{#1}{#2}}} \protected\def\ekvd@type@choice#1% {% \ekvd@assert@not@long \ekv@expargtwice{\ekvd@prot\def\ekvd@tmp##1}% {% \expandafter\expandafter\expandafter \ekvd@h@choice \expandafter\expandafter\expandafter {\expandafter\ekvd@choice@name\expandafter{\ekvd@set}{#1}{##1}}% }% \ekvd@ifalso {% \ekvd@assert@val{#1}% \ekvd@if@not@already@choice{#1}% {% \ekv@exparg {% \expandafter\ekvd@add@aux \csname\ekv@name\ekvd@set{#1}\endcsname{{##1}}{#1}% }% {\ekvd@tmp{##1}}% {\ekvd@long\ekvdef}\ekvd@assert@not@long@also }% }% {\ekvlet\ekvd@set{#1}\ekvd@tmp}% } \ekvpNewParser{ekvd@populate@choice} \ekvpValueAlwaysRequired{ekvd@populate@choice} \ekvpDefType{ekvd@populate@choice}{protect} {\ekvd@populate@choice\protected{#1}{#3}} \ekvpDefType{ekvd@populate@choice}{unprotect}{\ekvd@populate@choice{}{#1}{#3}} \ekvpDefNoType{ekvd@populate@choice} {\ekvd@populate@choice{}{#1}{#3}} \ekvpLet{ekvd@populate@choice}{type}{protected}{protect} \ekvpLet{ekvd@populate@choice}{type}{unprotected}{unprotect} \protected\long\def\ekvd@populate@choice#1#2#3% {% #1\expandafter\edef \csname\ekvd@choice@name\ekvd@set\ekvd@set@choice{#2}\endcsname {\ekv@unexpanded{#3}}% } \ekvd@def@type{choice} {% \ekvd@do@new{}{#1}% \ekvd@assert@arg \ekvd@type@choice{#1}% \def\ekvd@set@choice{#1}% \ekvpParse@unsafe\ekvp@@p@ekvd@populate@choice{#3}% } \ekvd@def@type@fwd{choice-store} {\ekvd@type@choicespecial\ekvd@populate@choicestore} \ekvd@def@type@fwd{choice-enum} {\ekvd@type@choicespecial\ekvd@populate@choiceenum} \protected\long\def\ekvd@type@choicespecial#1#2#3% {% \ekvd@do@new{}{#2}% \ekvd@assert@twoargs{#3}% \ekvd@type@choice{#2}% \def\ekvd@set@choice{#2}% #1#3% } \protected\long\def\ekvd@populate@choicestore#1% {% \ekvd@newlet#1\ekv@empty \ekvparse{\ekvd@populate@choicestore@k#1}{\ekvd@populate@choicestore@kv#1}% } \protected\long\def\ekvd@populate@choicestore@kv#1#2#3% {% \protected\expandafter\edef \csname\ekvd@choice@name\ekvd@set\ekvd@set@choice{#2}\endcsname {\ekv@unexpanded{\edef#1{\ekv@unexpanded{#3}}}}% } \ekv@exparg{\protected\long\def\ekvd@populate@choicestore@k#1#2}% {\ekvd@populate@choicestore@kv{#1}{#2}{#2}} \protected\long\def\ekvd@populate@choiceenum#1% {% \ekvd@newreg#1{count}% \def\ekvd@tmp{0}% \ekvcsvloop{\ekvd@populate@choiceenum@#1}% } \protected\long\def\ekvd@populate@choiceenum@#1#2% {% \protected\expandafter\edef \csname\ekvd@choice@name\ekvd@set\ekvd@set@choice{#2}\endcsname {#1=\@firstofone{\ekvd@tmp} }% \edef\ekvd@tmp{\the\numexpr\ekvd@tmp+1\relax}% } \ekvd@def@type{unknown-choice} {% \ekvd@do@new@for@name{\ekvd@unknown@choice@name\ekvd@set{#1}}% \ekvd@assert@arg \ekvd@assert@not@long \ekvd@assert@not@also \ekvd@prot\expandafter \def\csname\ekvd@unknown@choice@name\ekvd@set{#1}\endcsname##1{#3}% } \ekvd@def@type{unknown} {% \ekv@ifdefined{ekvd@type@unknown@\detokenize{#1}}% {\csname ekvd@type@unknown@\detokenize{#1}\endcsname{#3}}% \ekvd@err@misused@unknown } \protected\long\def\ekvd@type@unknown@noval#1% {% \ekvd@do@new@for@name{\ekv@name\ekvd@set{}uN}% \ekvd@assert@arg \ekvd@assert@not@also \ekvd@prot\ekvd@long\ekvdefunknownNoVal\ekvd@set{#1}% } \protected\long\def\ekvd@type@unknown@code#1% {% \ekvd@do@new@for@name{\ekv@name\ekvd@set{}u}% \ekvd@assert@arg \ekvd@assert@not@also \begingroup \def\ekvd@tmp##1##2##3{#1}% \ekv@exparg {% \endgroup \ekvd@prot\ekvd@long\ekvdefunknown\ekvd@set }% {\ekvd@tmp{##2}{##1}{##3}}% } \protected\edef\ekvd@type@unknown@redirect#1% {% \expandafter\noexpand\csname ekvd@type@unknown@redirect-code\endcsname{#1}% \expandafter\noexpand\csname ekvd@type@unknown@redirect-noval\endcsname{#1}% } \protected\expandafter\def\csname ekvd@type@unknown@redirect-code\endcsname#1% {% \ekvd@do@new@for@name{\ekv@name\ekvd@set{}u}% \ekvd@assert@arg \ekvd@assert@not@also \ekvd@assert@not@protected \expandafter\ekvredirectunknown\expandafter{\ekvd@set}{#1}% } \protected\expandafter\def\csname ekvd@type@unknown@redirect-noval\endcsname#1% {% \ekvd@do@new@for@name{\ekv@name\ekvd@set{}uN}% \ekvd@assert@arg \ekvd@assert@not@also \ekvd@assert@not@protected \expandafter\ekvredirectunknownNoVal\expandafter{\ekvd@set}{#1}% } \def\ekvd@h@choice#1% {% \expandafter\ekvd@h@choice@ \csname\ifcsname#1\endcsname#1\else relax\fi\endcsname {#1}% } \def\ekvd@h@choice@#1#2% {% \ifx#1\relax \ekvd@err@choice@invalid{#2}% \expandafter\@gobble \fi #1% } \protected\long\def\ekvd@add@val#1#2#3% {% \ekvd@assert@val{#1}% \expandafter\ekvd@add@aux\csname\ekv@name\ekvd@set{#1}\endcsname{{##1}}% {#1}{#2}{\ekvd@long\ekvdef}{#3}% } \protected\long\def\ekvd@add@noval#1#2#3% {% \ekvd@assert@noval{#1}% \expandafter\ekvd@add@aux\csname\ekv@name\ekvd@set{#1}N\endcsname{}% {#1}{#2}\ekvdefNoVal{#3}% } \protected\long\def\ekvd@add@aux#1#2% {% \ekvd@extract@prefixes#1% \expandafter\ekvd@add@aux@\expandafter{#1#2}% } \protected\long\def\ekvd@add@aux@#1#2#3#4#5% {% #5% \ekvd@prot#4\ekvd@set{#2}{#1#3}% \ekvd@clear@prefixes } \protected\def\ekvd@extract@prefixes#1% {% \expandafter\ekvd@extract@prefixes@\meaning#1\ekvd@stop } \protected\def\ekvd@extract@prefixes@#1#2#3% {% \protected\def\ekvd@extract@prefixes@##1#1##2\ekvd@stop {% \ekvd@extract@prefixes@long ##1\ekvd@mark\@firstofone#2\ekvd@mark\@gobble\ekvd@stop {\let\ekvd@long\long}% \ekvd@extract@prefixes@prot ##1\ekvd@mark\@firstofone#3\ekvd@mark\@gobble\ekvd@stop {\let\ekvd@prot\protected}% }% \protected\def\ekvd@extract@prefixes@long##1#2##2\ekvd@mark##3##4\ekvd@stop {##3}% \protected\def\ekvd@extract@prefixes@prot##1#3##2\ekvd@mark##3##4\ekvd@stop {##3}% } \begingroup \edef\ekvd@tmp {% \endgroup \ekvd@extract@prefixes@ {\detokenize{macro:}}% {\string\long}% {\string\protected}% } \ekvd@tmp \protected\def\ekvd@newlet#1#2% {% \ifdefined#1% \ifx#1\relax\ekv@fi@gobble\fi\@firstofone \ekv@fi@gobble \fi \@firstofone{\let#1#2}% } \protected\def\ekvd@newreg#1#2% {% \ifdefined#1% \ifx#1\relax\ekv@fi@gobble\fi\@firstofone \ekv@fi@gobble \fi \@firstofone{\csname new#2\endcsname#1}% } \long\def\ekvd@assert@twoargs#1% {\ekvd@ifnottwoargs{#1}{\ekvd@err@missing@definition\ekvpGobbleT}{}} \long\def\ekvd@ifnottwoargs#1% {% \ekvd@ifempty@gtwo#1\ekv@ifempty@B \ekv@ifempty@false\ekv@ifempty@A\ekv@ifempty@B\@firstoftwo } \long\def\ekvd@ifempty@gtwo#1#2{\ekv@ifempty@\ekv@ifempty@A} \protected\def\ekvd@assert@val#1% {% \ekvifdefined\ekvd@set{#1}% {\expandafter\ekvd@assert@val@\csname\ekv@name\ekvd@set{#1}\endcsname}% {% \ekvifdefinedNoVal\ekvd@set{#1}% \ekvd@err@add@val@on@noval {\ekvd@err@undefined@key{#1}}% \ekvpGobbleT }% } \protected\def\ekvd@assert@val@#1% {% \expandafter\ekvd@extract@args\meaning#1\ekvd@stop \unless\ifx\ekvd@extracted@args\ekvd@one@arg@string \ekvd@err@unsupported@arg \expandafter\ekvpGobbleT \fi }% \protected\def\ekvd@assert@noval#1% {% \ekvifdefinedNoVal\ekvd@set{#1}% {\expandafter\ekvd@assert@noval@\csname\ekv@name\ekvd@set{#1}N\endcsname}% {% \ekvifdefined\ekvd@set{#1}% \ekvd@err@add@noval@on@val {\ekvd@err@undefined@key{#1}}% \ekvpGobbleT }% } \protected\def\ekvd@assert@noval@#1% {% \expandafter\ekvd@extract@args\meaning#1\ekvd@stop \unless\ifx\ekvd@extracted@args\ekv@empty \ekvd@err@unsupported@arg \expandafter\ekvpGobbleT \fi } \protected\def\ekvd@extract@args#1% {% \protected\def\ekvd@extract@args##1#1##2->##3\ekvd@stop {\def\ekvd@extracted@args{##2}}% } \expandafter\ekvd@extract@args\expandafter{\detokenize{macro:}} \edef\ekvd@one@arg@string{\string#1} \def\ekvd@assert@arg{\ekvd@ifnoarg{\ekvd@err@missing@definition\ekvpGobbleT}{}} \let\ekvd@ifnoarg\@secondoftwo \long\def\ekvd@assert@filledarg#1% {\ekvd@ifnoarg@or@empty{#1}{\ekvd@err@missing@definition\ekvpGobbleT}{}} \long\def\ekvd@ifnoarg@or@empty#1% {% \ekvd@ifnoarg \@firstoftwo {\ekv@ifempty{#1}}% } \def\ekvd@assert@not@long{\ifx\ekvd@long\long\ekvd@err@no@prefix{long}\fi} \def\ekvd@assert@not@protected {\ifx\ekvd@prot\protected\ekvd@err@no@prefix{protected}\fi} \def\ekvd@assert@not@also{\ekvd@ifalso{\ekvd@err@no@prefix{also}}{}} \def\ekvd@assert@not@long@also {\ifx\ekvd@long\long\ekvd@err@no@prefix@also{long}\fi} \def\ekvd@assert@not@protected@also {\ifx\ekvd@prot\protected\ekvd@err@no@prefix@also{protected}\fi} \def\ekvd@assert@new#1#2% {% \csname ekvifdefined#1\endcsname\ekvd@set{#2}% {\ekvd@err@not@new\ekvpGobbleT}% {}% } \def\ekvd@assert@not@new {\ifx\ekvd@do@new\ekvd@assert@new\ekvd@err@no@prefix{new}\fi} \def\ekvd@do@new@for@name#1% {% \ifx\ekvd@do@new\ekvd@assert@new \ekv@fi@firstofone \fi \@gobble{\ekv@ifdefined{#1}{\ekvd@err@not@new\ekvpGobbleT}{}}% } \protected\def\ekvd@if@not@already@choice#1% {% \expandafter\ekvd@if@not@already@choice@a \csname\ekv@name\ekvd@set{#1}\endcsname {}\ekvd@h@choice\ekvd@stop } \protected\def\ekvd@if@not@already@choice@a {% \expandafter\ekvd@if@not@already@choice@b } \long\protected\def\ekvd@if@not@already@choice@b#1\ekvd@h@choice#2\ekvd@stop {% \ekv@ifempty{#2}\@firstofone\@gobble } \long\def\ekvd@ifspace#1% {% \ekvd@ifspace@#1 \ekv@ifempty@B \ekv@ifempty@false\ekv@ifempty@A\ekv@ifempty@B\@firstoftwo } \long\def\ekvd@ifspace@#1 % keep this space {% \ekv@ifempty@\ekv@ifempty@A } \protected\long\def\ekvd@errm#1{\errmessage{expkv-def Error: #1}} \protected\def\ekvd@err@missing@definition {\ekvd@errm{Missing definition for key `\ekvd@cur'}} \protected\def\ekvd@err@missing@type {\ekvd@errm{Missing type prefix for key `\ekvd@cur'}} \protected\def\ekvd@err@undefined@prefix#1% {% \ekvd@errm {% Undefined prefix `\ekv@unexpanded{#1}' found while processing `\ekvd@cur'% }% } \protected\def\ekvd@err@undefined@key#1% {% \ekvd@errm {Undefined key `\ekv@unexpanded{#1}' found while processing `\ekvd@cur'}% } \protected\def\ekvd@err@undefined@noval#1% {% \ekvd@errm {% Undefined noval key `\ekv@unexpanded{#1}' found while processing `\ekvd@cur'% }% } \protected\def\ekvd@err@no@prefix#1% {\ekvd@errm{prefix `#1' not accepted in `\ekvd@cur'}} \protected\def\ekvd@err@no@prefix@also#1% {\ekvd@errm{`\ekvd@cur' not allowed with a `#1' key}} \protected\def\ekvd@err@add@val@on@noval {\ekvd@errm{`\ekvd@cur' not allowed with a NoVal key}} \protected\def\ekvd@err@add@noval@on@val {\ekvd@errm{`\ekvd@cur' not allowed with a value taking key}} \protected\def\ekvd@err@unsupported@arg {% \ekvd@errm {% Existing key-macro has the unsupported argument string `\ekvd@extracted@args' for key `\ekvd@cur'% }% } \protected\def\ekvd@err@not@new {\ekvd@errm{The key for `\ekvd@cur' is already defined}} \protected\long\def\ekvd@err@misused@unknown {\ekvd@errm{Misuse of the unknown type found while processing `\ekvd@cur'}} \def\ekvd@err@choice@invalid#1% {% \ekvd@err@choice@invalid@#1% } \begingroup \catcode40=8 \catcode41=8 \@firstofone{\endgroup \def\ekvd@choice@name#1#2#3% {% ekvd#1(#2)\detokenize{#3}% } \def\ekvd@unknown@choice@name#1#2% {% ekvd:u:#1(#2)% } \def\ekvd@err@choice@invalid@ ekvd#1(#2)\detokenize#3% {% \ekv@ifdefined{\ekvd@unknown@choice@name{#1}{#2}}% {\csname\ekvd@unknown@choice@name{#1}{#2}\endcsname{#3}}% {\ekvd@err{invalid choice `#3' for `#2' in set `#1'}}% } } \ekv@exparg{\long\def\ekvd@err#1}{\ekverr{expkv-def}{#1}} \catcode`\@=\ekvd@tmp %% %% %% End of file `expkv-def.tex'.