summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/catoptions
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2011-09-19 23:49:57 +0000
committerKarl Berry <karl@freefriends.org>2011-09-19 23:49:57 +0000
commit68c8eb6d0ad58860c28d19dcfc1f98fbe818512d (patch)
treef4a33a08c7084dd60c1956fa70fc2d2bec4b0e3f /Master/texmf-dist/tex/latex/catoptions
parenta2e40347ce33680ff47dd43b61a93e38559de7e6 (diff)
catoptions (19sep11)
git-svn-id: svn://tug.org/texlive/trunk@24027 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/catoptions')
-rw-r--r--Master/texmf-dist/tex/latex/catoptions/catoptions-guide.cfg59
-rw-r--r--Master/texmf-dist/tex/latex/catoptions/catoptions.sty1564
2 files changed, 991 insertions, 632 deletions
diff --git a/Master/texmf-dist/tex/latex/catoptions/catoptions-guide.cfg b/Master/texmf-dist/tex/latex/catoptions/catoptions-guide.cfg
index 9103717cd8d..5a7153b4ca9 100644
--- a/Master/texmf-dist/tex/latex/catoptions/catoptions-guide.cfg
+++ b/Master/texmf-dist/tex/latex/catoptions/catoptions-guide.cfg
@@ -1,5 +1,5 @@
\ProvidesFile{catoptions-guide.cfg}%
- [2011/07/30 v0.2.5 Configuration file for catoptions-guide.tex (AM)]
+ [2011/09/10 v0.2.6 Configuration file for catoptions-guide.tex (AM)]
\cptloadpackages{%
xwatermark|printwatermark;
@@ -10,44 +10,41 @@
\keepXColumns
\fancypagenos[%
- show-on-page-one = false,
- show-page-numbers = true,
- show-headrule = true,
- show-footrule = false,
- y-position = -.45\paperheight,
- x-position = 0,
+ showonpageone = false,
+ showpagenumbers = true,
+ showheadrule = true,
+ showfootrule = false,
+ yposition = -.45\paperheight,
+ xposition = 0,
scale = 1,
angle = 0,
- left-header = {The \textcolor{maccolor}{catoptions} package},
- style = {\textsc{Page~\thepage~of~\pageref{xwmlastpage}}},
+ left-header = The \textcolor{macrocolor}{catoptions} package,
+ style = \textsc{Page~\thepage~of~\pageref{xwmlastpage}},
right-header = \tcl{black}{\today}
]
\amltxoptions{%
- geometry-options = {left=3cm,right=3cm,top=2.5cm,%
- bottom=2.5cm,includeheadfoot},
- review-document = false,
- parindent = false,
- toc = false,
- front-page-style = empty,
- pre-title-skip = 0ex,
- post-title-skip = 1ex,
- pre-suptitle-skip = 15ex,
- post-suptitle-skip = 0ex,
- pre-subtitle-skip = 0ex,
- post-subtitle-skip = -\baselineskip,
- load-natbib = {numbers,sort&compress},
- command-color = xmagenta1,
- style-color = xgreen1,
- special-color = teal,
- section-heading-color = blue
+ geometryoptions = {left=3cm,right=3cm,top=2.5cm,%
+ bottom=2.5cm,includeheadfoot},
+ reviewdocument = false,
+ parindent = false,
+ toc = false,
+ frontpagestyle = empty,
+ pretitleskip = 0ex,
+ posttitleskip = 1ex,
+ presuptitleskip = 15ex,
+ postsuptitleskip = 0ex,
+ presubtitleskip = 0ex,
+ postsubtitleskip = -\baselineskip,
+ loadnatbib = {numbers,sort&compress},
+ cmdcolor = xmagenta1,
+ stylecolor = xgreen1,
+ speccolor = teal,
+ sectionheadcolor = blue
}
-\AfterStartOfDocument{\MakeQuoteCommand*_}
\def\otherchars{\quoted{other} characters\sspace}
\ltsnewletcs*\sectionbreak\medbreak
-\ltsnewletcs\mccolor\makemaccolor
-\ltsnewletcs\pucolor\makepurple
-\AtBeginDocument{\redef*\thefootnote{\fnsymbol{footnote}}}
+\AtBeginDocument{\renewdef*\thefootnote{\fnsymbol{footnote}}}
\newwatermark
[page=1,fontfamily=phv,fontsize=11pt,fontseries=m,textalign=center,
@@ -71,7 +68,7 @@
by the kernel. Theoretically speaking, the \pkgg'{pcatcode} itself has to guard against
the
kind of catcode problems that it is intended to circumvent. If you would like a
- nice little \tex\unskip nician's exercise, try your hand, before looking at the code of the
+ nice little \texnician's exercise, try your hand, before looking at the code of the
\pkgg'{pcatcode}, at the task that I set for myself: find the minimal set of catcode
assumptions that one has to make before attempting to establish normalcy, where normalcy is
defined as the state at the end of the \latex kernel, just before the last
diff --git a/Master/texmf-dist/tex/latex/catoptions/catoptions.sty b/Master/texmf-dist/tex/latex/catoptions/catoptions.sty
index 9cda3633ae1..3c4e5f6c5f2 100644
--- a/Master/texmf-dist/tex/latex/catoptions/catoptions.sty
+++ b/Master/texmf-dist/tex/latex/catoptions/catoptions.sty
@@ -1,5 +1,5 @@
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
-% This is 'catoptions' package (Version 0.2.5, July 2011) %
+% This is 'catoptions' package (Version 0.2.6, September 2011) %
% %
% The catoptions package changes LaTeX package loading internals %
% so that all subsequently loaded packages can rely on having %
@@ -85,14 +85,13 @@
\catcode94=7
\catcode126=13
\edef\cpt@hashchar{\string#}
-% Just in case:
\m@ne=-1\z@=0pt\p@=1pt
\@ifdefinable\m@one{\newcount\m@one\m@one\m@ne}
\@ifdefinable\z@pt{\newdimen\z@pt\z@pt\z@}
\chardef\active=13
-\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\NeedsTeXFormat{LaTeX2e}[2005/12/01]
\ProvidesPackage{catoptions}
- [2011/07/30 v0.2.5 Securing catcodes and parsing options (AM)]
+ [2011/09/10 v0.2.6 Securing catcodes and parsing options (AM)]
\ifcase%
\ifx\eTeXversion\cpt@undefined\z@pt\else
\ifnum\eTeXversion<\tw@\z@pt\else\@ne\fi\fi
@@ -108,9 +107,10 @@
\newcommand*\MsgBrk{\MessageBreak}
\def\cptloggingall{\loggingall\tracingifs\@ne}
-\newcommand*\showcsn{}
-\protected\def\showcsn#1{\expandafter\show\csname#1\endcsname}
-\def\cptnormalcatcodes{%
+\@ifdefinable\showcsn{%
+ \protected\def\showcsn#1#{\expandafter\show\csname#1\endcsname}%
+}
+\newcommand*\cptnormalcatcodes{%
\endlinechar13
\catcode33=12\catcode34=12\catcode35=6\catcode36=3\catcode37=14
\catcode38=4\catcode39=12\catcode40=12\catcode41=12\catcode42=12
@@ -129,40 +129,47 @@
}
\endgroup
+\def\cpt@spcatcodestack{}
+\def\cpt@sppushcatcodes{%
+ \edef\cpt@spcatcodestack{%
+ \catcode\number`\ =\the\catcode`\ %
+ \catcode\number`\^^I=\the\catcode`\^^I
+ \catcode\number\endlinechar=\the\catcode`\
+ \endlinechar=\the\endlinechar
+ {\cpt@spcatcodestack}%
+ }%
+}
\newcommand*\BeginOverlookWhiteSpace{%
- \pushnumber\overlook@nr
- \ifnum\overlook@nr>\@ne
+ \pushnumber\cpt@overlooknr
+ \ifnum\cpt@overlooknr>\@ne
\cpt@err{There is an unclosed
\string\BeginOverlookWhiteSpace}\@ehc
\fi
- \chardef\sav@spacecatcode=\number\catcode`\ %
- \chardef\sav@tabcatcode=\number\catcode`\^^I
- \chardef\sav@endlinechar=\number\endlinechar
+ \cpt@sppushcatcodes
\catcode`\ =9\relax
\catcode`\^^I=9\relax
\endlinechar\m@one
}
\newcommand*\EndOverlookWhiteSpace{%
- \catcode`\ =\sav@spacecatcode
- \catcode`\^^I=\sav@tabcatcode
- \endlinechar\sav@endlinechar
- \popnumber\overlook@nr
+ \def\reserved@a##1##{##1\xdef\cpt@spcatcodestack}%
+ \expandafter\reserved@a\cpt@spcatcodestack
+ \undefcs\cpt@overlooknr
}
\newcommand*\BeginOverlookEndline{%
- \pushnumber\overlookendline@nr
- \ifnum\overlookendline@nr>\@ne
+ \pushnumber\cpt@overlookendlinenr
+ \ifnum\cpt@overlookendlinenr>\@ne
\cpt@err{There is an unclosed
\string\BeginOverlookEndline}\@ehc
\fi
- \chardef\@sav@endlinechar=\number\endlinechar
+ \chardef\cpt@savendlinechar=\number\endlinechar
\endlinechar\m@one
}
\newcommand*\EndOverlookEndline{%
- \endlinechar\@sav@endlinechar
- \popnumber\overlookendline@nr
+ \endlinechar\cpt@savendlinechar
+ \undefcs\cpt@overlookendlinenr
}
-\def\cpt@catcodestack{}
-\def\cptpushcatcodes{%
+\newcommand*\cpt@catcodestack{}
+\newcommand*\cptpushcatcodes{%
\begingroup
\def\x##1{%
\ifx##1\@nnil\else
@@ -178,7 +185,7 @@
}
\cptpushcatcodes
\cptnormalcatcodes
-\def\cptpopcatcodes{%
+\newcommand*\cptpopcatcodes{%
\begingroup
\def\x##1##{\endgroup##1\xdef\cpt@catcodestack}%
\expandafter\x\cpt@catcodestack
@@ -200,12 +207,12 @@
}%
\expandafter\endgroup\x
}
-\newcommand*\setup@safeactives@edef{%
+\newcommand*\cpt@setupsafeactivesedef{%
\begingroup
\endlinechar\m@one
\def\siso@do##1{\catcode`##1\string=\active}%
\simpleexpandarg\siso@@loop\cpt@otherchars
- \gdef\safe@actives@edef##1##2{%
+ \gdef\cptsafeactivesedef##1##2{%
\begingroup
\def\siso@do####1{%
\ifnum\catcode`####1\string=\active\edef####1{\string####1}\fi
@@ -338,14 +345,12 @@
}
\endgroup
-\@ifdefinable\CurrIfnextchar\relax
\long\protected\def\cpt@ifnextchar#1#2#3{%
\begingroup
\let\reserved@a=#1%
\toks@{\endgroup#2}\toks1{\endgroup#3}%
\global\futurelet\@let@token\cpt@ifnext
}
-\let\CurrIfnextchar\cpt@ifnextchar
\protected\def\cpt@ifnext{%
\ifx\@let@token\@sptoken
\toks2{\cpt@ifn@xt}%
@@ -359,7 +364,7 @@
\the\toks2
}
\@namedef{cpt@ifn@xt} {\global\futurelet\@let@token\cpt@ifnext}
-\long\protected\def\ifnextcharTF#1#2#3{%
+\newcommand\ifnextcharTF[3]{%
\begingroup
\cpt@ifnextchar\relax
{\cpt@ifnextcharacter{#1}{#2}{#3}}%
@@ -388,11 +393,21 @@
\long\def\cpt@ifn@xtch@r@cter#1#2\noboundary#3{%
\ifx\relax#2#1\else\noexpand#3\fi
}
+\protected\def\cpt@starorlong#1{%
+ \cpt@ifstar{\let\l@ngrel@x\relax#1}{\let\l@ngrel@x\long#1}%
+}
+\protected\def\cpt@ifstar#1{\ifnextcharTF*{\@firstoftwo{#1}}}
\newcommand\cptswap[2]{#2#1}
\newcommand\cptswapfirstbraced[2]{#2{#1}}
\newcommand\cptswapsecondbraced[2]{{#2}#1}
\cptswap{ }{\let\cptsptoken= }
\def\@space{ }
+\@ifdefinable\ifsecondisnilTF\relax
+\def\ifsecondisnilTF#1#2\cpt@nil{\ifxTF#2\cpt@nnil}
+\newcommand\iflacus[1]{%
+ \ifcat$\detokenize\expandafter{\@gobble#1.}$%
+ \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
+}
\newcommand\aftercsname[2]{%
\expandafter\cptswap\expandafter{\csname#2\endcsname}{#1}%
}
@@ -402,21 +417,19 @@
\expandafter\expandafter\expandafter{\csname#2\endcsname}{#1}%
}
\newcommand\cptremovescape[1]{%
- \ifx\noboundary#1\noboundary
- \expandafter\@gobble\else\expandafter\@iden\fi
- {\expandafter\@gobble\string#1}%
+ \iflacus{#1}{}{\expandafter\@gobble\string#1}%
}
\newcommand\cptgobblescape[1]{%
- \ifx\noboundary#1\noboundary
- \expandafter\@gobble\else\expandafter\@iden\fi
- {\ifnum\escapechar>\@cclv\else
- \ifnum\escapechar<\z@pt\else
- \expandafter\expandafter
- \csname @gobble\ifnum\escapechar=\@xxxii @space\fi
- \cptthreexp\endcsname
+ \iflacus{#1}{}{%
+ \ifnum\escapechar>\@cclv\else
+ \ifnum\escapechar<\z@pt\else
+ \expandafter\expandafter
+ \csname @gobble\ifnum\escapechar=\@xxxii @space\fi
+ \cptthreexp\endcsname
+ \fi
\fi
- \fi
- \string#1}%
+ \string#1%
+ }%
}
\@ifdefinable\defpass\relax
\@ifdefinable\edefpass\relax
@@ -427,6 +440,18 @@
\ifcsname#1\endcsname\expandafter\@iden\else
\expandafter\@gobble\fi{\usename{#1}}%
}
+\newcommand\uselivecs[1]{%
+ \ifdefTF{#1}{#1}{\cpt@notdeferr{#1}}%
+}
+\newcommand\uselivecsn[1]{%
+ \ifcsndefTF{#1}{%
+ \usename{#1}%
+ }{%
+ \let\relax\relax
+ \cpt@err{Command '\@backslashchar#1' undefined}\@ehc
+ }%
+}
+\@ifdefinable\usedefname{\let\usedefname\uselivecsn}
\newcommand\ifxTF[2]{%
\usename{@\ifx#1#2\@empty first\else second\fi oftwo}%
}
@@ -447,9 +472,7 @@
\ifcondTF{ }
\long\def\ifcondFT#1\fi#2#3{\ifcondTF#1\fi{#3}{#2}}
\newcommand*\ifcsnameTF[1]{%
- \ifcondTF\ifcat$\detokenize{#1}$\fi{%
- \@secondoftwo
- }{%
+ \iflacus{#1}\@secondoftwo{%
\usename{@\ifcsname#1\endcsname first\else second\fi oftwo}%
}%
}
@@ -464,9 +487,9 @@
}
\protected\def\cpt@notdefinable{%
\@latex@error
- {Command \@backslashchar\reserved@a\@space already exists}%
- {Command \@backslashchar\reserved@a\@space already defined,
- \MsgBrk or name \@backslashchar\@qend... illegal.}
+ {Command '\@backslashchar\reserved@a' already exists}%
+ {Command '\@backslashchar\reserved@a' already defined,
+ \MsgBrk or name '\@backslashchar\@qend\reserved@a' illegal.}
}
\newcommand*\if@@definable[2]{%
\edef\reserved@a{\cptremovescape{#1}}%
@@ -487,11 +510,12 @@
\expandafter\endgroup\the\toks@
}%
}
-\protected\def\cpt@oneorgobble\endgroup{%
+\@ifdefinable\ifchoicefoundTF\relax
+\protected\def\ifchoicefoundTF\endgroup{%
\expandafter\endgroup\ifcpt@choicefd
- \expandafter\@iden
+ \expandafter\@firstoftwo
\else
- \expandafter\@gobble
+ \expandafter\@secondoftwo
\fi
}
\protected\def\cpt@oneoftwo#1\endgroup{%
@@ -500,16 +524,16 @@
\cptpassexpanded{%
\endgroup
\ifcase#1\relax
- \if@boolTF{cpt@choicefd}\@firstoftwo\@secondoftwo
+ \ifboolTF{cpt@choicefd}\@firstoftwo\@secondoftwo
\or
- \if@boolTF{cpt@choicefd}\@secondoftwo\@firstoftwo
+ \ifboolTF{cpt@choicefd}\@secondoftwo\@firstoftwo
\else
\cpt@err{Invalid number '#1'}\noexpand\@ehc
\fi
}%
}
-\if@@definable\if@@seeparameter\relax
-\protected\def\if@@seeparameter#1#{%
+\if@@definable\cpt@ifseeparameter\relax
+\protected\def\cpt@ifseeparameter#1#{%
\xifinsetTF
{\detokenize{macro parameter character}}
{\meaning\@let@token}%
@@ -522,13 +546,7 @@
\expandafter\if@@definable\csname#1\endcsname
{\expandafter\newcount\csname#1\endcsname}%
}
-\newcommand\iflacus[1]{%
- \ifcat$\detokenize\expandafter{\@gobble#1.}$%
- \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
-}
-% \cptcommanormalize and \docommalist are cheap but are restricted
-% to comma lists only. Also, they aren't meant for parsing key-val
-% lists. See \kv@@normalize and \kv@@parse:
+
\begingroup
\uccode`\~=`\,%
\uppercase{\endgroup
@@ -568,42 +586,61 @@
}%
}%
}
-\newcommand*\cpt@ppcmds[3]{%
- \global\advance#3\@ne
- \begingroup
- \toks@{}\toks1{}%
- \def\cpt@tempa##1{\cptremovescape##1@\romannumeral#3\endcsname}%
- \def\push@do##1,{%
- \ifnot@nil{##1}{%
- \toks@\expandafter\expandafter\expandafter
- {\expandafter\the\expandafter\toks@\expandafter
- \let\csname\cpt@tempa{##1}##1}%
- \toks1\expandafter\expandafter\expandafter
- {\expandafter\the\expandafter\toks1\expandafter
- \let\expandafter##1\csname\cpt@tempa{##1}}%
- \push@do
+\newcommand*\cpt@ppcmds[4]{%
+ \ifcase0\ifnum#1=1 1 \else\ifnum#1=-1 1 \fi\fi
+ \cpt@err{Invalid stack direction '#1'}\@ehc
+ \fi
+ \ifcondTF\ifnum#1=1\fi{%
+ \edef\reserved@a##1##{##1\gdef\expandafter\noexpand
+ \csname\cptremovescape#2@stack\endcsname}%
+ \expandafter\expandafter\expandafter\reserved@a
+ \csname\cptremovescape#2@stack\endcsname
+ }{%
+ \global\advance#4\@ne
+ \begingroup
+ \toks@{}\toks1{}\toks2{}%
+ \def\cpt@tempa##1{\cptremovescape##1@\romannumeral#4\endcsname}%
+ \def\do##1,{%
+ \ifnot@nil{##1}{%
+ \toks@\expandafter\expandafter\expandafter
+ {\expandafter\the\expandafter\toks@\expandafter
+ \let\csname\cpt@tempa{##1}##1}%
+ \toks1\expandafter\expandafter\expandafter
+ {\expandafter\the\expandafter\toks1\expandafter
+ \let\expandafter##1\csname\cpt@tempa{##1}}%
+ \toks2\expandafter\expandafter\expandafter
+ {\expandafter\the\expandafter\toks2\expandafter
+ \let\csname\cpt@tempa{##1}\cpt@undefined}%
+ \do
+ }%
}%
- }%
- \edef\reserved@a{\cptcommanormalize{#2}}%
- \expandafter\push@do\reserved@a,\@nil,%
- \expandafter\xdef\csname\cptremovescape#1@stack\endcsname{%
- \the\toks1\global\advance#3\m@one
- \@ifundefined{\cptremovescape#1@stack}{{}}{%
- {\unexpanded\expandafter\expandafter\expandafter
- {\csname\cptremovescape#1@stack\endcsname}}%
+ \edef\reserved@a{\cptcommanormalize{#3}}%
+ \expandafter\do\reserved@a,\@nil,%
+ \expandafter\xdef\csname\cptremovescape#2@stack\endcsname{%
+ \the\toks1\relax\the\toks2\global\advance#4\m@one
+ \@ifundefined{\cptremovescape#2@stack}{{}}{%
+ {\unexpanded\expandafter\expandafter\expandafter
+ {\csname\cptremovescape#2@stack\endcsname}}%
+ }%
}%
+ \expandafter\endgroup\the\toks@
}%
- \expandafter\endgroup\the\toks@
}
+\newcommand*\cpt@pushcmds[3]{\cpt@ppcmds\m@one#1{#2}#3}
+\newcommand*\cpt@popcmds[1]{\cpt@ppcmds1#1\relax\relax}
\cptnewcount{cpt@csvdepth}
\cptnewbool{loopbreak}
\if@@definable\loopbreak{\let\loopbreak\loopbreaktrue}
\newcommand*\cpt@commanil{\cpt@commanil}
-\newcommand*\docommalist[2]{%
- \cpt@ppcmds\docommalist{\ifloopbreak,\cpt@commaact}\cpt@csvdepth
+\newcommand*\docommalist{\cpt@ifstar\cpt@docommalist\cpt@doc@mmalist}
+\newcommand*\cpt@docommalist[1]{%
+ \expandafter\cpt@doc@mmalist\expandafter{#1}%
+}
+\newcommand*\cpt@doc@mmalist[2]{%
+ \cpt@pushcmds\docommalist{\ifloopbreak,\cpt@commaact}\cpt@csvdepth
\def\cpt@commaact##1{#2}%
\def\cpt@commado##1,{%
- \@nameuse{@\@nameuse{ifloopbreak}first\else second\fi oftwo}{%
+ \@nameuse{@\ifloopbreak first\else second\fi oftwo}{%
\def\reserved@a####1\cpt@commanil,{}\reserved@a
}{%
\edef\reserved@a{\unexpanded\expandafter{\@gobble##1}}%
@@ -616,14 +653,9 @@
\loopbreakfalse
\edef\reserved@a{\cptcommanormalize{#1}}%
\expandafter\cpt@commado\expandafter.\reserved@a,\cpt@commanil,%
- \def\reserved@a##1##{##1\gdef\docommalist@stack}%
- \expandafter\reserved@a\docommalist@stack
+ \cpt@popcmds\docommalist
}
\docommalist{st,pl,pm,cl}{\cptnewbool{cpt@#1}}
-\protected\def\cpt@starorlong#1{%
- \cpt@ifstar{\let\l@ngrel@x\relax#1}{\let\l@ngrel@x\long#1}%
-}
-\protected\def\cpt@ifstar#1{\CurrIfnextchar*{\@firstoftwo{#1}}}
\newcommand*\cpt@cmdsuffixcheck{\@iden}
\AtEndOfPackage{\DefSuffixChecker\cpt@cmdsuffixcheck{*}{!}}
\if@@definable\shelldef{%
@@ -635,7 +667,7 @@
}%
}
\protected\def\cpt@shelldef{%
- \CurrIfnextchar
+ \ifnextcharTF
!{\@firstoftwo{\cpt@cltrue\cpt@shelld@f}}
{\cpt@clfalse\cpt@shelld@f}%
}
@@ -674,8 +706,8 @@
}
\shelldef*\cpt@isescapederr#1{%
\@latex@error{Token '\detokenize{#1}' is escaped}{%
- I didn't expect the first token of '\detokenize{#1}'
- \MsgBrk to be escape character.}%
+ I didn't expect the first character of '\detokenize{#1}'
+ \MsgBrk to be the escape character.}%
}
\shelldef*\cpt@notbracederr#1{%
\@latex@error{Token '\detokenize{#1}' isn't braced}
@@ -700,7 +732,7 @@
\shelldef*\cpt@isblankerr#1{%
\@latex@error
{Blank/empty token for command '\detokenize{#1}'}
- {I didn't expect a blank token here.}%
+ {I didn't expect a blank argument/token here.}%
}
\shelldef*\cpt@notexpandableerr#1{%
\@latex@error{'\detokenize{#1}' is not expandable
@@ -750,11 +782,10 @@
\shelldef*\shelllet#1{\cpt@ifeql{\cpt@shelllet{#1}}{\cpt@shelllet{#1}}}
\shelldef*\cpt@shelllet#1#2{%
- \ifcondTF\ifx\noboundary#2\noboundary\fi{%
+ \iflacus{#2}{%
\cpt@isblankerr\shelllet
}{%
- \ifcondTF\expandafter\ifx\expandafter
- \noboundary\@gobble#2\noboundary\fi{%
+ \expandafter\iflacus\expandafter{\@gobble#2}{%
\ifcsdefinable#1{%
\ifprotectedTF#2{\let#1=#2}{%
\ifcsndefinable{shell@\cptremovescape#1}{%
@@ -776,24 +807,29 @@
\ifdefTF\cpt@docstarted\@firstoftwo\@secondoftwo
}
\shelldef*\UseNormalCatcodes{%
+ \ifdocstartedTF{%
+ \cpt@err{\noexpand\UseNormalCatcodes is a
+ preamble command}\@ehc
+ }{}%
+ \xdef\@pushfilename{%
+ \gletcs\UseNormalCatcodes\UseNorm@lCatcodes
+ \expandcsonce\@pushfilename
+ }%
\let\UseNormalCatcodes\relax
- \ifdocstartedTF{}{%
- \cptpushcatcodes
- \cptnormalcatcodes
- \ifxTF\@currname\@empty{%
- \BeforeStartOfDocument{%
- \cptpopcatcodes
- }%
- }{%
- \AfterEndOfStyleFile{%
- \cptpopcatcodes
- \let\UseNormalCatcodes\rsv@UseNormalCatcodes
- }%
+ \cptpushcatcodes
+ \cptnormalcatcodes
+ \ifxTF\@currname\@empty{%
+ \BeforeStartOfDocument{%
+ \cptpopcatcodes
+ }%
+ }{%
+ \AfterEndOfStyleFile{%
+ \cptpopcatcodes
}%
}%
}
-\if@@definable\rsv@UseNormalCatcodes{%
- \let\rsv@UseNormalCatcodes\UseNormalCatcodes
+\if@@definable\UseNorm@lCatcodes{%
+ \global\let\UseNorm@lCatcodes\UseNormalCatcodes
}
\newcommand*\newcomment{%
\begingroup
@@ -846,17 +882,6 @@
!gdef!end@comment[\end{comment}]
!endgroup
-\newcommand\uselivecs[1]{%
- \ifdefTF{#1}{#1}{\cpt@notdeferr{#1}}%
-}
-\newcommand\uselivecsn[1]{%
- \ifcsndefTF{#1}{%
- \usename{#1}%
- }{%
- \let\relax\relax
- \cpt@err{Command '\@backslashchar#1' undefined}\@ehc
- }%
-}
\long\def\@gobblethree#1#2#3{}
\long\def\@firstofthree#1#2#3{#1}
\long\def\@secondofthree#1#2#3{#2}
@@ -865,26 +890,29 @@
\newcommand\cptalloftwo[2]{#1#2}
\if@@definable\cpt@nil{\let\cpt@nil\relax}
\def\cpt@nnil{\cpt@nil}
-\if@@definable\cpt@relax{\let\cpt@relax\relax}
\newcommand*\cptrmstop{0 }
\if@@definable\cptrm{\let\cptrm\romannumeral}
\long\def\cpt@car#1#2\car@nil{#1}
\long\def\cpt@cdr#1#2\cdr@nil{#2}
+\if@@definable\cpt@relax{\let\cpt@relax\relax}
+\if@@definable\gobble@to@relax\relax
+\long\def\gobble@to@relax#1\cpt@relax{}
+\def\cpt@defrelax\fi{%
+ \fi\defpass\cpt@relax##1\cpt@relax{\endgroup}%
+}
\long\def\remove@to@nnil#1\@nnil{}
\long\def\catch@to@nnil#1\@nnil{#1}
\long\def\remove@to@dot#1.{}
\long\def\catch@to@dot#1.{#1}
-\defpass\reserved@a#1{%
- \long\def\remove@to@space##1#1{}%
- \def\@gobblespace#1{}%
-}{ }
+\long\def\remove@to@space#1 {}
+\@namedef{@gobblespace} {}
\protected\def\ifnot@nil#1{%
- \edef\reserved@g{\unexpanded{#1}}%
- \ifxTF\reserved@g\@nnil\@gobble\@iden
+ \edef\reserved@a{\unexpanded{#1}}%
+ \ifxTF\reserved@a\@nnil\@gobble\@iden
}
\newcommand*\ifsentinelTF[1]{%
- \edef\reserved@g{\unexpanded{#1}}%
- \ifxTF\reserved@g\currsentinel
+ \edef\reserved@a{\unexpanded{#1}}%
+ \ifxTF\reserved@a\currsentinel
}
\if@@definable\csvbreak{\let\csvbreak\relax}
\newcommand*\cpt@csvbreak{\csvbreak}
@@ -893,8 +921,8 @@
\if@@definable\tsvbreak{\let\tsvbreak\relax}
\newcommand*\cpt@tsvbreak{\tsvbreak}
\newcommand*\ifcsvbreakTF[1]{%
- \edef\reserved@g{\unexpanded{#1}}%
- \ifxTF\reserved@g\cpt@csvbreak
+ \edef\reserved@a{\unexpanded{#1}}%
+ \ifxTF\reserved@a\cpt@csvbreak
}
\if@@definable\cptdoremainder{\let\cptdoremainder\@gobble}
\shelldef*\gobble@to@sentinel#1#2{%
@@ -911,10 +939,10 @@
}
\cptzapspaces{ }
\long\def\cpt@zapspaces#1 #2\zap@nil{%
- \usename{@\ifx\noboundary#2\noboundary first\else second\fi oftwo}{%
- \expandafter\cptrmstop\remove@to@dot#1%
+ \iflacus{#2}{%
+ \expandafter\cptrmstop\@gobble#1%
}{%
- \expandafter\cpt@zapspaces\expandafter.\remove@to@dot#1#2\zap@nil
+ \expandafter\cpt@zapspaces\expandafter.\@gobble#1#2\zap@nil
}%
}
\newcommand*\cptsupergobble[1]{%
@@ -928,7 +956,7 @@
\newcommand\cpt@superg@bblem[1]{\endcsname}
\newcommand*\cptdotimes[1]{%
\ifblankTF{#1}{%
- \if@boolTF{cpt@useempty}{\cpt@dotimes{m}}\@gobble
+ \ifboolTF{cpt@useempty}{\cpt@dotimes{m}}\@gobble
}{%
\expandafter\cpt@dotimes\expandafter
{\romannumeral\number#1000}%
@@ -961,7 +989,7 @@
\newcommand*\normal@reverse[1]{\cpt@normalreverse{}#1\@nnil}
\long\def\cpt@normalreverse#1#2{%
\ifxTF#2\@nnil{%
- \if@boolTF{@test}\@iden\unexpanded{#1}%
+ \ifboolTF{@test}\@iden\unexpanded{#1}%
}{%
\cpt@normalreverse{#2#1}%
}%
@@ -973,7 +1001,7 @@
}
\long\def\cpt@r@bustreverse#1#2.#3{%
\ifxTF#3\@nnil{%
- \if@boolTF{@test}\@iden\unexpanded{#1}%
+ \ifboolTF{@test}\@iden\unexpanded{#1}%
}{%
#2{\cpt@robustreverse{{#3}#1}}{\cpt@robustreverse{#3#1}}.%
}%
@@ -1005,36 +1033,40 @@
\ifcondTF\if@tempswa\fi{\endgroup#2}\endgroup
}
\ifcommandsdefinable{\cpttrimspace,\cpttrimspaces}\relax
-\def\cpttrimspaces#1{\cpt@trimspaces@a\relax{#1}}
+\long\def\cpttrimspaces#1{\cpt@trimspaces@a\relax{#1}}
+\long\def\cpt@trimspaces@strcmp#1#2{%
+ \csname @\ifnum\pdfstrcmp{\detokenize{#1}}%
+ {\detokenize{#2}}=0first\else second\fi oftwo\endcsname
+}
\begingroup
\catcode`\&=7\catcode`\$=7
-\gdef\cpt@trimspaces@a#1#2{\cpt@trimspaces@b.#1$.#2& &}
-\gdef\cpt@trimspaces@b#1$#2 &{\cpt@trimspaces@c#1$#2&}
-\gdef\cpt@trimspaces@c#1$#2&#3{%
- \cpt@trimspaces@d\ifstrcmpTF{#2}{#1}{%
+\long\gdef\cpt@trimspaces@a#1#2{\cpt@trimspaces@b.#1$.#2& &}
+\long\gdef\cpt@trimspaces@b#1$#2 &{\cpt@trimspaces@c#1$#2&}
+\long\gdef\cpt@trimspaces@c#1$#2&#3{%
+ \cpt@trimspaces@d\cpt@trimspaces@strcmp{#2}{#1}{%
\unexpanded\expandafter{\@gobble#1}%
}{%
\cpt@trimspaces@d\cpt@trimspaces@a{#2}{#2}%
}%
}
-\gdef\cpt@trimspaces@d#1#2{%
+\long\gdef\cpt@trimspaces@d#1#2{%
\expandafter\cpt@trimspaces@e\expandafter#1\expandafter{%
\unexpanded\expandafter
{\romannumeral-`\q\expandafter\noexpand\@gobble#2}%
}%
}
-\gdef\cpt@trimspaces@e#1#2#3{%
+\long\gdef\cpt@trimspaces@e#1#2#3{%
\expandafter#1\expandafter{\@gobble#3}{#2}%
}
-\gdef\cpttrimspace#1{\cpt@trimspace@a.#1& &}
-\gdef\cpt@trimspace@a#1 &{\cpt@trimspace@b#1&}
-\gdef\cpt@trimspace@b#1&#2{%
+\long\gdef\cpttrimspace#1{\cpt@trimspace@a.#1& &}
+\long\gdef\cpt@trimspace@a#1 &{\cpt@trimspace@b#1&}
+\long\gdef\cpt@trimspace@b#1&#2{%
\unexpanded\expandafter
{\romannumeral-`\q\expandafter\noexpand\@gobble#1}%
}
\endgroup
-\shelldef*\trim@@spaces#1#2{\edef#2{\cpttrimspaces{#1}}}
-\shelldef*\trim@@space#1#2{\edef#2{\cpttrimspace{#1}}}
+\shelldef\trim@@spaces#1#2{\edef#2{\cpttrimspaces{#1}}}
+\shelldef\trim@@space#1#2{\edef#2{\cpttrimspace{#1}}}
\shelldef*\despacecontent#1{%
\edef#1{\simpleexpandarg\cpttrimspaces{#1}}%
@@ -1050,12 +1082,9 @@
\cptaddtolist[#1]\cpt@rsvda\cpt@tempa
}%
\csv@@loop*[#1]\cpt@tempa
- \if@boolFT{cpt@st}{}{\let#2=\cpt@rsvda}%
+ \ifdefboolFT{cpt@st}{}{\let#2=\cpt@rsvda}%
}%
}
-% \newvariables{<type>}[<prf>]{<variables>}[<state/value>]
-% Valid <types> are 'if, toks, box, dimen, count, tog, switch'.
-% Boxes can be defined but not initialized by this command.
\shelldef*\newvariables#1{\@testopt{\cpt@newvariables{#1}}{}}
\if@@definable\newvariable{\let\newvariable\newvariables}
\shelldef*\cpt@newvariables#1[#2]#3{%
@@ -1063,15 +1092,11 @@
}
\shelldef*\cpt@newv@riables#1#2#3[#4]{%
\def\cpt@rsvda##1{%
- \ifx\noboundary#4\noboundary
- \def\cpt@tempc{##1}\else\def\cpt@tempc{#4}\fi
+ \iflacus{#4}{\def\cpt@tempc{##1}}{\def\cpt@tempc{#4}}%
}%
\edef\cpt@tempb{\ifstrcmpTF{#1}{if}{if}{}}%
\docommalist{#3}{%
- \iflacus{##1}{%
- \def\cpt@relax####1\cpt@relax{\let\cpt@relax\relax}%
- }{}%
- \cpt@relax
+ \iflacus{##1}\gobble@to@relax\relax
\ifnamedefTF{\cpt@tempb#2##1}{%
\edef\reserved@a{\cpt@tempb#2##1}%
\ifstrcmpTF{#1}{tog}{}{\cpt@notdefinable}%
@@ -1088,11 +1113,11 @@
\ifstrcmpTF{#4}{false}{%
\let\cpt@togstate\@secondoftwo
}{%
- \ifx\noboundary#4\noboundary
+ \iflacus{#4}{%
\let\cpt@togstate\@secondoftwo
- \else
+ }{%
\@latex@error{Invalid toggle value '#4'}\@ehc
- \fi
+ }%
}%
}%
}%
@@ -1109,11 +1134,11 @@
\ifstrcmpTF{#4}{false}{%
\def\reserved@a{01}%
}{%
- \ifx\noboundary#4\noboundary
+ \iflacus{#4}{%
\def\reserved@a{01}%
- \else
+ }{%
\@latex@error{Invalid switch value '#4'}\@ehc
- \fi
+ }%
}%
}%
}%
@@ -1130,7 +1155,8 @@
\cpt@rsvda{}%
\csname#2##1\endcsname\expandafter{\cpt@tempc}%
}{%
- % It is dangerous to initialize boxes here:
+ % It is dangerous to initialize boxes.
+ % Horizontal and vertical boxes aren't compatible:
\ifstrcmpTF{#1}{box}{}{%
\ifstrcmpTF{#1}{count}{%
\cpt@rsvda\z@pt
@@ -1179,8 +1205,8 @@
\endgroup
\fi
}
-\newvariables{if}[cpt@]{verbose,usepox,optfd,
- igopt,inpox,olddx,in,check,choicefd,useempty,swa,
+\newvariables{if}[cpt@]{verbose,usepox,optfd,%
+ igopt,inpox,olddx,in,check,choicefd,useempty,swa%
}[false]
\newvariables{tog}{biboolopts}[false]
\newvariables{count}[cpt@]{optdepth,grouplevel,grouptype,cnta}[\z@pt]
@@ -1201,6 +1227,37 @@
\ifcat\noexpand#1\noexpand~13\else
-1\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
}
+\newcommand*\cptcountspacesincs{%
+ \begingroup
+ \catcode\endlinechar=12
+ \cpt@countspacesincs
+}
+\def\cpt@countspacesincs#1{%
+ \lccode`\ `\^^S\relax
+ \catcode\endlinechar=9
+ \scantokens{\cpt@c@untspacesincs{#1}{ignoring}}%
+ \catcode\endlinechar=10
+ \scantokens{\cpt@c@untspacesincs{#1}{counting}}%
+ \endgroup
+}
+\def\cpt@c@untspacesincs#1#2{%
+ \@tempcnta\z@pt
+ \toks@{##1}%
+ \lowercase{%
+ \toks1\expandafter{\detokenize{ }}%
+ \expandafter\def\expandafter\cpt@tempa\the
+ \expandafter\toks@\the\toks1##2\@nil{%
+ \ifblankTF{##2}{}{%
+ \advance\@tempcnta\@ne
+ \cpt@tempa##2\@nil
+ }%
+ }%
+ \expandafter\cpt@tempa\detokenize{#1 }\@nil
+ }%
+ \typeout{^^J\unexpanded{#1}}%
+ \typeout{Number of spaces,
+ #2 end-of-line characters: \the\@tempcnta.}%
+}
\newcommand\ifnullTF[1]{%
\usename{@\ifnum\pdfstrcmp{}{\detokenize{#1}}%
=\z@pt first\else second\fi oftwo}%
@@ -1223,10 +1280,10 @@
}
\newcommand\xifblankFT[1]{\xifblankTF{#1}\@secondoftwo\@firstoftwo}
\newcommand*\ifdefTF[1]{%
- \usename{@\ifx\noboundary#1\noboundary second\else first\fi oftwo}%
- {\usename{@\ifx#1\cpt@undefined second\else
- \ifx#1\relax second\else first\fi\fi oftwo}}%
- \@secondoftwo
+ \ifblankTF{#1}\@secondoftwo{%
+ \usename{@\ifx#1\cpt@undefined second\else
+ \ifx#1\relax second\else first\fi\fi oftwo}%
+ }%
}
\newcommand*\ifdefFT[1]{\ifdefTF{#1}\@secondoftwo\@firstoftwo}
\newcommand*\oifdefTF[1]{\expandafter\ifdefTF\expandafter{#1}}
@@ -1234,12 +1291,15 @@
\newcommand*\xifdefTF[1]{\cptexpandarg\ifdefTF{#1}}
\newcommand*\xifdefFT[1]{\cptexpandarg\ifdefFT{#1}}
\newcommand*\ifcsndefTF[1]{%
- \ifcsname#1\endcsname
- \expandafter\@firstofone
- \else
- \cptthreexp\@secondoftwo\expandafter\@gobble
- \fi
- {\aftercsname\ifdefTF{#1}}%
+ \ifblankTF{#1}\@gobble{%
+ \ifcsname#1\endcsname
+ \expandafter\@firstofone
+ \else
+ \cptthreexp\@secondoftwo\expandafter\@gobble
+ \fi
+ }{%
+ \aftercsname\ifdefTF{#1}%
+ }%
}
\newcommand*\ifcsndefFT[1]{\ifcsndefTF{#1}\@secondoftwo\@firstoftwo}
\newcommand*\oifcsndefTF[1]{\expandafter\ifcsndefTF\expandafter{#1}}
@@ -1322,23 +1382,23 @@
\ifcpt@st\else\long\fi
#1\def\reserved@b
}
-\robust@def*\@ltx@warn{\@latex@warning@no@line}
-\robust@def*\@ltx@info{\@latex@info@no@line}
-\robust@def*\@ltx@err{\@latex@error}
-\robust@def\cpt@testopt#1#2{\CurrIfnextchar[{#1}{#1[{#2}]}}
-\robust@def*\cpt@ifbrack#1#2{\CurrIfnextchar[{#1}{#2}}
+\robust@def*\ltx@warn{\@latex@warning@no@line}
+\robust@def*\ltx@info{\@latex@info@no@line}
+\robust@def*\ltx@err{\@latex@error}
+\robust@def\cpt@testopt#1#2{\ifnextcharTF[{#1}{#1[{#2}]}}
+\robust@def*\cpt@ifbrack#1#2{\ifnextcharTF[{#1}{#2}}
\new@def*\cpt@xtestopt#1#2#3{%
\cpt@xifbrack#1\\[\\{#2#1}{#2[{#3}]{#1}}%
}
\new@def*\cpt@xifbrack#1[#2\\#3#{%
\usename{@\ifblankTF{#1#2}{first}{second}oftwo}%
}
-\robust@def\cpt@testpnopt#1#2{\CurrIfnextchar({#1}{#1({#2})}}
-\robust@def\cpt@testltopt#1#2{\CurrIfnextchar<{#1}{#1<{#2}>}}
-\robust@def\cpt@ifplus#1{\CurrIfnextchar+{\@firstoftwo{#1}}}
-\robust@def\cpt@ifclam#1{\CurrIfnextchar!{\@firstoftwo{#1}}}
-\robust@def\cpt@ifprime#1{\CurrIfnextchar'{\@firstoftwo{#1}}}
-\robust@def\cpt@ifeql#1{\CurrIfnextchar={\@firstoftwo{#1}}}
+\robust@def\cpt@testpnopt#1#2{\ifnextcharTF({#1}{#1({#2})}}
+\robust@def\cpt@testltopt#1#2{\ifnextcharTF<{#1}{#1<{#2}>}}
+\robust@def\cpt@ifplus#1{\ifnextcharTF+{\@firstoftwo{#1}}}
+\robust@def\cpt@ifclam#1{\ifnextcharTF!{\@firstoftwo{#1}}}
+\robust@def\cpt@ifprime#1{\ifnextcharTF'{\@firstoftwo{#1}}}
+\robust@def\cpt@ifeql#1{\ifnextcharTF={\@firstoftwo{#1}}}
\robust@def\cpt@testst#1{\cpt@ifstar{\cpt@sttrue#1}{\cpt@stfalse#1}}
\robust@def\cpt@testpl#1{\cpt@ifplus{\cpt@pltrue#1}{\cpt@plfalse#1}}
\robust@def\cpt@testpm#1{\cpt@ifprime{\cpt@pmtrue#1}{\cpt@pmfalse#1}}
@@ -1346,11 +1406,10 @@
\robust@def\cpt@teststpl#1{\cpt@testst{\cpt@testpl{#1}}}
\robust@def\cpt@teststpm#1{\cpt@testst{\cpt@testpm{#1}}}
\robust@def\cpt@teststopt#1#2{\cpt@testst{\cpt@testopt{#1}{#2}}}
-% */' -> don't define, otherwise attempt to define:
\robust@def*\cptmaybedef{\cpt@teststpm\cpt@maybedef}
\robust@def*\cpt@maybedef#1{%
- \if@boolTF{cpt@st}\@firstoftwo{%
- \if@boolTF{cpt@pm}\@firstoftwo\@secondoftwo
+ \ifboolTF{cpt@st}\@firstoftwo{%
+ \ifboolTF{cpt@pm}\@firstoftwo\@secondoftwo
}{%
\@gobble
}{%
@@ -1379,11 +1438,8 @@
\trim@@space{#1}\cpt@tempa
\trim@@space{#2}\cpt@tempb
\cpt@fullleterr\cpt@tempa\cpt@tempb
- \if@test
- \cptthreexp\let\expandafter\cpt@tempa\cpt@tempb
- \else
- \cptthreexp\newletcs\expandafter\cpt@tempa\cpt@tempb
- \fi
+ \csname\if@test let\else newletcs\fi
+ \cptthreexp\endcsname\expandafter\cpt@tempa\cpt@tempb
\oifdefFT\cpt@tempb{}{%
\ifcsndefTF{\expandafter\string\cpt@tempb}{%
\letcsntocsn{\expandafter\string\cpt@tempa}
@@ -1427,7 +1483,6 @@
\gdef#2##1\string\count##2&{\noexpand\ifblankTF{##1}}%
}
\cpt@ifcounter@a\cpt@ifcounter@a\cpt@ifcounter@b
-% Similar to \ifcounterTF. Don't call this \ifdimTF:
\new@gdef*\ifdimenTF#1{%
\ifstrcmpTF\dimen{#1}\@secondoftwo{%
\expandafter\cpt@ifdimen@a\meaning#1:&%
@@ -1441,47 +1496,45 @@
\endgroup
\robust@def*\pushnumber#1{%
- \ifdefTF{#1}{%
- \ifcounterTF#1{%
- \global\advance#1\@ne
+ \ifsingletokenTF{#1}{%
+ \ifdefTF{#1}{%
+ \ifcounterTF#1{%
+ \global\advance#1\@ne
+ }{%
+ \xdef#1{\the\numexpr#1+1}%
+ }%
}{%
- \xdef#1{\the\numexpr#1+1}%
+ \chardef#1=\@ne
}%
}{%
- \chardef#1=\@ne
+ \cpt@notonetokenerr{#1}%
}%
}
\robust@def*\popnumber#1{%
- \ifdefTF{#1}{%
- \ifnumcmpTF#1=\z@pt{%
- \cpt@err{Counter or number '\string#1' is already 0}\@ehc
- }{%
- \ifcounterTF#1{%
- \global\advance#1\m@one
+ \ifsingletokenTF{#1}{%
+ \ifdefTF{#1}{%
+ \ifnumcmpTF#1=\z@pt{%
+ \cpt@err{Counter or number '\string#1' is already 0}\@ehc
}{%
- \xdef#1{\the\numexpr#1-1}%
+ \ifcounterTF#1{%
+ \global\advance#1\m@one
+ }{%
+ \xdef#1{\the\numexpr#1-1}%
+ }%
}%
+ }{%
+ \cpt@err{Counter or number '\string#1' is undefined}\@ehc
}%
}{%
- \cpt@err{Counter or number '\string#1' is undefined}\@ehc
+ \cpt@notonetokenerr{#1}%
}%
}
\robust@def*\pushfunctions#1#2#3{%
- \ifdefTF{#3}{%
- \ifcounterTF{#3}{%
- \global\advance#3\@ne
- }{%
- \xdef#3{\the\numexpr#3+1}%
- }%
- }{%
- \chardef#3=\@ne
- }%
+ \pushnumber{#3}%
\begingroup
\edef\cpt@stack{\cptremovescape{#1}@stack}%
\ifcsndefTF\cpt@stack{}{\csn@gdef\cpt@stack{}}%
\toks@{}\toks1{}\escapechar92\relax
- % Using \csv@@loop or \csv@@parse here will bomb out,
- % because \pushfunctions is called within those loops:
\let\xp\expandcsonce
\def\push@do##1{%
\ifescapedTF{##1}{}{\cpt@notescapederr{##1}}%
@@ -1489,8 +1542,7 @@
\cptpassexpanded{%
\toks@{\the\toks@\let\xp\cpt@tempa\noexpand##1}%
\toks1{\the\toks1\let\noexpand##1\xp\cpt@tempa
- \undefcs\xp\cpt@tempa
- }%
+ \undefcs\xp\cpt@tempa}%
}%
}%
\cptpushparse{#2}%
@@ -1522,29 +1574,25 @@
\cpt@err{Unknown stack for function \string#1}\@ehc
\@gobble
}%
- \ifcounterTF{#2}{%
- \global\advance#2\m@one
- }{%
- \xdef#2{\the\numexpr#2-1}%
- }%
+ \popnumber{#2}%
}
-\chardef\cpt@optionstacklimit4
+\chardef\cpt@optionstacklimit=4
\robust@def*\cpt@pushstate#1#2#3{%
\ifnum#3>\cpt@optionstacklimit\relax
- \let\reserved@a\cpt@optionstacklimit
+ \let\x\cpt@optionstacklimit
\@latex@error{Current option/key state is being pushed
- \MsgBrk beyond level '\reserved@a'. I suspect infinite
+ \MsgBrk beyond level '\x'. I suspect infinite
\MsgBrk re-entrance. If this isn't the case, please
\MsgBrk set package option 'option-stack-limit' or
'key-stack-limit' to the required value in
\MsgBrk\noexpand\documentclass
}\@ehc
\fi
- \expandafter\pushfunctions\expandafter#1\expandafter{#2}#3%
+ \expandafter\pushfunctions\expandafter#1\expandafter{#2}{#3}%
}
-\robust@def*\cpt@popstate#1#2{\popfunctions#1#2}
+\robust@def*\cpt@popstate#1#2{\popfunctions{#1}{#2}}
\robust@def*\cpt@stchoose#1#2#3#4{%
- \if@boolTF{#1}{%
+ \ifboolTF{#1}{%
\ifmacroTF{#2}{%
\let#3=#2%
}{%
@@ -1582,9 +1630,6 @@
\gletcs#1\cpt@tempa
\endgroup
}
-% \dofunclist[<parser>]{<list>}
-% \dofunclist*[<parser>]{<listcmd>}
-% This expects \do, which can be multi-parametered.
\robust@def*\dofunclist{%
\pushnumber\dofunclistnr
\begingroup
@@ -1599,23 +1644,23 @@
\csv@@parse
}
\robust@def*\csv@@loop{%
- \let\cpt@nmlz\cptfalse
- \let\cpt@inkv\cptfalse
+ \let\cpt@nmlz\cptswfalse
+ \let\cpt@inkv\cptswfalse
\cpt@teststopt\cpt@csvkvparse,%
}
\robust@def*\csv@@parse{%
- \let\cpt@nmlz\cpttrue
- \let\cpt@inkv\cptfalse
+ \let\cpt@nmlz\cptswtrue
+ \let\cpt@inkv\cptswfalse
\cpt@teststopt\cpt@csvkvparse,%
}
\robust@def*\kv@@loop{%
- \let\cpt@nmlz\cptfalse
- \let\cpt@inkv\cpttrue
+ \let\cpt@nmlz\cptswfalse
+ \let\cpt@inkv\cptswtrue
\cpt@teststopt\cpt@csvkvparse,%
}
\robust@def*\kv@@parse{%
- \let\cpt@nmlz\cpttrue
- \let\cpt@inkv\cpttrue
+ \let\cpt@nmlz\cptswtrue
+ \let\cpt@inkv\cptswtrue
\cpt@teststopt\cpt@csvkvparse,%
}
\new@def*\cpt@csvnil{\cpt@csvnil}
@@ -1629,7 +1674,7 @@
\cpt@err{'\string\csv@do' or '\string\kv@do' undefined}\@ehc
}%
\def\cpt@csvdo@a{%
- \if@boolTF{loopbreak}{%
+ \ifboolTF{loopbreak}{%
\gobble@to@sentinel\cpt@csvnil#1%
}{%
\cpt@csvdo.%
@@ -1642,7 +1687,7 @@
\loopbreaktrue
}{%
\ifcsemptyTF\cpt@csvarg{%
- \if@boolFT{cpt@useempty}{}{\sav@csv@do{}\relax}%
+ \ifdefboolFT{cpt@useempty}{}{\sav@csv@do{}\relax}%
}{%
\expandafter\sav@csv@do\expandafter{\cpt@csvarg}\relax
}%
@@ -1650,10 +1695,10 @@
\cpt@csvdo@a
}%
}%
- \ifswitchFT{cpt@nmlz}{}{%
+ \ifdefswitchFT{cpt@nmlz}{}{%
\ifcsemptyTF\cpt@csvarg{}{%
\cpt@sttrue
- \usename{cpt@\ifswitchTF{cpt@inkv}{kv}{csv}normalize}%
+ \usename{cpt@\ifdefswitchTF{cpt@inkv}{kv}{csv}normalize}%
[#1]\cpt@csvarg
}%
}%
@@ -1665,13 +1710,56 @@
\undefcsset{\csv@do,\kv@do,\dofunclistnr}%
\fi
}
-%% Robust, multi-level, general-purpose tsv processor:
+\robust@def\indris@nil#1\fi#2\indris@do#3\indris@nil{\fi#1#2}
+\newvariables{if}{lastindris}[false]
+\robust@def*\indrisloop{\cpt@teststopt\cpt@indrisloop{,}}
+\robust@def*\cpt@indrisloop[#1]#2#3{%
+ \pushfunctions\cpt@indrisloop
+ {\indris@do,\indrisnr,\iflastindris,%
+ \ifloopbreak,\user@do,\getnextindris}\indrisdepth
+ \cpt@stchoose{cpt@st}{#2}\cpt@rsvda\indrisloop
+ \cpt@sttrue\cpt@csvnormalize[#1]\cpt@rsvda
+ \lastindrisfalse\loopbreakfalse
+ \chardef\indrisnr\z@pt
+ \ifsingletokenTF{#3}{%
+ \ifmacroTF{#3}{}{\cpt@notcserr{#3}}%
+ }{%
+ \cpt@notonetokenerr{#3}%
+ }%
+ \let\user@do#3%
+ \def\getnextindris##1#1##2\indris@nil{%
+ \edef\nextindris{\unexpanded\expandafter{\@gobble##1}}%
+ \letcsntocs{nextindris@\cptrm\indrisdepth}\nextindris
+ }%
+ \def\indris@do##1#1##2\indris@nil{%
+ \edef\currindris{\unexpanded\expandafter{\@gobble##1}}%
+ \letcsntocs{currindris@\cptrm\indrisdepth}\currindris
+ \ifcat$\detokenize\expandafter{\@gobble##2.}$\indris@nil
+ \lastindristrue\fi
+ \ifboolTF{lastindris}{%
+ \def\nextindris{}%
+ \csn@def{nextindris@\cptrm\indrisdepth}{}%
+ }{%
+ \ifcsvbreakTF{##1}\loopbreak\relax
+ \ifboolTF{loopbreak}{%
+ \defpass\reserved@a####1\indris@nil{\cptdoremainder{####1}}%
+ }{%
+ \getnextindris.##2\indris@nil
+ }%
+ }%
+ \pushnumber\indrisnr
+ \expandafter\user@do\expandafter{\@gobble##1}%
+ \indris@do.##2\indris@nil
+ }%
+ \expandafter\indris@do\expandafter.\cpt@rsvda#1\indris@nil
+ \popfunctions\cpt@indrisloop\indrisdepth
+}
\robust@def*\tsv@@loop{%
- \let\tsv@inparse\cptfalse
+ \let\tsv@inparse\cptswfalse
\cpt@testst\cpt@tsvparse@a
}
\robust@def*\tsv@@parse{%
- \let\tsv@inparse\cpttrue
+ \let\tsv@inparse\cptswtrue
\cpt@testst\cpt@tsvparse@a
}
\new@def*\cpt@tsvnil{\cpt@tsvnil}
@@ -1692,13 +1780,12 @@
\fi
}
\robust@def*\cpt@tsvparse@b{%
- \if@boolTF{loopbreak}{%
+ \ifboolTF{loopbreak}{%
\gobble@to@sentinel\cpt@tsvnil{}%
}{%
\begingroup
\let\bgr@up\bgroup
\let\bgroup\cpt@undefined
- % Don't use \CurrIfnextchar here:
\cpt@ifnextchar\bgr@up\cpt@tsvparse@c\cpt@tsvparse@c
}%
}
@@ -1725,21 +1812,27 @@
}
% \tsv@@parse does preserve outer braces but sometimes this
% isn't required, necessitating a call to a brace stripper.
-% \siso@@loop strips outer braces in its arguments, but can
+% \siso@@loop strips outer braces in its arguments and
+% doesn't trim leading and trailing spaces, but can
% be nested to any level:
\new@def*\cpt@sisonil{\cpt@sisonil}
\robust@def*\siso@@loop#1{%
- \pushfunctions\siso@@loop{\siso@doo}\cpt@sisodepth
+ \pushfunctions\siso@@loop{\sav@siso@do,\ifloopbreak}\cpt@sisodepth
\ifdefTF\siso@do{}{\cpt@notdeferr\siso@do}%
- \let\siso@doo\siso@do
+ \let\sav@siso@do\siso@do
+ \loopbreakfalse
\cpt@sisoloop#1\cpt@sisonil
\popfunctions\siso@@loop\cpt@sisodepth
- \undefcs\siso@do
+ \ifnum\cpt@sisodepth=\z@pt\undefcs\siso@do\fi
}
\robust@def*\cpt@sisoloop#1{%
- \edef\reserved@g{\unexpanded{#1}}%
- \ifxTF\reserved@g\cpt@sisonil{}{%
- \siso@doo{#1}\relax\cpt@sisoloop
+ \edef\siso@arg{\unexpanded{#1}}%
+ \ifxTF\siso@arg\cpt@sisonil{}{%
+ \ifboolTF{loopbreak}{%
+ \gobble@to@sentinel\cpt@sisonil{}%
+ }{%
+ \sav@siso@do{#1}\relax\cpt@sisoloop
+ }%
}%
}
\robust@def*\cpt@oncurrlevel#1#2{%
@@ -1754,10 +1847,16 @@
\cptexpandsecond{#1}
{\noexpandcsn{\cptgobblescape#2@\romannumeral\curr@level}}%
}
-\new@def*\cptliststack#1#2{%
- \ifdefFT{#2}
- {}
- {\ifxTF#2\@empty{}{\expandcsonce{#2}#1}}%
+\new@def*\csliststack#1#2{%
+ \ifdefFT{#2}{}{%
+ \ifxTF#2\@empty{}{\expandcsonce{#2}#1}%
+ }%
+}
+\new@def*\csnliststack#1#2{%
+ \expandafter\ifdefFT\csname#2\endcsname{}{%
+ \expandafter\ifxTF\csname#2\endcsname\@empty{}%
+ {\expandafter\expandcsonce\csname#2\endcsname#1}%
+ }%
}
\new@def\cptafterfi#1\fi{\fi#1}
\new@def\cptafterelsefi#1\else#2\fi{\fi#1}
@@ -1820,7 +1919,7 @@
\MsgBrk submitted to \string\cptonlypreamble:
ignored}%
}{%
- \xdef\cpt@preamblecmdhook{\cptliststack{}%
+ \xdef\cpt@preamblecmdhook{\csliststack{}%
\cpt@preamblecmdhook\unexpanded{\do##1}%
}%
}%
@@ -1832,6 +1931,7 @@
\csv@@parse[,]{#1}%
\endgroup
}
+\new@def*\cpt@newlinespaces{^^J\@spaces\@spaces}
\robust@def*\cptelementcount{\cpt@teststopt\cpt@elemcount,}
\robust@def*\cpt@elemcount[#1]#2{%
\begingroup
@@ -1843,10 +1943,8 @@
\expandafter\csv@@loop\reserved@a[#1]{#2}%
\postgroupdef\cpt@elemnr\endgroup
}
-% Eg, \ifelemcountTF[;](>)[2]{a;b;c}{T}{F};
-% * -> #4 is a macro
\robust@def*\ifelemcountTF{%
- \cpt@testst{\cpt@testopt\cpt@ifelemcount@a,}%
+ \cpt@teststopt\cpt@ifelemcount@a,%
}
\robust@def*\cpt@ifelemcount@a[#1]{%
\cpt@testpnopt{\cpt@ifelemcount@b{#1}}=%
@@ -1874,9 +1972,9 @@
\def\csv@do##1{%
\xifinsetTF{\detokenize{#1##1#1}}
{\parser\cptoxdetok\cpt@currstack\parser}{%
- \xdef\duplicates{\cptliststack#1\duplicates\unexpanded{##1}}%
+ \xdef\duplicates{\csliststack#1\duplicates\unexpanded{##1}}%
}{%
- \edef\cpt@currstack{\cptliststack#1\cpt@currstack\unexpanded{##1}}%
+ \edef\cpt@currstack{\csliststack#1\cpt@currstack\unexpanded{##1}}%
}%
}%
\expandafter\csv@@parse\reserved@a[#1]{#2}%
@@ -1884,13 +1982,8 @@
{\endgroup\@firstoftwo}{\endgroup\@secondoftwo}%
}
\new@def*\ifcsnullTF#1{%
- % Don't use \ifxTF here:
- \ifcondTF\expandafter\ifx\expandafter
- \noboundary\@gobble#1.\noboundary\fi{%
- \@secondoftwo
- }{%
- \ifcondTF\expandafter\ifx\expandafter
- \noboundary\@gobble#1\noboundary\fi{%
+ \ifblankTF{#1}\@secondoftwo{%
+ \expandafter\ifblankTF\expandafter{\@gobble#1}{%
\ifxTF#1\@empty
}{%
\@secondoftwo
@@ -1928,13 +2021,10 @@
\ifcsnnullTF{#1}\@secondoftwo\@firstoftwo
}\@secondoftwo
}
-% For private use only where #1 is surely a single token.
-% For reasons of efficiency, we don't want to confirm
-% here if #1 is actually a single token:
+%% For private use only:
\new@def*\simpleexpandarg#1#2{\expandafter#1\expandafter{#2}}
\newletcs\s@expandarg=\simpleexpandarg
%%--
-
\new@def*\expandcsonce#1{\unexpanded\expandafter{#1}}
\new@def*\expandcsnonce#1{\aftercsname\expandcsonce{#1}}
\new@def*\expandcstwice#1{\unexpanded\cptthreexp{#1}}
@@ -2043,21 +2133,33 @@
\fi
\endgroup
}
-\new@def*\ifboolTF#1{%
- \ifcsndefTF{if#1}{%
- \if@boolTF{#1}%
+\new@def*\ifdefboolTF#1{%
+ \ifblankTF{#1}{%
+ \cpt@err{Empty boolean}\@ehc
}{%
- \cpt@err{Boolean '\@backslashchar#1' undefined}\@ehc
+ \ifcsndefTF{if#1}{%
+ \ifboolTF{#1}%
+ }{%
+ \cpt@err{Boolean '\@backslashchar#1' undefined}\@ehc
+ }%
}%
}
-\new@def*\ifboolFT#1{\ifboolTF{#1}\@secondoftwo\@firstoftwo}
-\new@def*\ifbooleanTF#1{%
- \ifboolTF{#1}{\endgroup\@firstoftwo}{\endgroup\@secondoftwo}%
-}
-\new@def*\if@boolTF#1{%
+\new@def*\ifdefboolFT#1{\ifdefboolTF{#1}\@secondoftwo\@firstoftwo}
+\new@def*\ifboolTF#1{%
\usename{@\usename{if#1}first\else second\fi oftwo}%
}
-\new@def*\if@boolFT#1{\if@boolTF{#1}\@secondoftwo\@firstoftwo}
+\new@def*\ifboolFT#1{\ifboolTF{#1}\@secondoftwo\@firstoftwo}
+\new@def*\ifbooleanTF#1#{%
+ \ifsingletokenTF{#1}{%
+ \ifescapedTF{#1}{%
+ \ifdefboolTF{\cptremovescape#1}\@firstoftwo\@secondoftwo
+ }{%
+ \cpt@notescapederr
+ }%
+ }{%
+ \cpt@notonetokenerr{#1}%
+ }%
+}
\new@def\cptiterate#1\repeat{\cpt@iterate\@gobble{#1}}
\newletcs\cptloop=\cptiterate
\new@def\cpt@iterate\@gobble#1{%
@@ -2102,6 +2204,9 @@
\remove@to@nnil<=>\@nnil first\else second\fi oftwo}%
}
\new@def*\ifnumcmpFT#1#{\usename{@\ifnumcmpTF#1{second}{first}oftwo}}
+\new@def*\ifnumtestTF#1#2#3{%
+ \usename{@\ifnum\numexpr#1#2\numexpr#3 first\else second\fi oftwo}%
+}
\new@def*\ifdimcmpTF#1#{%
\usename{@\ifdim\dimexpr\cpt@dimlt\cpt@dimgt\cpt@dimeq#1%
\remove@to@nnil<=>\@nnil first\else second\fi oftwo}%
@@ -2175,14 +2280,49 @@
\usename{@\ifnumoddTF#1{second}{first}oftwo}%
}
\newletcs\ifnumevenTF\ifnumoddFT
-\robust@def*\cptnumdef#1#2{\edef#1{\the\numexpr#2}}
-\robust@def*\cptdimdef#1#2{\edef#1{\the\dimexpr#2}}
-\robust@def*\cptnumadd#1#2{\edef#1{\the\numexpr#1+#2}}
-\robust@def*\cptdimadd#1#2{\edef#1{\the\dimexpr#1+#2}}
-\robust@def*\csnnumdef#1#2{\csn@edef{#1}{\the\numexpr#2}}
-\robust@def*\csndimdef#1#2{\csn@edef{#1}{\the\dimexpr#2}}
-\robust@def*\csnnumadd#1#2{\csn@edef{#1}{\the\numexpr#1+#2}}
-\robust@def*\csndimadd#1#2{\csn@edef{#1}{\the\dimexpr#1+#2}}
+\robust@def*\cptnumexpr{\cpt@testcl{\cpt@numexpr{num}}}
+\robust@def*\cptdimexpr{\cpt@testcl{\cpt@numexpr{dim}}}
+\robust@def*\cptglueexpr{\cpt@testcl{\cpt@numexpr{glue}}}
+\robust@def*\cptmuexpr{\cpt@testcl{\cpt@numexpr{mu}}}
+\new@def*\cpt@numexpr#1#2#3{%
+ \ifsingletokenTF{#2}{}{\cpt@notonetokenerr{#2}}%
+ \ifescapedTF{#2}{}{\cpt@notescapederr{#2}}%
+ \ifdefTF{#2}{%
+ \ifcpt@cl\global\fi#2=\usename{#1expr}#3\relax\relax
+ }{%
+ \def\reserved@a##1#1##2##3\@nil{%
+ \usename{new##2}#2\relax
+ }%
+ \reserved@a num{count}dim{dimen}glue{skip}mu{muskip}\@nil
+ \ifcpt@cl\global\fi#2=\usename{#1expr}#3\relax\relax
+ }%
+}
+\robust@def*\cptnumdef{\cpt@testcl{\cpt@numdef{num}}}
+\robust@def*\cptdimdef{\cpt@testcl{\cpt@numdef{dim}}}
+\robust@def*\cptgluedef{\cpt@testcl{\cpt@numdef{glue}}}
+\robust@def*\cptmudef{\cpt@testcl{\cpt@numdef{mu}}}
+\new@def*\cpt@numdef#1#2#3{%
+ \ifsingletokenTF{#2}{}{\cpt@notonetokenerr{#2}}%
+ \ifescapedTF{#2}{}{\cpt@notescapederr{#2}}%
+ \ifcpt@cl\global\fi\edef#2{\the\usename{#1expr}#3}%
+}
+\robust@def*\cptnumadd{\cpt@testcl{\cpt@numadd{num}}}
+\robust@def*\cptdimadd{\cpt@testcl{\cpt@numadd{dim}}}
+\robust@def*\cptglueadd{\cpt@testcl{\cpt@numadd{glue}}}
+\robust@def*\cptmuadd{\cpt@testcl{\cpt@numadd{mu}}}
+\new@def*\cpt@numadd#1#2#3{%
+ \ifsingletokenTF{#2}{}{\cpt@notonetokenerr{#2}}%
+ \ifescapedTF{#2}{}{\cpt@notescapederr{#2}}%
+ \ifdefTF{#2}{%
+ \ifcpt@cl\global\fi\edef#2{\the\usename{#1expr}#2+#3}%
+ }{%
+ \ifcpt@cl\global\fi\edef#2{\the\usename{#1expr}#3}%
+ }%
+}
+\robust@def*\csnnumdef{\cpt@testcl{\aftercsname{\cpt@numdef{num}}}}
+\robust@def*\csndimdef{\cpt@testcl{\aftercsname{\cpt@numdef{dim}}}}
+\robust@def*\csnnumadd{\cpt@testcl{\aftercsname{\cpt@numadd{num}}}}
+\robust@def*\csndimadd{\cpt@testcl{\aftercsname{\cpt@numadd{dim}}}}
\new@edef*\cpt@leftbracechar{%
\expandafter\@car\string{\@nil\iffalse}\fi
}
@@ -2230,15 +2370,31 @@
{\expandafter\ifstrcmpTF\expandafter
{\romannumeral-`\q\cpttrimspaces{#2}}}
}
-
\robust@def\ifstreqFT#1#2{\ifstreqTF{#1}{#2}\@secondoftwo\@firstoftwo}
\robust@def\oifstreqTF#1#2{\cptexpandtwoargsonce\ifstreqTF{#1}{#2}}
\robust@def\oifstreqFT#1#2{\cptexpandtwoargsonce\ifstreqFT{#1}{#2}}
\robust@def\xifstreqTF#1#2{\cptexpandtwoargs\ifstreqTF{#1}{#2}}
\robust@def\xifstreqFT#1#2{\cptexpandtwoargs\ifstreqFT{#1}{#2}}
+\newcommand\ifbracedTF[3]{%
+ \romannumeral
+ \ifcase
+ \iffalse{{{\fi\expandafter\expandafter\expandafter
+ \@gobble\expandafter\expandafter\expandafter
+ {\expandafter\expandafter\expandafter{\expandafter
+ \iffalse\expandafter}\expandafter}\expandafter\fi
+ \string#1}\m@ne}\@ne}\z@
+ \expandafter\@secondoftwo
+ \or
+ \expandafter\@secondoftwo
+ \else
+ \expandafter\@firstoftwo
+ \fi
+ {0 #2}{0 #3}%
+}
+\new@def*\ifbracedFT#1{\ifbracedTF{#1}\@secondoftwo\@firstoftwo}
% Ulrich Diez 06/02/2011:
-\new@def*\ifbracedTF#1#2#3{%
+\new@def*\ud@ifbracedTF#1#2#3{%
\romannumeral
\ifblankTF{#1}{%
0 #3%
@@ -2254,13 +2410,12 @@
}
%%--
-\new@def*\ifbracedFT#1{\ifbracedTF{#1}\@secondoftwo\@firstoftwo}
\new@def*\ifleftbracedTF#1{%
\ifblankTF{#1}{%
\@secondoftwo
}{%
- \@nameuse{@\if\expandafter\@car\detokenize{#1}\@nil
- \expandafter\@car\string{\@nil\ifnum0=`}\fi
+ \@nameuse{@\if\expandafter\cpt@car\detokenize{#1}\car@nil
+ \expandafter\cpt@car\string{\car@nil\ifnum0=`}\fi
first\else second\fi oftwo}%
}%
}
@@ -2347,7 +2502,6 @@
\robust@def*\ifsingletokenFT#1{%
\ifsingletokenTF{#1}\@secondoftwo\@firstoftwo
}
-% Don't test for \ifleadspaceTF:
\new@def\ifsingletoken@sp@TF#1#2#3{%
\romannumeral\ifblankTF{#1}{%
\@secondoftwo
@@ -2377,7 +2531,7 @@
}{%
\ifsingletokenTF{#1}{%
\xifinsetTF{\detokenize{#1}}\cpt@parserlist{%
- #2%
+ #2% Don't put \relax here!
}{%
\cpt@listparsererr{#1}%
}%
@@ -2386,11 +2540,11 @@
}%
}%
}
-\robust@def*\cpt@checklistparser@b#1{%
+\robust@def*\cpt@ch@cklistparser#1{%
\ifblankTF{#1}{%
\cpt@listparsererr{#1}%
}{%
- \expandafter\ifsecondis@nnil\string#1\cpt@nnil\cpt@nil{%
+ \expandafter\ifsecondisnilTF\string#1\cpt@nnil\cpt@nil{%
\xifinsetTF{\detokenize{#1}}\cpt@parserlist{}{%
\cpt@listparsererr{#1}%
}%
@@ -2402,7 +2556,6 @@
\robust@def*\cpt@listparsererr#1{%
\cpt@err{Invalid list parser '\detokenize{#1}'}\@ehc
}
-\new@def*\ifsecondis@nnil#1#2\cpt@nil{\ifxTF#2\cpt@nnil}
\robust@def*\postgroupdef#1\endgroup{%
\cptpassexpanded{\endgroup\cpt@csexit{#1}}%
}
@@ -2459,7 +2612,6 @@
\unexpanded{#1}%
}%
}
-
\begingroup
\catcode`\&=7
\new@gdef*\cptfullexpand#1{%
@@ -2484,7 +2636,6 @@
}
\endgroup
-% [<default act>]{<teststr>}{<{str1}{act1}{str2}{act2}...>}
\new@def*\IfStrEqCase#1{\cpt@xtestopt{#1}\cpt@ifstreqcase{}}
\new@def\cpt@ifstreqcase[#1]#2#3{%
\expandafter\cptswapfirstbraced\expandafter{#2}%
@@ -2511,8 +2662,6 @@
}%
}%
}
-% Test if <str1>, etc, is in <teststr>
-% [<default act>]{<teststr>}{<{str1}{act1}{str2}{act2}...>}
\new@def*\IfStrPresentCase#1{\cpt@xtestopt{#1}\cpt@ifstrincase{}}
\new@def\cpt@ifstrincase[#1]#2#3{%
\expandafter\cptswapfirstbraced\expandafter{#2}%
@@ -2532,7 +2681,7 @@
}
\robust@def\ifinsetTF#1#2{%
\cpt@in{#1}{#2}%
- \csname @\ifcpt@in first\else second\fi oftwo\endcsname
+ \usename{@\ifcpt@in first\else second\fi oftwo}%
}
\robust@def\ifinsetFT#1#2{\ifinsetTF{#1}{#2}\@secondoftwo\@firstoftwo}
\robust@def\oifinsetTF#1#2{\cptexpandtwoargsonce\ifinsetTF{#1}{#2}}
@@ -2557,13 +2706,13 @@
\begingroup
\toks@{\endgroup
\ifdefTF#4{%
- \if@boolTF{cpt@st}{%
- \usename{protected@#2def}#4{\cptliststack#3#4#1{#5}}%
+ \ifboolTF{cpt@st}{%
+ \usename{protected@#2def}#4{\csliststack#3#4#1{#5}}%
}{%
- \usename{#2def}#4{\cptliststack#3#4#1{#5}}%
+ \usename{#2def}#4{\csliststack#3#4#1{#5}}%
}%
}{%
- \if@boolTF{cpt@st}{%
+ \ifboolTF{cpt@st}{%
\usename{protected@#2def}#4{#1{#5}}%
}{%
\usename{#2def}#4{#1{#5}}%
@@ -2578,13 +2727,13 @@
}
\robust@def*\cptfilterremovecsv{%
\begingroup
- \let\cpt@inkv\cptfalse
+ \let\cpt@inkv\cptswfalse
\let\temp@parse\csv@@parse
\cpt@testopt\cpt@filterremoveelements{,}%
}
\robust@def*\cptfilterremovekv{%
\begingroup
- \let\cpt@inkv\cpttrue
+ \let\cpt@inkv\cptswtrue
\let\temp@parse\kv@@parse
\cpt@testopt\cpt@filterremoveelements{,}%
}
@@ -2651,7 +2800,7 @@
\edef\cpt@update{\unexpanded{#3}}%
}%
\def\cpt@add##1{%
- \edef#2{\cptliststack#1#2\everymergeitem{\expandcsonce{##1}}}%
+ \edef#2{\csliststack#1#2\everymergeitem{\expandcsonce{##1}}}%
}%
\expandafter\def\temp@do##1{%
\cpt@choicefdfalse
@@ -2669,7 +2818,7 @@
\fi
}%
\cptexpandargonce{\def#2{}\temp@parse[#1]}#2%
- \if@boolTF{cpt@choicefd}{}{\cpt@add\cpt@merge@a}%
+ \ifboolTF{cpt@choicefd}{}{\cpt@add\cpt@merge@a}%
}%
\ifcsnullTF#2{%
\edef#2{\expandcsonce\cpt@update}%
@@ -2694,14 +2843,12 @@
}%
\xifinsetTF{\detokenize{#1##1#1}}{\pser\cptoxdetok{#2}\pser}{%
\expandafter\cpt@remove@b\expandafter#1#2#1\remove@nil
- \if@boolTF{removest}{%
+ \ifboolTF{removest}{%
\expandafter\cpt@remove@a\expandafter{\cpt@remove@c}%
}{}%
}{}%
}%
- \ifswitchTF{cpt@fromrem}{%
- % We're coming from \cptremoveelements, #3 has been
- % trimmed and #2 has already been normalized:
+ \ifdefswitchTF{cpt@fromrem}{%
\edef\cpt@remove@c{\unexpanded{#3}}%
}{%
\cpt@sttrue\cpt@csvnormalize[#1]#2%
@@ -2709,7 +2856,7 @@
}%
\let\cpt@remove@d#2%
\expandafter\cpt@remove@a\expandafter{\cpt@remove@c}%
- \ifswitchTF{cpt@fromrem}{}{%
+ \ifdefswitchTF{cpt@fromrem}{}{%
\ifx\cpt@remove@d#2\ifcpt@verbose
\cpt@warn{The list in \noexpand#2 not updated:
\MsgBrk perhaps something was wrong}%
@@ -2721,7 +2868,7 @@
\robust@def\cpt@removeelements[#1]#2#3{%
\begingroup
\edef\cpt@resa{\ifcpt@st*\fi}%
- \let\cpt@fromrem\cpttrue
+ \let\cpt@fromrem\cptswtrue
\cpt@sttrue\cpt@csvnormalize[#1]#2%
\long\def\csv@do##1{%
\expandafter\cptremoveoneelement\cpt@resa[#1]#2{##1}%
@@ -2741,14 +2888,12 @@
}%
\xifinsetTF{\detokenize{#1##1#1}}{\pser\cptoxdetok#2\pser}{%
\expandafter\cpt@replace@b\expandafter#1#2#1\rep@nil
- \if@boolTF{replst}{%
+ \ifboolTF{replst}{%
\expandafter\cpt@replace@a\expandafter{\cpt@replace@c}%
}{}%
}{}%
}%
- \ifswitchTF{cpt@fromrepl}{%
- % We're coming from \cptreplaceelements, #3 has been
- % trimmed and #2 has already been normalized:
+ \ifdefswitchTF{cpt@fromrepl}{%
\edef\cpt@replace@c{\unexpanded{#3}}%
}{%
\cpt@sttrue\cpt@csvnormalize[#1]#2%
@@ -2756,7 +2901,7 @@
}%
\let\cpt@replace@d#2%
\expandafter\cpt@replace@a\expandafter{\cpt@replace@c}%
- \ifswitchTF{cpt@fromrepl}{}{%
+ \ifdefswitchTF{cpt@fromrepl}{}{%
\ifx\cpt@replace@d#2\ifcpt@verbose
\cpt@warn{The list in \noexpand#2 not updated:
\MsgBrk something was wrong}%
@@ -2782,7 +2927,7 @@
}%
}%
}%
- \let\cpt@fromrepl\cpttrue
+ \let\cpt@fromrepl\cptswtrue
\cptexpandsecond\cpt@replace@d{%
\expandcsonce\cpt@replace@a#1\noboundary
\expandcsonce\cpt@replace@b#1\noboundary
@@ -2814,7 +2959,7 @@
}%
}%
}
-\robust@def*\csn@newif#1{%
+\robust@def*\csnnewif#1{%
\ifstrcmpTF{#1}{x}{%
\cpt@err{Redefining '\cptmakecs{ifx}'?}\@ehc
}{%
@@ -2825,21 +2970,32 @@
\robust@def*\csn@gdef{\aftercsname\gdef}
\robust@def*\csn@edef{\aftercsname\edef}
\robust@def*\csn@xdef{\aftercsname\xdef}
-\new@def*\cpt@csnd@f#1#2#3{%
- \ifcsndefTF{#3}{%
- \def\reserved@a{#3}\cpt@notdefinable
- }{%
- #1\l@ngrel@x\aftercsname\aftercsname{#2def}{#3}%
- }%
+\robust@def*\csndef{\cpt@starorlong{\cpt@csndef{}{}{}}}
+\robust@def*\csnpdef{\cpt@starorlong{\cpt@csndef{}{p}{}}}
+\robust@def*\csngdef{\cpt@starorlong{\cpt@csndef{}{}{g}}}
+\robust@def*\csnpgdef{\cpt@starorlong{\cpt@csndef{}{p}{g}}}
+\robust@def*\csnedef{\cpt@starorlong{\cpt@csndef{}{}{e}}}
+\robust@def*\csnpedef{\cpt@starorlong{\cpt@csndef{}{p}{e}}}
+\robust@def*\csnxdef{\cpt@starorlong{\cpt@csndef{}{}{x}}}
+\robust@def*\csnpxdef{\cpt@starorlong{\cpt@csndef{}{p}{x}}}
+\robust@def*\newcsndef{\cpt@starorlong{\cpt@csndef{n}{}{}}}
+\robust@def*\newcsnpdef{\cpt@starorlong{\cpt@csndef{n}{p}{}}}
+\robust@def*\newcsngdef{\cpt@starorlong{\cpt@csndef{n}{}{g}}}
+\robust@def*\newcsnpgdef{\cpt@starorlong{\cpt@csndef{n}{p}{g}}}
+\robust@def*\newcsnedef{\cpt@starorlong{\cpt@csndef{n}{}{e}}}
+\robust@def*\newcsnpedef{\cpt@starorlong{\cpt@csndef{n}{p}{e}}}
+\robust@def*\newcsnxdef{\cpt@starorlong{\cpt@csndef{n}{}{x}}}
+\robust@def*\newcsnpxdef{\cpt@starorlong{\cpt@csndef{n}{p}{x}}}
+\new@def*\cpt@csndef#1#2#3#4{%
+ \if#1n\relax
+ \ifcsndefTF{#4}{%
+ \def\reserved@a{#4}\cpt@notdefinable
+ }{}%
+ \fi
+ \if#2p\relax\let\reserved@a\protected\else
+ \let\reserved@a\relax\fi
+ \reserved@a\l@ngrel@x\aftercsname\aftercsname{#3def}{#4}%
}
-\robust@def*\csndef{\cpt@starorlong{\cpt@csnd@f{}{}}}
-\robust@def*\csnpdef{\cpt@starorlong{\cpt@csnd@f\protected{}}}
-\robust@def*\csngdef{\cpt@starorlong{\cpt@csnd@f{}{g}}}
-\robust@def*\csnpgdef{\cpt@starorlong{\cpt@csnd@f\protected{g}}}
-\robust@def*\csnedef{\cpt@starorlong{\cpt@csnd@f{}{e}}}
-\robust@def*\csnpedef{\cpt@starorlong{\cpt@csnd@f\protected{e}}}
-\robust@def*\csnxdef{\cpt@starorlong{\cpt@csnd@f{}{x}}}
-\robust@def*\csnpxdef{\cpt@starorlong{\cpt@csnd@f\protected{x}}}
\robust@def*\letcsntocs#1{\cptthreexp\let\usename{#1}}
\robust@def*\gletcsntocs#1{\global\cptthreexp\let\usename{#1}}
\robust@def*\letcstocsn#1#2{%
@@ -2873,7 +3029,8 @@
\robust@def*\undefcsset{\cpt@testst{\cpt@testcl\cpt@undefcsset}}
\robust@def*\cpt@undefcsset#1{%
\cpt@stchoose{cpt@st}{#1}\cpt@rsvda\undefcsset
- \cpt@sttrue\cpt@csvnormalize[,]\cpt@rsvda
+ \edef\cpt@rsvda
+ {\expandafter\cptcommanormalize\expandafter{\cpt@rsvda}}%
\def\do##1,{%
\ifnot@nil{##1}{%
\ifsingletoken@sp@TF{##1}{%
@@ -2891,13 +3048,12 @@
\expandafter\do\cpt@rsvda,\@nil,%
}
\robust@def*\cpttrimleadparsers#1#2{%
- \ifcat$\detokenize\expandafter{\@gobble#1.}$%
+ \ifblankTF{#1}{%
\cpt@err{Empty parser in \string\cpttrimleadparsers}\@ehc
- \fi
+ }{}%
\begingroup
\ifcat$\detokenize\expandafter\expandafter\expandafter
{\expandafter\@gobble#2.}$\cpt@defrelax\fi
- \cpt@relax
\def\reserved@e##1#1{%
\edef\reserved@a{\unexpanded\expandafter{\@gobble##1}}%
\ifx\reserved@a\@empty
@@ -2912,23 +3068,39 @@
\expandafter\reserved@e\expandafter.#2#1\noboundary
\postgroupdef#2\endgroup\cpt@relax
}
-\robust@def*\cpttrimparsers{\cpt@testopt\cpt@trimparsers{,}}
-\robust@def\cpt@trimparsers[#1]#2{%
+\robust@def\cpttrimtrailparsers#1#2{%
\begingroup
- \def\cpt@trima##1{%
- \xifinsetTF{##1\batchmode}{\cptoxdetok{#2}\batchmode}{%
- \def\reserved@a####1##1\batchmode{%
+ \def\cpt@trima{%
+ \xifinsetTF{\detokenize{#1}\noboundary}
+ {\cptoxdetok{#2}\noboundary}{%
+ \def\reserved@a####1#1\noboundary{%
\edef#2{\expandcsonce{\@gobble####1}}%
- \cpt@trima{##1}%
+ \cpt@trima
}%
- \expandafter\reserved@a\expandafter.#2\batchmode
- }{%
- \cpttrimleadparsers{##1}#2%
- }%
+ \expandafter\reserved@a\expandafter.#2\noboundary
+ }{}%
}%
- \s@expandarg\cpt@trima{\detokenize{#1}}%
+ \cpt@trima
\postgroupdef#2\endgroup
}
+\robust@def*\cpttrimparsers{\cpt@testopt\cpt@trimparsers{,}}
+\robust@def*\cpt@trimparsers[#1]#2{%
+ \ifsingletokenTF{#1}{%
+ \cpttrimleadparsers{#1}#2%
+ \cpttrimtrailparsers{#1}#2%
+ }{%
+ \cpt@notonetokenerr{#1}%
+ }%
+}
+\robust@def\cpt@stripsuffix#1#2{%
+ \ifblankTF{#2}{%
+ \cpt@err{Blank test token for \string\cpt@stripsuffix}\@ehc
+ }{%
+ \edef\reserved@a{%
+ \ifblankTF{#1}{}{\ifstrcmpTF{#1}{#2}{}{\unexpanded{#1}}}%
+ }%
+ }%
+}
\robust@def*\stripouterbraces{\cpt@testopt\cpt@stripouterbraces\@ne}
\robust@def\cpt@stripouterbraces[#1]{%
\begingroup
@@ -2998,8 +3170,6 @@
\repeat
\postgroupdef#3\endgroup
}
-
-% Expandable:
\edef\ifmacroTF#1{%
\noexpand\ifblankTF{#1}{%
\noexpand\@secondoftwo
@@ -3029,10 +3199,6 @@
{@\ifx\x\@backslashchar first\else second\fi oftwo}%
}
\robust@def*\ifescapedFT#1{\ifescapedTF{#1}\@secondoftwo\@firstoftwo}
-% \robustaliascount counts the number of 'robustified' commands.
-% It may be used to set a threshold for the no. of allowable
-% aliases. Only non-parametered macros may be aliased in the
-% following way!
\ifcsdefinable\maxrobustalias{\chardef\maxrobustalias20}
\newcommand*\cptrobustify[1]{%
\def\csv@do##1{%
@@ -3216,16 +3382,16 @@
}%
}
\new@def*\iftogFT#1{\iftogTF{#1}\@secondoftwo\@firstoftwo}
-\new@def*\cpttrue{00}
-\new@def*\cptfalse{01}
+\new@def*\cptswtrue{00}
+\new@def*\cptswfalse{01}
\def\reserved@a#1{%
- \new@def*\cptnegate##1{%
+ \new@def*\negatesw##1{%
0\ifcase##11#1\or\expandafter1\else\expandafter0\fi
}%
- \new@def*\cptbothtrue##1##2{%
+ \new@def*\bothswtrue##1##2{%
0\ifcase##1##2#1\expandafter0\else\expandafter1\fi
}%
- \new@def*\cptonetrue##1##2{%
+ \new@def*\oneswtrue##1##2{%
0\ifnum##1##2<101#1\expandafter0\else\expandafter1\fi
}%
}
@@ -3236,21 +3402,20 @@
\cpt@err{Command \noexpand\newswitch doesn't accept list}
{Please submit only one switch to \string\newswitch.}%
}{}%
- \xifinsetTF{,#1,}{,if,x,switch,tog,bool,}{%
+ \xifinsetTF{,#1,}{,if,x,switch,tog,togg,bool,test,}{%
\cpt@err{Invalid switch name '#1'}\@ehc
}{}%
\ifcsndefinable{#1}\relax
\cpt@getswitchstate{#2}%
- \letcsntocsn{#1}{cpt\cpt@switchstate}%
+ \letcsntocsn{#1}{cptsw\cpt@switchstate}%
}
\robust@def*\cpt@getswitchstate#1{%
- \lowercase{%
- \xifinsetTF{,#1,}{,true,false,}{%
- \edef\cpt@switchstate{#1}%
- }{%
- \cpt@err{Invalid switch value '#1'}
- {Valid switch values are 'true' and 'false'.}%
- }%
+ \lowercase{\edef\cpt@tempa{\cpttrimspaces{#1}}}%
+ \xifinsetTF{,\cpt@tempa,}{,true,false,}{%
+ \let\cpt@switchstate\cpt@tempa
+ }{%
+ \cpt@err{Invalid switch value '#1'}
+ {Valid switch values are 'true' and 'false'.}%
}%
}
\robust@def*\cpt@noswitcherr#1{%
@@ -3259,14 +3424,14 @@
\robust@def*\setswitch#1#2{%
\ifcsndefTF{#1}{%
\cpt@getswitchstate{#2}%
- \letcsntocsn{#1}{cpt\cpt@switchstate}%
+ \letcsntocsn{#1}{cptsw\cpt@switchstate}%
}{%
\cpt@noswitcherr{#1}%
}%
}
\robust@def*\setswitchtrue#1{%
\ifcsndefTF{#1}{%
- \letcsntocs{#1}\cpttrue
+ \letcsntocs{#1}\cptswtrue
}{%
\cpt@noswitcherr{#1}%
}%
@@ -3274,13 +3439,13 @@
\newletcs\switchtrue\setswitchtrue
\robust@def*\setswitchfalse#1{%
\ifcsndefTF{#1}{%
- \letcsntocs{#1}\cptfalse
+ \letcsntocs{#1}\cptswfalse
}{%
\cpt@noswitcherr{#1}%
}%
}
\newletcs\switchfalse\setswitchfalse
-\new@def*\ifswitchTF#1{%
+\new@def*\ifdefswitchTF#1{%
\ifcsndefFT{#1}{%
\cpt@err{Switch '#1' is not defined}\@ehc
\@gobbletwo
@@ -3288,10 +3453,134 @@
\ifcondTF\if\usename{#1}\fi
}%
}
-\new@def*\if@switchTF#1{\ifcondTF\if\usename{#1}\fi}
+\new@def*\ifdefswitchFT#1{\ifdefswitchTF{#1}\@secondoftwo\@firstoftwo}
+\new@def*\ifswitchTF#1{\ifcondTF\if\usename{#1}\fi}
\new@def*\ifswitchFT#1{\ifswitchTF{#1}\@secondoftwo\@firstoftwo}
-\new@def*\thebool@normal#1{\ifboolTF{#1}{true}{false}}
-\new@def*\thebool@reverse#1{\ifboolTF{#1}{false}{true}}
+\new@def*\thebool@normal#1{\ifdefboolTF{#1}{true}{false}}
+\new@def*\thebool@reverse#1{\ifdefboolTF{#1}{false}{true}}
+\newvariables{count}[cpt@]{exprcnt}[0]
+\robust@def*\ifexprTF#1{%
+ \begingroup
+ \let\cpt@expr@neg\cptswfalse
+ \cpt@exprcnt\z@pt
+ \cpt@expr@beg
+ \cpt@expr@bgroup#1(\expr@nil
+ \cpt@expr@end
+ \cpt@expr@eval
+}
+\def\cpt@expr@beg{%
+ \begingroup
+ \let\cpt@expr@neg\cptswfalse
+ \cpt@exprcnt\z@pt
+}
+\def\cpt@expr@end{%
+ \cpt@expr@eval\cpt@expr@true\cpt@expr@false
+}
+\def\cpt@expr@eval{%
+ \aftercsname\endgroup
+ {@\ifnum\cpt@exprcnt<\z@pt second\else first\fi oftwo}%
+}
+\def\cpt@expr@true{%
+ \advance\cpt@exprcnt\if\cpt@expr@neg\m@one\else\z@pt\fi
+ \let\cpt@expr@neg\cptswfalse
+}
+\def\cpt@expr@false{%
+ \advance\cpt@exprcnt\if\cpt@expr@neg\z@pt\else\m@one\fi
+ \let\cpt@expr@neg\cptswfalse
+}
+\long\def\cpt@expr@bgroup#1(#2\expr@nil{%
+ \cpt@expr@egroup#1)\expr@nil
+ \ifblankTF{#2}{}{%
+ \cpt@expr@beg
+ \cpt@expr@bgroup#2\expr@nil
+ }%
+}
+\long\def\cpt@expr@egroup#1)#2\expr@nil{%
+ \cpt@expr@and#1and\expr@nil
+ \ifblankTF{#2}{}{%
+ \cpt@expr@end
+ \cpt@expr@egroup#2\expr@nil
+ }%
+}
+\long\def\cpt@expr@and#1and#2\expr@nil{%
+ \cpt@expr@or#1or\expr@nil
+ \ifblankTF{#2}{}{%
+ \cpt@exprcnt\ifnum\cpt@exprcnt<\z@pt\m@one\else\z@pt\fi
+ \cpt@expr@and#2\expr@nil
+ }%
+}
+\long\def\cpt@expr@or#1or#2\expr@nil{%
+ \cpt@expr@not#1not\expr@nil
+ \ifblankTF{#2}{}{%
+ \cpt@exprcnt\ifnum\cpt@exprcnt<\z@pt\z@pt\else\@ne\fi
+ \cpt@expr@or#2\expr@nil
+ }%
+}
+\long\def\cpt@expr@not#1not#2\expr@nil{%
+ \cpt@expr@tog#1tog\expr@nil
+ \ifblankTF{#2}{}{%
+ \let\cpt@expr@neg\cptswtrue
+ \cpt@expr@not#2\expr@nil
+ }%
+}
+\long\def\cpt@expr@tog#1tog#2\expr@nil{%
+ \cpt@expr@bool#1bool\expr@nil
+ \ifblankTF{#2}{}{\cpt@expr@tog@a#2\expr@nil}%
+}
+\long\def\cpt@expr@tog@a#1#2\expr@nil{%
+ \edef\reserved@a{\cpttrimspaces{#1}}%
+ \ifcsndefTF{cpt@tog@\reserved@a}{%
+ \usename{cpt@tog@\reserved@a}\cpt@expr@true\cpt@expr@false
+ }{%
+ \cpt@err{Invalid test expression:
+ \MsgBrk toggle '\reserved@a' is undefined}\@ehc
+ \cpt@expr@false
+ }%
+ \cpt@expr@tog#2\expr@nil
+}
+\long\def\cpt@expr@bool#1bool#2\expr@nil{%
+ \cpt@expr@switch#1switch\expr@nil
+ \ifblankTF{#2}{}{\cpt@expr@bool@a#2\expr@nil}%
+}
+\long\def\cpt@expr@bool@a#1#2\expr@nil{%
+ \edef\reserved@a{\cpttrimspaces{#1}}%
+ \ifcsndefTF{if\reserved@a}{%
+ \ifboolTF\reserved@a\cpt@expr@true\cpt@expr@false
+ }{%
+ \cpt@err{Invalid test expression:
+ \MsgBrk boolean '\reserved@a' is undefined}\@ehc
+ \cpt@expr@false
+ }%
+ \cpt@expr@bool#2\expr@nil
+}
+\long\def\cpt@expr@switch#1switch#2\expr@nil{%
+ \cpt@expr@test#1test\expr@nil
+ \ifblankTF{#2}{}{\cpt@expr@switch@a#2\expr@nil}%
+}
+\long\def\cpt@expr@switch@a#1#2\expr@nil{%
+ \edef\reserved@a{\cpttrimspaces{#1}}%
+ \ifcsndefTF\reserved@a{%
+ \ifswitchTF\reserved@a\cpt@expr@true\cpt@expr@false
+ }{%
+ \cpt@err{Invalid test expression:
+ \MsgBrk switch '\reserved@a' is undefined}\@ehc
+ \cpt@expr@false
+ }%
+ \cpt@expr@switch#2\expr@nil
+}
+\long\def\cpt@expr@test#1test#2\expr@nil{%
+ \ifblankTF{#1}{}{%
+ \cpt@err{Invalid piece in test expression:
+ \MsgBrk'\detokenize{#1}'}\@ehc
+ }%
+ \ifblankTF{#2}{}{%
+ \cpt@expr@test@a#2\expr@nil
+ }%
+}
+\long\def\cpt@expr@test@a#1#2\expr@nil{%
+ \ignorespaces#1\cpt@expr@true\cpt@expr@false
+ \cpt@expr@test#2\expr@nil
+}
\new@def*\cpt@beforeprocessoptions{}
\new@def*\cpt@afterprocessoptions{}
\robust@def*\BeforeProcessOptions{%
@@ -3330,26 +3619,22 @@
\gundefcsn{\@currname.\@currext-cpt@hook}%
}%
}
-\robust@def*\ifpackagewithoptionsTF{%
- \begingroup\cpt@ifoptions\@pkgextension
-}
-\robust@def*\ifclasswithoptionsTF{%
- \begingroup\cpt@ifoptions\@clsextension
-}
+\robust@def*\ifpackagewithoptionsTF{\cpt@ifoptions\@pkgextension}
+\robust@def*\ifclasswithoptionsTF{\cpt@ifoptions\@clsextension}
\robust@def*\cpt@ifoptions#1#2{%
\cptexpandarg\cpt@ifopti@ns{\cpt@optionlist{#2.#1}}%
}
\robust@def*\cpt@ifopti@ns#1#2{%
- \cpt@stfalse\cpt@kvnormalize[,]{#1}%
- \let\temp@optlist\normalized@list
+ \begingroup
+ \edef\temp@optlist{\unexpanded{#1}}%
+ \cpt@sttrue\cpt@kvnormalize[,]\temp@optlist
\cpt@choicefdtrue
\def\kv@do##1{%
\oifinset@sp@TF,{##1}\temp@optlist
- {}
- {\cpt@choicefdfalse\loopbreak}%
+ {}{\cpt@choicefdfalse\loopbreak}%
}%
\kv@@parse{#2}%
- \if@boolTF{cpt@choicefd}
+ \ifboolTF{cpt@choicefd}
{\endgroup\@firstoftwo}{\endgroup\@secondoftwo}%
}
\robust@def*\ifpackageloadedlaterTF{\cpt@ifpkgloadedlater\@pkgextension}
@@ -3376,22 +3661,22 @@
\begingroup
\toks@{}%
\def\cpt@tempa##1##2\cpt@nil{%
- \ifx\noboundary##2\noboundary
+ \ifblankTF{##2}{%
\cpt@err{No outer parser or something wrong
\MsgBrk while in \string\cptloadpackages}\@ehc
- \expandafter\@gobble
- \else
+ \@gobble
+ }{%
\ifinsetFT{,}{##1##2}{}{%
\cpt@err{Parser can't be comma (,) in
\string\cptloadpackages}\@ehc
\expandafter\@gobble
}%
- \fi
+ }%
\def\cpt@lo@dpackages####1##1####2##1####3##1####4\cpt@nil{%
- \ifx\noboundary####1\noboundary
+ \ifblankTF{####1}{%
\cpt@err{No package name while in \string\cptloadpackages}\@ehc
- \expandafter\@gobble
- \fi
+ \@gobble
+ }{}%
\ifblankTF{####2}{%
\def\cpt@rsvda{}%
}{%
@@ -3444,7 +3729,11 @@
\expandafter\grightaddtocs
\csname\@currname.\@currext-cpt@hook\endcsname
}%
- \ifcsnullTF\@currname\endgroup\cpt@tempa
+ \ifcsnullTF\@currname{%
+ \endgroup\@gobble
+ }{%
+ \cpt@tempa
+ }%
}
\robust@def*\ifinstylefileTF{%
\ifcsemptyTF\@currname\@secondoftwo\@firstoftwo
@@ -3502,12 +3791,12 @@
}
\robust@def*\csv@@normalize{\cpt@teststopt\cpt@csvnormalize,}
\robust@def\cpt@csvnormalize[#1]#2{%
- \let\cpt@inkv\cptfalse
+ \let\cpt@inkv\cptswfalse
\cpt@normalizelist{#1}{#2}%
}
\robust@def*\kv@@normalize{\cpt@teststopt\cpt@kvnormalize,}
\robust@def\cpt@kvnormalize[#1]#2{%
- \let\cpt@inkv\cpttrue
+ \let\cpt@inkv\cptswtrue
\cpt@normalizelist{#1}{#2}%
}
\ifcsdefinable\normalized@list\relax
@@ -3516,18 +3805,16 @@
\let\ifnmlzst\ifcpt@st
\cpt@stchoose{cpt@st}{#2}\reserved@e\cpt@normalizelist
\ifx\reserved@e\@empty
- \def\normalized@list{}%
- \def\cpt@relax##1\cpt@relax{\endgroup\let\cpt@relax\relax}%
+ \def\normalized@list{}\cpt@defrelax
\fi
- \cpt@relax
- \cpt@checklistparser@b{#1}%
+ \cpt@ch@cklistparser{#1}%
\expandafter\setup@parser@nmlz\string#1%
\toks@\expandafter{\expandafter#1\reserved@e#1}%
\nmlz@activeparser
\expandafter\nmlz@spaceletter\string#1%
\expandafter\nmlz@letterspace\string#1%
\expandafter\nmlz@doubleletter\string#1%
- \ifswitchFT{cpt@inkv}{}{%
+ \ifdefswitchFT{cpt@inkv}{}{%
\nmlz@activeequal
\nmlz@spaceletter=%
\nmlz@letterspace=%
@@ -3537,7 +3824,7 @@
\edef\normalized@list{\the\toks@}%
\cpttrimleadparsers#1\normalized@list
\cptexpandsecond\endgroup{%
- \if@boolTF{nmlzst}{%
+ \ifboolTF{nmlzst}{%
\edef\noexpand#2{\ox@unexpanded\normalized@list}%
\undefcs\noexpand\normalized@list
}{%
@@ -3636,8 +3923,10 @@
}%
\csv@@parse*\@filelist
\ifdefTF\cpt@documentclass{}{%
- \@latex@info@no@line{'catoptions' package loaded before
- \string\documentclass: \MsgBrk no problem}%
+ \ifcpt@verbose
+ \@latex@info@no@line{'catoptions' package loaded before
+ \string\documentclass: \MsgBrk no problem}%
+ \fi
}%
}
\cptpassunexpanded{%
@@ -3647,7 +3936,6 @@
}%
}%
\ifxTF\cpt@documentclass\cpt@undefined{%
- \let\cpt@documentclass\@empty
\let\cpt@classoptionslist\@empty
}{%
\ifxTF\@classoptionslist\relax{}{%
@@ -3657,11 +3945,12 @@
}%
\let\cpt@classoptionslist\@classoptionslist
\def\@fileswith@ptions##1[##2]##3{%
- \cpt@stfalse\cpt@csvnormalize[,]{##3}%
+ \edef\cpt@tempa{\cptcommanormalize{##3}}%
\cpt@choicefdfalse
\def\do####1,{%
\ifnot@nil{####1}{%
- \xifinsetFT{,####1,}{,\normalized@list,}{}\cpt@choicefdtrue
+ \xifinsetFT{,####1,}{,\cpt@tempa,}
+ {}\cpt@choicefdtrue
\do
}%
}%
@@ -3683,90 +3972,28 @@
}%
}
\robust@def*\cpt@testfam#1{%
- \CurrIfnextchar<{#1}{#1<\@currname.\@currext>}%
-}
-\robust@redef\@pass@ptions#1#2#3{%
- \begingroup
- \ifsingletokenTF{#2}{%
- \ifmacroTF{#2}{%
- \let\@expand\expandcsonce
- }{%
- \let\@expand\unexpanded
- }%
- }{%
- \let\@expand\unexpanded
- }%
- \ifcsndefTF{opt@#3.#1}{%
- \ifblankTF{#2}{}{%
- \cptexpandarg{\cptexpandsecond{\cptfiltermergekv[,]}%
- {\cptmakecs{opt@#3.#1}}}{\@expand{#2}}{}%
- }%
- }{%
- \csn@edef{opt@#3.#1}{\@expand{#2}}%
- }%
- \globalizecsn{opt@#3.#1}%
- \endgroup
-}
-\robust@redef*\OptionNotUsed{%
- \ifxTF\@currext\@clsextension{%
- \cptexpandargonce{\cptfiltermergekv[,]%
- \@unusedoptionlist}\CurrentOption\nofilter
- }{}%
-}
-\robust@redef*\@use@ption{%
- \oifinset@sp@FT,\CurrentOption\@unusedoptionlist{}{%
- \cptexpandargonce{\cptfilterremovekv[,]%
- \@unusedoptionlist}\CurrentOption\nofilter
- }%
- \csname ds@\CurrentOption\endcsname
-}
-\robust@redef*\@fileswith@pti@ns#1[#2]#3[#4]{%
- \begingroup
- \edef\fileopts{\unexpanded{#2}}%
- \ifcsnullTF\fileopts{}{\cpt@sttrue\cpt@kvnormalize[,]\fileopts}%
- \def\fileswithopts##1##2{%
- \noexpand\@onefilewithoptions{##1}%
- [\expandcsonce\fileopts]\unexpanded{[#4]##2}%
- }%
- \def\file@withopts##1{\cptpassexpanded{\toks@{##1}}}%
- \toks@{}%
- \ifxTF#1\@clsextension{%
- \ifx\@classoptionslist\relax
- \xdef\@classoptionslist{\expandcsonce\fileopts}%
- \file@withopts{\fileswithopts{#3}{#1\@documentclasshook}}%
- \else
- \file@withopts{\fileswithopts{#3}{#1}}%
- \fi
- }{%
- \edef\cpt@tempa{\cptzapspaces{#3}}%
- \DiscardEmptyEntry
- \def\csv@do##1{%
- \file@withopts{\the\toks@\fileswithopts{##1}\@pkgextension}%
- }%
- \csv@@loop*\cpt@tempa
- }%
- \expandafter\endgroup\the\toks@
+ \ifnextcharTF<{#1}{#1<\@currname.\@currext>}%
}
-\let\@@fileswith@pti@ns\@fileswith@pti@ns
\robust@def*\RecoverAtRequirePackage#1{%
\ifblankFT{#1}{}{%
\cpt@isblankerr\RecoverAtRequirePackage
}%
\begingroup
- \def\csv@do##1{%
+ \docommalist{#1}{%
\ifescapedTF{##1}{%
\ifdefTF{##1}{}{%
- \cpt@notdeferr{##1}\@gobble
+ \cpt@notdeferr{##1}%
+ \@gobble
}%
}{%
\cpt@notescapederr{##1}%
\@gobble
}%
- \ifcsndefinable{atpush@\cptremovescape##1}{%
- \gletcsntocs{atpush@\cptremovescape##1}##1%
+ \ifcsndefinable{cpt@atpush@\cptremovescape##1}{%
+ \gletcsntocs{cpt@atpush@\cptremovescape##1}##1%
}%
\edef\cpt@tempa{%
- \gletcs\unexpanded{##1}=\noexpandcsn{atpush@\cptremovescape##1}%
+ \gletcs\unexpanded{##1}=\noexpandcsn{cpt@atpush@\cptremovescape##1}%
}%
\xifinsetTF{\cptoxdetok\cpt@tempa}{\cptoxdetok\@pushfilename}{}{%
\xdef\@pushfilename{%
@@ -3774,7 +4001,6 @@
}%
}%
}%
- \csv@@parse[,]{#1}%
\endgroup
}
\robust@def*\cpt@badoptionerr#1{%
@@ -3801,18 +4027,18 @@
}
\robust@def\cpt@d@clareoption#1#2[#3]#4{%
\cpt@d@cl@reoption{#1}{#2}{#3}%
- \if@boolTF{cpt@olddx}{%
+ \ifboolTF{cpt@olddx}{%
\xifstrcmpTF{\@currname.\@currext}{xcolor.sty}{%
- \long\csn@xdef{#1@ds@#2}{%
+ \csn@xdef{#1@ds@#2}{%
\unexpanded{\edef\XC@@opt{\XC@@opt#2,}#4}%
}%
}{%
- \long\csn@xdef{#1@ds@#2}{\unexpanded{#4}}%
+ \csn@xdef{#1@ds@#2}{\unexpanded{#4}}%
}%
}{%
\begingroup
\long\def\cpt@tempa##1{\endgroup
- \long\csn@gdef{#1@ds@#2}####1{##1}%
+ \csn@gdef{#1@ds@#2}####1{##1}%
}%
\cpt@tempa{#4}%
}%
@@ -3890,10 +4116,10 @@
\MsgBrk is invalid or null}{%
Invalid option '##1' of family '#1'.}%
}%
- \if@boolTF{cpt@olddx}{%
- \long\csn@xdef{#1@ds@##1}{\cpt@temp@err}%
+ \ifboolTF{cpt@olddx}{%
+ \csn@xdef{#1@ds@##1}{\cpt@temp@err}%
}{%
- \long\csn@xdef{#1@ds@##1}####1{\cpt@temp@err}%
+ \csn@xdef{#1@ds@##1}####1{\cpt@temp@err}%
}%
\endgroup
}%
@@ -3903,25 +4129,25 @@
}
\robust@def*\XDeclareCommandOption{%
\let\@fileswith@pti@ns\@badrequireerror
- \let\cmdoption\cpttrue
+ \let\cmdoption\cptswtrue
\cpt@testfam\cpt@declarecmdoption
}
\robust@def*\XDeclareCommandOptions{%
\let\@fileswith@pti@ns\@badrequireerror
- \let\cmdoption\cpttrue
+ \let\cmdoption\cptswtrue
\cpt@testfam\cpt@declarecmdoptions
}
\robust@def*\XDeclareBooleanOption{%
\let\@fileswith@pti@ns\@badrequireerror
- \let\cmdoption\cptfalse
+ \let\cmdoption\cptswfalse
\cpt@testfam\cpt@declarecmdoption
}
\robust@def*\XDeclareBooleanOptions{%
\let\@fileswith@pti@ns\@badrequireerror
- \let\cmdoption\cptfalse
+ \let\cmdoption\cptswfalse
\cpt@testfam\cpt@declarecmdoptions
}
-\robust@def*\cpt@checkbool#1#2#3{%
+\robust@def*\cptcheckbool#1#2#3{%
\lowercase{%
\edef\cpt@resa{\s@expandarg\cpttrimspaces{\cptrm-`\q#1}}%
}%
@@ -3947,13 +4173,13 @@
\if\cmdoption
\def\cpt@rsvda{\csn@def{#4#2}{####1}}%
\else
- \csn@newif{#4#2}%
+ \csnnewif{#4#2}%
\def\cpt@rsvda{%
- \cpt@checkbool{####1}{option #2}{\usename{#4#2\cpt@resa}}%
+ \cptcheckbool{####1}{option #2}{\usename{#4#2\cpt@resa}}%
}%
\fi
\long\def\cpt@rsvdb##1{%
- \long\csn@gdef{#1@ds@#2}####1{##1\relax}%
+ \csn@gdef{#1@ds@#2}####1{##1\relax}%
}%
\expandafter\cpt@rsvdb\expandafter{\cpt@rsvda#5}%
}
@@ -3981,7 +4207,7 @@
}
\robust@def*\XDeclareBiBooleanOptions{%
\let\@fileswith@pti@ns\@badrequireerror
- \let\cmdoption\cptfalse
+ \let\cmdoption\cptswfalse
\cpt@testfam\cpt@declarebibooloptions
}
\robust@def*\cpt@declarebibooloptions<#1>#2{%
@@ -4049,19 +4275,19 @@
\cptexpandarg\cpt@testopt
{\cpt@d@clareswoption{\cpt@currfam}{\cpt@curropt}}{}%
}
-\robust@def\cpt@d@clareswoption#1#2[#3]{%
+\robust@def*\cpt@d@clareswoption#1#2[#3]{%
\cptexpandarg{\cpt@testpnopt{\cpt@d@cl@reswoption
{#1}{#2}{#3}}}{\@currname @}%
}
-\robust@def\cpt@d@cl@reswoption#1#2#3(#4)#5{%
+\robust@def*\cpt@d@cl@reswoption#1#2#3(#4)#5{%
\cpt@d@cl@reoption{#1}{#2}{#3}%
\def\cpt@rsvda{%
- \cpt@checkbool{####1}{#2}{%
- \letcsntocsn{#4#2}{cpt\cpt@resa}%
+ \cptcheckbool{####1}{#2}{%
+ \letcsntocsn{#4#2}{cptsw\cpt@resa}%
}%
}%
\long\def\cpt@rsvdb##1{%
- \long\csn@gdef{#1@ds@#2}####1{##1\relax}%
+ \csn@gdef{#1@ds@#2}####1{##1\relax}%
}%
\expandafter\cpt@rsvdb\expandafter{\cpt@rsvda#5}%
}
@@ -4147,7 +4373,7 @@
\csv@@parse*[,]\cpt@curropts
}
\robust@def*\XLogDisabledOptions{%
- \CurrIfnextchar<\cpt@disabledoptionlist
+ \ifnextcharTF<\cpt@disabledoptionlist
\cpt@dis@bledoptionlist
}
\robust@def*\cpt@disabledoptionlist<#1>{%
@@ -4203,7 +4429,7 @@
\cpt@ifoptdis@bled{##1}{#2}%
}%
\csv@@parse*[,]\cpt@currfams
- \if@boolTF{cpt@swa}\if@boolTF\if@boolFT{cpt@choicefd}%
+ \ifboolTF{cpt@swa}\ifboolTF\ifdefboolFT{cpt@choicefd}%
}
\robust@def*\cpt@ifoptdis@bled#1#2{%
\ifcsndefFT{#1@disabledoptions}{}{%
@@ -4225,7 +4451,7 @@
\cpt@ifoptd@f{##1}{#2}%
}%
\csv@@parse*[,]\cpt@currfams
- \if@boolTF{cpt@swa}\if@boolTF\if@boolFT{cpt@choicefd}%
+ \ifboolTF{cpt@swa}\ifboolTF\ifdefboolFT{cpt@choicefd}%
}
\robust@def*\cpt@ifoptd@f#1#2{%
\ifcsndefFT{#1@ds@#2}{}{%
@@ -4295,7 +4521,7 @@
\cpt@testst{\cpt@testfam\cpt@processoptions}%
}
\robust@def*\cpt@processoptions<#1>{%
- \if@boolTF{cpt@st}{%
+ \ifboolTF{cpt@st}{%
\cpt@testopt{\cpt@xprocessoptions#1}{}%
}{%
\cpt@testopt{\cpt@yprocessoptions#1}{}%
@@ -4319,7 +4545,7 @@
\edef\CurrentOption{\unexpanded{##1}}%
\ifcsnullTF\CurrentOption{}{%
\cpt@findoption@a
- \if@boolFT{cpt@optfd}{}{%
+ \ifdefboolFT{cpt@optfd}{}{%
\ifcsndefFT{#1@ds@\cpt@curropt}{}{%
\ifcsnullTF\cpt@currna{%
\cpt@igoptfalse
@@ -4564,7 +4790,6 @@
}%
\kv@@loop*[,]\cpt@curroptvals
}
-% Alias keys must always come from the parent's family:
\robust@def*\XExecuteAliasOption#1{%
\cpt@testopt{\cpt@executealiasoption#1}{}%
}
@@ -4619,7 +4844,7 @@
}%
}
\robust@def*\cpt@useoption{%
- \if@boolFT{cpt@inpox}{}{%
+ \ifdefboolFT{cpt@inpox}{}{%
\oifinset@sp@TF,\OptionFound\cpt@processedoptions{}{%
\cptgaddtolist*\cpt@processedoptions\OptionFound
}%
@@ -4631,9 +4856,9 @@
\cpt@removecurroption\CurrentOption
}%
}%
- \if@boolTF{cpt@igopt}{}{%
+ \ifboolTF{cpt@igopt}{}{%
\ifcsndefFT{\cpt@currfam @ds@\cpt@curropt}{}{%
- \if@boolTF{cpt@olddx}{%
+ \ifboolTF{cpt@olddx}{%
\usename{\cpt@currfam @ds@\cpt@curropt}%
}{%
\ifcsnullTF\cpt@currval{%
@@ -4730,9 +4955,9 @@
}%
}
\robust@def*\cpt@optionstate{%
- \cpt@currfams,\cpt@curroptvals,\cpt@currfam,\cpt@currna,
- \cpt@curropt,\cpt@currval,\CurrentOption,\OptionFound,
- \ifcpt@inpox,\ifcpt@optfd,\ifcpt@igopt,\DeclaredOptions,
+ \cpt@currfams,\cpt@curroptvals,\cpt@currfam,\cpt@currna,%
+ \cpt@curropt,\cpt@currval,\CurrentOption,\OptionFound,%
+ \ifcpt@inpox,\ifcpt@optfd,\ifcpt@igopt,\DeclaredOptions,%
\ExecutedOptions
}
\robust@def*\cpt@removecurroption#1{%
@@ -4762,12 +4987,203 @@
\BeforeStartOfDocument{%
\cpt@cleanup\cpt@processedoptions
}
+\robust@redef*\@fileswith@pti@ns#1[#2]#3[#4]{%
+ \begingroup
+ \edef\fileopts{\unexpanded{#2}}%
+ \ifcsnullTF\fileopts{}{\cpt@sttrue\cpt@kvnormalize[,]\fileopts}%
+ \def\fileswithopts##1##2{%
+ \noexpand\@onefilewithoptions{##1}%
+ [\expandcsonce\fileopts]\unexpanded{[#4]##2}%
+ }%
+ \def\file@withopts##1{\cptpassexpanded{\toks@{##1}}}%
+ \toks@{}%
+ \ifxTF#1\@clsextension{%
+ \ifx\@classoptionslist\relax
+ \xdef\@classoptionslist{\expandcsonce\fileopts}%
+ \file@withopts{\fileswithopts{#3}{#1\@documentclasshook}}%
+ \else
+ \file@withopts{\fileswithopts{#3}{#1}}%
+ \fi
+ }{%
+ \edef\cpt@tempa{\cptzapspaces{#3}}%
+ \DiscardEmptyEntry
+ \def\csv@do##1{%
+ \file@withopts{\the\toks@\fileswithopts{##1}\@pkgextension}%
+ }%
+ \csv@@loop*\cpt@tempa
+ }%
+ \expandafter\endgroup\the\toks@
+}
+\robust@redef*\@onefilewithoptions#1[#2][#3]#4{%
+ \@pushfilename
+ \xdef\@currname{#1}%
+ \global\let\@currext#4%
+ \letcsntocs{\@currname.\@currext-h@@k}\@empty
+ \let\CurrentOption\@empty
+ \@reset@ptions
+ \makeatletter
+ \defpass\reserved@a{%
+ \@ifl@aded\@currext{#1}{%
+ \cpt@ifoptions\@currext{#1}{#2}{}{%
+ \edef\reserved@a{\cpt@optionlist{#1.\@currext}}%
+ \@onelevel@sanitize\reserved@a
+ \ltx@err{Option clash for \@cls@pkg\space #1}{%
+ The package #1 has already been loaded
+ with options:\MsgBrk
+ \space\space[\reserved@a].\MsgBrk
+ There has now been an attempt to load it with options
+ \MsgBrk\space\space[\unexpanded{#2}].\MsgBrk
+ Adding the global options:\MsgBrk
+ \space\space'\reserved@a,\unexpanded{#2}'\MsgBrk
+ to your \noexpand\documentclass declaration may fix this.
+ }%
+ }%
+ }{%
+ \@pass@ptions\@currext{#2}{#1}%
+ \gletcsntocs{ver@\@currname.\@currext}\@empty
+ \InputIfFileExists{\@currname.\@currext}{}{%
+ \@missingfileerror\@currname\@currext
+ }%
+ \let\@unprocessedoptions\@@unprocessedoptions
+ \usename{\@currname.\@currext-h@@k}%
+ \undefcsn{\@currname.\@currext-h@@k}%
+ \@unprocessedoptions
+ }%
+ \def\cpt@tempa####1 v####2 ####3\@nil####4{%
+ \edef####4{'####1\ifblankTF{####2}{}{ v####2}'}%
+ }%
+ \cpt@tempa#3 v \@nil\cpt@tempb
+ \cptthreexp\cpt@tempa\csname ver@#1.\@currext
+ \expandafter\endcsname\@space v \@nil\cpt@tempc
+ \@ifl@ter\@currext{#1}{#3}{}{%
+ \cptexpandarg\AtEndDocument{%
+ \ltx@warn{%
+ You requested,\on@line, version\MsgBrk
+ \cpt@tempb\@space of \@cls@pkg\@space #1,\MsgBrk
+ but only version \cpt@tempc\MsgBrk is available
+ }%
+ }%
+ }%
+ \ifx\@currext\@clsextension\let\LoadClass\@twoloadclasserror\fi
+ \@popfilename
+ \@reset@ptions
+ }%
+}
+\robust@def*\cpt@removevalues#1{%
+ \docommalist{#1}{\cpt@rem@vevalues{##1}}%
+}
+\robust@def*\cpt@rem@vevalues#1{%
+ \ifxTF#1\@empty\gobble@to@relax\relax
+ \xifinsetTF{=}{\cptoxdetok{#1}}{}\gobble@to@relax
+ \begingroup
+ \def\cpt@resa{}%
+ \def\cpt@resb##1=##2\cpt@nil{%
+ \edef\cpt@resa{\csliststack,\cpt@resa\unexpanded{##1}}%
+ }%
+ \docommalist*{#1}{\cpt@resb##1=\cpt@nil}%
+ \let#1\cpt@resa
+ \postgroupdef#1\endgroup
+ \cpt@relax
+}
+\robust@redef*\ExecuteOptions#1{%
+ \pushfunctions\ExecuteOptions\CurrentOption\cpt@optdepth
+ \edef\CurrentOption{\unexpanded{#1}}%
+ \cpt@sttrue\cpt@kvnormalize[,]\CurrentOption
+ \cpt@removevalues\CurrentOption
+ \docommalist*\CurrentOption{%
+ \def\CurrentOption{##1}%
+ \csname ds@##1\endcsname
+ }%
+ \popfunctions\ExecuteOptions\cpt@optdepth
+}
+\robust@redef\@pass@ptions#1#2#3{%
+ \begingroup
+ \ifsingletokenTF{#2}{%
+ \ifmacroTF{#2}{%
+ \let\@expand\expandcsonce
+ }{%
+ \let\@expand\unexpanded
+ }%
+ }{%
+ \let\@expand\unexpanded
+ }%
+ \ifcsndefTF{opt@#3.#1}{%
+ \ifblankTF{#2}{}{%
+ \cptexpandarg{\cptexpandsecond{\cptfiltermergekv[,]}%
+ {\cptmakecs{opt@#3.#1}}}{\@expand{#2}}{}%
+ }%
+ }{%
+ \csn@edef{opt@#3.#1}{\@expand{#2}}%
+ }%
+ \globalizecsn{opt@#3.#1}%
+ \endgroup
+}
+\robust@redef*\OptionNotUsed{%
+ \ifxTF\@currext\@clsextension{%
+ \cptexpandargonce{\cptfiltermergekv[,]%
+ \@unusedoptionlist}\CurrentOption\nofilter
+ }{}%
+}
+\robust@redef*\@use@ption{%
+ \oifinset@sp@FT,\CurrentOption\@unusedoptionlist{}{%
+ \cptexpandargonce{\cptfilterremovekv[,]%
+ \@unusedoptionlist}\CurrentOption\nofilter
+ }%
+ \csname ds@\CurrentOption\endcsname
+}
+\let\@@fileswith@pti@ns\@fileswith@pti@ns
+\robust@redef*\ProcessOptions{%
+ \pushfunctions\ProcessOptions\CurrentOption\cpt@optdepth
+ \cpt@sttrue\cpt@csvnormalize[,]\@declaredoptions
+ \cpt@sttrue\cpt@kvnormalize[,]\@classoptionslist
+ \edef\@curroptions{\cpt@optionlist{\@currname.\@currext}}%
+ \cpt@sttrue\cpt@kvnormalize[,]\@curroptions
+ \cpt@removevalues{\@classoptionslist,\@curroptions}%
+ \let\ds@\@empty
+ \cpt@ifstar\@xprocess@ptions\@process@ptions
+}
+\robust@redef*\@process@ptions{%
+ \edef\@curr@ptions{%
+ \ifx\@currext\@clsextension\else\expandcsonce
+ \@classoptionslist,\fi\expandcsonce\@curroptions
+ }%
+ \docommalist*\@declaredoptions{%
+ \def\CurrentOption{##1}%
+ \oifinset@sp@TF,\CurrentOption\@curr@ptions{%
+ \@use@ption
+ \letcsntocs{ds@##1}\@empty
+ }{}%
+ }%
+ \@process@pti@ns
+}
+\robust@redef*\@xprocess@ptions{%
+ \ifxTF\@currext\@clsextension{}{%
+ \docommalist*\@classoptionslist{%
+ \def\CurrentOption{##1}%
+ \oifinset@sp@TF,\CurrentOption\@declaredoptions{%
+ \@use@ption
+ \letcsntocs{ds@##1}\@empty
+ }{}%
+ }%
+ }%
+ \@process@pti@ns
+}
+\robust@redef*\@process@pti@ns{%
+ \docommalist*\@curroptions{%
+ \def\CurrentOption{##1}%
+ \ifcsndefTF{ds@##1}\@use@ption{\@use@ption\default@ds}%
+ }%
+ \docommalist*\@declaredoptions{\letcsntocs{ds@##1}\relax}%
+ \popfunctions\ProcessOptions\cpt@optdepth
+ \let\@fileswith@pti@ns\@@fileswith@pti@ns
+ \AtEndOfPackage{\let\@unprocessedoptions\relax}%
+}
\cptpassunexpanded{%
\begingroup
\def\cpt@tempa{\endgroup
- \gnewletcs\kernel@DeclareOption\DeclareOption
- \gnewletcs\kernel@ProcessOptions\ProcessOptions
- \gnewletcs\kernel@ExecuteOptions\ExecuteOptions
+ \gnewletcs\cpt@kernelDeclareOption\DeclareOption
+ \gnewletcs\cpt@kernelProcessOptions\ProcessOptions
+ \gnewletcs\cpt@kernelExecuteOptions\ExecuteOptions
\gdef\DeclareOption{\cpt@olddxtrue\XDeclareOption}%
\gdef\ProcessOptions{\cpt@olddxtrue\XProcessOptions}%
\gdef\ExecuteOptions{\cpt@olddxtrue\XExecuteOptions}%
@@ -4777,9 +5193,9 @@
\let\documentclass\@twoclasseserror
\if@compatibility\else
\def\usepackage{%
- \gletcs\DeclareOption\kernel@DeclareOption
- \gletcs\ProcessOptions\kernel@ProcessOptions
- \gletcs\ExecuteOptions\kernel@ExecuteOptions
+ \gletcs\DeclareOption\cpt@kernelDeclareOption
+ \gletcs\ProcessOptions\cpt@kernelProcessOptions
+ \gletcs\ExecuteOptions\cpt@kernelExecuteOptions
\cpt@olddxfalse
\RequirePackage
}%
@@ -4789,14 +5205,13 @@
\fi
}%
}%
- \ifx\cpt@documentclass\cpt@undefined
- \expandafter\cpt@tempa\else\expandafter\endgroup\fi
+ \ifdefTF\cpt@documentclass\endgroup\cpt@tempa
}
\cptonlypreamble{%
\cptonlypreamble,\cptloadpackages,\ifpackagewithoptionsTF,
\ifclasswithoptionsTF,\cpt@ifoptions,
\cptpushcatcodes,\cptpopcatcodes,\UseNormalCatcodes,
- \rsv@UseNormalCatcodes,\StyleFilePurpose,\StyleFileInfo,
+ \UseNorm@lCatcodes,\StyleFilePurpose,\StyleFileInfo,
\AfterEndOfStyleFile,\StyleFileRCSInfo,\SetStyleFileMessages,
\XDeclareOption,\XDeclareOptions,\XDeclareCommandOption,
\XDeclareCommandOptions,\XDeclareBooleanOption,
@@ -4811,19 +5226,11 @@
}
\XDeclareBiBooleanOptions{verbose,silent}[true](cpt@){}{}
\XDeclareBiBooleanOptions{draft,final}[true](cpt@){}{}
-\XDeclareCommandOption{optionstacklimit}[4](cpt@){}
-\XDeclareCommandOption{option-stack-limit}[4](cpt@){%
- \XExecuteAliasOption{optionstacklimit}%
-}
-\XDeclareCommandOption{key-stack-limit}[4](cpt@){%
- \XExecuteAliasOption{optionstacklimit}%
-}
-\XDeclareBooleanOption{kernelifnextchar}[true](cpt@){%
- \ifcpt@kernelifnextchar
- \let\CurrIfnextchar\kernel@ifnextchar
- \else
- \let\CurrIfnextchar\ifnextcharTF
- \fi
+\XDeclareCommandOptions{%
+ option-stack-limit,optionstacklimit,key-stack-limit,
+ keystacklimit,key-depth-limit,keydepthlimit
+}[4](cpt@){%
+ \xdef\cpt@optionstacklimit{\number#1}%
}
\XDeclareBooleanOption{usepox}[true](cpt@){%
\ifcpt@usepox
@@ -4837,55 +5244,10 @@
\XDisableOptions*{draft,final}
\XDeclareOption*{\cpt@warn{Unknown option '\CurrentOption' ignored}}
\XExecuteOptions{%
- verbose=false,usepox=true,optionstacklimit=4,
- kernelifnextchar=false
+ verbose=false,usepox=true,optionstacklimit=4
}\relax
\XProcessOptions*\relax
-\robust@def\indris@nil#1\fi#2\indris@do#3\indris@nil{\fi#1#2}
-\newvariables{if}{lastindris}[false]
-\robust@def*\indrisloop{\cpt@teststopt\cpt@indrisloop{,}}
-\robust@def*\cpt@indrisloop[#1]#2#3{%
- \pushfunctions\cpt@indrisloop
- {\indris@do,\indrisnr,\iflastindris,%
- \ifloopbreak,\user@do,\getnextindris}\indrisdepth
- \cpt@stchoose{cpt@st}{#2}\cpt@rsvda\indrisloop
- \cpt@sttrue\cpt@csvnormalize[#1]\cpt@rsvda
- \lastindrisfalse\loopbreakfalse
- \chardef\indrisnr\z@pt
- \ifsingletokenTF{#3}{%
- \ifmacroTF{#3}{}{\cpt@notcserr{#3}}%
- }{%
- \cpt@notonetokenerr{#3}%
- }%
- \let\user@do#3%
- \def\getnextindris##1#1##2\indris@nil{%
- \edef\nextindris{\unexpanded\expandafter{\@gobble##1}}%
- \letcsntocs{nextindris@\cptrm\indrisdepth}\nextindris
- }%
- \def\indris@do##1#1##2\indris@nil{%
- \edef\currindris{\unexpanded\expandafter{\@gobble##1}}%
- \letcsntocs{currindris@\cptrm\indrisdepth}\currindris
- \ifcat$\detokenize\expandafter{\@gobble##2.}$\indris@nil
- \lastindristrue\fi
- \if@boolTF{lastindris}{%
- \def\nextindris{}%
- \csn@def{nextindris@\cptrm\indrisdepth}{}%
- }{%
- \ifcsvbreakTF{##1}\loopbreak\relax
- \if@boolTF{loopbreak}{%
- \defpass\reserved@a####1\indris@nil{\cptdoremainder{####1}}%
- }{%
- \getnextindris.##2\indris@nil
- }%
- }%
- \pushnumber\indrisnr
- \expandafter\user@do\expandafter{\@gobble##1}%
- \indris@do.##2\indris@nil
- }%
- \expandafter\indris@do\expandafter.\cpt@rsvda#1\indris@nil
- \popfunctions\cpt@indrisloop\indrisdepth
-}
\cptpopcatcodes
\cptrestorecatcodes
\declarefutureletset[fl@]{lbracket,star,rquote}