You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
622 lines
19 KiB
622 lines
19 KiB
%%
|
|
%% This is file `xkeyval.tex',
|
|
%% generated with the docstrip utility.
|
|
%%
|
|
%% The original source files were:
|
|
%%
|
|
%% xkeyval.dtx (with options: `xkvtex')
|
|
%%
|
|
%% ---------------------------------------
|
|
%% Copyright (C) 2004-2014 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'.
|
|
|