summaryrefslogtreecommitdiff
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
parent705b4d8f092a56d9ae900940d265fb6f55b3033d (diff)
skeyval (6nov12)
git-svn-id: svn://tug.org/texlive/trunk@28197 c570f23f-e606-0410-a88d-b1316a301751
-rw-r--r--Master/texmf-dist/doc/latex/skeyval/README200
-rw-r--r--Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke1.pdfbin126230 -> 126238 bytes
-rw-r--r--Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke1.tex131
-rw-r--r--Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke2.pdfbin136310 -> 136342 bytes
-rw-r--r--Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke2.tex8
-rw-r--r--Master/texmf-dist/doc/latex/skeyval/skeyval-testclass.cls38
-rw-r--r--Master/texmf-dist/doc/latex/skeyval/skeyval-testpkg.sty140
-rw-r--r--Master/texmf-dist/doc/latex/skeyval/skeyval-view-pokayoke1.pdfbin83477 -> 107744 bytes
-rw-r--r--Master/texmf-dist/doc/latex/skeyval/skeyval-view-pokayoke1.tex51
-rw-r--r--Master/texmf-dist/tex/latex/skeyval/skeyval-bc.sty18
-rw-r--r--Master/texmf-dist/tex/latex/skeyval/skeyval-core.tex2771
-rw-r--r--Master/texmf-dist/tex/latex/skeyval/skeyval-for.tex687
-rw-r--r--Master/texmf-dist/tex/latex/skeyval/skeyval-ltxcmds.tex69
-rw-r--r--Master/texmf-dist/tex/latex/skeyval/skeyval-ltxpatch.sty48
-rw-r--r--Master/texmf-dist/tex/latex/skeyval/skeyval-pstkey.sty50
-rw-r--r--Master/texmf-dist/tex/latex/skeyval/skeyval-pstkey.tex41
-rw-r--r--Master/texmf-dist/tex/latex/skeyval/skeyval-view.sty74
-rw-r--r--Master/texmf-dist/tex/latex/skeyval/skeyval.sty500
18 files changed, 3099 insertions, 1727 deletions
diff --git a/Master/texmf-dist/doc/latex/skeyval/README b/Master/texmf-dist/doc/latex/skeyval/README
index fe6e31d7d37..5a43e018146 100644
--- a/Master/texmf-dist/doc/latex/skeyval/README
+++ b/Master/texmf-dist/doc/latex/skeyval/README
@@ -6,7 +6,7 @@ Ahmed Musa
VERSION
-Version 1.1, October 2012.
+Version 1.1a, October 16, 2012.
LOCATION ON CTAN
@@ -47,8 +47,8 @@ Plain TeX users can do
\input skeyval-core
-Users of pre-version-1.0 of skeyval package can access former
-versions by entering the option 'compatibility' in <options> above.
+Users of pre-version-1.0 of skeyval package can access the former
+version by entering the option 'compatibility' in <options> above.
This option will automatically load version 0.73 (the version
just before 1.0) of skeyval package. From version 1.0, the package
has changed radically.
@@ -84,11 +84,11 @@ The skeyval package also maintains and, in fact, greatly extends the
functionality and syntaxes of the ltxkeys package. Very few examples
of the functionality of skeyval package are
-1. The callbacks of keys can be readily modified using commands
+** The callbacks of keys can be readily modified using commands
like \skvaddtocallback, \skvprependtocallback, \skvappendtocallback,
or the handlers .prepend code, .append code, .add code.
-2. Apart from the usual keys in xkeyval and ltxkeys packages, it is
+** Apart from the usual keys in xkeyval and ltxkeys packages, it is
now possible to define a rather weird key like
\skvpntkey[KV]{fam}{evaluate (?) as (?) using (?)}{\edef#2{#3}}
@@ -112,12 +112,44 @@ of the functionality of skeyval package are
evaluate (\x) as (\pgfmathresult) using (\pgfmathparse{\x^10})
}
-3. The parameters/arguments of callbacks of keys can be easily changed.
- For example, to change the argument of keya, one way is via
- the magical command \directkeys:
+** Handlers
+
+ The skeyval package has many handlers. The handlers of
+ start with a dot (.), as in pgfkeys package.
+
+ Unlike in pgfkeys package, when 'expand' or 'expanded'
+ is found in a handler, the expansion will invariably be done
+ when the key is set, not when it's being defined.
+
+
+** Subject-observer keys (called 'style keys' in pgfkeys) can be readily
+ introduced.
+
+ \skvappendstyles[KV]{fam}{key1,key2}{keya=.expanded{\vala},keyb=valb}
+ [defaultof 1&2]{\def\y##1{#1*##1}}
+
+ Here the subjects are key1 and key2, while the observers are keya and
+ keyb. For now, the only thing the subject does is to set the given values
+ of the observers on the current path. In the future, we intend to extend
+ the subject-observer functionality to include more features of the
+ observer pattern found in other programming paradigms. We foresee that
+ subjects will be able to publish their services, and observer keys will be
+ able to subscribe for notification from subjects. And rather than 'notify
+ messages' simply setting observer keys with prior prescribed observer
+ values, as is currently the obtainable, observers may be able to do more
+ with such messages (such as change observer state patterns).
+
+** The parameters/arguments of callbacks of keys can be easily changed
+ by calling \skvdefinekeys, \skvmakekeys, \skvassignargs or \directkeys.
+
+ \skvordkeys[KV1]{fam2}{keya,keyb}[default-a]{\def\x##1{#1*##1}}
+ \skvassignargs[KV1,KV2]{fam1,fam2}[x1]{keya,keyb}{#1/#2}
+ \skvsetkeys[KV1]{fam2}{keya=vala/valb}
+
+ 'x1' here means expand argument once at setting keys.
\directkeys{%
- .exec=\def\avalue{a+b},
+ .exec code=\def\avalue{a+b},
.prefixes={KV1,KV2},
.families={fam1,fam2},
.holder prefix=mp@,
@@ -134,12 +166,18 @@ of the functionality of skeyval package are
.set keys={
keya=.expanded{\avalue}
},
- % Nested \directkeys. The current path is put on stack
- % and restored later, so that the nest is independent
- % of its surrounding topology:
+
+** Nested \directkeys. The current path is put on stack
+ and restored later, so that the nest is independent
+ of its surrounding topology (prefix and family). But
+ the default prefix survives outside \directkeys.
+
\directkeys{
- .path=KV3/fam3,
+ .default prefix=KV,
+ % The prefix for 'famx' will be 'KV'.
+ .paths={KV3/fam3,famx},
.new keys={
+ .initialize keys after define=false,
.ord/keya/defa/\def\ya##1{#1*##1*#2},
.arg/keya/#1+#2,
.choice/keyc/center/{right,left,center,justified},
@@ -150,9 +188,9 @@ of the functionality of skeyval package are
},
.try set keys={
.paths={KV1/fam1,KV3/fam3},
- .try=2, .goal=1
- }{
- keyc=left,keyd=false
+ .try=2,
+ .goal=1,
+ .kv list={keyc=left,keyd=false},
},
.ignore path=KV1/fam1,
.exec=\def\cvalue{center},
@@ -160,8 +198,7 @@ of the functionality of skeyval package are
.add prefix=KV3,
.add families={fam3,fam4},
.max attempts=4, .goal=2,
- }{
- keyc=.expand once{\cvalue}
+ .kv list={keyc=.expand once{\cvalue}},
},
.append values={
keya=\def\y##1{#1+##1},
@@ -182,14 +219,24 @@ of the functionality of skeyval package are
},
}
- Unlike in pgfkeys package, when we use 'expand' or 'expanded'
- in a handler, the expansion will invariably be done when the
- key is set, not when it's being defined.
+** Prepending and appending to key names and callbacks at
+ definition time:
+
+ \directkeys*{
+ .path=claudio/color,
+ .hp=claudio@col@,
+ .define keys={
+ .prepend to every key name=X@,
+ .append to every key name=@Y,
+ .prepend to every callback=\def\X##1{#1*##1},
+ .append to every callback=\def\Y##1{##1**#1},
+ .ord/{1,2,3,4,5,6}/red,
+ }
+ }
+ \skvusekeys[.path=claudio/color]{X@1@Y,X@2@Y}
- The handlers of skeyval package start with a dot (.),
- as in pgfkeys package.
-4. Several new features are introduced by the skeyval package. For
+** Several new features are introduced by the skeyval package. For
example, we now have 'style' and 'link' keys in the context of
ltxkeys syntax. For example, to link keys via .link or .style
handler:
@@ -200,23 +247,79 @@ of the functionality of skeyval package are
.append style expand twice={key3, key4}/keyf=\valuea,
.prepend style expanded={key5, key6}/{keyc=#1, keyd=#1},
.prepend style={key7, key8}/{keyd=#1, keye=#1},
+ .allowed values expanded=keye/{
+ center.do=\def\curralign##1{\hfil##1\hfil},
+ right.do=\def\curralign##1{\hfill##1},
+ left.do=\def\curralign##1{##1\hfill},
+ justified.do=\let\curralign\@iden
+ },
+ }
+
+** Bipolar boolean keys
+
+ \skvbiboolkeys[KV]{fam}[mp@]{.forbid value{keya},keyb}[true]{%
+ \ifmp@keya\def\xa##1{##1}\fi
+ }{%
+ \ifmp@keyb\def\xb##1{##1}\fi
+ }%
+ \skvsetkeys[KV]{fam}{keya}
+
+ The value of keya is frozen as 'true'. Hence whenever keya is called,
+ the value 'true' will be used for it. Since keya and keyb are bipolar,
+ the value of keyb will be 'false' whenever keya is called.
+
+ \skvbiboolkeys+[KV]{fam}[mp@]{keya,keyb}[true]{%
+ \ifmp@keya\def\xa##1{##1}\fi
+ }{%
+ \ifmp@keyb\def\xb##1{##1}\fi
+ }{%
+ \skv@warn{Value '#1' is invalid}%
}
+ \skvsetkeys[KV]{fam}{keya=xtrue}
-5. The concepts of 'trying' to set a key with 'goals' is introduced.
+
+** The concepts of 'trying' to set a key with 'goals' is introduced.
The handler '.goal' can be interpreted in the sense of \pagegoal,
- but applied to setting a key.
- See an example above. Then there is 'search also' set keys.
+ but applied to setting a key. See an example above. Then there
+ is 'search also' set keys.
+
+** 'Quick keys' are a new concept. They're quite fast to define and set,
+ but they can't carry pointers.
+
+ \quickkeys.define{<family>}[<holder.prefix>]{<list>}
+ \quickkeys.set{<family>}[<na>]{<kvlist>}
+
+ When defining keys, the syntax of <list> is:
+
+ {<keya-1,...,keya-n>}/{<default>}/{<callback>}/{<nominations>}/{<arg>}
+ ;...;
+ {<keyx-1,...,keyx-n>}/{<default>}/{<callback>}/{<nominations>}/{<arg>}
+
+ Example:
+
+ \quickkeys.define{fam}[mp@]{%
+ keya/true/\def\x##1{#1*##1}/true,false;
+ keyb;
+ keyc,keyd/aaa+bbb/\def\y##1{#1*##1*#2}/.na/#1+#2;
+ }
-6. 'Quick keys' are a new concept. They're quite fast to define and set.
+ '.na' means a missing entry that isn't empty but should be ignored.
-7. Keys can be 'made', as in
+ <nominations> can be used to restrict the user-values of the key
+ or keys.
+
+ <arg> means the argument pattern for the key or keys.
+
+
+** Keys can be 'made', as in
\skvmakekeys[
.prefix=KVA, .families={fam1,fam2}, .holder prefix=mp@,
.all are new, .define in all families, .initialize after define
]{%
- .ords/{keya,keyb}/{default-a},
- .cmds/{keyc,keyd}/,
+ .ord/{keya,keyb}/{default-a},
+ .arg/keyb/{#1+#2},
+ .cmd/{keyc,keyd}/,
.zcmd/key e/\def\cmde##1{##1}/
\edef\y{\detokenize\expandafter{\thp@keye}}\def\x##1{#1*key e*##1},
.choice/keyf/center/{center.do=\def\x##1{#1*##1},left,right},
@@ -228,7 +331,7 @@ of the functionality of skeyval package are
without spaces in their names, while maintaining key names with
spaces.
-8. Keys can be set using \skvsetkeys, \directkeys (with the handlers
+** Keys can be set using \skvsetkeys, \directkeys (with the handlers
.set keys, .try, etc.), or \skvusekeys:
\krdusekeys[
@@ -240,14 +343,41 @@ of the functionality of skeyval package are
keya,keyb
}
-9. Keys defined in families can be viewed in files using the package
+ \directkeys*{
+ .path=user/color,
+ .hp=user-col-,
+ .define keys={
+ .cmd/{1,2,3,4,5,6}/red
+ }
+ }
+ \newcommand*\setcolorlist[1]{\skvusekeys[.path=user/color]{#1}}
+ \setcolorlist{1=red,2=blue,3=cyan,4=green,5=magenta,6=purple}
+ \newcommand*\usecolor[1]{%
+ \skvifcsname user-col-#1\then
+ \csname user-col-#1\endcsname
+ \else
+ black%
+ \fi
+ }
+ \newcommand*\drawcoloredarrows[1]{%
+ \foreacfox {#1}{%
+ \draw[\usecolor{##1},-stealth] (0,-##1)--(2,-##1);
+ }
+ }
+ \begin{document}
+ \begin{tikzpicture}
+ \drawcoloredarrows{1,...,4}
+ \end{tikzpicture}
+ \end{document}
+
+** Keys defined in families can be viewed in files using the package
'skeyval-view'. The functionality of 'skeyval-view' is greater than
that of xkeyval-view package.
-10. Files skeyval-pstkey.sty and skeyval-pstkey.tex are provided for
+** Files skeyval-pstkey.sty and skeyval-pstkey.tex are provided for
PSTricks developers and users, as did xkeyval package.
-11. Some new and versatile looping macros are introduced in the
+** Some new and versatile looping macros are introduced in the
skeyval package. In fact, the powerful \newforeach list
processor of the 'loops' package has its roots in the 'skeyval-for'
module. It is a generalization of PGF's \foreach macro for
diff --git a/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke1.pdf b/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke1.pdf
index 5efe8797009..aad9d8e117d 100644
--- a/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke1.pdf
+++ b/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke1.tex b/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke1.tex
index 2617d621840..2be16f1aa95 100644
--- a/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke1.tex
+++ b/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke1.tex
@@ -1,4 +1,4 @@
-
+\makeatletter
\RequirePackage{skeyval-ltxpatch}
% With 'skeyval-ltxpatch' loaded, class options will not be zapped and
@@ -12,6 +12,8 @@
watermarkcolor=brown!80!yellow
]{skeyval-testclass}
+%\show\@unusedoptionlist
+
\skvifpackageloaded{xcolor}{}{\usepackage[dvipsname]{xcolor}}
\usepackage{lipsum}
@@ -27,8 +29,6 @@
unknown-option,
]{skeyval-testpkg}
-\makeatletter
-
% Keys whose names are zapped internally:
\skvzcmdkeys[KV]{fam}[mp@]{provide value,give value}[true]{}
\skvzboolkeys[KV]{fam}[mp@]{provide value,give value}[true]{}
@@ -39,7 +39,7 @@
\skvpntkey[KV]{fam}{evaluate (?) as (?) using (?)}[\x\y{\numexpr\x*2}]{%
\def\argone{#1}\def\argtwo{#2}\def\argthree{#3}%
% '\detokenize{\pgfmath}' won't work here!
- \skvxifin{\relax\string\pgfmath}{\relax\detokenize{#3}}{%
+ \skvxifinTF{\relax\string\pgfmath}{\relax\detokenize{#3}}{%
#3%
}{%
\edef#2{#3}%
@@ -62,7 +62,7 @@
% comma (,), it should be enclosed in braces.
\directkeys*{
- .exec=\skvsratchcnt\z@,
+ .exec=\skvtestcnt\z@,
.prefix = KV1,
.family = fam1,
.holder prefix = mp@,
@@ -73,8 +73,7 @@
.initialize keys after define=false,
.new keys = {
.ord/keya/{dfta,dftb}/
- \def\cmda##1{#1*##1*#2}
- \logsetting
+ \def\cmda##1{#1*##1*#2}\logsetting
,
.arg/keya/{#1,#2},
.cmd/keyb/{1cm,2cm}/
@@ -84,7 +83,7 @@
.bool/keyd/true,
.cmd/keye/dfte/\def\cmde##1{##1#1},
.cmd/keyf/dftf/\def\cmdf##1{##1#1},
- .ord/.value required{keyg}/dftg,
+ .ord/.need value{keyg}/dftg,
.ord/.forbid value{keyh}/dfth,
},
.args={
@@ -101,7 +100,9 @@
keyd,keye,keyf,keyg
},
.restore keys = keye,
- .choice=keye/{
+ .link={keye2/keye},
+ % Choices for keye can be declared directly:
+ .estate pattern={keye,keye2}/{
center.do=\def\curralign##1{\hfil##1\hfil},
right.do=\def\curralign##1{\hfill##1},
left.do=\def\curralign##1{##1\hfill},
@@ -143,19 +144,17 @@
.add families={fam3,fam4},
.try=14,
.upper goal=12,
- .success list=\mysuccesslist
- }{
- keya={val1,val2},keyb={1cm,2cm}
+ .success list=\mysuccesslist,
+ .kv={keya={val1,val2},keyb={1cm,2cm}}
},
% .exec code={\show\mysuccesslist},
\directkeys*{
- .exec=\skvsratchcnt\z@\def\mysuccesslist{},
+ .exec=\skvtestcnt\z@\def\mysuccesslist{},
.paths={KUA/fam1,KUB/fam2},
.define keys={
- .ords/{keya,keyb,keyc}/.na/
+ .ord/{keya,keyb,keyc}/.na/
\def\y##1{#1*##1}
- \typeout{***}
- \logsetting
+ \typeout{***}\logsetting
,
}
},
@@ -167,9 +166,59 @@
.upper goal=4,
.lower goal=2,
.ignore keys={keyb,keyc},
- .success list=\mysuccesslist
- }{
- keya=vala,keyb=valb,keyc=valc
+ .success list=\mysuccesslist,
+ .kv={keya=vala,keyb=valb,keyc=valc}
+ },
+% .exec code={\show\mysuccesslist},
+}
+
+\dirkeys*{
+ .exec=\skvtestcnt\z@\def\mysuccesslist{},
+ .paths={KUA/fam1,KUB/fam2},
+ .hp=mp@,
+ .ignore keys={keyd},
+ .define keys={
+ .initialize keys after define=true,
+ .save initial values of keys,
+ .exec code/\skvtestcnt\z@,
+ % keya has no default but has a complex callback:
+ .ord/keya/.na/{
+ \skvtestcnt\z@\def\mysuccesslistb{}
+ \dirkeys{
+ .path={KVX/famx},
+ .sa set keys={%
+ .prefixes={KUA,KUB},
+ .families={fam1,fam2},
+ .try=8,
+ .upper goal=4,
+ .lower goal=1,
+ .success list=\mysuccesslistb,
+ .kv={keyb=valb}
+ },
+% .exec code=\show\mysuccesslistb,
+ }
+ }
+ ,
+ % No default:
+ .ord/{keyb,keyc,keyd}/.na/\def\x##1{#1*##1}\logsetting,
+ .exec code=\def\cmda#1{\if0#1\fi},
+ % No callback:
+ .choice/keye/center/{center,left,right},
+ .choice/keye2/center/{
+ center.do=\def\giv@c{#1},
+ left.do=\def\giv@l{#1},
+ right.do=\def\giv@r{#1}
+ }/.na/\@@warning{Invalid value '\detokenize{#1}' for keye2},
+ },
+ .try set keys={%
+ .prefixes={KUA,KUB},
+ .families={fam1,fam2,fam3,fam4},
+ .try=1,
+ .upper goal=1,
+ .lower goal=1,
+ .ignore keys={keyc,keyd},
+ .success list=\mysuccesslist,
+ .kv={keya=vala,keyc=valc,keyd=vald}
},
% .exec code={\show\mysuccesslist},
}
@@ -179,7 +228,7 @@
\begin{document}
\title{The \texttt{\textcolor{blue}{skeyval}} Package\\[1ex]
- Version 1.1\\[1ex]
+ Version 1.1a\\[1ex]
\textsf{Test document 1}}
\author{Ahmed Musa}
\maketitle
@@ -194,7 +243,7 @@ encouraged to create it on a computer file and submit it on magnetic tape.
\par\bigskip
\begin{\mpfalign}
-\skvxifstrcmp\mpfalign{justified}{\noindent}{}
+\skvxifstrcmpTF\mpfalign{justified}{\noindent}{}
\mpftextstyle
The printer should refuse to employ wandering men, foreigners who,
after having committed some grievous error, can easily disappear and
@@ -224,6 +273,7 @@ on their deeds.
\begin{center}
\hrule
\par\bigskip
+
\newshadowbox{test 1}
\newshadowbox[framecolor=magenta,shadecolor=cyan,shadowsize=8pt,
align=left]{test 2}
@@ -313,15 +363,15 @@ on their deeds.
%%+++++++++++++++++++++ Examples of \skvmakekeys +++++++++++++++++++%%
\skvmakekeys[
- prefix=KVA,
- families={fam1,fam2},
- hp=thp@,
- all new,
- define in all families,
- initialize=true
+ .prefix=KVA,
+ .families={fam1,fam2},
+ .hp=thp@,
+ .all new,
+ .define in all families,
+ .initialize=true
]{%
- .ords/{keya,keyb}/{default-a},
- .cmds/{keyc,keyd}/,
+ .ord/{keya,keyb}/default-a,
+ .cmd/{keyc,keyd}/.na/\def\y##1{#1**##1},
.choice/keyf/center/{center.do=\def\x##1{#1*##1},left,right},
.zbool/show center/true/\edef\cmd{\ifthp@showcenter Yes\else No\fi},
}
@@ -380,10 +430,15 @@ on their deeds.
\skvsaveinitialvaluekeys[KV]{fam}{keya,keyb,keyc}
%\skvshowcs{KV/fam/.@needini}
\skvmakekeys[
- prefix=KV, family=fam, hp=thp@, all new,initialize,save initial values
+ .prefix=KV,
+ .family=fam,
+ .hp=thp@,
+ .all new,
+ .initialize,
+ .save initial values
]{%
.ord/keya/defa-a/\def\keyay##1{##1*#1*##1},
- .cmds/{keyb,keyc}/defa-b/\def\keyby##1{##1*#1*##1},
+ .cmd/{keyb,keyc}/defa-b/\def\keyby##1{##1*#1*##1},
.cmd/keyd,
}
%\skvshowcs{KV/fam/.@inikv}
@@ -394,9 +449,9 @@ on their deeds.
%++++++++++++++++++ Evaluating boolean expressions +++++++++++++++++++%
-\skvifexpr{%
- not ( expr { \skvifdef\xa } and expr { \skvifempty\xa } )
- or ( expr { \skvifdef\xb } or expr { \skvifx\xa\xb } )
+\skvifexprTF{%
+ not ( expr { \skvifdefTF\xa } and expr { \skvifemptyTF\xa } )
+ or ( expr { \skvifdefTF\xb } or expr { \skvifxTF\xa\xb } )
}{%
\def\x{T}%
}{%
@@ -406,20 +461,20 @@ on their deeds.
%++++++++++++++++++++++++++++ \cicadaloop +++++++++++++++++++++++++++%
\makeatletter
-\@tempcnta\z@
+\skvtestcnt\z@
\def\blist{{X};\fi;{Y};Z}
\def\stack{}
\let\romn\romannumeral
\cicadaloop{{a},\if,{b},c}\if01\fi{%
- \advance\@tempcnta by\@ne
+ \advance\skvtestcnt by\@ne
\@tempcntb\z@\@tempswafalse
\cicadaloop*[;]\blist\if@tempswa\fi{%
\advance\@tempcntb by\@ne
- \typeout{Doing \romn\@tempcnta, \romn\@tempcntb:
+ \typeout{Doing \romn\skvtestcnt, \romn\@tempcntb:
\detokenize{#1, ##1}}%
\edef\stack{%
\unexpanded\expandafter{\stack}\noexpand\do
- {\romn\@tempcnta,\romn\@tempcntb}{\unexpanded{#1;##1}}%
+ {\romn\skvtestcnt,\romn\@tempcntb}{\unexpanded{#1;##1}}%
}%
\ifnum\@tempcntb>\tw@\@tempswatrue\fi
}%
diff --git a/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke2.pdf b/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke2.pdf
index a81a562fef7..7e995aab364 100644
--- a/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke2.pdf
+++ b/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke2.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke2.tex b/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke2.tex
index 84696094258..57195061611 100644
--- a/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke2.tex
+++ b/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke2.tex
@@ -1,11 +1,11 @@
\documentclass[
- insertwatermark,
+ insertwatermark,watermarkcolor=blue!55,
firstpagenumber=2,
maketitlepage,
unknown-key
]{skeyval-testclass}
-\setskeyvaltestclass{%
+\setupskvtestclass{%
watermarktext={skeyval-test2\\[.25ex]Page~\thepage}
}
@@ -22,9 +22,9 @@
\title{%
The \texttt{\textcolor{blue}{skeyval}} Package\\[2ex]
- Version 1.1\\[1ex]
+ Version 1.1a\\[1ex]
\textsf{Test document 2}
- \footnote{Made by \texttt{skeyval-testclass, Version~1.1.}}%
+ \footnote{Made by \texttt{skeyval-testclass, Version~1.1a.}}%
}
\author{Ahmed Musa\footnote{\texttt{amusa22@gmail.com}.}}
diff --git a/Master/texmf-dist/doc/latex/skeyval/skeyval-testclass.cls b/Master/texmf-dist/doc/latex/skeyval/skeyval-testclass.cls
index 02de214caa0..c81c535c0ef 100644
--- a/Master/texmf-dist/doc/latex/skeyval/skeyval-testclass.cls
+++ b/Master/texmf-dist/doc/latex/skeyval/skeyval-testclass.cls
@@ -1,5 +1,5 @@
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
-% This is file 'skeyval-testclass.cls', version 1.1, 2012/10/15. %
+% This is file 'skeyval-testclass.cls', 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, %
@@ -27,14 +27,15 @@
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
\ProvidesClass{skeyval-testclass}
- [2012/10/15 v1.1 skeyval test class (AM)]
+ [2012/10/16 v1.1a skeyval test class (AM)]
\NeedsTeXFormat{LaTeX2e}[2011/06/27]
\@ifpackageloaded{skeyval}{}{\RequirePackage{skeyval}}
\@ifpackageloaded{xcolor}{}{\RequirePackage{xcolor}}
\@ifpackageloaded{pifont}{}{\RequirePackage{pifont}}
\@ifpackageloaded{tikz}{}{\RequirePackage{tikz}}
-\skvAtBeginEveryPage{\skvcl@maybewm}
+\ifdefined\skvtestcnt\else\newcount\skvtestcnt\fi
+\skvatbegineverypage{\skvcl@maybewm}
\let\skvcl@maybewm\relax
\def\skvcl@watermark{%
\tikz[overlay,remember picture]{%
@@ -112,7 +113,7 @@
.cmd/color/red,
.bool/make-textemphasis-inactive/true/
\ifskvindef\else
- \skvifbooltrue xem@make-textemphasis-inactive\then
+ \skvifbool xem@make-textemphasis-inactive\then
\PackageInfo{skeyval-testclass}
{Extended text emphasis has been made inactive}
\let\xem\emph
@@ -134,7 +135,7 @@
.cmd/datefont/\large,
.bool/clearpage/true,
.bool/maketitlepage/true/
- \skvifbooltrue skvcl@maketitlepage\then
+ \skvifbool skvcl@maketitlepage\then
\ifskvindef\else
\PassOptionsToClass{titlepage}{article}
\fi
@@ -156,7 +157,7 @@
,
.cmd/pagenumberstyle/\@nil/
\ifx\skvcl@pagenumberstyle\@nnil\else
- \skvAfterBeginDocument{\pagenumbering{#1}}%
+ \skvafterbegindocument{\pagenumbering{#1}}%
\fi
,
.cmd/pretitleskip/10pt,
@@ -164,7 +165,7 @@
.cmd/authorfont/\large,
.cmd/titlefont/\huge,
.bool/insertwatermark/true/
- \skvifbooltrue skvcl@insertwatermark\then
+ \skvifbool skvcl@insertwatermark\then
\ifskvindef\else
\let\skvcl@maybewm\skvcl@watermark
\fi
@@ -178,7 +179,7 @@
.cmd/fontsize/{14.4,17}/
\def\skvcl@fontsize@a{#1}\def\skvcl@fontsize@b{#2}
,
- .args/fontsize/{#1,#2},
+ .arg/fontsize/{#1,#2},
.cmd/watermarkscale/5,
.cmd/watermarkcolor/gray!55,
},
@@ -187,16 +188,21 @@
first-page-number/firstpagenumber=#1,
titlepage/maketitlepage=#1,
},
- % Options execution & processing:
+ % Options execution and processing:
.families = {textemphasis,title},
+ % Ececute the 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.
.execute options+={
useitalic,usebold,usecolor,color,
make-textemphasis-inactive=false,putdate,datefont,
clearpage=false,pretitleskip,posttitleskip,
authorfont,titlefont,watermarkscale,firstpagenumber,
insertwatermark=false,watermarkxshift,watermarkyshift,
- watermarktext,fontsize
+ watermarktext,watermarkcolor,fontsize
},
+ % Use '.mega process options*' or '.copy class options and process...':
% .mega process options*={
% prefix=SKVC,
% families={textemphasis,title},
@@ -204,7 +210,7 @@
.copy class options and process options in all families,
}
-\skvrobustdef*\setskeyvaltestclass{%
+\skvrobustdef*\setupskvtestclass{%
\skvsetkeys*+[SKVC]{textemphasis,title}%
}
@@ -212,21 +218,21 @@
\skvrobustdef*\setuptextemphasis#1{\skvsetkeys[SKVC]{textemphasis}{#1}}
\newcommand*\xem[1]{\xem@emph{\xem@bold{\xem@colortext{\xem@color}{#1}}}}
\newcommand*\xem@emph{%
- \skvifbooltrue xem@useitalic\then
+ \skvifbool xem@useitalic\then
\expandafter\emph
\else
\expandafter\@firstofone
\fi
}
\newcommand*\xem@bold{%
- \skvifbooltrue xem@usebold\then
+ \skvifbool xem@usebold\then
\expandafter\textbf
\else
\expandafter\@firstofone
\fi
}
\newcommand*\xem@colortext{%
- \skvifbooltrue xem@usecolor\then
+ \skvifbool xem@usecolor\then
\expandafter\textcolor
\else
\expandafter\@secondoftwo
@@ -258,7 +264,7 @@
\end{tabular}\par
}%
\vskip1.5em\relax
- \skvifbooltrue skvcl@putdate\then{{\skvcl@datefont\@date}}\fi
+ \skvifbool skvcl@putdate\then{{\skvcl@datefont\@date}}\fi
\end{center}\par
\@thanks
\vfil\null
@@ -301,7 +307,7 @@
\end{tabular}\par
}%
\vskip1em\relax
- \skvifbooltrue skvcl@putdate\then{\skvcl@datefont\@date}\fi
+ \skvifbool skvcl@putdate\then{\skvcl@datefont\@date}\fi
\end{center}%
\par
\vskip1.5em\relax
diff --git a/Master/texmf-dist/doc/latex/skeyval/skeyval-testpkg.sty b/Master/texmf-dist/doc/latex/skeyval/skeyval-testpkg.sty
index eae0c324f7d..30de37acd89 100644
--- a/Master/texmf-dist/doc/latex/skeyval/skeyval-testpkg.sty
+++ b/Master/texmf-dist/doc/latex/skeyval/skeyval-testpkg.sty
@@ -1,5 +1,5 @@
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
-% This is file 'skeyval-testpkg.sty', version 1.1, 2012/10/15. %
+% This is file 'skeyval-testpkg.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, %
@@ -27,7 +27,7 @@
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
\ProvidesPackage{skeyval-testpkg}
- [2012/10/15 v1.1 skeyval test package 1 (AM)]
+ [2012/10/16 v1.1a skeyval test package 1 (AM)]
\NeedsTeXFormat{LaTeX2e}
\@ifpackageloaded{skeyval}{}{\RequirePackage{skeyval}}
\RequirePackage{graphicx}
@@ -36,30 +36,12 @@
%%++++++++++++++++ Passing options to packages +++++++++++++++++++%%
-\skvdeclarebooloption[SKVT]<passoptions>[skvtp@]{verbose}[true]{}
+\skvdeclarebooloption[SKVT]<testpkg>[skvtp@]{verbose}[true]{}
% Declare options with default values that will be used when the options
-% are called without user values:
-% \DeclarePassedOptions{<option>=<default>,...}
-\skvrobustdef*\skvDeclarePassedOptions#1{%
- \skvkvparse{#1}\skv@tempa{%
- \def\do##1=##2=##3\@nil{%
- \skvdeclareoption{##1}[##2]{%
- \skvifcsdef{ver@##1.sty}{%
- \skv@warn{Package '##1' has been loaded and
- \MessageBreak now you've asked for it to be loaded}%
- }{%
- \skvAfterProcessOptions{%
- \RequirePackage[####1]{##1}%
- }%
- }%
- }%
- }%
- \expandafter\do\skv@tempa==\@nil
- }%
-}
-
-\skvDeclarePassedOptions{%
+% are called without user values.
+%
+\skvDeclarePassedOptionsLoadPackage[SKVT]{testpkg}{%
hyperref={colorlinks,breaklinks},xcolor=svgnames
}
@@ -69,7 +51,7 @@
% 'shadowbox' family below.
\newcommand*\justified{}
\skvordkey[SKVT]{abrtext}{align}[right]{%
- \skvifcase\skvxifstrcmp{#1}
+ \skvifcase\skvxifstrcmpTF{#1}
{left}{\def\mpfalign{flushleft}}
{right}{\def\mpfalign{flushright}}
{center}{\def\mpfalign{center}}
@@ -169,7 +151,7 @@
.cmd/framecolor/black,
.cmd/shadecolor/white,
.cmd/shadowcolor/gray!55,
- .cmd/boxwidth/2cm,
+ .cmd/boxwidth/1.5cm,
.ord/framesize/.5pt/\def\currfboxrule{#1},
.ord/shadowsize/2pt/\shadowspread=\dimexpr#1\relax,
.choice/align/center/{%
@@ -187,28 +169,32 @@
\skvdisablekeys[SKVT]{testfam}{put shadow, shade color}
-% 'Presetting keys' means set the following keys whenever \setkeys is called.
-% These keys should be set BEFORE the keys listed in the current argument of
-% \setkeys are set, provided that these keys aren't listed in the current
-% argument of \setkeys. If these keys appear in the current argument of \setkeys,
-% then obviously the user has new values for them or he wants the keys to be
-% set with their default values.
-
-% 'Postsetting keys' means set the following keys whenever \setkeys is called.
-% These keys should be set AFTER the keys listed in the current argument of
-% \setkeys are set, provided that these keys aren't listed in the current
-% argument of \setkeys.
-
-% The command \presetkeys of the xkeyval package expects both 'head' and 'tail'.
-% The skeyval package splits \presetkeys into two, hopefully less confusing,
-% commands: \skvpresetkeys and \skvpostsetkeys.
-
-% There is also command \skvpreposetkeys, which combines \skvpresetkeys and
-% \skvpostsetkeys. This expects both head and tail and is equivalent to
-% xkeyval's \presetkeys.
+% Presetting and posetting keys.
+%
+% 1. 'Presetting keys' means set the following keys whenever
+% \setkeys is called. These keys should be set BEFORE the keys
+% listed in the current argument of \setkeys are set, provided
+% that these keys aren't listed in the current argument of \setkeys.
+% If these keys appear in the current argument of \setkeys,
+% then obviously the user has new values for them or he wants
+% the keys to be set with their default values.
+%
+% 2. 'Postsetting keys' means set the following keys whenever
+% \setkeys is called. These keys should be set AFTER the keys
+% listed in the current argument of \setkeys are set, provided
+% that these keys aren't listed in the current argument of \setkeys.
+%
+% 3. The command \presetkeys of the xkeyval package expects both
+% 'head' and 'tail'. The skeyval package splits \presetkeys into two,
+% hopefully less confusing, commands: \skvpresetkeys and
+% \skvpostsetkeys.
+%
+% 4. There is also command \skvpreposetkeys, which combines
+% \skvpresetkeys and \skvpostsetkeys. This expects both head and
+% tail and is equivalent to xkeyval's \presetkeys.
\skvpresetkeys[SKVT]{shadowbox}{%
- put frame,framecolor=black,framesize=.8pt,boxwidth=2cm,align=center,
+ put frame,framecolor=black,framesize=.8pt,boxwidth=1.5cm,align=center,
shadecolor=gray!15
}
@@ -240,13 +226,18 @@
% The following are meant to demonstrate the use of the macro \directkeys:
-\newcount\skvsratchcnt
+\ifdefined\skvtestcnt
+ \skvtestcnt\z@
+\else
+ \newcount\skvtestcnt
+\fi
\def\logsetting{%
- \advance\skvsratchcnt\@ne
+ \advance\skvtestcnt\@ne
\typeout{'\skvcurrentkey' set: no.
- \ifnum\skvsratchcnt<10 0\fi\the\skvsratchcnt, %
+ \ifnum\skvtestcnt<10 0\fi\the\skvtestcnt, %
path: \skvcurrentprefix/\skvcurrentfamily}%
}
+
\directkeys{%
% #1 will be the user-value of the handler 'some handler'.
.new handlers = {
@@ -284,29 +275,37 @@
.ignore prefixes = {KVA,KVD},
.ignore families = {fama,famb,famc},
.restore families = {fama,famb},
- .restore roots = {KVA/fama,KVD/famc},
+ .restore paths = {KVA/fama,KVD/famc},
% .ignore keys = {keyb,keyc},
.new keys = {
.ord/keya/keya-default,
.cmd/keyb/keyb-default/\def\x##1{##1#1},
.cmd/keyc/keyc-default,
- .choice/keyd/center/{right,left,center},
+ .choice*/keyd/center
+ /{ right.do=\def\val@r{#1},
+ left.do=\def\val@l{#1},
+ center.do=\def\val@c{#1}
+ }
+ /\def\yes{value accepted}
+ /\def\no{value rejected},
.bool/keye/true/
- \ifskvindef\else
- \logsetting
- \fi
+ \ifskvindef\else\logsetting\fi
\ifmp@keye\def\y##1{##1#1}\fi
,
.bool/keyf/true/,
.bool/keyg/true/
},
+ .push path,
+ .path = KV/fam1,
+ .set keys = {keyd},
+ .pop path,
.ignore keys = {keyb,keyc},
% Stop processing this list:
% .list break,
.restore keys = {keyb,keyc},
.preset keys = {keyb,keyc},
.postset keys = {keyb,keyc},
- % save unknown keys in the default macro \<pref>@<fam>@rmkeys:
+ % Save unknown keys in the default macro \<pref>@<fam>@rmkeys:
.save unknown keys = true,
.save unknown keys in = \macroa,
.set keys = {keya,keyb,keyc,keyd,keye},
@@ -317,11 +316,12 @@
.set rmkeys*,
% Execute arbitrary code:
.exec code=\def\x#1{#1},
- % Nesting of \directkeys is possible. At the end of the nest, prevailing
- % variables of \directkeys revert to their previous (door) values:
+ % Nesting of \directkeys is possible. Pre-entry and post-entry
+ % topologies are independent. At the end of the nest,
+ % prevailing variables of \directkeys revert to their previous
+ % (pre-door) values:
\directkeys{
- .prefixes = {KVA,KVB},
- .family = fam3,
+ .paths = {KVA/fam3,KVB/fam3},
.holder prefix = hp@,
.define keys = {
.cmd/keya/keya-default/\def\x##1{##1#1},
@@ -332,12 +332,14 @@
.exec code = \def\keycval{true},
% Prepend style keye to key1 and key2:
.prepend style={key1/{keye=.expanded{\keycval}},key2/{keye=false}},
- .prepend style={{key3,key4}/{keye=true,keyf=true}, key5/{keye=false}},
+ % Multi-prepend styles:
+ .prepend style={{key3,key4}/{keye=true,keyf=true},key5/{keye=false}},
% Prepend style keyd to key6:
.prepend style={key6/{keyd=right}},
- % Append styles keye and keyf to key7 and key8:
+ % Append styles keye and keyf to key7 and key8.
+ % '.styles' and '.style' are equivalent to '.append styles'
+ % and '.append style'.
.append style={key7/{keye=true},key8/{keyf=false}},
- %
% The next two link keyb and keyc to key9. #1 here refers to the
% current value of key9. The same effect can be achieved directly
% via the '.link' handler:
@@ -347,7 +349,7 @@
% Link keye and keyf to key10 and key11. The values of key10 and
% key11 are used to set keye and keyf. key10 and key11 are hence
% 'parent keys'.
- .link={key10/keye, key11/keyf},
+ .link = {key10/keye, {key11,key12}/{keyf,keyg}},
.set keys = {key10=true},
.ignore key = keyf,
.save unknown keys in = \macrob,
@@ -394,7 +396,7 @@
%%+++++++++++++++++++++ Changing the key parser ++++++++++++++++++++%%
\setupskeyval{key parser={;}}
-\AfterDefineKeys{\setupskeyval{keyparser={,}}}
+\skvafterdefinekeys{\setupskeyval{keyparser={,}}}
\skvdefinekeys*[SKVT]{example}[exm@]{%
.zbool/put frame/true;
.cmd/shadecolor/green;
@@ -406,13 +408,12 @@
justified.do=\let\curralign\@iden
};
}
-%\setupskeyval{keyparser={,}}
%%++++++++++++++++++++++++++ Options section ++++++++++++++++++++++%%
\def\skvtp@unknownoptions{}
-\skvunknownoptionhandler[SKVT]<abrtext,shadowbox,citation,passoptions>{%
+\skvunknownoptionhandler[SKVT]<abrtext,shadowbox,citation,testpkg>{%
\edef\skvtp@unknownoptions{%
\skvtp@unknownoptions\ifx\skvtp@unknownoptions\@empty\else,\fi
#3%
@@ -425,9 +426,10 @@
}%
}
\skvexecuteoptions[SKVT]<abrtext>{align=.expanded{\alignval},
- text style=.expand once{\stextstyle},author,show author}
+ text style=.expand once{\stextstyle},author,show author
+}
-\skvprocessoptions*+[SKVT]<abrtext,shadowbox,citation,passoptions>\relax
-%\skvrestrictedprocessoptions*+[SKVT]<abrtext,shadowbox,citation,passoptions>\relax
+\skvprocessoptions*+[SKVT]<abrtext,shadowbox,citation,testpkg>\relax
+%\skvrestrictedprocessoptions*+[SKVT]<abrtext,shadowbox,citation,testpkg>\relax
\endinput
diff --git a/Master/texmf-dist/doc/latex/skeyval/skeyval-view-pokayoke1.pdf b/Master/texmf-dist/doc/latex/skeyval/skeyval-view-pokayoke1.pdf
index 320b74097e2..fc4c8014215 100644
--- a/Master/texmf-dist/doc/latex/skeyval/skeyval-view-pokayoke1.pdf
+++ b/Master/texmf-dist/doc/latex/skeyval/skeyval-view-pokayoke1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/skeyval/skeyval-view-pokayoke1.tex b/Master/texmf-dist/doc/latex/skeyval/skeyval-view-pokayoke1.tex
index c29448d04b5..9ad80b2a5c5 100644
--- a/Master/texmf-dist/doc/latex/skeyval/skeyval-view-pokayoke1.tex
+++ b/Master/texmf-dist/doc/latex/skeyval/skeyval-view-pokayoke1.tex
@@ -1,17 +1,22 @@
\documentclass{skeyval-testclass}
\usepackage[xcolor-options=dvipsnames]{skeyval-view}
+\usetikzlibrary[topaths]
\makeatletter
\setupviewkeys{length of default=30}
\skvdefinekeys[KV]{fam1}[vhp@]{%
- .ord/keya/default-a,
+ .initialize after define,
+ .ord/{keya,keya2}/default-a,
.cmd/keyb,
.zcmd/key c/\def\cmdc##1{##1}/
\edef\y{\detokenize\expandafter{\vhp@keyc}}\def\x##1{#1*key c*##1},
- .choice/keyd/center/
- {center.do=\def\x##1{#1*##1},left.do={\def\ans{#1}},right},
+ % No default for keyd:
+ .choice/keyd/.na
+ /{center.do=\def\x##1{#1*##1},left.do={\def\ans{#1}},right}
+ /\def\z##1{#1*##1}
+ /\@warning{Invalid value for keyd},
.bool/show shadow/true,
.zbool/show center/true/\edef\cmd{\ifvhp@showcenter Yes\else No\fi},
.ord/keye,
@@ -44,7 +49,7 @@
\begin{document}
\title{The \texttt{\textcolor{blue}{skeyval-view}} Package\\[.25ex]
- Version 1.1\\[1ex]
+ Version 1.1a\\[1ex]
\textsf{Test document}}
\author{Ahmed Musa}
\maketitle
@@ -89,6 +94,44 @@
}
\newpage
+
+\skvtestcnt0\relax
+\skvrecurse
+ \advance\skvtestcnt1\relax
+ \vskip\baselineskip\noindent
+ \textcolor{blue!\the\numexpr10*\skvtestcnt!red!%
+ \the\numexpr100/\skvtestcnt}{%
+ The play was a great success, but the audience was a disaster.
+ \endgraf{\small Oscar Wilde, 1854--1900}
+ }%
+\while
+ \ifnum\skvtestcnt<8\relax
+\fi
+
+% Credit: Quintin Jean-Noël
+\newcount\mycount
+\begin{center}
+\begin{tikzpicture}[scale=.5,transform shape]
+\newforeach \nr in {1,...,8}{
+ \mycount=\numexpr(\nr-1)*45\relax
+ \node[draw,circle,inner sep=0.25cm] (N-\nr) at (\the\mycount:5.4cm) {};
+}
+\newforeach \nr in {9,...,16}{
+ \mycount=\numexpr(\nr-1)*45+22\relax
+ \node[draw,circle,inner sep=0.25cm] (N-\nr) at (\the\mycount:5.4cm) {};
+}
+\newforeach \nr in {1,...,15}{
+ \mycount=\numexpr\nr+1\relax
+ \newforeach \nra in {\the\mycount,...,16}{
+ \path (N-\nr) edge[->,bend right=3] (N-\nra) edge[<-,bend left=3]
+ (N-\nra);
+ }
+}
+\end{tikzpicture}
+\end{center}
+
+
+\bigskip
Find more information about the \textcolor{red}{\texttt{show shadow}} option on page~\pageref{KV/fam1/show shadow}.
\end{document}
diff --git a/Master/texmf-dist/tex/latex/skeyval/skeyval-bc.sty b/Master/texmf-dist/tex/latex/skeyval/skeyval-bc.sty
index 1f65a1d0100..de53f5161e0 100644
--- a/Master/texmf-dist/tex/latex/skeyval/skeyval-bc.sty
+++ b/Master/texmf-dist/tex/latex/skeyval/skeyval-bc.sty
@@ -1,8 +1,17 @@
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
% This is file 'skeyval-bc.sty', version 0.73 of skeyval package, %
-% January 2011. This file is provided only for backward compatibility %
-% (bc) of the package. Beginning from version 1.0, September 2012, the %
-% package has changed radically. %
+% January 2011. %
+% NOTE %
+% This file is provided only for backward compatibility (bc) of the %
+% skeyval package. Beginning from version 1.0, September 2012, the %
+% 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} %
% %
% This package and accompanying files may be distributed and/or %
% modified under the conditions of the LaTeX Project Public License, %
@@ -1992,7 +2001,8 @@
}
\SKV@def*\SKV@compoptb[#1]#2{\SKV@testopt{\SKV@compoptc[#1]{#2}}{mp@}}
\SKV@def*\SKV@compoptc[#1]#2[#3]#4{%
- \SKV@testopt{\SKV@co@pkey[#1]{#2}[#3]{#4}}{true}}
+ \SKV@testopt{\SKV@co@pkey[#1]{#2}[#3]{#4}}{true}%
+}
\SKV@def*\SKV@biboolkeys[#1]#2[#3]#4[#5]#6#7#8{%
\@namedef{#1@#2@#4@func}{%
#7\relax
diff --git a/Master/texmf-dist/tex/latex/skeyval/skeyval-core.tex b/Master/texmf-dist/tex/latex/skeyval/skeyval-core.tex
index 13e0a2a37f2..83348e842a8 100644
--- a/Master/texmf-dist/tex/latex/skeyval/skeyval-core.tex
+++ b/Master/texmf-dist/tex/latex/skeyval/skeyval-core.tex
@@ -1,5 +1,5 @@
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
-% This is file 'skeyval-core.tex', version 1.1, 2012/10/15. %
+% This is file 'skeyval-core.tex', 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, %
@@ -29,9 +29,6 @@
\csname skeyval-core-loaded\endcsname
\expandafter\let\csname skeyval-core-loaded\endcsname\endinput
-% Remove ++++++++++++++++++++++++++++++++++++++++++
-\RequirePackage[notraceifs]{codetrace}
-
\begingroup
\catcode035 06 % #
\catcode064 11 % @
@@ -45,9 +42,17 @@
\expandafter\do
\fi
}%
- \edef\skv@core@restorecodes{\do035,064,123,125,061,059,\do,}%
+ \edef\skv@core@restorecodes{\do35,64,123,125,61,59,13,\do,}%
}
\skv@prova
+
+\edef\skv@core@restorecodes{%
+ \unexpanded\expandafter{\skv@core@restorecodes}%
+ \endlinechar\the\endlinechar\relax
+ \catcode`\^^M=\the\catcode`\^^M\relax
+}
+\endlinechar13 %
+\catcode013 05 % ^^M
\catcode035 06 % #
\catcode064 11 % @
\catcode123 01 % {
@@ -57,7 +62,7 @@
\def\do#1=#2,{%
\ifx\do#1\else
\edef\skv@core@restorecodes{%
- \skv@core@restorecodes
+ \unexpanded\expandafter{\skv@core@restorecodes}%
\catcode#1=\the\catcode#1\relax
}%
\catcode#1=#2\relax
@@ -65,27 +70,31 @@
\fi
}
\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=,%
+ 059=12,045=12,047=12,058=12,063=12,091=12,093=12,126=13,13=5,\do=,%
\newdimen\skvz@\skvz@=0pt\relax
+\newcount\skvm@ne\skvm@ne=-1\relax
\ifcase
- \ifx\eTeXversion\@undefined\skvz@\else
- \ifnum\eTeXversion<\tw@\skvz@\else\@ne\fi\fi
- \errhelp{This package requires eTeX version 2 or higher.}%
+ \ifx\eTeXversion\@undefined0\else
+ \ifnum\eTeXversion<\tw@0\else1\fi\fi\relax
+ \errhelp{This package requires eTeX version 2 or higher.}
\errmessage{skeyval package: eTeX not loaded or old version.}
\expandafter\endinput
\fi
-\newif\ifskv@inlatex
+%\chardef\skv@five=5\relax
+%\chardef\skv@six=6\relax
+\newif\ifskv@latex
+\newif\ifskv@tempst
\ifx\ProvidesFile\@undefined
- \skv@inlatexfalse
- \message{File 'skeyval-core.tex' 2012/10/15 v1.1:
+ \skv@latexfalse
+ \message{File 'skeyval-core.tex' 2012/10/16 v1.1a:
Core of 'skeyval' key-value parser (AM)}
\input skeyval-ltxcmds
\else
- \skv@inlatextrue
+ \skv@latextrue
\ProvidesFile{skeyval-core.tex}
- [2012/10/15 v1.1 Base file of skeyval package (AM)]
+ [2012/10/16 v1.1a Base file of skeyval package (AM)]
\@addtofilelist{skeyval-core.tex}
\long\def\@nodocument#1{%
\@latex@error{'#1' appeared\on@line\space without
@@ -216,7 +225,43 @@
{#1}{\unexpanded{#3}}%
}
-\long\def\skvgobbleldspaces{\skvifnextchar x{}{}}
+% Expandable \@testopt:
+%
+% Eg,
+% \def\macroa{\skvnewxtestopt\macrob{Mr.}}
+% \def\macrob[#1]#2{#1 #2}
+% \edef\testa{\expandafter\macroa\activespace{David Carlisle}}
+% \edef\testb{\macroa[Mr.]{Heiko Oberdiek}}
+%
+\long\def\skvnewxtestopt#1#2#3{%
+ % #3 will be seen as a space only if that space is active. But
+ % \skvifstrcmpTF will detokenize that space before comparison.
+ \skvifstrcmpTF{ }{#3}{%
+ \skvnewxtestopt#1{#2}%
+ }{%
+ \skvifstrcmpTF{#3}{[}%
+ {#1[}{\skvifntypeTF{#3}{#1[#2]#3}{#1[#2]{#3}}}%
+ }%
+}
+
+% Expandable \@ifnextchar:
+%
+% Eg,
+% \def\temp{\skvxifnextchar*{\def\x{T}}{\def\x{F}}}
+% \temp* (star seen) or \temp<some token> (star not seen)
+%
+% ** This can't be used to test the presence of explicit left brace.
+%
+\long\def\skvxifnextchar#1#2#3#4{%
+ % #4 will be seen as a space only if that space is active. But
+ % \skvifstrcmpTF will detokenize that space before comparison.
+ \skvifstrcmpTF{ }{#4}{%
+ \skvxifnextchar#1{#2}{#3}%
+ }{%
+ \skvifstrcmpTF{#4}{#1}{#2}{\skvifntypeTF{#4}{#3#4}{#3{#4}}}%
+ }%
+}
+
\long\def\skvgobbleleadingspaces{\skvsimpleifnextchar x{}{}}
\long\protected\def\skvstarorlong#1{%
\skvifstar{\let\l@ngrel@x\relax#1}{\let\l@ngrel@x\long#1}%
@@ -272,6 +317,8 @@
\skvnewlet\skv@nil\relax
\skvnewlet\skvrelax\relax
\skvnewdef*\skv@relaxtoks{\relax}
+\skvnewdef*\skv@truetoks{true}
+\skvnewdef*\skv@falsetoks{false}
\skvnewdef*\skv@nnil{\skv@nil}
\skvnewdef\skv@car#1#2\car@nil{#1}
\skvnewdef\skv@car@detok#1#2\car@nil{\detokenize{#1}}
@@ -285,6 +332,7 @@
\skvnewdef*\skv@quark{\@gobble\skv@quark}
\skvnewlet\skvrom\romannumeral
\skvnewdef*\skv@rej{^skv^}
+\skvnewdef*\skv@dotna{.na}
\skvnewdef\skvafterfi#1\fi{\fi#1}
\skvnewdef\skvafterfifi@inneriscond#1\fi#2\fi{\fi#1\fi}
\skvnewdef\skvafterfifi#1\fi#2\fi{\fi\fi#1}
@@ -303,22 +351,22 @@
\in@@#2{\in@@}#1\in@@
}
\skvrobustdef*\skvcsnewif#1{%
- \skvifstrcmp{#1}{x}{%
+ \skvifstrcmpTF{#1}{x}{%
\skv@err{Redefining primitve '\@backslashchar ifx'?}\@ehd
}{%
\csname newif\expandafter\endcsname\csname if#1\endcsname
}%
}
\skvnewdef*\skv@zapornot#1{%
- \ifnum#1=\skvz@
- \expandafter\@iden
- \else
+ \if#1%
\expandafter\skvzapspaces
+ \else
+ \expandafter\@iden
\fi
}
\skvnewdef\skvzapspaces#1{\skv@zapspaces.#1 \zap@nil}
\skvnewdef\skv@zapspaces#1 #2\zap@nil{%
- \skvifblank{#2}{%
+ \skvifblankTF{#2}{%
\@gobble#1%
}{%
\skv@zapspaces#1#2\zap@nil
@@ -331,26 +379,26 @@
\newcommand\skvifleadspace[3]{%
\romannumeral\csname
- @\skvifnull{#1}{second}{\iffalse{\fi\skv@ifleadspace.#1 x}}%
+ @\skvifnullTF{#1}{second}{\iffalse{\fi\skv@ifleadspace.#1 x}}%
oftwo\endcsname{0 #2}{0 #3}%
}
\skvnewdef\skv@ifleadspace#1 {%
- \expandafter\skvifnull\expandafter{\@gobble#1}{first}{second}%
+ \expandafter\skvifnullTF\expandafter{\@gobble#1}{first}{second}%
\expandafter\@gobble\expandafter{\iffalse}\fi
}
-% \skvifldspace{ }{}{} gives <true> as desired.
+% \skvifldspaceTF{ }{}{} gives <true> as desired.
\begingroup
\lccode`\&=0 \catcode`\&=7 \lccode`\!=0 \catcode`\!=8
\lowercase{\endgroup
- \skvnewdef\skvifldspace#1{\skv@ifldspace!#1! &}
- \skvnewdef\skv@ifldspace#1! #2&{\skvifnotblank{#2}}
+ \skvnewdef\skvifldspaceTF#1{\skv@ifldspace!#1! &}
+ \skvnewdef\skv@ifldspace#1! #2&{\skvifblankFT{#2}}
\skvnewdef\skvtrimspace#1{\skv@trimspace@a.#1& &}
\skvnewdef\skv@trimspace@a#1 &{\skv@trimspace@b#1&}
\skvnewdef\skv@trimspace@b#1&#2{%
\unexpanded\expandafter{%
\romannumeral0%
- \expandafter\skvifldspace\expandafter{\@gobble#1}{%
+ \expandafter\skvifldspaceTF\expandafter{\@gobble#1}{%
\@gobble#1%
}{%
\expandafter\@space\@gobble#1%
@@ -364,7 +412,7 @@
\edef#1{\expandafter\skvtrimspace\expandafter{#1}}%
}
\skvnewdef*\skvcsuse#1{%
- \ifcsname#1\endcsname
+ \skvifcsname#1\then
\csname#1\expandafter\endcsname
\fi
}
@@ -375,12 +423,17 @@
\skvnewdef\skvaftercsname#1#2{%
\expandafter\skvswap\expandafter{\csname#2\endcsname}{#1}%
}
-\skvnewdef*\skvifdef#1{%
- \skvifblank{#1}\@secondoftwo{%
- \skvifx#1\@undefined{%
+\skvnewlet\skvaftercs\skvaftercsname
+\skvnewdef*\skvifdef#1\then{\if0\skvifdefTF{#1}{0}{1}}
+\skvnewdef*\skvifundef#1\then{\if0\skvifdefTF{#1}{1}{0}}
+% \skvifcsname x\then\def\x{T}\else\def\x{F}\fi
+\skvnewdef*\skvifcsname#1\then{\if0\skvifcsdefTF{#1}{0}{1}}
+\skvnewdef*\skvifdefTF#1{%
+ \skvifblankTF{#1}\@secondoftwo{%
+ \skvifxTF#1\@undefined{%
\@secondoftwo
}{%
- \ifx#1\relax
+ \ifx\relax#1%
\expandafter\@secondoftwo
\else
\expandafter\@firstoftwo
@@ -388,9 +441,9 @@
}%
}%
}
-\skvnewdef*\skvifundef#1{\skvifdef{#1}\@secondoftwo\@firstoftwo}
-\skvnewdef*\skvifcsdef#1{%
- \skvifblank{#1}{%
+\skvnewdef*\skvifdefFT#1{\skvifdefTF{#1}\@secondoftwo\@firstoftwo}
+\skvnewdef*\skvifcsdefTF#1{%
+ \skvifblankTF{#1}{%
\expandafter\@secondoftwo\@gobble
}{%
\ifcsname#1\endcsname
@@ -407,24 +460,25 @@
\fi
}%
}
-\skvnewdef*\skvifcsundef#1{\skvifcsdef{#1}\@secondoftwo\@firstoftwo}
+\skvnewdef*\skvifcsdefFT#1{\skvifcsdefTF{#1}\@secondoftwo\@firstoftwo}
\def\skv@ifx@#1#2\skv@ifx@nil{\expandafter#1}
-\skvnewdef*\skvifx#1#2{%
+\def\skv@ifx@@#1#2\skv@ifx@nil{#1}
+\skvnewdef*\skvifxTF#1#2{%
\csname @\expandafter\expandafter\expandafter
- \ifx\skv@ifx@#1\batchmode\skv@ifx@nil\skv@car#2\noboundary\car@nil
+ \ifx\skv@ifx@#1\batchmode\skv@ifx@nil\skv@ifx@@#2\noboundary\skv@ifx@nil
first\else second\fi oftwo\endcsname
}
-\skvnewdef*\skvnotifx#1#2{\skvifx{#1}{#2}\@secondoftwo\@firstoftwo}
+\skvnewdef*\skvifxFT#1#2{\skvifxTF{#1}{#2}\@secondoftwo\@firstoftwo}
\skvnewdef*\skv@ghost{\@gobble\skv@ghost}
-\skvnewdef\skvifempty#1{%
+\skvnewdef\skvifemptyTF#1{%
\ifx#1\@empty\skv@ghost
\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
}
-\skvnewdef\skvifcsempty#1{\expandafter\skvifempty\csname#1\endcsname}
-\skvnewdef\skvifdefempty#1{%
- \skvifblank{#1}\@secondoftwo{%
- \skvifntype{#1}{%
- \skvifdef{#1}{\skvifx#1\@empty}{\@secondoftwo}%
+\skvnewdef\skvifcsemptyTF#1{\expandafter\skvifemptyTF\csname#1\endcsname}
+\skvnewdef\skvifdefemptyTF#1{%
+ \skvifblankTF{#1}\@secondoftwo{%
+ \skvifntypeTF{#1}{%
+ \skvifdefTF{#1}{\skvifxTF#1\@empty}{\@secondoftwo}%
}{%
\@secondoftwo
}%
@@ -436,22 +490,21 @@
% Keep lccode, in case the test occurs in a table:
\lccode`\&=0 \catcode`\&=8
\lowercase{\endgroup
- \skvnewdef\skvifnull#1{%
+ \skvnewdef\skvifnullTF#1{%
\csname @\ifcat&\detokenize{#1}&first\else second\fi oftwo\endcsname
}
\skvnewdef\skviflacus#1\then{\ifcat&\detokenize{#1}&}
}
-\skvnewdef\skvifblank#1{%
- \expandafter\skvifnull\expandafter{\@gobble#1.}%
+\skvnewdef\skvifblankTF#1{%
+ \expandafter\skvifnullTF\expandafter{\@gobble#1.}%
}
-\skvnewdef\skvifnotblank#1{\skvifblank{#1}\@secondoftwo\@firstoftwo}
-\skvnewdef\iflacuna#1\then{\if\relax\detokenize{#1}\relax}
+\skvnewdef\skvifblankFT#1{\skvifblankTF{#1}\@secondoftwo\@firstoftwo}
-\skvnewdef*\skvifbool#1{%
- \skvifblank{#1}{%
+\skvnewdef*\skvifboolTF#1{%
+ \skvifblankTF{#1}{%
\@secondoftwo
}{%
- \skvifcsdef{if#1}{%
+ \skvifcsdefTF{if#1}{%
\csname @\csname if#1\endcsname
first\else second\fi oftwo\endcsname
}{%
@@ -459,35 +512,33 @@
}%
}%
}
-\skvnewdef*\skvifnotbool#1{\skvifbool{#1}\@secondoftwo\@firstoftwo}
-\skvnewdef*\skvifbooltrue#1\then{\csname if#1\endcsname}
-\skvnewdef*\skvifboolfalse#1\then{\csname if#1\endcsname\else}
-\skvnewdef*\skvifdefbool#1{%
+\skvnewdef*\skvifboolFT#1{\skvifboolTF{#1}\@secondoftwo\@firstoftwo}
+% \skvifbool sw1\then <true> \else <false> \fi
+\skvnewdef*\skvifbool#1\then{\if0\skvifboolTF{#1}01}
+\skvnewdef*\skvifdefboolTF#1{%
\csname @\csname if#1\endcsname first\else second\fi oftwo\endcsname
}
-% \skvlogicalif<bool>"<true>"<false>"
-\skvnewdef*\skvlogicalif#1"#2"#3"{%
- \skvifbool{#1}{#2}{#3}\skvgobbleleadingspaces
-}
-% \skvifboolval{<toks>}{<true>}{<false>}
-\skvrobustdef*\skvifboolval#1{%
- \skvxifin{,\expandafter\skvtrimspace\expandafter
+\skvnewdef*\skvifdefboolFT#1{\skvifdefboolTF{#1}\@secondoftwo\@firstoftwo}
+% \skvifboolvalTF{<toks>}{<true>}{<false>}
+\skvrobustdef*\skvifboolvalTF#1{%
+ \skvxifinTF{,\expandafter\skvtrimspace\expandafter
{\detokenize{#1}},}{,\detokenize{true,false},}%
}
+\skvrobustdef*\skvxifboolvalTF#1{%
+ \begingroup
+ \edef\skv@prova{#1}%
+ \skvdespacecontent\skv@prova
+ \skvexpandtwoargs{\endgroup\skvifinTF}
+ {,\skvoxdetok\skv@prova,}{,\detokenize{true,false},}%
+}
% Generate error if <toks> is not a valid boolean value, otherwise
% execute #2:
-% \skvifvalidboolval{<toks>}{<true>}
-\skvrobustdef*\skvifvalidboolval#1#2{%
- \skvxifin{,\expandafter\skvtrimspace\expandafter
+% \skvifboolvalT{<toks>}{<true>}
+\skvrobustdef*\skvifboolvalT#1#2{%
+ \skvxifinTF{,\expandafter\skvtrimspace\expandafter
{\detokenize{#1}},}{,\detokenize{true,false},}%
{#2}{\skv@badboolerr{#1}}%
}
-\skvrobustdef*\skvxifboolval#1{%
- \begingroup
- \edef\skv@prova{#1}%
- \skvexpandtwoargs{\endgroup\skvifin}
- {,\skvoxdetok\skv@prova,}{,\detokenize{true,false},}%
-}
% Convert bool value (true or false) to switch value (00 or 01):
\skvrobustdef*\skvbooltoswitch#1#2{%
\begingroup
@@ -505,74 +556,116 @@
\skv@err{Invalid boolean value '#1'; expected 'true' or 'false'}\@ehd
}
-% All switch functions of skeyval pacakge operate on a command
-% and not on csname.
-\skvnewdef*\skvnewswitch#1{%
- \skvifcsdef{skv@sw@#1}{%
+% Switches and toggles have separate namespaces.
+\skvrobustdef*\skvnewswitch#1{%
+ \skvifcsdefTF{skv@switch@#1}{%
\skv@err{Switch '\detokenize{#1}' already exists}\@ehd
}{%
- \skvcsdef{skv@sw@#1}{01}%
+ \skvcsdef{skv@switch@#1}{01}%
}%
}
-\skvnewdef*\skvifswitch#1{%
+\skvnewdef*\skvifswitchTF#1{%
\if
- \skvifcsdef{skv@sw@#1}{%
- \csname skv@sw@#1\endcsname
- \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
+ \skvifcsdefTF{skv@switch@#1}{%
+ \csname skv@switch@#1\endcsname
}{%
01%
}%
+ \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
+}
+\skvnewdef*\skvifdefswitchTF#1{%
+ \if\csname skv@switch@#1\endcsname
+ \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
}
-\skvnewdef*\skvswitchtrue#1{%
- \skvifcsdef{skv@sw@#1}{%
- \skvcsdef{skv@sw@#1}{00}%
+\skvrobustdef*\skvswitchtrue#1{%
+ \skvifcsdefTF{skv@switch@#1}{%
+ \skvcsdef{skv@switch@#1}{00}%
}{%
\skv@err{No switch '\detokenize{#1}'}\@ehd
}%
}
-\skvnewdef*\skvswitchfalse#1{%
- \skvifcsdef{skv@sw@#1}{%
- \skvcsdef{skv@sw@#1}{01}%
+\skvrobustdef*\skvswitchfalse#1{%
+ \skvifcsdefTF{skv@switch@#1}{%
+ \skvcsdef{skv@switch@#1}{01}%
}{%
\skv@err{No switch '\detokenize{#1}'}\@ehd
}%
}
-
-\begingroup
-\def\x#1{\endgroup
- \skvnewdef*\skvnegatesw##1{%
- 0\ifcase##11#1\or\expandafter1\else\expandafter0\fi
+\skvrobustdef*\skvnewtog#1{%
+ \skvifcsdefTF{skv@toggle@#1}{%
+ \skv@err{Switch '\detokenize{#1}' already exists}\@ehd
+ }{%
+ \skvcslet{skv@toggle@#1}\@secondoftwo
}%
- \skvnewdef*\skvifbothswtrue##1##2{%
- 0\ifcase##1##2#1\expandafter0\else\expandafter1\fi
+}
+\skvrobustdef*\skvdeftog#1{\skvcslet{skv@toggle@#1}\@secondoftwo}
+\skvnewdef*\skviftogTF#1{%
+ \skvifcsdefTF{skv@toggle@#1}{%
+ \csname skv@toggle@#1\endcsname
+ }{%
+ \@secondoftwo
+ }%
+}
+\skvnewdef*\skviftogFT#1{\skviftogTF{#1}\@secondoftwo\@firstoftwo}
+\skvnewdef*\skvifdeftogTF#1{\csname skv@toggle@#1\endcsname}
+\skvrobustdef*\skvsettogtrue#1{%
+ \skvifcsdefTF{skv@toggle@#1}{%
+ \skvcslet{skv@toggle@#1}\@firstoftwo
+ }{%
+ \skv@err{No toggle '\detokenize{#1}'}\@ehd
}%
- \skvnewdef*\skvifoneswtrue##1##2{%
- 0\ifnum##1##2<101#1\expandafter0\else\expandafter1\fi
+}
+\skvrobustdef*\skvsettogfalse#1{%
+ \skvifcsdefTF{skv@toggle@#1}{%
+ \skvcslet{skv@toggle@#1}\@secondoftwo
+ }{%
+ \skv@err{No toggle '\detokenize{#1}'}\@ehd
}%
}
-\x{ }
-\skvnewdef\skvifcond#1\fi{%
+% plasw=plain switch (ie, 00 or 01).
+\skvnewdef*\skvifplaswTF#1{%
+ \if#1\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
+}
+\skvnewdef*\skvifplaswFT#1{%
+ \if#1\expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi
+}
+% \def\swa{01} \def\swb{01}
+% \if\skvnegateplasw\swa...\else...\fi
+% \if\skvifbothplaswtrue\swa\swb...\else...\fi
+% \if\skvifoneplaswtrue\swa\swb...\else...\fi
+\skvnewdef*\skvnegateplasw#1{0\skvifplaswTF{#1}10}%
+\skvnewdef*\skvifbothplaswtrue#1#2{%
+ 0\ifcase#1#2 \expandafter0\else\expandafter1\fi
+}
+\skvnewdef*\skvifoneplaswtrue#1#2{%
+ 0\ifnum#1#2<101 \expandafter0\else\expandafter1\fi
+}
+
+\skvnewdef\skvifcondTF#1\fi{%
\csname @#1first\else second\fi oftwo\endcsname
}
-\skvnewdef\skvifnotcond#1\fi{\skvifcond{#1}\fi\@secondoftwo\@firstoftwo}
-% Maybe #1 isn't expandable:
-\skvnewdef\skvifcondition#1\fi{%
+\skvnewdef\skvifcondFT#1\fi{\skvifcondTF{#1}\fi\@secondoftwo\@firstoftwo}
+% In case #1 isn't expandable. This is the difference between
+% \skvifcondTF and \skvifconditionTF.
+\skvnewdef\skvifconditionTF#1\fi{%
#1\relax
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
}
-\skvnewdef*\skvifnum#1#{\skvifcond\ifnum#1\fi}
+\skvnewdef*\skvifnumTF#1#{\skvifcondTF\ifnum#1\fi}
+\skvnewdef*\skvifdim#1#{\skvifcondTF\ifdim#1\fi}
+\skvnewdef*\skvifnumFT#1#{\skvifnumTF#1{\@secondoftwo}{\@firstoftwo}}
\skvnewdef\skvalloftwo#1#2{#1#2}
% If '#1' is a single, non-space and non-braced token:
-\skvnewdef\skvifntype#1{%
+\skvnewdef\skvifntypeTF#1{%
\csname @\if0\skv@strcmp
{\skvexpandonce{\skvalloftwo#1{}{}}}{\unexpanded{#1{}}}%
first\else second\fi oftwo\endcsname
}
-\skvnewdef\skvxifntype{\skvexpandarg\skvifntype}
+\skvnewdef\skvxifntypeTF{\skvexpandarg\skvifntypeTF}
\skvrobustdef*\skvundef#1{\let#1\@undefined}
\skvrobustdef*\skvgundef#1{\global\let#1\@undefined}
\skvrobustdef*\skvcsundef#1{\skvcslet{#1}\@undefined}
@@ -583,38 +676,45 @@
\skvrobustdef*\skvemptifycmds#1{%
\skvcommaparse{#1}\skv@prova{\expandafter\def\skv@prova{}}%
}
-\skvifdef\pdfstrcmp{%
+\skvrobustdef*\skvemptify#1{\def\do##1{\def##1{}}#1}
+\skvrobustdef*\skvdumpgarbage{%
+ \let\gdl\skvgundef
+ \let\dl\skvundef
+ \skv@garbagelist
+ \def\skv@garbagelist{}%
+}
+% \skvgarbageitems{\dl<cmd1>\gdl<cmd2>...}
+\skvrobustdef*\skvgarbageitems{\skvappto\skv@garbagelist}
+\skvifdefTF\pdfstrcmp{%
\let\skv@strcmp\pdfstrcmp
}{%
\RequirePackage{pdftexcmds}%
- \skvifdef\pdf@strcmp{%
+ \skvifdefTF\pdf@strcmp{%
\let\skv@strcmp\pdf@strcmp
}{%
\skv@err{Neither '\string\pdfstrcmp' nor
'\string\pdf@strcmp' exists}\@ehd
}%
}
-\skvnewdef\skvifstrcmp#1#2{%
+\skvnewdef\skvifstrcmpTF#1#2{%
\csname @\ifnum\skv@strcmp{\detokenize{#1}}%
{\detokenize{#2}}=0first\else second\fi oftwo\endcsname
}
-\skvnewdef\skvifstreq#1\with#2\then{%
+\skvnewdef*\skvifstrcmpFT#1#2{\skvifstrcmpTF{#1}{#2}\@secondoftwo\@firstoftwo}
+\skvnewdef\skvifstreq#1#2\then{%
\ifnum\skv@strcmp{\detokenize{#1}}{\detokenize{#2}}=\skvz@
}
-% \ifskvstreq may be used in, eg, \newforeach, where every user-given
-% conditional must start with \if...:
-\skvnewlet\ifskvstreq\skvifstreq
-\skvnewdef\skvoifstrcmp#1#2{%
+\skvnewdef\skvoifstrcmpTF#1#2{%
\csname @\ifnum\skv@strcmp{\skvexpandonce{#1}}%
{\skvexpandonce{#2}}=0first\else second\fi oftwo\endcsname
}
-\skvnewdef\skvxifstrcmp#1#2{%
+\skvnewdef\skvxifstrcmpTF#1#2{%
\csname @\ifnum\skv@strcmp{#1}{#2}=0first\else
second\fi oftwo\endcsname
}
\skvrobustdef\skvcslet#1#2{\expandafter\let\csname#1\endcsname#2}
\skvrobustdef\skvnewcslet#1{%
- \skvifcsdef{#1}{%
+ \skvifcsdefTF{#1}{%
\skv@err{Command '\skvnoexpandcs{#1}' already defined}\@ehd
}{%
\skvcslet{#1}%
@@ -625,7 +725,7 @@
\let\expandafter#1\csname#2\endcsname
}
\skvrobustdef\skvnewletcs#1{%
- \skvifdef{#1}{%
+ \skvifdefTF{#1}{%
\skv@err{Command '\string#1' already defined}\@ehd
}{%
\skvletcs#1%
@@ -637,7 +737,7 @@
\endcsname\csname#2\endcsname
}
\skvrobustdef\skvnewcsletcs#1{%
- \skvifcsdef{#1}{%
+ \skvifcsdefTF{#1}{%
\skv@err{Command '\skvnoexpandcs{#1}' already defined}\@ehd
}{%
\skvcsletcs{#1}%
@@ -694,8 +794,8 @@
\skvrobustdef*\skvsetnumber#1{%
\begingroup
- \def#1{\edef#1{\endgroup\def\noexpand#1{\the\count@}}#1}%
- \afterassignment#1\count@
+ \def\x{\edef\x{\endgroup\def\noexpand#1{\the\count@}}\x}%
+ \afterassignment\x\count@
}
\skvnewlet\skvsetno\skvsetnumber
\skvrobustdef*\skvadvanceno{\skv@advanceno\relax}
@@ -705,21 +805,21 @@
\begingroup
\count@#3\relax
\endgroup
- \skvifdef#2{%
+ \skvifdefTF#2{%
#1\edef#2{\the\numexpr#2+#3\relax}%
}{%
\skv@err{Number '\string#2' is not defined}\@ehd
}%
}
\skvrobustdef*\skvpushnumber#1{%
- \skvifdef#1{%
+ \skvifdefTF#1{%
\edef#1{\the\numexpr#1+1\relax}%
}{%
\def#1{0}%
}%
}
\skvrobustdef*\skvpopnumber#1{%
- \skvifdef#1{%
+ \skvifdefTF#1{%
\edef#1{\the\numexpr#1+1\relax}%
}{%
\skv@err{Number '\string#1' is not defined}\@ehd
@@ -736,11 +836,11 @@
% Removing spurious spaces before checking for brace.
-% If we were to use \skvtrimspace for \skvifbraced, then the need
+% If we were to use \skvtrimspace for \skvifbracedTF, then the need
% for double \romannumeral will cause problems of premature expansion.
\begingroup
\lccode`\&=0 \catcode`\&=7
-\skvnewgdef\skvifbraced#1{%
+\skvnewgdef\skvifbracedTF#1{%
\expandafter\skv@ifbraced@a\expandafter{%
\romannumeral-`\q\skv@ifbraced@b.#1& &%
}%
@@ -748,15 +848,15 @@
\skvnewgdef\skv@ifbraced@a#1{\skv@ifbraced@d#1\brace@nil{#1}}
\skvnewgdef\skv@ifbraced@b#1 &{\skv@ifbraced@c#1&}
\skvnewgdef\skv@ifbraced@c#1&#2{%
- \expandafter\skvifldspace\expandafter{\@gobble#1}%
+ \expandafter\skvifldspaceTF\expandafter{\@gobble#1}%
{\@gobble#1}{\expandafter\@space\@gobble#1}%
}
\skvnewgdef\skv@ifbraced@d#1\brace@nil#2{%
- \skvifstrcmp{#1}{#2}\@secondoftwo\@firstoftwo
+ \skvifstrcmpTF{#1}{#2}\@secondoftwo\@firstoftwo
}
\endgroup
-\skvnewdef\skvifnotbraced#1{\skvifbraced{#1}\@secondoftwo\@firstoftwo}
+\skvnewdef\skvifbracedFT#1{\skvifbracedTF{#1}\@secondoftwo\@firstoftwo}
% \skvstripouterbraces{<nr>}<cmd>
\skvrobustdef*\skvstripouterbraces#1#2{%
@@ -766,7 +866,7 @@
}
\skvrobustdef*\skv@stripouterbraces#1\strip@nil#2#3{%
\advance\@tempcnta\@ne
- \skvifnum\@tempcnta=#3{%
+ \skvifnumTF\@tempcnta=#3{%
\edef#2{\unexpanded{#1}}%
\skvaftergroupdef#2\endgroup
}{%
@@ -774,19 +874,19 @@
}%
}
-\skvrobustdef*\skvifescaped#1{%
+\skvrobustdef*\skvifescapedTF#1{%
\begingroup\escapechar92\relax
\edef\x{\expandafter\skv@car\string#1x\car@nil}%
\expandafter\endgroup
\csname @\ifx\x\@backslashchar first\else second\fi oftwo\endcsname
}
-\skvnewdef\skvifnotescaped#1{\skvifescaped{#1}\@secondoftwo\@firstoftwo}
+\skvnewdef\skvifnotescaped#1{\skvifescapedTF{#1}\@secondoftwo\@firstoftwo}
\skvnewdef*\skvremovescape#1{\expandafter\@gobble\string#1}
\skvnewdef*\skvgobblescape#1{%
- \skvifblank{#1}{}{%
- \skvifnum\escapechar>255{\string#1}{%
- \skvifnum\escapechar<0{\string#1}{%
- \skvifnum\escapechar=32{%
+ \skvifblankTF{#1}{}{%
+ \skvifnumTF\escapechar>255{\string#1}{%
+ \skvifnumTF\escapechar<0{\string#1}{%
+ \skvifnumTF\escapechar=32{%
\expandafter\@gobblespace\string#1%
}{%
\skvremovescape{#1}%
@@ -828,15 +928,15 @@
\expandafter\skvswap\expandafter{\expandafter{#2}}{#1}%
}
\skvnewlet\skvexpbracenext\skvexpandbracenext
-\skvrobustdef*\skvifin#1#2{%
+\skvrobustdef*\skvifinTF#1#2{%
\skv@in@{#1}{#2}%
\csname @\ifin@ first\else second\fi oftwo\endcsname
}
-\skvrobustdef*\skvifnotin#1#2{\skvifin{#1}{#2}\@secondoftwo\@firstoftwo}
-\skvrobustdef*\skvxifin#1#2{\skvexpandtwoargs\skvifin{#1}{#2}}
-\skvrobustdef*\skvxifnotin#1#2{\skvxifin{#1}{#2}\@secondoftwo\@firstoftwo}
-\skvrobustdef*\skvifindetok#1#2#3{%
- \skvexpandtwoargs\skvifin{#1\skvoxdetok{#2}#1}{#1\skvoxdetok{#3}#1}%
+\skvrobustdef*\skvifinFT#1#2{\skvifinTF{#1}{#2}\@secondoftwo\@firstoftwo}
+\skvrobustdef*\skvxifinTF#1#2{\skvexpandtwoargs\skvifinTF{#1}{#2}}
+\skvrobustdef*\skvxifinFT#1#2{\skvxifinTF{#1}{#2}\@secondoftwo\@firstoftwo}
+\skvrobustdef*\skvifindetokTF#1#2#3{%
+ \skvexpandtwoargs\skvifinTF{#1\skvoxdetok{#2}#1}{#1\skvoxdetok{#3}#1}%
}
\skvnewdef\skviffound#1\in#2\then{\skv@in@{#1}{#2}\ifin@}
\skvnewdef\skvxiffound#1\in#2\then{\skvexpandtwoargs\skv@in@{#1}{#2}\ifin@}
@@ -849,6 +949,7 @@
}%
\skv@tempa#1==\skv@kvsplit
}
+\skvrobustdef*\skv@kvosplit#1{\skvexpbracenext\skv@kvsplit{#1}}
% \skv@slsplit{<slashlist>}{<parametered.callback>}
\skvrobustdef*\skv@slsplit#1#2{%
\begingroup
@@ -857,6 +958,8 @@
}%
\skv@tempa#1/^skv^/^skv^/^skv^/^skv^/^skv^/^skv^/^skv^/\skv@slsplit
}
+\skvnewlet\skv@slashsplit\skv@slsplit
+\skvrobustdef*\skv@slosplit#1{\skvexpbracenext\skv@slsplit{#1}}
\skvrobustdef*\skv@rescan#1{%
\begingroup
@@ -869,15 +972,15 @@
\expandafter\reserved@a\scantokens\expandafter{#1}%
}
-\skvnewdef*\skvifdigitpresent#1{%
- \skvifcond\if0\skvifblank{#1}{1}{\skv@ifdigitpresent#1\skv@nnil}\fi
+\skvnewdef*\skvifdigitpresentTF#1{%
+ \skvifcondTF\if0\skvifblankTF{#1}{1}{\skv@ifdigitpresent#1\skv@nnil}\fi
}
\skvnewdef*\skv@ifdigitpresent#1{%
- \skvifx#1\skv@nnil{%
+ \skvifxTF#1\skv@nnil{%
1%
}{%
- \skvifnum`#1>47{%
- \skvifnum`#1<58{%
+ \skvifnumTF`#1>47{%
+ \skvifnumTF`#1<58{%
0\skv@removetonnil
}{%
\skv@ifdigitpresent
@@ -888,13 +991,13 @@
}%
}
-\skvnewdef*\skvifalldigit#1{%
- \skvifcond\if0\skvifblank{#1}{1}{\skv@ifalldigit#1\skv@nnil}\fi
+\skvnewdef*\skvifalldigitTF#1{%
+ \skvifcondTF\if0\skvifblankTF{#1}{1}{\skv@ifalldigit#1\skv@nnil}\fi
}
\skvnewdef*\skv@ifalldigit#1{%
- \skvifx#1\skv@nnil{0}{%
- \skvifnum`#1>47{%
- \skvifnum`#1<58{%
+ \skvifxTF#1\skv@nnil{0}{%
+ \skvifnumTF`#1>47{%
+ \skvifnumTF`#1<58{%
\skv@ifalldigit
}{%
1\skv@removetonnil
@@ -905,15 +1008,15 @@
}%
}
-\skvnewdef*\skvifalphapresent#1{%
- \skvifcond\if0\skvifblank{#1}{1}{\skv@ifalphapresent#1\skv@nnil}\fi
+\skvnewdef*\skvifalphapresentTF#1{%
+ \skvifcondTF\if0\skvifblankTF{#1}{1}{\skv@ifalphapresent#1\skv@nnil}\fi
}
\skvnewdef*\skv@ifalphapresent#1{%
- \skvifx#1\skv@nnil{%
+ \skvifxTF#1\skv@nnil{%
1%
}{%
- \skvifnum`#1>96{%
- \skvifnum`#1<123{%
+ \skvifnumTF`#1>96{%
+ \skvifnumTF`#1<123{%
0\skv@removetonnil
}{%
\skv@ifalphapresent
@@ -923,15 +1026,15 @@
}%
}%
}
-\skvnewdef*\skvifAlphapresent#1{%
- \skvifcond\if0\skvifblank{#1}{1}{\skv@ifAlphapresent#1\skv@nnil}\fi
+\skvnewdef*\skvifAlphapresentTF#1{%
+ \skvifcondTF\if0\skvifblankTF{#1}{1}{\skv@ifAlphapresent#1\skv@nnil}\fi
}
\skvnewdef*\skv@ifAlphapresent#1{%
- \skvifx#1\skv@nnil{%
+ \skvifxTF#1\skv@nnil{%
1%
}{%
- \skvifnum`#1>64{%
- \skvifnum`#1<91{%
+ \skvifnumTF`#1>64{%
+ \skvifnumTF`#1<91{%
0\skv@removetonnil
}{%
\skv@ifAlphapresent
@@ -941,12 +1044,12 @@
}%
}%
}
-\skvnewdef*\skvifprimitive#1{%
+\skvnewdef*\skvifprimitiveTF#1{%
\expandafter\skv@ifprimitive\meaning#1\relax
}
\skvnewdef*\skv@ifprimitive#1#2\relax{%
- \skvifcond\if#1\@backslashchar\fi{%
- \skvifdigitpresent{#2}\@secondoftwo\@firstoftwo
+ \skvifcondTF\if#1\@backslashchar\fi{%
+ \skvifdigitpresentTF{#2}\@secondoftwo\@firstoftwo
}{%
\@secondoftwo
}%
@@ -959,13 +1062,13 @@
\def\x##1{\skvnoexpandcs{skv@\skvremovescape#1test@##1}}%
\edef\x{\endgroup
\def\noexpand#2####1{%
- \unexpanded{\skvifx#1{##1}\@secondoftwo}{%
- \unexpanded{\skvifprimitive{##1}\@secondoftwo}%
+ \unexpanded{\skvifxTF#1{##1}\@secondoftwo}{%
+ \unexpanded{\skvifprimitiveTF{##1}\@secondoftwo}%
{\noexpand\expandafter\x{a}\noexpand\meaning####1:&}%
}%
}%
\def\x{a}####1:####2&{\x{b}####1\string#1&}%
- \def\x{b}####1\string#1####2&{\noexpand\skvifblank{####1}}%
+ \def\x{b}####1\string#1####2&{\noexpand\skvifblankTF{####1}}%
}\x
}
\endgroup
@@ -983,15 +1086,16 @@
}
% If all the tokens are digits or arithmetic:
-\skvnewdef*\skvifallarithmetic#1{%
+\skvnewdef*\skvifallarithmeticTF#1{%
\begingroup
\skv@swatrue
\skvifdimensionable{#1}{}{%
\ifskv@isinteger\else
\def\do##1##2{%
\ifx\do##1\else
- \skvifin{##1}{0123456789.+-*/()}{}{%
- \skvifin{,##1##2,}{,em,ex,in,pt,pc,cm,mm,dd,cc,nd,nc,bp,sp,}{}{%
+ \skvifinTF{##1}{0123456789.+-*/()}{}{%
+ \skvifinTF{,##1##2,}
+ {,em,ex,in,pt,pc,cm,mm,dd,cc,nd,nc,bp,sp,}{}{%
\skv@swafalse
\def\do####1\skvrelax{}%
}%
@@ -1032,7 +1136,7 @@
\skvnewregister\bool\ifskv@isinteger
-% In case the argument of \skvifinteger containes \numexpr:
+% In case the argument of \skvifintegerTF containes \numexpr:
\skvnewlet\skv@catch@nil\relax
% #1: Essence, #2: Test token
\skvrobustdef*\skvensureinteger#1#2{%
@@ -1050,34 +1154,34 @@
\skvrobustdef*\skv@catchremainder#1\skv@catch@nil{%
\endgroup\def\skv@elt{#1}%
}
-\skvrobustdef*\skvifinteger#1{%
+\skvrobustdef*\skvifintegerTF#1{%
\begingroup
% Don't try '\numexpr0+#1' here:
\afterassignment\skv@catchremainder
\@tempcnta\numexpr0#1\relax\skv@catch@nil
- \skvifx\skv@elt\@empty{%
+ \skvifxTF\skv@elt\@empty{%
\@firstoftwo
}{%
- \skvifx\skv@elt\skv@relaxtoks\@firstoftwo\@secondoftwo
+ \skvifxTF\skv@elt\skv@relaxtoks\@firstoftwo\@secondoftwo
}%
}
-\skvrobustdef\skvoifinteger{\skvexpbracenext\skvifinteger}
+\skvrobustdef\skvoifinteger{\skvexpbracenext\skvifintegerTF}
\skvrobustdef\skvifdimensionable#1{%
\def\skv@dimunit{}%
% Does 'pt' mean 0pt or 1pt? Make it an invalid input:
- \lowercase{\skvifindetok{,}{#1}}\skv@validunit{%
+ \lowercase{\skvifindetokTF{,}{#1}}\skv@validunit{%
\@latexerr{Illegal step '#1': no number found with it}\@ehd
}{}%
\skv@isintegerfalse
- \skvifinteger{#1}{%
+ \skvifintegerTF{#1}{%
\skv@isintegertrue\@secondoftwo
}{%
\expandafter\skv@ifdimensionable\skv@elt\skv@catch@nil
}%
}
\skvrobustdef\skv@ifdimensionable#1#2\skv@catch@nil{%
- \skvifx\relax#1{%
- \skvifblank{#2}{%
+ \skvifxTF\relax#1{%
+ \skvifblankTF{#2}{%
\skv@isintegertrue\@secondoftwo
}{%
\expandafter\skv@findunit\skv@elt\skv@catch@nil
@@ -1098,7 +1202,7 @@
\expandafter\@secondoftwo
\fi
}%
- \skvifstrcmp{.}{#1}{%
+ \skvifstrcmpTF{.}{#1}{%
% In this case, #1 must have come with a trailing \relax.
% Remove it and re-start the test:
\def\skv@prova##1##2\relax\skv@catch@nil{%
@@ -1107,13 +1211,13 @@
\skv@prova#2#3\skv@catch@nil
}{%
% Check for a valid unit. May be a \dimendef'd token.
- \skvifin{,#1,}{,\hsize,\vsize,}{%
+ \skvifinTF{,#1,}{,\hsize,\vsize,}{%
\skv@provb
}{%
\skvifdimen{#1}{%
\skv@provb
}{%
- \lowercase{\skvifindetok{,}{#1#2}}\skv@validunit{%
+ \lowercase{\skvifindetokTF{,}{#1#2}}\skv@validunit{%
\def\skv@dimunit{#1#2}%
% Check if #3 has only one (leading) \relax:
\def\skv@prova##1##2##3\skv@catch@nil{%
@@ -1167,66 +1271,66 @@
\skv@dimexpr@true\skv@dimexpr@false
}
\skvrobustdef*\skv@dimexpr@end@end{%
- \skvifnum\@tempcnta<\skvz@
+ \skvifnumTF\@tempcnta<\skvz@
{\endgroup\@secondoftwo}{\endgroup\@firstoftwo}%
}
\skvrobustdef*\skv@dimexpr@true{\advance\@tempcnta\skvz@}
\skvrobustdef*\skv@dimexpr@false{\advance\@tempcnta\m@ne}
\skvrobustdef*\skv@dimexpr@bgroup#1(#2\skv@catch@nil{%
\skv@dimexpr@egroup#1)\skv@catch@nil
- \skvifblank{#2}{}{%
+ \skvifblankTF{#2}{}{%
\skv@dimexpr@beg
\skv@dimexpr@bgroup#2\skv@catch@nil
}%
}
\skvrobustdef*\skv@dimexpr@egroup#1)#2\skv@catch@nil{%
\skv@dimexpr@plus#1+\skv@catch@nil
- \skvifblank{#2}{}{%
+ \skvifblankTF{#2}{}{%
\skv@dimexpr@end
\skv@dimexpr@egroup#2\skv@catch@nil
}%
}
\skvrobustdef*\skv@dimexpr@plus#1+#2\skv@catch@nil{%
\skv@dimexpr@minus#1-\skv@catch@nil
- \skvifblank{#2}{}{\skv@dimexpr@plus#2\skv@catch@nil}%
+ \skvifblankTF{#2}{}{\skv@dimexpr@plus#2\skv@catch@nil}%
}
\skvrobustdef*\skv@dimexpr@minus#1-#2\skv@catch@nil{%
- \skvifblank{#1}{}{%
- \skvifin{*}{#1}{%
- \skvifin{/}{#1}{%
+ \skvifblankTF{#1}{}{%
+ \skvifinTF{*}{#1}{%
+ \skvifinTF{/}{#1}{%
\skv@err{I can't parse this: both star (*) and slash
\MessageBreak (/) are in '#1'}\@ehd
}{%
- \skvifblank{#1}{}{\skv@dimexpr@times#1*\skv@catch@nil}%
+ \skvifblankTF{#1}{}{\skv@dimexpr@times#1*\skv@catch@nil}%
}%
}{%
- \skvifblank{#1}{}{\skv@dimexpr@divide#1/\skv@catch@nil}%
+ \skvifblankTF{#1}{}{\skv@dimexpr@divide#1/\skv@catch@nil}%
}%
}%
- \skvifblank{#2}{}{\skv@dimexpr@minus#2\skv@catch@nil}%
+ \skvifblankTF{#2}{}{\skv@dimexpr@minus#2\skv@catch@nil}%
}
% Because of, eg, 2pt*3/2, the test for * is more subtle:
\skvrobustdef*\skv@dimexpr@times#1*#2\skv@catch@nil{%
- \skvifblank{#1}{}{%
+ \skvifblankTF{#1}{}{%
\skvifdimensionable{#1}\skv@dimexpr@true\skv@dimexpr@false
}%
- \skvifblank{#2}{}{%
+ \skvifblankTF{#2}{}{%
\def\skv@prova##1*##2\skv@catch@nil{##1}%
\skvexpbracenext\skv@dimexpr@integer{\skv@prova#2\skv@catch@nil}%
}%
}
\skvrobustdef*\skv@dimexpr@divide#1/#2\skv@catch@nil{%
- \skvifblank{#1}{}{%
+ \skvifblankTF{#1}{}{%
\skvifdimensionable{#1}\skv@dimexpr@true\skv@dimexpr@false
}%
- \skvifblank{#2}{}{%
+ \skvifblankTF{#2}{}{%
\def\skv@prova##1/##2\skv@catch@nil{##1}%
\skvexpbracenext\skv@dimexpr@integer{\skv@prova#2\skv@catch@nil}%
}%
}
\skvrobustdef*\skv@dimexpr@integer#1{%
- \skvifblank{#1}{}{%
- \skvifinteger{#1}\skv@dimexpr@true\skv@dimexpr@false
+ \skvifblankTF{#1}{}{%
+ \skvifintegerTF{#1}\skv@dimexpr@true\skv@dimexpr@false
}%
}
@@ -1235,7 +1339,7 @@
\begingroup
% The following \relax will not be cat-12, so it won't appear in #2:
\def\skv@trim@a{%
- \skvxifin{\detokenize{#1}\relax}{\skvoxdetok{#2}\relax}{%
+ \skvxifinTF{\detokenize{#1}\relax}{\skvoxdetok{#2}\relax}{%
\def\skv@trim@b####1#1\normal@nil{%
\edef#2{\unexpanded{####1}}%
\skv@trim@a
@@ -1263,7 +1367,7 @@
{\romannumeral-`\q\skv@tsvnormalize.#1 \normal@nil}%
}
\skvnewdef*\skv@tsvnormalize#1 #2\normal@nil{%
- \skvifblank{#2}
+ \skvifblankTF{#2}
{\expandafter\expandafter\expandafter\space
\expandafter\noexpand\@gobble#1}
{\skv@tsvnormalize#1#2\normal@nil}%
@@ -1337,8 +1441,8 @@
\skv@activeparser#1##1#1~\normal@nil}%
}%
\def\skv@activeparser##1~##2\normal@nil{%
- \skvifblank{##2}{%
- \skvifswitch{inkv}{%
+ \skvifblankTF{##2}{%
+ \skvifdefswitchTF{inkv}{%
\skv@activeequal##1!\normal@nil
}{%
\skv@spaceparser##1 #1\normal@nil
@@ -1348,7 +1452,7 @@
}%
}%
\def\skv@activeequal##1!##2\normal@nil{%
- \skvifblank{##2}{%
+ \skvifblankTF{##2}{%
\skv@spaceparser##1 #1\normal@nil
}{%
\skv@activeequal##1=##2\normal@nil
@@ -1356,15 +1460,15 @@
}%
}%
\def\skv@spaceparser##1 #1##2\normal@nil{%
- \skvifblank{##2}{%
+ \skvifblankTF{##2}{%
\skv@parserspace##1#1 \normal@nil
}{%
\skv@spaceparser##1#1##2\normal@nil
}%
}%
\def\skv@parserspace##1#1 ##2\normal@nil{%
- \skvifblank{##2}{%
- \skvifswitch{inkv}{%
+ \skvifblankTF{##2}{%
+ \skvifdefswitchTF{inkv}{%
\skv@spaceequal##1 =\normal@nil
}{%
\skv@doubleparser##1#1#1\normal@nil
@@ -1374,25 +1478,25 @@
}%
}%
\def\skv@spaceequal##1 =##2\normal@nil{%
- \skvifblank{##2}{%
+ \skvifblankTF{##2}{%
\skv@equalspace##1= \normal@nil
}{%
\skv@spaceequal##1=##2\normal@nil
}%
}%
\def\skv@equalspace##1= ##2\normal@nil{%
- \skvifblank{##2}{%
+ \skvifblankTF{##2}{%
\skv@doubleparser##1#1#1\normal@nil
}{%
\skv@equalspace##1=##2\normal@nil
}%
}%
\def\skv@doubleparser##1#1#1##2\normal@nil{%
- \skvifblank{##2}{%
- \skvifswitch{inkv}{%
+ \skvifblankTF{##2}{%
+ \skvifdefswitchTF{inkv}{%
\skv@doubleequal##1==\normal@nil
}{%
- \skvifblank{##1}{}{%
+ \skvifblankTF{##1}{}{%
\skv@remleadparser##1\normal@nil
}%
}%
@@ -1401,8 +1505,8 @@
}%
}%
\def\skv@doubleequal##1==##2\normal@nil{%
- \skvifblank{##2}{%
- \skvifblank{##1}{}{%
+ \skvifblankTF{##2}{%
+ \skvifblankTF{##1}{}{%
\skv@remleadparser##1\normal@nil
}%
}{%
@@ -1413,7 +1517,7 @@
\expandafter\space\noexpand##1%
}%
\def\skv@parserequalerr##1#1=##2\normal@nil{%
- \skvifblank{##2}{}{%
+ \skvifblankTF{##2}{}{%
\skv@err{There is '#1=' in your key-value list}\@ehd
}%
}%
@@ -1431,19 +1535,19 @@
\skv@activeslash#1~\normal@nil}%
}%
\skvnewdef\skv@activeslash#1~#2\normal@nil{%
- \skvifblank{#2}
+ \skvifblankTF{#2}
{\skv@spaceslash#1 /\normal@nil}
{\skv@activeslash#1/#2\normal@nil}%
}%
}
\skvnewdef\skv@spaceslash#1 /#2\normal@nil{%
- \skvifblank{#2}
+ \skvifblankTF{#2}
{\skv@slashspace#1/ \normal@nil}
{\skv@spaceslash#1/#2\normal@nil}%
}
\skvnewdef\skv@slashspace#1/ #2\normal@nil{%
- \skvifblank{#2}
- {\skvifblank{#1}{}{\expandafter\space\noexpand#1}}
+ \skvifblankTF{#2}
+ {\skvifblankTF{#1}{}{\expandafter\space\noexpand#1}}
{\skv@slashspace#1/#2\normal@nil}%
}
@@ -1468,17 +1572,17 @@
\skv@mac@spaceparser##1 #1\normal@nil}%
}%
\long\def\skv@mac@spaceparser##1 #1##2\normal@nil{%
- \skvifblank{##2}
+ \skvifblankTF{##2}
{\skv@mac@parserspace##1#1 \normal@nil}
{\skv@mac@spaceparser##1#1##2\normal@nil}%
}%
\long\def\skv@mac@parserspace##1#1 ##2\normal@nil{%
- \skvifblank{##2}
+ \skvifblankTF{##2}
{\skv@mac@doubleparser##1#1#1\normal@nil}
{\skv@mac@parserspace##1#1##2\normal@nil}%
}%
\long\def\skv@mac@doubleparser##1#1#1##2\normal@nil{%
- \skvifblank{##2}{ ##1}
+ \skvifblankTF{##2}{ ##1}
{\skv@mac@doubleparser##1#1##2\normal@nil}%
}%
}
@@ -1488,7 +1592,7 @@
\begingroup
\def\skv@prova##1{\skvremovescape{##1}@skv@\romannumeral#3}%
\def\do##1{\let\noexpand##1\skvnoexpandcs{\skv@prova{##1}}}%
- \skvifcsdef{\skvremovescape{#1}@skv@stack}{}{%
+ \skvifcsdefTF{\skvremovescape{#1}@skv@stack}{}{%
\skvcsdef{\skvremovescape{#1}@skv@stack}{}%
}%
\skvcsxdef{\skvremovescape{#1}@skv@stack}{%
@@ -1501,7 +1605,7 @@
\skvrobustdef*\skvpopfunctions#1#2{%
\begingroup
\edef\skv@elt{\skvnoexpandcs{\skvremovescape{#1}@skv@stack}}%
- \expandafter\skvifdef\skv@elt{%
+ \expandafter\skvifdefTF\skv@elt{%
\expandafter\ifx\skv@elt\@empty
\skv@err{Stack of '\noexpand#1' is empty}\@ehd
\fi
@@ -1528,7 +1632,7 @@
\def\skv@loop{%
\advance\@tempcnta\@ne
% Don't use \ifnum here, because #2 may contain booleans.
- \skvifnum\@tempcnta<\numexpr#3+1\relax{%
+ \skvifnumTF\@tempcnta<\numexpr#3+1\relax{%
\edef#1{\skvexpandonce#1.\romannumeral\@tempcnta.{#2}}%
\skv@loop
}{}%
@@ -1572,7 +1676,7 @@
\skvcsvnormalize\skv@prova
\def\do##1,{%
\ifx\do##1\else
- \skvifcsdef{if#1##1}{%
+ \skvifcsdefTF{if#1##1}{%
\skv@err{Boolean '\skvnoexpandcs{if#1##1}' already exists}\@ehd
}{%
\toks@\expandafter{\the\expandafter\toks@
@@ -1588,12 +1692,12 @@
% Some checks are done in that section.
\skvnewbools[skv@]{%
- inset,st,cl,pl,kf,inpox,prepo,tracingkeys,swa,swb,%
+ inset,st,cl,pl,kf,inpox,prepo,tracingkeys,swa,swb,verbose,%
intry,insa,success,inoptionsec,inopt,handlerswa,handlerswb%
}
-\skvnewbools{indirkeys}
-\skvnewbools[skv]{indef,novalue,valuebraced}
+%\skvnewbools{indirkeys}
+\skvnewbools[skv]{indef,indirkeys,novalue,valuebraced}
\skvnewbools[dirkeys@]{saveunknownkeys}
\skvrobustdef*\skvnewcounts{\skv@testopt\skv@newcounts{}}
@@ -1604,7 +1708,7 @@
\skvcsvnormalize\skv@prova
\def\do##1,{%
\ifx\do##1\else
- \skvifcsdef{#1##1}{%
+ \skvifcsdefTF{#1##1}{%
\skv@err{Counter '\skvnoexpandcs{#1##1}' already exists}\@ehd
}{%
\toks@\expandafter{\the\expandafter\toks@
@@ -1626,7 +1730,7 @@
\skvcsvnormalize\skv@prova
\def\do##1,{%
\ifx\do##1\else
- \skvifcsdef{#1##1}{%
+ \skvifcsdefTF{#1##1}{%
\skv@err{Number '\skvnoexpandcs{#1##1}' already exists}\@ehd
}{%
\toks@\expandafter{\the\expandafter\toks@
@@ -1655,16 +1759,16 @@
% 3. Package and class options can't be passed via quick keys.
% 4. When defining keys, the syntax of <list> is:
%
-% {<key1,key2,etc>}/{<default>}/{<callback>}/{<choice list>}/{<arg>}
+% {<keya-1,...,keya-n>}/{<default>}/{<callback>}/{<choice list>}/{<arg>}
% ;...;
-% {<key-n>}/{<default>}/{<callback>}/{<choice list>}/{<arg>}
+% {<keyb-1,...,keyb-n>}/{<default>}/{<callback>}/{<choice list>}/{<arg>}
%
% Here, keys key1 and key2 will have the same default value, callback,
% choice list and argument pattern.
%
-% 5. The special key '.exec' will simply execute the code <default>,
-% without defining anything.
-% 6. Use .na to indicate a missing item that isn't blank.
+% 5. The special keys '.exec' and '.exec code' will simply execute the
+% code <default>, without defining anything.
+% 6. Use .na to indicate a missing item that isn't blank or empty.
%
% Example:
% \quickkeys.define{fam}[mp@]{%
@@ -1673,36 +1777,73 @@
% keyc,keyd/aaa+bbb/\def\x##1{#1*##1*#2}/.na/#1+#2;
% }
%
-\skvnewdef*\skv@ifrejorempty#1{%
- \skvifstrcmp{#1}{^skv^}{%
+\skvnewdef*\skv@ifstrrejorempty#1{%
+ \skvifstrcmpTF{#1}{^skv^}{%
\@firstoftwo
}{%
- \skvifblank{#1}{%
+ \skvifblankTF{#1}{%
\@firstoftwo
}{%
\@secondoftwo
}%
}%
}
-\skvnewdef*\skv@ifrejorna#1{%
- \skvifstrcmp{#1}{^skv^}{%
+\skvnewdef*\skv@ifstrrejordotna#1{%
+ \skvifstrcmpTF{#1}{^skv^}{%
\@firstoftwo
}{%
- \skvifstrcmp{#1}{.na}{%
+ \skvifstrcmpTF{#1}{.na}{%
\@firstoftwo
}{%
\@secondoftwo
}%
}%
}
-\skvnewdef*\skv@ifrejornaorempty#1{%
- \skvifstrcmp{#1}{^skv^}{%
+\skvnewdef*\skv@ifstrnut#1{%
+ \skvifstrcmpTF{#1}{^skv^}{%
\@firstoftwo
}{%
- \skvifstrcmp{#1}{.na}{%
+ \skvifstrcmpTF{#1}{.na}{%
\@firstoftwo
}{%
- \skvifblank{#1}{%
+ \skvifblankTF{#1}{%
+ \@firstoftwo
+ }{%
+ \@secondoftwo
+ }%
+ }%
+ }%
+}
+\skvnewdef*\skv@ifcmdrejorempty#1{%
+ \skvifxTF#1\skv@rej{%
+ \@firstoftwo
+ }{%
+ \skvifemptyTF#1{%
+ \@firstoftwo
+ }{%
+ \@secondoftwo
+ }%
+ }%
+}
+\skvnewdef*\skv@ifcmdrejordotna#1{%
+ \skvifxTF#1\skv@rej{%
+ \@firstoftwo
+ }{%
+ \skvifxTF#1\skv@dotna{%
+ \@firstoftwo
+ }{%
+ \@secondoftwo
+ }%
+ }%
+}
+\skvnewdef*\skv@ifcmdnut#1{%
+ \skvifxTF#1\skv@rej{%
+ \@firstoftwo
+ }{%
+ \skvifxTF#1\skv@dotna{%
+ \@firstoftwo
+ }{%
+ \skvifemptyTF#1{%
\@firstoftwo
}{%
\@secondoftwo
@@ -1713,11 +1854,11 @@
\skvrobustdef*\quickkeys#1#{%
\edef\skv@tempa{\skvtrimspace{#1}}%
- \skvxifstrcmp{\skvexpandonce\skv@tempa}{.define}{%
+ \skvxifstrcmpTF{\skvexpandonce\skv@tempa}{.define}{%
\begingroup\endlinechar\m@ne
\skv@defquickkeys
}{%
- \skvxifstrcmp{\skvexpandonce\skv@tempa}{.set}{%
+ \skvxifstrcmpTF{\skvexpandonce\skv@tempa}{.set}{%
\skv@setquickkeys
}{%
\skv@err{Unknown task for \string\quickkeys}\@ehd
@@ -1729,26 +1870,26 @@
\endgroup
\edef\skv@tempa{\skvkeepdoubleslashnormalize{#3}}%
\def\skv@defquickkeys@b##1/##2/##3/##4/##5/##6/##7/##8/##9\skv@nil{%
- \skvifin{,##1,}{,.exec,.exec code,}{%
+ \skvifinTF{,##1,}{,.exec,.exec code,}{%
##2\relax
}{%
% Loop over key list, if there are more than one key:
\skvparselist{,}{##1}\skv@tempa{%
% If ##2 is empty, the default will be empty:
- \skv@ifrejorna{##2}{}{%
+ \skv@ifstrrejordotna{##2}{}{%
\skvcsedef{#1/\skv@tempa/qkeys.def}{\unexpanded{##2}}%
}%
\skvcsedef{#1/\skv@tempa/qkeys.cbk}{%
% ##3 may be empty:
- \skv@ifrejorna{##3}{}{\unexpanded{##3}}%
+ \skv@ifstrrejordotna{##3}{}{\unexpanded{##3}}%
}%
- \skv@ifrejornaorempty{##4}{}{%
+ \skv@ifstrnut{##4}{}{%
\skvcsedef{#1/\skv@tempa/qkeys.chc}{\unexpanded{##4}}%
}%
- \skv@ifrejornaorempty{##5}{}{%
+ \skv@ifstrnut{##5}{}{%
\skvcsedef{#1/\skv@tempa/qkeys.arg}{\unexpanded{##5}}%
}%
- \skvifblank{#2}{}{%
+ \skvifblankTF{#2}{}{%
\skvcsedef{#1/\skv@tempa/qkeys.hp}{\unexpanded{#2}}%
}%
}%
@@ -1772,11 +1913,11 @@
\edef\skv@tempa{\unexpanded{#3}}%
\skvkvnormalize\skv@tempa
\def\skv@setqkeys##1##2{%
- \skvifcsdef{#1/##1/qkeys.cbk}{}{%
+ \skvifcsdefTF{#1/##1/qkeys.cbk}{}{%
\skv@err{Key '#1/##1' is not defined}\@ehd
}%
- \skvifstrcmp{##2}\skv@novalue{%
- \skvifcsdef{#1/##1/qkeys.def}{%
+ \skvifstrcmpTF{##2}\skv@novalue{%
+ \skvifcsdefTF{#1/##1/qkeys.def}{%
\skvcsletcs{#1/##1/qkeys.val}{#1/##1/qkeys.def}%
}{%
\skv@err{No user value and no default
@@ -1785,20 +1926,20 @@
}{%
\skvcsedef{#1/##1/qkeys.val}{\unexpanded{##2}}%
}%
- \skvifcsdef{#1/##1/qkeys.chc}{%
+ \skvifcsdefTF{#1/##1/qkeys.chc}{%
\skvletcs\reserved@a{#1/##1/qkeys.chc}%
\edef\reserved@b{\skvexpandcsonce{#1/##1/qkeys.val}}%
- \skvxifin{,\skvoxdetok\reserved@b,}{,\skvoxdetok\reserved@a,}{}{%
+ \skvxifinTF{,\skvoxdetok\reserved@b,}{,\skvoxdetok\reserved@a,}{}{%
\skv@err{Value '\detokenize{##2}' for key '##1'
\MessageBreak is not in prescribed list
\MessageBreak '\skvoxdetok\reserved@a'}\@ehd
}%
}{}%
- \skvifcsdef{#1/##1/qkeys.hp}{%
+ \skvifcsdefTF{#1/##1/qkeys.hp}{%
\skvletcs\reserved@a{#1/##1/qkeys.hp}%
\skvcsletcs{\reserved@a##1}{#1/##1/qkeys.val}%
}{}%
- \skvifcsdef{#1/##1/qkeys.arg}{%
+ \skvifcsdefTF{#1/##1/qkeys.arg}{%
\skvletcs\reserved@a{#1/##1/qkeys.arg}%
}{%
\let\reserved@a\skv@simplearg
@@ -1811,7 +1952,7 @@
\reserved@a\csname#1/##1/qkeys.val\endcsname\quickkeyseov
}%
\def\skv@setquickkeys@c##1=##2=##3\skv@nil{%
- \skvxifin{,\detokenize{##1},}{,\skvoxdetok\skv@qkeysna,}{}{%
+ \skvxifinTF{,\detokenize{##1},}{,\skvoxdetok\skv@qkeysna,}{}{%
\skv@setqkeys{##1}{##2}%
}%
}%
@@ -1841,7 +1982,7 @@
%
% Example:
%
-% \skvifcase\skvifstrcmp{c}
+% \skvifcase\skvifstrcmpTF{c}
% {a}{do a}
% {b}{do b}
% {c}{do c}
@@ -1861,16 +2002,16 @@
%
% Example:
%
-% \skvifexpr{%
-% not ( expr { \skvifdef\xa } and expr { \skvifempty\xa } )
-% or ( expr { \skvifbool{@tempswa} } or expr { \skvifx\xa\xb } )
+% \skvifexprTF{%
+% not ( expr { \skvifdefTF\xa } and expr { \skvifemptyTF\xa } )
+% or ( expr { \skvifboolTF{@tempswa} } or expr { \skvifxTF\xa\xb } )
% }{%
% \def\x{T}
% }{%
% \def\x{F}
% }
\skvnewnumbers[skv@]{exprcnt}
-\skvrobustdef*\skvifexpr#1{%
+\skvrobustdef*\skvifexprTF#1{%
\begingroup
\def\skv@expr@neg{01}%
\skvsetno\skv@exprcnt\skvz@
@@ -1901,45 +2042,45 @@
}
\skvrobustdef\skv@expr@bgroup#1(#2\skv@expr@nil{%
\skv@expr@egroup#1)\skv@expr@nil
- \skvifblank{#2}{}{%
+ \skvifblankTF{#2}{}{%
\skv@expr@beg
\skv@expr@bgroup#2\skv@expr@nil
}%
}
\skvrobustdef\skv@expr@egroup#1)#2\skv@expr@nil{%
\skv@expr@and#1and\skv@expr@nil
- \skvifblank{#2}{}{%
+ \skvifblankTF{#2}{}{%
\skv@expr@end
\skv@expr@egroup#2\skv@expr@nil
}%
}
\skvrobustdef\skv@expr@and#1and#2\skv@expr@nil{%
\skv@expr@or#1or\skv@expr@nil
- \skvifblank{#2}{}{%
+ \skvifblankTF{#2}{}{%
\skv@exprcnt\ifnum\skv@exprcnt<\skvz@\m@ne\else\skvz@\fi
\skv@expr@and#2\skv@expr@nil
}%
}
\skvrobustdef\skv@expr@or#1or#2\skv@expr@nil{%
\skv@expr@not#1not\skv@expr@nil
- \skvifblank{#2}{}{%
+ \skvifblankTF{#2}{}{%
\skv@exprcnt\ifnum\skv@exprcnt<\skvz@\skvz@\else\@ne\fi
\skv@expr@or#2\skv@expr@nil
}%
}
\skvrobustdef\skv@expr@not#1not#2\skv@expr@nil{%
\skv@expr@do#1expr\skv@expr@nil
- \skvifblank{#2}{}{%
+ \skvifblankTF{#2}{}{%
\def\skv@expr@neg{00}%
\skv@expr@not#2\skv@expr@nil
}%
}
\skvrobustdef\skv@expr@do#1expr#2\skv@expr@nil{%
- \skvifblank{#1}{}{%
- \skv@err{Invalid \noexpand\skvifexpr test expression}
+ \skvifblankTF{#1}{}{%
+ \skv@err{Invalid \noexpand\skvifexprTF test expression}
{The handicapped test part is: '\detokenize{#1}'}%
}%
- \skvifblank{#2}{}{\skv@expr@do@a#2\skv@expr@nil}%
+ \skvifblankTF{#2}{}{\skv@expr@do@a#2\skv@expr@nil}%
}
\skvrobustdef\skv@expr@do@a#1#2\skv@expr@nil{%
\ignorespaces#1\skv@expr@true\skv@expr@false
@@ -1947,7 +2088,7 @@
}
\skvnewdef\skvwhileexpr#1\do#2{%
- \skvifcond{#1}\fi{#2\skvwhileexpr{#1}\do{#2}}{}%
+ \skvifcondTF{#1}\fi{#2\skvwhileexpr{#1}\do{#2}}{}%
}
\skvbuildmacrostack\skv@keystate{%
@@ -1958,25 +2099,31 @@
\do\ifskv@inpox\do\ifskv@prepo
}\skv@stackdepthlimit
-\skvbuildmacrostack\dirkeys@state{%
+\skvbuildmacrostack\skv@dirkeys@state{%
\do\dirkeys@prefixlist\do\dirkeys@familylist\do\dirkeys@holderprefixtoks
\do\dirkeys@unknownkeysmacro\do\ifdirkeys@saveunknownkeys
- \do\ifindirkeys
+ \do\ifskvindirkeys\do\ifskvdfk@initialize\do\ifskvdfk@saveinitialvalues
}\skv@stackdepthlimit
-\skvrobustdef*\skvappendtomacro{\skv@testst{\skv@appendtomacro{app}{e}}}
-\skvrobustdef*\skvgappendtomacro{\skv@testst{\skv@appendtomacro{app}{x}}}
-\skvrobustdef*\skvprependtomacro{\skv@testst{\skv@appendtomacro{pre}{e}}}
-\skvrobustdef*\skvgprependtomacro{\skv@testst{\skv@appendtomacro{pre}{x}}}
+\skvrobustdef\skvappto#1#2{%
+ \edef#1{\skvexpandonce{#1}\unexpanded{#2}}%
+}
+\skvrobustdef\skvgappto#1#2{%
+ \xdef#1{\skvexpandonce{#1}\unexpanded{#2}}%
+}
+\skvrobustdef\skvappendtomacro{\skv@testst{\skv@appendtomacro{app}{e}}}
+\skvrobustdef\skvgappendtomacro{\skv@testst{\skv@appendtomacro{app}{x}}}
+\skvrobustdef\skvprependtomacro{\skv@testst{\skv@appendtomacro{pre}{e}}}
+\skvrobustdef\skvgprependtomacro{\skv@testst{\skv@appendtomacro{pre}{x}}}
\skvrobustdef\skv@appendtomacro#1#2#3#4{%
- \skvifescaped{#3}{%
+ \skvifescapedTF{#3}{%
\@nameuse{#2def}#3{%
- \skvifstrcmp{#1}{app}{%
- \skvifdef#3{\skvexpandonce#3}{}%
- \skvifdefbool{skv@tempst}\skvexpandonce\unexpanded{#4}%
+ \skvifstrcmpTF{#1}{app}{%
+ \skvifdefTF#3{\skvexpandonce#3}{}%
+ \skvifdefboolTF{skv@tempst}\skvexpandonce\unexpanded{#4}%
}{%
- \skvifdefbool{skv@tempst}\skvexpandonce\unexpanded{#4}%
- \skvifdef#3{\skvexpandonce#3}{}%
+ \skvifdefboolTF{skv@tempst}\skvexpandonce\unexpanded{#4}%
+ \skvifdefTF#3{\skvexpandonce#3}{}%
}%
}%
}{%
@@ -1987,7 +2134,7 @@
% \skvaddlist{<parser>}{<listitem>}
% This is usually called under \edef.
\skvnewdef*\skvaddlist#1#2{%
- \skvifempty#2{}{\skvexpandonce#2\unexpanded{#1}}%
+ \skvifemptyTF#2{}{\skvexpandonce#2\unexpanded{#1}}%
}
% \skvxaddtolist{<parser>}{<listcmd>}{<newitem>}
\skvrobustdef\skvxaddtolist#1#2#3{%
@@ -1998,18 +2145,18 @@
\skvrobustdef*\skvgaddtolist{\skv@teststopt{\skv@addtolist{\global}},}
\skvrobustdef\skv@addtolist#1[#2]#3#4{%
#1\edef#3{%
- \skvifdef#3{%
- \skvifempty#3{}{\skvexpandonce#3#2}%
+ \skvifdefTF#3{%
+ \skvifemptyTF#3{}{\skvexpandonce#3#2}%
}{}%
- \skvifdefbool{skv@tempst}\skvexpandonce\unexpanded{#4}%
+ \skvifdefboolTF{skv@tempst}\skvexpandonce\unexpanded{#4}%
}%
}
% \skv@declarefilter{<filter.type>}
\skvrobustdef*\skv@declarefilter#1{%
\edef\skv@filter##1##2{%
- \skvifblank{#1}{\let##2=##1}{%
- \skvifx#1\relax{\let##2=##1}{%
- \skvifstrcmp{#1}\nofilter{\let##2=##1}{%
+ \skvifblankTF{#1}{\let##2=##1}{%
+ \skvifxTF#1\relax{\let##2=##1}{%
+ \skvifstrcmpTF{#1}\nofilter{\let##2=##1}{%
\unexpanded{#1}{##1}{##2}%
}%
}%
@@ -2025,7 +2172,7 @@
\skvrobustdef*\skv@filtermergelist#1#2#3{%
\begingroup
\skv@declarefilter{#3}%
- \skvifdef#1{\skvkvnormalize#1}{\def#1{}}%
+ \skvifdefTF#1{\skvkvnormalize#1}{\def#1{}}%
\edef\skv@merga{\unexpanded{#2}}%
\skvkvnormalize\skv@merga
\skvcommaloop*\skv@merga\skv@merga{%
@@ -2054,11 +2201,11 @@
\skvrobustdef*\skvmergelist{\skv@testcl\skv@mergelist}
\skvrobustdef*\skv@mergelist#1#2{%
\begingroup
- \skvifdef#1{\skvkvnormalize#1}{\def#1{}}%
+ \skvifdefTF#1{\skvkvnormalize#1}{\def#1{}}%
\edef\skv@tempa{\unexpanded{#2}}%
\skvkvnormalize\skv@tempa
\skvcommaloop*\skv@tempa\skv@tempa{%
- \skvxifin{,\skvoxdetok\skv@tempa,}{,\skvoxdetok#1,}{}{%
+ \skvxifinTF{,\skvoxdetok\skv@tempa,}{,\skvoxdetok#1,}{}{%
\edef#1{\skvaddlist,#1\skvexpandonce\skv@tempa}%
}%
}%
@@ -2072,12 +2219,14 @@
% than \skvfilterremoveelements.
% \if@tempswa can be used to test if, at the end, anything was
% removed from #1.
-\skvrobustdef*\skvfilterremoveelements{\skv@testcl\skv@filterremoveelements}
+\skvrobustdef*\skvfilterremoveelements{%
+ \skv@testcl\skv@filterremoveelements
+}
\skvrobustdef*\skv@filterremoveelements#1#2#3{%
\begingroup
\let\skv@origlist#1%
\skv@declarefilter{#3}%
- \skvifdef#1{\skvkvnormalize#1}{\def#1{}}%
+ \skvifdefTF#1{\skvkvnormalize#1}{\def#1{}}%
\skvcommaparse{#2}\skv@rema\skv@rema{%
\skv@filter\skv@rema\skv@remb
\let\skv@remc#1\let#1\@empty
@@ -2107,12 +2256,12 @@
\skvrobustdef\skv@removeelements#1#2{%
\begingroup
\let\skv@origlist#1%
- \skvifdef#1{}{\def#1{}}%
+ \skvifdefTF#1{}{\def#1{}}%
\edef\skv@rema{\unexpanded{#2}}%
\skvcsvnormalize\skv@rema
\let\skv@remb#1\let#1\@empty
\skvcommaparse*\skv@remb\skv@tempa{%
- \skvxifin{,\skvoxdetok\skv@tempa,}{,\skvoxdetok\skv@rema,}{}{%
+ \skvxifinTF{,\skvoxdetok\skv@tempa,}{,\skvoxdetok\skv@rema,}{}{%
\edef#1{\skvaddlist,#1\skvexpandonce\skv@tempa}%
}%
}%
@@ -2138,11 +2287,13 @@
% Example:
% \def\cmd{a = 1 , b = 2 , c = 3}
% \skvfilterreplaceelements\cmd{{a = 1}{x = 1},{c = 3}{z=3}}\skv@getkeyname
-\skvrobustdef*\skvfilterreplaceelements{\skv@testcl\skv@filterreplaceelements}
+\skvrobustdef*\skvfilterreplaceelements{%
+ \skv@testcl\skv@filterreplaceelements
+}
\skvrobustdef*\skv@filterreplaceelements#1#2#3{%
\begingroup
\skv@declarefilter{#3}%
- \skvifdef#1{\skvkvnormalize#1}{\def#1{}}%
+ \skvifdefTF#1{\skvkvnormalize#1}{\def#1{}}%
\def\do##1##2\skv@nil{%
\ifx#3\skv@getkeyname
\def\@do####1=####2=####3\skv@nil####4{%
@@ -2189,24 +2340,30 @@
\skv@prefix\ifx\skvcurrentfamily\@empty\else\skvcurrentfamily/\fi
}%
}
+\skvrobustdef*\skvdefaultprefix#1{\edef\skv@defaultpref{#1}}
+\skvdefaultprefix{KV}
\skvrobustdef*\skv@testopta#1{%
\skvifstar
{\skv@sttrue\skv@t@stopta{#1}}{\skv@stfalse\skv@t@stopta{#1}}%
}
\skvrobustdef*\skv@t@stopta#1{\skvifplus{\skv@pltrue#1}{\skv@plfalse#1}}
-\skvrobustdef*\skv@testoptb#1{\skv@testopt{\skv@t@stoptb{#1}}{KV}}
+\skvrobustdef*\skv@testoptb#1{%
+ \skv@testopt{\skv@t@stoptb{#1}}\skv@defaultpref
+}
\skvrobustdef*\skv@t@stoptb#1[#2]#3{%
\skv@makeprefix{#2}\skv@makeheader{#3}#1%
}
-\skvrobustdef*\skv@testoptc#1{\skv@testopt{\skv@t@stoptc{#1}}{KV}}
+\skvrobustdef*\skv@testoptc#1{%
+ \skv@testopt{\skv@t@stoptc{#1}}\skv@defaultpref
+}
\skvrobustdef*\skv@t@stoptc#1[#2]#3{%
- \skvxifin{,}{\detokenize{#2}}{%
+ \skvxifinTF{,}{\detokenize{#2}}{%
\skv@err{Only one prefix is allowed here,
\MessageBreak but you gave '#2'}\@ehd
}{%
\skv@makeprefix{#2}%
\edef\skv@fams{#3}%
- \skvxifin{,}{\detokenize{#3}}{%
+ \skvxifinTF{,}{\detokenize{#3}}{%
\skvcsvnormalize\skv@fams
}{%
\skvdespacecontent\skv@fams
@@ -2214,6 +2371,7 @@
\skv@testopt#1{}%
}%
}
+% \skv@testoptd{<cmd>}{<pre-mp>}
\skvrobustdef*\skv@testoptd#1#2{%
\skv@testoptb{%
\edef\skv@provb{#2\skv@header}%
@@ -2221,6 +2379,7 @@
\expandafter\skv@prova\expandafter{\skv@provb}%
}%
}
+% \skv@t@stoptd{<cmd>}[<mp>]{<key>}
\skvrobustdef*\skv@t@stoptd#1[#2]#3{%
\skvifnextchar[{\skv@sttrue#1{#2}{#3}}{\skv@stfalse#1{#2}{#3}[]}%
}
@@ -2252,15 +2411,15 @@
}
\skvrobustdef*\skv@definedefault#1#2{%
\ifskv@inoptionsec\else
- \skvxifin{,\skvcurrentprefix,}{,skv,SKV,}{%
- \skvxifin{,\skvcurrentfamily,}{,skeyval,}{%
+ \skvxifinTF{,\skvcurrentprefix,}{,skv,SKV,}{%
+ \skvxifinTF{,\skvcurrentfamily,}{,skeyval,}{%
\skv@err{Prefix/family '\skvcurrentprefix/\skvcurrentfamily'
are reserved}\@ehd
}{}%
}{}%
\fi
\ifskv@tracingkeys
- \skvxifin{,#1,}{,\skv@badkeynames,}{%
+ \skvxifinTF{,#1,}{,\skv@badkeynames,}{%
\skv@err{Key name '#1' not allowed}\@ehd
}{}%
\fi
@@ -2285,18 +2444,18 @@
% create 'needini' lists of families.
\skvrobustdef*\skv@recordkey#1#2{%
\begingroup
- \skvifcsundef{\skv@header.@needini}{%
+ \skvifcsdefFT{\skv@header.@needini}{%
\endgroup\skv@swafalse
}{%
\skv@swatrue
- \skvxifin{,#1,}{,\skvexpandcsonce{\skv@header.@needini},}{%
+ \skvxifinTF{,#1,}{,\skvexpandcsonce{\skv@header.@needini},}{%
\edef\skv@tempa{\skvtrimspace{#2}}%
\edef\skv@tempa{%
- #1=\skvoifstrcmp{\skv@tempa}{true}{false}{\skvexpandonce\skv@tempa}%
+ #1=\skvoifstrcmpTF{\skv@tempa}{true}{false}{\skvexpandonce\skv@tempa}%
}%
\skvletcs\skv@tempb{\skv@header.@inikv}%
- \skvifdef\skv@tempb{%
- \skvxifin{,\skvoxdetok\skv@tempa,}{,\skvoxdetok\skv@tempb,}{}{%
+ \skvifdefTF\skv@tempb{%
+ \skvxifinTF{,\skvoxdetok\skv@tempa,}{,\skvoxdetok\skv@tempb,}{}{%
\skvcsedef{\skv@header.@inikv}{%
\skvaddlist,\skv@tempb\skvexpandonce\skv@tempa
}%
@@ -2326,7 +2485,7 @@
\skvrobustdef*\skv@strippointers#1#2{%
\begingroup
\edef#2{%
- \skvifstrcmp{#1}{\skvcurrentkey}
+ \skvifstrcmpTF{#1}{\skvcurrentkey}
{\skvcurrentkey}{\skvtrimspace{#1}}%
}%
\def\skv@prova{\expandafter\skv@findpointer\expandafter}%
@@ -2336,48 +2495,41 @@
% after each call to \skv@findpointer, we want to use the latest
% meaning of #2.
\def\do{}%
+ \def\skv@add##1{%
+ \edef\do{\skvexpandonce\do\unexpanded{##1}}%
+ }%
\skv@prova{#2}{.need value}#2{%
- \def\do{\skvcsdef{\skv@header#2.@ndv}{00}}%
+ \skv@add{\skvcsdef{\skv@header#2.@ndv}{00}}%
}{%
- \skv@prova{#2}{.require value}#2{%
- \def\do{\skvcsdef{\skv@header#2.@ndv}{00}}%
+ \skv@prova{#2}{.forbid value}#2{%
+ \skv@add{\skvcsdef{\skv@header#2.@fbv}{00}}%
}{%
- \skv@prova{#2}{.value required}#2{%
- \def\do{\skvcsdef{\skv@header#2.@ndv}{00}}%
+ \skv@prova{#2}{.expanded}#2{%
+ \edef#2{#2}%
}{%
- \skv@prova{#2}{.forbid value}#2{%
- \def\do{\skvcsdef{\skv@header#2.@fbv}{00}}%
+ \skv@prova{#2}{.expand once}#2{%
+ \edef#2{\skvexpandtwice{#2}}%
}{%
- \skv@prova{#2}{.value forbidden}#2{%
- \def\do{\skvcsdef{\skv@header#2.@fbv}{00}}%
- }{%
- \skv@prova{#2}{.expanded}#2{%
- \edef#2{#2}%
- }{%
- \skv@prova{#2}{.expand once}#2{%
- \edef#2{\skvexpandtwice{#2}}%
- }{%
- \skv@prova{#2}{.expand twice}#2{%
- \edef#2{\skvexpandthrice{#2}}%
- }{}%
- }%
- }%
- }%
+ \skv@prova{#2}{.expand twice}#2{%
+ \edef#2{\skvexpandthrice{#2}}%
+ }{}%
}%
}%
}%
}%
- \skvexpanded{\endgroup
- \skvcmdexit{#2}\do
- }%
+ \skvexpanded{\endgroup\skvcmdexit#2\do}%
}
\skvrobustdef*\skv@findpointer#1#2#3{%
\begingroup
\def\skv@prova##1#2##2##3\pointer@nil{%
\endgroup
- \skvifstrcmp{##2}{\skv@nil}{%
+ \skvifstrcmpTF{##2}{\skv@nil}{%
\@secondoftwo
}{%
+ \skviflacus##1\then\else
+ \skv@err{Nothing should come before the
+ \MessageBreak pointer '#2' on key '##2'}\@ehd
+ \fi
\edef#3{\skvtrimspace{##2}}%
\@firstoftwo
}%
@@ -2404,7 +2556,7 @@
\ifx#2\@empty
\edef#2{\unexpanded{#1}}%
\else
- \skvifstreq{#2}\with{\skvcurrentkey}\then
+ \skvifstreq{#2}{\skvcurrentkey}\then
\in@true
% The number of arguments of the pseudo key is determined by the
% number of closed parentheses:
@@ -2443,7 +2595,7 @@
\begingroup
\let\skvcurrentvalue\@empty
\let\skv@tempa\@empty
- \skvifbraced{#1}{%
+ \skvifbracedTF{#1}{%
\skv@r@placepointers{#1}.use value\skv@nil
}{%
\skv@r@placepointers#1.use value\skv@nil
@@ -2459,20 +2611,20 @@
%
\skvrobustdef*\skv@r@placepointers#1.use value#2{%
\edef\skv@prova{\unexpanded{#2}}%
- \skvifx\skv@prova\skv@nnil{%
+ \skvifxTF\skv@prova\skv@nnil{%
\edef\skvcurrentvalue{\unexpanded{#1}}%
}{%
- \skvifcsundef{\skv@header#2.@value}{%
+ \skvifcsdefFT{\skv@header#2.@value}{%
\skv@err{No value recorded for key '#2'; ignored}\@ehd
\skv@r@placepointers
}{%
- \skvxifin{,\detokenize{#2},}{,\skvoxdetok\skv@tempa,}{%
+ \skvxifinTF{,\detokenize{#2},}{,\skvoxdetok\skv@tempa,}{%
\skv@err{Back linking of pointers;
\MessageBreak pointer replacement canceled}\@ehd
}{%
\edef\skv@tempa{\skvaddlist,\skv@tempa\unexpanded{#2}}%
\edef\skv@prova{\skvexpandcsonce{\skv@header#2.@value}}%
- \skvexpandbracenext\skvifbraced\skv@prova{%
+ \skvexpandbracenext\skvifbracedTF\skv@prova{%
\skvexpandbracenext{\skv@r@placepointers#1}\skv@prova
}{%
\skvexpandnext{\skv@r@placepointers#1}\skv@prova
@@ -2508,7 +2660,7 @@
%
% which will be used at setkeys to define and execute the key's callback.
%
-\skvrobustdef*\skvassignargs{\skv@testopt\skv@assignargs{KV}}
+\skvrobustdef*\skvassignargs{\skv@testopt\skv@assignargs\skv@defaultpref}
\skvrobustdef*\skv@assignargs[#1]#2{%
\begingroup
\skv@testopt{\skv@assignargs@a{#1}{#2}}{^skv^}%
@@ -2516,7 +2668,7 @@
\skvrobustdef*\skv@assignargs@a#1#2[#3]#4#5{%
\edef\skv@tempc{\skvtrimspace{#5}}%
\def\skv@tempd{}%
- \skvifstrcmp{#3}{^skv^}{%
+ \skvifstrcmpTF{#3}{^skv^}{%
\def\skvexpander{x0}%
}{%
\skv@checkexpander{#3}%
@@ -2539,7 +2691,7 @@
\skvexpanded{\endgroup\skv@tempd}%
}
\skvrobustdef*\skv@checkexpander#1{%
- \skvxifin{,\expandafter\skvtrimspace\expandafter
+ \skvxifinTF{,\expandafter\skvtrimspace\expandafter
{\detokenize\expandafter{#1}},}{,\detokenize{x0,x1,x2,xx},}{}{%
\skv@err{Illegal expansion type '#1'}\@ehd
}%
@@ -2555,7 +2707,7 @@
\skvexpanded{\skv@testopt{\skv@ordkey@a{\skvcurrentkey}}{^skv^}}%
}
\skvrobustdef*\skv@ordkey@a#1[#2]#3{%
- \skvifstrcmp{#2}{^skv^}{}{\skv@definedefault{#1}{#2}}%
+ \skvifstrcmpTF{#2}{^skv^}{}{\skv@definedefault{#1}{#2}}%
\skvcsedef{\skv@header#1.@cbk}{\unexpanded{#3}}%
}
\skvrobustdef*\skvordkeys{\skv@testoptb\skv@ordkeys}
@@ -2579,7 +2731,7 @@
\skvexpanded{\skv@testopt{\skv@voidkey@a{\skvcurrentkey}}{^skv^}}%
}
\skvrobustdef*\skv@voidkey@a#1[#2]#3{%
- \skvifstrcmp{#2}{^skv^}{}{\skv@definedefault{#1}{#2}}%
+ \skvifstrcmpTF{#2}{^skv^}{}{\skv@definedefault{#1}{#2}}%
% Simply inserting '#3' in the next definition will not work because
% of the possible parameter characters in #3:
\edef\skv@tempa##1##2{%
@@ -2625,7 +2777,7 @@
\skvexpanded{\skv@testopt{\skv@pntkey@a{\skvcurrentkey}}{^skv^}}%
}
\skvrobustdef*\skv@pntkey@a#1[#2]#3{%
- \skvifstrcmp{#2}{^skv^}{}{\skv@definedefault{#1}{#2}}%
+ \skvifstrcmpTF{#2}{^skv^}{}{\skv@definedefault{#1}{#2}}%
\skvcsedef{\skv@header#1.@cbk}{\unexpanded{#3}}%
}
@@ -2634,38 +2786,37 @@
% \skvcmdkey[<pref>]{<fam>}[<mp>]{<key>}[<defa>]{<callback>}
%
\skvrobustdef*\skvcmdkey{%
- \def\skv@zapnr{0}%
+ \def\skv@zapsw{01}%
\skv@testoptd\skv@cmdkey{cmd}%
}
-
% \skvzcmdkey will internally zap the spaces in the key's name, but the
% key user will not notice that: he can still use the key's name with
% spaces in it. The key's author could then use the zapped name internally
% in his code.
\skvrobustdef*\skvzcmdkey{%
- \def\skv@zapnr{1}%
+ \def\skv@zapsw{00}%
\skv@testoptd\skv@cmdkey{cmd}%
}
% When the key's value has doubled hash characters, xkeyval's definition
% of \skv@cmdkey fails:
\skvrobustdef*\skv@cmdkey#1#2[#3]#4{%
\skv@strippointers{#2}\skvcurrentkey
- \skvifdefbool{skv@st}{\skv@definedefault\skvcurrentkey{#3}}{}%
+ \skvifdefboolTF{skv@st}{\skv@definedefault\skvcurrentkey{#3}}{}%
% This is to allow the key name to be expanded before possibly zapping
% spaces in key name:
\edef\skv@prova{#1\skvcurrentkey}%
\edef\skv@prova{\expandafter\skv@zapornot\expandafter
- {\expandafter\skv@zapnr\expandafter}\expandafter{\skv@prova}}%
+ {\expandafter\skv@zapsw\expandafter}\expandafter{\skv@prova}}%
\skvcslet{\skv@header\skvcurrentkey.@hp}\skv@prova
\skvcsedef{\skv@header\skvcurrentkey.@cbk}{\unexpanded{#4}}%
}
% \skvcmdkeys[<pref>]{<fam>}[<mp>]{<keys>}[<defa>]{<callback>}
\skvrobustdef*\skvcmdkeys{%
- \def\skv@zapnr{0}%
+ \def\skv@zapsw{01}%
\skv@testoptd\skv@cmdkeys{cmd}%
}
\skvrobustdef*\skvzcmdkeys{%
- \def\skv@zapnr{1}%
+ \def\skv@zapsw{00}%
\skv@testoptd\skv@cmdkeys{cmd}%
}
\skvrobustdef*\skv@cmdkeys#1#2[#3]#4{%
@@ -2676,63 +2827,202 @@
%% Choice keys:
%
+% The skeyval package allows holder-macro prefixes {<mp>} for choice keys.
+%
% \skvchoicekey[<pref>]{<fam>}[<mp>]{<key>}[<bins>]{<choices>}
-% [<defa>]{<callback>}
+% [<default>]{<callback>}
+% \skvchoicekey+[<pref>]{<fam>}[<mp>]{<key>}[<bins>]{<choices>}
+% [<default>]{<callback>}{<fallback>}
+% \skvchoicekey*[<pref>]{<fam>}[<mp>]{<key>}[<bins>]{<choices>}
+% [<default>]{<callback>}
+% \skvchoicekey*+[<pref>]{<fam>}[<mp>]{<key>}[<bins>]{<choices>}
+% [<default>]{<callback>}{<fallback>}
%
-% The skeyval package allows holder-macro prefixes for choice keys.
+% \skvchoicekeys[KV]{fam}[mp@]{key1,key2}[\val\nr]{%
+% center.do=\def\vala{#1},
+% right.do=\def\valb{#1},
+% left.do=\def\valc{#1}
+% }[center]{\def\x##1{#1*##1}}
+%
+% \skv@preparenominations{00.or.01}{<altlist>}
+\skvrobustdef*\skv@preparenominations#1#2{%
+ \begingroup
+ \def\skv@altlista{}%
+ \def\skv@altlistb{}%
+ \def\skv@provc##1.do=##2.do=##3\skv@choice@nil{%
+ \if#1\lowercase{\fi
+ \edef\skv@prova{\skvtrimspace{##1}}%
+ \if#1}\fi
+ \skvstripouterbraces{2}\skv@prova
+ \edef\skv@altlista{%
+ \skvxonce\skv@altlista\ifx\skv@altlista\@empty\else,\fi
+ \skvxonce\skv@prova
+ }%
+ \edef\reserved@a{%
+ \skvnoexpandcs{\skvoxdetok\skv@prova @skvch}%
+ {\skvtrimspace{##2}}%
+ }%
+ \edef\skv@altlistb{\skvxonce\skv@altlistb\skvxonce\reserved@a}%
+ }%
+ \skvcommaparse{#2}\skv@prova{%
+ \expandafter\skv@provc\skv@prova.do=.do=\skv@choice@nil
+ }%
+ \ifx\skv@altlista\@empty
+ \skv@err{No nominations (state pattern) for choice key}\@ehd
+ \def\skv@altlistb{}%
+ \fi
+ \skvexpanded{\endgroup
+ \skvcmdexit\skv@altlista\skvcmdexit\skv@altlistb
+ }%
+}
+% \skv@executechoice{00.or.01}{<currentvalue>}{<altlist>}
+\skvrobustdef*\skv@executechoice#1#2#3{%
+ \begingroup
+ \if#1\lowercase{\fi
+ \edef\skv@prova{\skvtrimspace{#2}}%
+ \if#1}\fi
+ \skvstripouterbraces{2}\skv@prova
+ \edef\do{%
+ \expandafter\noexpand\csname\detokenize
+ \expandafter{\skv@prova}@skvch\endcsname
+ }%
+ % Hide #3 in a macro to avoid confusing any parameter
+ % characters in #3 with the parameters of \skv@prova:
+ \edef\skv@provb{\unexpanded{#3}}%
+ \edef\skv@prova{\def\noexpand\skv@prova####1\skvxonce\do####2####3}%
+ \skv@prova\skv@choice@nil{%
+ \toks@{##2}%
+ \edef\skv@prova{\unexpanded{##2}}%
+ \ifx\skv@prova\skv@nnil
+ \skv@err{No state pattern match found for key
+ \MessageBreak '\skvcurrentkey'}\@ehd
+ \toks@{}%
+ \fi
+ }%
+ \expandafter\expandafter\expandafter\skv@prova\expandafter
+ \skv@provb\do{\skv@nil}\skv@choice@nil
+ \expandafter\endgroup\the\toks@
+}
\skvrobustdef*\skvchoicekey{%
\skv@testopta{\skv@testoptb
{\skv@testopt\skv@choicekey@a{choice\skv@header}}}%
}
+\skvnewlet\skvchoicekeys\skvchoicekey
\skvrobustdef*\skv@choicekey@a[#1]#2{%
- \skv@strippointers{#2}\skvcurrentkey
- \skvcsedef{\skv@header\skvcurrentkey.@hp}{%
- \skvtrimspace{#1}\skvcurrentkey
+ \skvxifinTF{\skv@hashchar}{\detokenize{#2}}{%
+ \skv@err{Hash character '\skv@hashchar' not allowed
+ \MessageBreak in key name}\@ehd
+ }{%
+ \edef\skv@currlist{\unexpanded{#2}}%
+ \edef\skv@hp{\skvtrimspace{#1}}%
+ \skv@testopt\skv@choicekey@b{}%
}%
- \skv@testopt\skv@choicekey@b{}%
}
\skvrobustdef*\skv@choicekey@b[#1]#2{%
- \def\skv@bins{#1}%
- \edef\skv@tempa{\unexpanded{#2}}%
- \skvcsvnormalize\skv@tempa
- \skv@toksa\expandafter{\skv@tempa}%
+ \edef\skv@bins{\unexpanded{#1}}%
+ % Check the syntax of bins. This also helps catch wrong use syntax
+ % of \skvchoicekeys: it's easy to get the syntax of \skvchoicekeys
+ % wrong. The default value may have been put in place of bins.
+ \ifx\skv@bins\@empty\else
+ \skvtfor\skv@prova:=#1\do{%
+ \skvexpbracenext\skvifescapedTF\skv@prova{}{%
+ \skv@err{Token '\skvoxdetok\skv@prova' of bin of
+ \MessageBreak choice key isn't escaped}\@ehd
+ }%
+ }%
+ \fi
+ \skvifblankTF{#2}{%
+ \skv@err{No nominations (state pattern) for
+ \MessageBreak choice keys '\skv@currlist'}\@ehd
+ }{%
+ \skvifboolTF{skv@st}{%
+ \skv@preparenominations{00}{#2}%
+ }{%
+ \skv@preparenominations{01}{#2}%
+ }%
+ }%
\skvifnextchar[\skv@choicekey@c{\skv@choicekey@c[^skv^]}%
}
\skvrobustdef*\skv@choicekey@c[#1]{%
- \skvifstrcmp{#1}{^skv^}{}{\skv@definedefault\skvcurrentkey{#1}}%
- \skvifdefbool{skv@pl}\skv@choicekey@e\skv@choicekey@d
+ \edef\skv@default{\skvtrimspace{#1}}%
+ % Choice can't have braced values, since that will make matching
+ % to state pattern difficult:
+ \skvstripouterbraces{2}\skv@default
+ \skvifdefboolTF{skv@pl}\skv@choicekey@e\skv@choicekey@d
+}
+\skvrobustdef*\skv@choicekey@d#1{%
+ \skvexpanded{%
+ \noexpand\skv@choicekey@f{{%
+ \noexpand\skv@executechoice\ifskv@st{00}\else{01}\fi
+ {####1}{\skvxonce\skv@altlistb}%
+ \unexpanded{#1}%
+ }}%
+ }%
+}
+\skvrobustdef*\skv@choicekey@e#1#2{%
+ \skvexpanded{%
+ \noexpand\skv@choicekey@f{{%
+ \noexpand\skv@executechoice\ifskv@st{00}\else{01}\fi
+ {####1}{\skvxonce\skv@altlistb}%
+ \unexpanded{#1}%
+ }{\unexpanded{#2}}}%
+ }%
}
-\skvrobustdef*\skv@choicekey@d#1{\skv@choicekey@f{{#1}}}
-\skvrobustdef*\skv@choicekey@e#1#2{\skv@choicekey@f{{#1}{#2}}}
\skvrobustdef*\skv@choicekey@f#1{%
- \edef\skv@tempa##1##2{%
+ \edef\skv@prova##1##2{%
\ifskv@st\noexpand\skv@sttrue\else\noexpand\skv@stfalse\fi
\ifskv@pl\noexpand\skv@pltrue\else\noexpand\skv@plfalse\fi
- \skv@checkchoice[\skvexpandonce\skv@bins]{##1}{\the\skv@toksa}##2%
+ \noexpand\skv@checkchoice
+ \ifx\skv@bins\@empty\else[\skvxonce\skv@bins]\fi
+ {##1}{\skvxonce\skv@altlista}##2%
}%
- \skv@toksa\expandafter{\skv@tempa{##1}{#1}}%
- \skvcsedef{\skv@header\skvcurrentkey.@cbk}{\the\skv@toksa}%
+ \skv@toksa\expandafter{\skv@prova{##1}{#1}}%
+ % Why separate \skv@choicekey@g? It is needed by skeyval-view.sty:
+ \skv@choicekey@g
+}
+\skvrobustdef*\skv@choicekey@g{%
+ \skvcommaparse*\skv@currlist\skv@prova{%
+ \skvexpbracenext\skv@strippointers\skv@prova\skvcurrentkey
+ \ifx\skv@default\skv@rej\else
+ \skvexpanded{%
+ \noexpand\skv@definedefault
+ {\skvxonce\skvcurrentkey}{\skvxonce\skv@default}%
+ }%
+ \fi
+ \skvcsedef{\skv@header\skvcurrentkey.@hp}{\skv@hp\skvcurrentkey}%
+ \skvcsedef{\skv@header\skvcurrentkey.@cbk}{\the\skv@toksa}%
+ }%
+}
+
+\skvrobustdef*\skv@togkey@settog#1#2#3{%
+ \edef\skv@prova{\skv@zapornot{#1}{#2}}%
+ \csname skvsettog#3\expandafter\endcsname\expandafter{\skv@prova}%
}
%% Boolean keys:
%
% \skvboolkey[<pref>]{<fam>}[<mp>]{<key>}[<defa>]{<callback>}
+% \skvboolkey+[<pref>]{<fam>}[<mp>]{<keys>}[<defa>]{<callback>}{<fallback>}
%
% Boolean keys create a store to receive the key's value and also create
% a boolean internally.
+%
\skvrobustdef*\skvboolkey{%
- \def\skv@zapnr{0}%
+ \def\skv@typetogkey{01}%
+ \def\skv@zapsw{01}%
\skv@t@stopta{\skv@testoptd\skv@boolkey{}}%
}
-% \skvzcmdkey will internally zap the spaces in the key's name and in
+% \skvzboolkey will internally zap the spaces in the key's name and in
% the boolean that it creates internally, but the key user will not
% notice that: he will still be able to submit the original key's name
% with spaces in it. The key's author could then use the zapped key
% name and boolean in his code (internally).
\skvrobustdef*\skvzboolkey{%
- \def\skv@zapnr{1}%
+ \def\skv@typetogkey{01}%
+ \def\skv@zapsw{00}%
\skv@t@stopta{\skv@testoptd\skv@boolkey{}}%
}
+% \skv@boolkeys{<mp>}{<key>}[<default>]
\skvrobustdef*\skv@boolkey#1#2[#3]{%
\skv@strippointers{#2}\skvcurrentkey
\skvexpanded{%
@@ -2740,21 +3030,38 @@
{\skvcurrentkey}{#1\skvcurrentkey}%
}{#3}%
}
+% \skv@boolkey@a{<key>}{<mp.key>}{<default>}{<callback>}
\skvrobustdef*\skv@boolkey@a#1#2#3#4{%
\def\skv@tempa{\skv@boolkey@c{#1}{#2}{#3}}%
- \expandafter\skv@tempa\expandafter{\expandafter{\expandafter
- \csname\expandafter\skv@zapornot\expandafter{\skv@zapnr}{#2}%
- \skv@value\endcsname#4}}%
+ \skvifplaswTF\skv@typetogkey{%
+ \expandafter\skv@tempa\expandafter{\expandafter{\expandafter
+ \skv@togkey@settog\expandafter{\skv@zapsw}{#2}\skv@value#4}}%
+ }{%
+ \expandafter\skv@tempa\expandafter{\expandafter{\expandafter
+ \csname\expandafter\skv@zapornot\expandafter{\skv@zapsw}{#2}%
+ \skv@value\endcsname#4}}%
+ }%
}
+% \skv@boolkey@b{<key>}{<mp.key>}{<default>}{<callback>}{<fallback>}
\skvrobustdef*\skv@boolkey@b#1#2#3#4#5{%
\def\skv@tempa{\skv@boolkey@c{#1}{#2}{#3}}%
- \expandafter\skv@tempa\expandafter{\expandafter{\expandafter
- \csname\expandafter\skv@zapornot\expandafter{\skv@zapnr}{#2}%
- \skv@value\endcsname#4}{#5}}%
+ \skvifplaswTF\skv@typetogkey{%
+ \expandafter\skv@tempa\expandafter{\expandafter{\expandafter
+ \skv@togkey@settog\expandafter{\skv@zapsw}{#2}\skv@value#4}{#5}}%
+ }{%
+ \expandafter\skv@tempa\expandafter{\expandafter{\expandafter
+ \csname\expandafter\skv@zapornot\expandafter{\skv@zapsw}{#2}%
+ \skv@value\endcsname#4}{#5}}%
+ }%
}
+% \skv@boolkey@c{<key>}{<mp.key>}{<default>}{{<callback>}{<fallback>}}
\skvrobustdef*\skv@boolkey@c#1#2#3#4{%
- \skvcsnewif{\skv@zapornot{\skv@zapnr}{#2}}%
- \skvifdefbool{skv@st}{\skv@definedefault{#1}{#3}}{}%
+ \if\skv@typetogkey
+ \skvdeftog{\skv@zapornot{\skv@zapsw}{#2}}%
+ \else
+ \skvcsnewif{\skv@zapornot{\skv@zapsw}{#2}}%
+ \fi
+ \skvifdefboolTF{skv@st}{\skv@definedefault{#1}{#3}}{}%
\edef\skv@tempa##1##2{%
\noexpand\skv@sttrue
\ifskv@pl\noexpand\skv@pltrue\else\noexpand\skv@plfalse\fi
@@ -2763,25 +3070,33 @@
\skv@toksa\expandafter{\skv@tempa{##1}{#4}}%
\skvcsedef{\skv@header#1.@cbk}{\the\skv@toksa}%
}
+%
% \skvboolkeys[<pref>]{<fam>}[<mp>]{<keys>}[<defa>]{<callback>}
+% \skvboolkeys+[<pref>]{<fam>}[<mp>]{<keys>}[<defa>]{<callback>}{<fallback>}
+%
\skvrobustdef*\skvboolkeys{%
- \def\skv@zapnr{0}%
+ \def\skv@typetogkey{01}%
+ \def\skv@zapsw{01}%
\skv@t@stopta{\skv@testoptd\skv@boolkeys{}}%
}
\skvrobustdef*\skvzboolkeys{%
- \def\skv@zapnr{1}%
+ \def\skv@typetogkey{01}%
+ \def\skv@zapsw{00}%
\skv@t@stopta{\skv@testoptd\skv@boolkeys{}}%
}
+% \skv@boolkeys{<mp>}{<keys>}[<default>]
\skvrobustdef*\skv@boolkeys#1#2[#3]{%
- \skvifdefbool{skv@pl}\skv@boolkeys@b\skv@boolkeys@a{#2}{#1}{#3}%
+ \skvifdefboolTF{skv@pl}\skv@boolkeys@b\skv@boolkeys@a{#2}{#1}{#3}%
}
+% \skv@boolkeys@a{<keys>}{<mp>}{<default>}{<callback>}
\skvrobustdef*\skv@boolkeys@a#1#2#3#4{\skv@boolkeys@c{#1}{#2}{#3}{#4}{^skv^}}
+% \skv@boolkeys@b{<keys>}{<mp>}{<default>}{<callback>}{<fallback>}
\skvrobustdef*\skv@boolkeys@b#1#2#3#4#5{\skv@boolkeys@c{#1}{#2}{#3}{#4}{#5}}
\skvrobustdef*\skv@boolkeys@c#1#2#3#4#5{%
\skvcommaparse{#1}\skv@tempa{%
\skvexpbracenext\skv@strippointers\skv@tempa\skvcurrentkey
\skvexpanded{%
- \skvifstrcmp{#5}{^skv^}{%
+ \skvifstrcmpTF{#5}{^skv^}{%
\skv@boolkey@a{\skvcurrentkey}%
{#2\skvcurrentkey}\unexpanded{{#3}{#4}}%
}{%
@@ -2791,6 +3106,170 @@
}%
}%
}
+%
+% \skvbiboolkeys[<pref>]{<fam>}[<mp>]{<key1,key2>}[<defa>]
+% {<callback.for.key1>}{<callback.for.key2>}
+% \skvbiboolkeys+[<pref>]{<fam>}[<mp>]{<key1,key2>}[<defa>]
+% {<callback.for.key1>}{<callback.for.key2>}{<fallback>}
+%
+% Example:
+%
+% \skvbiboolkeys+[KV]{fam}[mp@]{.need value{keya},keyb}[true]{%
+% \ifmp@keya\def\xa##1{##1}\fi
+% }{%
+% \ifmp@keyb\def\xb##1{##1}\fi
+% }{%
+% \skv@warn{Value '#1' is invalid}%
+% }
+%
+\skvrobustdef*\skvbiboolkeys{%
+ \def\skv@typetogkey{01}%
+ \def\skv@zapsw{01}%
+ \skv@t@stopta{\skv@testoptd\skv@biboolkeys{}}%
+}
+\skvrobustdef*\skvzbiboolkeys{%
+ \def\skv@typetogkey{01}%
+ \def\skv@zapsw{00}%
+ \skv@t@stopta{\skv@testoptd\skv@biboolkeys{}}%
+}
+\skvrobustdef*\skv@biboolkeys#1#2[#3]{%
+ \begingroup
+ \edef\skv@currlist{\unexpanded{#2}}%
+ \skvcsvnormalize\skv@currlist
+ \@tempcnta\skvz@
+ \skvcommaloop*\skv@currlist\skv@tempa{%
+ \advance\@tempcnta\@ne
+ \ifnum\@tempcnta>\tw@
+ \skvbreakloop
+ \fi
+ }%
+ \ifnum\@tempcnta=\tw@\else
+ \skv@err{Number of bi-keys isn't 2:
+ \MessageBreak ||\skv@currlist||}\@ehd
+ \fi
+ \skvexpanded{%
+ \ifskv@pl\skv@biboolkeys@b\else\skv@biboolkeys@a\fi
+ {\skv@currlist}%
+ }{#1}{#3}%
+}
+% \skv@bilboolkeys@a{<key1,key2>}{<mp>}{<default>}
+% {<callback1>}{<callback2>}
+\skvrobustdef*\skv@biboolkeys@a#1#2#3#4#5{%
+ \skv@biboolkeys@c{#1}{#2}{#3}{#4}{#5}{^skv^}%
+}
+% \skv@bilboolkeys@a{<key1,key2>}{<mp>}{<default>}
+% {<callback1>}{<callback2>}{<fallback>}
+\skvrobustdef*\skv@biboolkeys@b#1#2#3#4#5#6{%
+ \skv@biboolkeys@c{#1}{#2}{#3}{#4}{#5}{#6}%
+}
+\skvrobustdef*\skv@biboolkeys@c#1#2#3#4#5#6{%
+ % Don't group the following: pointers will be lost outide the group.
+ % 'bicallerid' is used to indicate that the master key is the one
+ % that has instantiated the callback of the slave. This avoids
+ % infinite re-entrance of \skvsetkeys.
+ \edef\skv@default{\unexpanded{#3}}%
+ \edef\skv@tempc{\unexpanded{#4}}%
+ \edef\skv@tempd{\unexpanded{#5}}%
+ \edef\skv@tempe{\unexpanded{#6}}%
+ \toks@{}\def\skv@provd{}%
+ \let\\\noexpand
+ \def\@do##1##2{%
+ \skvifcsname\skv@header##1.@##2\then
+ \edef\skv@provd{%
+ \skv@provd
+ \skvcsdef{\skv@header##1.@##2}{%
+ \csname\skv@header##1.@##2\endcsname
+ }%
+ }%
+ \fi
+ }%
+ \def\skv@provc##1##2##3##4{%
+ \skvsettogtrue{\skv@header bicallerid/##3}%
+ \skvxonce\@elt
+ \\\skvifxTF\\\skvcurrentvalue\\\skv@truetoks{%
+ \\\skviftogTF{\skv@header bicallerid/##4}{}{%
+ \skvsetkeys[##1]{##2}{##4=false}%
+ }%
+ }{%
+ \\\skviftogTF{\skv@header bicallerid/##4}{}{%
+ \skvsetkeys[##1]{##2}{##4=true}%
+ }%
+ }%
+ \skvsettogfalse{\skv@header bicallerid/##3}%
+ }%
+ % \skv@provb{<KV>}{<fam>}{<primary.key>}{<secondary.key>}
+ \def\skv@provb##1##2##3##4{%
+ \@do{##3}{ndv}\@do{##3}{fbv}%
+ \skvexpanded{%
+ \toks@{\the\toks@
+ \skvdeftog{\skv@header bicallerid/##3}%
+ \skvifstrcmpTF{#6}{^skv^}{%
+ \skv@boolkey@a
+ {##3}{#2##3}{\skvxonce\skv@default}{%
+ \skv@provc{##1}{##2}{##3}{##4}%
+ }%
+ }{%
+ \skv@boolkey@b
+ {##3}{#2##3}{\skvxonce\skv@default}{%
+ \skv@provc{##1}{##2}{##3}{##4}%
+ }{\skvxonce\skv@tempe}%
+ }%
+ }%
+ }%
+ }%
+ \def\skv@prova##1,##2\skv@nil{%
+ \skv@strippointers{##1}\skv@tempa
+ \skv@strippointers{##2}\skv@tempb
+ \skvexpanded{%
+ \let\\\@elt\\\skv@tempc
+ \\\skv@provb{\skvcurrentprefix}{\skvcurrentfamily}%
+ {\skv@tempa}{\skv@tempb}%
+ \let\\\@elt\\\skv@tempd
+ \\\skv@provb{\skvcurrentprefix}{\skvcurrentfamily}%
+ {\skv@tempb}{\skv@tempa}%
+ }%
+ }%
+ \skv@prova#1\skv@nil
+ \skvexpanded{\endgroup
+ \skv@provd\the\toks@
+ }%
+}
+
+%% Toggle keys:
+%
+% \skvtogkey[<pref>]{<fam>}[<mp>]{<key>}[<defa>]{<callback>}
+% \skvtogkey+[<pref>]{<fam>}[<mp>]{<key>}[<defa>]{<callback>}{<fallback>}
+%
+\skvrobustdef*\skvtogkey{%
+ \def\skv@typetogkey{00}%
+ \def\skv@zapsw{01}%
+ \skv@t@stopta{\skv@testoptd\skv@boolkey{}}%
+}
+\skvrobustdef*\skvztogkey{%
+ \def\skv@typetogkey{00}%
+ \def\skv@zapsw{00}%
+ \skv@t@stopta{\skv@testoptd\skv@boolkey{}}%
+}
+\skvrobustdef*\skvtogkeys{%
+ \def\skv@typetogkey{00}%
+ \def\skv@zapsw{01}%
+ \skv@t@stopta{\skv@testoptd\skv@boolkeys{}}%
+}
+\skvrobustdef*\skvztogkeys{%
+ \def\skv@typetogkey{00}%
+ \def\skv@zapsw{00}%
+ \skv@t@stopta{\skv@testoptd\skv@boolkeys{}}%
+}
+\skvrobustdef*\skvbitogkeys{%
+ \def\skv@typetogkey{00}%
+ \def\skv@zapsw{01}%
+ \skv@t@stopta{\skv@testoptd\skv@biboolkeys{}}%
+}
+\skvrobustdef*\skvzbitogkeys{%
+ \def\skv@typetogkey{00}%
+ \def\skv@zapsw{00}%
+ \skv@t@stopta{\skv@testoptd\skv@biboolkeys{}}%
+}
% Style keys
%
@@ -2841,7 +3320,7 @@
\skvcommaparse{#1}\skv@prova{%
\skvexpbracenext\skv@strippointers\skv@prova\skvcurrentkey
\skvexpanded{%
- \skvifstrcmp{#3}{^skv^}{}{%
+ \skvifstrcmpTF{#3}{^skv^}{}{%
\skv@definedefault{\skvcurrentkey}{\unexpanded{#3}}%
}%
\skv@appendstyles@b{\skvcurrentkey}\unexpanded{{#2}{#4}}%
@@ -2851,12 +3330,12 @@
% \skv@appendstyles@b{<parent.key>}{<styles>}{<parent.key.callback>}
\skvrobustdef*\skv@appendstyles@b#1#2#3{%
\def\skv@stylelist{}%
- \skvkvparse{#2}\skv@provb{%
- \def\skv@prova##1=##2=##3\skv@nil{%
- \skvxifstrcmp{#1}{##1}{%
+ \skvkvparse{#2}\skv@prova{%
+ \ksv@kvosplit\skv@prova{%
+ \skvxifstrcmpTF{#1}{##1}{%
\skv@err{Linking key '##1' to itself}\@ehd
}{%
- \skvifcsdef{\skv@header##1.@cbk}{}{%
+ \skvifcsdefTF{\skv@header##1.@cbk}{}{%
\skv@err{Style key '##1' is undefined}\@ehd
}%
}%
@@ -2865,10 +3344,9 @@
\skvexpandonce\skvexpanderpointer{\unexpanded{##2}}%
}%
}%
- \expandafter\skv@prova\skv@provb==\skv@nil
}%
\edef\elt{%
- \skvifcsdef{\skv@header#1.@cbk}
+ \skvifcsdefTF{\skv@header#1.@cbk}
{\skvxpandcsonce{\skv@header#1.@cbk}}{}%
}%
\edef\skv@elt{%
@@ -2876,7 +3354,7 @@
{\skvcurrentfamily}{\skvexpandonce\skv@stylelist}}%
}%
\skvcsedef{\skv@header#1.@cbk}{%
- \skvxifstrcmp{\skv@type}{prep}{%
+ \skvxifstrcmpTF{\skv@type}{prep}{%
\skvexpandonce\skv@elt\unexpanded{#3}\skvexpandonce\elt
}{%
\skvexpandonce\elt\unexpanded{#3}\skvexpandonce\skv@elt
@@ -2933,7 +3411,7 @@
}
\skvrobustdef*\skv@checkchoice@a#1#2\skv@nil#3#4{%
\def\skv@tempa{#2}%
- \skvifx\skv@tempa\@empty{%
+ \skvifxTF\skv@tempa\@empty{%
\skv@checkchoice@b#1{#3}{#4}%
}{%
\skv@checkchoice@c#1#2{#3}{#4}%
@@ -2946,7 +3424,7 @@
\else
\def\skv@tempa{\endgroup\def#1{#2}}%
\fi
- \skvifin{,#2,}{,#3,}{%
+ \skvifinTF{,#2,}{,#3,}{%
\ifskv@pl
\skvappendtomacro\skv@tempa{\@firstoftwo}%
\else
@@ -2997,13 +3475,13 @@
\skvrobustdef*\skv@checkchoice@d#1\skv@nil,{\@firstoftwo}
\skvrobustdef*\skv@checkchoice@e#1\skv@nil,{\@firstofone}
-% \skvifkeydef[<prefs>]{<fams>}{key}{<true>}{<false>}
+% \skvifkeydefTF[<prefs>]{<fams>}{key}{<true>}{<false>}
% 1. The search will stop as soon as the key is found in one combination
% of prefixes/families.
% 2. The prefix and header created here may be needed in #5 and #6. Hence
% we put entry prefix and header on stack before commencing the search.
-\skvrobustdef*\skvifkeydef{\skv@testopt{\skv@ifkeyundef0}{KV}}
-\skvrobustdef*\skvifkeyundef{\skv@testopt{\skv@ifkeyundef1}{KV}}
+\skvrobustdef*\skvifkeydefTF{\skv@testopt{\skv@ifkeyundef0}\skv@defaultpref}
+\skvrobustdef*\skvifkeydefFT{\skv@testopt{\skv@ifkeyundef1}\skv@defaultpref}
\skvrobustdef*\skv@ifkeyundef#1[#2]#3#4#5#6{%
\skvpushstate\skv@keystate\skv@keydepth
\edef\skv@prefs{#2}%
@@ -3019,7 +3497,7 @@
\ifskv@kf\skvbreakloop\fi
}%
\skvexpanded{%
- \skvifbool{skv@kf}{%
+ \skvifboolTF{skv@kf}{%
\if0#1%
\noexpand\@firstoftwo
\else
@@ -3039,19 +3517,21 @@
\skvrobustdef*\skv@ifk@yundef{%
\skvcommaparse*\skv@fams\skv@prova{%
\skv@makeheader\skv@prova
- \skvifcsundef{\skv@header\skvcurrentkey.@cbk}{}{%
+ \skvifcsdefFT{\skv@header\skvcurrentkey.@cbk}{}{%
\skv@kftrue\skvbreakloop
}%
}%
}
-% \skvifkeyinfamilies[<prefs>]{<fams>}{key}{<true>}{<false>}
+% \skvifkeyinfamiliesTF[<prefs>]{<fams>}{key}{<true>}{<false>}
+%
% The search will be done on all combinations of prefixes/families. The
% callback <true> or <false> will be executed for all the combinations.
-\skvrobustdef*\skvifkeyinfamilies{%
- \skv@testopt{\skv@ifkeyinfamilies0}{KV}%
+%
+\skvrobustdef*\skvifkeyinfamiliesTF{%
+ \skv@testopt{\skv@ifkeyinfamilies0}\skv@defaultpref
}
-\skvrobustdef*\skvifkeynotinfamilies{%
- \skv@testopt{\skv@ifkeyinfamilies1}{KV}%
+\skvrobustdef*\skvifkeyinfamiliesFT{%
+ \skv@testopt{\skv@ifkeyinfamilies1}\skv@defaultpref
}
\skvrobustdef*\skv@ifkeyinfamilies#1[#2]#3#4#5#6{%
\skvpushstate\skv@keystate\skv@keydepth
@@ -3067,7 +3547,7 @@
\skvcommaparse*\skv@fams\skv@prova{%
\skv@makeheader\skv@prova
\skvexpanded{%
- \skvifcsdef{\skv@header\skvcurrentkey.@cbk}{%
+ \skvifcsdefTF{\skv@header\skvcurrentkey.@cbk}{%
\if0#1%
\noexpand\@firstoftwo
\else
@@ -3084,18 +3564,18 @@
}%
\skvpopstate\skv@keystate\skv@keydepth
}
-% \skvifkeyinfamily{<prefix>/<family>}{<key>}
-\skvnewdef*\skvifkeyinfamily#1#2{%
- \skvifcsdef{\skvtrimspace{#1}/\skvtrimspace{#2}.@cbk}%
+% \skvifkeyinfamilyTF{<prefix>/<family>}{<key>}
+\skvnewdef*\skvifkeyinfamilyTF#1#2{%
+ \skvifcsdefTF{\skvtrimspace{#1}/\skvtrimspace{#2}.@cbk}%
}
-% \skvifkeyincurrentfamily{<key>}
-\skvnewdef*\skvifkeyincurrentfamily#1{%
- \skvifcsdef{\skvcurrentpath/\skvtrimspace{#1}.@cbk}%
+% \skvifkeyincurrentfamilyTF{<key>}
+\skvnewdef*\skvifkeyincurrentfamilyTF#1{%
+ \skvifcsdefTF{\skvcurrentpath/\skvtrimspace{#1}.@cbk}%
}
-% \skvifonekeyinfamily{<prefix>/<family>}{<keys>}
+% \skvifonekeyinfamilyTF{<prefix>/<family>}{<keys>}
% Given a list of keys, test if at least one of them is defined.
-% Example: \edef\x{\skvifonekeyinfamily{KV/fam}{keya,keyb,keyc}{T}{F}}.
-\skvnewdef*\skvifonekeyinfamily#1#2{%
+% Example: \edef\x{\skvifonekeyinfamilyTF{KV/fam}{keya,keyb,keyc}{T}{F}}.
+\skvnewdef*\skvifonekeyinfamilyTF#1#2{%
\ifnum\numexpr0\skv@ifonekeydef{#1}#2,\@nnil,>\skvz@
\expandafter\@firstoftwo
\else
@@ -3106,7 +3586,7 @@
\ifx\@nnil#2%
\expandafter\@gobble
\else
- \skvifcsndef{\skvtrimspace{#1}/\skvtrimspace{#2}.@cbk}{+1}{+0}%
+ \skvifcsdefTF{\skvtrimspace{#1}/\skvtrimspace{#2}.@cbk}{+1}{+0}%
\expandafter\skv@ifonekeydef
\fi
{#1}%
@@ -3137,24 +3617,25 @@
% \skvkeyslet[<pref>]{<family>}{<list>}
% <list> -> <new keyname>=<old keyname>
\skvrobustdef*\skvkeyslet{\skv@testoptb\skv@keyslet}
+\skvnewlet\skvkeyinheritance\skvkeyslet
\skvnewlet\skvkeylet\skvkeyslet
\skvrobustdef*\skv@keyslet#1{%
\skvletcs\skv@inikv{\skv@header.@inikv}%
- \skvifundef\skv@inikv{}{%
+ \skvifdefFT\skv@inikv{}{%
\expandafter\skv@getkeynames\expandafter{\skv@inikv}\skv@inikeys
}%
\def\skv@k@yslet##1=##2=##3\skv@nil{%
- \skvifcsundef{\skv@header##2.@cbk}{%
+ \skvifcsdefFT{\skv@header##2.@cbk}{%
\skv@err{Key '\skvcurrentpath/##2' is undefined}\@ehd
}{%
- \skvifcsdef{\skv@header##1.@cbk}{%
+ \skvifcsdefTF{\skv@header##1.@cbk}{%
\skv@err{Key '\skvcurrentpath/##1' is already defined}\@ehd
}{}%
}%
\skvcommaloop{cbk,ndv,fbv}\skv@prova{%
\skvcsletcs{\skv@header##1.@\skv@prova}{\skv@header##2.@\skv@prova}%
}%
- \skvifcsdef{\skv@header##2.@defa}{%
+ \skvifcsdefTF{\skv@header##2.@defa}{%
\edef\skvcurrentkey{##2}%
\skv@getdefault\skvcurrentprefix\skvcurrentfamily\skvcurrentkey
\skvcurrentvalue
@@ -3165,8 +3646,8 @@
}{%
\skv@swafalse
}%
- \skvifundef\skv@inikv{}{%
- \skvxifnotin{,\detokenize{##2},}{,\skvoxdetok\skv@inikeys,}{}{%
+ \skvifdefFT\skv@inikv{}{%
+ \skvxifinFT{,\detokenize{##2},}{,\skvoxdetok\skv@inikeys,}{}{%
\skvcsedef{\skv@header.@inikv}{%
\expandafter\skvaddlist\expandafter
,\csname\skv@header.@inikv\endcsname
@@ -3176,8 +3657,8 @@
}%
\skvcommaloop{ignoredkeys,needini}\skv@prova{%
\skvletcs\skv@tempa{\skv@header.@\skv@prova}%
- \skvifundef\skv@tempa{}{%
- \skvxifnotin{,\detokenize{##2},}{,\skvoxdetok\skv@tempa,}{}{%
+ \skvifdefFT\skv@tempa{}{%
+ \skvxifinFT{,\detokenize{##2},}{,\skvoxdetok\skv@tempa,}{}{%
\skvcsedef{\skv@header.@\skv@prova}{\skvaddlist,\skv@tempa##1}%
}%
}%
@@ -3194,14 +3675,14 @@
\skv@warn{Key '\skvcurrentpath/#1' has been disabled
\MessageBreak You can't set or reset key '#1' at this
\MessageBreak late stage. Perhaps you should have set it
- \MessageBreak earlier \ifskv@inlatex in \noexpand\documentclass or
+ \MessageBreak earlier \ifskv@latex in \noexpand\documentclass or
\string\usepackage\fi}%
}
\skvrobustdef*\skv@disabledkeyerror#1{%
\skv@err{Key '\skvcurrentpath/#1' has been disabled}%
{You can't set or reset key '#1' at this
\MessageBreak late stage. Perhaps you should have set it
- \MessageBreak earlier \ifskv@inlatex in \noexpand\documentclass or
+ \MessageBreak earlier \ifskv@latex in \noexpand\documentclass or
\string\usepackage\fi}%
}
\skvrobustdef*\skvdisabledkeysmessagetype#1{%
@@ -3229,11 +3710,11 @@
\skvrobustdef*\skvdisablekeys{\skv@testoptb\skv@disablekeys}
\skvrobustdef*\skv@disablekeys#1{%
\skvcommaparse{#1}\skv@tempa{%
- \skvifcsdef{\skv@header\skv@tempa.@cbk}{}{%
+ \skvifcsdefTF{\skv@header\skv@tempa.@cbk}{}{%
\skv@err{Key '\skv@tempa' is undefined:
\MessageBreak couldn't be disabled}\@ehd
}%
- \skvifcsdef{\skv@header\skv@tempa.@defa}{%
+ \skvifcsdefTF{\skv@header\skv@tempa.@defa}{%
\edef\skv@tempb{\noexpand\skv@ordkey{\skv@tempa}[]}%
}{%
\edef\skv@tempb{\noexpand\skv@ordkey{\skv@tempa}}%
@@ -3249,22 +3730,22 @@
%
% \skvpresetkeys[<pref>]{<fam>}{<keys>}
% \skvgpresetkeys[<pref>]{<fam>}{<keys>}
-\skvrobustdef*\skvpresetkeys{\skv@testopt\skv@presetkeys{KV}}
+\skvrobustdef*\skvpresetkeys{\skv@testopt\skv@presetkeys\skv@defaultpref}
\skvrobustdef*\skv@presetkeys[#1]#2#3{\skvpreposetkeys[#1]{#2}{#3}{}}
-\skvrobustdef*\skvgpresetkeys{\skv@testopt\skv@gpresetkeys{KV}}
+\skvrobustdef*\skvgpresetkeys{\skv@testopt\skv@gpresetkeys\skv@defaultpref}
\skvrobustdef*\skv@gpresetkeys[#1]#2#3{\skvgpreposetkeys[#1]{#2}{#3}{}}
-\skvrobustdef*\skvpostsetkeys{\skv@testopt\skv@postsetkeys{KV}}
+\skvrobustdef*\skvpostsetkeys{\skv@testopt\skv@postsetkeys\skv@defaultpref}
\skvrobustdef*\skv@postsetkeys[#1]#2#3{\skvpreposetkeys[#1]{#2}{}{#3}}
-\skvrobustdef*\skvgpostsetkeys{\skv@testopt\skv@gpostsetkeys{KV}}
+\skvrobustdef*\skvgpostsetkeys{\skv@testopt\skv@gpostsetkeys\skv@defaultpref}
\skvrobustdef*\skv@gpostsetkeys[#1]#2#3{\skvgpreposetkeys[#1]{#2}{}{#3}}
\skvrobustdef*\skvpreposetkeys{\skv@clfalse\skv@testoptb\skv@preposetkeys}
\skvrobustdef*\skvgpreposetkeys{\skv@cltrue\skv@testoptb\skv@preposetkeys}
\skvrobustdef*\skv@preposetkeys#1#2{%
- \skvifblank{#1}{}{\skv@pr@posetkeys{#1}{preset}}%
- \skvifblank{#2}{}{\skv@pr@posetkeys{#2}{postset}}%
+ \skvifblankTF{#1}{}{\skv@pr@posetkeys{#1}{preset}}%
+ \skvifblankTF{#2}{}{\skv@pr@posetkeys{#2}{postset}}%
}
\skvrobustdef*\skv@pr@posetkeys#1#2{%
- \skvifcsundef{\skv@header.@#2}{%
+ \skvifcsdefFT{\skv@header.@#2}{%
\skvnormalize{csv}{,}{#1}\skv@tempa
\ifskv@cl\expandafter\global\fi
\expandafter\def\csname\skv@header.@#2\expandafter
@@ -3284,7 +3765,7 @@
\skv@cltrue\skv@testoptb\skv@removepresetkeys
}
\skvrobustdef*\skv@removepresetkeys#1{%
- \skvifcsdef{\skv@header.@preset}{%
+ \skvifcsdefTF{\skv@header.@preset}{%
\expandafter\skv@filterremoveelements\csname\skv@header
.@preset\endcsname{#1}\skv@getkeyname
}{%
@@ -3300,7 +3781,7 @@
\skv@cltrue\skv@testoptb\skv@undefpresetkeys
}
\skvrobustdef*\skv@undefpresetkeys{%
- \skvifcsundef{\skv@header.@preset}{%
+ \skvifcsdefFT{\skv@header.@preset}{%
\skv@err{No preset keys defined for
'\skvcurrentprefix/\skvcurrentfamily'}\@ehd
}{%
@@ -3318,7 +3799,7 @@
\skv@cltrue\skv@testoptb\skv@removepostsetkeys
}
\skvrobustdef*\skv@removepostsetkeys#1{%
- \skvifcsdef{\skv@header.@postset}{%
+ \skvifcsdefTF{\skv@header.@postset}{%
\expandafter\skv@filterremoveelements\csname\skv@header
.@postset\endcsname{#1}\skv@getkeyname
}{%
@@ -3334,7 +3815,7 @@
\skv@cltrue\skv@testoptb\skv@undefpostsetkeys
}
\skvrobustdef*\skv@undefpostsetkeys{%
- \skvifcsundef{\skv@header.@postset}{%
+ \skvifcsdefFT{\skv@header.@postset}{%
\skv@err{No postset keys defined for
'\skvcurrentprefix/\skvcurrentfamily'}\@ehd
}{%
@@ -3356,7 +3837,7 @@
\skv@r@movepreposetkeys{#2}{postset}%
}
\skvrobustdef*\skv@r@movepreposetkeys#1#2{%
- \skvifcsdef{\skv@header.@#2}{%
+ \skvifcsdefTF{\skv@header.@#2}{%
\expandafter\skv@filterremoveelements\csname\skv@header
.@#2\endcsname{#1}\skv@getkeyname
}{%
@@ -3372,7 +3853,7 @@
\skv@cltrue\skv@testoptb\skv@undefpreposetkeys
}
\skvrobustdef*\skv@undefpreposetkeys{%
- \skvifcsundef{\skv@header.@preset}{%
+ \skvifcsdefFT{\skv@header.@preset}{%
\skv@err{No preset keys defined for
'\skvcurrentprefix/\skvcurrentfamily'}\@ehd
}{%
@@ -3453,7 +3934,7 @@
\skv@cltrue\skv@testoptb\skv@saveinitialvaluekeys
}
\skvrobustdef*\skv@saveinitialvaluekeys#1{%
- \skvifcsundef{\skv@header.@needini}{%
+ \skvifcsdefFT{\skv@header.@needini}{%
\edef\skv@tempa{\unexpanded{#1}}%
\skvcsvnormalize\skv@tempa
\ifskv@cl\expandafter\global\fi
@@ -3472,7 +3953,7 @@
\skv@cltrue\skv@testoptb\skv@removesaveinitialvaluekeys
}
\skvrobustdef*\skv@removesaveinitialvaluekeys#1{%
- \skvifcsundef{\skv@header.@needini}{%
+ \skvifcsdefFT{\skv@header.@needini}{%
\skv@err{No save-initial keys defined for
'\skvcurrentprefix/\skvcurrentfamily'}\@ehd
}{%
@@ -3489,7 +3970,7 @@
\skv@cltrue\skv@testoptb\skv@undefsaveinitialvaluekeys
}
\skvrobustdef*\skv@undefsaveinitialvaluekeys{%
- \skvifcsundef{\skv@header.@needini}{%
+ \skvifcsdefFT{\skv@header.@needini}{%
\skv@err{No save-initial keys defined for
'\skvcurrentprefix/\skvcurrentfamily'}\@ehd
}{%
@@ -3502,7 +3983,7 @@
\skvrobustdef*\skvignorekeys{\skv@clfalse\skv@testoptb\skv@ignorekeys}
\skvrobustdef*\skvgignorekeys{\skv@cltrue\skv@testoptb\skv@ignorekeys}
\skvrobustdef*\skv@ignorekeys#1{%
- \skvifcsdef{\skv@header.@ignoredkeys}{%
+ \skvifcsdefTF{\skv@header.@ignoredkeys}{%
\expandafter\skv@filtermergelist\csname
\skv@header.@ignoredkeys\endcsname{#1}\skv@getkeyname
}{%
@@ -3521,7 +4002,7 @@
\skv@cltrue\skv@testoptb\skv@removeignorekeys
}
\skvrobustdef*\skv@removeignorekeys#1{%
- \skvifcsundef{\skv@header.@ignoredkeys}{%
+ \skvifcsdefFT{\skv@header.@ignoredkeys}{%
\skv@err{No ignore keys defined for
'\skvcurrentprefix/\skvcurrentfamily'}\@ehd
}{%
@@ -3538,7 +4019,7 @@
\skv@cltrue\skv@testoptb\skv@undefignorekeys
}
\skvrobustdef*\skv@undefignorekeys{%
- \skvifcsundef{\skv@header.@ignoredkeys}{%
+ \skvifcsdefFT{\skv@header.@ignoredkeys}{%
\skv@err{No ignore keys defined for
'\skvcurrentprefix/\skvcurrentfamily'}\@ehd
}{%
@@ -3568,9 +4049,9 @@
\skvnewlet\skvapendtocallback\skvappendkeycode
\skvrobustdef*\skv@prependkeycode#1#2#3{%
\edef\skvcurrentkey{\skvtrimspace{#2}}%
- \skvifcsdef{\skv@header\skvcurrentkey.@cbk}{%
+ \skvifcsdefTF{\skv@header\skvcurrentkey.@cbk}{%
\skvcsedef{\skv@header\skvcurrentkey.@cbk}{%
- \skvifstrcmp{#1}{prep}{%
+ \skvifstrcmpTF{#1}{prep}{%
\skvtrimspace{#3}%
\skvexpandcsonce{\skv@header\skvcurrentkey.@cbk}%
}{%
@@ -3608,7 +4089,7 @@
\skvrobustdef*\skvgetrmkeys{\skv@clfalse\skv@testoptb\skv@getrmkeys}
\skvrobustdef*\skvggetrmkeys{\skv@cltrue\skv@testoptb\skv@getrmkeys}
\skvrobustdef*\skv@getrmkeys#1{%
- \skvifcsdef{\skv@header.@rmkeys}{%
+ \skvifcsdefTF{\skv@header.@rmkeys}{%
\skvletcs#1{\skv@header.@rmkeys}%
\ifskv@cl\global\let#1=#1\fi
}{%
@@ -3641,7 +4122,7 @@
\skv@prepotrue
\skvecommaloop*\skv@fams\skvcurrentfamily{%
\skv@makeheader\skvcurrentfamily
- \skvifcsundef{\skv@header.@#2}{}{%
+ \skvifcsdefFT{\skv@header.@#2}{}{%
\skv@toksa\expandafter\expandafter\expandafter
{\csname\skv@header.@#2\endcsname}%
\skvexpandtwoargs\skv@setkeys@b{\the\skv@toksa}%
@@ -3670,12 +4151,12 @@
\fi
% \skv@na can't be anywhere else, not in \skv@setkeys@a.
\edef\skv@na{\unexpanded{#2}}%
- \skvifempty\skv@na{}{\skvcsvnormalize\skv@na}%
+ \skvifemptyTF\skv@na{}{\skvcsvnormalize\skv@na}%
\edef\skv@tempa{\unexpanded{#1}}%
- \skvifempty\skv@tempa{}{\skvkvnormalize\skv@tempa}%
+ \skvifemptyTF\skv@tempa{}{\skvkvnormalize\skv@tempa}%
\def\skv@setkeys@c##1={%
- \skvxifin{(}{\detokenize{##1}}{%
- \skvxifin{)}{\detokenize{##1}}{%
+ \skvxifinTF{(}{\detokenize{##1}}{%
+ \skvxifinTF{)}{\detokenize{##1}}{%
\def\skv@ispntkey{00}%
\skv@extr@ctpntkey{##1}\skvcurrentkey\skvcurrentvalue
\ifx\skvcurrentvalue\@empty
@@ -3693,7 +4174,7 @@
\skv@g@tkeyname##1=\skv@nil\skvcurrentkey
}%
\def\skv@prova####1=####2\skv@nil{%
- \skvifcond\if\skv@ispntkey\fi{}{%
+ \skvifcondTF\if\skv@ispntkey\fi{}{%
\edef\skvcurrentvalue{\skvexpandonce{\@gobble####1}}%
\ifx\skvcurrentvalue\skv@novaluetoks
\skvnovaluetrue
@@ -3701,7 +4182,7 @@
\else
\skvnovaluefalse
\fi
- \skvexpbracenext\skvifbraced\skvcurrentvalue{%
+ \skvexpbracenext\skvifbracedTF\skvcurrentvalue{%
\skvvaluebracedtrue
}{%
% Strip and use pointers from key value:
@@ -3738,24 +4219,24 @@
\skvrobustdef*\skv@setkeys@d{%
\skv@cnta\@ne
\skvletcs\skv@tempa{\skv@header.@ignoredkeys}%
- \skvifdef\skv@tempa{%
- \skvxifin{,\skvcurrentkey,}{,\skv@tempa,}{%
+ \skvifdefTF\skv@tempa{%
+ \skvxifinTF{,\skvcurrentkey,}{,\skv@tempa,}{%
\skv@cnta\skvz@
}{%
- \skvxifin{,\skvcurrentkey,}{,\skv@na,}{\skv@cnta\skvz@}{}%
+ \skvxifinTF{,\skvcurrentkey,}{,\skv@na,}{\skv@cnta\skvz@}{}%
}%
}{%
- \skvxifin{,\skvcurrentkey,}{,\skv@na,}{\skv@cnta\skvz@}{}%
+ \skvxifinTF{,\skvcurrentkey,}{,\skv@na,}{\skv@cnta\skvz@}{}%
}%
- \skvifnum\skv@cnta=\skvz@{}{%
+ \skvifnumTF\skv@cnta=\skvz@{}{%
\skv@kffalse
- \skvifdefbool{skv@prepo}{%
+ \skvifdefboolTF{skv@prepo}{%
\skv@setkeys@e
}{%
- \skvifdefbool{skv@intry}{%
+ \skvifdefboolTF{skv@intry}{%
\skv@setkeys@e
}{%
- \skvifdefbool{skv@pl}{%
+ \skvifdefboolTF{skv@pl}{%
\skvecommaloop*\skv@fams\skvcurrentfamily{%
\skv@makeheader\skvcurrentfamily
\skv@setkeys@e
@@ -3776,15 +4257,15 @@
}%
}%
}%
- \skvifdefbool{skv@kf}{%
- \ifskv@inpox\skvafterfifi@inneriscond
- \ifx\skv@testclass\skv@documentclass\skvafterfi
+ \skvifdefboolTF{skv@kf}{%
+ \skvifdefboolTF{skv@inpox}{%
+ \ifx\skv@userclassorpackage\skv@documentclass\skvafterfi
\expandafter\skv@useoption\expandafter{\CurrentOption}%
\fi
- \fi
+ }{}%
}{%
- \skvifdefbool{skv@inpox}{%
- \skvifcsdef{\skv@header.@famhandler}{%
+ \skvifdefboolTF{skv@inpox}{%
+ \skvifcsdefTF{\skv@header.@famhandler}{%
\begingroup
\let\elt\skvexpandonce
\skvexpanded{\endgroup
@@ -3793,21 +4274,21 @@
{\elt\skvcurrentkey}{\elt\skvcurrentvalue}%
}%
}{%
- \skvifcsdef{skv@dox@\@currname @\@currext}{%
+ \skvifcsdefTF{skv@dox@\@currname @\@currext}{%
\skvcsuse{skv@dox@\@currname @\@currext}%
}{%
- \ifx\@currext\@clsextension\else
+ \ifx\@currext\@clsextension\else\skvafterfi
\let\CurrentOption\skvcurrentkey\@unknownoptionerror
\fi
}%
}%
}{%
- \skvifdefbool{skv@intry}{%
+ \skvifdefboolTF{skv@intry}{%
% Continue in remaining families. When all the families have
% been searched and the key isn't found, toggle 'intry' false
% and raise error.
}{%
- \skvifdefbool{skv@st}{%
+ \skvifdefboolTF{skv@st}{%
\ifskv@pl
% In this case we've already saved any rm keys.
\relax
@@ -3815,7 +4296,7 @@
\expandafter\skv@setkeys@f
\fi
}{%
- \skvifcsdef{\skv@header.@famhandler}{%
+ \skvifcsdefTF{\skv@header.@famhandler}{%
\begingroup
\let\elt\skvexpandonce
\skvexpanded{\endgroup
@@ -3834,21 +4315,21 @@
}%
}
\skvrobustdef*\skv@setkeys@e{%
- \skvifcsundef{\skv@header\skvcurrentkey.@cbk}{%
+ \skvifcsdefFT{\skv@header\skvcurrentkey.@cbk}{%
\ifskv@intry\skv@successfalse\fi
}{%
\skv@kftrue
\ifskv@intry\skv@successtrue\fi
\ifskvnovalue
- \skvifcsdef{\skv@header\skvcurrentkey.@ndv}{%
+ \skvifcsdefTF{\skv@header\skvcurrentkey.@ndv}{%
\skv@err{Key '\skvcurrenttriple' requires
- \MessageBreak a user value}\@ehd
+ \MessageBreak a user value}{Key value needed.}%
}{%
- \skvifcsdef{\skv@header\skvcurrentkey.@defa}{%
+ \skvifcsdefTF{\skv@header\skvcurrentkey.@defa}{%
\skv@getdefault\skvcurrentprefix\skvcurrentfamily\skvcurrentkey
\skvcurrentvalue
% Check if the default value is braced:
- \skvexpbracenext\skvifnotbraced\skvcurrentvalue{}{%
+ \skvexpbracenext\skvifbracedFT\skvcurrentvalue{}{%
\skvvaluebracedtrue
}%
}{%
@@ -3858,17 +4339,17 @@
}%
}%
\else
- \skvifcsdef{\skv@header\skvcurrentkey.@fbv}{%
+ \skvifcsdefTF{\skv@header\skvcurrentkey.@fbv}{%
\skv@err{Key '\skvcurrenttriple' doesn't
- \MessageBreak accept a user value}\@ehd
+ \MessageBreak accept a user value}{Key value forbidden.}%
}{}%
\fi
- \skvifempty\skvcurrentvalue{}{%
+ \skvifemptyTF\skvcurrentvalue{}{%
\expandafter\skv@replacepointers\expandafter{\skvcurrentvalue}%
}%
% Use argument type to possibly expand the argument:
\def\do##1##2##3{%
- \skvifcsdef{\skv@header\skvcurrentkey.@##1arg}{%
+ \skvifcsdefTF{\skv@header\skvcurrentkey.@##1arg}{%
{\noexpand##2}%
{\skvexpandcsonce{\skv@header\skvcurrentkey.@##1arg}}%
}{%
@@ -3879,7 +4360,7 @@
\edef\skv@prova{%
% This ordering is important:
\do{xx}{\@firstofone}{%
- \do{x2}{\expandcstwice}{%
+ \do{x2}{\skvexpandtwice}{%
\do{x1}{\skvexpandonce}{%
\do{x0}{\unexpanded}{%
\do{}{\unexpanded}{{\noexpand\unexpanded}{####1}}%
@@ -3902,7 +4383,7 @@
}%
\expandafter\skv@provb\skv@prova\skv@arg@nil
\skvcslet{\skv@header\skvcurrentkey.@value}\skvcurrentvalue
- \skvifcsdef{\skv@header\skvcurrentkey.@hp}{%
+ \skvifcsdefTF{\skv@header\skvcurrentkey.@hp}{%
\skvexpanded{\skvcslet{\skvexpandcsonce
{\skv@header\skvcurrentkey.@hp}}}\skvcurrentvalue
}{}%
@@ -3946,7 +4427,7 @@
\skvcommaloop*\skv@fams\skv@tempa{%
\skv@makeheader\skv@tempa
\skvletcs\skv@prova{\skv@header.@rmkeys}%
- \skvifdef\skv@prova{%
+ \skvifdefTF\skv@prova{%
\skvexpandbracenext{\skv@setkeys@a[#1]}\skv@prova
}{}%
}%
@@ -3988,14 +4469,14 @@
\skvcommaloop*\skv@fams\skv@tempa{%
\skv@makeheader\skv@tempa
\skvletcs\skv@tempa{\skv@header.@inikv}%
- \skvifundef\skv@tempa{%
+ \skvifdefFT\skv@tempa{%
\skv@err{No 'save initial value' keys defined in family
\MessageBreak'\skvcurrentprefix/\skvcurrentfamily'}\@ehd
}{%
% '\skv@header.@poxkeys' is the list of keys that have been
% instantiated as current pacakge options.
\skvletcs\skv@tempc{\skv@header.@poxkeys}%
- \skvifundef\skv@tempc{%
+ \skvifdefFT\skv@tempc{%
\edef\skv@tempe{%
\skvexpandonce\skv@tempe
\skvsetkeys[\skvcurrentprefix]{\skvcurrentfamily}%
@@ -4006,7 +4487,7 @@
\def\skv@tempd{}%
\skvcommaloop*\skv@tempa\skv@tempa{%
\expandafter\skv@g@tkeyname\skv@tempa=\skv@nil\skv@tempb
- \skvxifin{,\skvoxdetok\skv@tempb,}{,\skvoxdetok\skv@tempc,}{}{%
+ \skvxifinTF{,\skvoxdetok\skv@tempb,}{,\skvoxdetok\skv@tempc,}{}{%
\edef\skv@tempd{%
\skvexpandonce\skv@tempd\ifx\skv@tempd\@empty\else,\fi
\skvexpandonce\skv@tempa
@@ -4028,7 +4509,7 @@
%
% \skvdefinekeys*+[<pref>]{<fams>}[<hp>]{<list>}
% * -> define only new keys.
-% + -> define across the given families.
+% + -> define in all the given families.
%
% The only difference between \skvedefinekeys and \skvdefinekeys is the
% value of \endlinechar.
@@ -4036,15 +4517,21 @@
% Examples:
%
% \skvdefinekeys*+[KVA]{fam1,fam2}[thp@]{%
-% .ords/{keya,keyb}/{default-a},
-% .cmds/{keyc,keyd}/,
+% .initialize after define=true,
+% .save initial values,
+% .prepend to every key name=X@,
+% .ord/{keya,keyb}/{default-a},
+% .cmd/{keyc,keyd}/,
% .zcmd/key e/\def\cmde##1{##1}/
% \edef\y{\detokenize\expandafter{\thp@keye}}\def\x##1{#1*key e*##1},
-% .choice/keyf/center/{center.do=\def\x##1{#1*##1},left,right},
-% .zbool/show center/true/\edef\cmd{\ifthp@showcenter Yes\else No\fi},
-% .args/{key1,key2}/{#1/#2},
+% .choice/keyf/center/{center.do=\def\x##1{#1*##1},left,right}/
+% \def\f##1{#1*##1}/\@@warning{Invalid value for keyf},
+% .zbool/show center/true/\edef\cmd{\ifthp@showcenter Yes\else No\fi}/
+% \@@warning{Invalid value for show center},
+% .arg/{key1,key2}/{#1/#2},
% .arg/key3/{#1+#2},
% .exec/\def\x##1{##1},
+% .exec code=\def\y##1{##1},
% }
% \skvshowcs{KVA/fam1/keyb.@defa}
% \def\keybval{xx}
@@ -4056,33 +4543,83 @@
% since the key names contain dot (.). Zapping the spaces in the
% key name will not lead to a boolean of the \ifhp@key:
\skvordkey[SKV]{definekeys}{.initialize}[true]{%
- \skvifvalidboolval{#1}{%
+ \skvifboolvalT{#1}{%
\csname skvdfk@initialize#1\endcsname
}%
}
% Save default values as a kv list in macro <header>.@needini:
\skvordkey[SKV]{definekeys}{.save initial values}[true]{%
- \skvifvalidboolval{#1}{%
+ \skvifboolvalT{#1}{%
\csname skvdfk@saveinitialvalues#1\endcsname
}%
}
-%\skvsetkeys[SKV]{definekeys}{.initialize=false,.save initial values=false}
+\skvrobustdef*\skvdfkinitialize{\skvdfk@initializetrue}
+\skvrobustdef*\skvdfksaveinitialvalues{\skvdfk@saveinitialvaluestrue}
+\skvrobustdef*\skvsetupdefinekeys#1{%
+ \skvsetkeys[SKV]{definekeys}{#1}%
+}
+\skvsetupdefinekeys{.initialize=false,.save initial values=false}
+
+\skvrobustdef*\skvdfkkeytypelet#1{%
+ \skvkvparse{#1}\skv@prova{%
+ \skvexpbracenext\skv@kvsplit\skv@prova{%
+ \skvifcsdefTF{skvdfk@typealias@##1}{%
+ \skv@err{Key type alias '##1' already defined}\@ehd
+ }{%
+ \skvifstrcmpTF{##2}{^skv^}{%
+ \skv@err{Key type alias '##1' has no master}\@ehd
+ }{%
+ \skvcsdef{skvdfk@typealias@##1}{##2}%
+ }%
+ }%
+ }%
+ }%
+}
+\skvdfkkeytypelet{%
+ .singleton=.choice,
+ .exec code=.exec,
+ .arg=.argx0,.args=.argx0,
+ .arg expanded once=.argx1,
+ .arg expanded twice=.argx2,
+ .arg expanded=.argxx,
+ .initialize keys after define=.initialize,
+ .initialize after define=.initialize,
+ .initialize keys=.initialize,
+ .save initial values=.saveini,
+ .save initial values of keys=.saveini,
+ .prepend to key name=.preptokey,
+ .prepend to every key name=.preptokey,
+ .append to key name=.apptokey,
+ .append to every key name=.apptokey,
+ .prepend to callback=.preptocode,
+ .prepend to every callback=.preptocode,
+ .append to callback=.apptocode,
+ .append to every callback=.apptocode,
+ .exec after define=.afterdef,
+ .after define=.afterdef,
+}
\skvnewdef*\skv@keyparser{,}
-\skvnewdef*\skvdfk@afterdefinekeys{}
-\skvrobustdef*\AfterDefineKeys{\skvgappendtomacro\skvdfk@afterdefinekeys}
+\skvnewdef*\skvdfk@afterdefine@hook{}
+\skvrobustdef*\skvafterdefinekeys{%
+ \skvgappendtomacro\skvdfk@afterdefine@hook
+}
\skvrobustdef*\skvdfk@testopta#1{%
\skvifstar{%
- \skv@sttrue\skvifplus
+ \skv@sttrue
+ \skvifplus
{\skv@pltrue\skvdfk@testoptb#1}{\skv@plfalse\skvdfk@testoptb#1}%
}{%
- \skv@stfalse\skvifplus
+ \skv@stfalse
+ \skvifplus
{\skv@pltrue\skvdfk@testoptb#1}{\skv@plfalse\skvdfk@testoptb#1}%
}%
}
-\skvrobustdef*\skvdfk@testoptb#1{\skv@testopt{\skvdfk@t@stoptb{#1}}{KV}}
+\skvrobustdef*\skvdfk@testoptb#1{%
+ \skv@testopt{\skvdfk@t@stoptb{#1}}\skv@defaultpref
+}
\skvrobustdef*\skvdfk@t@stoptb#1[#2]#3{%
- \skvxifin{,}{\detokenize{#2}}{%
+ \skvxifinTF{,}{\detokenize{#2}}{%
\skv@err{Only one prefix is allowed when calling
\MessageBreak \noexpand\skvdefinekeys or similar commands,
\MessageBreak but you gave '#2'}\@ehd
@@ -4092,7 +4629,7 @@
% macro \skvdefinekeys.
\edef\skv@checkkeyexist{\ifskv@st00\else01\fi}%
\edef\skvdfk@pref{#2}%
- \skvxifin{,}{\detokenize{#3}}{%
+ \skvxifinTF{,}{\detokenize{#3}}{%
\edef\skvdfk@fams{#3}%
\skvcsvnormalize\skvdfk@fams
}{%
@@ -4102,264 +4639,338 @@
\skv@testopt#1{userhp@}%
}%
}
-\skvnewnumbers{skvdfk@depth}
-\skvrobustdef*\skv@pushdefinekeys{%
- \skvpushfunctions\skvdefinekeys{%
- \do\skvdfk@pref\do\skvdfk@fams\do\skvdfk@currlist\do\skv@accumulated
- \do\skv@acc@mulated\do\skv@igkeys\do\skvdfk@keys\do\skvdfk@keyvals
- \do\skv@itemfour\do\skv@itemfive\do\skv@checkkeyexist\do\skv@hp
- \do\skv@type\do\skv@typenr\do\skv@default\do\skv@isarg
- \do\ifskvdfk@initialize\do\ifskvdfk@saveinitialvalues\do\ifskv@st
- \do\ifskv@pl\do\skvcurrentprefix\do\skvcurrentfamily\do\skvcurrentkey
- }\skvdfk@depth
-}
+% \skvedefinekeys has no stack, since everything is done in a local group.
+% It is \skvmakekeys that has a stack.
\skvrobustdef*\skvedefinekeys{%
- \skv@pushdefinekeys
\begingroup
\endlinechar\m@ne
- \skvdfk@testopta\skv@definekeys
+ \skvdfk@testopta\skv@definekeys@a
}
\skvrobustdef*\skvdefinekeys{%
- \skv@pushdefinekeys
\begingroup
- \skvdfk@testopta\skv@definekeys
+ \skvdfk@testopta\skv@definekeys@a
}
-\skvrobustdef*\skv@definekeys[#1]#2{%
- \skvexpanded{\endgroup
- \skvcmdexitloop{\skv@checkkeyexist\skvdfk@pref\skvdfk@fams}%
- \skvboolexit\ifskv@pl
- }%
+\skvrobustdef*\skv@definekeys@a[#1]#2{%
\skvindeftrue
+ \def\skv@validtypes{%
+ .ord,.cmd,.zcmd,.bool,.zbool,.tog,.ztog,.choice,.choice*,%
+ .exec,.afterdef,.initialize,.saveini,.argx0,.argx1,.argx2,.argxx,%
+ .preptokey,.apptokey,.preptocode,.apptocode%
+ }%
+ \def\iftypeis##1\then{%
+ \ifnum\skv@strcmp{\skvoxdetok\skv@type}{\detokenize{##1}}=\skvz@
+ }%
+ \def\skv@prependtoeverykeyname{}%
+ \def\skv@appendtoeverykeyname{}%
+ \def\skv@prependtoeverycallback{}%
+ \def\skv@appendtoeverycallback{}%
\edef\skv@hp{#1}%
\skvdespacecontent\skv@hp
- \def\skv@accumulated{}%
+ \def\skv@accumulateonfams{}%
\skv@makeprefix\skvdfk@pref
\edef\skvdfk@currlist{\skvkeepdoubleslashnormalize{#2}}%
- \def\skv@d@finekeys##1{%
+ \def\skv@definekeys@b##1{%
\skv@makeheader{##1}%
- \def\skv@acc@mulated{}%
+ \def\skv@accumulateonkeys{}%
\def\skvdfk@keys{}%
\def\skvdfk@keyvals{}%
- \expandafter\skv@d@f@nekeys\expandafter{\skvdfk@currlist}%
+ \skvexpbracenext\skv@definekeys@c\skvdfk@currlist
}%
% If the plus variant is not specified, just take and use the first
% family.
- \skvifdefbool{skv@pl}{%
+ \skvifdefboolTF{skv@pl}{%
\skvcommaloop*\skvdfk@fams\skv@tempa{%
- \expandafter\skv@d@finekeys\expandafter{\skv@tempa}%
+ \skvexpbracenext\skv@definekeys@b\skv@tempa
}%
}{%
\def\skv@prova##1,##2\skv@nil{%
- \skv@d@finekeys{##1}%
+ \skv@definekeys@b{##1}%
}%
\expandafter\skv@prova\skvdfk@fams,\skv@nil
}%
- \skv@accumulated
- \skvpopfunctions\skvdefinekeys\skvdfk@depth
+ \edef\skv@accumulateonfams{%
+ \skvxonce\skv@accumulateonfams
+ \skvxonce\skvdfk@afterdefine@hook\relax
+ }%
+ \expandafter\endgroup\skv@accumulateonfams
\skvindeffalse
- \skvdfk@afterdefinekeys\relax
- \def\skvdfk@afterdefinekeys{}%
+ % 1. No need to reinitialize \skvdfk@afterdefine@hook here. Any changes
+ % done within the exited group haven't survived outside the group.
+ % 2. Don't call \skvdfk@initializefalse and \skvdfk@saveinitialvaluesfalse
+ % here while in \directkeys: this is reentered for each path.
+ \ifskvindirkeys\else
+ \skvdfk@initializefalse\skvdfk@saveinitialvaluesfalse
+ \fi
}
-\skvrobustdef*\skv@d@f@nekeys#1{%
+\skvrobustdef*\skv@definekeys@c#1{%
\edef\skv@igkeys{%
- \skvifcsdef{\skv@header.@ignoredkeys}{%
+ \skvifcsname\skv@header.@ignoredkeys\then
\skvexpandcsonce{\skv@header.@ignoredkeys}%
- }{}%
+ \fi
}%
\def\skv@splita##1/##2/{\skv@splitb##1/##2/.}%
\def\skv@splitb##1/##2/##3/##4/##5/##6/##7/##8/##9\skv@split@nil{%
- \let\skv@gobble\relax
- \edef\skv@type{\unexpanded{##1}}%
- % Take the default early: it is needed in splitting multiple keys of
- % the same type. In this case, the default value will not change
- % until the splitting is completed.
- \edef\skv@default{\skvexpandonce{\@gobble##3}}%
- \def\skv@isarg{01}%
- \def\skv@prova####1{%
- \def\skv@prova########1####1########2########3\skv@nil{%
- \def\skv@typenr{########2}%
- \ifx\skv@typenr\skv@nnil
- \skv@err{Invalid key type '####1'}\@ehd
- \else
- \ifnum\skv@typenr>6\relax
- \ifnum\skv@typenr<11\relax
- \def\skv@isarg{00}%
- \fi
- \fi
- \fi
- }%
- \skv@prova .ord{0}.cmd{1}.zcmd{2}.bool{3}.zbool{4}.choice{5}%
- .exec{6}.arg{7}.arg expanded{8}.arg expanded once{9}%
- .arg expanded twice{10}.ords{11}.cmds{12}.zcmds{13}.bools{14}%
- .zbools{15}.choices{16}.args{17}####1{\skv@nil}\skv@nil
- }%
- \expandafter\skv@prova\expandafter{\skv@type}%
- \skvxifin{,\skv@typenr,}{,11,12,13,14,15,16,17,}{%
- % Accumulate multiple keys of the same type:
- \def\skv@prova####1s{\def\skv@type{####1}}%
- \expandafter\skv@prova\skv@type
- \skvcommaparse{##2}\skv@tempa{%
- \skvexpanded{%
- \noexpand\skv@splita
- \skv@type/\skv@tempa/\skvexpandonce\skv@default/%
- \unexpanded{##4/##5/##6/##7/##8/##9}\noexpand\skv@split@nil
- }%
- }%
- % Skip the rest of \skv@splitb:
- \let\skv@gobble\skv@gobbletoend
+ \skvxifinTF{\skv@hashchar}{\detokenize{##2}}{%
+ \skv@err{Key name(s) '\detokenize{##2}' contain hash character}\@ehd
}{%
- \skvifnum\skv@typenr=6{%
- ##2%
- \let\skv@gobble\skv@gobbletoend
- }{%
- % There may be multiple keys in ##2. So keep findpointers here,
- % where multiple keys would have been split into separate units.
- % For example, we can't check for ignored keys without first
- % stripping the pointers:
- \skv@strippointers{##2}\skvcurrentkey
- \skvxifin{,\skvoxdetok\skvcurrentkey,}{,\skvoxdetok\skv@igkeys,}{%
- \let\skv@gobble\skv@gobbletoend
- }{%
- \if\skv@isarg
- \skvdfk@definearg\skv@type\skvcurrentkey\skv@default
- \let\skv@gobble\skv@gobbletoend
- \else
- \let\skv@gobble\relax
- \fi
+ % In case we have, eg, .exec=\def\x{?} instead of .exec/\def\x{?}:
+ \skvxifinTF{=}{\detokenize{##1}}{%
+ \skv@kvsplit{##1}{%
+ \edef\skv@type{\skvtrimspace{####1}}%
+ \edef\skv@itemtwo{\skvtrimspace{####2}}%
}%
+ }{%
+ \edef\skv@type{\unexpanded{##1}}%
+ \edef\skv@itemtwo{\unexpanded{##2}}%
}%
}%
- \skv@gobble
+ \skvifcsname skvdfk@typealias@\skv@type\then
+ \edef\skv@type{\skvcsuse{skvdfk@typealias@\skv@type}}%
+ \fi
+ \edef\skv@default{\skvexpandonce{\@gobble##3}}%
+ % To avoid mixing parameter characters in \skv@prova:
+ \edef\skv@rest{\unexpanded{{##4}/{##5}/{##6}/{##7}/{##8}/{##9}}}%
+ \skvexpbracenext\skv@definekeys@d\skv@type
+ }%
+ \def\skv@splitc##1/##2/##3/##4/##5/##6/##7/##8/##9\skv@split@nil{%
\edef\skv@itemfour{\unexpanded{##4}}%
\edef\skv@itemfive{\unexpanded{##5}}%
- \skvxifin{\skv@hashchar}{\detokenize{##2}}{%
- \skv@err{Key name '\detokenize{##2}' contains hash character}\@ehc
- }{}%
- \if\skv@checkkeyexist
- \skvifcsdef{\skv@header\skvcurrentkey.@cbk}{%
- \skv@err{Key '\skvcurrenttriple' already exists}\@ehd
- }{}%
- \fi
- \ifnum\skv@typenr=5\relax
- \edef\skv@prova{%
- 0\ifx\skv@itemfour\@empty 1\else\ifx\skv@itemfour\skv@rej 1\fi\fi
- }%
- \ifcase\skv@prova\relax
- \def\skv@altlista{}\def\skv@altlistb{}%
- % \skv@itemfour is need here to hide unbalanced conditionals in ##4:
- \expandafter\skv@getaltlist\expandafter{\skv@itemfour}%
- \else
- \skv@err{Empty alternate list for choice key '\skvcurrentkey'}\@ehd
+ \edef\skv@itemsix{\unexpanded{##6}}%
+ \skvifplaswTF\skv@isarg{%
+ \skvdfk@definearg{##1}{##2}{##3}%
+ }{%
+ \if\skv@checkkeyexist
+ \skvifcsname\skv@header##2.@cbk\then
+ \skv@err{Key '\skvcurrenttriple' already exists}\@ehd
+ \fi
\fi
- \fi
- \edef\skvdfk@keys{\skvaddlist,\skvdfk@keys\skvcurrentkey}%
- \skvxifboolval{\skvexpandonce\skv@default}\in@true\in@false
- \edef\skvdfk@keyvals{%
- \skvaddlist,\skvdfk@keyvals
- % If a key has no default, then it can't be initialized. An empty
- % default value should be indicated with a slash, eg, keya below:
- % .cmd/keya/, .bool/keyb/true.
- \expandafter\skv@ifrejorna\expandafter{\skv@default}{}{%
- \skvcurrentkey=\skvifdefbool{in@}{false}{\skvxonce\skv@default}%
- }%
- }%
- \edef\skv@acc@mulated{%
- \skvexpandonce\skv@acc@mulated
- \skvnoexpandcs{skv\expandafter\@gobble\skv@type key}%
- \ifnum\skv@typenr=5*\fi
- \ifnum\skv@typenr>2\ifnum\skv@typenr<6+\fi\fi
- [\skvcurrentprefix]{\skvcurrentfamily}%
- % ##2 should be inserted below instead of \skvcurrentkey, because
- % \skvcurrentkey has had any possible pointer stripped:
- \ifnum\skv@typenr>0\ifnum\skv@typenr<6[\skv@hp]\fi\fi
- {##2}%
- \ifnum\skv@typenr=5% no \relax here.
- [\unexpanded{\skvuserinput\skvorder}]{\skvexpandonce\skv@altlista}%
+ \if\skv@ischoice
+ \skv@ifcmdnut\skv@itemfour{%
+ \skv@err{Empty nominations (state pattern) for
+ \MessageBreak choice key '##2'}\@ehd
+ }{}%
\fi
- % default:
- \expandafter\skv@ifrejorna\expandafter{\skv@default}{}{%
- [{\skvexpandonce\skv@default}]%
+ \edef\skvdfk@keys{\skvaddlist,\skvdfk@keys##2}%
+ \skvxifboolvalTF{\skvexpandonce\skv@default}\in@true\in@false
+ \edef\skvdfk@keyvals{%
+ \skvaddlist,\skvdfk@keyvals
+ \skv@ifcmdrejordotna\skv@default{}{%
+ ##2=\skvifdefboolTF{in@}{false}{\skvexpandonce\skv@default}%
+ }%
}%
- {%
- % Key callback. If choice key, then the callback is item 5,
- % otherwise it's item 4:
- \skvifnum\skv@typenr=5{%
- \skvifx\skv@itemfive\skv@rej{}{\skvexpandonce\skv@itemfive}%
- \skv@executealt{########1}{\skvexpandonce\skv@altlistb}%
- }{%
- \skvifx\skv@itemfour\skv@rej{}{\skvexpandonce\skv@itemfour}%
+ \if\skv@isboolorchoice
+ \if\skv@ischoice
+ \let\skv@altact\skv@itemsix
+ \else
+ % bool or tog:
+ \let\skv@altact\skv@itemfive
+ \fi
+ \skv@ifcmdnut\skv@altact{\let\skv@altact\skvkeyvalueerror}{}%
+ \fi
+ \iftypeis.choice*\then
+ \def\skv@prova####1*{\def\skv@typeb{####1}}%
+ \expandafter\skv@prova\skv@type
+ \else
+ \let\skv@typeb\skv@type
+ \fi
+ % Remove leading dot (.):
+ \edef\skv@typeb{\expandafter\@gobble\skv@typeb}%
+ \edef\skv@accumulateonkeys{%
+ \skvexpandonce\skv@accumulateonkeys
+ \skvnoexpandcs{skv\skv@typeb key}%
+ \iftypeis.choice*\then*\fi
+ \if\skv@isboolorchoice+\fi
+ [\skvcurrentprefix]{\skvcurrentfamily}%
+ \if\skv@needhp[\skv@hp]\fi
+ {##2}%
+ \if\skv@ischoice
+ [\unexpanded{\skvuserinput\skvorder}]{\skvxonce\skv@itemfour}%
+ \fi
+ % default:
+ \skv@ifcmdrejordotna\skv@default{}{[{\skvxonce\skv@default}]}%
+ {% Key callback:
+ \skvxonce\skv@prependtoeverycallback
+ % If choice key, then the callback is item 5, otherwise
+ % it's item 4:
+ \if\skv@ischoice
+ \skv@ifcmdnut\skv@itemfive{}{\skvxonce\skv@itemfive}%
+ \else
+ \skv@ifcmdnut\skv@itemfour{}{\skvxonce\skv@itemfour}%
+ \fi
+ \skvxonce\skv@appendtoeverycallback
}%
+ % Second branch of callback for '+' variants, now used for all
+ % boolean and choice keys:
+ \if\skv@isboolorchoice{\skvexpandonce\skv@altact}\fi
}%
- % Second branch of callback for '+' variants, now used for all
- % boolean and choice keys:
- \ifnum\skv@typenr>2\ifnum\skv@typenr<6{\skvkeyvalueerror}\fi\fi
}%
- \skv@gobble@nil
}%
\skvexpanded{\skvparselist{\skv@keyparser}}{#1}\skv@prova{%
\expandafter\skv@splita\skv@prova
/^skv^/^skv^/^skv^/^skv^/^skv^/^skv^/^skv^/^skv^\skv@split@nil
}%
- % 1. \skv@accumulated is a two-layer stack: there're loops on families
- % and keys.
+ % 1. \skv@accumulateonfams is a two-layer stack: there're loops on
+ % families and keys.
% 2. To save initial values of keys, the key names should be
% entered by \skvsaveinitialvaluekeys in 'needini' list. This is
% the case even when the boolean '.initialize' is true. See below.
% 3. The boolean '.save initial values' is the one that will invoke
% \skvsaveinitialvaluekeys below.
- \edef\skv@accumulated{%
- \skvexpandonce\skv@accumulated % looping on families
- \skvifdefbool{skvdfk@saveinitialvalues}{%
- \noexpand\skvsaveinitialvaluekeys[\skvcurrentprefix]%
- {\skvcurrentfamily}{\skvexpandonce\skvdfk@keys}%
- }{}%
- \skvexpandonce\skv@acc@mulated % looping on keys
- \skvifdefbool{skvdfk@initialize}{%
- \noexpand\skvsetkeys[\skvcurrentprefix]%
- {\skvcurrentfamily}{\skvexpandonce\skvdfk@keyvals}%
- }{}%
+ \def\@elt{%
+ [\skvcurrentprefix]{\skvcurrentfamily}{\skvxonce\skvdfk@keyvals}%
+ }%
+ \edef\skv@accumulateonfams{%
+ \skvexpandonce\skv@accumulateonfams
+ \ifskvdfk@saveinitialvalues
+ \noexpand\skvsaveinitialvaluekeys\@elt
+ \fi
+ \skvexpandonce\skv@accumulateonkeys
+ \ifskvdfk@initialize
+ \noexpand\skvsetkeys\@elt
+ \fi
+ }%
+}
+\skvrobustdef*\skv@definekeys@d#1{%
+ \skvxifinFT{,#1,}{,\skv@validtypes,}{%
+ \skv@err{Invalid key type '#1' in \string\skvdefinekeys}\@ehd
+ }{%
+ \@tempswatrue
+ \iftypeis.exec\then
+ \@tempswafalse
+ \edef\skv@accumulateonkeys{%
+ \skvexpandonce\skv@accumulateonkeys\skvexpandonce\skv@itemtwo
+ }%
+ \else
+ \iftypeis.initialize\then
+ \@tempswafalse
+ \skv@ifcmdnut\skv@itemtwo{%
+ \edef\skv@itemtwo{true}%
+ }{%
+ \skvexpbracenext\skvifboolvalT\skv@itemtwo\relax
+ }%
+ \csname skvdfk@initialize\skv@itemtwo\endcsname
+ \edef\skv@accumulateonfams{%
+ \skvexpandonce\skv@accumulateonfams
+ \noexpand\csname skvdfk@initialize\skv@itemtwo\endcsname
+ }%
+ \else
+ \iftypeis.saveini\then
+ \@tempswafalse
+ \skv@ifcmdnut\skv@itemtwo{%
+ \edef\skv@itemtwo{true}%
+ }{%
+ \skvexpbracenext\skvifboolvalT\skv@itemtwo\relax
+ }%
+ \csname skvdfk@saveinitialvalues\skv@itemtwo\endcsname
+ \edef\skv@accumulateonfams{%
+ \skvexpandonce\skv@accumulateonfams
+ \noexpand\csname skvdfk@saveinitialvalues\skv@itemtwo
+ \endcsname
+ }%
+ \else
+ \iftypeis.preptokey\then
+ \@tempswafalse
+ \let\skv@prependtoeverykeyname\skv@itemtwo
+ \else
+ \iftypeis.apptokey\then
+ \@tempswafalse
+ \let\skv@appendtoeverykeyname\skv@itemtwo
+ \else
+ \iftypeis.preptocode\then
+ \@tempswafalse
+ \let\skv@prependtoeverycallback\skv@itemtwo
+ \else
+ \iftypeis.apptocode\then
+ \@tempswafalse
+ \let\skv@appendtoeverycallback\skv@itemtwo
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \skvifdefboolTF{@tempswa}{%
+ % Leave these tests here, so that they aren't repeated for each
+ % key in the next loop:
+ \def\do##1{\def##1{01}}%
+ \do\skv@isboolorchoice\do\skv@ischoice\do\skv@needhp\do\skv@isarg
+ \skvifinTF{,#1,}{,.choice,.choice*,}{%
+ \skvstripouterbraces{2}\skv@default
+ \def\skv@ischoice{00}%
+ \def\skv@isboolorchoice{00}%
+ \def\skv@needhp{00}%
+ }{%
+ \skvifinTF{,#1,}{,.bool,.zbool,.tog,.ztog,}{%
+ \def\skv@isboolorchoice{00}%
+ \def\skv@needhp{00}%
+ }{%
+ \skvifinTF{,#1,}{,.cmd,.zcmd,}{%
+ \def\skv@needhp{00}%
+ }{%
+ \skvifinTF{,#1,}{,.argx0,.argx1,.argx2,.argxx,}{%
+ \def\skv@isarg{00}%
+ }{}%
+ }%
+ }%
+ }%
+ \skvcommaprocess*\skv@itemtwo\skv@tempa{%
+ \skvexpbracenext\skv@strippointers\skv@tempa\skvcurrentkey
+ \edef\skvcurrentkey{%
+ \skv@prependtoeverykeyname\skvcurrentkey
+ \skv@appendtoeverykeyname
+ }%
+ \let\do\skvoxdetok
+ \skvxifinTF{,\do\skvcurrentkey,}{,\do\skv@igkeys,}{}{%
+ \edef\do{%
+ \noexpand\skv@splitc#1/\skvcurrentkey/%
+ {\skvexpandonce\skv@default}/\skvexpandonce\skv@rest
+ }%
+ \do\skv@split@nil
+ }%
+ }%
+ }{%
+ \skvifinFT{,#1,}
+ {,.preptokey,.apptokey,.preptocode,.apptocode,}{}{%
+ \let\skv@tempa\skv@itemtwo
+ \skvexpbracenext\skv@strippointers\skv@itemtwo\skv@itemtwo
+ \ifx\skv@tempa\skv@itemtwo\else
+ \skv@err{The token ||\skvoxdetok\skv@itemtwo||
+ \MessageBreak shouldn't contain pointers for the
+ given key type or requested action}\@ehd
+ \fi
+ }%
+ }%
}%
}
%
% Assigning arguments within \skvdefinekeys:
%
-% Eg, .args/{key1,key2}/{#1/#2}
+% Eg, .arg/{key1,key2}/{#1/#2}
%
\skvrobustdef*\skvdfk@definearg#1#2#3{%
\begingroup
- \toks@\expandafter{#3}%
\def\skv@prova.arg##1\skv@nil{%
- \if\relax\detokenize{##1}\relax
- \def\skv@prova{x0}%
- \else
- \edef\skv@provb{\skvtrimspace{##1}}%
- \def\skv@prova####1{%
- \def\skv@prova########1####1########2########3\skv@nil{%
- \def\skv@prova{########2}%
- \ifx\skv@prova\skv@nnil
- \def\skv@prova{x0}%
- \fi
- }%
- \skv@prova
- expanded{xx}expand once{x1}expand twice{x2}####1{\skv@nil}\skv@nil
- }%
- \expandafter\skv@prova\expandafter{\skv@provb}%
- \fi
+ \edef\skv@prova{\skvtrimspace{##1}}%
+ }%
+ \skv@prova#1\skv@nil
+ \edef\skv@accumulateonkeys{%
+ \skvexpandonce\skv@accumulateonkeys
+ \skvcsedef{\skv@header#2.@\skv@prova arg}{%
+ \noexpand\unexpanded{\unexpanded{#3}}%
+ }%
}%
- \expandafter\skv@prova#1\skv@nil
- \skvcsedef{\skv@header#2.@\skv@prova arg}{\the\toks@}%
- \expandafter\skvaftergroupdef
- \csname\skv@header#2.@\skv@prova arg\endcsname\endgroup
+ \skvaftergroupdef\skv@accumulateonkeys\endgroup
}
%+++++++++++++++++++++++ Keys for \skvmakekeys +++++++++++++++++++++++%
% Example:
% \skvmakekeys[
-% prefix=KVA, families={fam1,fam2}, hp=thp@, all new,
-% define in all families, initialize=true, endlinechar=-1
+% .prefix=KVA, .families={fam1,fam2}, .hp=thp@, .all new,
+% .define in all families, .initialize=true, .endlinechar=-1
% ]{%
-% .ords/{keya,keyb}/{default-a},
-% .cmds/{keyc,keyd}/,
+% .ord/{keya,keyb}/{default-a},
+% .cmd/{keyc,keyd}/,
% .zcmd/key e/\def\cmde##1{##1}/
% \edef\y{\detokenize\expandafter{\thp@keye}}\def\x##1{#1*key e*##1},
% .choice/keyf/center/{center.do=\def\x##1{#1*##1},left,right},
@@ -4370,34 +4981,35 @@
% \skvsetkeys[KVA]{fam1}{keyb=.expand once{\keybval}}
\skvedefinekeys*[SKV]{makekeys}[skvmk@]{%
- .ords/{.new,.all new,.all are new}/true/
- \edef\skvmk@allnew{\skvifstrcmp{#1}{true}{00}{01}}
+ .ord/{.new,.all new,.all are new}/true/
+ \edef\skvmk@allnew{0\skvifstrcmpTF{#1}{true}{0}{1}}
,
- .ords/{.initialize,.initialize after define}/true/
- \skvifvalidboolval{#1}{%
+ .ord/{.initialize,.initialize after define,.initialize keys after define}
+ /true/
+ \skvifboolvalT{#1}{%
\csname skvdfk@initialize#1\endcsname
}%
,
- .ord/.save initial values/true/
- \skvifvalidboolval{#1}{%
+ .ord/.save initial values,.save initial values of keys/true/
+ \skvifboolvalT{#1}{%
\csname skvdfk@saveinitialvalues#1\endcsname
}%
,
- .ords/{.endlinechar,.endline character}/13/
+ .ord/{.endlinechar,.endline character}/13/
\def\skvmk@endlinechar{#1},
- .ords/{.define in all families,.in all families}/true/
- \edef\skvmk@inallfams{\skvifstrcmp{#1}{true}{00}{01}}
+ .ord/{.define in all families,.in all families}/true/
+ \edef\skvmk@inallfams{0\skvifstrcmpTF{#1}{true}{0}{1}}
,
- .ord/.prefix/KV/
+ .ord/.prefix/\skv@defaultpref/
\skviflacus#1\then
- \def\skvmk@pref{KV}%
+ \let\skvmk@pref\skv@defaultpref
\else
\edef\skvmk@pref{#1}%
\skvstripouterbraces{2}\skvmk@pref
\fi
,
- .ords/{.holder prefix,.hp}/userhp@/\edef\skvmk@hp{#1},
- .ords/{.family,.families}/^skv^/
+ .ord/{.holder prefix,.hp}/userhp@/\edef\skvmk@hp{#1},
+ .ord/{.family,.families}/\@nil/
\skviflacus#1\then
\skv@err{Key family is empty\on@line}\@ehd
\else
@@ -4406,6 +5018,7 @@
\fi
,
}
+
% Default settings for keys of \skvmakekeys. Presetting keys will be
% inefficient here, since many of the keys have complements. It will be
% necessary to include all the complements in the preset list, but doing
@@ -4423,19 +5036,17 @@
\do\ifskvdfk@saveinitialvalues
}\skv@makekeysdepth
\skvsetkeys[SKV]{makekeys}{#1}%
- \ifx\skvmk@fams\skv@rej
+ \ifx\skvmk@fams\@nnil
\skv@err{No family specified for \string\skvmakekeys}\@ehd
\fi
- % Push the stack of \skvdefinekeys:
- \skv@pushdefinekeys
% The following \begingroup is ended in \skv@definekeys:
\begingroup
\skvexpanded{%
\endlinechar=\skvmk@endlinechar\relax
- \skvdfk@testopta\skv@definekeys
+ \skvdfk@testopta\skv@definekeys@a
\if\skvmk@allnew*\fi\if\skvmk@inallfams+\fi
[\skvmk@pref]{\skvmk@fams}%
- [\ifx\skvmk@hp\@empty skvhp@\else\skvmk@hp\fi]%
+ [\ifx\skvmk@hp\@empty userhp@\else\skvmk@hp\fi]%
}%
{#2}%
\skvpopfunctions\skvmakekeys\skv@makekeysdepth
@@ -4444,52 +5055,19 @@
\skvrobustdef*\skvkeyvalueerror{%
\skv@getinnoval\CurrentOption
\skv@err{Erroneous value '\skv@ival' for key or option
- \MessageBreak'\skvcurrentkey'}
- {Invalid key value encountered.}%
-}
-\skvrobustdef*\skv@getaltlist#1{%
- \begingroup
- \def\skv@g@taltlist##1.do=##2.do=##3\skv@nil{%
- \edef\skv@prova{\skvtrimspace{##1}}%
- \edef\skv@provb{\skvoxdetok\skv@prova{\skvtrimspace{##2}}}%
- \skvaddtolist*\skv@altlista\skv@prova
- \skvaddtolist*\skv@altlistb\skv@provb
- }%
- \skvcommaparse{#1}\skv@prova{%
- \expandafter\skv@g@taltlist\skv@prova.do=.do=\skv@nil
- }%
- \skvexpanded{\endgroup
- \skvcmdexitloop{\skv@altlista\skv@altlistb}%
- }%
-}
-\skvrobustdef*\skv@executealt#1#2{%
- \edef\skv@prova{\skvtrimspace{#1}}%
- \edef\skv@prova{\skvoxdetok\skv@prova}%
- \def\skv@provb##1{%
- \def\skv@provb####1##1####2####3\skv@nil{%
- \edef\skv@prova{\unexpanded{####2}}%
- \skvifx\skv@prova\skv@nnil{%
- \skv@err{No alternate list match for key '\skvcurrentkey'}\@ehd
- }{%
- ####2%
- }%
- }%
- }%
- \expandafter\skv@provb\expandafter{\skv@prova}%
- \skvexpandsecond{\skv@provb#2}\skv@prova{\skv@nil}\skv@nil
+ \MessageBreak'\skvcurrentkey'}{Invalid key value encountered.}%
}
\skvrobustdef*\skv@getinnoval#1{%
\begingroup
- \def\skv@prova##1=##2=##3\skv@nil{%
+ \skv@kvosplit{#1}{%
\edef\skv@provb{\detokenize{##2}}%
- \skvifx\skv@provb\@empty{%
+ \skvifxTF\skv@provb\@empty{%
\def\skv@ival{???}%
}{%
\skv@getbasetoks{30}\skv@provb\skv@ival
}%
}%
- \expandafter\skv@prova#1==\skv@nil
\skvaftergroupdef\skv@ival\endgroup
}
% \skv@getbasetoks{<nr>}{<toks.cmd>}{<result.cmd>}
@@ -4499,7 +5077,7 @@
\def#3{}\@tempcnta\skvz@
\def\do##1{%
\def\skv@prova{##1}%
- \skvifx\skv@prova\skv@nnil{}{%
+ \skvifxTF\skv@prova\skv@nnil{}{%
\advance\@tempcnta\@ne
\ifnum\@tempcnta<#1\relax
\edef#3{#3\ifx\next\@sptoken\@space\fi##1}%
@@ -4527,7 +5105,9 @@
% }
% \skvsetkeys[KV]{fam}{unknownkey=val}
%
-\skvrobustdef*\skvunknownkeyhandler{\skv@testopt\skv@unknownkeyhandler{KV}}
+\skvrobustdef*\skvunknownkeyhandler{%
+ \skv@testopt\skv@unknownkeyhandler\skv@defaultpref
+}
% For each prefix and family, this will define the functions
% \<prefix>/<family>/.@famhandler of 4 parameters (prefix, family,
% key name, current value).
@@ -4547,27 +5127,26 @@
% .prefix=KVA,.families={fam1,fam2},.set in all families,
% .save rm keys
% ]{%
-% key1,key2
+% key1=value1, key2=value2
% }
-
\skvmakekeys[
.prefix=SKV,.family=usekeys,.hp=skvuk@,.endlinechar=-1
]{%
- .ords/{.save rm,.save rm keys,.save unknown keys}/true/
- \edef\skvuk@saverm{\skvifstrcmp{#1}{true}{00}{01}}
+ .ord/{.save rm,.save rm keys,.save unknown keys}/true/
+ \edef\skvuk@saverm{\skvifstrcmpTF{#1}{true}{00}{01}}
,
- .ords/{.set in all families,.in all families}/true/
- \edef\skvuk@inallfams{\skvifstrcmp{#1}{true}{00}{01}}
+ .ord/{.set in all families,.in all families}/true/
+ \edef\skvuk@inallfams{\skvifstrcmpTF{#1}{true}{00}{01}}
,
- .ord/.prefix/KV/
+ .ord/.prefix/\skv@defaultpref/
\skviflacus#1\then
- \def\skvuk@pref{KV}%
+ \let\skvuk@pref\skv@defaultpref
\else
\edef\skvuk@pref{#1}%
\skvstripouterbraces{2}\skvuk@pref
\fi
,
- .ords/{.family,.families}/^skv^/
+ .ord/{.family,.families}/\@nil/
\skviflacus#1\then
\skv@err{Key family is empty\on@line}\@ehd
\else
@@ -4575,10 +5154,22 @@
\skvstripouterbraces{2}\skvuk@fams
\fi
,
+ .ord/{.path,paths}/\@nil/
+ \skvifblankTF{#1}{%
+ \skv@err{Key family is empty\on@line}\@ehd
+ }{%
+ \edef\skvuk@paths{#1}%
+ \skvstripouterbraces{2}\skvuk@paths
+ \skvexpbracenext\skv@slashsplit\skvuk@paths{%
+ \skvsetkeys[SKV]{usekeys}{.prefix=##1,.family=##2}%
+ }%
+ }%
+ ,
}
+
% Default settings for keys of \skvusekeys:
\skvsetkeys[SKV]{usekeys}{%
- .prefix,.family=^skv^,.set in all families=false,.save rm=false
+ .prefix,.family=^skv^,.set in all families=false,.save rm=false%
}
\skvrobustdef*\skvusekeys{\skv@testopt\skv@usekeys{}}
@@ -4587,7 +5178,7 @@
\do\skvuk@fams\do\skvuk@pref\do\skvuk@inallfams\do\skvuk@saverm
}\skv@usekeysdepth
\skvsetkeys[SKV]{usekeys}{#1}%
- \ifx\skvuk@fams\skv@rej
+ \ifx\skvuk@fams\@nnil
\skv@err{No family specified for \string\skvusekeys}\@ehd
\fi
\skvexpanded{%
@@ -4600,34 +5191,41 @@
%++++++++++ Utilities for handlers of the macro \directkeys +++++++++++%
\skvnewlet\handlereov\relax
-\skvrobustdef*\directkeys{\skv@testst\dirkeys@parse}
+% Undefine \dirkeys@handler@, in case a handler function is called
+% without the handler name. Handler functions usually require
+% 'dirkeys@handler@<handler.name>'.
+\skvcsundef{dirkeys@handler@}
+
+\skvrobustdef*\directkeys{\skv@testst\skv@dirkeys@parse@a}
\skvnewlet\dirkeys\directkeys
-\skvrobustdef*\dirkeys@parse{%
+\skvrobustdef*\skv@dirkeys@parse@a{%
\begingroup
\ifskv@tempst\endlinechar\m@ne\fi
- \dirkeys@parse@a
+ \skv@dirkeys@parse@b
}
-\skvrobustdef*\dirkeys@parse@a#1{%
+\skvrobustdef*\skv@dirkeys@parse@b#1{%
\endgroup
- \skvpushstate\dirkeys@state\dirkeys@depth
- \indirkeystrue
+ \skvpushstate\skv@dirkeys@state\dirkeys@depth
+ \skvindirkeystrue
% Note 1: Initialise all lists to empty. This note is referred to
% somewhere: don't delete its number.
\def\dirkeys@prefixlist{}%
\def\dirkeys@familylist{}%
\def\dirkeys@holderprefixtoks{}%
\dirkeys@saveunknownkeysfalse
+ \skvdfk@initializefalse
+ \skvdfk@saveinitialvaluesfalse
\edef\skv@tempa{\unexpanded{#1}}%
\skvstripouterbraces{2}\skv@tempa
\skvkvnormalize\skv@tempa
- \def\dirkeys@do##1=##2=##3\dirkeys@nil{%
+ \def\skv@dirkeys@split##1=##2=##3\dirkeys@nil{%
\edef\skv@tempa{\unexpanded{##2}}%
\skvstripouterbraces{2}\skv@tempa
\skvdespacecontent\skv@tempa
% Get the first token, to test if it's \dirkeys. If it is, then
% we have a nested \dirkeys:
- \expandafter\skvifx\skv@car##1x\car@nil\dirkeys{%
- \skvifempty\skv@tempa{%
+ \expandafter\skvifxTF\skv@car##1x\car@nil\dirkeys{%
+ \skvifemptyTF\skv@tempa{%
##1\relax
}{%
\skv@err{Something wrong with use of \string\dirkeys:
@@ -4635,20 +5233,20 @@
}%
}{%
\skv@ensurehandlerdot{##1}%
- \skvifcsdef{dirkeys@handler@##1}{%
+ \skvifcsdefTF{dirkeys@handler@##1}{%
\csname dirkeys@handler@##1\expandafter\endcsname
\skv@tempa\handlereov
}{%
\skv@err{Unknown handler '\detokenize{##1}'\MessageBreak
- in command \string\dirkeys; or no '=' sign}\@ehd
+ in command \string\dirkeys, or no '=' sign}\@ehd
}%
}%
}%
- \skvexpanded{\skvparselist*{\skv@keyparser}}\skv@tempa\skv@tempa{%
- \expandafter\dirkeys@do\skv@tempa==\dirkeys@nil
+ \skvexpanded{\skvdolist*{\skv@keyparser}}\skv@tempa\skv@tempa{%
+ \expandafter\skv@dirkeys@split\skv@tempa==\dirkeys@nil
}%
- \indirkeysfalse
- \skvpopstate\dirkeys@state\dirkeys@depth
+ \skvindirkeysfalse
+ \skvpopstate\skv@dirkeys@state\dirkeys@depth
}
\skvrobustdef*\dirkeys@setdefaultroot{%
\ifx\dirkeys@familylist\@empty
@@ -4659,7 +5257,7 @@
\fi
\fi
\ifx\dirkeys@prefixlist\@empty
- \def\dirkeys@prefixlist{KV}%
+ \let\dirkeys@prefixlist\skv@defaultpref
\fi
\ifx\dirkeys@holderprefixtoks\@empty
\def\dirkeys@holderprefixtoks{user@}%
@@ -4692,8 +5290,7 @@
\begingroup
% #1 may contain parameter characters that may be confused with
% ##1 and ##2 below. Hence we put it in the macro \skv@tempb.
- % Ignored keys are always defined. This saves resources and has
- % so far been harmless.
+ % Note: Ignored keys are omitted by \skvdefinekeys.
\edef\skv@tempb{\unexpanded{#1}}%
\def\skv@tempa{}%
\def\do##1##2{%
@@ -4718,9 +5315,9 @@
#2\ifdirkeys@saveunknownkeys*\else\ifskv@handlerswa*\fi\fi
[##1]{##2}[\skvcsuse{##1/##2/.@ignoredkeys}]%
% #1 may contain unbalanced conditionals; hence the need for
- % \skvifdefbool here. When setting 'rm keys', then no
+ % \skvifdefboolTF here. When setting 'rm keys', then no
% key list is needed here.
- \skvifdefbool{skv@handlerswb}{}{{\skvexpandonce\skv@tempb}}%
+ \skvifdefboolTF{skv@handlerswb}{}{{\skvexpandonce\skv@tempb}}%
}%
}%
\dirkeys@getcurrentroots\do
@@ -4736,9 +5333,9 @@
\def\do##1##2{%
\def\skv@tempb{}%
\skvletcs\skv@igkeys{##1/##2/.@ignoredkeys}%
- \skvifdef\skv@igkeys{}{\def\skv@igkeys{}}%
+ \skvifdefTF\skv@igkeys{}{\def\skv@igkeys{}}%
\skvcommaparse{#1}\skv@tempa{%
- \skvxifin{,\skvoxdetok\skv@tempa,}{,\skvoxdetok\skv@igkeys,}{}{%
+ \skvxifinTF{,\skvoxdetok\skv@tempa,}{,\skvoxdetok\skv@igkeys,}{}{%
\edef\skv@tempb{%
\skvexpandonce\skv@tempb\ifx\skv@tempb\@empty\else,\fi
\skvexpandonce\skv@tempa
@@ -4747,7 +5344,7 @@
}%
\edef\skv@tempd{%
\skvexpandonce\skv@tempd
- \skvifempty\skv@tempb{}{%
+ \skvifemptyTF\skv@tempb{}{%
\noexpand#2[##1]{##2}{\skvexpandonce\skv@tempb}%
}%
}%
@@ -4805,16 +5402,46 @@
\skv@prova#1#2\skv@novalue#2\skv@nil
}
+% Pushing and popping prefix, family or holder prefix.
+%
+\skvnewnumbers[dirkeys@meta]{prefixdepth,familydepth,hpdepth}
+\skvrobustdef*\dirkeys@pushmeta#1{%
+ \skvifcase\skvifstrcmpTF{#1}%
+ {prefix}{\def\@elt{prefixlist}}%
+ {family}{\def\@elt{familylist}}%
+ {hp}{\def\@elt{holderprefixtoks}}%
+ \elsedo
+ \skv@err{Unknown meta type '#1'}\@ehd
+ \endif
+ \skvaftercs\skvgadvanceno{dirkeys@meta#1depth}\@ne
+ \edef\skv@elt{\skvrom\csname dirkeys@meta#1depth\endcsname}%
+ \skvcsletcs{dirkeys@\@elt @meta@\skv@elt}{dirkeys@\@elt}%
+}
+\skvrobustdef*\dirkeys@popmeta#1{%
+ \skvifcase\skvifstrcmpTF{#1}%
+ {prefix}{\def\@elt{prefixlist}}%
+ {family}{\def\@elt{familylist}}%
+ {hp}{\def\@elt{holderprefixtoks}}%
+ \elsedo
+ \skv@err{Unknown meta type '#1'}\@ehd
+ \endif
+ \edef\skv@elt{\skvrom\csname dirkeys@meta#1depth\endcsname}%
+ \skvcsletcs{dirkeys@\@elt}{dirkeys@\@elt @meta@\skv@elt}%
+ \skvaftercs\skvgadvanceno{dirkeys@meta#1depth}\m@ne
+}
+
% Assigning admissible values to keys. The handlers here are:
%
-% .choice, .choice expanded, .choice expanded once, .choice expanded twice.
+% .state pattern, .state pattern expanded, .state pattern expanded once,
+% .state pattern expanded twice.
%
% \dirkeys@savechoice{<list>}{<expander.type>}
%
% 1. <list> has the form
%
-% <key1>/{<ch1>.do={<act1>},...,<ch-n>.do={<act-n>}},...,
-% <key-n>/{<ch1>.do={<act1>},...,<ch-n>.do={<act-n>}}
+% {<key1,...,keyn>}/{<ch1>.do={<act1>},...,<ch-n>.do={<act-n>}}
+% ,...,
+% <keyx-n>/{<ch1>.do={<act1>},...,<ch-n>.do={<act-n>}}
%
% 2. If it didn't exist, the main key (eg, the above <key1>) will be
% defined with an empty default value and an empty callback.
@@ -4835,30 +5462,32 @@
\skvkvnormalize\skvcurrentsub
\def\skv@doonroot##1##2{%
\skvletcs\skv@igkeys{##1/##2/.@ignoredkeys}%
- \skvifdef\skv@igkeys{}{\def\skv@igkeys{}}%
- \skvxifin{,\skvcurrentmaintoks,}{,\skv@igkeys,}{}{%
- \skvifcsdef{##1/##2/\skvcurrentmaintoks.@cbk}{}{%
- \edef\skv@tempd{%
- \skvexpandonce\skv@tempd
- \skvordkey[##1]{##2}{\skvcurrentmaintoks}[]{}%
+ \skvifdefTF\skv@igkeys{}{\def\skv@igkeys{}}%
+ \skvcommaparse*\skvcurrentmaintoks\skv@tempb{%
+ \skvxifinTF{,\skv@tempb,}{,\skv@igkeys,}{}{%
+ \skvifcsdefTF{##1/##2/\skv@tempb.@cbk}{}{%
+ \edef\skv@tempd{%
+ \skvexpandonce\skv@tempd
+ \skvordkey[##1]{##2}{\skv@tempb}[]{}%
+ }%
}%
- }%
- \def\skv@choicelist{}%
- \skvcommaloop*\skvcurrentsub\skv@tempa{%
- \def\skv@prova####1.do=####2.do=####3\skv@nil{%
- \edef\skv@choicelist{%
- \skvexpandonce\skv@choicelist
- {\skvtrimspace{####1}}{\skvtrimspace{####2}}%
+ \def\skv@choicelist{}%
+ \skvcommaloop*\skvcurrentsub\skv@tempa{%
+ \def\skv@prova####1.do=####2.do=####3\skv@nil{%
+ \edef\skv@choicelist{%
+ \skvexpandonce\skv@choicelist
+ {\skvtrimspace{####1}}{\skvtrimspace{####2}}%
+ }%
}%
+ \expandafter\skv@prova\skv@tempa.do=.do=\skv@nil
}%
- \expandafter\skv@prova\skv@tempa.do=.do=\skv@nil
}%
- }%
- \edef\skv@tempd{%
- \skvexpandonce\skv@tempd
- \skvappendkeycode[##1]{##2}{\skvcurrentmaintoks}%
- {\dirkeys@executechoice{#2}{########1}%
- {\skvexpandonce\skv@choicelist}}%
+ \edef\skv@tempd{%
+ \skvexpandonce\skv@tempd
+ \skvappendkeycode[##1]{##2}{\skv@tempb}%
+ {\dirkeys@executechoice{#2}{########1}%
+ {\skvexpandonce\skv@choicelist}}%
+ }%
}%
}%
\skv@rootlist
@@ -4870,10 +5499,10 @@
\skvdespacecontent\skv@prova
\def\do##1##2##3\skv@nil{%
\edef\skv@provb{\unexpanded{##1}}%
- \skvifx\skv@provb\skv@prova{%
+ \skvifxTF\skv@provb\skv@prova{%
##2%
}{%
- \skvifblank{##3}{%
+ \skvifblankTF{##3}{%
\skv@err{No choice match found for key '\skvcurrentkey'}\@ehd
}{%
\do##3\skv@nil
@@ -4933,36 +5562,35 @@
\skvkvnormalize\skvcurrentsub
\def\skv@doonroot##1##2{%
\skvletcs\skv@igkeys{##1/##2/.@ignoredkeys}%
- \skvifdef\skv@igkeys{}{\def\skv@igkeys{}}%
+ \skvifdefTF\skv@igkeys{}{\def\skv@igkeys{}}%
\skvcommaloop*\skvcurrentmaintoks\skv@maintoks{%
- \skvxifin{,\skv@maintoks,}{,\skv@igkeys,}{}{%
- \skvifcsdef{##1/##2/\skv@maintoks.@cbk}{}{%
+ \skvxifinTF{,\skv@maintoks,}{,\skv@igkeys,}{}{%
+ \skvifcsdefTF{##1/##2/\skv@maintoks.@cbk}{}{%
% Link keys should always be set with a value. If they were
% undefined before being designated as a link key, then
% clearly they should have no default.
\edef\skv@tempd{%
\skvexpandonce\skv@tempd
- \skvordkey[##1]{##2}{.value required{\skv@maintoks}}{}%
+ \skvordkey[##1]{##2}{.need value{\skv@maintoks}}{}%
}%
}%
\def\skv@stylelist{}%
\skvcommaloop*\skvcurrentsub\skv@tempa{%
- \def\skv@prova####1=####2=####3\skv@nil{%
- \skvxifstrcmp{\skv@maintoks}{####1}{%
+ \skv@kvosplit\skv@tempa{%
+ \skvxifstrcmpTF{\skv@maintoks}{####1}{%
\skv@err{Linking key '####1' to itself}\@ehd
}{%
- \skvifcsdef{##1/##2/####1.@cbk}{}{%
+ \skvifcsdefTF{##1/##2/####1.@cbk}{}{%
\skv@err{Style key '####1' is undefined}\@ehd
}%
}%
- \skvxifin{,####1,}{,\skv@igkeys,}{}{%
+ \skvxifinTF{,####1,}{,\skv@igkeys,}{}{%
\edef\skv@stylelist{%
\skvaddlist,\skv@stylelist\unexpanded{####1}=%
\skvexpandonce\skvexpander{\unexpanded{####2}}%
}%
}%
}%
- \expandafter\skv@prova\skv@tempa==\skv@nil
}%
}%
\edef\skv@tempd{%
@@ -4970,7 +5598,7 @@
% The styles contain value expanders \@firstofone, \unexpanded, etc.
% They will be expanded by the next \skvexpanded when the main key
% is set.
- \skvifstrcmp{#2}{app}\skvappendkeycode\skvprependkeycode
+ \skvifstrcmpTF{#2}{app}\skvappendkeycode\skvprependkeycode
[##1]{##2}{\skv@maintoks}%
{\skvexpanded{\skvsetkeys[##1]{##2}%
{\skvexpandonce\skv@stylelist}}}%
@@ -5044,12 +5672,12 @@
\skvkvnormalize\skv@tempd
\def\skv@doonroot##1##2{%
\skvletcs\skv@igkeys{##1/##2/.@ignoredkeys}%
- \skvifdef\skv@igkeys{}{\def\skv@igkeys{}}%
+ \skvifdefTF\skv@igkeys{}{\def\skv@igkeys{}}%
\skvcommaloop*\skv@tempd\skv@tempa{%
- \def\skv@prova####1=####2=####3\skv@nil{%
- \skvxifin{,####1,}{,\skv@igkeys,}{}{%
- \skvifcsdef{##1/##2/####1.@cbk}{%
- \skvifblank{####2}{}{%
+ \skv@kvosplit\skv@tempa{%
+ \skvxifinTF{,####1,}{,\skv@igkeys,}{}{%
+ \skvifcsdefTF{##1/##2/####1.@cbk}{%
+ \skvifblankTF{####2}{}{%
\edef\skv@tempe{%
\skvexpandonce\skv@tempe\unexpanded{%
\skvcsedef{##1/##2/####1.@#2arg}{\unexpanded{####2}}%
@@ -5061,7 +5689,6 @@
}%
}%
}%
- \expandafter\skv@prova\skv@tempa==\skv@nil
}%
}%
\dirkeys@getcurrentroots\skv@doonroot
@@ -5075,7 +5702,7 @@
\def\skv@defaultlist{}%
\skvcommaparse{#3}\skvcurrentkey{%
\skvletcs\skv@prova{#1/#2/\skvcurrentkey.@defa}%
- \skvifdef\skv@prova{%
+ \skvifdefTF\skv@prova{%
\skv@getdefault{#1}{#2}\skvcurrentkey\skvcurrentvalue
\edef\skv@defaultlist{%
\skvaddlist,\skv@defaultlist
@@ -5095,13 +5722,13 @@
\begingroup
\def\skv@tempa{}\def\skv@tempb{}%
\def\do##1##2{%
- \skvxifin{,##1,}{,\skv@tempa,}{}{%
+ \skvxifinTF{,##1,}{,\skv@tempa,}{}{%
\edef\skv@tempa{%
\skvexpandonce\skv@tempa
\ifx\skv@tempa\@empty\else,\fi##1%
}%
}%
- \skvxifin{,##2,}{,\skv@tempb,}{}{%
+ \skvxifinTF{,##2,}{,\skv@tempb,}{}{%
\edef\skv@tempb{%
\skvexpandonce\skv@tempb
\ifx\skv@tempb\@empty\else,\fi##2%
@@ -5117,7 +5744,7 @@
%%++++++++++++++++++++++++++ Try setting keys +++++++++++++++++++++++%%
%
% \skvtrysetkeys[<options>]{<keyvals>}
-% .try set keys={<options>}{<keyvals>}
+% .try set keys={<options>}
%
% Try to set a given key-value list on the paths given by the independent
% options '.prefix/.prefixes' and '.family/.families' of \skvtrysetkeys. If
@@ -5182,43 +5809,95 @@
% paths KV1/fam1, KV1/fam2, KV2/fam1, KV2/fam2, and you set '.try=2' or
% '.upper goal=2', then only 2 paths will be traversed; not the desired 4.
+\skvrobustdef*\dirkeys@trysetkeys#1{%
+ \begingroup
+ \@tempcnta\skvz@
+ \def\skv@tempc{}%
+ \def\skv@tempd{}%
+ \def\skv@tempa##1={%
+ \begingroup
+ \let\bgroup\relax
+ \@ifnextchar\skv@orig@bgroup{%
+ \endgroup\@tempswatrue\skv@tempb##1=%
+ }{%
+ \endgroup\@tempswafalse\skv@tempb##1=%
+ }%
+ }%
+ \def\skv@tempb##1=##2=##3\skv@nil{%
+ \skvxifinTF{,##1,}{,.key values,.kv,.kv list,}{%
+ \advance\@tempcnta\@ne
+ \skvifnumTF\@tempcnta>\@ne{%
+ \skv@err{Multiple entries for key '.key values' or '.kv'}\@ehd
+ }{%
+ \edef\skv@tempd{\skvifstrcmpTF{##2}{^skv^}{}{\unexpanded{##2}}}%
+ }%
+ }{%
+ \edef\skv@tempc{%
+ \skvexpandonce\skv@tempc\ifx\skv@tempc\@empty\else,\fi
+ ##1%
+ \skvifstrcmpTF{##2}{^skv^}{}{%
+ =\if@tempswa{\fi\unexpanded{##2}\if@tempswa}\fi
+ }%
+ }%
+ }%
+ }%
+ \skvkvparse{#1}\skv@prova{%
+ \expandafter\skv@tempa\skv@prova=^skv^=\skv@nil
+ }%
+ \ifx\skv@tempd\@empty
+ \skv@err{No key-value pairs for handler '.try set keys'}\@ehd
+ \fi
+ \skvexpanded{\endgroup
+ \noexpand\skv@trysetkeys[\skvexpandonce\skv@tempc]%
+ {\skvexpandonce\skv@tempd}%
+ }%
+}
\skvedefinekeys[SKV]{skvtryset}[skvtry@]{%
- .ords/{.try,.max attempt,.max attempts,.total}/12/
- \edef\skvtry@maxattempts{\number#1}%
+ .ord/{.try,.max attempt,.max attempts,.total}/12/
+ \def\skvtry@maxattempts{#1}%
+ \skvstripouterbraces{2}\skvtry@maxattempts
+ \edef\skvtry@maxattempts{\number\skvtry@maxattempts}%
\skvensureinteger{.max attempt}\skvtry@maxattempts
- \ifnum#1<\@ne
+ \ifnum\skvtry@maxattempts<\@ne
\skv@err{The max. number of attempts ('try')
\MessageBreak can't be less than 1}\@ehd
\fi
,
- .ords/{.upper goal,.max success,.max hits}/1/
- \edef\skvtry@maxsuccess{\number#1}%
+ .ord/{.upper goal,.max success,.max hits}/1/
+ \def\skvtry@maxsuccess{#1}%
+ \skvstripouterbraces{2}\skvtry@maxsuccess
+ \edef\skvtry@maxsuccess{\number\skvtry@maxsuccess}%
\skvensureinteger{upper goal}\skvtry@maxsuccess
- \ifnum#1<\@ne
+ \ifnum\skvtry@maxsuccess<\@ne
\skv@err{The max. number of successful attempts
\MessageBreak ('upper goal') can't be less than 1}\@ehd
\fi
,
- .ords/{.min success,.lower goal,.goal}/1/
- \edef\skvtry@minsuccess{\number#1}%
+ .ord/{.min success,.lower goal,.goal}/1/
+ \def\skvtry@minsuccess{#1}%
+ \skvstripouterbraces{2}\skvtry@minsuccess
+ \edef\skvtry@minsuccess{\number\skvtry@minsuccess}%
\skvensureinteger{lower goal}\skvtry@minsuccess
- \ifnum#1<\@ne
+ \ifnum\skvtry@minsuccess<\@ne
\skv@err{The min. number of successful attempts
\MessageBreak ('lower goal') can't be less than 1}\@ehd
\fi
,
- .ords/{.prefix,.prefixes,.add prefix,.add prefixes}/KV/
+ .ord/{.prefix,.prefixes,.add prefix,.add prefixes}/\skv@defaultpref/
\edef\skvtry@prefs{#1}
\skvstripouterbraces{2}\skvtry@prefs
- \edef\skvtry@prefs{\skvifempty\skvtry@prefs{KV}{\skvtry@prefs}}%
+ \edef\skvtry@prefs{%
+ \skvifemptyTF\skvtry@prefs\skv@defaultpref\skvtry@prefs
+ }%
\ifskv@insa
\skvexpbracenext{\skvmergelist\skvtry@prefs}\dirkeys@prefixlist
\fi
\skvcsvnormalize\skvtry@prefs
,
- .ords/{.family,.families,.add family,.add families}/^skv^/
+ .ord/{.family,.families,.add family,.add families}/\@nil/
\edef\skvtry@fams{#1}
- \ifx\skvtry@fams\skv@rej\else
+ \skvstripouterbraces{2}\skvtry@fams
+ \ifx\skvtry@fams\@nnil\else
\skvstripouterbraces{2}\skvtry@fams
\ifskv@insa
\skvexpbracenext{\skvmergelist\skvtry@fams}\dirkeys@familylist
@@ -5226,26 +5905,30 @@
\skvcsvnormalize\skvtry@fams
\fi
,
- .ords/{.path,.paths,.add path,.add paths,.root,.roots}/^skv^/
+ .ord/{.path,.paths,.add path,.add paths,.root,.roots}/\@nil/
\edef\skv@tempa{\skvtrimspace{#1}}
\skvstripouterbraces{2}\skv@tempa
- \ifcase0\ifx\skv@tempa\skv@rej1\else
+ \ifcase0\ifx\skv@tempa\@nnil1\else
\ifx\skv@tempa\@empty1\fi\fi\relax\skvafterfi
- \skvexpbracenext\skvtry@fixpaths\skv@tempa
+ \skvexpbracenext\skvtry@processpaths\skv@tempa
\fi
,
- .ords/{.ignore keys,.filter keys}//
+ .ord/{.ignore keys,.filter keys}//
\def\skvtry@igkeys{#1}
\skvstripouterbraces{2}\skvtry@igkeys
,
- .ords/{.save known keys,.save success}/true/
- \edef\skvtry@savesuccess{0\skvifstrcmp{#1}{true}01}
+ .ord/{.save known keys,.save success}/true/
+ \def\skvtry@savesuccess{#1}
+ \skvstripouterbraces{2}\skvtry@savesuccess
+ \edef\skvtry@savesuccess{0\ifx\skvtry@savesuccess\skv@truetoks0\else1\fi}
,
- .ords/{.save known keys in,.success list,.success list macro}/
- \skvsuccesslist/\def\skvtry@successlistmacro{#1}
+ .ord/{.save known keys in,.success list,.success list macro}/
+ \skvsuccesslist/
+ \def\skvtry@successlistmacro{#1}
+ \skvstripouterbraces{2}\skvtry@successlistmacro
,
}
-\skvrobustdef*\skvtry@fixpaths#1{%
+\skvrobustdef*\skvtry@processpaths#1{%
\def\skvtry@prefs{}%
\def\skvtry@fams{}%
\def\skv@tempc##1/##2/##3\skv@nil{%
@@ -5278,44 +5961,44 @@
\skvrobustdef*\skvtrysetkeys{\skv@testopt\skv@trysetkeys{}}
\skvrobustdef*\skv@trysetkeys[#1]#2{%
\skvpushfunctions\skvtrysetkeys{%
- % Don't include \skvsuccesslist here!
\do\skvtry@fams\do\skvtry@prefs\do\skvtry@maxattempts
\do\skvtry@minsuccess\do\skvtry@maxsuccess\do\skvtry@igkeys
\do\skvtry@successlistmacro\do\skvtry@savesuccess
+ \do\CurrentOption\do\skv@tempsuccesslist
+ \do\skvcurrentkey\do\skvcurrentpath
+ \do\skvcurrentprefix\do\skvcurrentfamily
}\skv@trysetkeysdepth
\skvsetkeys[SKV]{skvtryset}{#1}%
\ifx\skvtry@fams\skv@rej
\skv@err{No families in which to 'try' to set keys}\@ehd
\fi
\skv@getkeynames{#2}\skv@naa
- \ifnum\skv@trysetkeysdepth=\@ne
- \expandafter\def\skvtry@successlistmacro{}%
- \def\skv@tempsuccesslist{}%
- \fi
+ \expandafter\def\skvtry@successlistmacro{}%
+ \def\skv@tempsuccesslist{}%
\skv@intrytrue
\skvcommaparse{#2}\CurrentOption{%
\expandafter\skv@g@tkeyname\CurrentOption=\skv@nil\skvcurrentkey
- \skvxifin{,\skvcurrentkey,}{,\skvtry@igkeys,}{}{%
+ \skvxifinTF{,\skvcurrentkey,}{,\skvtry@igkeys,}{}{%
+ \skvpushfunctions\skv@trysetkeys@istate{%
+ \do\CurrentOption\do\skvcurrentkey\do\skvcurrentpath
+ \do\skvcurrentprefix\do\skvcurrentfamily
+ \do\skv@attempts\do\skv@hits\do\skv@breakprefloop
+ \do\ifskv@success
+ }\skv@trysetkeysdepth@b
\skv@successfalse
- % Don't use \chardef here; it won't printed in the error message
+ % Don't use \chardef here; it won't print in the error message
% if it wasn't incremented:
\def\skv@attempts{0}%
\def\skv@hits{0}%
\def\skv@breakprefloop{01}%
\skvcommaloop*\skvtry@prefs\skvcurrentprefix{%
\skvcommaloop*\skvtry@fams\skvcurrentfamily{%
- \skvpushfunctions\skv@trysetkeys@istate{%
- \do\CurrentOption\do\skvcurrentkey\do\skvcurrentprefix
- \do\skvcurrentfamily\do\skv@attempts\do\skv@hits
- \do\skv@breakprefloop\do\ifskv@success
- }\skv@trysetkeysdepth@b
\skvexpanded{%
% Don't use \skv@setkeys@a here: \skv@fams, etc.
% will be mixed up.
\skvsetkeys[\skvcurrentprefix]{\skvcurrentfamily}%
{\skvexpandonce\CurrentOption}%
}%
- \skvpopfunctions\skv@trysetkeys@istate\skv@trysetkeysdepth@b
\edef\skv@attempts{\the\numexpr\skv@attempts+1}%
\ifskv@success
\edef\skv@hits{\the\numexpr\skv@hits+1}%
@@ -5346,6 +6029,7 @@
\noexpand\skvtrysetkeys\fi.
\MessageBreak Actual hits were '\skv@hits'}\@ehd
\fi
+ \skvpopfunctions\skv@trysetkeys@istate\skv@trysetkeysdepth@b
}%
}%
\expandafter\let\skvtry@successlistmacro\skv@tempsuccesslist
@@ -5361,7 +6045,10 @@
%%+++++++++++++++++++++++++ 'search also' set keys +++++++++++++++++++%%
%
% \skvsasetkeys[<options>]{<keyvals>}
-% .sa set keys={<options>}{<keyvals>}
+% .sa set keys={<options>}
+%
+% When using '.sa set keys', the key '.key values' must be part of
+% <options>.
%
% 1. The only difference between \skvsasetkeys and \skvtrysetkeys is that,
% when in \directkeys, the values of the options <prefix/prefixes> and
@@ -5373,11 +6060,11 @@
% 2. All the options of \skvtrysetkeys apply to \skvsasetkeys.
\skvnewlet\skvsasetkeys\skvtrysetkeys
-\skvrobustdef*\dirkeys@dosasetkeys#1{%
+\skvrobustdef*\dirkeys@sasetkeys#1{%
\skv@insatrue
- \skvifundef\dirkeys@familylist{\def\dirkeys@familylist{}}{}%
- \skvifundef\dirkeys@prefixlist{\def\dirkeys@prefixlist{}}{}%
- \skv@trysetkeys[#1]%
+ \skvifdefTF\dirkeys@familylist{}{\def\dirkeys@familylist{}}%
+ \skvifdefTF\dirkeys@prefixlist{}{\def\dirkeys@prefixlist{}}%
+ \dirkeys@trysetkeys{#1}%
}
% \dirkeys@addorremoveroots{<list>}{<operator>}
@@ -5386,21 +6073,38 @@
\skvcsvnormalize[/]\skv@prova
\def\skv@tempa{}\def\skv@tempb{}%
\skvcommaparse*\skv@prova\skv@prova{%
- \def\skv@provb##1/##2/##3\skv@nil{%
- \skvxifin{,##1,}{,\skv@tempa,}{}{%
- \edef\skv@tempa{\skv@tempa\ifx\skv@tempa\@empty\else,\fi##1}%
+ \skv@trimslashes\skv@prova
+ \skvexpbracenext\skv@slsplit\skv@prova{%
+ \skvifstrcmpTF{##2}{^skv^}{%
+ \let\skv@prova\skv@defaultpref
+ \def\skv@provb{##1}%
+ }{%
+ \def\skv@prova{##1}\def\skv@provb{##2}%
+ }%
+ \skvxifinTF{,\skv@prova,}{,\skv@tempa,}{}{%
+ \edef\skv@tempa{\skv@tempa\ifx\skv@tempa\@empty\else,\fi\skv@prova}%
}%
- \skvxifin{,##2,}{,\skv@tempb,}{}{%
- \edef\skv@tempb{\skv@tempb\ifx\skv@tempb\@empty\else,\fi##2}%
+ \skvxifinTF{,\skv@provb,}{,\skv@tempb,}{}{%
+ \edef\skv@tempb{\skv@tempb\ifx\skv@tempb\@empty\else,\fi\skv@provb}%
}%
}%
- \expandafter\skv@provb\skv@prova//\skv@nil
}%
\skv@clfalse
\skvexpbracenext{#2\dirkeys@prefixlist}\skv@tempa
\skvexpbracenext{#2\dirkeys@familylist}\skv@tempb
}
-
+\skvrobustdef*\skv@trimslashes#1{%
+ \begingroup
+ \skvxifinFT{\skvrelax/}{\skvrelax#1}{}{%
+ \def\do/##1\skv@nil{\def#1{##1}}%
+ \expandafter\do#1\skv@nil
+ }%
+ \skvxifinFT{/\skvrelax}{#1\skvrelax}{}{%
+ \def\do##1/\skv@nil{\def#1{##1}}%
+ \expandafter\do#1\skv@nil
+ }%
+ \skvaftergroupdef#1\endgroup
+}
% \dirkeys@addtocodeorvalue{app/pre}{cbk/value}{<list>}
\skvrobustdef*\dirkeys@addtocodeorvalue#1#2#3{%
@@ -5411,16 +6115,16 @@
% ##1=prefix, ##2=family
\def\do##1##2{%
\skvletcs\skv@igkeys{##1/##2/.@ignoredkeys}%
- \skvifdef\skv@igkeys{}{\def\skv@igkeys{}}%
+ \skvifdefTF\skv@igkeys{}{\def\skv@igkeys{}}%
\skvkvparse*\skv@tempa\skv@tempa{%
\expandafter\skv@kvsplit\expandafter{\skv@tempa}{%
- \skvxifin{,\detokenize{####1},}{,\skvoxdetok\skv@igkeys,}{}{%
+ \skvxifinTF{,\detokenize{####1},}{,\skvoxdetok\skv@igkeys,}{}{%
\skvletcs\skv@prova{##1/##2/####1.@#2}%
- \skvifundef\skv@prova{%
+ \skvifdefFT\skv@prova{%
\skv@err{Key '####1' isn't in family '##1/##2'}\@ehd
}{%
\skvcsedef{##1/##2/####1.@#2}{%
- \skvifstrcmp{#1}{pre}{%
+ \skvifstrcmpTF{#1}{pre}{%
\skvtrimspace{####2}\skvexpandonce\skv@prova
}{%
\skvexpandonce\skv@prova\skvtrimspace{####2}%
@@ -5449,11 +6153,11 @@
% ##1=prefix, ##2=family
\def\do##1##2{%
\skvletcs\skv@igkeys{##1/##2/.@ignoredkeys}%
- \skvifdef\skv@igkeys{}{\def\skv@igkeys{}}%
+ \skvifdefTF\skv@igkeys{}{\def\skv@igkeys{}}%
\skvkvparse*\skv@tempa\skv@tempa{%
\expandafter\skv@kvsplit\expandafter{\skv@tempa}{%
- \skvxifin{,\detokenize{####1},}{,\skvoxdetok\skv@igkeys,}{}{%
- \skvifcsdef{##1/##2/####1.@cbk}{%
+ \skvxifinTF{,\detokenize{####1},}{,\skvoxdetok\skv@igkeys,}{}{%
+ \skvifcsdefTF{##1/##2/####1.@cbk}{%
\skvcsedef{##1/##2/####1.@defa}{%
\skvnoexpandcs{##1/##2/####1}{\skvtrimspace{####2}}%
}%
@@ -5482,11 +6186,11 @@
% ##1=prefix, ##2=family
\def\do##1##2{%
\skvletcs\skv@igkeys{##1/##2/.@ignoredkeys}%
- \skvifdef\skv@igkeys{}{\def\skv@igkeys{}}%
+ \skvifdefTF\skv@igkeys{}{\def\skv@igkeys{}}%
\skvkvparse*\skv@tempa\skv@tempa{%
\expandafter\skv@kvsplit\expandafter{\skv@tempa}{%
- \skvxifin{,\detokenize{####1},}{,\skvoxdetok\skv@igkeys,}{}{%
- \skvifcsdef{##1/##2/####1.@cbk}{%
+ \skvxifinTF{,\detokenize{####1},}{,\skvoxdetok\skv@igkeys,}{}{%
+ \skvifcsdefTF{##1/##2/####1.@cbk}{%
\skvcsedef{##1/##2/####1.@value}{\skvtrimspace{####2}}%
\edef\skv@tempb{%
\skvexpandonce\skv@tempb
@@ -5503,19 +6207,19 @@
\skvexpanded{\endgroup\skv@tempb}%
}
-% \dirkeys@inherit{value/cbk/defa}{<list>}
+% \dirkeys@inherit{value.or.cbk.or.defa}{<list>}
\skvrobustdef*\dirkeys@inherit#1#2{%
% Hid the list from the parameters of \do:
\edef\skv@tempa{\unexpanded{#2}}%
% ##1=prefix, ##2=family
\def\do##1##2{%
\skvletcs\skv@igkeys{##1/##2/.@ignoredkeys}%
- \skvifdef\skv@igkeys{}{\def\skv@igkeys{}}%
+ \skvifdefTF\skv@igkeys{}{\def\skv@igkeys{}}%
\skvkvparse*\skv@tempa\skv@tempa{%
\expandafter\skv@slsplit\expandafter{\skv@tempa}{%
- \skvxifin{,\detokenize{####1},}{,\skvoxdetok\skv@igkeys,}{}{%
- \ifcase\skvifcsdef{##1/##2/####1.@cbk}{0}{1}%
- \skvifcsdef{##1/##2/####2.@cbk}{0}{1}\relax
+ \skvxifinTF{,\detokenize{####1},}{,\skvoxdetok\skv@igkeys,}{}{%
+ \ifcase\skvifcsdefTF{##1/##2/####1.@cbk}{0}{1}%
+ \skvifcsdefTF{##1/##2/####2.@cbk}{0}{1}\relax
\skvcsletcs{##1/##2/####1.@#1}{##1/##2/####2.@#1}%
\else
\skv@err{Key '####1' or '####2' isn't in family '##1/##2'}\@ehd
@@ -5527,17 +6231,21 @@
\dirkeys@getcurrentroots\do
}
-% \dirkeys@setbooleanhandler{<handler>}{<boolean>}{<bool value>}
+% \dirkeys@setbooleanhandler{<handler>}{<boolean>}{<bool.value>}
\skvrobustdef*\dirkeys@setbooleanhandler#1#2#3{%
- \skvifblank{#3}{%
- \csname#2true\endcsname
- }{%
- \skvifboolval{#3}{%
- \csname#2#3\endcsname
+ \skvifcsdefTF{if#2}{%
+ \skvifblankTF{#3}{%
+ \csname#2true\endcsname
}{%
- \skv@err{Invalid value '\detokenize{#3}' for handler '#1':
- \MessageBreak its expects either 'true' or 'false'}\@ehd
+ \skvifboolvalTF{#3}{%
+ \csname#2#3\endcsname
+ }{%
+ \skv@err{Invalid value '\detokenize{#3}' for handler '#1':
+ \MessageBreak its expects either 'true' or 'false'}\@ehd
+ }%
}%
+ }{%
+ \skv@err{No boolean '\detokenize{#2}'}\@ehd
}%
}
@@ -5546,68 +6254,89 @@
\skv@err{A dot (.) must lead handler name '#1'}\@ehd
\fi
}
-\skvrobustdef*\skv@handlerloop#1{%
+\skvrobustdef*\dirkeys@handlerloop#1{%
\edef\skv@tempa{\unexpanded{#1}}%
\skvstripouterbraces{2}\skv@tempa
\skvkvparse*\skv@tempa
}
-% \dirkeys@defhandlers{<marker>}{<list>}
-% <marker> indicates if we're in <new> or <define> handler.
+% \dirkeys@defhandlers{<flag>}{<list>}
+% <flag> indicates if we're in <new> (01) or <define> (00) handler.
\skvrobustdef*\dirkeys@defhandlers#1#2{%
- \def\do##1=##2=##3\handler@nil{%
- \skv@ensurehandlerdot{##1}%
- \if0#1%
- \skvcsdef{dirkeys@handler@##1}####1{##2}%
- \else
- \skvifcsdef{dirkeys@handler@##1}{%
- \skv@err{Handler '##1' arealdy exists}\@ehd
+ \dirkeys@handlerloop{#2}\skv@tempa{%
+ \skv@kvosplit\skv@tempa{%
+ \skv@ensurehandlerdot{##1}%
+ \skvifplaswTF{#1}{%
+ \skvcsdef{dirkeys@handler@##1}####1{##2}%
}{%
- \skvcsdef{dirkeys@handler@##1}####1\handlereov{##2}%
+ \skvifcsdefTF{dirkeys@handler@##1}{%
+ \skv@err{Handler '##1' arealdy exists}\@ehd
+ }{%
+ \skvcsdef{dirkeys@handler@##1}####1\handlereov{##2}%
+ }%
}%
- \fi
- }%
- \skv@handlerloop{#2}\skv@tempa{%
- \expandafter\do\skv@tempa==\handler@nil
+ }%
}%
}
% Define handlers of more than one argument. This is slightly more
% expensive than '.new handlers':
-% \dirkeys@defnarghandlers{<marker>}{<list>}
-% <marker> indicates if we're in <new> or <define> handler.
+% \dirkeys@defnarghandlers{<flag>}{<list>}
+% <flag> indicates if we're in <new> (01) or <define> (00) handler.
\skvrobustdef*\dirkeys@defnarghandlers#1#2{%
- \def\do##1=##2=##3\handler@nil{%
- \skv@ensurehandlerdot{##1}%
- \def\skv@tempa####1####2\handler@nil{%
- % ####2 must be hidden in a macro for later use in defining the
- % handler:
- \edef\skv@prova{\unexpanded{####2}}%
- \edef\skv@tempa{\skvgenerateparameters{1}{####1}\handlereov}%
- \def\skv@provb{%
- \edef\skv@tempb{\protected\def\skvnoexpandcs{dirkeys@handler@##1}}%
- \expandafter\expandafter\expandafter\skv@tempb\expandafter
- \skv@tempa\expandafter{\skv@prova}%
- }%
- \if0#1%
- \skv@provb
- \else
- \skvifcsdef{dirkeys@handler@##1}{%
- \skv@err{Handler '##1' arealdy exists}\@ehd
- }{%
+ \dirkeys@handlerloop{#2}\skv@tempa{%
+ \skv@kvosplit\skv@tempa{%
+ \skv@ensurehandlerdot{##1}%
+ \def\skv@tempa####1####2\handler@nil{%
+ % ####2 must be hidden in a macro for later use in defining the
+ % handler:
+ \edef\skv@prova{\unexpanded{####2}}%
+ \edef\skv@tempa{\skvgenerateparameters{1}{####1}\handlereov}%
+ \def\skv@provb{%
+ \edef\skv@tempb{\protected\def\skvnoexpandcs{dirkeys@handler@##1}}%
+ \expandafter\expandafter\expandafter\skv@tempb\expandafter
+ \skv@tempa\expandafter{\skv@prova}%
+ }%
+ \skvifplaswTF{#1}{%
\skv@provb
+ }{%
+ \skvifcsdefTF{dirkeys@handler@##1}{%
+ \skv@err{Handler '##1' arealdy exists}\@ehd
+ }{%
+ \skv@provb
+ }%
}%
- \fi
+ }%
+ \skv@tempa##2\handler@nil
}%
- \skv@tempa##2\handler@nil
}%
- \skv@handlerloop{#2}\skv@tempa{%
- \expandafter\do\skv@tempa==\handler@nil
+}
+
+% \dirkeys@handlerlet{<flag>}{<kvlist>}
+% <flag> is either 00 (for define) or 01 (for new handler).
+\skvrobustdef*\dirkeys@handlerlet#1#2{%
+ \dirkeys@handlerloop{#2}\skv@tempa{%
+ \skv@kvosplit\skv@tempa{%
+ \skvifcsdefFT{dirkeys@handler@##2}{%
+ \skv@err{Handler '##2' doesn't exist}\@ehd
+ }{%
+ \skvifblankTF{##1}{%
+ \skv@err{No child handler}\@ehd
+ }{%
+ \skvifplaswTF{#1}{}{%
+ \skvifcsdefFT{dirkeys@handler@##1}{}{%
+ \skv@err{Handler '##1' arealdy exists}\@ehd
+ }%
+ }%
+ \skvcsletcs{dirkeys@handler@##1}{dirkeys@handler@##2}%
+ }%
+ }%
+ }%
}%
}
\skvrobustdef*\skvusehandler#1#2{%
\skv@ensurehandlerdot{#1}%
- \skvifcsdef{dirkeys@handler@#1}{%
+ \skvifcsdefTF{dirkeys@handler@#1}{%
\csname dirkeys@handler@#1\endcsname#2\handlereov
}{%
\skv@err{Handler '#1' is undefined}\@ehd
@@ -5624,19 +6353,18 @@
% 2. It defines definable handlers of one or more arguments. See also
% '.define handlers' later on (within the next call of \dirkeys).
\skvrobustcsdef*{dirkeys@handler@.new handlers}#1\handlereov{%
- \dirkeys@defhandlers{1}{#1}%
+ \dirkeys@defhandlers{01}{#1}%
}
-% In case one gives no value to a handler:
-\skvundef\dirkeys@
+
\dirkeys*{%
.new handlers={%
.exec code=#1,
- .define handlers=\dirkeys@defhandlers{0}{#1},
- .define narg handlers=\dirkeys@defnarghandlers{0}{#1},
- .new narg handlers=\dirkeys@defnarghandlers{1}{#1},
+ .define handlers=\dirkeys@defhandlers{00}{#1},
+ .define narg handlers=\dirkeys@defnarghandlers{00}{#1},
+ .new narg handlers=\dirkeys@defnarghandlers{01}{#1},
.kill handlers={%
- \skv@handlerloop{#1}\skv@tempa{%
- \skvifcsdef{dirkeys@handler@\skv@tempa}{%
+ \dirkeys@handlerloop{#1}\skv@tempa{%
+ \skvifcsdefTF{dirkeys@handler@\skv@tempa}{%
\skvcsundef{dirkeys@handler@\skv@tempa}%
}{%
\skv@err{Handler '\skv@tempa' is undefined}\@ehd
@@ -5644,30 +6372,15 @@
}%
},
.use handler=\skvusehandler{#1},
- .handler let={%
- \def\do##1=##2=##3\handler@nil{%
- \skvifcsdef{dirkeys@handler@##1}{%
- \skv@err{Handler '##1' arealdy exists}\@ehd
- }{%
- \skvifcsundef{dirkeys@handler@##2}{%
- \skv@err{Handler '##2' doesn't exist}\@ehd
- }{%
- \skvifblank{##1}{%
- \skv@err{No child handler}\@ehd
- }{%
- \skvcsletcs{dirkeys@handler@##1}{dirkeys@handler@##2}%
- }%
- }%
- }%
- }%
- \skv@handlerloop{#1}\skv@tempa{%
- \expandafter\do\skv@tempa==\handler@nil
- }%
- },
+ .handler let*=\dirkeys@handlerlet{00}{#1},
+ .handler let=\dirkeys@handlerlet{01}{#1},
.prefixes={%
\def\dirkeys@prefixlist{}%
\skvusehandler{.add prefixes}{#1}%
},
+ .default prefix={%
+ \skvdefaultprefix{#1}
+ },
.add prefixes={%
\skv@clfalse\skv@mergelist\dirkeys@prefixlist{#1}%
},
@@ -5715,8 +6428,8 @@
.pop prefixes=\dirkeys@popmeta{prefix},
.push families=\dirkeys@pushmeta{family},
.pop families=\dirkeys@popmeta{family},
- .push roots=\dirkeys@pushmeta{root},
- .pop roots=\dirkeys@popmeta{root},
+ .push paths=\dirkeys@pushmeta{prefix}\dirkeys@pushmeta{family},
+ .pop paths=\dirkeys@popmeta{prefix}\dirkeys@popmeta{family},
.push holder prefix=\dirkeys@pushmeta{hp},
.pop holder prefix=\dirkeys@popmeta{hp},
.save unknown keys={%
@@ -5724,8 +6437,8 @@
{.save unknown keys}{dirkeys@saveunknownkeys}{#1}%
},
.save unknown keys in={%
- \skvifblank{#1}{}{%
- \skvifescaped{#1}{%
+ \skvifblankTF{#1}{}{%
+ \skvifescapedTF{#1}{%
\dirkeys@saveunknownkeystrue
\def\dirkeys@unknownkeysmacro{#1}%
}{%
@@ -5753,7 +6466,7 @@
\dirkeys@dosetkeys{#1}\skvsetkeys
},
.set rmkeys={%
- \skvifblank{#1}{%
+ \skvifblankTF{#1}{%
\skv@handlerswafalse\skv@handlerswbtrue
\dirkeys@dosetkeys{}\skvsetrmkeys
}{%
@@ -5764,7 +6477,7 @@
}%
},
.set rmkeys*={%
- \skvifblank{#1}{%
+ \skvifblankTF{#1}{%
\skv@handlerswatrue\skv@handlerswbtrue
\dirkeys@dosetkeys{}\skvsetrmkeys
}{%
@@ -5823,10 +6536,10 @@
% key must first be set before choices are executed.
% <key1>/{<ch1>.do={<act1>},...,<ch-n>.do={<act-n>}},...,
% <key-n>/{<ch1>.do={<act1>},...,<ch-n>.do={<act-n>}}
- .choice=\dirkeys@savechoice{#1}{x0},
- .choice expand once=\dirkeys@savechoice{#1}{x1},
- .choice expand twice=\dirkeys@savechoice{#1}{x2},
- .choice expanded=\dirkeys@savechoice{#1}{xx},
+ .state pattern=\dirkeys@savechoice{#1}{x0},
+ .state pattern expand once=\dirkeys@savechoice{#1}{x1},
+ .state pattern expand twice=\dirkeys@savechoice{#1}{x2},
+ .state pattern expanded=\dirkeys@savechoice{#1}{xx},
% {<key-i>,...,<key-j>}/{<stylelist-ij>},...,
% {<key-n>,...,<key-m>}/{<stylelist-nm>}:
.append style=\dirkeys@savestyle{#1}{app}{x0},
@@ -5898,7 +6611,7 @@
.no such key={4}{%
% All the parameters would have been despaced when this handler
% is called. #1=prefix, #2=family, #3=key, #4=value.
- \skvifcsdef{#1@#2@handler}{%
+ \skvifcsdefTF{#1@#2@handler}{%
\csname#1@#2@handler\endcsname{#1}{#2}{#3}{#4}
}{%
\skv@err{Key '#3' is not in family '#1/#2'}\@ehd
@@ -5918,8 +6631,8 @@
},
% .get value={<pref>}{<fam>}{<key>}<cmd>
.get value={4}{%
- \skvifcsdef{#1/#2/#3.@value}{%
- \skvifescaped{#4}{%
+ \skvifcsdefTF{#1/#2/#3.@value}{%
+ \skvifescapedTF{#4}{%
\skvletcs#4{#1/#2/#3.@value}%
}{%
\skv@err{Token '\detokenize{#4}' isn't escaped}\@ehd
@@ -5931,16 +6644,13 @@
},
% '.try set keys' doesn't use the active prefixes and families within
% \dirkeys. The prefix, families and other options are to be supplied
- % in the argument #1.
- % .try set keys={<options>}{<kvlist>}
- .try set keys={2}{%
- \skv@trysetkeys[{#1}]{#2}
- },
+ % in the argument #1. The key .key values (or .kv) is used to
+ % supply the key-value pairs.
+ % .try set keys={<options>}
+ .try set keys={1}{\dirkeys@trysetkeys{#1}},
% 'search also' set keys.
- % .sa set keys={<options>}{<kvlist>}
- .sa set keys={2}{%
- \dirkeys@dosasetkeys{#1}{#2}
- },
+ % .sa set keys={<options>}
+ .sa set keys={1}{\dirkeys@sasetkeys{#1}},
% .set boolean handler={<handler>}{<boolean>}{<value>}
.set boolean handler={3}{%
\dirkeys@setbooleanhandler{#1}{#2}{#3}
@@ -5966,6 +6676,10 @@
.ignore path=.ignore roots, .ignore paths=.ignore roots,
.restore root=.restore roots,
.restore path=.restore roots, .restore paths=.restore roots,
+ .push prefix=.push prefixes, .pop prefix=.pop prefixes,
+ .push family=.push families, .pop family=.pop families,
+ .push path=.push paths, .pop path=.pop paths,
+ .push hp=.push holder prefix, .pop hp=.pop holder prefix,
.ignore key=.ignore keys, .restore key=.restore keys,
.define key=.define keys, .new key=.new keys,
.initialize after define=.initialize keys after define,
@@ -5982,7 +6696,11 @@
.try set=.try set keys,
.sa set=.sa set keys, .search also set keys=.sa set keys,
.use defaults=.set with defaults,
- .echoice=.choice expanded,
+ .restrict values=.state pattern,
+ .nominations=.state pattern,
+ .singleton=.state pattern,
+ .estate pattern=.state pattern expanded,
+ .esingleton=.state pattern expanded,
.style=.append style,
.styles=.append style,
.estyle=.append style expanded,
@@ -6012,11 +6730,11 @@
},
}
-% \skvpatchcmd[<prefix>]{<cmd>}{<search>}{<replace>}{<succeed>}{<fail>}
+% \skvpatchcmd[<prefix>]{<cmd>}{<search>}{<replace>}{<success>}{<fail>}
\skvrobustdef*\skvpatchcmd{%
\begingroup
\@makeother{\#}\endlinechar\m@ne
- \skv@testopt\skv@patchcmd{########1}%
+ \skv@testopt\skv@patchcmd{####1}%
}
\skvrobustdef*\skv@patchcmd[#1]#2#3#4{%
\ifskv@tracingkeys
@@ -6025,7 +6743,7 @@
\skv@p@tchcmd{#1}{#2}{#3}{#4}%
}
\skvrobustdef*\skv@p@tchcmd#1#2#3#4{%
- \skvifpatchable{#2}{#3}{#4}{%
+ \skvifpatchableTF{#2}{#3}{#4}{%
\skv@patchdebug{++}{Command is patchable}%
\skv@patchdebug{==}{Patching has begun}%
\begingroup
@@ -6046,20 +6764,20 @@
}%
}
\skvrobustdef*\skv@patchdebug#1#2{%
- \ifskv@tracingkeys\typeout{[debug] #1 #2}\fi
+ \ifskv@tracingkeys\typeout{[debug] #1 #2.}\fi
}
-\skvrobustdef*\skvifpatchable#1#2#3{%
+\skvrobustdef*\skvifpatchableTF#1#2#3{%
\endgroup
- \skvifundef{#1}{%
+ \skvifdefFT{#1}{%
\skv@patchdebug{--}{Command not defined}%
\@secondoftwo
}{%
\skv@patchdebug{++}{Command is defined}%
- \skvifmacro{#1}{%
+ \skvifmacroTF{#1}{%
\skv@patchdebug{++}{Command is a macro}%
- \skvifscannable{#1}{%
+ \skvifscannableTF{#1}{%
\skv@patchdebug{++}{Macro can be retokenized safely after patching}%
- \skvifpattern{#2}{#1}{%
+ \skvifpatternTF{#2}{#1}{%
\skv@patchdebug{++}{Requested search pattern found}%
\@firstoftwo
}{%
@@ -6096,7 +6814,7 @@
\catcode`\noexpand\}=\the\catcode`\}\relax
}%
}
-\skvrobustdef*\skvifscannable#1{%
+\skvrobustdef*\skvifscannableTF#1{%
% Fails if the content of #1 is already detokenized.
\begingroup
\edef\skv@tempa##1{%
@@ -6115,7 +6833,7 @@
\expandafter\@secondoftwo
\fi
}
-\skvrobustdef\skvifpattern#1#2{%
+\skvrobustdef\skvifpatternTF#1#2{%
\begingroup
\edef\skv@tempa##1{\def##1####1\detokenize{#1}####2\skvrelax}%
\skv@tempa\skv@tempa{%
@@ -6128,21 +6846,28 @@
\edef\skv@tempb##1{##1\detokenize{#1}\skvrelax}%
\skv@tempb{\expandafter\skv@tempa\meaning#2}%
}
-\skvrobustdef*\skvifmacro#1{%
- \begingroup
- \edef\skv@tempa##1{\def##1####1\detokenize{macro}:####2\skvrelax}%
- \skv@tempa\skv@tempa{%
- \expandafter\endgroup\ifx\@nnil##2\@nnil
- \expandafter\@secondoftwo
- \else
- \expandafter\@firstoftwo
- \fi
+\skvrobustdef*\skvifmacroTF#1{%
+ \skvifntypeTF{#1}{%
+ \begingroup
+ \edef\skv@tempa##1{\def##1####1\detokenize{macro}:####2\skvrelax}%
+ \skv@tempa\skv@tempa{%
+ \expandafter\endgroup\ifx\@nnil##2\@nnil
+ \expandafter\@secondoftwo
+ \else
+ \expandafter\@firstoftwo
+ \fi
+ }%
+ \edef\skv@tempb##1{##1\detokenize{macro}:\skvrelax}%
+ \skv@tempb{\expandafter\skv@tempa\meaning#1}%
+ }{%
+ \@secondoftwo
}%
- \edef\skv@tempb##1{##1\detokenize{macro}:\skvrelax}%
- \skv@tempb{\expandafter\skv@tempa\meaning#1}%
}
-%\skvxzapspaces{\detokenize{\begin{\document}}}\skv@begindoc@string
-\edef\skv@begindoc@string{\string\begin\string{\string\document\string}}
+
+\skvrobustdef*\skvifmacroFT#1{\skvifmacroTF{#1}\@secondoftwo\@firstoftwo}
+
+%\skvxzapspaces{\detokenize{\begin{\document}}}\skv@begindoctoks
+\edef\skv@begindoctoks{\string\begin\string{\string\document\string}}
\skv@core@restorecodes
\endinput
diff --git a/Master/texmf-dist/tex/latex/skeyval/skeyval-for.tex b/Master/texmf-dist/tex/latex/skeyval/skeyval-for.tex
index b02ed4f91ed..309a5649c93 100644
--- a/Master/texmf-dist/tex/latex/skeyval/skeyval-for.tex
+++ b/Master/texmf-dist/tex/latex/skeyval/skeyval-for.tex
@@ -1,5 +1,5 @@
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
-% This is file 'skeyval-for', version 1.1, October 2012. %
+% This is file 'skeyval-for', 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, %
@@ -26,25 +26,48 @@
% Copyright (c) 2010-2012 Ahmed Musa (amusa22@gmail.com). %
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
+\begingroup%
+\let\e\endlinechar\edef\p{\the\e}\e13\edef\n{\the\catcode\e}%
+\xdef\skv@for@restorecatcodes{%
+ \let\noexpand\skv@for@restorecatcodes\relax%
+ \endlinechar=\p\relax\catcode\number\e=\n\relax%
+ \catcode\string`\noexpand`\string=\the\catcode\string``\relax%
+ \catcode\string`\noexpand=\string=\the\catcode\string`=\relax%
+}%
+\endgroup%
+\endlinechar\string=13\relax%
+\catcode13\string=5\relax%
+\catcode\string``\string=12\relax
+\catcode\string`=\string=12\relax
+\def\skvgobble#1{}
+\def\do#1{\catcode`\expandafter\skvgobble\string#1=\the\catcode`#1\relax}
+\edef\skv@for@restorecatcodes{%
+ \unexpanded\expandafter{\skv@for@restorecatcodes}%
+ \do\ \do\%\do\@\do\(\do\)\do\[\do\]\do\|\do\:\do\;\do\,\do\.%
+ \do\>\do\<\do\!\do\*\do\+\do\-\do\^\do\_\do\&\do\$\do\~\do\'%
+ \do\"\do\
+}
+\catcode`\ =10\relax
+\catcode`\@=11 \catcode`\(=12 \catcode`\)=12 \catcode`\[=12
+\catcode`\]=12 \catcode`\|=12 \catcode`\:=12 \catcode`\;=12
+\catcode`\,=12 \catcode`\*=12 \catcode`\+=12 \catcode`\-=12
+\catcode`\<=12 \catcode`\>=12 \catcode`\!=12 \catcode`\.=12
+\catcode`\^=07 \catcode`\_=08 \catcode`\&=04 \catcode`\$=03
+\catcode`\~=13 \catcode`\%=14 \catcode`\'=12 \catcode`\"=12
+
\csname skeyval-for-loaded\endcsname
\expandafter\let\csname skeyval-for-loaded\endcsname\endinput
-\edef\skv@for@restorecatcodes{%
- \catcode`\noexpand\@\the\catcode`\@\relax
- \let\noexpand\skv@for@restorecatcodes\relax
-}
-\catcode`\@=11\relax
-
\ifx\ProvidesFile\@undefined
- \message{File 'skeyval-for.tex' 2012/10/15 v1.1
+ \message{File 'skeyval-for.tex' 2012/10/16 v1.1a
Loops for skeyval package (AM)}
\else
\ProvidesFile{skeyval-for.tex}
- [2012/10/15 v1.1 Loops for skeyval package (AM)]
+ [2012/10/16 v1.1a Loops for skeyval package (AM)]
\@addtofilelist{skeyval-for.tex}
\fi
-\skvrobustdef*\skv@nostackerr{\skv@err{You've called empty stack}\@ehd}
+\skvrobustdef*\skv@nostackerr{\skv@err{You've called an empty stack}\@ehd}
% \skvsavestate<base-fn>{<fn-list>}<counter>
\skvrobustdef*\skvsavestate#1#2#3{%
\skvgadvanceno#3\@ne
@@ -52,7 +75,7 @@
\let\s\string\escapechar\m@ne
\def\skv@prova##1{\s##1@skv@\romannumeral#3}%
\def\do##1{\let\noexpand##1\skvnoexpandcs{\skv@prova{##1}}}%
- \skvifcsdef{\s#1@skv@stack}{}{\skvcsdef{\s#1@skv@stack}{\nostack}}%
+ \skvifcsdefTF{\s#1@skv@stack}{}{\skvcsdef{\s#1@skv@stack}{\nostack}}%
\skvcsxdef{\s#1@skv@stack}{#2{\skvexpandcsonce{\s#1@skv@stack}}}%
\def\do##1{\let\skvnoexpandcs{\skv@prova{##1}}\noexpand##1}%
\edef\reserved@a{\endgroup#2}\reserved@a
@@ -71,25 +94,27 @@
\skvgadvanceno#2\m@ne
}
-\skvnewregisters\bool{\ifskvbreakloop\ifforeachlastitem
- \ifskvprocessempty\ifskv@tempst\ifskv@foreach@swa
+\skvnewregisters\bool{%
+ \ifskvbreakloop\ifforeachlastitem
+ \ifskvprocessempty\ifskv@foreach@swa
\ifskv@foreach@swb\ifskv@foreach@parenth
}
\skvnewnumbers[skv@]{csvdepth,dolistcnt}
\skvrobustdef*\skv@usetempst#1#2{%
- \edef#2{\skvifdefbool{skv@tempst}\skvexpandonce\unexpanded{#1}}%
+ \edef#2{\skvifdefboolTF{skv@tempst}\skvexpandonce\unexpanded{#1}}%
}
%
% \skvdolist{<parser>}{<list>}<holdercmd>{<callback>}
% \skvdolist*{<parser>}{<listcmd>}<holdercmd>{<callback>}
%
-% 1. This can be nested to any depth, with different parsers on each
+% 1. \skvdolist can process both csv and tsv/nsv lists.
+% 2. This can be nested to any depth, with different parsers on each
% level.
-% 2. This will not process an empty list; see \skvecommaloop.
-% 3. For comma lists, \skvcommaloop and \skvcommaparse are faster.
+% 3. This will not process an empty list; see \skvecommaloop.
+% 4. For comma lists, \skvcommaloop and \skvcommaparse are faster.
% See later.
-% 4. For processing kv lists, use \skvkvparse.
+% 5. For processing kv lists, use \skvkvparse.
%
\skvrobustdef*\skvdolist{\skv@testst\skv@dolist}
\skvrobustdef*\skv@dolist#1#2#3#4{%
@@ -97,7 +122,7 @@
\skv@usetempst{#2}#3%
\def\skv@dolist@a{skv@dolist@\skvrom\skv@dolistcnt}%
\skvcsdef{\skv@dolist@a}##1##2##3#1{%
- \skvifstrcmp{##3}{\skv@dolist@nil}{%
+ \skvifstrcmpTF{##3}{\skv@dolist@nil}{%
% To allow nesting of loop:
\skvbreakloopfalse
}{%
@@ -111,7 +136,7 @@
\@nameuse{\skv@dolist@a}##1{##2}%
}%
}%
- \skvifempty#3{}{%
+ \skvifemptyTF#3{}{%
\edef\reserved@a{\unexpanded{\@nameuse{\skv@dolist@a}#3{#4}}}%
\expandafter\reserved@a#3#1\skv@dolist@nil#1%
}%
@@ -150,7 +175,7 @@
\let\skvreversedo\@iden
\skvrobustdef*\skv@removetrailingparser#1#2{%
- \skvxifin{\detokenize{#1}\relax}{\skvoxdetok#2\relax}{%
+ \skvxifinTF{\detokenize{#1}\relax}{\skvoxdetok#2\relax}{%
\def\skv@prova##1#1\skv@trim@nil{\unexpanded{##1}}%
\edef#2{\expandafter\skv@prova#2\skv@trim@nil}%
}{}%
@@ -175,10 +200,18 @@
% \ifnum\@tempcnta<4
% \fi
%
+\skvnewcounts{skv@recurse@cnt}
\skvrobustdef\skvrecurse#1\while#2\fi{%
+ \skv@recurse@cnt\skvz@
\@expandtwoargs\skv@dobody{\skvtrimspace{#2}}{\skvtrimspace{#1}}%
}
\skvrobustdef\skv@dobody#1#2{%
+ \advance\skv@recurse@cnt\@ne
+ \ifnum\skv@recurse@cnt>10000\relax
+ \@latex@error{Possibly an infinite loop in \string\skvrecurse}
+ {Maybe you didn't increment some counter or
+ \MessageBreak the termination condition was never satisfied.}%
+ \fi
#1\relax\expandafter\@iden\else\expandafter\@gobble\fi
{#2\relax\skv@dobody{#1}{#2}}%
}
@@ -186,8 +219,8 @@
% A version of LaTeX's \@tfor that can parse undoubled parameter
% characters.
%
-% \skvtfor<holder.cmd>{<list>}\do{<callback>}
-% \skvtfor*<holder.cmd>{<listcmd>}\do{<callback>}
+% \skvtfor<holder.cmd>:={<list>}\do{<callback>}
+% \skvtfor*<holder.cmd>:={<listcmd>}\do{<callback>}
%
% Example:
%
@@ -206,15 +239,15 @@
\skvrobustdef*\skv@tfor#1:={\skv@tf@r#1 }
\skvrobustdef\skv@tf@r#1#2\do#3{%
\edef#1{\skvtrimspace{#2}}%
- \edef#1{\skvifbool{skv@tempst}\skvexpandtwice\skvexpandonce{#1}}%
- \skvifempty#1{}{%
+ \edef#1{\skvifboolTF{skv@tempst}\skvexpandtwice\skvexpandonce{#1}}%
+ \skvifemptyTF#1{}{%
\skvbreakloopfalse
\expandafter\skv@tforloop#1\skv@tfor@nil\skv@tfor#1{#3}%
}%
}
\skvrobustdef\skv@tforloop#1#2\skv@tfor#3#4{%
\edef#3{\unexpanded{#1}}%
- \skvifx#3\skv@tfor@nil{%
+ \skvifxTF#3\skv@tfor@nil{%
\skvbreakloopfalse
}{%
#4\relax
@@ -230,7 +263,7 @@
}%
}
-% Non-expandable comma loops
+%+++++++++++++++ Non-expandable comma loops ++++++++++++++%%
%
% 1. These follow from \skvdolist and \skvparselist, but they are
% specialized for comma lists and they are faster.
@@ -245,12 +278,12 @@
\skv@usetempst{#1}#2%
% Don't put \skvcsvnormalize#2 here. Use \skvcommaparse instead.
% Some callers of \skvcommaloop already have their lists normalized.
- \skvifx#2\@empty{}{%
+ \skvifxTF#2\@empty{}{%
\skvexpandnext{\skv@c@mmaloop#2{#3}}#2,\skv@commaloop@nil,%
}%
}
\skvrobustdef\skv@c@mmaloop#1#2#3,{%
- \skvifstrcmp{#3}{\skv@commaloop@nil}{%
+ \skvifstrcmpTF{#3}{\skv@commaloop@nil}{%
\skvbreakloopfalse
}{%
\edef#1{\unexpanded{#3}}%
@@ -289,7 +322,6 @@
\skvcsvnormalize#2%
\skvcommaloop*#2#2{#3}%
}
-%
% \skvkvparse{<list>}<cmd>{<callback>}
% \skvkvparse*{<listcmd>}<cmd>{<callback>}
%
@@ -303,12 +335,59 @@
\skvkvnormalize#2%
\skvcommaloop*#2#2{#3}%
}
+% \skvcommaprocess{<list>}<holder.cmd>
+% \skvcommaprocess*{<listcmd>}<holder.cmd>
+%
+% If <list> or <listcmd> is a single item, then no looping is required.
%
+\skvrobustdef*\skvcommaprocess{\skv@testst\skv@commaprocess}
+\skvrobustdef*\skv@commaprocess#1#2#3{%
+ \skv@usetempst{#1}#2%
+ \skvxifinTF{,}{\skvoxdetok#2}{%
+ \skvcommaparse*#2#2{#3}%
+ }{%
+ \skvdespacecontent#2#3%
+ }%
+}
+% \skvcountelements[<parser>]{<list>}{<return.cmd>}
+% \skvcountelements*[<parser>]{<listcmd>}{<return.cmd>}
+\skvrobustdef*\skvcountelements{\skv@teststopt\skv@countelements,}
+\skvrobustdef*\skv@countelements[#1]#2#3{%
+ \begingroup
+ \skv@usetempst{#2}\skv@tempa
+ \@tempcnta\skvz@
+ \skvdolist*{#1}\skv@tempa\skv@prova{%
+ \advance\@tempcnta\@ne
+ }%
+ \edef#3{\the\@tempcnta}%
+ \skvaftergroupdef#3\endgroup
+}
+% If the number of elements in a list is equal or greater than <nr>.
+% \skvifelementcount[<parser>]{<list>}{<nr>}{<true>}{<false>}
+% \skvifelementcount*[<parser>]{<listcmd>}{<nr>}{<true>}{<false>}
+\skvrobustdef*\skvifelementcount{\skv@teststopt\skv@ifelementcount,}
+\skvrobustdef*\skv@ifelementcount[#1]#2#3{%
+ \begingroup
+ \skv@usetempst{#2}\skv@tempa
+ \@tempcnta\skvz@
+ \skv@swafalse
+ \skvdolist*{#1}\skv@tempa\skv@prova{%
+ \advance\@tempcnta\@ne
+ \ifnum\@tempcnta=#3\relax
+ \skv@swatrue\skvbreakloop
+ \fi
+ }%
+ \expandafter\endgroup\ifskv@swa
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+}
% \skv@foreach@normalize[<parser>]<listcmd>
\skvrobustdef*\skv@foreach@normalize{\skv@testopt\skv@foreach@norm@lize,}
\skvrobustdef*\skv@foreach@norm@lize[#1]#2{%
- \skvxifntype{\detokenize{#1}}\skvcsvnormalize\skvmacnormalize[#1]#2%
+ \skvxifntypeTF{\detokenize{#1}}\skvcsvnormalize\skvmacnormalize[#1]#2%
}
% \newforeach[<options>] <holders> {<list>} {<callback>}
@@ -332,7 +411,7 @@
\skvnewnumbers{foreachdepth,skv@foreach@sisterdepth,skv@foreach@nra,%
skv@warnsubparser}
\skvnewdef*\skv@foreach@onlyinitially{}
-\skvrobustdef*\skv@foreach@assignonce#1{%
+\skvrobustdef*\skvforeachonlyinitially#1{%
\edef\skv@foreach@onlyinitially{%
\skvexpandonce\skv@foreach@onlyinitially
\unexpanded{#1}%
@@ -341,7 +420,7 @@
% \skv@foreach@addtocallback{<pre.or.post>}{<code.to.add>}
\skvrobustdef*\skv@foreach@addtocallback#1#2{%
\skvcsedef{skv@foreach@#1callback}{%
- \skvifcsundef{skv@foreach@#1callback}{}{%
+ \skvifcsdefFT{skv@foreach@#1callback}{}{%
\skvexpandcsonce{skv@foreach@#1callback}%
}%
% No \unexpanded for #2 here, since #2 is to be expanded:
@@ -352,11 +431,11 @@
\skvnewlet\skv@foreach@codemark\relax
\skvrobustdef*\skv@foreach@addtohook#1#2#3{%
\begingroup
- \skvifdef#2{}{\def#2{}}%
+ \skvifdefTF#2{}{\def#2{}}%
\edef\x{\detokenize{\skv@foreach@codemark#3\skv@foreach@codemark}}%
- \skvxifin\x{\skvoxdetok#2}{}{%
+ \skvxifinTF\x{\skvoxdetok#2}{}{%
\edef#2{%
- \skvifstrcmp{#1}{pre}{%
+ \skvifstrcmpTF{#1}{pre}{%
\skv@foreach@codemark\unexpanded{#3}\skv@foreach@codemark
\skvexpandonce{#2}%
}{%
@@ -378,7 +457,7 @@
}
\skvnewlet\atbeginforeach\appendtobeginforeach
\skvrobustdef*\skv@atbeginforeach#1[#2]#3{%
- \skvifblank{#2}{%
+ \skvifblankTF{#2}{%
\skvaftercsname{\skv@foreach@addtohook{#1}}%
{skv@foreach@atbeginhook@\skvrom\@ne}{#3}%
}{%
@@ -398,7 +477,7 @@
}
\skvnewlet\atendforeach\appendtoendforeach
\skvrobustdef*\skv@atendforeach#1[#2]#3{%
- \skvifblank{#2}{%
+ \skvifblankTF{#2}{%
\skvaftercsname{\skv@foreach@addtohook{#1}}%
{skv@foreach@atendhook@\skvrom\@ne}{#3}%
}{%
@@ -437,8 +516,8 @@
\next
}
\skvrobustdef*\skv@foreach@ifholderisonecmd#1#2#3{%
- \skvifntype{#2}{%
- \skvifescaped{#2}{%
+ \skvifntypeTF{#2}{%
+ \skvifescapedTF{#2}{%
#3%
}{%
\skv@err{Value of key '#1' must
@@ -453,9 +532,9 @@
}
% \skv@foreach@maketester{<cond>}<cond.tester.cmd>{<flag>}
%
-% 1. Only balanced conditionals beginning with \if...\fi are allowed.
-% Restricting the type of allowed conditionals is necessary for
-% auto syntax checking.
+% 1. Only balanced conditionals beginning with \if... and ending with \fi
+% are allowed. Restricting the type of allowed conditionals is
+% necessary for auto syntax checking.
% 2. <flag> is either 0 or 1, signifying whether or not the condition
% should be entered in postcallback.
%
@@ -466,23 +545,23 @@
% characters. \skv@prova will appear only in the error message.
\begingroup
\edef\skv@prova{\detokenize{#1}}%
- \skvifblank{#1}{%
+ \skvifblankTF{#1}{%
\skv@err{A blank conditional given in \string\newforeach}\@ehd
}{%
- \skvxifin{\skv@foreach@fi\relax}{\detokenize{#1}\relax}{%
- \skvxifin{\relax\skv@foreach@if}{\relax\detokenize{#1}}{%
- \edef#2{\noexpand\skvifcondition\unexpanded{#1}}%
+ \skvxifinTF{\skv@foreach@fi\relax}{\detokenize{#1}\relax}{%
+ \skvxifinTF{\relax\skv@foreach@if}{\relax\detokenize{#1}}{%
+ \edef#2{\noexpand\skvifconditionTF\unexpanded{#1}}%
\ifnum#3=\@ne
\skv@foreach@addtocallback{post}{%
- \unexpanded{\skvifcondition#1}{\noexpand\skvbreakloop}{\relax}%
+ \unexpanded{\skvifconditionTF#1}{\noexpand\skvbreakloop}{}%
}%
\fi
}{%
- \skv@err{Illegal conditional '\skv@prova'}
+ \skv@err{Invalid conditional '\skv@prova'}
{Invalid, possibly unbalanced, conditional '\skv@prova'}%
}%
}{%
- \skv@err{Illegal conditional '\skv@prova'}\@ehd
+ \skv@err{Invalid conditional '\skv@prova'}\@ehd
}%
}%
\skvexpanded{\endgroup
@@ -517,7 +596,7 @@
}
}
-\quickkeys.define{skvforeach}{%
+\quickkeys.define{skeyval/foreach}{%
.exec/
\def\skv@foreach@parser{,}
\def\skv@foreach@subparser{/}
@@ -526,7 +605,7 @@
\ifskvindef\else
\edef\skv@foreach@parser{\unexpanded{#1}}
\skvstripouterbraces{2}\skv@foreach@parser
- \skvxifntype{\detokenize{#1}}{%
+ \skvxifntypeTF{\detokenize{#1}}{%
\begingroup
% It is assumed that every n-type parser and subparser
% must have catcode 12:
@@ -540,7 +619,7 @@
\ifskvindef\else
\edef\skv@foreach@subparser{\unexpanded{#1}}
\skvstripouterbraces{2}\skv@foreach@subparser
- \skvxifntype{\detokenize{#1}}{
+ \skvxifntypeTF{\detokenize{#1}}{
\begingroup
\skvexpandnext{\catcode`}\skv@foreach@subparser=12\relax
\skv@rescan\skv@foreach@subparser
@@ -552,10 +631,6 @@
\edef\skv@foreach@terminator{\unexpanded{#1}}%
\skvstripouterbraces{2}\skv@foreach@terminator
;
- list is a macro,macro list/true/
- \edef\skv@foreach@listismacro{0\skvifstrcmp{true}{#1}01}%
- /true,false
- ;
% process up to = <nr>
% Maximum number of items to process:
process up to,process up to number/\@nil/
@@ -567,7 +642,7 @@
\fi
;
process empty list/true/
- \edef\skv@foreach@processempty{0\skvifstrcmp{true}{#1}01}%
+ \edef\skv@foreach@processempty{0\skvifstrcmpTF{true}{#1}01}%
/true,false
;
% Eg, exit when=\ifnum\x=20\fi
@@ -626,7 +701,7 @@
% count in = \y all \x satisfying <condition> initially <value>
% Eg,
% count in = \p all \x satisfying \ifnum\x>4\fi, or
- % count in = \p all \x satisfying \skvifnum\x>4
+ % count in = \p all \x satisfying \skvifnumTF\x>4
% The counting is not additive, meaning that the counter is initialized
% to zero on each depth.
count in,count/\@nil/
@@ -655,7 +730,7 @@
\ifx\skv@prova\@nnil
\skv@err{Invalid empty value for key 'item counter'}\@ehd
\else
- \skvifescaped{#1}{%
+ \skvifescapedTF{#1}{%
\let\skv@foreach@itemcounter\skv@prova
}{%
\skv@err{Non-escaped value '\detokenize{#1}'
@@ -687,11 +762,11 @@
% Remember outside the loop the holder values. Of course, this
% means remembering only the latest values.
recover holder values,recover holder values after loop/true/
- \edef\skv@foreach@recoverholders{0\skvifstrcmp{true}{#1}01}%
+ \edef\skv@foreach@recoverholders{0\skvifstrcmpTF{true}{#1}01}%
/true,false
;
% This default value of 'link' is required by \skv@foreach@filllist:
- .exec/\def\skv@foreach@link{\@nil};
+ .exec code/\def\skv@foreach@link{\@nil};
link/\@nil/
\ifskvindef\else
\edef\skv@foreach@link{\unexpanded{#1}}%
@@ -709,7 +784,7 @@
\skv@err{Value required for key 'grow'}\@ehd
\else
\skvcsedef{skv@foreach@grow#1}{00}
- \edef\skv@prova{\skvifstrcmp{#1}{left}{right}{left}}%
+ \edef\skv@prova{\skvifstrcmpTF{#1}{left}{right}{left}}%
\skvcsedef{skv@foreach@grow\skv@prova}{01}%
\fi
\fi
@@ -721,37 +796,59 @@
;
grow left/true/
\ifskvindef\else
- \edef\skv@foreach@growleft{0\skvifstrcmp{true}{#1}01}
- \edef\skv@foreach@growright{0\skvifstrcmp{true}{#1}10}
+ \edef\skv@foreach@growleft{0\skvifstrcmpTF{true}{#1}01}
+ \edef\skv@foreach@growright{0\skvifstrcmpTF{true}{#1}10}
\fi
/true,false
;
grow right/true/
\ifskvindef\else
- \edef\skv@foreach@growright{0\skvifstrcmp{true}{#1}01}
- \edef\skv@foreach@growleft{0\skvifstrcmp{true}{#1}10}
+ \edef\skv@foreach@growright{0\skvifstrcmpTF{true}{#1}01}
+ \edef\skv@foreach@growleft{0\skvifstrcmpTF{true}{#1}10}
\fi
/true,false
;
% Keep the decimals in rounded numbers or dimensions when list is
% auto-completed. The value value of this key is 'true'.
keep decimals/true/
- \edef\skv@foreach@keepdecimals{0\skvifstrcmp{true}{#1}01}
+ \edef\skv@foreach@keepdecimals{0\skvifstrcmpTF{true}{#1}01}
/true,false
;
keep high decimals,keep only high decimals/true/
- \edef\skv@foreach@keephighdecimals{0\skvifstrcmp{true}{#1}01}
+ \edef\skv@foreach@keephighdecimals{0\skvifstrcmpTF{true}{#1}01}
/true,false
;
% This key means that, eg, for \x/\y, do \let\y=\x if \y has no
% user value, ie, if the user gives as an item 'a' instead of
% 'a/b' or 'a/a'.
- inherit/true/
- \edef\skv@foreach@inherit{0\skvifstrcmp{true}{#1}01}
+ inherit,transfer macro values/true/
+ \edef\skv@foreach@inherit{0\skvifstrcmpTF{true}{#1}01}
/true,false
;
- expand before fill/true/
- \edef\skv@foreach@expandbeforefill{0\skvifstrcmp{true}{#1}01}
+ expand before fill,expand list before fill/true/
+ \edef\skv@foreach@expandlistbeforefill{0\skvifstrcmpTF{true}{#1}01}
+ /true,false
+ ;
+ expand list once,*,list is a macro,macro list/true/
+ \edef\skv@foreach@expandlistonce{0\skvifstrcmpTF{true}{#1}01}%
+ /true,false
+ ;
+ expand list twice/true/
+ \edef\skv@foreach@expandlisttwice{0\skvifstrcmpTF{true}{#1}01}%
+ /true,false
+ ;
+ % Don't use 'expand' for this key, to avoid confusing it with
+ % the 'expand' for holder macros:
+ expand list,fully expand list,expand list fully/true/
+ \edef\skv@foreach@expandlistfully{0\skvifstrcmpTF{true}{#1}01}%
+ /true,false
+ ;
+ reverse list,reverse,reflect/true/
+ \edef\skv@foreach@reverselist{0\skvifstrcmpTF{true}{#1}01}
+ /true,false
+ ;
+ reverse list,reverse,reflect/true/
+ \edef\skv@foreach@reverselist{0\skvifstrcmpTF{true}{#1}01}
/true,false
;
}
@@ -762,11 +859,10 @@
% evaluate dim,*evaluate dim,expand,*expand,count in,*count in,
% loop stopper,process up to,grow
%
-\skvinitializeqkeys{skvforeach}{%
+\skvinitializeqkeys{skeyval/foreach}{%
parser,
subparser,
callback terminator,
- list is a macro=false,
process up to,
process empty list=false,
item counter,
@@ -779,24 +875,28 @@
keep high decimals=false,
inherit=false,
expand before fill=false,
+ reverse list=false,
+ expand list once=false,
+ expand list twice=false,
+ expand list fully=false,
}
\skvnewdef*\skv@foreach@kvlist{}
% \setupforeach{<kvlist>}
\skvrobustdef*\setupforeach#1{%
- \skvifblank{#1}{}{%
+ \skvifblankTF{#1}{}{%
\skvaddtolist\skv@foreach@kvlist{#1}%
}%
}
\skvrobustdef*\skv@foreach@setkeys#1{%
- \def\reserved@a{\quickkeys.set{skvforeach}}%
+ \def\reserved@a{\quickkeys.set{skeyval/foreach}}%
\expandafter\reserved@a\expandafter{\skv@foreach@kvlist,#1}%
}
% evaluate=<holder.macro> as <child.macro> using <formula>
%
% 1. Evaluation is done with \edef unless \pgfmathparse is present
-% in <formula>.
+% in <formula> or key 'pgf evaluate' is called.
%
% 2. <formula> must be a valid formula, eg,
%
@@ -817,7 +917,7 @@
\skvrobustdef*\skv@foreach@parseevaluate#1{%
\begingroup
\def\skv@tempxifin##1##2{%
- \skvxifin{\detokenize{##1}}{\detokenize{##2}}%
+ \skvxifinTF{\detokenize{##1}}{\detokenize{##2}}%
}%
\skv@foreach@swafalse
\def\skv@tempd{}%
@@ -828,8 +928,8 @@
\ifx\skv@prova\@empty
\skv@err{Value of key 'evaluate' has no holder macro}\@ehd
\else
- \expandafter\skvifescaped\expandafter{\skv@prova}{%
- \expandafter\skvifntype\expandafter{\skv@prova}{}{%
+ \expandafter\skvifescapedTF\expandafter{\skv@prova}{%
+ \expandafter\skvifntypeTF\expandafter{\skv@prova}{}{%
\skv@err{Value of key 'evaluate': more than 1
\MessageBreak token \skvoxdetok\skv@prova.
\MessageBreak I can't find holder macro}\@ehd
@@ -842,8 +942,8 @@
\ifx\skv@provb\@empty
\skv@err{Value of key 'evaluate' has no child macro}\@ehd
\else
- \expandafter\skvifescaped\expandafter{\skv@provb}{%
- \expandafter\skvifntype\expandafter{\skv@provb}{}{%
+ \expandafter\skvifescapedTF\expandafter{\skv@provb}{%
+ \expandafter\skvifntypeTF\expandafter{\skv@provb}{}{%
\skv@err{Value of key 'evaluate': more than 1
\MessageBreak token \skvoxdetok\skv@provb.
\MessageBreak I can't find child macro}\@ehd
@@ -910,7 +1010,7 @@
\ifx\@nnil#1\@nnil
\skv@err{Value of key 'evaluate' has no holder macro}\@ehd
\else
- \skvifntype{#1}{%
+ \skvifntypeTF{#1}{%
% Expand the holder macro:
\skv@tempa#1as#1using#1\skv@nil
}{%
@@ -950,7 +1050,7 @@
\skv@err{No \string\pgfmathparse; 'pgfmath' module not loaded}\@ehd
\fi
\def\skv@tempxifin##1##2{%
- \skvxifin{\detokenize{##1}}{\detokenize{##2}}%
+ \skvxifinTF{\detokenize{##1}}{\detokenize{##2}}%
}%
\skv@foreach@swafalse
\def\skv@tempa##1as##2using##3\skv@nil{%
@@ -960,8 +1060,8 @@
\ifx\skv@prova\@empty
\skv@err{Value of key 'pgfmath parse' has no holder macro}\@ehd
\else
- \expandafter\skvifescaped\expandafter{\skv@prova}{%
- \expandafter\skvifntype\expandafter{\skv@prova}{}{%
+ \expandafter\skvifescapedTF\expandafter{\skv@prova}{%
+ \expandafter\skvifntypeTF\expandafter{\skv@prova}{}{%
\skv@err{Value of key 'pgfmath parse': more than 1
\MessageBreak token \skvoxdetok\skv@prova.
\MessageBreak I can't find holder macro}\@ehd
@@ -974,8 +1074,8 @@
\ifx\skv@provb\@empty
\skv@err{Value of key 'pgfmath parse' has no child macro}\@ehd
\else
- \expandafter\skvifescaped\expandafter{\skv@provb}{%
- \expandafter\skvifntype\expandafter{\skv@provb}{}{%
+ \expandafter\skvifescapedTF\expandafter{\skv@provb}{%
+ \expandafter\skvifntypeTF\expandafter{\skv@provb}{}{%
\skv@err{Value of key 'pgfmath parse': more than 1
\MessageBreak token \skvoxdetok\skv@provb.
\MessageBreak I can't find child macro}\@ehd
@@ -1041,7 +1141,7 @@
\ifx\@nnil#1\@nnil
\skv@err{Value of key 'pgfmath parse' has no holder macro}\@ehd
\else
- \skvifntype{#1}{%
+ \skvifntypeTF{#1}{%
% Evaluate the holder macro:
\skv@tempa#1as#1using#1\skv@nil
}{%
@@ -1089,7 +1189,7 @@
\skvrobustdef*\skv@foreach@parsecountin#1{%
\begingroup
\def\skv@tempxifin##1##2{%
- \skvxifin{\detokenize{##1}}{\detokenize{##2}}%
+ \skvxifinTF{\detokenize{##1}}{\detokenize{##2}}%
}%
\def\skv@tempa##1\skv@nil{%
\skv@tempxifin{initially}{##1}{%
@@ -1106,8 +1206,8 @@
\ifx\skv@prova\@empty
\skv@err{Value of key 'count' has no counter macro}\@ehd
\else
- \expandafter\skvifescaped\expandafter{\skv@prova}{%
- \expandafter\skvifntype\expandafter{\skv@prova}{}{%
+ \expandafter\skvifescapedTF\expandafter{\skv@prova}{%
+ \expandafter\skvifntypeTF\expandafter{\skv@prova}{}{%
\skv@err{Value of key 'count in': more than 1
\MessageBreak token \skvoxdetok\skv@prova.
\MessageBreak I can't find counter macro}\@ehd
@@ -1120,7 +1220,7 @@
\ifx\skv@provd\@empty
\expandafter\def\skv@prova{0}%
\else
- \skvifinteger\skv@provd{%
+ \skvifintegerTF\skv@provd{%
\expandafter\let\skv@prova\skv@provd
}{%
\skv@err{Value of key 'count':\MessageBreak
@@ -1136,8 +1236,8 @@
\ifx\skv@provb\@empty\else
% If there isn't a holder macro or quantity to test, then no
% test is possible:
- \expandafter\skvifescaped\expandafter{\skv@provb}{%
- \expandafter\skvifntype\expandafter{\skv@provb}{}{%
+ \expandafter\skvifescapedTF\expandafter{\skv@provb}{%
+ \expandafter\skvifntypeTF\expandafter{\skv@provb}{}{%
\skv@err{Value of key 'count in': more than 1
\MessageBreak token \skvoxdetok\skv@provb.
\MessageBreak I can't find holder macro}\@ehd
@@ -1169,7 +1269,7 @@
\ifx\@nnil#1\@nnil
\skv@err{Value of key 'count' has no counter macro}\@ehd
\else
- \skvifntype{#1}{%
+ \skvifntypeTF{#1}{%
\skv@tempa#1all satisfying\skv@nil
}{%
\skv@err{Value of key 'count in': more than 1
@@ -1203,7 +1303,7 @@
\skvrobustdef*\skv@foreach@parseremember#1{%
\begingroup
\def\skv@tempxifin##1##2{%
- \skvxifin{\detokenize{##1}}{\detokenize{##2}}%
+ \skvxifinTF{\detokenize{##1}}{\detokenize{##2}}%
}%
\skv@tempxifin{(}{#1}{%
\skv@err{Value of key 'remember': '(' found.
@@ -1219,7 +1319,7 @@
\skv@err{Value of key 'remember' has no holder macro:
\MessageBreak i.e., no macro that holds input}\@ehd
\else
- \expandafter\skvifescaped\expandafter{\skv@prova}{}{%
+ \expandafter\skvifescapedTF\expandafter{\skv@prova}{}{%
\skv@err{Value of key 'remember':
\MessageBreak Holder macro \skvoxdetok\skv@prova not escaped}\@ehd
}%
@@ -1228,7 +1328,7 @@
\skv@err{Value of key 'remember' has no child macro;
\MessageBreak i.e., no macro after 'as'}\@ehd
\else
- \expandafter\skvifescaped\expandafter{\skv@provb}{%
+ \expandafter\skvifescapedTF\expandafter{\skv@provb}{%
\skv@foreach@swatrue
}{%
\skv@err{Value of key 'remember':
@@ -1286,7 +1386,7 @@
\skvrobustdef*\skv@foreach@parserecall#1{%
\begingroup
\def\skv@tempxifin##1##2{%
- \skvxifin{\detokenize{##1}}{\detokenize{##2}}%
+ \skvxifinTF{\detokenize{##1}}{\detokenize{##2}}%
}%
\skv@tempxifin{(}{#1}{%
\skv@err{Value of key 'recall': '(' found.
@@ -1301,8 +1401,8 @@
\skv@err{Value of key 'recall' has no holder macro:
\MessageBreak i.e., no macro that holds input}\@ehd
\else
- \expandafter\skvifntype\expandafter{\skv@prova}{%
- \expandafter\skvifescaped\expandafter{\skv@prova}{%
+ \expandafter\skvifntypeTF\expandafter{\skv@prova}{%
+ \expandafter\skvifescapedTF\expandafter{\skv@prova}{%
\edef\skv@elt{\expandafter\skvremovescape\skv@prova}%
\skv@foreach@swatrue
% Initially:
@@ -1349,6 +1449,23 @@
\fi
}%
}
+% \skv@foreach@doreverselist{<parser>}{<listcmd>}
+\skvnewdef*\skv@foreach@doreverselist#1#2{%
+ \begingroup
+ \def\skv@tempb{}%
+ \def\skv@tempa##1#1##2\skv@reverse@stop{%
+ \if\relax\detokenize{##2}\relax\skv@reverse@stop\fi
+ \skv@tempa##2\skv@reverse@stop
+ \edef\skv@tempb{%
+ \skvexpandonce\skv@tempb\ifx\skv@tempb\@empty\else#1\fi
+ \unexpanded{##1}%
+ }%
+ }%
+ \def\skv@reverse@stop##1\skv@reverse@stop{\fi}%
+ \expandafter\skv@tempa#2#1\skv@reverse@stop
+ \let#2\skv@tempb
+ \skvaftergroupdef#2\endgroup
+}
% Eg, \skv@dots@in<value>\skv@nil...\skv@nnil\skv@stop
\skvnewdef*\skv@dots@in#1...#2#3\skv@stop{%
@@ -1376,8 +1493,9 @@
\skvrobustdef*\skv@foreach@pushstate{%
\skvsavestate\skv@foreach@stack{%
+ \do\skv@foreach@seenstar
\do\skv@foreach@parser\do\skv@foreach@subparser
- \do\skv@foreach@listismacro
+ \do\skv@foreach@listisamacro
\do\skv@foreach@processupto\do\skv@foreach@processempty
\do\skv@foreach@exittester
\do\skv@foreach@grow\do\skv@foreach@growleft
@@ -1392,20 +1510,24 @@
\do\foreachlistremainder\do\skv@foreach@mainloop
\do\skv@foreach@getnext\do\skv@foreach@getrm
\do\skv@foreach@do@a\do\skv@foreach@do@b
+ \do\skv@foreach@paramlist
\do\skv@foreach@holderlist
\do\skv@foreach@userlist
\do\skv@foreach@inherit
\do\skv@foreach@keepdecimals
\do\skv@foreach@keephighdecimals
\do\skv@foreach@itemcounter
- \do\skv@foreach@link\do\skv@foreach@expandbeforefill
+ \do\skv@foreach@link
+ \do\skv@foreach@expandlistbeforefill\do\skv@foreach@expandlistonce
+ \do\skv@foreach@expandlisttwice\do\skv@foreach@expandlistfully
\do\skv@listbreakertoks\do\skv@listpausertoks
+ \do\skv@foreach@reverselist
\do\foreachcurrentitem
\do\foreachnextitem
\do\foreachitemcount
\do\foreachprevitem
% The following commands are disabled on entry into the loop.
- % Hence they need to be stacked:
+ % Hence they need to be stacked here:
\do\prependtobeginforeach
\do\appendtobeginforeach
\do\atbeginforeach
@@ -1422,14 +1544,15 @@
\skvnewdef*\skv@foreach@nnil{\skv@foreach@nil}
\skvrobustdef*\newforeach{\skv@testst\skv@newforeach@beginprescan}
\skvrobustdef*\skv@newforeach@beginprescan{%
- \edef\skv@foreach@st{0\ifskv@tempst0\else1\fi}%
+ \edef\skv@foreach@seenstar{0\ifskv@tempst0\else1\fi}%
\begingroup
+ \def\skv@foreach@holderlist{}%
\def\skv@tempa{%
\skvexpanded{\endgroup
- \noexpand\skv@foreach@endprescan{\skvexpandonce\skv@tempb}%
+ \noexpand\skv@foreach@endprescan
+ {\skvexpandonce\skv@foreach@holderlist}%
}%
}%
- \def\skv@tempb{}%
\let\bgroup\relax
\skvifnextchar[{%
\endgroup
@@ -1449,8 +1572,8 @@
}%
}
\skvrobustdef*\skv@foreach@collectholders#1{%
- \edef\skv@tempb{%
- \skvexpandonce\skv@tempb\skvtrimspace{#1}%
+ \edef\skv@foreach@holderlist{%
+ \skvexpandonce\skv@foreach@holderlist\skvtrimspace{#1}%
}%
\skvifnextchar[{%
\skv@tempa
@@ -1467,14 +1590,14 @@
}%
}
\skvrobustdef*\skv@foreach@endprescan#1[#2]{%
- \skvifblank{#1}{%
+ \skvifblankTF{#1}{%
\skv@err{\string\newforeach: no holder macros seen}\@ehd
}{%
\skv@foreach@scanarg[#2]#1%
}%
}
-\skvrobustdef*\skv@foreach@scanarg{\skv@testopt\skv@foreach@a{}}
-\skvrobustdef*\skv@foreach@a[#1]{%
+\skvrobustdef*\skv@foreach@scanarg{\skv@testopt\skv@foreach@scanarg@a{}}
+\skvrobustdef*\skv@foreach@scanarg@a[#1]{%
\skv@foreach@pushstate
\skv@foreach@latehookerr
% \foreachitemcount must be a macro, not a counter, because it is stacked:
@@ -1492,39 +1615,50 @@
% Since \skv@foreach@precallback are initialized in each nest, the
% keys have to be reset here.
\skv@foreach@setkeys{#1}%
+ % We've set the keys; let's overrule \skv@foreach@expandlistonce if
+ % we had seen a star suffix. Don't overrule \skv@foreach@expandlisttwice
+ % and \skv@foreach@expandlistfully.
+ \if\skv@foreach@seenstar
+ \def\skv@foreach@expandlistonce{00}%
+ \fi
+ \ifcase0%
+ \if\skv@foreach@expandlistonce0\else
+ \if\skv@foreach@expandlisttwice0\else
+ \if\skv@foreach@expandlistfully0\else 1\fi\fi\fi\relax
+ \def\skv@foreach@listisamacro{00}%
+ \else
+ \def\skv@foreach@listisamacro{01}%
+ \fi
\begingroup
% Collect item holders. Don't confuse explicit \bgroup for left brace:
\skv@cnta\skvz@
- \def\skv@tempb{}%
+ \def\skv@foreach@holderlist{}%
\let\bgroup\relax
- \skvifnextchar i\skv@foreach@c{%
- \skvifnextchar\skv@orig@bgroup\skv@foreach@d\skv@foreach@b
+ \skvifnextchar i\skv@foreach@scanarg@c{%
+ \skvifnextchar\skv@orig@bgroup
+ \skv@foreach@scanarg@d\skv@foreach@scanarg@b
}%
}
% #1: one holer macro or subparser.
-\skvrobustdef*\skv@foreach@b#1{%
- \ifnum\skv@cnta=\skvz@
- \skvifescaped{#1}{}{%
- \skv@err{Token '\noexpand#1' is not escaped
- \MessageBreak and can't be a holder macro}\@ehd
- }%
- \else
+\skvrobustdef*\skv@foreach@scanarg@b#1{%
+ % Odd items must be subparser:
+ \ifodd\skv@cnta
\ifnum\skv@cnta=\@ne
- \skvifescaped{#1}{%
+ \skvifescapedTF{#1}{%
\skv@err{Token '\noexpand#1' cannot be a subparser;
- \MessageBreak it seems to be a holder macro.
- \MessageBreak I expected the subparser to be the
- \MessageBreak second token here.}\@ehd
+ \MessageBreak it seems to be a holder macro. I expected
+ \MessageBreak the subparser to be the token here.}\@ehd
}{%
\edef\skv@prova{\skvtrimspace{#1}}%
\let\elt\skvexpandonce
- \def\skv@elt{\elt\skv@foreach@subparser}%
- \if\elt\skv@prova\skv@elt\else
- % Don't stack \skv@warnsubparser:
+ \let\skv@elt\skv@foreach@subparser
+ \if\elt\skv@prova\elt\skv@elt\else
+ % Don't stack \skv@warnsubparser, so that the following
+ % warning isn't called more than once in the inner loop.
\ifnum\skv@warnsubparser=\skvz@
\skvgadvanceno\skv@warnsubparser\@ne
\skv@warn{Scanned subparser '\elt\skv@prova' is different from
- \MessageBreak the default or user-supplied subparser '\skv@elt'.
+ \MessageBreak the default or user-supplied subparser '\elt\skv@elt'.
\MessageBreak I have used '\elt\skv@prova', but please submit
\MessageBreak '\elt\skv@prova' as the value of the key
'subparser'
@@ -1534,83 +1668,92 @@
\fi
}%
\fi
+ \else
+ \skvifescapedTF{#1}{}{%
+ \skv@err{Token '\noexpand#1' is not escaped
+ \MessageBreak and can't be a holder macro}\@ehd
+ }%
\fi
\advance\skv@cnta\@ne
- \edef\skv@tempb{\skvexpandonce\skv@tempb\skvtrimspace{#1}}%
- \skvifnextchar i\skv@foreach@c{%
- \skvifnextchar\skv@orig@bgroup\skv@foreach@d\skv@foreach@b
+ \edef\skv@foreach@holderlist{%
+ \skvexpandonce\skv@foreach@holderlist\skvtrimspace{#1}%
+ }%
+ \skvifnextchar i\skv@foreach@scanarg@c{%
+ \skvifnextchar\skv@orig@bgroup
+ \skv@foreach@scanarg@d\skv@foreach@scanarg@b
}%
}
-\skvrobustdef*\skv@foreach@c#1#2{%
- \skvifstrcmp{#1#2}{in}{%
- \skv@foreach@d
+\skvrobustdef*\skv@foreach@scanarg@c#1#2{%
+ \skvifstrcmpTF{#1#2}{in}{%
+ \skv@foreach@scanarg@d
}{%
\skv@err{I have seen 'i' but no expected 'in'}\@ehd
}%
}
-\skvrobustdef*\skv@foreach@d{%
- \ifx\skv@tempb\@empty
+\skvrobustdef*\skv@foreach@scanarg@d{%
+ \ifx\skv@foreach@holderlist\@empty
\skv@err{No item holder macros before 'in'
\MessageBreak or before left brace}\@ehd
\fi
\skvifnextchar\skv@orig@bgroup{%
- \skv@foreach@e
+ \skv@foreach@scanarg@e
}{%
- \if\skv@foreach@listismacro
- \expandafter\skv@foreach@e
+ \if\skv@foreach@listisamacro
+ \expandafter\skv@foreach@scanarg@e
\else
- \if\skv@foreach@st
- \expandafter\expandafter\expandafter\skv@foreach@e
- \else
- \def\reserved@a##1{%
- \skvifmacro{##1}{%
- \def\skv@ehd{Maybe a star (*) suffix or key 'list is
- a macro' is missing.}%
- }{%
- \let\skv@ehd\@ehd
- }%
- \skv@err{I expected a left brace for beginning of list,
- \MessageBreak since you haven't told me that your
- \MessageBreak list is a macro. Instead I found '\detokenize{##1}'.
- \MessageBreak If your list is indeed a macro, you can
- \MessageBreak either put star (*) after \noexpand\newforeach
- \MessageBreak or use the key 'list is a macro'%
- }{%
- \skv@ehd
- }%
+ \def\reserved@a##1{%
+ \skvifmacroTF{##1}{%
+ \def\skv@tempehd{Maybe a star (*) suffix after
+ \noexpand\newforeach or key 'expand list once', etc.,
+ \MessageBreak is missing.}%
+ }{%
+ \let\skv@tempehd\@ehd
}%
- \expandafter\expandafter\expandafter\reserved@a
- \fi
+ \skv@err{I expected a left brace for beginning of list,
+ \MessageBreak since you haven't told me that your
+ \MessageBreak list is a macro. Instead I found '\detokenize{##1}'.
+ \MessageBreak If your list is indeed a macro, you can
+ \MessageBreak either put star (*) after \noexpand\newforeach
+ \MessageBreak or use the key 'expand list once'
+ \MessageBreak or 'expand list twice' or 'list is a macro', etc.%
+ }\skv@tempehd
+ }%
+ \expandafter\reserved@a
\fi
}%
}
% #1: <list> or <listcmd>
-\skvrobustdef*\skv@foreach@e#1{%
- \edef\skv@tempc{\unexpanded{#1}}%
- \skvifnextchar\skv@orig@bgroup\skv@foreach@h{%
- \skvifnextchar d\skv@foreach@f\skv@foreach@g
+\skvrobustdef*\skv@foreach@scanarg@e#1{%
+ \edef\skv@foreach@userlist{\unexpanded{#1}}%
+ \skvifnextchar\skv@orig@bgroup\skv@foreach@scanarg@h{%
+ \skvifnextchar d\skv@foreach@scanarg@f\skv@foreach@scanarg@g
}%
}
-\skvrobustdef*\skv@foreach@f#1#2{%
- \skvifstrcmp{#1#2}{do}{%
- \skvifnextchar\skv@orig@bgroup\skv@foreach@h\skv@foreach@g
+\skvrobustdef*\skv@foreach@scanarg@f#1#2{%
+ \skvifstrcmpTF{#1#2}{do}{%
+ \skvifnextchar\skv@orig@bgroup
+ \skv@foreach@scanarg@h\skv@foreach@scanarg@g
}{%
\skv@err{I have seen 'd' but no the expected 'do'}\@ehd
}%
}
% We've exhausted all options for grabbing the callback, so now
-% look for terminator (default ;). If there is no terminator ahead,
-% the use of \skv@prova will trigger 'the use of ... does not match
-% its definition' or 'runaway argument ...'.
-\skvrobustdef*\skv@foreach@g{%
+% look for terminator (default ;).
+%
+% 1. If there is no terminator ahead, the use of \skv@prova will trigger
+% 'the use of ... does not match its definition' or
+% 'runaway argument ...'.
+% 2. This covers the case when \newforeach or \foreach comes next in
+% the callback.
+\skvrobustdef*\skv@foreach@scanarg@g{%
\def\skv@prova##1{%
\def\skv@prova####1##1{%
% Look out for a case like 'parser=<parser>'.
% Eg, \newforeach[parser=;]. In this case, the value ';' of
% key 'parser' will mistakenly be assumed to be the callback
% terminator. It should be enclosed in braces.
- \skvxifin{\detokenize{parser=}\relax}{\detokenize{####1}\relax}{%
- \skvxifin{[}{\detokenize{####1}}{%
+ \skvxifinTF{\detokenize{parser=}\relax}{\detokenize{####1}\relax}{%
+ \skvxifinTF{[}{\detokenize{####1}}{%
\skv@err{Put '##1' in braces for key 'parser=##1'.
\MessageBreak Try [parser={##1}]}
{Maybe parser '##1' is the value of a key/option of
@@ -1619,48 +1762,58 @@
one ending a TikZ object. Maybe you need to do [parser={##1}].}%
}{%
% Otherwise, let's try continue:
- \skvexpanded{\noexpand\skv@foreach@h{\skvtrimspace{####1}##1}}%
+ \skvexpanded{%
+ \noexpand\skv@foreach@scanarg@h{\skvtrimspace{####1}##1}%
+ }%
}%
}{%
- \skvexpanded{\noexpand\skv@foreach@h{\skvtrimspace{####1}##1}}%
+ \skvexpanded{%
+ \noexpand\skv@foreach@scanarg@h{\skvtrimspace{####1}##1}%
+ }%
}%
}%
\skv@prova
}%
- % In case callback terminator is currently active:
+ % In case callback terminator is currently active, rescan it.
\skv@rescan\skv@foreach@terminator
\expandafter\skv@prova\expandafter{\skv@foreach@terminator}%
}
% #1: callback
-\skvrobustdef*\skv@foreach@h#1{%
+\skvrobustdef*\skv@foreach@scanarg@h#1{%
\skvexpanded{\endgroup
- % The subparser may have changed along the way (see \skv@foreach@b):
+ % The subparser may have changed along the way
+ % (see \skv@foreach@scanarg@b):
\skvcmdexit\skv@foreach@subparser
- \skv@foreach@i{\skvexpandonce\skv@tempb}{\skvexpandonce\skv@tempc}%
+ \skv@foreach@mainprocess
+ {\skvexpandonce\skv@foreach@holderlist}%
+ {\skvexpandonce\skv@foreach@userlist}%
}{#1}%
}
% #1: holder macros
% #2: List or list command
% #3: Callback
-\skvrobustdef*\skv@foreach@i#1#2#3{%
- \if\skv@foreach@st\else
- \if\skv@foreach@listismacro
- \def\skv@foreach@st{00}%
- \else
- \def\skv@foreach@st{01}%
- \fi
- \fi
+\skvrobustdef*\skv@foreach@mainprocess#1#2#3{%
\edef\skv@foreach@userlist{%
- \if\skv@foreach@st
+ \if\skv@foreach@expandlistonce
\expandafter\skvexpandonce
\else
- \expandafter\unexpanded
+ \if\skv@foreach@expandlisttwice
+ \expandafter\expandafter\expandafter\skvexpandtwice
+ \else
+ \if\skv@foreach@expandlistfully
+ \expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\@iden
+ \else
+ \expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\unexpanded
+ \fi
+ \fi
\fi
{#2}%
}%
% Initial code, if any:
\skvcsuse{skv@foreach@atbeginhook@\skvrom\foreachdepth}%
- \skvifdef\foreachprevitem{}{\def\foreachprevitem{}}%
+ \skvifdefTF\foreachprevitem{}{\def\foreachprevitem{}}%
\expandafter\skv@foreach@normalize\expandafter
[\skv@foreach@parser]\skv@foreach@userlist
\expandafter\skv@foreach@normalize\expandafter
@@ -1694,21 +1847,21 @@
}%
\def\skv@foreach@do@a####1##1####2\skv@foreach@stop{%
\edef\foreachcurrentitem{\skvexpandonce{\@gobble####1}}%
- \skvifx\foreachcurrentitem\skv@foreach@nnil{%
+ \skvifxTF\foreachcurrentitem\skv@foreach@nnil{%
\skvbreakloopfalse
\foreachlastitemfalse
}{%
- \skvifx\foreachcurrentitem\skv@listbreakertoks{%
+ \skvifxTF\foreachcurrentitem\skv@listbreakertoks{%
\skv@foreach@getrm{####2}%
}{%
- \skvifx\foreachcurrentitem\skv@listpausertoks{%
+ \skvifxTF\foreachcurrentitem\skv@listpausertoks{%
\message{^^J! List pause:
^^JType x or X to quit, or <RETURN> to proceed^^J}%
\begingroup
\endlinechar\m@ne\global\read-1 to\@gtempa
\endgroup
\skvexpandarg\lowercase{\def\noexpand\@gtempa{\@gtempa}}%
- \skvxifstrcmp\@gtempa{x}{%
+ \skvxifstrcmpTF\@gtempa{x}{%
\skv@foreach@getrm{####2}%
}{%
\skv@foreach@do@b{####2}%
@@ -1721,26 +1874,26 @@
}%
\def\skv@foreach@do@b####1{%
\edef\foreachitemcount{\the\numexpr\foreachitemcount+1}%
- \ifnum0=\numexpr
- \ifx\skv@foreach@itemcounter\@undefined-1\else+0\fi
- \ifx\skv@foreach@itemcounter\@empty-1\else+0\fi
- \ifx\skv@foreach@itemcounter\@nnil-1\else+0\fi\relax\relax
+ \ifcase0%
+ \ifx\skv@foreach@itemcounter\@undefined 1\fi
+ \ifx\skv@foreach@itemcounter\@empty 1\fi
+ \ifx\skv@foreach@itemcounter\@nnil 1\fi\relax
\expandafter\let\skv@foreach@itemcounter\foreachitemcount
\fi
\skv@foreach@lookahead@a\skv@foreach@getnext####1\skv@foreach@stop
% In case the user decides to continue after \listpauser:
- \skvifx\foreachcurrentitem\skv@listpausertoks{}{%
+ \skvifxTF\foreachcurrentitem\skv@listpausertoks{}{%
\expandafter\skv@foreach@callback\expandafter{\foreachcurrentitem}%
}%
\let\foreachprevitem\foreachcurrentitem
- \ifx\skv@foreach@processupto\@undefined\else
- \ifx\skv@foreach@processupto\@nnil\else
- \ifnum\foreachitemcount<\skv@foreach@processupto\relax\else
- \skvbreakloop
- \fi
+ \ifcase0%
+ \ifx\skv@foreach@processupto\@undefined 1\fi
+ \ifx\skv@foreach@processupto\@nnil 1\fi\relax
+ \ifnum\foreachitemcount<\skv@foreach@processupto\relax\else
+ \skvbreakloop
\fi
\fi
- \skvifdefbool{skvbreakloop}{%
+ \skvifdefboolTF{skvbreakloop}{%
\skv@foreach@getrm{####1}%
}{%
\skv@foreach@lookahead@a\skv@foreach@do@a####1\skv@foreach@stop
@@ -1755,11 +1908,15 @@
}%
\skv@prova####1%
}%
- \skvifx\skv@foreach@userlist\@empty{%
+ \skvifxTF\skv@foreach@userlist\@empty{%
\if\skv@foreach@processempty\skv@foreach@callback{}\fi
}{%
\expandafter\skv@foreach@filllist\expandafter
{\skv@foreach@parser}\skv@foreach@userlist
+ \if\skv@foreach@reverselist\skvafterfi
+ \expandafter\skv@foreach@doreverselist\expandafter
+ {\skv@foreach@parser}\skv@foreach@userlist
+ \fi
\expandafter\skv@foreach@lookahead@a\expandafter\skv@foreach@do@a
\skv@foreach@userlist##1\skv@foreach@nil##1\skv@foreach@stop
}%
@@ -1776,6 +1933,9 @@
\skvrestorestate\skv@foreach@holderstate\skv@foreach@sisterdepth
\fi
\skv@foreach@popstate
+ \ifnum\foreachdepth=\skvz@
+ \def\skv@warnsubparser{0}%
+ \fi
}
% \skv@foreach@makeprecode{<holder.list>}
@@ -1850,12 +2010,11 @@
\skvcmdexit\skv@foreach@precallback
}%
}
-
% #1: callback
\skvrobustdef*\skv@foreach@makeauxcallback#1{%
\begingroup
\def\skv@generatesubparser##1{%
- \ifnum##1<10\skvexpandonce\skv@foreach@subparser
+ \ifnum##1<10 \skvexpandonce\skv@foreach@subparser
\expandafter\skv@generatesubparser
\expandafter{\number\numexpr##1+1\expandafter}%
\fi
@@ -1863,24 +2022,25 @@
% Add extra subparsers in case some items aren't subparser-complete:
\edef\skv@tempa{\skv@generatesubparser{1}}%
\let\foreacheov\relax
+ \let\\\noexpand
\skvexpanded{\endgroup
% Define auxiliary callback:
- \def\noexpand\skv@foreach@auxcallback\skv@foreach@paramlist\foreacheov{%
+ \def\\\skv@foreach@auxcallback\skv@foreach@paramlist\foreacheov{%
% Holder macro assignments:
\skvexpandonce\skv@foreach@precallback
% User tests/tasks, eg, if requested from 'evaluate' key:
\skvexpandonce\skv@foreach@afterprecallback
- \noexpand\ifnum\noexpand\foreachitemcount=\@ne
- \noexpand\skv@foreach@onlyinitially
- \noexpand\fi
+ \\\ifnum\\\foreachitemcount=\@ne
+ \\\skv@foreach@onlyinitially
+ \\\fi
\unexpanded{#1}%
% User tests/tasks, eg, if requested from the keys 'remember',
% 'exit when', etc:
\skvexpandonce\skv@foreach@postcallback
}%
% Define the real callback:
- \def\noexpand\skv@foreach@callback####1{%
- \noexpand\skv@foreach@auxcallback####1\skv@tempa\foreacheov
+ \def\\\skv@foreach@callback####1{%
+ \\\skv@foreach@auxcallback####1\skvxonce\skv@tempa\foreacheov
}%
}%
}
@@ -1917,12 +2077,12 @@
}
\skvnewdef*\skv@foreach@ifloweralpha#1{%
- \skvifblank{#1}{%
+ \skvifblankTF{#1}{%
\@secondoftwo
}{%
- \skvifntype{#1}{%
- \skvifnum`#1>96{%
- \skvifnum`#1<123{%
+ \skvifntypeTF{#1}{%
+ \skvifnumTF`#1>96{%
+ \skvifnumTF`#1<123{%
\@firstoftwo
}{%
\@secondoftwo
@@ -1936,12 +2096,12 @@
}%
}
\skvnewdef*\skv@foreach@ifupperalpha#1{%
- \skvifblank{#1}{%
+ \skvifblankTF{#1}{%
\@secondoftwo
}{%
- \skvifntype{#1}{%
- \skvifnum`#1>64{%
- \skvifnum`#1<91{%
+ \skvifntypeTF{#1}{%
+ \skvifnumTF`#1>64{%
+ \skvifnumTF`#1<91{%
\@firstoftwo
}{%
\@secondoftwo
@@ -1965,12 +2125,12 @@
\def\skv@foreach@origunit{}%
\def\skv@foreach@filledlist{}%
\edef\skv@foreach@parser{\skvtrimspace{#1}}%
- \ifx\skv@foreach@parser\@undefined
+ \ifx\skv@foreach@parser\@empty
\def\skv@foreach@parser{,}%
\fi
\def\skv@foreach@iflinkgiven{%
- \skvifdef\skv@foreach@link{%
- \skvnotifx\skv@foreach@link\@nnil
+ \skvifdefTF\skv@foreach@link{%
+ \skvifxFT\skv@foreach@link\@nnil
}{%
\skv@err{List auto-completion: 'link' is undefined}\@ehd
}%
@@ -1987,8 +2147,8 @@
\edef\skv@tempa{\unexpanded{#2}}%
\skv@foreach@normalize[#1]\skv@tempa
\def\skv@prova##1{%
- \skvxifin{...}{\detokenize{##1}}{%
- \if\skv@foreach@expandbeforefill
+ \skvxifinTF{...}{\detokenize{##1}}{%
+ \if\skv@foreach@expandlistbeforefill
\edef\skv@tempa{##1}%
\skv@foreach@normalize[#1]\skv@tempa
\else
@@ -2015,10 +2175,10 @@
\fi
\fi
% \newforeach format is '<parser>...<parser>':
- \skvxifin{\detokenize{#1...#1}}{\detokenize{#2}}{%
+ \skvxifinTF{\detokenize{#1...#1}}{\detokenize{#2}}{%
\skv@foreach@splitonguide{#1}{#2}%
\def\skv@prova##1#1##2#1...#1##3#1##4#1##5\skv@nil{%
- \skvifblank{##3}{%
+ \skvifblankTF{##3}{%
\skv@err{I can't find upper limit number or dimension,
\MessageBreak i.e., after symbool '...'}\@ehd
}{%
@@ -2032,7 +2192,7 @@
% Complete the list:
\skv@foreach@filllist@c{#1}{##1}{##2}{##3}%
% In case the list is folded on ellipsis (...):
- \skvifblank{##4}{}{\skv@foreach@filllist@a{#1}{##4#1##5}}%
+ \skvifblankTF{##4}{}{\skv@foreach@filllist@a{#1}{##4#1##5}}%
}%
}%
\expandafter\skv@prova\skv@tempa#1#1\skv@nil
@@ -2045,9 +2205,9 @@
% \skv@foreach@zerostepwarn{<lower>}{<upper>}{<pt.or.nil>}
\skvrobustdef*\skv@foreach@zerostepwarn#1#2#3{%
\skv@warn{The tokens '\detokenize{#1}', '\detokenize{#2}'
- give nil step; '1#3' used. \MessageBreak
- Maybe you used the font-dependent units \MessageBreak
- 'ex' or 'em' before \skv@begindoc@string}%
+ give nil step; '1#3' used.\MessageBreak
+ Maybe you used the font-dependent units\MessageBreak
+ 'ex' or 'em' \ifskv@latex before \skv@begindoctoks\fi}%
}
% skv@foreach@filllist@c{<parser>}{<lower1>}{<lower2>}{<upperbound>}
@@ -2093,10 +2253,10 @@
\def\skv@prova##1{%
\skv@foreach@swatrue
\skviflacus#2\then\else
- \skvifin{##1}{#2}{}\skv@foreach@swafalse
+ \skvifinTF{##1}{#2}{}\skv@foreach@swafalse
\fi
- \skvifin{##1}{#3}{}\skv@foreach@swafalse
- \skvifin{##1}{#4}{}\skv@foreach@swafalse
+ \skvifinTF{##1}{#3}{}\skv@foreach@swafalse
+ \skvifinTF{##1}{#4}{}\skv@foreach@swafalse
\ifskv@foreach@swa\else
\edef\skv@provb{\ifx\@nnil#2\@nnil\else\unexpanded{#2}, \fi}%
\skv@err{No link '##1' in one of
@@ -2143,7 +2303,7 @@
% {a^1,a^3,...,a^9} : link = ^, grow = right
% {A_1,B_1,...,E_1} : link = _, grow = left
% {1--,4--,...,16--} : link = --, grow = left
-% {1pt,4pt,...,10pt} : link = pt, grow = left (or addit. info.)
+% {1pt,4pt,...,10pt} : link = pt, grow = left, or no addit. info.
% {A_2pt,A_4pt,...,A_10pt} : link = _, grow = right
%
% The items prior to the last 2 items before '<guide>...' or before '...'
@@ -2159,7 +2319,7 @@
\begingroup
\skv@cnta\skvz@
\def\do##1#1{%
- \skvifin{...}{##1}{%
+ \skvifinTF{...}{##1}{%
\def\do####1\skv@nil{}%
}{%
\advance\skv@cnta\@ne
@@ -2205,39 +2365,43 @@
% When we say, 'try PGF format', we don't actually mean the PGF format with
% left and right guides, but the syntax '<guide>...' (ie, having only the
% left-hand-side or only the right-hand-side guide). For example,
-% {A_2pt,A_4pt,A_...,A_10pt}. \skv@foreach@trypgfformat will auto-complete
-% this list without knowledge of the values of the keys 'link' and 'grow'.
+%
+% {A_2pt,A_4pt,A_...,A_10pt} or {1pt,4pt,...pt,10pt}
+%
+% \skv@foreach@trypgfformat will auto-complete this list without
+% knowledge of the values of the keys 'link' and 'grow'.
%
% skeyval formats:
%
% {1pt,4pt,...pt,10pt} : no additional info. required
% {A_2pt,A_4pt,A_...,A_10pt} : no additional info. required
-% {1pt,4pt,...,10pt} : link = pt, grow=right (or no addit. info.)
+% {1pt,4pt,...,10pt} : link = pt, grow=right, or no addit. info.
% {A_2pt,A_4pt,...,A_10pt} : link =_, grow=right
%
-% The general PGF format (with left and right guides) is illegal here,
-% because the skeyval-for package uses the location of the guide (left or
-% right of ...) to determine the direction of growth.
+% The general PGF format (with left and right guides), e.g.,
%
% {A_2pt,A_4pt,A_...pt,A_10pt}
%
+% is illegal here, because the skeyval-for package uses the location
+% of the guide (left or right of ...) to determine the direction of growth.
+%
\skvrobustdef*\skv@foreach@trypgfformat#1#2{%
\skv@foreach@splitonguide{#1}{#2}%
\def\skv@prova##1#1##2#1##3...##4#1##5#1##6#1##7\skv@nil{%
- \skvifblank{##5}{%
+ \skvifblankTF{##5}{%
\skv@err{I can't find upper limit number or dimension,
\MessageBreak i.e., after symbool '...'}\@ehd
}{%
% \skv@foreach@filllist@a may be reentered. Hence
- \if\relax\detokenize{##1}\relax\else
+ \skviflacus{##1}\then\else
\edef\skv@foreach@filledlist{%
\skvaddlist{#1}\skv@foreach@filledlist
\skvtrimspace{##1}%
}%
\fi
\def\do####1{{\skvtrimspace{####1}}}%
- \skvifblank{##3}{%
- \skvifblank{##4}{%
+ \skvifblankTF{##3}{%
+ \skvifblankTF{##4}{%
\skv@err{No direction of growth before and/or after
\MessageBreak symbol '...'}\@ehd
}{%
@@ -2249,7 +2413,7 @@
}%
}%
}{%
- \skvifblank{##4}{%
+ \skvifblankTF{##4}{%
\def\skv@foreach@growright{00}%
\def\skv@foreach@growleft{01}%
\skvexpanded{%
@@ -2262,11 +2426,12 @@
\MessageBreak\noexpand\newforeach and \noexpand\newforeach.
\MessageBreak I know that PGF's \noexpand\foreach needs it,
\MessageBreak but I don't need it. I can
- \MessageBreak auto-fill your list without it.}\@ehd
+ \MessageBreak auto-fill your list with information
+ \MessageBreak on only one side.}\@ehd
}%
}%
% In case the list is folded on ellipsis (...):
- \skvifblank{##6}{}{\skv@foreach@filllist@a{#1}{##6#1##7}}%
+ \skvifblankTF{##6}{}{\skv@foreach@filllist@a{#1}{##6#1##7}}%
}%
}%
\expandafter\skv@prova\skv@tempa#1#1#1\skv@nil
@@ -2286,10 +2451,10 @@
\skvrobustdef*\skv@foreach@trypgfformat@a#1#2#3#4#5{%
\skv@foreach@swafalse
\skviflacus#3\then\else
- \skvxifin{#2}{#3}{}\skv@foreach@swatrue
+ \skvxifinTF{#2}{#3}{}\skv@foreach@swatrue
\fi
- \skvxifin{#2}{#4}{}\skv@foreach@swatrue
- \skvxifin{#2}{#5}{}\skv@foreach@swatrue
+ \skvxifinTF{#2}{#4}{}\skv@foreach@swatrue
+ \skvxifinTF{#2}{#5}{}\skv@foreach@swatrue
\ifskv@foreach@swa
\skv@err{Guide token '\detokenize{#2}' not found in some
\MessageBreak of the elements: I can't complete
@@ -2467,8 +2632,6 @@
}%
\expandafter\do#3#1\do#1%
}
-
-
\skvrobustdef*\skv@foreach@getcomparator{%
\begingroup
% 'unit' isn't required in alphabetic sequences:
@@ -2476,7 +2639,7 @@
\let\skvreversedo\@iden
\edef\skv@provb{\skvexpbracenext\skvreverse{\skv@foreach@step}}%
\def\skv@prova##1##2##3\skv@nil{%
- \skvxifin{,\detokenize{##2##1},}{,\skvoxdetok\skv@validunit,}{%
+ \skvxifinTF{,\detokenize{##2##1},}{,\skvoxdetok\skv@validunit,}{%
\def\skv@foreach@unit{}%
}{%
\def\skv@foreach@unit{pt}%
@@ -2551,7 +2714,7 @@
step '\skv@foreach@step' isn't an integer}\@ehd
}%
\skv@foreach@addtolist{#1}{#2}#4%
- \skvifstrcmp{#2}{#3}{}{%
+ \skvifstrcmpTF{#2}{#3}{}{%
\edef\skv@lowerlimit{#2}%
\edef\skv@upperlimit{#3}%
\skvexpandnext{\chardef\skv@lowerlimit`}\skv@lowerlimit\relax
diff --git a/Master/texmf-dist/tex/latex/skeyval/skeyval-ltxcmds.tex b/Master/texmf-dist/tex/latex/skeyval/skeyval-ltxcmds.tex
index dbdb14df6cf..17b4c19c9d5 100644
--- a/Master/texmf-dist/tex/latex/skeyval/skeyval-ltxcmds.tex
+++ b/Master/texmf-dist/tex/latex/skeyval/skeyval-ltxcmds.tex
@@ -1,5 +1,5 @@
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
-% This is file 'skeyval-ltxcmds.tex', version 1.1, 2012/10/15. %
+% This is file 'skeyval-ltxcmds.tex', 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, %
@@ -26,29 +26,80 @@
% Copyright (c) 2010-2012 Ahmed Musa (amusa22@gmail.com). %
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
-\csname skeyval-ltxcmds-loaded\endcsname
-\expandafter\let\csname skeyval-ltxcmds-loaded\endcsname\endinput
-
+\begingroup%
+\let\e\endlinechar\edef\p{\the\e}\e13\edef\n{\the\catcode\e}%
+\xdef\skv@ltxcmds@restorecatcodes{%
+ \let\noexpand\skv@ltxcmds@restorecatcodes\relax%
+ \endlinechar=\p\relax\catcode\number\e=\n\relax%
+ \catcode\string`\noexpand`\string=\the\catcode\string``\relax%
+ \catcode\string`\noexpand=\string=\the\catcode\string`=\relax%
+}%
+\endgroup%
+\endlinechar\string=13\relax%
+\catcode13\string=5\relax%
+\catcode\string``\string=12\relax
+\catcode\string`=\string=12\relax
+\long\def\skvgobble#1{}
+\def\do#1{\catcode`\expandafter\skvgobble\string#1=\the\catcode`#1\relax}
\edef\skv@ltxcmds@restorecatcodes{%
- \catcode`\noexpand\@\the\catcode`\@\relax
- \let\noexpand\skv@ltxcmds@restorecatcodes\relax
+ \unexpanded\expandafter{\skv@ltxcmds@restorecatcodes}%
+ \do\ \do\%\do\@\do\(\do\)\do\[\do\]\do\|\do\:\do\;\do\,\do\.%
+ \do\>\do\<\do\!\do\*\do\+\do\-\do\^\do\_\do\&\do\$\do\~\do\'%
+ \do\"\do\
}
-\catcode`\@=11\relax
+\catcode`\ =10\relax
+\catcode`\@=11 \catcode`\(=12 \catcode`\)=12 \catcode`\[=12
+\catcode`\]=12 \catcode`\|=12 \catcode`\:=12 \catcode`\;=12
+\catcode`\,=12 \catcode`\*=12 \catcode`\+=12 \catcode`\-=12
+\catcode`\<=12 \catcode`\>=12 \catcode`\!=12 \catcode`\.=12
+\catcode`\^=07 \catcode`\_=08 \catcode`\&=04 \catcode`\$=03
+\catcode`\~=13 \catcode`\%=14 \catcode`\'=12 \catcode`\"=12
-\message{skeyval-ltxcmds 2012/10/15 v1.1 skeyval TeX header (AM)}
+\csname skeyval-ltxcmds-loaded\endcsname
+\expandafter\let\csname skeyval-ltxcmds-loaded\endcsname\endinput
+\message{skeyval-ltxcmds 2012/10/16 v1.1a skeyval TeX header (AM)}
+
+\countdef\m@ne=22 \m@ne=-1
+\def\wlog{\immediate\write\m@ne}
+\countdef\count@=255
+\dimendef\dimen@=0
+\dimendef\dimen@i=1
+\dimendef\dimen@ii=2
+\skipdef\skip@=0
+\toksdef\toks@=0
+\newif\if@tempswa
+\newcount\@tempcnta
+\newcount\@tempcntb
+\newdimen\@tempdima
+\newdimen\@tempdimb
+\newdimen\@tempdimc
+\newbox\@tempboxa
+\newskip\@tempskipa
+\newskip\@tempskipb
+\newtoks\@temptokena
\def\@nnil{\@nil}
\def\@empty{}
+\def\space{ }
+\def\@space{ }
\long\def\@firstofone#1{#1}
+\let\@iden\@firstofone
\long\def\@firstoftwo#1#2{#1}
\long\def\@secondoftwo#1#2{#2}
\long\def\@gobble#1{}
\long\def\@gobbletwo#1#2{}
\lowercase{\def\@gobblespace} {}
\def\@nameuse#1{\csname#1\endcsname}
+\def\@namedef#1{\expandafter\def\csname#1\endcsname}
\let\l@ngrel@x\relax
+\def\loop#1\repeat{%
+ \def\iterate{#1\relax\expandafter\iterate\fi}%
+ \iterate\let\iterate\relax
+}
+\let\repeat\fi
\protected\def\newif#1{%
- \count@\escapechar\escapechar\m@ne
+ \count@\escapechar
+ \escapechar\m@ne
\let#1\iffalse
\ltx@booldef#1\iftrue
\ltx@booldef#1\iffalse
diff --git a/Master/texmf-dist/tex/latex/skeyval/skeyval-ltxpatch.sty b/Master/texmf-dist/tex/latex/skeyval/skeyval-ltxpatch.sty
index e44d3b50f7b..82d624e3985 100644
--- a/Master/texmf-dist/tex/latex/skeyval/skeyval-ltxpatch.sty
+++ b/Master/texmf-dist/tex/latex/skeyval/skeyval-ltxpatch.sty
@@ -1,5 +1,5 @@
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
-% This is file 'skeyval-ltxpatch.sty', version 1.1, 2012/10/15. %
+% This is file 'skeyval-ltxpatch.sty', version 1.1a, 2012/10/16. %
% %
% The rationale for this package: the patch in 'xkvltxp' package isn't %
% strong enough. %
@@ -42,9 +42,15 @@
\expandafter\do
\fi
}%
- \edef\skvltxp@restorecodes{\do035,064,123,125,061,059,\do,}%
+ \edef\skv@ltxp@restorecodes{\do35,64,123,125,61,59,13,\do,}%
}
\skv@prova
+
+\edef\skv@ltxp@restorecodes{%
+ \unexpanded\expandafter{\skv@ltxp@restorecodes}%
+ \endlinechar\the\endlinechar\relax
+}
+\endlinechar13 %
\catcode035 06 % #
\catcode064 11 % @
\catcode123 01 % {
@@ -53,8 +59,8 @@
\catcode044 12 % ,
\def\do#1=#2,{%
\ifx\do#1\else
- \edef\skvltxp@restorecodes{%
- \skvltxp@restorecodes
+ \edef\skv@ltxp@restorecodes{%
+ \unexpanded\expandafter{\skv@ltxp@restorecodes}%
\catcode#1=\the\catcode#1\relax
}%
\catcode#1=#2\relax
@@ -66,12 +72,13 @@
\NeedsTeXFormat{LaTeX2e}[2011/06/27]
\ProvidesPackage{skeyval-ltxpatch}
- [2012/10/15 v1.1 Patches for LaTeX2e kernel options processing (AM)]
+ [2012/10/16 v1.1a Patches for LaTeX2e kernel options processing (AM)]
+\ifdefined\skvz@\else\newdimen\skvz@\fi
\def\@space{ }
\protected\def\skvltxptracingall{%
\tracinggroups\@ne\tracingifs\@ne\loggingall\tracingassigns\@ne
- \tracingonline\z@\tracingifs\z@
+ \tracingonline\skvz@\tracingifs\skvz@
}
\let\skvltxploggingall\skvltxptracingall
@@ -105,12 +112,13 @@
\edef#1{\expandafter\skvltxp@trimspace\expandafter{#1}}%
}
-% \skvltxp@normalize isn't meant for normalizing keyval lists.
-\protected\def\skvltxp@setupnormalizer#1{%
+% \skvltxp@setupnormalizer{<parser>}<normalizer.cmd>
+% <normalizer.cmd> should not be used for normalizing keyval lists.
+\protected\def\skvltxp@setupnormalizer#1#2{%
\begingroup
\lccode`\~=`#1\relax
\lowercase{\endgroup
- \def\skvltxp@normalize##1{%
+ \def#2##1{%
\unexpanded\expandafter
{\romannumeral\skvltxp@activeparser#1##1#1~\skv@nil}%
}%
@@ -138,10 +146,7 @@
}%
}%
}
-\def\skvltxp@commanormalize#1{%
- \skvltxp@setupnormalizer{,}%
- \edef#1{\expandafter\skvltxp@normalize\expandafter{#1}}%
-}
+\skvltxp@setupnormalizer{,}\skvltxp@commanormalize
\newif\ifbreakkerpaloop
\def\kerpaloopdepth{0}
@@ -176,13 +181,14 @@
}%
\xdef\kerpaloopdepth{\the\numexpr\kerpaloopdepth-1}%
}
+% \skvltxp@getoptionnames<cmd.in><cmd.out>
\def\skvltxp@getoptionnames#1#2{%
\def#2{}%
- \skvltxp@commanormalize#1%
- \def\do##1=##2\skv@nil{%
- \edef#2{\ifx#2\@empty\else#2,\fi##1}%
+ \edef#1{\expandafter\skvltxp@commanormalize\expandafter{#1}}%
+ \def\do##1=##2=##3\skv@nil{%
+ \edef#2{\ifx\@empty#2\else#2,\fi##1}%
}%
- \kerpaloop*{,}#1{\do##1=\skv@nil}%
+ \kerpaloop*{,}#1{\do##1==\skv@nil}%
}
\def\@ptionlist#1{%
\@ifundefined{opt@#1}{}{\unexpanded\expandafter
@@ -192,9 +198,9 @@
\@expandtwoargs\@if@pti@ns{\@ptionlist{#2.#1}}{\unexpanded{#3}}%
}
\def\@if@pti@ns#1#2{%
- \skvltxp@setupnormalizer{,}%
- \edef\skv@options@i{\skvltxp@normalize{#1}}%
- \edef\skv@options@ii{\skvltxp@normalize{#2}}%
+% \skvltxp@setupnormalizer{,}%
+ \edef\skv@options@i{\skvltxp@commanormalize{#1}}%
+ \edef\skv@options@ii{\skvltxp@commanormalize{#2}}%
\ifx\skv@options@i\skv@options@ii
\def\skv@tempa{\expandafter\@firstoftwo\@gobbletwo}%
\else
@@ -431,7 +437,7 @@
}
\let\@@fileswith@pti@ns\@fileswith@pti@ns
-\skvltxp@restorecodes
+\skv@ltxp@restorecodes
\endinput
%% End of file `skeyval-ltxpatch.sty'.
diff --git a/Master/texmf-dist/tex/latex/skeyval/skeyval-pstkey.sty b/Master/texmf-dist/tex/latex/skeyval/skeyval-pstkey.sty
index 155b5b56b02..280338217ac 100644
--- a/Master/texmf-dist/tex/latex/skeyval/skeyval-pstkey.sty
+++ b/Master/texmf-dist/tex/latex/skeyval/skeyval-pstkey.sty
@@ -1,5 +1,5 @@
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
-% This is file 'skeyval-pstkey.sty', version 1.1, 2012/10/15. %
+% This is file 'skeyval-pstkey.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, %
@@ -26,19 +26,61 @@
% Copyright (c) 2010-2012 Ahmed Musa (amusa22@gmail.com). %
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
+\begingroup
+\catcode035 06 % #
+\catcode064 11 % @
+\catcode123 01 % {
+\catcode125 02 % }
+\catcode044 12 % ,
+\def\skv@prova{\endgroup
+ \def\do##1,{%
+ \ifx\do##1\else
+ \catcode##1\string=\the\catcode##1\relax
+ \expandafter\do
+ \fi
+ }%
+ \edef\skv@pst@restorecodes{\do35,64,123,125,61,59,13,\do,}%
+}
+\skv@prova
+
+\edef\skv@pst@restorecodes{%
+ \unexpanded\expandafter{\skv@pst@restorecodes}%
+ \endlinechar\the\endlinechar\relax
+}
+\endlinechar13 %
+\catcode035 06 % #
+\catcode064 11 % @
+\catcode123 01 % {
+\catcode125 02 % }
+\catcode061 12 % =
+\catcode044 12 % ,
+\def\do#1=#2,{%
+ \ifx\do#1\else
+ \edef\skv@pst@restorecodes{%
+ \unexpanded\expandafter{\skv@pst@restorecodes}%
+ \catcode#1=\the\catcode#1\relax
+ }%
+ \catcode#1=#2\relax
+ \expandafter\do
+ \fi
+}
+\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=,%
+
\NeedsTeXFormat{LaTeX2e}[2011/06/27]
\ProvidesPackage{skeyval-pstkey}
- [2012/10/15 v1.1 LaTeX/package wrapper for skeyval-pstkey.tex (AM)]
+ [2012/10/16 v1.1a LaTeX/package wrapper for skeyval-pstkey.tex (AM)]
\expandafter\ifx\csname skeyval-pstkey-loaded\endcsname
\endinput\else
\input skeyval-pstkey
\fi
\skvdeclareoption*{%
- \PackageWarning{skeyval-pstkey}{Unknown option
- '\CurrentOption' ignored}%
+ \PackageWarning{skeyval-pstkey}
+ {Unknown option '\CurrentOption' ignored}%
}
\skvprocessoptions
+\skv@pst@restorecodes
\endinput
%% End of file `skeyval-pstkey.sty'.
diff --git a/Master/texmf-dist/tex/latex/skeyval/skeyval-pstkey.tex b/Master/texmf-dist/tex/latex/skeyval/skeyval-pstkey.tex
index 83fd3dfff44..bc5952d0377 100644
--- a/Master/texmf-dist/tex/latex/skeyval/skeyval-pstkey.tex
+++ b/Master/texmf-dist/tex/latex/skeyval/skeyval-pstkey.tex
@@ -1,5 +1,5 @@
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
-% This is file 'skeyval-pstkey.tex', version 1.0, 2012/10/15. %
+% This is file 'skeyval-pstkey.tex', 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, %
@@ -26,25 +26,48 @@
% Copyright (c) 2010-2012 Ahmed Musa (amusa22@gmail.com). %
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
-\csname skeyval-pstkey-loaded\endcsname
-\expandafter\let\csname skeyval-pstkey-loaded\endcsname\endinput
-
+\begingroup%
+\let\e\endlinechar\edef\p{\the\e}\e13\edef\n{\the\catcode\e}%
+\xdef\skv@pst@restorecatcodes{%
+ \let\noexpand\skv@pst@restorecatcodes\relax%
+ \endlinechar=\p\relax\catcode\number\e=\n\relax%
+ \catcode\string`\noexpand`\string=\the\catcode\string``\relax%
+ \catcode\string`\noexpand=\string=\the\catcode\string`=\relax%
+}%
+\endgroup%
+\endlinechar\string=13\relax%
+\catcode13\string=5\relax%
+\catcode\string``\string=12\relax
+\catcode\string`=\string=12\relax
+\def\skvgobble#1{}
+\def\do#1{\catcode`\expandafter\skvgobble\string#1=\the\catcode`#1\relax}
\edef\skv@pst@restorecatcodes{%
- \catcode`\noexpand\@\the\catcode`\@\relax
- \let\noexpand\skv@pst@restorecatcodes\relax
+ \unexpanded\expandafter{\skv@pst@restorecatcodes}%
+ \do\ \do\%\do\@\do\(\do\)\do\[\do\]\do\|\do\:\do\;\do\,\do\.%
+ \do\>\do\<\do\!\do\*\do\+\do\-\do\^\do\_\do\&\do\$\do\~\do\'%
+ \do\"\do\
}
-\catcode`\@=11\relax
+\catcode`\ =10\relax
+\catcode`\@=11 \catcode`\(=12 \catcode`\)=12 \catcode`\[=12
+\catcode`\]=12 \catcode`\|=12 \catcode`\:=12 \catcode`\;=12
+\catcode`\,=12 \catcode`\*=12 \catcode`\+=12 \catcode`\-=12
+\catcode`\<=12 \catcode`\>=12 \catcode`\!=12 \catcode`\.=12
+\catcode`\^=07 \catcode`\_=08 \catcode`\&=04 \catcode`\$=03
+\catcode`\~=13 \catcode`\%=14 \catcode`\'=12 \catcode`\"=12
+
+\csname skeyval-pstkey-loaded\endcsname
+\expandafter\let\csname skeyval-pstkey-loaded\endcsname\endinput
\def\skv@@afterfi#1\fi{\fi#1}
\def\skv@@afterelse#1\else#2\fi{\fi#1}
\ifx\ProvidesFile\@undefined\skv@@afterelse
- \message{File 'skeyval-pstkey.tex' 2012/10/15 v1.1
+ \message{File 'skeyval-pstkey.tex' 2012/10/16 v1.1a
PSTricks specialization of skeyval package (AM)}
\input skeyval-core
\else\skv@@afterfi
\ProvidesFile{skeyval-pstkey.tex}
- [2012/10/15 v1.1 PSTricks specialization of skeyval (AM)]
+ [2012/10/16 v1.1a PSTricks specialization of skeyval (AM)]
\@addtofilelist{skeyval-pstkey.tex}
\@ifpackageloaded{skeyval}{}{\RequirePackage{skeyval}}
\fi
diff --git a/Master/texmf-dist/tex/latex/skeyval/skeyval-view.sty b/Master/texmf-dist/tex/latex/skeyval/skeyval-view.sty
index fc078fd2378..6e40b3d6611 100644
--- a/Master/texmf-dist/tex/latex/skeyval/skeyval-view.sty
+++ b/Master/texmf-dist/tex/latex/skeyval/skeyval-view.sty
@@ -1,5 +1,5 @@
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
-% This is file 'skeyval-view.sty', version 1.1, 2012/10/15. %
+% This is file 'skeyval-view.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\skvv@restorecodes{\do035,064,123,125,061,059,\do,}%
+ \edef\skv@view@restorecodes{\do35,64,123,125,61,59,13,\do,}%
}
\skv@prova
+
+\edef\skv@view@restorecodes{%
+ \unexpanded\expandafter{\skv@view@restorecodes}%
+ \endlinechar\the\endlinechar\relax
+}
+\endlinechar13 %
\catcode035 06 % #
\catcode064 11 % @
\catcode123 01 % {
@@ -50,8 +56,8 @@
\catcode044 12 % ,
\def\do#1=#2,{%
\ifx\do#1\else
- \edef\skvv@restorecodes{%
- \skvv@restorecodes
+ \edef\skv@view@restorecodes{%
+ \unexpanded\expandafter{\skv@view@restorecodes}%
\catcode#1=\the\catcode#1\relax
}%
\catcode#1=#2\relax
@@ -63,7 +69,7 @@
\NeedsTeXFormat{LaTeX2e}[2011/06/27]
\ProvidesPackage{skeyval-view}
- [2012/10/15 v1.1 Viewer utility for skeyval package (AM)]
+ [2012/10/16 v1.1a Viewer utility for skeyval package (AM)]
\@ifpackageloaded{skeyval}{}{\RequirePackage{skeyval}}
\directkeys*{%
.prefix=SKVV,
@@ -71,12 +77,12 @@
.holder prefix=skvv@,
.initialize keys after define,
.every unknown option={
- \PackageWarning{skeyval-view}{Unknown option '\CurrentOption'}%
+ \PackageWarning{skeyval-view}{Unknown option '\CurrentOption' ignored}%
},
.new options={
% LaTeX's options processor will zap the option names. So these keys
% can't have spaces between their parts.
- .ords/{xcolor-options,load-xcolor-with}//
+ .ord/{xcolor-options,load-xcolor-with}//
\edef\skvv@xcoloroptions{\unexpanded{#1}}
\skvstripouterbraces{1}\skvv@xcoloroptions,
},
@@ -100,17 +106,17 @@
.holder prefix=skvv@,
.initialize after define=false,
.define keys={
- .ords/{file,wcolsep,weol}/\@nil/
+ .ord/{file,wcolsep,weol}/\@nil/
\skvcsedef{skvv@\skvcurrentkey}{\unexpanded{#1}}
\skvaftercsname{\skvstripouterbraces{1}}{skvv@\skvcurrentkey}
\skvaftercsname\skvdespacecontent{skvv@\skvcurrentkey}
,
- .ords/{prefix,family,type,default,columns}/\@nil/
+ .ord/{prefix,family,type,default,columns}/\@nil/
\skvcsedef{skvv@\skvcurrentkey}{\unexpanded{#1}}
\skvaftercsname{\skvstripouterbraces{1}}{skvv@\skvcurrentkey}
\skvaftercsname\skvcsvnormalize{skvv@\skvcurrentkey}
,
- .bools/{view,vlabels,wlabels}/true,
+ .bool/{view,vlabels,wlabels}/true,
.ord/length of default/20/\def\skvv@lod{#1},
.cmd/color/black,
},
@@ -152,7 +158,7 @@
}%
}
\protected\def\skv@ordkey@a#1[#2]#3{%
- \skvifstrcmp{#2}{^skv^}{%
+ \skvifstrcmpTF{#2}{^skv^}{%
\skvv@tabulate{#1}{ordinary}{[none]}%
}{%
\skv@definedefault{#1}{#2}%
@@ -162,7 +168,7 @@
}
\protected\def\skv@cmdkey#1#2[#3]#4{%
\skv@strippointers{#2}\skvcurrentkey
- \skvifdefbool{skv@st}{%
+ \skvifdefboolTF{skv@st}{%
\skv@definedefault\skvcurrentkey{#3}%
\skvv@tabulate\skvcurrentkey{command}{#3}%
}{%
@@ -172,26 +178,35 @@
% spaces in key name:
\edef\skv@prova{#1\skvcurrentkey}%
\edef\skv@prova{\expandafter\skv@zapornot\expandafter
- {\expandafter\skv@zapnr\expandafter}\expandafter{\skv@prova}}%
+ {\expandafter\skv@zapsw\expandafter}\expandafter{\skv@prova}}%
\skvcslet{\skv@header\skvcurrentkey.@hp}\skv@prova
\skvcsedef{\skv@header\skvcurrentkey.@cbk}{\unexpanded{#4}}%
}
-\protected\def\skv@choicekey@c[#1]{%
- \skvifstrcmp{#1}{^skv^}{%
- \skvv@tabulate\skvcurrentkey{choice}{[none]}%
- }{%
- \skv@definedefault\skvcurrentkey{#1}%
- \skvv@tabulate\skvcurrentkey{choice}{#1}%
+\protected\def\skv@choicekey@g{%
+ \skvcommaparse*\skv@currlist\skv@prova{%
+ \skvexpbracenext\skv@strippointers\skv@prova\skvcurrentkey
+ \ifx\skv@default\skv@rej
+ \skvv@tabulate\skvcurrentkey{choice}{[none]}%
+ \else\skvafterfi
+ \skvexpanded{%
+ \noexpand\skvv@tabulate
+ {\skvxonce\skvcurrentkey}{choice}{\skvxonce\skv@default}%
+ \noexpand\skv@definedefault
+ {\skvxonce\skvcurrentkey}{\skvxonce\skv@default}%
+ }%
+ \fi
+ \skvcsedef{\skv@header\skvcurrentkey.@hp}{\skv@hp\skvcurrentkey}%
+ \skvcsedef{\skv@header\skvcurrentkey.@cbk}{\the\skv@toksa}%
}%
- \skvifdefbool{skv@pl}\skv@choicekey@e\skv@choicekey@d
}
\protected\def\skv@boolkey@c#1#2#3#4{%
- \skvcsnewif{\skv@zapornot{\skv@zapnr}{#2}}%
- \skvifdefbool{skv@st}{%
+ \skvcsnewif{\skv@zapornot{\skv@zapsw}{#2}}%
+ \edef\skvv@boolortog{\if\skv@typetogkey toggle\else bool\fi}%
+ \skvifdefboolTF{skv@st}{%
\skv@definedefault{#1}{#3}%
- \skvv@tabulate{#1}{bool}{#3}%
+ \skvv@tabulate{#1}{\skvv@boolortog}{#3}%
}{%
- \skvv@tabulate{#1}{bool}{[none]}%
+ \skvv@tabulate{#1}{\skvv@boolortog}{[none]}%
}%
\edef\skv@tempa##1##2{%
\noexpand\skv@sttrue
@@ -206,7 +221,7 @@
\skvcommaparse{#1}\skv@prova{%
\skvexpbracenext\skv@strippointers\skv@prova\skvcurrentkey
\skvexpanded{%
- \skvifstrcmp{#3}{^skv^}{%
+ \skvifstrcmpTF{#3}{^skv^}{%
\skvv@tabulate{\skvcurrentkey}{style}{[none]}%
}{%
\skv@definedefault{\skvcurrentkey}{\unexpanded{#3}}%
@@ -314,7 +329,7 @@
}
\skvrobustdef*\skvv@ifin#1#2{%
\ifx#2\@nnil\else
- \skvxifin{,\detokenize{#1},}{,\skvoxdetok{#2},}{}\skv@swafalse
+ \skvxifinTF{,\detokenize{#1},}{,\skvoxdetok{#2},}{}\skv@swafalse
\fi
}
@@ -324,8 +339,8 @@
.holder prefix=skvvs@,
.initialize keys after define,
.new keys={
- .ords/{.show,.show table}//
- \skvifdefbool{skvindef}{}{
+ .ord/{.show,.show table}//
+ \skvifdefboolTF{skvindef}{}{
\edef\skvvs@show{\unexpanded{#1}}
\skvstripouterbraces{2}\skvvs@show
\ifx\skvvs@show\@empty\else\skvafterfi
@@ -345,8 +360,7 @@
\skvrobustdef*\skvviewkeys{\skvsetkeys[SKVV]{skvvshow}}
\skvnewlet\skvshowkeys\skvviewkeys
-\skvv@restorecodes
-
+\skv@view@restorecodes
\endinput
%% End of file 'skeyval-view.sty'.
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,