Current File : //usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkeyval.tex |
%%
%% This is file `xkeyval.tex',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% xkeyval.dtx (with options: `xkvtex')
%%
%% ---------------------------------------
%% Copyright (C) 2004-2020 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, xkvutils.tex, 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, xkvutils.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
\input xkvutils
\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{2014/12/03 v2.7a key=value parser (HA)}
\input xkvtxhdr
\else
\ProvidesFile{xkeyval.tex}[2014/12/03 v2.7a key=value parser (HA)]
\@addtofilelist{xkeyval.tex}
\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}
\long\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}}{%
\long\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}}
\long\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
}
\long\def\XKV@s@tkeys#1#2{%
\XKV@sp@deflist\XKV@na{#2}%
\XKV@for@n{#1}\CurrentOption{%
\expandafter\XKV@s@tk@ys\CurrentOption==\@nil
}%
}
\long\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
}
\long\def\XKV@replacepointers#1{%
\let\XKV@tempa\@empty
\let\XKV@resa\@empty
\XKV@r@placepointers#1\usevalue\@nil
}
\long\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'.