summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/skeyval/skeyval.sty
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2012-11-06 22:35:59 +0000
committerKarl Berry <karl@freefriends.org>2012-11-06 22:35:59 +0000
commit6cab410e49d491c2884a037e0a134eeb2c2acda9 (patch)
tree5b7b72852382a70ac7f27f43b913d1da8f66ed12 /Master/texmf-dist/tex/latex/skeyval/skeyval.sty
parent705b4d8f092a56d9ae900940d265fb6f55b3033d (diff)
skeyval (6nov12)
git-svn-id: svn://tug.org/texlive/trunk@28197 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.sty500
1 files changed, 301 insertions, 199 deletions
diff --git a/Master/texmf-dist/tex/latex/skeyval/skeyval.sty b/Master/texmf-dist/tex/latex/skeyval/skeyval.sty
index 38871851cd1..fce36938787 100644
--- a/Master/texmf-dist/tex/latex/skeyval/skeyval.sty
+++ b/Master/texmf-dist/tex/latex/skeyval/skeyval.sty
@@ -1,5 +1,5 @@
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
-% This is file 'skeyval.sty', version 1.1, 2012/10/15. %
+% This is file 'skeyval.sty', version 1.1a, 2012/10/16. %
% %
% This package and accompanying files may be distributed and/or %
% modified under the conditions of the LaTeX Project Public License, %
@@ -39,9 +39,15 @@
\expandafter\do
\fi
}%
- \edef\skv@restorecodes{\do035,064,123,125,061,059,\do,}%
+ \edef\skv@restorecodes{\do35,64,123,125,61,59,13,\do,}%
}
\skv@prova
+
+\edef\skv@restorecodes{%
+ \unexpanded\expandafter{\skv@restorecodes}%
+ \endlinechar\the\endlinechar\relax
+}
+\endlinechar13 %
\catcode035 06 % #
\catcode064 11 % @
\catcode123 01 % {
@@ -51,7 +57,7 @@
\def\do#1=#2,{%
\ifx\do#1\else
\edef\skv@restorecodes{%
- \skv@restorecodes
+ \unexpanded\expandafter{\skv@restorecodes}%
\catcode#1=\the\catcode#1\relax
}%
\catcode#1=#2\relax
@@ -61,25 +67,25 @@
\do 032=10,033=12,036=03,038=04,040=12,041=12,042=12,043=12,%
059=12,045=12,047=12,058=12,063=12,091=12,093=12,126=13,\do=,%
-\ProvidesPackage{skeyval}[2012/10/15 v1.1 Robust key-value parser (AM)]
+\ProvidesPackage{skeyval}[2012/10/16 v1.1a Robust key-value parser (AM)]
\NeedsTeXFormat{LaTeX2e}[2011/06/27]
\input skeyval-core
\skvrobustdef*\skvAfterEndPackage{%
- \skvifcsdef{\@currname.\@currext-skv@endpkghook}{}{%
+ \skvifcsdefTF{\@currname.\@currext-skv@endpkghook}{}{%
\@namedef{\@currname.\@currext-skv@endpkghook}{}%
}%
\expandafter\g@addto@macro
\csname\@currname.\@currext-skv@endpkghook\endcsname
}
\skvrobustdef*\skvAfterPackage#1{%
- \skvAfterBeginDocument{%
- \skvifcsdef{ver@#1.\@pkgextension}{}{%
+ \skvafterbegindocument{%
+ \skvifcsdefTF{ver@#1.\@pkgextension}{}{%
\skv@warn{Package '#1' was never loaded}%
}%
}
- \skvifcsdef{ver@#1.\@pkgextension}{%
+ \skvifcsdefTF{ver@#1.\@pkgextension}{%
\@firstofone
}{%
\skvappendtomacro{#1.\@pkgextension-skv@endpkghook}%
@@ -103,7 +109,7 @@
\skvcommaparse*\@filelist\skv@tempa{%
\filename@parse\skv@tempa
\ifx\filename@ext\@clsextension
- \skvifcsundef{opt@\filename@area\filename@base.\filename@ext}{}{%
+ \skvifcsdefFT{opt@\filename@area\filename@base.\filename@ext}{}{%
\edef\skv@documentclass{%
\filename@area\filename@base.\filename@ext
}%
@@ -127,7 +133,7 @@
\let\skv@classoptionslist\@classoptionslist
\let\@classoptionslist\@empty
\skvcommaloop*\skv@origclassoptlist\skv@tempa{%
- \skvxifin{=}{\skvexpandonce\skv@tempa}{}{%
+ \skvxifinTF{=}{\skvexpandonce\skv@tempa}{}{%
\skvaddtolist*\@classoptionslist\skv@tempa
}%
}%
@@ -137,7 +143,7 @@
% The following packages need access to the original
% \@classoptionslist.
\skvcommaloop{xkeyval,kvoptions,keyval2e,ltxkeys}\skv@prova{%
- \skvxifin{,\skv@prova,}{,\skv@tempa,}{%
+ \skvxifinTF{,\skv@prova,}{,\skv@tempa,}{%
\let\@classoptionslist\skv@origclassoptlist
\skvbreakloop
}{}%
@@ -147,7 +153,7 @@
}%
\fi
}
-\skvifundef\skv@documentclass{%
+\skvifdefFT\skv@documentclass{%
\let\skv@documentclass\@empty
\let\skv@classoptionslist\@empty
\edef\@popfilename{%
@@ -156,27 +162,26 @@
}{%
\skv@filterclassoptions
}
-
-\skvrobustdef*\skvBeforeBeginDocument{%
+\skvrobustdef*\skvbeforebegindocument{%
\skvgappendtomacro\skv@beforebegindoc
}
\skvnewdef*\skv@beforebegindoc{}
\skvprependtomacro\document{%
\endgroup
- \let\skvBeforeBeginDocument\@firstofone
+ \let\skvbeforebegindocument\@firstofone
\skv@beforebegindoc
- \gdef\skvBeforeBeginDocument{\skv@notprerr\skvBeforeBeginDocument}%
+ \gdef\skvbeforebegindocument{\skv@notprerr\skvbeforebegindocument}%
\global\let\skv@beforebegindoc\relax
\begingroup
}
-\skvrobustdef*\skvAfterBeginDocument{%
+\skvrobustdef*\skvafterbegindocument{%
\skvgappendtomacro\skv@afterbegindoc
}
\skvnewdef*\skv@afterbegindoc{}
\skvgappendtomacro\document{%
- \let\skvAfterBeginDocument\@firstofone
+ \let\skvafterbegindocument\@firstofone
\skv@afterbegindoc
- \gdef\skvAfterBeginDocument{\skv@notprerr\skvAfterBeginDocument}%
+ \gdef\skvafterbegindocument{\skv@notprerr\skvafterbegindocument}%
\global\let\skv@afterbegindoc\relax
\ignorespaces
}
@@ -185,8 +190,8 @@
in preamble}\@ehd
}
\skvnewdef*\skv@everypagehook{}
-\skvrobustdef*\skvAtBeginEveryPage{\skvgappendtomacro\skv@everypagehook}
-\skvAfterBeginDocument{%
+\skvrobustdef*\skvatbegineverypage{\skvgappendtomacro\skv@everypagehook}
+\skvafterbegindocument{%
\let\skv@savedoutputpage\@outputpage
\def\@outputpage{%
\let\skv@savedbegindvi\@begindvi
@@ -201,23 +206,25 @@
\skvnewdef*\skv@preamblecmdhook{}
\skvrobustdef*\skvonlypreamble#1{%
- \skvcommaparse{#1}\skv@tempa{%
- \skvxifin{\detokenize\expandafter{\expandafter\do\skv@tempa}}%
- {\skvoxdetok\skv@preamblecmdhook}{%
- \skv@warn{Command '\skvexpandonce\skv@tempa' multiply
+ \def\do##1{%
+ \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\expandafter{\expandafter\do\skv@tempa}%
+ \unexpanded{\do##1}%
}%
}%
}%
+ \skvcommaparse{#1}\skv@prova{%
+ \expandafter\do\expandafter{\skv@prova}%
+ }%
}
\AtEndOfPackage{%
- \skvAfterBeginDocument{%
+ \skvafterbegindocument{%
\def\do#1{%
- \skvifdef#1{%
+ \skvifdefTF#1{%
\gdef#1{\@latexerr{'\string#1' is a preamble command}\@ehd}%
}{%
\@@warning{Undefined command '\unexpanded{#1}'
@@ -235,7 +242,7 @@
% \skvunknownoptionhandler[<prefixes>]<<families>>{<handler>}
%
\skvrobustdef*\skvunknownoptionhandler{%
- \skv@testopt\skv@unknownoptionhandler{KV}%
+ \skv@testopt\skv@unknownoptionhandler\skv@defaultpref
}
\skvrobustdef*\skv@unknownoptionhandler[#1]{%
\skvifnextchar<{\skv@unkn@wnoptionhandler{#1}}%
@@ -247,10 +254,10 @@
\skvrobustdef*\skv@testopte#1{\skv@testopta{\skv@t@stopte{#1}}}
-\skvrobustdef*\skv@t@stopte#1{\skv@testopt{\skv@t@st@pte{#1}}{KV}}
+\skvrobustdef*\skv@t@stopte#1{\skv@testopt{\skv@t@st@pte{#1}}\skv@defaultpref}
\skvrobustdef*\skv@t@st@pte#1[#2]{%
% Only one prefix is allowed:
- \skvxifin{,}{\detokenize{#2}}{%
+ \skvxifinTF{,}{\detokenize{#2}}{%
\skv@err{Only one prefix is allowed, but you gave '#2'}\@ehd
}{%
\skv@makeprefix{#2}%
@@ -260,7 +267,7 @@
}
\skvrobustdef*\skv@@t@st@pte#1<#2>{%
\edef\skv@fams{#2}%
- \skvxifin{,}{\detokenize{#2}}{%
+ \skvxifinTF{,}{\detokenize{#2}}{%
\skvcsvnormalize\skv@fams
}{%
\skvdespacecontent\skv@fams
@@ -310,16 +317,90 @@
}%
}%
}
-\skvrobustdef*\skv@dox@a{\skv@testopt\skv@dox@b{KV}}
+\skvrobustdef*\skv@dox@a{\skv@testopt\skv@dox@b\skv@defaultpref}
\skvrobustdef*\skv@dox@b[#1]{%
\skvifnextchar<%
- {\skv@dox@c{#1}}%
- {\skv@dox@c{#1}<\@currname.\@currext>}%
+ {\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>,...}
+%
+% Example:
+%
+% \skvDeclarePassedOptions[KV]{fam}{%
+% hyperref={colorlinks,breaklinks},xcolor=svgnames
+% }
+%
+\skvrobustdef*\skvDeclarePassedOptions{%
+ \skv@testopt\skv@declarepassedoptions\skv@defaultpref
+}
+\skvrobustdef*\skv@declarepassedoptions[#1]#2#3{%
+ \skvparsekeyvals{#3}\skv@tempa{%
+ \skvexpbracenext\skv@kvsplit\skv@tempa{%
+ \skvdeclareoption[#1]<#2>{##1}[##2]{%
+ \skvifcsdefTF{ver@##1.sty}{%
+ \skv@warn{Package '##1' has been loaded and
+ \MessageBreak now you're passing options to it.
+ \MessageBreak Instruction ignored}%
+ }{%
+ \skvPassOptionsToPackage{####1}{##1}%
+ \AtBeginDocument{%
+ \skvifpackageloaded{##1}{}{%
+ \skv@warn{Options were passed to package
+ \MessageBreak '##1' but it was never loaded}%
+ }%
+ }%
+ }%
+ }%
+ }%
+ }%
+}
+% \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}%
+ \skvcsxdef{\@elt}{%
+ \skvifcsdefFT{\@elt}{}{\@nameuse{\@elt},}%
+ \skvtrimspace{#2}%
+ }%
+ \endgroup
+}
+
+% \skvDeclarePassedOptionsLoadPackage
+% [<pref>]{<fam>}{<option>=<default>,...}
+%
+\skvrobustdef*\skvDeclarePassedOptionsLoadPackage{%
+ \skv@testopt\skv@declarepassedoptions@load\skv@defaultpref
+}
+\skvrobustdef*\skv@declarepassedoptions@load[#1]#2#3{%
+ \skvparsekeyvals{#3}\skv@tempa{%
+ \skvexpbracenext\skv@kvsplit\skv@tempa{%
+ \skvdeclareoption[#1]<#2>{##1}[##2]{%
+ \skvifcsdefTF{ver@##1.sty}{%
+ \skv@warn{Package '##1' has been loaded and
+ \MessageBreak now you've asked for it to be
+ \MessageBreak loaded again. Instruction ignored}%
+ }{%
+ \skvafterprocessoptions{%
+ \RequirePackage[####1]{##1}%
+ }%
+ }%
+ }%
+ }%
+ }%
+}
+
+% \skvexecuteoptions[<pref>]<fams>[<na>]{<kvlist>}
% \skvexecuteoptions+[<pref>]<fams>[<na>]{<kvlist>}
+%
% This has no star (*) variant; any star suffix is quietly ignored.
+%
\skvrobustdef*\skvexecuteoptions{%
\skv@testopte{\skv@stfalse\skv@setkeys@a}%
}
@@ -328,73 +409,76 @@
%
% 1. If not using LaTeX, then no processing of options.
% 2. The plus (+) variant of \skvprocessoptions will process the options
-% in all the listed families. But the star form of \skvprocessoptions
-% doesn't seem to make sense here, since - unlike in LaTeX2e - a star
-% suffix here would mean 'save unknown keys'. It is meaningless to seek
-% to save unknown keys when processing options. Any star (*) suffix on
-% \skvprocessoptions is, therefore, quietly ignored.
-% 3. Class options are always processed first, but class options ocurring
-% also local/package options are dropped from the list of options
-% to be processed.
+% in all the listed families. The star (*) form of \skvprocessoptions
+% -- like in LaTeX2e -- will also copy and use class options.
+% 3. Class options are always processed first, but class options that ocurr
+% also as local/package options are dropped from the list of options
+% to be processed. That is, package options always take priority over
+% class options.
+% 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}
\skvrobustdef*\skv@pox[#1]{%
\skv@inpoxtrue
\let\@fileswith@pti@ns\@badrequireerror
+ \edef\skv@userclassorpackage{\@currname.\@currext}%
\begingroup
- \let\skv@classoptsfound\@empty
+ \let\skv@clsoptsfound\@empty
+ \let\skv@clsorpkgopts\@empty
\let\skv@exitpoxkeys\@empty
- \edef\skv@testclass{\@currname.\@currext}%
- \skvifx\skv@testclass\skv@documentclass{%
+ \skvifxTF\skv@userclassorpackage\skv@documentclass{%
\let\@unusedoptionlist\skv@classoptionslist
}{%
- \skv@swafalse
- \ifx\skv@classoptionslist\@empty\else
- \ifskv@st\skv@swatrue\fi
+ \ifcase0\ifx\skv@classoptionslist\@empty\else
+ \ifx\skv@classoptionslist\relax\else\ifskv@st1\fi\fi\fi\relax
+ \skv@swafalse
+ \else
+ \skv@swatrue
\fi
- \skvifnotbool{skv@swa}{}{%
+ \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
- \skvexpanded{%
- % Test if key is defined in one of the families. The search will
- % stop as soon as the key is found in any of the families.
- \skvifkeyundef[\skvcurrentprefix]{\skv@fams}{\skvcurrentkey}%
- }{}{%
- \edef\skv@classoptsfound{%
- \skvexpandonce\skv@classoptsfound
- \ifx\skv@classoptsfound\@empty\else,\fi
+ % 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
}%
\expandafter\skv@useoption\expandafter{\CurrentOption}%
}%
}%
- \ifx\skv@classoptsfound\@empty\else\skvafterfi
- \skvexpbracenext\skv@getkeynames\skv@classoptsfound\skv@tempd
+ \ifx\skv@clsoptsfound\@empty\else\skvafterfi
+ \skvexpbracenext\skv@getkeynames\skv@clsoptsfound\skv@tempd
\skvexpbracenext\skv@getpoxkeys\skv@tempd
\fi
}%
}%
- \skvletcs\skv@pkgorclsopts{opt@\@currname.\@currext}%
- \skvifx\skv@pkgorclsopts\@empty{}{%
- \skvifx\skv@pkgorclsopts\relax{}{%
- \skvexpbracenext\skv@getkeynames\skv@pkgorclsopts\skv@tempd
+ \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@classoptsfound that are also present
- % as package options \skv@pkgorclsopts:
- \ifcase0\ifx\skv@classoptsfound\@empty0\else
- \ifx\skv@pkgorclsopts\@empty0\else
- \ifx\skv@pkgorclsopts\relax0\else1\fi\fi\fi\relax
+ % 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
- \skvifx\skv@testclass\skv@documentclass{}{%
- \skvcommaloop*\skv@classoptsfound\CurrentOption{%
+ \skvifxTF\skv@userclassorpackage\skv@documentclass{}{%
+ \skvcommaloop*\skv@clsoptsfound\CurrentOption{%
\expandafter\expandafter\expandafter
\skv@g@tkeyname\CurrentOption=\skv@nil\skv@tempa
- \skvxifin{,\skvoxdetok\skv@tempa,}{,\skvoxdetok\skv@tempd,}{}{%
- \edef\skv@pkgorclsopts{%
- \skvexpandonce\skv@pkgorclsopts,\skvexpandonce\CurrentOption
+ \skvxifinTF{,\skvoxdetok\skv@tempa,}{,\skvoxdetok\skv@tempd,}{}{%
+ \edef\skv@clsorpkgopts{%
+ \skvexpandonce\skv@clsorpkgopts,\skvexpandonce\CurrentOption
}%
}%
}%
@@ -402,9 +486,10 @@
\fi
\skvexpanded{\endgroup
\skv@exitpoxkeys
- % There may be preset keys even when \skv@pkgorclsopts is empty:
+ \skvcmdexit\@unusedoptionlist
+ % There may be preset keys even when \skv@clsorpkgopts is empty:
\skvsetkeys\ifskv@pl+\fi[\skvcurrentprefix]{\skv@fams}[#1]%
- {\skvexpandonce\skv@pkgorclsopts}%
+ {\skvexpandonce\skv@clsorpkgopts}%
}%
\skvcslet{skv@dox@\@currname @\@currext}\relax
\skvinitializermkeys*\skvcurrentprefix\skv@fams
@@ -415,55 +500,50 @@
\skvcslet{skv@\@currname @\@currext @afterprocess@hook}\relax
}
-% \skvrestrictedprocessoptions*+[<pref>]{<fams>}[<na>]
-% 1. This will not process class options, but only options
-% issued to the package.
-\skvrobustdef*\skvrestrictedprocessoptions{\skv@testopte\skv@restrictedpox}
-\skvrobustdef*\skv@restrictedpox[#1]{%
- \skv@inpoxtrue
- \let\@fileswith@pti@ns\@badrequireerror
- \begingroup
- \let\skv@exitpoxkeys\@empty
- \let\skv@pkgorclsopts\@empty
- \skvletcs\skv@pkgorclsopts{opt@\@currname.\@currext}%
- \ifcase0\ifx\skv@pkgorclsopts\@empty0\else
- \ifx\skv@pkgorclsopts\relax0\else1\fi\fi\relax
- \else\skvafterfi
- \skvexpbracenext\skv@getkeynames\skv@pkgorclsopts\skv@tempd
- \skvexpbracenext\skv@getpoxkeys\skv@tempd
- \fi
- \skvexpanded{\endgroup
- \skv@exitpoxkeys
- \skvsetkeys\ifskv@pl+\fi[\skvcurrentprefix]{\skv@fams}[#1]%
- {\skvexpandonce\skv@pkgorclsopts}%
- }%
- \skvcslet{skv@dox@\@currname @\@currext}\relax
- \skvinitializermkeys*\skvcurrentprefix\skv@fams
- \skv@inpoxfalse
- \let\@fileswith@pti@ns\@@fileswith@pti@ns
- \AtEndOfPackage{\let\@unprocessedoptions\relax}%
- \csname skv@\@currname @\@currext @afterprocess@hook\endcsname
- \skvcslet{skv@\@currname @\@currext @afterprocess@hook}\relax
+% \skvprocessoptionswithclassoptions*+[<pref>]{<fams>}[<na>]
+%
+% 1. The star (*) suffix is always assumed present, even when the
+% user hasn't put it.
+%
+\skvrobustdef*\skvprocessoptionswithclassoptions{%
+ \skv@testopte\skv@pox@copyclassoptions
+}
+\skvrobustdef*\skv@pox@copyclassoptions[#1]{\skv@sttrue\skv@pox[#1]}
+
+% \skvprocessoptionswithoutclassoptions*+[<pref>]{<fams>}[<na>]
+%
+% 1. The star (*) suffix is always assumed absent, even when the
+% user has put it.
+%
+\skvrobustdef*\skvprocessoptionswithoutclassoptions{%
+ \skv@testopte\skv@pox@nocopyclassoptions
}
+\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:
+% class options.
\skvrobustdef*\skv@getpoxkeys#1{%
- \skvcommaloop{#1}\skvcurrentkey{%
+ \begingroup
+ \def\xiftest{%
\skvexpanded{%
- \skvifkeynotinfamilies
+ \noexpand\skvifkeyinfamiliesFT
[\skvcurrentprefix]{\skv@fams}{\skvcurrentkey}%
- }{}{%
+ }%
+ }%
+ \skvcommaloop{#1}\skvcurrentkey{%
+ \xiftest{}{%
% \skv@header is formed in the search for the key:
\skvletcs\skv@prova{\skv@header.@poxkeys}%
- \skvifdef\skv@prova{%
- \skvxifin{,\skvoxdetok\skvcurrentkey,}{,\skvoxdetok\skv@prova,}{}{%
+ \skvifdefTF\skv@prova{%
+ \skvxifinTF{,\skvoxdetok\skvcurrentkey,}{,\skvoxdetok\skv@prova,}{}{%
\skvcsedef{\skv@header.@poxkeys}{\skv@prova,\skvcurrentkey}%
}%
}{%
\skvcsedef{\skv@header.@poxkeys}{\skvcurrentkey}%
}%
- \skvxifin{\skvoxdetok\skv@header}{\skvoxdetok\skv@exitpoxkeys}{}{%
+ \skvxifinTF{\skvoxdetok\skv@header}{\skvoxdetok\skv@exitpoxkeys}{}{%
\edef\skv@exitpoxkeys{%
\skvexpandonce\skv@exitpoxkeys
\noexpand\skvcsexit{\skv@header.@poxkeys}%
@@ -471,6 +551,10 @@
}%
}%
}%
+ \skvexpanded{\endgroup
+ \skvcmdexit\skv@exitpoxkeys
+ \skv@exitpoxkeys
+ }%
}
% +++++++++ Utilities for handling options via \directkeys +++++++++%
@@ -496,104 +580,108 @@
\expandafter\endgroup\skv@tempa
\skv@inoptfalse
}
+% % \dirkeys@executeoptions{<options>}
+%
+% 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).
+%
\skvrobustdef*\dirkeys@executeoptions#1{%
\skv@inopttrue
\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\ifskv@handlerswa+\fi
- [##1]{##2}[\skvcsuse{##1/##2/.@ignoredkeys}]%
- {\skvexpandonce\skv@tempb}%
+ \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
- \def\skv@tempa{}\def\skv@tempb{}\def\skv@tempc{}%
+ \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{%
- \skvxifin{,##1,}{,\skv@tempa,}{}{%
+ \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}%
}%
- \skvxifin{,##2,}{,\skv@tempb,}{}{%
+ \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
- \skvcsuse{##1/##2/.@ignoredkeys}%
+ \skv@tempc\ifx\skv@tempc\@empty\else,\fi\skv@igkeys
}%
}%
\dirkeys@getcurrentroots\do
- \@tempcnta\skvz@
- \let\skv@tempd\skv@tempa
- \skvcommaloop*\skv@tempa\skv@prova{%
- \advance\@tempcnta\@ne
- \ifnum\@tempcnta>\@ne
- \skv@err{You can't submit more than one prefix here}\@ehd
- \skvbreakloop
- \fi
- }%
- \skvexpanded{\endgroup
- \skvsetkeys\ifskv@handlerswa+\fi[\skv@tempd]{\skv@tempb}[\skv@tempc]%
- }{#1}%
- \skv@inoptfalse
+ \skvifelementcount*\skv@tempa\tw@
+ {\skv@err{You can't submit more than one prefix here}\@ehd}{}
}
\skvrobustdef*\dirkeys@processoptions{%
\skv@inopttrue
\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\ifskv@handlerswb+\fi
- [##1]<##2>[\skvcsuse{##1/##2/.@ignoredkeys}]%
+ \skvprocessoptions\ifskv@handlerswa*\fi
+ [##1]<##2>[\skv@igkeys]%
}%
}%
\dirkeys@getcurrentroots\do
\expandafter\endgroup\skv@tempa
\skv@inoptfalse
}
-
\skvrobustdef*\dirkeys@processoptions@b{%
\skv@inopttrue
\begingroup
- \def\skv@tempa{}\def\skv@tempb{}\def\skv@tempc{}%
- \def\do##1##2{%
- \skvxifin{,##1,}{,\skv@tempa,}{}{%
- \edef\skv@tempa{\skv@tempa\ifx\skv@tempa\@empty\else,\fi##1}%
- }%
- \skvxifin{,##2,}{,\skv@tempb,}{}{%
- \edef\skv@tempb{\skv@tempb\ifx\skv@tempb\@empty\else,\fi##2}%
- }%
- \edef\skv@tempc{%
- \skv@tempc\ifx\skv@tempc\@empty\else,\fi
- \skvcsuse{##1/##2/.@ignoredkeys}%
- }%
- }%
- \dirkeys@getcurrentroots\do
- \@tempcnta\skvz@
- \let\skv@tempd\skv@tempa
- \skvcommaloop*\skv@tempa\skv@prova{%
- \advance\@tempcnta\@ne
- \ifnum\@tempcnta>\@ne
- \skv@err{You can't submit more than one prefix here}\@ehd
- \skvbreakloop
- \fi
- }%
+ \dirkeys@collectpaths
\skvexpanded{\endgroup
- \skvprocessoptions\ifskv@handlerswa+\fi
- [\skv@tempd]<\skv@tempb>[\skv@tempc]%
+ \skvprocessoptions\ifskv@handlerswa*\fi
+ +[\skv@tempa]<\skv@tempb>[\skv@tempc]%
}%
\skv@inoptfalse
}
% ++++++++ Keys for the handler <.mega process options> +++++++++ %
+
\directkeys*{%
.prefix=SKV,
.family=megapox,
@@ -604,8 +692,8 @@
\def\dirkeys@pox@igkeys{#1}
\skvstripouterbraces{2}\dirkeys@pox@igkeys
,
- .ord/.options prefix/KV/
- \skvxifin{,}{\detokenize{#1}}{
+ .ord/.options prefix/\skv@defaultpref/
+ \skvxifinTF{,}{\detokenize{#1}}{
\skv@err{Only one prefix is allowed in processing options}\@ehd
}{
\def\dirkeys@pox@pref{#1}
@@ -617,7 +705,7 @@
\skvstripouterbraces{2}\dirkeys@pox@fams
,
.ord/.copy class options/true/
- \edef\dirkeys@pox@copyclass{\skvifstrcmp{#1}{true}{00}{01}}
+ \edef\dirkeys@pox@copyclass{\skvifstrcmpTF{#1}{true}{00}{01}}
,
},
.styles={
@@ -657,32 +745,43 @@
.new options={
\skv@handlerswatrue\dirkeys@declareoptions@b{#1}
},
- % Handler <.execute options> has no star variant, since we don't
- % want to ignore unknown options from within package or class.
.execute options={
- \skv@handlerswafalse\dirkeys@executeoptions{#1}
+ \dirkeys@executeoptions{#1}
},
.execute options+={
- \skv@handlerswatrue\dirkeys@executeoptions@b{#1}
+ \dirkeys@executeoptions@b{#1}
+ },
+ .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*+={
+ \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.}%
},
- % 1. All <.process options> handlers will filter out ignored paths
- % and keys.
+ % 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\skv@handlerswbfalse\dirkeys@processoptions
+ \skv@handlerswafalse\dirkeys@processoptions
},
.process options*={
- \skv@handlerswatrue\skv@handlerswbfalse\dirkeys@processoptions
+ \skv@handlerswatrue\dirkeys@processoptions
},
.process options+={
- \skv@handlerswafalse\skv@handlerswbtrue\dirkeys@processoptions@b
+ \skv@handlerswafalse\dirkeys@processoptions@b
},
.process options*+={
- \skv@handlerswatrue\skv@handlerswbtrue\dirkeys@processoptions@b
+ \skv@handlerswatrue\dirkeys@processoptions@b
},
% The handler <.mega process options> will:
% 1. Search all families in its key <families>.
@@ -703,7 +802,8 @@
.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*,
+ .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=
@@ -721,40 +821,40 @@
\expandafter\skvgappendtomacro
\csname skv@\@currname @\@currext @afterprocess@hook\endcsname
}
-\skvnewlet\skvAfterProcessOptions\skvafterprocessoptions
\skvnewlet\skvifpackageloaded\@ifpackageloaded
\def\skv@visiteduseoptions{01}
-
\skvrobustdef*\skv@useoption#1{%
- \if\skv@visiteduseoptions\else\skvafterfi
+ \if\skv@visiteduseoptions\else
\skvcsvnormalize\@unusedoptionlist
\def\skv@visiteduseoptions{00}%
\fi
\begingroup
- \def\do##1=##2=##3\useoption@nil{%
+ \@onelevel@sanitize\@unusedoptionlist
+ \skv@kvosplit{\detokenize{#1}}{%
\edef\CurrentOption{\skvtrimspace{##1}}%
\def\skv@tempa{}%
- \def\do####1=####2=####3\useoption@nil{%
- \edef\reserved@a{\skvtrimspace{####1}}%
- }%
\skvcommaloop*\@unusedoptionlist\skv@prova{%
- \expandafter\do\skv@prova==\useoption@nil
- \ifx\reserved@a\CurrentOption\else
- \edef\skv@tempa{%
- \skv@tempa\ifx\skv@tempa\@empty\else,\fi\skv@prova
- }%
- \fi
+ \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
+ }%
}%
\let\@unusedoptionlist\skv@tempa
}%
- \@onelevel@sanitize\@unusedoptionlist
- \expandafter\do\detokenize{#1}==\useoption@nil
\skvaftergroupdef\@unusedoptionlist\endgroup
}
-
\skvonlypreamble{%
- \skvdeclareoption,\skvexecuteoptions,\skvprocessoptions,\skv@useoption
+ \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
}
%+++++++++++++++++ This package's options section ++++++++++++++++++%
@@ -763,22 +863,24 @@
\skv@inoptionsectrue
%\skvshowcs{dirkeys@handler@.every unknown option}
+
\directkeys*{%
- .prefix=SKV,
- .family=skeyval,
- .holder prefix=skv@,
.every unknown option={
\@onelevel@sanitize\CurrentOption
- \PackageWarning{skeyval}{Unknown option '\CurrentOption'}%
+ \PackageWarning{skeyval}{Unknown option '\CurrentOption' ignored}%
},
+ .prefix=SKV,
+ .family=skeyval,
+ .holder prefix=skv@,
.new options={
+ .bool/verbose/true,
.bool/tracingkeys/true,
- .ords/{keyparser,key parser}/{,}/
+ .ord/{keyparser,key parser}/{,}/
\def\skv@keyparser{#1}%
\skvstripouterbraces{2}\skv@keyparser,
.bool/compatibility/true/
\ifskv@compatibility
- \skvAfterProcessOptions{%
+ \skvafterprocessoptions{%
\skvifpackageloaded{skeyval-bc}{}{%
\RequirePackage{skeyval-bc}%
}
@@ -787,7 +889,7 @@
,
},
.execute options={
- tracingkeys,keyparser
+ tracingkeys=false,keyparser,verbose=false
},
.mega process options={
.options prefix=SKV,