%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++% % This is 'catoptions' package (Version 0.2, August 2010) % % % % The catoptions package changes LaTeX package loading internals % % so that all subsequently loaded packages can rely on having % % normal catcodes in effect. The package also contains some useful % % facilities unconnected with catcodes. In particular, it contains % % options processing facilities that have the familiar and simple % % syntax of LaTeX's legacy options parsing mechanism, but with % % improved robustness in terms of option value default, preservation % % of braces in option values, and parsing of expandable package % % and class option values. Also, it contains some API. % % % % The catcode facilities of the package are an extension of the % % 'pcatcode' package by Michael J. Downes and David M. Jones. % % % % 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 LPPL maintenance status of this software is 'author-maintained'. % % % % Copyright (c) 2011 Ahmed Musa (a.musa@rocketmail.com). % % % %+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++% \begingroup \chardef\%\catcode37\catcode37 14\relax\expandafter\iffalse\string\ \fi\let\e\endlinechar\chardef\E\e\e13\chardef\n\catcode\e\catcode\e5 % \chardef\s\catcode32 \catcode32 10 \chardef\=\catcode61 \catcode61 12 \chardef\l=\catcode123 \catcode123=1 \chardef\r=\catcode125 \catcode125=2 \chardef\[=\catcode91 \catcode91=12 \chardef\]=\catcode93 \catcode93=12 \chardef\^=\catcode94 \catcode94=7 \chardef\.=\catcode46 \catcode46=12 \chardef\/=\catcode47 \catcode47=12 \chardef\~=\catcode126 \catcode126=13 \chardef\&=\catcode38 \catcode38=4 \chardef\$=\catcode36 \catcode36=3 \chardef\_=\catcode95 \catcode95=8 \chardef\+=\catcode43 \catcode43=12 \chardef\!=\catcode33 \catcode33=12 \chardef\'=\catcode39 \catcode39=12 \chardef\(=\catcode40 \catcode40=12 \chardef\)=\catcode41 \catcode41=12 \chardef\*=\catcode42 \catcode42=12 \chardef\,=\catcode44 \catcode44=12 \chardef\-=\catcode45 \catcode45=12 \chardef\:=\catcode58 \catcode58=12 \chardef\<=\catcode60 \catcode60=12 \chardef\>=\catcode62 \catcode62=12 \chardef\`=\catcode96 \catcode96=12 \edef\x{% \endgroup \def\noexpand\cptrestorecatcodes{% \endlinechar=\number\E \catcode\number\e=\number\n \catcode32=\number\s \catcode123=\number\l \catcode125=\number\r \catcode37=\number\% \catcode61=\number\= \catcode91=\number\[ \catcode93=\number\] \catcode94=\number\^ \catcode46=\number\. \catcode47=\number\/ \catcode126=\number\~ \catcode38=\number\& \catcode36=\number\$ \catcode95=\number\_ \catcode43=\number\+ \catcode33=\number\! \catcode39=\number\' \catcode40=\number\( \catcode41=\number\) \catcode42=\number\* \catcode44=\number\, \catcode45=\number\- \catcode58=\number\: \catcode60=\number\< \catcode62=\number\> \catcode96=\number\` }% } \x \catcode37 14\relax\expandafter\iffalse\string\ \fi\endlinechar13\catcode13 5 % \catcode61\string=12 \catcode32=10 \catcode123=1 \catcode125=2 \catcode91=12 \catcode93=12 \catcode46=12 \catcode47=12 \catcode94=7 \catcode126=13 \chardef\cpt@xiipt=12 \chardef\active=13 \chardef\cpt@xciipt=92 \NeedsTeXFormat{LaTeX2e}[1995/12/01] \ProvidesPackage{catoptions} [2011/02/021 v0.2 Preserving catcodes and parsing options (AM)] \ifcase% \ifx\eTeXversion\cpt@undefined\z@\else \ifnum\eTeXversion<\tw@\z@\else\@ne\fi\fi \PackageError{catoptions}{eTeX not loaded or old version}% {This package requires eTeX version 2 or later.}% \expandafter\endinput \fi \def\cptnormalcatcodes{% \endlinechar13 \catcode33=12\catcode34=12\catcode35=6\catcode36=3\catcode37=14 \catcode38=4\catcode39=12\catcode40=12\catcode41=12\catcode42=12 \catcode43=12\catcode44=12\catcode45=12\catcode46=12\catcode47=12 \catcode58=12\catcode59=12\catcode60=12\catcode61=12\catcode62=12 \catcode63=12\catcode91=12\catcode92=0\catcode93=12\catcode94=7 \catcode95=8\catcode96=12\catcode123=1\catcode124=12\catcode125=2 \catcode126=13\catcode32=10\catcode13=5\catcode9=10\catcode10=12 } \begingroup \let\s\string \escapechar\m@ne \xdef\cpt@otherchars{% \s\!\s\"\s\#\s\$\s\%\s\&\s\'\s\(\s\)\s\*\s+\s\,\s\-\s\.\s\/\s\:% \s\;\s\<\s\=\s\>\s\?\s\[\s\\\s\]\s\^\s\_\s\`\s\{\s\|\s\}\s\~% } \endgroup \newcommand*\BeginOverlookWhiteSpace{% \edef\cpt@spacecatcode{\the\catcode`\ }% \edef\cpt@tabcatcode{\the\catcode`\^^I}% \chardef\cpt@endlinechar=\number\endlinechar \catcode`\ =9\relax \catcode`\^^I=9\relax \endlinechar\m@ne } \newcommand*\EndOverlookWhiteSpace{% \catcode`\ =\cpt@spacecatcode \catcode`\^^I=\cpt@tabcatcode \endlinechar\cpt@endlinechar } \def\cpt@catcodestack{} \def\cptpushcatcodes{% \begingroup \def\x##1{% \ifx##1\@nnil\else \catcode\number`##1=\the\catcode`##1\relax \expandafter\x \fi }% \xdef\cpt@catcodestack{% \expandafter\x\cpt@otherchars\ \ \^^I\^^J\@nnil{\cpt@catcodestack}% }% \endgroup } \cptpushcatcodes \cptnormalcatcodes \def\cptpopcatcodes{% \begingroup \def\x##1##{\endgroup##1\xdef\cpt@catcodestack}% \expandafter\x\cpt@catcodestack } \@ifdefinable\currentcatcodesubset\relax \newcommand*\GetCurrentCatcodeSubset{% \begingroup \def\x##1{% \ifx##1\cpt@nnil\else \@space(\string##1\@firstofone{:\number\catcode`##1})% \expandafter\x \fi }% \edef\x{% \def\noexpand\currentcatcodesubset{% \x\^^I\^^J\^^L\^^M\ \!\"\#\$\%\&% \'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\`\{\}\|\~\cpt@nnil }% }% \expandafter\endgroup\x } \newcommand*\declarefutureletset[2][fl@]{% \xdef\cpt@fletprefix{\xp@despace{#1}}% \cptexpandargonce {\cpt@filtermergelists[,]\cpt@fletprefixes}\cpt@fletprefix{}% \ifblankTF{#2}{% \def\neededfutureletchars{}% }{% \def\neededfutureletchars{#2}% \cpt@sttrue\cpt@csvnormalize[,]\neededfutureletchars \oifstrcmpFT\neededfutureletchars{all}{}{% \def\neededfutureletchars{}% \def\cpt@tempa##1\@##2\@{% \ifx##1\end\else \cptaddtocommalist\neededfutureletchars{##1}% \expandafter\cpt@tempa \fi }% \expandafter\cpt@tempa\cpt@futureletchars\end\@\@ }% }% \globalize\neededfutureletchars \globalize\cpt@fletprefixes } \begingroup \cptrestorecatcodes \begingroup \catcode`\3="3 \catcode`\4="4 \catcode`\7="7 \catcode`\8="8 \catcode`\A="A \catcode`\B="B \catcode`\C="C \catcode`\D="D \gdef\cpt@flet@a#1#2{% \begingroup \edef\cpt@tempa{\noexpandcsn{\cpt@fletprefix#1}}% \edef\cpt@tempb{\noexpandcsn{if\cpt@fletprefix#1}}% \xifinsetTF {,\cptoxdetok\cpt@tempa,}{,\cptoxdetok\cptfutureletmacros,}{}{% \xdef\cptfutureletmacros{% \ifcsnullTF\cptfutureletmacros{}% {\expandcsonce\cptfutureletmacros,}% \expandcsonce\cpt@tempa,\expandcsonce\cpt@tempb }% }% \def\siso@do##1{\lccode`##1=`#2}% \simplesisoloop{034678BCD}% \lccode`\0=`#2\lccode`\3=`#2\lccode`\4=`#2\lccode`\6=`#2% \lccode`\7=`#2\lccode`\8=`#2\lccode`\B=`#2\lccode`\C=`#2% \lccode`\D=`#2% \ifnum\catcode`#2=\active \def\do##1{\noexpand\do\noexpand##1\noexpand}% \lowercase{% \xdef\cpt@activecharacters{% \cpt@activecharacters \do#2D% }% }% \fi \xdef\cpt@tempa{% \let\noexpand\cpt@tempa\noexpand\cpt@undefined \cptglet\expandcsonce\cpt@tempa= % }% \aftergroup\cpt@tempa \lowercase{% \expandafter\endgroup \ifcase\numexpr\catcode`#2\relax 0\or \bgroup\or \egroup\or 3\or 4\or 5\or 6\or 7\or 8\or 9\or \@sptoken\or B\or C\else D\fi }% } \endgroup \gdef\cpt@futureletchars{% space\@\ \@ exclam\@\!\@ dblquote\@\"\@ hash\@\#\@ dollar\@\$\@ ampersand\@\&\@ rquote\@\'\@ lparen\@\(\@ rparen\@\)\@ star\@\*\@ plus\@\+\@ comma\@\,\@ hyphen\@\-\@ period\@\.\@ slash\@\/\@ colon\@\:\@ semicolon\@\;\@ less\@\<\@ equal\@\=\@ greater\@\>\@ question\@\?\@ lbracket\@\[\@ rbracket\@\]\@ hat\@\^\@ underscore\@\_\@ lquote\@\`\@ lbrace\@\{\@ vert\@\|\@ rbrace\@\}\@ tilde\@\~\@ bslash\@\\\@ } \gdef\cptfutureletsetup{% \gdef\cpt@activecharacters{}% \gdef\cptfutureletmacros{}% \def\cpt@flet@b##1\@##2\@{% \ifx##1\end\else \xifinsetFT{##1}\neededfutureletchars{}{% \cpt@flet@a{##1}{##2}% }% \expandafter\cpt@flet@b \fi }% \def\fifo@do##1{% \gundefcsn{##1\currentoption}% \gundefcsn{if##1\currentoption}% }% \def\cpt@fletundef##1\@##2\@{% \ifx##1\end\else \def\currentoption{##1}% \simpleexpandarg\simplefifoloop{\cpt@fletprefixes}% \expandafter\cpt@fletundef \fi }% \def\cpt@fletdef##1\@##2\@{% \ifxTF##1\end{}{% \xifinsetFT{##1}\neededfutureletchars{}{% \csn@xdef{if\cpt@fletprefix##1}####1{% \noexpand\usecsn{@\noexpand\ifx \noexpandcsn{\cpt@fletprefix##1}% ####1\unexpanded{\@empty first\else second\fi oftwo}% }% }% }% \cpt@fletdef }% }% \expandafter\cpt@fletundef\cpt@futureletchars\end\@\@ \expandafter\cpt@fletdef\cpt@futureletchars\end\@\@ \expandafter\cpt@flet@b\cpt@futureletchars\end\@\@ } \AtBeginDocument{\cptrestorecatcodes} \gdef\futureletresetactives{% \def\do##1##2{\let##1= ##2}% \cpt@activecharacters \let\do\relax } \endgroup \@ifdefinable\UseNormalCatcodes\relax \protected\def\UseNormalCatcodes{% \ifcsnullTF\@currname{% \cpt@warn{\noexpand\UseNormalCatcodes issued in document: ignored}% }{% \let\UseNormalCatcodes\relax \cptpushcatcodes \cptnormalcatcodes \AfterEndOfStyleFile{% \cptpopcatcodes \let\UseNormalCatcodes\rc@UseNormalCatcodes }% }% } \@ifdefinable\rc@UseNormalCatcodes{% \global\let\rc@UseNormalCatcodes\UseNormalCatcodes } \newcommand\cptswap[2]{#2#1} \newcommand\cptswapfirstbraced[2]{#2{#1}} \cptswap{ }{\let\@sptoken= } \def\@space{ } \newcommand\usecsn[1]{\csname#1\endcsname}% long \newcommand\gusecsn[1]{\global\csname#1\endcsname} \newcommand\cptuse[1]{\ifcsndefFT{#1}{}{\usecsn{#1}}} \long\def\@gobblethree#1#2#3{} \long\def\@firstofthree#1#2#3{#1} \long\def\@secondofthree#1#2#3{#2} \long\def\@thirdofthree#1#2#3{#3} \let\@iden\@firstofone \newcommand\cptalloftwo[2]{#1#2} \protected\def\cpt@nil{} \def\cpt@nnil{\cpt@nil} \protected\def\cpt@unique{\cpt@unique} \long\def\cpt@car#1#2\car@nil{#1} \long\def\cpt@cdr#1#2\cdr@nil{#2} \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} \@ifdefinable\cpt@rnm{\let\cpt@rnm\romannumeral} \def\cptthreexp{\expandafter\expandafter\expandafter} \def\cptsevenxp{\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter} \protected\def\cptlocalxp#1{\begingroup\cptthreexp\endgroup#1} \protected\def\cptlocalxpxp{\cptlocalxp\expandafter} \newcommand*\cptzapspaces[1]{% \def\cptzapspaces##1{\cpt@rnm0\cpt@zapspaces.\@space##1#1\cpt@nil}% } \cptzapspaces{ } \def\cpt@zapspaces#1 #2\cpt@nil{% \usecsn{@\ifx\cpt@unique#2\cpt@unique first\else second\fi oftwo}% {\remove@to@dot#1}{% \expandafter\cpt@zapspaces\expandafter .\remove@to@dot#1#2\cpt@nil }% } \newcommand*\ifpdfstrcmpTF[2]{% \usecsn{@\ifnum\pdfstrcmp{\detokenize{#1}}% {\detokenize{#2}}=\z@ first\else second\fi oftwo}% } \@ifdefinable\kernel@for{\let\kernel@for\@for} \newcommand*\newvariables[1]{\@testopt{\cpt@newvariables{#1}}{}}% \protected\def\cpt@newvariables#1[#2]#3{% \@testopt{\cpt@newv@riables{#1}{#2}{#3}}{}% } \protected\def\cpt@newv@riables#1#2#3[#4]{% \def\cpt@rsvda##1{% \ifx\cpt@unique#4\cpt@unique\def\cpt@tempc{##1}\else \def\cpt@tempc{#4}\fi }% \edef\cpt@tempb{\ifpdfstrcmpTF{#1}{if}{if}{}}% \kernel@for\cpt@tempa:=\cpt@rnm0\cptzapspaces{\@space#3}\do{% \usecsn{@\ifcsname\cpt@tempb#2\cpt@tempa\endcsname first\else second\fi oftwo}% {% \edef\reserved@a{\cpt@tempb#2\cpt@tempa}\@notdefinable }{% \csname new#1\expandafter\endcsname\csname \cpt@tempb#2\cpt@tempa\endcsname \ifpdfstrcmpTF{#1}{if}{% \cpt@rsvda{false}% \csname#2\cpt@tempa\cpt@tempc\endcsname }{% \ifpdfstrcmpTF{#1}{toks}{% \cpt@rsvda{}% \csname#2\cpt@tempa\endcsname\expandafter{\cpt@tempc}% }{% \ifpdfstrcmpTF{#1}{box}{% \cpt@rsvda\z@ \setbox\csname#2\cpt@tempa\endcsname\newboxtype to\cpt@tempc{\newboxcontent}\relax }{% \cpt@rsvda\z@ \csname#2\cpt@tempa\endcsname\cpt@tempc\relax }% }% }% }% }% } \@ifdefinable\newboxtype{\let\newboxtype=\hbox} \@ifdefinable\newboxcontent{\def\newboxcontent{}} \newvariables{if}[cpt@]{st,pl,pm,verbose,usepox,optf,igopt, inpox,olddx}\relax \newvariables{if}[@]{iscounter,breakloop,choicefd,useempty, checklp,robdes}\relax \newvariables{count}[cpt@]{depth,grouplevel,grouptype}\relax \@ifdefinable\cptbreakloop{\let\cptbreakloop\@breaklooptrue} \newcommand*\UseEmptyEntry{\global\@useemptytrue} \newcommand*\DiscardEmptyEntry{\global\@useemptyfalse} \newcommand*\UseRobustDespace{\global\@robdestrue} \newcommand*\UseNormalDespace{\global\@robdesfalse} \newcommand*\MsgBrk{\MessageBreak} \newcommand*\cptgetcatcode[1]{% \number \ifcat\noexpand#1\bgroup1\else \ifcat\noexpand#1\egroup2\else \ifcat\noexpand#1$3\else %$ \ifcat\noexpand#1&4\else \ifcat\noexpand#1##6\else \ifcat\noexpand#1^7\else \ifcat\noexpand#1_8\else \ifcat\noexpand#1\@sptoken10\else \ifcat\noexpand#1a11\else \ifcat\noexpand#1!12\else \ifcat\noexpand#1\noexpand~13\else -1\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi } \newcommand\cptremovescape[1]{% \ifx\cpt@unique#1\cpt@unique \expandafter\@gobble\else\expandafter\@iden\fi {\expandafter\@gobble\string#1}% } \newcommand\cptgobblescape[1]{% \ifx\cpt@unique#1\cpt@unique \expandafter\@gobble\else\expandafter\@iden\fi {\ifnum\escapechar>\@cclv\else \ifnum\escapechar<\z@\else \expandafter\expandafter \csname @gobble\ifnum\escapechar=\@xxxii @space\fi \cptthreexp\endcsname \fi\fi \string#1}% } \newcommand\ifnullTF[1]{% \usecsn{@\ifnum\pdfstrcmp{}{\detokenize{#1}}% =\z@ first\else second\fi oftwo}% } \newcommand\ifnullFT[1]{\ifnullTF{#1}\@secondoftwo\@firstoftwo} \newcommand\oifnullTF[1]{\expandafter\ifnullTF\expandafter{#1}} \newcommand\oifnullFT[1]{\expandafter\ifnullFT\expandafter{#1}} \newcommand\xifnullTF[1]{\cptexpandarg\ifnullTF{#1}} \newcommand\xifnullFT[1]{\cptexpandarg\ifnullFT{#1}} \@ifdefinable\iftoksnullTF\relax \def\iftoksnullTF#1#{% \expandafter\ifnullTF\expandafter{\the#1}% } \newcommand\ifblankTF[1]{% \usecsn{@\ifnum\pdfstrcmp{}{\detokenize\expandafter {\@gobble#1.}}=\z@ first\else second\fi oftwo}% } \newcommand\ifblankFT[1]{\ifblankTF{#1}\@secondoftwo\@firstoftwo} \newcommand\oifblankTF[1]{\expandafter\ifblankTF\expandafter{#1}} \newcommand\oifblankFT[1]{\expandafter\ifblankFT\expandafter{#1}} \newcommand\xifblankTF[1]{\cptexpandarg\ifblankTF{#1}} \newcommand\xifblankFT[1]{\cptexpandarg\ifblankFT{#1}} \newcommand*\ifdefTF[1]{% \usecsn{@\ifdefined#1\ifx#1\relax second\else first\fi \else second\fi oftwo}% } \newcommand*\ifdefFT[1]{\ifdefTF{#1}\@secondoftwo\@firstoftwo} \newcommand*\oifdefTF[1]{\expandafter\ifdefTF\expandafter{#1}} \newcommand*\oifdefFT[1]{\expandafter\ifdefFT\expandafter{#1}} \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}}% } \newcommand*\ifcsndefFT[1]{\ifcsndefTF{#1}\@secondoftwo\@firstoftwo} \newcommand*\oifcsndefTF[1]{\expandafter\ifcsndefTF\expandafter{#1}} \newcommand*\oifcsndefFT[1]{\expandafter\ifcsndefFT\expandafter{#1}} \newcommand*\xifcsndefTF[1]{\cptexpandarg\ifcsndefTF{#1}} \newcommand*\xifcsndefFT[1]{\cptexpandarg\ifcsndefFT{#1}} \newcommand*\newletcs[2]{\ifcptdefinable{#1}{\let#1=#2}} \newcommand*\ifcptdefinable[2]{% \edef\reserved@a{\cptgobblescape#1}% \ifdefTF{#1}\@notdefinable{% \ifcsndefTF{end\reserved@a}\@notdefinable{#2}% }% } \newcommand\cpt@def@[3]{% \ifcptdefinable#3{% \ifnullTF{#2}{}\protected \cptthreexp\l@ngrel@x\usecsn{#1def}#3% }% } \ifcptdefinable\robust@def\relax \protected\def\robust@def{\@star@or@long{\cpt@def@{}{p}}} \robust@def*\new@def{\@star@or@long{\cpt@def@{}{}}} \robust@def*\new@gdef{\@star@or@long{\cpt@def@{g}{}}} \robust@def*\robust@gdef{\@star@or@long{\cpt@def@{g}{p}}} \robust@def*\new@edef{\@star@or@long{\cpt@def@{e}{}}} \robust@def*\robust@edef{\@star@or@long{\cpt@def@{e}{p}}} \robust@def*\new@xdef{\@star@or@long{\cpt@def@{x}{}}} \robust@def*\robust@xdef{\@star@or@long{\cpt@def@{x}{p}}} \robust@def*\renew@def{\@star@or@long{\cpt@redef@{}}} \robust@def*\robust@redef{\@star@or@long{\cpt@redef@{p}}} \new@def*\cpt@redef@#1#2{% \ifdefFT#2{}{% \ifcpt@verbose \@latex@info{Command '\string#2' redefined}% \fi }% \ifstrcmpTF{#1}{p}\protected\relax\l@ngrel@x\def#2% } \new@def*\ifcounterTF#1{% \ifstrcmpTF{\count}{#1}\@secondoftwo{% \expandafter\cpt@ifcounter@a\meaning#1:\cpt@unique }% } \edef\cpt@ifcounter@a#1#2{% \def#1##1:##2\cpt@unique{#2##1\string\count\cpt@unique}% \def#2##1\string\count##2\cpt@unique{\noexpand\ifblankTF{##1}}% } \cpt@ifcounter@a\cpt@ifcounter@a\cpt@ifcounter@b \robust@def*\pushnumber#1{% \ifdefTF#1{% \edef#1{\the\numexpr#1+1}% }{% \let#1\@ne }% } \robust@def*\popnumber#1{% \ifdefTF#1{% \ifnumTF#1=\z@{% \let\relax\relax \cpt@err{Number '\string#1' is already 0}\@ehc }{% \edef#1{\the\numexpr#1-1}% }% }{% \let\relax\relax \cpt@err{Number '\string#1' is undefined}\@ehc }% } \robust@def*\pushcounter#1{% \ifdefTF#1{% \if@iscounter \global\advance#1\@ne \else \ifcounterTF#1{% \global\advance#1\@ne }{% \cpt@err{Number '\string#1' isn't a counter}\@ehc }% \fi }{% \usecsn{newcount}#1% }% \@iscounterfalse } \robust@def*\popcounter#1{% \ifdefTF#1{% \ifnumTF#1=\z@{% \cpt@err{Counter or number '\string#1' is already 0}\@ehc }{% \if@iscounter \global\advance#1\m@ne \else \ifcounterTF#1{% \global\advance#1\m@ne }{% \cpt@err{Number '\string#1' isn't a counter}\@ehc }% \fi }% }{% \cpt@err{Counter '\string#1' is undefined}\@ehc }% \@iscounterfalse } \new@def*\push@rnarg#1{\expandafter\cptremovescape\push@arg @\cpt@rnm#1} \robust@def*\pushfunctions#1#2{% \ifcounterTF#2{% \@iscountertrue\pushcounter#2% }{% \global\pushnumber#2% }% \def\push@@do{\letcsntocs{\push@rnarg{#2}}}% \def\push@do{\expandafter\push@@do\push@arg}% \let\rc@escapechar\escapechar\escapechar\cpt@xciipt \pushingloop{#1}% \escapechar\rc@escapechar } \robust@def*\popfunctions#1#2{% \ifnum#2=\z@ \cpt@err{Number '\string#2' is currently '0'}\@ehc \fi \def\push@do{% \expandafter\letcstocsn\push@arg{\push@rnarg{#2}}% \undefcsn{\push@rnarg{#2}}% }% \let\rc@escapechar\escapechar\escapechar\cpt@xciipt \pushingloop{#1}% \escapechar\rc@escapechar \ifcounterTF#2{% \@iscountertrue\popcounter#2% }{% \global\popnumber#2% }% } \robust@def*\pushingloop#1{\cpt@pushingloop#1,\cpt@nil,} \robust@def*\cpt@pushingloop#1,{% \edef\push@arg{\unexpanded{#1}}% \ifxTF\push@arg\cpt@nnil{}{% \normal@despacecontent\push@arg \push@do\relax\cpt@pushingloop }% } \robust@def*\cpt@toodeep#1#2{% \cpt@err{Command '\string#1' nested too deeply}% {Sorry, but command '\string#1' can't be nested \MsgBrk to depth(s) higher than #2.}% \@gobble } \robust@def*\oneDloop{% \@robdestrue\cpt@ifstar\oneDloop@b\oneDloop@a } \robust@def*\normaloneDloop{% \@robdesfalse\cpt@ifstar\oneDloop@b\oneDloop@a } \robust@def\oneDloop@b#1{\expandafter\oneDloop@a\expandafter{#1}} \robust@def\oneDloop@a#1#2#3{% \pushnumber\oneDloopdepth \ifnum\oneDloopdepth>\@ne\cpt@toodeep\oneDloop1\fi \@breakloopfalse \cpt@Dloop@a#1,\cpt@nil,\cpt@unique#2{#3}% \popnumber\oneDloopdepth \UseNormalDespace } \robust@def*\xDloop{% \@robdestrue\cpt@ifstar\xDloop@b\xDloop@a } \robust@def*\normalxDloop{% \@robdesfalse\cpt@ifstar\xDloop@b\xDloop@a } \robust@def\xDloop@b#1{\expandafter\xDloop@a\expandafter{#1}} \robust@def\xDloop@a#1#2#3{% \pushfunctions {#2,\if@useempty,\if@breakloop,\if@robdes}\cpt@depth \@breakloopfalse \cpt@Dloop@a#1,\cpt@nil,\cpt@unique#2{#3}% \popfunctions {#2,\if@useempty,\if@breakloop,\if@robdes}\cpt@depth \UseNormalDespace } \robust@def*\cpt@Dloop@a{% \if@boolTF{@breakloop}{% \defpass\gobble@remainder##1\cpt@unique##2##3{}% }{% \cpt@Dloop@b.% }% } \robust@def\cpt@Dloop@b#1,#2\cpt@unique#3#4{% \edef#3{\expandcsonce{\remove@to@dot#1}}% \ifxTF#3\cpt@nnil{}{% \ifcsnullTF#3{% \if@useempty#4\relax\fi }{% \usecsn{\if@robdes robust\else normal\fi @despacecontent}#3% #4\relax }% \cpt@Dloop@a#2\cpt@unique#3{#4}% }% } \robust@def*\foreachitem{\cpt@testst\cpt@foreach} \newcommand\cpt@foreach[4][,]{% \pushfunctions {#3,\if@useempty,\if@breakloop,\if@robdes}\cpt@depth \@breakloopfalse \ifcpt@st\let#3#2\else\edef#3{\unexpanded{#2}}\fi \long\def\cpt@foreach@a{% \if@boolTF{@breakloop}{% \defpass\gobble@remainder####1\cpt@unique####2####3{}% }{% \cpt@foreach@b.% }% }% \long\def\cpt@foreach@b##1#1##2\cpt@unique##3##4{% \edef##3{\expandcsonce{\remove@to@dot##1}}% \ifxTF##3\cpt@nnil{}{% \ifcsnullTF##3{% \if@useempty##4\relax\fi }{% \usecsn{\if@robdes robust\else normal\fi @despacecontent}##3% ##4\relax }% \cpt@foreach@a##2\cpt@unique##3{##4}% }% }% \expandafter\cpt@foreach@a#3#1\cpt@nil#1\cpt@unique#3{#4}% \popfunctions {#3,\if@useempty,\if@breakloop,\if@robdes}\cpt@depth \UseNormalDespace } \robust@def*\oneDfifo{\cpt@teststoptb\cpt@oneDfifo} \robust@def*\cpt@oneDfifo[#1]#2{% \declarefifoparser{#1}% \pushnumber\oneDfifodepth \ifnum\oneDfifodepth>\@ne\cpt@toodeep\oneDfifo1\fi \let\on@currlevel\@secondoftwo \@breakloopfalse \begingroup \if@boolTF{cpt@st}% {\let\reserved@a#2}{\edef\reserved@a{\unexpanded{#2}}}% \expandafter\endgroup\expandafter\cpt@fifoloop@a \reserved@a#1\cpt@nil#1% \popnumber\oneDfifodepth \let\on@currlevel\rc@on@currlevel } \robust@def*\xDfifo{\cpt@teststoptb\cpt@xDfifo} \robust@def*\cpt@xDfifo[#1]#2{% \declarefifoparser{#1}% \pushfunctions{\fifo@do,\if@breakloop,\if@useempty}\cpt@depth \let\curr@level\cpt@depth \@breakloopfalse \begingroup \if@boolTF{cpt@st}% {\let\reserved@a#2}{\edef\reserved@a{\unexpanded{#2}}}% \expandafter\endgroup\expandafter\cpt@fifoloop@a \reserved@a#1\cpt@nil#1% \popfunctions{\fifo@do,\if@breakloop,\if@useempty}\cpt@depth } \robust@def*\declarefifoparser#1{% \protected\def\cpt@fifoloop@a{% \if@boolTF{@breakloop}{% \defpass\gobble@remainder####1\cpt@nil#1{}% }{% \cpt@fifoloop@b.% }% }% \protected\def\cpt@fifoloop@b##1#1{% \edef\fifo@arg{\expandcsonce{\@gobble##1}}% \ifxTF\fifo@arg\cpt@nnil{}{% \ifcsnullTF\fifo@arg{% \if@boolTF{@useempty}{\on@currlevel{}\fifo@do{}\relax}{}% }{% \cptexpandargonce{\on@currlevel{}\fifo@do}\fifo@arg\relax }% \cpt@fifoloop@a }% }% } \robust@def*\simplefifoloop#1{\cpt@simplefifoloop#1,\cpt@nil,} \robust@def*\cpt@simplefifoloop#1,{% \edef\fifo@arg{\unexpanded{#1}}% \ifx\fifo@arg\cpt@nnil\else \fifo@do{#1}\relax \expandafter\cpt@simplefifoloop \fi } \let\rc@on@currlevel\on@currlevel \robust@def*\oneDsiso{\cpt@testst\cpt@oneDsiso} \robust@def\cpt@oneDsiso#1{% \pushnumber\oneDsisodepth \ifnum\oneDsisodepth>\@ne\cpt@toodeep\oneDsiso1\fi \let\on@currlevel\@secondoftwo \@breakloopfalse \begingroup \if@boolTF{cpt@st}% {\let\reserved@a#1}{\edef\reserved@a{\unexpanded{#1}}}% \expandafter\endgroup\expandafter\cpt@sisoloop\reserved@a\sisorepeat \popnumber\oneDsisodepth \let\on@currlevel\rc@on@currlevel } \robust@def*\xDsiso{\cpt@testst\cpt@xDsiso} \robust@def\cpt@xDsiso#1{% \pushfunctions{\siso@do,\if@useempty,\if@breakloop}\cpt@depth \let\curr@level\cpt@depth \@breakloopfalse \begingroup \ifcpt@st\let\reserved@a#1\else\edef\reserved@a{\unexpanded{#1}}\fi \expandafter\endgroup\expandafter\cpt@sisoloop\reserved@a\sisorepeat \popfunctions{\siso@do,\if@useempty,\if@breakloop}\cpt@depth } \robust@def*\cpt@sisoloop{% \if@boolTF{@breakloop}{% \defpass\gobble@remainder##1\sisorepeat{}% }{% \begingroup \let\temp@bgroup\bgroup \let\bgroup\cpt@undefined \futurelet\next\cpt@sisol@op }% } \robust@def\cpt@sisol@op#1{% \expandafter\endgroup \ifx\next\temp@bgroup\def\siso@arg{{#1}}\else\def\siso@arg{#1}\fi \ifblankTF{#1}{% \if@useempty\on@currlevel{}\siso@do{}\relax\fi }{% \ifx#1\sisorepeat\sisorepeat\fi \cptexpandargonce{\on@currlevel{}\siso@do}\siso@arg\relax }% \cpt@sisoloop } \robust@def\sisorepeat#1\cpt@sisoloop{\fi} \robust@def*\simplesisoloop#1{\cpt@simplesisoloop#1\cpt@nnil} \robust@def*\cpt@simplesisoloop#1{% \ifxTF#1\cpt@nnil{}{% \siso@do{#1}\relax \cpt@simplesisoloop }% } \robust@def*\csv@@parse{% \let\csv@kv@nr\z@ \cpt@teststoptb\csv@kv@parse } \robust@def*\kv@@parse{% \let\csv@kv@nr\@ne \cpt@teststoptb\csv@kv@parse } \newcommand\csv@kv@parse[2][,]{% \letcstocsn\csv@kv@do{\ifnum\csv@kv@nr=\z@ csv\else kv\fi @do}% \ifdefTF\csv@kv@do{}{% \cpt@err{'\string\csv@do' or '\string\kv@do' undefined}\@ehc }% \long\def\csv@tempa{% \if@boolTF{@breakloop}{% \defpass\gobble@remainder####1\cpt@nil#1{}% }{% \csv@tempb.% }% }% \long\def\csv@tempb##1#1{% \edef\csv@tempc{\expandcsonce{\remove@to@dot##1}}% \ifxTF\csv@tempc\cpt@nnil{}{% \ifcsnullTF\csv@tempc{% \if@boolTF{@useempty}{\on@currlevel{}\csv@kv@do{}\relax}{}% }{% \expandafter\on@currlevel\expandafter\@empty \expandafter\csv@kv@do\expandafter{\csv@tempc}\relax }% \csv@tempa }% }% \if@boolTF{cpt@st}% {\let\csv@tempc#2}{\edef\csv@tempc{\unexpanded{#2}}}% \ifcsnullTF\csv@tempc{}{% \cpt@sttrue \usecsn{cpt@\ifnum\csv@kv@nr=\@ne kv\else csv\fi normalize}% [#1]\csv@tempc }% \pushfunctions{\csv@kv@do,\if@useempty,\if@breakloop}\cpt@depth \@breakloopfalse \let\curr@level\cpt@depth \expandafter\csv@tempa\csv@tempc#1\cpt@nil#1% \popfunctions{\csv@kv@do,\if@useempty,\if@breakloop}\cpt@depth } \robust@def*\on@currlevel#1#2{% \ifdefTF\curr@level{% \ifnum\curr@level=\z@ \cpt@err{'\string\curr@level' is zero}{% I can't do anything on zero current level.}% \fi }{% \cpt@err{'\string\curr@level' undefined}\@ehc }% \cptexpandsecond {#1}{\noexpandcsn{\cptgobblescape#2@\cpt@rnm\curr@level}}% } \new@def\cptafterfi#1\fi{\fi#1} \new@def\cptafterelsefi#1\else#2\fi{\fi#1} \new@def\cptafterfifi#1\fi#2\fi{\fi\fi#1} \robust@def*\emptify#1{\let#1\@empty} \robust@def*\gemptify#1{\global\let#1\@empty} \robust@def*\genemptify{\cpt@teststpm\cpt@genemptify} \def\cpt@genemptify#1{% \ifcpt@pm\global\fi\ifcpt@st\else\long\fi\def#1{}% } \robust@def*\emptifycsn{\aftercsname\emptify} \robust@def*\gemptifycsn{\global\aftercsname\emptify} \robust@def*\emptifycsset#1{% \normaloneDloop{#1}\cpt@tempa{% \expandafter\ifescapedTF\expandafter{\cpt@tempa}{% \expandafter\def\cpt@tempa{}% }{% \cpt@err{Can't emptify unescaped macro}\@ehc }% }% } \robust@def*\cptonlypreamble#1{% \begingroup \def\cpt@resa{}% \normaloneDloop{#1}\cpt@tempa{% \ifcsnullTF\cpt@tempa{}{% \simpleexpandarg\ifescapedFT\cpt@tempa{% \cpt@err{'\expandcsonce\cpt@tempa' not a command}\@ehc }{% \simpleexpandarg\ifsingletokenTF\cpt@tempa{% \xifinsetTF{,\expandcsonce\cpt@tempa,} {,\expandcsonce\cpt@resa,}{% \cpt@warn{Command '\expandcsonce\cpt@tempa' multiply \MsgBrk submitted to \string\cptonlypreamble}% }{% \expandafter\@onlypreamble\cpt@tempa \cptaddtocommalist\cpt@resa\cpt@tempa }% }{% \cpt@err{Invalid multiple arguments '\expandcsonce\cpt@tempa'}\@ehc }% }% }% }% \endgroup } \newletcs\IfFileExistsTF\IfFileExists \new@def*\IfFileExistsFT#1{\IfFileExists{#1}\@secondoftwo\@firstoftwo} \new@def*\ifcsnullTF#1{% \@nameuse{@\expandafter\ifx\expandafter\cpt@unique \@gobble#1.\cpt@unique second\else first\fi oftwo}% {\@nameuse{@\ifx#1\@empty first\else second\fi oftwo}}% \@secondoftwo } \new@def*\ifcsnullFT#1{\ifcsnullTF{#1}\@secondoftwo\@firstoftwo} \new@def*\oifcsnullTF#1{\expandafter\ifcsnullTF#1} \new@def*\oifcsnullFT#1{\expandafter\ifcsnullFT#1} \new@def*\ifcsnnullTF#1{% \ifblankTF{#1}{% \@secondoftwo }{% \ifcsndefTF{#1}{% \expandafter\ifx\csname#1\endcsname\@empty \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi }{% \@secondoftwo }% }% } \new@def*\ifcsnnullFT#1{\ifcsnnullTF{#1}\@secondoftwo\@firstoftwo} \new@def*\ifdefnotnullTF#1{% \ifdefTF{#1}{\ifcsnullTF{#1}\@secondoftwo\@firstoftwo}\@secondoftwo } \new@def*\ifdefnotnullFT#1{\ifdefnotnullTF{#1}\@secondoftwo\@firstoftwo} \robust@def*\advexpandarg#1#2{% \ifsingletokenTF{#1}{% \expandafter#1\expandafter{#2}% }{% \LTS@err{Argument \detokenize{#1} has more than one token}\@ehc }% } \new@def*\simpleexpandarg#1#2{\expandafter#1\expandafter{#2}} \new@def*\expandcsonce#1{\unexpanded\expandafter{#1}} \new@def*\expandcsnonce#1{\cptthreexp\expandcsonce\usecsn{#1}} \new@def*\noexpandcsn#1{\expandcsonce{\csname#1\endcsname}} \let\cptmakecs\noexpandcsn \new@def*\cptoxdetok#1{\detokenize\expandafter{#1}} \new@def*\cpttxdetok#1{\detokenize\cptthreexp{#1}} \new@def*\cptsxdetok#1{\detokenize\cptsevenxp{#1}} \robust@def\cptpassexpanded#1{% \begingroup\protected@edef\x{\endgroup#1}\x } \let\cptexpanded\cptpassexpanded \robust@def\cptpassunexpanded#1{\begingroup\long\def\x{\endgroup#1}\x} \robust@def\defpass#1#2#{\afterassignment#1\long\def#1#2} \robust@def\edefpass#1#2#{\afterassignment#1\long\edef#1#2} \robust@def*\cptexpandarg#1#2{\cptpassexpanded{\unexpanded{#1}{#2}}} \let\cptexpandargbraced\cptexpandarg \robust@def*\cptexpandargonce#1#2{% \cptpassexpanded{\unexpanded{#1}{\expandcsonce{#2}}}% } \robust@def*\cptexpandsecond#1#2{\cptpassexpanded{\unexpanded{#1}#2}} \let\cptexpandargunbraced\cptexpandsecond \robust@def*\cptexpandsecondonce#1#2{% \cptpassexpanded{\unexpanded{#1}\expandcsonce{#2}}% } \robust@def*\cptexpandsecondarg#1#2#3{% \cptpassexpanded{\unexpanded{#1#2}{#3}}% } \robust@def*\cptexpandsecondargonce#1#2#3{% \cptpassexpanded{\unexpanded{#1#2}{\expandcsonce{#3}}}% } \robust@def*\cptexpandtwoargs#1#2#3{% \cptpassexpanded{\unexpanded{#1}{#2}{#3}}% } \robust@def*\cptexpandtwoargsonce#1#2#3{% \cptpassexpanded {\unexpanded{#1}{\expandcsonce{#2}}{\expandcsonce{#3}}}% } \robust@def*\StyleFileRCSInfo$#1 #2 #3 #4 #5 #6 #7 #8 ${% \def\cpt@filedate{#4}% \def\cpt@fileversion{v#3}% \def\cpt@filetime{#5}% \def\cpt@fileauthor{#6\@space#7}% } \new@def*\cpt@filedesc{} \defpass\cpt@tempa#1{% \robust@def*\StyleFilePurpose##1{% \gdef\cpt@filedesc{##1#1(\cpt@fileauthor)}% }% }{ } \new@def*\StyleFileInfo{% \cpt@filedate\@space\cpt@fileversion\@space\cpt@filedesc } \robust@def*\SetStyleFileMessages{% \begingroup \catcode`\ =9\catcode`\^^I=9\relax \edef\cpt@tempa{\expandafter\@carcube\@currname\@nil @}% \def\cpt@tempb{\@testopt{\expandafter\endgroup\cpt@SetStyleFileMessages}}% \expandafter\cpt@tempb\expandafter{\cpt@tempa}% } \robust@def*\cpt@SetStyleFileMessages[#1]#2#3#4{% \begingroup \def\cpt@tempa##1{\noexpandcsn{##1}}% \protected\def\cpt@tempb{\global\protected\@namedef}% \edef\cpt@tempc{\ifx\@currext\@pkgextension Package\else Class\fi}% \@tempswafalse \kernel@for\cpt@rsvda:={#2,#3,#4}\do{% \ifcsname#1\cpt@rsvda\endcsname \@tempswatrue\let\cpt@rsvdb\cpt@rsvda \fi }% \if@tempswa \def\reserved@a{#1\cpt@rsvdb}\@notdefinable \else \cptpassexpanded{% \cpt@tempb{#1#2}####1{\cpt@tempa{\cpt@tempc Info}% {\@currname}{####1\noexpand\@gobble}}% \cpt@tempb{#1#3}####1{\cpt@tempa{\cpt@tempc WarningNoLine}% {\@currname}{####1}}% \cpt@tempb{#1#4}####1####2{\cpt@tempa{\cpt@tempc Error}% {\@currname}{####1}{####2}}% }% \fi \endgroup \interactionmode\thr@@ } \SetStyleFileMessages[cpt@]{info}{warn}{err} \robust@def*\cpt@begingroup{% \begingroup \cpt@grouplevel\currentgrouplevel \cpt@grouptype\currentgrouptype } \robust@def*\cpt@endgroup{% \ifnum\cpt@grouptype=\currentgrouptype \ifnum\cpt@grouplevel=\currentgrouplevel\else \cpt@err{There is a group level mismatch}\@ehc \aftergroup\showgroups \fi \else \cpt@err{There is a group type mismatch}\@ehc \aftergroup\showgroups \fi \endgroup } \new@def*\ifboolTF#1{% \ifcsndefTF{if#1}{% \if@boolTF{#1}% }{% \cpt@err{Boolean '\usecsn{#1}' undefined}\@ehc }% } \new@def*\ifboolFT#1{\ifboolTF{#1}\@secondoftwo\@firstoftwo} \new@def*\ifbooleanTF#1#{\ifboolTF{#1}} \new@def*\if@boolTF#1{% \usecsn{if#1}\expandafter\@firstoftwo\else \expandafter\@secondoftwo\fi } \new@def*\if@boolFT#1{\if@boolTF{#1}\@secondoftwo\@firstoftwo} \new@def*\ifnumTF#1#{% \usecsn{@\ifnum#1first\else second\fi oftwo}% } \new@def*\ifnumFT#1#{\usecsn{@\ifnumTF#1{second}{first}oftwo}} \new@def*\ifoddTF#1#{% \usecsn{@\ifodd#1\@empty first\else second\fi oftwo}% } \new@def*\ifoddFT#1#{\usecsn{@\ifoddTF#1{second}{first}oftwo}} \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}} \new@edef*\@leftbracechar{\expandafter\@car\string{\@nil\iffalse}\fi} \new@def\cptstrcmp#1#2{% \ifnum\pdfstrcmp{#1}{#2}=\z@\expandafter\@firstoftwo\else \expandafter\@secondoftwo\fi } \new@def\ifstrcmpTF#1#2{% \cptstrcmp{\detokenize{#1}}{\detokenize{#2}}% } \new@def\ifstrcmpFT#1#2{\ifstrcmpTF{#1}{#2}\@secondoftwo\@firstoftwo} \robust@def\oifstrcmpTF#1#2{\cptexpandtwoargsonce\ifstrcmpTF{#1}{#2}} \robust@def\oifstrcmpFT#1#2{\cptexpandtwoargsonce\ifstrcmpFT{#1}{#2}} \robust@def\xifstrcmpTF#1#2{\cptexpandtwoargs\ifstrcmpTF{#1}{#2}} \robust@def\xifstrcmpFT#1#2{\cptexpandtwoargs\ifstrcmpFT{#1}{#2}} \robust@def\ifstreqTF#1#2{% \begingroup \robust@despace{#1}\cpt@tempa \robust@despace{#2}\cpt@tempb \aftercsname\endgroup{@\ifnum\pdfstrcmp {\cptoxdetok\cpt@tempa}{\cptoxdetok\cpt@tempb}% =\z@ first\else second\fi oftwo}% } \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}} \long\def\ifbracedTF#1{% \cptstrcmp{\detokenize\expandafter{\@gobble#1.}}{}\@secondoftwo{% \cptstrcmp{\detokenize\expandafter{\@gobble#1}}{}{% \cptstrcmp{\expandafter\cpt@car\detokenize{#1}\car@nil}{\@leftbracechar}% \@firstoftwo\@secondoftwo }{% \@secondoftwo }% }% } \newcommand\ifbracedFT[1]{\ifbracedTF{#1}\@secondoftwo\@firstoftwo} \long\def\ifleftbracedTF#1{% \cptstrcmp{\detokenize\expandafter{\@gobble#1.}}{}\@secondoftwo{% \cptstrcmp{\expandafter\cpt@car\detokenize{#1}\car@nil}{\@leftbracechar}% \@firstoftwo\@secondoftwo }% } \new@def\ifxTF#1#2{% \usecsn{@\ifx#1#2\@empty first\else second\fi oftwo}% } \new@def\ifxFT#1#2{\ifxTF{#1}{#2}\@secondoftwo\@firstoftwo} \new@def*\ifcptdefeqTF#1#2{% \ifdefTF{#1}{% \ifdefTF{#2}{% \usecsn{@\ifx#1#2first\else second\fi of oftwo}% }\@secondoftwo }\@secondoftwo } \new@def\ifcatTF#1#{% \usecsn{@\ifcat#1first\else second\fi oftwo}% } \new@def\ifcharcmpTF#1#2{% \ifsingletokenTF{#1}{% \ifsingletokenTF{#2}{% \usecsn{@\if\detokenize\expandafter{\cpt@rnm\expandafter \cptswap\expandafter{\cpt@rnm-`\q#2}{-`\q#1}}% first\else second\fi oftwo}% }{% \cpt@err{More than one token in '\detokenize{#2}'}\@ehc \@secondoftwo }% }{% \cpt@err{More than one token in '\detokenize{#1}'}\@ehc \@secondoftwo }% } \new@def\ifcharcmpFT#1#2{\ifcharcmpTF{#1}{#2}\@secondoftwo\@firstoftwo} \new@def\ifexpandableTF#1#2#3{% \cpt@rnm\ifleftbracedTF{#1}\@secondoftwo{% \ifblankTF{#1}\@secondoftwo{\expandafter\ifx\noexpand#1#1% \expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi}}% {0 #2}{0 #3}% } \new@def*\iffirstisspaceTF#1{% \long\def\iffirstisspaceTF##1##2##3{% \cpt@rnm\usecsn{@\ifblankTF{##1}{second}% {\cpt@iffirstisspace.##1#1\@nnil}oftwo}{0#1##2}{0#1##3}% }% } \iffirstisspaceTF{ } \new@def\cpt@iffirstisspace#1 {% \expandafter\ifblankTF\expandafter{\@gobble#1}{first}{second}% \remove@to@nnil } \new@def\ifsingletokenTF#1#2#3{% \cpt@rnm\ifblankTF{#1}\@secondoftwo{% \ifbracedTF{#1}\@secondoftwo{% \iffirstisspaceTF{#1}{% \expandafter\ifblankTF\expandafter{\@gobblespace#1}% }{% \expandafter\ifblankTF\expandafter{\@secondoftwo#1{}}% }% \@firstoftwo\@secondoftwo }% }{0 #2}{0 #3}% } \robust@def*\ifsingletokenFT#1{% \ifsingletokenTF{#1}\@secondoftwo\@firstoftwo } \robust@def*\cpt@checklistparser#1#2{% \ifsingletokenTF{#1}{% \xifinsetTF{\detokenize{#1}}{\detokenize{,;:/+-|*&}}{% #2 }{% \cpt@err{Invalid list parser '#1'}\@ehc }% }{% \cpt@err{Invalid list parser '#1'}\@ehc }% } \robust@def\exitgroupdef#1{% \cptpassexpanded{\endgroup\edef \noexpand#1{\noexpand\unexpanded{\expandcsonce#1}}}% } \robust@def*\cptaftergroup#1{% \advance\@tempcnta\@ne \csn@xdef{cpt@aftergroup@\cpt@rnm\@tempcnta}{% \gundefcsn{cpt@aftergroup@\cpt@rnm\@tempcnta}% \unexpanded\ifnullTF{#1}{}\expandafter{#1}% }% \aftercsname\aftergroup{cpt@aftergroup@\cpt@rnm\@tempcnta}% } \robust@def\cptafterassignment#1{% \begingroup \advance\@tempcnta\@ne \csn@xdef{cpt@afterassignment@\cpt@rnm\@tempcnta}{% \gundefcsn{cpt@afterassignment@\cpt@rnm\@tempcnta}% \unexpanded\ifnullTF{#1}{}\expandafter{#1}% }% \aftercsname{\endgroup\afterassignment}{% cpt@afterassignment@\cpt@rnm\@tempcnta}% } \robust@def*\cptexpandmacro#1#2{% \ifcptmacroTF{#1}{% \ifexpandableTF{#1}{% \simpleexpandarg\cptexpandmacro{#1}% }{% \edef#2{\unexpanded{#1}}% }% }{% \edef#2{\unexpanded{#1}}% }% } \robust@def\cpt@ifnextchar#1#2#3{% \kernel@ifnextchar\bgroup {\kernel@ifnextchar{#1}{#2}{#3}}{\cpt@ifn@xtchar{#1}{#2}{#3}}% } \robust@def\cpt@ifn@xtchar#1#2#3#4{% \csname @\if\detokenize{#1#4}first\else second\fi oftwo\endcsname{#2}{#3}#4% } \robust@def\cpt@testopt#1#2{\cpt@ifnextchar[{#1}{#1[{#2}]}} \robust@def*\cpt@ifbrack#1#2{\cpt@ifnextchar[{#1}{#2}} \new@def*\cpt@xtestopt#1#2#3{% \cpt@xifbrack#1\cpt@unique[\cpt@unique{#2#1}{#2[{#3}]{#1}}% } \new@def*\cpt@xifbrack#1[#2\cpt@unique#3#{% \usecsn{@\ifnullTF{#1#2}{first}{second}oftwo}% } \robust@def\cpt@testpnopt#1#2{\cpt@ifnextchar({#1}{#1({#2})}} \robust@def\cpt@ifstar#1{\cpt@ifnextchar*{\@firstoftwo{#1}}} \robust@def\cpt@ifplus#1{\cpt@ifnextchar+{\@firstoftwo{#1}}} \robust@def\cpt@ifprime#1{\cpt@ifnextchar'{\@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@teststpl#1{\cpt@testst{\cpt@testpl{#1}}} \robust@def\cpt@testpm#1{\cpt@ifprime{\cpt@pmtrue#1}{\cpt@pmfalse#1}} \robust@def\cpt@teststpm#1{\cpt@testst{\cpt@testpm{#1}}} \robust@def\cpt@teststopta#1{\cpt@testst{\cpt@testopt{#1}{}}} \robust@def\cpt@teststoptb#1{\cpt@testst{\cpt@testopt{#1}{,}}} \new@def*\ifcptstrcase#1{\cpt@xtestopt{#1}\cpt@ifstrcase{}} \new@def\cpt@ifstrcase[#1]#2#3{% \expandafter\cptswapfirstbraced\expandafter{#2}% {\cpt@ifstrc@se#3\cpt@mil\cpt@mil\cpt@nil}{#1}% } \new@def\cpt@ifstrc@se#1#2#3\cpt@nil#4#5{% \ifnullTF{#3}{#5}{% \ifstrcmpTF{#1}{#4}{#2}{% \cpt@ifstrc@se#3\cpt@nil{#4}{#5}% }% }% } \robust@def\cptinset#1#2{% \begingroup \def\in@@##1#1##2##3\in@@{\endgroup \ifx##2\in@\in@false\else\in@true\fi }% \in@@#2{\in@@}#1\in@\in@@ } \robust@def\ifinsetTF#1#2{% \cptinset{#1}{#2}% \@nameuse{@\ifin@ first\else second\fi oftwo}% } \robust@def\ifinsetFT#1#2{\ifinsetTF{#1}{#2}\@secondoftwo\@firstoftwo} \robust@def\oifinsetTF#1#2{% \begingroup \edef\cpt@tempa{{\expandcsonce{#1}}{\expandcsonce{#2}}}% \expandafter\endgroup\expandafter\ifinsetTF\cpt@tempa } \robust@def\oifinsetFT#1#2{\oifinsetTF{#1}{#2}\@secondoftwo\@firstoftwo} \robust@def\xifinsetTF#1#2{% \begingroup \protected@edef\cpt@tempa{{#1}{#2}}% \expandafter\endgroup\expandafter\ifinsetTF\cpt@tempa } \robust@def\xifinsetFT#1#2{\xifinsetTF{#1}{#2}\@secondoftwo\@firstoftwo} \robust@def*\cptaddtolist{\cpt@teststoptb\cpt@addtolist} \robust@def\cpt@addtolist[#1]#2#3{% \if@checklp\cpt@checklistparser{#1}\relax\fi \begingroup \def\cpt@tempa{\endgroup \ifdefTF#2{% \ifcpt@st \protected@edef#2{\ifcsnullTF#2{}{\expandcsonce#2#1}#3}% \else \edef#2{\ifcsnullTF#2{}{\expandcsonce#2#1}\unexpanded{#3}}% \fi }{% \ifcpt@st \protected@edef#2{#3}% \else \edef#2{\unexpanded{#3}}% \fi }% }% \ifblankTF{#3}{\if@useempty\cpt@tempa\else\endgroup\fi}% \cpt@tempa } \robust@def*\cptaddtocommalist#1#2{% \ifdefTF{#1}{% \xdef#1{% \ifcsnullTF#1{}{\expandcsonce{#1},}\expandcsonce{#2}% }% }{% \xdef#1{\expandcsonce{#2}}% }% } \robust@def*\cptkilloneelement{\cpt@testopt\cpt@killoneelement{,}} \robust@def\cpt@killoneelement[#1]#2#3{% \if@checklp\cpt@checklistparser{#1}\relax\fi \begingroup \@onelevel@sanitize#3% \edef\cpt@rsvda{\detokenize{#2}}% \cpttrimparser[#1]\cpt@rsvda \cptpassexpanded{\unexpanded{\def\cpt@rsvdb##1#1}\cpt@rsvda}% #1##2\cpt@nil{##1#1##2\cpt@mil}% \def\cpt@rsvdc##1#1\cpt@mil##2\cpt@mil{\ifx#1##1\@empty\else##1\fi}% \cptpassexpanded{\edef\noexpand#3{\unexpanded{\expandafter\cpt@rsvdc \cpt@rsvdb}#1#3#1\noexpand\cpt@mil#1\cpt@rsvda#1\cpt@nil}}% \exitgroupdef#3% \cptscantokens#3% } \robust@def*\cptkillelements{\cpt@testopt\cpt@killelements{,}} \robust@def\cpt@killelements[#1]#2#3{% \edef\kill@tempa{\unexpanded{#2}}% \cpt@sttrue\cpt@csvnormalize[#1]\kill@tempa \cpt@sttrue\cpt@csvnormalize[#1]#3% \pushfunctions\if@checklp\cpt@depth \@checklpfalse \long\def\fifo@do##1{\cpt@killoneelement[#1]{##1}#3}% \expandafter\simplefifoloop\expandafter{\kill@tempa}% \undefcs\kill@tempa \popfunctions\if@checklp\cpt@depth } \robust@def*\cptremoveoneelement{\cpt@testopt\cpt@removeoneelement{,}} \robust@def\cpt@removeoneelement[#1]#2#3{% \if@checklp\cpt@checklistparser{#1}\relax\fi \begingroup \def\cpt@removeone##1#1#2#1##2\remove@nil{% \gdef#3{##1#1##2}% \xifinsetFT{\remove@nil#1}{\remove@nil\expandcsonce{#3}}{}{% \def\cpt@removeone#1####1\remove@nil{\gdef#3{####1}}% \expandafter\cpt@removeone#3\remove@nil }% \xifinsetFT{#1\remove@nil}{\expandcsonce{#3}\remove@nil}{}{% \def\cpt@removeone####1#1\remove@nil{\gdef#3{####1}}% \expandafter\cpt@removeone#3\remove@nil }% }% \xifinsetFT{#1\unexpanded{#2}#1}{#1\expandcsonce{#3}#1}{}{% \protected\def\remove@nil{}% \expandafter\cpt@removeone\expandafter#1#3#1\remove@nil }% \endgroup } \robust@def*\cptremoveelements{\cpt@testopt\cpt@removeelements{,}} \robust@def\cpt@removeelements[#1]#2#3{% \edef\remove@tempa{\unexpanded{#2}}% \cpt@sttrue\cpt@csvnormalize[#1]\remove@tempa \cpt@sttrue\cpt@csvnormalize[#1]#3% \pushfunctions\if@checklp\cpt@depth \@checklpfalse \long\def\fifo@do##1{\cpt@removeoneelement[#1]{##1}#3}% \expandafter\simplefifoloop\expandafter{\remove@tempa}% \undefcs\remove@tempa \popfunctions\if@checklp\cpt@depth } \robust@def*\cptdeclarefilter#1{% \edef\cpt@usefilter##1##2{% \ifblankTF{#1}{\let##2##1}{% \ifxTF{#1}\relax{\let##2##1}{\unexpanded{#1}{##1}{##2}}% }% }% } \robust@def*\cptfiltermergelists{\cpt@testopt\cpt@filtermergelists{,}} \robust@def*\cpt@filtermergelists[#1]#2#3#4{% \begingroup \cptdeclarefilter{#4}% \ifdefTF{#2}{% \ifcsnullTF#2{}{\cpt@sttrue\cpt@csvnormalize[#1]#2}% }{% \def#2{}% }% \ifblankTF{#3}{% \def\cpt@update{}% }{% \edef\cpt@update{\unexpanded{#3}}% \cpt@sttrue\cpt@csvnormalize[#1]\cpt@update }% \def\cpt@add##1{% \edef#2{\ifx#2\@empty\else\expandcsonce#2#1\fi \expandcsonce{##1}}% }% \def\fifo@do##1{% \@choicefdfalse \edef\cpt@merge@a{\unexpanded{##1}}% \cpt@usefilter\cpt@merge@a\cpt@merge@b \def\fifo@do####1{% \edef\cpt@merge@c{\unexpanded{####1}}% \cpt@usefilter\cpt@merge@c\cpt@merge@d \cptscantokens\cpt@merge@b \cptscantokens\cpt@merge@d \ifx\cpt@merge@b\cpt@merge@d \@choicefdtrue\cpt@add\cpt@merge@a \else \cpt@add\cpt@merge@c \fi }% \cptexpandargonce{\def#2{}\cpt@stfalse\cpt@xDfifo[#1]}#2% \if@boolTF{@choicefd}{}{\cpt@add\cpt@merge@a}% }% \ifcsnullTF#2{% \edef#2{\expandcsonce\cpt@update}% }{% \ifcsnullTF\cpt@update{}{% \cpt@sttrue\cpt@xDfifo[#1]\cpt@update }% }% \exitgroupdef#2% } \robust@def*\cptfilterremoveelements{% \cpt@testopt\cpt@filterremoveelements{,}% } \robust@def*\cpt@filterremoveelements[#1]#2#3#4{% \begingroup \cptdeclarefilter{#4}% \ifdefTF{#2}{}{\def#2{}}% \ifcsnullTF#2{}{\cpt@sttrue\cpt@csvnormalize[#1]#2}% \edef\cpt@delete{\unexpanded{#3}}% \ifcsnullTF\cpt@delete {}{\cpt@sttrue\cpt@csvnormalize[#1]\cpt@delete}% \edef\cpt@tempd##1{% {\detokenize{#1}\noexpand\cptoxdetok{##1}\detokenize{#1}}% {\detokenize{#1}\cptoxdetok\cpt@delete\detokenize{#1}}% }% \def\cpt@tempc{}% \def\fifo@do##1{% \edef\cpt@tempa{\unexpanded{##1}}% \cpt@usefilter\cpt@tempa\cpt@tempb \expandafter\xifinsetTF\cpt@tempd\cpt@tempb{}{% \cpt@stfalse\cpt@addtolist[#1]\cpt@tempc{##1}% }% }% \ifcsnullTF#2{}{% \ifcsnullTF\cpt@delete{}{\cpt@sttrue\cpt@oneDfifo[#1]#2}% }% \let#2\cpt@tempc \exitgroupdef#2% } \robust@def*\preservebracedefQ#1#2{% \def\preserve@prefix{#1}% \def\preserve@delimiter{#2}% } \preservebracedefQ{\long}{\@nil} \robust@def*\preservebracedef#1{% \cpt@preservebracedef \cpt@pr@servebracedef#1.% } \robust@def*\PreserveBraceDef#1#2{% \cpt@preservebracedef \long\edef\preserve@after{\unexpanded{#1}}% \afterassignment\preserve@after \cpt@pr@servebracedef#2.% } \robust@def*\cpt@preservebracedef{% \begingroup \def\x{\endgroup\preserve@prefix \def\cpt@pr@servebracedef####1####2}% \expandafter\x\preserve@delimiter{% \preserve@prefix\edef##1{% \unexpanded\expandafter{\remove@to@dot##2}% }% }% } \robust@def*\cptglet{\global\let} \@namedef{@gobblespace} {} \robust@def*\csn@def#1{\cptthreexp\def\usecsn{#1}} \robust@def*\csn@gdef#1{\cptthreexp\gdef\usecsn{#1}} \robust@def*\csn@edef#1{\cptthreexp\edef\usecsn{#1}} \robust@def*\csn@xdef#1{\cptthreexp\xdef\usecsn{#1}} \robust@def*\letcsntocs#1{\cptthreexp\let\usecsn{#1}} \robust@def*\gletcsntocs#1{\global\cptthreexp\let\usecsn{#1}} \robust@def*\letcstocsn#1#2{% \begingroup\expandafter\endgroup\expandafter \let\expandafter#1\csname#2\endcsname } \robust@def*\gletcstocsn#1#2{% \begingroup\expandafter\endgroup\expandafter\global \expandafter\let\expandafter#1\csname#2\endcsname } \robust@def*\letcsntocsn#1#2{% \begingroup\expandafter\endgroup \expandafter\let\csname#1\expandafter \endcsname\csname#2\endcsname } \robust@def*\gletcsntocsn#1#2{% \begingroup\expandafter\endgroup\expandafter \global\expandafter\let\csname#1\expandafter \endcsname\csname#2\endcsname } \new@def\aftercsname#1#2{% \expandafter\cptswap\expandafter{\csname#2\endcsname}{#1}% } \new@def\xaftercsname#1#2{% \cptsevenxp\cptswap\cptthreexp{\csname#2\endcsname}{#1}% } \robust@def*\globalize#1{\cptglet#1#1} \robust@def*\globalizecsn#1{% \begingroup\expandafter\endgroup\expandafter \global\expandafter\let\csname#1\expandafter\endcsname \csname#1\endcsname } \robust@def*\undefcs#1{\let#1\cpt@undefined} \robust@def*\gundefcs{\global\undefcs} \robust@def*\undefcsn#1{\aftercsname\undefcs{#1}} \robust@def*\gundefcsn{\global\undefcsn} \robust@def*\undefcsset{\cpt@testst\cpt@undefcsset} \robust@def*\cpt@undefcsset#1{% \ifcpt@st\let\cpt@tempa#1\else\def\cpt@tempa{#1}\fi \normaloneDloop*\cpt@tempa\cpt@tempa{% \expandafter\ifescapedTF\expandafter{\cpt@tempa}{% \expandafter\undefcs\cpt@tempa }{% \cpt@err{I can't find escape in token '\cptoxdetok\cpt@tempa':\MsgBrk Maybe it's an active character}\@ehc }% }% } \robust@def*\cpttrimparser{\cpt@testopt\cpt@trimparser{,}} \robust@def\cpt@trimparser[#1]#2{% \begingroup \edef\cpt@tempd{\detokenize{#1}}% \let\trimparser@nil\cpt@nil \def\cpt@trimb{% \xifinsetFT{\cpt@tempd\trimparser@nil}{\cptoxdetok{#2}\trimparser@nil}{}{% \cptexpandsecond{\def\cpt@trimc####1}\cpt@tempd\trimparser@nil{% \edef#2{\expandcsonce{\@gobble####1}}% \cpt@trimb }% \expandafter\cpt@trimc\expandafter.#2\trimparser@nil }% }% \defpass\cpt@trima{% \xifinsetTF{\trimparser@nil\cpt@tempd}{\trimparser@nil\cptoxdetok{#2}}{% \expandafter\def\expandafter\cpt@trimc\cpt@tempd####1\trimparser@nil{% \edef#2{\unexpanded{####1}}% \cpt@trima }% \expandafter\cpt@trimc#2\trimparser@nil }{% \cpt@trimb }% }% \exitgroupdef#2% } \robust@def*\stripouterbraces{\cpt@testopt\cpt@stripouterbraces\@ne} \robust@def\cpt@stripouterbraces[#1]{% \begingroup \def\after@def##1##2##3{\exitgroupdef{##3}}% \let\nr\z@ \catcode`\{=1 \catcode`\}=2 \catcode`\#=6 \cpt@str@pouterbraces{#1}% } \robust@def\cpt@str@pouterbraces#1#2#3{% \edef\nr{\the\numexpr\nr+1}% \edef#3{\unexpanded{#2}}% \cpt@str@pouterbr@ces#2\strip@nil#3#1% } \robust@def\cpt@str@pouterbr@ces#1\strip@nil#2#3{% \defcmp@ifx{#1}#2% \expandafter\after@def \else \ifnum\nr>#3\relax \cptthreexp\after@def \else \cptthreexp\cpt@str@pouterbraces \fi \fi {#3}{#1}{#2}% } \robust@def\stripallouterbraces#1#2{% \edef#2{% \unexpanded\cptthreexp{\cpt@stripallouterbraces{#1}}% }% } \robust@def\stripallouterbraces@incs#1{% \expandafter\stripallouterbraces\expandafter{#1}#1% } \robust@def\cpt@stripallouterbraces#1{% \cpt@rnm\ifbracedTF{#1}{% \expandafter\ifnullTF\expandafter{\@secondoftwo#1{}}{% \expandafter\@gobble\cpt@stripallouterbraces#1% }{0 #1}% }{0 #1}% } \robust@def\defcmp@ifx#1#2{% \begingroup \edef\cpt@tempa{\unexpanded{#1}}% \expandafter\endgroup\ifx#2\cpt@tempa } \robust@def\defcmp@ifxTF#1#2{% \begingroup \edef\cpt@tempa{\unexpanded{#1}}% \ifxTF#2\cpt@tempa {\endgroup\@firstoftwo}{\endgroup\@secondoftwo}% } \robust@def*\cptbracearg{\cpt@testopt\cpt@bracearg\@ne} \robust@def\cpt@bracearg[#1]#2#3{% \begingroup \let\nr\z@ \loop \edef#3{\unexpanded{{#2}}}% \pushnumber\nr \ifnum\nr<#1\relax \repeat \exitgroupdef#3% } \defpass\cpt@tempa#1{% \new@def\xp@despace##1{% \cpt@rnm-`\q\cpt@normaldespace.##1\despace@nil#1\despace@nil }% \robust@def\normal@despace##1##2{% \edef##2{% \unexpanded\expandafter {\cpt@rnm-`\q\cpt@normaldespace.##1\despace@nil#1\despace@nil}% }% }% \robust@def\cpt@normaldespace##1#1\despace@nil{% \cpt@norm@ldespace##1\despace@nil }% \robust@def\cpt@norm@ldespace##1\despace@nil##2{% \expandafter\noexpand\@gobble##1% }% }{ } \robust@def\robust@despace#1#2{% \edef#2{\unexpanded{#1}}% \let\despace@tempa#2% \normal@despace{#1}#2% \ifxTF#2\despace@tempa{}{% \expandafter\robust@despace\expandafter{#2}#2% }% } \new@def*\despacecs{\cpt@testpm\cpt@despacecs} \new@def*\cpt@despacecs#1{% \usecsn{\ifcpt@pm robust\else normal\fi @despacecontent}{#1}% } \robust@def*\normal@despacecontent#1{% \expandafter\normal@despace\expandafter{#1}#1% } \robust@def*\robust@despacecontent#1{% \expandafter\robust@despace\expandafter{#1}#1% } \robust@def*\normal@despacecsvlist{% \let\despace@type\z@ \cpt@testopt\cpt@despacecsvlist{,}% } \robust@def*\robust@despacecsvlist{% \let\despace@type\@ne \cpt@testopt\cpt@despacecsvlist{,}% } \robust@def*\cpt@despacecsvlist[#1]#2{% \begingroup \let\cpt@rsvdb\@empty \UseEmptyEntry \ifnum\despace@type=\z@\let\do\normal@despace\else \let\do\robust@despace\fi \def\fifo@do##1{% \do{##1}\cpt@rsvda \cpt@sttrue\cpt@addtolist[#1]\cpt@rsvdb\cpt@rsvda }% \cpt@sttrue\cpt@oneDfifo[#1]{#2}% \let#2\cpt@rsvdb \exitgroupdef#2% \undefcs\despace@type } \new@edef*\ifcptmacroTF#1{% \unexpanded{\expandafter\cpt@ifmacro\meaning}% #1\detokenize{macro}:\cpt@nil } \new@def*\ifcptmacroFT#1{\ifcptmacroTF{#1}\@secondoftwo\@firstoftwo} \edef\cpt@ifmacro{% \def\noexpand\cpt@ifmacro##1\detokenize{macro}:##2\cpt@nil } \cpt@ifmacro{\usecsn{@\ifblankTF{#2}{second}{first}oftwo}} \robust@def*\ifescapedTF#1{% \begingroup\escapechar92\relax \edef\cpt@tempa{\expandafter\cpt@car\string#1x\car@nil}% \cptthreexp\endgroup\usecsn{@\ifx\cpt@tempa \@backslashchar first\else second\fi oftwo}% } \robust@def*\ifescapedFT#1{\ifescapedTF{#1}\@secondoftwo\@firstoftwo} \newcommand*\simplerobustify[1]{% \def\fifo@do##1{% \ifescapedTF{##1}{% \ifdefTF##1{% \aftercsname\newletcs{rcv@\cptgobblescape##1}##1% \protected\edef##1{\noexpandcsn{rcv@\cptgobblescape##1}}% }{% \cpt@err{Command '\string##1' undefined}\@ehc }% }{% \cpt@err{String '\detokenize{##1}' not escaped}\@ehc }% }% \simplefifoloop{#1}% } \robust@def*\leftaddtocs{% \let\cpt@def\edef\let\swap\cptswap\cpt@addtocs } \robust@def*\gleftaddtocs{% \let\cpt@def\xdef\let\swap\cptswap\cpt@addtocs } \robust@def*\rightaddtocs{% \let\cpt@def\edef\let\swap\cptalloftwo\cpt@addtocs } \robust@def*\grightaddtocs{% \let\cpt@def\xdef\let\swap\cptalloftwo\cpt@addtocs } \robust@def*\rightaddtocsn{\aftercsname\rightaddtocs} \robust@def*\grightaddtocsn{\aftercsname\grightaddtocs} \robust@def*\leftaddtocsn{\aftercsname\leftaddtocs} \robust@def*\gleftaddtocsn{\aftercsname\gleftaddtocs} \robust@def\cpt@addtocs#1#2{% \cpt@getmacroprefix{#1}% \ifdefTF#1{% \macroprefix\cpt@def#1{\swap{\expandcsonce{#1}}{\unexpanded{#2}}}% }{% \macroprefix\cpt@def#1{\unexpanded{#2}}% }% \undefcs\cpt@def\undefcs\swap } \robust@def*\cpt@getmacroprefix#1{% \begingroup \edef\cpt@tempa##1{\def##1####1\detokenize{macro}:####2\cpt@unique}% \cpt@tempa\@ifmacro{% \def\macroprefix{##1}% \usecsn{@\ifblankTF{##2}{second}{first}oftwo}% }% \edef\cpt@tempb##1{##1\detokenize{macro}:\cpt@unique}% \cpt@tempb{\expandafter\@ifmacro\meaning#1}{% \@testtrue }{% \@testfalse\def\macroprefix{}% }% \cptpassexpanded{% \endgroup\noexpand\scantokens {\def\noexpand\macroprefix{\macroprefix}\relax}% }% } \robust@def*\BeforeStartOfDocument{% \grightaddtocs\cpt@beforestartdoc@hook } \new@def*\cpt@beforestartdoc@hook{} \gleftaddtocs\document{% \endgroup \let\BeforeStartOfDocument\@firstofone \cpt@beforestartdoc@hook \let\BeforeStartOfDocument\@notprerr \gundefcs\cpt@beforestartdoc@hook \begingroup } \robust@def*\AfterStartOfDocument{% \grightaddtocs\cpt@afterstartdoc@hook } \new@def*\cpt@afterstartdoc@hook{} \grightaddtocs\document{% \let\AfterStartOfDocument\@firstofone \cpt@afterstartdoc@hook \let\AfterStartOfDocument\@notprerr \gundefcs\cpt@afterstartdoc@hook \ignorespaces } \gleftaddtocs\@popfilename{% \usecsn{% @\ifcsname\@currname.\@currext-cpt@h@@k\endcsname iden\else gobble\fi }% {\usecsn{\@currname.\@currext-cpt@h@@k}}% \gundefcsn{\@currname.\@currext-cpt@h@@k}% } \def\cptloadpackages#1{% \ifcsnullTF\@currname{% \cpt@err{Not in a style or class file}\@ehc }{% \def\cpt@loadpackages##1##2##3\cpt@nil{% \@ifpackageloaded{##1}{}{\RequirePackage[##2]{##1}[##3]}% }% \@useemptyfalse \normalxDloop{#1}\cpt@tempa{% \expandafter\cpt@loadpackages\cpt@tempa\cpt@nil }% }% } \robust@def*\AfterEndOfStyleFile{% \begingroup \def\cpt@tempa{\endgroup \expandafter\grightaddtocs \csname\@currname.\@currext-cpt@h@@k\endcsname }% \ifcsnullTF\@currname\endgroup\cpt@tempa } \edef\cpt@hashchar{\string#} \robust@def*\cpt@pushhash{% \begingroup \@makeother{\#}% \endlinechar\m@ne \cpt@pop@hash } \robust@def\cpt@push@hash#1#2{% \xifinsetTF\cpt@hashchar{\detokenize{#1}}{% \edef\x##1{##1\detokenize{#1}\cpt@hashchar\cpt@nil}% \edef\y##1{\def##1####1\cpt@hashchar####2\cpt@nil}% \y\y{% \ifblankTF{##2}{% \toks@\expandafter{\the\toks@##1}% }{% \cptpassexpanded {\toks@{\the\toks@##1\cpt@hashchar\cpt@hashchar}}% \y##2\cpt@nil }% }% \x{\toks@{}\y}% }{% \toks@\expandafter{\detokenize{#1}}% }% \edef#2{\the\toks@}% \exitgroupdef#2% } \robust@def*\cpt@pophash{% \begingroup \@makeother{\#}% \endlinechar\m@ne \cpt@push@hash } \robust@def\cpt@pop@hash#1#2{% \xifinsetTF{\detokenize{##}}{\detokenize{#1}}{% \edef\x##1{##1\detokenize{#1##}\cpt@nil}% \edef\y##1{\def##1####1\detokenize{##}####2\cpt@nil}% \y\y{% \ifblankTF{##2}{% \toks@\expandafter{\the\toks@##1}% }{% \cptpassexpanded{\toks@{\the\toks@##1\cpt@hashchar}}% \y##2\cpt@nil }% }% \x{\toks@{}\y}% }{% \toks@\expandafter{\detokenize{#1}}% }% \edef#2{\the\toks@}% \exitgroupdef#2% } \robust@def*\cpteveryscantokens{% \everyeof{\noexpand}% \endlinechar\m@ne \makeatletter \catcode`\ =10\relax \catcode`\\\z@ \catcode`\{\@ne \catcode`\}\tw@ } \robust@def*\cptscantokens#1{% \begingroup \edef#1{\def\string#1{\cptoxdetok{#1}}}% \cpteveryscantokens \scantokens\expandafter{#1}\relax \exitgroupdef#1% } \cptonlypreamble{% \cptpushcatcodes,\cptpopcatcodes, \UseNormalCatcodes,\rc@UseNormalCatcodes, \StyleFilePurpose,\StyleFileInfo,\AfterEndOfStyleFile, \StyleFileRCSInfo,\SetStyleFileMessages, \XDeclareOption,\XDeclareCommandOption,\XDeclareBooleanOption, \XDeclareCommandOptions,\XDeclareBooleanOptions, \XDeclareBiBooleanOptions,\XProcessOptions,\XExecuteOptions, \cpt@processedoptions,\cpt@optionlist,\cpt@splitoption, \cpt@processoptions,\cpt@xprocessoptions,\cpt@pr@cessoptions, \cpt@pr@c@ssoptions,\BeforeStartOfDocument, \AfterStartOfDocument } \robust@def*\csv@@normalize{\cpt@teststoptb\cpt@csvnormalize} \robust@def\cpt@csvnormalize[#1]#2{% \let\normalize@listtype\z@ \csv@kv@normalize{#1}{#2}\normalized@csvlist } \robust@def*\kv@@normalize{\cpt@teststoptb\cpt@kvnormalize} \robust@def\cpt@kvnormalize[#1]#2{% \let\normalize@listtype\@ne \csv@kv@normalize{#1}{#2}\normalized@kvlist } \robust@def\csv@kv@normalize#1#2#3{% \let\if@normst\ifcpt@st \cpt@checklistparser{#1}\relax \begingroup \expandafter\setup@parser@normalize\string#1% \if@normst \toks@\expandafter{\expandafter#1#2#1}% \else \toks@{#1#2#1}% \fi \normalize@activeparser \expandafter\normalize@spaceletter\string#1% \expandafter\normalize@letterspace\string#1% \expandafter\normalize@doubleletter\string#1% \ifnumFT\normalize@listtype=\@ne{}{% \normalize@activeequal \expandafter\normalize@spaceletter\string=% \expandafter\normalize@letterspace\string=% \expandafter\normalize@doubleletter\string=% \commaequal@err }% \edef#3{\the\toks@}% \expandafter\cpttrimparser\expandafter[\string#1]#3% \exitgroupdef#3% \if@normst\let#2#3\undefcs#3\fi \undefcs\if@normst } \def\setup@parser@normalize#1{% \begingroup \uccode`\~\string=`#1% \uppercase{\endgroup \def\normalize@activeparser{% \def\cpt@tempa####1~####2\cpt@nil{% \toks@\expandafter{\the\toks@####1}% \ifblankTF{####2}{}{\cpt@tempa#1####2\cpt@nil}% }% \toks@\expandafter{\expandafter}% \expandafter\cpt@tempa\the\toks@~\cpt@nil }% }% } \begingroup \uccode`\~\string=`\=% \uppercase{\endgroup \def\normalize@activeequal{% \def\cpt@tempa##1~##2\cpt@nil{% \expandafter\ifblankTF\expandafter{\the\toks@}{% \toks@{##1}% }{% \toks@\expandafter{\the\toks@=##1}% }% \ifblankTF{##2}{}{\cpt@tempa##2\cpt@nil}% }% \toks@\expandafter{\expandafter}\expandafter \cpt@tempa\the\toks@~\cpt@nil }% } \def\normalize@doubleletter#1{% \def\cpt@tempa##1#1#1##2\cpt@nil{% \ifblankTF{##2}{% \toks@{##1}% }{% \toks@{##1#1##2}% \expandafter\cpt@tempa\the\toks@\cpt@nil }% }% \expandafter\cpt@tempa\the\toks@#1#1\cpt@nil } \defpass\cpt@tempa#1{% \def\normalize@spaceletter##1{% \def\cpt@tempa####1#1##1####2\cpt@nil{% \ifblankTF{####2}{% \toks@{####1}% }{% \toks@{####1##1####2}% \expandafter\cpt@tempa\the\toks@\cpt@nil }% }% \expandafter\cpt@tempa\the\toks@#1##1\cpt@nil }% \def\normalize@letterspace##1{% \def\cpt@tempa####1##1#1####2\cpt@nil{% \ifblankTF{####2}{% \toks@{####1}% }{% \toks@{####1##1####2}% \expandafter\cpt@tempa\the\toks@\cpt@nil }% }% \expandafter\cpt@tempa\the\toks@##1#1\cpt@nil }% }{ } \robust@def*\commaequal@err{% \def\cpt@tempa##1,=##2\cpt@nil{% \ifblankTF{##2}{}{% \cpt@err{There is 'comma' next to 'equal' (,=) in \MsgBrk your key-value list}\@ehc }% }% \expandafter\cpt@tempa\the\toks@,=\cpt@nil } \let\cpt@documentclass\cpt@undefined \robust@def*\cpt@getdocumentclass{% \normaloneDloop*\@filelist\cpt@tempa{% \filename@parse\cpt@tempa \ifx\filename@ext\@clsextension \ifcsndefFT{opt@\filename@area\filename@base.\filename@ext}{}{% \xdef\cpt@documentclass{% \filename@area\filename@base.\filename@ext }% }% \fi \ifx\cpt@documentclass\cpt@undefined\else\@breaklooptrue\fi }% \ifdefTF\cpt@documentclass{}{% \@latex@info@no@line{'catoptions' package loaded before \string\documentclass: \MsgBrk no problem}% }% } \cptpassunexpanded{% \ifx\@filelist\relax \else \ifx\@filelist\@gobble \else \ifx\@filelist\@empty \else \cptsevenxp\cpt@getdocumentclass \fi \fi \fi \ifxTF\cpt@documentclass\cpt@undefined{% \let\cpt@documentclass\@empty \let\cpt@classoptionslist\@empty }{% \ifxTF\@classoptionslist\relax{}{% \ifxTF\@classoptionslist\@empty{}{% \cpt@sttrue\cpt@kvnormalize[,]\@classoptionslist }% }% \let\cpt@classoptionslist\@classoptionslist \cptexpandargonce{\emptify\@classoptionslist \normaloneDloop}\@classoptionslist\cpt@tempa{% \oifinsetTF{=}\cpt@tempa{}{% \cptaddtocommalist\@classoptionslist\cpt@tempa }% }% }% } \robust@def*\cpt@testfam#1{% \cpt@ifnextchar<{#1}{#1<{\@currname.\@currext}>}% } \robust@redef\@pass@ptions#1#2#3{% \begingroup \ifsingletokenTF{#2}{% \ifcptmacroTF{#2}{% \let\@expand\expandcsonce }{% \let\@expand\unexpanded }% }{% \let\@expand\unexpanded }% \ifcsndefTF{opt@#3.#1}{% \ifblankTF{#2}{}{% \cptexpandarg{\cptexpandsecond{\cpt@filtermergelists[,]}% {\cptmakecs{opt@#3.#1}}}{\@expand{#2}}{}% }% }{% \csn@edef{opt@#3.#1}{\@expand{#2}}% }% \globalizecsn{opt@#3.#1}% \endgroup } \robust@redef*\OptionNotUsed{% \ifx\@currext\@clsextension \cptaddtocommalist\@unusedoptionlist\CurrentOption \fi } \robust@redef*\@use@ption{% \xifinsetFT{,\cptoxdetok\CurrentOption,}% {,\cptoxdetok\@unusedoptionlist,}{}{% \cptexpandargonce{\cpt@killoneelement[,]}\CurrentOption \@unusedoptionlist }% \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 \normaloneDloop*\cpt@tempa\cpt@tempa{% \file@withopts{\the\toks@\fileswithopts{\cpt@tempa}\@pkgextension}% }% }% \expandafter\endgroup\the\toks@ } \let\@@fileswith@pti@ns\@fileswith@pti@ns \robust@def*\RecoverAtEndOfPackage#1{% \letcsntocs{rc@\expandafter\@gobble\string#1}#1% \begingroup \edef\cpt@tempa{% \let\unexpanded{#1}% \noexpandcsn{rc@\expandafter\@gobble\string#1}% }% \edef\cpt@tempb{\expandcsnonce{\@currname.\@currext-h@@k}}% \xifinsetTF{\cptoxdetok\cpt@tempa}{\cptoxdetok\cpt@tempb}{}{% \expandafter\AtEndOfPackage\expandafter{\cpt@tempa}% }% \xifinsetTF{\cptoxdetok\cpt@tempa}{\cptoxdetok\RequirePackage}{}{% \xdef\RequirePackage{% \expandcsonce\cpt@tempa\expandcsonce\RequirePackage }% }% \endgroup } \RecoverAtEndOfPackage\cpt@defdefault@ds \robust@def*\cpt@badoptionerr{% \expandafter\ifescapedTF\expandafter{\curropt}{% \cpt@err{Bad option name '\expandcsonce\curropt'}\@ehc }{% \expandafter\ifcptmacroFT\expandafter{\curropt}{}{% \cpt@err{Bad option name '\expandcsonce\curropt'}\@ehc }% }% } \robust@def*\XDeclareOption{% \let\@fileswith@pti@ns\@badrequireerror \cpt@ifstar {\cpt@testfam\cpt@defdefault@ds}% {\cpt@testfam\cpt@declareoption}% } \robust@def*\cpt@declareoption<#1>#2{% \normal@despace{#1}\currfam \normal@despace{#2}\curropt \cpt@badoptionerr \cptexpandarg\cpt@testopt {\cpt@d@clareoption{\currfam}{\curropt}}{}% } \robust@def\cpt@d@clareoption#1#2[#3]#4{% \cpt@d@cl@reoption{#1}{#2}{#3}% \if@boolTF{cpt@olddx}{% \global\long\csn@edef{#1@ds@#2}{\unexpanded{#4}}% }{% \begingroup \long\def\cpt@tempa##1{\endgroup \global\long\csn@def{#1@ds@#2}####1{##1}% }% \cpt@tempa{#4}% }% \cpt@olddxfalse } \robust@def*\XDeclareOptions{% \let\@fileswith@pti@ns\@badrequireerror \cpt@ifstar{% \cpt@err{Command \noexpand\XDeclareOptions has no star form}\@ehc }{% \cpt@testfam\cpt@declareoptions }% } \robust@def*\cpt@declareoptions<#1>#2{% \cpt@testopt{\cpt@d@clareoptions{#1}{#2}}{}% } \robust@def\cpt@d@clareoptions#1#2[#3]#4{% \edef\curr@fam{\xp@despace{#1}}% \def\curr@opts{#2}% \cpt@sttrue\cpt@csvnormalize[,]\curr@opts \def\fifo@do##1{% \def\curropt{##1}% \cpt@badoptionerr \expandafter\cpt@d@clareoption \expandafter{\curr@fam}{##1}[#3]{#4}% }% \cpt@stfalse\cptexpandargonce{\cpt@xDfifo[,]}\curr@opts \undefcs\curr@opts\undefcs\curr@fam } \robust@def*\XDeclareCommandOption{% \let\@fileswith@pti@ns\@badrequireerror \let\cmdoption\@ne \cpt@testfam\cpt@declarecmdoption } \robust@def*\XDeclareCommandOptions{% \let\@fileswith@pti@ns\@badrequireerror \let\cmdoption\@ne \cpt@testfam\cpt@declarecmdoptions } \robust@def*\XDeclareBooleanOption{% \let\@fileswith@pti@ns\@badrequireerror \let\cmdoption\z@ \cpt@testfam\cpt@declarecmdoption } \robust@def*\cpt@declarecmdoption<#1>#2{% \normal@despace{#1}\currfam \normal@despace{#2}\curropt \cpt@badoptionerr \cptexpandarg\cpt@testopt {\cpt@d@clarecmdoption{\currfam}{\curropt}}{}% } \robust@def\cpt@d@clarecmdoption#1#2[#3]{% \cptexpandarg{\cpt@testpnopt{\cpt@d@cl@recmdoption {#1}{#2}{#3}}}{\ifnum\cmdoption=\@ne cmd\fi\@currname @}% } \robust@def\cpt@d@cl@recmdoption#1#2#3(#4)#5{% \cpt@d@cl@reoption{#1}{#2}{#3}% \ifnum\cmdoption=\@ne \def\cpt@rsvda{\csn@def{#4#2}{####1}}% \else \cptexpandsecond{\usecsn{newif}}{\noexpandcsn{if#4#2}}% \def\cpt@rsvda{% \ifinsetTF{,####1,}{,true,false,}{}{% \@latex@error{Invalid value for option '#2'}\@ehc }% \cptuse{#4#2####1}% }% \fi \long\def\cpt@rsvdb##1{% \long\csn@gdef{#1@ds@#2}####1{##1\relax}% }% \expandafter\cpt@rsvdb\expandafter{\cpt@rsvda#5}% } \robust@def*\XDeclareBooleanOptions{% \let\@fileswith@pti@ns\@badrequireerror \let\cmdoption\z@ \cpt@testfam\cpt@declarecmdoptions } \robust@def*\cpt@declarecmdoptions<#1>#2{% \cpt@testopt{\cpt@d@clarecmdoptions{#1}{#2}}{}% } \robust@def\cpt@d@clarecmdoptions#1#2[#3]{% \cptexpandarg{\cpt@testpnopt{\cpt@d@cl@recmdoptions {#1}{#2}{#3}}}{\ifnum\cmdoption=\@ne cmd\fi\@currname @}% } \robust@def\cpt@d@cl@recmdoptions#1#2#3(#4)#5{% \edef\curr@fam{\xp@despace{#1}}% \def\curr@opts{#2}% \cpt@sttrue\cpt@csvnormalize[,]\curr@opts \def\fifo@do##1{% \def\curropt{##1}% \cpt@badoptionerr \expandafter\cpt@d@cl@recmdoption \expandafter{\curr@fam}{##1}{#3}(#4){#5}% }% \cpt@stfalse\cptexpandargonce{\cpt@xDfifo[,]}\curr@opts \undefcs\curr@opts\undefcs\curr@fam } \robust@def*\XDeclareBiBooleanOptions{% \let\@fileswith@pti@ns\@badrequireerror \let\cmdoption\z@ \cpt@testfam\cpt@declarebibooloptions } \robust@def*\cpt@declarebibooloptions<#1>#2{% \begingroup \@tempcnta\z@ \def\fifo@do##1{\advance\@tempcnta\@ne}% \simplefifoloop{#2}% \ifnum\@tempcnta>\tw@ \cpt@err{Biboolean options '#2' more than 2}\@ehc \aftergroup\@gobble \else \ifnum\@tempcnta<\tw@ \cpt@err{Biboolean options '#2' less than 2}\@ehc \aftergroup\@gobble \fi \fi \endgroup \cpt@testopt{\cpt@d@clarebibooloptions{#1}{#2}}{}% } \robust@def\cpt@d@clarebibooloptions#1#2[#3]{% \cptexpandarg{\cpt@testpnopt{\cpt@d@cl@rebibooloptions {#1}{#2}{#3}}}{\@currname @}% } \robust@def\cpt@d@cl@rebibooloptions#1#2#3(#4)#5#6{% \edef\curr@fam{\xp@despace{#1}}% \def\curr@opts{#2}% \cpt@sttrue\cpt@csvnormalize[,]\curr@opts \edef\do@prompted##1##2##3{% \unexpanded{\cptsevenxp\ifstrcmpTF\cptthreexp}% {\noexpand\csname#4##1@prompted\noexpand\endcsname}{true}{}{% \XExecuteOptions<\curr@fam>{##2=##3}% }% }% \begingroup \def\cpt@tempa##1,##2\cpt@nil{% \endgroup \csn@def{#4##1@prompted}{false}% \csn@def{#4##2@prompted}{false}% \simpleexpandarg\cpt@d@cl@recmdoption\curr@fam{##1}{#3}(#4){% #5% \csn@def{#4##2@prompted}{true}% \ifboolTF{#4##1}{% \do@prompted{##1}{##2}{false}% }{% \do@prompted{##1}{##2}{true}% }% \csn@def{#4##2@prompted}{false}% }% \simpleexpandarg\cpt@d@cl@recmdoption\curr@fam{##2}{#3}(#4){% #6% \csn@def{#4##1@prompted}{true}% \ifboolTF{#4##2}{% \do@prompted{##2}{##1}{false}% }{% \do@prompted{##2}{##1}{true}% }% \csn@def{#4##1@prompted}{false}% }% }% \expandafter\cpt@tempa\curr@opts\cpt@nil \undefcs\curr@opts\undefcs\curr@fam } \robust@def\cpt@d@cl@reoption#1#2#3{% \ifcsndefTF{#1@declaredoptions}{% \xifinsetTF{,\detokenize{#2},}{,\cpt@getdeclaredoptions{#1},}{% \cpt@warn{Option '#2' multiply defined\MsgBrk in family '#1'\MsgBrk (in \@cls@pkg\@space'\@currname')% }% }{% \cpt@stfalse \cptexpandarg{\cpt@addtolist[,]}% {\noexpandcsn{#1@declaredoptions}}{#2}% }% }{% \csn@def{#1@declaredoptions}{#2}% }% \global\csn@edef{#1@ds@#2@default}{% \noexpandcsn{#1@ds@#2}{\unexpanded{#3}}% }% } \new@def*\cpt@getdeclaredoptions#1{% \ifcsnnullTF{#1@declaredoptions}{}{% \detokenize\cptsevenxp{\usecsn{#1@declaredoptions}}% }% } \robust@def*\cpt@defdefault@ds<#1>#2{% \csn@edef{#1@default@ds}{\unexpanded{#2}}% \protected\def\cpt@defdefault@ds<##1>##2{% \cpt@err{'\string\XDeclareOption*' multiply defined in \MsgBrk\@cls@pkg\space'\@currname'}{Multiple star variant of \string\XDeclareOption\@space in \@cls@pkg\@space'\@currname'.}% }% } \newletcs\rc@cpt@defdefault@ds\cpt@defdefault@ds \new@def*\cpt@optionlist#1{% \ifcsndefFT{opt@#1}{}{\unexpanded\cptsevenxp{\usecsn{opt@#1}}}% } \newletcs\cpt@processedoptions\@empty \robust@def*\XProcessOptions{% \let\@fileswith@pti@ns\@badrequireerror \edef\cpt@testname{\@currname.\@currext}% \ifx\cpt@testname\cpt@documentclass \let\@unusedoptionlist\cpt@classoptionslist \fi \edef\cpt@classoptions{% \ifx\cpt@testname\cpt@documentclass\else \expandcsonce\cpt@classoptionslist\fi }% \edef\@curroptions{\cpt@optionlist{\@currname.\@currext}}% \ifcsnullTF\@curroptions{}% {\cpt@sttrue\cpt@kvnormalize[,]\@curroptions}% \cpt@ifstar {\cpt@sttrue\cpt@testfam\cpt@processoptions}% {\cpt@stfalse\cpt@testfam\cpt@processoptions}% } \robust@def*\cpt@processoptions<#1>{% \if@boolTF{cpt@st}{% \cpt@testopt{\cpt@xprocessoptions#1}{}% }{% \cpt@testopt{\cpt@pr@cessoptions#1}{}% }% } \robust@def*\cpt@pr@cessoptions#1[#2]{% \normal@despace{#1}\currfam \def\kv@do##1{% \edef\CurrentOption{\unexpanded{##1}}% \ifcsnullTF\CurrentOption{}{% \cpt@splitoption\z@ \if@boolFT{cpt@optf}{}{% \cpt@inpoxtrue \ifcsndefFT{#1@ds@\curropt}{}{% \ifblankTF{#2}{% \cpt@igoptfalse }{% \oifinsetTF{\curropt}{#2}{% \cpt@igopttrue }{% \cpt@igoptfalse }% }% \cpt@useoption }% }% }% }% \ifcsnullTF\cpt@classoptions{}{% \cptexpandarg{\kv@@parse*}{\noexpandcsn{#1@declaredoptions}}% }% \cpt@pr@c@ssoptions{#1}{#2}% } \robust@def*\cpt@xprocessoptions#1[#2]{% \normal@despace{#1}\currfam \def\kv@do##1{% \edef\CurrentOption{\unexpanded{##1}}% \ifcsnullTF\CurrentOption{}{% \cpt@splitoption\@ne \xifinsetFT{,\cptoxdetok\curropt,}% {,\cpt@getdeclaredoptions{#1},}{}{% \cpt@inpoxtrue \ifcsndefFT{#1@ds@\curropt}{}{% \ifblankTF{#2}{% \cpt@igoptfalse }{% \oifinsetTF{\curropt}{#2}{% \cpt@igopttrue }{% \cpt@igoptfalse }% }% \cpt@useoption }% }% }% }% \ifcsnullTF\cpt@classoptions{}{\kv@@parse*\cpt@classoptions}% \cpt@pr@c@ssoptions{#1}{#2}% } \robust@def*\cpt@pr@c@ssoptions#1#2{% \normal@despace{#1}\currfam \def\kv@do##1{% \edef\CurrentOption{\unexpanded{##1}}% \ifcsnullTF\CurrentOption{}{% \cpt@splitoption\@ne \cpt@inpoxtrue \ifcsndefTF{#1@ds@\curropt}{% \ifblankTF{#2}{% \cpt@igoptfalse }{% \oifinsetTF{\curropt}{#2}{% \cpt@igopttrue }{% \cpt@igoptfalse }% }% \cpt@useoption }{% \ifcsndefTF{#1@default@ds}{% \usecsn{#1@default@ds}% }{% \default@ds }% }% }% }% \ifcsnullTF\@curroptions{}{\kv@@parse*\@curroptions}% \let\CurrentOption\@empty \ifx\cpt@documentclass\cpt@undefined \cptglet\cpt@pr@cessedoptions\cpt@processedoptions \else \let\cpt@pr@cessedoptions\@empty \fi \undefcs\cpt@classoptions \let\cpt@processedoptions\@empty \let\@fileswith@pti@ns\@@fileswith@pti@ns \cpt@olddxfalse \AtEndOfPackage{\let\@unprocessedoptions\relax}% } \robust@def*\XExecuteOptions{\cpt@testfam\cpt@executeoptions} \robust@def*\cpt@executeoptions<#1>#2{% \normal@despace{#1}\currfam \let\cpt@executedoptions\@empty \let\rc@CurrentOption\CurrentOption \def\kv@do##1{% \edef\CurrentOption{\unexpanded{##1}}% \ifcsnullTF\CurrentOption{}{% \cpt@splitoption\@ne \xifinsetTF{,\cptoxdetok\curropt,}% {,\cpt@getdeclaredoptions{#1},}{% \xifinsetTF{,\cptoxdetok\curropt,}% {,\cptoxdetok\cpt@executedoptions,}{% \cpt@warn{Option '\curropt' multiply submitted to \MsgBrk\string\XExecuteOptions: re-executed}% }{% \cptaddtocommalist\cpt@executedoptions\curropt }% \cpt@inpoxfalse\cpt@igoptfalse\cpt@useoption }{% \cpt@warn{Option '\expandcsonce\curropt' not declared: ignored}% }% }% }% \kv@@parse{#2}% \let\CurrentOption\rc@CurrentOption \let\cpt@executedoptions\@empty \cpt@olddxfalse } \robust@def\cpt@splitoption#1{% \ifcase#1\relax \cpt@optffalse \oneDloop@b\cpt@classoptions\@currentoption{% \ifcsnullTF\@currentoption{}{% \xifinsetTF{=}{\cptoxdetok\@currentoption}{% \expandafter\cpt@split@ption\@currentoption=\cpt@nil }{% \let\@curropt\@currentoption \let\@currval\@empty }% \let\currval\@currval \ifx\@curropt\CurrentOption \cpt@optftrue\@breaklooptrue \let\curropt\@curropt \let\currentoption\@currentoption \fi }% }% \or \let\currentoption\CurrentOption \xifinsetTF{=}{\cptoxdetok\CurrentOption}{% \expandafter\cpt@split@ption\CurrentOption=\cpt@nil \let\curropt\@curropt \let\currval\@currval }{% \let\curropt\CurrentOption \let\currval\@empty }% \else \cpt@err{Invalid case '\expandcsonce{#1}' for command '\string\cpt@splitoption'}\@ehc \fi } \def\cpt@split@ption#1=#2\cpt@nil{% \edef\@curropt{\unexpanded{#1}}% \ifinsetTF{=\cpt@nil}{#2\cpt@nil}{% \begingroup \def\cpt@tempa##1=##2\cpt@nil{\endgroup \edef\@currval{\expandcsonce{\remove@to@dot##1}}% }% \cpt@tempa.#2\cpt@nil }{% \edef\@currval{\unexpanded{#2}}% }% } \robust@def*\cpt@useoption{% \ifcpt@inpox \xifinsetTF{,\cptoxdetok\CurrentOption,}% {,\cptoxdetok\cpt@processedoptions,}{}{% \cptaddtocommalist\cpt@processedoptions\CurrentOption }% \remove@curr@option\currentoption \ifx\currentoption\CurrentOption\else \remove@curr@option\CurrentOption \fi \fi \ifcpt@igopt\else \ifcpt@olddx \cptuse{\currfam @ds@\curropt}% \else \ifcsndefFT{\currfam @ds@\curropt}{}{% \ifcsnullTF\currval{% \cptthreexp\cpt@usedefault \csname\currfam @ds@\curropt @default\endcsname\cpt@nil }{% \cpt@use@ption }% }% \fi \fi } \robust@def*\cpt@use@ption{% \cpt@pushoptionstate \cptexpandargonce{\cptuse{\currfam @ds@\curropt}}\currval\relax \cpt@popoptionstate } \robust@def*\cpt@usedefault#1#2\cpt@nil{% \ifcptmacroTF{#1}{% \edef\cpt@tempa{\expandafter\@gobble\string#1}% }{% \cpt@err{Invalid option macro passed to command '\string\cpt@usedefault'}\@ehc }% \edef\cpt@tempb{\currfam @ds@\curropt}% \@onelevel@sanitize\cpt@tempb \ifxTF\cpt@tempa\cpt@tempb{% \begingroup \csn@def{\currfam @ds@\curropt}##1{% \toks@{\def\currval{##1}}% }% \cptuse{\currfam @ds@\curropt @default}% \expandafter\endgroup\the\toks@ \cpt@use@ption }{% \cpt@warn{Non-standard default function for option '\expandcsonce\curropt':\MsgBrk Executed anyway}% \cpt@pushoptionstate \cptuse{\currfam @ds@\curropt @default}\relax \cpt@popoptionstate }% } \robust@def*\cpt@pushoptionstate{% \pushfunctions{\currfam,\curropt,\currval,\CurrentOption,% \currentoption,\ifcpt@inpox,\ifcpt@optf,\ifcpt@igopt}\cpt@optdepth } \robust@def*\cpt@popoptionstate{% \popfunctions{\currfam,\curropt,\currval,\CurrentOption,% \currentoption,\ifcpt@inpox,\ifcpt@optf,\ifcpt@igopt}\cpt@optdepth } \robust@def*\remove@curr@option#1{% \cptexpandargonce{\cpt@killoneelement[,]}{#1}\@unusedoptionlist } \BeforeStartOfDocument{% \ifdefFT\cpt@pr@cessedoptions{}{% \ifcsnullTF\cpt@pr@cessedoptions{}{% \ifcsnullTF\@unusedoptionlist{}{% \oneDloop@b\cpt@pr@cessedoptions\cpt@tempa{% \xifinsetFT{,\cptoxdetok\cpt@tempa,}% {,\cptoxdetok\@unusedoptionlist,}{}{% \remove@curr@option\cpt@tempa }% }% }% }% }% \globalize\@unusedoptionlist \undefcs\cpt@pr@cessedoptions } \cptpassunexpanded{% \begingroup \def\cpt@tempa{\endgroup \cptglet\cpt@kernel@DeclareOption\DeclareOption \cptglet\cpt@kernel@ProcessOptions\ProcessOptions \cptglet\cpt@kernel@ExecuteOptions\ExecuteOptions \gdef\DeclareOption{\cpt@olddxtrue\XDeclareOption}% \gdef\ProcessOptions{\cpt@olddxtrue\XProcessOptions}% \gdef\ExecuteOptions{\cpt@olddxtrue\XExecuteOptions}% \AtEndOfPackage{% \ifcpt@usepox\else \def\documentclass{% \let\documentclass\@twoclasseserror \if@compatibility\else \def\usepackage{% \cptglet\DeclareOption\cpt@kernel@DeclareOption \cptglet\ProcessOptions\cpt@kernel@ProcessOptions \cptglet\ExecuteOptions\cpt@kernel@ExecuteOptions \cpt@olddxfalse \RequirePackage }% \fi \@fileswithoptions\@clsextension }% \fi }% }% \ifx\cpt@documentclass\cpt@undefined \expandafter\cpt@tempa\else\expandafter\endgroup\fi } \XDeclareBooleanOption{verbose}[true](cpt@){} \XDeclareBiBooleanOptions{draft,final}[true](mp@){}{} \XDeclareBooleanOption{usepox}[true](cpt@){% \ifcpt@usepox \AtEndOfPackage{% \gdef\DeclareOption{\cpt@olddxtrue\XDeclareOption}% \gdef\ProcessOptions{\cpt@olddxtrue\XProcessOptions}% \gdef\ExecuteOptions{\cpt@olddxtrue\XExecuteOptions}% }% \fi } \XDeclareOption*{\cpt@warn{Unknown option '\CurrentOption' ignored}} \XExecuteOptions{verbose=false,usepox=true} \XProcessOptions* \cptpopcatcodes \cptrestorecatcodes \declarefutureletset[fl@]{lbracket,star,rquote} \endinput %% End of file catoptions.sty %%