From 2efa87d7787e87488d8fee8defb98eecd0dd6054 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Wed, 5 May 2010 22:44:01 +0000 Subject: skeyval 0.7 (4may10) git-svn-id: svn://tug.org/texlive/trunk@18113 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/tex/latex/skeyval/skeyval.sty | 994 +++++++++++++----------- 1 file changed, 528 insertions(+), 466 deletions(-) (limited to 'Master/texmf-dist/tex/latex/skeyval') diff --git a/Master/texmf-dist/tex/latex/skeyval/skeyval.sty b/Master/texmf-dist/tex/latex/skeyval/skeyval.sty index 203a412dbc4..3178e0be5e4 100644 --- a/Master/texmf-dist/tex/latex/skeyval/skeyval.sty +++ b/Master/texmf-dist/tex/latex/skeyval/skeyval.sty @@ -1,6 +1,6 @@ %++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++% % % -% This is file 'skeyval.sty', version 0.6. % +% This is file 'skeyval.sty', version 0.7. % % % % This package and accompanying files may be distributed and/or % % modified under the conditions of the LaTeX Project Public License, % @@ -71,7 +71,7 @@ \SKV@setcode{126}{13}% ~ \def\SKV@rcsid$#1: #2 #3 #4 #5${#4 v#3} \ProvidesPackage{skeyval}% - [\SKV@rcsid $Id: skeyval.sty,v 0.6 2010/04/20 09:00:00 Ahmed Musa $ + [\SKV@rcsid $Id: skeyval.sty,v 0.7 2010/05/05 09:00:00 Ahmed Musa $ Extensions to the xkeyval parser (AM)] \NeedsTeXFormat{LaTeX2e}[1996/12/01] \ifnum0=0% @@ -83,17 +83,18 @@ \fi \newtoks\SKV@toks \newcount\SKV@depth -\def\@nil{\@unexpandable@protect\@nil} +\protected\def\@nil{\@nil} \def\@nnil{\@nil} +\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} \long\def\@firstofthree#1#2#3{#1} \long\def\@secondofthree#1#2#3{#2} \long\def\@thirdofthree#1#2#3{#3} -\newcommand*\@threeexpafter{\expandafter\expandafter\expandafter} +\def\SKV@threeafter{\expandafter\expandafter\expandafter} \def\SKV@aftercs#1#2{\expandafter#1\csname#2\endcsname} -\def\SKV@xaftercs#1#2{\@threeexpafter#1\csname#2\endcsname} +\def\SKV@xaftercs#1#2{\SKV@threeafter#1\csname#2\endcsname} \SKV@aftercs\let{SKV@1of1}\@firstofone \SKV@aftercs\let{SKV@1of2}\@firstoftwo \SKV@aftercs\let{SKV@2of2}\@secondoftwo @@ -111,10 +112,11 @@ \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@unifdefined#1{\@nameuse{SKV@\ifdefined#12\else1\fi 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@\ifcsname#1\endcsname2\else1\fi of2}} -\def\SKV@iftest#1#2{\@nameuse{SKV@\@nameuse{#1}#21\else2\fi of2}} +\def\SKV@unifcsname#1{\@nameuse{SKV@\SKV@ifcsname{#1}{2}{1}of2}} +\def\SKV@iftest#1#2{\@nameuse{SKV@\@nameuse{if#1}#21\else2\fi of2}} +\def\SKV@uniftest#1#2{\@nameuse{SKV@\SKV@iftest{#1}{#2}{2}{1}of2}} \begingroup \def\SKV@tempa{% \def\SKV@nodocerr{% @@ -153,6 +155,12 @@ \def\SKV@ifdefinable#1{% \begingroup\escapechar92\afterassignment\endgroup \xdef\reserved@a{\expandafter\@gobble\string#1}% + \edef\resvd@a{\expandafter\SKV@car\string#1\@nil}% + \SKV@ifx\resvd@a\@backslashchar{}{% + \PackageError{skeyval}{Backslash required}{Backslash + required in argument of '\string\SKV@ifdefinable'.}% + }% + \let\resvd@a\SKV@undefined \SKV@ifdefined#1{% \SKV@ifx{#1}\relax\@firstofone\@notdefinable }{% @@ -161,34 +169,33 @@ {\SKV@ifx\reserved@a\@qrelax\@notdefinable\@firstofone}% }% } +\def\SKV@csifdefinable#1{\begingroup\expandafter\endgroup + \expandafter\SKV@ifdefinable\csname#1\endcsname} \newcommand*\@ifpackagecurrent[2]{% - \@nameuse{SKV@\SKV@iftest{ifnum}{\@threeexpafter\@parse@version + \@nameuse{SKV@\SKV@iftest{num}{\SKV@threeafter\@parse@version \csname ver@#1.\@pkgextension\endcsname//00\@nil <\expandafter\@parse@version#2//00\@nil}{2}{1}of2}} \newcommand*\@ifpackagenotcurrent[2]{% \@nameuse{SKV@\@ifpackagecurrent{#1}{#2}{2}{1}of2}} \@ifpackageloaded{xkeyval}{% \@ifpackagecurrent{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. + \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]} -\SKV@ifdefinable\SKV@ifdefinable@n\relax -\protected\def\SKV@ifdefinable@n#1{% +\newcommand\SKV@ifdefinable@n[1]{% \XKV@sp@deflist\SKV@tempa{#1}% \XKV@for@o\SKV@tempa\SKV@tempa{% - \edef\resvd@a{\@threeexpafter\SKV@car + \edef\resvd@a{\SKV@threeafter\SKV@car \expandafter\string\SKV@tempa\@nil}% - \ifx\resvd@a\@backslashchar + \SKV@unifx\resvd@a\@backslashchar{}{% \PackageError{skeyval}{Backslash not allowed}{Backslash not allowed in argument of '\string\SKV@ifdefinable@n'.}% - \fi - \@threeexpafter\SKV@ifdefinable - \expandafter\csname\SKV@tempa\endcsname\relax + }% + \SKV@csifdefinable\SKV@tempa\relax }% } \SKV@ifdefinable@n{SKV@def,SKV@@def,SKV@pdef,SKV@@pdef, @@ -283,7 +290,7 @@ \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}} -\def\SKV@scantoks#1#2{% +\def\SKV@scantoksa#1#2{% \begingroup \edef\SKV@tempa{\endgroup \unexpanded{% @@ -296,47 +303,34 @@ }% \SKV@tempa } -\SKV@def\SKV@newcs#1#2{% +\def\SKV@scantoksb#1{% + \begingroup + \everyeof{\noexpand}% + \endlinechar\m@ne + \xdef#1{\scantokens\expandafter{#1}}% + \endgroup +} +\SKV@def*\SKV@newcs#1#2{% \SKV@ifcsname{#2}{% \SKV@csifx{#2}\relax{}{\def\reserved@a{#2}\@notdefinable}% }{\SKV@aftercs{#1}{#2}}% } -\SKV@pdef*\SKV@csdef{\SKV@savstate\SKV@t@st@pta\SKV@@csdef} -\SKV@def*\SKV@@csdef#1{% +\SKV@def*\SKV@n@wcs#1#2{% \ifSKV@pl - \let\SKV@n@xt\SKV@newcs + \let\SKV@next\SKV@newcs \else - \let\SKV@n@xt\SKV@aftercs + \let\SKV@next\SKV@aftercs \fi - \SKV@resstate\SKV@n@xt\def{#1}% + \SKV@resstate\SKV@next#1{#2}% } +\SKV@pdef*\SKV@csdef{\SKV@savstate\SKV@t@st@pta\SKV@@csdef} +\SKV@def*\SKV@@csdef#1{\SKV@n@wcs\def{#1}} \SKV@pdef*\SKV@csgdef{\SKV@savstate\SKV@t@st@pta\SKV@@csgdef} -\SKV@def*\SKV@@csgdef#1{% - \ifSKV@pl - \let\SKV@n@xt\SKV@newcs - \else - \let\SKV@n@xt\SKV@aftercs - \fi - \SKV@resstate\SKV@n@xt\gdef{#1}% -} +\SKV@def*\SKV@@csgdef#1{\SKV@n@wcs\gdef{#1}} \SKV@pdef*\SKV@csedef{\SKV@savstate\SKV@t@st@pta\SKV@@csedef} -\SKV@def*\SKV@@csedef#1{% - \ifSKV@pl - \let\SKV@n@xt\SKV@newcs - \else - \let\SKV@n@xt\SKV@aftercs - \fi - \SKV@resstate\SKV@n@xt\edef{#1}% -} +\SKV@def*\SKV@@csedef#1{\SKV@n@wcs\edef{#1}} \SKV@pdef*\SKV@csxdef{\SKV@savstate\SKV@t@st@pta\SKV@@csxdef} -\SKV@def*\SKV@@csxdef#1{% - \ifSKV@pl - \let\SKV@n@xt\SKV@newcs - \else - \let\SKV@n@xt\SKV@aftercs - \fi - \SKV@resstate\SKV@n@xt\xdef{#1}% -} +\SKV@def*\SKV@@csxdef#1{\SKV@n@wcs\xdef{#1}} \SKV@def*\SKV@csuse#1{\SKV@ifcsname{#1}{\@nameuse{#1}}{}} \SKV@pdef\SKV@expargs#1#2#3#4\@nil{% \begingroup @@ -397,7 +391,7 @@ } \SKV@pdef\SKV@ifbrack#1#2{\SKV@ifnextchar[{#1}{#2}} \SKV@pdef\SKV@ifparen#1#2{\SKV@ifnextchar({#1}{#2}} -\SKV@pdef*\SKV@testopt#1#2{\SKV@ifnextchar[{#1}{#1[{#2}]}} +\SKV@pdef*\SKV@testopt#1#2{\SKV@ifbrack{#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}} @@ -422,38 +416,86 @@ \SKV@pdef*\SKV@NewWrites[#1]#2{% \SKV@for[,]{#2}\SKV@tempa{% \SKV@expnext\SKV@ensurenoscape\SKV@tempa - \SKV@aftercs\SKV@ifdefinable{#1\SKV@tempa}{% + \SKV@csifdefinable{#1\SKV@tempa}{% \@nameuse{newwrite\SKV@aftercs}{#1\SKV@tempa}% }% }% } \SKV@pdef*\NewIfs{\SKV@testopt\SKV@NewIfs{}} -\SKV@pdef*\SKV@NewIfs[#1]#2{\SKV@testopt{\SKV@NewIf@[#1]{#2}}{false}} -\SKV@pdef*\SKV@NewIf@[#1]#2[#3]{% +\SKV@pdef*\SKV@NewIfs[#1]#2{\SKV@testopt{\SKV@New@Ifs[#1]{#2}}{false}} +\SKV@pdef*\SKV@New@Ifs[#1]#2[#3]{% + \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 + \SKV@csifdefinable{if#1\SKV@tempa}{% + \SKV@aftercs\SKV@New@If@{if#1\SKV@tempa}% + \@nameuse{#1\SKV@tempa#3}% + }% + }% +} +\def\SKV@New@If@#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*\csnewif{\SKV@aftercs\newif} +\SKV@pdef*\csnewtoks{\SKV@aftercs\newtoks} +\SKV@pdef*\csnewcount{\SKV@aftercs\newcount} +\SKV@pdef*\csnewdimen{\SKV@aftercs\newdimen} +\SKV@pdef*\csnewbox{\SKV@aftercs\newbox} +\SKV@pdef*\NewBooleans{\SKV@testopt\SKV@NewBooleans{}} +\SKV@pdef*\SKV@NewBooleans[#1]#2{% + \SKV@testopt{\SKV@New@Booleans[#1]{#2}}{false}} +\SKV@pdef*\SKV@New@Booleans[#1]#2[#3]{% + \SKV@getswstate\NewBooleans{#3}% \SKV@for[,]{#2}\SKV@tempa{% \SKV@expnext\SKV@ensurenoscape\SKV@tempa - \SKV@aftercs\SKV@ifdefinable{if#1\SKV@tempa}{% - \@nameuse{newif\SKV@aftercs}{if#1\SKV@tempa}% - \@nameuse{#1\SKV@tempa#3}% + \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@csifdefinable{if#1\SKV@tempa}{% + \csnewif{if#1\SKV@tempa}% + \@nameuse{#1\SKV@tempa\SKV@resvd}% }% }% } \SKV@pdef*\NewTogs{\SKV@testopt\SKV@NewTogs{}} \SKV@pdef*\SKV@NewTogs[#1]#2{\SKV@testopt{\SKV@NewT@gs[#1]{#2}}{false}} \SKV@pdef*\SKV@NewT@gs[#1]#2[#3]{% + \SKV@getswstate\NewTogs{#3}% \SKV@for[,]{#2}\SKV@tempa{% \SKV@expnext\SKV@ensurenoscape\SKV@tempa \edef\SKV@tempa{#1\SKV@tempa}% \SKV@expnext\newtog\SKV@tempa - \@nameuse{tog#3\SKV@expnext}\SKV@tempa + \@nameuse{tog\SKV@resvd\SKV@expnext}\SKV@tempa }% } \SKV@pdef*\NewToks{\SKV@testopt\SKV@NewToks{}} \SKV@pdef*\SKV@NewToks[#1]#2{% \SKV@for[,]{#2}\SKV@tempa{% \SKV@expnext\SKV@ensurenoscape\SKV@tempa - \SKV@aftercs\SKV@ifdefinable{#1\SKV@tempa}{% - \@nameuse{newtoks\SKV@aftercs}{#1\SKV@tempa}% + \SKV@csifdefinable{#1\SKV@tempa}{% + \csnewtoks{#1\SKV@tempa}% }% }% } @@ -461,8 +503,8 @@ \SKV@pdef*\SKV@NewCounts[#1]#2{% \SKV@for[,]{#2}\SKV@tempa{% \SKV@expnext\SKV@ensurenoscape\SKV@tempa - \SKV@aftercs\SKV@ifdefinable{#1\SKV@tempa}{% - \@nameuse{newcount\SKV@aftercs}{#1\SKV@tempa}% + \SKV@csifdefinable{#1\SKV@tempa}{% + \csnewcount{#1\SKV@tempa}% }% }% } @@ -470,8 +512,8 @@ \SKV@pdef*\SKV@NewDimens[#1]#2{% \SKV@for[,]{#2}\SKV@tempa{% \SKV@expnext\SKV@ensurenoscape\SKV@tempa - \SKV@aftercs\SKV@ifdefinable{#1\SKV@tempa}{% - \@nameuse{newdimen\SKV@aftercs}{#1\SKV@tempa}% + \SKV@csifdefinable{#1\SKV@tempa}{% + \csnewdimen{#1\SKV@tempa}% }% }% } @@ -479,8 +521,8 @@ \SKV@pdef*\SKV@NewBoxes[#1]#2{% \SKV@for[,]{#2}\SKV@tempa{% \SKV@expnext\SKV@ensurenoscape\SKV@tempa - \SKV@aftercs\SKV@ifdefinable{#1\SKV@tempa}{% - \@nameuse{newbox\SKV@aftercs}{#1\SKV@tempa}% + \SKV@csifdefinable{#1\SKV@tempa}{% + \csnewbox{#1\SKV@tempa}% }% }% } @@ -491,33 +533,15 @@ \SKV@ifblank{#2}{% \SKV@err{Arguments of '\string\SKV@expnext' can't be empty}\@ehc }{% - \SKV@iftest{if}{@\detokenize\expandafter{\SKV@cdr#1\@nil}@}{% + \SKV@iftest{}{@\detokenize\expandafter{\SKV@cdr#1\@nil}@}{% \expandafter#1\expandafter{#2}% }{% \SKV@err{Invalid arguments '\string#1' for - '\string\SKV@expnext'\SKV@MB}\@ehc + '\string\SKV@expnext'}\@ehc }% }% }% } -\SKV@pdef*\SKV@DelayedAfterPackageEnd#1{% - \AtEndOfPackage{\SKV@AfterPackageEnd{#1}}} -\SKV@def\DeclarePackageCommand#1#2{% - \SKV@ensurescape{#2}% - \SKV@ifdefined#2{% - \edef\resvd@a{\expandafter\@gobble\string#2}% - \SKV@aftercs\let{Saved\resvd@a}#2% - \edef\resvd@a##1{% - \SKV@DelayedAfterPackageEnd{##1Saved\resvd@a\noexpand\endcsname}% - }% - \resvd@a{\expandafter\let\expandafter#2\csname}% - \let\resvd@a\relax - }{\SKV@DelayedAfterPackageEnd{\SKV@gundef#2}}% - #1#2% -} -\DeclarePackageCommand{\protected\def}\@namegdef{\SKV@aftercs\gdef} -\DeclarePackageCommand{\protected\def}\@nameedef{\SKV@aftercs\edef} -\DeclarePackageCommand{\protected\def}\@namexdef{\SKV@aftercs\xdef} \SKV@pdef*\SKV@ifnew{\SKV@savstate\SKV@t@stopte\SKV@@ifnew} \SKV@def*\SKV@@ifnew[#1]#2{% \ifSKV@st @@ -570,26 +594,28 @@ \expandafter\endgroup\expandafter\afterassignment \csname SKV@aft@rassignm@nt\SKV@no\endcsname } -\SKV@def*\SKV@trailead#1#2{% - \edef\SKV@trail{\the\SKV@toks}% - \SKV@toks\expandafter{\romannumeral-`\q\SKV@tr@ilead\noexpand#1& &}% +\SKV@def*\SKV@sp@def#1#2{% + \edef\@sp@def{\the\SKV@toks}% + \SKV@toks\expandafter{% + \romannumeral-`\q\SKV@@sp@def\noexpand\noexpand#1& &}% \edef#2{\the\SKV@toks}% - \SKV@toks\expandafter{\SKV@trail}% - \SKV@undef\SKV@trail + \SKV@toks\expandafter{\@sp@def}% + \SKV@undef\@sp@def } -\SKV@def*\SKV@tr@ilead#1 &{\SKV@tr@ile@d#1&} -\SKV@def*\SKV@tr@ile@d#1{\romannumeral-`\q#1} +\SKV@def*\SKV@@sp@def#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@expcsox#1{\SKV@aftercs\SKV@expox{#1}} -\SKV@def*\SKV@exptx#1{\unexpanded\@threeexpafter{#1}} +\SKV@def*\SKV@exptx#1{\unexpanded\SKV@threeafter{#1}} \SKV@def*\SKV@expcstx#1{\SKV@aftercs\SKV@exptx{#1}} \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@pdef*\SKV@undeflt#1#2{% - \SKV@ifempty{#1}{\let\glob@lrel@x\relax}{\let\glob@lrel@x\global}% - \SKV@for[,]{#2}\SKV@resvd{% +\SKV@pdef*\SKV@undeflist/#1/#2/{% + \SKV@ifempty{#1}% + {\let\glob@lrel@x\relax}{\let\glob@lrel@x\global}% + \XKV@for@n{#2}\SKV@resvd{% \SKV@expnext\SKV@ensurescape\SKV@resvd \glob@lrel@x\expandafter\SKV@undef\SKV@resvd }% @@ -613,7 +639,7 @@ \ifSKV@pl \SKV@despace\SKV@ndl \ifSKV@ask\expandafter\global\fi - \@threeexpafter\let + \SKV@threeafter\let \expandafter\csname\SKV@ndl\endcsname\SKV@undefined \else \ifSKV@ask\expandafter\global\fi @@ -633,6 +659,20 @@ \relax{2}{1}of2}}\@secondoftwo } \SKV@def*\SKV@ifcsundef#1{\@nameuse{SKV@\SKV@ifcsdef{#1}{2}{1}of2}} +\SKV@pdef*\SKV@AtEndAfterPackageEnd#1{% + \AtEndOfPackage{\SKV@AfterPackageEnd{#1}}} +\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@@providedef} \SKV@def\SKV@@providedef#1{% \edef\SKV@prov@d{\expandafter\@gobble\string#1}% @@ -729,9 +769,10 @@ } \SKV@def*\SKV@despace#1{% \SKV@ensurescape{#1}% - \SKV@expnext\SKV@trailead{#1}#1% + \SKV@expnext\SKV@sp@def{#1}#1% } -\SKV@def\SKV@detokdespace#1#2{\edef#2{\detokenize{#1}}\SKV@despace#2} +\SKV@def\SKV@detokdespace#1{% + \edef#1{\detokenize\expandafter{#1}}\SKV@despace#1} \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:} @@ -739,7 +780,8 @@ \SKV@def\SKV@xifblank#1{\SKV@expargs{0}\SKV@ifblank{#1}\@nil} \SKV@def\SKV@ifstrequal#1#2{% \begingroup - \SKV@detokdespace{#1}\resvd@a\SKV@detokdespace{#2}\resvd@b + \def\resvd@a{#1}\def\resvd@b{#2}% + \SKV@detokdespace\resvd@a\SKV@detokdespace\resvd@b \expandafter\aftergroup \csname SKV@\SKV@ifx\resvd@a\resvd@b{1}{2}of2\endcsname \endgroup @@ -762,7 +804,7 @@ }% \def\SKV@t@mp##1\@nil{% \ifx\@temptoks\@sptoken - \SKV@expnext\SKV@trailead{#2}#2% + \SKV@expnext\SKV@sp@def{#2}#2% \expandafter\SKV@tempa\expandafter#1#2\@nil \else \if#1\@temptoks\expandafter\SKV@tempa#2\@nil\fi @@ -772,76 +814,28 @@ \fi \endgroup } -\SKV@pdef*\SKV@appto{\SKV@savstate\SKV@testoptb\SKV@@appto} -\SKV@def\SKV@@appto#1#2{% - \ifSKV@st - \let\@unexp@expox\SKV@expox - \else - \let\@unexp@expox\unexpanded - \fi - \SKV@ap@to{#1}{#2}% - \SKV@resstate -} -\SKV@def*\SKV@ap@to#1#2{% +\SKV@pdef*\SKV@appto{\SKV@savstate\SKV@testoptb{\SKV@apprepto{appto}}} +\SKV@pdef*\SKV@prepto{\SKV@savstate\SKV@testoptb{\SKV@apprepto{prepto}}} +\SKV@def\SKV@apprepto#1#2#3{% + \def\tempa##1{\def\tempb####1{\SKV@aftercs##1{####1}}}% + \ifSKV@st\let\tempc\SKV@expox\else\let\tempc\unexpanded\fi \ifSKV@pl - \ifSKV@ask - \let\SKV@n@xt\SKV@csxdef - \else - \let\SKV@n@xt\SKV@csedef - \fi - \SKV@ifcsundef{#1}{% - \SKV@n@xt{#1}{\@unexp@expox{#2}}% - }{% - \SKV@n@xt{#1}{\SKV@expcsox{#1}\@unexp@expox{#2}}% - }% + \let\@ifundef\SKV@ifcsundef\let\tempd\SKV@expcsox + \ifSKV@ask\tempa\xdef\else\tempa\edef\fi \else - \ifSKV@ask - \let\SKV@n@xt\xdef - \else - \let\SKV@n@xt\edef - \fi - \SKV@ifundef{#1}{% - \SKV@n@xt#1{\@unexp@expox{#2}}% - }{% - \SKV@n@xt#1{\SKV@expox{#1}\@unexp@expox{#2}}% - }% + \let\@ifundef\SKV@ifundef\let\tempd\SKV@expox + \ifSKV@ask\def\tempb##1{\xdef##1}\else\def\tempb##1{\edef##1}\fi \fi -} -\SKV@pdef*\SKV@prepto{\SKV@savstate\SKV@testoptb\SKV@@prepto} -\SKV@def\SKV@@prepto#1#2{% - \ifSKV@st - \let\@unexp@expox\SKV@expox - \else - \let\@unexp@expox\unexpanded - \fi - \SKV@pr@pto{#1}{#2}% + \@ifundef{#2}{% + \tempb{#2}{\tempc{#3}}% + }{% + \SKV@ifstrequal{#1}{appto}% + {\tempb{#2}{\tempd{#2}\tempc{#3}}}% + {\tempb{#2}{\tempc{#3}\tempd{#2}}}% + }% + \SKV@undeflist//\tempa,\tempb,\tempc,\tempd/% \SKV@resstate } -\SKV@def*\SKV@pr@pto#1#2{% - \ifSKV@pl - \ifSKV@ask - \let\SKV@n@xt\SKV@csxdef - \else - \let\SKV@n@xt\SKV@csedef - \fi - \SKV@ifcsundef{#1}{% - \SKV@n@xt{#1}{\@unexp@expox{#2}}% - }{% - \SKV@n@xt{#1}{\@unexp@expox{#2}\SKV@expcsox{#1}}% - }% - \else - \ifSKV@ask - \let\SKV@n@xt\xdef - \else - \let\SKV@n@xt\edef - \fi - \SKV@ifundef{#1}{% - \SKV@n@xt#1{\@unexp@expox{#2}}% - }{% - \SKV@n@xt#1{\@unexp@expox{#2}\SKV@expox{#1}}% - }% - \fi -} \SKV@pdef\apptomac#1#2{% \SKV@ifundef{#1}{\edef#1{\unexpanded{#2}}}% {\edef#1{\SKV@expox{#1}\unexpanded{#2}}}% @@ -859,22 +853,17 @@ \SKV@pdef*\SKV@addtolist{\SKV@savstate\SKV@testoptf\SKV@@addtolist} \SKV@def*\SKV@@addtolist[#1]{% \def\parser{#1}% + \ifSKV@ask + \let\glob@l@or@def\xdef + \else + \let\glob@l@or@def\edef + \fi \ifSKV@pl - \def\SKV@n@xt##1{\SKV@aftercs\SKV@addt@list{##1}}% - \ifSKV@ask - \let\glob@l@or@def\xdef - \else - \let\glob@l@or@def\edef - \fi + \def\SKV@next##1{\SKV@aftercs\SKV@addt@list{##1}}% \else - \let\SKV@n@xt\SKV@addt@list - \ifSKV@ask - \let\glob@l@or@def\xdef - \else - \let\glob@l@or@def\edef - \fi + \let\SKV@next\SKV@addt@list \fi - \SKV@resstate\SKV@n@xt + \SKV@resstate\SKV@next } \SKV@def\SKV@addt@list#1#2{% \SKV@ifundef{#1}{% @@ -974,22 +963,22 @@ }% } \SKV@ifcsdef{ver@#1.\@pkgextension}{% - \let\SKV@n@xt\@firstofone + \let\SKV@next\@firstofone }{% - \def\SKV@n@xt{\SKV@appto+{#1.\@pkgextension-skvh@@k}}% + \def\SKV@next{\SKV@appto+{#1.\@pkgextension-skvh@@k}}% }% - \SKV@n@xt + \SKV@next } \let\SKV@steno\z@ \SKV@pdef*\SKV@for{\SKV@savstate\SKV@testoptd\SKV@@for} \SKV@pdef*\SKV@@for[#1]{% \let\SKV@steno\@ne \ifSKV@st - \def\SKV@n@xt{\SKV@for@b[#1]}% + \def\SKV@next{\SKV@for@b[#1]}% \else - \def\SKV@n@xt{\SKV@CommandGenParser{#1}\SKV@for@a}% + \def\SKV@next{\SKV@CommandGenParser{#1}\SKV@for@a}% \fi - \SKV@n@xt + \SKV@next } \SKV@pdef*\SKV@CommandGenParser#1{% \def\parser{#1}% @@ -1034,15 +1023,15 @@ \SKV@def\SKV@tforloop#1#2#4{% \long\def#3{#1}% \SKV@ifstrequal{#1}{\listbreak}{% - \let\SKV@n@xt\SKV@tforrema + \let\SKV@next\SKV@tforrema }{% \SKV@ifstrequal{#1}{\@nil}{% - \let\SKV@n@xt\SKV@tfornoop + \let\SKV@next\SKV@tfornoop }{% - #4\relax\let\SKV@n@xt\SKV@tforloop + #4\relax\let\SKV@next\SKV@tforloop }% }% - \SKV@n@xt#2{#4}% + \SKV@next#2{#4}% } \SKV@def\SKV@tfornoop#1#3{} \SKV@pdef*\SKV@tforrema#1\@nil\@nil#3{% @@ -1053,8 +1042,8 @@ \SKV@pdef*\SKV@onlypreamble#1{% \SKV@tfor{#1}\SKV@resvd{% \SKV@expnext\SKV@ensurescape\SKV@resvd - \expandafter\gapptomac\expandafter\SKV@preamblecmds - \expandafter{\expandafter\SKV@do@a\SKV@resvd}% + \edef\SKV@resvd##1##2{\SKV@appto?##1{##2\SKV@expox{\SKV@resvd}}}% + \SKV@resvd\SKV@preamblecmds\SKV@do@a }% } \SKV@AfterDocumentStart{% @@ -1074,7 +1063,7 @@ } \SKV@def*\SKV@CommandKeyParser#1{% \long\def\SKV@define@keylist##1{% - \SKV@undeflt{g}{\skif,\skifx,\skifcase,\skor,\skelse,\skfi}% + \SKV@undeflist/g/\skif,\skifx,\skifcase,\skor,\skelse,\skfi/% \ifswitchon{SKV@st}{% \long\edef\@keylist{\SKV@expox{##1}}% }{% @@ -1106,8 +1095,8 @@ \SKV@expargs{3}{\XKV@checkchoice[\val\nr]}{{#1}{#2}}{{#3}{#4}}\@nil } \SKV@pdef*\SKV@inputerr#1#2{% - \SKV@err{Erroneous value '#1' for key '#2'}{% - Please use the correct value for key '#2'.}% + \SKV@err{Erroneous value '#1' for key '#2'}% + {Please use the correct value for key '#2'.}% } \SKV@def*\SKV@despacelist{\SKV@savstate\SKV@testoptd\SKV@despac@list} \SKV@def*\SKV@despac@list[#1]#2{% @@ -1160,9 +1149,9 @@ \SKV@pdef*\SKV@cslet{\SKV@savstate\SKV@t@stopta\SKV@@cslet} \SKV@def*\SKV@@cslet#1#2{% \ifSKV@st - \def\SKV@n@xt{\SKV@aftercs\let{#1}#2}% + \def\SKV@next{\SKV@aftercs\let{#1}#2}% \else - \def\SKV@n@xt{% + \def\SKV@next{% \SKV@ifdef{#2}{% \SKV@aftercs\let{#1}#2% }{% @@ -1171,17 +1160,17 @@ }% }% \fi - \SKV@resstate\SKV@n@xt + \SKV@resstate\SKV@next } \SKV@pdef*\SKV@letcs{\SKV@savstate\SKV@t@stopta\SKV@@letcs} \SKV@def*\SKV@@letcs#1#2{% \ifSKV@st - \def\SKV@n@xt{% + \def\SKV@next{% \begingroup\expandafter\endgroup \expandafter\let\expandafter#1\csname#2\endcsname }% \else - \def\SKV@n@xt{% + \def\SKV@next{% \SKV@ifcsdef{#2}{% \expandafter\let\expandafter#1\csname#2\endcsname }{% @@ -1190,17 +1179,17 @@ }% }% \fi - \SKV@resstate\SKV@n@xt + \SKV@resstate\SKV@next } \SKV@pdef*\SKV@csletcs{\SKV@savstate\SKV@t@stopta\SKV@@csletcs} \SKV@def*\SKV@@csletcs#1#2{% \ifSKV@st - \def\SKV@n@xt{% + \def\SKV@next{% \begingroup\expandafter\endgroup \expandafter\let\csname#1\SKV@aftercs\endcsname{#2}% }% \else - \def\SKV@n@xt{% + \def\SKV@next{% \SKV@ifcsdef{#2}{% \SKV@aftercs\let{#1\SKV@aftercs}{#2}% }{% @@ -1209,60 +1198,38 @@ }% }% \fi - \SKV@resstate\SKV@n@xt + \SKV@resstate\SKV@next } -\SKV@pdef*\SKV@numdef{\SKV@savstate\SKV@testoptc\SKV@@numdef} -\SKV@pdef*\SKV@@numdef{% - \ifSKV@pl - \def\SKV@n@xt##1{\SKV@aftercs\SKV@numd@f{##1}}% - \ifSKV@ask - \let\glob@lrel@x\global - \else - \let\glob@lrel@x\relax - \fi +\SKV@pdef*\SKV@numdef{\SKV@savstate\SKV@testoptc{\SKV@numdimdef{num}}} +\SKV@pdef*\SKV@dimdef{\SKV@savstate\SKV@testoptc{\SKV@numdimdef{dim}}} +\SKV@def*\SKV@numdimdef#1{% + \ifSKV@ask + \let\glob@lrel@x\global \else - \let\SKV@n@xt\SKV@numd@f - \ifSKV@ask - \let\glob@lrel@x\global - \else - \let\glob@lrel@x\relax - \fi + \let\glob@lrel@x\relax \fi - \SKV@resstate\SKV@n@xt -} -\SKV@pdef*\SKV@numd@f#1#2{% - \SKV@ensurescape@notempty{#1}{#2}% - \SKV@ifundef{#1}{% - \newcount#1\glob@lrel@x#1=\numexpr#2\relax - }{% - \glob@lrel@x#1=\numexpr#2\relax - }% -} -\SKV@pdef*\SKV@dimdef{\SKV@savstate\SKV@testoptc\SKV@@dimdef} -\SKV@pdef*\SKV@@dimdef{% \ifSKV@pl - \def\SKV@n@xt##1{\SKV@aftercs\SKV@dimd@f{##1}}% - \ifSKV@ask - \let\glob@lrel@x\global - \else - \let\glob@lrel@x\relax - \fi + \def\SKV@next##1{% + \edef\resvd@a####1{####1{#1}\SKV@expcsox{##1}}% + \resvd@a\SKV@numdimd@f + }% \else - \let\SKV@n@xt\SKV@dimd@f - \ifSKV@ask - \let\glob@lrel@x\global - \else - \let\glob@lrel@x\relax - \fi + \def\SKV@next{\SKV@numdimd@f{#1}}% \fi - \SKV@resstate\SKV@n@xt + \SKV@resstate\SKV@next } -\SKV@pdef*\SKV@dimd@f#1#2{% - \SKV@ensurescape@notempty{#1}{#2}% - \SKV@ifundef{#1}{% - \newdimen#1\glob@lrel@x#1=\dimexpr#2\relax +\SKV@def*\SKV@numdimd@f#1#2#3{% + \SKV@ensurescape@notempty{#2}{#3}% + \SKV@ifstrequal{#1}{num}{% + \def\resvd@a{count}% }{% - \glob@lrel@x#1=\dimexpr#2\relax + \def\resvd@a{dimen}% + }% + \SKV@ifundef{#2}{% + \@nameuse{new\resvd@a}#2% + \glob@lrel@x#2=\@nameuse{#1expr}#3\relax + }{% + \glob@lrel@x#2=\@nameuse{#1expr}#3\relax }% } \SKV@def*\SKV@ensurescape@notempty#1#2{% @@ -1286,7 +1253,7 @@ \SKV@xifblank\SKV@keyparser\SKV@keylistparser@err\relax \SKV@despace\SKV@keyparser \begingroup - \SKV@detokdespace{,}\SKV@tempa + \def\SKV@tempa{,}\SKV@detokdespace\SKV@tempa \SKV@ifx\SKV@keyparser\SKV@tempa {\aftergroup\SKV@keylistparser@err}{}% \endgroup @@ -1335,8 +1302,8 @@ \define@boolkey+[KV]{skeyval}[SKV@]{draft}[true]{% \ifSKV@draft \setkeys[KV]{skeyval}{final=false}% - \SKV@AtPackageEnd{\ifSKV@draft\togtrue{draft}\else - \togfalse{draft}\fi}% + \SKV@AtPackageEnd{\ifSKV@draft\togon{draft}\else + \togoff{draft}\fi}% \fi }{% \SKV@inputerr{#1}{draft}% @@ -1344,8 +1311,8 @@ \define@boolkey+[KV]{skeyval}[SKV@]{final}[true]{% \ifSKV@final \setkeys[KV]{skeyval}{draft=false}% - \SKV@AtPackageEnd{\ifSKV@final\togtrue{final}\else - \togfalse{final}\fi}% + \SKV@AtPackageEnd{\ifSKV@final\togon{final}\else + \togoff{final}\fi}% \fi }{% \SKV@inputerr{#1}{final}% @@ -1355,11 +1322,32 @@ keyfamily,macroprefix,final} \ProcessOptionsX*[KV]\relax \SKV@pdef*\skvoptions#1{\setkeys[KV]{skeyval}{#1}} -\SKV@pdef*\SKV@ifdraft{\@nameuse{@\ifSKV@draft first\else second\fi oftwo}} -\SKV@pdef*\SKV@iffinal{\@nameuse{@\ifSKV@final first\else second\fi oftwo}} -\SKV@pdef*\SKV@ifnotdraft{\SKV@ifdraft\@secondoftwo\@firstoftwo} -\SKV@pdef*\SKV@ifnotfinal{\SKV@iffinal\@secondoftwo\@firstoftwo} +\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@o#1#2{% + \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 +} +\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@ + \endgroup +} \AtBeginDocument{% \SKV@ifundef\ifdraft {\SKV@pdef*\ifdraft{\SKV@ifdraft}}% @@ -1393,37 +1381,57 @@ * I haven't redefined '\string#1' *}% }% } -\SKV@pdef*\newswitch#1#2{% - \SKV@ensurenoscape{#1}% - \SKV@ifstrequal{#2}{true}{\def\SKV@resvd{true}}{% - \SKV@ifstrequal{#2}{false}{\def\SKV@resvd{false}}{% - \SKV@ifstrequal{#2}{on}{\def\SKV@resvd{true}}{% - \SKV@ifstrequal{#2}{off}{\def\SKV@resvd{false}}{% - \SKV@swvalerr{#1}{#2}% - }% - }% - }% +\SKV@def*\SKV@getswstate#1#2{% + \SKV@ifstrequal{#2}{true}{\def\SKV@resvd{true}}% + {\SKV@ifstrequal{#2}{false}{\def\SKV@resvd{false}}% + {\SKV@ifstrequal{#2}{on}{\def\SKV@resvd{true}}% + {\SKV@ifstrequal{#2}{off}{\def\SKV@resvd{false}}% + {\SKV@swvalerr{#1}{#2}}}}}% +} +\SKV@pdef*\newswitch{\SKV@testopt\SKV@newswitch{}} +\SKV@pdef*\SKV@newswitch[#1]#2{\SKV@testopt{\SKV@n@wswitch[#1]{#2}}{false}} +\SKV@pdef*\SKV@n@wswitch[#1]#2[#3]{% + \SKV@in@o{,}{#2}{% + \SKV@err{Command '\string\newswitch' doesn't accept list}% + {Please submit only one switch to '\string\newswitch' at a time.}% + }{}% + \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.}% + }% + \SKV@getswstate\newswitch{#3}% + \SKV@csifdefinable{if#1#2}{% + \csnewif{if#1#2}% + \@nameuse{#1#2\SKV@resvd}% + }% +} +\SKV@pdef*\defswitch{\SKV@testopt\SKV@defswitch{}} +\SKV@pdef*\SKV@defswitch[#1]#2{\SKV@testopt{\SKV@d@fswitch[#1]{#2}}{false}} +\SKV@pdef*\SKV@d@fswitch[#1]#2[#3]{% + \SKV@ensurenoscape{#2}% + \SKV@in@o{,}{#2}{% + \SKV@err{Command '\string\defswitch' doesn't accept list}% + {Please submit only one switch to '\string\defswitch' at a time.}% + }{}% + \SKV@ifcsundef{if#1#2}{}{% + \SKV@vbsmsg{warn}{Switch '\@backslashchar if#1#2' redefined\on@line}% }% - \expandafter\SKV@ifdefinable\csname if#1\endcsname{% - \csname newif\expandafter\endcsname\csname if#1\endcsname - \csname #1\SKV@resvd\endcsname + \SKV@ifstrnotequal{#1#2}{x}{}{% + \SKV@err{'\string\ifx' is a TeX primitive}% + {Why do you want to redefine '\string\ifx'? This is dangerous.}% }% + \SKV@getswstate\defswitch{#3}% + \csnewif{if#1#2}% + \@nameuse{#1#2\SKV@resvd}% } -\SKV@newlet\NewSwitches\NewIfs +\SKV@newlet\NewSwitches\NewBooleans \SKV@def*\setswitch#1#2{% \SKV@ensurenoscape{#1}% \SKV@ifcsundef{if#1}{% \SKV@noswerr{#1}% }{% - \SKV@ifstrequal{#2}{true}{\def\SKV@resvd{true}}{% - \SKV@ifstrequal{#2}{false}{\def\SKV@resvd{false}}{% - \SKV@ifstrequal{#2}{on}{\def\SKV@resvd{true}}{% - \SKV@ifstrequal{#2}{off}{\def\SKV@resvd{false}}{% - \SKV@swvalerr{#1}{#2}% - }% - }% - }% - }% + \SKV@getswstate\setswitch{#2}% \csname#1\SKV@resvd\endcsname }% } @@ -1440,86 +1448,107 @@ \SKV@def*\ifswitchon#1{% \SKV@ensurenoscape{#1}% \SKV@ifcsundef{if#1}{\SKV@noswerr{#1}\@gobbletwo}% - {\@nameuse{@\@nameuse{if#1}first\else second\fi oftwo}}% + {\@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{@\@nameuse{if#1}second\else first\fi oftwo}}% + {\@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{Invalid switch value '#2' for switch '\string#1'}% - {Valid switch values are 'true', 'on', 'false', and 'off'.}% + \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*\deftog#1{% - \SKV@ifcsundef{SKV@toggle@#1}{}{% - \SKV@vbsmsg{warn}{Toggle '#1' redefined\on@line}% +\SKV@pdef*\newtog{\SKV@testopt\SKV@newtog{}} +\SKV@pdef*\SKV@newtog[#1]#2{\SKV@testopt{\SKV@n@wtog[#1]{#2}}{false}} +\SKV@pdef*\SKV@n@wtog[#1]#2[#3]{% + \SKV@in@o{,}{#2}{% + \SKV@err{Command '\string\newtog' doesn't accept list}% + {Please submit only one tog to '\string\newtog' at a time.}% + }{}% + \SKV@ensurenoscape{#2}% + \SKV@ifcsdef{SKV@toggle@#1#2}{% + \SKV@err{Toggle '#1#2' already defined}% + {Please provide a new toggle or redefine '#1#2'.}% + }{\SKV@csletcs{SKV@toggle@#1#2}{SKV@t@ggle#3}}% +} +\SKV@pdef*\deftog{\SKV@testopt\SKV@deftog{}} +\SKV@pdef*\SKV@deftog[#1]#2{\SKV@testopt{\SKV@d@ftog[#1]{#2}}{false}} +\SKV@pdef*\SKV@d@ftog[#1]#2[#3]{% + \SKV@in@o{,}{#2}{% + \SKV@err{Command '\string\deftog' doesn't accept list}% + {Please submit only one tog to '\string\deftog' at a time.}% + }{}% + \SKV@ensurenoscape{#2}% + \SKV@ifcsundef{SKV@toggle@#1#2}{}{% + \SKV@vbsmsg{warn}{Toggle '#1#2' redefined\on@line}% }% - \SKV@aftercs\let{SKV@toggle@#1}\@secondoftwo -} -\SKV@pdef*\newtog#1{% - \SKV@ifcsdef{SKV@toggle@#1}{% - \SKV@err{Toggle '#1' already defined}% - {Please provide a new toggle or redefine '#1'.}% - }{\SKV@aftercs\let{SKV@toggle@#1}\@secondoftwo}% + \SKV@csletcs{SKV@toggle@#1#2}{SKV@t@ggle#3} } \SKV@pdef*\providetog#1{% \SKV@ifcsdef{SKV@toggle@#1}{% \SKV@vbsmsg{info}% {Toggle '#1' already defined.\SKV@MB Not redefined\on@line}% - }{\SKV@aftercs\let{SKV@toggle@#1}\@secondoftwo}% + }{\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@aftercs\let{SKV@toggle@#1\expandafter}% - \csname SKV@t@ggle#2\endcsname + \SKV@csletcs{SKV@toggle@#1}{SKV@t@ggle#2}% }{% \SKV@err{Inadmissible value '#2' for toggle '#1'}% - {Valid values for toggles are 'true' and 'false'.}% + {Valid values for toggles are 'true', 'or', 'false', and 'off'.}% }% }{\SKV@undeftog@err{#1}}% } -\SKV@def*\togtrue#1{% +\SKV@def*\togon#1{% \SKV@ifcsdef{SKV@toggle@#1}{% - \expandafter\let\csname SKV@toggle@#1\endcsname\SKV@t@ggletrue + \SKV@cslet{SKV@toggle@#1}\SKV@t@ggleon }{\SKV@undeftog@err{#1}}% } -\SKV@def*\togfalse#1{% +\SKV@def*\togoff#1{% \SKV@ifcsdef{SKV@toggle@#1}{% - \expandafter\let\csname SKV@toggle@#1\endcsname\SKV@t@gglefalse - }{% - \SKV@undeftog@err{#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*\iftog#1{% +\SKV@def*\iftogon#1{% \SKV@ifcsdef{SKV@toggle@#1}{\@nameuse{SKV@toggle@#1}}% {\SKV@undeftog@err{#1}}% } -\SKV@def*\ifnottog#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 - \togtrue{pdf}% + \togon{pdf}% \SKV@pdef*\SKV@ifpdf{\@firstoftwo}% \fi \SKV@pdef*\SKV@ifnotpdf{\SKV@ifpdf\@secondoftwo\@firstoftwo}% @@ -1539,49 +1568,49 @@ }% } \SKV@pdef*\define@menukey{\define@choicekey} -\SKV@pdef*\define@togkey{\XKV@t@stopta{\XKV@testoptd\SKV@define@togkey{}}} +\SKV@pdef*\define@togkey{% + \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@vbsmsg{warn}{% Key '\SKV@resa' in family '\XKV@tfam' with\SKV@MB prefix '\SKV@pref' redefined\on@line} - \SKV@csundef{\XKV@header\SKV@resa}% - \SKV@csundef{SKV@toggle@#1\SKV@resa}% + \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@n@xt{\SKV@aftercs\SKV@d@f@ne@togkey}% + \def\SKV@next{\SKV@aftercs\SKV@d@f@ne@togkey}% \else - \def\SKV@n@xt{\SKV@aftercs\SKV@d@fine@togkey}% + \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@n@xt\SKV@tempa + \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}{{\settog{#3}{\XKV@resa}#5}}% + \SKV@d@f@ne@t@gkey#1{#2}{#3}{#4}% + {{\SKV@expargs{0}{\SKV@getswstate{}}\XKV@resa\@nil + \settog{#3}{\SKV@resvd}#5}}% } \SKV@def*\SKV@d@f@ne@togkey#1#2#3#4#5#6{% \SKV@d@f@ne@t@gkey#1{#2}{#3}{#4}% - {{\settog{#3}{\XKV@resa}#5}{#6}}% + {{\SKV@expargs{0}{\SKV@getswstate{}}\XKV@resa\@nil + \settog{#3}{\SKV@resvd}#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 - \ifXKV@pl - \def#1##1{\XKV@pltrue\XKV@sttrue - \XKV@checkchoice[\XKV@resa]{##1}{true,false}#5% - }% - \else - \def#1##1{\XKV@plfalse\XKV@sttrue - \XKV@checkchoice[\XKV@resa]{##1}{true,false}#5% - }% - \fi + \def#1##1{% + \def#1####1{##1\XKV@sttrue + \XKV@checkchoice[\XKV@resa]{####1}{true,false,on,off}#5}% + }% + \ifXKV@pl#1\XKV@pltrue\else#1\XKV@plfalse\fi } -\SKV@pdef*\define@togkeys{\XKV@plfalse\XKV@testoptd\SKV@define@togkeys{}} +\SKV@pdef*\define@togkeys{% + \XKV@plfalse\XKV@testoptd\SKV@define@togkeys{}} \SKV@def*\SKV@define@togkeys#1#2[#3]{% \SKV@despacelist{#2}% \SKV@for*[,]\SKV@resa\SKV@tempa{% @@ -1595,17 +1624,15 @@ \SKV@vbsmsg{warn}{% Key '\SKV@resa' in family '\XKV@tfam' with\SKV@MB prefix '\SKV@pref' redefined\on@line} - \SKV@csundef{\XKV@header\SKV@resa}% - \SKV@csundef{SKV@toggle@#2\SKV@resa}% + \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{% - \noexpand\SKV@d@f@ne@t@gkey\@nameuse{\XKV@header\SKV@resa}% - {\SKV@resa}{#2\SKV@resa}{#3}% - {{\noexpand\settog{#2\SKV@resa}{\noexpand\XKV@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@tempa\SKV@d@f@ne@t@gkey\settog\XKV@resa } \SKV@pdef*\newordkey{\XKV@testoptb\SKV@newordkey} \SKV@def*\SKV@newordkey#1{% @@ -1655,12 +1682,12 @@ \SKV@findkeypointers{#2}% \SKV@expnext\SKV@definedkey@err\SKV@resa \ifXKV@pl - \def\SKV@n@xt{\SKV@aftercs\XKV@d@f@ne@boolkey}% + \def\SKV@next{\SKV@aftercs\XKV@d@f@ne@boolkey}% \else - \def\SKV@n@xt{\SKV@aftercs\XKV@d@fine@boolkey}% + \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@n@xt\SKV@tempa + \expandafter\SKV@next\SKV@tempa } \SKV@pdef*\newboolkeys{\XKV@plfalse\XKV@testoptd\SKV@newboolkeys{}} \SKV@def*\SKV@newboolkeys#1#2[#3]{% @@ -1676,14 +1703,14 @@ \SKV@findkeypointers{#2}% \SKV@expnext\SKV@definedkey@err\SKV@resa \ifXKV@pl - \def\SKV@n@xt{\SKV@aftercs\SKV@d@f@ne@togkey}% + \def\SKV@next{\SKV@aftercs\SKV@d@f@ne@togkey}% \else - \def\SKV@n@xt{\SKV@aftercs\SKV@d@fine@togkey}% + \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@n@xt\SKV@tempa + \aftergroup\SKV@next\SKV@tempa } \SKV@pdef*\newtogkeys{\XKV@plfalse\XKV@testoptd\SKV@newtogkeys{}} \SKV@def*\SKV@newtogkeys#1#2[#3]{% @@ -1777,22 +1804,22 @@ \SKV@def*\SKV@bitogkeys[#1]#2[#3]#4[#5]#6#7#8{% \@namedef{#1@#2@#4@func}{% #7\relax - \iftog{#3#4}{\togfalse{#3#6}}{\togtrue{#3#6}#8\relax}% + \iftogon{#3#4}{\togoff{#3#6}}{\togon{#3#6}#8\relax}% }% \@namedef{#1@#2@#6@func}{% #8\relax - \iftog{#3#6}{\togfalse{#3#4}}{\togtrue{#3#4}#7\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 - \iftog{#3#4}{\togtrue{#3#6}#8\relax}{\togfalse{#3#6}}% + \iftogon{#3#4}{\togon{#3#6}#8\relax}{\togoff{#3#6}}% }% \@namedef{#1@#2@#6@func}{% #8\relax - \iftog{#3#6}{\togtrue{#3#4}#7\relax}{\togfalse{#3#4}}% + \iftogon{#3#6}{\togon{#3#4}#7\relax}{\togoff{#3#4}}% }% \SKV@compk@y{#1}{#2}{#3}{#4}{#5}{#6}% } @@ -1801,21 +1828,21 @@ \ifswitchon{SKV@st}{% \ifswitchon{SKV@pl}{% \@namedef{#1@#2@#4@func}{% - #7\relax\ifnottog{#3#4}{\togfalse{#3#6}}{}% + #7\relax\iftogoff{#3#4}{\togoff{#3#6}}{}% }% }{% \@namedef{#1@#2@#4@func}{% - #7\relax\ifnottog{#3#4}{\togtrue{#3#6}#8\relax}{}% + #7\relax\iftogoff{#3#4}{\togon{#3#6}#8\relax}{}% }% }% }{% \ifswitchon{SKV@pl}{% \@namedef{#1@#2@#4@func}{% - #7\relax\iftog{#3#4}{\togfalse{#3#6}}{}% + #7\relax\iftogon{#3#4}{\togoff{#3#6}}{}% }% }{% \@namedef{#1@#2@#4@func}{% - #7\relax\iftog{#3#4}{\togtrue{#3#6}#8\relax}{}% + #7\relax\iftogon{#3#4}{\togon{#3#6}#8\relax}{}% }% }% }% @@ -1868,7 +1895,7 @@ {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 + with the same prefix '#1'. You can only do\SKV@MB that if you use the starred variant of \string\choicekeyvalues.}% }% \fi @@ -1884,8 +1911,8 @@ \SKV@for*[,]#1\SKV@tempa{% \edef\SKV@tempa{\detokenize\expandafter{\SKV@tempa}\space}% \edef\SKV@tempa{\expandafter\zap@space\SKV@tempa\@empty}% - \SKV@aftercs\xdef{SKV@zsp@\expandafter - \@gobble\SKV@tempa}{\SKV@expox{\SKV@tempa}}% + \SKV@csxdef{SKV@zsp@\expandafter\@gobble\SKV@tempa}% + {\SKV@expox{\SKV@tempa}}% }% \endgroup } @@ -1895,8 +1922,8 @@ \SKV@for*[,]#1\SKV@tempa{% \edef\SKV@tempa{\detokenize\expandafter{\SKV@tempa}}% \SKV@despace\SKV@tempa - \SKV@aftercs\xdef{SKV@dsp@\expandafter - \@gobble\SKV@tempa}{\SKV@expox{\SKV@tempa}}% + \SKV@csxdef{SKV@dsp@\expandafter\@gobble\SKV@tempa}% + {\SKV@expox{\SKV@tempa}}% }% \endgroup } @@ -1908,16 +1935,20 @@ } \SKV@def\SKV@define@multkeys#1,#2,#3,#4\@nil{% \let\SKV@altlisterr\z@ - \SKV@trailead{#1}\SKV@tempa + \SKV@sp@def{#1}\SKV@tempa \SKV@checkchoice{\SKV@tempa}{ord,cmd,bool,tog,choice,menu}{% - \edef\SKV@keytype{\the\numexpr\nr+1}% + \SKV@iftest{num}{\nr=6}{% + \edef\SKV@keytype{\the\numexpr\nr-1}% + }{% + \edef\SKV@keytype{\the\numexpr\nr+1}% + }% }{% \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'}% + 'choice', 'menu',\SKV@MB and '1', '2', '3', '4', '5'}% }% }% \SKV@ifnotempty{#2}{}{% @@ -1970,13 +2001,6 @@ [\unexpanded{\val\nr}]{% \SKV@csuse{\SKV@keyprefix @\SKV@keyfamily @#2@altlist}% }[#3]{\unexpanded{#4}}{\unexpanded{\SKV@inputerr{##1}{#2}}}% - \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 @@ -1992,25 +2016,8 @@ }% \fi } -\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*\in@tog#1#2{% - \SKV@in@{#1}{#2}% - \ifin@\togtrue{in@}\else\togfalse{in@}\fi -} -\deftog{in@} -\SKV@pdef*\in@tok#1#2{% - \begingroup - \SKV@expnext\SKV@trailead{\detokenize{#1}}\SKV@tempa - \SKV@expnext\SKV@trailead{\detokenize{#2}}\SKV@tempb - \@expandtwoargs\SKV@in@\SKV@tempa\SKV@tempb - \global\let\ifin@\ifin@ - \endgroup -} \def\XKV@makepf#1{% - \SKV@trailead{#1}\XKV@prefix + \SKV@sp@def{#1}\XKV@prefix \ifSKV@sk\else \SKV@expnext\XKV@checksanitizeb\SKV@rkpnames\SKV@tempa \SKV@despacelist*\SKV@tempa @@ -2028,7 +2035,7 @@ \edef\XKV@prefix{\ifx\XKV@prefix\@empty\else\XKV@prefix @\fi}% } \def\XKV@makehd#1{% - \SKV@expargs{3}\SKV@trailead{{#1}}\XKV@header\@nil + \SKV@expargs{3}\SKV@sp@def{{#1}}\XKV@header\@nil \ifSKV@sk\else \SKV@expnext\XKV@checksanitizeb\SKV@rfnames\SKV@tempa \SKV@despacelist*\SKV@tempa @@ -2069,54 +2076,26 @@ } \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@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}% + {}}}}}}}}}}% } \def\XKV@define@key#1{% \SKV@findkeypointers{#1}% @@ -2146,8 +2125,7 @@ \SKV@vbsmsg{warn}{% Key '\SKV@resa' in family '\XKV@tfam' with\SKV@MB prefix '\SKV@pref' redefined\on@line} - \SKV@csundef{\XKV@header\SKV@resa}% - \SKV@csundef{#1\SKV@resa}% + \SKV@Undef+{\XKV@header\SKV@resa,#1\SKV@resa}% }% \SKV@expnext\SKV@reservkey@err\SKV@resa \SKV@expnext\SKV@suspkey@err\SKV@resa @@ -2158,7 +2136,7 @@ \begingroup \def\SKV@tempa{% \expandafter\def\csname\XKV@header\SKV@resa\endcsname####1}% - \@threeexpafter\endgroup\expandafter\SKV@tempa\expandafter% + \SKV@threeafter\endgroup\expandafter\SKV@tempa\expandafter% {\expandafter\def\csname#1\SKV@resa\endcsname{##1}#4}% } \def\XKV@define@choicekey#1{% @@ -2182,19 +2160,37 @@ \SKV@ifcsundef{\XKV@header\SKV@resa}{}{% \SKV@vbsmsg{warn}{% Key '\SKV@resa' in family '\XKV@tfam' with\SKV@MB - prefix '\SKV@pref' redefined\on@line} - \SKV@csundef{\XKV@header\SKV@resa}% - \SKV@csundef{#1\SKV@resa}% + 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@n@xt{\SKV@aftercs\XKV@d@f@ne@boolkey}% + \def\SKV@next{\SKV@aftercs\XKV@d@f@ne@boolkey}% \else - \def\SKV@n@xt{\SKV@aftercs\XKV@d@fine@boolkey}% + \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@n@xt\SKV@tempa + \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@resa\@nil + \csname#3\SKV@resvd\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@resa\@nil + \csname#3\SKV@resvd\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 + \def#1##1{% + \def#1####1{##1\XKV@sttrue + \XKV@checkchoice[\XKV@resa]{####1}{true,false,on,off}#5}% + }% + \ifXKV@pl#1\XKV@pltrue\else#1\XKV@plfalse\fi } \def\XKV@d@fine@boolkeys#1#2#3{% \SKV@findkeypointers{#1}% @@ -2202,17 +2198,15 @@ \SKV@vbsmsg{warn}{% Key '\SKV@resa' in family '\XKV@tfam' with\SKV@MB prefix '\SKV@pref' redefined\on@line} - \SKV@csundef{\XKV@header\SKV@resa}% - \SKV@csundef{#2\SKV@resa}% + \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{% - \noexpand\XKV@d@f@ne@b@olkey\@nameuse{\XKV@header\SKV@resa}% - {\SKV@resa}{#2\SKV@resa}{#3}{{\noexpand\@nameuse{#2\SKV@resa - \noexpand\XKV@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@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{% @@ -2276,7 +2270,7 @@ \XKV@makepf{#1}% \XKV@checksanitizeb{#2}\XKV@fams \SKV@despacelist*\XKV@fams - \SKV@trailead{#3}\XKV@tkey + \SKV@sp@def{#3}\XKV@tkey \XKV@whilist\XKV@fams\XKV@tfam\ifXKV@knf\fi{% \XKV@makehd\XKV@tfam \SKV@ifcsdef{\XKV@header\XKV@tkey @reser}{\XKV@knffalse}{}% @@ -2296,7 +2290,7 @@ \XKV@makepf{#1}% \XKV@checksanitizeb{#2}\XKV@fams \SKV@despacelist*\XKV@fams - \SKV@trailead{#3}\XKV@tkey + \SKV@sp@def{#3}\XKV@tkey \XKV@whilist\XKV@fams\XKV@tfam\ifXKV@knf\fi{% \XKV@makehd\XKV@tfam \SKV@ifcsdef{\XKV@header\XKV@tkey @susp}{\XKV@knffalse}{}% @@ -2316,7 +2310,7 @@ \XKV@makepf{#1}% \XKV@checksanitizeb{#2}\XKV@fams \SKV@despacelist*\XKV@fams - \SKV@trailead{#3}\XKV@tkey + \SKV@sp@def{#3}\XKV@tkey \XKV@whilist\XKV@fams\XKV@tfam\ifXKV@knf\fi{% \XKV@makehd\XKV@tfam \SKV@ifcsdef{\XKV@header\XKV@tkey}{\XKV@knffalse}{}% @@ -2569,12 +2563,12 @@ \SKV@aftercs\XKV@merge{SKV@\XKV@header uservalue}{#1}\XKV@getsg }% } -\def\setkeys{% +\protected\def\setkeys{% \def\skif##1{% \SKV@ensurenoscape{##1}% \SKV@ifcsdef{if##1}{}{% \SKV@err{Undefined boolean '##1'}% - {Boolean '##1' undefined: This is an '\string\skif' error.}% + {'\string\skif' error: boolean '##1' undefined.}% }% \csname if##1\endcsname }% @@ -2609,7 +2603,7 @@ \SKV@ifnotblank{#1}{}{% \SKV@err{You're required to supply a value\SKV@MB for key '\XKV@tkey'}% - {Supply a value for key '\XKV@tkey' before continuing.}% + {Supply a value for key '\XKV@tkey' and rerun.}% }% \fi }% @@ -2639,11 +2633,11 @@ }% } \SKV@def*\SKV@testuservaluekey#1#2{% - \let\SKV@st@aux\ifSKV@st\SKV@sttrue\SKV@uvfalse + \let\SKV@staux\ifSKV@st\SKV@sttrue\SKV@uvfalse \XKV@whilist#1\SKV@tempa\ifSKV@st\fi{% \ifx#2\SKV@tempa\SKV@uvtrue\SKV@stfalse\fi }% - \let\ifSKV@st\SKV@st@aux\SKV@relax\SKV@st@aux + \let\ifSKV@st\SKV@staux\SKV@undef\SKV@staux } \SKV@def*\SKV@remspaceletter#1#2{% \begingroup @@ -2726,7 +2720,7 @@ \ifnum\escapechar<0\else \expandafter\expandafter \csname @gobble\ifnum\escapechar=32 space\fi - \@threeexpafter\endcsname + \SKV@threeafter\endcsname \fi\fi \string% } @@ -2753,7 +2747,7 @@ \SKV@ensurescape{#1}% \edef\SKV@tempa{saved\SKV@gobblescape#1}% \SKV@ifcsdef\SKV@tempa{% - \def\SKV@n@xt{\SKV@letcs#1\SKV@tempa\SKV@csundef\SKV@tempa}% + \def\SKV@next{\SKV@letcs#1\SKV@tempa\SKV@csundef\SKV@tempa}% }{% \SKV@err{% '\@nameuse\SKV@tempa' is undefined:\SKV@MB @@ -2764,13 +2758,13 @@ undefines\SKV@MB the saved command. }% }% - \SKV@n@xt + \SKV@next } \SKV@providedef*\input@path{} \SKV@pdef*\InputFileOnce{% \def\SKV@inputfile##1##2{% \InputIfFileExists{##2}{% - \SKV@aftercs\let{##2@read}\@empty + \SKV@cslet{##2@read}\@empty \let\SKV@inp@tfile\relax }{% \typein[\Answer]{^^J! File '\string##2' does not exist.^^J @@ -2780,10 +2774,7 @@ }{% \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{.}}% @@ -2806,10 +2797,10 @@ \ifnum\SKV@no=\z@\SKV@restore\input@path\fi \let\SKV@no\@ne } -\SKV@pdef\SKV@notloaded@err#1{% +\SKV@pdef*\SKV@notloadederr#1{% \SKV@ifcsdef{ver@#1.\@pkgextension}{}{% \SKV@err{Package '#1' wasn't loaded}% - {Document has started and package '#1' wasn't loaded.}% + {Document has begun and package '#1' wasn't loaded.}% }% } \SKV@def*\SKV@notloaded{} @@ -2820,10 +2811,81 @@ }% } \SKV@AtDocumentStart{% - \let\SKV@do@b\SKV@notloaded@err + \let\SKV@do@b\SKV@notloadederr \SKV@notloaded \global\let\SKV@do@b\@gobble } +\SKV@pdef*\DeclareKeyCommand{\@star@or@long\SKV@keycommand} +\SKV@def\SKV@keycommand#1{% + \SKV@ifdefinable#1\relax + \def\SKV@keycmdname{#1}% + \edef\resvd@a{\expandafter\@gobble\string#1}% + \edef\resvd@b{\expandafter\expandafter\expandafter\SKV@carcube + \expandafter\@gobble\string#1\@nil}% + \SKV@scantoksb\resvd@a + \SKV@scantoksb\resvd@b + \edef\resvd##1{\skvoptions{##1,keyfamily=\resvd@a,macroprefix=\resvd@b @}}% + \resvd{keyparser=;,keyprefix=KV}% + \SKV@testopt\SKV@k@ycommand{}% +} +\def\SKV@keycmdlist{}\def\SKV@k@ycmdlist{} +\SKV@def\SKV@k@ycommand[#1]{% + \SKV@ifnotempty{#1}{}{% + \SKV@err{\string\DeclareKeyCommand\space error: no keys declared}\@ehc + }% + \SKV@k@yc@mmand{#1}% + \define@keylist*\SKV@keycmdlist + \edef\resvd{\setkeys[KV]{\resvd@a}{\SKV@k@ycmdlist}}% + \resvd + \SKV@testopt\SKV@k@yc@mm@nd{1}% +} +\SKV@def\SKV@k@yc@mmand#1{% + \def\SKV@keycmdlist{}\def\SKV@k@ycmdlist{}% + \XKV@checksanitizea{#1}\SKV@tempa + \SKV@normalizea\SKV@tempa + \SKV@for*[,]\SKV@tempa\SKV@tempa{% + \expandafter\SKV@getkeyname\SKV@tempa==\@nil + \SKV@addtokeycmdlist\SKV@tkey\SKV@tval + }% +} +\SKV@def\SKV@k@yc@mm@nd[#1]#2{% + \edef\resvd##1##2{##1{\setkeys[KV]{\resvd@a}{####1}##2}}% + \ifx\l@ngrel@x\relax + \def\resvd@b{\newcommand*}% + \else + \let\resvd@b\newcommand + \fi + \resvd{\expandafter\resvd@b\SKV@keycmdname[#1][]}{#2}% +} +\SKV@def\SKV@getkeyname#1=#2=#3\@nil{% + \XKV@g@tkeyname#1=\@nil\SKV@tkey + \SKV@expnext\SKV@sp@def\SKV@tkey\SKV@tkey + \def\SKV@tval{#2}% + \ifx\SKV@tkey\@empty + \SKV@ifnotempty{#2}{}% + {\XKV@err{No key specified for value '#2'}\@ehc}% + \fi + \SKV@ifnotempty{#3}{}% + {\XKV@err{No value specified for key '#1'}\@ehc}% +} +\SKV@def\SKV@addtokeycmdlist#1#2{% + \SKV@oifstrequal{#2}{true}{% + \def\tempa{bool}% + }{% + \SKV@oifstrequal{#2}{false}{% + \def\tempa{bool}% + }{% + \def\tempa{cmd}% + }% + }% + \SKV@oifempty{#1}{}{% + \edef\resvd##1{\gapptomac##1{\tempa,\SKV@expox{#1},\SKV@expox{#2},;}}% + \resvd\SKV@keycmdlist + \edef\resvd##1{\gapptomac##1{\SKV@expox{#1}=\SKV@expox{#2},}}% + \resvd\SKV@k@ycmdlist + }% + \SKV@undef\tempa +} \SKV@onlypreamble{% \SKV@preamblecmds\SKV@onlypreamble \@afterpackageloaded\@ifpackagecurrent\@ifpackagenotcurrent -- cgit v1.2.3