summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/skeyval
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2013-05-16 22:30:01 +0000
committerKarl Berry <karl@freefriends.org>2013-05-16 22:30:01 +0000
commit318d628c7989d4f9ede20b1ee66471bedf447437 (patch)
treee552e9f9b6195d98f3d579088419fdce722df49c /Master/texmf-dist/tex/latex/skeyval
parentf297f05f92068bd7f54e8ee25ce7b8b8a83c2353 (diff)
skeyval (16may13)
git-svn-id: svn://tug.org/texlive/trunk@30509 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/skeyval')
-rw-r--r--Master/texmf-dist/tex/latex/skeyval/skeyval-bc.sty1
-rw-r--r--Master/texmf-dist/tex/latex/skeyval/skeyval-core.tex544
-rw-r--r--Master/texmf-dist/tex/latex/skeyval/skeyval-for.tex1061
-rw-r--r--Master/texmf-dist/tex/latex/skeyval/skeyval-ltxcmds.tex9
-rw-r--r--Master/texmf-dist/tex/latex/skeyval/skeyval-ltxpatch.sty11
-rw-r--r--Master/texmf-dist/tex/latex/skeyval/skeyval-pstkey.sty9
-rw-r--r--Master/texmf-dist/tex/latex/skeyval/skeyval-pstkey.tex29
-rw-r--r--Master/texmf-dist/tex/latex/skeyval/skeyval-testclass.cls321
-rw-r--r--Master/texmf-dist/tex/latex/skeyval/skeyval-testpkg.sty456
-rw-r--r--Master/texmf-dist/tex/latex/skeyval/skeyval-view.sty202
-rw-r--r--Master/texmf-dist/tex/latex/skeyval/skeyval.sty22
11 files changed, 1827 insertions, 838 deletions
diff --git a/Master/texmf-dist/tex/latex/skeyval/skeyval-bc.sty b/Master/texmf-dist/tex/latex/skeyval/skeyval-bc.sty
index 0e468a36db6..6d90b9958e8 100644
--- a/Master/texmf-dist/tex/latex/skeyval/skeyval-bc.sty
+++ b/Master/texmf-dist/tex/latex/skeyval/skeyval-bc.sty
@@ -2,7 +2,6 @@
% This is file 'skeyval-bc.sty', version 0.73 of skeyval package, %
% 2011/01/01. %
% 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 %
diff --git a/Master/texmf-dist/tex/latex/skeyval/skeyval-core.tex b/Master/texmf-dist/tex/latex/skeyval/skeyval-core.tex
index 709b36b5496..9c517aa289a 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.2, 2013/02/10. %
+% This is file 'skeyval-core.tex', version 1.3, 2013/05/15. %
% %
% This package and accompanying files may be distributed and/or %
% modified under the conditions of the LaTeX Project Public License, %
@@ -18,10 +18,11 @@
% The following files constitute the skeyval bundle and must be %
% distributed as a whole: %
% %
-% readme, skeyval.sty, skeyval-core.tex, skeyval-for.tex, %
+% README, skeyval.sty, skeyval-core.tex, skeyval-for.tex, %
% skeyval-view.sty, skeyval-ltxpatch.sty, skeyval-ltxcmds.tex, %
% skeyval-pstkey.sty, skeyval-pstkey.tex, skeyval-testclass.cls, %
-% and skeyval-testpkg.sty. %
+% skeyval-testpkg.sty, skeyval-pokayoke1, skeyval-pokayoke2, %
+% skeyval-view-pokayoke1. %
% %
% Copyright (c) 2010-2013 Ahmed Musa (amusa22@gmail.com). %
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
@@ -87,13 +88,13 @@
\newif\ifskv@tempst
\ifx\ProvidesFile\@undefined
\skv@latexfalse
- \message{File 'skeyval-core.tex' 2013/02/10 v1.2:
+ \message{File 'skeyval-core.tex' 2013/05/15 v1.3:
Core of 'skeyval' key-value parser (AM)}
\input skeyval-ltxcmds
\else
\skv@latextrue
\ProvidesFile{skeyval-core.tex}
- [2013/02/10 v1.2 Base file of skeyval package (AM)]
+ [2013/05/15 v1.3 Base file of skeyval package (AM)]
\@addtofilelist{skeyval-core.tex}
\long\def\@nodocument#1{%
\@latex@error{'#1' appeared\on@line\space without
@@ -207,13 +208,14 @@
}%
}
\let\skvnewregisters\skvnewregister
-\skvnewregisters\toks{\skv@toksa,\skv@toksb}
+\skvnewregisters\toks{\skv@temptoks,\skv@toksa}
% Sometimes we change \bgroup temporarily to avoid \futurelet confusing
% it with explicit \bgroup character. The change does confuse \skvifnextchar
% if we used \bgroup in \skvifnextchar. Hence let us use \skv@orig@bgroup
% in \skvifnextchar:
\let\skv@orig@bgroup\bgroup
+\let\skv@orig@egroup\egroup
\def\reserved@a#1{%
\def\skvifnextisouter{%
@@ -264,7 +266,7 @@
}{%
% Test for \egroup, so that, eg, {\loggingall\LoadClass{article}}
% doesn't fail because of the closing brace:
- \skvsimpleifnextchar\egroup{%
+ \skvsimpleifnextchar\skv@orig@egroup{%
\skvsimpleifnextchar{#1}{#2}{#3}%
}{%
\skvifnextisouter{%
@@ -430,6 +432,9 @@
\skvnewdef\skvafterelseii#1\else#2\fi{\fi#2}
\skvnewdef*\skv@simplearg{##1}
\skvnewlet\skvsanitizemacro\@onelevel@sanitize
+% \skvaddtotoks{<token register>}{<token to add>}
+\skvrobustdef*\skvaddtotoks#1#2{#1\expandafter{\the#1#2}}
+\skvrobustdef*\skvoaddtotoks#1#2{#1\expandafter{\the\expandafter#1#2}}
\skvrobustdef*\skv@usetempst#1#2{%
\edef#2{\skvifdefboolTF{skv@tempst}\skvexpandonce\unexpanded{#1}}%
}
@@ -668,14 +673,27 @@
\skv@err{Invalid boolean value '#1'; expected 'true' or 'false'}\skv@ehd
}
+% Switches have values of either 00 or 01.
+
+% \skvifknobTF, unlike \skvifswitchTF, is for use with plain switches,
+% ie, switches that have no separate namespace.
+\skvnewdef*\skvifknobTF#1{%
+ \if\@nameuse{#1}\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
+}
+\skvnewdef*\skvifknobFT#1{%
+ \if\@nameuse{#1}\expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi
+}
% Switches and toggles have separate namespaces.
-\skvrobustdef*\skvnewswitch#1{%
- \skvifcsdefTF{skv@switch@#1}{%
- \skv@err{Switch '\detokenize{#1}' already exists}\skv@ehd
- }{%
- \skvcsdef{skv@switch@#1}{01}%
+\skvrobustdef*\skvnewswitches#1{%
+ \skvcommaloop{#1}\skv@prova{%
+ \skvifcsdefTF{skv@switch@\skv@prova}{%
+ \skv@err{Switch '\skvoxdetok\skv@prova' already exists}\skv@ehd
+ }{%
+ \skvcsdef{skv@switch@\skv@prova}{01}%
+ }%
}%
}
+\skvnewlet\skvnewswitch\skvnewswitches
\skvnewdef*\skvifswitchTF#1{%
\if
\skvifcsdefTF{skv@switch@#1}{%
@@ -704,13 +722,19 @@
}%
}
\skvrobustdef*\skvnewtog#1{%
- \skvifcsdefTF{skv@toggle@#1}{%
- \skv@err{Switch '\detokenize{#1}' already exists}\skv@ehd
- }{%
- \skvcslet{skv@toggle@#1}\@secondoftwo
+ \skvcommaloop{#1}\skv@prova{%
+ \skvifcsdefTF{skv@toggle@\skv@prova}{%
+ \skv@err{Switch '\skvoxdetok\skv@prova' already exists}\skv@ehd
+ }{%
+ \skvcslet{skv@toggle@\skv@prova}\@secondoftwo
+ }%
+ }%
+}
+\skvrobustdef*\skvdeftog#1{%
+ \skvcommaloop{#1}\skv@prova{%
+ \skvcslet{skv@toggle@\skv@prova}\@secondoftwo
}%
}
-\skvrobustdef*\skvdeftog#1{\skvcslet{skv@toggle@#1}\@secondoftwo}
\skvnewdef*\skviftogTF#1{%
\skvifcsdefTF{skv@toggle@#1}{%
\csname skv@toggle@#1\endcsname
@@ -734,14 +758,7 @@
\skv@err{No toggle '\detokenize{#1}'}\skv@ehd
}%
}
-
-% 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
-}
+% Allow 'f' to stop the search for number:
\skvnewdef\skvifcondTF#1\fi{%
\csname @#1first\else second\fi oftwo\endcsname
}
@@ -1239,7 +1256,39 @@
}%
}
\skvrobustdef*\skvifmacroFT#1{\skvifmacroTF{#1}\@secondoftwo\@firstoftwo}
-
+% Note: If there're more than 1 alpha/Alpha character, both \skvifloweralpha
+% and \skvifupperalpha will return false. Hence double (or more) aphabetic
+% characters can't be auto-completed by \skvautocompletelist.
+\skvnewdef*\skvifloweralpha#1{%
+ \skvifblankTF{#1}{%
+ \@secondoftwo
+ }{%
+ \skvifntypeTF{#1}{%
+ \skvifnumTF`#1>96{%
+ \skvifnumTF`#1<123{\@firstoftwo}{\@secondoftwo}%
+ }{%
+ \@secondoftwo
+ }%
+ }{%
+ \@secondoftwo
+ }%
+ }%
+}
+\skvnewdef*\skvifupperalpha#1{%
+ \skvifblankTF{#1}{%
+ \@secondoftwo
+ }{%
+ \skvifntypeTF{#1}{%
+ \skvifnumTF`#1>64{%
+ \skvifnumTF`#1<91{\@firstoftwo}{\@secondoftwo}%
+ }{%
+ \@secondoftwo
+ }%
+ }{%
+ \@secondoftwo
+ }%
+ }%
+}
% If there is a digit present in #1:
\skvnewdef*\skvifdigitpresentTF#1{%
\skvifcondTF\if0\skvifblankTF{#1}{1}{\skv@ifdigitpresent#1\skv@nnil}\fi
@@ -1383,26 +1432,6 @@
\fi
}
-% Test if a token #1 can be assigned to a \dimendef'd register. We assume
-% that #1 isn't a complicated expression and isn't padded with trailing
-% \relax's. A complicated expression will be something like
-%
-% 2pt+3ex-(3pt/4+1.45cc*3)
-%
-% which is much harder to parse and decide on.
-%
-% Examples:
-%
-% \skvifdimensionable{01}{\def\x{T}}{\def\x{F}}
-% \skvifdimensionable{01pt}{\def\x{T}}{\def\x{F}}
-% \skvifdimensionable{01abpt}{\def\x{T}}{\def\x{F}}
-% \skvifdimensionable\paperwidth{\def\x{T}}{\def\x{F}}
-% \skvifdimensionable{\skip0}{\def\x{T}}{\def\x{F}}
-% \skvifdimensionable{1.2pt}{\def\x{T}}{\def\x{F}}
-% \skvifdimensionable{1.2\relax pt}{\def\x{T}}{\def\x{F}}
-% \skvifdimensionable{1pt\relax\skvrelax}{\def\x{T}}{\def\x{F}}
-%
-
\skvnewregister\bool{\ifskv@isinteger}
% In case the argument of \skvifintegerTF containes \numexpr:
@@ -1435,6 +1464,26 @@
}%
}
\skvrobustdef\skvoifinteger{\skvexpbracenext\skvifintegerTF}
+
+% Test if a token #1 can be assigned to a \dimendef'd register. We assume
+% that #1 isn't a complicated expression and isn't padded with trailing
+% \relax's. A complicated expression will be something like
+%
+% 2pt+3ex-(3pt/4+1.45cc*3)
+%
+% which is much harder to parse and decide on.
+%
+% Examples:
+%
+% \skvifdimensionable{01}{\def\x{T}}{\def\x{F}}
+% \skvifdimensionable{01pt}{\def\x{T}}{\def\x{F}}
+% \skvifdimensionable{01abpt}{\def\x{T}}{\def\x{F}}
+% \skvifdimensionable\paperwidth{\def\x{T}}{\def\x{F}}
+% \skvifdimensionable{\skip0}{\def\x{T}}{\def\x{F}}
+% \skvifdimensionable{1.2pt}{\def\x{T}}{\def\x{F}}
+% \skvifdimensionable{1.2\relax pt}{\def\x{T}}{\def\x{F}}
+% \skvifdimensionable{1pt\relax\skvrelax}{\def\x{T}}{\def\x{F}}
+%
\skvrobustdef\skvifdimensionable#1{%
\def\skv@dimunit{}%
% Does 'pt' mean 0pt or 1pt? Make it an invalid input:
@@ -1609,11 +1658,11 @@
% The following \relax will not be cat-12, so it won't appear in #2:
\def\skv@trim@a{%
\skvxifinTF{\detokenize{#1}\relax}{\skvoxdetok{#2}\relax}{%
- \def\skv@trim@b####1#1\normal@nil{%
+ \def\skv@trim@b####1#1\skv@normal@nil{%
\edef#2{\unexpanded{####1}}%
\skv@trim@a
}%
- \expandafter\skv@trim@b#2\normal@nil
+ \expandafter\skv@trim@b#2\skv@normal@nil
}{}%
}%
\skv@trim@a
@@ -1633,13 +1682,13 @@
% \edef\x{\skvtsvnormalize{ x y {z}}}
\skvnewdef*\skvtsvnormalize#1{%
\unexpanded\expandafter
- {\romannumeral-`\q\skv@tsvnormalize.#1 \normal@nil}%
+ {\romannumeral-`\q\skv@tsvnormalize.#1 \skv@normal@nil}%
}
-\skvnewdef*\skv@tsvnormalize#1 #2\normal@nil{%
+\skvnewdef*\skv@tsvnormalize#1 #2\skv@normal@nil{%
\skvifblankTF{#2}
{\expandafter\expandafter\expandafter\space
\expandafter\noexpand\@gobble#1}
- {\skv@tsvnormalize#1#2\normal@nil}%
+ {\skv@tsvnormalize#1#2\skv@normal@nil}%
}
@@ -1654,7 +1703,7 @@
}%
\skv@prova csv\skvcsvnormalize kv\skvkvnormalize#1\skv@nnil\skv@nil
}
-\skvnewswitch{inkv}
+\skvnewdef*\skv@switch@inkv{01}
% \skvcsvnormalize[<parser>]<listcmd>
\skvrobustdef*\skvcsvnormalize{\skv@testopt\skv@csvnormalize,}
\skvrobustdef*\skv@csvnormalize[#1]#2{%
@@ -1691,12 +1740,12 @@
% a trailing space or <parser> in #1. We remove the trailing space
% with \skvtrimspace.
\edef#1{\expandafter\skv@normalizelist\expandafter{#1\skv@kvguard}}%
- \def\skv@kvnorm##1\skv@kvguard##2\normal@nil{%
- \skv@parserequalerr##1##2,=\normal@nil
+ \def\skv@kvnorm##1\skv@kvguard##2\skv@normal@nil{%
+ \skv@parserequalerr##1##2,=\skv@normal@nil
\edef#1{\skvtrimspace{##1##2}}%
\skvtrimlastparser{,}#1%
}%
- \expandafter\skv@kvnorm#1\normal@nil
+ \expandafter\skv@kvnorm#1\skv@normal@nil
\skvaftergroupdef#1\endgroup
}
@@ -1708,85 +1757,85 @@
\lowercase{\endgroup
\def\skv@normalizelist##1{%
\unexpanded\expandafter{\romannumeral-`\q
- \skv@activeparser#1##1#1~\normal@nil}%
+ \skv@activeparser#1##1#1~\skv@normal@nil}%
}%
- \def\skv@activeparser##1~##2\normal@nil{%
+ \def\skv@activeparser##1~##2\skv@normal@nil{%
\skvifblankTF{##2}{%
\skvifdefswitchTF{inkv}{%
- \skv@activeequal##1!\normal@nil
+ \skv@activeequal##1!\skv@normal@nil
}{%
- \skv@spaceparser##1 #1\normal@nil
+ \skv@spaceparser##1 #1\skv@normal@nil
}%
}{%
- \skv@activeparser##1#1##2\normal@nil
+ \skv@activeparser##1#1##2\skv@normal@nil
}%
}%
- \def\skv@activeequal##1!##2\normal@nil{%
+ \def\skv@activeequal##1!##2\skv@normal@nil{%
\skvifblankTF{##2}{%
- \skv@spaceparser##1 #1\normal@nil
+ \skv@spaceparser##1 #1\skv@normal@nil
}{%
- \skv@activeequal##1=##2\normal@nil
+ \skv@activeequal##1=##2\skv@normal@nil
}%
}%
}%
- \def\skv@spaceparser##1 #1##2\normal@nil{%
+ \def\skv@spaceparser##1 #1##2\skv@normal@nil{%
\skvifblankTF{##2}{%
- \skv@parserspace##1#1 \normal@nil
+ \skv@parserspace##1#1 \skv@normal@nil
}{%
- \skv@spaceparser##1#1##2\normal@nil
+ \skv@spaceparser##1#1##2\skv@normal@nil
}%
}%
- \def\skv@parserspace##1#1 ##2\normal@nil{%
+ \def\skv@parserspace##1#1 ##2\skv@normal@nil{%
\skvifblankTF{##2}{%
\skvifdefswitchTF{inkv}{%
- \skv@spaceequal##1 =\normal@nil
+ \skv@spaceequal##1 =\skv@normal@nil
}{%
- \skv@doubleparser##1#1#1\normal@nil
+ \skv@doubleparser##1#1#1\skv@normal@nil
}%
}{%
- \skv@parserspace##1#1##2\normal@nil
+ \skv@parserspace##1#1##2\skv@normal@nil
}%
}%
- \def\skv@spaceequal##1 =##2\normal@nil{%
+ \def\skv@spaceequal##1 =##2\skv@normal@nil{%
\skvifblankTF{##2}{%
- \skv@equalspace##1= \normal@nil
+ \skv@equalspace##1= \skv@normal@nil
}{%
- \skv@spaceequal##1=##2\normal@nil
+ \skv@spaceequal##1=##2\skv@normal@nil
}%
}%
- \def\skv@equalspace##1= ##2\normal@nil{%
+ \def\skv@equalspace##1= ##2\skv@normal@nil{%
\skvifblankTF{##2}{%
- \skv@doubleparser##1#1#1\normal@nil
+ \skv@doubleparser##1#1#1\skv@normal@nil
}{%
- \skv@equalspace##1=##2\normal@nil
+ \skv@equalspace##1=##2\skv@normal@nil
}%
}%
- \def\skv@doubleparser##1#1#1##2\normal@nil{%
+ \def\skv@doubleparser##1#1#1##2\skv@normal@nil{%
\skvifblankTF{##2}{%
\skvifdefswitchTF{inkv}{%
- \skv@doubleequal##1==\normal@nil
+ \skv@doubleequal##1==\skv@normal@nil
}{%
\skvifblankTF{##1}{}{%
- \skv@remleadparser##1\normal@nil
+ \skv@remleadparser##1\skv@normal@nil
}%
}%
}{%
- \skv@doubleparser##1#1##2\normal@nil
+ \skv@doubleparser##1#1##2\skv@normal@nil
}%
}%
- \def\skv@doubleequal##1==##2\normal@nil{%
+ \def\skv@doubleequal##1==##2\skv@normal@nil{%
\skvifblankTF{##2}{%
\skvifblankTF{##1}{}{%
- \skv@remleadparser##1\normal@nil
+ \skv@remleadparser##1\skv@normal@nil
}%
}{%
- \skv@doubleequal##1=##2\normal@nil
+ \skv@doubleequal##1=##2\skv@normal@nil
}%
}%
- \def\skv@remleadparser#1##1\normal@nil{%
+ \def\skv@remleadparser#1##1\skv@normal@nil{%
\expandafter\space\noexpand##1%
}%
- \def\skv@parserequalerr##1#1=##2\normal@nil{%
+ \def\skv@parserequalerr##1#1=##2\skv@normal@nil{%
\skvifblankTF{##2}{}{%
\skv@err{There is '#1=' in your key-value list}\skv@ehd
}%
@@ -1794,33 +1843,39 @@
}
\endgroup
-% Special slash normalizer, which doesn't replace double slashes with
-% single slash, because a double slash might mean an intentionally
+% Define a special parser normalizer that doesn't replace double parsers
+% with single parser, because a double parser might mean an intentionally
% missing token/property of a key:
\begingroup
-\catcode`\~=13 \uccode`\~=`\/
-\uppercase{\endgroup
- \skvnewdef\skvkeepdoubleslashnormalize#1{%
- \unexpanded\expandafter{\romannumeral-`\q
- \skv@activeslash#1~\normal@nil}%
+\catcode`\~=13
+\skvrobustgdef*\skvdefinekeepdoubleparsernormalizer#1#2{%
+ \begingroup
+ \uccode`\~=`#1
+ \uppercase{\endgroup
+ \long\def#2##1{%
+ \unexpanded\expandafter{\romannumeral-`\q
+ \skv@keepdouble@activeparser##1~\skv@normal@nil}%
+ }%
+ \long\def\skv@keepdouble@activeparser##1~##2\skv@normal@nil{%
+ \skvifblankTF{##2}
+ {\skv@keepdouble@spaceparser##1 #1\skv@normal@nil}
+ {\skv@keepdouble@activeparser##1#1##2\skv@normal@nil}%
+ }%
}%
- \skvnewdef\skv@activeslash#1~#2\normal@nil{%
- \skvifblankTF{#2}
- {\skv@spaceslash#1 /\normal@nil}
- {\skv@activeslash#1/#2\normal@nil}%
+ \long\def\skv@keepdouble@spaceparser##1 #1##2\skv@normal@nil{%
+ \skvifblankTF{##2}
+ {\skv@keepdouble@parserspace##1#1 \skv@normal@nil}
+ {\skv@keepdouble@spaceparser##1#1##2\skv@normal@nil}%
+ }%
+ \long\def\skv@keepdouble@parserspace##1#1 ##2\skv@normal@nil{%
+ \skvifblankTF{##2}
+ {\skvifblankTF{##1}{}{\expandafter\space\noexpand##1}}
+ {\skv@keepdouble@parserspace##1#1##2\skv@normal@nil}%
}%
}
-\skvnewdef\skv@spaceslash#1 /#2\normal@nil{%
- \skvifblankTF{#2}
- {\skv@slashspace#1/ \normal@nil}
- {\skv@spaceslash#1/#2\normal@nil}%
-}
-\skvnewdef\skv@slashspace#1/ #2\normal@nil{%
- \skvifblankTF{#2}
- {\skvifblankTF{#1}{}{\expandafter\space\noexpand#1}}
- {\skv@slashspace#1/#2\normal@nil}%
-}
+\endgroup
+\skvdefinekeepdoubleparsernormalizer{/}\skvkeepdoubleslashnormalize
% \skvmacnormalize[<parser>]<listcmd>
\skvrobustdef*\skvmacnormalize{\skv@testopt\skv@macnormalize,}
@@ -1833,27 +1888,30 @@
% This is for normalizing lists like {x\\ y\\\\ z}, where \\ is
% a control sequence. Such parsers may be commands but we don't
% expect them to be active characters.
+%
% Example:
+%
% \skvsetupmacroparsernormalizer{\\}
% \edef\x{\skvmacroparsernormalize{x\\ y\\\\ z}}
+%
\skvrobustdef*\skvsetupmacroparsernormalizer#1{%
\long\def\skvmacroparsernormalize##1{%
\unexpanded\expandafter{\romannumeral-`\q
- \skv@mac@spaceparser##1 #1\normal@nil}%
+ \skv@mac@spaceparser##1 #1\skv@normal@nil}%
}%
- \long\def\skv@mac@spaceparser##1 #1##2\normal@nil{%
+ \long\def\skv@mac@spaceparser##1 #1##2\skv@normal@nil{%
\skvifblankTF{##2}
- {\skv@mac@parserspace##1#1 \normal@nil}
- {\skv@mac@spaceparser##1#1##2\normal@nil}%
+ {\skv@mac@parserspace##1#1 \skv@normal@nil}
+ {\skv@mac@spaceparser##1#1##2\skv@normal@nil}%
}%
- \long\def\skv@mac@parserspace##1#1 ##2\normal@nil{%
+ \long\def\skv@mac@parserspace##1#1 ##2\skv@normal@nil{%
\skvifblankTF{##2}
- {\skv@mac@doubleparser##1#1#1\normal@nil}
- {\skv@mac@parserspace##1#1##2\normal@nil}%
+ {\skv@mac@doubleparser##1#1#1\skv@normal@nil}
+ {\skv@mac@parserspace##1#1##2\skv@normal@nil}%
}%
- \long\def\skv@mac@doubleparser##1#1#1##2\normal@nil{%
+ \long\def\skv@mac@doubleparser##1#1#1##2\skv@normal@nil{%
\skvifblankTF{##2}{ ##1}
- {\skv@mac@doubleparser##1#1##2\normal@nil}%
+ {\skv@mac@doubleparser##1#1##2\skv@normal@nil}%
}%
}
% \skvletmanytocmd{<cmd list>}{<cmd>}
@@ -2036,8 +2094,8 @@
%
\skvnewbools[skv@]{%
inclass,inset,viarootofsetkeys,processvalueaslist,st,cl,pl,kf,inpox,inopt,%
- inprepo,tracingkeys,swa,swb,verbose,intry,insa,success,inoptionsec,%
- inreservedhandler,ignorepointers%
+ inprepo,tracingkeys,tempsw,swa,verbose,intry,insa,success,inoptionsec,%
+ inreservedhandler,ignorepointers,addslots@appending%
}
\skvnewbools{indirectkeys}
@@ -2095,8 +2153,8 @@
% A fast key parsing scheme originally designed for \newforeach loop.
%
-% \quickkeys.define{<family>}[<hp>]{<list>}
-% \quickkeys.set{<family>}[<na>]{<kvlist>}
+% \skvquickkeys.define{<family>}[<hp>]{<list>}
+% \skvquickkeys.set{<family>}[<na>]{<kvlist>}
%
% 1. Quickly define and set command/store keys.
% 2. Pointers aren't used here, to speed up parsing. Use other key
@@ -2118,7 +2176,7 @@
% The default parser is semicolon (;).
%
% Example:
-% \quickkeys.define{fam}[mp@]{%
+% \skvquickkeys.define{fam}[mp@]{%
% keya/true/\def\x##1{#1*##1}/true,false;
% keyb;
% keyc,keyd/aaa+bbb/\def\x##1{#1*##1*#2}/.na/#1+#2;
@@ -2188,7 +2246,7 @@
}
\skvrobustdef*\skvsetquickkeysparser{\def\skv@qkeysparser}
\skvsetquickkeysparser{;}
-\skvrobustdef*\quickkeys#1#{%
+\skvrobustdef*\skvquickkeys#1#{%
\edef\skv@tempa{\skvtrimspace{#1}}%
\skvxifstrcmpTF{\skvexpandonce\skv@tempa}{.define}{%
\begingroup\endlinechar\m@ne
@@ -2200,7 +2258,7 @@
\skvxifstrcmpTF{\skvexpandonce\skv@tempa}{.preset}{%
\skv@presetquickkeys
}{%
- \skv@err{Unknown task for \string\quickkeys}\skv@ehd
+ \skv@err{Unknown task for \string\skvquickkeys}\skv@ehd
}%
}%
}%
@@ -2239,7 +2297,7 @@
}%
}
-% \quickkeys.preset{<family>}{<kvlist>}
+% \skvquickkeys.preset{<family>}{<kvlist>}
%
\skvrobustdef*\skv@presetquickkeys#1#2{%
\edef\skv@prova{\unexpanded{#2}}%
@@ -2249,7 +2307,7 @@
\skvnewnumbers[skv@]{setqkeysdepth}
-% \quickkeys.set{<family>}[<na>]{<kvlist>}
+% \skvquickkeys.set{<family>}[<na>]{<kvlist>}
\skvrobustdef*\skv@setquickkeys#1{\skv@testopt{\skv@setquickkeys@a{#1}}{}}
\skvrobustdef*\skv@setquickkeys@a#1[#2]#3{%
@@ -2280,8 +2338,8 @@
\skvletcs\skv@tempval{\skv@qkeysfam/##1/qkeys.val}%
\skvletcs\reserved@a{\skv@qkeysfam/##1/qkeys.chc}%
\skvifdefTF\reserved@a{%
- \skvxifinTF{,\detokenize{##2},}{,\skvoxdetok\reserved@a,}{}{%
- \skv@err{Value '\detokenize{##2}' for key '##1'
+ \skvxifinTF{,\skvoxdetok\skv@tempval,}{,\skvoxdetok\reserved@a,}{}{%
+ \skv@err{Value '\skvoxdetok\skv@tempval' for key '##1'
\MessageBreak is not in prescribed list
\MessageBreak '\skvoxdetok\reserved@a'}\skv@ehd
}%
@@ -2323,16 +2381,16 @@
}
\skvnewlet\skv@sav@setquickkeys@a\skv@setquickkeys@a
\skvrobustdef*\skv@bad@setquickkeys@a{%
- \skv@err{'\string\quickkeys.set' can't be nested in a preset
+ \skv@err{'\string\skvquickkeys.set' can't be nested in a preset
\MessageBreak key's callback: this will cause a cyclic call
- \MessageBreak to '\string\quickkeys.set'}\skv@ehd
+ \MessageBreak to '\string\skvquickkeys.set'}\skv@ehd
}
-% \skvinitializeqkeys{<fam>}[<na>]{<kvlist>}
-\skvrobustdef*\skvinitializeqkeys#1{%
- \skv@testopt{\skv@initializeqkeys@a{#1}}{}%
+% \skvinitializequickkeys{<fam>}[<na>]{<kvlist>}
+\skvrobustdef*\skvinitializequickkeys#1{%
+ \skv@testopt{\skv@initializequickkeys@a{#1}}{}%
}
-\skvrobustdef*\skv@initializeqkeys@a#1[#2]#3{%
+\skvrobustdef*\skv@initializequickkeys@a#1[#2]#3{%
\skvindeftrue
\skv@setquickkeys{#1}[#2]{#3}%
\skvindeffalse
@@ -2575,12 +2633,10 @@
\do\ifindirectkeys\do\ifskvdfk@initialize\do\ifskvdfk@saveinitialvalues
}\skv@stackdepthlimit
-\skvrobustdef\skvappto#1#2{%
- \edef#1{\skvexpandonce{#1}\unexpanded{#2}}%
-}
-\skvrobustdef\skvgappto#1#2{%
- \xdef#1{\skvexpandonce{#1}\unexpanded{#2}}%
-}
+\skvrobustdef\skvappto#1#2{\edef#1{\skvexpandonce{#1}\unexpanded{#2}}}
+\skvrobustdef\skvxappto#1#2{\edef#1{\skvexpandonce{#1}#2}}
+\skvrobustdef\skvgappto#1#2{\xdef#1{\skvexpandonce{#1}\unexpanded{#2}}}
+\skvrobustdef\skvxgappto#1#2{\xdef#1{\skvexpandonce{#1}#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}}}
@@ -3223,7 +3279,7 @@
% Assign arguments to keys:
%
-% \skvassignargs[<prefixes>]{<families>}[<expansion.type>]{<keys>}{<arg>}
+% \skvassignargs[<prefixes>]{<families>}{<keys>}{.<expansion type>{<arg>}}
%
% 1. Valid expansion types are .expand once, .expand twice, .expanded.
% 2. At set keys (not at define keys), the argument to the listed keys will
@@ -3236,40 +3292,52 @@
%
% Example:
%
-% \skvassignargs[KV1,KV2]{fam1,fam2}[.expand once]{keya,keyb}{#1/#2}
+% \skvassignargs[KV1,KV2]{fam1,fam2}{keya,keyb}{.expanded{#1/#2}}
%
% The keys could then be set as
%
-% \skvsetkeys[KV1]{fam2}{keya=vala/valb}
+% \skvsetkeys[KV1]{fam2}{keya=\vala/\valb}
%
% For each prefix and family, this will define parameterless functions
%
-% \<prefix>/<family>/<key>.@x1arg.
+% \<prefix>/<family>/<key>.@xxarg.
%
% which will be used at setkeys to define and execute the key's callback.
%
\skvrobustdef*\skvassignargs{\skv@testopt\skv@assignargs\skvdefaultprefix}
-\skvrobustdef*\skv@assignargs[#1]#2{%
+\skvrobustdef*\skv@assignargs[#1]#2#3#4{%
\begingroup
- \skv@testopt{\skv@assignargs@a{#1}{#2}}{^skv^}%
-}
-\skvrobustdef*\skv@assignargs@a#1#2[#3]#4#5{%
- \edef\skv@tempb{\skvtrimspace{#5}}%
- \def\skv@tempc{}%
- \skvifstrcmpTF{#3}{^skv^}{%
- \def\skvexpander{x0}%
- }{%
- \skv@getexpander@a{#3}\skvexpander
+ \let\skv@temparg\skv@simplearg
+ \def\skv@expandertype{x0}%
+ \edef\skv@tempa{\skvtrimspace{#4}}%
+ \def\do##1##2{%
+ \ifx\do##1\else
+ \skvxifinTF{\detokenize{##1}}{\skvoxdetok\skv@tempa}{%
+ \def\skv@prova####1##1####2####3\skv@arg@nil{%
+ \edef\skv@temparg{\unexpanded{####2}}%
+ \def\skv@expandertype{##2}%
+ }%
+ \expandafter\skv@prova\skv@tempa\skv@arg@nil
+ \def\do####1\do\do{}%
+ }{}%
+ \expandafter\do
+ \fi
}%
+ \do{.unexpanded}{x0}{.expand once}{x1}{.expand twice}{x2}%
+ {.expanded}{xx}{.expand}{xx}\do\do
+ \def\skv@tempc{}%
+ % Loop over prefixes:
\skvcommaparse{#1}\skv@tempa{%
\skv@makeprefix\skv@tempa
+ % Loop over families:
\skvcommaparse{#2}\skv@tempa{%
\skv@makeheader\skv@tempa
- \skvcommaparse{#4}\skv@tempa{%
+ % Loop over keys:
+ \skvcommaparse{#3}\skv@tempa{%
\edef\skv@tempc{%
\skvexpandonce\skv@tempc
- \skvcsedef{\skv@header\skv@tempa.@\skvexpander arg}{%
- \noexpand\unexpanded{\skvexpandonce\skv@tempb}%
+ \skvcsedef{\skv@header\skv@tempa.@\skv@expandertype arg}{%
+ \noexpand\unexpanded{\skvexpandonce\skv@temparg}%
}%
}%
}%
@@ -3277,37 +3345,15 @@
}%
\expandafter\endgroup\skv@tempc
}
-
-% \skv@getexpander@a{<expander.type>}{<return.cmd>}
-%
-% 1. <return.cmd> will contain one of 'x0', 'x1', 'x2', 'xx', which will be
-% saved in a key-dependent macro that represents the key's argument.
-%
-\skvrobustdef*\skv@getexpander@a#1#2{%
- \begingroup
- \edef\skv@prova{\skvotrimspace{#1}}%
- \def\skv@provb##1{%
- \def\skv@provb####1##1####2####3\skv@nil{%
- \endgroup
- \def#2{####2}%
- \ifx#2\@nnil
- \skv@err{Unknown expansion type '\detokenize{##1}'}\skv@ehd
- \fi
- }%
- \skv@provb .expand once{x1},.expand twice{x2},.expanded{xx},%
- .expand{xx},##1{\@nil}\skv@nil
- }%
- \expandafter\skv@provb\expandafter{\skv@prova}%
-}
-% \skv@getexpander@b{<expander.type>}
+% \skv@getexpander{<expander.type>}
%
% 1. <expander.type> is one of 'x0', 'x1', 'x2', 'xx', which had been
% saved in a key-dependent macro.
%
-% 2. \skv@getexpander@b returns macro \skvexpander, which will
+% 2. \skv@getexpander returns macro \skvexpander, which will
% contain one of \unexpanded, \skvexpandonce, \skvexpandtwice, \@iden.
%
-\skvrobustdef*\skv@getexpander@b#1{%
+\skvrobustdef*\skv@getexpander#1{%
\begingroup
\edef\skv@prova{\skvtrimspace{#1}}%
\def\skv@provb##1{%
@@ -3670,13 +3716,13 @@
%
% The skeyval package allows holder-macro prefixes {<mp>} for choice keys.
%
-% \skvchoicekey[<pref>]{<fam>}[<mp>]{<key>}[<bins>]{<choices>}
+% \skvchoicekey[<pref>]{<fam>}[<mp>]{<keys>}[<bins>]{<choices>}
% [<default>]{<callback>}
-% \skvchoicekey+[<pref>]{<fam>}[<mp>]{<key>}[<bins>]{<choices>}
+% \skvchoicekey+[<pref>]{<fam>}[<mp>]{<keys>}[<bins>]{<choices>}
% [<default>]{<callback>}{<fallback>}
-% \skvchoicekey*[<pref>]{<fam>}[<mp>]{<key>}[<bins>]{<choices>}
+% \skvchoicekey*[<pref>]{<fam>}[<mp>]{<keys>}[<bins>]{<choices>}
% [<default>]{<callback>}
-% \skvchoicekey*+[<pref>]{<fam>}[<mp>]{<key>}[<bins>]{<choices>}
+% \skvchoicekey*+[<pref>]{<fam>}[<mp>]{<keys>}[<bins>]{<choices>}
% [<default>]{<callback>}{<fallback>}
%
% \skvchoicekeys[KV]{fam}[mp@]{key1,key2}[\val\nr]{%
@@ -3715,7 +3761,7 @@
\skvcmdexit\skv@altlista\skvcmdexit\skv@altlistb
}%
}
-% \skv@executechoice{00.or.01}{<currentvalue>}{<altlist>}
+% \skv@executechoice{00 or 01}{<currentvalue>}{<altlist>}
\skvrobustdef*\skv@executechoice#1#2#3{%
\begingroup
\if#1\lowercase{\fi
@@ -3786,7 +3832,7 @@
\skvrobustdef*\skv@choicekey@c[#1]{%
\edef\skv@default{\skvtrimspace{#1}}%
% Choice can't have braced values, since that will make matching
- % to state pattern difficult:
+ % to the state pattern difficult or impossible:
\skvstripouterbraces{2}\skv@default
\skvifdefboolTF{skv@pl}\skv@choicekey@e\skv@choicekey@d
}
@@ -3816,7 +3862,7 @@
\ifx\skv@bins\@empty\else[\skvxonce\skv@bins]\fi
{##1}{\skvxonce\skv@altlista}##2%
}%
- \skv@toksa\expandafter{\skv@prova{##1}{#1}}%
+ \skv@temptoks\expandafter{\skv@prova{##1}{#1}}%
% Why separate \skv@choicekey@g? It is needed by skeyval-view.sty:
\skv@choicekey@g
}
@@ -3831,7 +3877,7 @@
\fi
\skvcsedef{\skv@header\skvcurrentkey.@cbk}{%
\skvcslet{\skv@hp\skvcurrentkey}\noexpand\skvcurrentvalue
- \the\skv@toksa
+ \the\skv@temptoks
}%
}%
}
@@ -3875,7 +3921,7 @@
% \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}}%
- \skvifplaswTF\skv@typetogkey{%
+ \skvifknobTF{skv@typetogkey}{%
\expandafter\skv@tempa\expandafter{\expandafter{\expandafter
\skv@togkey@settog\expandafter{\skv@zapsw}{#2}\skv@value#4}}%
}{%
@@ -3887,7 +3933,7 @@
% \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}}%
- \skvifplaswTF\skv@typetogkey{%
+ \skvifknobTF{skv@typetogkey}{%
\expandafter\skv@tempa\expandafter{\expandafter{\expandafter
\skv@togkey@settog\expandafter{\skv@zapsw}{#2}\skv@value#4}{#5}}%
}{%
@@ -3909,8 +3955,8 @@
\ifskv@pl\noexpand\skv@pltrue\else\noexpand\skv@plfalse\fi
\skv@checkchoice[\noexpand\skv@value]{##1}{true,false}##2%
}%
- \skv@toksa\expandafter{\skv@tempa{##1}{#4}}%
- \skvcsedef{\skv@header#1.@cbk}{\the\skv@toksa}%
+ \skv@temptoks\expandafter{\skv@tempa{##1}{#4}}%
+ \skvcsedef{\skv@header#1.@cbk}{\the\skv@temptoks}%
}
%
% \skvboolkeys[<pref>]{<fam>}[<mp>]{<keys>}[<defa>]{<callback>}
@@ -4168,14 +4214,20 @@
% \skvprependslots[<pref>]{<fam>}{<signal.keys>}{<slots>}
% [<signal default>]{<signal callback>}
%
+% Example:
+%
+% \skvordkeys[KV]{fam}{keya,keyb}{\def\x##1{#1*##1}}
+% \skvappendslots[KV]{fam}{keyd,keye}{keya=.expanded{\vala},keyb=valb}
+% [def-d&e]{\def\y##1{#1*##1}}
+%
% 1. <slots> must pre-exist. If slot key is undefined, then the signal-slot
% system isn't useful here since the slot will serve no purpose.
%
% 2. If desired, use pointers/handlers .expanded, .expand once, .expand twice
% on values of <slots>.
%
-% 3. Here, it helps to consider <keys> as parents (or signals or
-% subjects) and <slots> as children (or slots or observers).
+% 3. Here, it helps to consider <signal.keys> as parents (or signals/
+% subjects/observables) and <slots> as children (or slots/observers).
%
% 4. <signal.keys> can't be preset, to avoid cyclic setting of keys.
% Consider the following, for a signal key in the preset list:
@@ -4186,12 +4238,20 @@
% In the attempt to set a slot key, the preset list (that includes
% the signal key) will be instantiated.
%
-% Example:
-%
-% \skvordkeys[KV]{fam}{keya,keyb}{\def\x##1{#1*##1}}
-% \skvappendslots[KV]{fam}{keyd,keye}{keya=.expanded{\vala},keyb=valb}
-% [def-d&e]{\def\y##1{#1*##1}}
-%
+\AtEndOfPackage{%
+ \skvnewcastcommands{%
+ \skvslotkeys=\skvappendslots,\skvstylekeys=\skvappendslots,
+ \skvprependstyles=\skvprependslots,
+ \skvappendstylesexpanded=\skvappendslotsexpanded,
+ \skvprependstylesexpanded=\skvprependslotsexpanded,
+ \skvaddstyles=\skvaddslots,
+ \skvobserverkeys=\skvappendslots,
+ \skvprependobservers=\skvprependslots,
+ \skvappendobserversexpanded=\skvappendslotsexpanded,
+ \skvprependobserversexpanded=\skvprependslotsexpanded,
+ \skvaddobservers=\skvaddslots
+ }%
+}
\skvrobustdef*\skvappendslots{%
\def\skv@type{app}%
\let\skvexpanderpointer\@iden
@@ -4261,10 +4321,10 @@
{\skvcurrentfamily}{\skvexpandonce\skv@slotlist}%
}%
}%
- % The signal key might already exists, especially when calling
+ % The signal key might already exists, especially when using
% \skvaddslots:
\edef\elt{%
- \skvifcsdefTF{\skv@header#1.@cbk}
+ \skvifcsdefTF{\skv@header#1.@cbk}%
{\skvexpandcsonce{\skv@header#1.@cbk}}{}%
}%
\skvcsedef{\skv@header#1.@cbk}{%
@@ -4283,6 +4343,7 @@
% (ie, subject) keys.
%
% Examples:
+%
% \skvordkeys[KV]{fam}{keya1,keyb1,keya2,keyb2}{\def\x##1{#1*##1}}
% \skvaddslots[KV]{fam}{keyd,keye}{keya1=vala,keyb1=valb}
% {keya2=vala,keyb2=.expanded{\valb}}[def-d&e]{\def\y##1{#1*##1}}
@@ -4305,22 +4366,16 @@
\skvexpanded{%
\skvprependslots[\skvcurrentprefix]{\skvcurrentfamily}%
\unexpanded{{#1}{#2}[#4]{#5}}%
+ % Without \ifskv@addslots@appending, when using \skvaddslots,
+ % signal keys will otherwise be added in the database twice
+ % (while treating prepended and appended slots).
+ \noexpand\skv@addslots@appendingtrue
\skvappendslots[\skvcurrentprefix]{\skvcurrentfamily}%
\unexpanded{{#1}{#3}[#4]{#5}}%
+ \noexpand\skv@addslots@appendingfalse
}%
}
-\skvnewcastcommands{%
- \skvslotkeys=\skvappendslots,\skvstylekeys=\skvappendslots,
- \skvprependstyles=\skvprependslots,
- \skvappendstylesexpanded=\skvappendslotsexpanded,
- \skvprependstylesexpanded=\skvprependslotsexpanded,
- \skvaddstyles=\skvaddslots,
- \skvobserverkeys=\skvappendslots,
- \skvprependobservers=\skvprependslots,
- \skvappendobserversexpanded=\skvappendslotsexpanded,
- \skvprependobserversexpanded=\skvprependslotsexpanded,
- \skvaddobservers=\skvaddslots
-}
+
% Checking the admissible values of keys:
%
\skvrobustdef*\skvcheckchoice{\skv@testopta{\skv@testopt\skv@checkchoice{}}}
@@ -4356,7 +4411,7 @@
\else
\def\skv@tempa{\endgroup\def#1{#2}}%
\fi
- \skvifinTF{,#2,}{,#3,}{%
+ \skvxifinTF{,\detokenize{#2},}{,\detokenize{#3},}{%
\ifskv@pl
\skvappendtomacro\skv@tempa{\@firstoftwo}%
\else
@@ -4521,9 +4576,15 @@
\skvifcsdefTF{\skvcurrentpath/\skvtrimspace{#1}.@cbk}%
}
\skvnewlet\skvifkeyoncurrentpathTF\skvifkeyincurrentfamilyTF
+
% \skvifonekeyinfamilyTF{<prefix>/<family>}{<keys>}
+%
% Given a list of keys, test if at least one of them is defined.
-% Example: \edef\x{\skvifonekeyinfamilyTF{KV/fam}{keya,keyb,keyc}{T}{F}}.
+%
+% 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
@@ -4546,6 +4607,7 @@
% 1. Get keys defined on the given paths.
% 2. Remove any redundant star (*) and plus (+) suffix on
% \skvgetdefinedkeys.
+%
\skvrobustdef*\skvgetdefinedkeys{%
\skv@testopta{\skv@testopt\skv@getdefinedkeys\skvdefaultprefix}%
}
@@ -4713,20 +4775,20 @@
\skvdisabledkeysmessagetype{warn}
\skvrobustdef*\skvdisablekeys{%
- \def\skv@tempa{\skv@ordkey@a{e}}%
+ \def\skv@disable@temp{\skv@ordkey@a{e}}%
\skv@testoptb\skv@disablekeys
}
\skvrobustdef*\skvgdisablekeys{%
- \def\skv@tempa{\skv@ordkey@a{x}}%
+ \def\skv@disable@temp{\skv@ordkey@a{x}}%
\skv@testoptb\skv@disablekeys
}
\skvrobustdef*\skv@disablekeys#1{%
\skvcommaparse{#1}\skv@prova{%
- \skvifcsdefTF{\skv@header\skv@prova.@cbk}{%
- \skvifcsdefTF{\skv@header\skv@prova.@defa}{%
- \edef\skv@provb{\noexpand\skv@tempa{\skv@prova}[]}%
+ \skvifnamedefTF{\skv@header\skv@prova.@cbk}{%
+ \skvifnamedefTF{\skv@header\skv@prova.@defa}{%
+ \edef\skv@provb{\noexpand\skv@disable@temp{\skv@prova}[]}%
}{%
- \edef\skv@provb{\noexpand\skv@tempa{\skv@prova}[^skv^]}%
+ \edef\skv@provb{\noexpand\skv@disable@temp{\skv@prova}[^skv^]}%
}%
\expandafter\skv@provb\expandafter{\expandafter
\skv@disabledkeymsg\expandafter{\skv@prova}}%
@@ -4735,6 +4797,7 @@
\MessageBreak couldn't be disabled}\skv@ehd
}%
}%
+ \skvundef\skv@disable@temp
}
% We split xkeyval's \presetkeys (which has both head and tail) into
@@ -5215,7 +5278,7 @@
}%
% ##1=value:
\def\skv@prova##1=##2\skv@setkeys@nil{%
- \skvifplaswTF\skv@ispntkey{%
+ \skvifknobTF{skv@ispntkey}{%
% \skv@extractpntkey@atsetkey would have extracted key name and
% value for the pntkey.
}{%
@@ -5240,7 +5303,7 @@
\fi
\fi
\skvifdefboolTF{skv@processvalueaslist}{%
- % You can use the pointer '.process list' on the current value to
+ % You can use the pointer '.process list', etc, on the current value to
% signify that the value be processed as a list, in the
% manner of a list key. This scheme is costlier than defining the
% key as a listkey, using \skvlistkey, but it is more versatile.
@@ -5413,11 +5476,15 @@
}%
\skvletcs\skv@callback{\skv@header\skvcurrentkey.@cbk}%
\skv@getargpattern
+ \edef\skv@callback{%
+ \let\noexpand\this\noexpand\skvcurrentkey
+ \skvexpandonce\skv@callback
+ }%
% 1. Strip outer braces of \skvcurrentvalue, so that the argument can be
% grabbed by the, possibly multi-parametered, callback function.
% 2. The argument has been obtained from possible explicit definition
% of the argument. But if the obtained argument is simple, then the
- % argument in the key's call maybe more complex:
+ % argument in the key's call may be more complex:
\ifx\skv@argpattern\skv@simplearg\else
\ifcsname\skv@header\skvcurrentkey.@listkey\endcsname
\skv@err{A listkey must have a one-parameter argument}\skv@ehd
@@ -5773,7 +5840,7 @@
\edef\skv@itemfour{\unexpanded{##4}}%
\edef\skv@itemfive{\unexpanded{##5}}%
\edef\skv@itemsix{\unexpanded{##6}}%
- \skvifplaswTF\skv@isarg{%
+ \skvifknobTF{skv@isarg}{%
\skvdfk@definearg{##1}{##2}{##3}%
}{%
\if\skv@checkkeyexist
@@ -6102,13 +6169,13 @@
\skvifxTF\skv@provb\@empty{%
\def\skv@ival{???}%
}{%
- \skv@getbasetoks{30}\skv@provb\skv@ival
+ \skv@getshortformofcontent{30}\skv@provb\skv@ival
}%
}%
\skvaftergroupdef\skv@ival\endgroup
}
-% \skv@getbasetoks{<nr>}{<toks.cmd>}{<result.cmd>}
-\skvrobustdef*\skv@getbasetoks#1#2#3{%
+% \skv@getshortformofcontent{<nr>}{<toks.cmd>}{<result.cmd>}
+\skvrobustdef*\skv@getshortformofcontent#1#2#3{%
\begingroup
\edef\skv@prova{\detokenize\expandafter{#2}}%
\def#3{}\@tempcnta\skvz@
@@ -6511,7 +6578,7 @@
}
% \dirkeys@executechoice{<expansion.type>}{<curr.value>}{<choices.and.cbks>}
\skvrobustdef*\dirkeys@executechoice#1#2#3{%
- \skv@getexpander@b{#1}%
+ \skv@getexpander{#1}%
\edef\skv@prova{\skvexpander{#2}}%
\skvdespacecontent\skv@prova
\def\do##1##2##3\skv@nil{%
@@ -6570,7 +6637,7 @@
%
\skvrobustdef*\dirkeys@saveslots#1#2#3{%
\begingroup
- \skv@getexpander@b{#3}%
+ \skv@getexpander{#3}%
\def\skv@tempd{}%
\edef\skv@tempa{\unexpanded{#1}}%
\skvcsvnormalize[/]\skv@tempa
@@ -6716,7 +6783,7 @@
%
\skvrobustdef*\dirkeys@savestores#1#2{%
\begingroup
- \skv@getexpander@b{#2}%
+ \skv@getexpander{#2}%
\def\skv@tempd{}%
\edef\skv@tempa{\unexpanded{#1}}%
\skvcsvnormalize[/]\skv@tempa
@@ -7512,17 +7579,19 @@
}%
}%
}
-% \dirkeys@defhandlers{<flag>}{<list>}
+% \dirkeys@defhandlers{<flag>}{<kvlist>}
%
% <flag> indicates if we're in <new> (01) or <define> (00) handler.
%
+% <kvlist> -> {<handlers-1>}={<defn>},...,{<handlers-n>}={<defn>}
+%
\skvrobustdef*\dirkeys@defhandlers#1#2{%
\begingroup
\def\skv@collection{}%
\def\skv@param{####1\skvhandlereov}%
\def\skv@defhandlers@do##1{%
\skv@ensurehandlerdot{##1}%
- \skvifplaswTF{#1}{%
+ \skvifknobTF{#1}{%
\dirkeys@defhandlers@aux{##1}%
}{%
\skvifcsdefTF{dirkeys@handler@##1}{%
@@ -7548,6 +7617,7 @@
\skvcmdexit\dirkeys@reservedhandlers
}%
}
+\skvnewlet\dirkeysdefhandlers\dirkeys@defhandlers
% \dirkeys@defnarghandlers{<flag>}{<list>}
%
% Define handlers of more than one argument. This is slightly more
@@ -7563,7 +7633,7 @@
\def\skv@prova####1####2\handler@nil{%
\edef\skv@param{\skvgenerateparameters{1}{####1}\skvhandlereov}%
\edef\skv@body{\unexpanded{####2}}%
- \skvifplaswTF{#1}{%
+ \skvifknobTF{#1}{%
\dirkeys@defhandlers@aux{##1}%
}{%
\skvifcsdefTF{dirkeys@handler@##1}{%
@@ -7591,6 +7661,8 @@
\skvcmdexit\dirkeys@reservedhandlers
}%
}
+\skvnewlet\dirkeysdefnarghandlers\dirkeys@defnarghandlers
+
% \dirkeys@handlerlet{<flag>}{<kvlist>}
%
% 1. <flag> is either 00 (for define) or 01 (for new handler).
@@ -7612,7 +7684,7 @@
\ifx\dirkeys@reservedhandlers\@empty\else,\fi##1%
}%
\fi
- \skvifplaswTF{#1}{}{%
+ \skvifknobTF{#1}{}{%
\skvifnamedefFT{dirkeys@handler@##1}{}{%
\skv@err{Handler '##1' arealdy exists}\skv@ehd
}%
diff --git a/Master/texmf-dist/tex/latex/skeyval/skeyval-for.tex b/Master/texmf-dist/tex/latex/skeyval/skeyval-for.tex
index a61c4f0c499..205c019dc67 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.tex', version 1.2, 2013/02/10. %
+% This is file 'skeyval-for.tex', version 1.3, 2013/05/15. %
% %
% This package and accompanying files may be distributed and/or %
% modified under the conditions of the LaTeX Project Public License, %
@@ -18,10 +18,11 @@
% The following files constitute the skeyval bundle and must be %
% distributed as a whole: %
% %
-% readme, skeyval.sty, skeyval-core.tex, skeyval-for.tex, %
+% README, skeyval.sty, skeyval-core.tex, skeyval-for.tex, %
% skeyval-view.sty, skeyval-ltxpatch.sty, skeyval-ltxcmds.tex, %
% skeyval-pstkey.sty, skeyval-pstkey.tex, skeyval-testclass.cls, %
-% and skeyval-testpkg.sty. %
+% skeyval-testpkg.sty, skeyval-pokayoke1, skeyval-pokayoke2, %
+% skeyval-view-pokayoke1. %
% %
% Copyright (c) 2010-2013 Ahmed Musa (amusa22@gmail.com). %
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
@@ -59,11 +60,11 @@
\expandafter\let\csname skeyval-for-loaded\endcsname\endinput
\ifx\ProvidesFile\@undefined
- \message{File 'skeyval-for.tex' 2013/02/10 v1.2
+ \message{File 'skeyval-for.tex' 2013/05/15 v1.3
Loops for skeyval package (AM)}
\else
\ProvidesFile{skeyval-for.tex}
- [2013/02/10 v1.2 Loops for skeyval package (AM)]
+ [2013/05/15 v1.3 Loops for skeyval package (AM)]
\@addtofilelist{skeyval-for.tex}
\fi
@@ -98,11 +99,10 @@
\expandafter\skv@provb\skv@prova
\skvgadvanceno#2\m@ne
}
-
\skvnewregisters\bool{%
\ifbreakallforeachloops,\ifskvbreakloop,\ifforeachlastitem,
\ifskvprocessempty,\ifskv@foreach@swa,\ifskv@foreach@swb,
- \ifskv@foreach@parenth,\ifskv@useemptylist
+ \ifskv@foreach@parenthesis,\ifskv@useemptylist,\ifskv@inforeach,
}
\skvnewlet\skvbreakloop\skvbreaklooptrue
\skvnewlet\breaknewforeach\skvbreaklooptrue
@@ -129,15 +129,16 @@
% 4. For comma lists, \skvcommaloop and \skvcommaparse are faster.
% See later.
% 5. For processing kv lists, use \skvparsekvlist.
+% 6. The preservation of outer braces isn't a priority in this loop.
%
\skvrobustdef*\skvdolist{\skv@useemptylistfalse\skv@testst\skv@dolist}
\skvrobustdef*\skv@dolist#1#2#3#4{%
+ \skv@usetempst{#2}#3%
% \skvlistcount is used by listkeys.
\skvsavestate\skvdolist{%
\do\skv@dolist@callback
\do\skv@dolist@a\do\skvlistcount\do\ifskv@useemptylist
}\skv@dolistdepth
- \skv@usetempst{#2}#3%
\edef\skv@dolist@callback{\unexpanded{#4}}%
\def\skvlistcount{0}%
\def\skv@dolist@a##1##2#1{%
@@ -290,7 +291,8 @@
% stack any state.
% 2. There is no fear of parameter characters in <callback> being mixed
% with those of \skv@commaloop@picknext.
-% 2. They can be nested to any depth.
+% 3. These loops can be nested to any depth.
+% 4. The preservation of outer braces isn't a priority in these loops.
%
% \skvcommaloop{<list>}<holder-cmd>{<callback>}
% \skvcommaloop*{<listcmd>}<holder-cmd>{<callback>}
@@ -305,6 +307,7 @@
% Don't put \skvcsvnormalize#2 here. Use \skvcommaparse instead.
% Some callers of \skvcommaloop already have their lists normalized.
\skvifxTF#2\@empty{}{%
+ \skvbreakloopfalse
\skvexpandnext{\skv@commaloop@picknext#2{#3}}#2,\skv@commaloop@nil,%
}%
}
@@ -601,32 +604,7 @@
\fi
}%
}
-
-\begingroup
-\catcode`P=12 \lccode`P=112
-\catcode`T=12 \lccode`T=116
-\lowercase{\endgroup
- \def\skv@foreach@strippoint#1#2{%
- \def\reserved@a##1#1\relax{\def#2{##1}}%
- \def\do##1.##2PT#1{%
- \ifx\do##1\else##1%
- \if\skv@foreach@keephighdecimals
- \ifdim.##2pt>.5pt\relax##2\fi
- \else
- \if\skv@foreach@keepdecimals
- \ifnum##2>\skvz@.##2\fi
- \fi
- \fi
- \unexpanded{#1}%
- \expandafter\do
- \fi
- }%
- \edef#2{\expandafter\do#2#1\do.PT#1}%
- \expandafter\reserved@a#2\relax
- }
-}
-
-\quickkeys.define{skeyval/foreach}{%
+\skvquickkeys.define{skeyval/foreach}{%
.exec/
\def\skv@foreach@parser{,}
\def\skv@foreach@subparser{/}
@@ -793,7 +771,7 @@
\edef\skv@foreach@recoverholders{0\skvifstrcmpTF{true}{#1}01}%
/true,false
;
- % This default value of 'link' is required by \skv@foreach@filllist:
+ % This default value of 'link' is required by \skvautocompletelist:
.exec code/\def\skv@foreach@link{\@nil};
link/\@nil/
\edef\skv@prova{\unexpanded{#1}}%
@@ -819,12 +797,10 @@
;
grow left/true/
\edef\skv@foreach@growleft{0\skvifstrcmpTF{true}{#1}01}
- \edef\skv@foreach@growright{0\skvifstrcmpTF{true}{#1}10}
/true,false
;
grow right/true/
\edef\skv@foreach@growright{0\skvifstrcmpTF{true}{#1}01}
- \edef\skv@foreach@growleft{0\skvifstrcmpTF{true}{#1}10}
/true,false
;
% Keep the decimals in rounded numbers or dimensions when list is
@@ -845,7 +821,7 @@
/true,false
;
expand before fill,expand list before fill/true/
- \edef\skv@foreach@expandlistbeforefill{0\skvifstrcmpTF{true}{#1}01}
+ \edef\skv@foreach@expandbeforefill{0\skvifstrcmpTF{true}{#1}01}
/true,false
;
expand list once,x1,list is a macro,macro list/true/
@@ -866,6 +842,12 @@
\edef\skv@foreach@reverselist{0\skvifstrcmpTF{true}{#1}01}
/true,false
;
+ % 'hide parameters' can be used to avoid doubling the parameter
+ % characters in the callback.
+ hide parameters/true/
+ \edef\skv@foreach@hideparameters{0\skvifstrcmpTF{true}{#1}01}
+ /true,false
+ ;
}
% The following keys don't need presetting. The user must supply
@@ -875,13 +857,13 @@
% link,evaluate,,evaluate num,evaluate dim,expand,count in,
% process up to,grow
%
-\quickkeys.preset{skeyval/foreach}{%
+\skvquickkeys.preset{skeyval/foreach}{%
parser,subparser,loop stopper,callback terminator,process up to,
process empty list=false,item counter,list breaker,list pauser,
recover holder values=false,grow left=false,grow right=false,
keep decimals=true,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,
+ expand list twice=false,expand list fully=false,hide parameters=false
}
\skvnewdef*\skv@foreach@kvlist{}
@@ -892,7 +874,7 @@
}%
}
\skvrobustdef*\skv@foreach@setkeys#1{%
- \def\reserved@a{\quickkeys.set{skeyval/foreach}}%
+ \def\reserved@a{\skvquickkeys.set{skeyval/foreach}}%
\expandafter\reserved@a\expandafter{\skv@foreach@kvlist,#1}%
}
@@ -1497,13 +1479,14 @@
\skvrobustdef*\skv@foreach@pushstate{%
\skvsavestate\skv@foreach@stack{%
- \do\skv@foreach@seenstar\do\skv@foreach@parser
+ \do\skv@foreach@starform\do\skv@foreach@parser
\do\skv@foreach@subparser\do\skv@foreach@listisamacro
\do\skv@foreach@processupto\do\skv@foreach@processempty
\do\skv@foreach@exittester\do\skv@foreach@continuetester
\do\skv@foreach@grow\do\skv@foreach@growleft\do\skv@foreach@growright
\do\skv@foreach@terminator\do\skv@foreach@recoverholders
\do\skv@foreach@normalizelist\do\skv@foreach@callback
+ \do\skv@foreach@hideparameters\do\skv@foreach@callback@hiddenparameters
\do\skv@foreach@auxcallback\do\skv@foreach@precallback
\do\skv@foreach@afterprecallback\do\skv@foreach@postcallback
\do\skv@foreach@onlyinitially
@@ -1518,7 +1501,7 @@
\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@expandlistbeforefill\do\skv@foreach@expandlistonce
+ \do\skv@foreach@expandbeforefill\do\skv@foreach@expandlistonce
\do\skv@foreach@expandlisttwice\do\skv@foreach@expandlistfully
\do\skv@listbreakertoks\do\skv@listpausertoks
\do\skv@foreach@reverselist\do\foreachcurrentitem
@@ -1536,7 +1519,8 @@
\skvnewdef*\skv@foreach@nnil{\skv@foreach@nil}
\skvrobustdef*\newforeach{\skv@testst\skv@newforeach@beginprescan}
\skvrobustdef*\skv@newforeach@beginprescan{%
- \edef\skv@foreach@seenstar{0\ifskv@tempst0\else1\fi}%
+ \skv@inforeachtrue
+ \edef\skv@foreach@starform{0\ifskv@tempst0\else1\fi}%
\begingroup
\def\skv@foreach@holderlist{}%
\def\skv@tempa{%
@@ -1547,8 +1531,7 @@
}%
\let\bgroup\relax
\skvifnextchar[{%
- \endgroup
- \skv@foreach@scanarg
+ \endgroup\skv@foreach@scanarg
}{%
\skvifnextchar i{%
\endgroup
@@ -1598,6 +1581,7 @@
\def\do##1{\def##1{}}%
\do\skv@foreach@itemcounter\do\skv@foreach@processupto
\do\skv@foreach@callback\do\skv@foreach@auxcallback
+ \do\skv@foreach@callback@hiddenparameters
\do\skv@foreach@precallback\do\skv@foreach@afterprecallback
\do\skv@foreach@postcallback\do\skv@foreach@onlyinitially
% The keys have to be set here, to determine if the list is a macro, etc.
@@ -1609,7 +1593,7 @@
% 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
+ \if\skv@foreach@starform
\def\skv@foreach@expandlistonce{00}%
\fi
\ifcase0%
@@ -1780,7 +1764,8 @@
\skv@foreach@mainprocess
{\skvexpandonce\skv@foreach@holderlist}%
{\skvexpandonce\skv@foreach@userlist}%
- }{#1}%
+ {\skvtrimspace{#1}}%
+ }%
}
% #1: holder macros
% #2: List or list command
@@ -1809,8 +1794,10 @@
\skvifdefTF\foreachprevitem{}{\def\foreachprevitem{}}%
\expandafter\skv@foreach@normalize\expandafter[\skv@foreach@parser]%
\skv@foreach@userlist
- \expandafter\skv@foreach@normalize\expandafter[\skv@foreach@subparser]%
- \skv@foreach@userlist
+ % Why 'keep double parser' here? Think of a list like 32//13,11/23/,...
+ \skvexpbracenext\skvdefinekeepdoubleparsernormalizer
+ \skv@foreach@subparser\skv@tempa
+ \edef\skv@foreach@userlist{\skvexpbracenext\skv@tempa\skv@foreach@userlist}%
\ifnum\foreachnestdepth=\skvz@
\breakallforeachloopsfalse
\fi
@@ -1907,8 +1894,19 @@
\skv@foreach@callback{}%
\fi
}{%
- \expandafter\skv@foreach@filllist\expandafter
- {\skv@foreach@parser}\skv@foreach@userlist
+ \def\do####1{\if####1true\else false\fi}%
+ \skvexpandsecond{\skvautocompletelist*}{[%
+ % Note: the value of 'expand list once', etc., can't be
+ % transferred automatically to \skvautocompletelist since they
+ % have been used above to expand list.
+ parser={\skv@foreach@parser},
+ link={\skvexpandonce\skv@foreach@link},
+ grow left=\do\skv@foreach@growleft,
+ grow right=\do\skv@foreach@growright,
+ keep decimals=\do\skv@foreach@keepdecimals,
+ keep high decimals=\do\skv@foreach@keephighdecimals,
+ expand before fill=\do\skv@foreach@expandbeforefill
+ ]}\skv@foreach@userlist\skv@foreach@userlist
\if\skv@foreach@reverselist\skvafterfi
\expandafter\skv@foreach@doreverselist\expandafter
{\skv@foreach@parser}\skv@foreach@userlist
@@ -1932,6 +1930,7 @@
\ifnum\foreachnestdepth=\skvz@
\def\skv@warnsubparser{0}%
\fi
+ \skv@inforeachfalse
}
% \skv@foreach@makeprecode{<holder.list>}
@@ -2013,7 +2012,7 @@
%
% \def\ditem{D}
% \newforeach [
-% continue=\ifx\x\ditem\fi,remember=\x as \rx initially A
+% continue=\ifx\x\ditem\fi, remember=\x as \rx initially A
% ] \x in {
% B,(C1),D,E,[F1],G,H
% }{%
@@ -2031,9 +2030,11 @@
}%
% Add extra subparsers in case some items aren't subparser-complete:
\edef\skv@tempa{\skv@generatesubparser{1}}%
+ \edef\skv@foreach@callback@hiddenparameters{\unexpanded{#1}}%
\let\foreacheov\relax
\let\do\noexpand
\skvexpanded{\endgroup
+ \skvcmdexit\skv@foreach@callback@hiddenparameters
% Define auxiliary callback:
\def\do\skv@foreach@auxcallback\skv@foreach@paramlist\foreacheov{%
% Holder macro assignments:
@@ -2046,15 +2047,24 @@
\ifx\skv@foreach@continuetester\@secondoftwo
\noexpand\skv@foreach@continuetester
\else
- % Expose the parameter characters in \skv@foreach@continuetester:
+ % Expose the parameter characters in \skv@foreach@continuetester.
+ % If the user wants to ignore the callback for some items, he can
+ % use the key 'continue=<condition>':
\skvexpandonce\skv@foreach@continuetester
\fi
{%
\relax
}{%
- % If the user wants to ignore the callback for some items, he can
- % use the key 'continue=<condition>':
- \unexpanded{#1}%
+ \if\skv@foreach@hideparameters
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+ {%
+ \noexpand\skv@foreach@callback@hiddenparameters
+ }{%
+ \unexpanded{#1}%
+ }%
% User tests/tasks, eg, if requested from the keys 'remember',
% 'exit when', etc:
\skvexpandonce\skv@foreach@postcallback
@@ -2082,10 +2092,6 @@
{P}{p}{16}{Q}{q}{17}{R}{r}{18}{S}{s}{19}{T}{t}{20}{U}{u}{21}{V}{v}{22}%
{W}{w}{23}{X}{x}{24}{Y}{y}{25}{Z}{z}{26}%
}
-% \skv@foreach@addtolist<parser><add.new><listcmd>
-\skvrobustdef*\skv@foreach@addtolist#1#2#3{%
- \edef#3{\skvexpandonce#3\ifx#3\@empty\else\unexpanded{#1}\fi#2}%
-}
\skvrobustdef*\skv@reverselumap#1{%
\def\skv@prova##1##2##3##4\skv@nil{%
\ifx\@nnil##1%
@@ -2098,96 +2104,134 @@
\edef#1{\expandafter\skv@prova\skv@alphamap\@nnil{}{}\skv@nil}
}
-\skvnewdef*\skv@foreach@ifloweralpha#1{%
- \skvifblankTF{#1}{%
- \@secondoftwo
- }{%
- \skvifntypeTF{#1}{%
- \skvifnumTF`#1>96{%
- \skvifnumTF`#1<123{%
- \@firstoftwo
- }{%
- \@secondoftwo
- }%
- }{%
- \@secondoftwo
- }%
- }{%
- \@secondoftwo
- }%
- }%
+
+\skvquickkeys.define{skeyval/autocomplete}{%
+ .exec/\def\skv@autocomplete@parser{,};
+ parser/{,}/
+ \edef\skv@autocomplete@parser{\unexpanded{#1}}
+ \skvstripouterbraces{2}\skv@autocomplete@parser
+ \skvxifntypeTF{\detokenize{#1}}{%
+ \begingroup
+ % It is assumed that every n-type parser and subparser
+ % must have catcode 12:
+ \skvexpandnext{\catcode`}\skv@autocomplete@parser=12\relax
+ \skvrescan\skv@autocomplete@parser
+ \skvaftergroupdef\skv@autocomplete@parser\endgroup
+ }{}
+ ;
+ % This default value of 'link' is required by \skvautocompletelist:
+ .exec code/\def\skv@autocomplete@link{\@nil};
+ link/\@nil/
+ \edef\skv@prova{\unexpanded{#1}}%
+ \ifcase0%
+ \ifx\skv@prova\@empty 1\fi
+ \ifx\skv@prova\@nnil 1\fi\relax
+ \edef\skv@autocomplete@link{\unexpanded{#1}}%
+ \skvstripouterbraces{2}\skv@autocomplete@link
+ \fi
+ ;
+ grow/\@nil/
+ \edef\skv@prova{\unexpanded{#1}}%
+ \ifx\skv@prova\@nnil\else
+ \skvcsedef{skv@autocomplete@grow#1}{00}
+ \edef\skv@prova{\skvifstrcmpTF{#1}{left}{right}{left}}%
+ \skvcsedef{skv@autocomplete@grow\skv@prova}{01}%
+ \fi
+ /left,right
+ ;
+ .exec/
+ \def\skv@autocomplete@growleft{01}
+ \def\skv@autocomplete@growright{01}
+ ;
+ grow left/true/
+ \edef\skv@autocomplete@growleft{0\skvifstrcmpTF{true}{#1}01}
+ /true,false
+ ;
+ grow right/true/
+ \edef\skv@autocomplete@growright{0\skvifstrcmpTF{true}{#1}01}
+ /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@autocomplete@keepdecimals{0\skvifstrcmpTF{true}{#1}01}
+ /true,false
+ ;
+ keep high decimals,keep only high decimals/true/
+ \edef\skv@autocomplete@keephighdecimals{0\skvifstrcmpTF{true}{#1}01}
+ /true,false
+ ;
+ expand before fill,expand list before fill/true/
+ \edef\skv@autocomplete@expandbeforefill{0\skvifstrcmpTF{true}{#1}01}
+ /true,false
+ ;
}
-\skvnewdef*\skv@foreach@ifupperalpha#1{%
- \skvifblankTF{#1}{%
- \@secondoftwo
- }{%
- \skvifntypeTF{#1}{%
- \skvifnumTF`#1>64{%
- \skvifnumTF`#1<91{%
- \@firstoftwo
- }{%
- \@secondoftwo
- }%
- }{%
- \@secondoftwo
- }%
- }{%
- \@secondoftwo
- }%
- }%
+
+% The keys 'link,grow' don't need presetting. The user must supply
+% values when they are called. In internal loops, their values will
+% have to be revised from those of the outer loop.
+%
+\skvquickkeys.preset{skeyval/autocomplete}{%
+ parser,grow left=false,grow right=false,
+ keep decimals=true,keep high decimals=false,
+ expand before fill=false
}
-% Parse list for 1,2,...,n,1,...,m. Return value in #1:
+% \skv@autocomplete@addtolist<parser><add.new><listcmd>
+\skvrobustdef*\skv@autocomplete@addtolist#1#2#3{%
+ \edef#3{\skvexpandonce#3\ifx#3\@empty\else\unexpanded{#1}\fi#2}%
+}
+% \skv@autocomplete@zerostepwarn{<lower>}{<upper>}{<pt.or.nil>}
+\skvrobustdef*\skv@autocomplete@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' \ifskv@latex before \skv@begindoctoks\fi}%
+}
+% \skvautocompletelist[<kvlist>]{<list>}{<returncmd>}
+% \skvautocompletelist*[<kvlist>]{<listcmd>}{<returncmd>}
%
-% \skv@foreach@filllist{<parser>}<listcmd>
-\skvrobustdef*\skv@foreach@filllist#1#2{%
+% 1. Parse list of type {1,2,...,n,1,...,m} for auto completion.
+% Return outcome in <listcmd> or \skvcompletedlist.
+%
+\skvrobustdef*\skvautocompletelist{\skv@teststopt\skv@autocompletelist@a{}}
+\skvrobustdef*\skv@autocompletelist@a[#1]#2#3{%
+ \skv@usetempst{#2}\skv@autocomplete@userlist
+ \skvquickkeys.set{skeyval/autocomplete}{#1}%
\def\skv@inalphabetic{01}%
\def\skv@isupperalpha{01}%
- % If the list is alphabetic, original unit is nil:
- \def\skv@foreach@origunit{}%
- \def\skv@foreach@filledlist{}%
- \edef\skv@foreach@parser{\skvtrimspace{#1}}%
- \ifx\skv@foreach@parser\@empty
- \def\skv@foreach@parser{,}%
- \fi
- \def\skv@foreach@iflinkgiven{%
- \skvifdefTF\skv@foreach@link{%
- \skvifxFT\skv@foreach@link\@nnil
- }{%
- \skv@err{List auto-completion: 'link' is undefined}\skv@ehd
- }%
- }%
- \skvexpanded{%
- \noexpand\skv@foreach@filllist@a
- {\skvexpandonce\skv@foreach@parser}{\skvexpandonce{#2}}%
- }%
- \let#2\skv@foreach@filledlist
-}
-\skvnewlet\skvautofilllist\skv@foreach@filllist
-% \skv@foreach@filllist@a{<parser>}{<list>}
-\skvrobustdef*\skv@foreach@filllist@a#1#2{%
+ \def\skv@preandpostdotspresent{01}%
+ % If the list is alphabetic or numbers, original unit is nil:
+ \def\skv@autocomplete@origunit{}%
+ \def\skvcompletedlist{}%
+ \skvexpandtwoargsonce
+ \skv@autocompletelist@b\skv@autocomplete@parser\skv@autocomplete@userlist
+ \let#3\skvcompletedlist
+}
+% \skv@autocompletelist@b{<parser>}{<list>}
+\skvrobustdef*\skv@autocompletelist@b#1#2{%
\edef\skv@tempa{\unexpanded{#2}}%
\skv@foreach@normalize[#1]\skv@tempa
\def\skv@prova##1{%
\skvxifinTF{...}{\detokenize{##1}}{%
- \if\skv@foreach@expandlistbeforefill
+ \if\skv@autocomplete@expandbeforefill
\edef\skv@tempa{##1}%
\skv@foreach@normalize[#1]\skv@tempa
\else
\edef\skv@tempa{\unexpanded{##1}}%
\fi
- \skvexpandargonce{\skv@foreach@filllist@b{#1}}{\skv@tempa}%
- \skv@foreach@normalize[#1]\skv@foreach@filledlist
+ \skvexpandargonce{\skv@autocompletelist@c{#1}}\skv@tempa
+ \skv@foreach@normalize[#1]\skvcompletedlist
}{%
- \edef\skv@foreach@filledlist{%
- \skvaddlist{#1}\skv@foreach@filledlist\skvtrimspace{##1}%
+ \edef\skvcompletedlist{%
+ \skvaddlist{#1}\skvcompletedlist\skvtrimspace{##1}%
}%
}%
}%
\expandafter\skv@prova\expandafter{\skv@tempa}%
}
-% \skv@foreach@filllist@b{<parser>}{<list>}
-\skvrobustdef*\skv@foreach@filllist@b#1#2{%
+% \skv@autocompletelist@c{<parser>}{<list>}
+\skvrobustdef*\skv@autocompletelist@c#1#2{%
\skvxiffound{\relax...}\in{\relax\detokenize{#2}}\then
\skv@err{I can't find lower limit before '...'}\skv@ehd
\else
@@ -2197,203 +2241,49 @@
\fi
% \newforeach format is '<parser>...<parser>':
\skvxifinTF{\detokenize{#1...#1}}{\detokenize{#2}}{%
- \skv@foreach@splitonguide{#1}{#2}%
+ \skv@autocomplete@splitbeforedots{#1}{#2}%
\def\skv@prova##1#1##2#1...#1##3#1##4#1##5\skv@nil{%
\skvifblankTF{##3}{%
\skv@err{I can't find upper limit number or dimension,
\MessageBreak i.e., after symbool '...'}\skv@ehd
}{%
- % \skv@foreach@filllist@a may be reentered. Hence accumulate
+ % \skv@autocompletelist@b may be reentered. Hence accumulate
% filled list:
\skviflacus{##1}\then\else
- \edef\skv@foreach@filledlist{%
- \skvaddlist{#1}\skv@foreach@filledlist\unexpanded{##1}%
+ \edef\skvcompletedlist{%
+ \skvaddlist{#1}\skvcompletedlist\unexpanded{##1}%
}%
\fi
% Complete the list:
- \skv@foreach@filllist@c{#1}{##1}{##2}{##3}%
+ \skv@autocompletelist@d{#1}{##1}{##2}{##3}%
% In case the list is folded on ellipsis (...):
- \skvifblankTF{##4}{}{\skv@foreach@filllist@a{#1}{##4#1##5}}%
+ \skvifblankTF{##4}{}{\skv@autocompletelist@b{#1}{##4#1##5}}%
}%
}%
\expandafter\skv@prova\skv@tempa#1#1\skv@nil
}{%
- % Not \newforeach format: try PGF's \foreach format:
- \skv@foreach@trypgflikeformat{#1}{#2}%
+ \skv@autocompletelist@e{#1}{#2}%
}%
}
-
-% \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' \ifskv@latex before \skv@begindoctoks\fi}%
-}
-
-% skv@foreach@filllist@c{<parser>}{<lower1>}{<lower2>}{<upperbound>}
+% skv@autocompletelist@d{<parser>}{<lower1>}{<lower2>}{<upperbound>}
%
% 1. No <guide> here.
%
-\skvrobustdef*\skv@foreach@filllist@c#1#2#3#4{%
- \skv@foreach@iflinkgiven{%
- % <link> has been given by the user:
- \skv@foreach@splitandgrow{#1}{#2}{#3}{#4}%
- }{%
+\skvrobustdef*\skv@autocompletelist@d#1#2#3#4{%
+ \skvifxTF\skv@autocomplete@link\@nnil{%
% No <link> has been given. The list has '...' but presumably no link.
- % Note: If there're more than 1 alpha/Alpha character, both
- % \skv@foreach@ifloweralpha and \skv@foreach@ifupperalpha will
- % return false, since double aphabetic characters can't be grown.
- % \skv@foreach@filllist@d{<parser>}{<guide>}{<lower1>}{<lower2>}{<upper>}
- \skv@foreach@filllist@d{#1}{}{#2}{#3}{#4}%
- }%
-}
-
-% skv@foreach@fsplitandgrow{<parser>}{<lower1>}{<lower2>}{<upperbound>}
-%
-% {0\pi,0.5\pi,...,3\pi} : link = \pi ; grow left
-% {1--,4--,...,10--} : link = -- ; grow left
-% {2pt,4pt,...,10pt} : link = pt ; grow left (or no additional info.)
-% {A_1,C_1,...,Q_1} : link = _ ; grow left
-% {2^a,2^c,...,2^q} : link = ^ ; grow right
-%
-% 1. Automatically split and grow.
-% 2. We already know that the key 'link' will reject empty values.
-%
-\skvrobustdef*\skv@foreach@splitandgrow#1#2#3#4{%
- \ifx\skv@foreach@growleft\skv@foreach@growright
- \skv@err{I can't grow the list in both directions.
- \MessageBreak Maybe you haven't indicated the
- \MessageBreak direction of growth (left or right),
- \MessageBreak or both directions are 'true'.}
- {Try one of the keys 'grow=left or right',
- \MessageBreak 'grow left=true or false',
- 'grow right=true or false'}\skv@ehd
- \fi
- \begingroup
- \def\skv@prova##1{%
- \skv@foreach@swatrue
- \skviflacus#2\then\else
- \skvifinTF{##1}{#2}{}\skv@foreach@swafalse
- \fi
- \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
- '\detokenize\expandafter{\skv@provb#3, #4}'}\skv@ehd
- \fi
- \def\skv@prova####1##1####2\skv@nil{%
- \if\skv@foreach@growright
- \edef\skv@prova{\skvtrimspace{####1##1}}%
- \else
- \edef\skv@prova{\skvtrimspace{##1####2}}%
- \fi
- \def\do########1{{\skvtrimspace{########1}}}%
- % \skv@foreach@trypgflikeformat@a<parser><guide><lower1><lower2><upper>
- \skvexpanded{\endgroup
- \noexpand\skv@foreach@trypgflikeformat@a
- {\unexpanded{#1}}{\skvexpandonce\skv@prova}\do{#2}\do{#3}\do{#4}%
- }%
- }%
- \skv@prova#3\skv@nil
- }%
- \expandafter\skv@prova\expandafter{\skv@foreach@link}%
-}
-%
-% \skv@foreach@splitonguide{<parser>}{<list>}
-%
-% Get the two elements before '...' or '<guide>,...'. In the case of skeyval
-% format, get the two elements before '...'. The PGF format uses <guide>,
-% shown in the following examples:
-%
-% PGF formats:
-% {a^1,a^3,a^...,a^9} : <guide> = a^
-% {A_1,B_1,..._1,E_1} : <guide> = _1
-% {1--,4--,...--,16--} : <guide> = --
-% {1pt,4pt,...pt,10pt} : <guide> = pt
-% {A_2pt,A_4pt,A_...pt,A_10pt} : <guide> = A_ and pt
-%
-% skeyval formats:
-% {a^1,a^3,a^...,a^9} : no additional info. required
-% {A_1,B_1,..._1,E_1} : no additional info. required
-% {1--,4--,...--,16--} : no additional info. required
-% {1pt,4pt,...pt,10pt} : no additional info. required
-% {A_2pt,A_4pt,A_...,A_10pt} : no additional info. required
-%
-% {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 no addit. info.
-% {A_2pt,A_4pt,...,A_10pt} : link = _, grow = right
-%
-% The items prior to the last 2 items before '<guide>...' or before '...'
-% are called 'before-the-last-2' (BL2). Collect in \skv@tempa BL2 items,
-% together with the rest of the list. Save the BL2 items in
-% \skv@foreach@filledlist.
-%
-% Return \skv@foreach@filledlist and \skv@tempa.
-%
-\skvrobustdef*\skv@foreach@splitonguide#1#2{%
- % First count all the elements before '<guide>,...'. We're already
- % sure that #2 contains '<guide><parser>...' or '...':
- \begingroup
- \skv@cnta\skvz@
- \def\do##1#1{%
- \skvifinTF{...}{##1}{%
- \def\do####1\skv@nil{}%
- }{%
- \advance\skv@cnta\@ne
- }%
- \do
- }%
- \do#2#1\skv@nil
- \ifnum\skv@cnta>\tw@
- \skvsetno\skv@foreach@nra\m@ne
- \def\do##1#1{%
- \skvadvanceno\skv@foreach@nra\@ne
- \ifnum\skv@foreach@nra=\numexpr\skv@cnta-\tw@\relax
- \def\do####1\skv@nil{\def\skv@tempa{##1#1####1}}%
- \else
- \edef\skv@foreach@filledlist{%
- \skvaddlist{#1}\skv@foreach@filledlist\unexpanded{##1}%
- }%
- \fi
- \do
- }%
- \do#2#1\skv@nil
- \else
- \ifnum\skv@cnta=\@ne
- \def\skv@tempa{#1#2}%
- \else
- \ifnum\skv@cnta=\tw@
- \def\skv@tempa{#2}%
- \else
- \ifnum\skv@cnta=\skvz@
- \skv@err{List <<\detokenize{#2}>>\MessageBreak
- contains symbol '...' but not a lowerbound}\skv@ehd
- \fi
- \fi
- \fi
- \fi
- \skvexpanded{\endgroup
- \skvcmdexit\skv@foreach@filledlist\skvcmdexit\skv@tempa
+ %
+ % \skv@autocompletelist@h{<parser>}{<guide>}{<lower1>}{<lower2>}{<upper>}
+ \skv@autocompletelist@h{#1}{}{#2}{#3}{#4}%
+ }{%
+ % <link> has been given by the user:
+ \skv@autocomplete@splitandgrow{#1}{#2}{#3}{#4}%
}%
}
-
-% \skv@foreach@trypgflikeformat{<parser>}{<list>}
-%
-% When we say 'try PGF-like format', we don't actually mean the
-% PGF format with left and right guides, as in,
-%
-% {A_2pt,A_4pt,A_...pt,A_10pt} : <guide> = 'A_(left)' and 'pt(right)' (*)
%
-% but the syntax '<guide>...' (ie, having only the left-hand-side or only
-% the right-hand-side guide). For example,
+% \skv@autocompletelist@e{<parser>}{<list>}
%
-% {A_2pt,A_4pt,A_...,A_10pt} or {1pt,4pt,...pt,10pt}
-%
-% \skv@foreach@trypgflikeformat will auto-complete this list without
+% \skv@autocompletelist@e will auto-complete this list without
% knowledge of the values of the keys 'link' and 'grow'. The syntax at (*)
% above isn't recognized by the auto-completion scheme of skeyval.
%
@@ -2401,97 +2291,105 @@
%
% {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.
+% {\pi0,\pi0.5,\pi...,\pi3} : no additional info. required
+% {0\pi,0.5\pi,...\pi,3\pi} : no additional info. required
+% {1pt,4pt,...,10pt} : link = pt, grow=left, or no addit. info.
% {A_2pt,A_4pt,...,A_10pt} : link =_, grow=right
%
-% The general PGF format (with left and right guides), e.g.,
+% The general PGF format with left and right guides (given as 'A_'
+% and 'pt') in
%
% {A_2pt,A_4pt,A_...pt,A_10pt}
%
-% is illegal here, because the file skeyval-for.tex uses the location
-% of the guide (left or right of ...) to determine the direction of growth.
+% is still legal in skeyval.
%
-\skvrobustdef*\skv@foreach@trypgflikeformat#1#2{%
- \skv@foreach@splitonguide{#1}{#2}%
+\skvrobustdef*\skv@autocompletelist@e#1#2{%
+ \skv@autocomplete@splitbeforedots{#1}{#2}%
+ \def\skv@checkguideinbounds##1##2{%
+ \skv@foreach@swafalse
+ \def\do####1{%
+ \ifx\do####1\else
+ \skviflacus####1\then\else
+ \skvifinTF{##1}{####1}{}\skv@foreach@swatrue
+ \fi
+ \expandafter\do
+ \fi
+ }%
+ \do##2\do
+ \ifskv@foreach@swa
+ \skv@err{Guide token '\detokenize{#1}' not found in some
+ \MessageBreak of the elements: I can't complete
+ \MessageBreak the current list. This may be
+ \MessageBreak due to wrong direction of growth}\skv@ehd
+ \fi
+ }%
\def\skv@prova##1#1##2#1##3...##4#1##5#1##6#1##7\skv@nil{%
\skvifblankTF{##5}{%
\skv@err{I can't find upper limit number or dimension,
\MessageBreak i.e., after symbool '...'}\skv@ehd
}{%
- % \skv@foreach@filllist@a may be reentered. Hence
+ % \skv@autocompletelist@b may be reentered. Hence
\skviflacus{##1}\then\else
- \edef\skv@foreach@filledlist{%
- \skvaddlist{#1}\skv@foreach@filledlist
+ \edef\skvcompletedlist{%
+ \skvaddlist{#1}\skvcompletedlist
\skvtrimspace{##1}%
}%
\fi
- \def\do####1{{\skvtrimspace{####1}}}%
+ \let\do\unexpanded
\skvifblankTF{##3}{%
\skvifblankTF{##4}{%
\skv@err{No direction of growth before and/or after
\MessageBreak symbol '...'}\skv@ehd
}{%
- \def\skv@foreach@growleft{00}%
- \def\skv@foreach@growright{01}%
+ % Eg, {2pt_A,4pt_A,...pt_A,10pt_A}. Here ##3 is nil, grow left.
+ \def\skv@autocomplete@growleft{00}%
+ \def\skv@autocomplete@growright{01}%
\skvexpanded{%
- \skv@foreach@trypgflikeformat@a
- {\unexpanded{#1}}\do{##4}\do{##1}\do{##2}\do{##5}%
+ \skv@autocompletelist@f
+ {\do{#1}}{\do{##4}}{\do{##1}}{\do{##2}}{\do{##5}}%
}%
}%
}{%
\skvifblankTF{##4}{%
- \def\skv@foreach@growright{00}%
- \def\skv@foreach@growleft{01}%
+ % Eg, {A_2pt,A_4pt,A_...,A_10pt}. Here ##4 is nil, grow right.
+ \def\skv@autocomplete@growright{00}%
+ \def\skv@autocomplete@growleft{01}%
\skvexpanded{%
- \skv@foreach@trypgflikeformat@a
- {\unexpanded{#1}}\do{##3}\do{##1}\do{##2}\do{##5}%
+ \skv@autocompletelist@f
+ {\do{#1}}{\do{##3}}{\do{##1}}{\do{##2}}{\do{##5}}%
}%
}{%
- \skv@err{Having both '\detokenize{'##3' and '##4'} in an
- \MessageBreak ellipsis list is illegal in
- \MessageBreak\noexpand\newforeach and \noexpand\foreachfox.
- \MessageBreak I know that PGF's \noexpand\foreach needs it,
- \MessageBreak but I don't need it. I can
- \MessageBreak auto-fill your list with information
- \MessageBreak on only one side of <<...>>.}\skv@ehd
+ % Eg, {A_2pt,A_4pt,A_...pt,A_10pt}.
+ \skvexpanded{%
+ \skv@autocompletelist@g
+ {\do{#1}}{\do{##3}}{\do{##4}}{\do{##1}}{\do{##2}}{\do{##5}}%
+ }%
}%
}%
% In case the list is folded on ellipsis (...):
- \skvifblankTF{##6}{}{\skv@foreach@filllist@a{#1}{##6#1##7}}%
+ \skvifblankTF{##6}{}{\skv@autocompletelist@b{#1}{##6#1##7}}%
}%
}%
\expandafter\skv@prova\skv@tempa#1#1#1\skv@nil
}
-%
-% \skv@foreach@trypgflikeformat@a
+% \skv@autocompletelist@f
% {<parser>}{<guide>}{<lower1>}{<lower2>}{<upper>}
%
-% 1. Use the <guide> to get the contant and variable parts of the
+% 1. Use the <guide> to get the constant and variable parts of the
% elements.
% 2. Use the variable parts to determine if the list is Alpah, alpha or
% number type. In this format, the unit in dimension type of list may
% appear in <guide>.
% 3. Use the variable parts to work out the <step>.
% 4. Call the relevant macro to fill the list.
-% 5. <lower1> has already been saved in \skv@foreach@filledlist.
+% 5. <lower1> has already been saved in \skvcompletedlist.
%
-\skvrobustdef*\skv@foreach@trypgflikeformat@a#1#2#3#4#5{%
- \skv@foreach@swafalse
- \skviflacus#3\then\else
- \skvxifinTF{#2}{#3}{}\skv@foreach@swatrue
- \fi
- \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
- \MessageBreak the current list. This may be
- \MessageBreak due to wrong direction of growth}\skv@ehd
- \fi
- % Get from the left or right of 'link' (#2) the components that should be
- % grown, without the link:
+\skvrobustdef*\skv@autocompletelist@f#1#2#3#4#5{%
+ \skv@checkguideinbounds{#2}{{#3}{#4}{#5}}%
+ % Use the 'link' (#2) to get from {<lower1>}, {<lower2>} and {<upper>}
+ % the left or right sides of the elements that should be grown:
\def\skv@prova##1#2##2\skv@nil##3{%
- \edef##3{\if\skv@foreach@growleft##1\else##2\fi}%
+ \edef##3{\if\skv@autocomplete@growleft##1\else##2\fi}%
}%
% <lower1> is empty when there is only one element before ellipsis:
\skviflacus#3\then
@@ -2503,69 +2401,105 @@
\skv@prova#5\skv@nil\skv@tempc
\let\do\skvexpandonce
\skvexpandsecond
- {\skv@foreach@filllist@d{#1}{#2}}%
+ {\skv@autocompletelist@h{#1}{#2}}%
{{\do\skv@tempa}{\do\skv@tempb}{\do\skv@tempc}}%
}
-
-% \skv@foreach@filllist@d{<parser>}{<guide>}{<lower1>}{<lower2>}{<upper>}
+% \skv@autocompletelist@g
+% {<parser>}{<predots>}{<postdots>}{<lower1>}{<lower2>}{<upper>}
+\skvrobustdef*\skv@autocompletelist@g#1#2#3#4#5#6{%
+ \def\skv@preandpostdotspresent{00}%
+ \skv@checkguideinbounds{#2}{{#4}{#5}{#6}}%
+ \skv@checkguideinbounds{#3}{{#4}{#5}{#6}}%
+ % For <lower1>, <lower2> and <upper>, get the tokens between
+ % <predots> and <postdots>. They are the ones to be grown.
+ \def\skv@prova##1#2##2#3##3\skv@nil##4{%
+ \edef##4{##2}%
+ }%
+ \ifx\@nnil#4\@nnil
+ \let\skv@tempa\@empty
+ \else
+ \skv@prova#4\skv@nil\skv@tempa
+ \fi
+ \skv@prova#5\skv@nil\skv@tempb
+ \skv@prova#6\skv@nil\skv@tempc
+ % Pass <guide> as empty to \skv@autocompletelist@h. Through out, the only
+ % reason for passing <guide> to \skv@autocompletelist@h is to restore
+ % it in \skv@autocomplete@restore. But while
+ % \skv@preandpostdotspresent is true, we won't do anything in
+ % \skv@autocomplete@restore.
+ \skvexpandsecond
+ {\skv@autocompletelist@h{#1}{}}%
+ {{\skv@tempa}{\skv@tempb}{\skv@tempc}}%
+ % Restore <predots> and <postdots>:
+ \def\do##1#1{%
+ \ifx\do##1\else
+ \edef\skvcompletedlist{%
+ \skvaddlist{#1}\skvcompletedlist
+ \unexpanded{#2}##1\unexpanded{#3}\skv@autocomplete@origunit
+ }%
+ \expandafter\do
+ \fi
+ }%
+ \expandafter\do\skv@completedlist@partial#1\do#1%
+}
+% \skv@autocompletelist@h{<parser>}{<guide>}{<lower1>}{<lower2>}{<upper>}
%
% 1. Use the variable parts to determine if the list is Alpah, alpha or
% number type. In this format, the unit in dimension type of list may
% appear in <guide>.
% 2. Use the variable parts to work out the <step>.
% 3. Call the relevant macro to fill the list.
-% 4. <lower1> has already been saved in \skv@foreach@filledlist.
+% 4. <lower1> has already been saved in \skvcompletedlist.
%
-\skvrobustdef*\skv@foreach@filllist@d#1#2#3#4#5{%
- \begingroup
- \def\skv@templist{}%
+\skvrobustdef*\skv@autocompletelist@h#1#2#3#4#5{%
+ \def\skv@completedlist@partial{}%
\edef\skv@lowerlower{\ifx\@nnil#3\@nnil\else\unexpanded{#3}, \fi}%
- \skv@foreach@ifloweralpha{#4}{%
+ \skvifloweralpha{#4}{%
\skv@foreach@swatrue
\ifx\@nnil#3\@nnil\else
- \skv@foreach@ifloweralpha{#3}{}\skv@foreach@swafalse
+ \skvifloweralpha{#3}{}\skv@foreach@swafalse
\fi
- \skv@foreach@ifloweralpha{#5}{}\skv@foreach@swafalse
+ \skvifloweralpha{#5}{}\skv@foreach@swafalse
\ifskv@foreach@swa
\ifx\@nnil#3\@nnil
- \def\skv@foreach@step{1}%
+ \def\skv@autocomplete@step{1}%
\else
- \edef\skv@foreach@step{\the\numexpr\lccode`#4-\lccode`#3}%
- \ifnum\skv@foreach@step=\skvz@
- \def\skv@foreach@step{1}%
- \skv@foreach@zerostepwarn{#3}{#4}{}%
+ \edef\skv@autocomplete@step{\the\numexpr\lccode`#4-\lccode`#3}%
+ \ifnum\skv@autocomplete@step=\skvz@
+ \def\skv@autocomplete@step{1}%
+ \skv@autocomplete@zerostepwarn{#3}{#4}{}%
\fi
\fi
\def\skv@isupperalpha{01}%
- % \skv@foreach@origunit remains nil on this branch:
- \skv@foreach@fillalphabetic{#1}{#4}{#5}\skv@templist
- % Also update the items already entered in \skv@foreach@filledlist.
- \skv@foreach@restoreguideandunit{#1}{#2}\skv@templist
+ % \skv@autocomplete@origunit remains nil on this branch.
+ \skv@autocomplete@fillalphabetic{#1}{#4}{#5}\skv@completedlist@partial
+ % Also update the items already entered in \skvcompletedlist.
+ \skv@autocomplete@restore{#1}{#2}\skv@completedlist@partial
\else
\skv@err{The tokens '\detokenize\expandafter{\skv@lowerlower#4, #5}'
\MessageBreak aren't of the same type}\skv@ehd
\fi
}{%
- \skv@foreach@ifupperalpha{#4}{%
+ \skvifupperalpha{#4}{%
\skv@foreach@swatrue
\ifx\@nnil#3\@nnil\else
- \skv@foreach@ifupperalpha{#3}{}\skv@foreach@swafalse
+ \skvifupperalpha{#3}{}\skv@foreach@swafalse
\fi
- \skv@foreach@ifupperalpha{#5}{}\skv@foreach@swafalse
+ \skvifupperalpha{#5}{}\skv@foreach@swafalse
\ifskv@foreach@swa
\ifx\@nnil#3\@nnil
- \def\skv@foreach@step{1}%
+ \def\skv@autocomplete@step{1}%
\else
- \edef\skv@foreach@step{\the\numexpr\uccode`#4-\uccode`#3}%
- \ifnum\skv@foreach@step=\skvz@
- \def\skv@foreach@step{1}%
- \skv@foreach@zerostepwarn{#3}{#4}{}%
+ \edef\skv@autocomplete@step{\the\numexpr\uccode`#4-\uccode`#3}%
+ \ifnum\skv@autocomplete@step=\skvz@
+ \def\skv@autocomplete@step{1}%
+ \skv@autocomplete@zerostepwarn{#3}{#4}{}%
\fi
\fi
\def\skv@isupperalpha{00}%
- % \skv@foreach@origunit remains nil on this branch:
- \skv@foreach@fillalphabetic{#1}{#4}{#5}\skv@templist
- \skv@foreach@restoreguideandunit{#1}{#2}\skv@templist
+ % \skv@autocomplete@origunit remains nil on this branch.
+ \skv@autocomplete@fillalphabetic{#1}{#4}{#5}\skv@completedlist@partial
+ \skv@autocomplete@restore{#1}{#2}\skv@completedlist@partial
\else
\skv@err{The tokens '\detokenize\expandafter{\skv@lowerlower#4, #5}'
\MessageBreak aren't of the same type}\skv@ehd
@@ -2576,32 +2510,30 @@
\skvifdimensionable{#3}{}\skv@foreach@swafalse
\fi
\skvifdimensionable{#4}{}\skv@foreach@swafalse
- \let\skv@foreach@origunit\skv@dimunit
+ \let\skv@autocomplete@origunit\skv@dimunit
\skvifdimensionable{#5}{}\skv@foreach@swafalse
- \ifx\skv@foreach@origunit\skv@dimunit\else
+ \ifx\skv@autocomplete@origunit\skv@dimunit\else
\skv@err{The units on \detokenize{'#4', '#5'} are different}\skv@ehd
\fi
\ifskv@foreach@swa
\ifx\@nnil#3\@nnil
- \def\skv@foreach@step{1pt}%
+ \def\skv@autocomplete@step{1pt}%
\else
- \edef\skv@foreach@step{\the\dimexpr#4-#3}%
- \ifdim\skv@foreach@step=\skvz@
- \def\skv@foreach@step{1pt}%
- \skv@foreach@zerostepwarn{#3}{#4}{pt}%
+ \edef\skv@autocomplete@step{\the\dimexpr#4-#3\relax}%
+ \ifdim\skv@autocomplete@step=\skvz@
+ \def\skv@autocomplete@step{1pt}%
+ \skv@autocomplete@zerostepwarn{#3}{#4}{pt}%
\fi
\fi
- \skvexpandsecond{%
- \skv@foreach@fillnumordim{#1}%
- }{%
- {#4}{#5}%
- }\skv@templist
- \skv@foreach@strippoint{#1}\skv@templist
+ \skvexpandsecond
+ {\skv@autocomplete@fillnumordim{#1}}{{#4}{#5}}%
+ \skv@completedlist@partial
+ \skv@autocomplete@strippoint{#1}\skv@completedlist@partial
% Attach the constant part to the elements of the completed list.
- % <lower1> was saved earlier in \skv@foreach@trypgflikeformat, and
+ % <lower1> was saved earlier in \skv@autocompletelist@e, and
% <lower2> and <upper> have been saved while filling the list.
% Always strip point and restore original unit here.
- \skv@foreach@restoreguideandunit{#1}{#2}\skv@templist
+ \skv@autocomplete@restore{#1}{#2}\skv@completedlist@partial
\else
\skv@foreach@swatrue
\ifx\@nnil#3\@nnil\else
@@ -2611,22 +2543,20 @@
\skvifdimensionable{#5pt}{}\skv@foreach@swafalse
\ifskv@foreach@swa
\ifx\@nnil#3\@nnil
- \def\skv@foreach@step{1pt}%
+ \def\skv@autocomplete@step{1pt}%
\else
- \edef\skv@foreach@step{\the\dimexpr#4pt-#3pt}%
- \ifdim\skv@foreach@step=\skvz@
- \def\skv@foreach@step{1pt}%
- \skv@foreach@zerostepwarn{#3}{#4}{pt}%
+ \edef\skv@autocomplete@step{\the\dimexpr#4pt-#3pt\relax}%
+ \ifdim\skv@autocomplete@step=\skvz@
+ \def\skv@autocomplete@step{1pt}%
+ \skv@autocomplete@zerostepwarn{#3}{#4}{pt}%
\fi
\fi
- % \skv@foreach@origunit remains nil on this branch:
- \skvexpandsecond{%
- \skv@foreach@fillnumordim{#1}%
- }{%
- {#4pt}{#5pt}%
- }\skv@templist
- \skv@foreach@strippoint{#1}\skv@templist
- \skv@foreach@restoreguideandunit{#1}{#2}\skv@templist
+ % \skv@autocomplete@origunit remains nil on this branch.
+ \skvexpandsecondonce
+ {\skv@autocomplete@fillnumordim{#1}}{{#4pt}{#5pt}}%
+ \skv@completedlist@partial
+ \skv@autocomplete@strippoint{#1}\skv@completedlist@partial
+ \skv@autocomplete@restore{#1}{#2}\skv@completedlist@partial
\else
\skv@err{Sorry, the tokens
'\detokenize\expandafter{\skv@lowerlower#4, #5}'
@@ -2637,110 +2567,62 @@
\fi
}%
}%
- \skvaftergroupdef\skv@foreach@filledlist\endgroup
-}
-
-% Restore guide and, in the case of numerical sequences, 'original unit'.
-%
-% \skv@foreach@restoreguideandunit{<parser>}{<guide>}{<listcmd>}
-\skvrobustdef*\skv@foreach@restoreguideandunit#1#2#3{%
- \def\do##1#1{%
- \ifx\do##1\else
- \edef\skv@foreach@filledlist{%
- \skvaddlist{#1}\skv@foreach@filledlist
- \if\skv@foreach@growleft
- ##1\skv@foreach@origunit\unexpanded{#2}%
- \else
- \unexpanded{#2}##1\skv@foreach@origunit
- \fi
- }%
- \expandafter\do
- \fi
- }%
- \expandafter\do#3#1\do#1%
}
-\skvrobustdef*\skv@foreach@getcomparator{%
+% \skv@autocomplete@fillnumordim<parser><lower><upper><listcmd>
+\skvrobustdef*\skv@autocomplete@fillnumordim#1#2#3#4{%
\begingroup
- % 'unit' isn't required in alphabetic sequences:
- \if\skv@inalphabetic\else
- \let\skvreversedo\@iden
- \edef\skv@provb{\skvexpbracenext\skvreverse{\skv@foreach@step}}%
- \def\skv@prova##1##2##3\skv@nil{%
- \skvxifinTF{,\detokenize{##2##1},}{,\skvoxdetok\skv@validunit,}{%
- \def\skv@foreach@unit{}%
- }{%
- \def\skv@foreach@unit{pt}%
- }%
- }%
- \expandafter\skv@prova\skv@provb\skv@nil
- \fi
- \def\skv@prova##1##2\skv@nil{%
- \edef\skv@foreach@stepisneg{0\if-##10\else1\fi}%
- }%
- \expandafter\skv@prova\skv@foreach@step\skv@nil
- \edef\skv@comparator{\if\skv@foreach@stepisneg>\else<\fi}%
- \let\do\skvcmdexit
- \skvexpanded{\endgroup
- \do\skv@foreach@stepisneg\do\skv@comparator
- \if\skv@inalphabetic\else\do\skv@foreach@unit\fi
- }%
-}
-% \skv@foreach@fillnumordim<parser><lower><upper><listcmd>
-\skvrobustdef*\skv@foreach@fillnumordim#1#2#3#4{%
- \begingroup
- \skv@foreach@getcomparator
- \if\skv@foreach@stepisneg
- \ifdim#3\skv@foreach@unit>#2\skv@foreach@unit\relax
- \skv@err{Step '\skv@foreach@step' is negative but upperbound
+ \skv@autocomplete@getcomparator
+ \if\skv@autocomplete@stepisneg
+ \ifdim#3\skv@autocomplete@unit>#2\skv@autocomplete@unit\relax
+ \skv@err{Step '\skv@autocomplete@step' is negative but upperbound
\MessageBreak '\detokenize{#3}' is greater than lowerbound
'\detokenize{#2}'}\skv@ehd
\fi
\else
- \ifdim#3\skv@foreach@unit<#2\skv@foreach@unit\relax
- \skv@err{Step '\skv@foreach@step' is nonnegative but upperbound
+ \ifdim#3\skv@autocomplete@unit<#2\skv@autocomplete@unit\relax
+ \skv@err{Step '\skv@autocomplete@step' is nonnegative but upperbound
\MessageBreak '\detokenize{#3}' is less than lowerbound
'\detokenize{#2}'}\skv@ehd
\fi
\fi
% The bounds may have decimal places. So the calculation has to be
% done with \dimexpr:
- \skv@foreach@addtolist{#1}{\the\dimexpr#2\skv@foreach@unit}#4%
- % Upper number:
- \edef\skv@tempa{\the\dimexpr#3\skv@foreach@unit}%
- % Lower number:
- \edef\skv@tempb{\the\dimexpr#2\skv@foreach@unit}%
- \ifdim\skv@tempa=\skv@tempb\relax\else
+ \edef\skv@upperlimit{\the\dimexpr#3\skv@autocomplete@unit}%
+ \edef\skv@lowerlimit{\the\dimexpr#2\skv@autocomplete@unit}%
+ \skv@autocomplete@addtolist{#1}\skv@lowerlimit#4%
+ \ifdim\skv@lowerlimit\skv@comparator\skv@upperlimit\relax
\def\do{%
- \edef\skv@tempb{%
- \the\dimexpr\skv@tempb+\skv@foreach@step\skv@foreach@unit\relax
+ \edef\skv@lowerlimit{%
+ \the\dimexpr\skv@lowerlimit
+ +\skv@autocomplete@step\skv@autocomplete@unit\relax
}%
- \ifdim\skv@tempb\skv@comparator\skv@tempa\relax
- \skv@foreach@addtolist{#1}{\skvexpandonce\skv@tempb}#4%
+ \ifdim\skv@lowerlimit\skv@comparator\skv@upperlimit\relax
+ \skv@autocomplete@addtolist{#1}\skv@lowerlimit#4%
\expandafter\do
\fi
}%
\do
- % The last item has to in 'pt', so that 'pt' can be stripped:
- \skv@foreach@addtolist{#1}{\the\dimexpr#3\skv@foreach@unit}#4%
+ % The last item has to in 'pt', so that 'pt' can be stripped.
+ % Hence \dimexpr.
+ \skv@autocomplete@addtolist{#1}\skv@upperlimit#4%
\fi
\skvaftergroupdef#4\endgroup
}
-
-% Fill Alpha or alpha:
-% \skv@foreach@fillalphabetic<parser><lower><upper><listcmd>
-\skvrobustdef*\skv@foreach@fillalphabetic#1#2#3#4{%
+% Fill Alpha or alpha.
+% \skv@autocomplete@fillalphabetic<parser><lower><upper><listcmd>
+\skvrobustdef*\skv@autocomplete@fillalphabetic#1#2#3#4{%
\begingroup
\def\skv@inalphabetic{00}%
- \skv@foreach@getcomparator
+ \skv@autocomplete@getcomparator
\edef\skv@type{%
\if\skv@isupperalpha Upper\else Lower\fi case alphabetic%
}%
- \edef\reserved@a{\if-\skv@foreach@step\else\skv@foreach@step\fi}%
+ \edef\reserved@a{\if-\skv@autocomplete@step\else\skv@autocomplete@step\fi}%
\skvoifinteger\reserved@a{}{%
\skv@err{List is '\skv@type' type but\MessageBreak
- step '\skv@foreach@step' isn't an integer}\skv@ehd
+ step '\skv@autocomplete@step' isn't an integer}\skv@ehd
}%
- \skv@foreach@addtolist{#1}{#2}#4%
+ \skv@autocomplete@addtolist{#1}{#2}#4%
\skvifstrcmpTF{#2}{#3}{}{%
\edef\skv@lowerlimit{#2}%
\edef\skv@upperlimit{#3}%
@@ -2752,22 +2634,229 @@
\edef\skv@upperlimit{%
\the\numexpr\skv@upperlimit-\if\skv@isupperalpha 64\else 96\fi
}%
- \edef\skv@charcase{\the\numexpr\skv@lowerlimit+\skv@foreach@step}%
+ \edef\skv@charcase{\the\numexpr\skv@lowerlimit+\skv@autocomplete@step}%
\skvrecurse
\if\skv@isupperalpha
\edef\skv@tempa{\skv@ucalpha\skv@charcase}%
\else
\edef\skv@tempa{\skv@lcalpha\skv@charcase}%
\fi
- \skv@foreach@addtolist{#1}\skv@tempa#4%
- \edef\skv@charcase{\the\numexpr\skv@charcase+\skv@foreach@step}%
+ \skv@autocomplete@addtolist{#1}\skv@tempa#4%
+ \edef\skv@charcase{\the\numexpr\skv@charcase+\skv@autocomplete@step}%
\while
\ifnum\skv@charcase\skv@comparator\skv@upperlimit\relax
\fi
- \skv@foreach@addtolist{#1}{#3}#4%
+ \skv@autocomplete@addtolist{#1}{#3}#4%
}%
\skvaftergroupdef#4\endgroup
}
+%
+% \skv@autocomplete@splitbeforedots{<parser>}{<list>}
+%
+% Get the one or two elements before '...' or before '<guide>,...'.
+%
+% {A_2pt,A_4pt,A_...pt,A_10pt} : no additional info. required
+% {a^1,a^3,a^...,a^9} : no additional info. required
+% {A_1,B_1,..._1,E_1} : no additional info. required
+% {1--,4--,...--,16--} : no additional info. required
+% {1pt,4pt,...pt,10pt} : no additional info. required
+% {A_2pt,A_4pt,A_...,A_10pt} : no additional info. required
+%
+% {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 no addit. info.
+% {A_2pt,A_4pt,...,A_10pt} : link = _, grow = right
+%
+% The items prior to the two before '<guide>...' or before '...'
+% are called 'all-before-the-two' (AB2). Collect in \skv@tempa the two
+% items before '<guide>...' or before '...' together with the rest of the
+% list. Save the AB2 items in \skvcompletedlist.
+%
+% Return \skvcompletedlist and \skv@tempa.
+%
+\skvrobustdef*\skv@autocomplete@splitbeforedots#1#2{%
+ % First count all the elements before '<guide><parser>...' or '...'.
+ % We're already sure that argument #2 contains '<guide><parser>...'
+ % or '...'. \skvcompletedlist has been initialized before here.
+ \begingroup
+ \skv@cnta\skvz@
+ \def\do##1#1{%
+ \skvifinTF{...}{##1}{%
+ % Gobble the rest:
+ \def\do####1\skv@nil{}%
+ }{%
+ \advance\skv@cnta\@ne
+ }%
+ \do
+ }%
+ \do#2#1\skv@nil
+ \ifnum\skv@cnta>\tw@
+ \@tempcnta\m@ne
+ \def\do##1#1{%
+ \advance\@tempcnta\@ne
+ \ifnum\@tempcnta=\numexpr\skv@cnta-\tw@\relax
+ \def\do####1\skv@nil{\def\skv@tempa{##1#1####1}}%
+ \else
+ \edef\skvcompletedlist{%
+ \skvaddlist{#1}\skvcompletedlist\unexpanded{##1}%
+ }%
+ \fi
+ \do
+ }%
+ \do#2#1\skv@nil
+ \else
+ \ifnum\skv@cnta=\@ne
+ % There is only one element before '<guide><parser>...' or '...'.
+ % Hence simply left-pad argument #2 with <parser> to give the
+ % impression of at least 2 elements:
+ \def\skv@tempa{#1#2}%
+ \else
+ \ifnum\skv@cnta=\tw@
+ \def\skv@tempa{#2}%
+ \else
+ \ifnum\skv@cnta=\skvz@
+ \skv@err{List <<\detokenize{#2}>>\MessageBreak
+ contains symbol '...' but not a lowerbound}\skv@ehd
+ \fi
+ \fi
+ \fi
+ \fi
+ \skvexpanded{\endgroup
+ \skvcmdexit\skvcompletedlist\skvcmdexit\skv@tempa
+ }%
+}
+% \skv@autocomplete@splitandgrow{<parser>}{<lower1>}{<lower2>}{<upperbound>}
+%
+% {0\pi,0.5\pi,...,3\pi} : link = \pi ; grow left
+% {1--,4--,...,10--} : link = -- ; grow left
+% {2pt,4pt,...,10pt} : link = pt ; grow left (or no additional info.)
+% {A_1,C_1,...,Q_1} : link = _ ; grow left
+% {2^a,2^c,...,2^q} : link = ^ ; grow right
+%
+% 1. Providing the link avoids the need to use the syntax of PGF's
+% \foreach, such as {0\pi,0.5\pi,...\pi,3\pi}. But skeyval can also
+% autocomplete lists like {0\pi,0.5\pi,...\pi,3\pi}.
+% 2. We already know that the key 'link' will reject empty values.
+%
+\skvrobustdef*\skv@autocomplete@splitandgrow#1#2#3#4{%
+ \ifx\skv@autocomplete@growleft\skv@autocomplete@growright
+ \skv@err{I can't grow the list in both directions.
+ \MessageBreak Maybe you haven't indicated the
+ \MessageBreak direction of growth (left or right),
+ \MessageBreak or both directions are 'true'.}
+ {Try one of the keys 'grow=left or right',
+ \MessageBreak 'grow left=true or false',
+ 'grow right=true or false'}\skv@ehd
+ \fi
+ \begingroup
+ \def\skv@prova##1{%
+ \skv@foreach@swatrue
+ \skviflacus#2\then\else
+ \skvifinTF{##1}{#2}{}\skv@foreach@swafalse
+ \fi
+ \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
+ '\detokenize\expandafter{\skv@provb#3, #4}'}\skv@ehd
+ \fi
+ \def\skv@prova####1##1####2\skv@nil{%
+ \if\skv@autocomplete@growright
+ \edef\skv@prova{\skvtrimspace{####1##1}}%
+ \else
+ \edef\skv@prova{\skvtrimspace{##1####2}}%
+ \fi
+ \def\do########1{{\skvtrimspace{########1}}}%
+ % \skv@autocompletelist@f<parser><guide><lower1><lower2><upper>
+ \skvexpanded{\endgroup
+ \noexpand\skv@autocompletelist@f
+ {\unexpanded{#1}}{\skvexpandonce\skv@prova}\do{#2}\do{#3}\do{#4}%
+ }%
+ }%
+ \skv@prova#3\skv@nil
+ }%
+ \expandafter\skv@prova\expandafter{\skv@autocomplete@link}%
+}
+\skvrobustdef*\skv@autocomplete@getcomparator{%
+ \begingroup
+ % <unit> isn't required in alphabetic sequences:
+ \if\skv@inalphabetic\else
+ \let\skvreversedo\@iden
+ \edef\skv@provb{\skvexpbracenext\skvreverse\skv@autocomplete@step}%
+ \def\skv@prova##1##2##3\skv@nil{%
+ \skvxifinTF{,\detokenize{##2##1},}{,\skvoxdetok\skv@validunit,}{%
+ % That is, the sequence is made up of dimensions.
+ \def\skv@autocomplete@unit{}%
+ }{%
+ \def\skv@autocomplete@unit{pt}%
+ }%
+ }%
+ \expandafter\skv@prova\skv@provb\skv@nil
+ \fi
+ % You can't use \ifnum or \ifdim here, since for alphanumeric sequences
+ % \skv@autocomplete@step isn't a dimension.
+ \def\skv@prova##1##2\skv@nil{%
+ \edef\skv@autocomplete@stepisneg{0\if-##10\else1\fi}%
+ }%
+ \expandafter\skv@prova\skv@autocomplete@step\skv@nil
+ \edef\skv@comparator{\if\skv@autocomplete@stepisneg>\else<\fi}%
+ \let\do\skvcmdexit
+ \skvexpanded{\endgroup
+ \do\skv@autocomplete@stepisneg\do\skv@comparator
+ \if\skv@inalphabetic\else\do\skv@autocomplete@unit\fi
+ }%
+}
+\begingroup
+\catcode`P=12 \lccode`P=112
+\catcode`T=12 \lccode`T=116
+\lowercase{\endgroup
+ \def\skv@autocomplete@strippoint#1#2{%
+ \def\reserved@a##1#1\relax{\def#2{##1}}%
+ \def\do##1.##2PT#1{%
+ \ifx\do##1\else##1%
+ \if\skv@autocomplete@keephighdecimals
+ \ifdim.##2pt>.5pt\relax##2\fi
+ \else
+ \if\skv@autocomplete@keepdecimals
+ \ifnum##2>\skvz@.##2\fi
+ \fi
+ \fi
+ \unexpanded{#1}%
+ \expandafter\do
+ \fi
+ }%
+ \edef#2{\expandafter\do#2#1\do.PT#1}%
+ \expandafter\reserved@a#2\relax
+ }
+}
+% \skv@autocomplete@restore{<parser>}{<guide>}{<listcmd>}
+%
+% Restore guide and, in the case of dimension sequences, 'original unit'.
+%
+\skvrobustdef*\skv@autocomplete@restore#1#2#3{%
+ \if\skv@preandpostdotspresent
+ % Leave it: <predots> and <postdots> will be restored in
+ % \skv@autocompletelist@g.
+ \else
+ \def\do##1#1{%
+ \ifx\do##1\else
+ \edef\skvcompletedlist{%
+ \skvaddlist{#1}\skvcompletedlist
+ \if\skv@autocomplete@growleft
+ ##1\skv@autocomplete@origunit\unexpanded{#2}%
+ \else
+ \unexpanded{#2}##1\skv@autocomplete@origunit
+ \fi
+ }%
+ \expandafter\do
+ \fi
+ }%
+ \expandafter\do#3#1\do#1%
+ \fi
+}
+
\skv@for@restorecatcodes
\endinput
diff --git a/Master/texmf-dist/tex/latex/skeyval/skeyval-ltxcmds.tex b/Master/texmf-dist/tex/latex/skeyval/skeyval-ltxcmds.tex
index 0235cf5bfb1..30accb688a6 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.2, 2013/02/10. %
+% This is file 'skeyval-ltxcmds.tex', version 1.3, 2013/05/15. %
% %
% This package and accompanying files may be distributed and/or %
% modified under the conditions of the LaTeX Project Public License, %
@@ -18,10 +18,11 @@
% The following files constitute the skeyval bundle and must be %
% distributed as a whole: %
% %
-% readme, skeyval.sty, skeyval-core.tex, skeyval-for.tex, %
+% README, skeyval.sty, skeyval-core.tex, skeyval-for.tex, %
% skeyval-view.sty, skeyval-ltxpatch.sty, skeyval-ltxcmds.tex, %
% skeyval-pstkey.sty, skeyval-pstkey.tex, skeyval-testclass.cls, %
-% and skeyval-testpkg.sty. %
+% skeyval-testpkg.sty, skeyval-pokayoke1, skeyval-pokayoke2, %
+% skeyval-view-pokayoke1. %
% %
% Copyright (c) 2010-2013 Ahmed Musa (amusa22@gmail.com). %
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
@@ -58,7 +59,7 @@
\csname skeyval-ltxcmds-loaded\endcsname
\expandafter\let\csname skeyval-ltxcmds-loaded\endcsname\endinput
-\message{skeyval-ltxcmds 2013/02/10 v1.2 skeyval LaTeX header (AM)}
+\message{skeyval-ltxcmds 2013/05/15 v1.3 LaTeX header for skeyval (AM)}
\countdef\m@ne=22 \m@ne=-1
\def\wlog{\immediate\write\m@ne}
diff --git a/Master/texmf-dist/tex/latex/skeyval/skeyval-ltxpatch.sty b/Master/texmf-dist/tex/latex/skeyval/skeyval-ltxpatch.sty
index 3bea153e722..fee051aa615 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.2, 2013/02/10. %
+% This is file 'skeyval-ltxpatch.sty', version 1.3, 2013/05/15. %
% %
% The rationale for this package: the patch in 'xkvltxp' package isn't %
% strong enough. %
@@ -21,10 +21,11 @@
% The following files constitute the skeyval bundle and must be %
% distributed as a whole: %
% %
-% readme, skeyval.sty, skeyval-core.tex, skeyval-for.tex, %
+% README, skeyval.sty, skeyval-core.tex, skeyval-for.tex, %
% skeyval-view.sty, skeyval-ltxpatch.sty, skeyval-ltxcmds.tex, %
-% skeyval-pstkey.sty, skeyval-pstkey.tex, skeyval-testclass.sty, %
-% and skeyval-testpkg.sty. %
+% skeyval-pstkey.sty, skeyval-pstkey.tex, skeyval-testclass.cls, %
+% skeyval-testpkg.sty, skeyval-pokayoke1, skeyval-pokayoke2, %
+% skeyval-view-pokayoke1. %
% %
% Copyright (c) 2010-2013 Ahmed Musa (amusa22@gmail.com). %
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
@@ -72,7 +73,7 @@
\NeedsTeXFormat{LaTeX2e}[2011/06/27]
\ProvidesPackage{skeyval-ltxpatch}
- [2013/02/10 v1.2 Patches for LaTeX2e kernel options processing (AM)]
+ [2013/05/15 v1.3 Patches for LaTeX2e kernel options processing (AM)]
\ifdefined\skvz@\else\newdimen\skvz@\fi
\def\@space{ }
diff --git a/Master/texmf-dist/tex/latex/skeyval/skeyval-pstkey.sty b/Master/texmf-dist/tex/latex/skeyval/skeyval-pstkey.sty
index c3f458644e6..caa843aafe1 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.2, 2013/02/10. %
+% This is file 'skeyval-pstkey.sty', version 1.3, 2013/05/15. %
% %
% This package and accompanying files may be distributed and/or %
% modified under the conditions of the LaTeX Project Public License, %
@@ -18,10 +18,11 @@
% The following files constitute the skeyval bundle and must be %
% distributed as a whole: %
% %
-% readme, skeyval.sty, skeyval-core.tex, skeyval-for.tex, %
+% README, skeyval.sty, skeyval-core.tex, skeyval-for.tex, %
% skeyval-view.sty, skeyval-ltxpatch.sty, skeyval-ltxcmds.tex, %
% skeyval-pstkey.sty, skeyval-pstkey.tex, skeyval-testclass.cls, %
-% and skeyval-testpkg.sty. %
+% skeyval-testpkg.sty, skeyval-pokayoke1, skeyval-pokayoke2, %
+% skeyval-view-pokayoke1. %
% %
% Copyright (c) 2010-2013 Ahmed Musa (amusa22@gmail.com). %
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
@@ -69,7 +70,7 @@
\NeedsTeXFormat{LaTeX2e}[2011/06/27]
\ProvidesPackage{skeyval-pstkey}
- [2013/02/10 v1.2 LaTeX/package wrapper for skeyval-pstkey.tex (AM)]
+ [2013/05/15 v1.3 LaTeX/package wrapper for skeyval-pstkey.tex (AM)]
\expandafter\ifx\csname skeyval-pstkey-loaded\endcsname
\endinput\else
diff --git a/Master/texmf-dist/tex/latex/skeyval/skeyval-pstkey.tex b/Master/texmf-dist/tex/latex/skeyval/skeyval-pstkey.tex
index 4e2dc1f9ad7..18a97c4e729 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.2, 2013/02/10. %
+% This is file 'skeyval-pstkey.tex', version 1.3, 2013/05/15. %
% %
% This package and accompanying files may be distributed and/or %
% modified under the conditions of the LaTeX Project Public License, %
@@ -18,10 +18,11 @@
% The following files constitute the skeyval bundle and must be %
% distributed as a whole: %
% %
-% readme, skeyval.sty, skeyval-core.tex, skeyval-for.tex, %
+% README, skeyval.sty, skeyval-core.tex, skeyval-for.tex, %
% skeyval-view.sty, skeyval-ltxpatch.sty, skeyval-ltxcmds.tex, %
% skeyval-pstkey.sty, skeyval-pstkey.tex, skeyval-testclass.cls, %
-% and skeyval-testpkg.sty. %
+% skeyval-testpkg.sty, skeyval-pokayoke1, skeyval-pokayoke2, %
+% skeyval-view-pokayoke1. %
% %
% Copyright (c) 2010-2013 Ahmed Musa (amusa22@gmail.com). %
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
@@ -58,33 +59,33 @@
\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}
+\def\skv@pst@afterfi#1\fi{\fi#1}
+\def\skv@pst@afterelse#1\else#2\fi{\fi#1}
-\ifx\ProvidesFile\@undefined\skv@@afterelse
- \message{File 'skeyval-pstkey.tex' 2013/02/10 v1.2
+\ifx\ProvidesFile\@undefined\skv@pst@afterelse
+ \message{File 'skeyval-pstkey.tex' 2013/05/15 v1.3
PSTricks specialization of skeyval package (AM)}
\input skeyval-core
-\else\skv@@afterfi
+\else\skv@pst@afterfi
\ProvidesFile{skeyval-pstkey.tex}
- [2013/02/10 v1.2 PSTricks specialization of skeyval (AM)]
+ [2013/05/15 v1.3 PSTricks specialization of skeyval (AM)]
\@addtofilelist{skeyval-pstkey.tex}
\@ifpackageloaded{skeyval}{}{\RequirePackage{skeyval}}
\fi
\def\pst@famlist{}
\def\pst@addfams#1{%
- \skvcommaloop{#1}\skvtempa{%
- \skvxifin{,\skvtempa,}{,\pst@famlist,}{}{%
- \edef\pst@famlist{\pst@famlist,\skvtempa}%
+ \skvcommaloop{#1}\skv@tempa{%
+ \skvxifin{,\skv@tempa,}{,\pst@famlist,}{}{%
+ \edef\pst@famlist{\pst@famlist,\skv@tempa}%
}%
}%
}
\def\psset{\skvexpandbracenext{\skv@testopt\pss@t}\pst@famlist}
\def\pss@t[#1]#2{\skvsetkeys+[psset]{#1}{#2}\ignorespaces}
\def\@psset#1,\@nil{%
- \edef\skvtempa{\skvsetkeys+[psset]{\pst@famlist}}%
- \skvtempa{#1}%
+ \edef\skv@tempa{\skvsetkeys+[psset]{\pst@famlist}}%
+ \skv@tempa{#1}%
}
\skv@pst@restorecatcodes
diff --git a/Master/texmf-dist/tex/latex/skeyval/skeyval-testclass.cls b/Master/texmf-dist/tex/latex/skeyval/skeyval-testclass.cls
new file mode 100644
index 00000000000..771d60160fe
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/skeyval/skeyval-testclass.cls
@@ -0,0 +1,321 @@
+%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
+% This is file 'skeyval-testclass.cls', version 1.3, 2013/05/15. %
+% %
+% This package and accompanying files may be distributed and/or %
+% modified under the conditions of the LaTeX Project Public License, %
+% either version 1.3 of this license or any later version. The latest %
+% version of this license is in http://www.latex-project.org/lppl.txt %
+% and version 1.3 or later is part of all distributions of LaTeX %
+% version 2005/12/01 or later. %
+% %
+% The LPPL maintenance status of this software is 'author-maintained'. %
+% %
+% This software is provided 'as it is', without warranty of any kind, %
+% either expressed or implied, including, but not limited to, the %
+% implied warranties of merchantability and fitness for a particular %
+% purpose. %
+% %
+% The following files constitute the skeyval bundle and must be %
+% distributed as a whole: %
+% %
+% README, skeyval.sty, skeyval-core.tex, skeyval-for.tex, %
+% skeyval-view.sty, skeyval-ltxpatch.sty, skeyval-ltxcmds.tex, %
+% skeyval-pstkey.sty, skeyval-pstkey.tex, skeyval-testclass.cls, %
+% skeyval-testpkg.sty, skeyval-pokayoke1, skeyval-pokayoke2, %
+% skeyval-view-pokayoke1. %
+% %
+% Copyright (c) 2010-2013 Ahmed Musa (amusa22@gmail.com). %
+%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
+
+\ProvidesClass{skeyval-testclass}[2013/05/15 v1.3 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}}
+
+\ifdefined\skvtestcnt\else\newcount\skvtestcnt\fi
+\skvatbegineverypage{\skvcl@maybewm}
+\let\skvcl@maybewm\relax
+\def\skvcl@watermark{%
+ \tikz[overlay,remember picture]{%
+ \node [\skvcl@watermarkcolor,inner sep=0pt,rotate=45,align=center,
+ scale=\skvcl@watermarkscale,font=\fontseries{b}\fontfamily{bch}%
+ \fontsize{\skvcl@fontsize@a}{\skvcl@fontsize@b}\selectfont] at
+ ([shift={(\skvcl@watermarkxshift,-\skvcl@watermarkyshift)}]%
+ current page.north west){%
+ \skvcl@watermarktext
+ };
+ }%
+}
+
+\skvrobustdef*\skvcl@titlecmds{%
+ \setcounter{footnote}{0}%
+ \def\do##1{\global\let##1\@empty}%
+ \do\@thanks\do\@author\do\@date\do\@title
+ \def\do##1{\global\let##1\relax}%
+ \do\thanks\do\maketitle\do\@maketitle\do\title\do\author\do
+ \date\do\and\let\do\relax
+ \let\@fnsymbol\orig@fnsymbol
+}
+\let\orig@fnsymbol\@fnsymbol
+
+\skvrobustredef*\skv@fnsymbol#1{%
+ \unskip\ifcase#1\or\ding{'106}\or\ding{'110}\or\ding{'111}\or
+ \ding{'112}\or\ding{'113}\or\ding{'114}\or\ding{'121}\or
+ \ding{'122}\else\@ctrerr\fi
+}
+\skvrobustdef*\skvcl@newfootnotestyle{%
+ \def\@makefnmark{%
+ \rlap{\@textsuperscript{\normalfont\skv@fnsymbol\@thefnmark}}%
+ }%
+ \long\def\@makefntext##1{%
+ \parindent1em\relax\noindent
+ \hb@xt@1.8em{\hss\@textsuperscript{%
+ \normalfont\skv@fnsymbol\@thefnmark}%
+ }%
+ ##1%
+ }%
+}
+\skvnewlet\skv@sav@footnote\footnote
+\skvnewlet\skv@sav@thanks\thanks
+\AtEndOfPackage{%
+ \skvdisablekeys[SKVC]{title}{insertwatermark}%
+}
+\AtBeginDocument{%
+ \def\footnote{\unskip\skv@sav@footnote}%
+ \def\thanks{\unskip\skv@sav@thanks}%
+ \skvdisablekeys[SKVC]{textemphasis}{dummy-option}%
+ \skvdisablekeys[SKVC]{title}{%
+ maketitlepage,firstpagenumber,pagenumberstyle
+ }%
+}
+\let\skvcl@settitlepageno\@gobble
+
+% Example of option and nonoption keys:
+\skvordkeys[KV]{fam}{testkey1,testkey2}[value]{}
+\skvoptionkeys[KV]{fam}{testkey1}
+\skvnonoptionkeys[KV]{fam}{testkey2}
+
+% LaTeX will zap spaces in key name, anyway. So our options don't have
+% spaces within themselves.
+
+\directkeys*{%
+ .every unknown option={
+ \PassOptionsToClass{\CurrentOption}{article}
+ },
+ .message type when disabled option is invoked=error,
+ .prefix=SKVC,
+ % Extended text emphasis:
+ .family=textemphasis,
+ .hp=xem@,
+ .new options={
+ .initialize keys after define,
+ .ord/{testkey1,testkey2,testkey3}/default,
+ .bool/useitalic/true,
+ .bool/usebold/true,
+ .bool/usecolor/true,
+ .cmd/color/red,
+ .bool/make-textemphasis-inactive/true/
+ \ifskvindef\else
+ \skvifbool xem@make-textemphasis-inactive\then
+ \PackageInfo{skeyval-testclass}
+ {Extended text emphasis has been made inactive}
+ \let\xem\emph
+ \fi
+ \fi
+ ,
+ .ord/dummy-option/\@nil,
+ },
+ .links={
+ useitalics/useitalic,
+ usecolour/usecolor,
+ colour/color,
+ },
+ .option keys = {testkey1},
+ .nonoption keys = {testkey2,testkey3},
+ % Modifying the article title:
+ .change family=title,
+ .hp=skvcl@,
+ .new options={
+ .bool/putdate/true,
+ .cmd/datefont/\large,
+ .bool/clearpage/true,
+ .bool/maketitlepage/true/
+ \skvifbool skvcl@maketitlepage\then
+ \ifskvindef\else
+ \PassOptionsToClass{titlepage}{article}
+ \fi
+ \fi
+ ,
+ .cmd/firstpagenumber/\@nil/
+ \ifx\skvcl@firstpagenumber\@nnil\else
+ \skvensureinteger{page number}\skvcl@firstpagenumber
+ \AtBeginDocument{%
+ \gdef\pagenumbering##1{%
+ \global\c@page\skvcl@firstpagenumber\relax
+ \gdef\thepage{\csname @##1\endcsname\c@page}%
+ }%
+ % Default:
+ \pagenumbering{arabic}%
+ \let\skvcl@settitlepageno\@iden
+ }%
+ \fi
+ ,
+ .cmd/pagenumberstyle/\@nil/
+ \ifx\skvcl@pagenumberstyle\@nnil\else
+ \skvafterbegindocument{\pagenumbering{#1}}%
+ \fi
+ ,
+ .cmd/pretitleskip/10pt,
+ .cmd/posttitleskip/10pt,
+ .cmd/authorfont/\large,
+ .cmd/titlefont/\huge,
+ .bool/insertwatermark/true/
+ \skvifbool skvcl@insertwatermark\then
+ \ifskvindef\else
+ \let\skvcl@maybewm\skvcl@watermark
+ \fi
+ \fi
+ ,
+ .cmd/watermarkxshift/.5\paperwidth,
+ .cmd/watermarkyshift/.5\paperheight,
+ .cmd/watermarktext/DRAFT/
+ \skvstripouterbraces{2}\skvcl@watermarktext
+ ,
+ .cmd/fontsize/{14.4,17}/
+ \def\skvcl@fontsize@a{#1}\def\skvcl@fontsize@b{#2}
+ ,
+ .arg/fontsize/{#1,#2},
+ .cmd/watermarkscale/5,
+ .cmd/watermarkcolor/gray!55,
+ },
+ .slots={
+ showdate/putdate=#1,
+ first-page-number/firstpagenumber=#1,
+ titlepage/maketitlepage=#1,
+ },
+ % Ececute the options in the current family. If any of the options
+ % isn't found, report error (ie, don't save the key to the list of
+ % 'remaining keys'). Unknown options should be flagged immediately.
+ % Use '.execute options+' or '.execute options in all families' to
+ % execute options in multiple families.
+ .execute options={
+ putdate,datefont,clearpage=false,pretitleskip,posttitleskip,
+ authorfont,titlefont,watermarkscale,firstpagenumber,
+ insertwatermark=false,watermarkxshift,watermarkyshift,
+ watermarktext,watermarkcolor,fontsize
+ },
+ .families={textemphasis,title},
+ .process options in all families,
+}
+%\show\skvcurrentpoxkeys
+
+% testkey1 is an option key: don't set it outside option list:
+% \skvsetkeys[SKVC]{textemphasis}{testkey1}
+
+\skvrobustdef*\setupskvtestclass{%
+ \skvsetkeys*+[SKVC]{textemphasis,title}%
+}
+
+% Setting up extended text emphasis:
+\skvrobustdef*\setuptextemphasis#1{\skvsetkeys[SKVC]{textemphasis}{#1}}
+\newcommand*\xem[1]{\xem@emph{\xem@bold{\xem@colortext{\xem@color}{#1}}}}
+\newcommand*\xem@emph{%
+ \skvifbool xem@useitalic\then
+ \expandafter\emph
+ \else
+ \expandafter\@firstofone
+ \fi
+}
+\newcommand*\xem@bold{%
+ \skvifbool xem@usebold\then
+ \expandafter\textbf
+ \else
+ \expandafter\@firstofone
+ \fi
+}
+\newcommand*\xem@colortext{%
+ \skvifbool xem@usecolor\then
+ \expandafter\textcolor
+ \else
+ \expandafter\@secondoftwo
+ \fi
+}
+
+\LoadClass{article}
+
+\if@titlepage
+ \renewcommand\maketitle{%
+ \ifskvcl@clearpage
+ \clearpage
+ \fi
+ \begin{titlepage}%
+ \skvcl@newfootnotestyle
+ \let\footnotesize\small
+ \let\footnoterule\relax
+ \let\footnote\thanks
+ \null\vfil
+ \vskip\skvcl@pretitleskip\relax
+ \begin{center}%
+ {\skvcl@titlefont\@title\par}%
+ \vskip\skvcl@posttitleskip\relax
+ {%
+ \skvcl@authorfont
+ \lineskip.75em\relax
+ \begin{tabular}[t]{c}%
+ \@author
+ \end{tabular}\par
+ }%
+ \vskip1.5em\relax
+ \skvifbool skvcl@putdate\then{{\skvcl@datefont\@date}}\fi
+ \end{center}\par
+ \@thanks
+ \vfil\null
+ \end{titlepage}%
+ \skvcl@settitlepageno{\c@page\skvcl@firstpagenumber\relax}%
+ \skvcl@titlecmds
+ }
+\else
+ \renewcommand\maketitle{%
+ \par
+ \begingroup
+ \skvcl@newfootnotestyle
+ \if@twocolumn
+ \ifnum\col@number=\@ne
+ \@maketitle
+ \else
+ \twocolumn[\@maketitle]%
+ \fi
+ \else
+ \newpage
+ \global\@topnum\z@
+ \@maketitle
+ \fi
+ \thispagestyle{plain}\@thanks
+ \endgroup
+ \skvcl@titlecmds
+ }
+ \def\@maketitle{%
+ \newpage
+ \null
+ \vskip\skvcl@pretitleskip\relax
+ \begin{center}%
+ \let\footnote\thanks
+ {\skvcl@titlefont\@title\par}%
+ \vskip\skvcl@posttitleskip\relax
+ {\skvcl@authorfont
+ \lineskip.5em\relax
+ \begin{tabular}[t]{c}%
+ \@author
+ \end{tabular}\par
+ }%
+ \vskip1em\relax
+ \skvifbool skvcl@putdate\then{\skvcl@datefont\@date}\fi
+ \end{center}%
+ \par
+ \vskip1.5em\relax
+ }
+\fi
+
+\endinput
diff --git a/Master/texmf-dist/tex/latex/skeyval/skeyval-testpkg.sty b/Master/texmf-dist/tex/latex/skeyval/skeyval-testpkg.sty
new file mode 100644
index 00000000000..23a949e4831
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/skeyval/skeyval-testpkg.sty
@@ -0,0 +1,456 @@
+%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
+% This is file 'skeyval-testpkg.sty', version 1.3, 2013/05/15. %
+% %
+% This package and accompanying files may be distributed and/or %
+% modified under the conditions of the LaTeX Project Public License, %
+% either version 1.3 of this license or any later version. The latest %
+% version of this license is in http://www.latex-project.org/lppl.txt %
+% and version 1.3 or later is part of all distributions of LaTeX %
+% version 2005/12/01 or later. %
+% %
+% The LPPL maintenance status of this software is 'author-maintained'. %
+% %
+% This software is provided 'as it is', without warranty of any kind, %
+% either expressed or implied, including, but not limited to, the %
+% implied warranties of merchantability and fitness for a particular %
+% purpose. %
+% %
+% The following files constitute the skeyval bundle and must be %
+% distributed as a whole: %
+% %
+% README, skeyval.sty, skeyval-core.tex, skeyval-for.tex, %
+% skeyval-view.sty, skeyval-ltxpatch.sty, skeyval-ltxcmds.tex, %
+% skeyval-pstkey.sty, skeyval-pstkey.tex, skeyval-testclass.cls, %
+% skeyval-testpkg.sty, skeyval-pokayoke1, skeyval-pokayoke2, %
+% skeyval-view-pokayoke1. %
+% %
+% Copyright (c) 2010-2013 Ahmed Musa (amusa22@gmail.com). %
+%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
+
+\ProvidesPackage{skeyval-testpkg}
+ [2013/05/15 v1.3 skeyval test package (AM)]
+\NeedsTeXFormat{LaTeX2e}
+\@ifpackageloaded{skeyval}{}{\RequirePackage{skeyval}}
+\RequirePackage{graphicx}
+
+\skvdisabledkeysmessagetype{warning}
+
+%%++++++++++++++++ Passing options to packages +++++++++++++++++++%%
+
+\skvdeclarebooloption[SKVT]<testpkg>[skvtp@]{verbose}[true]{}
+
+% Declare options with default values that will be used when the options
+% are called without user values.
+%
+\skvdeclarepassedoptionsloadpackage[SKVT]{testpkg}{%
+ hyperref={colorlinks,breaklinks},xcolor=svgnames
+}
+
+%%+++++++++++++++++++ Producing arbitrary texts +++++++++++++++++%%
+
+% The key 'align' could have defined using \skvchoicekey, as in
+% 'shadowbox' family below.
+\newcommand*\justified{}
+\skvordkey[SKVT]{abrtext}{align}[right]{%
+ \skvifcase\skvxifstrcmpTF{#1}
+ {left}{\def\mpfalign{flushleft}}
+ {right}{\def\mpfalign{flushright}}
+ {center}{\def\mpfalign{center}}
+ {justified}{\def\mpfalign{justified}}
+ \elsedo
+ \PackageError{skeyval-testpkg}
+ {Invalid value `#1' for align}
+ {You have issued an illegal value `#1' for option `align'.}%
+ \endif
+}
+
+\skvzcmdkey[SKVT]{abrtext}[mpf]{text style}[\rmfamily]{}
+\skvcmdkey[SKVT]{abrtext}[mpf]{author}[Karl Berry]{}
+\skvzboolkey[SKVT]{abrtext}[mpf]{show author}[true]{}
+
+% Using pointers to expand values of keys while setting keys:
+\def\alignval{right}
+\def\alignvalb{\alignval}
+\def\stextstyle{\sffamily}
+
+\skvsetkeys[SKVT]{abrtext}{
+ align=.expand twice{\alignvalb},
+ text style=.expand once{\stextstyle},author,show author
+}
+
+%%+++++++++++++++++++++++++++ Citations +++++++++++++++++++++++++++%%
+
+% Keys defined by \skvdefinekeys are automatically initialiized when
+% the option 'initialize' is true. In general, to save initialize
+% key values at key definition, you need to call \skvsaveinitialvaluekeys
+% before defining the keys.
+
+\skvsaveinitialvaluekeys[SKVT]{citation}{put frame,width,show author,author,
+ textcolor,fonttype,leftmargin,rightmargin,preskip,framecolor,shadecolor,
+ frame thickness}
+
+\newbox\skv@testbox
+\skvdefinekeys*[SKVT]{citation}[ctt@]{%
+ .cmd/width/\hsize,
+ .zbool/show author/true,
+ .cmd/author//, % empty default
+ .zbool/put frame/true,
+ .cmd/framecolor/black,
+ .cmd/shadecolor/white,
+ .cmd/textcolor/black,
+ .zcmd/frame thickness/.4pt,
+ .cmd/fonttype/\normalfont,
+ .cmd/leftmargin/\leftmargin,
+ .cmd/rightmargin/\rightmargin,
+ .cmd/preskip/0ex,
+ .cmd/width/\textwidth,
+ .ord/dummy key/\@nil,
+}
+% Keys defined by \skvdefinekeys are automatically initialiized when
+% the option 'initialize' is true. When \skvsaveinitialvaluekeys has been
+% called for a set of keys, those keys can be initialized via
+% \skvinitializekeys:
+\skvinitializekeys[SKVT]{citation}[dummy key]
+
+\newcommand\newcitation[2][]{%
+ \skvsetkeys[SKVT]{citation}{#1}%
+ \sbox\skv@testbox{%
+ \ctt@fonttype
+ \textit{\textcolor{\ctt@textcolor}{\ctt@author}}%
+ }%
+ \list{}{%
+ \setlength\leftmargin{\ctt@leftmargin}%
+ \setlength\rightmargin{\ctt@leftmargin}%
+ }%
+ \vspace*{\ctt@preskip}%
+ \item\relax
+ \ifctt@putframe
+ \begingroup
+ \fboxrule\ctt@framethickness\relax
+ \fcolorbox{\ctt@framecolor}{\ctt@shadecolor}{%
+ \fi
+ \parbox{\ctt@width}{%
+ \ctt@fonttype\textcolor{\ctt@textcolor}{\ignorespaces#2}%
+ \ifctt@showauthor
+ \hspace*{\fill}\nolinebreak[1]%
+ \quad\hspace*{\fill}\finalhyphendemerits\z@\relax
+ \usebox\skv@testbox
+ \fi
+ }%
+ \ifctt@putframe}\endgroup\fi
+ \endlist
+ % Restore default values of keys:
+ \skvinitializekeys[SKVT]{citation}[]
+}
+
+
+%%++++++++++++++++++++++++ Shadow boxes ++++++++++++++++++++++%%
+
+\newdimen\shadowspread
+
+\skvdefinekeys*[SKVT]{shadowbox}[shb@]{%
+ .zbool/put frame/true,
+ .bool/shadow/true,
+ .cmd/framecolor/black,
+ .cmd/shadecolor/white,
+ .cmd/shadowcolor/gray!55,
+ .cmd/boxwidth/1.5cm,
+ .ord/framesize/.5pt/\def\currfboxrule{#1},
+ .ord/shadowsize/2pt/\shadowspread=\dimexpr#1\relax,
+ .choice/align/center/{%
+ 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
+ }
+}
+
+\skvdefinekeys*[SKVT]{testfam}[shb@]{%
+ .zbool/put shadow/true,% Test zbool
+ .zcmd/shade color/gray!55, % Test .zcmd
+}
+
+\skvdisablekeys[SKVT]{testfam}{put shadow, shade color}
+
+% 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=1.5cm,align=center,
+ shadecolor=gray!15
+}
+
+\skvpostsetkeys[SKVT]{shadowbox}{%
+ shadow=.use value{put frame},shadowcolor=.use value{framecolor}!40,
+ shadowsize=\dimexpr.use value{framesize}*5\relax
+}
+
+\newcommand*\newshadowbox[2][]{%
+ \skvsetkeys[SKVT]{shadowbox}{#1}%
+ \begingroup
+ \ifshb@putframe
+ \fboxrule=\dimexpr\currfboxrule\relax
+ \else
+ \fboxrule=0pt
+ \fi
+ \ifshb@shadow\else\shadowspread=0pt \fi
+ \sbox\z@{\fcolorbox{\shb@framecolor}{\shb@shadecolor}{%
+ \hb@xt@\shb@boxwidth{\curralign{#2}}%
+ }}%
+ \hskip\shadowspread
+ \color{\shb@shadowcolor}%
+ \rule[-\dp0]{\wd0}{\dimexpr\ht0+\dp0\relax}%
+ \llap{\raisebox{\shadowspread}{\box0\hskip\shadowspread}}%
+ \endgroup
+}
+
+%%++++++++++++++++++++++++ The \directkeys command ++++++++++++++++++++%%
+
+% The following are meant to demonstrate the use of the macro \directkeys:
+
+\ifdefined\skvtestcnt
+ \skvtestcnt\z@
+\else
+ \newcount\skvtestcnt
+\fi
+\def\logsetting{%
+ \advance\skvtestcnt\@ne
+ \typeout{'\skvcurrentkey' set: no.
+ \ifnum\skvtestcnt<10 0\fi\the\skvtestcnt, %
+ path: \skvcurrentprefix/\skvcurrentfamily}%
+}
+
+\directkeys{%
+ % #1 will be the user-value of the handler 'some handler'.
+ .new handlers = {
+ .some handler=\def\x##1{##1*#1},
+ .phantom handler=,
+ },
+ .handler let = {
+ .another handler=.some handler,
+ .do nothing handler=.phantom handler
+ },
+ .kill handlers={
+ .another handler,
+ .do nothing handler
+ },
+ .define handlers={
+ .j handler=\def\x##1{##1*#1},
+ .j handler=\def\y##1{##1*#1},
+ },
+ .define narg handlers={
+ .j1 handler={2}{\def\x##1{##1*#1*#2}},
+ .j2 handler={3}{\def\x##1{##1*#1*#2*#3}}
+ },
+ .new narg handlers={
+ % Error: handler j1 already exists:
+ % .j1 handler={2}{\def\x##1{##1*#1*#2}},
+ .k handler={2}{\def\x##1{##1*#1*#2}},
+ .l handler={3}{\def\x##1{##1*#1*#2*#3}}
+ },
+ .reserve handlers={reservedx , reservedy},
+ .holder prefix = mp@,
+ .prefix = KV,
+ .families = {fam1, fam2},
+ .add family = {fam3},
+ .add families = {fama,famb,famc},
+ .ignore families = {fama,famb,famc},
+ .restore families = {fama,famb},
+ .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.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
+ \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 = true,
+ .save unknown keys in = \macroa,
+ .set keys = {keya,keyb,keyc,keyd,keye},
+ .set keys = {keya=keya-value,keyb=\def\y####1{####1}},
+ .set keys* = {keya=keya-value,keyf},
+ .set keys* = {keya=keya-value,keyf},
+ .ignore keys = {keyf},
+ .set rmkeys*,
+ % Execute arbitrary code:
+ .exec code=\def\x#1{#1},
+ % 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{
+ .paths = {KVA/fam3,KVB/fam3},
+ .holder prefix = hp@,
+ .define keys = {
+ .cmd/keya/keya-default/\def\x##1{##1#1},
+ .ord/keyb/keyb-default,
+ },
+ .set keys = {keya=vala},
+ },
+ .exec code = \def\keycval{true},
+ % Prepend slot keye to key1 and key2:
+ .prepend slot={key1/{keye=.expanded{\keycval}},key2/{keye=false}},
+ % Multi-prepend slots:
+ .prepend slot={{key3,key4}/{keye=true,keyf=true},key5/{keye=false}},
+ % Prepend slot keyd to key6:
+ .prepend slot={key6/{keyd=right}},
+ % Append slots keye and keyf to key7 and key8.
+ % '.slots' and '.slot' are equivalent to '.append slots'
+ % and '.append slot'.
+ .append slot={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:
+ .prepend slot={key9/{keyb=#1}},
+ .append slot={key9/{keyc=#1}},
+ .set keys = {key9=val9},
+ % 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,key12}/{keyf,keyg}},
+ .set keys = {key10=true},
+ .ignore key = keyf,
+ .save unknown keys in = \macrob,
+ .setkeys = {keya,keyb,keyf},
+ .disable keys = {keye,keyf},
+}
+
+%%++++++++++++++++++++++ Collecting body of environment +++++++++++++++++%%
+
+\skvmakekeys[
+ .prefix=KV,
+ .family=collectbody,
+ .hp=mp,
+ .initialize,
+ .endlinechar=-1
+]{%
+ .cmd/title//,
+ .zcmd/title scale/1,
+ .zcmd/body scale/1,
+ .cmd/width/\textwidth,
+ .zcmd/title text style//,
+ .zcmd/body text style//,
+ .cmd/action//
+}
+
+\newsavebox{\boxbody}
+\newenvironment{collectbody}[1][]{%
+ \skvusekeys[.prefix=KV,.family=collectbody]{#1}%
+ \ifx\mptitle\@empty\else\skvafterfi
+ \begin{center}%
+ \scalebox{\mptitlescale}{\mptitletextstyle\mptitle}%
+ \end{center}%
+ \fi
+ \begin{lrbox}{\boxbody}%
+ \begin{minipage}{\mpwidth}%
+ \mpbodytextstyle\mpaction
+}{%
+ \end{minipage}%
+ \end{lrbox}%
+ \scalebox{\mpbodyscale}{\usebox{\boxbody}}%
+}
+
+
+%%+++++++++++++++++++++ Changing the key parser ++++++++++++++++++++%%
+
+\setupskeyval{key parser={;}}
+\skvafterdefinekeys{\setupskeyval{keyparser={,}}}
+\skvdefinekeys*[SKVT]{example}[exm@]{%
+ .zbool/put frame/true;
+ .cmd/shadecolor/green;
+ .ord/framesize/.5pt/\def\currfboxrule{#1};
+ .choice/align/center/{%
+ 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
+ };
+}
+
+%%++++++++++++++++++++++++++ Options section ++++++++++++++++++++++%%
+
+\def\skvtp@unknownoptions{}
+
+\skvunknownoptionhandler[SKVT]<abrtext,shadowbox,citation,testpkg>{%
+ \edef\skvtp@unknownoptions{%
+ \skvtp@unknownoptions\ifx\skvtp@unknownoptions\@empty\else,\fi
+ #3%
+ }%
+ \AtEndDocument{%
+ \ifx\skvtp@unknownoptions\@empty\else
+ \PackageWarningNoLine{skeyval-testpkg}
+ {Unknown keys: \skvtp@unknownoptions}%
+ \fi
+ }%
+}
+\skvexecuteoptions[SKVT]<abrtext>{align=.expanded{\alignval},
+ text style=.expand once{\stextstyle},author,show author
+}
+
+\skvprocessoptions*+[SKVT]<abrtext,shadowbox,citation,testpkg>\relax
+%\skvrestrictedprocessoptions*+[SKVT]<abrtext,shadowbox,citation,testpkg>\relax
+
+\skvcomment
+Here you could also use:
+
+\directkeys{
+ .mega process options*={
+ .prefix=SKVT,
+ .families={abrtext,shadowbox,citation,testpkg},
+ }
+}
+
+or
+
+\directkeys{
+ .prefix=SKVT,
+ .families={abrtext,shadowbox,citation,testpkg},
+ .copy class options and process options in all families,
+}
+\endcomment
+
+\endinput
diff --git a/Master/texmf-dist/tex/latex/skeyval/skeyval-view.sty b/Master/texmf-dist/tex/latex/skeyval/skeyval-view.sty
index 4996acf58b3..a09335b6b03 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.2, 2013/02/10. %
+% This is file 'skeyval-view.sty', version 1.3, 2013/05/15. %
% %
% This package and accompanying files may be distributed and/or %
% modified under the conditions of the LaTeX Project Public License, %
@@ -18,10 +18,11 @@
% The following files constitute the skeyval bundle and must be %
% distributed as a whole: %
% %
-% readme, skeyval.sty, skeyval-core.tex, skeyval-for.tex, %
+% README, skeyval.sty, skeyval-core.tex, skeyval-for.tex, %
% skeyval-view.sty, skeyval-ltxpatch.sty, skeyval-ltxcmds.tex, %
% skeyval-pstkey.sty, skeyval-pstkey.tex, skeyval-testclass.cls, %
-% and skeyval-testpkg.sty. %
+% skeyval-testpkg.sty, skeyval-pokayoke1, skeyval-pokayoke2, %
+% skeyval-view-pokayoke1. %
% %
% Copyright (c) 2010-2013 Ahmed Musa (amusa22@gmail.com). %
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
@@ -69,12 +70,12 @@
\NeedsTeXFormat{LaTeX2e}[2011/06/27]
\ProvidesPackage{skeyval-view}
- [2013/02/10 v1.2 Viewer utility for skeyval package (AM)]
+ [2013/05/15 v1.3 Viewer utility for skeyval package (AM)]
\@ifpackageloaded{skeyval}{}{\RequirePackage{skeyval}}
\directkeys*{%
.path=SKVV/skvview,
.holder prefix=skvv@,
- .initialize keys after define,
+ .initialize keys after define=false,
.every unknown option={
\PackageWarning{skeyval-view}{Unknown option '\CurrentOption' ignored}%
},
@@ -84,13 +85,19 @@
.ord/{xcolor-options,load-xcolor-with}//
\edef\skvv@xcoloroptions{\unexpanded{#1}}
\skvstripouterbraces{1}\skvv@xcoloroptions,
+ .bool/tabulate/true
+ },
+ .execute options={
+ tabulate=true,xcolor-options=false,load-xcolor-with=false
},
- .copy class options and process options,
+ .copy class options and process options
}
+\skvnewregisters\toks{\skvv@toksa}
\AtEndOfPackage{%
- \skvdisablekeys[SKVV]{skvview}{%
- xcolor-options,load-xcolor-with
- }%
+ \let\ifskvv@tempsw\ifskvv@tabulate
+ \skvv@tabulatefalse
+ \skvdisablekeys[SKVV]{skvview}{xcolor-options,load-xcolor-with}%
+ \let\ifskvv@tabulate\ifskvv@tempsw
}
\@ifpackageloaded{longtable}{}{\RequirePackage{longtable}}
@@ -102,7 +109,7 @@
\directkeys*{
.path=SKVV/skvview,
.holder prefix=skvv@,
- .initialize after define=false,
+ .initialize keys after define=false,
.define keys={
.ord/{file,wcolsep,weol}/\@nil/
\skvcsedef{skvv@\skvcurrentkey}{\unexpanded{#1}}
@@ -115,7 +122,7 @@
\skvaftercsname\skvcsvnormalize{skvv@\skvcurrentkey}
,
.bool/{view,vlabels,wlabels}/true,
- .ord/length of default/20/\def\skvv@lod{#1},
+ .ord/length of default/20/\def\skvv@lengthofdefa{#1},
.cmd/color/black,
},
.set keys={
@@ -147,87 +154,121 @@
\skvrobustdef*\setupviewkeys{\skvsetkeys[SKVV]{skvview}}
\let\skvv@db\@empty
-\skvrobustdef*\skvv@tabulate#1#2#3{%
- \edef\skv@tempa{\detokenize{#3}}%
- \skv@getbasetoks\skvv@lod\skv@tempa\skv@ival
- \skvxaddtolist{,}\skvv@db{%
- #1=\ifx\skvcurrentprefix\@empty\else
- \skvcurrentprefix\fi=\skvcurrentfamily=#2=\skv@ival
- }%
+\skvrobustdef*\skvv@dotabulate#1#2#3{%
+ \ifskvv@tabulate
+ \begingroup
+ \edef\skv@tempa{\detokenize{#3}}%
+ \skv@getshortformofcontent\skvv@lengthofdefa\skv@tempa\skv@ival
+ \skvxaddtolist{,}\skvv@db{%
+ #1=\ifx\skvcurrentprefix\@empty\else
+ \skvcurrentprefix\fi=\skvcurrentfamily=#2=\skv@ival
+ }%
+ \skvaftergroupdef\skvv@db\endgroup
+ \fi
}
-\protected\def\skv@ordkey@a#1[#2]#3{%
- % Pointers have been stripped in \skv@ordkey.
- \skvifstrcmpTF{#2}{^skv^}{%
- \skvv@tabulate{#1}{ordinary}{[none]}%
+\protected\def\skv@ordkey@a#1#2[#3]#4{%
+ \skvifstrcmpTF{#3}{^skv^}{%
+ \skvv@dotabulate{#2}{ordinary}{[none]}%
+ }{%
+ \skv@definedefault{#2}{#3}%
+ \skvv@dotabulate{#2}{ordinary}{#3}%
+ }%
+ % Pointers on key #2 have been stripped in \skv@ordkey.
+ % The pointer '.hp' may be used to set a holder prefix for the key.
+ \skvxifinTF{\detokenize{.hp}}{\detokenize{#4}}{%
+ \def\skv@prova##1.hp##2##3\skv@ord@nil{%
+ \let\skv@gobble@or@iden\@iden
+ \edef\skv@hp{\unexpanded{##2}}%
+ \edef\skv@callback{\unexpanded{##1##3}}%
+ }%
+ \skv@prova#4\skv@ord@nil
}{%
- \skv@definedefault{#1}{#2}%
- \skvv@tabulate{#1}{ordinary}{#2}%
+ \let\skv@gobble@or@iden\@gobble
+ \edef\skv@callback{\unexpanded{#4}}%
+ }%
+ \csname skvcs#1def\endcsname{\skv@header#2.@cbk}{%
+ % This can be called in #3 access the value of ordinary key.
+ % No prefix is used here, to reduce macro name:
+ \skv@gobble@or@iden{\skvcslet{\skv@hp#2}\noexpand\skvcurrentvalue}%
+ \skvexpandonce\skv@callback
}%
- \skvcsedef{\skv@header#1.@cbk}{\unexpanded{#3}}%
}
\protected\def\skv@cmdkey#1#2[#3]#4{%
\skv@strippointersfromkey{#2}%
\skvifdefboolTF{skv@st}{%
\skv@definedefault\skvcurrentkey{#3}%
- \skvv@tabulate\skvcurrentkey{command}{#3}%
+ \skvv@dotabulate\skvcurrentkey{command}{#3}%
}{%
- \skvv@tabulate\skvcurrentkey{command}{[none]}%
+ \skvv@dotabulate\skvcurrentkey{command}{[none]}%
}%
% 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@zapsw\expandafter}\expandafter{\skv@prova}}%
- \skvcslet{\skv@header\skvcurrentkey.@hp}\skv@prova
- \skvcsedef{\skv@header\skvcurrentkey.@cbk}{\unexpanded{#4}}%
+ \skvcsedef{\skv@header\skvcurrentkey.@cbk}{%
+ \skvcslet{\skv@prova}\noexpand\skvcurrentvalue
+ \unexpanded{#4}%
+ }%
}
\protected\def\skv@choicekey@g{%
\skvcommaparse*\skv@currlist\skv@prova{%
\skvexpbracenext\skv@strippointersfromkey\skv@prova
\ifx\skv@default\skv@rej
- \skvv@tabulate\skvcurrentkey{choice}{[none]}%
- \else\skvafterfi
+ \skvv@dotabulate\skvcurrentkey{choice}{[none]}%
+ \else
\skvexpanded{%
- \noexpand\skvv@tabulate
+ \noexpand\skvv@dotabulate
{\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}%
+ \skvcsedef{\skv@header\skvcurrentkey.@cbk}{%
+ \skvcslet{\skv@hp\skvcurrentkey}\noexpand\skvcurrentvalue
+ \the\skv@temptoks
+ }%
}%
}
\protected\def\skv@boolkey@c#1#2#3#4{%
- % Pointers have been stripped in \skv@boolkey.
- \skvcsnewif{\skv@zapornot{\skv@zapsw}{#2}}%
- \edef\skvv@boolortog{\if\skv@typetogkey toggle\else bool\fi}%
+ \if\skv@typetogkey
+ \skvdeftog{\skv@zapornot{\skv@zapsw}{#2}}%
+ \else
+ \skvcsnewif{\skv@zapornot{\skv@zapsw}{#2}}%
+ \fi
\skvifdefboolTF{skv@st}{%
\skv@definedefault{#1}{#3}%
- \skvv@tabulate{#1}{\skvv@boolortog}{#3}%
+ \skvv@dotabulate{#1}{\if\skv@typetogkey toggle\else bool\fi}{#3}%
}{%
- \skvv@tabulate{#1}{\skvv@boolortog}{[none]}%
+ \skvv@dotabulate{#1}{\if\skv@typetogkey toggle\else bool\fi}{[none]}%
}%
\edef\skv@tempa##1##2{%
\noexpand\skv@sttrue
\ifskv@pl\noexpand\skv@pltrue\else\noexpand\skv@plfalse\fi
\skv@checkchoice[\noexpand\skv@value]{##1}{true,false}##2%
}%
- \skv@toksa\expandafter{\skv@tempa{##1}{#4}}%
- \skvcsedef{\skv@header#1.@cbk}{\the\skv@toksa}%
+ \skv@temptoks\expandafter{\skv@tempa{##1}{#4}}%
+ \skvcsedef{\skv@header#1.@cbk}{\the\skv@temptoks}%
}
-% #2: styles, #3: default, #4: callback
-\protected\def\skv@appendstyles@a#1#2[#3]#4{%
+% #2=styles, #3=default, #4=callback
+\protected\def\skv@appendslots@a#1#2[#3]#4{%
\skvcommaparse{#1}\skv@prova{%
\skvexpbracenext\skv@strippointersfromkey\skv@prova
\skvexpanded{%
\skvifstrcmpTF{#3}{^skv^}{%
- \skvv@tabulate{\skvcurrentkey}{style}{[none]}%
+ % When using \skvaddslots, signal keys will otherwise be added
+ % in the database twice (while treating prepended and appended
+ % slots).
+ \ifskv@addslots@appending\else
+ \skvv@dotabulate{\skvcurrentkey}{slot/style}{[none]}%
+ \fi
}{%
\skv@definedefault{\skvcurrentkey}{\unexpanded{#3}}%
- \skvv@tabulate{\skvcurrentkey}{style}{\unexpanded{#3}}%
+ \ifskv@addslots@appending\else
+ \skvv@dotabulate{\skvcurrentkey}{slot/style}{\unexpanded{#3}}%
+ \fi
}%
- \skv@appendstyles@b{\skvcurrentkey}\unexpanded{{#2}{#4}}%
+ \skv@appendslots@b{\skvcurrentkey}\unexpanded{{#2}{#4}}%
}%
}%
}
@@ -238,7 +279,14 @@
\do\skvv@color\do\ifskvv@view\do\ifskvv@vlabels\do\ifskvv@wlabels
}{2}
-\skvrobustdef*\skvv@skvview@a#1{%
+\skvnewdef*\skvv@@view{%
+ \ifskvv@tabulate
+ 0\ifskvv@view 0\else 1\fi
+ \else
+ 01%
+ \fi
+}
+\skvrobustdef*\skvv@skvview#1{%
\skvsetkeys[SKVV]{skvview}{#1}%
\ifx\skvv@default\@nnil\else\@onelevel@sanitize\skvv@default\fi
\ifx\skvv@columns\@nnil
@@ -246,21 +294,32 @@
\skvv@coliitrue\skvv@coliiitrue\skvv@colivtrue\skvv@colvtrue
\else
\skvsetnumber\skvv@nra\@ne
- \@expandtwoargs\skvtestifin{,prefix,}{,\skvv@columns,}%
- \ifin@\skvadvanceno\skvv@nra\@ne\skvv@coliitrue\else\skvv@coliifalse\fi
- \@expandtwoargs\skvtestifin{,family,}{,\skvv@columns,}%
- \ifin@\skvadvanceno\skvv@nra\@ne\skvv@coliiitrue\else\skvv@coliiifalse\fi
- \@expandtwoargs\skvtestifin{,type,}{,\skvv@columns,}%
- \ifin@
+ \skvxifinTF{,prefix,}{,\skvv@columns,}{%
+ \skvadvanceno\skvv@nra\@ne\skvv@coliitrue
+ }{%
+ \skvv@coliifalse
+ }%
+ \skvxifinTF{,family,}{,\skvv@columns,}{%
+ \skvadvanceno\skvv@nra\@ne\skvv@coliiitrue
+ }{%
+ \skvv@coliiifalse
+ }%
+ \skvxifinTF{,type,}{,\skvv@columns,}{%
\skvadvanceno\skvv@nra\@ne\skvv@colivtrue
- \else
- \@expandtwoargs\skvtestifin{,key type,}{,\skvv@columns,}%
- \ifin@\skvadvanceno\skvv@nra\@ne\skvv@colivtrue\else\skvv@colivfalse\fi
- \fi
- \@expandtwoargs\skvtestifin{,default,}{,\skvv@columns,}%
- \ifin@\skvadvanceno\skvv@nra\@ne\skvv@colvtrue\else\skvv@colvfalse\fi
+ }{%
+ \skvxifinTF{,key type,}{,\skvv@columns,}{%
+ \skvadvanceno\skvv@nra\@ne\skvv@colivtrue
+ }{%
+ \skvv@colivfalse
+ }%
+ }%
+ \skvxifinTF{,default,}{,\skvv@columns,}{%
+ \skvadvanceno\skvv@nra\@ne\skvv@colvtrue
+ }{%
+ \skvv@colvfalse
+ }%
\fi
- \ifskvv@view
+ \if\skvv@@view
\protected@edef\skv@prova{%
\noexpand\begin{longtable}[l]{*\skvv@nra l}%
\\\noexpand\hline
@@ -285,35 +344,37 @@
\\\noexpand\endfoot\noexpand\hline
\noexpand\endlastfoot
}%
- \skv@toksa\expandafter{\skv@prova}%
+ \skvv@toksa\expandafter{\skv@prova}%
+ \fi
+ \ifx\skvv@file\@nnil\else
+ \immediate\openout\skvv@out\skvv@file
\fi
- \ifx\skvv@file\@nnil\else\immediate\openout\skvv@out\skvv@file\fi
\skvcommaloop*\skvv@db\skv@prova{%
\skv@swatrue
- \expandafter\skvv@skvview@b\skv@prova\skv@nil
+ \expandafter\skvv@skvview@a\skv@prova\skv@nil
}%
- \ifskvv@view
- \addto@hook\skv@toksa{\end{longtable}}%
+ \if\skvv@@view
+ \skvaddtotoks\skvv@toksa{\end{longtable}}%
\begingroup
\color{\skvv@color}%
- \ttfamily\the\skv@toksa
+ \ttfamily\the\skvv@toksa
\endgroup
\fi
\ifx\skvv@file\@nnil\else\immediate\closeout\skvv@out\fi
}
-\skvnewdef*\skvv@skvview@b#1=#2=#3=#4=#5\skv@nil{%
+\skvnewdef*\skvv@skvview@a#1=#2=#3=#4=#5\skv@nil{%
\skvv@ifin{#2}\skvv@prefix
\skvv@ifin{#3}\skvv@family
\skvv@ifin{#4}\skvv@type
\skvv@ifin{#5}\skvv@default
\ifskv@swa
- \ifskvv@view
+ \if\skvv@@view
\edef\skv@prova{%
#1\ifskvv@colii&#2\fi\ifskvv@coliii&#3\fi
\ifskvv@coliv&#4\fi\ifskvv@colv&#5\fi
\ifskvv@vlabels\noexpand\label{#2/#3/#1}\fi
}%
- \skv@toksa\expandafter{\the\expandafter\skv@toksa\skv@prova\\}%
+ \skvoaddtotoks\skvv@toksa{\skv@prova\\}%
\fi
\ifx\skvv@file\@nnil\else
\immediate\write\skvv@out{%
@@ -332,7 +393,6 @@
\skvxifinTF{,\detokenize{#1},}{,\skvoxdetok{#2},}{}\skv@swafalse
\fi
}
-
\directkeys*{
.path=SKVV/skvvshow,
.holder prefix=skvvs@,
@@ -344,7 +404,7 @@
\skvstripouterbraces{2}\skvvs@show
\ifx\skvvs@show\@empty\else\skvafterfi
\skvpushstate\skvv@state\skvv@depth
- \skvexpbracenext\skvv@skvview@a\skvvs@show
+ \skvexpbracenext\skvv@skvview\skvvs@show
\skvpopstate\skvv@state\skvv@depth
\fi
},
diff --git a/Master/texmf-dist/tex/latex/skeyval/skeyval.sty b/Master/texmf-dist/tex/latex/skeyval/skeyval.sty
index 010ce8c51fd..0bd5722fca5 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.2, 2013/02/10. %
+% This is file 'skeyval.sty', version 1.3, 2013/05/15. %
% %
% NOTE %
% %
@@ -34,10 +34,11 @@
% The following files constitute the skeyval bundle and must be %
% distributed as a whole: %
% %
-% readme, skeyval.sty, skeyval-core.tex, skeyval-for.tex, %
+% README, skeyval.sty, skeyval-core.tex, skeyval-for.tex, %
% skeyval-view.sty, skeyval-ltxpatch.sty, skeyval-ltxcmds.tex, %
% skeyval-pstkey.sty, skeyval-pstkey.tex, skeyval-testclass.cls, %
-% and skeyval-testpkg.sty. %
+% skeyval-testpkg.sty, skeyval-pokayoke1, skeyval-pokayoke2, %
+% skeyval-view-pokayoke1. %
% %
% Copyright (c) 2010-2013 Ahmed Musa (amusa22@gmail.com). %
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
@@ -83,7 +84,7 @@
\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}[2013/02/10 v1.2 Robust key-value parser (AM)]
+\ProvidesPackage{skeyval}[2013/05/15 v1.3 Robust key-value parser (AM)]
\NeedsTeXFormat{LaTeX2e}[2011/06/27]
\input skeyval-core
@@ -799,8 +800,6 @@
,
},
}
-%\skvshowcs{SKV/megapox/.options family.@cbk}
-%\skvshowcs{SKV/megapox/.pref.@cbk}
\skvnewnumbers[skv@]{megapoxdepth}
\skvrobustdef*\dirkeys@megaprocessoptions#1{%
@@ -891,7 +890,6 @@
.action for unknown options,
},
}
-%\skvshowcs{dirkeys@handler@.every unknown option}
% Loading a package while in options section is illegal. The command
% \skvafterprocessoptions can be used to defer the loading of packages
@@ -971,13 +969,3 @@
\skv@restorecodes
\endinput
-
-
-
-
-
-
-\edef\skv@prova{\@currname.\@currext/\skvcurrentkey}%
- \skvxifinTF{,\skv@prova,}{,\skvpackagelist,}{}{%
- \edef\skvpackagelist{\skvaddlist,\skvpackagelist\skv@prova}%
- }%