diff options
Diffstat (limited to 'macros/latex/contrib/oberdiek/kvoptions.dtx')
-rw-r--r-- | macros/latex/contrib/oberdiek/kvoptions.dtx | 3385 |
1 files changed, 0 insertions, 3385 deletions
diff --git a/macros/latex/contrib/oberdiek/kvoptions.dtx b/macros/latex/contrib/oberdiek/kvoptions.dtx deleted file mode 100644 index f79bbc0909..0000000000 --- a/macros/latex/contrib/oberdiek/kvoptions.dtx +++ /dev/null @@ -1,3385 +0,0 @@ -% \iffalse meta-comment -% -% File: kvoptions.dtx -% Version: 2016/05/16 v3.12 -% Info: Key value format for package options -% -% Copyright (C) 2004, 2006, 2007, 2009-2011 by -% Heiko Oberdiek <heiko.oberdiek at googlemail.com> -% 2016 -% https://github.com/ho-tex/oberdiek/issues -% -% This work may be distributed and/or modified under the -% conditions of the LaTeX Project Public License, either -% version 1.3c of this license or (at your option) any later -% version. This version of this license is in -% https://www.latex-project.org/lppl/lppl-1-3c.txt -% and the latest version of this license is in -% https://www.latex-project.org/lppl.txt -% and version 1.3 or later is part of all distributions of -% LaTeX version 2005/12/01 or later. -% -% This work has the LPPL maintenance status "maintained". -% -% The Current Maintainers of this work are -% Heiko Oberdiek and the Oberdiek Package Support Group -% https://github.com/ho-tex/oberdiek/issues -% -% This work consists of the main source file kvoptions.dtx -% and the derived files -% kvoptions.sty, kvoptions.pdf, kvoptions.ins, kvoptions.drv, -% kvoptions-patch.sty, example-mycolorsetup.sty, -% kvoptions-test1.tex, kvoptions-test2.tex, -% kvoptions-test3.tex, kvoptions-test4.tex, -% kvoptions-test4.sty. -% -% Distribution: -% CTAN:macros/latex/contrib/oberdiek/kvoptions.dtx -% CTAN:macros/latex/contrib/oberdiek/kvoptions.pdf -% -% Unpacking: -% (a) If kvoptions.ins is present: -% tex kvoptions.ins -% (b) Without kvoptions.ins: -% tex kvoptions.dtx -% (c) If you insist on using LaTeX -% latex \let\install=y\input{kvoptions.dtx} -% (quote the arguments according to the demands of your shell) -% -% Documentation: -% (a) If kvoptions.drv is present: -% latex kvoptions.drv -% (b) Without kvoptions.drv: -% latex kvoptions.dtx; ... -% The class ltxdoc loads the configuration file ltxdoc.cfg -% if available. Here you can specify further options, e.g. -% use A4 as paper format: -% \PassOptionsToClass{a4paper}{article} -% -% Programm calls to get the documentation (example): -% pdflatex kvoptions.dtx -% makeindex -s gind.ist kvoptions.idx -% pdflatex kvoptions.dtx -% makeindex -s gind.ist kvoptions.idx -% pdflatex kvoptions.dtx -% -% Installation: -% TDS:tex/latex/oberdiek/kvoptions.sty -% TDS:tex/latex/oberdiek/kvoptions-patch.sty -% TDS:doc/latex/oberdiek/kvoptions.pdf -% TDS:doc/latex/oberdiek/example-mycolorsetup.sty -% TDS:doc/latex/oberdiek/test/kvoptions-test1.tex -% TDS:doc/latex/oberdiek/test/kvoptions-test2.tex -% TDS:doc/latex/oberdiek/test/kvoptions-test3.tex -% TDS:doc/latex/oberdiek/test/kvoptions-test4.tex -% TDS:doc/latex/oberdiek/test/kvoptions-test4.sty -% TDS:source/latex/oberdiek/kvoptions.dtx -% -%<*ignore> -\begingroup - \catcode123=1 % - \catcode125=2 % - \def\x{LaTeX2e}% -\expandafter\endgroup -\ifcase 0\ifx\install y1\fi\expandafter - \ifx\csname processbatchFile\endcsname\relax\else1\fi - \ifx\fmtname\x\else 1\fi\relax -\else\csname fi\endcsname -%</ignore> -%<*install> -\input docstrip.tex -\Msg{************************************************************************} -\Msg{* Installation} -\Msg{* Package: kvoptions 2016/05/16 v3.12 Key value format for package options (HO)} -\Msg{************************************************************************} - -\keepsilent -\askforoverwritefalse - -\let\MetaPrefix\relax -\preamble - -This is a generated file. - -Project: kvoptions -Version: 2016/05/16 v3.12 - -Copyright (C) 2004, 2006, 2007, 2009-2011 by - Heiko Oberdiek <heiko.oberdiek at googlemail.com> - -This work may be distributed and/or modified under the -conditions of the LaTeX Project Public License, either -version 1.3c of this license or (at your option) any later -version. This version of this license is in - https://www.latex-project.org/lppl/lppl-1-3c.txt -and the latest version of this license is in - https://www.latex-project.org/lppl.txt -and version 1.3 or later is part of all distributions of -LaTeX version 2005/12/01 or later. - -This work has the LPPL maintenance status "maintained". - -The Current Maintainers of this work are -Heiko Oberdiek and the Oberdiek Package Support Group -https://github.com/ho-tex/oberdiek/issues - - -This work consists of the main source file kvoptions.dtx -and the derived files - kvoptions.sty, kvoptions.pdf, kvoptions.ins, kvoptions.drv, - kvoptions-patch.sty, example-mycolorsetup.sty, - kvoptions-test1.tex, kvoptions-test2.tex, - kvoptions-test3.tex, kvoptions-test4.tex, - kvoptions-test4.sty. - -\endpreamble -\let\MetaPrefix\DoubleperCent - -\generate{% - \file{kvoptions.ins}{\from{kvoptions.dtx}{install}}% - \file{kvoptions.drv}{\from{kvoptions.dtx}{driver}}% - \usedir{tex/latex/oberdiek}% - \file{kvoptions.sty}{\from{kvoptions.dtx}{package}}% - \file{kvoptions-patch.sty}{\from{kvoptions.dtx}{patch}}% - \usedir{doc/latex/oberdiek}% - \file{example-mycolorsetup.sty}{\from{kvoptions.dtx}{example}}% -% \usedir{doc/latex/oberdiek/test}% -% \file{kvoptions-test1.tex}{\from{kvoptions.dtx}{test1}}% -% \file{kvoptions-test2.tex}{\from{kvoptions.dtx}{test2}}% -% \file{kvoptions-test3.tex}{\from{kvoptions.dtx}{test3}}% -% \file{kvoptions-test4.tex}{\from{kvoptions.dtx}{test4}}% -% \file{kvoptions-test4.sty}{\from{kvoptions.dtx}{test4pkg}}% - \nopreamble - \nopostamble -% \usedir{source/latex/oberdiek/catalogue}% -% \file{kvoptions.xml}{\from{kvoptions.dtx}{catalogue}}% -} - -\catcode32=13\relax% active space -\let =\space% -\Msg{************************************************************************} -\Msg{*} -\Msg{* To finish the installation you have to move the following} -\Msg{* files into a directory searched by TeX:} -\Msg{*} -\Msg{* kvoptions.sty, kvoptions-patch.sty} -\Msg{*} -\Msg{* To produce the documentation run the file `kvoptions.drv'} -\Msg{* through LaTeX.} -\Msg{*} -\Msg{* Happy TeXing!} -\Msg{*} -\Msg{************************************************************************} - -\endbatchfile -%</install> -%<*ignore> -\fi -%</ignore> -%<*driver> -\NeedsTeXFormat{LaTeX2e} -\ProvidesFile{kvoptions.drv}% - [2016/05/16 v3.12 Key value format for package options (HO)]% -\documentclass{ltxdoc} -\usepackage{holtxdoc}[2011/11/22] -\begin{document} - \DocInput{kvoptions.dtx}% -\end{document} -%</driver> -% \fi -% -% -% \CharacterTable -% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z -% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z -% Digits \0\1\2\3\4\5\6\7\8\9 -% Exclamation \! Double quote \" Hash (number) \# -% Dollar \$ Percent \% Ampersand \& -% Acute accent \' Left paren \( Right paren \) -% Asterisk \* Plus \+ Comma \, -% Minus \- Point \. Solidus \/ -% Colon \: Semicolon \; Less than \< -% Equals \= Greater than \> Question mark \? -% Commercial at \@ Left bracket \[ Backslash \\ -% Right bracket \] Circumflex \^ Underscore \_ -% Grave accent \` Left brace \{ Vertical bar \| -% Right brace \} Tilde \~} -% -% \GetFileInfo{kvoptions.drv} -% -% \title{The \xpackage{kvoptions} package} -% \date{2016/05/16 v3.12} -% \author{Heiko Oberdiek\thanks -% {Please report any issues at \url{https://github.com/ho-tex/oberdiek/issues}}} -% -% \maketitle -% -% \begin{abstract} -% This package is intended for package authors who want to -% use options in key value format for their package options. -% \end{abstract} -% -% \tableofcontents -% -% \def\M#1{\texttt{\{}\meta{#1}\texttt{\}}} -% \def\O#1{\texttt{[}\meta{#1}\texttt{]}} -% -% \section{Introduction} -% -% First I want to recommend the very good review article -% ``A guide to key-value methods'' by Joseph Wright \cite{tb94wright}. -% It introduces the different key-value packages and compares them. -% -% \subsection{The beginning} -% -% This package \xpackage{kvoptions} addresses class or package writers -% that want to allow their users to specify options -% as key value pairs, e.g.: -% \begin{quote} -% |\documentclass[verbose=false,name=me]{myclass}|\\ -% |\usepackage[format=print]{mylayout}| -% \end{quote} -% Prominent example is package \xpackage{hyperref}, -% probably the first package that offers this service. -% It's \cs{ProcessOptionsWithKV} is often copied und -% used in other packages, e.g. package \xpackage{helvet} -% that uses this interface for its option \xoption{scaled}. -% -% However copying code is not the most modern software -% development technique. And \xpackage{hyperref}'s -% code for \cs{ProcessOptionsWithKV} was changed -% to fix bugs. The version used in other packages -% depends on the time of copying and the awareness -% of \xpackage{hyperref}'s changes. -% Now the code is sourced out into this package and -% available for other package or class writers. -% -% \subsection{Overview} -% -% Package \xpackage{kvoptions} connects package -% \xpackage{\emph{k}ey\emph{v}al} -% with \LaTeX's package and class \emph{options}: -% \begin{center} -% \def\T#1{\bfseries #1} -% \renewcommand{\arraystretch}{1.5} -% \begin{tabular}{l|l|l} -% \T{Package \xpackage{keyval}} -% & \T{Package \xpackage{kvoptions}} -% & \T{\LaTeX\ kernel} -% \\ -% \hline -% \cs{define@key} -% & -% \renewcommand*{\arraystretch}{1}^^A -% \begin{tabular}[t]{@{}l@{}} -% \cs{DeclareVoidOption}\\ -% \cs{DeclareStringOption}\\ -% \cs{DeclareBoolOption}\\ -% \cs{DeclareComplementaryOption}\\ -% \cs{DisableKeyvalOption} -% \end{tabular} -% & \cs{DeclareOption} -% \\ -% \hline -% & \cs{DeclareDefaultOption} -% & \cs{DeclareOption*} -% \\ -% \hline -% & \cs{ProcessKeyvalOptions} -% & \cs{ProcessOptions*} -% \\ -% \hline -% & Option \xoption{patch} -% & -% \renewcommand*{\arraystretch}{1}^^A -% \begin{tabular}[t]{@{}l@{}} -% Class/package\\ -% option system -% \end{tabular} -% \\ -% \hline -% & \cs{SetupKeyvalOptions} & -% \\ -% \end{tabular} -% \end{center} -% -% \hypersetup{bookmarksopenlevel=3} -% \section{Usage} -% -% \subsection{Process options} -% -% \subsubsection{\cs{ProcessKeyvalOptions}} -% -% \begin{declcs}{ProcessKeyvalOptions}\,\M{family}\\ -% \cs{ProcessKeyvalOptions} \* -% \end{declcs} -% This command evaluates the global or local options of -% the package that are defined with \xpackage{keyval}'s -% interface within the family \meta{family}. It acts the -% same way as \LaTeX's \cs{ProcessOptions*}. In a package -% unknown global options are ignored, in a class they -% are added to the unknown option list. The known global -% options and all local options are passed to \xpackage{keyval}'s -% \cs{setkeys} command for executing the options. -% Unknown options are reported to the user by an error. -% -% If the family name happens to be the same as the name -% of the package or class where \cs{ProcessKeyvalOptions} -% is used or the family name has previously been setup by -% \cs{SetupKeyvalOptions}, then \cs{ProcessKeyvalOptions} -% knows the family name already and you can use the star form -% without mandatory argument. -% -% \subsubsection{\cs{ProcessLocalKeyvalOptions}} -% -% \begin{declcs}{ProcessLocalKeyvalOptions}\,\M{family}\\ -% \cs{ProcessLocalKeyvalOptions} \* -% \end{declcs} -% This macro has the same syntax and works similar as -% \cs{ProcessKeyvalOptions}. However it ignores -% global options and only processes the local package options. -% Therefore it only can be used inside a package. -% An error is thrown, if it is used inside a class. -% -% Neither of the following macros are necessary for -% \cs{ProcessKeyvalOptions{}}. They just help the package/class -% author in common tasks. -% -% \subsubsection{\cs{SetupKeyvalOptions}}\label{setup} -% -% \begin{declcs}{SetupKeyvalOptions}\,\texttt{\{}\\ -% \hspace{1.5em}|family|\,|=|\,\meta{family}|,|\\ -% \hspace{1.5em}|prefix|\,|=|\,\meta{prefix}\\ -% \hspace{1.5em}|setkeys|\,|=|\,\meta{setkeys command}\\ -% \texttt{\}} -% \end{declcs} -% This command allows to configure the default assumptions -% that are based on the current package or class name. -% \LaTeX\ remembers this name in \cs{@currname}. The syntax -% description of the default looks a little weird, therefor -% an example is given for a package or class named |foobar|. -% \begin{quote} -% \begin{tabular}{@{}l|ll|l@{}} -% Key & Default & (example) & Used by\\ -% \hline -% \rule{0pt}{1.2\ht\csname @arstrutbox\endcsname}^^A -% |family| & \meta{\cs{@currname}} & (|foobar|) -% & \cs{ProcessKeyvalOptions*} \\ -% &&& \cs{DeclareBoolOption} \\ -% &&& \cs{DeclareStringOption} \\ -% \hline -% \rule{0pt}{1.2\ht\csname @arstrutbox\endcsname}^^A -% |prefix| & \meta{\cs{@currname}}|@| & (|foobar@|) -% & \cs{DeclareBoolOption} \\ -% &&& \cs{DeclareStringOption} \\ -% &&& \cs{DeclareVoidOption} \\ -% \hline -% \rule{0pt}{1.2\ht\csname @arstrutbox\endcsname}^^A -% |setkeys| & \cs{setkeys} & (\cs{kvsetkeys}) -% & \cs{ProcessKeyvalOptions} \\ -% &&& \cs{ProcessLocalKeyvalOptions} -% \end{tabular} -% \end{quote} -% Key |setkeys| was added in version 3.9. The original -% \cs{setkeys} of package \xpackage{keyval} is not reentrant. -% If an option is processed by this \cs{setkeys}, then -% the option should not call \cs{setkeys} again with a -% different family. Otherwise the next options of the -% first \cs{setkeys} call are processed with the wrong -% family. With key |setkeys| the macro \cs{kvsetkeys} -% can be set that does not have the problem of the -% original \cs{setkeys} of package {keyval}. -% -% Probably \cs{setkeys} of package \xpackage{xkeyval} -% is safe in this respect. But I haven't made a full -% analysis. At least it does not have the problem -% of the original \cs{setkeys}. -% -% \subsection{Option declarations} -% -% The options for \cs{ProcessKeyvalOptions} are defined -% by \xpackage{keyval}'s \cs{define@key}. -% Common purposes of such keys are boolean switches, they -% enable or disable something. Or they store a name or some kind of -% string in a macro. The following commands help the user. He -% declares what he wants and \xpackage{kvoptions} take care of -% the key definition, resource allocation and initialization. -% -% In order to avoid name clashes of macro names, internal -% commands are prefixed. Both the prefix and the family -% name for the defined keys can be configured by -% \cs{SetupKeyvalOptions}. -% -% \subsubsection{\cs{DeclareStringOption}} -% -% \begin{declcs}{DeclareStringOption}\,\O{init}\,\M{key}\,\O{default} -% \end{declcs} -% A macro is created that remembers the value of the key \meta{key}. -% The name of the macro consists of the option name \meta{key} that -% is prefixed by the prefix (see \ref{setup}). -% The initial contents of the -% macro can be given by the first optional argument \meta{init}. -% The default is empty. -% -% The the option \meta{key} is defined. The option code -% just stores its value in the macro. If the optional argument -% at the end of \cs{DeclareStringOption} is given, then option -% \meta{key} is defined with the default \meta{default}. -% -% Example for a package with the following two lines: -% \begin{quote} -% |\ProvidesPackage{foobar}|\\ -% |\DeclareStringOption[me]{name}| -% \end{quote} -% Then \cs{DeclareStringOption} defines the macro with content |me|, -% note \LaTeX\ complains if the name of the macro already exists: -% \begin{quote} -% |\newcommand*{\foobar@name}{me}| -% \end{quote} -% The option definition is similar to: -% \begin{quote} -% |\define@key{foobar}{name}{%|\\ -% | \renewcommand*{\foobar@name}{#1}%|\\ -% |}| -% \end{quote} -% -% \subsubsection{\cs{DeclareBoolOption}} -% -% \begin{declcs}{DeclareBoolOption}\,\O{init}\,\M{key} -% \end{declcs} -% A boolean switch is generated, initialized by value \meta{init} -% and the corresponding key \meta{key} is defined. If the -% initialization value is not given, |false| is used as default. -% -% The internal actions of \cs{DeclareBoolOption} are shown below. -% The example is given for a package author who has the following -% two lines in his package/class: -% \begin{quote} -% |\ProvidesPackage{foobar}|\\ -% |\DeclareBoolOption{verbose}| -% \end{quote} -% First a new switch is created: -% \begin{quote} -% |\newif\iffoobar@verbose| -% \end{quote} -% and initialized: -% \begin{quote} -% |\foobar@verbosefalse| -% \end{quote} -% Finally the key is defined: -% \begin{quote} -% |\define@key{foobar}{verbose}[true]{|\dots|}| -% \end{quote} -% The option code configures the boolean option in the following way: -% If the author specifies |true| or |false| then the switch is -% turned on or off respectivly. Also the option can be given without -% explicit value. Then the switch is enabled. -% Other values are reported as errors. -% -% Now the switch is ready to use in the package/class, e.g.: -% \begin{quote} -% |\iffoobar@verbose|\\ -% \qquad\textit{\% print verbose message}\\ -% |\else|\\ -% \qquad\textit{\% be quiet}\\ -% |\fi| -% \end{quote} -% Users of package \cs{ifthen} can use the switch as -% boolean: -% \begin{quote} -% |\boolean{foobar@verbose}| -% \end{quote} -% -% \subsubsection{\cs{DeclareComplementaryOption}} -% -% \begin{declcs}{DeclareComplementaryOption}\,\M{key}\,\M{parent} -% \end{declcs} -% Sometimes contrasting names are used to characterize the -% two states of a boolean switch, for example \xoption{draft} -% vs.\@ \xoption{final}. Both options behave like boolean -% options but they do not need two different switches, they -% should share one. \cs{DeclareComplementaryOption} allows this. -% The option \meta{key} shares the switch of option \meta{parent}. -% Example: -% \begin{quote} -% |\DeclareBoolOption{draft}|\\ -% |\DeclareComplementaryOption{final}{draft}| -% \end{quote} -% Then |final| sets the switch of \xoption{draft} to |false|, and -% |final=false| enables the \xoption{draft} switch. -% -% \subsubsection{\cs{DeclareVoidOption}} -% -% \begin{declcs}{DeclareVoidOption}\,\M{key}\,\M{code} -% \end{declcs} -% \cs{ProcessKeyvalOptions} can be extended to recognize -% options that are declared in traditional way by \cs{DeclareOption}. -% But in case of the error that the user specifies a value, then -% this option would not recognized as key value option because -% of \cs{DeclareOption} and not detected as traditional option -% because of the value part. The user would get an unknown option -% error, difficult to understand. -% -% \cs{DeclareVoidOption} solves -% this problem. It defines the option \meta{key} as key value option. -% If the user specifies a value, a warning is given and the -% value is ignored. -% -% The code part \meta{code} is stored in a macro. -% The name of the macro consists of the option name \meta{key} that -% is prefixed by the prefix (see \ref{setup}). -% If the option is set, the macro will be executed. During the -% execution \cs{CurrentOption} is available with the current key name. -% -% \subsubsection{\cs{DeclareDefaultOption}} -% -% \begin{declcs}{DeclareDefaultOption}\,\M{code} -% \end{declcs} -% \begin{sloppypar} -% This command does not define a specific key, it is the equivalent -% to \LaTeX's \cs{DeclareOption*}. It allows the specification -% of a default action \meta{code} that is invoked if an unknown option -% is found. -% While \meta{code} is called, -% macro \cs{CurrentOption} contains the current option string. -% In addition \cs{CurrentOptionValue} contains the value part -% if the option string is parsable as key value pair, otherwise -% it is \cs{relax}. \cs{CurrentOptionKey} contains the key of -% the key value pair, or the whole option string, if it misses -% the equal sign. -% \end{sloppypar} -% -% Inside packages typical default actions are to pass unknown -% options to another package. Or an error message can be thrown -% by \cs{@unknownoptionerror}. This is the original error -% message that \LaTeX\ gives for unkown package options. -% This error message is easier to understand for the user -% as the error message from package \xpackage{keyval} that -% is given otherwise. -% -% A Class ignores unknown options and puts them on the -% unused option list. Let \LaTeX\ do the job and just -% call \cs{OptionNotUsed}. Or the options can be passed to -% another class that is later loaded. -% -% \subsubsection{Local options} -% -% \begin{declcs}{DeclareLocalOption} \M{option}\\ -% \cs{DeclareLocalOptions} \M{option list} -% \end{declcs} -% Both macros mark package options as local options. That means -% that they are ignored by \cs{ProcessKeyvalOptions} if they are given -% as global options. \cs{DeclareLocalOptions} takes one option, -% \cs{DeclareLocalOptions} expects a comma separated list of options. -% -% \subsubsection{Dynamic options} -% -% Options of \LaTeX's package/class system are cleared -% in \cs{ProcessOptions}. They modify the static model -% of a package. For example, depending on option \xoption{bookmarks} -% package \xpackage{hyperref} loads differently. -% -% Options, however, -% defined by \xpackage{keyval}'s \cs{define@key} remain -% defined, if the options are processed by \cs{setkeys}. -% Therefore these options can also be used to model -% the dynamic behaviour of a package. For example, in -% \xpackage{hyperref} the link colors can be changed -% everywhere until the end in |\end{document}|. -% -% However package \xpackage{color} that adds color support -% is necessary and it -% cannot be loaded after |\begin{document}|. Option \xoption{colorlinks} -% that loads \xpackage{color} should be active until |\begin{document}| -% and die in some way if it is too late for loading packages. -% With \cs{DisableKeyvalOption} the package/class author can -% specify and configure the death of an option and controls -% the life period of the option. -% -% \subsubsection{\cs{DisableKeyvalOption}} -% -% \begin{declcs}{DisableKeyvalOption}\,\O{options}\,\M{family}\,\M{key} -% \\[0.5ex] -% \meta{options}:\\ -% \hspace{1.5em}^^A -% \begin{tabular}[t]{@{}l@{ \texttt{=} }l@{\qquad}>{default: }l@{}} -% |action| & |undef|, |warning|, |error|, or |ignore| -% & |undef| -% \\ -% \multicolumn{1}{@{}l}{|global| or |local|} & & |global| -% \\ -% |package| or |class| & \meta{name} -% \\ -% \end{tabular}^^A -% \end{declcs} -% \cs{DisableKeyvalOption} can be called to mark the end when -% the option \meta{key} is no longer useful. The behaviour of -% an option after its death can be configured by \xoption{action}: -% \begin{description} -% \item[\texttt{undef}:] The option will be undefined, -% If it is called, \cs{setkeys} reports an error because -% of unknown key. -% \item[\texttt{error} or \texttt{warning}:] Use of the -% option will cause an error or warning message. -% Also these actions require that exclusivly either the -% package or class name is given in options \xoption{package} -% or \xoption{class}. -% \item[\texttt{ignore}:] The use of the option will silently -% be ignored. -% \end{description} -% The option's death can be limited to the end of the current -% group, if option \xoption{local} is given. Default is -% \xoption{global}. -% -% The package/class author can wish the end of the option -% already during the package loading, then he will have -% static behaviour. In case of dynamic options \cs{DisableKeyvalOption} -% can be executed everywhere, also outside the package. Therefore -% the family name and the package/class name is usually unknown for -% \cs{DisableKeyvalOption}. Therefore the argument for the family -% name is mandatory and for some actions the package/class name -% must be provided. -% -% Usually a macro would configure the option death, Example: -%\begin{quote} -%\begin{verbatim} -%\ProvidesPackage{foobar} -%\DeclareBoolOption{color} -%\DeclareStringOption[red]{emphcolor} -%\ProcessKeyvalOptions* -% -%\newcommand*{\foobar@DisableOption}[2]{% -% \DisableKeyvalueOption[ -% action={#1}, -% package=foobar -% ]{foobar}{#2}% -%} -% -%\iffoobar@color -% \RequirePackage{color} -% \renewcommand*{\emph}[1]{\textcolor{\foobar@emphcolor}{#1}} -%\else -% % Option emphcolor is not wrong, if we have color support. -% % otherwise the option has no effect, but we don't want to -% % remove it. Therefore action 'ignore' is the best choice: -% \foobar@DisableOption{ignore}{emphcolor} -%\fi -%% No we don't need the option 'color'. -%\foobar@DisableOption{warning}{color} -% -%% With color support option 'emphcolor' will dynamically -%% change the color of \emph statements. -%\end{verbatim} -%\end{quote} -% -% \subsubsection{\cs{AddToKeyvalOption}} -% -% \begin{declcs}{AddToKeyvalOption}\,\M{family}\,\M{key}\,\M{code}\\ -% \cs{AddToKeyvalOption} \*\,\M{key}\,\M{code} -% \end{declcs} -% The code for an existing key \meta{key} of family \meta{family} is -% extended by code \meta{code}. In the starred form the current -% family setting is used, see \cs{ProcessKeyvalOptions*}. -% -% \subsection{Global vs. local options} -% -% Options that are given for \cs{documentclass} are called -% global options. They are known to the class and all packages. -% A package may make use of a global option and marks it as -% used. The advantage for the user is the freedom to specify -% options both in the \cs{documentclass} or \cs{usepackage} -% commands. -% -% However global options are shared with the class options -% and options of all other packages. Thus there can be the -% same option with different semantics for different -% packages and classes. As example, package \xpackage{bookmark} -% knows option \xoption{open} that specifies whether the bookmarks -% are opened or closed initially. It's values are |true| or |false|. -% Since KOMA-Script version 3.00 the KOMA classes also introduces -% option \xoption{open} with values |right| and |any| and a -% complete different meaning. -% -% Such conflicts can be resolved by marking all or part of options -% as local by \cs{DeclareLocalOption} or \cs{DeclareLocalOptions}. -% Then the packages ignores global occurences of these options. -% Package \xpackage{kvoptions} provides two methods: -% \begin{itemize} -% \item \cs{ProcessLocalKeyvalOptions} automatically uses all options -% as local options. It ignores all global options. -% \item \cs{DeclareLocalOption} or \cs{DeclareLocalOptions} marks -% options as local options. \cs{ProcessKeyvalOptions} will then -% ignore global occurences for these local options. -% \end{itemize} -% Since version 1.5 package \xpackage{bookmark} uses the latter -% method. It checks global and local option places for driver options -% and limits all other options as local options. Thus the class -% option \xoption{open} of KOMA-Script is not misread as -% option for package \xpackage{bookmark}. -% -% \subsection{Summary of internal macros} -% -% The \cs{Declare}\texttt{\dots Option} commands define -% macros, additionally to the macros generated by the key definition. -% These macros can be used by the package/class author. -% The name of the macros starts with the prefix \meta{prefix} -% that can be configured by \cs{SetupKeyvalOptions}. -% \begin{center} -% \def\prefix{\cs{}\meta{prefix}\meta{key}}^^A -% \def\Hline{^^A -% \hline -% \rule{0pt}{1.2\ht\csname @arstrutbox\endcsname}^^A -% }^^A -% \begin{tabular}{@{}l|>{\ttfamily}l|l@{}} -% Declare \meta{key} & \textrm{Defined macro} & Description\\ -% \Hline -% \cs{DeclareStringOption} -% & \prefix & holds the string\\ -% \Hline -% \cs{DeclareBoolOption} -% & \cs{if}\meta{prefix}\meta{key}& boolean switch\\ -% &\prefix false& disable switch\\ -% &\prefix true& enable switch\\ -% \Hline -% \cs{DeclareComplementaryOption} -% & \prefix false& enable parent switch\\ -% & \prefix true& disable parent switch\\ -% \Hline -% \cs{DeclareVoidOption} -% & \prefix & holds the action -% \end{tabular} -% \end{center} -% -% \subsection{\plainTeX} -% -% Package \xpackage{keyval} is also usable in \plainTeX\ with -% the help of file \xfile{miniltx.tex}. Some features of this -% package \xpackage{kvoptions} might also be useful for \plainTeX. -% If \LaTeX\ is not found, \cs{ProcessKeyvalOptions} and option -% \xoption{patch} are disabled. Before using the option declaration -% commands \cs{Declare...Option}, \cs{SetupKeyvalOptions} must be -% used. -% -% \hypersetup{bookmarksopenlevel=1} -% -% \section{Example} -% -% The following example defined a package that serves some -% private color management. A boolean option \xoption{print} enables -% print mode without colors. An option \xoption{emph} redefines -% \cs{emph} to print in the given color. And the driver -% can be specified by option \xoption{driver}. -% -% \begin{macrocode} -%<*example> - % Package identification - % ----------------------- -\NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{example-mycolorsetup}[2016/05/16 Managing my colors] - -\RequirePackage{ifpdf} -\RequirePackage{kvoptions} - - % Option declarations - % ------------------- - -\SetupKeyvalOptions{ - family=MCS, - prefix=MCS@ -} - % Use a shorter family name and prefix - - % Option print -\DeclareBoolOption{print} - % is the same as - % \DeclareBoolOption[false]{print} - - % Option driver -\ifpdf - \DeclareStringOption[pdftex]{driver} -\else - \DeclareStringOption[dvips]{driver} -\fi - - % Alternative interface for driver options -\DeclareVoidOption{dvips}{\SetupDriver} -\DeclareVoidOption{dvipdfm}{\SetupDriver} -\DeclareVoidOption{pdftex}{\SetupDriver} - % In \SetupDriver we take the current option \CurrentOption - % and pass it to the driver option. - % The \expandafter commands expand \CurrentOption at the - % time, when \SetupDriver is executed and \CurrentOption - % has the correct meaning. -\newcommand*{\SetupDriver}{% - \expandafter\@SetupDriver\expandafter{\CurrentOption}% -} -\newcommand*{\@SetupDriver}[1]{% - \setkeys{MCS}{driver={#1}}% -} - - % Option emph - % An empty value means, we want to have no color for \emph. - % If the user specifies option emph without value, the red is used. -\DeclareStringOption{emph}[red] - % is the same as - % \DeclareStringOption[]{emph}[red] - - % Default option rule -\DeclareDefaultOption{% - \ifx\CurrentOptionValue\relax - \PackageWarningNoLine{\@currname}{% - Unknown option `\CurrentOption'\MessageBreak - is passed to package `color'% - }% - % Pass the option to package color. - % Again it is better to expand \CurrentOption. - \expandafter\PassOptionsToPackage - \expandafter{\CurrentOption}{color}% - \else - % Package color does not take options with values. - % We provide the standard LaTeX error. - \@unknownoptionerror - \fi -} - - % Process options - % --------------- -\ProcessKeyvalOptions* - - % Implementation depending on option values - % ----------------------------------------- - % Code for print mode -\ifMCS@print - \PassOptionsToPackage{monochrome}{color} - % tells package color to use black and white -\fi - -\RequirePackage[\MCS@driver]{color} - % load package color with the correct driver - - % \emph setup -\ifx\MCS@emph\@empty - % \@empty is a predefined macro with empty contents. - % the option value of option emph is empty, thus - % we do not want a redefinition of \emph. -\else - \renewcommand*{\emph}[1]{% - \textcolor{\MCS@emph}{#1}% - } -\fi -%</example> -% \end{macrocode} -% -% \section{Package options} -% -% The package \xpackage{kvoptions} knows two package options -% \xoption{patch} and \xoption{debugshow}. -% The options of package \xpackage{kvoptions} are intended -% for authors, not for package/class writers. Inside a package -% it is too late for option \xoption{patch} and \xoption{debugshow} -% enables some messages that are perhaps useful for the debugging -% phase. Also \LaTeX\ is unhappy if a package is loaded -% later again with options that are previously not given. -% Thus package and class authors, stay with |\RequirePackage{kvoptions}| -% without options. -% -% Option \xoption{patch} loads package \xpackage{kvoptions-patch}. -% -% \subsection{Package \xpackage{kvoptions-patch}} -% -% \LaTeX's system of package/class options has some severe limitations -% that especially affects the value part if options are used as -% pair of key and value. -% \begin{itemize} -% \item Spaces are removed, regardless where: -% \begin{quote} -% |\documentclass[box=0 0 400 600]{article}| -% \end{quote} -% Now each package will see |box=00400600| as global option. -% \item In the previous case also braces would not help: -% \begin{quote} -% |\documentclass[box={0 0 400 600}]{article}| -% \end{quote} -% The result is an error message: -% \begin{quote} -% |! LaTeX Error: Missing \begin{document}.| -% \end{quote} -% As local option, however, it works if the package -% knows about key value options (By using this package, for example). -% \item The requirements on robustness are extremly high. -% \LaTeX\ expands the option. All that will not work as environment -% name will break also as option. Even a \cs{relax} will generate -% an error message: -% \begin{quote} -% |! Missing \endcsname inserted.| -% \end{quote} -% Of course, \LaTeX\ does not use its protecting mechanisms. -% On contrary \cs{protect} itself will cause errors. -% \item The options are expanded. But perhaps the package will -% do that, because it has to setup some things before? -% Example \xpackage{hyperref}: -% \begin{quote} -% |\usepackage[pdfauthor=M\"uller]{hyperref}| -% \end{quote} -% Package \xpackage{hyperref} does not see |M\"uller| but -% its expansion and it does not like it, you get many warnings -% \begin{quote} -% |Token not allowed in a PDFDocEncoded string| -% \end{quote} -% And the title becomes: |Mu127uller|. -% Therefore such options must usually be given after package -% \xpackage{hyperref} -% is loaded: -% \begin{quote} -% |\usepackage{hyperref}|\\ -% |\hypersetup{pdfauthor=Fran\c coise M\"uller}| -% \end{quote} -% As package option it will even break with |Fran\c coise| -% because of the cedilla |\c c|, it is not robust enough. -% \end{itemize} -% For users that do not want with this limitations the package -% offers package \xoption{kvoptions-patch}. It patches \LaTeX's option system -% and tries to teach it also to handle options that are given -% as pairs of key and value and to prevent expansion. -% It can already be used at the very beginning, before \cs{documentclass}: -% \begin{quote} -% |\RequirePackage{kvoptions-patch}|\\ -% |\documentclass[pdfauthor=Fran\c coise M\"uller]{article}|\\ -% |\usepackage{hyperref}| -% \end{quote} -% The latest time is before the package where you want to use -% problematic values: -% \begin{quote} -% |\usepackage{kvoptions-patch}|\\ -% |\usepackage[Fran\c coise M\"uller]{hyperref}| -% \end{quote} -% Some remarks: -% \begin{itemize} -% \item The patch requires \eTeX, its \cs{unexpanded} feature -% is much too nice. It is possible to work around using token -% registers. But the code becomes longer, slower, more difficult -% to read and maintain. The package without option \xoption{patch} -% works and will work without \eTeX. -% \item The code for the patch is quite long, there are many test -% cases. Thus the probability for bugs is probably not too small. -% \item Since 2008/10/18 v3.0 package \xpackage{kvoptions-patch} is -% available. Before option \xoption{patch} of package \xpackage{kvoptions} -% must be used instead. I think, the solution as standalone package -% \xpackage{kvoptions-patch} is cleaner and avoids option clashes. -% \end{itemize} -% -% \subsection{Option \xoption{debugshow}} -% -% The name of this option follows the convention of packages -% \xpackage{multicol}, \xpackage{tabularx}, and \xpackage{tracefnt}. -% Currently it prints the setting of boolean options, declared -% by \cs{DeclareBoolOption} in the \xfile{.log} file, if that -% boolean option is used. -% You can activate the option by -% \begin{itemize} -% \item |\PassOptionsToPackage{debugshow}{kvoptions}|\\ -% Put this somewhere before package \xpackage{kvoptions} is -% loaded first, e.g. before \cs{documentclass}. -% \item |\RequirePackage[debugshow]{kvoptions}|\\ -% Before \cs{documentclass} even an author has to use -% \cs{RequirePackage}. \cs{usepackage} only works after -% \cs{documentclass}. -% \end{itemize} -% The preferred method is \cs{PassOptionsToPackage}, because -% it does not force the package loading and does not disturb, -% if the package is not loaded later at all. -% -% \section{Limitations} -% -% \subsection{Compatibility} -% \subsubsection{Package \xpackage{kvoptions-patch} vs. package \xpackage{xkvltxp}} -% -% Package \xpackage{xkvltxp} from the \xpackage{xkeyval} project -% has the same goal as package \xpackage{kvoptions-patch} -% and to patch \LaTeX's kernel commands in order to get better support -% for key value options. -% Of course they cannot be used both. The user must decide, which -% method he prefers. Package \xpackage{kvoptions-patch} aborts itself, -% if it detects that \xpackage{xkvltxp} is -% already loaded. -% -% However package \xpackage{xkvltxp} and \xpackage{kvoptions} -% can be used together, example: -% \begin{quote} -% |\usepackage{xkvltxp}|\\ -% |\usepackage[...]{foobar} % |\texttt{\itshape foobar using kvoptions} -% \end{quote} -% The other way should work, too. -% -% Package \xpackage{kvoptions-patch} tries to catch more situations -% and to be more robust. -% For example, during the comparison of options it normalizes -% them by removing spaces around |=| and the value. Thus the -% following is not reported as option clash: -% \begin{quote} -%\begin{verbatim} -%\RequirePackage{kvoptions-patch} -%\documentclass{article} -% -%\usepackage[scaled=0.7]{helvet} -%\usepackage[scaled = 0.7]{helvet} -% -%\begin{document} -%\end{document} -%\end{verbatim} -% \end{quote} -% -% \subsection{Limitations} -% -% \subsubsection{Option comparisons} -% -% In some situations \LaTeX\ compares option lists, e.g. option clash check, -% \cs{@ifpackagewith}, or \cs{@ifclasswith}. Apart from catcode and -% sanitizing problems of option \xoption{patch}, there is another problem. -% \LaTeX\ does not know about the type and default values of -% options in key value style. Thus an option clash is reported, -% even if the key value has the same meaning: -% \begin{quote} -% |\usepackage[scaled]{helvet} %| \texttt{\textit{default is }.95}\\ -% |\usepackage[.95]{helvet}|\\ -% |\usepackage[0.95]{helvet}| -% \end{quote} -% -% \subsubsection{Option list parsing with package \xpackage{kvoptions-patch}} -% -% With package \xpackage{kvoptions-patch} the range of possible values -% in key value specifications is much large, for example -% the comma can be used, if enclosed in curly braces. -% -% Other packages, especially the packages that uses their -% own process option code can be surprised to find tokens -% inside options that they do not expect and errors would -% be the consequence. To avoid errors the options, especially -% the unused option list is sanitized. That means the list -% will only contain tokens with catcode 12 (other) and -% perhaps spaces (catcode 10). This allows a safe parsing -% for other packages. But a comma in the value part is -% no longer protected by curly braces because they have lost -% their special meaning. This is the price for compatibility. -% -% Example: -% \begin{quote} -% |\RequirePackage{kvoptions-patch}|\\ -% |\documentclass[a={a,b,c},b]{article}|\\ -% |\begin{document}|\\ -% |\end{document}| -% \end{quote} -% Result: -% \begin{quote} -% |LaTeX Warning: Unused global option(s):|\\ -% | [a={a,c},b].| -% \end{quote} -% -% \StopEventually{ -% } -% -% \section{Implementation} -% -% \subsection{Preamble} -% -% \begin{macrocode} -%<*package> -% \end{macrocode} -% -% \paragraph{Reload check and identification.} -% Reload check, especially if the package is not used with \LaTeX. -% \begin{macrocode} -\begingroup\catcode61\catcode48\catcode32=10\relax% - \catcode13=5 % ^^M - \endlinechar=13 % - \catcode35=6 % # - \catcode39=12 % ' - \catcode44=12 % , - \catcode45=12 % - - \catcode46=12 % . - \catcode58=12 % : - \catcode64=11 % @ - \catcode123=1 % { - \catcode125=2 % } - \expandafter\let\expandafter\x\csname ver@kvoptions.sty\endcsname - \ifx\x\relax % plain-TeX, first loading - \else - \def\empty{}% - \ifx\x\empty % LaTeX, first loading, - % variable is initialized, but \ProvidesPackage not yet seen - \else - \expandafter\ifx\csname PackageInfo\endcsname\relax - \def\x#1#2{% - \immediate\write-1{Package #1 Info: #2.}% - }% - \else - \def\x#1#2{\PackageInfo{#1}{#2, stopped}}% - \fi - \x{kvoptions}{The package is already loaded}% - \aftergroup\endinput - \fi - \fi -\endgroup% -% \end{macrocode} -% Package identification: -% \begin{macrocode} -\begingroup\catcode61\catcode48\catcode32=10\relax% - \catcode13=5 % ^^M - \endlinechar=13 % - \catcode35=6 % # - \catcode39=12 % ' - \catcode40=12 % ( - \catcode41=12 % ) - \catcode44=12 % , - \catcode45=12 % - - \catcode46=12 % . - \catcode47=12 % / - \catcode58=12 % : - \catcode64=11 % @ - \catcode91=12 % [ - \catcode93=12 % ] - \catcode123=1 % { - \catcode125=2 % } - \expandafter\ifx\csname ProvidesPackage\endcsname\relax - \def\x#1#2#3[#4]{\endgroup - \immediate\write-1{Package: #3 #4}% - \xdef#1{#4}% - }% - \else - \def\x#1#2[#3]{\endgroup - #2[{#3}]% - \ifx#1\@undefined - \xdef#1{#3}% - \fi - \ifx#1\relax - \xdef#1{#3}% - \fi - }% - \fi -\expandafter\x\csname ver@kvoptions.sty\endcsname -\ProvidesPackage{kvoptions}% - [2016/05/16 v3.12 Key value format for package options (HO)]% -% \end{macrocode} -% -% \paragraph{Catcodes} -% -% \begin{macrocode} -\begingroup\catcode61\catcode48\catcode32=10\relax% - \catcode13=5 % ^^M - \endlinechar=13 % - \catcode123=1 % { - \catcode125=2 % } - \catcode64=11 % @ - \def\x{\endgroup - \expandafter\edef\csname KVO@AtEnd\endcsname{% - \endlinechar=\the\endlinechar\relax - \catcode13=\the\catcode13\relax - \catcode32=\the\catcode32\relax - \catcode35=\the\catcode35\relax - \catcode61=\the\catcode61\relax - \catcode64=\the\catcode64\relax - \catcode123=\the\catcode123\relax - \catcode125=\the\catcode125\relax - }% - }% -\x\catcode61\catcode48\catcode32=10\relax% -\catcode13=5 % ^^M -\endlinechar=13 % -\catcode35=6 % # -\catcode64=11 % @ -\catcode123=1 % { -\catcode125=2 % } -\def\TMP@EnsureCode#1#2{% - \edef\KVO@AtEnd{% - \KVO@AtEnd - \catcode#1=\the\catcode#1\relax - }% - \catcode#1=#2\relax -} -\TMP@EnsureCode{1}{14}% ^^A (comment) -\TMP@EnsureCode{2}{14}% ^^A (comment) -\TMP@EnsureCode{33}{12}% ! -\TMP@EnsureCode{39}{12}% ' -\TMP@EnsureCode{40}{12}% ( -\TMP@EnsureCode{41}{12}% ) -\TMP@EnsureCode{42}{12}% * -\TMP@EnsureCode{44}{12}% , -\TMP@EnsureCode{45}{12}% - -\TMP@EnsureCode{46}{12}% . -\TMP@EnsureCode{47}{12}% / -\TMP@EnsureCode{58}{12}% : -\TMP@EnsureCode{62}{12}% > -\TMP@EnsureCode{91}{12}% [ -\TMP@EnsureCode{93}{12}% ] -\TMP@EnsureCode{94}{7}% ^ (superscript) -\TMP@EnsureCode{96}{12}% ` -\edef\KVO@AtEnd{\KVO@AtEnd\noexpand\endinput} -% \end{macrocode} -% -% \paragraph{External resources.} -% The package extends the support for key value pairs of -% package \cs{keyval} to package options. Thus the package -% needs to be loaded anyway. and we use it for -% \cs{SetupKeyvalOptions}. AFAIK this does not disturb -% users of \xpackage{xkeyval}. -% \begin{macrocode} -\@ifundefined{define@key}{% - \RequirePackage{keyval}\relax -}{} -% \end{macrocode} -% -% Macro \cs{DeclareLocalOptions} parses a comma separated key list -% and uses \cs{comma@parse} of package \xpackage{kvsetkeys}, -% version 1.3. -% \begin{macrocode} -\RequirePackage{ltxcmds}[2010/12/02] -\RequirePackage{kvsetkeys}[2007/09/29] -% \end{macrocode} -% -% \paragraph{Provide macros for \plainTeX.} -% \begin{macrocode} -\@ifundefined{@x@protect}{% - \def\@x@protect#1\fi#2#3{% - \fi\protect#1% - }% - \let\@typeset@protect\relax -}{} -\@ifundefined{@currname}{% - \def\@currname{}% -}{} -\@ifundefined{@currext}{% - \def\@currext{}% -}{} -% \end{macrocode} -% -% \paragraph{Options} -% Option \xoption{debugshow} enables additional lines of -% code that prints information into the \xfile{.log} -% file. -% \begin{macrocode} -\DeclareOption{debugshow}{\catcode\@ne=9 } -% \end{macrocode} -% -% \begin{macrocode} -\DeclareOption{patch}{% - \AtEndOfPackage{% - \RequirePackage{kvoptions-patch}[2016/05/16]% - }% -} -% \end{macrocode} -% -% Optionen auswerten: -% \begin{macrocode} -\ProcessOptions\relax -% \end{macrocode} -% -% \subsection{Option declaration macros} -% -% \subsubsection{\cs{SetupKeyvalOptions}} -% -% The family for the key value pairs can be setup once -% and is remembered later. -% The package name seems a reasonable default for the -% family key, if it is not set by the package author. -% -% \begin{macro}{\KVO@family} -% We cannot store the family setting in one macro, -% because the package should be usable for many -% other packages, too. Thus we remember the family -% setting in a macro, whose name contains the -% package name with extension, a key in \LaTeX's -% class/package system. -% \begin{macrocode} -\define@key{KVO}{family}{% - \expandafter\edef\csname KVO@family@% - \@currname.\@currext\endcsname{#1}% -} -\def\KVO@family{% - \@ifundefined{KVO@family@\@currname.\@currext}{% - \@currname - }{% - \csname KVO@family@\@currname.\@currext\endcsname - }% -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\KVO@prefix} -% The value settings of options that are declared by \cs{DeclareBoolOption} -% and \cs{DeclareStringOption} need to be saved in macros. -% in the first case this is a switch \cs{if}\meta{prefix}\meta{key}, -% in the latter case a macro \cs{}\meta{prefix}\meta{key}. -% The prefix can be configured, by \xoption{prefix} that is declared -% here. The default is the package name with |@| appended. -% \begin{macrocode} -\define@key{KVO}{prefix}{% - \expandafter\edef\csname KVO@prefix@% - \@currname.\@currext\endcsname{#1}% -} -\def\KVO@prefix{% - \ltx@ifundefined{KVO@prefix@\@currname.\@currext}{% - \@currname @% - }{% - \csname KVO@prefix@\@currname.\@currext\endcsname - }% -} -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -\define@key{KVO}{setkeys}{% - \expandafter\def\csname KVO@setkeys@% - \@currname.\@currext\endcsname{#1}% -} -% \end{macrocode} -% \begin{macro}{\KVO@setkeys} -% \begin{macrocode} -\def\KVO@setkeys{% - \ltx@IfUndefined{KVO@setkeys@\@currname.\@currext}{% - \setkeys - }{% - \csname KVO@setkeys@\@currname.\@currext\endcsname - }% -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\SetupKeyvalOptions} -% The argument of \cs{SetupKeyvalOptions} expects a key value -% list, known keys are \xoption{family} and \xoption{prefix}. -% \begin{macrocode} -\newcommand*{\SetupKeyvalOptions}{% - \kvsetkeys{KVO}% -} -% \end{macrocode} -% \end{macro} -% -% \subsubsection{\cs{DeclareBoolOption}} -% -% \begin{macro}{\DeclareBoolOption} -% Usually options of boolean type can be given by the -% user without value and this means a setting to \emph{true}. -% We follow this convention here. Also it simplifies the -% user interface. -% -% The switch is created and initialized with \emph{false}. -% The default setting can be overwritten by the optional -% argument. -% -% \LaTeX's \cs{newif} does not check for already defined -% macros, therefore we add this check here to prevent -% the user from accidently redefining of \TeX's primitives -% and other macros. -% \begin{macrocode} -\newcommand*{\DeclareBoolOption}[2][false]{% - \KVO@ifdefinable{if\KVO@prefix#2}{% - \KVO@ifdefinable{\KVO@prefix#2true}{% - \KVO@ifdefinable{\KVO@prefix#2false}{% - \csname newif\expandafter\endcsname - \csname if\KVO@prefix#2\endcsname - \@ifundefined{\KVO@prefix#2#1}{% - \PackageWarning{kvoptions}{% - Initialization of option `#2' failed,\MessageBreak - cannot set boolean option to `#1',\MessageBreak - use `true' or `false', now using `false'% - }% - }{% - \csname\KVO@prefix#2#1\endcsname - }% - \begingroup - \edef\x{\endgroup - \noexpand\define@key{\KVO@family}{#2}[true]{% - \noexpand\KVO@boolkey{\@currname}% - \ifx\@currext\@clsextension - \noexpand\@clsextension - \else - \noexpand\@pkgextension - \fi - {\KVO@prefix}{#2}{####1}% - }% - }% - \x - }% - }% - }% -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\DeclareComplementaryOption} -% The first argument is the key name, the second the -% key that must be a boolean option with the same -% current family and prefix. A new switch is not -% created for the new key, we have already a switch. -% Instead we define switch setting commands to work -% on the parent switch. -% \begin{macrocode} -\newcommand*{\DeclareComplementaryOption}[2]{% - \@ifundefined{if\KVO@prefix#2}{% - \PackageError{kvoptions}{% - Cannot generate option code for `#1',\MessageBreak - parent switch `#2' does not exist% - }{% - You are inside % - \ifx\@currext\@clsextension class\else package\fi\space - `\@currname.\@currext'.\MessageBreak - `\KVO@family' is used as familiy % - for the keyval options.\MessageBreak - `\KVO@prefix' serves as prefix % - for internal switch macros.\MessageBreak - \MessageBreak - \@ehc - }% - }{% - \KVO@ifdefinable{\KVO@prefix#1true}{% - \KVO@ifdefinable{\KVO@prefix#1false}{% - \expandafter\let\csname\KVO@prefix#1false\expandafter\endcsname - \csname\KVO@prefix#2true\endcsname - \expandafter\let\csname\KVO@prefix#1true\expandafter\endcsname - \csname\KVO@prefix#2false\endcsname -% \end{macrocode} -% The same code part as in \cs{DeclareBoolOption} can -% now be used. -% \begin{macrocode} - \begingroup - \edef\x{\endgroup - \noexpand\define@key{\KVO@family}{#1}[true]{% - \noexpand\KVO@boolkey{\@currname}% - \ifx\@currext\@clsextension - \noexpand\@clsextension - \else - \noexpand\@pkgextension - \fi - {\KVO@prefix}{#1}{####1}% - }% - }% - \x - }% - }% - }% -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\KVO@ifdefinable} -% Generate the command token LaTeX's \cs{@ifdefinable} expects. -% \begin{macrocode} -\def\KVO@ifdefinable#1{% - \expandafter\@ifdefinable\csname #1\endcsname -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\KVO@boolkey} -% We check explicitly for |true| and |false| to prevent -% the user from accidently calling other macros. -% \begin{quote} -% \begin{tabular}{@{}ll@{}} -% |#1|& package/class name\\ -% |#2|& |\@pkgextension|/|\@clsextension|\\ -% |#3|& prefix \\ -% |#4|& key name\\ -% |#5|& new value -% \end{tabular} -% \end{quote} -% \begin{macrocode} -\def\KVO@boolkey#1#2#3#4#5{% - \edef\KVO@param{#5}% - \ltx@onelevel@sanitize\KVO@param - \ifx\KVO@param\KVO@true - \expandafter\@firstofone - \else - \ifx\KVO@param\KVO@false - \expandafter\expandafter\expandafter\@firstofone - \else - \ifx#2\@clsextension - \expandafter\ClassWarning - \else - \expandafter\PackageWarning - \fi - {#1}{% - Value `\KVO@param' is not supported by\MessageBreak - option `#4'% - }% - \expandafter\expandafter\expandafter\@gobble - \fi - \fi - {% - ^^A\ifx#2\@clsextension - ^^A \expandafter\ClassInfo - ^^A\else - ^^A \expandafter\PackageInfo - ^^A\fi - ^^A{#1}{[option] #4=\KVO@param}% - \csname#3#4\KVO@param\endcsname - }% -} -% \end{macrocode} -% \end{macro} -% \begin{macro}{\KVO@true} -% \begin{macro}{\KVO@false} -% The macros \cs{KVO@true} and \cs{KVO@false} are used -% for string comparisons. After \cs{ltx@onelevel@sanitize} -% we have only tokens with catcode 12 (other). -% \begin{macrocode} -\def\KVO@true{true} -\def\KVO@false{false} -\ltx@onelevel@sanitize\KVO@true -\ltx@onelevel@sanitize\KVO@false -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \subsubsection{\cs{DeclareStringOption}} -% -% \begin{macro}{\DeclareStringOption} -% \begin{macrocode} -\newcommand*{\DeclareStringOption}[2][]{% - \@ifnextchar[{% - \KVO@DeclareStringOption{#1}{#2}@% - }{% - \KVO@DeclareStringOption{#1}{#2}{}[]% - }% -} -% \end{macrocode} -% \end{macro} -% \begin{macro}{\KVO@DeclareStringOption} -% \begin{macrocode} -\def\KVO@DeclareStringOption#1#2#3[#4]{% - \KVO@ifdefinable{\KVO@prefix#2}{% - \@namedef{\KVO@prefix#2}{#1}% - \begingroup - \ifx\\#3\\% - \toks@{}% - \else - \toks@{[{#4}]}% - \fi - \edef\x{\endgroup - \noexpand\define@key{\KVO@family}{#2}\the\toks@{% - ^^A\begingroup - ^^A \toks@{####1}% - ^^A \ifx\@currext\@clsextension - ^^A \noexpand\ClassInfo - ^^A \else - ^^A \noexpand\PackageInfo - ^^A \fi - ^^A {\@currname}{% - ^^A [option] #2={\noexpand\the\toks@}% - ^^A }% - ^^A\endgroup - \noexpand\def - \expandafter\noexpand\csname\KVO@prefix#2\endcsname{####1}% - }% - }% - \x - }% -} -% \end{macrocode} -% \end{macro} -% -% \subsubsection{\cs{DeclareVoidOption}} -% -% \begin{macro}{\DeclareVoidOption} -% \begin{macrocode} -\newcommand*{\DeclareVoidOption}[2]{% - \begingroup - \let\next\@gobbletwo - \KVO@ifdefinable{\KVO@prefix#1}{% - \let\next\@firstofone - }% - \expandafter\endgroup - \next{% - \begingroup - \edef\x{\endgroup - \noexpand\define@key{\KVO@family}{#1}[\KVO@VOID@]{% - \noexpand\KVO@voidkey{\@currname}% - \ifx\@currext\@clsextension - \noexpand\@clsextension - \else - \noexpand\@pkgextension - \fi - {#1}% - {####1}% - \expandafter\noexpand\csname\KVO@prefix#1\endcsname - }% - }% - \x - \begingroup - \toks@{#2}% - \expandafter\endgroup - \expandafter\def - \csname\KVO@prefix#1\expandafter\endcsname - \expandafter{\the\toks@}% - }% -} -\def\KVO@VOID@{@VOID@} -% \end{macrocode} -% \end{macro} -% \begin{macro}{\KVO@voidkey} -% \begin{tabular}{@{}ll@{}} -% |#1|& package/class name\\ -% |#2|& |\@pkgextension|/|\@clsextension|\\ -% |#3|& key name\\ -% |#4|& default (|@VOID@|)\\ -% |#5|& macro with option code -% \end{tabular} -% \begin{macrocode} -\def\KVO@voidkey#1#2#3#4{% - \def\CurrentOption{#3}% - \begingroup - \def\x{#4}% - \expandafter\endgroup - \ifx\x\KVO@VOID@ - \else - \ifx#2\@clsextension - \expandafter\ClassWarning - \else - \expandafter\PackageWarning - \fi - {#1}{% - Unexpected value for option `#3'\MessageBreak - is ignored% - }% - \fi - ^^A\ifx#2\@clsextension - ^^A \expandafter\ClassInfo - ^^A\else - ^^A \expandafter\PackageInfo - ^^A\fi - ^^A{#1}{[option] #3}% -} -% \end{macrocode} -% \end{macro} -% -% \subsubsection{\cs{DeclareDefaultOption}} -% -% \begin{macro}{\DeclareDefaultOption} -% \begin{macrocode} -\newcommand*{\DeclareDefaultOption}{% - \@namedef{KVO@default@\@currname.\@currext}% -} -% \end{macrocode} -% \end{macro} -% -% \subsubsection{\cs{DeclareLocalOptions}} -% -% \begin{macro}{\DeclareLocalOptions} -% \begin{macrocode} -\newcommand*{\DeclareLocalOptions}[1]{% - \comma@parse{#1}\KVO@DeclareLocalOption -} -% \end{macrocode} -% \end{macro} -% \begin{macro}{\KVO@DeclareLocalOption} -% \begin{macrocode} -\def\KVO@DeclareLocalOption#1{% - \expandafter\def\csname KVO@local@\KVO@family @#1\endcsname{}% -} -% \end{macrocode} -% \end{macro} -% -% \subsection{Dynamic options} -% -% \subsubsection{\cs{DisableKeyvalOption}} -% -% \begin{macrocode} -\SetupKeyvalOptions{% - family=KVOdyn,% - prefix=KVOdyn@% -} -\DeclareBoolOption[true]{global} -\DeclareComplementaryOption{local}{global} -\DeclareStringOption[undef]{action} -\let\KVOdyn@name\relax -\let\KVOdyn@ext\@empty -\define@key{KVOdyn}{class}{% - \def\KVOdyn@name{#1}% - \let\KVOdyn@ext\@clsextension -} -\define@key{KVOdyn}{package}{% - \def\KVOdyn@name{#1}% - \let\KVOdyn@ext\@pkgextension -} -\newcommand*{\DisableKeyvalOption}[3][]{% - \begingroup - \kvsetkeys{KVOdyn}{#1}% - \def\x{\endgroup}% - \@ifundefined{KVO@action@\KVOdyn@action}{% - \PackageError{kvoptions}{% - Unknown disable action % - `\expandafter\strip@prefix\meaning\KVOdyn@action'\MessageBreak - for option `#3' in keyval family '#2'% - }\@ehc - }{% - \csname KVO@action@\KVOdyn@action\endcsname{#2}{#3}% - }% - \x -} -\def\KVO@action@undef#1#2{% - \edef\x{\endgroup - \ifKVOdyn@global\global\fi - \let - \expandafter\noexpand\csname KV@#1@#2\endcsname - \relax - \ifKVOdyn@global\global\fi - \let - \expandafter\noexpand\csname KV@#1@#2@default\endcsname - \relax - }% - ^^A\PackageInfo{kvoptions}{% - ^^A [option] key `#2' of family `#1'\MessageBreak - ^^A is disabled (undef, \ifKVOdyn@global global\else local\fi)% - ^^A}% -} -\def\KVO@action@ignore#1#2{% - \edef\x{\endgroup - \ifKVOdyn@global\global\fi - \let - \expandafter\noexpand\csname KV@#1@#2\endcsname - \noexpand\@gobble - \ifKVOdyn@global\global\fi - \let - \expandafter\noexpand\csname KV@#1@#2@default\endcsname - \noexpand\@empty - }% - ^^A\PackageInfo{kvoptions}{% - ^^A [option] key `#2' of family `#1'\MessageBreak - ^^A is disabled (ignore, \ifKVOdyn@global global\else local\fi)% - ^^A}% -} -\def\KVO@action@error{% - \KVO@do@action{error}% -} -\def\KVO@action@warning{% - \KVO@do@action{warning}% -} -% \end{macrocode} -% \begin{tabular}{@{}ll@{}} -% |#1|& |error| or |warning|\\ -% |#2|& \meta{family}\\ -% |#3|& \meta{key}\\ -% \end{tabular} -% \begin{macrocode} -\def\KVO@do@action#1#2#3{% - \ifx\KVOdyn@name\relax - \PackageError{kvoptions}{% - Action type `#1' needs package/class name\MessageBreak - for key `#3' in family `#2'% - }\@ehc - \else - \edef\x{\endgroup - \noexpand\define@key{#2}{#3}[]{% - \expandafter\noexpand\csname KVO@disable@#1\endcsname - {\KVOdyn@name}\noexpand\KVOdyn@ext{#3}% - }% - \ifKVOdyn@global - \global\let - \expandafter\noexpand\csname KV@#2@#3\endcsname - \expandafter\noexpand\csname KV@#2@#3\endcsname - \global\let - \expandafter\noexpand\csname KV@#2@#3@default\endcsname - \expandafter\noexpand\csname KV@#2@#3@default\endcsname - \fi - }% - ^^A\ifx\KVOdyn@ext\@clsextension - ^^A \expandafter\ClassInfo - ^^A\else - ^^A \expandafter\PackageInfo - ^^A\fi - ^^A{\KVOdyn@name}{% - ^^A [option] key `#3' of family `#2'\MessageBreak - ^^A is disabled (#1, \ifKVOdyn@global global\else local\fi)% - ^^A}% - \fi -} -\def\KVO@disable@error#1#2#3{% - \ifx#2\@clsextension - \expandafter\ClassError - \else - \expandafter\PackageError - \fi - {#1}{% - Option `#3' is given too late,\MessageBreak - now the option is ignored% - }\@ehc -} -\def\KVO@disable@warning#1#2#3{% - \ifx#2\@clsextension - \expandafter\ClassWarning - \else - \expandafter\PackageWarning - \fi - {#1}{% - Option `#3' is already consumed\MessageBreak - and has no effect% - }% -} -% \end{macrocode} -% -% \subsection{Change option code} -% -% \subsubsection{\cs{AddToKeyvalOption}} -% -% \begin{macro}{\AddToKeyvalOption} -% \begin{macrocode} -\newcommand*{\AddToKeyvalOption}{% - \@ifstar{% - \begingroup - \edef\x{\endgroup - \noexpand\KVO@AddToKeyvalOption{\KVO@family}% - }% - \x - }% - \KVO@AddToKeyvalOption -} -% \end{macrocode} -% \end{macro} -% \begin{macro}{\KVO@AddToKeyvalOption} -% \begin{macrocode} -\def\KVO@AddToKeyvalOption#1#2{% - \@ifundefined{KV@#1@#2}{% - \PackageWarning{kvoptions}{% - Key `#2' of family `#1' does not exist.\MessageBreak - Ignoring \string\AddToKeyvalOption - }% - \@gobble - }{% - \edef\KVO@next{% - \noexpand\KVO@@AddToKeyvalOption - \expandafter\noexpand\csname KV@#1@#2\endcsname - }% - \afterassignment\KVO@next - \def\KVO@temp##1% - }% -} -% \end{macrocode} -% \end{macro} -% \begin{macro}{\KVO@@AddToKeyvalOption} -% \begin{macrocode} -\def\KVO@@AddToKeyvalOption#1{% - \begingroup - \toks@\expandafter{#1{##1}}% - \toks@\expandafter{\the\expandafter\toks@\KVO@temp{##1}}% - \edef\x{\endgroup - \noexpand\def\noexpand#1####1{\the\toks@}% - }% - \x -} -% \end{macrocode} -% \end{macro} -% -% \subsection{Process options} -% -% \subsubsection{Get global options} -% -% Package \xpackage{xkeyval} removes options with equal signs from -% the global options (\cs{@classoptionslist}). The effect is that -% other packages and classes will not see these global options anymore. -% A bug-report was answered that this behaviour is ``by design''. -% Thus I call it a design bug. Now getting the global options require -% an algorithm instead of a simple macro call. -% \begin{macrocode} -%</package> -%<*package|patch> -% \end{macrocode} -% \begin{macro}{\KVO@IfDefThen} -% Call |#2| if command |#1| is defined and not \cs{relax}. -% (Package \xpackage{kvoptions-patch} does not load -% package \xpackage{ltxcmds}.) -% \begin{macrocode} -\def\KVO@IfDefThen#1#2{% - \ifx#1\ltx@undefined - \else - \ifx#1\relax - \else - #2% - \fi - \fi -}% -% \end{macrocode} -% \end{macro} -% \begin{macro}{\KVO@GetClassOptionsList} -% \begin{macrocode} -\def\KVO@GetClassOptionsList{% - \let\KVO@classoptionslist\@classoptionslist - \KVO@IfDefThen\@classoptionslist{% - \KVO@IfDefThen\XKV@documentclass{% - \ifx\XKV@documentclass\ltx@empty - \else - \KVO@IfDefThen\XKV@classoptionslist{% - \ifx\XKV@classoptionslist\ltx@empty - \else - \let\KVO@classoptionslist\XKV@classoptionslist - \fi - }% - \fi - }% - }% -}% -% \end{macrocode} -% \end{macro} -% \begin{macrocode} -%</package|patch> -%<*package> -% \end{macrocode} -% -% \subsubsection{\cs{ProcessKeyvalOptions}} -% -% \begin{macro}{\ProcessKeyvalOptions} -% If the optional star is given, we get the family -% name and expand it for safety. -% \begin{macrocode} -\newcommand*{\ProcessKeyvalOptions}{% - \@ifstar{% - \begingroup - \edef\x{\endgroup - \noexpand\KVO@ProcessKeyvalOptions{\KVO@family}% - }% - \x - }% - \KVO@ProcessKeyvalOptions -} -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -\def\KVO@ProcessKeyvalOptions#1{% - \let\@tempc\relax - \let\KVO@temp\@empty -% \end{macrocode} -% Add any global options that are known to KV to the start of -% the list being built in |\KVO@temp| and mark them used (by -% removing them from the unused option list). -% \begin{macrocode} - \ifx\@currext\@clsextension - \else - \KVO@GetClassOptionsList - \ifx\KVO@classoptionslist\relax - \else - \@for\KVO@CurrentOption:=\KVO@classoptionslist\do{% - \@ifundefined{KV@#1@\expandafter\KVO@getkey - \KVO@CurrentOption=\@nil}{% - }{% - \@ifundefined{KVO@local@#1@\expandafter\KVO@getkey - \KVO@CurrentOption=\@nil}{% - \ifx\KVO@Patch Y% - \edef\KVO@temp{% - \etex@unexpanded\expandafter{% - \KVO@temp - }% - ,% - \etex@unexpanded\expandafter{% - \KVO@CurrentOption - }% - ,% - }% - \ltx@onelevel@sanitize\KVO@CurrentOption - \else - \edef\KVO@temp{% - \KVO@temp - ,% - \KVO@CurrentOption - ,% - }% - \fi - \@expandtwoargs\@removeelement\KVO@CurrentOption - \@unusedoptionlist\@unusedoptionlist - }{}% - }% - }% - \fi - \fi -% \end{macrocode} -% Now stick the package options at the end of the list and wrap -% in a call to \cs{setkeys}. A class ignores unknown global -% options, we must remove them to prevent error messages -% from \cs{setkeys}. -% \begin{macrocode} - \begingroup - \toks\tw@{}% - \@ifundefined{opt@\@currname.\@currext}{% - \toks@\expandafter{\KVO@temp}% - }{% - \toks@\expandafter\expandafter\expandafter{% - \csname opt@\@currname.\@currext\endcsname - }% - \ifx\@currext\@clsextension - \edef\CurrentOption{\the\toks@}% - \toks@\expandafter{\KVO@temp}% - \@for\CurrentOption:=\CurrentOption\do{% - \@ifundefined{% - KV@#1@\expandafter\KVO@getkey\CurrentOption=\@nil - }{% -% \end{macrocode} -% A class puts not used options in the unused option list -% unless there is a default handler. -% \begin{macrocode} - \@ifundefined{KVO@default@\@currname.\@currext}{% - \ifx\KVO@Patch Y% - \ltx@onelevel@sanitize\CurrentOption - \fi - \ifx\@unusedoptionlist\@empty - \global\let\@unusedoptionlist\CurrentOption - \else - \expandafter\expandafter\expandafter\gdef - \expandafter\expandafter\expandafter\@unusedoptionlist - \expandafter\expandafter\expandafter{% - \expandafter\@unusedoptionlist - \expandafter,\CurrentOption - }% - \fi - }{% - \toks\tw@\expandafter{% - \the\toks\expandafter\tw@\expandafter,\CurrentOption - }% - }% - }{% - \toks@\expandafter{% - \the\expandafter\toks@\expandafter,\CurrentOption - }% - }% - }% - \else -% \end{macrocode} -% Without default action we pass all options to \cs{setkeys}. -% Otherwise we have to check which options are known. -% These are passed to \cs{setkeys}. For the others the default -% action is performed. -% \begin{macrocode} - \@ifundefined{KVO@default@\@currname.\@currext}{% - \toks@\expandafter\expandafter\expandafter{% - \expandafter\KVO@temp\the\toks@ - }% - }{% - \edef\CurrentOption{\the\toks@}% - \toks@\expandafter{\KVO@temp}% - \@for\CurrentOption:=\CurrentOption\do{% - \@ifundefined{% - KV@#1@\expandafter\KVO@getkey\CurrentOption=\@nil - }{% - \toks\tw@\expandafter{% - \the\toks\expandafter\tw@\expandafter,\CurrentOption - }% - }{% - \toks@\expandafter{% - \the\expandafter\toks@\expandafter,\CurrentOption - }% - }% - }% - }% - \fi - }% - \edef\KVO@temp{\endgroup - \noexpand\KVO@calldefault{\the\toks\tw@}% - \noexpand\KVO@setkeys{#1}{\the\toks@}% - }% - \KVO@temp -% \end{macrocode} -% Some cleanup of \cs{ProcessOptions}. -% \begin{macrocode} - \let\CurrentOption\@empty - \AtEndOfPackage{\let\@unprocessedoptions\relax}% -} -% \end{macrocode} -% -% \subsubsection{\cs{ProcessLocalKeyvalOptions}} -% -% \begin{macro}{\ProcessLocalKeyvalOptions} -% If the optional star is given, we get the family -% name and expand it for safety. -% \begin{macrocode} -\newcommand*{\ProcessLocalKeyvalOptions}{% - \@ifstar{% - \begingroup - \edef\x{\endgroup - \noexpand\KVO@ProcessLocalKeyvalOptions{\KVO@family}% - }% - \x - }% - \KVO@ProcessLocalKeyvalOptions -} -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -\def\KVO@ProcessLocalKeyvalOptions#1{% - \let\@tempc\relax - \let\KVO@temp\@empty -% \end{macrocode} -% Check if \cs{ProcessLocalKeyvalOptions} is called inside -% a package. -% \begin{macrocode} - \ifx\@currext\@pkgextension - \else - \PackageError{kvoptions}{% - \string\ProcessLocalKeyvalOptions\space is intended for packages only% - }\@ehc - \fi -% \end{macrocode} -% The package options are put into toks register \cs{toks@}. -% \begin{macrocode} - \begingroup - \toks\tw@{}% - \@ifundefined{opt@\@currname.\@currext}{% - \toks@\expandafter{\KVO@temp}% - }{% - \toks@\expandafter\expandafter\expandafter{% - \csname opt@\@currname.\@currext\endcsname - }% -% \end{macrocode} -% Without default action we pass all options to \cs{setkeys}. -% Otherwise we have to check which options are known. -% These are passed to \cs{setkeys}. For the others the default -% action is performed. -% \begin{macrocode} - \@ifundefined{KVO@default@\@currname.\@currext}{% - \toks@\expandafter\expandafter\expandafter{% - \expandafter\KVO@temp\the\toks@ - }% - }{% - \edef\CurrentOption{\the\toks@}% - \toks@\expandafter{\KVO@temp}% - \@for\CurrentOption:=\CurrentOption\do{% - \@ifundefined{% - KV@#1@\expandafter\KVO@getkey\CurrentOption=\@nil - }{% - \toks\tw@\expandafter{% - \the\toks\expandafter\tw@\expandafter,\CurrentOption - }% - }{% - \toks@\expandafter{% - \the\expandafter\toks@\expandafter,\CurrentOption - }% - }% - }% - }% - }% - \edef\KVO@temp{\endgroup - \noexpand\KVO@calldefault{\the\toks\tw@}% - \noexpand\KVO@setkeys{#1}{\the\toks@}% - }% - \KVO@temp -% \end{macrocode} -% Some cleanup of \cs{ProcessOptions}. -% \begin{macrocode} - \let\CurrentOption\@empty - \AtEndOfPackage{\let\@unprocessedoptions\relax}% -} -% \end{macrocode} -% -% \subsubsection{Helper macros} -% -% \begin{macro}{\KVO@getkey} -% Extract the key part of a key=value pair. -% \begin{macrocode} -\def\KVO@getkey#1=#2\@nil{#1} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\KVO@calldefault} -% \begin{macrocode} -\def\KVO@calldefault#1{% - \begingroup - \def\x{#1}% - \expandafter\endgroup - \ifx\x\@empty - \else - \@for\CurrentOption:=#1\do{% - \ifx\CurrentOption\@empty - \else - \expandafter\KVO@setcurrents\CurrentOption=\@nil - \@nameuse{KVO@default@\@currname.\@currext}% - \fi - }% - \fi -} -% \end{macrocode} -% \end{macro} -% \begin{macro}{\KVO@setcurrents} -% Extract the key part of a key=value pair. -% \begin{macrocode} -\def\KVO@setcurrents#1=#2\@nil{% - \def\CurrentOptionValue{#2}% - \ifx\CurrentOptionValue\@empty - \let\CurrentOptionKey\CurrentOption - \let\CurrentOptionValue\relax - \else - \edef\CurrentOptionKey{\zap@space#1 \@empty}% - \expandafter\KVO@setcurrentvalue\CurrentOption\@nil - \fi -} -% \end{macrocode} -% \end{macro} -% \begin{macro}{\KV@setcurrentvalue} -% Here the value part is parsed. Package \xpackage{keyval}'s -% \cs{KV@@sp@def} helps in removing spaces at the begin and -% end of the value. -% \begin{macrocode} -\def\KVO@setcurrentvalue#1=#2\@nil{% - \KV@@sp@def\CurrentOptionValue{#2}% -} -% \end{macrocode} -% \end{macro} -% -% \subsection{\plainTeX} -% -% Disable \LaTeX\ stuff. -% \begin{macrocode} -\begingroup\expandafter\expandafter\expandafter\endgroup -\expandafter\ifx\csname documentclass\endcsname\relax - \def\ProcessKeyvalOptions{% - \@ifstar{}\@gobble - }% -\fi -% \end{macrocode} -% -% \begin{macrocode} -\KVO@AtEnd% -%</package> -% \end{macrocode} -% -% \subsection{Package \xpackage{kvoptions-patch}} -% -% \begin{macrocode} -%<*patch> -\NeedsTeXFormat{LaTeX2e} -\begingroup\catcode61\catcode48\catcode32=10\relax% - \catcode13=5 % ^^M - \endlinechar=13 % - \catcode123=1 % { - \catcode125=2 % } - \catcode64=11 % @ - \def\x{\endgroup - \expandafter\edef\csname KVO@AtEnd\endcsname{% - \endlinechar=\the\endlinechar\relax - \catcode13=\the\catcode13\relax - \catcode32=\the\catcode32\relax - \catcode35=\the\catcode35\relax - \catcode61=\the\catcode61\relax - \catcode64=\the\catcode64\relax - \catcode123=\the\catcode123\relax - \catcode125=\the\catcode125\relax - }% - }% -\x\catcode61\catcode48\catcode32=10\relax% -\catcode13=5 % ^^M -\endlinechar=13 % -\catcode35=6 % # -\catcode64=11 % @ -\catcode123=1 % { -\catcode125=2 % } -\def\TMP@EnsureCode#1#2{% - \edef\KVO@AtEnd{% - \KVO@AtEnd - \catcode#1=\the\catcode#1\relax - }% - \catcode#1=#2\relax -} -\TMP@EnsureCode{39}{12}% ' -\TMP@EnsureCode{40}{12}% ( -\TMP@EnsureCode{41}{12}% ) -\TMP@EnsureCode{43}{12}% + -\TMP@EnsureCode{44}{12}% , -\TMP@EnsureCode{45}{12}% - -\TMP@EnsureCode{46}{12}% . -\TMP@EnsureCode{47}{12}% / -\TMP@EnsureCode{58}{12}% : -\TMP@EnsureCode{60}{12}% < -\TMP@EnsureCode{62}{12}% > -\TMP@EnsureCode{91}{12}% [ -\TMP@EnsureCode{93}{12}% ] -\TMP@EnsureCode{96}{12}% ` -\TMP@EnsureCode{124}{12}% | -\edef\KVO@AtEnd{\KVO@AtEnd\noexpand\endinput} -\ProvidesPackage{kvoptions-patch}% - [2016/05/16 v3.12 LaTeX patch for keyval options (HO)]% -% \end{macrocode} -% -% Check for \eTeX. -% \begin{macrocode} -\begingroup\expandafter\expandafter\expandafter\endgroup -\expandafter\ifx\csname eTeXversion\endcsname\relax - \PackageWarningNoLine{kvoptions-patch}{% - Package loading is aborted, because e-TeX is missing% - }% - \expandafter\KVO@AtEnd -\fi% -% \end{macrocode} -% -% Package \xpackage{etexcmds} for \cs{etex@unexpanded}. -% \begin{macrocode} -\RequirePackage{etexcmds}[2007/09/09] -\ifetex@unexpanded -\else - \PackageError{kvoptions-patch}{% - Could not find eTeX's \string\unexpanded.\MessageBreak - Try adding \string\RequirePackage\string{etexcmds\string} % - before \string\documentclass% - }\@ehd - \expandafter\KVO@AtEnd -\fi% -% \end{macrocode} -% -% Check for package \xpackage{xkvltxp}. -% \begin{macrocode} -\@ifpackageloaded{xkvltxp}{% - \PackageWarningNoLine{kvoptions}{% - Option `patch' cannot be used together with\MessageBreak - package `xkvltxp' that is already loaded.\MessageBreak - Therefore package loading is aborted% - }% - \KVO@AtEnd -}{}% -% \end{macrocode} -% -% \begin{macrocode} -\def\@if@ptions#1#2#3{% - \begingroup - \KVO@normalize\KVO@temp{#3}% - \edef\x{\endgroup - \noexpand\@if@pti@ns{% - \detokenize\expandafter\expandafter\expandafter{% - \csname opt@#2.#1\endcsname - }% - }{% - \detokenize\expandafter{\KVO@temp}% - }% - }% - \x -} -% \end{macrocode} -% -% \begin{macrocode} -\def\@pass@ptions#1#2#3{% - \KVO@normalize\KVO@temp{#2}% - \@ifundefined{opt@#3.#1}{% - \expandafter\gdef\csname opt@#3.#1% - \expandafter\endcsname\expandafter{% - \KVO@temp - }% - }{% - \expandafter\gdef\csname opt@#3.#1% - \expandafter\expandafter\expandafter\endcsname - \expandafter\expandafter\expandafter{% - \csname opt@#3.#1\expandafter\endcsname\expandafter,\KVO@temp - }% - }% -} -% \end{macrocode} -% -% \begin{macrocode} -\def\ProcessOptions{% - \let\ds@\@empty - \@ifundefined{opt@\@currname.\@currext}{% - \let\@curroptions\@empty - }{% - \expandafter\expandafter\expandafter\def - \expandafter\expandafter\expandafter\@curroptions - \expandafter\expandafter\expandafter{% - \csname opt@\@currname.\@currext\endcsname - }% - }% - \@ifstar\KVO@xprocess@ptions\KVO@process@ptions -} -% \end{macrocode} -% -% \begin{macrocode} -\def\KVO@process@ptions{% - \@for\CurrentOption:=\@declaredoptions\do{% - \ifx\CurrentOption\@empty - \else - \begingroup - \ifx\@currext\@clsextension - \toks@{}% - \else - \KVO@GetClassOptionsList - \toks@\expandafter{\KVO@classoptionslist,}% - \fi - \toks\tw@\expandafter{\@curroptions}% - \edef\x{\endgroup - \noexpand\in@{,\CurrentOption,}{,\the\toks@\the\toks\tw@,}% - }% - \x - \ifin@ - \KVO@use@ption - \expandafter\let\csname ds@\CurrentOption\endcsname\@empty - \fi - \fi - }% - \KVO@process@pti@ns -} -% \end{macrocode} -% -% \begin{macrocode} -\def\KVO@xprocess@ptions{% - \ifx\@currext\@clsextension - \else - \KVO@GetClassOptionsList - \@for\CurrentOption:=\KVO@classoptionslist\do{% - \ifx\CurrentOption\@empty - \else - \KVO@in@\CurrentOption\@declaredoptions - \ifin@ - \KVO@use@ption - \expandafter\let\csname ds@\CurrentOption\endcsname\@empty - \fi - \fi - }% - \fi - \KVO@process@pti@ns -} -% \end{macrocode} -% -% \begin{macrocode} -\def\KVO@in@#1#2{% - \in@false - \begingroup - \@for\x:=#2\do{% - \ifx\x#1\relax - \in@true - \fi - }% - \edef\x{\endgroup - \ifin@ - \noexpand\in@true - \fi - }% - \x -} -% \end{macrocode} -% -% \begin{macrocode} -\def\KVO@process@pti@ns{% - \@for\CurrentOption:=\@curroptions\do{% - \@ifundefined{ds@\KVO@SanitizedCurrentOption}{% - \KVO@use@ption - \default@ds - }% - \KVO@use@ption - }% - \@for\CurrentOption:=\@declaredoptions\do{% - \expandafter\let\csname ds@\CurrentOption\endcsname\relax - }% - \let\CurrentOption\@empty - \let\@fileswith@pti@ns\@@fileswith@pti@ns - \AtEndOfPackage{\let\@unprocessedoptions\relax}% -} -% \end{macrocode} -% -% \begin{macrocode} -\def\KVO@use@ption{% - \begingroup - \edef\x{\endgroup - \noexpand\@removeelement{% - \detokenize\expandafter{\CurrentOption}% - }{% - \detokenize\expandafter{\@unusedoptionlist}% - }% - }% - \x\@unusedoptionlist - \csname ds@\KVO@SanitizedCurrentOption\endcsname -} -% \end{macrocode} -% -% \begin{macrocode} -\def\OptionNotUsed{% - \ifx\@currext\@clsextension - \xdef\@unusedoptionlist{% - \ifx\@unusedoptionlist\@empty - \else - \detokenize\expandafter{\@unusedoptionlist,}% - \fi - \detokenize\expandafter{\CurrentOption}% - }% - \fi -} -% \end{macrocode} -% -% Variant of \cs{ExecuteOptions} that better protects \cs{CurrentOption}. -% \begin{macrocode} -\def\CurrentOption@SaveLevel{0} -\def\ExecuteOptions{% - \expandafter\KVO@ExecuteOptions - \csname CurrentOption@\CurrentOption@SaveLevel\endcsname -} -\def\KVO@ExecuteOptions#1#2{% - \let#1\CurrentOption - \edef\CurrentOption@SaveLevel{% - \the\numexpr\CurrentOption@SaveLevel+1% - }% - \@for\CurrentOption:=#2\do{% - \csname ds@\CurrentOption\endcsname - }% - \edef\CurrentOption@SaveLevel{% - \the\numexpr\CurrentOption@SaveLevel-1% - }% - \let\CurrentOption#1% -} -% \end{macrocode} -% -% \begin{macrocode} -\def\KVO@fileswith@pti@ns#1[#2]#3[#4]{% - \ifx#1\@clsextension - \ifx\@classoptionslist\relax - \KVO@normalize\KVO@temp{#2}% - \expandafter\gdef\expandafter\@classoptionslist\expandafter{% - \KVO@temp - }% - \def\reserved@a{% - \KVO@onefilewithoptions{#3}[{#2}][{#4}]#1% - \@documentclasshook - }% - \else - \def\reserved@a{% - \KVO@onefilewithoptions{#3}[{#2}][{#4}]#1% - }% - \fi - \else - \begingroup - \let\KVO@temp\relax - \let\KVO@onefilewithoptions\relax - \let\@pkgextension\relax - \def\reserved@b##1,{% - \ifx\@nil##1\relax - \else - \ifx\relax##1\relax - \else - \KVO@onefilewithoptions{##1}[{\KVO@temp}][{#4}]% - \@pkgextension - \fi - \expandafter\reserved@b - \fi - }% - \edef\reserved@a{\zap@space#3 \@empty}% - \edef\reserved@a{\expandafter\reserved@b\reserved@a,\@nil,}% - \toks@{#2}% - \def\KVO@temp{\the\toks@}% - \edef\reserved@a{\endgroup \reserved@a}% - \fi - \reserved@a -} -% \end{macrocode} -% -% \begin{macrocode} -\def\KVO@onefilewithoptions#1[#2][#3]#4{% - \@pushfilename - \xdef\@currname{#1}% - \global\let\@currext#4% - \expandafter\let\csname\@currname.\@currext-h@@k\endcsname\@empty - \let\CurrentOption\@empty - \@reset@ptions - \makeatletter - \def\reserved@a{% - \@ifl@aded\@currext{#1}{% - \@if@ptions\@currext{#1}{#2}{% - }{% - \begingroup - \@ifundefined{opt@#1.\@currext}{% - \def\x{}% - }{% - \edef\x{% - \expandafter\expandafter\expandafter\strip@prefix - \expandafter\meaning\csname opt@#1.\@currext\endcsname - }% - }% - \def\y{#2}% - \edef\y{\expandafter\strip@prefix\meaning\y}% - \@latex@error{Option clash for \@cls@pkg\space #1}{% - The package #1 has already been loaded % - with options:\MessageBreak - \space\space[\x]\MessageBreak - There has now been an attempt to load it % - with options\MessageBreak - \space\space[\y]\MessageBreak - Adding the global options:\MessageBreak - \space\space - \x,\y\MessageBreak - to your \noexpand\documentclass declaration may fix this.% - \MessageBreak - Try typing \space <return> \space to proceed.% - }% - \endgroup - }% - }{% - \@pass@ptions\@currext{#2}{#1}% - \global\expandafter - \let\csname ver@\@currname.\@currext\endcsname\@empty - \InputIfFileExists - {\@currname.\@currext}% - {}% - {\@missingfileerror\@currname\@currext}% - \let\@unprocessedoptions\@@unprocessedoptions - \csname\@currname.\@currext-h@@k\endcsname - \expandafter\let\csname\@currname.\@currext-h@@k\endcsname - \@undefined - \@unprocessedoptions - }% - \@ifl@ter\@currext{#1}{#3}{% - }{% - \@latex@warning@no@line{% - You have requested,\on@line, % - version\MessageBreak - #3' of \@cls@pkg\space #1,\MessageBreak - but only version\MessageBreak - `\csname ver@#1.\@currext\endcsname'\MessageBreak - is available% - }% - }% - \ifx\@currext\@clsextension\let\LoadClass\@twoloadclasserror\fi - \@popfilename - \@reset@ptions - }% - \reserved@a -} -% \end{macrocode} -% -% \begin{macrocode} -\def\@unknownoptionerror{% - \@latex@error{% - Unknown option `\KVO@SanitizedCurrentOption' % - for \@cls@pkg\space`\@currname'% - }{% - The option `\KVO@SanitizedCurrentOption' was not declared in % - \@cls@pkg\space`\@currname', perhaps you\MessageBreak - misspelled its name. % - Try typing \space <return> % - \space to proceed.% - }% -} -% \end{macrocode} -% -% \begin{macrocode} -\def\@@unprocessedoptions{% - \ifx\@currext\@pkgextension - \@ifundefined{opt@\@currname.\@currext}{% - \let\@curroptions\@empty - }{% - \expandafter\let\expandafter\@curroptions - \csname opt@\@currname.\@currext\endcsname - }% - \@for\CurrentOption:=\@curroptions\do{% - \ifx\CurrentOption\@empty\else\@unknownoptionerror\fi - }% - \fi -} -% \end{macrocode} -% -% \begin{macrocode} -\def\KVO@SanitizedCurrentOption{% - \expandafter\strip@prefix\meaning\CurrentOption -} -% \end{macrocode} -% -% Normalize option list. -% \begin{macrocode} -\def\KVO@normalize#1#2{% - \let\KVO@result\@empty - \KVO@splitcomma#2,\@nil - \let#1\KVO@result -} -\def\KVO@splitcomma#1,#2\@nil{% - \KVO@ifempty{#1}{}{% - \KVO@checkkv#1=\@nil - }% - \KVO@ifempty{#2}{}{\KVO@splitcomma#2\@nil}% -} -\def\KVO@ifempty#1{% - \expandafter\ifx\expandafter\\\detokenize{#1}\\% - \expandafter\@firstoftwo - \else - \expandafter\@secondoftwo - \fi -} -\def\KVO@checkkv#1=#2\@nil{% - \KVO@ifempty{#2}{% - % option without value - \edef\KVO@x{\zap@space#1 \@empty}% - \ifx\KVO@x\@empty - % ignore empty option - \else - % append to list - \edef\KVO@result{% - \etex@unexpanded\expandafter{\KVO@result},\KVO@x - }% - \fi - }{% - % #1: "key", #2: "value=" - % add key part - \edef\KVO@result{% - \etex@unexpanded\expandafter{\KVO@result},% - \zap@space#1 \@empty - }% - \futurelet\@let@token\KVO@checkfirsttok#2 \@nil| = \@nil|\KVO@nil - }% -} -\def\KVO@checkfirsttok{% - \ifx\@let@token\bgroup - % no space at start - \expandafter\KVO@removelastspace\expandafter=% - % "<value><spaceopt>= \@nil" - \else - \expandafter\KVO@checkfirstA - \fi -} -\def\KVO@checkfirstA#1 #2\@nil{% - \KVO@ifempty{#2}{% - \KVO@removelastspace=#1 \@nil - }{% - \KVO@ifempty{#1}{% - \KVO@removelastspace=#2\@nil - }{% - \KVO@removelastspace=#1 #2\@nil - }% - }% -} -\def\KVO@removelastspace#1 = \@nil|#2\KVO@nil{% - \KVO@ifempty{#2}{% - \edef\KVO@result{% - \etex@unexpanded\expandafter{\KVO@result}% - \etex@unexpanded\expandafter{\KVO@removegarbage#1\KVO@nil}% - }% - }{% - \edef\KVO@result{% - \etex@unexpanded\expandafter{\KVO@result}% - \etex@unexpanded{#1}% - }% - }% -} -\def\KVO@removegarbage#1= \@nil#2\KVO@nil{#1}% -% \end{macrocode} -% -% Arguments |#1| and |#2| are macros. -% \begin{macrocode} -\def\KVO@removeelement#1#2{% - \begingroup - \toks@={}% - \@for\x:=#2\do{% - \ifx\x\@empty - \else - \ifx\x#1\relax - \else - \edef\t{\the\toks@}% - \ifx\t\@empty - \else - \toks@\expandafter{\the\toks@,}% - \fi - \toks@\expandafter{\the\expandafter\toks@\x}% - \fi - \fi - }% - \edef\x{\endgroup - \def\noexpand#2{\the\toks@}% - }% - \x -} -% \end{macrocode} -% -% -% \begin{macrocode} -\let\@@fileswith@pti@ns\KVO@fileswith@pti@ns -\ifx\@fileswith@pti@ns\@badrequireerror -\else - \let\@fileswith@pti@ns\KVO@fileswith@pti@ns -\fi -% \end{macrocode} -% -% \begin{macro}{\KVO@Patch} -% \begin{macrocode} -\let\KVO@Patch=Y -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -\KVO@AtEnd% -%</patch> -% \end{macrocode} -% -% \section{Test} -% -% \subsection{Preface for standard catcode check} -% -% \begin{macrocode} -%<*test1> -\input miniltx.tex\relax -%</test1> -% \end{macrocode} -% -% \subsection{Catcode checks for loading} -% -% \begin{macrocode} -%<*test1> -% \end{macrocode} -% \begin{macrocode} -\catcode`\{=1 % -\catcode`\}=2 % -\catcode`\#=6 % -\catcode`\@=11 % -\expandafter\ifx\csname count@\endcsname\relax - \countdef\count@=255 % -\fi -\expandafter\ifx\csname @gobble\endcsname\relax - \long\def\@gobble#1{}% -\fi -\expandafter\ifx\csname @firstofone\endcsname\relax - \long\def\@firstofone#1{#1}% -\fi -\expandafter\ifx\csname loop\endcsname\relax - \expandafter\@firstofone -\else - \expandafter\@gobble -\fi -{% - \def\loop#1\repeat{% - \def\body{#1}% - \iterate - }% - \def\iterate{% - \body - \let\next\iterate - \else - \let\next\relax - \fi - \next - }% - \let\repeat=\fi -}% -\def\RestoreCatcodes{} -\count@=0 % -\loop - \edef\RestoreCatcodes{% - \RestoreCatcodes - \catcode\the\count@=\the\catcode\count@\relax - }% -\ifnum\count@<255 % - \advance\count@ 1 % -\repeat - -\def\RangeCatcodeInvalid#1#2{% - \count@=#1\relax - \loop - \catcode\count@=15 % - \ifnum\count@<#2\relax - \advance\count@ 1 % - \repeat -} -\def\RangeCatcodeCheck#1#2#3{% - \count@=#1\relax - \loop - \ifnum#3=\catcode\count@ - \else - \errmessage{% - Character \the\count@\space - with wrong catcode \the\catcode\count@\space - instead of \number#3% - }% - \fi - \ifnum\count@<#2\relax - \advance\count@ 1 % - \repeat -} -\def\space{ } -\expandafter\ifx\csname LoadCommand\endcsname\relax - \def\LoadCommand{\input kvoptions.sty\relax}% -\fi -\def\Test{% - \RangeCatcodeInvalid{0}{47}% - \RangeCatcodeInvalid{58}{64}% - \RangeCatcodeInvalid{91}{96}% - \RangeCatcodeInvalid{123}{255}% - \catcode`\@=12 % - \catcode`\\=0 % - \catcode`\%=14 % - \LoadCommand - \RangeCatcodeCheck{0}{36}{15}% - \RangeCatcodeCheck{37}{37}{14}% - \RangeCatcodeCheck{38}{47}{15}% - \RangeCatcodeCheck{48}{57}{12}% - \RangeCatcodeCheck{58}{63}{15}% - \RangeCatcodeCheck{64}{64}{12}% - \RangeCatcodeCheck{65}{90}{11}% - \RangeCatcodeCheck{91}{91}{15}% - \RangeCatcodeCheck{92}{92}{0}% - \RangeCatcodeCheck{93}{96}{15}% - \RangeCatcodeCheck{97}{122}{11}% - \RangeCatcodeCheck{123}{255}{15}% - \RestoreCatcodes -} -\Test -\csname @@end\endcsname -\end -% \end{macrocode} -% \begin{macrocode} -%</test1> -% \end{macrocode} -% -% \begin{macrocode} -%<*test2> -\NeedsTeXFormat{LaTeX2e} -\makeatletter -\catcode`\@=11 % -\def\RestoreCatcodes{} -\count@=0 % -\loop - \edef\RestoreCatcodes{% - \RestoreCatcodes - \catcode\the\count@=\the\catcode\count@\relax - }% -\ifnum\count@<255 % - \advance\count@\@ne -\repeat - -\def\RangeCatcodeInvalid#1#2{% - \count@=#1\relax - \loop - \catcode\count@=15 % - \ifnum\count@<#2\relax - \advance\count@\@ne - \repeat -} -\def\Test#1{% - \RangeCatcodeInvalid{0}{47}% - \RangeCatcodeInvalid{58}{64}% - \RangeCatcodeInvalid{91}{96}% - \RangeCatcodeInvalid{123}{255}% - \catcode`\@=12 % - \catcode`\\=0 % - \catcode`\{=1 % - \catcode`\}=2 % - \catcode`\#=6 % - \catcode`\[=12 % - \catcode`\]=12 % - \catcode`\%=14 % - \catcode`\ =10 % - \catcode13=5 % - #1\relax - \RestoreCatcodes -} -\Test{\RequirePackage{kvoptions-patch}}% -\Test{\RequirePackage{kvoptions}}% -\csname @@end\endcsname -%</test2> -% \end{macrocode} -% -% \begin{macrocode} -%<*test3> -\NeedsTeXFormat{LaTeX2e} -\makeatletter -\RequirePackage{kvoptions}[2016/05/16] -\def\msg#{\immediate\write16} -\define@key{testfamily}{testkey}{% - \msg{[testfamily/testkey/#1]}% -} -\define@key{testfamily}{testdefaultkey}[testdefault]{% - \msg{[testfamily/testdefaultkey/#1]}% -} -\AddToKeyvalOption{testfamily}{testkey}{% - \msg{[addition/#1]}% -} -\AddToKeyvalOption{testfamily}{testdefaultkey}{% - \msg{[addition/#1]}% -} -\setkeys{testfamily}{% - testkey=testA,% - testdefaultkey=testB,% - testdefaultkey,% -} -\SetupKeyvalOptions{% - family=testfamily% -} -\AddToKeyvalOption*{testkey}{% - \msg{[star addition/#1]}% -} -\AddToKeyvalOption*{testdefaultkey}{% - \msg{[star addition/#1]}% -} -\setkeys{testfamily}{% - testkey=testA,% - testdefaultkey=testB,% - testdefaultkey,% -} -\@@end -%</test3> -% \end{macrocode} -% -% \begin{macrocode} -%<*test4pkg> -\NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{kvoptions-test4}[2016/05/16 package for testing] -\RequirePackage{kvoptions}[2016/05/16] -\SetupKeyvalOptions{% - family=FOO,% - prefix=foo,% - setkeys=\kvsetkeys,% -} -\DeclareStringOption{str} -\define@key{FOO}{set}{% - \setkeys{BAR}{strbar={#1}}% -} -\define@key{BAR}{strbar}{% - \def\foostr{[BAR:#1]}% -} -\ProcessKeyvalOptions* -%</test4pkg> -% \end{macrocode} -% \begin{macrocode} -%<*test4> -\NeedsTeXFormat{LaTeX2e} -\ProvidesFile{kvoptions-test4.tex}[2016/05/16 test file] -\RequirePackage[% - str=A,set=B,str=C,% -]{kvoptions-test4}[2016/05/16] -\def\TestExpected{C} -\ifx\foostr\TestExpected - \typeout{* Test ok.}% -\else - \typeout{* Result: [\foostr]}% - \typeout{* Expected: [\TestExpected]}% - \errmessage{Test failed!}% -\fi -\csname @@end\endcsname\end -%</test4> -% \end{macrocode} -% -% \section{Installation} -% -% \subsection{Download} -% -% \paragraph{Package.} This package is available on -% CTAN\footnote{\CTANpkg{kvoptions}}: -% \begin{description} -% \item[\CTAN{macros/latex/contrib/oberdiek/kvoptions.dtx}] The source file. -% \item[\CTAN{macros/latex/contrib/oberdiek/kvoptions.pdf}] Documentation. -% \end{description} -% -% -% \paragraph{Bundle.} All the packages of the bundle `oberdiek' -% are also available in a TDS compliant ZIP archive. There -% the packages are already unpacked and the documentation files -% are generated. The files and directories obey the TDS standard. -% \begin{description} -% \item[\CTANinstall{install/macros/latex/contrib/oberdiek.tds.zip}] -% \end{description} -% \emph{TDS} refers to the standard ``A Directory Structure -% for \TeX\ Files'' (\CTAN{tds/tds.pdf}). Directories -% with \xfile{texmf} in their name are usually organized this way. -% -% \subsection{Bundle installation} -% -% \paragraph{Unpacking.} Unpack the \xfile{oberdiek.tds.zip} in the -% TDS tree (also known as \xfile{texmf} tree) of your choice. -% Example (linux): -% \begin{quote} -% |unzip oberdiek.tds.zip -d ~/texmf| -% \end{quote} -% -% \paragraph{Script installation.} -% Check the directory \xfile{TDS:scripts/oberdiek/} for -% scripts that need further installation steps. -% -% \subsection{Package installation} -% -% \paragraph{Unpacking.} The \xfile{.dtx} file is a self-extracting -% \docstrip\ archive. The files are extracted by running the -% \xfile{.dtx} through \plainTeX: -% \begin{quote} -% \verb|tex kvoptions.dtx| -% \end{quote} -% -% \paragraph{TDS.} Now the different files must be moved into -% the different directories in your installation TDS tree -% (also known as \xfile{texmf} tree): -% \begin{quote} -% \def\t{^^A -% \begin{tabular}{@{}>{\ttfamily}l@{ $\rightarrow$ }>{\ttfamily}l@{}} -% kvoptions.sty & tex/latex/oberdiek/kvoptions.sty\\ -% kvoptions-patch.sty & tex/latex/oberdiek/kvoptions-patch.sty\\ -% kvoptions.pdf & doc/latex/oberdiek/kvoptions.pdf\\ -% example-mycolorsetup.sty & doc/latex/oberdiek/example-mycolorsetup.sty\\ -% test/kvoptions-test1.tex & doc/latex/oberdiek/test/kvoptions-test1.tex\\ -% test/kvoptions-test2.tex & doc/latex/oberdiek/test/kvoptions-test2.tex\\ -% test/kvoptions-test3.tex & doc/latex/oberdiek/test/kvoptions-test3.tex\\ -% test/kvoptions-test4.tex & doc/latex/oberdiek/test/kvoptions-test4.tex\\ -% test/kvoptions-test4.sty & doc/latex/oberdiek/test/kvoptions-test4.sty\\ -% kvoptions.dtx & source/latex/oberdiek/kvoptions.dtx\\ -% \end{tabular}^^A -% }^^A -% \sbox0{\t}^^A -% \ifdim\wd0>\linewidth -% \begingroup -% \advance\linewidth by\leftmargin -% \advance\linewidth by\rightmargin -% \edef\x{\endgroup -% \def\noexpand\lw{\the\linewidth}^^A -% }\x -% \def\lwbox{^^A -% \leavevmode -% \hbox to \linewidth{^^A -% \kern-\leftmargin\relax -% \hss -% \usebox0 -% \hss -% \kern-\rightmargin\relax -% }^^A -% }^^A -% \ifdim\wd0>\lw -% \sbox0{\small\t}^^A -% \ifdim\wd0>\linewidth -% \ifdim\wd0>\lw -% \sbox0{\footnotesize\t}^^A -% \ifdim\wd0>\linewidth -% \ifdim\wd0>\lw -% \sbox0{\scriptsize\t}^^A -% \ifdim\wd0>\linewidth -% \ifdim\wd0>\lw -% \sbox0{\tiny\t}^^A -% \ifdim\wd0>\linewidth -% \lwbox -% \else -% \usebox0 -% \fi -% \else -% \lwbox -% \fi -% \else -% \usebox0 -% \fi -% \else -% \lwbox -% \fi -% \else -% \usebox0 -% \fi -% \else -% \lwbox -% \fi -% \else -% \usebox0 -% \fi -% \else -% \lwbox -% \fi -% \else -% \usebox0 -% \fi -% \end{quote} -% If you have a \xfile{docstrip.cfg} that configures and enables \docstrip's -% TDS installing feature, then some files can already be in the right -% place, see the documentation of \docstrip. -% -% \subsection{Refresh file name databases} -% -% If your \TeX~distribution -% (\teTeX, \mikTeX, \dots) relies on file name databases, you must refresh -% these. For example, \teTeX\ users run \verb|texhash| or -% \verb|mktexlsr|. -% -% \subsection{Some details for the interested} -% -% \paragraph{Unpacking with \LaTeX.} -% The \xfile{.dtx} chooses its action depending on the format: -% \begin{description} -% \item[\plainTeX:] Run \docstrip\ and extract the files. -% \item[\LaTeX:] Generate the documentation. -% \end{description} -% If you insist on using \LaTeX\ for \docstrip\ (really, -% \docstrip\ does not need \LaTeX), then inform the autodetect routine -% about your intention: -% \begin{quote} -% \verb|latex \let\install=y\input{kvoptions.dtx}| -% \end{quote} -% Do not forget to quote the argument according to the demands -% of your shell. -% -% \paragraph{Generating the documentation.} -% You can use both the \xfile{.dtx} or the \xfile{.drv} to generate -% the documentation. The process can be configured by the -% configuration file \xfile{ltxdoc.cfg}. For instance, put this -% line into this file, if you want to have A4 as paper format: -% \begin{quote} -% \verb|\PassOptionsToClass{a4paper}{article}| -% \end{quote} -% An example follows how to generate the -% documentation with pdf\LaTeX: -% \begin{quote} -%\begin{verbatim} -%pdflatex kvoptions.dtx -%makeindex -s gind.ist kvoptions.idx -%pdflatex kvoptions.dtx -%makeindex -s gind.ist kvoptions.idx -%pdflatex kvoptions.dtx -%\end{verbatim} -% \end{quote} -% -% \begin{thebibliography}{99} -% \bibitem{tb94wright} -% A guide to key-value methods, Joseph Wright, second draft for -% \href{https://www.tug.org/tugboat}{TUGBoat}, 2009-03-17. -% \url{https://www.texdev.net/uploads/2009/03/keyval.pdf} -% \bibpackage{ifthen}{David Carlisle}{2001/05/26} -% {\CTANpkg{ifthen}} -% \bibpackage{helvet}{Sebastian Rahtz, Walter Schmidt}{2004/01/26} -% {\CTANpkg{psfonts}} -% \bibpackage{hyperref}{Sebastian Rahtz, Heiko Oberdiek}{2006/02/12} -% {\CTANpkg{hyperref}} -% \bibpackage{keyval}{David Carlisle}{1999/03/16} -% {\CTANpkg{keyval}} -% \bibpackage{multicol}{Frank Mittelbach}{2004/02/14} -% {\CTANpkg{multicol}} -% \bibpackage{tabularx}{David Carlisle}{1999/01/07} -% {\CTANpkg{tabularx}} -% \bibpackage{tracefnt}{Frank Mittelbach, Rainer Sch\"opf}{1997/05/29} -% {\CTANpkg{latex-base}} -% \bibpackage{xkeyval}{Hendri Adriaens}{2005/05/07} -% {\CTANpkg{xkeyval}} -% \bibitem{clsguide} -% The \LaTeX3 Project, \textit{\LaTeXe\ for class and package writers}, -% 2003/12/09. -% \CTANpkg{clsguide} -% -% \end{thebibliography} -% -% \begin{History} -% \begin{Version}{0000/00/00 v0.0} -% \item -% Probably David Carlisle's code in \xpackage{hyperref} -% was the start. -% \end{Version} -% \begin{Version}{2004/02/22 v1.0} -% \item -% The first version was never published. It also -% has offered a patch to get rid of \LaTeX's option -% expansion. -% \end{Version} -% \begin{Version}{2006/02/16 v2.0} -% \item -% Now the package is redesigned with an easier -% user interface. -% \item -% \cs{ProcessKeyvalOptions} remains the central service, inherited -% from \xpackage{hyperref}'s \cs{ProcessOptionsWithKV}. -% Now the use inside classes is also supported. -% \item -% Provides help macros for boolean and simple string options. -% \item -% Fixes for the patch of \LaTeX{}. The patch is only enabled, -% if the user requests it. -% \end{Version} -% \begin{Version}{2006/02/20 v2.1} -% \item -% Unused option list is sanitized to prevent problems -% with other packages that uses own processing methods -% for key value options. Disadvantage: the unused global -% option detection is weakened. -% \item -% New option type by \cs{DeclareVoidOption} for options without -% value. -% \item -% Default rule by \cs{DeclareDefaultOption}. -% \item -% Dynamic options: \cs{DisableKeyvalOption}. -% \end{Version} -% \begin{Version}{2006/06/01 v2.2} -% \item -% Fixes for option \xoption{patch}. -% \end{Version} -% \begin{Version}{2006/08/17 v2.3} -% \item -% \cs{DeclareBooleanOption} renamed to \cs{DeclareBoolOption} -% to avoid a name clash with package \cs{ifoption}. -% \end{Version} -% \begin{Version}{2006/08/22 v2.4} -% \item -% Option \xoption{patch}: \cs{ExecuteOptions} does not -% change the meaning of macro \cs{CurrentOption} at all. -% \end{Version} -% \begin{Version}{2007/04/11 v2.5} -% \item -% Line ends sanitized. -% \end{Version} -% \begin{Version}{2007/05/06 v2.6} -% \item -% Uses package \xpackage{etexcmds}. -% \end{Version} -% \begin{Version}{2007/06/11 v2.7} -% \item -% The patch part fixes LaTeX bug latex/3965. -% \end{Version} -% \begin{Version}{2007/10/02 v2.8} -% \item -% Compatibility for \plainTeX\ added. -% \item -% Typos in documentation fixed (Axel Sommerfeldt). -% \end{Version} -% \begin{Version}{2007/10/11 v2.9} -% \item -% Bug fix for option \xoption{patch}. -% \end{Version} -% \begin{Version}{2007/10/18 v3.0} -% \item -% New package \xpackage{kvoptions-patch}. -% \end{Version} -% \begin{Version}{2009/04/10 v3.1} -% \item -% Space by line end removed in definition of internal macro. -% \end{Version} -% \begin{Version}{2009/07/17 v3.2} -% \item -% \cs{ProcessLocalKeyvalOptions} added. -% \item -% \cs{DisableKeyvalOption} with the \texttt{action=ignore} option -% fixed (Joseph Wright). -% \end{Version} -% \begin{Version}{2009/07/21 v3.3} -% \item -% \cs{DeclareLocalOption}, \cs{DeclareLocalOptions} added. -% \end{Version} -% \begin{Version}{2009/08/13 v3.4} -% \item -% Documentation addition: recommendation for Joseph Wright's -% review article. -% \item -% Documentation addition: local/global options. -% \end{Version} -% \begin{Version}{2009/12/04 v3.5} -% \item -% \cs{AddToKeyvalOption} added. -% \end{Version} -% \begin{Version}{2009/12/08 v3.6} -% \item -% Fix: If a default handler is configured, it is now also -% called for classes. -% \end{Version} -% \begin{Version}{2010/02/22 v3.7} -% \item -% Missing space in error message added. -% \end{Version} -% \begin{Version}{2010/07/23 v3.8} -% \item -% Documenation for package \xpackage{kvoptions-patch} improved. -% No code changes. -% \end{Version} -% \begin{Version}{2010/12/02 v3.9} -% \item -% Key \texttt{setkeys} added for \cs{SetupKeyvalOptions}. -% \end{Version} -% \begin{Version}{2010/12/23 v3.10} -% \item -% \cs{DeclareVoidOption} also parses the second parameter as -% \hologo{TeX} argument to improve compatibility with -% \cs{DeclareOption}. -% \end{Version} -% \begin{Version}{2011/06/30 v3.11} -% \item -% Fix because of design bug in package \xpackage{xkeyval} that -% removes global options with equal signs. -% \end{Version} -% \begin{Version}{2016/05/16 v3.12} -% \item -% Documentation updates. -% \end{Version} -% \end{History} -% -% \PrintIndex -% -% \Finale -\endinput |