diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/skeyval/skeyval.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/skeyval/skeyval.sty | 797 |
1 files changed, 437 insertions, 360 deletions
diff --git a/Master/texmf-dist/tex/latex/skeyval/skeyval.sty b/Master/texmf-dist/tex/latex/skeyval/skeyval.sty index fce36938787..010ce8c51fd 100644 --- a/Master/texmf-dist/tex/latex/skeyval/skeyval.sty +++ b/Master/texmf-dist/tex/latex/skeyval/skeyval.sty @@ -1,5 +1,19 @@ %++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++% -% This is file 'skeyval.sty', version 1.1a, 2012/10/16. % +% This is file 'skeyval.sty', version 1.2, 2013/02/10. % +% % +% NOTE % +% % +% Beginning from version 1.0, 2012/09/01, the skeyval package has changed % +% radically. Users of pre-version 1.0 of the package can load it now by % +% calling: % +% % +% \usepackage[compatibility]{skeyval} % +% \RequirePackage[compatibility]{skeyval} % +% or % +% \usepackage{skeyval-bc} % +% \RequirePackage{skeyval-bc} % +% % +% LICENSE % % % % This package and accompanying files may be distributed and/or % % modified under the conditions of the LaTeX Project Public License, % @@ -15,6 +29,8 @@ % implied warranties of merchantability and fitness for a particular % % purpose. % % % +% DISTRIBUTION % +% % % The following files constitute the skeyval bundle and must be % % distributed as a whole: % % % @@ -23,7 +39,7 @@ % skeyval-pstkey.sty, skeyval-pstkey.tex, skeyval-testclass.cls, % % and skeyval-testpkg.sty. % % % -% Copyright (c) 2010-2012 Ahmed Musa (amusa22@gmail.com). % +% Copyright (c) 2010-2013 Ahmed Musa (amusa22@gmail.com). % %++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++% \begingroup @@ -67,19 +83,19 @@ \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/16 v1.1a Robust key-value parser (AM)] +\ProvidesPackage{skeyval}[2013/02/10 v1.2 Robust key-value parser (AM)] \NeedsTeXFormat{LaTeX2e}[2011/06/27] \input skeyval-core -\skvrobustdef*\skvAfterEndPackage{% +\skvrobustdef*\skvafterendpackage{% \skvifcsdefTF{\@currname.\@currext-skv@endpkghook}{}{% \@namedef{\@currname.\@currext-skv@endpkghook}{}% }% \expandafter\g@addto@macro \csname\@currname.\@currext-skv@endpkghook\endcsname } -\skvrobustdef*\skvAfterPackage#1{% +\skvrobustdef*\skvafterpackage#1{% \skvafterbegindocument{% \skvifcsdefTF{ver@#1.\@pkgextension}{}{% \skv@warn{Package '#1' was never loaded}% @@ -99,13 +115,12 @@ }% \unexpanded\expandafter{\@popfilename}% } +\skvundef\skv@documentclass \skvrobustdef*\skv@getdocumentclass{% - \skv@swafalse - \ifx\@filelist\@undefined\else - \ifx\@filelist\relax\else - \ifx\@filelist\@gobble\else\skv@swatrue\fi - \fi\fi - \ifskv@swa + \ifcase0% + \ifx\@filelist\@undefined 1\fi + \ifx\@filelist\relax 1\fi + \ifx\@filelist\@gobble 1\fi\relax \skvcommaparse*\@filelist\skv@tempa{% \filename@parse\skv@tempa \ifx\filename@ext\@clsextension @@ -119,20 +134,22 @@ }% \fi } -\skv@getdocumentclass + +% The following packages need access to the original \@classoptionslist: +\skvnewdef*\skv@optionprocessorpackages{% + xkeyval,kvoptions,catoptions,biblatex,pgfopts,ltxkeys% +} % 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 + \ifcase0% + \ifx\@classoptionslist\@undefined 1\fi + \ifx\@classoptionslist\relax 1\fi\relax + \global\let\skv@filterclassoptions\relax \skvkvnormalize\@classoptionslist - \let\skv@origclassoptlist\@classoptionslist + \let\skvoriginalclassoptionslist\@classoptionslist \let\skv@classoptionslist\@classoptionslist \let\@classoptionslist\@empty - \skvcommaloop*\skv@origclassoptlist\skv@tempa{% + \skvcommaloop*\skvoriginalclassoptionslist\skv@tempa{% \skvxifinTF{=}{\skvexpandonce\skv@tempa}{}{% \skvaddtolist*\@classoptionslist\skv@tempa }% @@ -140,11 +157,9 @@ \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{% + \skvcommaloop*\skv@optionprocessorpackages\skv@prova{% \skvxifinTF{,\skv@prova,}{,\skv@tempa,}{% - \let\@classoptionslist\skv@origclassoptlist + \let\@classoptionslist\skvoriginalclassoptionslist \skvbreakloop }{}% }% @@ -153,15 +168,6 @@ }% \fi } -\skvifdefFT\skv@documentclass{% - \let\skv@documentclass\@empty - \let\skv@classoptionslist\@empty - \edef\@popfilename{% - \skvexpandonce\@popfilename\skv@filterclassoptions - }% -}{% - \skv@filterclassoptions -} \skvrobustdef*\skvbeforebegindocument{% \skvgappendtomacro\skv@beforebegindoc } @@ -187,7 +193,7 @@ } \skvrobustdef*\skv@notprerr#1{% \@latex@error{Command \detokenize{#1} should be used only - in preamble}\@ehd + in preamble}\skv@ehd } \skvnewdef*\skv@everypagehook{} \skvrobustdef*\skvatbegineverypage{\skvgappendtomacro\skv@everypagehook} @@ -206,29 +212,37 @@ \skvnewdef*\skv@preamblecmdhook{} \skvrobustdef*\skvonlypreamble#1{% - \def\do##1{% + \def\skv@provb##1{% + \skvifntypeTF{##1}{}{% + \skv@err{More than one macro + \MessageBreak '\detokenize{##1}'. + \MessageBreak Maybe a comma is missing in the list}\skv@ehd + }% \skvxifinTF{\detokenize{\do##1}}{\skvoxdetok\skv@preamblecmdhook}{% \skv@warn{Command '\noexpand##1' multiply \MessageBreak submitted to \string\skvonlypreamble: ignored}% }{% \xdef\skv@preamblecmdhook{% - \skvexpandonce\skv@preamblecmdhook - \unexpanded{\do##1}% + \skvexpandonce\skv@preamblecmdhook\unexpanded{\do##1}% }% }% }% \skvcommaparse{#1}\skv@prova{% - \expandafter\do\expandafter{\skv@prova}% + \expandafter\skv@provb\expandafter{\skv@prova}% }% } \AtEndOfPackage{% \skvafterbegindocument{% \def\do#1{% \skvifdefTF#1{% - \gdef#1{\@latexerr{'\string#1' is a preamble command}\@ehd}% + \gdef#1{\@latexerr{'\string#1' is a preamble command}\skv@ehd}% }{% - \@@warning{Undefined command '\unexpanded{#1}' - appeared in \string\skvonlypreamble}% + \ifx\relax#1\else + \@@warning{Undefined command '\unexpanded{#1}' + \MessageBreak appeared in \string\skvonlypreamble. + \MessageBreak Only defined commands should be + \MessageBreak submitted to \string\skvonlypreamble.}% + \fi }% }% \skv@preamblecmdhook @@ -242,7 +256,7 @@ % \skvunknownoptionhandler[<prefixes>]<<families>>{<handler>} % \skvrobustdef*\skvunknownoptionhandler{% - \skv@testopt\skv@unknownoptionhandler\skv@defaultpref + \skv@testopt\skv@unknownoptionhandler\skvdefaultprefix } \skvrobustdef*\skv@unknownoptionhandler[#1]{% \skvifnextchar<{\skv@unkn@wnoptionhandler{#1}}% @@ -251,14 +265,12 @@ \skvrobustdef*\skv@unkn@wnoptionhandler#1<#2>{% \skv@unknownkeyhandler[#1]{#2}% } - - \skvrobustdef*\skv@testopte#1{\skv@testopta{\skv@t@stopte{#1}}} -\skvrobustdef*\skv@t@stopte#1{\skv@testopt{\skv@t@st@pte{#1}}\skv@defaultpref} +\skvrobustdef*\skv@t@stopte#1{\skv@testopt{\skv@t@st@pte{#1}}\skvdefaultprefix} \skvrobustdef*\skv@t@st@pte#1[#2]{% % Only one prefix is allowed: \skvxifinTF{,}{\detokenize{#2}}{% - \skv@err{Only one prefix is allowed, but you gave '#2'}\@ehd + \skv@err{Only one prefix is allowed, but you gave '#2'}\skv@ehd }{% \skv@makeprefix{#2}% \skvifnextchar<{\skv@@t@st@pte{#1}}% @@ -289,6 +301,14 @@ \let\skvdefkey\skvvoidkey \skv@dox@a } +% \skvdeclareobsoleteoption +% [<pref>]{<fam>}{<obsolete key>}{<new key>}[<defa>]{<callback>} +\skvrobustdef*\skvdeclareobsoleteoption{% + \let\@fileswith@pti@ns\@badrequireerror + \let\skvdefkey\skvobsoletekey + \skv@dox@a +} + % \skvdeclarebooloption[<pref>]<<fam>>[<mp>]{<key>}[<defa>]{<callback>} \skvrobustdef*\skvdeclarebooloption{% \let\@fileswith@pti@ns\@badrequireerror @@ -302,44 +322,40 @@ \skv@dox@a } -% Our default action for unknown options is tied to \@currname & \@currext: +% Our default action for unknown options is tied to \@currname +% and \@currext: \skvrobustdef\skv@dox#1{% - \skvcsedef{skv@dox@\@currname @\@currext}{% + \skvcsedef{skv@dox@\@currname.\@currext}{% \unexpanded{% - \begingroup \ifx\skvcurrentvalue\skv@novaluetoks \def\skvcurrentvalue{no value}% \fi - \@onelevel@sanitize\CurrentOption - \@onelevel@sanitize\skvcurrentvalue #1% - \endgroup }% }% } -\skvrobustdef*\skv@dox@a{\skv@testopt\skv@dox@b\skv@defaultpref} +\skvrobustdef*\skv@dox@a{\skv@testopt\skv@dox@b\skvdefaultprefix} \skvrobustdef*\skv@dox@b[#1]{% - \skvifnextchar<% - {\skv@dox@c{#1}}{\skv@dox@c{#1}<\@currname.\@currext>}% + \skvifnextchar<{\skv@dox@c{#1}}{\skv@dox@c{#1}<\@currname.\@currext>}% } \skvrobustdef*\skv@dox@c#1<#2>{\skvdefkey[#1]{#2}} % Declare options with default values that will be used when the options % are called without user values. % -% \skvDeclarePassedOptions[<pref>]{<fam>}{<option>=<default>,...} +% \skvdeclarepassedoptions[<pref>]{<fam>}{<option>=<default>,...} % % Example: % -% \skvDeclarePassedOptions[KV]{fam}{% +% \skvdeclarepassedoptions[KV]{fam}{% % hyperref={colorlinks,breaklinks},xcolor=svgnames % } % -\skvrobustdef*\skvDeclarePassedOptions{% - \skv@testopt\skv@declarepassedoptions\skv@defaultpref +\skvrobustdef*\skvdeclarepassedoptions{% + \skv@testopt\skv@declarepassedoptions\skvdefaultprefix } \skvrobustdef*\skv@declarepassedoptions[#1]#2#3{% - \skvparsekeyvals{#3}\skv@tempa{% + \skvparsekvlist{#3}\skv@tempa{% \skvexpbracenext\skv@kvsplit\skv@tempa{% \skvdeclareoption[#1]<#2>{##1}[##2]{% \skvifcsdefTF{ver@##1.sty}{% @@ -347,9 +363,9 @@ \MessageBreak now you're passing options to it. \MessageBreak Instruction ignored}% }{% - \skvPassOptionsToPackage{####1}{##1}% + \skvpassoptionstopackage{####1}{##1}% \AtBeginDocument{% - \skvifpackageloaded{##1}{}{% + \skvifpackageloadedTF{##1}{}{% \skv@warn{Options were passed to package \MessageBreak '##1' but it was never loaded}% }% @@ -359,9 +375,9 @@ }% }% } -% \skvPassOptionsToPackage{<opts>}{<pkg>} -\skvrobustdef*\skvPassOptionsToPackage{\skv@passoptions{sty}} -\skvrobustdef*\skvPassOptionsToClass{\skv@passoptions{cls}} +% \skvpassoptionstopackage{<opts>}{<pkg>} +\skvrobustdef*\skvpassoptionstopackage{\skv@passoptions{sty}} +\skvrobustdef*\skvpassoptionstoclass{\skv@passoptions{cls}} \skvrobustdef*\skv@passoptions#1#2#3{% \begingroup \edef\@elt{opt@\skvtrimspace{#3}.#1}% @@ -372,14 +388,16 @@ \endgroup } -% \skvDeclarePassedOptionsLoadPackage +% Pass options to package and load the package after processing options. +% +% \skvdeclarepassedoptionsloadpackage % [<pref>]{<fam>}{<option>=<default>,...} % -\skvrobustdef*\skvDeclarePassedOptionsLoadPackage{% - \skv@testopt\skv@declarepassedoptions@load\skv@defaultpref +\skvrobustdef*\skvdeclarepassedoptionsloadpackage{% + \skv@testopt\skv@declarepassedoptions@load\skvdefaultprefix } \skvrobustdef*\skv@declarepassedoptions@load[#1]#2#3{% - \skvparsekeyvals{#3}\skv@tempa{% + \skvparsekvlist{#3}\skv@tempa{% \skvexpbracenext\skv@kvsplit\skv@tempa{% \skvdeclareoption[#1]<#2>{##1}[##2]{% \skvifcsdefTF{ver@##1.sty}{% @@ -418,86 +436,134 @@ % 4. The \ProcessOptionsX of xkeyval package doesn't expect any plus (+) % suffix: it processes options only in a single family. % -\skvrobustdef*\skvprocessoptions{\skv@testopte\skv@pox} +% 5. \skvpackagelist contains the list of loaded packages with their +% options that are found on the current paths. See +% <https://groups.google.com/forum/#!topic/comp.text.tex/XErNCMcT_jc> +% for the rationale. Example: +% +% \usepackage[option1,option2]{foobar} +% \show\skvpackagelist +% \expandafter\show\csname foobar.sty.poxkeys\endcsname +% +\skvnewlet\skvpackagelist\@empty +\skvrobustdef*\skvprocessoptions{% + \skv@getdocumentclass + \ifdefined\skv@documentclass + \global\let\skv@getdocumentclass\relax + \skv@filterclassoptions + \fi + \skv@testopte\skv@pox +} +\skvnewlet\skv@savprocessoptions\skvprocessoptions +\skvrobustdef*\skv@badprocessoptions{% + \skv@testopte{% + \skv@err{\noexpand\skvprocessoptions can't be nested}\skv@ehd + }% +} \skvrobustdef*\skv@pox[#1]{% \skv@inpoxtrue \let\@fileswith@pti@ns\@badrequireerror - \edef\skv@userclassorpackage{\@currname.\@currext}% + \let\skvprocessoptions\skv@badprocessoptions \begingroup - \let\skv@clsoptsfound\@empty - \let\skv@clsorpkgopts\@empty + \edef\skv@userclassorpackage{\@currname.\@currext}% + \let\skv@classoptionsfound\@empty + \let\skv@classorpackageoptions\@empty + % The list of pox keys for each family, simply for taking + % pox keys outside the current scope: \let\skv@exitpoxkeys\@empty - \skvifxTF\skv@userclassorpackage\skv@documentclass{% + % The list of pox keys in all familes: + \let\skvcurrentpoxkeys\@empty + \ifx\skv@userclassorpackage\skv@documentclass + \skv@inclasstrue \let\@unusedoptionlist\skv@classoptionslist - }{% - \ifcase0\ifx\skv@classoptionslist\@empty\else - \ifx\skv@classoptionslist\relax\else\ifskv@st1\fi\fi\fi\relax - \skv@swafalse - \else - \skv@swatrue - \fi - \skvifboolFT{skv@swa}{}{% - \def\ifkeyundef##1##2##3{\skvexpanded{\skvifkeydefFT[##1]{##2}{##3}}}% - \skvcommaloop*\skv@classoptionslist\CurrentOption{% - \expandafter\expandafter\expandafter - \skv@g@tkeyname\CurrentOption=\skv@nil\skvcurrentkey - % 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. - \ifkeyundef\skvcurrentprefix\skv@fams\skvcurrentkey{}{% - \edef\skv@clsoptsfound{% - \skvexpandonce\skv@clsoptsfound - \ifx\skv@clsoptsfound\@empty\else,\fi - \skvexpandonce\CurrentOption + \else + \skv@inclassfalse + \ifcase0% + \ifx\skv@classoptionslist\@undefined 1\fi + \ifx\skv@classoptionslist\@empty 1\fi + \ifx\skv@classoptionslist\relax 1\fi\relax + \ifskv@st + \def\ifkeyundef##1##2##3{\skvexpanded{\skvifkeydefFT[##1]{##2}{##3}}}% + \skvcommaloop*\skv@classoptionslist\CurrentOption{% + \expandafter\expandafter\expandafter + \skv@g@tkeyname\CurrentOption=\skv@getname@nil\skvcurrentkey + % 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. + \ifkeyundef\skvcurrentprefix\skv@fams\skvcurrentkey{}{% + \edef\skv@classoptionsfound{% + \skvaddlist,\skv@classoptionsfound\skvexpandonce\CurrentOption + }% + \expandafter\skv@removeoption\expandafter{\CurrentOption}% }% - \expandafter\skv@useoption\expandafter{\CurrentOption}% }% - }% - \ifx\skv@clsoptsfound\@empty\else\skvafterfi - \skvexpbracenext\skv@getkeynames\skv@clsoptsfound\skv@tempd - \skvexpbracenext\skv@getpoxkeys\skv@tempd + \ifx\skv@classoptionsfound\@empty\else + \skvexpbracenext\skv@getnamesofkeys\skv@classoptionsfound\skv@tempd + \skvexpbracenext\skv@getpoxkeys\skv@tempd + \fi \fi - }% - }% - \skvletcs\skv@clsorpkgopts{opt@\@currname.\@currext}% - \skvifxTF\skv@clsorpkgopts\@empty{}{% - \skvifxTF\skv@clsorpkgopts\relax{}{% - \skvexpbracenext\skv@getkeynames\skv@clsorpkgopts\skv@tempd - \skvexpbracenext\skv@getpoxkeys\skv@tempd - }% - }% - % Package options have higher priority than class options. Hence - % filter class options \skv@clsoptsfound that are also present - % as package options \skv@clsorpkgopts: - \ifcase0\ifx\skv@clsoptsfound\@empty\else - \ifx\skv@clsorpkgopts\@empty\else - \ifx\skv@clsorpkgopts\relax\else1\fi\fi\fi\relax - \else\skvafterfi + \fi + \fi + \skvletcs\skv@classorpackageoptions{opt@\@currname.\@currext}% + \ifx\skv@classorpackageoptions\relax + \def\skv@classorpackageoptions{}% + \fi + \skvifemptyTF\skv@classorpackageoptions{}{% + \skvexpbracenext\skv@getnamesofkeys\skv@classorpackageoptions\skv@tempd + \skvexpbracenext\skv@getpoxkeys\skv@tempd + % Package options have higher priority than class options. Hence + % filter class options \skv@classoptionsfound that are also present + % as package options \skv@classorpackageoptions: \skvifxTF\skv@userclassorpackage\skv@documentclass{}{% - \skvcommaloop*\skv@clsoptsfound\CurrentOption{% - \expandafter\expandafter\expandafter - \skv@g@tkeyname\CurrentOption=\skv@nil\skv@tempa - \skvxifinTF{,\skvoxdetok\skv@tempa,}{,\skvoxdetok\skv@tempd,}{}{% - \edef\skv@clsorpkgopts{% - \skvexpandonce\skv@clsorpkgopts,\skvexpandonce\CurrentOption + \skvifemptyTF\skv@classoptionsfound{}{% + \skvcommaloop*\skv@classoptionsfound\CurrentOption{% + \expandafter\skv@g@tkeyname\CurrentOption=\skv@getname@nil\skv@tempa + \skvxifinTF{,\skvoxdetok\skv@tempa,}{,\skvoxdetok\skv@tempd,}{}{% + \edef\skv@classorpackageoptions{% + \skvaddlist,\skv@classorpackageoptions + \skvexpandonce\CurrentOption + }% }% }% }% }% + }% + % Get document class options that are on the current paths: + \ifx\skv@userclassorpackage\skv@documentclass + \def\skvclassoptionsfound{}% + \skvcommaloop*\skv@classorpackageoptions\skv@prova{% + \expandafter\skv@g@tkeyname\skv@prova=\skv@getname@nil\skvcurrentkey + \edef\skv@prova{[\skvcurrentprefix]{\skv@fams}{\skvcurrentkey}}% + \expandafter\skvifkeydefTF\skv@prova{% + \edef\skvclassoptionsfound{% + \skvaddlist,\skvclassoptionsfound\skvcurrentkey + }% + }{}% + }% + \else + \let\skvclassoptionsfound\skv@classoptionsfound \fi + % \skvpackagelist is populated by all calls to \skvprocessoptions. + \skvletcs\skv@prova{\@currname.\@currext.poxkeys}% + \edef\skvpackagelist{% + \skvaddlist,\skvpackagelist + \skvifdefFT\skv@prova{}{\@currname.\@currext{\skv@prova}}% + }% + \let\do\skvcmdexit \skvexpanded{\endgroup - \skv@exitpoxkeys - \skvcmdexit\@unusedoptionlist - % There may be preset keys even when \skv@clsorpkgopts is empty: + \do\skvclassoptionsfound\do\skvcurrentpoxkeys + \do\skvpackagelist\do\@unusedoptionlist + \skvboolexit\ifskv@inclass\skv@exitpoxkeys + % There may be preset keys even when \skv@classorpackageoptions is empty: \skvsetkeys\ifskv@pl+\fi[\skvcurrentprefix]{\skv@fams}[#1]% - {\skvexpandonce\skv@clsorpkgopts}% + {\skvexpandonce\skv@classorpackageoptions}% }% - \skvcslet{skv@dox@\@currname @\@currext}\relax - \skvinitializermkeys*\skvcurrentprefix\skv@fams + \skvcslet{skv@dox@\@currname.\@currext}\relax \skv@inpoxfalse \let\@fileswith@pti@ns\@@fileswith@pti@ns + \let\skvprocessoptions\skv@savprocessoptions \AtEndOfPackage{\let\@unprocessedoptions\relax}% - \csname skv@\@currname @\@currext @afterprocess@hook\endcsname - \skvcslet{skv@\@currname @\@currext @afterprocess@hook}\relax + \csname skv@\@currname.\@currext @afterprocess@hook\endcsname + \skvcslet{skv@\@currname.\@currext @afterprocess@hook}\relax } % \skvprocessoptionswithclassoptions*+[<pref>]{<fams>}[<na>] @@ -506,9 +572,11 @@ % user hasn't put it. % \skvrobustdef*\skvprocessoptionswithclassoptions{% - \skv@testopte\skv@pox@copyclassoptions + \skv@testopte\skv@processoptionswithclassoptions +} +\skvrobustdef*\skv@processoptionswithclassoptions[#1]{% + \skv@sttrue\skv@pox[#1]% } -\skvrobustdef*\skv@pox@copyclassoptions[#1]{\skv@sttrue\skv@pox[#1]} % \skvprocessoptionswithoutclassoptions*+[<pref>]{<fams>}[<na>] % @@ -516,175 +584,189 @@ % user has put it. % \skvrobustdef*\skvprocessoptionswithoutclassoptions{% - \skv@testopte\skv@pox@nocopyclassoptions + \skv@testopte\skv@processoptionswithoutclassoptions +} +\skvrobustdef*\skv@processoptionswithoutclassoptions[#1]{% + \skv@stfalse\skv@pox[#1]% } -\skvrobustdef*\skv@pox@nocopyclassoptions[#1]{\skv@stfalse\skv@pox[#1]} % \skv@getpoxkeys{<keys>} % -% Get pox keys (ie, keys processed as options) from package or -% class options. +% 1. Get pox keys (ie, keys processed as options) from package or +% class options. +% 2. This isn't a user command! See \skvgetdefinedkeys in file +% skeyval-core.tex. \skvrobustdef*\skv@getpoxkeys#1{% \begingroup - \def\xiftest{% - \skvexpanded{% - \noexpand\skvifkeyinfamiliesFT - [\skvcurrentprefix]{\skv@fams}{\skvcurrentkey}% + \skvcommaloop*\skv@fams\skvcurrentfamily{% + \skv@makeheader\skvcurrentfamily + % Prepare to take poxkeys outside the group: + \skvxifinTF{\skvoxdetok\skv@header}{\skvoxdetok\skv@exitpoxkeys}{}{% + \edef\skv@exitpoxkeys{% + \skvexpandonce\skv@exitpoxkeys + \noexpand\skvcsexit{\skvcurrentpath.@poxkeys}% + }% }% - }% - \skvcommaloop{#1}\skvcurrentkey{% - \xiftest{}{% - % \skv@header is formed in the search for the key: - \skvletcs\skv@prova{\skv@header.@poxkeys}% - \skvifdefTF\skv@prova{% - \skvxifinTF{,\skvoxdetok\skvcurrentkey,}{,\skvoxdetok\skv@prova,}{}{% - \skvcsedef{\skv@header.@poxkeys}{\skv@prova,\skvcurrentkey}% - }% - }{% - \skvcsedef{\skv@header.@poxkeys}{\skvcurrentkey}% + \edef\skv@prova{\@currname.\@currext.poxkeys}% + \skvxifinTF{\skvoxdetok\skv@prova}{\skvoxdetok\skv@exitpoxkeys}{}{% + \edef\skv@exitpoxkeys{% + \skvexpandonce\skv@exitpoxkeys\noexpand\skvcsexit{\skv@prova}% }% - \skvxifinTF{\skvoxdetok\skv@header}{\skvoxdetok\skv@exitpoxkeys}{}{% - \edef\skv@exitpoxkeys{% - \skvexpandonce\skv@exitpoxkeys - \noexpand\skvcsexit{\skv@header.@poxkeys}% + }% + \skvcommaloop{#1}\skvcurrentkey{% + \skvifcsdefFT{\skv@header\skvcurrentkey.@cbk}{}{% + \skvletcs\skv@prova{\skvcurrentpath.@poxkeys}% + \skvifdefTF\skv@prova{% + \skvxifinTF{,\skvcurrentkey,}{,\skv@prova,}{}{% + \skvcsedef{\skvcurrentpath.@poxkeys}{% + \skvaddlist,\skv@prova\skvcurrentkey + }% + }% + }{% + \skvcsedef{\skvcurrentpath.@poxkeys}{\skvcurrentkey}% + }% + \skvletcs\skv@prova{\@currname.\@currext.poxkeys}% + \skvifdefTF\skv@prova{% + \skvxifinTF{,\skvcurrentkey,}{,\skv@prova,}{}{% + \skvcsedef{\@currname.\@currext.poxkeys}{% + \skvaddlist,\skv@prova\skvcurrentkey + }% + }% + }{% + \skvcsedef{\@currname.\@currext.poxkeys}{\skvcurrentkey}% + }% + \skvxifinTF{,\skvcurrentkey,}{,\skvcurrentpoxkeys,}{}{% + \edef\skvcurrentpoxkeys{% + \skvaddlist,\skvcurrentpoxkeys\skvcurrentkey + }% }% }% }% }% + \let\do\skvcmdexit \skvexpanded{\endgroup - \skvcmdexit\skv@exitpoxkeys + \do\skvcurrentpoxkeys + % We need the list in \skv@exitpoxkeys outside the current scope. + % It will be used to take poxkeys (on each path) outside the scope + % in \skv@pox: + \do\skv@exitpoxkeys + % We need the poxkeys on each path outside the current scope: \skv@exitpoxkeys }% } % +++++++++ Utilities for handling options via \directkeys +++++++++% -\skvrobustdef*\dirkeys@declareoptions@a{% - \let\@fileswith@pti@ns\@badrequireerror - \skv@dox -} -\skvrobustdef*\dirkeys@declareoptions@b#1{% +% \dirkeys@declareoptions{<star>}{<list>} +% +% <star>, if present, means new options. +% +\skvrobustdef*\dirkeys@declareoptions#1#2{% \let\@fileswith@pti@ns\@badrequireerror - \skv@inopttrue \begingroup - \edef\skv@tempb{\unexpanded{#1}}% + % The boolean skv@inopt differs from skv@inpox. skv@inopt is only + % meant to set the default family in \dirkeys@setdefaultpath + % when dealing with options. + \skv@inopttrue \def\skv@tempa{}% - \def\do##1##2{% + \edef\skv@tempb{\unexpanded{#2}}% + \def\skv@pathdo##1##2{% \edef\skv@tempa{% \skvexpandonce\skv@tempa - \skvdefinekeys\ifskv@handlerswa*\fi[##1]{##2}% + \skvdefinekeys#1[##1]{##2}% [\dirkeys@holderprefixtoks]{\skvexpandonce\skv@tempb}% }% }% - \dirkeys@getcurrentroots\do + \dirkeys@pathlist \expandafter\endgroup\skv@tempa - \skv@inoptfalse } -% % \dirkeys@executeoptions{<options>} +% \dirkeys@executeoptions{<plus sign or empty>}{<kvlist>} % -% 1. Ececute options on all the prevailing paths. If any of -% the options isn't found on a path, report error (ie, -% don't save the key to the list of 'remaining keys'). Unknown -% options should be flagged by an error immediately. -% 2. There is no plus (+) variant for this command/handler. -% 3. It is the user's responsibility to ensure that keys exist on -% current paths. This is easier to enforce if there is only one -% current path (prefix and family). +% 1. <no-plus> = Execute options on ONLY the first path found. If an +% option isn't found on the given paths, report error (ie, +% don't save the option to the list of 'remaining keys'). Unknown +% options should be flagged by an error immediately. Hence no +% star (*) form of \dirkeys@executeoptions. +% 2. <plus> = Execute options on all the prevailing paths. If an +% option isn't found on the given paths, flag error. % -\skvrobustdef*\dirkeys@executeoptions#1{% - \skv@inopttrue +\skvrobustdef*\dirkeys@executeoptions#1#2{% \begingroup - % Don't confuse parameter characters in #1 with those of \do: - \edef\skv@tempb{\unexpanded{#1}}% - \def\skv@tempa{}% - \def\do##1##2{% - \skvletcs\skv@igkeys{##1/##2/.@ignoredkeys}% - \skvifdefTF\skv@igkeys{}{\def\skv@igkeys{}}% - \edef\skv@tempa{% - \skvexpandonce\skv@tempa - \skvsetkeys[##1]{##2}[\skv@igkeys]{\skvexpandonce\skv@tempb}% - }% - }% - \dirkeys@getcurrentroots\do - \expandafter\endgroup\skv@tempa - \skv@inoptfalse -} - -% \dirkeys@executeoptions@b{<options>} -% -% 1. Ececute options in all the prevailing families. If any of -% the options isn't found in at least one family, report error (ie, -% don't save the key to the list of 'remaining keys'). Unknown options -% should be flagged immediately. -% 2. The plus (+) variant will execute the option in each family in -% which the option is found. -% 3. The difference between \dirkeys@executeoptions and -% \dirkeys@executeoptions@b is that in \dirkeys@executeoptions -% the prefixes can be more than one. Options will be executed for -% all combinations of prefixes and families. -% 4. Prevailing prefixes can't be more than one. -% -\skvrobustdef*\dirkeys@executeoptions@b#1{% \skv@inopttrue - \begingroup - \dirkeys@collectpaths - \skvexpanded{\endgroup - \skvsetkeys+[\skv@tempa]{\skv@tempb}[\skv@tempc]% - }{#1}% - \skv@inoptfalse -} -\skvrobustdef*\dirkeys@collectpaths{% - \skvemptify{\do\skv@tempa\do\skv@tempb\do\skv@tempc}% - \def\do##1##2{% - \skvletcs\skv@igkeys{##1/##2/.@ignoredkeys}% - \skvifdefTF\skv@igkeys{}{\def\skv@igkeys{}}% - \skvxifinTF{,##1,}{,\skv@tempa,}{}{% - \edef\skv@tempa{\skv@tempa\ifx\skv@tempa\@empty\else,\fi##1}% - }% - \skvxifinTF{,##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\skv@igkeys + % If the number of families is greater than one, gnored keys + % from different families will mixed. This is the case even in + % \skvsetkeys. + \skvemptify{\skv@igkeys,\skv@fams}% + \@tempcnta\skvz@ + \def\skv@pathdo##1##2{% + \advance\@tempcnta\@ne + \def\skv@pref{##1}% + \ifnum\@tempcnta=\@ne + \def\skv@firstpref{##1}% + \else + \ifx\skv@pref\skv@firstpref\else + \skv@err{You can't use multiple prefixes when + \MessageBreak calling the handler '.execute options'. + \MessageBreak Check your values of '.prefix' and '.paths'}\skv@ehd + \fi + \fi + \skvxifinTF{,##2,}{,\skv@fams,}{}{% + \edef\skv@fams{\skvaddlist,\skv@fams##2}% }% + \skvletcs\skv@prova{##1/##2/.@ignoredkeys}% + \ifdefined\skv@prova + \edef\skv@igkeys{\skvaddlist,\skv@igkeys\skv@prova}% + \fi }% - \dirkeys@getcurrentroots\do - \skvifelementcount*\skv@tempa\tw@ - {\skv@err{You can't submit more than one prefix here}\@ehd}{} + \dirkeys@pathlist + \ifx\skv@fams\@empty + \skv@err{No family before calling '.execute options'}\skv@ehd + \fi + \skvexpanded{\endgroup + \skvsetkeys#1[\skv@pref]{\skv@fams}[\skv@igkeys]% + }{#2}% } -\skvrobustdef*\dirkeys@processoptions{% - \skv@inopttrue +\skvrobustdef*\dirkeys@processoptions#1#2{% \begingroup - \def\skv@tempa{}% - \def\do##1##2{% - \skvletcs\skv@igkeys{##1/##2/.@ignoredkeys}% - \skvifdefTF\skv@igkeys{}{\def\skv@igkeys{}}% - \edef\skv@tempa{% - \skvexpandonce\skv@tempa - \skvprocessoptions\ifskv@handlerswa*\fi - [##1]<##2>[\skv@igkeys]% + \skv@inopttrue + % If the number of families is greater than one, gnored keys + % from different families will mixed. This is the case even in + % \skvprocessoptions. + \skvemptify{\skv@igkeys,\skv@fams}% + \@tempcnta\skvz@ + \def\skv@pathdo##1##2{% + \advance\@tempcnta\@ne + \def\skv@pref{##1}% + \ifnum\@tempcnta=\@ne + \def\skv@firstpref{##1}% + \else + \ifx\skv@pref\skv@firstpref\else + \skv@err{You can't use multiple prefixes when + \MessageBreak calling the handler '.process options'. + \MessageBreak Check your values of '.prefix' and '.paths'}\skv@ehd + \fi + \fi + \skvxifinTF{,##2,}{,\skv@fams,}{}{% + \edef\skv@fams{\skvaddlist,\skv@fams##2}% }% + \skvletcs\skv@prova{##1/##2/.@ignoredkeys}% + \ifdefined\skv@prova + \edef\skv@igkeys{\skvaddlist,\skv@igkeys\skv@prova}% + \fi }% - \dirkeys@getcurrentroots\do - \expandafter\endgroup\skv@tempa - \skv@inoptfalse -} -\skvrobustdef*\dirkeys@processoptions@b{% - \skv@inopttrue - \begingroup - \dirkeys@collectpaths + \dirkeys@pathlist + \ifx\skv@fams\@empty + \skv@err{No family before calling '.process options'}\skv@ehd + \fi \skvexpanded{\endgroup - \skvprocessoptions\ifskv@handlerswa*\fi - +[\skv@tempa]<\skv@tempb>[\skv@tempc]% + \skvprocessoptions#1#2[\skv@pref]<\skv@fams>[\skv@igkeys]% }% - \skv@inoptfalse } % ++++++++ Keys for the handler <.mega process options> +++++++++ % \directkeys*{% - .prefix=SKV, - .family=megapox, + .path={SKV/megapox}, .holder prefix=dirkeys@pox@, .initialize keys after define=true, .new keys={ @@ -692,124 +774,121 @@ \def\dirkeys@pox@igkeys{#1} \skvstripouterbraces{2}\dirkeys@pox@igkeys , - .ord/.options prefix/\skv@defaultpref/ - \skvxifinTF{,}{\detokenize{#1}}{ - \skv@err{Only one prefix is allowed in processing options}\@ehd - }{ - \def\dirkeys@pox@pref{#1} + .ord/{.prefix,.options prefix}/\skvdefaultprefix/ + \skv@ifoneprefix{#1}{% + \edef\dirkeys@pox@pref{#1} \skvstripouterbraces{2}\dirkeys@pox@pref + }{% + \skv@err{Only one prefix is allowed in + \MessageBreak processing options}\skv@ehd } , - .ord/.options families/\@currname.\@currext/ + .ord/{.family,.families,.options families,.options family}/ + \@currname.\@currext/ \edef\dirkeys@pox@fams{#1} \skvstripouterbraces{2}\dirkeys@pox@fams + \skv@makepaths\dirkeys@pox@pref\dirkeys@pox@fams + \dirkeys@megapox@pathlist\skv@pathdo , - .ord/.copy class options/true/ - \edef\dirkeys@pox@copyclass{\skvifstrcmpTF{#1}{true}{00}{01}} + .ord/{path,.paths,.option path,.option paths}/ + {KV/\@currname.\@currext}/ + \skv@formatpaths{#1}\dirkeys@megapox@pathlist + , + .ord/{.copy class options,.include class options}/true/ + \edef\dirkeys@pox@copyclass{0\skvifstrcmpTF{#1}{true}{0}{1}} , - }, - .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} +\skvnewnumbers[skv@]{megapoxdepth} \skvrobustdef*\dirkeys@megaprocessoptions#1{% - \skvpushfunctions\dirkeys@megaprocessoptions{% - \do\dirkeys@pox@pref\do\dirkeys@pox@fams + \skvpushfunctions\dirkeys@megapox{% + \do\dirkeys@pathlist\do\skv@pathdo\do\dirkeys@megapox@pathlist \do\dirkeys@pox@igkeys\do\dirkeys@pox@copyclass - }\skv@gendepth - \skv@inopttrue + }\skv@megapoxdepth + \skvemptify{\dirkeys@megapox@pathlist,\dirkeys@pox@igkeys}% + \let\dirkeys@pox@pref\skvdefaultprefix + \def\dirkeys@pox@copyclass{01}% \skvsetkeys[SKV]{megapox}{#1}% + \ifx\dirkeys@pox@igkeys\@empty + % So that all '...@ignoredkeys' will be undefined: + \let\dirkeys@pox@igkeys\undefined + \fi + \let\dirkeys@pathlist\dirkeys@megapox@pathlist + \def\skv@pathdo##1##2{% + \skvcslet{##1/##2/.@ignoredkeys}\dirkeys@pox@igkeys + }% + \dirkeys@pathlist \skvexpanded{% - \skvprocessoptions\if\dirkeys@pox@copyclass*\fi+% - [\dirkeys@pox@pref]<\dirkeys@pox@fams>[\dirkeys@pox@igkeys]% + \dirkeys@processoptions\if\dirkeys@pox@copyclass*\fi{+}% }% - \skv@inoptfalse - \skvpopfunctions\dirkeys@megaprocessoptions\skv@gendepth + \skvpopfunctions\dirkeys@megapox\skv@megapoxdepth } -% +++++++++++++ Handlers for processing options ++++++++++++++ % +% +++++++++++++ Handlers for executing and processing options ++++++++++++ % \directkeys*{% .new handlers={ - .action for unknown options=\dirkeys@declareoptions@a{#1}, - .declare options={ - \skv@handlerswafalse\dirkeys@declareoptions@b{#1} + {.action for unknown options,.action for unknown options}={ + \let\@fileswith@pti@ns\@badrequireerror + \skv@dox{#1} }, - .new options={ - \skv@handlerswatrue\dirkeys@declareoptions@b{#1} + {.declare option,.declare options,.define option,.define options}={ + \dirkeys@declareoptions{}{#1} }, - .execute options={ - \dirkeys@executeoptions{#1} + {.new option,.new options}={ + \dirkeys@declareoptions{*}{#1} }, - .execute options+={ - \dirkeys@executeoptions@b{#1} + {.execute options,.executeoptions,.execute options in one family}={ + \dirkeys@executeoptions{}{#1} }, - .execute options*={ + {.execute options*,.executeoptions*}={ \skv@err - {Handler <.execute options*> is undefined} - {Handler <.execute options> has no star (*) variant, + {Handler '.execute options*' is undefined} + {Handler '.execute options' has no star (*) variant, \MessageBreak since we don't want to ignore unknown \MessageBreak options from within package or class file.}% }, - .execute options*+={ - \skv@err - {Handler <.execute options*+> is undefined} - {Handler <.execute options+> has no star (*) variant, - \MessageBreak since we don't want to ignore unknown - \MessageBreak options from within package or class file.}% + {.execute options+,.executeoptions+,.execute options in all families}={ + \dirkeys@executeoptions{+}{#1} }, % 1. All <.process options> handlers will filter out ignored 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\dirkeys@processoptions + {.process options,.processoptions,.process options in one family}={ + \dirkeys@processoptions{}{} }, - .process options*={ - \skv@handlerswatrue\dirkeys@processoptions + {.process options*,.processoptions*, + .copy class options and process options, + .copy class options and process options in one family}={ + \dirkeys@processoptions{*}{} }, - .process options+={ - \skv@handlerswafalse\dirkeys@processoptions@b + {.process options+,.processoptions+,.process options in all families}={ + \dirkeys@processoptions{}{+} }, - .process options*+={ - \skv@handlerswatrue\dirkeys@processoptions@b + {.process options*+,.processoptions*+, + .copy class options and process options in all families}={ + \dirkeys@processoptions{*}{+} }, % 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 + % 1. Search all families in its key <paths>. + % 2. Not filter ignored paths and keys; in fact, it 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={ + {.mega process options,.megaprocessoptions}={ \dirkeys@megaprocessoptions{#1} }, - .mega process options*={ + {.mega process options*,.megaprocessoptions*}={ \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, + {.action for unknown option,.every unknown option}= + .action for unknown options, }, } %\skvshowcs{dirkeys@handler@.every unknown option} @@ -819,69 +898,59 @@ % till after the options section: \skvrobustdef*\skvafterprocessoptions{% \expandafter\skvgappendtomacro - \csname skv@\@currname @\@currext @afterprocess@hook\endcsname + \csname skv@\@currname.\@currext @afterprocess@hook\endcsname } -\skvnewlet\skvifpackageloaded\@ifpackageloaded +\skvnewlet\skvifpackageloadedTF\@ifpackageloaded -\def\skv@visiteduseoptions{01} -\skvrobustdef*\skv@useoption#1{% - \if\skv@visiteduseoptions\else - \skvcsvnormalize\@unusedoptionlist - \def\skv@visiteduseoptions{00}% - \fi - \begingroup - \@onelevel@sanitize\@unusedoptionlist - \skv@kvosplit{\detokenize{#1}}{% - \edef\CurrentOption{\skvtrimspace{##1}}% +\skvnewdef*\skv@visiteduseoptions{01} +\skvrobustdef*\skv@removeoption#1{% + \ifx\@unusedoptionlist\@empty\else + \if\skv@visiteduseoptions\else + \skvcsvnormalize\@unusedoptionlist + \def\skv@visiteduseoptions{00}% + \fi + \begingroup + \skv@g@tkeyname#1=\skv@getname@nil\skv@tempb + \@onelevel@sanitize\skv@tempb \def\skv@tempa{}% \skvcommaloop*\@unusedoptionlist\skv@prova{% - \skv@kvosplit\skv@prova{% - \edef\reserved@a{\skvtrimspace{####1}}% - \ifx\reserved@a\CurrentOption\else - \edef\skv@tempa{% - \skv@tempa\ifx\skv@tempa\@empty\else,\fi\skv@prova - }% - \fi - }% + \expandafter\skv@g@tkeyname\skv@prova=\skv@getname@nil\skv@provb + \@onelevel@sanitize\skv@provb + \ifx\skv@provb\skv@tempb\else + \edef\skv@tempa{\skvaddlist,\skv@tempa\skvexpandonce\skv@prova}% + \fi }% \let\@unusedoptionlist\skv@tempa - }% - \skvaftergroupdef\@unusedoptionlist\endgroup + \skvaftergroupdef\@unusedoptionlist\endgroup + \fi } \skvonlypreamble{% - \skvdeclareoption,\skvexecuteoptions,\skvprocessoptions,\skv@useoption, - \dirkeys@declareoptions@a,\dirkeys@declareoptions@b, - \dirkeys@megaprocessoptions,\dirkeys@processoptions, - \dirkeys@processoptions@b,\skvprocessoptionswithclassoptions, - \skvprocessoptionswithoutclassoptions,\dirkeys@executeoptions, - \dirkeys@executeoptions@b + \skvdeclareoption,\skvexecuteoptions,\skvprocessoptions,\skv@removeoption, + \skveveryunknownoption,\dirkeys@declareoptions, + \dirkeys@megaprocessoptions,\dirkeys@processoptions,\dirkeys@executeoptions, + \skvprocessoptionswithclassoptions,\skvprocessoptionswithoutclassoptions } %+++++++++++++++++ This package's options section ++++++++++++++++++% \skvrobustdef*\setupskeyval{\skvsetkeys[SKV]{skeyval}} \skv@inoptionsectrue - -%\skvshowcs{dirkeys@handler@.every unknown option} - \directkeys*{% .every unknown option={ \@onelevel@sanitize\CurrentOption \PackageWarning{skeyval}{Unknown option '\CurrentOption' ignored}% }, - .prefix=SKV, - .family=skeyval, + .path=SKV/skeyval, .holder prefix=skv@, .new options={ - .bool/verbose/true, - .bool/tracingkeys/true, + .bool/{verbose,tracingkeys}/true, .ord/{keyparser,key parser}/{,}/ \def\skv@keyparser{#1}% \skvstripouterbraces{2}\skv@keyparser, .bool/compatibility/true/ \ifskv@compatibility \skvafterprocessoptions{% - \skvifpackageloaded{skeyval-bc}{}{% + \skvifpackageloadedTF{skeyval-bc}{}{% \RequirePackage{skeyval-bc}% } }% @@ -898,9 +967,17 @@ .copy class options, }, } -%\skvshowcs{SKV/skeyval/keyparser.@cbk} - \skv@inoptionsecfalse \skv@restorecodes \endinput + + + + + + +\edef\skv@prova{\@currname.\@currext/\skvcurrentkey}% + \skvxifinTF{,\skv@prova,}{,\skvpackagelist,}{}{% + \edef\skvpackagelist{\skvaddlist,\skvpackagelist\skv@prova}% + }% |