%% %% This is file `xkeyval.tex', %% generated with the docstrip utility. %% %% The original source files were: %% %% xkeyval.dtx (with options: `xkvtex') %% %% --------------------------------------- %% Copyright (C) 2004-2012 Hendri Adriaens %% --------------------------------------- %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3 %% of this license or (at your option) any later version. %% The latest version of this license is in %% http://www.latex-project.org/lppl.txt %% and version 1.3 or later is part of all distributions of LaTeX %% version 2003/12/01 or later. %% %% This work has the LPPL maintenance status "maintained". %% %% This Current Maintainer of this work is Hendri Adriaens. %% %% This work consists of the file xkeyval.dtx and derived files %% keyval.tex, xkvtxhdr.tex, xkeyval.sty, xkeyval.tex, xkvview.sty, %% xkvltxp.sty, pst-xkey.tex, pst-xkey.sty, xkveca.cls, xkvecb.cls, %% xkvesa.sty, xkvesb.sty, xkvesc.sty, xkvex1.tex, xkvex2.tex, %% xkvex3.tex and xkvex4.tex. %% %% The following files constitute the xkeyval bundle and must be %% distributed as a whole: readme, xkeyval.pdf, keyval.tex, %% pst-xkey.sty, pst-xkey.tex, xkeyval.sty, xkeyval.tex, xkvview.sty, %% xkvltxp.sty, xkvtxhdr.tex, pst-xkey.dtx and xkeyval.dtx. %% \csname XKeyValLoaded\endcsname \let\XKeyValLoaded\endinput \edef\XKVcatcodes{% \catcode`\noexpand\@\the\catcode`\@\relax \catcode`\noexpand\=\the\catcode`\=\relax \catcode`\noexpand\,\the\catcode`\,\relax \catcode`\noexpand\:\the\catcode`\:\relax \let\noexpand\XKVcatcodes\relax } \catcode`\@11\relax \catcode`\=12\relax \catcode`\,12\relax \catcode`\:12\relax \newtoks\XKV@toks \newtoks\XKV@tempa@toks \newcount\XKV@depth \newif\ifXKV@st \newif\ifXKV@sg \newif\ifXKV@pl \newif\ifXKV@knf \newif\ifXKV@rkv \newif\ifXKV@inpox \newif\ifXKV@preset \let\XKV@rm\@empty \ifx\ProvidesFile\@undefined \message{2012/10/14 v2.6b key=value parser (HA)} \input xkvtxhdr \else \ProvidesFile{xkeyval.tex}[2012/10/14 v2.6b key=value parser (HA)] \@addtofilelist{xkeyval.tex} \fi \long\def\@firstoftwo#1#2{#1} \long\def\@secondoftwo#1#2{#2} \long\def\XKV@afterfi#1\fi{\fi#1} \long\def\XKV@afterelsefi#1\else#2\fi{\fi#1} \ifx\ifcsname\@undefined\XKV@afterelsefi \def\XKV@ifundefined#1{% \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname#1\endcsname\relax \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi } \else \def\XKV@ifundefined#1{% \ifcsname#1\endcsname \expandafter\@secondoftwo \else \expandafter\@firstoftwo \fi } \fi \XKV@ifundefined{ver@keyval.sty}{ \input keyval \expandafter\def\csname ver@keyval.sty\endcsname{1999/03/16} }{} \long\def\@ifnextcharacter#1#2#3{% \@ifnextchar\bgroup {\@ifnextchar{#1}{#2}{#3}}% {\@ifncharacter{#1}{#2}{#3}}% } \long\def\@ifncharacter#1#2#3#4{% \if\string#1\string#4% \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi {#2}{#3}#4% } \long\def\XKV@for@n#1#2#3{% \XKV@tempa@toks{#1}\edef#2{\the\XKV@tempa@toks}% \ifx#2\@empty \XKV@for@break \else \expandafter\XKV@f@r \fi #2{#3}#1,\@nil,% } \long\def\XKV@f@r#1#2#3,{% \XKV@tempa@toks{#3}\edef#1{\the\XKV@tempa@toks}% \ifx#1\@nnil \expandafter\@gobbletwo \else #2\expandafter\XKV@f@r \fi #1{#2}% } \long\def\XKV@for@break #1\@nil,{\fi} \long\def\XKV@for@o#1{\expandafter\XKV@for@n\expandafter{#1}} \long\def\XKV@for@en#1#2#3{\XKV@f@r#2{#3}#1,\@nil,} \long\def\XKV@for@eo#1#2#3{% \def#2{\XKV@f@r#2{#3}}\expandafter#2#1,\@nil,% } \long\def\XKV@whilist#1#2#3\fi#4{% #3\expandafter\XKV@wh@list#1,\@nil,\@nil\@@#2#3\fi{#4}{}\fi } \long\def\XKV@wh@list#1,#2\@@#3#4\fi#5#6{% \def#3{#1}% \ifx#3\@nnil \def#3{#6}\expandafter\XKV@wh@l@st \else #4% #5\expandafter\expandafter\expandafter\XKV@wh@list \else \def#3{#6}\expandafter\expandafter\expandafter\XKV@wh@l@st \fi \fi #2\@@#3#4\fi{#5}{#1}% } \long\def\XKV@wh@l@st#1\@@#2#3\fi#4#5{} \def\XKV@addtomacro@n#1#2{% \XKV@tempa@toks\expandafter{#1#2}% \edef#1{\the\XKV@tempa@toks}% } \def\XKV@addtomacro@o#1#2{% \expandafter\XKV@addtomacro@n\expandafter#1\expandafter{#2}% } \def\XKV@addtolist@n#1#2{% \ifx#1\@empty \XKV@addtomacro@n#1{#2}% \else \XKV@addtomacro@n#1{,#2}% \fi } \def\XKV@addtolist@o#1#2{% \ifx#1\@empty \XKV@addtomacro@o#1#2% \else \XKV@addtomacro@o#1{\expandafter,#2}% \fi } \def\XKV@addtolist@x#1#2{\edef#1{#1\ifx#1\@empty\else,\fi#2}} \def\@selective@sanitize{\@testopt\@s@lective@sanitize\@M} \def\@s@lective@sanitize[#1]#2#3{% \begingroup \count@#1\relax\advance\count@\@ne \XKV@toks\expandafter{#3}% \def#3{#2}\@onelevel@sanitize#3% \edef#3{{#3}{\the\XKV@toks}}% \expandafter\@s@l@ctive@sanitize\expandafter#3#3% \expandafter\XKV@tempa@toks\expandafter{#3}% \expandafter\endgroup\expandafter\toks@\expandafter{\the\XKV@tempa@toks}% \edef#3{\the\toks@}% } \def\@s@l@ctive@sanitize#1#2#3{% \def\@i{\futurelet\@@tok\@ii}% \def\@ii{% \expandafter\@iii\meaning\@@tok\relax \ifx\@@tok\@s@l@ctive@sanitize \let\@@cmd\@gobble \else \ifx\@@tok\@sptoken \XKV@toks\expandafter{#1}\edef#1{\the\XKV@toks\space}% \def\@@cmd{\afterassignment\@i\let\@@tok= }% \else \let\@@cmd\@iv \fi \fi \@@cmd }% \def\@iii##1##2\relax{\if##1\@backslashchar\let\@@tok\relax\fi}% \def\@iv##1{% \toks@\expandafter{#1}\XKV@toks{##1}% \ifx\@@tok\bgroup \advance\count@\m@ne \ifnum\count@>\z@ \begingroup \def#1{\expandafter\@s@l@ctive@sanitize \csname\string#1\endcsname{#2}}% \expandafter#1\expandafter{\the\XKV@toks}% \XKV@toks\expandafter\expandafter\expandafter {\csname\string#1\endcsname}% \edef#1{\noexpand\XKV@toks{\the\XKV@toks}}% \expandafter\endgroup#1% \fi \edef#1{\the\toks@{\the\XKV@toks}}% \advance\count@\@ne \let\@@cmd\@i \else \edef#1{\expandafter\string\the\XKV@toks}% \expandafter\in@\expandafter{#1}{#2}% \edef#1{\the\toks@\ifin@#1\else \ifx\@@tok\@sptoken\space\else\the\XKV@toks\fi\fi}% \edef\@@cmd{\noexpand\@i\ifx\@@tok\@sptoken\the\XKV@toks\fi}% \fi \@@cmd }% \let#1\@empty\@i#3\@s@l@ctive@sanitize } \def\XKV@checksanitizea#1#2{% \XKV@ch@cksanitize{#1}#2=% \ifin@\else\XKV@ch@cksanitize{#1}#2,\fi \ifin@\@selective@sanitize[0]{,=}#2\fi } \def\XKV@checksanitizeb#1#2{% \XKV@ch@cksanitize{#1}#2,% \ifin@\@selective@sanitize[0],#2\fi } \def\XKV@ch@cksanitize#1#2#3{% \XKV@tempa@toks{#1}\edef#2{\the\XKV@tempa@toks}% \@onelevel@sanitize#2% \@expandtwoargs\in@#3{#2}% \ifin@ \def#2##1#3##2\@nil{% \XKV@tempa@toks{##2}\edef#2{\the\XKV@tempa@toks}% \ifx#2\@empty\else\in@false\fi }% #2#1#3\@nil \fi \XKV@tempa@toks{#1}\edef#2{\the\XKV@tempa@toks}% } \def\XKV@sp@deflist#1#2{% \let#1\@empty \XKV@for@n{#2}\XKV@resa{% \expandafter\KV@@sp@def\expandafter\XKV@resa\expandafter{\XKV@resa}% \XKV@addtomacro@o#1{\expandafter,\XKV@resa}% }% \ifx#1\@empty\else \def\XKV@resa,##1\@nil{\def#1{##1}}% \expandafter\XKV@resa#1\@nil \fi } \def\XKV@merge#1#2#3{% \XKV@checksanitizea{#2}\XKV@tempa \XKV@for@o\XKV@tempa\XKV@tempa{% \XKV@pltrue #3\XKV@tempa\XKV@tempb \let\XKV@tempc#1% \let#1\@empty \XKV@for@o\XKV@tempc\XKV@tempc{% #3\XKV@tempc\XKV@tempd \ifx\XKV@tempb\XKV@tempd \XKV@plfalse \XKV@addtolist@o#1\XKV@tempa \else \XKV@addtolist@o#1\XKV@tempc \fi }% \ifXKV@pl\XKV@addtolist@o#1\XKV@tempa\fi }% \ifXKV@st\global\let#1#1\fi } \def\XKV@delete#1#2#3{% \XKV@checksanitizeb{#2}\XKV@tempa \let\XKV@tempb#1% \let#1\@empty \XKV@for@o\XKV@tempb\XKV@tempb{% #3\XKV@tempb\XKV@tempc \@expandtwoargs\in@{,\XKV@tempc,}{,\XKV@tempa,}% \ifin@\else\XKV@addtolist@o#1\XKV@tempb\fi }% \ifXKV@st\global\let#1#1\fi } \def\XKV@warn#1{\message{xkeyval warning: #1}} \def\XKV@err#1{\errmessage{xkeyval error: #1}} \def\KV@errx{\XKV@err} \let\KV@err\KV@errx \def\XKV@ifstar#1{\@ifnextcharacter*{\@firstoftwo{#1}}} \def\XKV@ifplus#1{\@ifnextcharacter+{\@firstoftwo{#1}}} \def\XKV@makepf#1{% \KV@@sp@def\XKV@prefix{#1}% \def\XKV@resa{XKV}% \ifx\XKV@prefix\XKV@resa \XKV@err{`XKV' prefix is not allowed}% \let\XKV@prefix\@empty \else \edef\XKV@prefix{\ifx\XKV@prefix\@empty\else\XKV@prefix @\fi}% \fi } \def\XKV@makehd#1{% \expandafter\KV@@sp@def\expandafter\XKV@header\expandafter{#1}% \edef\XKV@header{% \XKV@prefix\ifx\XKV@header\@empty\else\XKV@header @\fi }% } \def\XKV@srstate#1#2{% \ifx\@empty#2\@empty\advance\XKV@depth\@ne\fi \XKV@for@n{XKV@prefix,XKV@fams,XKV@tkey,XKV@na,% ifXKV@st,ifXKV@pl,ifXKV@knf,CurrentOption}\XKV@resa{% \expandafter\let\csname\XKV@resa#1\expandafter \endcsname\csname\XKV@resa#2\endcsname }% \ifx\@empty#1\@empty\advance\XKV@depth\m@ne\fi } \def\XKV@testopta#1{% \XKV@ifstar{\XKV@sttrue\XKV@t@stopta{#1}}% {\XKV@stfalse\XKV@t@stopta{#1}}% } \def\XKV@t@stopta#1{\XKV@ifplus{\XKV@pltrue#1}{\XKV@plfalse#1}} \def\XKV@testoptb#1{\@testopt{\XKV@t@stoptb#1}{KV}} \def\XKV@t@stoptb#1[#2]#3{% \XKV@makepf{#2}% \XKV@makehd{#3}% \KV@@sp@def\XKV@tfam{#3}% #1% } \def\XKV@testoptc#1{\@testopt{\XKV@t@stoptc#1}{KV}} \def\XKV@t@stoptc#1[#2]#3{% \XKV@makepf{#2}% \XKV@checksanitizeb{#3}\XKV@fams \expandafter\XKV@sp@deflist\expandafter \XKV@fams\expandafter{\XKV@fams}% \@testopt#1{}% } \def\XKV@testoptd#1#2{% \XKV@testoptb{% \edef\XKV@tempa{#2\XKV@header}% \def\XKV@tempb{\@testopt{\XKV@t@stoptd#1}}% \expandafter\XKV@tempb\expandafter{\XKV@tempa}% }% } \def\XKV@t@stoptd#1[#2]#3{% \@ifnextchar[{\XKV@sttrue#1{#2}{#3}}{\XKV@stfalse#1{#2}{#3}[]}% } \def\XKV@ifcmd#1#2#3{% \def\XKV@@ifcmd##1#2##2##3\@nil##4{% \def##4{##2}\ifx##4\@nnil \def##4{##1}\expandafter\@secondoftwo \else \expandafter\@firstoftwo \fi }% \XKV@@ifcmd#1#2{\@nil}\@nil#3% } \def\XKV@getkeyname#1#2{\expandafter\XKV@g@tkeyname#1=\@nil#2} \def\XKV@g@tkeyname#1=#2\@nil#3{% \XKV@ifcmd{#1}\savevalue#3{\XKV@rkvtrue\XKV@sgfalse}{% \XKV@ifcmd{#1}\gsavevalue#3% {\XKV@rkvtrue\XKV@sgtrue}{\XKV@rkvfalse\XKV@sgfalse}% }% } \def\XKV@getsg#1#2{% \expandafter\XKV@ifcmd\expandafter{#1}\global#2\XKV@sgtrue\XKV@sgfalse } \def\XKV@define@default#1#2{% \expandafter\def\csname\XKV@header#1@default\expandafter \endcsname\expandafter{\csname\XKV@header#1\endcsname{#2}}% } \def\define@key{\XKV@testoptb\XKV@define@key} \def\XKV@define@key#1{% \@ifnextchar[{\XKV@d@fine@k@y{#1}}{% \expandafter\def\csname\XKV@header#1\endcsname####1% }% } \def\XKV@d@fine@k@y#1[#2]{% \XKV@define@default{#1}{#2}% \expandafter\def\csname\XKV@header#1\endcsname##1% } \def\define@cmdkey{\XKV@testoptd\XKV@define@cmdkey{cmd}} \def\XKV@define@cmdkey#1#2[#3]#4{% \ifXKV@st\XKV@define@default{#2}{#3}\fi \def\XKV@tempa{\expandafter\def\csname\XKV@header#2\endcsname####1}% \begingroup\expandafter\endgroup\expandafter\XKV@tempa\expandafter {\expandafter\def\csname#1#2\endcsname{##1}#4}% } \def\define@cmdkeys{\XKV@testoptd\XKV@define@cmdkeys{cmd}} \def\XKV@define@cmdkeys#1#2[#3]{% \XKV@sp@deflist\XKV@tempa{#2}% \XKV@for@o\XKV@tempa\XKV@tempa{% \edef\XKV@tempa{\noexpand\XKV@define@cmdkey{#1}{\XKV@tempa}}% \XKV@tempa[#3]{}% }% } \def\define@choicekey{\XKV@testopta{\XKV@testoptb\XKV@define@choicekey}} \def\XKV@define@choicekey#1{\@testopt{\XKV@d@fine@choicekey{#1}}{}} \def\XKV@d@fine@choicekey#1[#2]#3{% \toks@{#2}% \XKV@sp@deflist\XKV@tempa{#3}\XKV@toks\expandafter{\XKV@tempa}% \@ifnextchar[{\XKV@d@fine@ch@icekey{#1}}{\XKV@d@fine@ch@ic@key{#1}}% } \def\XKV@d@fine@ch@icekey#1[#2]{% \XKV@define@default{#1}{#2}% \XKV@d@fine@ch@ic@key{#1}% } \def\XKV@d@fine@ch@ic@key#1{% \ifXKV@pl\XKV@afterelsefi \expandafter\XKV@d@f@ne@ch@ic@k@y \else\XKV@afterfi \expandafter\XKV@d@f@ne@ch@ic@key \fi \csname\XKV@header#1\endcsname } \def\XKV@d@f@ne@ch@ic@key#1#2{\XKV@d@f@n@@ch@ic@k@y#1{{#2}}} \def\XKV@d@f@ne@ch@ic@k@y#1#2#3{\XKV@d@f@n@@ch@ic@k@y#1{{#2}{#3}}} \def\XKV@d@f@n@@ch@ic@k@y#1#2{% \edef#1##1{% \ifXKV@st\noexpand\XKV@sttrue\else\noexpand\XKV@stfalse\fi \ifXKV@pl\noexpand\XKV@pltrue\else\noexpand\XKV@plfalse\fi \noexpand\XKV@checkchoice[\the\toks@]{##1}{\the\XKV@toks}% }% \def\XKV@tempa{\def#1####1}% \expandafter\XKV@tempa\expandafter{#1{##1}#2}% } \def\define@boolkey{\XKV@t@stopta{\XKV@testoptd\XKV@define@boolkey{}}} \def\XKV@define@boolkey#1#2[#3]{% \ifXKV@pl\XKV@afterelsefi \expandafter\XKV@d@f@ne@boolkey \else\XKV@afterfi \expandafter\XKV@d@fine@boolkey \fi \csname\XKV@header#2\endcsname{#2}{#1#2}{#3}% } \def\XKV@d@fine@boolkey#1#2#3#4#5{% \XKV@d@f@ne@b@olkey#1{#2}{#3}{#4}% {{\csname#3\XKV@resa\endcsname#5}}% } \def\XKV@d@f@ne@boolkey#1#2#3#4#5#6{% \XKV@d@f@ne@b@olkey#1{#2}{#3}{#4}% {{\csname#3\XKV@resa\endcsname#5}{#6}}% } \def\XKV@d@f@ne@b@olkey#1#2#3#4#5{% \expandafter\newif\csname if#3\endcsname \ifXKV@st\XKV@define@default{#2}{#4}\fi \ifXKV@pl \def#1##1{\XKV@pltrue\XKV@sttrue \XKV@checkchoice[\XKV@resa]{##1}{true,false}#5% }% \else \def#1##1{\XKV@plfalse\XKV@sttrue \XKV@checkchoice[\XKV@resa]{##1}{true,false}#5% }% \fi } \def\define@boolkeys{\XKV@plfalse\XKV@testoptd\XKV@define@boolkeys{}} \def\XKV@define@boolkeys#1#2[#3]{% \XKV@sp@deflist\XKV@tempa{#2}% \XKV@for@o\XKV@tempa\XKV@tempa{% \expandafter\XKV@d@fine@boolkeys\expandafter{\XKV@tempa}{#1}{#3}% }% } \def\XKV@d@fine@boolkeys#1#2#3{% \expandafter\XKV@d@f@ne@b@olkey\csname\XKV@header#1\endcsname {#1}{#2#1}{#3}{{\csname#2#1\XKV@resa\endcsname}}% } \def\XKV@cc{\XKV@testopta{\@testopt\XKV@checkchoice{}}} \def\XKV@checkchoice[#1]#2#3{% \def\XKV@tempa{#1}% \ifXKV@st\lowercase{\fi \ifx\XKV@tempa\@empty \def\XKV@tempa{\XKV@ch@ckch@ice\@nil{#2}{#3}}% \else \def\XKV@tempa{\XKV@ch@ckchoice#1\@nil{#2}{#3}}% \fi \ifXKV@st}\fi\XKV@tempa } \def\XKV@ch@ckchoice#1#2\@nil#3#4{% \def\XKV@tempa{#2}% \ifx\XKV@tempa\@empty\XKV@afterelsefi \XKV@ch@ckch@ice#1{#3}{#4}% \else\XKV@afterfi \XKV@@ch@ckchoice#1#2{#3}{#4}% \fi } \def\XKV@ch@ckch@ice#1#2#3{% \def\XKV@tempa{#1}% \ifx\XKV@tempa\@nnil\let\XKV@tempa\@empty\else \def\XKV@tempa{\def#1{#2}}% \fi \in@{,#2,}{,#3,}% \ifin@ \ifXKV@pl \XKV@addtomacro@n\XKV@tempa\@firstoftwo \else \XKV@addtomacro@n\XKV@tempa\@firstofone \fi \else \ifXKV@pl \XKV@addtomacro@n\XKV@tempa\@secondoftwo \else \XKV@toks{#2}% \XKV@err{value `\the\XKV@toks' is not allowed}% \XKV@addtomacro@n\XKV@tempa\@gobble \fi \fi \XKV@tempa } \def\XKV@@ch@ckchoice#1#2#3#4{% \edef\XKV@tempa{\the\count@}\count@\z@ \def\XKV@tempb{#3}% \def\XKV@tempc##1,{% \def#1{##1}% \ifx#1\@nnil \def#1{#3}\def#2{-1}\count@\XKV@tempa \ifXKV@pl \let\XKV@tempd\@secondoftwo \else \XKV@toks{#3}% \XKV@err{value `\the\XKV@toks' is not allowed}% \let\XKV@tempd\@gobble \fi \else \ifx#1\XKV@tempb \edef#2{\the\count@}\count@\XKV@tempa \ifXKV@pl \let\XKV@tempd\XKV@@ch@ckch@ice \else \let\XKV@tempd\XKV@@ch@ckch@ic@ \fi \else \advance\count@\@ne \let\XKV@tempd\XKV@tempc \fi \fi \XKV@tempd }% \XKV@tempc#4,\@nil,% } \def\XKV@@ch@ckch@ice#1\@nil,{\@firstoftwo} \def\XKV@@ch@ckch@ic@#1\@nil,{\@firstofone} \def\key@ifundefined{\@testopt\XKV@key@ifundefined{KV}} \def\XKV@key@ifundefined[#1]#2{% \XKV@makepf{#1}% \XKV@checksanitizeb{#2}\XKV@fams \expandafter\XKV@sp@deflist\expandafter \XKV@fams\expandafter{\XKV@fams}% \XKV@key@if@ndefined } \def\XKV@key@if@ndefined#1{% \XKV@knftrue \KV@@sp@def\XKV@tkey{#1}% \XKV@whilist\XKV@fams\XKV@tfam\ifXKV@knf\fi{% \XKV@makehd\XKV@tfam \XKV@ifundefined{\XKV@header\XKV@tkey}{}{\XKV@knffalse}% }% \ifXKV@knf \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi } \def\disable@keys{\XKV@testoptb\XKV@disable@keys} \def\XKV@disable@keys#1{% \XKV@checksanitizeb{#1}\XKV@tempa \XKV@for@o\XKV@tempa\XKV@tempa{% \XKV@ifundefined{\XKV@header\XKV@tempa}{% \XKV@err{key `\XKV@tempa' undefined}% }{% \edef\XKV@tempb{% \noexpand\XKV@warn{key `\XKV@tempa' has been disabled}% }% \XKV@ifundefined{\XKV@header\XKV@tempa @default}{% \edef\XKV@tempc{\noexpand\XKV@define@key{\XKV@tempa}}% }{% \edef\XKV@tempc{\noexpand\XKV@define@key{\XKV@tempa}[]}% }% \expandafter\XKV@tempc\expandafter{\XKV@tempb}% }% }% } \def\presetkeys{\XKV@stfalse\XKV@testoptb\XKV@presetkeys} \def\gpresetkeys{\XKV@sttrue\XKV@testoptb\XKV@presetkeys} \def\XKV@presetkeys#1#2{% \XKV@pr@setkeys{#1}{preseth}% \XKV@pr@setkeys{#2}{presett}% } \def\XKV@pr@setkeys#1#2{% \XKV@ifundefined{XKV@\XKV@header#2}{% \XKV@checksanitizea{#1}\XKV@tempa \ifXKV@st\expandafter\global\fi\expandafter\def\csname XKV@\XKV@header#2\expandafter\endcsname\expandafter{\XKV@tempa}% }{% \expandafter\XKV@merge\csname XKV@\XKV@header #2\endcsname{#1}\XKV@getkeyname }% } \def\delpresetkeys{\XKV@stfalse\XKV@testoptb\XKV@delpresetkeys} \def\gdelpresetkeys{\XKV@sttrue\XKV@testoptb\XKV@delpresetkeys} \def\XKV@delpresetkeys#1#2{% \XKV@d@lpresetkeys{#1}{preseth}% \XKV@d@lpresetkeys{#2}{presett}% } \def\XKV@d@lpresetkeys#1#2{% \XKV@ifundefined{XKV@\XKV@header#2}{% \XKV@err{no presets defined for `\XKV@header'}% }{% \expandafter\XKV@delete\csname XKV@\XKV@header #2\endcsname{#1}\XKV@getkeyname }% } \def\unpresetkeys{\XKV@stfalse\XKV@testoptb\XKV@unpresetkeys} \def\gunpresetkeys{\XKV@sttrue\XKV@testoptb\XKV@unpresetkeys} \def\XKV@unpresetkeys{% \XKV@ifundefined{XKV@\XKV@header preseth}{% \XKV@err{no presets defined for `\XKV@header'}% }{% \ifXKV@st\expandafter\global\fi\expandafter\let \csname XKV@\XKV@header preseth\endcsname\@undefined \ifXKV@st\expandafter\global\fi\expandafter\let \csname XKV@\XKV@header presett\endcsname\@undefined }% } \def\savekeys{\XKV@stfalse\XKV@testoptb\XKV@savekeys} \def\gsavekeys{\XKV@sttrue\XKV@testoptb\XKV@savekeys} \def\XKV@savekeys#1{% \XKV@ifundefined{XKV@\XKV@header save}{% \XKV@checksanitizeb{#1}\XKV@tempa \ifXKV@st\expandafter\global\fi\expandafter\def\csname XKV@% \XKV@header save\expandafter\endcsname\expandafter{\XKV@tempa}% }{% \expandafter\XKV@merge\csname XKV@\XKV@header save\endcsname{#1}\XKV@getsg }% } \def\delsavekeys{\XKV@stfalse\XKV@testoptb\XKV@delsavekeys} \def\gdelsavekeys{\XKV@sttrue\XKV@testoptb\XKV@delsavekeys} \def\XKV@delsavekeys#1{% \XKV@ifundefined{XKV@\XKV@header save}{% \XKV@err{no save keys defined for `\XKV@header'}% }{% \expandafter\XKV@delete\csname XKV@\XKV@header save\endcsname{#1}\XKV@getsg }% } \def\unsavekeys{\XKV@stfalse\XKV@testoptb\XKV@unsavekeys} \def\gunsavekeys{\XKV@sttrue\XKV@testoptb\XKV@unsavekeys} \def\XKV@unsavekeys{% \XKV@ifundefined{XKV@\XKV@header save}{% \XKV@err{no save keys defined for `\XKV@header'}% }{% \ifXKV@st\expandafter\global\fi\expandafter\let \csname XKV@\XKV@header save\endcsname\@undefined }% } \def\setkeys{\XKV@testopta{\XKV@testoptc\XKV@setkeys}} \def\XKV@setkeys[#1]#2{% \XKV@checksanitizea{#2}\XKV@resb \let\XKV@naa\@empty \XKV@for@o\XKV@resb\XKV@tempa{% \expandafter\XKV@g@tkeyname\XKV@tempa=\@nil\XKV@tempa \XKV@addtolist@x\XKV@naa\XKV@tempa }% \ifnum\XKV@depth=\z@\let\XKV@rm\@empty\fi \XKV@usepresetkeys{#1}{preseth}% \expandafter\XKV@s@tkeys\expandafter{\XKV@resb}{#1}% \XKV@usepresetkeys{#1}{presett}% \let\CurrentOption\@empty } \def\XKV@usepresetkeys#1#2{% \XKV@presettrue \XKV@for@eo\XKV@fams\XKV@tfam{% \XKV@makehd\XKV@tfam \XKV@ifundefined{XKV@\XKV@header#2}{}{% \XKV@toks\expandafter\expandafter\expandafter {\csname XKV@\XKV@header#2\endcsname}% \@expandtwoargs\XKV@s@tkeys{\the\XKV@toks}% {\XKV@naa\ifx\XKV@naa\@empty\else,\fi#1}% }% }% \XKV@presetfalse } \def\XKV@s@tkeys#1#2{% \XKV@sp@deflist\XKV@na{#2}% \XKV@for@n{#1}\CurrentOption{% \expandafter\XKV@s@tk@ys\CurrentOption==\@nil }% } \def\XKV@s@tk@ys#1=#2=#3\@nil{% \XKV@g@tkeyname#1=\@nil\XKV@tkey \expandafter\KV@@sp@def\expandafter\XKV@tkey\expandafter{\XKV@tkey}% \ifx\XKV@tkey\@empty \XKV@toks{#2}% \ifcat$\the\XKV@toks$\else \XKV@err{no key specified for value `\the\XKV@toks'}% \fi \else \@expandtwoargs\in@{,\XKV@tkey,}{,\XKV@na,}% \ifin@\else \XKV@knftrue \KV@@sp@def\XKV@tempa{#2}% \ifXKV@preset\XKV@s@tk@ys@{#3}\else \ifXKV@pl \XKV@for@eo\XKV@fams\XKV@tfam{% \XKV@makehd\XKV@tfam \XKV@s@tk@ys@{#3}% }% \else \XKV@whilist\XKV@fams\XKV@tfam\ifXKV@knf\fi{% \XKV@makehd\XKV@tfam \XKV@s@tk@ys@{#3}% }% \fi \fi \ifXKV@knf \ifXKV@inpox \ifx\XKV@doxs\relax \ifx\@currext\@clsextension\else \let\CurrentOption\XKV@tkey\@unknownoptionerror \fi \else\XKV@doxs\fi \else \ifXKV@st \XKV@addtolist@o\XKV@rm\CurrentOption \else \XKV@err{`\XKV@tkey' undefined in families `\XKV@fams'}% \fi \fi \else \ifXKV@inpox\ifx\XKV@testclass\XKV@documentclass \expandafter\XKV@useoption\expandafter{\CurrentOption}% \fi\fi \fi \fi \fi } \def\XKV@s@tk@ys@#1{% \XKV@ifundefined{\XKV@header\XKV@tkey}{}{% \XKV@knffalse \XKV@ifundefined{XKV@\XKV@header save}{}{% \expandafter\XKV@testsavekey\csname XKV@\XKV@header save\endcsname\XKV@tkey }% \ifXKV@rkv \ifXKV@sg\expandafter\global\fi\expandafter\let \csname XKV@\XKV@header\XKV@tkey @value\endcsname\XKV@tempa \fi \expandafter\XKV@replacepointers\expandafter{\XKV@tempa}% \ifx\@empty#1\@empty\XKV@afterelsefi \XKV@ifundefined{\XKV@header\XKV@tkey @default}{% \XKV@err{no value specified for key `\XKV@tkey'}% }{% \expandafter\expandafter\expandafter\XKV@default \csname\XKV@header\XKV@tkey @default\endcsname\@nil }% \else\XKV@afterfi \XKV@srstate{@\romannumeral\XKV@depth}{}% \csname\XKV@header\XKV@tkey\expandafter \endcsname\expandafter{\XKV@tempa}\relax \XKV@srstate{}{@\romannumeral\XKV@depth}% \fi }% } \def\XKV@testsavekey#1#2{% \ifXKV@rkv\else \XKV@for@o#1\XKV@resa{% \expandafter\XKV@ifcmd\expandafter{\XKV@resa}\global\XKV@resa{% \ifx#2\XKV@resa \XKV@rkvtrue\XKV@sgtrue \fi }{% \ifx#2\XKV@resa \XKV@rkvtrue\XKV@sgfalse \fi }% }% \fi } \def\XKV@replacepointers#1{% \let\XKV@tempa\@empty \let\XKV@resa\@empty \XKV@r@placepointers#1\usevalue\@nil } \def\XKV@r@placepointers#1\usevalue#2{% \XKV@addtomacro@n\XKV@tempa{#1}% \def\XKV@tempb{#2}% \ifx\XKV@tempb\@nnil\else\XKV@afterfi \XKV@ifundefined{XKV@\XKV@header#2@value}{% \XKV@err{no value recorded for key `#2'; ignored}% \XKV@r@placepointers }{% \@expandtwoargs\in@{,#2,}{,\XKV@resa,}% \ifin@\XKV@afterelsefi \XKV@err{back linking pointers; pointer replacement canceled}% \else\XKV@afterfi \XKV@addtolist@x\XKV@resa{#2}% \expandafter\expandafter\expandafter\XKV@r@placepointers \csname XKV@\XKV@header#2@value\endcsname \fi }% \fi } \def\XKV@default#1#2\@nil{% \expandafter\edef\expandafter\XKV@tempa \expandafter{\expandafter\@gobble\string#1}% \edef\XKV@tempb{\XKV@header\XKV@tkey}% \@onelevel@sanitize\XKV@tempb \ifx\XKV@tempa\XKV@tempb \begingroup \expandafter\def\csname\XKV@header\XKV@tkey\endcsname##1{% \gdef\XKV@tempa{##1}% }% \csname\XKV@header\XKV@tkey @default\endcsname \endgroup \XKV@ifundefined{XKV@\XKV@header save}{}{% \expandafter\XKV@testsavekey\csname XKV@\XKV@header save\endcsname\XKV@tkey }% \ifXKV@rkv \ifXKV@sg\expandafter\global\fi\expandafter\let \csname XKV@\XKV@header\XKV@tkey @value\endcsname\XKV@tempa \fi \expandafter\XKV@replacepointers\expandafter {\XKV@tempa}\XKV@afterelsefi \XKV@srstate{@\romannumeral\XKV@depth}{}% \expandafter#1\expandafter{\XKV@tempa}\relax \XKV@srstate{}{@\romannumeral\XKV@depth}% \else\XKV@afterfi \XKV@srstate{@\romannumeral\XKV@depth}{}% \csname\XKV@header\XKV@tkey @default\endcsname\relax \XKV@srstate{}{@\romannumeral\XKV@depth}% \fi } \def\setrmkeys{\XKV@testopta{\XKV@testoptc\XKV@setrmkeys}} \def\XKV@setrmkeys[#1]{% \def\XKV@tempa{\XKV@setkeys[#1]}% \expandafter\XKV@tempa\expandafter{\XKV@rm}% } \XKVcatcodes \endinput %% %% End of file `xkeyval.tex'.