diff options
author | Karl Berry <karl@freefriends.org> | 2011-07-26 23:27:50 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2011-07-26 23:27:50 +0000 |
commit | 99f9db1a1a470ee103017fc3a72fcaf07e939512 (patch) | |
tree | 39333fee6b8143e38b7d8de97af05ccf9e65900c /Master/texmf-dist/doc/latex/catoptions | |
parent | 0339ee8be4b30971917d1b81561d1891e786c972 (diff) |
catoptions (13jul11)
git-svn-id: svn://tug.org/texlive/trunk@23244 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/doc/latex/catoptions')
-rw-r--r-- | Master/texmf-dist/doc/latex/catoptions/README | 6 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/catoptions/catoptions-guide.pdf | bin | 388677 -> 402781 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/latex/catoptions/catoptions-guide.tex | 143 |
3 files changed, 99 insertions, 50 deletions
diff --git a/Master/texmf-dist/doc/latex/catoptions/README b/Master/texmf-dist/doc/latex/catoptions/README index 49831b28d7f..e336e3b278e 100644 --- a/Master/texmf-dist/doc/latex/catoptions/README +++ b/Master/texmf-dist/doc/latex/catoptions/README @@ -12,10 +12,10 @@ AUTHOR Ahmed Musa RELATED PACKAGES -The catcode section of the 'catoptions' package is based on -the 'pcatcode' package by Michael J. Downes and David M. Jones. +The catcode section of the 'catoptions' package is based on the +'pcatcode' package by Michael J. Downes and David M. Jones. VERSION -Version 0.2b, April 2011 +Version 0.2.4, July 2011 diff --git a/Master/texmf-dist/doc/latex/catoptions/catoptions-guide.pdf b/Master/texmf-dist/doc/latex/catoptions/catoptions-guide.pdf Binary files differindex 2ef01da6887..f6e38fe6bda 100644 --- a/Master/texmf-dist/doc/latex/catoptions/catoptions-guide.pdf +++ b/Master/texmf-dist/doc/latex/catoptions/catoptions-guide.pdf diff --git a/Master/texmf-dist/doc/latex/catoptions/catoptions-guide.tex b/Master/texmf-dist/doc/latex/catoptions/catoptions-guide.tex index 4b9a1c0b4d6..c9cb4ff5b67 100644 --- a/Master/texmf-dist/doc/latex/catoptions/catoptions-guide.tex +++ b/Master/texmf-dist/doc/latex/catoptions/catoptions-guide.tex @@ -1,9 +1,20 @@ -\documentclass[a4paper,10pt,final,language=UKenglish,fancysec,framesecno, - parabst,inputcfg]{amltxdoc} +\RequirePackage[usepox,kernelifnextchar]{catoptions} +\documentclass[ + use-a4-paper, + use-10pt-font, + final-version, + use-UK-English, + fancy-section-headings, + frame-section-numbers, + para-abstract-style, + input-config-file, + no-hyperref-messages +]{amltxdoc} + +\hfuzz1pt \makeatletter \WrapQuotes -\NoPrintNotes -\def\XDecS{\fx{\XDeclareOption}\RedStar\sspace} +\def\xdecs{\fx{\XDeclareOption}\RedStar\sspace} \makeindex \begin{document} @@ -12,15 +23,15 @@ \title{The \texttt{\color{blue}catoptions} Package\titleref{t1}} \titlenote[t1]{The package is available at \iftogTF{pdf}{\url{\@titleurl}}{\url{\@shorttitleurl}}.} -\version{0.2b} +\version{0.2.4} \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} +\author{Ahmed Musa \Email{amusa22@gmail.com}\\Preston, Lancashire, UK} \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 \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 application 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. 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 the \pkgnoidx{article} class and on many packages, including \pkgs'{hyperref, cleveref, natbib} without difficulties. + 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 application 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. 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 the \pkgg{article} class and on many packages, including \pkgs'{hyperref, cleveref, natbib} without difficulties. Packages that redefine \latex's native options processing internals may not work properly with \pkg'{catoptions}. I know that \pkg'{xcolor} redefines \hx{\@declareoption} and the \pkg'{catoptions} has taken that fact into account, but there may be other packages that modify \latex's options processing internals that I am not aware of. \end{abstract} \let\licensename\relax @@ -39,15 +50,15 @@ width=1.0\hsize]\tableofcontents \end{xwmshade} + \docsection(sec:motivation){Motivation} -\lletter{M}{y motivation} for turning to the \pkgnoidx'{pcatcode} was to save myself the trouble of declaring category codes at the beginning of my packages. After spending some time on the \pkgnoidx'{pcatcode}, I discovered I had learnt enough to make changes and additions to some of its macros and functionality. After completing the catcode stuff in the \pkg'{catoptions}, I wanted to pass options to the package. If the package is to be loaded on top of other packages, as intended, then its options parsing scheme should be independent of other packages. But realizing the trouble with passing expandable option values to packages and classes via the \latex kernel's scheme, I decided to implement modifications to the kernel's options parser. Apart from the problem of premature expansion of options and values by the \latex kernel, outer curly braces in option values are lost during parsing. Indeed, the kernel's option parsing scheme doesn't recognize option values indicated with the equality sign. +\lletter{M}{y motivation} for turning to the \pkgg'{pcatcode} was to save myself the trouble of declaring category codes at the beginning of my packages. After spending some time on the \pkgg'{pcatcode}, I discovered I had learnt enough to make changes and additions to some of its macros and functionality. After completing the catcode stuff in the \pkg'{catoptions}, I wanted to pass options to the package. If the package is to be loaded on top of other packages, as intended, then its options parsing scheme should be independent of other packages. But realizing the trouble with passing expandable option values to packages and classes via the \latex kernel's scheme, I decided to implement modifications to the kernel's options parser. Apart from the problem of premature expansion of options and values by the \latex kernel, outer curly braces in option values are lost during parsing. Indeed, the kernel's option parsing scheme doesn't recognize option values indicated with the equality sign. \docsection(sec:pkg-options)<Package options>{Package options} -\lletter{T}{he} \pkg'{catoptions} has the options shown in \cref{tab:pkgoptions}. The boolean option \fxim{verbose} instructs the package to enter information onto the log file when some events happen (\eg, when commands are redefined by means of, say, the command \fx{\robust@redef}, which has the same syntax with \tex's legacy \hx{\def}; and when an option from the same family is multiply submitted to, say, \fx{\XExecuteOptions}). This option may be used in the future to provide debugging features for the package. - +\lletter{T}{he} \pkg'{catoptions} has the options shown in \autoref{tab:pkgoptions}. The boolean option \fxim{verbose} instructs the package to enter information onto the log file when some events happen (\eg, when commands are redefined by means of, say, the command \fx{\robust@redef}, which has the same syntax with \tex's legacy \hx{\def}; and when an option from the same family is multiply submitted to, say, \fx{\XExecuteOptions}). This option may be used in the future to provide debugging features for the package. \extrarowheight=2pt \arrayrulecolor{yellow} @@ -65,10 +76,11 @@ \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 +\fx{usepox} & \hx{true} & The boolean switch that determines if the options parser of \pkgg{catoptions} should be used for all options processing of packages loaded after \hx{\documentclass} even if those packages are based on \usecsn{latex2e}'s native options processing scheme.\\\hline +\fx{kernelifnextchar} & \hx{true} & The boolean option that determines if the package uses \fxim{\ifnextcharTF} or \hx{\kernel@ifnextchar}; the former is based on an idea of Donald Arseneau, which allows even active characters to appear \quoted{as the next character}, but it is costlier than the latter.\\\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. +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 \autoref{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 (together with options with spaces in their names) 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} without modifying the packages. @@ -107,7 +119,7 @@ After issuing the command \fx{\GetCurrentCatcodeSubset}, you can do \finish{example} \fxim*{\currentcatcodesubset} -to see the current catcode setup. The command \fx{\cptfutureletsetup} is described in \cref{sec:future-letting}. +to see the current catcode setup. The command \fx{\cptfutureletsetup} is described in \autoref{sec:future-letting}. \start{example}[\UseNormalCatcodes] \ProvidesPackage{mypackage}[2011/01/16 v0.01] @@ -159,7 +171,7 @@ we have the following commands on hand for testing after \fx{\futurelet}: \fl@space \fl@star \fl@lbracket \iffl@space \iffl@star \iffl@lbracket \finish{newmacro} -\fxim*{Futurelet commands} +\aidx*{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. @@ -192,9 +204,9 @@ where \quotedtt{all} means that control sequences should be defined for all the \iffl@underscore \iffl@lquote \iffl@lbrace \iffl@vert \iffl@rbrace \iffl@tilde \iffl@bslash \finish{example} -\fxim*{Futurelet commands} +\aidxm*{Futurelet commands} -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. +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 \tex engines. The use syntaxes for the commands \fnl{{stub}{char}} and \fnl{{if}{stub}{char}} are as follows: @@ -260,12 +272,12 @@ The commands \ffx'{\mypack@error,\mypack@info} can be used as follows: The interfaces of the options processing commands are as follows, which, apart from the optional family \ang{fam} and default value \ang{default}, are syntactically similar to the corresponding native \latex commands. The optional family name is useful for defining unique options that stand only a remote chance of being mixed up with options of other families. And the optional default value is handy when the user doesn't supply a value for an option: no errors are produced in this case. Existing packages can be processed with these commands without any modifications to those packages. In fact, we have run many existing packages on the bases of these commands (by letting \latex's \hhx'{\DeclareOption,\ExecuteOptions,\ProcessOptions} to these commands), without encountering difficulties. \start{newmacro}[\XDeclareOption] -\XDeclareOption<|nang(fam)>{|nang(opt)}[|nang(default)]{|nang(fn)} -\XDeclareOption|*<|nang(fam)>{|nang(fn)} +\XDeclareOption<|nang(fam)>{|nang(opt)}[|nang(default)]{|nang(fn1)}|label(mac:xdec:a) +\XDeclareOption|*<|nang(fam)>{|nang(fn2)}|label(mac:xdec:b) \finish{newmacro} \fxim*{\XDeclareOption} -The \unstform of the macro \fx{\XDeclareOption} declares an option that can be used as a package or class option and executed by \fx{\XExecuteOptions} or \fx{\XProcessOptions}. This macro is similar to the standard \latex macro \hx{\DeclareOption}, but with this command the user can pass a value to the option as well. That value can be accessed by using \fx{#1} or \fx{\currval} in \ang{fn}. This will contain \ang{default} when no value has been specified for the option. The default value of the optional argument \ang{default} is empty. This implies that when the user does not assign a value to \ang{opt} and when no default value has been defined, no error message will ensue. The optional argument \ang{fam} can be used to specify a unique family for the option. When the argument is not used, the macro will insert the default family name (namely, \fx{\@currname.\@currext}). The current option name is available in \fx{\curropt}. +The \unstform of the macro \fx{\XDeclareOption} declares an option that can be used as a package or class option and executed by \fx{\XExecuteOptions} or \fx{\XProcessOptions}. This macro is similar to the standard \latex macro \hx{\DeclareOption}, but with this command the user can pass a value to the option as well. That value can be accessed by using \fx{#1} or \fx{\cpt@currval} in \ang{fn1}. This will contain \ang{default} when no value has been specified for the option. The default value of the optional argument \ang{default} is empty. This implies that when the user does not assign a value to the option \ang{opt} and when no default value has been defined, no error message will ensue. The optional argument \ang{fam} can be used to specify a unique family for the option. When the argument is not used, the macro will insert the default family name (namely, \fx{\@currname.\@currext}). \start{example}[\XDeclareOption] \ProvidesPackage{mypackage}[\StyleFileInfo] @@ -287,30 +299,32 @@ The options \ffx'{mybool,leftmargin} could then be called via any of the followi The \stform of the macro \fx{\XDeclareOption} can be used to process unknown options. It is similar to \latex's \hx{\DeclareOption}\RedStar, but it has additional features. You can deploy \hx{\CurrentOption} within the \ang{fn} of this macro to access the option name and value for which the option is unknown. These values (possibly including an option) could, for example, be passed on to another class or package or could be used as an extra class or package option that, for instance, specifies a style that should be loaded. Moreover, you can use \fx{#1}, \fx{#2} and \fx{#3} within \ang{fn} to refer to the current family, current option (without its value), and current value, respectively. +\Note This note refers to macro lines \ref{mac:xdec:a} and \ref{mac:xdec:b}. In \fx{\XDeclareOption}, the current option value can be accessed by using \fx{#1} in \ang{fn1}. However, in \xdecs the current family name is accessed as \fx{#1}, the option name is available in \fx{#2}, and the current option value can be accessed with \fx{#3} (all in \ang{fn2}). These differences are important. \start{newmacro}[\XUnknownOptionHandler] \XUnknownOptionHandler<|nang(fams)>[|nang(na)]{|nang(handler)} \finish{newmacro} \fxim*{\XUnknownOptionHandler} -The command \fx{\XUnknownOptionHandler} can be used in place of \XDecS to specify default action(s) for options undefined in any family in \ang{fams}. \ang{handler} refers to the default function that should be executed if undeclared options are called from families \ang{fams} by the user. \hx{\CurrentOption} can be deployed within \ang{handler} to access the option name (coupled with its current value) for which the option name is unknown. As mentioned above in the case of \XDecS, you can use \fx{#1}, \fx{#2} and \fx{#3} within \ang{handler} to access the current family, current option (uncoupled from its current value), and current value, respectively. \ang{na} is the list of options for which \ang{handler} shouldn't apply; for these options, the kernel's unknown option handler (\ie, \hx{\default@ds}) would apply. +The command \fx{\XUnknownOptionHandler} can be used in place of \xdecs to specify default action(s) for options undefined in any family in \ang{fams}\footnote{Declaring a default handler for each unknown option is, of course, inefficient. We have therefore provided provisions for declaring such handers for only families of options.}. \ang{handler} refers to the default function that should be executed if undeclared options are called from families \ang{fams} by the user. \hx{\CurrentOption} can be deployed within \ang{handler} to access the option name (coupled with its current value) for which the option name is unknown. As mentioned above in the case of \xdecs, you can use \fx{#1}, \fx{#2} and \fx{#3} within \ang{handler} to access the current family, current option (uncoupled from its current value), and current value, respectively. \ang{na} is the list of options for which \ang{handler} shouldn't apply; for these options, the kernel's unknown option handler (\ie, \hx{\default@ds}) would apply. If the \ang{handler} contains the special literal form \fx{define/.code=} as in \start{example}[Unknown option handler] -define/.code=|nang(callback) +|A(fn1) |R(define/.code=)|nang(callback)|R(/.end) |A(fn2)|label(mac:handler) \finish{example} \fxim*{define/.code} -then the unknown option \fx{\cpt@curropt} will be momentarily defined and executed with the option function \ang{callback}. The family of the new option will be \fx{\cpt@currfam} (the prevailing family name); its default value will be \fx{\cpt@currval} (the value specified by the user for the unknown option); and its macro function will be the above-indicated \ang{callback}. You can use \fx{#1}, \fx{#2} and \fx{#3} in \ang{callback} to refer to the current option family, option name, and option value, respectively. +then each unknown option in families \ang{fams} will be momentarily defined and executed with the option function \ang{callback}. The family of the new option will be \fx{\cpt@currfam} (the prevailing family name); its default value will be \fx{\cpt@currval} (the value specified by the user for the unknown option); and its macro function will be the above-indicated \ang{callback}. Again, you can use \fx{#1}, \fx{#2} and \fx{#3} in \ang{handler} to refer to the current option family, option name, and option value, respectively. \xnote Functions \ang{fn1} and \ang{fn2} on \macref{mac:handler} will be executed for each unknown function in families \ang{fams}, but (unlike \ang{callback}) will not be used in defining unknown options of \ang{fams}. -If \fx{\cpt@currval} is \hx{true} or \hx{false}, the new (\ie, unknown) option will be defined as a boolean option with macro prefix \quotedfx{\@currname @}; otherwise it will be defined as a command option with macro prefix \quotedfx{cmd\@currname @}. (See the descriptions of the commands \ffx'{\XDeclareCommandOption,\XDeclareBooleanOption} for the meaning of \quoted{macro prefix}.) Note that the token \quoted{define} in the above syntax is not escaped. +If the value given for the unknown option is \hx{true} or \hx{false}, the new (\ie, undeclared) option will be defined as a boolean option with macro prefix \quotedfx{\@currname @}; otherwise it will be defined as a command option with macro prefix \quotedfx{cmd\@currname @}. (See the descriptions of the commands \ffx'{\XDeclareCommandOption,\XDeclareBooleanOption} for the meaning of \quoted{macro prefix}.) It should be noted that the token \quoted{define} in the above syntax is not escaped, and that the token \fx{/.end} is mandatory. If \ang{callback} contains these literal forms, they have to be enclosed in curly braces. The following example, among other things, produces a warning when the user supplies an option that was not previously declared: \zapname \start{example}[\XDeclareOption*] \XDeclareOption|*<mypackage>{% + |com(Unknown options will not be defined automatically here:) \PackageWarningNoLine{mypackage}{Unknown option `\CurrentOption' ignored}% |com(Current option family:) \def\currfamily{#1}% @@ -336,21 +350,30 @@ The following example instructs \fx{\XProcessOptions} to define all unknown keys \start{example}[\XUnknownOptionHandler] \XUnknownOptionHandler<mypackage>{% - define/.code=\def\x##1{##1\relax `option #2 = value #3' in family `#1'}% - \PackageWarningNoLine{mypackage}{Unknown option `#2' of family `#1' defined}% + |com(Unknown options will be defined automatically here with the) + |com(indicated code:) + |R(define/.code=) + \def\x##1{##1\relax `option #2 = value #3' in family `#1'}% + |R(/.end) + |com(The following will be executed for each unknown option of the) + |com(given family, but will not be a `callback' for unknown options:) + \PackageWarningNoLine{mypackage}{Unknown option `#2' of family + `#1' defined on the fly}% } \finish{example} -If no default family handler has been provided by the user (through the macro \XDecS or \fx{\XUnknownOptionHandler}) for an undeclared option, and the option doesn't appear in the list \fx{\ExternalOptions}, then that option will be logged (\ie, entered in the transcript file) as undefined at the end of the document. By default, \fx{\ExternalOptions} contains all \hhx'{article,report,memoir} class options. The user can update the \fx{\ExternalOptions} list by means of the following commands: +If no default family handler has been provided by the user (through the macro \xdecs or \fx{\XUnknownOptionHandler}) for the family of an undeclared option, and the option doesn't appear in the list \fx{\XExternalOptions}, then that option will be logged (\ie, entered in the transcript file) as undefined at the end of the document. By default, \fx{\XExternalOptions} contains all \hhx'{article,report,memoir} class options. The user can update the \fx{\XExternalOptions} list by means of the following commands: \start+{newmacro}[\AddToExternalOptions,\RemoveFromExternalOptions] \AddToExternalOptions{|nang(opts)} \RemoveFromExternalOptions{|nang(opts)} \finish{newmacro} -\fxim*{\ExternalOptions,\AddToExternalOptions,\RemoveFromExternalOptions} +\fxim*{\XExternalOptions,\AddToExternalOptions,\RemoveFromExternalOptions} where \ang{opts} are the comma-separated option names to be added to, or removed from, the list. +\Note Unknown options that appear in \fx{\XExternalOptions} list will not have their \ang{fn1}, \ang{fn2} and \ang{callback} of the default family handler (see \macref{mac:handler}) executed unless they contain one of the commands \hhx'{\PassOptionsToClass, \PassOptionsToPackage}. + \start{newmacro}[\XDeclareOptions] \XDeclareOptions<|nang(fam)>{|nang(opts)}[|nang(default)]{|nang(fn)} \finish{newmacro} @@ -397,6 +420,7 @@ The command \fx{\XDeclareCommandOption} will, apart from declaring the option \a 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{opts}. Each option in the list \ang{opts} is defined with the same family \ang{fam}, default value \ang{default}, and function \ang{fn}. + \start{newmacro}[\XDeclareBooleanOption] \XDeclareBooleanOption<|nang(fam)>{|nang(opt)}[|nang(default)]|(|nang(pref)|){|nang(fn)} \finish{newmacro} @@ -411,6 +435,7 @@ The command \fx{\XDeclareBooleanOption} will, apart from declaring the option \a 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{opts}. Again, each option in the list \ang{opts} is defined with the same family \ang{fam}, default value \ang{default}, and function \ang{fn}. + \start{newmacro}[\XDeclareBiBooleanOptions] \XDeclareBiBooleanOptions<|A(fam)>{|A(opt1),|A(opt2)}[|A(default)]|(|A(pref)|){|A(fn1)}{|A(fn2)} \finish{newmacro} @@ -418,6 +443,7 @@ The command \fx{\XDeclareBooleanOptions} is similar to \fx{\XDeclareBooleanOptio 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(fams)>{|nang(opts)}[|nang(na)] \finish{newmacro} @@ -425,7 +451,7 @@ The command \fx{\XDeclareBiBooleanOptions} declares the two options \ang{opt1} a The re-entrant \fx{\XExecuteOptions} macro sets options created by \fx{\XDeclareOption} and is basically a means of setting up the default values of the options. The optional argument \ang{fams} can be used to specify a list of \emph{families} that define the options. When the argument is not used, the macro will insert the default family name (\fx{\@currname.\@currext}). The set \ang{na} is the list of keys to be ignored (\ie, not executed if they appear in \ang{opts}). -This macro will not use the declaration done by \XDecS when undeclared options appear in its argument. Instead, in this case the macro will issue a warning and ignore the option. This differs from the behavior of \latex's \hx{\ExecuteOptions}. +This macro will not use the declaration done by \xdecs when undeclared options appear in its argument. Instead, in this case the macro will issue a warning and ignore the option. This differs from the behavior of \latex's \hx{\ExecuteOptions}. \start{example}[\XExecuteOptions] \XExecuteOptions{leftmargin=0pt} @@ -487,9 +513,7 @@ The implementation here differs significantly from the \latex kernel's scheme of }% } \XDeclareInvalidOption<testclass>{deadoption} -\XDeclareOption|*<testclass>{% - define/.code=\PassOptionsToClass\CurrentOption{article}% -} +\XDeclareOption|*<testclass>{\PassOptionsToClass\CurrentOption{article}} \XExecuteOptions<testclass>{boola,boolb} \XProcessOptions|*<testclass>\relax \LoadClass{article} @@ -519,6 +543,7 @@ The implementation here differs significantly from the \latex kernel's scheme of \end{document} \finish{example} + \start{newmacro}[\ifoptdefTF] \ifoptdefTF<|nang(fams)>{|nang(opt)}{|nang(true)}{|nang(false)} \ifoptdefFT<|nang(fams)>{|nang(opt)}{|nang(false)}{|nang(true)} @@ -536,7 +561,7 @@ The macro \fx{\ifoptdefTF} returns \ang{true} if option \ang{opt} is undefined i The command \fx{\XDisableOptions} disables all the options in the list \ang{opts} that can be found in the families \ang{fams}, \ie, it makes the options invalid thereafter. If any of the options in the list \ang{opts} can't be found in the families \ang{fams}, it is simply ignored without warning: since families can be mixed in \ang{fams}, it wouldn't be meaningful issuing several warnings in this case. -The \stform of \fx{\XDisableOptions} delays the invalidation of the \ang{opts} until the invocation of \hx{\AtBeginDocument}. This may be used to bar users of the options from committing the options after the start of document, but not before. +The \stform of \fx{\XDisableOptions} delays the invalidation of the \ang{opts} until the invocation of \hx{\begin{document}}. This may be used to bar users of the options from committing the options after the start of document, but not before. \start{newmacro}[\ifoptdisabled] \ifoptdisabledTF<|nang(fams)>{|nang(opt)}{|nang(true)}{|nang(false)} @@ -546,17 +571,18 @@ The \stform of \fx{\XDisableOptions} delays the invalidation of the \ang{opts} u The macro \fx{\ifoptdisabledTF} returns \ang{true} if option \ang{opt} has been disabled from one or more members of \ang{fams}, and \ang{false} otherwise. The command \fx{\ifoptdisabledFT} reverses the logic of \fx{\ifoptdisabledTF}. + \start{newmacro}[\XLogDisabledOptions] \XLogDisabledOptions<|nang(fams)> \finish{newmacro} \fxim*{\XLogDisabledOptions} -The command \fx{\XLogDisabledOptions}, which can be called before and after begin-document, writes in the current transcript file the options of the families \ang{fams} that have been disabled so far. If no options have been disabled from any of the given families or if the given family does not exist, a message is logged to that effect. +The command \fx{\XLogDisabledOptions}, which can be called before and after \hx{\begin{document}}, writes in the current transcript file the options of the families \ang{fams} that have been disabled so far. If no options have been disabled from any of the given families or if the given family does not exist, a message is logged to that effect. \docsection(sec:normalize)<Normalizing lists>{Normalizing csv and kv lists} -Any arbitrary parser-separated-values list can be normalized by means of package the command \fx{\csv@@normalize} before processing the list. +Any arbitrary parser-separated-values list can be normalized by means of the package command \fx{\csv@@normalize} before processing the list. \start{newmacro}[\csv@@normalize] \csv@@normalize[|nang(parser)]{|nang(list)} @@ -564,7 +590,7 @@ Any arbitrary parser-separated-values list can be normalized by means of package \finish{newmacro} \fxim*{\csv@@normalize} -Here, \ang{list}, which is populated by parser-separated elements, is not expanded before normalization; \ang{listcmd}, on the other hand, is expanded once before normalization. The default value of the optional \ang{parser} is~\qcomma (comma). \quoted{Normalization} implies changing the category codes of all the active parsers to their standard values, as well as trimming leading and trailing spaces around the elements of the list and removing consecutive multiple parsers. Thus empty entries that are not enforced by curly braces are removed. The result (\ie, normalized list) is available in the macro \fx{\normalized@csvlist} (in the \unstform case) or \ang{listcmd} (in the \stform case). +Here, \ang{list}, which is populated by parser-separated elements, is not expanded before normalization; \ang{listcmd}, on the other hand, is expanded once before normalization. The default value of the optional \ang{parser} is \qcomma. \quoted{Normalization} implies changing the category codes of all the active parsers to their standard values, as well as trimming leading and trailing spaces around the elements of the list and removing consecutive multiple parsers. Thus empty entries that are not enforced by curly braces are removed. The result (\ie, normalized list) is available in the macro \fx{\normalized@list} (in the \unstform case) or \ang{listcmd} (in the \stform case). \start{example}[\csv@@normalize] \begingroup @@ -582,7 +608,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-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}. +The command \fx{\kv@@normalize} normalizes a list of key-value pairs, returning the result in the macro \fx{\normalized@list} (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 @@ -596,21 +622,23 @@ The command \fx{\kv@@normalize} normalizes a list of key-value pairs, returning \finish{example} -\docsection(csv-kv-parse)<Parsing lists>{Parsing csv and kv lists} +\docsection(sec:csvkvparse)<Parsing lists>{Parsing csv and kv lists} \start+{newmacro}[\csv@@loop,\csv@@parse,\kv@@parse] \csv@@loop[|nang(parser)][|nang(list)] \csv@@loop|*[|nang(parser)][|nang(listcmd)] \csv@@parse[|nang(parser)][|nang(list)] \csv@@parse|*[|nang(parser)][|nang(listcmd)] +\kv@@loop[|nang(parser)][|nang(list)] +\kv@@loop*[|nang(parser)][|nang(listcmd)] \kv@@parse[|nang(parser)][|nang(list)] \kv@@parse|*[|nang(parser)][|nang(listcmd)] \finish{newmacro} -\fxim*{\csv@@parse,\kv@@parse,\csv@@loop} +\fxim*{\csv@@parse,\kv@@parse,\csv@@loop,\kv@@loop} The macros \ffx'{\csv@@parse,\kv@@parse} (and their \stform+) call \ffx'{\csv@@normalize, \kv@@normalize}, respectively. On the other hand, the macro \fx{\csv@@loop} and its \stform don't call \fx{\csv@@normalize} (since not every list will require normalization). This is the only difference between \fx{\csv@@loop} and \fx{\csv@@parse}. The macros \fx{\csv@@loop} and \fx{\csv@@parse} are meant for general csv-list processing with an arbitrary parser, while the command \fx{\kv@@parse} is designed for processing key-value lists. These macros loop over a given \ang{parser}-separated \ang{list} and execute the user-defined, one-parameter commands \ffx'{\csv@do,\kv@do}, respectively, for every item in the list, passing the item as an argument and preserving outer braces. -The commands \ffx'{\csv@@loop,\csv@@parse,\kv@@parse} aren't expandable. White spaces before and after the list separator are always ignored. If an item contains \ang{parser} or starts with a space, it must be wrapped in curly braces. The braces will persist thereafter, but will of course be removed during printing (if the items are printed). The default value of \ang{parser} is comma (\qcomma). +The commands \ffx'{\csv@@loop,\csv@@parse,\kv@@parse} aren't expandable. White spaces before and after the list separator are always ignored. If an item contains \ang{parser} or starts with a space, it must be wrapped in curly braces. The braces will persist thereafter, but will of course be removed during printing (if the items are printed). The default value of \ang{parser} is \qcomma. The starred variants of \ffx'{\csv@@parse,\kv@@parse} expand \ang{listcmd} once before commencing the loop. @@ -631,16 +659,16 @@ Empty entries in \ang{list} or \ang{listcmd} will be processed if the boolean \f |com(\show\x@ii) \def\xa{a,b,c} -\def\xb{x,y,z} +\def\xb{x;y;z} \def\csv@do#1{% \pushnumber\nra \csn@edef{arg@\romannumeral\nra}{#1}% - \let\nrb\z@ + \chardef\nrb\z@ \def\csv@do##1{% \pushnumber\nrb \csn@edef{arg@\romannumeral\nra @\romannumeral\nrb}{#1,##1}% }% - \csv@@parse*\xb + \csv@@parse*[;]\xb } \csv@@parse*\xa \finish{example} @@ -667,7 +695,7 @@ fi \finish{example} -\docsection(tsv-parse)<Iterating tokenwise>{Parsing \headq{tsv} lists} +\docsection(sec:tsvparse)<Iterating tokenwise>{Parsing \headq{tsv} lists} \start+{newmacro}[\tsv@@parse,\tsv@@loop] \tsv@@loop[|nang(list)] @@ -679,27 +707,48 @@ fi The macros \ffx'{\tsv@@loop,\tsv@@parse} loop over \quoted{non-separated} tokens (tsv-list), picking each token as an argument and applying the one-parameter, user-supplied, function \fx{\tsv@do} to it while preserving outer braces in the item. The macros \ffx'{\tsv@@loop, \tsv@@parse} are meant for general tsv-list processing. -The macros \ffx'{\tsv@@loop,\tsv@@parse} (and their \stform+) of course don't call \fx{\csv@@normalize} or \fx{\kv@@normalize}, but instead they trim leading and trailing spaces of individual tokens/entries. The only difference between \fx{\tsv@@loop} and \fx{\tsv@@parse} is that the former calls \fx{\normal@despace}, while the latter calls \fx{\robust@despace}. The function \fx{\robust@despace} trims all leading and trailing spaces (including chains of implicit spaces) around its argument, while \fx{\normal@despace} trims only one leading and one trailing space around its argument. Both \ffx'{\normal@despace,\robust@despace} preserve outer braces around their arguments. The expandable form of \fx{\normal@despace} is \fx{\xp@despace}. +The macros \ffx'{\tsv@@loop,\tsv@@parse} (and their \stform+) of course don't call \fx{\csv@@normalize} or \fx{\kv@@normalize}, but instead they trim leading and trailing spaces of individual tokens/entries. The only difference between \fx{\tsv@@loop} and \fx{\tsv@@parse} is that the former calls \fxi{\cpttrimspace}, while the latter calls \fx{\cpttrimspaces}. The expandable function \fxi{\cpttrimspaces} trims all leading and trailing spaces (including chains of implicit spaces) around its argument, while \fx{\cpttrimspace} trims only one leading and one trailing space around its argument. Both \ffx'{\cpttrimspace,\cpttrimspaces} preserve outer braces around their arguments, are expandable, and leave the trimmed token unchanged from its original form. The latter requirement is a condition of Michael Downes. The starred variants of \ffx'{\tsv@@loop,\tsv@@parse} expand \ang{listcmd} once before commencing the loop. Empty entries in \ang{list} or \ang{listcmd} will be processed if the boolean \fx{@useempty} is true. You may thus issue the command \fx{\UseEmptyEntry} or \fx{\DiscardEmptyEntry} before commencing the iteration. Both commands \ffx'{\tsv@@loop,\tsv@@parse} can be nested to any level and can be mixed. +\start+{example}[\tsv@@loop,\tsv@@parse] +\newcount\m +\newcount\n +\def\tsv@do#1{% + \advance\m\@ne\n\z@ + \def\tsv@do##1{% + \advance\n\@ne + \csn@edef{w@\romannumeral\m @\romannumeral\n}{#1,##1}% + }% + \tsv@@loop{ x {y} z }% +} +\tsv@@loop{ a {b} {c} } +\finish{example} + \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.4}{2011/07/04} + \item Changes to command \fxi{\cptonlypreamble}. \secref* + \end{version} + \begin{version}{0.2c}{2011/06/08} + \item Modified syntax for the handler of unknown options. \secref{sec:options-parse} + \end{version} + \begin{version}{0.2b}{2011/04/02} \item The following commands have been introduced \secref{sec:options-parse} \start{veritem} \XDeclareInvalidOptions \XUnknownOptionHandler \XDisableOptions \XLogDisabledOptions \ifoptdisabledTF \ifoptdefTF \finish{veritem} - \end{version} - \begin{version}{0.2}{2011/02/15} + + \begin{version}{0.2a}{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} @@ -715,8 +764,8 @@ The following change history highlights significant changes that affect user uti \end{versionhist} \newpage -\indexpreamble{Index numbers refer to page numbers.} \indexpreambleformat{\centering} +\indexpreamble{Index numbers refer to page numbers.} \indexcolumns\tw@ \printindex |