summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/skeyval/skeyval.sty
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2013-02-13 00:03:06 +0000
committerKarl Berry <karl@freefriends.org>2013-02-13 00:03:06 +0000
commitfee6ae63b6689ddbae970ff9114c6ed976bf1dab (patch)
tree939a7748a57f664be54e21ea64d2168617f5d07c /Master/texmf-dist/tex/latex/skeyval/skeyval.sty
parent4abc207ecf013eb27bf9f83c29b8a82408c9cd71 (diff)
skeyval (12feb13)
git-svn-id: svn://tug.org/texlive/trunk@29092 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.sty797
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}%
+ }%