From 4b1764622c0c26047430e01ccc59d2c448a25271 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Thu, 3 Mar 2011 00:34:00 +0000 Subject: catoptions 0.2 (1mar11) git-svn-id: svn://tug.org/texlive/trunk@21584 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/doc/latex/catoptions/README | 14 +- .../doc/latex/catoptions/catoptions-guide.pdf | Bin 337140 -> 350403 bytes .../doc/latex/catoptions/catoptions-guide.tex | 164 +- .../tex/latex/catoptions/catoptions-guide.cfg | 29 +- .../texmf-dist/tex/latex/catoptions/catoptions.sty | 1597 +++++++++++++------- Master/tlpkg/libexec/ctan2tds | 1 + 6 files changed, 1179 insertions(+), 626 deletions(-) (limited to 'Master') diff --git a/Master/texmf-dist/doc/latex/catoptions/README b/Master/texmf-dist/doc/latex/catoptions/README index e75d6b7a377..209718e379d 100644 --- a/Master/texmf-dist/doc/latex/catoptions/README +++ b/Master/texmf-dist/doc/latex/catoptions/README @@ -1,15 +1,21 @@ This is the README file for the 'catoptions' package. SUMMARY -The 'catoptions' package changes package loading internals so that all subsequently loaded packages can rely on normal/standard catcodes of all ASCII characters. The package defines canonical control sequences to represent all the visible ASCII characters. It also provides robust options parsing mechanisms, in addition to many TeX programming tools. +The 'catoptions' package changes package loading internals so +that all subsequently loaded packages can rely on normal/standard +catcodes of all ASCII characters. The package defines canonical +control sequences to represent all the visible ASCII characters. +It also provides robust options parsing mechanisms, in addition +to many TeX programming tools. AUTHOR Ahmed Musa -EARLIER WORKS -The 'catoptions' package is based on the 'pcatcode' package by Michael J. Downes and David M. Jones. +RELATED PACKAGES +The 'catoptions' package is based on the 'pcatcode' package +by Michael J. Downes and David M. Jones. VERSION -Version 0.1, February 2011 +Version 0.2, February 2011 diff --git a/Master/texmf-dist/doc/latex/catoptions/catoptions-guide.pdf b/Master/texmf-dist/doc/latex/catoptions/catoptions-guide.pdf index 9018dc051d0..9aeba1d85e3 100644 Binary files a/Master/texmf-dist/doc/latex/catoptions/catoptions-guide.pdf and b/Master/texmf-dist/doc/latex/catoptions/catoptions-guide.pdf differ diff --git a/Master/texmf-dist/doc/latex/catoptions/catoptions-guide.tex b/Master/texmf-dist/doc/latex/catoptions/catoptions-guide.tex index 7a7538d17b2..d6d4a9acee6 100644 --- a/Master/texmf-dist/doc/latex/catoptions/catoptions-guide.tex +++ b/Master/texmf-dist/doc/latex/catoptions/catoptions-guide.tex @@ -11,7 +11,7 @@ \title{The \texttt{\color{blue}catoptions} Package\titleref{t1}} \titlenote[t1]{The package is available at \iftogTF{pdf}{\url{\@titleurl}}{\url{\@shorttitleurl}}.} -\version{0.1} +\version{0.2} \titleurl{http://www.ctan.org/tex-archive/macros/latex/contrib/catoptions/} \shorttitleurl{http://www.ctan.org/} \author{Ahmed Musa \Email{a.musa@rocketmail.com}\\Preston, Lancashire, UK} @@ -19,7 +19,7 @@ \def\abstractname{\textsf{Summary}} \begin{abstract} \small - The \pkg'{catoptions} provides several extensions to the \pkgm'{pcatcode}. Apart from the tools related to setting up, preserving and restoring category codes, it includes many programming macros and even new list and options processing interfaces. It modifies the \latex kernel's options parsing mechanism to forestall premature expansion of options and values (in the manner of the \pkgs'{xkvltxp,kvoptions-patch}), so that the \pkg'{catoptions} may be loaded even before \hx{\documentclass}. In fact, the package is meant to be loaded on top of other packages, so as to exploit its catcode preserving scheme. Among other reasons, this necessitated the development of the options parsing scheme of this package. Only the catcode and options parsing facilities are treated in this manual; the macro programming interfaces will be covered in the documentation of the \pkg'{ltxtools}. The machinery of the \pkg'{catoptions} adds no cost to the simple syntax of \LaTeX's native options parser. Users who are already familiar with \LaTeX's legacy options processing don't necessarily have to invest the time that is essential in learning the extensive machinery of existing key-value and option parsers, although those other packages (\eg, \pkgs{xkeyval, kvsetkeys, kvoptions, skeyval, rkeyval, pgfkeys, pgfopts}) contain richer featuresets. Existing packages don't have to be modified to use the features of the \pkg'{catoptions}. The \pkg'{catoptions}, while maintaining simplicity, does not strip off even one level of outer braces in parsing package options and in list processing. It robustly normalizes key-values and options prior to parsing. + The \pkg'{catoptions} provides several extensions to the \pkgm'{pcatcode}. Apart from the tools related to setting up, preserving and restoring category codes, it includes many \texorlatex programming tools and even new list and options processing interfaces. It modifies the \latex kernel's options parsing mechanism to forestall premature expansion of options and values (in the manner of the \pkgs'{xkvltxp,kvoptions-patch}), so that the \pkg'{catoptions} may be loaded even before \hx{\documentclass}. In fact, the package is meant to be loaded on top of other packages, so as to exploit its catcode preserving scheme. Among other reasons, this necessitated the development of the options parsing scheme of this package. Only the catcode and options parsing facilities are treated in this manual; the macro programming interfaces will be covered in the documentation of the \pkg'{ltxtools}. The machinery of the \pkg'{catoptions} adds no cost to the simple syntax of \LaTeX's native options parser. Users who are already familiar with \LaTeX's legacy options processing don't necessarily have to invest the time that is essential in learning the extensive machinery of existing key-value and option parsers, although those other packages (\eg, \pkgs{xkeyval, kvsetkeys, kvoptions, skeyval, rkeyval, pgfkeys, pgfopts}) contain richer featuresets. Existing packages don't have to be modified to use the features of the \pkg'{catoptions}. The \pkg'{catoptions}, while maintaining simplicity, does not strip off even one level of outer braces in parsing package options and in list processing. It robustly normalizes key-values and options prior to parsing. The options parsing scheme of the \pkg'{catoptions} has been tried as a replacement parser on many packages, including \pkgs'{hyperref, cleveref, natbib} without difficulties. \end{abstract} \let\licensename\relax @@ -46,13 +46,33 @@ My motivation for turning to the \pkgnoidx'{pcatcode} was to save myself the tro \docsection(sec:pkg-options){Package options} -The \pkg'{catoptions} has only two options, namely, \ffx'{verbose, usepox}. The option \fxim{verbose} instructs the package to put information onto the log file when existing commands are being redefined by means of the command \fx{\robust@redef} (which has the same syntax with \tex's legacy \hx{\def}). This option may be used in the future to provide debugging features for the package. +The \pkg'{catoptions} has the options shown in \cref{tab:pkgoptions}. The boolean option \fxim{verbose} instructs the package to put information onto the log file when existing commands are being redefined by means of, say, the command \fx{\robust@redef} (which has the same syntax with \tex's legacy \hx{\def}). This option may be used in the future to provide debugging features for the package. + + +\extrarowheight=2pt +\arrayrulecolor{yellow} +\begin{tabularx}{\linewidth}{|m{3cm}|m{2.5cm}|X|} +\caption{Package options\xwmlabel{tab:pkgoptions}}\\\hline +\rowcolor{pink} +\bfseries Option&\bfseries Default&\bfseries Meaning\\\hline +\endfirsthead +\hline +\multicolumn{3}{|l|}{\emph{Continued from last page}}\\\hline +\bfseries Option&\bfseries Default&\bfseries Meaning\\\hline +\endhead +\multicolumn{3}{|r|}{\emph{Continued on next page}}\\\hline +\endfoot +\hline +\endlastfoot +\fx{verbose} & \hx{false} & The global boolean switch that determines if information should be logged for some tasks in the package.\\\hline +\fx{usepox} & \hx{true} & The boolean switch that determines if the options parser of \pkgnoidx{catoptions} should be used for all options processing of packages loaded after \hx{\documentclass} even if those packages are based on \cptuse{latex2e}'s native options processing scheme.\\\hline +\end{tabularx} If the \pkg'{catoptions} is loaded before \hx{documentclass}, it will invariably use the options processing mechanism of the package (namely, the more robust commands \ffx'{\XDeclareOption, \XExecuteOptions, \XProcessOptions} in place of \latex's native commands \hhx'{\DeclareOption, \ExecuteOptions, \ProcessOptions})\footnote{The user interfaces of \ffx'{\XDeclareOption, \XExecuteOptions, \XProcessOptions} are similar to those of \hhx'{\DeclareOption, \ExecuteOptions, \ProcessOptions} but they aren't the same. See \cref{sec:options-parse}.}. In that case, the legacy commands \hhx'{\DeclareOption, \ExecuteOptions, \ProcessOptions} are aliased to \ffx'{\XDeclareOption, \XExecuteOptions, \XProcessOptions}, respectively. The latter set of commands do immediately recognize that they have to deal with option functions that are based on the kernel's semantics. This allows expandable options and option values to be passed via \hx{\documentclass}---if \pkg{catoptions} is loaded before \hx{\documentclass}. This also implies that existing packages can use the options parsing scheme of \pkg'{catoptions} without modifying the packages. -The option \fxim{usepox} directs the package to use the \pkg{catoptions}'s options processing scheme for all the packages loaded after \hx{\documentclass}, instead of \latex's native options parsing procedures. This allows \pkg{catoptions}'s options parsing scheme to be used for existing packages loaded after \hx{\documentclass}. +The option \fxim{usepox} directs the package to use the \pkg{catoptions}'s options processing scheme for all the packages loaded after \hx{\documentclass}, instead of \latex's native options parsing procedures. This allows \pkg{catoptions}'s options parsing scheme to be used for existing packages loaded after \hx{\documentclass} without modifying the packages. -Assuming that the options \qoutedtt{textstyle} and \qoutedtt{name} belong to an existing package (say, \qoutedtt{mypackage}) to be loaded later, then the following example demonstrates one feature of the \pkg'{catoptions}: +Assuming that the options \quotedtt{textstyle} and \quotedtt{name} belong to an existing package (say, \quotedtt{mypackage}) to be loaded later, then the following example demonstrates one feature of the \pkg'{catoptions}: \start{example}[] \RequirePackage[verbose, usepox]{catoptions} @@ -67,7 +87,7 @@ Assuming that the options \qoutedtt{textstyle} and \qoutedtt{name} belong to an There are the following user commands for saving and returning category codes of \quoted{other} characters to their previous states: -\start{newmacro}[] +\start+{newmacro}[] \cptnormalcatcodes \cptpushcatcodes \cptpopcatcodes @@ -77,7 +97,6 @@ There are the following user commands for saving and returning category codes of \finish{newmacro} \fxim*{\UseNormalCatcodes,\cptpushcatcodes,\cptpopcatcodes, \cptnormalcatcodes,\cptfutureletsetup,\GetCurrentCatcodeSubset} -\fxim*{\cptfutureletsetup} The command \fx{\cptnormalcatcodes} simply resets the category codes of all \otherchars together with those of the space character and \fx{\^^I} and \fx{\^^J} to their standard values. The command \fx{\cptpushcatcodes} pushes the current category codes for restitution later with \fx{\cptpopcatcodes}. The command \fx{\UseNormalCatcodes} works only in packages and does more than one thing: it calls \ffx'{\cptpushcatcodes, \cptnormalcatcodes,\cptfutureletsetup} in that order. At the end of the package, it automatically issues \fx{\cptpopcatcodes} to recover all the category codes earlier pushed. The command \fx{\UseNormalCatcodes} can conveniently be issued at the start of the package and the developer can be assured of access to the standard category codes of all \otherchars together with those of the space character and \fx{\^^I} and \fx{\^^J}. It should be called only once in a package: subsequent calls will have no effect. @@ -101,7 +120,7 @@ to see the current catcode setup. The command \fx{\cptfutureletsetup} is describ \docsection(sec:future-letting){Future-letting of \headq{other} characters} -The command \fx{\cptfutureletsetup} defines canonical control sequences to represent all the visible ASCII characters (ranging from space to \fx{~} and 32--126 characters): +The command \fx{\cptfutureletsetup} defines canonical control sequences to represent the following characters: \start'{example}[Futurelet characters] space|R(|textvisiblespace) exclam|R(!) dblquote|R(") hash|R(#) dollar|R($) ampersand|R(|ampersand) @@ -112,23 +131,49 @@ bslash|R(\) \finish{example} %\fxim*{\cptfutureletsetup} -The defined commands have the syntaxes +However, for efficiency reasons, the canonical control sequences will be defined for only the characters (or their names) appearing in the user-supplied list \fx{\declarefutureletset}, whose syntax is + +\start{newmacro}[\declarefutureletset] +\declarefutureletset[|nang(stub)]{|nang(set)} +\finish{newmacro} + +Here, \ang{set} is a comma-separated list of names from the \quoted{other} characters listed above. The defined commands are prefixed with an optional \ang{stub}, whose default value is \fx{fl@}. The defined commands have the syntaxes \start'{newmacro}[Futurelet characters] \|nang(stub)|nang(char) \if|nang(stub)|nang(char) \finish{newmacro} -They are prefixed with \ang{stub} which can be set with the command +For efficiency gains, a call to \fx{\cptfutureletsetup} automatically undefines all the canonical control sequences previously defined with a call to \fx{\cptfutureletsetup}---before the new canonical control sequences are defined. -\start{newmacro}[\declarefutureletprefix] -\declarefutureletprefix{|nang(stub)} -\finish{newmacro} -\fxim*{\declarefutureletprefix} +For instance, with the choices -For instance, with the choice \fx{\declarefutureletprefix{fl@}}, we have the following commands on hand for testing after \fx{\futurelet}. If any of the commands emanating from \ang{stub}, concatenated with the name of the character, is already defined, an error message is flagged. It should be noted that these commands are available only after issuing the command \fx{\cptfutureletsetup}, which is called automatically at \hx{\AtBeginDocument}. At \hx{\AtBeginDocument} the \pkg'{catoptions} calls \fx{\cptrestorecatcodes}, followed by \fx{\cptfutureletsetup}. +\start{example}[\declarefutureletset] +\declarefutureletset[fl@]{space, star, lbracket} +\cptfutureletsetup +\finish{example} + +we have the following commands on hand for testing after \fx{\futurelet}: \start+{newmacro}[Futurelet commands] +\fl@space \fl@star \fl@lbracket +\iffl@space \iffl@star \iffl@lbracket +\finish{newmacro} +\fxim*{Futurelet commands} + +If any of the commands emanating from concatenating \ang{stub} with the name of the character is already defined, an error message is flagged. It should be noted that these commands are available only after issuing the command \fx{\cptfutureletsetup}, which isn't called automatically anywhere by the \pkg'{catoptions}. Normally, at \hx{\AtBeginDocument} the \pkg'{catoptions} calls the command \fx{\cptrestorecatcodes}, without calling \fx{\cptfutureletsetup}. Calling \ffx'{\declarefutureletset, \cptfutureletsetup} is the user's duty. + +The commands \ffx'{\declarefutureletset, \cptfutureletsetup} are decoupled to allow the user to call \fx{\declarefutureletset} only once, and perhaps much earlier, before calling the command \fx{\cptfutureletsetup} as often as desired. + +An inefficient call of the form + +\start{example}[\declarefutureletset] +\declarefutureletset[fl@]{|R(all)} +\finish{example} + +where \quotedtt{all} means that control sequences should be defined for all the available \quoted{other} characters, will define all the following control sequences whenever \fx{\cptfutureletsetup} is called: + +\start+{example}[Futurelet commands] \fl@space \fl@exclam \fl@dblquote \fl@hash \fl@dollar \fl@ampersand \fl@lrquote \fl@lparen \fl@rparen \fl@star \fl@plus \fl@comma @@ -137,11 +182,7 @@ For instance, with the choice \fx{\declarefutureletprefix{fl@}}, we have the fol \fl@question \fl@lbracket \fl@rbracket \fl@hat \fl@underscore \fl@lquote \fl@lbrace \fl@vert \fl@rbrace \fl@tilde \fl@bslash -\finish{newmacro} - -The \pkg'{catoptions} has already defined these test macros. To further aid testing, the following commands are defined by the \pkg'{catoptions}: -\start+{newmacro}[Futurelet commands] \iffl@space \iffl@exclam \iffl@dblquote \iffl@hash \iffl@dollar \iffl@ampersand \iffl@lrquote \iffl@lparen \iffl@rparen \iffl@star \iffl@plus \iffl@comma @@ -150,10 +191,12 @@ The \pkg'{catoptions} has already defined these test macros. To further aid test \iffl@question \iffl@lbracket \iffl@rbracket \iffl@hat \iffl@underscore \iffl@lquote \iffl@lbrace \iffl@vert \iffl@rbrace \iffl@tilde \iffl@bslash -\finish{newmacro} +\finish{example} \fxim*{Futurelet commands} -The use syntaxes for these commands are as follows: +This will yield control sequences that may never be needed. While such a facility does exist, using it will be inefficient despite the large capacities of many modern text engines. + +The use syntaxes for the commands \xfnn\bs{{stub}{char}} and \xfnn\bs{{if}{stub}{char}} are as follows: \start{example}[Futurelet characters] \futurelet\next\cmd |textbf(|R(*)) @@ -251,6 +294,14 @@ The following example produces a warning when the user supplies an option that w `\CurrentOption' ignored}} \finish{example} +\start{newmacro}[\XDeclareOptions] +\XDeclareOptions<|nang(fam)>{|nang(options)}[|nang(default)]{|nang(fn)} +\finish{newmacro} +\fxim*{\XDeclareOptions} + +The command \fx{\XDeclareOptions} is similar to \fx{\XDeclareOption} but, instead of declaring just one option, it declares all the options in the comma-separated list \ang{options}. Each option in the list \ang{options} is defined with the same family \ang{fam}, default value \ang{default}, and function \ang{fn}. The command \fx{\XDeclareOptions} can be used to save tokens when it is required to declare a set of options with identical attributes. + + \start{newmacro}[\XDeclareCommandOption] \XDeclareCommandOption<|nang(fam)>{|nang(option)}[|nang(default)]|(pref|){|nang(fn)} \finish{newmacro} @@ -258,6 +309,13 @@ The following example produces a warning when the user supplies an option that w The command \fx{\XDeclareCommandOption} will, apart from declaring the option \ang{option}, also create a macro \fnn{{pref}{option}} to hold the user-supplied value of the option. The macro so created can be used in \ang{fn} or in any other place. The default value of the optional \ang{pref} is \quoted{\fx{\@currname @}} prefixed with the letters \fx{cmd}. +\start{newmacro}[\XDeclareCommandOptions] +\XDeclareCommandOptions<|nang(fam)>{|nang(options)}[|nang(default)]|(pref|){|nang(fn)} +\finish{newmacro} +\fxim*{\XDeclareCommandOptions} + +The command \fx{\XDeclareCommandOptions} is similar to \fx{\XDeclareCommandOption} but, instead of declaring just one option, it declares all the options in the comma-separated list \ang{options}. Each option in the list \ang{options} is defined with the same family \ang{fam}, default value \ang{default}, and function \ang{fn}. + \start{newmacro}[\XDeclareBooleanOption] \XDeclareBooleanOption<|nang(fam)>{|nang(option)}[|nang(default)]|(pref|){|nang(fn)} @@ -266,6 +324,21 @@ The command \fx{\XDeclareCommandOption} will, apart from declaring the option \a The command \fx{\XDeclareBooleanOption} will, apart from declaring the option \ang{option}, also create a boolean \fnn{{if}{pref}{option}}. It will automatically toggle this boolean (to \hx{true} or \hx{false}) when the option is set and the input is valid, depending on the user-supplied value of the option. The macros so created can be used in \ang{fn} or in any other place. The default value of the optional \ang{pref} is \quoted{\fx{\@currname @}} with no additional prefix. Only \hx{true} or \hx{false} may be submitted as the value of a boolean option. +\start{newmacro}[\XDeclareBooleanOptions] +\XDeclareBooleanOptions<|nang(fam)>{|nang(options)}[|nang(default)]|(pref|){|nang(fn)} +\finish{newmacro} +\fxim*{\XDeclareBooleanOptions} + +The command \fx{\XDeclareBooleanOptions} is similar to \fx{\XDeclareBooleanOption} but, instead of declaring just one option, it declares all the options in the comma-separated list \ang{options}. Again, each option in the list \ang{options} is defined with the same family \ang{fam}, default value \ang{default}, and function \ang{fn}. + + +\start{newmacro}[\XDeclareBiBooleanOptions] +\XDeclareBiBooleanOptions<|nang(fam)>{|nang(opt1),|nang(opt2)}[|nang(default)]|(pref|){|nang(fn1)}{|nang(fn2)} +\finish{newmacro} +\fxim*{\XDeclareBiBooleanOptions} + +The command \fx{\XDeclareBiBooleanOptions} declares the two options \ang{opt1} and \ang{opt2} in the comma-separated list of options. Again, each of the two declared options is defined with the same family \ang{fam} and default value \ang{default}, but separate functions \ang{fn1} and \ang{fn2}. A distinguishing characteristic of bi-boolean options is that when one option is \hx{true}, the partner option is automatically turned \hx{false}, and vice versa. + \start{newmacro}[\XExecuteOptions] \XExecuteOptions<|nang(fam)>{|nang(options)} @@ -287,7 +360,7 @@ This initializes \hx{\leftmargin} to 0pt. \finish{newmacro} \fxim*{\XProcessOptions} -The re-entrant \fx{\XProcessOptions} macro processes the options and values passed by the user to the class or package. The optional argument \ang{fam} can be used to specify the families that have been used to define the options. The optional argument \ang{na} can be used to specify options that should be ignored. When used in a class file, this macro will ignore unknown options. This allows the user to use global options in the \hx{\documentclass} command which could be claimed by packages loaded later. +The re-entrant \fx{\XProcessOptions} macro processes the options and values passed by the user to the class or package. The optional argument \ang{fam} can be used to specify the families that have been used to define the options. The optional argument \ang{na} can be used to specify options that should be ignored, \ie, not processed. When used in a class file, this macro will ignore unknown options. This allows the user to use global options in the \hx{\documentclass} command which could be claimed by packages loaded later. The \stform of \fx{\XProcessOptions} works like the \unstform except that the former also copies user input from the \hx{\documentclass} command and processes the options in the order specified by the \hx{\documentclass}. When the user specifies an option in the \hx{\documentclass} which also exists in the local family (or families) of the package calling \fx{\XProcessOptions}\RedStar, the local option will be set as well. In this case, \fx{#1} in \fx{\XDeclareOption} macro will contain the user-value entered in the \hx{\documentclass} (or \fx{\usepackage} or \fx{\RequirePackage}) command for this option. First the global options from \hx{\documentclass} will set local options and afterwards the local options (specified via \hhx'{\usepackage, \RequirePackage, \LoadClass} or similar commands) will set local options, which could overwrite the global options set earlier, depending on how the options sections are organized. The macro \fx{\XProcessOptions}\RedStar reduces to \fx{\XProcessOptions} only when issued from the class which forms the document class for the file at hand (to avoid setting the same options twice), but not for classes loaded later using, for instance, \hx{\LoadClass}. Global options that do not exist in the local families of the package or class calling \fx{\XProcessOptions}\RedStar will be simply ignored or highlighted. @@ -302,13 +375,18 @@ The implementation here differs significantly from the \latex kernel's scheme of |com(to avoid option clash with another loading of the package in the document.) |makepurple(% \RequirePackage{catoptions}) \UseNormalCatcodes -\newvariables{if}{bool}{a,b} -\XDeclareOption{boola}[true]{\cptuse{boola#1}} +\newif\ifboola +\XDeclareOption{boola}[true]{% + \@nameuse{boola#1}% + \ifboola\let\eat\@gobble\fi +} +|com(No need for \newif when declaring boolean options:) \XDeclareBooleanOption{boolb}[true]|(test@|){% \iftest@boolb \AtEndOfPackage{\gdef\tex{\TeX\xspace}}% \fi } +\XDeclareBiBooleanOptions{draft,final}[true](test@){}{} \XDeclareCommandOption{color}[blue]|(test@|){% \def\text{\textcolor{\test@color}{Result of test}}% } @@ -337,11 +415,19 @@ The implementation here differs significantly from the \latex kernel's scheme of \endinput |com(This is a sample document:) -\RequirePackage[usepox,align=right,boola=false,boolb]{catoptions} -\documentclass[name={Mr J\"avier Claudioos},a4paper,draft,10pt]{testclass} -|com(You can use \usepackage{catoptions} as below, but then the) -|com(\documentclass option `name={Mr J\"avier Claudioos}' can't be processed:) -|makepurple(% \usepackage[usepox,align=right,boola=false,boolb]{catoptions}) +\RequirePackage[usepox]{catoptions} +\documentclass[ + align = right, + boola = false, + boolb = true, + name = {Mr J\"avier Claudioos}, + a4paper, + draft, + 10pt +]{testclass} +|com(You can call \usepackage{catoptions}, instead of) +|com(\RequirePackage{catoptions}, after \documentclass, but then the) +|com(\documentclass option `name={Mr J\"avier Claudioos}' can't be processed.) \usepackage{cleveref} \begin{document} @@ -349,9 +435,10 @@ The implementation here differs significantly from the \latex kernel's scheme of \end{document} \finish{example} + \docsection(sec:normalize){Normalizing csv and kv lists} -Any arbitrary comma-separated-values (csv) list can be normalized by using \fx{\csv@@normalize} before processing the list. +Any arbitrary parser-separated-values list can be normalized by means of package the command \fx{\csv@@normalize} before processing the list. \start{newmacro}[\csv@@normalize] \csv@@normalize[|nang(parser)]{|nang(list)} @@ -377,7 +464,7 @@ Here, \ang{list}, which is populated by parser-separated elements, is not expand \finish{newmacro} \fxim*{\kv@@normalize} -The command \fx{\kv@@normalize} normalizes a list of key-values, returning the result in the macro \fx{\normalized@kvlist} (in the \unstform case) or \ang{listcmd} (in the \stform case). Besides dealing with multiple commas and the spaces between entries, in this case the spaces between keys and the equality sign are removed and multiple equality signs are made only one. Moreover, the category codes of the arbitrary parser and the equality sign is made normal/other throughout the list. The command \fx{\kv@@normalize} is meant for options or key-value parsing; it is used in the options processing scheme of \pkg'{catoptions}. +The command \fx{\kv@@normalize} normalizes a list of key-value pairs, returning the result in the macro \fx{\normalized@kvlist} (in the \unstform case) or \ang{listcmd} (in the \stform case). Besides dealing with multiple commas and the spaces between entries, in this case the spaces between keys and the equality sign are removed and multiple equality signs are made only one. Moreover, the category codes of the arbitrary parser and the equality sign is made normal/other throughout the list. The command \fx{\kv@@normalize} is meant for options or key-value parsing; it is used in the options processing scheme of \pkg'{catoptions}. \start{example}[\csv@@normalize] \begingroup @@ -444,8 +531,8 @@ The following is a pseudocode that depicts the use of \fx{\kv@@parse}: \def\kv@do#1{% \def\CurrentOption{#1}% if \CurrentOption is not empty then - split \CurrentOption into option and value - search if option exists in \@declaredoptions + split \CurrentOption into option and value; + search if option exists in \@declaredoptions; if option is found then Execute the option's function else @@ -462,7 +549,18 @@ fi \docsection(sec:version-hist){Version history} +The following change history highlights significant changes that affect user utilities and interfaces; mutations of technical nature are not documented in this section. The numbers on the right-hand side of the following lists are section numbers; the \stsign means the subject features in the package but is not reflected anywhere in this user guide. + \begin{versionhist} + \begin{version}{0.2}{2011/02/15} + \item For efficiency reasons, canonical control sequences for futurelet characters are no longer defined automatically. The user is now responsible for specifying the canonical control sequences that should be defined.\secref{sec:future-letting} + \item The following plural-form commands have been introduced \secref{sec:options-parse} + \start{veritem} + \XDeclareOptions \XDeclareCommandOptions \XDeclareBooleanOptions + \XDeclareBiBooleanOptions + \finish{veritem} + + \end{version} \begin{version}{0.1}{2011/01/25} \item First public release. \end{version} diff --git a/Master/texmf-dist/tex/latex/catoptions/catoptions-guide.cfg b/Master/texmf-dist/tex/latex/catoptions/catoptions-guide.cfg index dddd4003035..1cc3526577b 100644 --- a/Master/texmf-dist/tex/latex/catoptions/catoptions-guide.cfg +++ b/Master/texmf-dist/tex/latex/catoptions/catoptions-guide.cfg @@ -1,18 +1,24 @@ \ProvidesFile{catoptions-guide.cfg}% - [2011/02/06 v0.1 Definitions file for catoptions-guide.tex (AM)] + [2011/02/21 v0.2 Definitions file for catoptions-guide.tex (AM)] + +\usepackage[printwatermark]{xwatermark} +\usepackage{array} +\usepackage{colortbl} +\usepackage{ltablex} +\keepXColumns -\usepackage{xwatermark} \fancypagenos[% - nopageone = true, - showpageno = true, + showonpageone = false, + showpagenos = true, + showheadrule = true, showfootrule = false, ycoord = -.45\paperheight, - xcoord = .4\paperwidth, - scale = 1, - angle = 45, + xcoord = 0, + scale = 1.5, + angle = 0, lhead = {The \textcolor{maccolor}{catoptions} package}, style = {Page~\thepage~of~\pageref{xwmlastpage}}, - rhead = \tcl{black}{\today}, + rhead = \tcl{black}{\today} ] \amltxoptions{% @@ -36,7 +42,7 @@ \AfterStartOfDocument{\MakeQuoteCommand*_} \def\otherchars{\quoted{other} characters\sspace} -\newletcs*\sectionbreak\medbreak +\ltsnewletcs*\sectionbreak\medbreak \newletcs\mccolor\makemaccolor \newletcs\pucolor\makepurple \AtBeginDocument{\redef*\thefootnote{\fnsymbol{footnote}}} @@ -45,7 +51,7 @@ \newwatermark [page=1,fontfamily=phv,fontsize=11pt,fontseries=m,align=center, coordunit=pc,width=\hsize,angle=0,scale=1.8,xcoord=0,ycoord=32.5] -{\fadingtext[textcolor=blue,boxcolor=red, + {\fadingtext[textcolor=blue,boxcolor=red, scale=1.8,letterwidth=7.8mm,height=1.5ex]{catoptions}\\[1ex] \tcl{blue}{\resizebox{.5\width}{!}{Setting up {\tt\string\futurelet} characters, restoring catcodes, @@ -55,8 +61,7 @@ %\dummywatermark \newwatermark [page=1,fontfamily=phv,fontsize=10pt,fontseries=m,color=black,align=center, -coordunit=pc,width=\hsize,angle=0,scale=1,xcoord=0,ycoord=24] -{% + coordunit=pc,width=\hsize,angle=0,scale=1,xcoord=0,ycoord=24]{% \Citation[author={Michael J. Downes, 1958--2003},textcolor=black,leftmargin=0em, fonttype=\small]{% The \pkgnoidx'{pcatcode} functionality would work best if it were built into the diff --git a/Master/texmf-dist/tex/latex/catoptions/catoptions.sty b/Master/texmf-dist/tex/latex/catoptions/catoptions.sty index 0ccb627de06..cbfc83ab3ca 100644 --- a/Master/texmf-dist/tex/latex/catoptions/catoptions.sty +++ b/Master/texmf-dist/tex/latex/catoptions/catoptions.sty @@ -1,15 +1,15 @@ %+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++% -% This is 'catoptions' package (Version 0.1, August 2010) % +% 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 % -% macros unconnected with catcodes. In particular, it contains % +% 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. % +% 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. % @@ -28,7 +28,7 @@ \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\=\catcode61 \catcode61 12 \chardef\l=\catcode123 \catcode123=1 \chardef\r=\catcode125 \catcode125=2 \chardef\[=\catcode91 \catcode91=12 @@ -87,10 +87,9 @@ \chardef\cpt@xiipt=12 \chardef\active=13 \chardef\cpt@xciipt=92 -\ifx\@xp\expandafter\else\@ifdefinable\@xp{\let\@xp\expandafter}\fi \NeedsTeXFormat{LaTeX2e}[1995/12/01] \ProvidesPackage{catoptions} - [2011/01/01 v0.1 Preserving catcodes & parsing options (AM)] + [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 @@ -168,12 +167,29 @@ }% \expandafter\endgroup\x } -\def\cpt@fletmacros{} -\newcommand*\declarefutureletprefix[1]{% - \gdef\cpt@fletprefix{#1}% - \gdef\cpt@fletmacros{}% +\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 } -\declarefutureletprefix{fl@} \begingroup \cptrestorecatcodes \begingroup @@ -183,11 +199,16 @@ \begingroup \edef\cpt@tempa{\noexpandcsn{\cpt@fletprefix#1}}% \edef\cpt@tempb{\noexpandcsn{if\cpt@fletprefix#1}}% - \oifinsetTF\cpt@tempa\cpt@fletmacros{}{% - \edef\x{\g@right@addto@macro\noexpand\cpt@fletmacros - {\expandcsonce\cpt@tempa\expandcsonce\cpt@tempb}}% - \x + \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% @@ -224,45 +245,44 @@ } \gdef\cptfutureletsetup{% \gdef\cpt@activecharacters{}% + \gdef\cptfutureletmacros{}% \def\cpt@flet@b##1\@##2\@{% \ifx##1\end\else - \cpt@flet@a{##1}{##2}% + \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 - \begingroup - \edef\x{\noexpandcsn{\cpt@fletprefix##1}}% - \expandafter\ifdefTF\x{% - \oifinsetTF\x\cpt@fletmacros{}{% - \cpt@err{Invalid futurelet prefix '\expandcsonce - \cpt@fletprefix'.\MsgBrk You can use - \string\declarefutureletprefix\space to select - \MsgBrk another prefix}\@ehc - }% - }{}% - \endgroup - \undef@csn{\cpt@fletprefix##1}% - \undef@csn{if\cpt@fletprefix##1}% + \def\currentoption{##1}% + \simpleexpandarg\simplefifoloop{\cpt@fletprefixes}% \expandafter\cpt@fletundef \fi }% \def\cpt@fletdef##1\@##2\@{% - \ifx##1\end\else - \csn@xdef{if\cpt@fletprefix##1}####1{% - \noexpand\@nameuse{@\noexpand\ifx - \noexpandcsn{\cpt@fletprefix##1}% - ####1\unexpanded{\@empty first\else second\fi oftwo}}% + \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}% + }% + }% }% - \expandafter\cpt@fletdef - \fi + \cpt@fletdef + }% }% \expandafter\cpt@fletundef\cpt@futureletchars\end\@\@ \expandafter\cpt@fletdef\cpt@futureletchars\end\@\@ \expandafter\cpt@flet@b\cpt@futureletchars\end\@\@ } -\AtBeginDocument{\cptrestorecatcodes\cptfutureletsetup} +\AtBeginDocument{\cptrestorecatcodes} \gdef\futureletresetactives{% \def\do##1##2{\let##1= ##2}% \cpt@activecharacters @@ -272,32 +292,38 @@ \@ifdefinable\UseNormalCatcodes\relax \protected\def\UseNormalCatcodes{% - \ifcsemptyF\@currname{% + \ifcsnullTF\@currname{% + \cpt@warn{\noexpand\UseNormalCatcodes issued in + document: ignored}% + }{% \let\UseNormalCatcodes\relax \cptpushcatcodes \cptnormalcatcodes - \cptfutureletsetup \AfterEndOfStyleFile{% \cptpopcatcodes \let\UseNormalCatcodes\rc@UseNormalCatcodes }% }% } -\@ifdefinable\rc@UseNormalCatcodes\relax -\global\let\rc@UseNormalCatcodes\UseNormalCatcodes +\@ifdefinable\rc@UseNormalCatcodes{% + \global\let\rc@UseNormalCatcodes\UseNormalCatcodes +} \newcommand\cptswap[2]{#2#1} \newcommand\cptswapfirstbraced[2]{#2{#1}} \cptswap{ }{\let\@sptoken= } \def\@space{ } -\long\def\@nameuse#1{\csname#1\endcsname} +\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\@alloftwo[2]{#1#2} +\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{} @@ -305,64 +331,78 @@ \long\def\remove@to@dot#1.{} \long\def\catch@to@dot#1.{#1} \@ifdefinable\cpt@rnm{\let\cpt@rnm\romannumeral} -\def\cpt@rmnstop{0 } \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 - }% + \def\cptzapspaces##1{\cpt@rnm0\cpt@zapspaces.\@space##1#1\cpt@nil}% } \cptzapspaces{ } \def\cpt@zapspaces#1 #2\cpt@nil{% - \@nameuse{@\ifx\\#2\\first\else second\fi oftwo}% + \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} -\@ifdefinable\newvariables\relax -\protected\def\newvariables#1#2#3{% - \@testopt{\cpt@newvariables{#1}{#2}{#3}}{}% +\newcommand*\newvariables[1]{\@testopt{\cpt@newvariables{#1}}{}}% +\protected\def\cpt@newvariables#1[#2]#3{% + \@testopt{\cpt@newv@riables{#1}{#2}{#3}}{}% } -\protected\def\cpt@newvariables#1#2#3[#4]{% - \edef\cpt@tempb{\ifnum\pdfstrcmp{#1}{if}=\z@ if\fi}% +\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{% - \@nameuse{@\ifcsname\cpt@tempb#2\cpt@tempa\endcsname + \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 - \ifnum\pdfstrcmp{#1}{if}=\z@ - \ifx\\#4\\\def\cpt@tempc{false}\else\def\cpt@tempc{#4}\fi + \ifpdfstrcmpTF{#1}{if}{% + \cpt@rsvda{false}% \csname#2\cpt@tempa\cpt@tempc\endcsname - \else - \ifx\\#4\\\let\cpt@tempc\z@\else\def\cpt@tempc{#4}\fi - \csname#2\cpt@tempa\endcsname\cpt@tempc\relax - \fi + }{% + \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 + }% + }% + }% }% }% } -\newvariables{if}{cpt@}{st,pl,pm,verbose,usepox,optf,igopt, +\@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, - checklistparser,userobustdespace}\relax -\newvariables{count}{cpt@}{depth,grouplevel,grouptype}\relax +\newvariables{if}[@]{iscounter,breakloop,choicefd,useempty, + checklp,robdes}\relax +\newvariables{count}[cpt@]{depth,grouplevel,grouptype}\relax \@ifdefinable\cptbreakloop{\let\cptbreakloop\@breaklooptrue} -\@ifdefinable\UseEmptyEntry{% - \protected\def\UseEmptyEntry{\global\@useemptytrue}} -\@ifdefinable\DiscardEmptyEntry{% - \protected\def\DiscardEmptyEntry{\global\@useemptyfalse}} -\@ifdefinable\UseRobustDespace{% - \protected\def\UseRobustDespace{\global\@userobustdespacetrue}} -\@ifdefinable\UseNormalDespace{% - \protected\def\UseNormalDespace{\global\@userobustdespacefalse}} +\newcommand*\UseEmptyEntry{\global\@useemptytrue} +\newcommand*\DiscardEmptyEntry{\global\@useemptyfalse} +\newcommand*\UseRobustDespace{\global\@robdestrue} +\newcommand*\UseNormalDespace{\global\@robdesfalse} \newcommand*\MsgBrk{\MessageBreak} \newcommand*\cptgetcatcode[1]{% \number @@ -379,75 +419,77 @@ \ifcat\noexpand#1\noexpand~13\else -1\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi } -\newcommand\cptremovescape[1]{\expandafter\@gobble\string#1} +\newcommand\cptremovescape[1]{% + \ifx\cpt@unique#1\cpt@unique + \expandafter\@gobble\else\expandafter\@iden\fi + {\expandafter\@gobble\string#1}% +} \newcommand\cptgobblescape[1]{% - \ifnum\escapechar>\@cclv\else + \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% + \string#1}% } \newcommand\ifnullTF[1]{% - \@nameuse{@\ifnum\pdfstrcmp{}{\detokenize{#1}}% + \usecsn{@\ifnum\pdfstrcmp{}{\detokenize{#1}}% =\z@ first\else second\fi oftwo}% } \newcommand\ifnullFT[1]{\ifnullTF{#1}\@secondoftwo\@firstoftwo} -\newcommand\ifnullT[1]{\ifnullTF{#1}\@firstofone\@gobble} -\newcommand\ifnullF[1]{\ifnullTF{#1}\@gobble\@firstofone} -\@ifdefinable\ifstremptyTF{\let\ifstremptyTF\ifnullTF} -\@ifdefinable\ifstremptyFT{\let\ifstremptyFT\ifnullFT} -\@ifdefinable\ifstremptyT{\let\ifstremptyT\ifnullT} -\@ifdefinable\ifstremptyF{\let\ifstremptyF\ifnullF} +\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]{% - \@nameuse{@\ifnum\pdfstrcmp{}{\detokenize\expandafter + \usecsn{@\ifnum\pdfstrcmp{}{\detokenize\expandafter {\@gobble#1.}}=\z@ first\else second\fi oftwo}% } \newcommand\ifblankFT[1]{\ifblankTF{#1}\@secondoftwo\@firstoftwo} -\newcommand\ifblankT[1]{\ifblankTF{#1}\@firstofone\@gobble} -\newcommand\ifblankF[1]{\ifblankTF{#1}\@gobble\@firstofone} \newcommand\oifblankTF[1]{\expandafter\ifblankTF\expandafter{#1}} -\newcommand\xifblankTF[1]{\cptfullexpandarg\ifblankTF{#1}} +\newcommand\oifblankFT[1]{\expandafter\ifblankFT\expandafter{#1}} +\newcommand\xifblankTF[1]{\cptexpandarg\ifblankTF{#1}} +\newcommand\xifblankFT[1]{\cptexpandarg\ifblankFT{#1}} \newcommand*\ifdefTF[1]{% - \@nameuse{@\ifdefined#1\ifx#1\relax second\else first\fi + \usecsn{@\ifdefined#1\ifx#1\relax second\else first\fi \else second\fi oftwo}% } \newcommand*\ifdefFT[1]{\ifdefTF{#1}\@secondoftwo\@firstoftwo} -\newcommand*\ifdefT[1]{\ifdefTF{#1}\@firstofone\@gobble} -\newcommand*\ifdefF[1]{\ifdefTF{#1}\@gobble\@firstofone} +\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 - {\cptaftercs\ifdefTF{#1}}% + {\aftercsname\ifdefTF{#1}}% } \newcommand*\ifcsndefFT[1]{\ifcsndefTF{#1}\@secondoftwo\@firstoftwo} -\newcommand*\ifcsndefT[1]{\ifcsndefTF{#1}\@firstofone\@gobble} -\newcommand*\ifcsndefF[1]{\ifcsndefTF{#1}\@gobble\@firstofone} -\newcommand*\letnewcmd[2]{\ifcptdefinable{#1}{\let#1=#2}} +\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% - }% + \ifdefTF{#1}\@notdefinable{% + \ifcsndefTF{end\reserved@a}\@notdefinable{#2}% }% } \newcommand\cpt@def@[3]{% \ifcptdefinable#3{% - \ifstremptyTF{#2}{}\protected - \cptthreexp\l@ngrel@x\@nameuse{#1def}#3% + \ifnullTF{#2}{}\protected + \cptthreexp\l@ngrel@x\usecsn{#1def}#3% }% } \ifcptdefinable\robust@def\relax @@ -462,7 +504,7 @@ \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{% - \ifdefT#2{% + \ifdefFT#2{}{% \ifcpt@verbose \@latex@info{Command '\string#2' redefined}% \fi @@ -471,12 +513,12 @@ } \new@def*\ifcounterTF#1{% \ifstrcmpTF{\count}{#1}\@secondoftwo{% - \expandafter\cpt@ifcounter@a\meaning#1:&% + \expandafter\cpt@ifcounter@a\meaning#1:\cpt@unique }% } \edef\cpt@ifcounter@a#1#2{% - \def#1##1:##2&{#2##1\string\count&}% - \def#2##1\string\count##2&{\noexpand\ifblankTF{##1}}% + \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{% @@ -511,7 +553,7 @@ }% \fi }{% - \@nameuse{newcount}#1% + \usecsn{newcount}#1% }% \@iscounterfalse } @@ -535,14 +577,14 @@ }% \@iscounterfalse } -\new@def*\push@rnarg#1{\@xp\cptremovescape\push@arg @\cpt@rnm#1} +\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{\csn@let@cs{\push@rnarg{#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}% @@ -553,8 +595,8 @@ \cpt@err{Number '\string#2' is currently '0'}\@ehc \fi \def\push@do{% - \expandafter\cs@let@csn\push@arg{\push@rnarg{#2}}% - \undef@csn{\push@rnarg{#2}}% + \expandafter\letcstocsn\push@arg{\push@rnarg{#2}}% + \undefcsn{\push@rnarg{#2}}% }% \let\rc@escapechar\escapechar\escapechar\cpt@xciipt \pushingloop{#1}% @@ -565,12 +607,12 @@ \global\popnumber#2% }% } -\robust@def*\pushingloop#1{\cpt@pushingloop#1,\cpt@nil,&} -\robust@def*\cpt@pushingloop#1,#2&{% +\robust@def*\pushingloop#1{\cpt@pushingloop#1,\cpt@nil,} +\robust@def*\cpt@pushingloop#1,{% \edef\push@arg{\unexpanded{#1}}% - \ifxF\push@arg\cpt@nnil{% + \ifxTF\push@arg\cpt@nnil{}{% \normal@despacecontent\push@arg - \push@do\relax\cpt@pushingloop#2&% + \push@do\relax\cpt@pushingloop }% } \robust@def*\cpt@toodeep#1#2{% @@ -580,92 +622,85 @@ \@gobble } \robust@def*\oneDloop{% - \let\Dlooptype\@ne\cpt@ifstar\oneDloop@b\oneDloop@a + \@robdestrue\cpt@ifstar\oneDloop@b\oneDloop@a } \robust@def*\normaloneDloop{% - \let\Dlooptype\z@\cpt@ifstar\oneDloop@b\oneDloop@a + \@robdesfalse\cpt@ifstar\oneDloop@b\oneDloop@a } -\robust@def*\getDlooptype{% - \ifx\Dlooptype\cpt@undefined\let\Dlooptype\@ne\fi -} -\robust@def*\oneDloop@b#1{% - \getDlooptype - \expandafter\oneDloop@a\expandafter{#1}% -} -\robust@def*\oneDloop@a#1#2#3{% - \getDlooptype +\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,{#3}% + \cpt@Dloop@a#1,\cpt@nil,\cpt@unique#2{#3}% \popnumber\oneDloopdepth + \UseNormalDespace } \robust@def*\xDloop{% - \let\Dlooptype\@ne\cpt@ifstar\xDloop@b\xDloop@a + \@robdestrue\cpt@ifstar\xDloop@b\xDloop@a } \robust@def*\normalxDloop{% - \let\Dlooptype\z@\cpt@ifstar\xDloop@b\xDloop@a -} -\robust@def*\xDloop@b#1{% - \getDlooptype - \expandafter\xDloop@a\expandafter{#1}% + \@robdesfalse\cpt@ifstar\xDloop@b\xDloop@a } +\robust@def\xDloop@b#1{\expandafter\xDloop@a\expandafter{#1}} \robust@def\xDloop@a#1#2#3{% - \getDlooptype - \pushfunctions{#2,\if@useempty,\if@breakloop,\Dlooptype}\cpt@depth + \pushfunctions + {#2,\if@useempty,\if@breakloop,\if@robdes}\cpt@depth \@breakloopfalse - \cpt@Dloop@a#1,\cpt@nil,{#3}% - \popfunctions{#2,\if@useempty,\if@breakloop,\Dlooptype}\cpt@depth + \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{% +\robust@def*\cpt@Dloop@a{% \if@boolTF{@breakloop}{% - \defpass\gobble@remainder##1&##2##3{}% + \defpass\gobble@remainder##1\cpt@unique##2##3{}% }{% \cpt@Dloop@b.% }% } -\robust@def\cpt@Dloop@b#1,#2#4{% +\robust@def\cpt@Dloop@b#1,#2\cpt@unique#3#4{% \edef#3{\expandcsonce{\remove@to@dot#1}}% - \ifxF#3\cpt@nnil{% - \ifcsemptyTF#3{% + \ifxTF#3\cpt@nnil{}{% + \ifcsnullTF#3{% \if@useempty#4\relax\fi }{% - \@nameuse{\ifnum\Dlooptype=\z@ normal\else robust\fi + \usecsn{\if@robdes robust\else normal\fi @despacecontent}#3% #4\relax }% - \cpt@Dloop@a#2{#4}% + \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@userobustdespace}\cpt@depth + \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&####2####3{}% + \defpass\gobble@remainder####1\cpt@unique####2####3{}% }{% \cpt@foreach@b.% }% }% - \long\def\cpt@foreach@b##1#1##2&##3##4{% + \long\def\cpt@foreach@b##1#1##2\cpt@unique##3##4{% \edef##3{\expandcsonce{\remove@to@dot##1}}% - \ifxF##3\cpt@nnil{% - \ifcsemptyTF##3{% + \ifxTF##3\cpt@nnil{}{% + \ifcsnullTF##3{% \if@useempty##4\relax\fi }{% - \@nameuse{\if@userobustdespace robust\else normal\fi + \usecsn{\if@robdes robust\else normal\fi @despacecontent}##3% ##4\relax }% - \cpt@foreach@a##2&##3{##4}% + \cpt@foreach@a##2\cpt@unique##3{##4}% }% }% - \expandafter\cpt@foreach@a#3#1\cpt@nil#1{#4}% - \popfunctions{#3,\if@useempty,\if@breakloop, - \if@userobustdespace}\cpt@depth + \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} @@ -673,24 +708,27 @@ \declarefifoparser{#1}% \pushnumber\oneDfifodepth \ifnum\oneDfifodepth>\@ne\cpt@toodeep\oneDfifo1\fi + \let\on@currlevel\@secondoftwo \@breakloopfalse \begingroup \if@boolTF{cpt@st}% - {\let\cpt@tempa#2}{\edef\cpt@tempa{\unexpanded{#2}}}% + {\let\reserved@a#2}{\edef\reserved@a{\unexpanded{#2}}}% \expandafter\endgroup\expandafter\cpt@fifoloop@a - \cpt@tempa#1\cpt@nil#1% + \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\cpt@tempa#2}{\edef\cpt@tempa{\unexpanded{#2}}}% + {\let\reserved@a#2}{\edef\reserved@a{\unexpanded{#2}}}% \expandafter\endgroup\expandafter\cpt@fifoloop@a - \cpt@tempa#1\cpt@nil#1% + \reserved@a#1\cpt@nil#1% \popfunctions{\fifo@do,\if@breakloop,\if@useempty}\cpt@depth } \robust@def*\declarefifoparser#1{% @@ -703,34 +741,46 @@ }% \protected\def\cpt@fifoloop@b##1#1{% \edef\fifo@arg{\expandcsonce{\@gobble##1}}% - \ifxF\fifo@arg\cpt@nnil{% - \ifcsemptyTF\fifo@arg{% - \if@boolT{@useempty}{\fifo@do{}\relax}% + \ifxTF\fifo@arg\cpt@nnil{}{% + \ifcsnullTF\fifo@arg{% + \if@boolTF{@useempty}{\on@currlevel{}\fifo@do{}\relax}{}% }{% - \expandafter\fifo@do\expandafter{\fifo@arg}\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\cpt@tempa#1}{\edef\cpt@tempa{\unexpanded{#1}}}% - \expandafter\endgroup\expandafter\cpt@sisoloop\cpt@tempa\sisorepeat + {\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\cpt@tempa#1\else\edef\cpt@tempa{\unexpanded{#1}}\fi - \expandafter\endgroup\expandafter\cpt@sisoloop\cpt@tempa\sisorepeat + \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{% @@ -738,23 +788,30 @@ \defpass\gobble@remainder##1\sisorepeat{}% }{% \begingroup - \let\@bgroup\bgroup + \let\temp@bgroup\bgroup \let\bgroup\cpt@undefined \futurelet\next\cpt@sisol@op }% } \robust@def\cpt@sisol@op#1{% \expandafter\endgroup - \ifx\next\@bgroup\def\siso@arg{{#1}}\else\def\siso@arg{#1}\fi + \ifx\next\temp@bgroup\def\siso@arg{{#1}}\else\def\siso@arg{#1}\fi \ifblankTF{#1}{% - \if@useempty\siso@do{}\relax\fi + \if@useempty\on@currlevel{}\siso@do{}\relax\fi }{% \ifx#1\sisorepeat\sisorepeat\fi - \expandafter\siso@do\expandafter{\siso@arg}\relax + \cptexpandargonce{\on@currlevel{}\siso@do}\siso@arg\relax }% \cpt@sisoloop } -\robust@def\sisorepeat#1\cpt@sisoloop{\fi}% +\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 @@ -764,8 +821,8 @@ \cpt@teststoptb\csv@kv@parse } \newcommand\csv@kv@parse[2][,]{% - \cs@let@csn\csv@kv@do{\ifnum\csv@kv@nr=\z@ csv\else kv\fi @do}% - \ifdefF\csv@kv@do{% + \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{% @@ -777,10 +834,11 @@ }% \long\def\csv@tempb##1#1{% \edef\csv@tempc{\expandcsonce{\remove@to@dot##1}}% - \ifxF\csv@tempc\cpt@nnil{% - \ifcsemptyTF\csv@tempc{% - \if@boolT{@useempty}{\csv@kv@do{}}\relax + \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 @@ -788,12 +846,14 @@ }% \if@boolTF{cpt@st}% {\let\csv@tempc#2}{\edef\csv@tempc{\unexpanded{#2}}}% - \ifcsemptyF\csv@tempc{% - \@nameuse{\ifnum\csv@kv@nr=\@ne kv\else csv\fi @@normalize}% - *[#1]\csv@tempc + \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 } @@ -806,79 +866,131 @@ }{% \cpt@err{'\string\curr@level' undefined}\@ehc }% - \@fullxpsec + \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*\cptemptify#1{\let#1\@empty} -\new@def*\ifcsemptyTF#1{% - \@nameuse{@\ifx#1\@empty first\else second\fi oftwo}% +\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*\cptemptifycsset#1{% +\robust@def*\cptonlypreamble#1{% + \begingroup + \def\cpt@resa{}% \normaloneDloop{#1}\cpt@tempa{% - \expandafter\def\cpt@tempa{}% - }% -} -\new@def*\ifcsemptyFT#1{\ifcsemptyTF{#1}\@secondoftwo\@firstoftwo} -\new@def*\ifcsemptyT#1{\ifcsemptyTF{#1}\@firstofone\@gobble} -\new@def*\ifcsemptyF#1{\ifcsemptyTF{#1}\@gobble\@firstofone} -\new@def*\oifcsemptyTF#1{\expandafter\ifcsemptyTF#1} -\new@def*\oifcsemptyFT#1{\expandafter\ifcsemptyFT#1} -\new@def*\oifcsemptyT#1{\expandafter\ifcsemptyT#1} -\new@def*\oifcsemptyF#1{\expandafter\ifcsemptyF#1} -\new@def*\ifcsnemptyTF#1{% - \ifcsndefTF{#1}{% - \expandafter\ifx\csname#1\endcsname\@empty - \expandafter\@firstoftwo - \else - \expandafter\@secondoftwo - \fi - }{% + \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*\ifcsnemptyFT#1{\ifcsnemptyTF{#1}\@secondoftwo\@firstoftwo} -\new@def*\ifcsnemptyT#1{\ifcsnemptyTF{#1}\@firstofone\@gobble} -\new@def*\ifcsnemptyF#1{\ifcsnemptyTF{#1}\@gobble\@firstofone} +\new@def*\ifcsnnullFT#1{\ifcsnnullTF{#1}\@secondoftwo\@firstoftwo} \new@def*\ifdefnotnullTF#1{% - \ifdefTF{#1}{\ifcsemptyTF{#1}{\@secondoftwo}% - {\@firstoftwo}}{\@secondoftwo}% + \ifdefTF{#1}{\ifcsnullTF{#1}\@secondoftwo\@firstoftwo}\@secondoftwo } \new@def*\ifdefnotnullFT#1{\ifdefnotnullTF{#1}\@secondoftwo\@firstoftwo} -\new@def*\ifdefnotnullT#1{\ifdefnotnullTF{#1}\@firstofone\@gobble} -\new@def*\ifdefnotnullF#1{\ifdefnotnullTF{#1}\@gobble\@firstofone} +\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\@nameuse{#1}} +\new@def*\expandcsnonce#1{\cptthreexp\expandcsonce\usecsn{#1}} \new@def*\noexpandcsn#1{\expandcsonce{\csname#1\endcsname}} -\new@def*\cptxpdetok#1{\detokenize\expandafter{#1}} +\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*\cptfullexpandsecond#1#2{\cptpassexpanded{\unexpanded{#1}#2}} -\robust@def*\cptexpandsecondonce#1#2{% - \cptpassexpanded{\unexpanded{#1}\expandcsonce{#2}}} -\robust@def*\cptfullexpandarg#1#2{\cptpassexpanded{\unexpanded{#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*\protected@xptwoargs#1#2#3{% - \begingroup - \protected@edef\x{\endgroup\unexpanded{#1}{#2}{#3}}\x +\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}}}% + \cptpassexpanded + {\unexpanded{#1}{\expandcsonce{#2}}{\expandcsonce{#3}}}% } -\letnewcmd\@xpargox\cptexpandargonce -\letnewcmd\@fullxparg\cptfullexpandarg -\letnewcmd\@xpsecox\cptexpandsecondonce -\letnewcmd\@fullxpsec\cptfullexpandsecond -\letnewcmd\@xptwoargox\cptexpandtwoargsonce \robust@def*\StyleFileRCSInfo$#1 #2 #3 #4 #5 #6 #7 #8 ${% \def\cpt@filedate{#4}% \def\cpt@fileversion{v#3}% @@ -896,10 +1008,10 @@ } \robust@def*\SetStyleFileMessages{% \begingroup - \catcode`\ =9\catcode`\^^I=9% - \edef\cpt@tempa{\@xp\@carcube\@currname\@nil @}% - \def\cpt@tempb{\@testopt{\@xp\endgroup\cpt@SetStyleFileMessages}}% - \@xp\cpt@tempb\@xp{\cpt@tempa}% + \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 @@ -953,41 +1065,54 @@ }% } \new@def*\ifboolFT#1{\ifboolTF{#1}\@secondoftwo\@firstoftwo} -\new@def*\ifboolT#1{\ifboolTF{#1}\@firstofone\@gobble} -\new@def*\ifboolF#1{\ifboolTF{#1}\@gobble\@firstofone} \new@def*\ifbooleanTF#1#{\ifboolTF{#1}} \new@def*\if@boolTF#1{% - \@nameuse{if#1}\expandafter\@firstoftwo\else + \usecsn{if#1}\expandafter\@firstoftwo\else \expandafter\@secondoftwo\fi } \new@def*\if@boolFT#1{\if@boolTF{#1}\@secondoftwo\@firstoftwo} -\new@def*\if@boolT#1{\if@boolTF{#1}\@firstofone\@gobble} -\new@def*\if@boolF#1{\if@boolTF{#1}\@gobble\@firstofone} \new@def*\ifnumTF#1#{% - \@nameuse{@\ifnum#1first\else second\fi oftwo}% + \usecsn{@\ifnum#1first\else second\fi oftwo}% } -\new@def*\ifnumT#1#{\ifnumTF#1{\@firstofone}\@gobble} -\new@def*\ifnumF#1#{\ifnumTF#1{\@gobble}\@firstofone} -\new@def*\ifnumFT#1#{\@nameuse{@\ifnumTF#1{second}{first}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{\@xp\@car\string{\@nil\iffalse}\fi} -\long\def\cptstrcmp#1#2{% - \ifnum\pdfstrcmp{#1}{#2}=\z@\@xp\@firstoftwo\else - \@xp\@secondoftwo\fi +\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} -\new@def\ifstrcmpT#1#2{\ifstrcmpTF{#1}{#2}\@firstofone\@gobble} -\new@def\ifstrcmpF#1#2{\ifstrcmpTF{#1}{#2}\@gobble\@firstofone} +\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\@xp{\@gobble#1.}}{}\@secondoftwo{% - \cptstrcmp{\detokenize\@xp{\@gobble#1}}{}{% - \cptstrcmp{\@xp\cpt@car\detokenize{#1}\car@nil}{\@leftbracechar}% + \cptstrcmp{\detokenize\expandafter{\@gobble#1.}}{}\@secondoftwo{% + \cptstrcmp{\detokenize\expandafter{\@gobble#1}}{}{% + \cptstrcmp{\expandafter\cpt@car\detokenize{#1}\car@nil}{\@leftbracechar}% \@firstoftwo\@secondoftwo }{% \@secondoftwo @@ -995,35 +1120,31 @@ }% } \newcommand\ifbracedFT[1]{\ifbracedTF{#1}\@secondoftwo\@firstoftwo} -\newcommand\ifbracedT[1]{\ifbracedTF{#1}\@firstofone\@gobble} -\newcommand\ifbracedF[1]{\ifbracedTF{#1}\@gobble\@firstofone} \long\def\ifleftbracedTF#1{% - \cptstrcmp{\detokenize\@xp{\@gobble#1.}}{}\@secondoftwo{% - \cptstrcmp{\@xp\@car\detokenize{#1}\@nil}{\@leftbracechar}% + \cptstrcmp{\detokenize\expandafter{\@gobble#1.}}{}\@secondoftwo{% + \cptstrcmp{\expandafter\cpt@car\detokenize{#1}\car@nil}{\@leftbracechar}% \@firstoftwo\@secondoftwo }% } \new@def\ifxTF#1#2{% - \@nameuse{@\ifx#1#2\@empty first\else second\fi oftwo}% + \usecsn{@\ifx#1#2\@empty first\else second\fi oftwo}% } \new@def\ifxFT#1#2{\ifxTF{#1}{#2}\@secondoftwo\@firstoftwo} -\new@def\ifxT#1#2{\ifxTF{#1}{#2}\@firstofone\@gobble} -\new@def\ifxF#1#2{\ifxTF{#1}{#2}\@gobble\@firstofone} \new@def*\ifcptdefeqTF#1#2{% \ifdefTF{#1}{% \ifdefTF{#2}{% - \@nameuse{@\ifx#1#2first\else second\fi of oftwo}% + \usecsn{@\ifx#1#2first\else second\fi of oftwo}% }\@secondoftwo }\@secondoftwo } \new@def\ifcatTF#1#{% - \@nameuse{@\ifcat#1first\else second\fi oftwo}% + \usecsn{@\ifcat#1first\else second\fi oftwo}% } \new@def\ifcharcmpTF#1#2{% - \ifcptonetokenTF{#1}{% - \ifcptonetokenTF{#2}{% - \@nameuse{@\if\detokenize\@xp{\cpt@rnm\@xp - \cptswap\@xp{\cpt@rnm-`\q#2}{-`\q#1}}% + \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 @@ -1035,18 +1156,48 @@ }% } \new@def\ifcharcmpFT#1#2{\ifcharcmpTF{#1}{#2}\@secondoftwo\@firstoftwo} -\new@def\ifcharcmpT#1#2{\ifcharcmpTF{#1}{#2}\@firstofone\@gobble} -\new@def\ifcharcmpF#1#2{\ifcharcmpTF{#1}{#2}\@gobble\@firstofone} -\new@def\ifcptonetokenTF#1{% - \ifblankTF{#1}\@secondoftwo{% +\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{% - \expandafter\ifstremptyTF\expandafter{\@gobble#1}% + \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{% - \ifcptonetokenTF{#1}% - {#2}{\cpt@err{Invalid list parser '#1'}\@ehc}% + \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 @@ -1054,30 +1205,36 @@ } \robust@def*\cptaftergroup#1{% \advance\@tempcnta\@ne - \csn@xdef{cpt@exitgroup@\cpt@rnm\@tempcnta}{% - \global\undef@csn{cpt@exitgroup@\cpt@rnm\@tempcnta}% - \unexpanded\ifnullF{#1}\expandafter{#1}% + \csn@xdef{cpt@aftergroup@\cpt@rnm\@tempcnta}{% + \gundefcsn{cpt@aftergroup@\cpt@rnm\@tempcnta}% + \unexpanded\ifnullTF{#1}{}\expandafter{#1}% }% - \cptaftercs\aftergroup{cpt@exitgroup@\cpt@rnm\@tempcnta}% + \aftercsname\aftergroup{cpt@aftergroup@\cpt@rnm\@tempcnta}% } \robust@def\cptafterassignment#1{% \begingroup \advance\@tempcnta\@ne \csn@xdef{cpt@afterassignment@\cpt@rnm\@tempcnta}{% - \global\undef@csn{cpt@afterassignment@\cpt@rnm\@tempcnta}% - \unexpanded\ifnullF{#1}\expandafter{#1}% + \gundefcsn{cpt@afterassignment@\cpt@rnm\@tempcnta}% + \unexpanded\ifnullTF{#1}{}\expandafter{#1}% }% - \expandafter\endgroup\expandafter\afterassignment - \csname cpt@afterassignment@\cpt@rnm\@tempcnta\endcsname + \aftercsname{\endgroup\afterassignment}{% + cpt@afterassignment@\cpt@rnm\@tempcnta}% } -\robust@def\cptdefxppass#1#2#{% - \cptafterassignment{\expandafter#1}\def#1#2% +\robust@def*\cptexpandmacro#1#2{% + \ifcptmacroTF{#1}{% + \ifexpandableTF{#1}{% + \simpleexpandarg\cptexpandmacro{#1}% + }{% + \edef#2{\unexpanded{#1}}% + }% + }{% + \edef#2{\unexpanded{#1}}% + }% } -\robust@def\defsec@fir#1#2{\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}}% + {\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 @@ -1085,11 +1242,13 @@ } \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&[&{#2#1}{#2[{#3}]{#1}}} -\new@def*\cpt@xifbrack#1[#2#{% - \@nameuse{@\ifnullTF{#1#2}{first}{second}oftwo}% +\new@def*\cpt@xtestopt#1#2#3{% + \cpt@xifbrack#1\cpt@unique[\cpt@unique{#2#1}{#2[{#3}]{#1}}% } -\robust@def\cpt@testparenopt#1#2{\cpt@ifnextchar({#1}{#1({#2})}} +\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}}} @@ -1100,48 +1259,76 @@ \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*\cptifstrcase#1{\cpt@xtestopt{#1}\cpt@ifstrcase{}} +\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{% - \ifstremptyTF{#3}{#5}{% + \ifnullTF{#3}{#5}{% \ifstrcmpTF{#1}{#4}{#2}{% \cpt@ifstrc@se#3\cpt@nil{#4}{#5}% }% }% } -\robust@def\ifinsetTF#1#2{% +\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@@ - \ifin@\@xp\@firstoftwo\else\@xp\@secondoftwo\fi +} +\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\ifinsetT#1#2{\ifinsetTF{#1}{#2}\@firstofone\@gobble} -\robust@def\ifinsetF#1#2{\ifinsetTF{#1}{#2}\@gobble\@firstofone} \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\oifinsetT#1#2{\oifinsetTF{#1}{#2}\@firstofone\@gobble} -\robust@def\oifinsetF#1#2{\oifinsetTF{#1}{#2}\@gobble\@firstofone} \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\xifinsetT#1#2{\xifinsetTF{#1}{#2}\@firstofone\@gobble} -\robust@def\xifinsetF#1#2{\xifinsetTF{#1}{#2}\@gobble\@firstofone} -\robust@def*\kill@one@element{\cpt@testopt\cpt@killoneelement{,}} +\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@checklistparser\cpt@checklistparser{#1}\relax\fi + \if@checklp\cpt@checklistparser{#1}\relax\fi \begingroup \@onelevel@sanitize#3% \edef\cpt@rsvda{\detokenize{#2}}% @@ -1154,49 +1341,132 @@ \exitgroupdef#3% \cptscantokens#3% } -\def\cptkillelements{\cpt@testopt\cpt@killelements{,}} -\def\cpt@killelements[#1]#2#3{% - \def\kill@tempa{#2}% - \csv@@normalize*\kill@tempa - \csv@@normalize*#3% - \@checklistparserfalse - \def\fifo@do##1{\cpt@killoneelement[#1]{##1}#3}% - \oneDfifo*\kill@tempa - \undef@cs\kill@tempa - \@checklistparsertrue -} - -\def\remove@one@element{\cpt@testopt\cpt@removeoneelement{,}} -\def\cpt@removeoneelement[#1]#2#3{% - \if@checklistparser\cpt@checklistparser{#1}\relax\fi +\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}% - \xifinsetT{\remove@nil#1}{\remove@nil\expandcsonce{#3}}{% + \xifinsetFT{\remove@nil#1}{\remove@nil\expandcsonce{#3}}{}{% \def\cpt@removeone#1####1\remove@nil{\gdef#3{####1}}% \expandafter\cpt@removeone#3\remove@nil }% - \xifinsetT{#1\remove@nil}{\expandcsonce{#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 }% }% - \xifinsetT{#1\unexpanded{#2}#1}{#1\expandcsonce{#3}#1}{% + \xifinsetFT{#1\unexpanded{#2}#1}{#1\expandcsonce{#3}#1}{}{% \protected\def\remove@nil{}% \expandafter\cpt@removeone\expandafter#1#3#1\remove@nil }% \endgroup } -\def\cptremoveelements{\cpt@testopt\cpt@removeelements{,}} -\def\cpt@removeelements[#1]#2#3{% - \def\remove@tempa{#2}% - \csv@@normalize*\remove@tempa - \csv@@normalize*#3% - \@checklistparserfalse - \def\fifo@do##1{\cpt@removeoneelement[#1]{##1}#3}% - \oneDfifo*\remove@tempa - \undef@cs\remove@tempa - \@checklistparsertrue +\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}% @@ -1224,58 +1494,81 @@ }% } \robust@def*\cptglet{\global\let} -\robust@def*\csn@def#1{\cptthreexp\def\@nameuse{#1}} -\robust@def*\csn@gdef#1{\cptthreexp\gdef\@nameuse{#1}} -\robust@def*\csn@edef#1{\cptthreexp\edef\@nameuse{#1}} -\robust@def*\csn@xdef#1{\cptthreexp\xdef\@nameuse{#1}} -\robust@def*\csn@let@cs#1{\cptthreexp\let\@nameuse{#1}} -\robust@def*\cs@let@csn#1#2{% +\@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*\csn@let@csn#1#2{% +\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 } -\new@def\cptaftercs#1#2{% +\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\cptuse#1{\ifcsndefTF{#1}{\@nameuse{#1}}{}} -\robust@def*\cptglobalize#1{\cptglet#1#1} -\robust@def*\undef@cs#1{\let#1\@undefined} -\robust@def*\undef@csn#1{\cptthreexp\undef@cs\@nameuse{#1}} -\robust@def*\undef@csset{\cpt@testst\cpt@undefcsset} +\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\ifcptescapedTF\cpt@tempa{% - \expandafter\undef@cs\cpt@tempa + \expandafter\ifescapedTF\expandafter{\cpt@tempa}{% + \expandafter\undefcs\cpt@tempa }{% \cpt@err{I can't find escape in token - '\cptxpdetok\cpt@tempa'}\@ehc + '\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{% - \xifinsetT{#1\cpt@nil}{\cptxpdetok{#2}\cpt@nil}{% - \def\cpt@trimc####1#1\cpt@nil{% + \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\cpt@nil + \expandafter\cpt@trimc\expandafter.#2\trimparser@nil }% }% \defpass\cpt@trima{% - \xifinsetTF{\cpt@nil#1}{\cpt@nil\cptxpdetok{#2}}{% - \def\cpt@trimc#1####1\cpt@nil{% + \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\cpt@nil + \expandafter\cpt@trimc#2\trimparser@nil }{% \cpt@trimb }% @@ -1314,9 +1607,12 @@ \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\ifstremptyTF\expandafter{\@secondoftwo#1{}}{% + \expandafter\ifnullTF\expandafter{\@secondoftwo#1{}}{% \expandafter\@gobble\cpt@stripallouterbraces#1% }{0 #1}% }{0 #1}% @@ -1332,38 +1628,46 @@ \ifxTF#2\cpt@tempa {\endgroup\@firstoftwo}{\endgroup\@secondoftwo}% } -\robust@def*\cpt@bracearg{\cpt@testopt\cpt@br@cearg\@ne} -\robust@def\cpt@br@cearg[#1]#2#3{% - \ifbracedTF{#2}{% - \begingroup - \let\nr\z@ - \loop - \edef#3{\unexpanded{{#2}}}% - \pushnumber\nr - \ifnum\nr<#1\relax - \repeat - \exitgroupdef#3% - }{% - \edef#3{\unexpanded{#2}}% - }% -} -\begingroup -\catcode`\&=3 -\new@gdef\xp@despace#1{\cpt@rnm-`\q\cpt@normaldespace.#1& &} -\robust@gdef\normal@despace#1#2{% - \edef#2{\expandcsonce{\cpt@rnm-`\q\cpt@normaldespace.#1& &}}% +\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% } -\robust@gdef\cpt@normaldespace#1 &{\cpt@norm@ldespace#1&} -\robust@gdef\cpt@norm@ldespace#1{\@xp\noexpand\@gobble#1} -\endgroup +\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% - \ifxF#2\despace@tempa{% + \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% } @@ -1388,128 +1692,136 @@ \do{##1}\cpt@rsvda \cpt@sttrue\cpt@addtolist[#1]\cpt@rsvdb\cpt@rsvda }% - \oneDfifo*[#1]{#2}% + \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{\@nameuse{@\ifblankTF{#2}{second}{first}oftwo}} -\robust@def*\ifcptescapedTF#1{% - \begingroup\escapechar\cpt@xciipt +\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\@nameuse{@\ifx\cpt@tempa + \cptthreexp\endgroup\usecsn{@\ifx\cpt@tempa \@backslashchar first\else second\fi oftwo}% } -\robust@def*\@left@addto@macro{% - \let\cpt@def\edef\let\swap\cptswap - \cpt@addtomacro +\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*\@right@addto@macro{% - \let\cpt@def\edef\let\swap\@alloftwo - \cpt@addtomacro +\robust@def*\gleftaddtocs{% + \let\cpt@def\xdef\let\swap\cptswap\cpt@addtocs } -\robust@def*\g@left@addto@macro{% - \let\cpt@def\xdef\let\swap\cptswap - \cpt@addtomacro +\robust@def*\rightaddtocs{% + \let\cpt@def\edef\let\swap\cptalloftwo\cpt@addtocs } -\robust@def*\g@right@addto@macro{% - \let\cpt@def\xdef\let\swap\@alloftwo - \cpt@addtomacro +\robust@def*\grightaddtocs{% + \let\cpt@def\xdef\let\swap\cptalloftwo\cpt@addtocs } -\robust@def\cpt@addtomacro#1#2{% +\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{% - \cpt@def#1{\swap{\expandcsonce{#1}}{\unexpanded{#2}}}% + \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 }{% - \cpt@def#1{\unexpanded{#2}}% + \@testfalse\def\macroprefix{}% + }% + \cptpassexpanded{% + \endgroup\noexpand\scantokens + {\def\noexpand\macroprefix{\macroprefix}\relax}% }% - \undef@cs\cpt@def\undef@cs\swap } \robust@def*\BeforeStartOfDocument{% - \g@right@addto@macro\cpt@beforestartdoc@hook + \grightaddtocs\cpt@beforestartdoc@hook } -\@onlypreamble\BeforeStartOfDocument \new@def*\cpt@beforestartdoc@hook{} -\g@left@addto@macro\document{% +\gleftaddtocs\document{% \endgroup \let\BeforeStartOfDocument\@firstofone \cpt@beforestartdoc@hook \let\BeforeStartOfDocument\@notprerr - \global\undef@cs\cpt@beforestartdoc@hook + \gundefcs\cpt@beforestartdoc@hook \begingroup } \robust@def*\AfterStartOfDocument{% - \g@right@addto@macro\cpt@afterstartdoc@hook + \grightaddtocs\cpt@afterstartdoc@hook } \new@def*\cpt@afterstartdoc@hook{} -\g@right@addto@macro\document{% +\grightaddtocs\document{% \let\AfterStartOfDocument\@firstofone \cpt@afterstartdoc@hook \let\AfterStartOfDocument\@notprerr - \global\undef@cs\cpt@afterstartdoc@hook + \gundefcs\cpt@afterstartdoc@hook \ignorespaces } -\g@left@addto@macro\@popfilename{% - \@nameuse{% +\gleftaddtocs\@popfilename{% + \usecsn{% @\ifcsname\@currname.\@currext-cpt@h@@k\endcsname iden\else gobble\fi }% - {\@nameuse{\@currname.\@currext-cpt@h@@k}}% - \global\undef@csn{\@currname.\@currext-cpt@h@@k}% + {\usecsn{\@currname.\@currext-cpt@h@@k}}% + \gundefcsn{\@currname.\@currext-cpt@h@@k}% } -\robust@def*\cptaddtolist{\cpt@teststoptb\cpt@addtolist} -\robust@def\cpt@addtolist[#1]#2#3{% - \cpt@checklistparser{#1}\relax - \begingroup - \def\cpt@tempa{\endgroup - \ifdefTF#2{% - \ifcpt@st - \protected@edef#2{\expandcsonce#2\ifcsemptyF#2#1#3}% - \else - \edef#2{\expandcsonce#2\ifcsemptyF#2#1\unexpanded{#3}}% - \fi - }{% - \ifcpt@st - \protected@edef#2{#3}% - \else - \edef#2{\unexpanded{#3}}% - \fi +\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]}% }% - }% - \ifblankTF{#3}{\if@useempty\cpt@tempa\else\endgroup\fi}% - \cpt@tempa -} -\robust@def*\cptaddtocommalist#1#2{% - \ifdefTF{#1}{% - \xdef#1{% - \ifx#1\@empty\else\expandcsonce{#1},\fi - \expandcsonce{#2}% + \@useemptyfalse + \normalxDloop{#1}\cpt@tempa{% + \expandafter\cpt@loadpackages\cpt@tempa\cpt@nil }% - }{% - \xdef#1{\expandcsonce{#2}}% - }% -} -\def\cptloadpackages#1{% - \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\g@right@addto@macro + \expandafter\grightaddtocs \csname\@currname.\@currext-cpt@h@@k\endcsname }% - \ifcsemptyTF\@currname\endgroup\cpt@tempa + \ifcsnullTF\@currname\endgroup\cpt@tempa } \edef\cpt@hashchar{\string#} \robust@def*\cpt@pushhash{% @@ -1526,7 +1838,8 @@ \ifblankTF{##2}{% \toks@\expandafter{\the\toks@##1}% }{% - \cptpassexpanded{\toks@{\the\toks@##1\cpt@hashchar\cpt@hashchar}}% + \cptpassexpanded + {\toks@{\the\toks@##1\cpt@hashchar\cpt@hashchar}}% \y##2\cpt@nil }% }% @@ -1534,7 +1847,8 @@ }{% \toks@\expandafter{\detokenize{#1}}% }% - \edef#2{\the\toks@}\exitgroupdef#2% + \edef#2{\the\toks@}% + \exitgroupdef#2% } \robust@def*\cpt@pophash{% \begingroup @@ -1558,9 +1872,10 @@ }{% \toks@\expandafter{\detokenize{#1}}% }% - \edef#2{\the\toks@}\exitgroupdef#2% + \edef#2{\the\toks@}% + \exitgroupdef#2% } -\robust@def*\cpt@everyscantoks{% +\robust@def*\cpteveryscantokens{% \everyeof{\noexpand}% \endlinechar\m@ne \makeatletter @@ -1569,31 +1884,25 @@ \catcode`\{\@ne \catcode`\}\tw@ } -\def\cptscantokens#1{% +\robust@def*\cptscantokens#1{% \begingroup - \edef#1{\def\string#1{\cptxpdetok{#1}}}% - \cpt@everyscantoks + \edef#1{\def\string#1{\cptoxdetok{#1}}}% + \cpteveryscantokens \scantokens\expandafter{#1}\relax \exitgroupdef#1% } -\robust@def*\cpt@preamblecmds{% +\cptonlypreamble{% \cptpushcatcodes,\cptpopcatcodes, \UseNormalCatcodes,\rc@UseNormalCatcodes, \StyleFilePurpose,\StyleFileInfo,\AfterEndOfStyleFile, \StyleFileRCSInfo,\SetStyleFileMessages, \XDeclareOption,\XDeclareCommandOption,\XDeclareBooleanOption, - \XProcessOptions,\XExecuteOptions, + \XDeclareCommandOptions,\XDeclareBooleanOptions, + \XDeclareBiBooleanOptions,\XProcessOptions,\XExecuteOptions, \cpt@processedoptions,\cpt@optionlist,\cpt@splitoption, \cpt@processoptions,\cpt@xprocessoptions,\cpt@pr@cessoptions, - \cpt@pr@c@ssoptions -} -\AtEndOfPackage{\undef@cs\cpt@preamblecmds} -\normaloneDloop*\cpt@preamblecmds\cpt@tempa{% - \expandafter\ifcptonetokenTF\expandafter{\cpt@tempa}{% - \expandafter\@onlypreamble\expandafter{\cpt@tempa}% - }{% - \cpt@err{Illegal multiple elements}\@ehc - }% + \cpt@pr@c@ssoptions,\BeforeStartOfDocument, + \AfterStartOfDocument } \robust@def*\csv@@normalize{\cpt@teststoptb\cpt@csvnormalize} \robust@def\cpt@csvnormalize[#1]#2{% @@ -1606,20 +1915,20 @@ \csv@kv@normalize{#1}{#2}\normalized@kvlist } \robust@def\csv@kv@normalize#1#2#3{% - \ifcptonetokenTF{#1}{}{\cpt@err{Multiple list parser}\@ehc}% \let\if@normst\ifcpt@st + \cpt@checklistparser{#1}\relax \begingroup \expandafter\setup@parser@normalize\string#1% - \if@boolTF{@normst}{% + \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% - \ifnumT\normalize@listtype=\@ne{% + \ifnumFT\normalize@listtype=\@ne{}{% \normalize@activeequal \expandafter\normalize@spaceletter\string=% \expandafter\normalize@letterspace\string=% @@ -1629,17 +1938,17 @@ \edef#3{\the\toks@}% \expandafter\cpttrimparser\expandafter[\string#1]#3% \exitgroupdef#3% - \if@normst\let#2#3\undef@cs#3\fi - \undef@cs\if@normst + \if@normst\let#2#3\undefcs#3\fi + \undefcs\if@normst } \def\setup@parser@normalize#1{% \begingroup - \uccode`\~=`#1% + \uccode`\~\string=`#1% \uppercase{\endgroup \def\normalize@activeparser{% \def\cpt@tempa####1~####2\cpt@nil{% \toks@\expandafter{\the\toks@####1}% - \ifblankF{####2}{\cpt@tempa#1####2\cpt@nil}% + \ifblankTF{####2}{}{\cpt@tempa#1####2\cpt@nil}% }% \toks@\expandafter{\expandafter}% \expandafter\cpt@tempa\the\toks@~\cpt@nil @@ -1647,8 +1956,7 @@ }% } \begingroup -\catcode`\= 12 -\uccode`\~=`\=% +\uccode`\~\string=`\=% \uppercase{\endgroup \def\normalize@activeequal{% \def\cpt@tempa##1~##2\cpt@nil{% @@ -1657,7 +1965,7 @@ }{% \toks@\expandafter{\the\toks@=##1}% }% - \ifblankF{##2}{\cpt@tempa##2\cpt@nil}% + \ifblankTF{##2}{}{\cpt@tempa##2\cpt@nil}% }% \toks@\expandafter{\expandafter}\expandafter \cpt@tempa\the\toks@~\cpt@nil @@ -1702,7 +2010,7 @@ \def\cpt@tempa##1,=##2\cpt@nil{% \ifblankTF{##2}{}{% \cpt@err{There is 'comma' next to 'equal' (,=) in - \MsgBrk your key-val list}\@ehc + \MsgBrk your key-value list}\@ehc }% }% \expandafter\cpt@tempa\the\toks@,=\cpt@nil @@ -1712,7 +2020,7 @@ \normaloneDloop*\@filelist\cpt@tempa{% \filename@parse\cpt@tempa \ifx\filename@ext\@clsextension - \ifcsndefT{opt@\filename@area\filename@base.\filename@ext}{% + \ifcsndefFT{opt@\filename@area\filename@base.\filename@ext}{}{% \xdef\cpt@documentclass{% \filename@area\filename@base.\filename@ext }% @@ -1720,37 +2028,46 @@ \fi \ifx\cpt@documentclass\cpt@undefined\else\@breaklooptrue\fi }% - \ifdefF\cpt@documentclass{% + \ifdefTF\cpt@documentclass{}{% \@latex@info@no@line{'catoptions' package loaded before - \string\documentclass}% - }% -} -\ifx\@filelist\relax\else\ifx\@filelist\@gobble\else - \ifx\@filelist\@empty\else - \cptsevenxp\cpt@getdocumentclass -\fi\fi\fi -\ifx\cpt@documentclass\cpt@undefined - \let\cpt@documentclass\@empty - \let\cpt@classoptionslist\@empty -\else - \ifx\@classoptionslist\relax\else - \ifx\@classoptionslist\@empty\else - \kv@@normalize*\@classoptionslist - \fi\fi - \let\cpt@classoptionslist\@classoptionslist - \expandafter\cptemptify\expandafter\@classoptionslist\expandafter - \normaloneDloop\expandafter{\@classoptionslist}\cpt@tempa{% - \oifinsetF{=}\cpt@tempa{% - \cptaddtocommalist\@classoptionslist\cpt@tempa + \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 + }% }% }% -\fi +} \robust@def*\cpt@testfam#1{% \cpt@ifnextchar<{#1}{#1<{\@currname.\@currext}>}% } \robust@redef\@pass@ptions#1#2#3{% \begingroup - \ifcptonetokenTF{#2}{% + \ifsingletokenTF{#2}{% \ifcptmacroTF{#2}{% \let\@expand\expandcsonce }{% @@ -1759,10 +2076,15 @@ }{% \let\@expand\unexpanded }% - \csn@xdef{opt@#3.#1}{% - \ifcsndefT{opt@#3.#1}{\expandcsnonce{opt@#3.#1},}% - \@expand{#2}% + \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{% @@ -1771,9 +2093,9 @@ \fi } \robust@redef*\@use@ption{% - \xifinsetT{,\cptxpdetok\CurrentOption,}% - {,\cptxpdetok\@unusedoptionlist,}{% - \@xpargox{\cpt@killoneelement[,]}\CurrentOption + \xifinsetFT{,\cptoxdetok\CurrentOption,}% + {,\cptoxdetok\@unusedoptionlist,}{}{% + \cptexpandargonce{\cpt@killoneelement[,]}\CurrentOption \@unusedoptionlist }% \csname ds@\CurrentOption\endcsname @@ -1781,7 +2103,7 @@ \robust@redef*\@fileswith@pti@ns#1[#2]#3[#4]{% \begingroup \edef\fileopts{\unexpanded{#2}}% - \ifcsemptyF\fileopts{\kv@@normalize*\fileopts}% + \ifcsnullTF\fileopts{}{\cpt@sttrue\cpt@kvnormalize[,]\fileopts}% \def\fileswithopts##1##2{% \noexpand\@onefilewithoptions{##1}% [\expandcsonce\fileopts]\unexpanded{[#4]##2}% @@ -1806,17 +2128,17 @@ } \let\@@fileswith@pti@ns\@fileswith@pti@ns \robust@def*\RecoverAtEndOfPackage#1{% - \csn@let@cs{rc@\expandafter\@gobble\string#1}#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}}% - \xifinsetF{\cptxpdetok\cpt@tempa}{\cptxpdetok\cpt@tempb}{% + \xifinsetTF{\cptoxdetok\cpt@tempa}{\cptoxdetok\cpt@tempb}{}{% \expandafter\AtEndOfPackage\expandafter{\cpt@tempa}% }% - \xifinsetF{\cptxpdetok\cpt@tempa}{\cptxpdetok\RequirePackage}{% + \xifinsetTF{\cptoxdetok\cpt@tempa}{\cptoxdetok\RequirePackage}{}{% \xdef\RequirePackage{% \expandcsonce\cpt@tempa\expandcsonce\RequirePackage }% @@ -1825,12 +2147,12 @@ } \RecoverAtEndOfPackage\cpt@defdefault@ds \robust@def*\cpt@badoptionerr{% - \expandafter\ifcptescapedTF\expandafter{\curropt}{% + \expandafter\ifescapedTF\expandafter{\curropt}{% \cpt@err{Bad option name '\expandcsonce\curropt'}\@ehc }{% - \expandafter\ifcptmacroTF\expandafter{\curropt}{% + \expandafter\ifcptmacroFT\expandafter{\curropt}{}{% \cpt@err{Bad option name '\expandcsonce\curropt'}\@ehc - }{}% + }% }% } \robust@def*\XDeclareOption{% @@ -1840,9 +2162,11 @@ {\cpt@testfam\cpt@declareoption}% } \robust@def*\cpt@declareoption<#1>#2{% - \def\curropt{#2}% + \normal@despace{#1}\currfam + \normal@despace{#2}\curropt \cpt@badoptionerr - \cpt@testopt{\cpt@d@clareoption{#1}{#2}}{}% + \cptexpandarg\cpt@testopt + {\cpt@d@clareoption{\currfam}{\curropt}}{}% } \robust@def\cpt@d@clareoption#1#2[#3]#4{% \cpt@d@cl@reoption{#1}{#2}{#3}% @@ -1857,24 +2181,55 @@ }% \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{% - \def\curropt{#2}% + \normal@despace{#1}\currfam + \normal@despace{#2}\curropt \cpt@badoptionerr - \cpt@testopt{\cpt@d@clarecmdoption{#1}{#2}}{}% + \cptexpandarg\cpt@testopt + {\cpt@d@clarecmdoption{\currfam}{\curropt}}{}% } \robust@def\cpt@d@clarecmdoption#1#2[#3]{% - \cptfullexpandarg{\cpt@testparenopt{\cpt@d@cl@recmdoption + \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{% @@ -1882,21 +2237,109 @@ \ifnum\cmdoption=\@ne \def\cpt@rsvda{\csn@def{#4#2}{####1}}% \else - \@fullxpsec{\@nameuse{newif}}{\noexpandcsn{if#4#2}}% + \cptexpandsecond{\usecsn{newif}}{\noexpandcsn{if#4#2}}% \def\cpt@rsvda{% - \ifinsetF{,####1,}{,true,false,}{% + \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 - }% + \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},}{% @@ -1905,7 +2348,7 @@ }% }{% \cpt@stfalse - \cptfullexpandarg{\cpt@addtolist[,]}% + \cptexpandarg{\cpt@addtolist[,]}% {\noexpandcsn{#1@declaredoptions}}{#2}% }% }{% @@ -1916,8 +2359,8 @@ }% } \new@def*\cpt@getdeclaredoptions#1{% - \ifcsnemptyTF{#1@declaredoptions}{}{% - \detokenize\cptsevenxp{\@nameuse{#1@declaredoptions}}% + \ifcsnnullTF{#1@declaredoptions}{}{% + \detokenize\cptsevenxp{\usecsn{#1@declaredoptions}}% }% } \robust@def*\cpt@defdefault@ds<#1>#2{% @@ -1929,11 +2372,11 @@ \@cls@pkg\@space'\@currname'.}% }% } -\letnewcmd\rc@cpt@defdefault@ds\cpt@defdefault@ds +\newletcs\rc@cpt@defdefault@ds\cpt@defdefault@ds \new@def*\cpt@optionlist#1{% - \ifcsndefT{opt@#1}{\unexpanded\cptsevenxp{\@nameuse{opt@#1}}}% + \ifcsndefFT{opt@#1}{}{\unexpanded\cptsevenxp{\usecsn{opt@#1}}}% } -\letnewcmd\cpt@processedoptions\@empty +\newletcs\cpt@processedoptions\@empty \robust@def*\XProcessOptions{% \let\@fileswith@pti@ns\@badrequireerror \edef\cpt@testname{\@currname.\@currext}% @@ -1945,7 +2388,8 @@ \expandcsonce\cpt@classoptionslist\fi }% \edef\@curroptions{\cpt@optionlist{\@currname.\@currext}}% - \ifcsemptyF\@curroptions{\kv@@normalize*\@curroptions}% + \ifcsnullTF\@curroptions{}% + {\cpt@sttrue\cpt@kvnormalize[,]\@curroptions}% \cpt@ifstar {\cpt@sttrue\cpt@testfam\cpt@processoptions}% {\cpt@stfalse\cpt@testfam\cpt@processoptions}% @@ -1958,14 +2402,14 @@ }% } \robust@def*\cpt@pr@cessoptions#1[#2]{% - \def\currfam{#1}% + \normal@despace{#1}\currfam \def\kv@do##1{% \edef\CurrentOption{\unexpanded{##1}}% - \ifcsemptyF\CurrentOption{% + \ifcsnullTF\CurrentOption{}{% \cpt@splitoption\z@ - \if@boolT{cpt@optf}{% + \if@boolFT{cpt@optf}{}{% \cpt@inpoxtrue - \ifcsndefT{#1@ds@\curropt}{% + \ifcsndefFT{#1@ds@\curropt}{}{% \ifblankTF{#2}{% \cpt@igoptfalse }{% @@ -1980,22 +2424,21 @@ }% }% }% - \ifcsemptyF\cpt@classoptions{% - \cptfullexpandarg - {\kv@@parse*}{\noexpandcsn{#1@declaredoptions}}% + \ifcsnullTF\cpt@classoptions{}{% + \cptexpandarg{\kv@@parse*}{\noexpandcsn{#1@declaredoptions}}% }% \cpt@pr@c@ssoptions{#1}{#2}% } \robust@def*\cpt@xprocessoptions#1[#2]{% - \def\currfam{#1}% + \normal@despace{#1}\currfam \def\kv@do##1{% \edef\CurrentOption{\unexpanded{##1}}% - \ifcsemptyF\CurrentOption{% + \ifcsnullTF\CurrentOption{}{% \cpt@splitoption\@ne - \xifinsetT{,\cptxpdetok\curropt,}% - {,\cpt@getdeclaredoptions{#1},}{% + \xifinsetFT{,\cptoxdetok\curropt,}% + {,\cpt@getdeclaredoptions{#1},}{}{% \cpt@inpoxtrue - \ifcsndefT{#1@ds@\curropt}{% + \ifcsndefFT{#1@ds@\curropt}{}{% \ifblankTF{#2}{% \cpt@igoptfalse }{% @@ -2010,14 +2453,14 @@ }% }% }% - \ifcsemptyF\cpt@classoptions{\kv@@parse*\cpt@classoptions}% + \ifcsnullTF\cpt@classoptions{}{\kv@@parse*\cpt@classoptions}% \cpt@pr@c@ssoptions{#1}{#2}% } \robust@def*\cpt@pr@c@ssoptions#1#2{% - \def\currfam{#1}% + \normal@despace{#1}\currfam \def\kv@do##1{% \edef\CurrentOption{\unexpanded{##1}}% - \ifcsemptyF\CurrentOption{% + \ifcsnullTF\CurrentOption{}{% \cpt@splitoption\@ne \cpt@inpoxtrue \ifcsndefTF{#1@ds@\curropt}{% @@ -2033,21 +2476,21 @@ \cpt@useoption }{% \ifcsndefTF{#1@default@ds}{% - \@nameuse{#1@default@ds}% + \usecsn{#1@default@ds}% }{% \default@ds }% }% }% }% - \ifcsemptyF\@curroptions{\kv@@parse*\@curroptions}% + \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 - \undef@cs\cpt@classoptions + \undefcs\cpt@classoptions \let\cpt@processedoptions\@empty \let\@fileswith@pti@ns\@@fileswith@pti@ns \cpt@olddxfalse @@ -2055,17 +2498,17 @@ } \robust@def*\XExecuteOptions{\cpt@testfam\cpt@executeoptions} \robust@def*\cpt@executeoptions<#1>#2{% - \def\currfam{#1}% + \normal@despace{#1}\currfam \let\cpt@executedoptions\@empty \let\rc@CurrentOption\CurrentOption \def\kv@do##1{% \edef\CurrentOption{\unexpanded{##1}}% - \ifcsemptyF\CurrentOption{% + \ifcsnullTF\CurrentOption{}{% \cpt@splitoption\@ne - \xifinsetTF{,\cptxpdetok\curropt,}% + \xifinsetTF{,\cptoxdetok\curropt,}% {,\cpt@getdeclaredoptions{#1},}{% - \xifinsetTF{,\cptxpdetok\curropt,}% - {,\cptxpdetok\cpt@executedoptions,}{% + \xifinsetTF{,\cptoxdetok\curropt,}% + {,\cptoxdetok\cpt@executedoptions,}{% \cpt@warn{Option '\curropt' multiply submitted to \MsgBrk\string\XExecuteOptions: re-executed}% }{% @@ -2087,9 +2530,9 @@ \ifcase#1\relax \cpt@optffalse \oneDloop@b\cpt@classoptions\@currentoption{% - \ifcsemptyF\@currentoption{% - \xifinsetTF{=}{\cptxpdetok\@currentoption}{% - \@xp\cpt@split@ption\@currentoption=\cpt@nil + \ifcsnullTF\@currentoption{}{% + \xifinsetTF{=}{\cptoxdetok\@currentoption}{% + \expandafter\cpt@split@ption\@currentoption=\cpt@nil }{% \let\@curropt\@currentoption \let\@currval\@empty @@ -2104,7 +2547,7 @@ }% \or \let\currentoption\CurrentOption - \xifinsetTF{=}{\cptxpdetok\CurrentOption}{% + \xifinsetTF{=}{\cptoxdetok\CurrentOption}{% \expandafter\cpt@split@ption\CurrentOption=\cpt@nil \let\curropt\@curropt \let\currval\@currval @@ -2131,8 +2574,8 @@ } \robust@def*\cpt@useoption{% \ifcpt@inpox - \xifinsetF{,\cptxpdetok\CurrentOption,}% - {,\cptxpdetok\cpt@processedoptions,}{% + \xifinsetTF{,\cptoxdetok\CurrentOption,}% + {,\cptoxdetok\cpt@processedoptions,}{}{% \cptaddtocommalist\cpt@processedoptions\CurrentOption }% \remove@curr@option\currentoption @@ -2144,8 +2587,8 @@ \ifcpt@olddx \cptuse{\currfam @ds@\curropt}% \else - \ifcsndefT{\currfam @ds@\curropt}{% - \ifcsemptyTF\currval{% + \ifcsndefFT{\currfam @ds@\curropt}{}{% + \ifcsnullTF\currval{% \cptthreexp\cpt@usedefault \csname\currfam @ds@\curropt @default\endcsname\cpt@nil }{% @@ -2157,7 +2600,7 @@ } \robust@def*\cpt@use@ption{% \cpt@pushoptionstate - \@xpargox{\cptuse{\currfam @ds@\curropt}}\currval\relax + \cptexpandargonce{\cptuse{\currfam @ds@\curropt}}\currval\relax \cpt@popoptionstate } \robust@def*\cpt@usedefault#1#2\cpt@nil{% @@ -2185,34 +2628,32 @@ \cpt@popoptionstate }% } -\robust@def*\cpt@optionstate{% - \currfam,\curropt,\currval,\CurrentOption,\currentoption,% - \ifcpt@inpox,\ifcpt@optf,\ifcpt@igopt -} \robust@def*\cpt@pushoptionstate{% - \@xp\pushfunctions\@xp{\cpt@optionstate}\cpt@optdepth + \pushfunctions{\currfam,\curropt,\currval,\CurrentOption,% + \currentoption,\ifcpt@inpox,\ifcpt@optf,\ifcpt@igopt}\cpt@optdepth } \robust@def*\cpt@popoptionstate{% - \@xp\popfunctions\@xp{\cpt@optionstate}\cpt@optdepth + \popfunctions{\currfam,\curropt,\currval,\CurrentOption,% + \currentoption,\ifcpt@inpox,\ifcpt@optf,\ifcpt@igopt}\cpt@optdepth } \robust@def*\remove@curr@option#1{% - \@xpargox{\cpt@killoneelement[,]}{#1}\@unusedoptionlist + \cptexpandargonce{\cpt@killoneelement[,]}{#1}\@unusedoptionlist } \BeforeStartOfDocument{% - \ifdefT\cpt@pr@cessedoptions{% - \ifcsemptyF\cpt@pr@cessedoptions{% - \ifcsemptyF\@unusedoptionlist{% + \ifdefFT\cpt@pr@cessedoptions{}{% + \ifcsnullTF\cpt@pr@cessedoptions{}{% + \ifcsnullTF\@unusedoptionlist{}{% \oneDloop@b\cpt@pr@cessedoptions\cpt@tempa{% - \xifinsetT{,\cptxpdetok\cpt@tempa,}% - {,\cptxpdetok\@unusedoptionlist,}{% + \xifinsetFT{,\cptoxdetok\cpt@tempa,}% + {,\cptoxdetok\@unusedoptionlist,}{}{% \remove@curr@option\cpt@tempa }% }% }% }% }% - \cptglobalize\@unusedoptionlist - \undef@cs\cpt@pr@cessedoptions + \globalize\@unusedoptionlist + \undefcs\cpt@pr@cessedoptions } \cptpassunexpanded{% \begingroup @@ -2245,6 +2686,7 @@ \expandafter\cpt@tempa\else\expandafter\endgroup\fi } \XDeclareBooleanOption{verbose}[true](cpt@){} +\XDeclareBiBooleanOptions{draft,final}[true](mp@){}{} \XDeclareBooleanOption{usepox}[true](cpt@){% \ifcpt@usepox \AtEndOfPackage{% @@ -2260,6 +2702,7 @@ \cptpopcatcodes \cptrestorecatcodes +\declarefutureletset[fl@]{lbracket,star,rquote} \endinput diff --git a/Master/tlpkg/libexec/ctan2tds b/Master/tlpkg/libexec/ctan2tds index adf861b01a0..642bc0eac65 100755 --- a/Master/tlpkg/libexec/ctan2tds +++ b/Master/tlpkg/libexec/ctan2tds @@ -129,6 +129,7 @@ $Master = "$mydir/../.."; 'bib2ml', "die 'skipping, no self-locate?, etc.'", 'bib2xhtml', "die 'skipping, requires PDF::API2'", 'biber', "die 'skipping, arch-dependent perl, etc.'", + 'bibextract', "die 'skipping, hardwires nawk cmd name'", 'biblatex-chicago', "&MAKEflatten", 'biblatex-contrib', "die 'skipping, use subdir'", 'biblatex-philosophy', "&MAKEflatten", -- cgit v1.2.3