summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/skeyval/skeyval.sty
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2012-10-17 22:50:05 +0000
committerKarl Berry <karl@freefriends.org>2012-10-17 22:50:05 +0000
commitdf2ce83ed9a6a3beca08c07cc656611e26d220d7 (patch)
tree086e2f15b6585eb8151e83f7852eb858db2f4b80 /Master/texmf-dist/tex/latex/skeyval/skeyval.sty
parent468e15f0c59bbedcccfaa606c1f72d3b6d3a8f9a (diff)
skeyval
git-svn-id: svn://tug.org/texlive/trunk@28005 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/skeyval/skeyval.sty')
-rw-r--r--Master/texmf-dist/tex/latex/skeyval/skeyval.sty3766
1 files changed, 694 insertions, 3072 deletions
diff --git a/Master/texmf-dist/tex/latex/skeyval/skeyval.sty b/Master/texmf-dist/tex/latex/skeyval/skeyval.sty
index e82d269e76f..38871851cd1 100644
--- a/Master/texmf-dist/tex/latex/skeyval/skeyval.sty
+++ b/Master/texmf-dist/tex/latex/skeyval/skeyval.sty
@@ -1,6 +1,5 @@
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
-% %
-% This is file 'skeyval.sty', version 0.72. %
+% This is file 'skeyval.sty', version 1.1, 2012/10/15. %
% %
% This package and accompanying files may be distributed and/or %
% modified under the conditions of the LaTeX Project Public License, %
@@ -16,3167 +15,790 @@
% implied warranties of merchantability and fitness for a particular %
% purpose. %
% %
-% Copyright (c) 2010 Ahmed Musa (a.musa@rocketmail.com). %
+% The following files constitute the skeyval bundle and must be %
+% distributed as a whole: %
+% %
+% readme, skeyval.sty, skeyval-core.tex, skeyval-for.tex, %
+% skeyval-view.sty, skeyval-ltxpatch.sty, skeyval-ltxcmds.tex, %
+% skeyval-pstkey.sty, skeyval-pstkey.tex, skeyval-testclass.cls, %
+% and skeyval-testpkg.sty. %
% %
+% Copyright (c) 2010-2012 Ahmed Musa (amusa22@gmail.com). %
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
\begingroup
-\catcode064 11% @
-\catcode123 01% {
-\catcode125 02% }
-\def\SKV@tempa{\endgroup
- \edef\SKV@restorecodes{%
- \catcode035 \the\catcode035% #
- \catcode064 \the\catcode064% @
- \catcode123 \the\catcode123% {
- \catcode125 \the\catcode125% }
- \catcode061 \the\catcode061% =
- }%
-}
-\SKV@tempa
-\catcode035 06% #
-\catcode061 12% =
-\catcode064 11% @
-\catcode123 01% {
-\catcode125 02% }
-\def\SKV@setcode#1#2{%
- \edef\SKV@restorecodes{%
- \SKV@restorecodes
- \catcode#1 \the\catcode#1\relax
- }%
- \catcode#1 #2\relax
-}
-\AtEndOfPackage{%
- \SKV@AfterPackageEnd{%
- \SKV@restorecodes
- \SKV@Undef!{\SKV@setcode\SKV@restorecodes}%
- }%
-}
-\SKV@setcode{010}{12}% ^^J
-\SKV@setcode{032}{10}% SP
-\SKV@setcode{033}{12}% !
-\SKV@setcode{036}{03}% $
-\SKV@setcode{038}{03}% &
-\SKV@setcode{040}{12}% (
-\SKV@setcode{041}{12}% )
-\SKV@setcode{042}{12}% *
-\SKV@setcode{043}{12}% +
-\SKV@setcode{044}{12}% ,
-\SKV@setcode{045}{12}% -
-\SKV@setcode{047}{12}% /
-\SKV@setcode{058}{12}% :
-\SKV@setcode{059}{12}% ;
-\SKV@setcode{060}{12}% >
-\SKV@setcode{062}{12}% <
-\SKV@setcode{063}{12}% ?
-\SKV@setcode{091}{12}% [
-\SKV@setcode{093}{12}% ]
-\SKV@setcode{096}{12}% `
-\SKV@setcode{126}{13}% ~
-\def\SKV@rcsid$#1: #2 #3 #4 #5${#4 v#3}
-\ProvidesPackage{skeyval}[%
- \SKV@rcsid $Id: skeyval.sty,v 0.72 2010/05/21 09:00:00 Ahmed Musa $
- Extensions to the xkeyval parser (AM)
-]
-\NeedsTeXFormat{LaTeX2e}[1996/12/01]
-\ifnum0=0%
- \ifx\eTeXversion\SKV@undefined1\else\ifnum\eTeXversion<\tw@1\fi\fi
-\else
- \PackageError{skeyval}{eTeX not loaded or old version}%
- {This package requires eTeX version 2 or later.}%
- \endinput
-\fi
-\newtoks\SKV@toks
-\newcount\SKV@depth
-\protected\def\@nil{\@nil}
-\def\@nnil{\@nil}
-\def\@space{ }
-\long\def\@firstofthree#1#2#3{#1}
-\long\def\@secondofthree#1#2#3{#2}
-\long\def\@thirdofthree#1#2#3{#3}
-\long\def\@gobblethree#1#2#3{}
-\long\def\SKV@car#1#2\@nil{#1}
-\long\def\SKV@cdr#1#2\@nil{#2}
-\long\def\SKV@carcube#1#2#3#4\@nil{#1#2#3}
-\def\SKV@threexp{\expandafter\expandafter\expandafter}
-\def\SKV@aftercs#1#2{\expandafter#1\csname#2\endcsname}
-\def\SKV@xaftercs#1#2{\SKV@threexp#1\csname#2\endcsname}
-\SKV@aftercs\let{SKV@1of1}\@firstofone
-\SKV@aftercs\let{SKV@1of2}\@firstoftwo
-\SKV@aftercs\let{SKV@2of2}\@secondoftwo
-\SKV@aftercs\let{SKV@1of3}\@firstofthree
-\SKV@aftercs\let{SKV@2of3}\@secondofthree
-\SKV@aftercs\let{SKV@3of3}\@thirdofthree
-\def\SKV@ifx#1#2{\@nameuse{SKV@\ifx#1#21\else2\fi of2}}
-\def\SKV@unifx#1#2{\@nameuse{SKV@\ifx#1#22\else1\fi of2}}
-\def\SKV@csifx#1#2{\begingroup\expandafter\endgroup\expandafter
- \SKV@ifx\csname#1\endcsname#2}
-\def\SKV@uncsifx#1#2{\begingroup\expandafter\endgroup\expandafter
- \SKV@unifx\csname#1\endcsname#2}
-\def\SKV@ifxcs#1#2{\begingroup\expandafter\endgroup\expandafter
- \SKV@ifx\expandafter#1\csname#2\endcsname}
-\def\SKV@unifxcs#1#2{\begingroup\expandafter\endgroup\expandafter
- \SKV@unifx\expandafter#1\csname#2\endcsname}
-\def\SKV@ifdefined#1{\@nameuse{SKV@\ifdefined#11\else2\fi of2}}
-\def\SKV@oifdefined#1{\@nameuse{SKV@\expandafter\SKV@ifdefined#1{1}{2}of2}}
-\def\SKV@unifdefined#1{\@nameuse{SKV@\SKV@ifdefined{#1}{2}{1}of2}}
-\def\SKV@ifcsname#1{\@nameuse{SKV@\ifcsname#1\endcsname1\else2\fi of2}}
-\def\SKV@unifcsname#1{\@nameuse{SKV@\SKV@ifcsname{#1}{2}{1}of2}}
-\def\SKV@ifnum#1#2#3{\@nameuse{SKV@\ifnum#1#2#3 1\else2\fi of2}}
-\protected\def\SKV@AtEndAfterPackageEnd#1{\AtEndOfPackage
- {\SKV@AfterPackageEnd{#1}}}
-\begingroup
-\def\SKV@tempa{%
- \def\SKV@nodocerr{%
- \PackageError{skeyval}{'skeyval' package loaded before
- \string\documentclass}{Load skeyval package after
- \string\documentclass.}%
- \endinput
- }%
- \def\SKV@tempb##1\@nil,{}%
- \def\SKV@tempa##1,{%
- \def\@currname{##1}%
- \SKV@ifx\SKV@documentclass\SKV@undefined{%
- \SKV@ifx\@currname\@nnil{}{%
- \filename@parse\@currname
- \SKV@unifx\filename@ext\@clsextension{}{%
- \SKV@unifcsname{opt@\filename@area\filename@base.%
- \filename@ext}{}{%
- \edef\SKV@documentclass{\filename@area%
- \filename@base.\filename@ext}%
- }%
- }%
- \SKV@tempa
- }%
- }{%
- \let\SKV@tempa\SKV@tempb\SKV@tempa
- }%
- }%
- \SKV@ifx\@filelist\relax\SKV@nodocerr{%
- \SKV@ifx\@filelist\@gobble\SKV@nodocerr{%
- \expandafter\SKV@tempa\@filelist,\@nil,%
- }%
- }%
- \SKV@ifx\SKV@documentclass\SKV@undefined\SKV@nodocerr\relax
-}
-\SKV@tempa\endgroup
-\def\SKV@notdefinable{%
- \PackageError{skeyval}%
- {Command '\@backslashchar\resvd@a' not definable,
- \MessageBreak or name '\@backslashchar\@qend...' illegal}%
- {Command '\@backslashchar\resvd@a' already defined.}%
-}
-\def\SKV@ifdefinable#1{%
- \begingroup
- \escapechar92\relax
- \xdef\resvd@a{\expandafter\@gobble\string#1}%
- \edef\resvd@b{\expandafter\SKV@car\string#1\@nil}%
- \SKV@ifx\resvd@b\@backslashchar{}{%
- \PackageError{skeyval}{Backslash required}{Backslash
- required in argument of '\string\SKV@ifdefinable'.}%
- }%
- \SKV@ifdefined#1{%
- \SKV@ifx{#1}\relax{\aftergroup\@firstofone}%
- {\aftergroup\SKV@notdefinable}%
- }{%
- \edef\resvd@b{\unexpanded\expandafter{\csname end\resvd@a\endcsname}}%
- \expandafter\SKV@ifx\resvd@b\relax{%
- \SKV@ifx\resvd@a\@qrelax{\aftergroup\SKV@notdefinable}%
- {\aftergroup\@firstofone}
- }{\aftergroup\SKV@notdefinable}%
- }%
- \endgroup
-}
-\def\SKV@csifdefinable#1{\begingroup\expandafter\endgroup
- \expandafter\SKV@ifdefinable\csname#1\endcsname}
-\newcommand*\@ifpackagecurrent[2]{%
- \@nameuse{SKV@\ifnum\SKV@threexp\@parse@version
- \csname ver@#1.\@pkgextension\endcsname//00\@nil
- <\expandafter\@parse@version#2//00\@nil2\else1\fi of2}%
-}
-\newcommand*\@ifpackagenotcurrent[2]{%
- \@nameuse{SKV@\@ifpackagecurrent{#1}{#2}{2}{1}of2}}
-\newcommand*\@ifloadedandcurrent[2]{%
- \begingroup
- \@ifpackageloaded{#1}{%
- \@ifpackagecurrent{#1}{#2}{\aftergroup\@firstofthree}{%
- \aftergroup\@secondofthree}}{\aftergroup\@thirdofthree}%
- \endgroup
-}
-\@ifloadedandcurrent{xkeyval}{2008/08/13}{}{%
- \PackageError{skeyval}%
- {Your loaded version of xkeyval package is not current}%
- {You need version 2.6a (or higher) of xkeyval package.}%
- \endinput
-}{\RequirePackage{xkeyval}[2008/08/13]}
-\newcommand*\SKV@ifdefinable@n[1]{%
- \XKV@sp@deflist\SKV@tempa{#1}%
- \XKV@for@o\SKV@tempa\SKV@tempa{%
- \edef\resvd@a{\SKV@threexp\SKV@car
- \expandafter\string\SKV@tempa\@nil}%
- \SKV@unifx\resvd@a\@backslashchar{}{%
- \PackageError{skeyval}{Backslash not allowed}{Backslash not
- allowed in argument of '\string\SKV@ifdefinable@n'.}%
- }%
- \SKV@csifdefinable\SKV@tempa\relax
- }%
-}
-\SKV@ifdefinable@n{SKV@def,SKV@d@f,SKV@pdef,SKV@pd@f}
-\protected\def\SKV@def{\@star@or@long\SKV@d@f}
-\def\SKV@d@f#1{\SKV@ifdefinable#1{\l@ngrel@x\def#1}}
-\protected\def\SKV@pdef{\@star@or@long\SKV@pd@f}
-\def\SKV@pd@f#1{\SKV@ifdefinable#1{\l@ngrel@x\protected\def#1}}
-\SKV@pdef*\SKV@gdef{\@star@or@long\SKV@gd@f}
-\SKV@def*\SKV@gd@f#1{\SKV@ifdefinable#1{\l@ngrel@x\gdef#1}}
-\SKV@pdef*\SKV@edef{\@star@or@long\SKV@ed@f}
-\SKV@def*\SKV@ed@f#1{\SKV@ifdefinable#1{\l@ngrel@x\edef#1}}
-\SKV@pdef*\SKV@pgdef{\@star@or@long\SKV@pgd@f}
-\SKV@def*\SKV@pgd@f#1{\SKV@ifdefinable#1{\l@ngrel@x\protected\gdef#1}}
-\SKV@pdef*\SKV@pedef{\@star@or@long\SKV@ped@f}
-\SKV@def*\SKV@ped@f#1{\SKV@ifdefinable#1{\l@ngrel@x\protected\edef#1}}
-\SKV@pdef*\SKV@pxdef{\@star@or@long\SKV@pxd@f}
-\SKV@def*\SKV@pxd@f#1{\SKV@ifdefinable#1{\l@ngrel@x\protected\xdef#1}}
-\SKV@pdef*\SKV@redef{\@star@or@long\SKV@red@f}
-\SKV@def*\SKV@red@f#1{%
- \SKV@ensurescape{#1}%
- \SKV@unifdefined{#1}{}{%
- \SKV@ifx{#1}\relax{}{%
- \SKV@vbmsg{info}{Command '\string#1' redefined\on@line}%
- }%
- }%
- \l@ngrel@x\def#1%
-}
-\SKV@pdef*\SKV@csredef{\SKV@aftercs\SKV@redef}
-\SKV@pdef*\SKV@predef{\@star@or@long\SKV@pred@f}
-\SKV@def*\SKV@pred@f#1{%
- \SKV@ensurescape{#1}%
- \SKV@unifdefined{#1}{}{%
- \SKV@ifx{#1}\relax{}{%
- \SKV@vbmsg{info}{Command '\string#1' redefined\on@line}%
- }%
- }%
- \l@ngrel@x\protected\def#1%
-}
-\SKV@pdef*\SKV@cspredef{\SKV@aftercs\SKV@predef}
-\SKV@def*\SKV@vbmsg#1#2{%
- \begingroup
- \def\@i{info}\def\@ii{warn}\def\@iii{#1}%
- \@nameuse{SKV@\ifSKV@verbose1\else2\fi of2}%
- {\SKV@ifx\@i\@iii
- {\SKV@info{#2}}%
- {\SKV@ifx\@ii\@iii{\SKV@warn{#2}}{}}%
- }{}%
- \endgroup
-}
-\define@boolkeys[KV]{skeyval@i}[SKV@]{st,pl,cl,rt,
- lt,sw,sk,loc,uv}[true]
-\setkeys[KV]{skeyval@i}{st,pl,cl,rt,lt,sw,sk,loc,uv}
-\define@boolkey+[KV]{skeyval}[SKV@]{verbose}[true]{}{%
- \SKV@inputerr{#1}{verbose}%
-}
-\setkeys[KV]{skeyval}{verbose=false}
-\SKV@pdef\SKV@info#1{\PackageInfo{skeyval}{#1\@gobble}}
-\SKV@pdef\SKV@warn#1{\PackageWarningNoLine{skeyval}{#1}}
-\SKV@pdef\SKV@err#1#2{\PackageError{skeyval}{#1}{#2}}
-\SKV@def*\SKV@MB{\MessageBreak}
-\SKV@pdef\SKV@afterfi#1\fi{\fi#1}
-\SKV@pdef\SKV@afterelsefi#1\else#2\fi{\fi#1}
-\SKV@pdef\SKV@afterfifi#1\fi#2\fi{\fi#2\fi#1}
-\SKV@def*\SKV@badargerr#1#2{%
- \SKV@err{Invalid #2 argument for command '\@backslashchar#1'}%
- {Bad #2 argument for command '\@backslashchar#1'.\SKV@MB
- You need to look again at user instruction\SKV@MB
- for command '\@backslashchar#1'.}%
-}
-\SKV@def*\SKV@state#1#2#3{%
- \ifcase#1\relax
- \def\SKV@ste{XKV@prefix,XKV@fams,XKV@tkey,XKV@na,ifXKV@st,%
- ifXKV@pl,ifXKV@knf,CurrentOption,ifSKV@sk}%
- \SKV@ifempty{#3}{\advance\XKV@depth\@ne}{}%
- \or
- \def\SKV@ste{ifSKV@st,ifSKV@pl,ifSKV@cl,ifSKV@rt,ifSKV@lt}%
- \SKV@ifempty{#3}{\advance\SKV@depth\@ne}{}%
- \else
- \SKV@err{Unknown state identifier '#1'}%
- {I expected '\string#1' to be number 0 or 1.}%
- \fi
- \XKV@for@o\SKV@ste\SKV@ste{%
- \SKV@aftercs\let{\SKV@ste#2\SKV@aftercs}{\SKV@ste#3}%
- }%
- \ifcase#1\relax
- \SKV@ifempty{#2}{\advance\XKV@depth\m@ne}{}%
- \or
- \SKV@ifempty{#2}{\advance\SKV@depth\m@ne}{}%
- \fi
-}
-\SKV@def*\XKV@savstate{\SKV@state{0}{@\romannumeral\XKV@depth}{}}
-\SKV@def*\XKV@resstate{\SKV@state{0}{}{@\romannumeral\XKV@depth}}
-\SKV@def*\SKV@savstate{\SKV@state{1}{@\romannumeral\SKV@depth}{}}
-\SKV@def*\SKV@resstate{\SKV@state{1}{}{@\romannumeral\SKV@depth}}
-\def\XKV@srstate#1#2{\SKV@state{0}{#1}{#2}}
-\SKV@def*\SKV@scantoksa{\SKV@savstate\SKV@testoptf\SKV@sc@ntoksa}
-\SKV@def\SKV@sc@ntoksa[#1]#2{%
- \ifSKV@cl\let\gl@l@x\global\else\let\gl@l@x\relax\fi
- \SKV@for[#1]{#2}\SKV@resvda{%
- \ifSKV@pl
- \SKV@ifcsdef\SKV@resvda{}{%
- \SKV@err{Command '\SKV@csexpox\SKV@resvda' undefined}%
- {I can't scan contents of undefined command
- '\SKV@csexpox\SKV@resvda'}%
- }%
- \SKV@expnext\SKV@ensurenoscape\SKV@resvda
- \expandafter\let\expandafter\SKV@resvdb%
- \csname\SKV@resvda\endcsname
- \else
- \expandafter\SKV@ifdef\SKV@resvda{}{%
- \SKV@err{Command '\SKV@expox\SKV@resvda' undefined}%
- {I can't scan contents of undefined command
- '\SKV@expox\SKV@resvda'}%
- }%
- \SKV@expnext\SKV@ensurescape\SKV@resvda
- \expandafter\let\expandafter\SKV@resvdb\SKV@resvda
- \fi
- \SKV@noexpparse\SKV@resvdb
- \begingroup
- \edef\SKV@resvdb##1##2{##1{##2{\SKV@expox\SKV@resvdb}}}%
- \everyeof{\noexpand}\endlinechar\m@ne\makeatletter
- \SKV@resvdb{\xdef\SKV@resvdb}{\scantokens\expandafter}%
- \endgroup
- \ifSKV@pl
- \gl@l@x\SKV@aftercs\let\SKV@resvda\SKV@resvdb
- \else
- \gl@l@x\expandafter\let\SKV@resvda\SKV@resvdb
+\catcode035 06 % #
+\catcode064 11 % @
+\catcode123 01 % {
+\catcode125 02 % }
+\catcode044 12 % ,
+\def\skv@prova{\endgroup
+ \def\do##1,{%
+ \ifx\do##1\else
+ \catcode##1\string=\the\catcode##1\relax
+ \expandafter\do
\fi
}%
- \SKV@resstate
-}
-\SKV@def*\SKV@emptycmds{\SKV@savstate\SKV@testoptf\SKV@em@tycmds}
-\SKV@def\SKV@em@tycmds[#1]#2{%
- \ifSKV@cl\let\gl@l@x\global\else\let\gl@l@x\relax\fi
- \SKV@for[#1]{#2}\SKV@resvda{%
- \ifSKV@pl
- \SKV@expnext\SKV@ensurenoscape\SKV@resvda
- \gl@l@x\SKV@aftercs\let\SKV@resvda\@empty
- \else
- \SKV@expnext\SKV@ensurescape\SKV@resvda
- \gl@l@x\expandafter\let\SKV@resvda\@empty
- \fi
- }%
- \SKV@resstate
-}
-\SKV@pdef*\SKV@csdef{\SKV@savstate\SKV@t@stoptb{\SKV@newcs\def}}
-\SKV@pdef*\SKV@csgdef{\SKV@savstate\SKV@t@stoptb{\SKV@newcs\gdef}}
-\SKV@pdef*\SKV@csedef{\SKV@savstate\SKV@t@stoptb{\SKV@newcs\edef}}
-\SKV@pdef*\SKV@csxdef{\SKV@savstate\SKV@t@stoptb{\SKV@newcs\xdef}}
-\SKV@def*\SKV@newcs#1#2{%
- \ifSKV@st\let\l@ngrel@x\relax\else\let\l@ngrel@x\long\fi
- \ifSKV@pl
- \let\SKV@next\SKV@n@wcs
- \else
- \def\SKV@next{\l@ngrel@x\SKV@aftercs}%
- \fi
- \SKV@resstate\SKV@next#1{#2}%
-}
-\SKV@def*\SKV@n@wcs#1#2{%
- \SKV@ifcsname{#2}%
- {\SKV@csifx{#2}\relax{}{\def\resvd@a{#2}\SKV@notdefinable}}%
- {\l@ngrel@x\SKV@aftercs{#1}{#2}}%
-}
-\SKV@def*\SKV@csuse#1{\SKV@ifcsname{#1}{\@nameuse{#1}}{}}
-\SKV@pdef\SKV@expargs#1#2#3#4\@nil{%
- \begingroup
- \protected@edef\SKV@tempa{\endgroup
- \ifcase#1\relax
- \unexpanded{#2}{#3}%
- \or
- \unexpanded{#2#3}{#4}%
- \or
- \unexpanded{#2}{#3}{#4}%
- \or
- \unexpanded{#2}#3\unexpanded{#4}%
- \else
- \SKV@err{Unknown expansion type '\string#1' for
- \string\SKV@expargs}{I expected your first
- argument '\string#1' to be between 0 and 3.}%
- \fi
- }%
- \SKV@tempa
-}
-\SKV@def*\SKV@findescape#1{%
- \begingroup\escapechar92\relax
- \edef\resvd@a{\expandafter\SKV@car\string#1\@nil}%
- \expandafter\aftergroup\csname SKV@%
- \SKV@ifx\resvd@a\@backslashchar{1}{2}of2\endcsname
- \endgroup
-}
-\SKV@def*\SKV@ensurescape#1{%
- \SKV@findescape{#1}{}%
- {\SKV@err{Backslash required in '\string#1'}%
- {I expected a backslash to be the leading\SKV@MB
- character in your argument '\string#1'.}}%
-}
-\SKV@def*\SKV@ensurenoscape#1{%
- \SKV@findescape{#1}%
- {\SKV@err{Backslash not allowed in '\string#1'}%
- {I didn't expect a backslash to be the leading\SKV@MB
- character in your argument '\string#1'.}}{}%
-}
-\SKV@pdef\SKV@ifnextchar#1#2#3{%
- \let\SKV@nxc#1\def\SKV@nxa{#2}\def\SKV@nxb{#3}%
- \futurelet\@temptoks\SKV@ifnextch@r
-}
-\SKV@def*\SKV@ifnextch@r{%
- \ifx\@temptoks\SKV@nxc\let\SKV@nxb\SKV@nxa\fi\SKV@nxb
-}
-\SKV@pdef\SKV@ifchar#1#2#3{%
- \SKV@ifnextchar#1{\begingroup
- \def\SKV@tempa#1{\endgroup#2}\SKV@tempa}{#3}%
-}
-\SKV@pdef*\SKV@ifstar{\SKV@ifchar{*}}
-\SKV@pdef*\SKV@ifplus{\SKV@ifchar{+}}
-\SKV@pdef*\SKV@ifask{\SKV@ifchar{?}}
-\SKV@pdef*\SKV@ifclam{\SKV@ifchar{!}}
-\SKV@pdef*\SKV@ifright{\SKV@ifchar{>}}
-\SKV@pdef*\SKV@ifleft{\SKV@ifchar{<}}
-\SKV@pdef*\SKV@if@brack#1#2{\SKV@ifnextchar[{#1}{#2}}
-\SKV@pdef*\SKV@if@paren#1#2{\SKV@ifnextchar({#1}{#2}}
-\SKV@pdef*\SKV@if@left#1#2{\SKV@ifnextchar<{#1}{#2}}
-\SKV@pdef*\SKV@testopt#1#2{\SKV@if@brack{#1}{#1[{#2}]}}
-\SKV@pdef*\SKV@testopta#1{\SKV@t@stopta{\SKV@t@st@pta{#1}}}
-\SKV@pdef*\SKV@t@stopta#1{\SKV@ifstar{\SKV@sttrue#1}{\SKV@stfalse#1}}
-\SKV@pdef*\SKV@t@st@pta#1{\SKV@ifplus{\SKV@pltrue#1}{\SKV@plfalse#1}}
-\SKV@pdef*\SKV@t@st@p@a#1{\SKV@ifclam{\SKV@cltrue#1}{\SKV@clfalse#1}}
-\SKV@pdef*\SKV@testoptb#1{\SKV@t@stopta{\SKV@t@st@pta{\SKV@t@st@p@a{#1}}}}
-\SKV@pdef*\SKV@t@stoptb#1{\SKV@t@stopta{\SKV@t@st@pta{#1}}}
-\SKV@pdef*\SKV@testoptc#1{\SKV@t@st@pta{\SKV@t@st@p@a{#1}}}
-\SKV@pdef*\SKV@testoptd#1{\SKV@t@stopta{\SKV@testopt#1{,}}}
-\SKV@pdef*\SKV@testopte#1{\SKV@testoptb{\SKV@testopt#1{,}}}
-\SKV@pdef*\SKV@t@stopte#1{\SKV@t@stoptb{\SKV@testopt#1{,}}}
-\SKV@pdef*\SKV@testoptf#1{\SKV@testoptc{\SKV@testopt#1{,}}}
-\SKV@pdef*\SKV@testoptg#1{\SKV@ifright{\SKV@rttrue#1}{\SKV@rtfalse#1}}
-\SKV@pdef*\SKV@t@stoptg#1{\SKV@ifleft{\SKV@lttrue#1}{\SKV@ltfalse#1}}
-\SKV@pdef*\SKV@testopth#1#2{\SKV@if@left{#1}{#1<{#2}>}}
-\SKV@pdef*\SKV@testoptp#1#2{\SKV@if@paren{#1}{#1({#2})}}
-\SKV@def*\SKV@Test@pt#1{\@nameuse{SKV@\SKV@ifempty{#1}{1}{2}of2}}
-\SKV@def*\SKV@IfBrack#1#2#3{\SKV@IfBr@ck#1&[&{#2}{#3{#1}}}
-\SKV@def*\SKV@IfBr@ck#1[#2&#3#{\SKV@Test@pt{#1#2}}
-\SKV@def*\SKV@TestOpt#1#2#3{\SKV@IfBr@ck#1&[&{#2#1}{#2[{#3}]{#1}}}
-\SKV@def*\SKV@IfStar#1#2#3{\SKV@IfSt@r#1&*&{#2}{#3{#1}}}
-\SKV@def*\SKV@IfSt@r#1*#2&#3#{\SKV@Test@pt{#1#2}}
-\SKV@def*\SKV@IfPlus#1#2#3{\SKV@IfPl@s#1&+&{#2}{#3{#1}}}
-\SKV@def*\SKV@IfPl@s#1+#2&#3#{\SKV@Test@pt{#1#2}}
-\SKV@def*\SKV@IfAsk#1#2#3{\SKV@IfA@k#1&?&{#2}{#3{#1}}}
-\SKV@def*\SKV@IfA@k#1?#2&#3#{\SKV@Test@pt{#1#2}}
-\SKV@def*\SKV@csalloc#1{\@nameuse{new#1\SKV@aftercs}}
-\SKV@pdef*\csnewif{\SKV@csalloc{if}}
-\SKV@pdef*\csnewtoks{\SKV@csalloc{toks}}
-\SKV@pdef*\csnewcount{\SKV@csalloc{count}}
-\SKV@pdef*\csnewdimen{\SKV@csalloc{dimen}}
-\SKV@pdef*\csnewbox{\SKV@csalloc{box}}
-\SKV@pdef*\csnewwrite{\SKV@csalloc{write}}
-\SKV@pdef*\csnewread{\SKV@csalloc{read}}
-\SKV@pdef*\NewWrites{\SKV@swtrue\SKV@testopt\SKV@NewWrites{}}
-\SKV@pdef*\DefWrites{\SKV@swfalse\SKV@testopt\SKV@NewWrites{}}
-\SKV@def*\SKV@NewWrites[#1]#2{%
- \SKV@for[,]{#2}\SKV@tempa{%
- \SKV@expnext\SKV@ensurenoscape\SKV@tempa
- \ifSKV@sw
- \SKV@csifdefinable{#1\SKV@tempa}\relax
- \else
- \SKV@ifcsundef{#1\SKV@tempa}{}{%
- \SKV@vbmsg{warn}{Write stream '\@backslashchar
- #1\SKV@tempa' redefined\on@line}%
- }%
- \fi
- \csnewwrite{#1\SKV@tempa}%
- }%
-}
-\SKV@pdef*\NewReads{\SKV@swtrue\SKV@testopt\SKV@NewReads{}}
-\SKV@pdef*\DefReads{\SKV@swfalse\SKV@testopt\SKV@NewReads{}}
-\SKV@def*\SKV@NewReads[#1]#2{%
- \SKV@for[,]{#2}\SKV@tempa{%
- \SKV@expnext\SKV@ensurenoscape\SKV@tempa
- \ifSKV@sw
- \SKV@csifdefinable{#1\SKV@tempa}\relax
- \else
- \SKV@ifcsundef{#1\SKV@tempa}{}{%
- \SKV@vbmsg{warn}{Read stream '\@backslashchar
- #1\SKV@tempa' redefined\on@line}%
- }%
- \fi
- \csnewread{#1\SKV@tempa}%
- }%
-}
-\SKV@pdef*\NewIfs{\SKV@swtrue\SKV@testopt\SKV@NewIfs{}}
-\SKV@pdef*\DefIfs{\SKV@swfalse\SKV@testopt\SKV@NewIfs{}}
-\SKV@def*\SKV@NewIfs[#1]#2{\SKV@testopt{\SKV@N@wIfs[#1]{#2}}{false}}
-\SKV@def*\SKV@N@wIfs[#1]#2[#3]{%
- \ifSKV@sw
- \SKV@getswstate\NewIfs{#3}%
- \else
- \SKV@getswstate\DefIfs{#3}%
- \fi
- \SKV@for[,]{#2}\SKV@tempa{%
- \SKV@expnext\SKV@ensurenoscape\SKV@tempa
- \begingroup
- \SKV@oifstrequal{\SKV@tempa}{x}{\SKV@swnameerr{x}}%
- {\SKV@oifstrequal{\SKV@tempa}{on}{\SKV@swnameerr{on}}%
- {\SKV@oifstrequal{\SKV@tempa}{off}{\SKV@swnameerr{off}}%
- {\SKV@oifstrequal{\SKV@tempa}{tog}{\SKV@swnameerr{tog}}%
- {\SKV@oifstrequal{\SKV@tempa}{switch}{\SKV@swnameerr{switch}}%
- {}}}}}\endgroup
- \ifSKV@sw
- \SKV@csifdefinable{if#1\SKV@tempa}\relax
- \else
- \SKV@ifcsundef{if#1\SKV@tempa}{}{%
- \SKV@vbmsg{warn}{Boolean '\@backslashchar
- if#1\SKV@tempa' redefined\on@line}%
- }%
- \fi
- \SKV@aftercs\SKV@N@wIf@{if#1\SKV@tempa}%
- \@nameuse{#1\SKV@tempa\SKV@swval}%
- }%
-}
-\SKV@def*\SKV@N@wIf@#1{%
- \@tempcnta\escapechar\escapechar\m@ne
- \let#1\iffalse
- \SKV@If#1\iftrue
- \SKV@If#1\iffalse
- \let\ifon\iftrue
- \let\ifoff\iffalse
- \SKV@If#1\ifon
- \SKV@If#1\ifoff
- \escapechar\@tempcnta
-}
-\def\SKV@If#1#2{%
- \SKV@aftercs\def{\expandafter\@gobbletwo\string#1%
- \expandafter\@gobbletwo\string#2}{\let#1#2}%
-}
-\SKV@pdef*\NewBooleans{\SKV@swtrue\SKV@testopt\SKV@NewBooleans{}}
-\SKV@pdef*\DefBooleans{\SKV@swfalse\SKV@testopt\SKV@NewBooleans{}}
-\SKV@def*\SKV@NewBooleans[#1]#2{%
- \SKV@testopt{\SKV@B@oleans[#1]{#2}}{false}}
-\SKV@def*\SKV@B@oleans[#1]#2[#3]{%
- \ifSKV@sw
- \SKV@getswstate\NewBooleans{#3}%
- \else
- \SKV@getswstate\DefBooleans{#3}%
- \fi
- \SKV@for[,]{#2}\SKV@tempa{%
- \SKV@expnext\SKV@ensurenoscape\SKV@tempa
- \SKV@oifstrequal{\SKV@tempa}{tog}{%
- \SKV@err{'tog' not allowed as a boolean name}\@ehc
- }{%
- \SKV@oifstrequal{\SKV@tempa}{switch}{%
- \SKV@err{'switch' not allowed as a boolean name}\@ehc
- }{}%
- }%
- \SKV@ifstrnotequal{#1\SKV@tempa}{x}{}{%
- \SKV@err{'\string\ifx' is a TeX primitive}%
- {Why do you want to redefine '\string\ifx'? This is dangerous.}%
- }%
- \ifSKV@sw
- \SKV@csifdefinable{if#1\SKV@tempa}\relax
- \else
- \SKV@ifcsundef{if#1\SKV@tempa}{}{%
- \SKV@vbmsg{warn}{Switch '\@backslashchar if#1\SKV@tempa'
- redefined\on@line}%
- }%
- \fi
- \csnewif{if#1\SKV@tempa}%
- \@nameuse{#1\SKV@tempa\SKV@swval}%
- }%
-}
-\SKV@pdef*\NewTogs{\SKV@swtrue\SKV@testopt\SKV@NewTogs{}}
-\SKV@pdef*\DefTogs{\SKV@swfalse\SKV@testopt\SKV@NewTogs{}}
-\SKV@def*\SKV@NewTogs[#1]#2{\SKV@testopt{\SKV@NewT@gs[#1]{#2}}{false}}
-\SKV@def*\SKV@NewT@gs[#1]#2[#3]{%
- \ifSKV@sw
- \SKV@getswstate\NewTogs{#3}%
- \else
- \SKV@getswstate\DefTogs{#3}%
- \fi
- \SKV@for[,]{#2}\SKV@tempa{%
- \SKV@expnext\SKV@ensurenoscape\SKV@tempa
- \edef\SKV@tempa{#1\SKV@tempa}%
- \ifSKV@sw
- \SKV@expnext\newtog\SKV@tempa
- \else
- \SKV@expnext\deftog\SKV@tempa
- \fi
- \SKV@expargs{0}{\@nameuse{tog\SKV@swval}}\SKV@tempa\@nil
- }%
-}
-\SKV@pdef*\NewToks{\SKV@swtrue\SKV@testopt\SKV@NewToks{}}
-\SKV@pdef*\DefToks{\SKV@swfalse\SKV@testopt\SKV@NewToks{}}
-\SKV@def*\SKV@NewToks[#1]#2{%
- \SKV@for[,]{#2}\SKV@tempa{%
- \SKV@expnext\SKV@ensurenoscape\SKV@tempa
- \ifSKV@sw
- \SKV@csifdefinable{#1\SKV@tempa}\relax
- \else
- \SKV@ifcsundef{#1\SKV@tempa}{}{%
- \SKV@vbmsg{warn}{Token register '\@backslashchar
- #1\SKV@tempa' redefined\on@line}%
- }%
- \fi
- \csnewtoks{#1\SKV@tempa}%
- }%
-}
-\SKV@pdef*\NewCounts{\SKV@swtrue\SKV@testopt\SKV@NewCounts{}}
-\SKV@pdef*\DefCounts{\SKV@swfalse\SKV@testopt\SKV@NewCounts{}}
-\SKV@def*\SKV@NewCounts[#1]#2{%
- \SKV@for[,]{#2}\SKV@tempa{%
- \SKV@expnext\SKV@ensurenoscape\SKV@tempa
- \ifSKV@sw
- \SKV@csifdefinable{#1\SKV@tempa}\relax
- \else
- \SKV@ifcsundef{#1\SKV@tempa}{}{%
- \SKV@vbmsg{warn}{Counter register '\@backslashchar
- #1\SKV@tempa' redefined\on@line}%
- }%
- \fi
- \csnewcount{#1\SKV@tempa}%
- }%
-}
-\SKV@pdef*\NewDimens{\SKV@swtrue\SKV@testopt\SKV@NewDimens{}}
-\SKV@pdef*\DefDimens{\SKV@swfalse\SKV@testopt\SKV@NewDimens{}}
-\SKV@def*\SKV@NewDimens[#1]#2{%
- \SKV@for[,]{#2}\SKV@tempa{%
- \SKV@expnext\SKV@ensurenoscape\SKV@tempa
- \ifSKV@sw
- \SKV@csifdefinable{#1\SKV@tempa}\relax
- \else
- \SKV@ifcsundef{#1\SKV@tempa}{}{%
- \SKV@vbmsg{warn}{Dimension register '\@backslashchar
- #1\SKV@tempa' redefined\on@line}%
- }%
- \fi
- \csnewdimen{#1\SKV@tempa}%
- }%
-}
-\SKV@pdef*\NewBoxes{\SKV@swtrue\SKV@testopt\SKV@NewBoxes{}}
-\SKV@pdef*\DefBoxes{\SKV@swfalse\SKV@testopt\SKV@NewBoxes{}}
-\SKV@def*\SKV@NewBoxes[#1]#2{%
- \SKV@for[,]{#2}\SKV@tempa{%
- \SKV@expnext\SKV@ensurenoscape\SKV@tempa
- \ifSKV@sw
- \SKV@csifdefinable{#1\SKV@tempa}\relax
- \else
- \SKV@ifcsundef{#1\SKV@tempa}{}{%
- \SKV@vbmsg{warn}{Box register '\@backslashchar
- #1\SKV@tempa' redefined\on@line}%
- }%
- \fi
- \csnewbox{#1\SKV@tempa}%
- }%
-}
-\SKV@def\SKV@expnext#1#2{%
- \SKV@ifblank{#1}{%
- \SKV@badargerr{SKV@expnext}{first}%
- }{%
- \SKV@ifblank{#2}{%
- \SKV@badargerr{SKV@expnext}{second}%
- }{%
- \ifcat$\detokenize\expandafter{\SKV@cdr#1\@nil}$%
- \SKV@afterelsefi
- \expandafter#1\expandafter{#2}%
- \else
- \SKV@afterfi
- \SKV@badargerr{SKV@expnext}{first}%
- \fi
- }%
- }%
-}
-\SKV@pdef*\SKV@ifnewcmd{\SKV@savstate\SKV@t@stopte\SKV@ifn@wcmd}
-\SKV@def*\SKV@ifn@wcmd[#1]#2{%
- \ifSKV@st
- \ifSKV@pl
- \def\SKV@ndl{\SKV@for*[#1]#2}%
- \else
- \def\SKV@ndl{\SKV@tfor*#2}%
- \fi
- \else
- \ifSKV@pl
- \def\SKV@ndl{\SKV@for[#1]{#2}}%
- \else
- \def\SKV@ndl{\SKV@tfor{#2}}%
- \fi
- \fi
- \SKV@ndl\SKV@ndl{%
- \ifSKV@pl
- \SKV@despacectt\SKV@ndl
- \SKV@csifdefinable\SKV@ndl\relax
- \else
- \expandafter\SKV@ifdefinable\SKV@ndl\relax
- \fi
- }%
- \SKV@resstate
-}
-\let\SKV@no\z@
-\SKV@pdef*\SKV@aftergroup{%
- \SKV@ifstar{\SKV@aft@rgroup\@firstofone}%
- {\SKV@aft@rgroup\unexpanded}%
-}
-\SKV@def\SKV@aft@rgroup#1#2{%
- \edef\SKV@no{\the\numexpr\SKV@no+1}%
- \SKV@aftercs\xdef{SKV@aft@rgr@up\SKV@no}{%
- \SKV@csgundef{SKV@aft@rgr@up\SKV@no}%
- #1{#2}%
- }%
- \SKV@aftercs\aftergroup{SKV@aft@rgr@up\SKV@no}%
-}
-\SKV@pdef*\SKV@afterassignment{%
- \SKV@ifstar{\SKV@aft@rassignment\@firstofone}%
- {\SKV@aft@rassignment\unexpanded}%
-}
-\SKV@def\SKV@aft@rassignment#1#2{%
- \begingroup
- \edef\SKV@no{\the\numexpr\SKV@no+1}%
- \SKV@aftercs\xdef{SKV@aft@rassignm@nt\SKV@no}{%
- \SKV@csgundef{SKV@aft@rassignm@nt\SKV@no}%
- #1{#2}%
- }%
- \expandafter\endgroup\expandafter\afterassignment
- \csname SKV@aft@rassignm@nt\SKV@no\endcsname
-}
-\SKV@def*\SKV@sp@def#1#2{%
- \edef\@sp@def{\the\SKV@toks}%
- \SKV@toks\expandafter{%
- \romannumeral-`\q\SKV@sp@d@f\noexpand\noexpand#1& &}%
- \edef#2{\the\SKV@toks}%
- \SKV@toks\expandafter{\@sp@def}%
- \SKV@undef\@sp@def
-}
-\SKV@def*\SKV@sp@d@f#1 &{\SKV@sp@d@f@#1&}
-\SKV@def*\SKV@sp@d@f@#1&#2{\romannumeral-`\q#1}
-\SKV@def*\SKV@expox#1{\unexpanded\expandafter{#1}}
-\SKV@def*\SKV@csexpox#1{\SKV@aftercs\SKV@expox{#1}}
-\SKV@def*\SKV@exptx#1{\unexpanded\SKV@threexp{#1}}
-\SKV@def*\SKV@csexptx#1{\SKV@aftercs\SKV@exptx{#1}}
-\SKV@def\SKV@noexpcs#1{\unexpanded\expandafter{\csname#1\endcsname}}
-\SKV@pdef*\SKV@undef#1{\let#1\SKV@undefined}
-\SKV@pdef*\SKV@gundef{\global\SKV@undef}
-\SKV@pdef*\SKV@csundef#1{\SKV@aftercs\SKV@undef{#1}}
-\SKV@pdef*\SKV@csgundef{\global\SKV@csundef}
-\SKV@def*\SKV@undeflist{\SKV@savstate\SKV@t@st@p@a\SKV@und@flist}
-\SKV@def*\SKV@und@flist#1{%
- \ifSKV@cl\let\gl@l@x\global\else\let\gl@l@x\relax\fi
- \XKV@for@n{#1}\SKV@resvd{%
- \SKV@expnext\SKV@ensurescape\SKV@resvd
- \gl@l@x\expandafter\SKV@undef\SKV@resvd
- }%
- \SKV@resstate
-}
-\SKV@pdef*\SKV@Undef{\SKV@savstate\SKV@testopte\SKV@Und@f}
-\SKV@def*\SKV@Und@f[#1]#2{%
- \ifSKV@st
- \ifSKV@pl
- \def\SKV@ndl{\SKV@for*[#1]#2}%
- \else
- \def\SKV@ndl{\SKV@tfor*#2}%
- \fi
- \else
- \ifSKV@pl
- \def\SKV@ndl{\SKV@for[#1]{#2}}%
- \else
- \def\SKV@ndl{\SKV@tfor{#2}}%
- \fi
- \fi
- \SKV@ndl\SKV@ndl{%
- \ifSKV@pl
- \SKV@despacectt\SKV@ndl
- \ifSKV@cl\expandafter\global\fi
- \SKV@threexp\let
- \expandafter\csname\SKV@ndl\endcsname\SKV@undefined
- \else
- \ifSKV@cl\expandafter\global\fi
- \expandafter\let\SKV@ndl\SKV@undefined
- \fi
- }%
- \SKV@resstate
-}
-\SKV@def*\SKV@ifdef#1{%
- \SKV@ifdefined{#1}%
- {\@nameuse{SKV@\SKV@ifx{#1}\relax{2}{1}of2}}\@secondoftwo
-}
-\SKV@def*\SKV@ifundef#1{\@nameuse{SKV@\SKV@ifdef{#1}{2}{1}of2}}
-\SKV@def*\SKV@ifcsdef#1{%
- \SKV@ifcsname{#1}%
- {\@nameuse{SKV@\expandafter\SKV@ifx\csname#1\endcsname
- \relax{2}{1}of2}}\@secondoftwo
-}
-\SKV@def*\SKV@ifcsundef#1{\@nameuse{SKV@\SKV@ifcsdef{#1}{2}{1}of2}}
-\SKV@def*\SKV@ifonedef#1{%
- \def\SKV@resvda{#1}\SKV@swtrue
- \XKV@whilist\SKV@resvda\SKV@resvdb\ifSKV@sw\fi{%
- \SKV@oifdefined\SKV@resvdb\SKV@swfalse\SKV@swtrue
- }%
- \@nameuse{SKV@\ifSKV@sw2\else1\fi of2}%
-}
-\SKV@def\DeclarePackageCommand#1#2{%
- \SKV@ensurescape{#2}%
- \SKV@ifdef#2{%
- \edef\resvd@a{\expandafter\@gobble\string#2}%
- \SKV@cslet{Saved\resvd@a}#2%
- \edef\resvd@a##1{\SKV@AtEndAfterPackageEnd%
- {##1Saved\resvd@a\noexpand\endcsname}}%
- \resvd@a{\expandafter\let\expandafter#2\csname}%
- \SKV@undef\resvd@a
- }{\SKV@AtEndAfterPackageEnd{\SKV@Undef!#2}}%
- #1#2%
-}
-\SKV@pdef*\SKV@providedef{\@star@or@long{\SKV@pr@videdef{}}}
-\SKV@pdef*\SKV@providerobustdef{\@star@or@long{\SKV@pr@videdef\protected}}
-\SKV@def\SKV@pr@videdef#1#2{%
- \SKV@ensurescape{#2}%
- \edef\SKV@prov@d{\expandafter\@gobble\string#2}%
- \SKV@aftercs\let{SKV@test@\SKV@prov@d}\SKV@undefined
- \SKV@ifdef#2{%
- \SKV@vbmsg{info}{Command '\string#2' already defined:\SKV@MB
- Not redefined\on@line}%
- \SKV@afterassignment{\SKV@gundef\SKV@pr@vid}%
- \def\SKV@pr@vid
- }{%
- \SKV@afterassignment{%
- \SKV@aftercs\edef{SKV@test@\SKV@prov@d}%
- {\expandafter\strip@prefix\meaning#2}%
- }%
- \l@ngrel@x#1\def#2%
- }%
-}
-\SKV@def\TestProvidedCommand#1{%
- \SKV@ensurescape{#1}%
- \begingroup
- \SKV@ifmacro#1{%
- \edef\SKV@resvda{\expandafter\@gobble\string#1}%
- \edef\SKV@resvdb{\expandafter\strip@prefix\meaning#1}%
- \expandafter\aftergroup\csname SKV@\expandafter
- \ifx\expandafter\SKV@resvdb
- \csname SKV@test@\SKV@resvda\endcsname
- 1\else2\fi of2\endcsname
- }{\aftergroup\@secondoftwo}%
- \endgroup
-}
-\SKV@pdef*\SKV@newdef{\SKV@def}
-\SKV@providerobustdef*\newdef{\SKV@def}
-\SKV@providerobustdef*\redef{\SKV@redef}
-\SKV@pdef*\SKV@robustdef{\SKV@pdef}
-\SKV@providerobustdef*\robustdef{\SKV@pdef}
-\SKV@providerobustdef*\robustredef{\SKV@predef}
-\SKV@providerobustdef*\providedef{\SKV@providedef}
-\SKV@providerobustdef*\providerobustdef{\SKV@providerobustdef}
-\SKV@providerobustdef*\aftercommission{\SKV@afterassignment}
-\SKV@providerobustdef*\aftercoterie{\SKV@aftergroup}
-\SKV@def*\SKV@ifmacro#1{%
- \begingroup
- \edef\SKV@tempa##1{\def##1####1\detokenize{macro}:####2&}%
- \SKV@tempa\SKV@tempa{\expandafter\aftergroup
- \csname SKV@\SKV@ifblank{##2}{2}{1}of2\endcsname}%
- \edef\SKV@tempb##1{##1\detokenize{macro}:&}%
- \SKV@tempb{\expandafter\SKV@tempa\meaning#1}%
- \endgroup
-}
-\SKV@def\SKV@csifmacro{\SKV@aftercs\SKV@ifmacro}
-\SKV@def\SKV@ifnotmacro#1{\SKV@ifmacro{#1}\@secondoftwo\@firstoftwo}
-\SKV@def*\SKV@simplecmdpatch{\begingroup\@makeother{\#}%
- \SKV@testopt\SKV@simpl@cmdpatch{########1}}
-\SKV@def*\SKV@simpl@cmdpatch[#1]#2#3#4{%
- \edef\SKV@resvda##1##2{%
- \def##1####1\detokenize{macro:}####2->####3&{%
- #1\def\string#2####2{##2####3&}%
- }%
- \def##2####1\detokenize{#3}####2&{####1\detokenize{#4}####2}%
- \edef##1{##1\meaning#2&}%
- }%
- \SKV@resvda\SKV@resvda\SKV@resvdb
- \everyeof{\noexpand}\endlinechar\m@ne\makeatletter
- \catcode`\#=6\relax
- \scantokens\expandafter{\SKV@resvda}%
- \global\let#2#2%
- \endgroup
-}
-\SKV@def*\SKV@ifrelax#1{%
- \SKV@ensurescape{#1}%
- \SKV@ifdefined{#1}%
- {\@nameuse{SKV@\SKV@ifx{#1}\relax{1}{2}of2}}\@secondoftwo
-}
-\SKV@def*\SKV@ifcsrelax#1{%
- \SKV@ensurenoscape{#1}%
- \SKV@ifcsname{#1}%
- {\@nameuse{SKV@\expandafter\SKV@ifx\csname#1\endcsname
- \relax{1}{2}of2}}\@secondoftwo
-}
-\SKV@def*\SKV@ifdefax#1{%
- \SKV@ensurescape{#1}%
- \SKV@ifdefined{#1}%
- {\@nameuse{SKV@\SKV@ifx{#1}\relax{2}{1}of3}}\@thirdofthree
-}
-\SKV@def*\SKV@ifcsdefax#1{%
- \SKV@ensurenoscape{#1}%
- \SKV@ifcsname{#1}%
- {\@nameuse{SKV@\expandafter\SKV@ifx\csname#1\endcsname
- \relax{2}{1}of3}}\@thirdofthree
-}
-\SKV@def*\SKV@despacectt#1{%
- \SKV@ensurescape{#1}%
- \SKV@expnext\SKV@sp@def{#1}#1%
-}
-\SKV@def\SKV@detokdespace#1{%
- \edef#1{\detokenize\expandafter{#1}}%
- \SKV@despacectt#1%
+ \edef\skv@restorecodes{\do035,064,123,125,061,059,\do,}%
}
-\SKV@def\SKV@ifblank#1{\SKV@ifbl@nk#1&&\@secondoftwo\@firstoftwo:}
-\SKV@def\SKV@ifbl@nk#1#2&#3#4#5:{#4}
-\SKV@def\SKV@ifnotblank#1{\SKV@ifbl@nk#1&&\@firstoftwo\@secondoftwo:}
-\SKV@def\SKV@oifblank#1{\expandafter\SKV@ifblank\expandafter{#1}}
-\SKV@def\SKV@xifblank#1{\SKV@expargs{0}\SKV@ifblank{#1}\@nil}
-\SKV@def\SKV@ifstrequal#1#2{%
- \begingroup
- \edef\resvd@a{\detokenize{#1}}%
- \edef\resvd@b{\detokenize{#2}}%
- \SKV@despacectt\resvd@a\SKV@despacectt\resvd@b
- \expandafter\aftergroup
- \csname SKV@\SKV@ifx\resvd@a\resvd@b{1}{2}of2\endcsname
- \endgroup
-}
-\SKV@def\SKV@ifstrnotequal#1#2{%
- \SKV@ifstrequal{#1}{#2}\@secondoftwo\@firstoftwo}
-\SKV@def\SKV@oifstrequal#1#2{%
- \@expandtwoargs\SKV@ifstrequal{\SKV@expox{#1}}{\SKV@expox{#2}}}
-\SKV@def\SKV@xifstrequal#1#2{\@expandtwoargs\SKV@ifstrequal{#1}{#2}}
-\SKV@def\SKV@ifempty#1{\@nameuse{SKV@\ifcat$\detokenize{#1}$1\else2\fi of2}}
-\SKV@def\SKV@ifnotempty#1{\@nameuse{SKV@\SKV@ifempty{#1}{2}{1}of2}}
-\SKV@def\SKV@oifempty#1{\SKV@expnext\SKV@ifempty{#1}}
-\SKV@def\SKV@xifempty#1{\SKV@expargs{0}\SKV@ifempty{#1}\@nil}
-\SKV@def*\SKV@remparser{\SKV@testopt\SKV@remp@rser{,}}
-\SKV@def\SKV@remp@rser[#1]#2{%
- \begingroup
- \ifx#2\@empty\else
- \edef#2{#1\SKV@expox{#2}}%
- \def\SKV@tempa#1##1\@nil{%
- \gdef#2{##1}\futurelet\@temptoks\SKV@t@mp##1\@nil
- }%
- \def\SKV@t@mp##1\@nil{%
- \ifx\@temptoks\@sptoken
- \SKV@expnext\SKV@sp@def{#2}#2%
- \expandafter\SKV@tempa\expandafter#1#2\@nil
- \else
- \if#1\@temptoks\expandafter\SKV@tempa#2\@nil\fi
- \fi
+\skv@prova
+\catcode035 06 % #
+\catcode064 11 % @
+\catcode123 01 % {
+\catcode125 02 % }
+\catcode061 12 % =
+\catcode044 12 % ,
+\def\do#1=#2,{%
+ \ifx\do#1\else
+ \edef\skv@restorecodes{%
+ \skv@restorecodes
+ \catcode#1=\the\catcode#1\relax
}%
- \expandafter\SKV@tempa#2\@nil
+ \catcode#1=#2\relax
+ \expandafter\do
\fi
- \endgroup
-}
-\SKV@pdef*\SKV@appto{\SKV@savstate\SKV@testoptb{\SKV@hooktomac{>}}}
-\SKV@pdef*\SKV@prepto{\SKV@savstate\SKV@testoptb{\SKV@hooktomac{<}}}
-\SKV@def\SKV@hooktomac#1#2#3{%
- \ifSKV@st\let\SKV@iii\SKV@expox\else\let\SKV@iii\unexpanded\fi
- \ifSKV@pl
- \let\@ifundef\SKV@ifcsundef\let\SKV@iv\SKV@csexpox
- \def\SKV@i##1{\def\SKV@ii####1{\SKV@aftercs##1{####1}}}%
- \ifSKV@cl\SKV@i\xdef\else\SKV@i\edef\fi
- \else
- \let\@ifundef\SKV@ifundef\let\SKV@iv\SKV@expox
- \ifSKV@cl\def\SKV@ii##1{\xdef##1}\else
- \def\SKV@ii##1{\edef##1}\fi
- \fi
- \@ifundef{#2}{%
- \SKV@ii{#2}{\SKV@iii{#3}}%
- }{%
- \SKV@ifstrequal{#1}{>}%
- {\SKV@ii{#2}{\SKV@iv{#2}\SKV@iii{#3}}}%
- {\SKV@ii{#2}{\SKV@iii{#3}\SKV@iv{#2}}}%
- }%
- \SKV@resstate
- \SKV@undeflist!{\SKV@i,\SKV@ii,\SKV@iii,\SKV@iv}%
-}
-\SKV@pdef\apptomac#1#2{%
- \SKV@ifundef{#1}{\edef#1{\unexpanded{#2}}}%
- {\edef#1{\SKV@expox{#1}\unexpanded{#2}}}%
-}
-\SKV@pdef*\gapptomac{\global\apptomac}
-\SKV@pdef*\csapptomac{\SKV@aftercs\apptomac}
-\SKV@pdef*\csgapptomac{\global\csapptomac}
-\SKV@pdef\preptomac#1#2{%
- \SKV@ifundef{#1}{\edef#1{\unexpanded{#2}}}%
- {\edef#1{\unexpanded{#2}\SKV@expox{#1}}}%
-}
-\SKV@pdef*\gpreptomac{\global\preptomac}
-\SKV@pdef*\cspreptomac{\SKV@aftercs\preptomac}
-\SKV@pdef*\csgpreptomac{\global\cspreptomac}
-\SKV@pdef*\SKV@addtolist{\SKV@savstate\SKV@testoptc{%
- \SKV@t@stoptg{\SKV@testopt\SKV@addt@list{,}}}}
-\SKV@def*\SKV@addt@list[#1]{%
- \def\parser{#1}%
- \ifSKV@cl\let\glob@l@def\xdef\else\let\glob@l@def\edef\fi
- \ifSKV@pl
- \def\SKV@next##1{\SKV@aftercs\SKV@addt@l@st{##1}}%
- \else
- \let\SKV@next\SKV@addt@l@st
- \fi
- \SKV@next
-}
-\SKV@def\SKV@addt@l@st#1#2{%
- \SKV@ifundef{#1}{%
- \glob@l@def#1{\SKV@expox{#2}}%
- }{%
- \SKV@ifx#1\@empty{%
- \glob@l@def#1{\SKV@expox{#2}}%
- }{%
- \ifSKV@lt
- \glob@l@def#1{\SKV@expox{#2}\parser\SKV@expox{#1}}%
- \else
- \glob@l@def#1{\SKV@expox{#1}\parser\SKV@expox{#2}}%
- \fi
- }%
- }%
- \SKV@resstate
}
-\SKV@pdef*\SKV@relax#1{\let#1\relax}
-\SKV@pdef*\SKV@grelax{\global\SKV@relax}
-\SKV@pdef*\SKV@csrelax{\SKV@aftercs\SKV@relax}
-\SKV@pdef*\SKV@csgrelax{\global\SKV@csrelax}
-\@ifpackageloaded{atveryend}{%
- \@ifpackagecurrent{atveryend}{2010/03/24}{}{%
- \SKV@err{Your loaded version of atveryend package is
- not current}\@ehc}}{\RequirePackage{atveryend}[2010/03/24]}
-\SKV@pdef*\SKV@notprerr{%
- \SKV@err{You have issued a preamble command here}%
- {Move shown command to document preamble.}%
-}
-\SKV@pdef*\SKV@notenderr{%
- \SKV@err{You've called an \string\enddocument\space command\SKV@MB
- at the wrong place}{Move command to before \string\enddocument.}%
-}
-\SKV@pdef*\SKV@AtDocumentStart{\AtBeginDocument}
-\SKV@pdef*\SKV@BeforeDocumentStart{\SKV@appto!\SKV@beforedocstart}
-\def\SKV@beforedocstart{}
-\SKV@prepto\document{%
- \endgroup
- \let\SKV@BeforeDocumentStart\@firstofone
- \SKV@beforedocstart
- \let\SKV@BeforeDocumentStart\SKV@notprerr
- \SKV@gundef\SKV@beforedocstart
- \begingroup
-}
-\SKV@pdef*\SKV@AfterDocumentStart{\SKV@appto!\SKV@afterdocstart}
-\def\SKV@afterdocstart{}
-\SKV@appto\document{%
- \let\SKV@AfterDocumentStart\@firstofone
- \SKV@afterdocstart
- \let\SKV@AfterDocumentStart\SKV@notprerr
- \SKV@gundef\SKV@afterdocstart\ignorespaces
-}
-\SKV@BeforeDocumentStart{\let\SKV@AtDocumentStart\@firstofone}
-\SKV@pdef*\SKV@AtDocumentEnd{\AtEndDocument}
-\SKV@pdef*\SKV@BeforeLastPage{\SKV@appto!\SKV@beforelastpage}
-\def\SKV@beforelastpage{}
-\SKV@AtDocumentEnd{%
- \let\SKV@bef@relastpage\AtVeryEnd@BeforeClearDocumentHook
- \def\AtVeryEnd@BeforeClearDocumentHook{%
- \let\SKV@BeforeLastPage\@firstofone
- \SKV@beforelastpage\SKV@bef@relastpage
- \let\SKV@BeforeLastPage\SKV@notenderr
- \SKV@Undef!{\SKV@beforelastpage\SKV@bef@relastpage}%
- }%
-}
-\SKV@pdef*\SKV@AfterLastPage{\SKV@appto!\SKV@afterlastpage}
-\def\SKV@afterlastpage{}
-\SKV@AtDocumentEnd{%
- \let\SKV@afterl@stpage\AtVeryEnd@AfterLastShipoutHook
- \def\AtVeryEnd@AfterLastShipoutHook{%
- \let\SKV@AfterLastPage\@firstofone
- \SKV@afterlastpage\SKV@afterl@stpage
- \let\SKV@AfterLastPage\SKV@notenderr
- \SKV@Undef!{\SKV@afterlastpage\SKV@afterl@stpage}%
- }%
-}
-\SKV@pdef*\SKV@AfterDocumentEnd{\SKV@appto!\SKV@afterenddoc}
-\def\SKV@afterenddoc{}
-\SKV@AtDocumentEnd{%
- \let\SKV@aft@renddoc\AtVeryEnd@AtVeryEndDocumentHook
- \def\AtVeryEnd@AtVeryEndDocumentHook{%
- \let\SKV@AfterDocumentEnd\@firstofone
- \SKV@afterenddoc\SKV@aft@renddoc
- \let\SKV@AfterDocumentEnd\SKV@notenderr
- \SKV@Undef!{\SKV@afterenddoc\SKV@aft@renddoc}%
+\do 032=10,033=12,036=03,038=04,040=12,041=12,042=12,043=12,%
+ 059=12,045=12,047=12,058=12,063=12,091=12,093=12,126=13,\do=,%
+
+\ProvidesPackage{skeyval}[2012/10/15 v1.1 Robust key-value parser (AM)]
+\NeedsTeXFormat{LaTeX2e}[2011/06/27]
+
+\input skeyval-core
+
+\skvrobustdef*\skvAfterEndPackage{%
+ \skvifcsdef{\@currname.\@currext-skv@endpkghook}{}{%
+ \@namedef{\@currname.\@currext-skv@endpkghook}{}%
}%
+ \expandafter\g@addto@macro
+ \csname\@currname.\@currext-skv@endpkghook\endcsname
}
-\SKV@pdef\SKV@AtPackageEnd{\AtEndOfPackage}
-\SKV@pdef*\SKV@BeforePackageEnd{%
- \SKV@prepto+{\@currname.\@currext-h@@k}%
-}
-\SKV@pdef*\SKV@AfterPackageEnd{%
- \SKV@appto+{\@currname.\@currext-skvh@@k}%
-}
-\let\SKV@AtClassEnd\SKV@AtPackageEnd
-\let\SKV@BeforeClassEnd\SKV@BeforePackageEnd
-\let\SKV@AfterClassEnd\SKV@AfterPackageEnd
-\SKV@prepto\@popfilename{%
- \SKV@csuse{\@currname.\@currext-skvh@@k}%
- \SKV@csgundef{\@currname.\@currext-skvh@@k}%
-}
-\SKV@pdef\@afterpackageloaded#1{%
- \SKV@AtDocumentStart{%
- \SKV@ifcsdef{ver@#1.\@pkgextension}{}{%
- \SKV@warn{Package '#1' was never loaded}%
+\skvrobustdef*\skvAfterPackage#1{%
+ \skvAfterBeginDocument{%
+ \skvifcsdef{ver@#1.\@pkgextension}{}{%
+ \skv@warn{Package '#1' was never loaded}%
}%
}
- \SKV@ifcsdef{ver@#1.\@pkgextension}{%
- \let\SKV@next\@firstofone
+ \skvifcsdef{ver@#1.\@pkgextension}{%
+ \@firstofone
}{%
- \def\SKV@next{\SKV@appto+{#1.\@pkgextension-skvh@@k}}%
+ \skvappendtomacro{#1.\@pkgextension-skv@endpkghook}%
}%
- \SKV@next
}
-\let\SKV@steno\z@
-\SKV@pdef*\SKV@for{\SKV@savstate\SKV@testoptd\SKV@f@r}
-\SKV@pdef*\SKV@f@r[#1]{%
- \let\SKV@steno\@ne
- \ifSKV@st
- \def\SKV@next{\SKV@for@b[#1]}%
- \else
- \def\SKV@next{\SKV@CommandGenParser{#1}\SKV@for@a}%
- \fi
- \SKV@next
-}
-\SKV@pdef*\SKV@CommandGenParser#1{%
- \def\parser{#1}%
- \protected\long\def\SKV@for@a##1##2##3{%
- \SKV@ifblank{##1}\SKV@fornoop\SKV@forloop
- ##2{##3}##1#1\@nil
+\xdef\@popfilename{%
+ \unexpanded{%
+ \csname\@currname.\@currext-skv@endpkghook\endcsname
+ \expandafter\let
+ \csname\@currname.\@currext-skv@endpkghook\endcsname\relax
}%
- \long\def\SKV@forloop##1##2##3#1##4\@nil{%
- \edef##1{\unexpanded{##3}}%
- \SKV@ifstrequal{##3}{\listbreak}{%
- \SKV@keylistrema##4\@nil#1%
- }{%
- \SKV@ifblank{##4}{%
- ##2\relax
- \ifnum\SKV@steno=\@ne\expandafter\SKV@resstate\fi
- \let\SKV@steno\z@
- }{%
- ##2\relax\SKV@forloop##1{##2}##4\@nil
- }%
- }%
- }%
- \long\def\SKV@fornoop##1\@nil{}%
-}
-\SKV@pdef*\SKV@for@b{\SKV@testopt\SKV@f@r@b{,}}
-\SKV@def\SKV@f@r@b[#1]#2{%
- \SKV@CommandGenParser{#1}\SKV@expnext\SKV@for@a{#2}%
-}
-\SKV@pdef*\SKV@tfor{\SKV@ifstar\SKV@tfor@b\SKV@tfor@a}
-\SKV@pdef*\SKV@tfor@a#1#2#3{%
- \SKV@ifblank{#1}{%
- \SKV@vbmsg{warn}{Empty list for '\string\SKV@tfor@a'\on@line}%
- }{%
- \SKV@ifblank{#3}{%
- \SKV@vbmsg{warn}%
- {Empty function for '\string\SKV@tfor@a'\on@line}%
- }{%
- \SKV@tforloop#1\@nil\@nil&#2{#3}%
- }%
- }%
-}
-\SKV@def\SKV@tforloop#1#2&#3#4{%
- \long\def#3{#1}%
- \SKV@ifstrequal{#1}{\listbreak}{%
- \let\SKV@next\SKV@tforrema
- }{%
- \SKV@ifstrequal{#1}{\@nil}{%
- \let\SKV@next\SKV@tfornoop
- }{%
- #4\relax\let\SKV@next\SKV@tforloop
- }%
- }%
- \SKV@next#2&#3{#4}%
-}
-\SKV@def\SKV@tfornoop#1&#2#3{}
-\SKV@pdef*\SKV@tforrema#1\@nil\@nil&#2#3{%
- \long\edef\SKV@remainder{\unexpanded{#1}}%
-}
-\SKV@pdef*\SKV@tfor@b#1#2#3{\SKV@expnext\SKV@tfor@a{#1}#2{#3}}
-\SKV@def*\SKV@preamblecmds{}
-\SKV@pdef*\SKV@onlypreamble{\SKV@savstate\SKV@t@st@pta\SKV@onlypre@mble}
-\SKV@pdef*\SKV@onlypre@mble#1{%
- \SKV@for[,]{#1}\SKV@resvd{%
- \SKV@despacectt\SKV@resvd
- \ifSKV@pl
- \SKV@expnext\SKV@ensurenoscape\SKV@resvd
- \edef\SKV@resvd##1##2{\SKV@appto!##1{##2\SKV@noexpcs{\SKV@resvd}}}%
- \else
- \SKV@expnext\SKV@ensurescape\SKV@resvd
- \edef\SKV@resvd##1##2{\SKV@appto!##1{##2\SKV@expox{\SKV@resvd}}}%
- \fi
- \SKV@resvd\SKV@preamblecmds\SKV@dopreamble
- }%
- \SKV@resstate
-}
-\SKV@AfterDocumentStart{%
- \gdef\SKV@dopreamble#1{%
- \gdef#1{\SKV@err{'\string#1' is a preamble command}%
- {Move command '\string#1' to document preamble.}}%
- }%
- \SKV@preamblecmds
- \global\let\SKV@dopreamble\@gobble
-}
-\SKV@pdef*\SKV@onlypackage{%
- \SKV@xifempty{\@currname\@currext}{%
- \SKV@err{Not in package environment}%
- {The command at top level of this message\SKV@MB
- is available only in package environment.}%
- }{}%
-}
-\def\SKV@aftergroupdef#1#2{%
- \expandafter\endgroup\expandafter\def\expandafter#1%
- \expandafter{#2}%
+ \unexpanded\expandafter{\@popfilename}%
}
-\SKV@def*\SKV@noexpparse#1{%
- \begingroup
- \def\SKV@resa{}%
- \edef\SKV@tempa{\detokenize\expandafter{#1}\@backslashchar&}%
- \edef\SKV@tempb##1{\def##1####1\@backslashchar####2&}%
- \SKV@tempb\SKV@tempb{%
- \SKV@ifempty{##2}{%
- \edef\SKV@resa{\SKV@expox\SKV@resa##1}%
- }{%
- \edef\SKV@resa{\SKV@expox\SKV@resa##1%
- \string\noexpand\@backslashchar}%
- \SKV@tempb##2&%
- }%
- }%
- \expandafter\SKV@tempb\SKV@tempa
- \expandafter\endgroup\expandafter\toks@\expandafter{\SKV@resa}%
- \edef#1{\the\toks@}%
-}
-\SKV@def*\SKV@CommandKeyParser#1{%
- \long\def\SKV@d@fine@keylist##1{%
- \global\let\ifSKV@st\ifSKV@st
- \endgroup
- \SKV@undeflist!{\skif,\skifx,\skifcase,\skor,\skelse,\skfi}%
- \ifSKV@st
- \edef\@keylist{\detokenize\expandafter{##1}}%
- \else
- \edef\@keylist{\detokenize{##1}}%
- \fi
- \SKV@scantoksa\@keylist
- \SKV@resstate
- \SKV@expnext\SKV@checksanitizec\@keylist\SKV@tempa
- \expandafter\SKV@readkeylist\SKV@tempa#1\@nil
- }%
- \long\def\SKV@readkeylist##1#1##2\@nil{%
- \SKV@ifblank{##1}{}%
- {%
- \SKV@ifstrequal{##1}{\listbreak}{%
- \SKV@keylistrema##2\@nil#1%
- }{%
- \SKV@define@multkeys##1\@nil
- \SKV@ifblank{##2}\relax{\SKV@readkeylist##2\@nil}%
- }%
- }%
- }%
-}
-\SKV@def*\SKV@checksanitizec#1#2{%
- \XKV@ch@cksanitize{#1}#2;%
- \ifin@\else\XKV@ch@cksanitize{#1}#2,\fi
- \ifin@\@selective@sanitize[0]{,;}#2\fi
-}
-\SKV@pdef\SKV@checkchoice#1#2#3#4{%
- \XKV@savstate\XKV@sttrue\XKV@pltrue
- \SKV@expargs{3}{\XKV@checkchoice[\val\nr]}{{#1}{#2}}{{#3}{#4}}\@nil
- \XKV@resstate
-}
-\SKV@simplecmdpatch\XKV@ch@ckch@ice{%
- \XKV@err{value `\the\XKV@toks' is not allowed}%
-}{%
- \SKV@err{Value '\the\XKV@toks' is not allowed}%
- {You have submitted an invalid value for a key.\SKV@MB
- You may proceed if you like but expect funny results.}%
-}
-\SKV@simplecmdpatch\XKV@@ch@ckchoice{%
- \XKV@err{value `\the\XKV@toks' is not allowed}%
-}{%
- \SKV@err{Value '\the\XKV@toks' is not allowed}%
- {You have submitted an invalid value for a key.\SKV@MB
- You may proceed if you like but expect funny results.}%
-}
-\SKV@pdef*\SKV@inputerr#1#2{%
- \SKV@err{Erroneous value '#1' for key '#2'}%
- {Please use the correct value for key '#2'\SKV@MB
- of families '\XKV@fams'.}%
-}
-\SKV@def*\SKV@despacelist{\SKV@savstate\SKV@testoptd\SKV@desp@celist}
-\SKV@def*\SKV@desp@celist[#1]#2{%
- \begingroup
- \let\SKV@resa\@empty
- \ifSKV@st
- \def\SKV@dsl{\SKV@for*[#1]#2}%
- \else
- \def\SKV@dsl{\SKV@for[#1]{#2}}%
- \fi
- \SKV@dsl\SKV@dsl{%
- \SKV@despacectt\SKV@dsl
- \SKV@appto*\SKV@resa{\expandafter#1\SKV@dsl}%
- }%
- \ifx\SKV@resa\@empty\else\SKV@remparser[#1]\SKV@resa\fi
- \ifSKV@st\global\let#2\SKV@resa\fi
- \endgroup
- \SKV@resstate
-}
-\SKV@def*\SKV@tdespacelt#1{%
- \SKV@tfor{#1}\SKV@dsl{\expandafter\SKV@despacectt\SKV@dsl}%
-}
-\SKV@pdef*\ReserveKeyPrefixNames{\SKV@ifstar\SKV@rkpn@m@s\SKV@rkpn@mes}
-\SKV@def*\SKV@rkpn@mes#1{\SKV@appto!\SKV@rkpnames{,#1}}
-\SKV@def*\SKV@rkpn@m@s#1{\SKV@AfterPackageEnd{\SKV@appto!\SKV@rkpnames{,#1}}}
-\SKV@pdef*\ReserveMacroPrefixNames{\SKV@ifstar\SKV@rmpn@m@s\SKV@rmpn@mes}
-\SKV@def*\SKV@rmpn@mes#1{\SKV@appto!\SKV@rmpnames{,#1}}
-\SKV@def*\SKV@rmpn@m@s#1{\SKV@AfterPackageEnd{\SKV@appto!\SKV@rmpnames{,#1}}}
-\SKV@pdef*\ReserveFamilyNames{\SKV@ifstar\SKV@rfn@m@s\SKV@rfn@mes}
-\SKV@def*\SKV@rfn@mes#1{\SKV@appto!\SKV@rfnames{,#1}}
-\SKV@def*\SKV@rfn@m@s#1{\SKV@AfterPackageEnd{\SKV@appto!\SKV@rfnames{,#1}}}
-\SKV@def*\SKV@rkpnames{XKV}
-\SKV@def*\SKV@rmpnames{XKV}
-\SKV@def*\SKV@rfnames{XKV}
-\ReserveKeyPrefixNames*{SKV}
-\ReserveMacroPrefixNames*{SKV}
-\ReserveFamilyNames*{skeyval}
-\SKV@def*\SKV@newlet{\SKV@savstate\SKV@t@stopta\SKV@n@wlet}
-\SKV@def*\SKV@n@wlet#1#2{%
- \SKV@ifdef#1{%
- \ifSKV@st
- \SKV@ifdef#2{%
- \let#1#2%
- \SKV@vbmsg{info}{Command '\string#1' redefined\on@line}%
- }{%
- \SKV@err{Command '\string#2' undefined}%
- {I can't let '\string#1' to '\string#2'.}%
- }%
- \else
- \SKV@err{Command '\string#1' already defined}%
- {I can't let '\string#1' to '\string#2'.}%
- \fi
- }{%
- \SKV@ifdef#2{\let#1#2}{%
- \SKV@err{Command '\string#2' undefined}%
- {I can't let '\string#1' to '\string#2'.}%
- }%
- }%
- \SKV@resstate
-}
-\AtEndOfPackage{\SKV@providedef*\NewLet{\SKV@newlet}}
-\SKV@pdef*\SKV@cslet{\SKV@savstate\SKV@t@stopta\SKV@csl@t}
-\SKV@def*\SKV@csl@t#1#2{%
- \ifSKV@st
- \def\SKV@next{\SKV@aftercs\let{#1}#2}%
- \else
- \def\SKV@next{%
- \SKV@ifdef{#2}{%
- \SKV@aftercs\let{#1}#2%
- }{%
- \SKV@err{Command '\string#2' undefined}%
- {You may use the starred version of \string\SKV@cslet.}%
- }%
- }%
- \fi
- \SKV@resstate\SKV@next
-}
-\SKV@pdef*\SKV@letcs{\SKV@savstate\SKV@t@stopta\SKV@l@tcs}
-\SKV@def*\SKV@l@tcs#1#2{%
- \ifSKV@st
- \def\SKV@next{%
- \begingroup\expandafter\endgroup
- \expandafter\let\expandafter#1\csname#2\endcsname
- }%
- \else
- \def\SKV@next{%
- \SKV@ifcsdef{#2}{%
- \expandafter\let\expandafter#1\csname#2\endcsname
- }{%
- \SKV@err{Command '\@backslashchar#2' undefined}%
- {You may use the starred version of \string\SKV@letcs.}%
+\skvrobustdef*\skv@getdocumentclass{%
+ \skv@swafalse
+ \ifx\@filelist\@undefined\else
+ \ifx\@filelist\relax\else
+ \ifx\@filelist\@gobble\else\skv@swatrue\fi
+ \fi\fi
+ \ifskv@swa
+ \skvcommaparse*\@filelist\skv@tempa{%
+ \filename@parse\skv@tempa
+ \ifx\filename@ext\@clsextension
+ \skvifcsundef{opt@\filename@area\filename@base.\filename@ext}{}{%
+ \edef\skv@documentclass{%
+ \filename@area\filename@base.\filename@ext
+ }%
+ }%
+ \fi
+ \ifx\skv@documentclass\@undefined\else\skvbreakloop\fi
+ }%
+ \fi
+}
+\skv@getdocumentclass
+% Filter class options to remove those with '=':
+\skvrobustdef*\skv@filterclassoptions{%
+ \skv@swafalse
+ \ifx\@classoptionslist\@undefined\else
+ \ifx\@classoptionslist\relax\else\skv@swatrue\fi
+ \fi
+ \ifskv@swa
+ \let\skv@filterclassoptions\relax
+ \skvkvnormalize\@classoptionslist
+ \let\skv@origclassoptlist\@classoptionslist
+ \let\skv@classoptionslist\@classoptionslist
+ \let\@classoptionslist\@empty
+ \skvcommaloop*\skv@origclassoptlist\skv@tempa{%
+ \skvxifin{=}{\skvexpandonce\skv@tempa}{}{%
+ \skvaddtolist*\@classoptionslist\skv@tempa
}%
}%
- \fi
- \SKV@resstate\SKV@next
-}
-\SKV@pdef*\SKV@csletcs{\SKV@savstate\SKV@t@stopta\SKV@csl@tcs}
-\SKV@def*\SKV@csl@tcs#1#2{%
- \ifSKV@st
- \def\SKV@next{%
- \begingroup\expandafter\endgroup
- \expandafter\let\csname#1\SKV@aftercs\endcsname{#2}%
- }%
- \else
- \def\SKV@next{%
- \SKV@ifcsdef{#2}{%
- \SKV@aftercs\let{#1\SKV@aftercs}{#2}%
- }{%
- \SKV@err{Command '\@backslashchar#2' undefined}%
- {You may use the starred version of \string\SKV@csletcs.}%
+ \def\@fileswith@ptions##1[##2]##3{%
+ \edef\skv@tempa{\unexpanded{##3}}%
+ \skvcsvnormalize\skv@tempa
+ % The following packages need access to the original
+ % \@classoptionslist.
+ \skvcommaloop{xkeyval,kvoptions,keyval2e,ltxkeys}\skv@prova{%
+ \skvxifin{,\skv@prova,}{,\skv@tempa,}{%
+ \let\@classoptionslist\skv@origclassoptlist
+ \skvbreakloop
+ }{}%
}%
+ \skvifnextchar[{\@fileswith@pti@ns##1[##2]##3}%
+ {\@fileswith@pti@ns##1[##2]##3[]}%
}%
\fi
- \SKV@resstate\SKV@next
-}
-\SKV@pdef*\SKV@numdef{\SKV@savstate\SKV@testoptc{\SKV@expr{num}}}
-\SKV@pdef*\SKV@dimdef{\SKV@savstate\SKV@testoptc{\SKV@expr{dim}}}
-\SKV@def*\SKV@expr#1{%
- \ifSKV@cl\let\gl@l@x\global\else\let\gl@l@x\relax\fi
- \ifSKV@pl
- \def\SKV@next##1{%
- \edef\resvd@a####1{####1{#1}\SKV@csexpox{##1}}%
- \resvd@a\SKV@ex@r
- }%
- \else
- \def\SKV@next{\SKV@ex@r{#1}}%
- \fi
- \SKV@resstate\SKV@next
-}
-\SKV@def*\SKV@ex@r#1#2#3{%
- \SKV@ensurescape@ne{#2}{#3}%
- \SKV@ifstrequal{#1}{num}%
- {\def\resvd@a{count}}{\def\resvd@a{dimen}}%
- \SKV@ifundef{#2}{%
- \@nameuse{new\resvd@a}#2%
- \gl@l@x#2=\@nameuse{#1expr}#3\relax
- }{%
- \gl@l@x#2=\@nameuse{#1expr}#3\relax
- }%
-}
-\SKV@def*\SKV@ensurescape@ne#1#2{%
- \SKV@ensurescape{#1}%
- \SKV@ifnotempty{#2}{}%
- {\SKV@err{Argument '\string#2' is empty}%
- {Empty argument '\string#2' is invalid.\SKV@MB
- I expected a nonempty argument here.}%
- }%
-}
-\SKV@def*\SKV@badkeylistparser{%
- \SKV@err{Key list parser '\SKV@keyparser' not allowed}%
- {Use semicolon (preferable) or colon as parser.}%
-}
-\define@boolkey+[KV]{skeyval}[SKV@]{xchoicelist}[true]{}{%
- \SKV@inputerr{#1}{xchoicelist}%
-}
-\define@cmdkey[KV]{skeyval}[SKV@]{genparser}[,]{%
- \@onelevel@sanitize\SKV@genparser
- \SKV@despacectt\SKV@genparser
- \SKV@expargs{0}\SKV@CommandGenParser\SKV@genparser\@nil
-}
-\define@cmdkey[KV]{skeyval}[SKV@]{keyparser}[;]{%
- \@onelevel@sanitize\SKV@keyparser
- \SKV@xifblank\SKV@keyparser\SKV@badkeylistparser\relax
- \SKV@despacectt\SKV@keyparser
- \begingroup
- \def\SKV@tempa{,}\SKV@detokdespace\SKV@tempa
- \SKV@ifx\SKV@keyparser\SKV@tempa
- {\aftergroup\SKV@badkeylistparser}{}%
- \endgroup
- \SKV@expargs{0}\SKV@CommandKeyParser\SKV@keyparser\@nil
}
-\SKV@def*\SKV@keyprefix@err{%
- \SKV@err{Key prefix '\SKV@keyprefix' is not allowed}%
- {Use another prefix name instead of '\SKV@keyprefix'.}%
-}
-\define@cmdkey[KV]{skeyval}[SKV@]{keyprefix}[KV]{%
- \SKV@xifblank\SKV@keyprefix\SKV@keyprefix@err\relax
- \SKV@despacectt\SKV@keyprefix
- \SKV@expargs{3}\XKV@checksanitizeb{{\SKV@rkpnames}}%
- \SKV@tempa\@nil
- \SKV@for*[,]\SKV@tempa\SKV@tempa{%
- \SKV@ifx\SKV@keyprefix\SKV@tempa\SKV@keyprefix@err\relax
- }%
-}
-\SKV@def*\SKV@keyfamily@err{%
- \SKV@err{Key family '\SKV@keyfamily' is not allowed}%
- {Use another family name instead of '\SKV@keyfamily'.}%
-}
-\define@cmdkey[KV]{skeyval}[SKV@]{keyfamily}[fam]{%
- \SKV@xifblank\SKV@keyfamily\SKV@keyfamily@err\relax
- \SKV@despacectt\SKV@keyfamily
- \SKV@expargs{3}\XKV@checksanitizeb{{\SKV@rfnames}}%
- \SKV@tempa\@nil
- \SKV@for*[,]\SKV@tempa\SKV@tempa{%
- \SKV@ifx\SKV@keyfamily\SKV@tempa\SKV@keyfamily@err\relax
+\skvifundef\skv@documentclass{%
+ \let\skv@documentclass\@empty
+ \let\skv@classoptionslist\@empty
+ \edef\@popfilename{%
+ \skvexpandonce\@popfilename\skv@filterclassoptions
}%
-}
-\SKV@def*\SKV@macroprefix@err{%
- \SKV@err{Macro prefix '\SKV@macroprefix' is not allowed}%
- {Use another macro prefix name instead of '\SKV@macroprefix'.}%
-}
-\define@cmdkey[KV]{skeyval}[SKV@]{macroprefix}[mp@]{%
- \SKV@xifblank\SKV@macroprefix\SKV@macroprefix@err\relax
- \SKV@despacectt\SKV@macroprefix
- \SKV@expargs{3}\XKV@checksanitizeb{{\SKV@rmpnames}}%
- \SKV@tempa\@nil
- \SKV@for*[,]\SKV@tempa\SKV@tempa{%
- \SKV@ifx\SKV@macroprefix\SKV@tempa\SKV@macroprefix@err\relax
- }%
-}
-\SKV@BeforePackageEnd{\deftog{draft}\deftog{final}}
-\define@boolkey+[KV]{skeyval}[SKV@]{draft}[true]{%
- \ifSKV@draft
- \setkeys[KV]{skeyval}{final=false}%
- \SKV@AtPackageEnd{\ifSKV@draft\togon{draft}\else
- \togoff{draft}\fi}%
- \fi
}{%
- \SKV@inputerr{#1}{draft}%
+ \skv@filterclassoptions
}
-\define@boolkey+[KV]{skeyval}[SKV@]{final}[true]{%
- \ifSKV@final
- \setkeys[KV]{skeyval}{draft=false}%
- \SKV@AtPackageEnd{\ifSKV@final\togon{final}\else
- \togoff{final}\fi}%
- \fi
-}{%
- \SKV@inputerr{#1}{final}%
-}
-\DeclareOptionX*{\SKV@warn{Unknown option '\CurrentOption' ignored}}
-\ExecuteOptionsX[KV]<skeyval>{genparser,keyparser,keyprefix,
- keyfamily,macroprefix,final}
-\ProcessOptionsX*[KV]<skeyval>\relax
-\SKV@pdef*\skvoptions#1{\setkeys[KV]{skeyval}{#1}}
-\SKV@pdef*\SKV@ifdraft{\@nameuse{SKV@\ifSKV@draft1\else2\fi of2}}
-\SKV@pdef*\SKV@iffinal{\@nameuse{SKV@\ifSKV@final1\else2\fi of2}}
-\SKV@pdef*\SKV@ifnotdraft{\@nameuse{SKV@\SKV@ifdraft2\else1\fi of2}}
-\SKV@pdef*\SKV@ifnotfinal{\@nameuse{SKV@\SKV@iffinal2\else1\fi of2}}
-\def\SKV@useinfo#1{Not using '\@backslashchar#1' of 'skyeval' package}
-\SKV@pdef*\SKV@in@#1#2{%
- \def\in@@##1#1##2##3\in@@{\ifx\in@##2\in@false\else\in@true\fi}%
- \in@@#2\@mil#1\in@\in@@
-}
-\SKV@pdef*\SKV@in@n#1#2{%
- \SKV@in@{#1}{#2}%
- \@nameuse{SKV@\ifin@1\else2\fi of2}%
-}
-\SKV@pdef*\SKV@in@o#1#2{%
- \@expandtwoargs\SKV@in@{\SKV@expox{#1}}{\SKV@expox{#2}}%
- \@nameuse{SKV@\ifin@1\else2\fi of2}%
-}
-\SKV@pdef*\SKV@in@x#1#2{%
- \@expandtwoargs\SKV@in@{#1}{#2}%
- \@nameuse{SKV@\ifin@1\else2\fi of2}%
-}
-\SKV@pdef*\in@tog#1#2{%
- \SKV@in@{#1}{#2}%
- \ifin@\togon{in@}\else\togoff{in@}\fi
+
+\skvrobustdef*\skvBeforeBeginDocument{%
+ \skvgappendtomacro\skv@beforebegindoc
}
-\AtEndOfPackage{\deftog{in@}}
-\SKV@pdef*\in@tok#1#2{%
- \begingroup
- \SKV@expnext\SKV@sp@def{\detokenize{#1}}\SKV@tempa
- \SKV@expnext\SKV@sp@def{\detokenize{#2}}\SKV@tempb
- \@expandtwoargs\SKV@in@\SKV@tempa\SKV@tempb
- \global\let\ifin@\ifin@
+\skvnewdef*\skv@beforebegindoc{}
+\skvprependtomacro\document{%
\endgroup
+ \let\skvBeforeBeginDocument\@firstofone
+ \skv@beforebegindoc
+ \gdef\skvBeforeBeginDocument{\skv@notprerr\skvBeforeBeginDocument}%
+ \global\let\skv@beforebegindoc\relax
+ \begingroup
}
-\AtBeginDocument{%
- \SKV@ifundef\ifdraft
- {\SKV@pdef*\ifdraft{\SKV@ifdraft}}%
- {\SKV@vbmsg{info}{\SKV@useinfo{ifdraft}}}%
-}
-\SKV@ifundef\ifnotdraft
- {\SKV@pdef*\ifnotdraft{\SKV@ifnotdraft}}%
- {\SKV@vbmsg{info}{\SKV@useinfo{ifnotdraft}}}
-\SKV@ifundef\iffinal
- {\SKV@pdef*\iffinal{\SKV@iffinal}}%
- {\SKV@vbmsg{info}{\SKV@useinfo{iffinal}}}
-\SKV@ifundef\ifnotfinal
- {\SKV@pdef*\ifnotfinal{\SKV@ifnotfinal}}%
- {\SKV@vbmsg{info}{\SKV@useinfo{ifnotfinal}}}
-\SKV@def\SKV@star@or@long#1{%
- \SKV@ifstar
- {\let\l@ngrel@x\relax\def\@star@or@none{*}#1}%
- {\let\l@ngrel@x\long\def\@star@or@none{}#1}%
+\skvrobustdef*\skvAfterBeginDocument{%
+ \skvgappendtomacro\skv@afterbegindoc
}
-\SKV@pdef\requirecmd{\SKV@star@or@long\SKV@require@cmd}
-\SKV@def\SKV@require@cmd#1{%
- \SKV@ensurescape{#1}%
- \SKV@ifdefined{#1}%
- {\CheckCommand\@star@or@none}{\newcommand\@star@or@none}{#1}%
+\skvnewdef*\skv@afterbegindoc{}
+\skvgappendtomacro\document{%
+ \let\skvAfterBeginDocument\@firstofone
+ \skv@afterbegindoc
+ \gdef\skvAfterBeginDocument{\skv@notprerr\skvAfterBeginDocument}%
+ \global\let\skv@afterbegindoc\relax
+ \ignorespaces
}
-\SKV@redef\@check@eq#1#2{%
- \SKV@ifx{#1}{#2}{}{%
- \SKV@vbmsg{warn}{%
- Previous definition of '\string#1'\SKV@MB
- doesn't match your new definition.\SKV@MB
- * I haven't redefined '\string#1' *}%
- }%
+\skvrobustdef*\skv@notprerr#1{%
+ \@latex@error{Command \detokenize{#1} should be used only
+ in preamble}\@ehd
}
-\SKV@def*\SKV@getswstate#1#2{%
- \SKV@checkchoice{#2}{true,on,false,off}{%
- \ifcase\nr\relax
- \def\SKV@swval{true}%
- \or
- \def\SKV@swval{true}%
- \or
- \def\SKV@swval{false}%
- \or
- \def\SKV@swval{false}%
- \fi
- }{%
- \SKV@swvalerr{#1}{#2}%
- }%
-}
-\SKV@pdef*\newswitch{\SKV@swtrue\SKV@testopt\SKV@newswitch{}}
-\SKV@pdef*\defswitch{\SKV@swfalse\SKV@testopt\SKV@newswitch{}}
-\SKV@def*\SKV@newswitch[#1]#2{\SKV@testopt{\SKV@n@wswitch[#1]{#2}}{false}}
-\SKV@def*\SKV@n@wswitch[#1]#2[#3]{%
- \SKV@in@n{,}{#2}{%
- \SKV@err{%
- Command \ifSKV@sw'\string\newswitch'\else'\string\defswitch'\fi\space
- doesn't accept list
- }{%
- Please submit only one switch to \ifSKV@sw'\string\newswitch'\else
- '\string\defswitch'\fi\SKV@MB at a time. You may consider using
- \ifSKV@sw'\string\NewSwitches'\else'\string\DefSwitches'\fi\SKV@MB
- if you really want to define a set of switches.
+\skvnewdef*\skv@everypagehook{}
+\skvrobustdef*\skvAtBeginEveryPage{\skvgappendtomacro\skv@everypagehook}
+\skvAfterBeginDocument{%
+ \let\skv@savedoutputpage\@outputpage
+ \def\@outputpage{%
+ \let\skv@savedbegindvi\@begindvi
+ \def\@begindvi{%
+ \skv@everypagehook
+ \skv@savedbegindvi
}%
- }{}%
- \SKV@ensurenoscape{#2}%
- \SKV@ifstrnotequal{#1#2}{x}{}{%
- \SKV@err{'\string\ifx' is a TeX primitive}%
- {You can't redefine '\string\ifx'! This is dangerous.}%
- }%
- \ifSKV@sw
- \SKV@getswstate\newswitch{#3}%
- \SKV@csifdefinable{if#1#2}\relax
- \else
- \SKV@getswstate\defswitch{#3}%
- \SKV@ifcsundef{if#1#2}{}{%
- \SKV@vbmsg{warn}{Switch '\@backslashchar if#1#2' redefined\on@line}%
- }%
- \fi
- \csnewif{if#1#2}%
- \@nameuse{#1#2\SKV@swval}%
-}
-\SKV@newlet\NewSwitches\NewBooleans
-\SKV@newlet\DefSwitches\DefBooleans
-\SKV@def*\setswitch#1#2{%
- \SKV@ensurenoscape{#1}%
- \SKV@ifcsundef{if#1}{%
- \SKV@noswerr{#1}%
- }{%
- \SKV@getswstate\setswitch{#2}%
- \csname#1\SKV@swval\endcsname
+ \skv@savedoutputpage
+ \let\@begindvi\skv@savedbegindvi
}%
}
-\SKV@def*\switchon#1{%
- \SKV@ensurenoscape{#1}%
- \SKV@ifcsundef{if#1}{\SKV@noswerr{#1}}{\@nameuse{#1true}}%
-}
-\SKV@newlet\switchtrue\switchon
-\SKV@def*\switchoff#1{%
- \SKV@ensurenoscape{#1}%
- \SKV@ifcsundef{if#1}{\SKV@noswerr{#1}}{\@nameuse{#1false}}%
-}
-\SKV@newlet\switchfalse\switchoff
-\SKV@def*\ifswitchon#1{%
- \SKV@ensurenoscape{#1}%
- \SKV@ifcsundef{if#1}{\SKV@noswerr{#1}\@gobbletwo}%
- {\@nameuse{SKV@\@nameuse{if#1}1\else2\fi of2}}%
-}
-\SKV@newlet\ifswitchtrue\ifswitchon
-\SKV@def*\ifswitchoff#1{%
- \SKV@ensurenoscape{#1}%
- \SKV@ifcsundef{if#1}{\SKV@noswerr{#1}\@gobbletwo}%
- {\@nameuse{SKV@\@nameuse{if#1}2\else1\fi of2}}%
-}
-\SKV@newlet\ifswitchfalse\ifswitchoff
-\SKV@pdef*\SKV@noswerr#1{%
- \SKV@err{Switch '\string#1' is undefined}%
- {You need to first define the switch '\string#1'.}%
-}
-\SKV@pdef*\SKV@swnameerr#1{%
- \SKV@err{'\string\if#1' not allowed as a boolean}%
- {Invalid boolean name '\string#1'.}%
-}
-\SKV@def*\SKV@swvalerr#1#2{%
- \SKV@err{\string#1\space error: invalid boolean value '#2'}%
- {Valid boolean values are 'true', 'on', 'false', and 'off'.}%
-}
-\SKV@pdef*\SKV@undeftog@err#1{%
- \SKV@err{Toggle '#1' undefined}%
- {You need to first define '#1' before use.}%
-}
-\SKV@pdef*\newtog{\SKV@swtrue\SKV@testopt\SKV@newtog{}}
-\SKV@pdef*\deftog{\SKV@swfalse\SKV@testopt\SKV@newtog{}}
-\SKV@def*\SKV@newtog[#1]#2{\SKV@testopt{\SKV@n@wtog[#1]{#2}}{false}}
-\SKV@def*\SKV@n@wtog[#1]#2[#3]{%
- \SKV@in@n{,}{#2}{%
- \SKV@err{%
- Command \ifSKV@sw'\string\newtog'\else'\string\deftog'\fi\space
- doesn't accept list
- }{%
- Please submit only one tog to \ifSKV@sw'\string\newtog'\else
- '\string\deftog'\fi\space at a time.\SKV@MB You can use
- \ifSKV@sw'\string\NewTogs'\else'\string\DefTogs'\fi\space
- to define a set of togs.
- }%
- }{}%
- \SKV@ensurenoscape{#2}%
- \ifSKV@sw
- \SKV@getswstate\newtog{#3}%
- \SKV@ifcsdef{SKV@toggle@#1#2}{%
- \SKV@err{Toggle '#1#2' already defined}%
- {Please provide a new toggle or use '\string\deftog'.}%
- }{}%
- \else
- \SKV@getswstate\deftog{#3}%
- \SKV@ifcsundef{SKV@toggle@#1#2}{}{%
- \SKV@vbmsg{warn}{Toggle '#1#2' redefined\on@line}%
- }%
- \fi
- \SKV@csletcs{SKV@toggle@#1#2}{SKV@t@ggle\SKV@swval}
-}
-\SKV@pdef*\providetog#1{%
- \SKV@ifcsdef{SKV@toggle@#1}{%
- \SKV@vbmsg{info}%
- {Toggle '#1' already defined.\SKV@MB Not redefined\on@line}%
- }{\SKV@cslet{SKV@toggle@#1}\@secondoftwo}%
-}
-\SKV@pdef*\requiretog#1{\SKV@aftercs\requirecmd{SKV@toggle@#1}[2]{##2}}
-\SKV@def*\settog#1#2{%
- \SKV@ifcsdef{SKV@toggle@#1}{%
- \SKV@ifcsdef{SKV@t@ggle#2}{%
- \SKV@csletcs{SKV@toggle@#1}{SKV@t@ggle#2}%
+
+\skvnewdef*\skv@preamblecmdhook{}
+\skvrobustdef*\skvonlypreamble#1{%
+ \skvcommaparse{#1}\skv@tempa{%
+ \skvxifin{\detokenize\expandafter{\expandafter\do\skv@tempa}}%
+ {\skvoxdetok\skv@preamblecmdhook}{%
+ \skv@warn{Command '\skvexpandonce\skv@tempa' multiply
+ \MessageBreak submitted to \string\skvonlypreamble: ignored}%
}{%
- \SKV@err{Inadmissible value '#2' for toggle '#1'}%
- {Valid values for toggles are 'true', 'or', 'false', and 'off'.}%
+ \xdef\skv@preamblecmdhook{%
+ \skvexpandonce\skv@preamblecmdhook
+ \unexpanded\expandafter{\expandafter\do\skv@tempa}%
+ }%
}%
- }{\SKV@undeftog@err{#1}}%
-}
-\SKV@def*\togon#1{%
- \SKV@ifcsdef{SKV@toggle@#1}{%
- \SKV@cslet{SKV@toggle@#1}\SKV@t@ggleon
- }{\SKV@undeftog@err{#1}}%
-}
-\SKV@def*\togoff#1{%
- \SKV@ifcsdef{SKV@toggle@#1}{%
- \SKV@cslet{SKV@toggle@#1}\SKV@t@ggleoff
- }{\SKV@undeftog@err{#1}}%
-}
-\SKV@newlet\togtrue\togon
-\SKV@newlet\togfalse\togoff
-\SKV@newlet\SKV@t@ggleon\@firstoftwo
-\SKV@newlet\SKV@t@ggleoff\@secondoftwo
-\SKV@newlet\SKV@t@ggletrue\@firstoftwo
-\SKV@newlet\SKV@t@gglefalse\@secondoftwo
-\SKV@def*\iftogon#1{%
- \SKV@ifcsdef{SKV@toggle@#1}{\@nameuse{SKV@toggle@#1}}%
- {\SKV@undeftog@err{#1}}%
-}
-\SKV@def*\iftogoff#1{%
- \SKV@ifcsdef{SKV@toggle@#1}{%
- \@nameuse{SKV@toggle@#1}\@secondoftwo\@firstoftwo}%
- {\SKV@undeftog@err{#1}\@gobbletwo}%
-}
-\SKV@newlet\iftogtrue\iftogon
-\SKV@newlet\iftogfalse\iftogoff
-\deftog{pdf}
-\SKV@ifundef\pdfoutput{}{%
- \ifnum\pdfoutput<\@ne
- \SKV@pdef*\SKV@ifpdf{\@secondoftwo}%
- \else
- \togon{pdf}%
- \SKV@pdef*\SKV@ifpdf{\@firstoftwo}%
- \fi
- \SKV@pdef*\SKV@ifnotpdf{\SKV@ifpdf\@secondoftwo\@firstoftwo}%
-}
-\SKV@ifundef\ifnotpdf
- {\let\ifnotpdf\SKV@ifnotpdf}%
- {\SKV@vbmsg{info}{\SKV@useinfo{ifnotpdf}}}
-\SKV@AtDocumentStart{%
- \SKV@ifundef\ifpdf
- {\SKV@pdef*\ifpdf{\SKV@ifpdf}}%
- {\SKV@vbmsg{info}{\SKV@useinfo{ifpdf}}}%
-}
-\SKV@pdef*\SKV@definedkey@err#1{%
- \SKV@ifcsundef{\XKV@header#1}{}{%
- \SKV@err{Key '#1' already defined in family '\XKV@tfam'\SKV@MB
- with prefix '\SKV@pref'}{Use another key name instead of '#1'.}%
- }%
-}
-\SKV@pdef*\define@togkey{\SKV@skfalse
- \XKV@t@stopta{\XKV@testoptd\SKV@define@togkey{}}}
-\SKV@def*\SKV@define@togkey#1#2[#3]{%
- \SKV@findkeypointers{#2}%
- \SKV@ifcsundef{\XKV@header\SKV@resa}{}{%
- \SKV@vbmsg{warn}{%
- Key '\SKV@resa' in family '\XKV@tfam' with\SKV@MB
- prefix '\SKV@pref' redefined\on@line}
- \SKV@Undef+{\XKV@header\SKV@resa,SKV@toggle@#1\SKV@resa}%
}%
- \SKV@expnext\SKV@reservkey@err\SKV@resa
- \SKV@expnext\SKV@suspkey@err\SKV@resa
- \ifXKV@pl
- \def\SKV@next{\SKV@aftercs\SKV@d@f@ne@togkey}%
- \else
- \def\SKV@next{\SKV@aftercs\SKV@d@fine@togkey}%
- \fi
- \begingroup
- \edef\SKV@tempa{\endgroup
- {\XKV@header\SKV@resa}{\SKV@resa}{#1\SKV@resa}{#3}}%
- \aftergroup\SKV@next\SKV@tempa
-}
-\SKV@def*\SKV@d@fine@togkey#1#2#3#4#5{%
- \SKV@d@f@ne@t@gkey#1{#2}{#3}{#4}%
- {{\SKV@expargs{0}{\SKV@getswstate\SKV@d@fine@togkey}\XKV@resa\@nil
- \settog{#3}{\SKV@swval}#5}}%
}
-\SKV@def*\SKV@d@f@ne@togkey#1#2#3#4#5#6{%
- \SKV@d@f@ne@t@gkey#1{#2}{#3}{#4}%
- {{\SKV@expargs{0}{\SKV@getswstate\SKV@d@f@ne@togkey}\XKV@resa\@nil
- \settog{#3}{\SKV@swval}#5}{#6}}%
-}
-\SKV@def*\SKV@d@f@ne@t@gkey#1#2#3#4#5{%
- \deftog{#3}%
- \ifXKV@st\XKV@define@default{#2}{#4}\fi
- \edef#1##1{%
- \def#1####1{##1\unexpanded{\XKV@sttrue\XKV@checkchoice[\XKV@resa]}%
- {####1}{true,false,on,off}\unexpanded{#5}%
+\AtEndOfPackage{%
+ \skvAfterBeginDocument{%
+ \def\do#1{%
+ \skvifdef#1{%
+ \gdef#1{\@latexerr{'\string#1' is a preamble command}\@ehd}%
+ }{%
+ \@@warning{Undefined command '\unexpanded{#1}'
+ appeared in \string\skvonlypreamble}%
+ }%
}%
- }%
- \ifXKV@pl#1\XKV@pltrue\else#1\XKV@plfalse\fi
-}
-\SKV@pdef*\define@togkeys{\SKV@skfalse
- \XKV@plfalse\XKV@testoptd\SKV@define@togkeys{}}
-\SKV@def*\SKV@define@togkeys#1#2[#3]{%
- \SKV@despacelist{#2}%
- \SKV@for*[,]\SKV@resa\SKV@tempa{%
- \SKV@expargs{3}%
- \SKV@d@fine@togkeys{{\SKV@tempa}}{{#1}{#3}}\@nil
- }%
-}
-\SKV@def*\SKV@d@fine@togkeys#1#2#3{%
- \SKV@findkeypointers{#1}%
- \SKV@ifcsundef{\XKV@header\SKV@resa}{}{%
- \SKV@vbmsg{warn}{%
- Key '\SKV@resa' in family '\XKV@tfam' with\SKV@MB
- prefix '\SKV@pref' redefined\on@line}
- \SKV@Undef+{\XKV@header\SKV@resa,SKV@toggle@#2\SKV@resa}%
- }%
- \SKV@expnext\SKV@reservkey@err\SKV@resa
- \SKV@expnext\SKV@suspkey@err\SKV@resa
- \edef\SKV@tempa##1##2##3{%
- ##1\@nameuse{\XKV@header\SKV@resa}%
- {\SKV@resa}{#2\SKV@resa}{#3}{{##2{#2\SKV@resa}{##3}}}%
- }%
- \SKV@tempa\SKV@d@f@ne@t@gkey\settog\XKV@resa
-}
-\SKV@pdef*\newordkey{\SKV@skfalse\XKV@testoptb\SKV@newordkey}
-\SKV@def*\SKV@newordkey#1{%
- \SKV@findkeypointers{#1}%
- \SKV@expnext\SKV@definedkey@err\SKV@resa
- \begingroup
- \edef\SKV@tempa{\endgroup
- \SKV@if@brack{\noexpand\XKV@d@fine@key{\SKV@resa}}%
- {\noexpand\SKV@d@fine@key{\SKV@resa}}%
- }%
- \SKV@tempa
-}
-\SKV@pdef*\newcmdkey{\SKV@skfalse\XKV@testoptd\SKV@newcmdkey{cmd}}
-\SKV@def*\SKV@newcmdkey#1#2[#3]#4{%
- \SKV@reservmp{#1}\SKV@rmpnames
- \SKV@findkeypointers{#2}%
- \SKV@expnext\SKV@definedkey@err\SKV@resa
- \ifXKV@st
- \SKV@afterfi
- \SKV@expnext\XKV@define@default\SKV@resa{#3}%
- \fi
- \begingroup
- \edef\SKV@tempa{\def\SKV@noexpcs{\XKV@header\SKV@resa}####1}%
- \edef\SKV@tempb{\def\SKV@noexpcs{#1\SKV@resa}\unexpanded{{##1}#4}}%
- \expandafter\expandafter\expandafter\endgroup
- \expandafter\SKV@tempa\expandafter{\SKV@tempb}%
-}
-\SKV@pdef*\newcmdkeys{\SKV@skfalse\XKV@testoptd\SKV@newcmdkeys{cmd}}
-\SKV@def*\SKV@newcmdkeys#1#2[#3]{%
- \SKV@despacelist{#2}%
- \SKV@for*[,]\SKV@resa\SKV@tempa{%
- \edef\SKV@tempa{\noexpand\SKV@newcmdkey{#1}{\SKV@tempa}}%
- \SKV@tempa[#3]{}%
- }%
-}
-\SKV@pdef*\newchoicekey{\SKV@skfalse
- \XKV@testopta{\XKV@testoptb\SKV@newchoicekey}}
-\SKV@def*\SKV@newchoicekey#1{%
- \SKV@findkeypointers{#1}%
- \SKV@expnext\SKV@definedkey@err\SKV@resa
- \begingroup
- \edef\SKV@tempa##1{\endgroup\SKV@testopt{##1{\SKV@resa}}{}}%
- \SKV@tempa\XKV@d@fine@choicekey
-}
-\let\newmenukey\newchoicekey
-\SKV@pdef*\newboolkey{\SKV@skfalse
- \XKV@t@stopta{\XKV@testoptd\SKV@newboolkey{}}}
-\SKV@def*\SKV@newboolkey#1#2[#3]{%
- \SKV@findkeypointers{#2}%
- \SKV@expnext\SKV@definedkey@err\SKV@resa
- \ifXKV@pl
- \def\SKV@next{\SKV@aftercs\XKV@d@f@ne@boolkey}%
- \else
- \def\SKV@next{\SKV@aftercs\XKV@d@fine@boolkey}%
- \fi
- \edef\SKV@tempa{{\XKV@header\SKV@resa}{\SKV@resa}{#1\SKV@resa}{#3}}%
- \expandafter\SKV@next\SKV@tempa
-}
-\SKV@pdef*\newboolkeys{\SKV@skfalse
- \XKV@plfalse\XKV@testoptd\SKV@newboolkeys{}}
-\SKV@def*\SKV@newboolkeys#1#2[#3]{%
- \SKV@despacelist{#2}%
- \SKV@for*[,]\SKV@resa\SKV@tempa{%
- \SKV@definedkey@err\SKV@tempa
- \SKV@expargs{3}%
- \XKV@d@fine@boolkeys{{\SKV@tempa}}{{#1}{#3}}\@nil
+ \skv@preamblecmdhook
+ \let\skv@preamblecmdhook\relax
+ \let\do\relax
}%
}
-\SKV@pdef*\newtogkey{\SKV@skfalse
- \XKV@t@stopta{\XKV@testoptd\SKV@newtogkey{}}}
-\SKV@def*\SKV@newtogkey#1#2[#3]{%
- \SKV@findkeypointers{#2}%
- \SKV@expnext\SKV@definedkey@err\SKV@resa
- \ifXKV@pl
- \def\SKV@next{\SKV@aftercs\SKV@d@f@ne@togkey}%
- \else
- \def\SKV@next{\SKV@aftercs\SKV@d@fine@togkey}%
- \fi
- \begingroup
- \edef\SKV@tempa{\endgroup
- {\XKV@header\SKV@resa}{\SKV@resa}{#1\SKV@resa}{#3}}%
- \aftergroup\SKV@next\SKV@tempa
-}
-\SKV@pdef*\newtogkeys{\SKV@skfalse
- \XKV@plfalse\XKV@testoptd\SKV@newtogkeys{}}
-\SKV@def*\SKV@newtogkeys#1#2[#3]{%
- \SKV@despacelist{#2}%
- \SKV@for*[,]\SKV@resa\SKV@tempa{%
- \SKV@definedkey@err\SKV@tempa
- \SKV@expargs{3}\SKV@d@fine@togkeys{{\SKV@tempa}}{{#1}{#3}}\@nil
- }%
-}
-\SKV@pdef*\define@biboolkeys{\SKV@compopta\define@boolkey\SKV@biboolkeys}
-\SKV@pdef*\newbiboolkeys{\SKV@compopta\newboolkey\SKV@biboolkeys}
-\SKV@pdef*\define@uniboolkeys{\SKV@compopta\define@boolkey\SKV@uniboolkeys}
-\SKV@pdef*\newuniboolkeys{\SKV@compopta\newboolkey\SKV@uniboolkeys}
-\SKV@pdef*\define@biuniboolkeys{%
- \SKV@savstate
- \SKV@t@stoptb{\SKV@compopta\define@boolkey\SKV@biuniboolkeys}%
-}
-\SKV@pdef*\newbiuniboolkeys{%
- \SKV@savstate
- \SKV@t@stoptb{\SKV@compopta\newboolkey\SKV@biuniboolkeys}%
-}
-\SKV@pdef*\define@bitogkeys{\SKV@compopta\define@togkey\SKV@bitogkeys}
-\SKV@pdef*\newbitogkeys{\SKV@compopta\newtogkey\SKV@bitogkeys}
-\SKV@pdef*\define@unitogkeys{\SKV@compopta\define@togkey\SKV@unitogkeys}
-\SKV@pdef*\newunitogkeys{\SKV@compopta\newtogkey\SKV@unitogkeys}
-\SKV@pdef*\define@biunitogkeys{%
- \SKV@savstate
- \SKV@t@stoptb{\SKV@compopta\define@togkey\SKV@biunitogkeys}%
+
+%%+++++++++++++++++ Utilities for handling options ++++++++++++++++%%
+
+% \skvunknownoptionhandler[<prefixes>]<<families>>{<handler>}
+%
+\skvrobustdef*\skvunknownoptionhandler{%
+ \skv@testopt\skv@unknownoptionhandler{KV}%
}
-\SKV@pdef*\newbiunitogkeys{%
- \SKV@savstate
- \SKV@t@stoptb{\SKV@compopta\newtogkey\SKV@biunitogkeys}%
+\skvrobustdef*\skv@unknownoptionhandler[#1]{%
+ \skvifnextchar<{\skv@unkn@wnoptionhandler{#1}}%
+ {\skv@unkn@wnoptionhandler{#1}<\@currname.\@currext>}%
}
-\SKV@def*\SKV@compopta#1#2{%
- \let\SKV@c@mpkey#1\let\SKV@co@pkey#2%
- \SKV@testopt{\SKV@compoptb}{KV}%
+\skvrobustdef*\skv@unkn@wnoptionhandler#1<#2>{%
+ \skv@unknownkeyhandler[#1]{#2}%
}
-\SKV@def*\SKV@compoptb[#1]#2{\SKV@testopt{\SKV@compoptc[#1]{#2}}{mp@}}
-\SKV@def*\SKV@compoptc[#1]#2[#3]#4{%
- \SKV@testopt{\SKV@co@pkey[#1]{#2}[#3]{#4}}{true}}
-\SKV@def*\SKV@biboolkeys[#1]#2[#3]#4[#5]#6#7#8{%
- \@namedef{#1@#2@#4@func}{%
- #7\relax
- \ifswitchon{#3#4}{\switchoff{#3#6}}{\switchon{#3#6}#8\relax}%
- }%
- \@namedef{#1@#2@#6@func}{%
- #8\relax
- \ifswitchon{#3#6}{\switchoff{#3#4}}{\switchon{#3#4}#7\relax}%
- }%
- \SKV@compk@y{#1}{#2}{#3}{#4}{#5}{#6}%
-}
-\SKV@def*\SKV@uniboolkeys[#1]#2[#3]#4[#5]#6#7#8{%
- \@namedef{#1@#2@#4@func}{%
- #7\relax
- \ifswitchon{#3#4}{\switchon{#3#6}#8\relax}{\switchoff{#3#6}}%
- }%
- \@namedef{#1@#2@#6@func}{%
- #8\relax
- \ifswitchon{#3#6}{\switchon{#3#4}#7\relax}{\switchoff{#3#4}}%
- }%
- \SKV@compk@y{#1}{#2}{#3}{#4}{#5}{#6}%
-}
-\SKV@def*\SKV@biuniboolkeys[#1]#2[#3]#4[#5]#6#7#8{%
- \SKV@aftercs\def{#1@#2@#6@func}{#8\relax}%
- \ifswitchon{SKV@st}{%
- \ifswitchon{SKV@pl}{%
- \@namedef{#1@#2@#4@func}{%
- #7\relax\ifswitchon{#3#4}{}{\switchoff{#3#6}}%
- }%
- }{%
- \@namedef{#1@#2@#4@func}{%
- #7\relax
- \ifswitchon{#3#4}{}{\switchon{#3#6}\@nameuse{#1@#2@#6@func}}%
- }%
- }%
+
+
+\skvrobustdef*\skv@testopte#1{\skv@testopta{\skv@t@stopte{#1}}}
+\skvrobustdef*\skv@t@stopte#1{\skv@testopt{\skv@t@st@pte{#1}}{KV}}
+\skvrobustdef*\skv@t@st@pte#1[#2]{%
+ % Only one prefix is allowed:
+ \skvxifin{,}{\detokenize{#2}}{%
+ \skv@err{Only one prefix is allowed, but you gave '#2'}\@ehd
}{%
- \ifswitchon{SKV@pl}{%
- \@namedef{#1@#2@#4@func}{%
- #7\relax\ifswitchon{#3#4}{\switchoff{#3#6}}{}%
- }%
- }{%
- \@namedef{#1@#2@#4@func}{%
- #7\relax
- \ifswitchon{#3#4}{\switchon{#3#6}\@nameuse{#1@#2@#6@func}}{}%
- }%
- }%
- }%
- \SKV@resstate
- \SKV@compk@y{#1}{#2}{#3}{#4}{#5}{#6}%
-}
-\SKV@def*\SKV@bitogkeys[#1]#2[#3]#4[#5]#6#7#8{%
- \@namedef{#1@#2@#4@func}{%
- #7\relax
- \iftogon{#3#4}{\togoff{#3#6}}{\togon{#3#6}#8\relax}%
- }%
- \@namedef{#1@#2@#6@func}{%
- #8\relax
- \iftogon{#3#6}{\togoff{#3#4}}{\togon{#3#4}#7\relax}%
- }%
- \SKV@compk@y{#1}{#2}{#3}{#4}{#5}{#6}%
-}
-\SKV@def*\SKV@unitogkeys[#1]#2[#3]#4[#5]#6#7#8{%
- \@namedef{#1@#2@#4@func}{%
- #7\relax
- \iftogon{#3#4}{\togon{#3#6}#8\relax}{\togoff{#3#6}}%
- }%
- \@namedef{#1@#2@#6@func}{%
- #8\relax
- \iftogon{#3#6}{\togon{#3#4}#7\relax}{\togoff{#3#4}}%
+ \skv@makeprefix{#2}%
+ \skvifnextchar<{\skv@@t@st@pte{#1}}%
+ {\skv@@t@st@pte{#1}<\@currname.\@currext>}%
}%
- \SKV@compk@y{#1}{#2}{#3}{#4}{#5}{#6}%
}
-\SKV@def*\SKV@biunitogkeys[#1]#2[#3]#4[#5]#6#7#8{%
- \@namedef{#1@#2@#6@func}{#8}%
- \ifswitchon{SKV@st}{%
- \ifswitchon{SKV@pl}{%
- \@namedef{#1@#2@#4@func}{%
- #7\relax\iftogoff{#3#4}{\togoff{#3#6}}{}%
- }%
- }{%
- \@namedef{#1@#2@#4@func}{%
- #7\relax\iftogoff{#3#4}{\togon{#3#6}#8\relax}{}%
- }%
- }%
+\skvrobustdef*\skv@@t@st@pte#1<#2>{%
+ \edef\skv@fams{#2}%
+ \skvxifin{,}{\detokenize{#2}}{%
+ \skvcsvnormalize\skv@fams
}{%
- \ifswitchon{SKV@pl}{%
- \@namedef{#1@#2@#4@func}{%
- #7\relax\iftogon{#3#4}{\togoff{#3#6}}{}%
- }%
- }{%
- \@namedef{#1@#2@#4@func}{%
- #7\relax\iftogon{#3#4}{\togon{#3#6}#8\relax}{}%
- }%
- }%
+ \skvdespacecontent\skv@fams
}%
- \SKV@resstate
- \SKV@compk@y{#1}{#2}{#3}{#4}{#5}{#6}%
+ \skv@testopt{#1}{}%
}
-\SKV@def*\SKV@compk@y#1#2#3#4#5#6{%
- \SKV@c@mpkey+[#1]{#2}[#3]{#4}[#5]{\@nameuse{#1@#2@#4@func}}%
- {\SKV@inputerr{##1}{#4}}%
- \SKV@c@mpkey+[#1]{#2}[#3]{#6}[#5]{\@nameuse{#1@#2@#6@func}}%
- {\SKV@inputerr{##1}{#6}}%
-}
-\SKV@pdef*\SKV@keylistrema#1\@nil#2{%
- \long\edef\SKV@remainder{\unexpanded{#1}}%
- \SKV@oifblank{\SKV@remainder}{}{%
- \def\SKV@tempa##1#2\@nil{\def\SKV@remainder{##1}}%
- \expandafter\SKV@tempa\SKV@remainder\@nil
- }%
-}
-\SKV@pdef*\define@keylist{%
- \SKV@define@keylist\define@key\define@cmdkey
- \define@boolkey\define@togkey\define@choicekey
-}
-\SKV@pdef*\newkeylist{%
- \SKV@define@keylist\newordkey\newcmdkey
- \newboolkey\newtogkey\newchoicekey
-}
-\newcommand*\SKV@define@keylist[5]{%
- \let\SKV@def@ordkey#1%
- \let\SKV@def@cmdkey#2%
- \let\SKV@def@boolkey#3%
- \let\SKV@def@togkey#4%
- \let\SKV@def@choicekey#5%
- \SKV@savstate
- \begingroup
- \@makeother{\#}%
- \SKV@t@stopta\SKV@d@fine@keylist
+
+\skvrobustdef*\skveveryunknownoption{\skvdeclareoption*}
+% \skvdeclareoption[<pref>]<<fam>>{<key>}[<defa>]{<callback>}
+% \skvdeclareoption*{<message>}
+\skvrobustdef*\skvdeclareoption{%
+ \let\@fileswith@pti@ns\@badrequireerror
+ \let\skvdefkey\skvordkey
+ \skvifstar\skv@dox\skv@dox@a
+}
+% \skvdeclarevoidoption[<pref>]<<fam>>{<key>}[<defa>]{<callback>}
+\skvrobustdef*\skvdeclarevoidoption{%
+ \let\@fileswith@pti@ns\@badrequireerror
+ \let\skvdefkey\skvvoidkey
+ \skv@dox@a
+}
+% \skvdeclarebooloption[<pref>]<<fam>>[<mp>]{<key>}[<defa>]{<callback>}
+\skvrobustdef*\skvdeclarebooloption{%
+ \let\@fileswith@pti@ns\@badrequireerror
+ \let\skvdefkey\skvboolkey
+ \skv@dox@a
+}
+% \skvdeclarecmdoption[<pref>]<<fam>>[<mp>]{<key>}[<defa>]{<callback>}
+\skvrobustdef*\skvdeclarecmdoption{%
+ \let\@fileswith@pti@ns\@badrequireerror
+ \let\skvdefkey\skvcmdkey
+ \skv@dox@a
}
-\SKV@def*\choicekeyvalues{%
- \SKV@t@stopta{\SKV@testopt\SKV@choic@keyvalues\SKV@keyprefix}}
-\SKV@def*\SKV@choic@keyvalues[#1]{%
- \SKV@testopt{\SKV@choic@keyv@lues[#1]}\SKV@keyfamily}
-\SKV@def*\SKV@choic@keyv@lues[#1][#2]#3#4{%
- \ifSKV@st
- \SKV@csedef{#1@#2@#3@altlist}{#4}%
- \else
- \SKV@ifcsundef{#1@#2@#3@altlist}{%
- \SKV@csedef{#1@#2@#3@altlist}{#4}%
- }{%
- \SKV@err
- {Problem with \string\choicekeyvalues\space for key '#3'}%
- {You have attempted to set two \string\choicekeyvalues\SKV@MB
- for choice key '#3' in the same family '#2'\SKV@MB
- with the same prefix '#1'. You can only do\SKV@MB
- that if you use the starred variant of \string\choicekeyvalues.}%
+
+% Our default action for unknown options is tied to \@currname & \@currext:
+\skvrobustdef\skv@dox#1{%
+ \skvcsedef{skv@dox@\@currname @\@currext}{%
+ \unexpanded{%
+ \begingroup
+ \ifx\skvcurrentvalue\skv@novaluetoks
+ \def\skvcurrentvalue{no value}%
+ \fi
+ \@onelevel@sanitize\CurrentOption
+ \@onelevel@sanitize\skvcurrentvalue
+ #1%
+ \endgroup
}%
- \fi
-}
-\SKV@newlet\CKVS\choicekeyvalues
-\SKV@def*\SKV@detok@z@p#1{%
- \edef#1{\detokenize\expandafter{#1}\space}%
- \edef#1{\expandafter\zap@space#1\@empty}%
-}
-\SKV@def*\SKV@detok@zsp#1{%
- \SKV@ensurescape{#1}%
- \begingroup
- \SKV@for*[,]#1\SKV@tempa{%
- \edef\SKV@tempa{\detokenize\expandafter{\SKV@tempa}\space}%
- \edef\SKV@tempa{\expandafter\zap@space\SKV@tempa\@empty}%
- \SKV@csxdef*{SKV@zsp@\expandafter\@gobble\SKV@tempa}%
- {\SKV@expox{\SKV@tempa}}%
}%
- \endgroup
}
-\SKV@def*\SKV@detok@dsp#1{%
- \SKV@ensurescape{#1}%
- \begingroup
- \SKV@for*[,]#1\SKV@tempa{%
- \edef\SKV@tempa{\detokenize\expandafter{\SKV@tempa}}%
- \SKV@despacectt\SKV@tempa
- \SKV@csxdef*{SKV@dsp@\expandafter\@gobble\SKV@tempa}%
- {\SKV@expox{\SKV@tempa}}%
- }%
- \endgroup
+\skvrobustdef*\skv@dox@a{\skv@testopt\skv@dox@b{KV}}
+\skvrobustdef*\skv@dox@b[#1]{%
+ \skvifnextchar<%
+ {\skv@dox@c{#1}}%
+ {\skv@dox@c{#1}<\@currname.\@currext>}%
}
-\SKV@def*\SKV@exceplist{%
- \par,\if,\ifcase,\or,\else,\skif,\iftog,\ifswitch}
-\SKV@detok@dsp\SKV@exceplist
-\SKV@def*\SKV@noiferr#1#2{%
- \SKV@err{You can't use '\@backslashchar #1' in\SKV@MB
- key macro within keylist}%
- {Use '\@backslashchar #2' instead of '\@backslashchar #1'.}%
+\skvrobustdef*\skv@dox@c#1<#2>{\skvdefkey[#1]{#2}}
+
+% \skvexecuteoptions+[<pref>]<fams>[<na>]{<kvlist>}
+% This has no star (*) variant; any star suffix is quietly ignored.
+\skvrobustdef*\skvexecuteoptions{%
+ \skv@testopte{\skv@stfalse\skv@setkeys@a}%
}
-\SKV@pdef*\uservalue{\uservalue}
-\SKV@pdef*\guservalue{\guservalue}
-\SKV@pdef*\savevalue{\savevalue}
-\SKV@pdef*\gsavevalue{\gsavevalue}
-\SKV@def\SKV@define@multkeys#1,#2,#3,#4\@nil{%
- \let\SKV@altlisterr\z@
- \SKV@sp@def{#1}\SKV@tempa
- \SKV@checkchoice{\SKV@tempa}{ord,cmd,bool,tog,choice,menu}{%
- \ifnum\nr=5%
- \let\SKV@keytype\nr
- \else
- \edef\SKV@keytype{\the\numexpr\nr+1}%
- \fi
+
+% \skvprocessoptions*+[<pref>]{<fams>}[<na>]
+%
+% 1. If not using LaTeX, then no processing of options.
+% 2. The plus (+) variant of \skvprocessoptions will process the options
+% in all the listed families. But the star form of \skvprocessoptions
+% doesn't seem to make sense here, since - unlike in LaTeX2e - a star
+% suffix here would mean 'save unknown keys'. It is meaningless to seek
+% to save unknown keys when processing options. Any star (*) suffix on
+% \skvprocessoptions is, therefore, quietly ignored.
+% 3. Class options are always processed first, but class options ocurring
+% also local/package options are dropped from the list of options
+% to be processed.
+\skvrobustdef*\skvprocessoptions{\skv@testopte\skv@pox}
+\skvrobustdef*\skv@pox[#1]{%
+ \skv@inpoxtrue
+ \let\@fileswith@pti@ns\@badrequireerror
+ \begingroup
+ \let\skv@classoptsfound\@empty
+ \let\skv@exitpoxkeys\@empty
+ \edef\skv@testclass{\@currname.\@currext}%
+ \skvifx\skv@testclass\skv@documentclass{%
+ \let\@unusedoptionlist\skv@classoptionslist
}{%
- \SKV@checkchoice{\SKV@tempa}{1,2,3,4,5}{%
- \edef\SKV@keytype{\the\numexpr\nr+1}%
- }{%
- \SKV@err{Unknown key type/identifier '\string#1'}%
- {Valid key types are 'ord', 'cmd', 'bool', 'tog',
- 'choice', 'menu',\SKV@MB and '1', '2', '3', '4', '5'}%
- }%
- }%
- \SKV@ifnotempty{#2}{}{%
- \SKV@err{No key name specified for key type '\string#1'}%
- {\string\define@keylist: key name required for all keys}%
- }%
- \begingroup
- \SKV@ifblank{#4}{}{%
- \edef\SKV@tempb{\detokenize{#4}\space}%
- \edef\SKV@tempb{\expandafter\zap@space\SKV@tempb\@empty}%
- \@expandtwoargs\SKV@in@\SKV@dsp@if\SKV@tempb
- \ifin@
- \@expandtwoargs\SKV@in@\SKV@dsp@iftog\SKV@tempb
- \ifin@\else
- \@expandtwoargs\SKV@in@\SKV@dsp@ifswitch\SKV@tempb
- \ifin@\else\SKV@noiferr{if}{skif}\fi
- \fi
+ \skv@swafalse
+ \ifx\skv@classoptionslist\@empty\else
+ \ifskv@st\skv@swatrue\fi
\fi
- \@expandtwoargs\SKV@in@\SKV@dsp@par\SKV@tempb
- \ifin@\SKV@afterfi\SKV@noiferr{par}{endgraf}\fi
- \@expandtwoargs\SKV@in@\SKV@dsp@ifcase\SKV@tempb
- \ifin@\SKV@afterfi\SKV@noiferr{ifcase}{skifcase}\fi
- \@expandtwoargs\SKV@in@\SKV@dsp@or\SKV@tempb
- \ifin@\SKV@afterfi\SKV@noiferr{or}{skor}\fi
- \@expandtwoargs\SKV@in@\SKV@dsp@else\SKV@tempb
- \ifin@\SKV@afterfi\SKV@noiferr{else}{skelse}\fi
- }%
- \protected@edef\SKV@tempa{\endgroup
- \ifcase\SKV@keytype\relax
- \or
- \noexpand\SKV@def@ordkey[\SKV@keyprefix]{\SKV@keyfamily}%
- {#2}[#3]{\unexpanded{#4}}%
- \or
- \noexpand\SKV@def@cmdkey[\SKV@keyprefix]{\SKV@keyfamily}%
- [\SKV@macroprefix]{#2}[#3]{\unexpanded{#4}}%
- \or
- \noexpand\SKV@def@boolkey+[\SKV@keyprefix]{\SKV@keyfamily}%
- [\SKV@macroprefix]{#2}[#3]{\unexpanded{#4}}{%
- \unexpanded{\SKV@inputerr{##1}{#2}}%
- }%
- \or
- \noexpand\SKV@def@togkey+[\SKV@keyprefix]{\SKV@keyfamily}%
- [\SKV@macroprefix]{#2}[#3]{\unexpanded{#4}}{%
- \unexpanded{\SKV@inputerr{##1}{#2}}%
+ \skvifnotbool{skv@swa}{}{%
+ \skvcommaloop*\skv@classoptionslist\CurrentOption{%
+ \expandafter\expandafter\expandafter
+ \skv@g@tkeyname\CurrentOption=\skv@nil\skvcurrentkey
+ \skvexpanded{%
+ % Test if key is defined in one of the families. The search will
+ % stop as soon as the key is found in any of the families.
+ \skvifkeyundef[\skvcurrentprefix]{\skv@fams}{\skvcurrentkey}%
+ }{}{%
+ \edef\skv@classoptsfound{%
+ \skvexpandonce\skv@classoptsfound
+ \ifx\skv@classoptsfound\@empty\else,\fi
+ \skvexpandonce\CurrentOption
+ }%
+ \expandafter\skv@useoption\expandafter{\CurrentOption}%
}%
- \or
- \SKV@ifcsdef{\SKV@keyprefix @\SKV@keyfamily @#2@altlist}{}%
- {\let\SKV@altlisterr\@ne}%
- \noexpand\SKV@def@choicekey*+[\SKV@keyprefix]{\SKV@keyfamily}{#2}%
- [\unexpanded{\val\nr}]{%
- \SKV@csuse{\SKV@keyprefix @\SKV@keyfamily @#2@altlist}%
- }[#3]{\unexpanded{#4}}{\unexpanded{\SKV@inputerr{##1}{#2}}}%
- \fi
- }%
- \SKV@tempa
- \ifnum\SKV@altlisterr=\@ne
- \SKV@afterfi
- \SKV@err{%
- Choice key '#2' can't be defined.\SKV@MB
- Alternate key values list for '#2' is empty
- }{%
- You need to first define admissible\SKV@MB
- key values through '\string\choicekeyvalues'\SKV@MB
- for choice key '#2'.
}%
- \fi
-}
-\SKV@def*\SKV@resvfampf#1#2{%
- \begingroup
- \SKV@expnext\XKV@checksanitizeb#2\SKV@tempa
- \SKV@despacelist*\SKV@tempa
- \XKV@knftrue
- \XKV@whilist\SKV@tempa\SKV@tempa\ifXKV@knf\fi{%
- \SKV@aftercs\ifx{XKV@#1}\SKV@tempa\XKV@knffalse\fi
- }%
- \unless\ifXKV@knf
- \SKV@afterfi
- \SKV@err{Key #1 '\SKV@tempa' is reserved}%
- {You have used a reserved key #1: '\SKV@tempa'.\SKV@MB
- Use another #1 name instead of '\SKV@tempa'.}%
- \fi
- \endgroup
-}
-\SKV@redef*\XKV@makepf#1{%
- \SKV@sp@def{#1}\XKV@prefix
- \unless\ifSKV@sk
- \SKV@resvfampf{prefix}\SKV@rkpnames
- \fi
- \edef\SKV@pref{\ifx\XKV@prefix\@empty\else\XKV@prefix\fi}%
- \edef\XKV@prefix{\ifx\XKV@prefix\@empty\else\XKV@prefix @\fi}%
-}
-\SKV@redef*\XKV@makehd#1{%
- \SKV@expargs{3}\SKV@sp@def{{#1}}\XKV@header\@nil
- \unless\ifSKV@sk
- \SKV@resvfampf{family}\SKV@rfnames
- \fi
- \edef\XKV@header{%
- \XKV@prefix\ifx\XKV@header\@empty\else\XKV@header @\fi}%
-}
-\SKV@def*\SKV@resolvekey#1#2\@nil#3{%
- \def\SKV@resolve##1#2##2##3\@nil##4{%
- \edef##4{\unexpanded{##2}}%
- \ifx##4\@nnil
- \edef##4{\unexpanded{##1}}%
- \expandafter\@secondoftwo
- \else
- \expandafter\@firstoftwo
- \fi
- }%
- \SKV@resolve#1#2{\@nil}\@nil#3%
-}
-\SKV@def*\SKV@addtouserval{%
- \SKV@addtolist+{SKV@\XKV@header uservalue}\SKV@resa}
-\SKV@def*\SKV@gaddtouserval{%
- \SKV@addtolist+!{SKV@\XKV@header uservalue}\SKV@resa}
-\SKV@def*\SKV@addtosave{\SKV@addtolist+{XKV@\XKV@header save}\SKV@resa}
-\SKV@def*\SKV@gaddtosave{\begingroup
- \edef\SKV@tempa{\endgroup
- \SKV@addtolist+!{XKV@\XKV@header save}{\global{\SKV@resa}}}%
- \SKV@tempa
-}
-\SKV@def*\SKV@findkeypointers#1{%
- \SKV@resolvekey{#1}\uservalue\savevalue\@nil\SKV@resa
- {\SKV@addtouserval\SKV@addtosave}%
- {\SKV@resolvekey{#1}\guservalue\savevalue\@nil\SKV@resa
- {\SKV@gaddtouserval\SKV@addtosave}%
- {\SKV@resolvekey{#1}\savevalue\uservalue\@nil\SKV@resa
- {\SKV@addtouserval\SKV@addtosave}%
- {\SKV@resolvekey{#1}\gsavevalue\uservalue\@nil\SKV@resa
- {\SKV@addtouserval\SKV@gaddtosave}%
- {\SKV@resolvekey{#1}\guservalue\gsavevalue\@nil\SKV@resa
- {\SKV@gaddtouserval\SKV@gaddtosave}%
- {\SKV@resolvekey{#1}\gsavevalue\guservalue\@nil\SKV@resa
- {\SKV@gaddtouserval\SKV@gaddtosave}%
- {\SKV@resolvekey{#1}\uservalue\@nil\SKV@resa
- {\SKV@addtouserval}%
- {\SKV@resolvekey{#1}\guservalue\@nil\SKV@resa
- {\SKV@gaddtouserval}%
- {\SKV@resolvekey{#1}\savevalue\@nil\SKV@resa
- {\SKV@addtosave}%
- {\SKV@resolvekey{#1}\gsavevalue\@nil\SKV@resa
- {\SKV@gaddtosave}%
- {}}}}}}}}}}%
-}
-\SKV@predef*\define@key{\SKV@skfalse\XKV@testoptb\XKV@define@key}
-\def\XKV@define@key#1{%
- \SKV@findkeypointers{#1}%
- \SKV@ifcsundef{\XKV@header\SKV@resa}{}{%
- \SKV@vbmsg{warn}{%
- Key '\SKV@resa' in family '\XKV@tfam' with\SKV@MB
- prefix '\SKV@pref' redefined\on@line}
- \SKV@csundef{\XKV@header\SKV@resa}%
- }%
- \SKV@expnext\SKV@reservkey@err\SKV@resa
- \SKV@expnext\SKV@suspkey@err\SKV@resa
- \begingroup
- \edef\SKV@tempa{\endgroup
- \SKV@if@brack{\noexpand\XKV@d@fine@key{\SKV@resa}}%
- {\noexpand\SKV@d@fine@key{\SKV@resa}}%
- }%
- \SKV@tempa
-}
-\def\XKV@d@fine@key#1[#2]#3{%
- \XKV@define@default{#1}{#2}%
- \@namedef{\XKV@header#1}##1{#3}%
-}
-\def\SKV@d@fine@key#1#2{\@namedef{\XKV@header#1}##1{#2}}
-\SKV@def*\SKV@reservmp#1#2{%
- \begingroup
- \SKV@sp@def{#1}\SKV@tempb
- \SKV@expnext\XKV@checksanitizeb#2\SKV@tempa
- \SKV@despacelist*\SKV@tempa
- \XKV@knftrue
- \XKV@whilist\SKV@tempa\SKV@tempa\ifXKV@knf\fi{%
- \ifx\SKV@tempb\SKV@tempa\XKV@knffalse\fi
- }%
- \unless\ifXKV@knf
- \SKV@afterfi
- \SKV@err{Macro prefix '\SKV@tempa' is reserved}%
- {You have used a reserved macro prefix: '\SKV@tempa'.\SKV@MB
- Use another macro prefix name instead of '\SKV@tempa'.}%
- \fi
- \endgroup
-}
-\SKV@predef*\define@cmdkey{%
- \SKV@skfalse\XKV@testoptd\XKV@define@cmdkey{cmd}}
-\SKV@predef*\define@cmdkeys{%
- \SKV@skfalse\XKV@testoptd\XKV@define@cmdkeys{cmd}}
-\def\XKV@define@cmdkey#1#2[#3]#4{%
- \SKV@reservmp{#1}\SKV@rmpnames
- \SKV@findkeypointers{#2}%
- \SKV@ifcsundef{\XKV@header\SKV@resa}{}{%
- \SKV@vbmsg{warn}{%
- Key '\SKV@resa' in family '\XKV@tfam' with\SKV@MB
- prefix '\SKV@pref' redefined\on@line}
- \SKV@Undef+{\XKV@header\SKV@resa,#1\SKV@resa}%
- }%
- \SKV@expnext\SKV@reservkey@err\SKV@resa
- \SKV@expnext\SKV@suspkey@err\SKV@resa
- \ifXKV@st
- \SKV@afterfi
- \SKV@expnext\XKV@define@default\SKV@resa{#3}%
- \fi
- \begingroup
- \def\SKV@tempa{%
- \expandafter\def\csname\XKV@header\SKV@resa\endcsname####1}%
- \SKV@threexp\endgroup\expandafter\SKV@tempa\expandafter%
- {\expandafter\def\csname#1\SKV@resa\endcsname{##1}#4}%
-}
-\SKV@predef*\define@choicekey{\SKV@skfalse
- \XKV@testopta{\XKV@testoptb\XKV@define@choicekey}}
-\SKV@newlet\define@menukey\define@choicekey
-\def\XKV@define@choicekey#1{%
- \SKV@findkeypointers{#1}%
- \SKV@ifcsundef{\XKV@header\SKV@resa}{}{%
- \SKV@vbmsg{warn}{%
- Key '\SKV@resa' in family '\XKV@tfam' with\SKV@MB
- prefix '\SKV@pref' redefined\on@line}
- \SKV@csundef{\XKV@header\SKV@resa}%
- }%
- \SKV@expnext\SKV@reservkey@err\SKV@resa
- \SKV@expnext\SKV@suspkey@err\SKV@resa
- \begingroup
- \edef\SKV@tempa{\endgroup
- \SKV@testopt{\noexpand\XKV@d@fine@choicekey{\SKV@resa}}{}%
- }%
- \SKV@tempa
-}
-\SKV@predef*\define@boolkey{\SKV@skfalse
- \XKV@t@stopta{\XKV@testoptd\XKV@define@boolkey{}}}
-\SKV@predef*\define@boolkeys{\SKV@skfalse
- \XKV@plfalse\XKV@testoptd\XKV@define@boolkeys{}}
-\def\XKV@define@boolkey#1#2[#3]{%
- \SKV@findkeypointers{#2}%
- \SKV@ifcsundef{\XKV@header\SKV@resa}{}{%
- \SKV@vbmsg{warn}{%
- Key '\SKV@resa' in family '\XKV@tfam' with\SKV@MB
- prefix '\SKV@pref' redefined\on@line}%
- \SKV@Undef+{\XKV@header\SKV@resa,#1\SKV@resa}%
- }%
- \SKV@expnext\SKV@reservkey@err\SKV@resa
- \SKV@expnext\SKV@suspkey@err\SKV@resa
- \ifXKV@pl
- \def\SKV@next{\SKV@aftercs\XKV@d@f@ne@boolkey}%
- \else
- \def\SKV@next{\SKV@aftercs\XKV@d@fine@boolkey}%
- \fi
- \edef\SKV@tempa{{\XKV@header\SKV@resa}{\SKV@resa}{#1\SKV@resa}{#3}}%
- \expandafter\SKV@next\SKV@tempa
-}
-\def\XKV@d@fine@boolkey#1#2#3#4#5{%
- \XKV@d@f@ne@b@olkey#1{#2}{#3}{#4}%
- {{\SKV@expargs{0}{\SKV@getswstate\XKV@d@fine@boolkey}\XKV@resa\@nil
- \csname#3\SKV@swval\endcsname#5}}%
-}
-\def\XKV@d@f@ne@boolkey#1#2#3#4#5#6{%
- \XKV@d@f@ne@b@olkey#1{#2}{#3}{#4}%
- {{\SKV@expargs{0}{\SKV@getswstate\XKV@d@f@ne@boolkey}\XKV@resa\@nil
- \csname#3\SKV@swval\endcsname#5}{#6}}%
-}
-\def\XKV@d@f@ne@b@olkey#1#2#3#4#5{%
- \csnewif{if#3}%
- \ifXKV@st\XKV@define@default{#2}{#4}\fi
- \edef#1##1{%
- \def#1####1{##1\unexpanded{\XKV@sttrue\XKV@checkchoice[\XKV@resa]}%
- {####1}{true,false,on,off}\unexpanded{#5}%
+ \ifx\skv@classoptsfound\@empty\else\skvafterfi
+ \skvexpbracenext\skv@getkeynames\skv@classoptsfound\skv@tempd
+ \skvexpbracenext\skv@getpoxkeys\skv@tempd
+ \fi
}%
}%
- \ifXKV@pl#1\XKV@pltrue\else#1\XKV@plfalse\fi
-}
-\def\XKV@d@fine@boolkeys#1#2#3{%
- \SKV@findkeypointers{#1}%
- \SKV@ifcsundef{\XKV@header\SKV@resa}{}{%
- \SKV@vbmsg{warn}{%
- Key '\SKV@resa' in family '\XKV@tfam' with\SKV@MB
- prefix '\SKV@pref' redefined\on@line}
- \SKV@Undef+{\XKV@header\SKV@resa,#2\SKV@resa}%
- }%
- \SKV@expnext\SKV@reservkey@err\SKV@resa
- \SKV@expnext\SKV@suspkey@err\SKV@resa
- \edef\SKV@tempa##1##2##3{%
- ##1\@nameuse{\XKV@header\SKV@resa}{\SKV@resa}%
- {#2\SKV@resa}{#3}{{##2{#2\SKV@resa##3}}}%
- }%
- \SKV@tempa\XKV@d@f@ne@b@olkey\@nameuse\XKV@resa
-}
-\SKV@pdef*\reserve@keys{\@testopt\SKV@reserve@keys{KV}}
-\SKV@def*\SKV@reserve@keys[#1]#2#3{%
- \XKV@checksanitizeb{#1}\SKV@tempa
- \SKV@despacelist*\SKV@tempa
- \SKV@for*[,]\SKV@tempa\SKV@tempa{%
- \SKV@expnext\SKV@res@rve@keys\SKV@tempa{#2}{#3}%
- }%
-}
-\SKV@def*\SKV@res@rve@keys#1#2#3{%
- \XKV@makepf{#1}%
- \XKV@checksanitizeb{#2}\XKV@fams
- \SKV@despacelist*\XKV@fams
- \SKV@for@b\XKV@fams\XKV@tfam{%
- \XKV@makehd\XKV@tfam
- \SKV@res@rve@k@ys{#3}%
- }%
-}
-\SKV@def*\SKV@res@rve@k@ys#1{%
- \XKV@checksanitizeb{#1}\SKV@tempa
- \SKV@despacelist*\SKV@tempa
- \SKV@for@b\SKV@tempa\SKV@tempa{%
- \SKV@ifcsdef{\XKV@header\SKV@tempa}{%
- \SKV@err{%
- Key '\SKV@tempa' with prefix '\SKV@pref' in family
- \SKV@MB '\XKV@tfam' is already defined
- }{%
- Key '\SKV@tempa' in family '\XKV@tfam' can't be reserved.
- \SKV@MB You may wish to remove it before reserving it.
- \SKV@MB In that case, you can use '\string\remove@keys'.
- }%
- }{%
- \SKV@csedef*{\XKV@header\SKV@tempa}{%
- \SKV@err{%
- Key '\SKV@tempa' with prefix '\SKV@pref' in family
- '\XKV@tfam'\SKV@MB was reserved\on@line
- }{%
- Unreserve '\SKV@tempa' before use.
+ \skvletcs\skv@pkgorclsopts{opt@\@currname.\@currext}%
+ \skvifx\skv@pkgorclsopts\@empty{}{%
+ \skvifx\skv@pkgorclsopts\relax{}{%
+ \skvexpbracenext\skv@getkeynames\skv@pkgorclsopts\skv@tempd
+ \skvexpbracenext\skv@getpoxkeys\skv@tempd
+ }%
+ }%
+ % Package options have higher priority than class options. Hence
+ % filter class options \skv@classoptsfound that are also present
+ % as package options \skv@pkgorclsopts:
+ \ifcase0\ifx\skv@classoptsfound\@empty0\else
+ \ifx\skv@pkgorclsopts\@empty0\else
+ \ifx\skv@pkgorclsopts\relax0\else1\fi\fi\fi\relax
+ \else\skvafterfi
+ \skvifx\skv@testclass\skv@documentclass{}{%
+ \skvcommaloop*\skv@classoptsfound\CurrentOption{%
+ \expandafter\expandafter\expandafter
+ \skv@g@tkeyname\CurrentOption=\skv@nil\skv@tempa
+ \skvxifin{,\skvoxdetok\skv@tempa,}{,\skvoxdetok\skv@tempd,}{}{%
+ \edef\skv@pkgorclsopts{%
+ \skvexpandonce\skv@pkgorclsopts,\skvexpandonce\CurrentOption
+ }%
}%
}%
- \SKV@csdef*{\XKV@header\SKV@tempa @reser}{}%
}%
- }%
-}
-\SKV@def*\SKV@reservkey@err#1{%
- \SKV@ifcsdef{\XKV@header#1@reser}\SKV@err\@gobbletwo
- {Key '#1' with prefix '\SKV@pref'\SKV@MB
- is reserved in family '\XKV@tfam'}{Unreserve '#1' before use.}%
-}
-\SKV@def*\ifkeyreserved{\@testopt\SKV@ifkeyreserved{KV}}
-\SKV@def*\SKV@ifkeyreserved[#1]#2#3{%
- \XKV@checksanitizeb{#1}\SKV@tempa
- \SKV@despacelist*\SKV@tempa
- \SKV@swtrue
- \SKV@for*[,]\SKV@tempa\SKV@tempa{%
- \SKV@expnext\SKV@ifkey@reserved\SKV@tempa{#2}{#3}%
- }%
- \@nameuse{SKV@\ifSKV@sw2\else1\fi of2}%
-}
-\SKV@def*\SKV@ifkey@reserved#1#2#3{%
- \XKV@makepf{#1}%
- \XKV@checksanitizeb{#2}\XKV@fams
- \SKV@despacelist*\XKV@fams
- \SKV@sp@def{#3}\XKV@tkey
- \XKV@whilist\XKV@fams\XKV@tfam\ifSKV@sw\fi{%
- \XKV@makehd\XKV@tfam
- \SKV@ifcsdef{\XKV@header\XKV@tkey @reser}\SKV@swfalse\relax
- }%
-}
-\SKV@def*\ifkeysuspended{\@testopt\SKV@ifkeysuspended{KV}}
-\SKV@def*\SKV@ifkeysuspended[#1]#2#3{%
- \XKV@checksanitizeb{#1}\SKV@tempa
- \SKV@despacelist*\SKV@tempa
- \SKV@swtrue
- \SKV@for*[,]\SKV@tempa\SKV@tempa{%
- \SKV@expnext\SKV@ifkey@suspended\SKV@tempa{#2}{#3}%
- }%
- \@nameuse{SKV@\ifSKV@sw2\else1\fi of2}%
-}
-\SKV@def*\SKV@ifkey@suspended#1#2#3{%
- \XKV@makepf{#1}%
- \XKV@checksanitizeb{#2}\XKV@fams
- \SKV@despacelist*\XKV@fams
- \SKV@sp@def{#3}\XKV@tkey
- \XKV@whilist\XKV@fams\XKV@tfam\ifSKV@sw\fi{%
- \XKV@makehd\XKV@tfam
- \SKV@ifcsdef{\XKV@header\XKV@tkey @susp}\SKV@swfalse\relax
- }%
-}
-\SKV@def*\ifkeydefined{\@testopt\SKV@ifkeydefined{KV}}
-\SKV@def*\SKV@ifkeydefined[#1]#2#3{%
- \XKV@checksanitizeb{#1}\SKV@tempa
- \SKV@despacelist*\SKV@tempa
- \SKV@swtrue
- \SKV@for*[,]\SKV@tempa\SKV@tempa{%
- \SKV@expnext\SKV@ifk@ydefined\SKV@tempa{#2}{#3}%
- }%
- \@nameuse{SKV@\ifSKV@sw2\else1\fi of2}%
-}
-\SKV@def*\SKV@ifk@ydefined#1#2#3{%
- \XKV@makepf{#1}%
- \XKV@checksanitizeb{#2}\XKV@fams
- \SKV@despacelist*\XKV@fams
- \SKV@sp@def{#3}\XKV@tkey
- \XKV@whilist\XKV@fams\XKV@tfam\ifSKV@sw\fi{%
- \XKV@makehd\XKV@tfam
- \SKV@ifcsdef{\XKV@header\XKV@tkey}\SKV@swfalse\relax
- }%
-}
-\SKV@def*\SKV@disabledkey@err{%
- \SKV@err{%
- Key '\SKV@disabledkey' with prefix '\SKV@pref' in family
- \SKV@MB '\XKV@tfam' was disabled\on@line
- }{%
- You can't set or reset '\SKV@disabledkey' at this\SKV@MB
- late stage. Perhaps you're required to set it \SKV@MB
- earlier, within a package or in the document's preamble.
- }%
-}
-\def\disable@keys{%
- \SKV@ifstar{\@testopt\XKV@disable@keys{KV}}%
- {\@testopt\SKV@disable@keys{KV}}%
-}
-\SKV@def*\SKV@disable@keys[#1]#2#3{%
- \SKV@locfalse
- \XKV@checksanitizeb{#1}\SKV@tempa
- \SKV@despacelist*\SKV@tempa
- \SKV@for*[,]\SKV@tempa\SKV@tempa{%
- \SKV@expnext\SKV@dis@ble@keys\SKV@tempa{#2}{#3}%
- }%
-}
-\SKV@def*\SKV@dis@ble@keys#1#2#3{%
- \XKV@makepf{#1}%
- \XKV@checksanitizeb{#2}\XKV@fams
- \SKV@despacelist*\XKV@fams
- \SKV@for@b\XKV@fams\XKV@tfam{%
- \XKV@makehd\XKV@tfam
- \SKV@dis@ble@k@ys{#3}%
- }%
-}
-\SKV@def*\SKV@dis@ble@k@ys#1{%
- \XKV@checksanitizeb{#1}\SKV@tempa
- \SKV@despacelist*\SKV@tempa
- \SKV@for@b\SKV@tempa\SKV@tempa{%
- \SKV@ifcsundef{\XKV@header\SKV@tempa}{%
- \ifSKV@verbose\SKV@disabledkey@warn\fi
- }{%
- \SKV@dis@ble@k@y@\SKV@tempa
- }%
- }%
-}
-\def\SKV@disabledkey@warn{%
- \SKV@warn{Key '\SKV@tempa' with prefix '\SKV@pref'
- \SKV@MB is undefined in family '\XKV@tfam':
- \SKV@MB can't be \ifSKV@loc localized
- \else disabled\fi\on@line
- }%
-}
-\def\SKV@disabledkey@info{%
- \SKV@info{Key '\SKV@disabledkey' with prefix '\SKV@pref'
- in family '\XKV@tfam'\SKV@MB was \ifSKV@loc localized
- \else disabled\fi\on@line
- }%
-}
-\SKV@def*\SKV@dis@ble@k@y@#1{%
- \edef\SKV@disabledkey{#1}%
- \SKV@ifcsundef{\XKV@header#1@default}{%
- \edef#1{\noexpand\XKV@define@key{#1}}%
- }{%
- \edef#1{\noexpand\XKV@define@key{#1}[]}%
- }%
- \SKV@expargs{0}#1\SKV@disabledkey@err\@nil
- \ifSKV@verbose\SKV@disabledkey@info\fi
-}
-\SKV@pdef*\localize@keys{%
- \SKV@onlypackage\SKV@savstate
- \SKV@t@stopta{\@testopt\SKV@localize@keys{KV}}%
-}
-\SKV@def*\SKV@localize@keys[#1]#2#3{%
- \SKV@loctrue
- \ifSKV@st
- \expandafter\SKV@BeforeDocumentStart
- \else
- \expandafter\SKV@AfterPackageEnd
\fi
- {%
- \XKV@checksanitizeb{#1}\SKV@tempa
- \SKV@despacelist*\SKV@tempa
- \SKV@for*[,]\SKV@tempa\SKV@tempa{%
- \SKV@expnext\SKV@dis@ble@keys\SKV@tempa{#2}{#3}%
- }%
- }%
- \SKV@resstate
-}
-\SKV@def*\SKV@suspkey@err#1{%
- \SKV@ifcsdef{\XKV@header#1@susp}\SKV@err\@gobbletwo
- {Key '#1' was suspended from family '\XKV@tfam'}%
- {You can use \string\restore@key\space to restore '#1'.}%
-}
-\SKV@def*\SKV@suspkey@e@r{%
- \SKV@err{Key '\SKV@suspkey' in family '\XKV@tfam' was\SKV@MB
- suspended\on@line}{You can use \string\restore@key\space
- to restore '\SKV@suspkey'.}%
-}
-\SKV@pdef*\suspend@keys{\@testopt\SKV@suspend@keys{KV}}
-\SKV@def*\SKV@suspend@keys[#1]#2#3{%
- \XKV@checksanitizeb{#1}\SKV@tempa
- \SKV@despacelist*\SKV@tempa
- \SKV@for*[,]\SKV@tempa\SKV@tempa{%
- \SKV@expnext\SKV@s@spend@keys\SKV@tempa{#2}{#3}%
- }%
-}
-\SKV@def*\SKV@s@spend@keys#1#2#3{%
- \XKV@makepf{#1}%
- \XKV@checksanitizeb{#2}\XKV@fams
- \SKV@despacelist*\XKV@fams
- \SKV@for@b\XKV@fams\XKV@tfam{%
- \XKV@makehd\XKV@tfam
- \SKV@s@sp@nd@keys{#3}%
- }%
-}
-\SKV@def*\SKV@s@sp@nd@keys#1{%
- \XKV@checksanitizeb{#1}\SKV@tempa
- \SKV@despacelist*\SKV@tempa
- \SKV@for@b\SKV@tempa\SKV@tempa{%
- \SKV@ifcsundef{\XKV@header\SKV@tempa}{%
- \SKV@vbmsg{warn}{%
- Key '\SKV@tempa' with prefix '\SKV@pref'
- \SKV@MB is undefined in family '\XKV@tfam':
- \SKV@MB can't be suspended\on@line}%
- }{%
- \SKV@s@sp@nd@k@ys\SKV@tempa
- }%
- }%
-}
-\SKV@def*\SKV@s@sp@nd@k@ys#1{%
- \SKV@ifcsdef{\XKV@header#1@susp}{%
- \SKV@err{%
- Key '#1' with prefix '\SKV@pref'
- was suspended from family '\XKV@tfam'
- }{%
- You can use \string\restore@key\space to restore '#1'.
- }%
- }{%
- \edef\SKV@suspkey{#1}%
- \global\SKV@csletcs{\XKV@header#1@susp}{\XKV@header#1}%
- \SKV@csedef*{\XKV@header#1}{\SKV@suspkey@e@r}%
- \SKV@vbmsg{info}{Key '\SKV@suspkey' with prefix '\SKV@pref' in
- \SKV@MB family '\XKV@tfam' was suspended\on@line}%
- }%
-}
-\SKV@pdef*\restore@keys{\@testopt\SKV@restore@keys{KV}}
-\SKV@def*\SKV@restore@keys[#1]#2#3{%
- \XKV@checksanitizeb{#1}\SKV@tempa
- \SKV@despacelist*\SKV@tempa
- \SKV@for*[,]\SKV@tempa\SKV@tempa{%
- \SKV@expnext\SKV@r@store@keys\SKV@tempa{#2}{#3}%
- }%
-}
-\SKV@def*\SKV@r@store@keys#1#2#3{%
- \XKV@makepf{#1}%
- \XKV@checksanitizeb{#2}\XKV@fams
- \SKV@despacelist*\XKV@fams
- \SKV@for@b\XKV@fams\XKV@tfam{%
- \XKV@makehd\XKV@tfam
- \SKV@r@st@re@keys{#3}%
- }%
-}
-\SKV@def*\SKV@r@st@re@keys#1{%
- \XKV@checksanitizeb{#1}\SKV@tempa
- \SKV@despacelist*\SKV@tempa
- \SKV@for@b\SKV@tempa\SKV@tempa{%
- \SKV@ifcsundef{\XKV@header\SKV@tempa}{%
- \SKV@vbmsg{warn}{Key '\SKV@tempa' with prefix '\SKV@pref'
- \SKV@MB is undefined in family '\XKV@tfam':
- \SKV@MB can't be restored\on@line}%
- }{%
- \SKV@r@st@re@k@ys\SKV@tempa
- }%
- }%
-}
-\SKV@def*\SKV@r@st@re@k@ys#1{%
- \SKV@ifcsundef{\XKV@header#1@susp}{%
- \SKV@err{Key '#1' wasn't suspended from family
- \SKV@MB '\XKV@tfam': can't be restored\on@line}%
- {I can't restore unsuspended key '#1'}%
- }{%
- \edef\SKV@restoredkey{#1}%
- \SKV@csletcs{\XKV@header#1}{\XKV@header#1@susp}%
- \SKV@csundef{\XKV@header#1@susp}%
- \SKV@vbmsg{info}{Key '\SKV@restoredkey' with prefix
- '\SKV@pref' in family \SKV@MB '\XKV@tfam' restored\on@line}%
- }%
-}
-\SKV@pdef*\remove@keys{\@testopt\SKV@remove@keys{KV}}
-\SKV@def*\SKV@remove@keys[#1]#2#3{%
- \XKV@checksanitizeb{#1}\SKV@tempa
- \SKV@despacelist*\SKV@tempa
- \SKV@for*[,]\SKV@tempa\SKV@tempa{%
- \SKV@expnext\SKV@r@move@keys\SKV@tempa{#2}{#3}%
- }%
-}
-\SKV@def*\SKV@r@move@keys#1#2#3{%
- \XKV@makepf{#1}%
- \XKV@checksanitizeb{#2}\XKV@fams
- \SKV@despacelist*\XKV@fams
- \SKV@for@b\XKV@fams\XKV@tfam{%
- \XKV@makehd\XKV@tfam
- \SKV@r@m@ve@keys{#3}%
- }%
-}
-\SKV@def*\SKV@r@m@ve@keys#1{%
- \XKV@checksanitizeb{#1}\SKV@tempa
- \SKV@despacelist*\SKV@tempa
- \SKV@for@b\SKV@tempa\SKV@tempa{%
- \SKV@ifcsundef{\XKV@header\SKV@tempa @susp}{}{%
- \SKV@err{Key '\SKV@tempa' with prefix '\SKV@pref'
- \SKV@MB was suspended from family '\XKV@tfam':
- \SKV@MB I can't remove/unreserve it\on@line.
- \SKV@MB You need to first restore key '\SKV@tempa'
- \SKV@MB before you can remove/unreserve it}%
- {First restore key '\SKV@tempa' before removing it.}%
- }%
- \SKV@ifcsundef{\XKV@header\SKV@tempa}{%
- \SKV@vbmsg{warn}{Key '\SKV@tempa' with prefix '\SKV@pref'
- \SKV@MB is undefined in family '\XKV@tfam':
- \SKV@MB I can't remove or unreserve it\on@line}%
- }{%
- \SKV@r@m@ve@k@ys\SKV@tempa
- }%
- }%
-}
-\SKV@def*\SKV@r@m@ve@k@ys#1{%
- \begingroup
- \edef\SKV@tempa{\XKV@header#1,\XKV@header#1@default,
- \XKV@header#1@func,\XKV@header#1@altlist,
- \XKV@header#1@reser
- }%
- \SKV@for@b\SKV@tempa\SKV@tempa{%
- \SKV@despacectt\SKV@tempa
- \SKV@csgundef{\SKV@tempa}%
- }%
- \endgroup
- \SKV@vbmsg{info}{Key '#1' with prefix '\SKV@pref' in family\SKV@MB
- '\XKV@tfam' was removed\on@line}%
-}
-\SKV@newlet\unreserve@keys\remove@keys
-\SKV@def*\uservaluekeys{\XKV@testoptb\SKV@uservaluekeys}
-\SKV@def*\SKV@uservaluekeys#1{%
- \SKV@ifcsundef{SKV@\XKV@header uservalue}{%
- \XKV@checksanitizeb{#1}\SKV@tempa
- \SKV@csxdef*{SKV@\XKV@header uservalue}{\SKV@expox{\SKV@tempa}}%
- }{%
- \SKV@aftercs\XKV@merge{SKV@\XKV@header uservalue}{#1}\XKV@getsg
- }%
-}
-\SKV@def*\SKV@undefinedkeys#1#2#3{%
- \edef\SKV@resvd##1{\SKV@addtolist![;]##1{(#1:#2:#3)}}%
- \SKV@resvd\SKV@und@finedkeys
-}
-\SKV@predef*\ExecuteOptionsX{%
- \SKV@sktrue\XKV@stfalse\XKV@plfalse\XKV@t@stopte\XKV@setkeys}
-\SKV@predef*\setkeys{\SKV@sktrue\XKV@testopta{\XKV@testoptc\XKV@setkeys}}
-\SKV@newlet\skvsetkeys\setkeys
-\SKV@pdef*\UseSkeyvalSetkeys{%
- \SKV@ifx\setkeys\skvsetkeys\relax{\let\setkeys\skvsetkeys}%
-}
-\SKV@redef*\XKV@setkeys[#1]#2{%
- \def\skif##1{%
- \SKV@ensurenoscape{##1}%
- \SKV@ifcsdef{if##1}{}{%
- \SKV@err{Undefined boolean '##1'}%
- {'\string\skif' error: boolean '##1' undefined.}%
- }%
- \csname if##1\endcsname
- }%
- \let\skifx\ifx
- \let\skifcase\ifcase
- \let\skor\or
- \let\skelse\else
- \let\skfi\fi
- \let\SKV@und@finedkeys\@empty
- \XKV@checksanitizea{#2}\XKV@resb
- \SKV@normalizea\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}%
- \SKV@expnext\XKV@s@tkeys\XKV@resb{#1}%
- \XKV@usepresetkeys{#1}{presett}%
- \let\CurrentOption\@empty
- \SKV@skfalse
- \SKV@ifx\SKV@und@finedkeys\@empty{}{%
- \def\SKV@tempa{stop}%
- \SKV@warn{\string\setkeys\space error: Unknown keys:\SKV@MB
- \SKV@expox\SKV@und@finedkeys}%
- \typein[\answer]{%
- ^^JThe following keys are undefined and couldn't be set:
- ^^J\SKV@expox\SKV@und@finedkeys
- ^^JEnter 'stop' or 'go' and <return> to continue.}%
- \ifx\answer\SKV@tempa\stop\fi
+ \skvexpanded{\endgroup
+ \skv@exitpoxkeys
+ % There may be preset keys even when \skv@pkgorclsopts is empty:
+ \skvsetkeys\ifskv@pl+\fi[\skvcurrentprefix]{\skv@fams}[#1]%
+ {\skvexpandonce\skv@pkgorclsopts}%
}%
+ \skvcslet{skv@dox@\@currname @\@currext}\relax
+ \skvinitializermkeys*\skvcurrentprefix\skv@fams
+ \skv@inpoxfalse
+ \let\@fileswith@pti@ns\@@fileswith@pti@ns
+ \AtEndOfPackage{\let\@unprocessedoptions\relax}%
+ \csname skv@\@currname @\@currext @afterprocess@hook\endcsname
+ \skvcslet{skv@\@currname @\@currext @afterprocess@hook}\relax
}
-\SKV@redef*\XKV@s@tk@ys#1=#2=#3\@nil{%
- \XKV@g@tkeyname#1=\@nil\XKV@tkey
- \SKV@expnext\SKV@sp@def\XKV@tkey\XKV@tkey
- \SKV@ifx\XKV@tkey\@empty{%
- \SKV@ifempty{#2}{}{%
- \SKV@err{No key specified for value '#2'}%
- {You have supplied a value '#2' without key name.\SKV@MB
- This is certainly an error on your part.\SKV@MB
- I can't process this value without key name.\SKV@MB
- Please enter 'X' and <return>. Correct the error and rerun.}
- }%
- }{%
- \@expandtwoargs\in@{,\XKV@tkey,}{,\XKV@na,}%
- \unless\ifin@
- \XKV@knftrue
- \SKV@sp@def{#2}\XKV@tempa
- \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
- \SKV@ifx\XKV@doxs\relax{%
- \unless\ifx\@currext\@clsextension
- \let\CurrentOption\XKV@tkey\@unknownoptionerror
- \fi
- }{%
- \XKV@doxs
- }%
- \else
- \ifXKV@st
- \XKV@addtolist@o\XKV@rm\CurrentOption
- \else
- \SKV@undefinedkeys\SKV@pref\XKV@fams\XKV@tkey
- \fi
- \fi
- \else
- \ifXKV@inpox\ifx\XKV@testclass\XKV@documentclass
- \SKV@expnext\XKV@useoption\CurrentOption
- \fi\fi
- \fi
- \fi
- }%
+
+% \skvrestrictedprocessoptions*+[<pref>]{<fams>}[<na>]
+% 1. This will not process class options, but only options
+% issued to the package.
+\skvrobustdef*\skvrestrictedprocessoptions{\skv@testopte\skv@restrictedpox}
+\skvrobustdef*\skv@restrictedpox[#1]{%
+ \skv@inpoxtrue
+ \let\@fileswith@pti@ns\@badrequireerror
+ \begingroup
+ \let\skv@exitpoxkeys\@empty
+ \let\skv@pkgorclsopts\@empty
+ \skvletcs\skv@pkgorclsopts{opt@\@currname.\@currext}%
+ \ifcase0\ifx\skv@pkgorclsopts\@empty0\else
+ \ifx\skv@pkgorclsopts\relax0\else1\fi\fi\relax
+ \else\skvafterfi
+ \skvexpbracenext\skv@getkeynames\skv@pkgorclsopts\skv@tempd
+ \skvexpbracenext\skv@getpoxkeys\skv@tempd
+ \fi
+ \skvexpanded{\endgroup
+ \skv@exitpoxkeys
+ \skvsetkeys\ifskv@pl+\fi[\skvcurrentprefix]{\skv@fams}[#1]%
+ {\skvexpandonce\skv@pkgorclsopts}%
+ }%
+ \skvcslet{skv@dox@\@currname @\@currext}\relax
+ \skvinitializermkeys*\skvcurrentprefix\skv@fams
+ \skv@inpoxfalse
+ \let\@fileswith@pti@ns\@@fileswith@pti@ns
+ \AtEndOfPackage{\let\@unprocessedoptions\relax}%
+ \csname skv@\@currname @\@currext @afterprocess@hook\endcsname
+ \skvcslet{skv@\@currname @\@currext @afterprocess@hook}\relax
}
-\SKV@redef*\XKV@s@tk@ys@#1{%
- \SKV@ifcsundef{\XKV@header\XKV@tkey}{%
- \SKV@vbmsg{warn}{No key macro for key '\XKV@tkey'\SKV@MB
- in families '\XKV@fams'}%
- }{%
- \XKV@knffalse
- \SKV@ifcsundef{SKV@\XKV@header uservalue}{}{%
- \SKV@aftercs\SKV@testuservaluekey
- {SKV@\XKV@header uservalue}\XKV@tkey
- \ifSKV@uv
- \SKV@ifnotblank{#1}{}{%
- \SKV@err{You're required to supply a value\SKV@MB
- for key '\XKV@tkey' in families '\XKV@fams'}%
- {Please supply a value for key '\XKV@tkey'\SKV@MB
- of families '\XKV@fams' and rerun.\SKV@MB
- The originator of this key meant it to\SKV@MB
- require a user value.}%
+
+% Get pox keys (ie, keys processed as options) from package or
+% class options:
+\skvrobustdef*\skv@getpoxkeys#1{%
+ \skvcommaloop{#1}\skvcurrentkey{%
+ \skvexpanded{%
+ \skvifkeynotinfamilies
+ [\skvcurrentprefix]{\skv@fams}{\skvcurrentkey}%
+ }{}{%
+ % \skv@header is formed in the search for the key:
+ \skvletcs\skv@prova{\skv@header.@poxkeys}%
+ \skvifdef\skv@prova{%
+ \skvxifin{,\skvoxdetok\skvcurrentkey,}{,\skvoxdetok\skv@prova,}{}{%
+ \skvcsedef{\skv@header.@poxkeys}{\skv@prova,\skvcurrentkey}%
}%
- \fi
- }%
- \SKV@ifcsundef{XKV@\XKV@header save}{}{%
- \SKV@aftercs\XKV@testsavekey{XKV@\XKV@header save}\XKV@tkey
- }%
- \ifXKV@rkv
- \ifXKV@sg\expandafter\global\fi
- \SKV@aftercs\let{XKV@\XKV@header\XKV@tkey @value}\XKV@tempa
- \fi
- \SKV@expnext\XKV@replacepointers\XKV@tempa
- \SKV@ifblank{#1}{%
- \SKV@ifcsundef{\XKV@header\XKV@tkey @default}{%
- \SKV@err{'\XKV@tkey' in family '\XKV@tfam' with\SKV@MB
- prefix '\XKV@pref' has no default value and\SKV@MB
- you haven't supplied a value for it either}%
- {Supply a value for key '\XKV@tkey' and rerun.}%
}{%
- \SKV@xaftercs\XKV@default{\XKV@header\XKV@tkey @default}\@nil
+ \skvcsedef{\skv@header.@poxkeys}{\skvcurrentkey}%
+ }%
+ \skvxifin{\skvoxdetok\skv@header}{\skvoxdetok\skv@exitpoxkeys}{}{%
+ \edef\skv@exitpoxkeys{%
+ \skvexpandonce\skv@exitpoxkeys
+ \noexpand\skvcsexit{\skv@header.@poxkeys}%
+ }%
}%
- }{%
- \XKV@savstate
- \csname\XKV@header\XKV@tkey\expandafter
- \endcsname\expandafter{\XKV@tempa}\relax
- \XKV@resstate
- }%
- }%
-}
-\SKV@def*\SKV@testuservaluekey#1#2{%
- \SKV@swtrue\SKV@uvfalse
- \XKV@whilist#1\SKV@tempa\ifSKV@sw\fi{%
- \ifx#2\SKV@tempa\SKV@uvtrue\SKV@swfalse\fi
- }%
-}
-\SKV@def*\SKV@remspaceletter#1#2{%
- \begingroup
- \SKV@toks\expandafter{#2 #1}%
- \def\SKV@tempa##1 #1##2\@nil{%
- \SKV@ifblank{##2}{%
- \SKV@toks{##1}%
- }{%
- \SKV@toks{##1#1##2}%
- \expandafter\SKV@tempa\the\SKV@toks\@nil
- }%
- }%
- \expandafter\SKV@tempa\the\SKV@toks\@nil
- \xdef#2{\the\SKV@toks}%
- \endgroup
-}
-\SKV@def*\SKV@remletterspace#1#2{%
- \begingroup
- \SKV@toks\expandafter{#2#1 }%
- \def\SKV@tempa##1#1 ##2\@nil{%
- \SKV@ifblank{##2}{%
- \SKV@toks{##1}%
- }{%
- \SKV@toks{##1#1##2}%
- \expandafter\SKV@tempa\the\SKV@toks\@nil
}%
}%
- \expandafter\SKV@tempa\the\SKV@toks\@nil
- \xdef#2{\the\SKV@toks}%
- \endgroup
}
-\SKV@def*\SKV@remletterletter#1#2{%
- \begingroup
- \SKV@toks\expandafter{#2#1#1}%
- \def\SKV@tempa##1#1#1##2\@nil{%
- \SKV@toks{##1#1##2}%
- \SKV@ifblank{##2}{}{%
- \expandafter\SKV@tempa\the\SKV@toks\@nil}%
+
+% +++++++++ Utilities for handling options via \directkeys +++++++++%
+
+\skvrobustdef*\dirkeys@declareoptions@a{%
+ \let\@fileswith@pti@ns\@badrequireerror
+ \skv@dox
+}
+\skvrobustdef*\dirkeys@declareoptions@b#1{%
+ \let\@fileswith@pti@ns\@badrequireerror
+ \skv@inopttrue
+ \begingroup
+ \edef\skv@tempb{\unexpanded{#1}}%
+ \def\skv@tempa{}%
+ \def\do##1##2{%
+ \edef\skv@tempa{%
+ \skvexpandonce\skv@tempa
+ \skvdefinekeys\ifskv@handlerswa*\fi[##1]{##2}%
+ [\dirkeys@holderprefixtoks]{\skvexpandonce\skv@tempb}%
+ }%
+ }%
+ \dirkeys@getcurrentroots\do
+ \expandafter\endgroup\skv@tempa
+ \skv@inoptfalse
+}
+\skvrobustdef*\dirkeys@executeoptions#1{%
+ \skv@inopttrue
+ \begingroup
+ \edef\skv@tempb{\unexpanded{#1}}%
+ \def\skv@tempa{}%
+ \def\do##1##2{%
+ \edef\skv@tempa{%
+ \skvexpandonce\skv@tempa
+ \skvsetkeys\ifskv@handlerswa+\fi
+ [##1]{##2}[\skvcsuse{##1/##2/.@ignoredkeys}]%
+ {\skvexpandonce\skv@tempb}%
+ }%
+ }%
+ \dirkeys@getcurrentroots\do
+ \expandafter\endgroup\skv@tempa
+ \skv@inoptfalse
+}
+\skvrobustdef*\dirkeys@executeoptions@b#1{%
+ \skv@inopttrue
+ \begingroup
+ \def\skv@tempa{}\def\skv@tempb{}\def\skv@tempc{}%
+ \def\do##1##2{%
+ \skvxifin{,##1,}{,\skv@tempa,}{}{%
+ \edef\skv@tempa{\skv@tempa\ifx\skv@tempa\@empty\else,\fi##1}%
+ }%
+ \skvxifin{,##2,}{,\skv@tempb,}{}{%
+ \edef\skv@tempb{\skv@tempb\ifx\skv@tempb\@empty\else,\fi##2}%
+ }%
+ \edef\skv@tempc{%
+ \skv@tempc\ifx\skv@tempc\@empty\else,\fi
+ \skvcsuse{##1/##2/.@ignoredkeys}%
+ }%
+ }%
+ \dirkeys@getcurrentroots\do
+ \@tempcnta\skvz@
+ \let\skv@tempd\skv@tempa
+ \skvcommaloop*\skv@tempa\skv@prova{%
+ \advance\@tempcnta\@ne
+ \ifnum\@tempcnta>\@ne
+ \skv@err{You can't submit more than one prefix here}\@ehd
+ \skvbreakloop
+ \fi
}%
- \expandafter\SKV@tempa\the\SKV@toks\@nil
- \def\SKV@tempa##1#1#1\@nil{\gdef#2{##1}}%
- \expandafter\SKV@tempa\the\SKV@toks#1\@nil
- \endgroup
+ \skvexpanded{\endgroup
+ \skvsetkeys\ifskv@handlerswa+\fi[\skv@tempd]{\skv@tempb}[\skv@tempc]%
+ }{#1}%
+ \skv@inoptfalse
}
-\SKV@def*\SKV@remcommaequal#1#2{%
+\skvrobustdef*\dirkeys@processoptions{%
+ \skv@inopttrue
\begingroup
- \SKV@toks\expandafter{#2#1}%
- \def\SKV@tempa##1#1##2\@nil{%
- \SKV@ifblank{##2}{%
- \SKV@toks{##1}%
- }{%
- \SKV@toks{##1=##2}%
- \expandafter\SKV@tempa\the\SKV@toks\@nil
+ \def\skv@tempa{}%
+ \def\do##1##2{%
+ \edef\skv@tempa{%
+ \skvexpandonce\skv@tempa
+ \skvprocessoptions\ifskv@handlerswa*\fi\ifskv@handlerswb+\fi
+ [##1]<##2>[\skvcsuse{##1/##2/.@ignoredkeys}]%
}%
}%
- \expandafter\SKV@tempa\the\SKV@toks\@nil
- \xdef#2{\the\SKV@toks}%
- \endgroup
-}
-\SKV@def*\SKV@normalizea#1{%
- \@expandtwoargs\SKV@in@{ ,}{\SKV@expox{#1}}%
- \ifin@\SKV@remspaceletter{,}#1\fi
- \@expandtwoargs\SKV@in@{, }{\SKV@expox{#1}}%
- \ifin@\SKV@remletterspace{,}#1\fi
- \@expandtwoargs\SKV@in@{,,}{\SKV@expox{#1}}%
- \ifin@\SKV@remletterletter{,}#1\fi
- \@expandtwoargs\SKV@in@{ =}{\SKV@expox{#1}}%
- \ifin@\SKV@remspaceletter{=}#1\fi
- \@expandtwoargs\SKV@in@{= }{\SKV@expox{#1}}%
- \ifin@\SKV@remletterspace{=}#1\fi
- \@expandtwoargs\SKV@in@{==}{\SKV@expox{#1}}%
- \ifin@\SKV@remletterletter{=}#1\fi
- \@expandtwoargs\SKV@in@{,=}{\SKV@expox{#1}}%
- \ifin@\SKV@remcommaequal{,=}#1\fi
- \@expandtwoargs\SKV@in@{=,}{\SKV@expox{#1}}%
- \ifin@\SKV@remcommaequal{=,}#1\fi
+ \dirkeys@getcurrentroots\do
+ \expandafter\endgroup\skv@tempa
+ \skv@inoptfalse
}
-\SKV@def*\SKV@gobblescape{%
- \ifnum\escapechar>255\else
- \ifnum\escapechar<0\else
- \expandafter\expandafter
- \csname @gobble\ifnum\escapechar=32 space\fi
- \SKV@threexp\endcsname
- \fi\fi
- \string%
-}
-\SKV@def*\SKV@save#1{%
- \SKV@ensurescape{#1}%
- \edef\SKV@tempa{saved\SKV@gobblescape#1}%
- \SKV@ifcsdef\SKV@tempa{%
- \SKV@err{%
- \string#1\space already saved. You've to restore\SKV@MB
- it or undefine '\SKV@csexpox{\SKV@tempa}' before\SKV@MB
- you can save \string#1\space again
- }\@ehc
- }{%
- \SKV@ifdef{#1}{%
- \SKV@cslet\SKV@tempa{#1}%
- }{%
- \SKV@err{Undefined '\string#1' can't be saved\on@line}%
- {You can't restore undefined commands.\SKV@MB
- So why save undefined '\string#1' here?}%
- }%
+
+\skvrobustdef*\dirkeys@processoptions@b{%
+ \skv@inopttrue
+ \begingroup
+ \def\skv@tempa{}\def\skv@tempb{}\def\skv@tempc{}%
+ \def\do##1##2{%
+ \skvxifin{,##1,}{,\skv@tempa,}{}{%
+ \edef\skv@tempa{\skv@tempa\ifx\skv@tempa\@empty\else,\fi##1}%
+ }%
+ \skvxifin{,##2,}{,\skv@tempb,}{}{%
+ \edef\skv@tempb{\skv@tempb\ifx\skv@tempb\@empty\else,\fi##2}%
+ }%
+ \edef\skv@tempc{%
+ \skv@tempc\ifx\skv@tempc\@empty\else,\fi
+ \skvcsuse{##1/##2/.@ignoredkeys}%
+ }%
+ }%
+ \dirkeys@getcurrentroots\do
+ \@tempcnta\skvz@
+ \let\skv@tempd\skv@tempa
+ \skvcommaloop*\skv@tempa\skv@prova{%
+ \advance\@tempcnta\@ne
+ \ifnum\@tempcnta>\@ne
+ \skv@err{You can't submit more than one prefix here}\@ehd
+ \skvbreakloop
+ \fi
}%
-}
-\SKV@def*\SKV@restore#1{%
- \SKV@ensurescape{#1}%
- \edef\SKV@tempa{saved\SKV@gobblescape#1}%
- \SKV@ifcsdef\SKV@tempa{%
- \def\SKV@next{\SKV@letcs#1\SKV@tempa\SKV@csundef\SKV@tempa}%
- }{%
- \SKV@err{%
- '\@nameuse\SKV@tempa' is undefined:\SKV@MB
- '\string#1' can't be restored\on@line
- }{%
- '\string#1' can't be restored\on@line.\SKV@MB
- Note that each call to \string\SKV@restore\space
- undefines\SKV@MB the saved command.
- }%
+ \skvexpanded{\endgroup
+ \skvprocessoptions\ifskv@handlerswa+\fi
+ [\skv@tempd]<\skv@tempb>[\skv@tempc]%
}%
- \SKV@next
+ \skv@inoptfalse
}
-\SKV@providedef*\input@path{}
-\SKV@pdef*\InputFileOnce{%
- \def\SKV@inputfile##1##2{%
- \InputIfFileExists{##2}{%
- \SKV@cslet{##2@read}\@empty
- \let\SKV@inp@tfile\relax
- }{%
- \typein[\answer]{^^J! File '\string##2' does not exist.^^J
- Enter filename or 'no' and <return> to continue.}%
- \SKV@oifstrequal{\answer}{no}{%
- \let\SKV@inp@tfile\relax
- }{%
- \def\SKV@inp@tfile{%
- \SKV@expargs{0}{\SKV@InputFileOnce[##1]}\answer\@nil
- }}}}%
- \let\SKV@no\z@
- \SKV@save\input@path
- \SKV@t@stopta{\SKV@testopt\SKV@InputFileOnce{.}}%
+
+% ++++++++ Keys for the handler <.mega process options> +++++++++ %
+\directkeys*{%
+ .prefix=SKV,
+ .family=megapox,
+ .holder prefix=dirkeys@pox@,
+ .initialize keys after define=true,
+ .new keys={
+ .ord/.ignore options//
+ \def\dirkeys@pox@igkeys{#1}
+ \skvstripouterbraces{2}\dirkeys@pox@igkeys
+ ,
+ .ord/.options prefix/KV/
+ \skvxifin{,}{\detokenize{#1}}{
+ \skv@err{Only one prefix is allowed in processing options}\@ehd
+ }{
+ \def\dirkeys@pox@pref{#1}
+ \skvstripouterbraces{2}\dirkeys@pox@pref
+ }
+ ,
+ .ord/.options families/\@currname.\@currext/
+ \edef\dirkeys@pox@fams{#1}
+ \skvstripouterbraces{2}\dirkeys@pox@fams
+ ,
+ .ord/.copy class options/true/
+ \edef\dirkeys@pox@copyclass{\skvifstrcmp{#1}{true}{00}{01}}
+ ,
+ },
+ .styles={
+ .prefix/.options prefix=#1,
+ .options family/.options families=#1,
+ .family/.options families=#1,
+ .families/.options families=#1,
+ .include class options/.copy class options=#1,
+ },
+}
+%\skvshowcs{SKV/megapox/.options family.@cbk}
+%\skvshowcs{SKV/megapox/.pref.@cbk}
+
+\skvrobustdef*\dirkeys@megaprocessoptions#1{%
+ \skvpushfunctions\dirkeys@megaprocessoptions{%
+ \do\dirkeys@pox@pref\do\dirkeys@pox@fams
+ \do\dirkeys@pox@igkeys\do\dirkeys@pox@copyclass
+ }\skv@gendepth
+ \skv@inopttrue
+ \skvsetkeys[SKV]{megapox}{#1}%
+ \skvexpanded{%
+ \skvprocessoptions\if\dirkeys@pox@copyclass*\fi+%
+ [\dirkeys@pox@pref]<\dirkeys@pox@fams>[\dirkeys@pox@igkeys]%
+ }%
+ \skv@inoptfalse
+ \skvpopfunctions\dirkeys@megaprocessoptions\skv@gendepth
}
-\SKV@def*\SKV@InputFileOnce[#1]#2{%
- \SKV@appto!\input@path{{#1/}}%
- \ifSKV@st
- \SKV@afterelsefi
- \SKV@inputfile{#1}{#2}%
- \else
- \SKV@afterfi
- \SKV@ifcsdef{#2@read}{%
- \SKV@vbmsg{warn}{File '#2' already read:\SKV@MB
- File '#2' can't be read again}%
- }{%
- \SKV@inputfile{#1}{#2}%
+
+% +++++++++++++ Handlers for processing options ++++++++++++++ %
+
+\directkeys*{%
+ .new handlers={
+ .action for unknown options=\dirkeys@declareoptions@a{#1},
+ .declare options={
+ \skv@handlerswafalse\dirkeys@declareoptions@b{#1}
+ },
+ .new options={
+ \skv@handlerswatrue\dirkeys@declareoptions@b{#1}
+ },
+ % Handler <.execute options> has no star variant, since we don't
+ % want to ignore unknown options from within package or class.
+ .execute options={
+ \skv@handlerswafalse\dirkeys@executeoptions{#1}
+ },
+ .execute options+={
+ \skv@handlerswatrue\dirkeys@executeoptions@b{#1}
+ },
+ % 1. All <.process options> handlers will filter out ignored paths
+ % and keys.
+ % 2. <.process options*> will copy class options.
+ % 3. <.process options+> will set options in all the active families
+ % in which the options exist.
+ % 4. <.process options*+> will copy class options and set options in
+ % all the active families in which the options are found.
+ .process options={
+ \skv@handlerswafalse\skv@handlerswbfalse\dirkeys@processoptions
+ },
+ .process options*={
+ \skv@handlerswatrue\skv@handlerswbfalse\dirkeys@processoptions
+ },
+ .process options+={
+ \skv@handlerswafalse\skv@handlerswbtrue\dirkeys@processoptions@b
+ },
+ .process options*+={
+ \skv@handlerswatrue\skv@handlerswbtrue\dirkeys@processoptions@b
+ },
+ % The handler <.mega process options> will:
+ % 1. Search all families in its key <families>.
+ % 2. Not perform filtering of ignored paths and keys; in fact, will not
+ % use active paths and keys.
+ % 3. The handler '.mega process options' has the keys <ignore options>,
+ % <options prefix>, <options families>, and <copy class options>.
+ % These keys have aliases.
+ % See an example later in this file.
+ .mega process options={
+ \dirkeys@megaprocessoptions{#1}
+ },
+ .mega process options*={
+ \dirkeys@megaprocessoptions{#1,copy class options}
+ },
+ },
+ .handler let={
+ .action for unknown option=.action for unknown options,
+ .every unknown option=.action for unknown options,
+ .define options=.declare options,
+ .processoptions=.process options, .processoptions*=.process options*,
+ .copy class options and process options in all active families=
+ .process options*+,
+ .copy class options and process options in all families=
+ .process options*+,
+ .copy class options and process options=.process options*,
+ .executeoptions=.execute options,
+ },
+}
+%\skvshowcs{dirkeys@handler@.every unknown option}
+
+% Loading a package while in options section is illegal. The command
+% \skvafterprocessoptions can be used to defer the loading of packages
+% till after the options section:
+\skvrobustdef*\skvafterprocessoptions{%
+ \expandafter\skvgappendtomacro
+ \csname skv@\@currname @\@currext @afterprocess@hook\endcsname
+}
+\skvnewlet\skvAfterProcessOptions\skvafterprocessoptions
+\skvnewlet\skvifpackageloaded\@ifpackageloaded
+
+\def\skv@visiteduseoptions{01}
+
+\skvrobustdef*\skv@useoption#1{%
+ \if\skv@visiteduseoptions\else\skvafterfi
+ \skvcsvnormalize\@unusedoptionlist
+ \def\skv@visiteduseoptions{00}%
+ \fi
+ \begingroup
+ \def\do##1=##2=##3\useoption@nil{%
+ \edef\CurrentOption{\skvtrimspace{##1}}%
+ \def\skv@tempa{}%
+ \def\do####1=####2=####3\useoption@nil{%
+ \edef\reserved@a{\skvtrimspace{####1}}%
+ }%
+ \skvcommaloop*\@unusedoptionlist\skv@prova{%
+ \expandafter\do\skv@prova==\useoption@nil
+ \ifx\reserved@a\CurrentOption\else
+ \edef\skv@tempa{%
+ \skv@tempa\ifx\skv@tempa\@empty\else,\fi\skv@prova
+ }%
+ \fi
}%
- \fi
- \SKV@inp@tfile
- \ifnum\SKV@no=\z@\SKV@restore\input@path\fi
- \let\SKV@no\@ne
-}
-\SKV@pdef*\SKV@notloadederr#1{%
- \SKV@ifcsdef{ver@#1.\@pkgextension}{}{%
- \SKV@err{Package '#1' wasn't loaded}%
- {Document has begun and package '#1' wasn't loaded.\SKV@MB
- You wanted package '#1' loaded.}%
- }%
-}
-\SKV@def*\SKV@notloaded{}
-\SKV@pdef*\@ensurepackageloaded#1{%
- \SKV@for[,]{#1}\SKV@resvd{%
- \edef\SKV@resvd##1##2{\SKV@appto!##1{##2{\SKV@resvd}}}%
- \SKV@resvd\SKV@notloaded\SKV@doloaded
+ \let\@unusedoptionlist\skv@tempa
}%
+ \@onelevel@sanitize\@unusedoptionlist
+ \expandafter\do\detokenize{#1}==\useoption@nil
+ \skvaftergroupdef\@unusedoptionlist\endgroup
}
-\SKV@AtDocumentStart{%
- \let\SKV@doloaded\SKV@notloadederr
- \SKV@notloaded
- \global\let\SKV@doloaded\@gobble
-}
-\SKV@onlypreamble{%
- \SKV@preamblecmds,\SKV@onlypreamble,\@afterpackageloaded,
- \@ifpackagecurrent,\@ifpackagenotcurrent,\@ifloadedandcurrent,
- \@ensurepackageloaded,\SKV@AtPackageEnd,\SKV@AtClassEnd,
- \SKV@BeforePackageEnd,\SKV@BeforeClassEnd,\SKV@AfterPackageEnd,
- \SKV@AfterClassEnd,\SKV@BeforeLastPage,\SKV@AfterLastPage,
- \SKV@AfterDocumentEnd,\UseSkeyvalSetkeys
+
+\skvonlypreamble{%
+ \skvdeclareoption,\skvexecuteoptions,\skvprocessoptions,\skv@useoption
}
-\endinput
+%+++++++++++++++++ This package's options section ++++++++++++++++++%
+
+\skvrobustdef*\setupskeyval{\skvsetkeys[SKV]{skeyval}}
+\skv@inoptionsectrue
-%%% End of file skeyval.sty %%%
+%\skvshowcs{dirkeys@handler@.every unknown option}
+\directkeys*{%
+ .prefix=SKV,
+ .family=skeyval,
+ .holder prefix=skv@,
+ .every unknown option={
+ \@onelevel@sanitize\CurrentOption
+ \PackageWarning{skeyval}{Unknown option '\CurrentOption'}%
+ },
+ .new options={
+ .bool/tracingkeys/true,
+ .ords/{keyparser,key parser}/{,}/
+ \def\skv@keyparser{#1}%
+ \skvstripouterbraces{2}\skv@keyparser,
+ .bool/compatibility/true/
+ \ifskv@compatibility
+ \skvAfterProcessOptions{%
+ \skvifpackageloaded{skeyval-bc}{}{%
+ \RequirePackage{skeyval-bc}%
+ }
+ }%
+ \fi
+ ,
+ },
+ .execute options={
+ tracingkeys,keyparser
+ },
+ .mega process options={
+ .options prefix=SKV,
+ .options families={skeyval,definekeys},
+ .ignore options={},
+ .copy class options,
+ },
+}
+%\skvshowcs{SKV/skeyval/keyparser.@cbk}
+
+\skv@inoptionsecfalse
+
+\skv@restorecodes
+\endinput