diff options
author | Karl Berry <karl@freefriends.org> | 2012-10-17 22:50:05 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2012-10-17 22:50:05 +0000 |
commit | df2ce83ed9a6a3beca08c07cc656611e26d220d7 (patch) | |
tree | 086e2f15b6585eb8151e83f7852eb858db2f4b80 /Master/texmf-dist/tex/latex/skeyval/skeyval.sty | |
parent | 468e15f0c59bbedcccfaa606c1f72d3b6d3a8f9a (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.sty | 3766 |
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#{\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#{\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#{\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#{\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{\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#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{#3}% - }% - }% -} -\SKV@def\SKV@tforloop#1#2#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{#4}% -} -\SKV@def\SKV@tfornoop#1#3{} -\SKV@pdef*\SKV@tforrema#1\@nil\@nil#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 |