diff options
author | Karl Berry <karl@freefriends.org> | 2012-11-06 22:35:59 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2012-11-06 22:35:59 +0000 |
commit | 6cab410e49d491c2884a037e0a134eeb2c2acda9 (patch) | |
tree | 5b7b72852382a70ac7f27f43b913d1da8f66ed12 /Master/texmf-dist/tex/latex/skeyval/skeyval.sty | |
parent | 705b4d8f092a56d9ae900940d265fb6f55b3033d (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.sty | 500 |
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, |