summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/amslatex/rkeyval.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/latex/amslatex/rkeyval.dtx')
-rw-r--r--Master/texmf-dist/source/latex/amslatex/rkeyval.dtx1116
1 files changed, 0 insertions, 1116 deletions
diff --git a/Master/texmf-dist/source/latex/amslatex/rkeyval.dtx b/Master/texmf-dist/source/latex/amslatex/rkeyval.dtx
deleted file mode 100644
index 88d4642df27..00000000000
--- a/Master/texmf-dist/source/latex/amslatex/rkeyval.dtx
+++ /dev/null
@@ -1,1116 +0,0 @@
-%%% ====================================================================
-%%% @LaTeX-doc-source-file{
-%%% filename = "rkeyval.dtx",
-%%% version = "2.00",
-%%% date = "2004/06/28",
-%%% time = "15:19:29 EDT",
-%%% author = "Michael J Downes and David M. Jones",
-%%% address = "American Mathematical Society,
-%%% Publications Technical Group,
-%%% PO Box 6248,
-%%% Providence, RI 02940,
-%%% USA",
-%%% email = "tech-support@ams.org",
-%%% URL = "http://www.ams.org/",
-%%% abstract = "Key-value scanning functions with more restrictive
-%%% syntax than the standard keyval package. This permits
-%%% some improvements in the error-checking.",
-%%% checksum = "44721 1116 3178 30537",
-%%% docstring = "The checksum field, produced by Robert Solovay's
-%%% checksum utility, gives CRC-16 checksum, lines,
-%%% words, and characters.",
-%%% }
-%%% ====================================================================
-% \iffalse
-%<*driver>
-\documentclass[draft,oneside]{amsdtx}
-\pagestyle{myheadings}
-
-\makeatletter
-\DeclareRobustCommand{\fld}{\@category@index{field}}
-\makeatother
-
-\DoNotIndex{\@emptytoks,\@temptokenb}
-
-\CodelineIndex
-
-\begin{document}
-\title{The \pkg{rkeyval} package:\protect\linebreak[1]
- Syntactically restricted key-value scanning}
-\author{Michael Downes and David M. Jones\\American Mathematical Society}
-\date{Version \fileversion, \filedate}
-\hDocInput{rkeyval.dtx}
-\PrintIndex
-\end{document}
-%</driver>
-% \fi
-%
-% \MakeShortVerb{\|}
-%
-% \maketitle
-% \markboth{The \protect\pkg{rkeyval} package}
-% {Version \protect\fileversion, \protect\filedate}
-%
-% \tableofcontents
-%
-% \section{Introduction}
-%
-% The \pkg{rkeyval} package provides functions for scanning key-value
-% notation similar to the kind of scanning supported by the standard
-% \pkg{keyval} package. However, the syntax is more restrictive in
-% order to make some improved error-checking possible. In particular,
-% if a comma is omitted between two instances of |key={value}|
-% form, the \cn{RestrictedSetKeys} command will spot the missing
-% comma and issue a suitable error message (and it will be given at
-% the point where the missing comma is detected, before reading any
-% further in the \tex/ file). The standard \cn{setkeys} command, by
-% contrast, will append the second key name to the value of the first
-% key and discard the second value, without any notification to the
-% user that anything has gone wrong. But that is partly because the
-% standard \cn{setkeys} command allows implied values and does not
-% require braces around explicit values (except when necessary to
-% hide material that has a syntactic resemblance to a key-value
-% pair). With \cn{RestrictedSetKeys} the value must always be present
-% and it must be enclosed in braces.
-%
-%^^A Maybe commas should be optional.
-%
-% Further restrictions of the \cn{RestrictedSetKeys} command and its
-% companion commands reduce memory consumption in certain ways.
-% Defining a key creates only one control sequence, a container for
-% holding the value. Processing of key values is normally limited to
-% storing a value given by the user; any additional processing must
-% be supplied separately by the programmer.
-%
-% Generally speaking, the error-checking done by
-% \cn{RestrictedSetKeys} is better for applications where all the
-% keys are expected to have textual values, while \cn{setkeys} is
-% better when one wants to silently recover as far as possible from
-% syntactic errors, instead of notifying the user of the errors; or
-% when keys have nontrivial default values (i.e., not empty) or other
-% kinds of special processing.
-%
-% \begin{verbatim}
-% \RestrictedSetKeys{setup-code}{group}{code}{key={val}, ...}
-%\end{verbatim}
-% Normally \cn{RestrictedSetKeys} simply carries out the following
-% assignment for each key-value pair:
-% \begin{verbatim}
-% \def\group'key{val}
-%\end{verbatim}
-% The first argument is normally empty, but the exact nature of the
-% warnings given and other aspects of the processing can be affected
-% by putting extra setup code there. The \pkg{amsrefs} package uses
-% this to implement a copying operation where field name and value
-% are written out immediately to another file instead of being stored
-% in the usual way.
-%
-% Some examples for defining the key names associated with a given
-% group. This defines ``title'' as a recognized key for the \fn{bib}
-% group:
-% \begin{verbatim}
-% \DefineSimpleKey{bib}{title}
-%\end{verbatim}
-% If a key is defined with \cs{DefineSimpleKey}, the result of using
-% the same key more than once in a single entry will be an error
-% message.
-%
-% This defines ``title'' to be a repeatable key:
-% \begin{verbatim}
-% \DefineSupersedingKey{bib}{title}
-%\end{verbatim}
-% If it occurs more than once, the last value supersedes the earlier
-% ones, instead of getting an error. This variation is not needed for
-% simple usage, but in more complicated situations where key values
-% are combined from multiple sources, it may be useful.
-%
-% This defines ``author'' to be a repeatable key, with each value
-% being appended to a list of values:
-% \begin{verbatim}
-% \DefineAdditiveKey{bib}{author}{\name}
-%\end{verbatim}
-% The third argument specifies a wrapper function that should be
-% applied to each item in the list. I.e., suppose that two author
-% names are given:
-% \begin{verbatim}
-% author={Smith, J. Q.},
-% author={Taylor, X. Y.},
-%\end{verbatim}
-% Then they will be stored in the form
-% \begin{verbatim}
-% \name{Smith, J. Q.}\name{Taylor, X. Y.}
-%\end{verbatim}
-%
-% This defines ``transition'' to be a dummy key with a value that is
-% superficially nonempty but effectly empty:
-% \begin{verbatim}
-% \DefineDummyKey{bib}{transition}
-%\end{verbatim}
-% Defining a dummy key like this can be useful in dealing with
-% certain boundary situations that sometimes arise.
-%
-% \StopEventually{}
-%
-% \section{Implementation}
-% Standard declaration of package name and date.
-% \begin{macrocode}
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{rkeyval}[2004/05/05 v1.08]
-% \end{macrocode}
-%
-% \begin{macro}{\@xp}
-% \begin{macro}{\@nx}
-% \begin{macrocode}
-\let\@xp\expandafter
-\let\@nx\noexpand
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@gobblethree}
-% \begin{macro}{\@nilgobble}
-% Not in the \latex/ kernel yet.
-% \begin{macrocode}
-\long\def\@gobblethree#1#2#3{}
-\long\def\@nilgobble#1\@nil{}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@emptytoks}
-% Using \cs{@ifundefined} here avoids problems with really old
-% versions of \latex/ that choke on \cs{newtoks} if it is written
-% directly in the false branch of a conditional.
-% \begin{macrocode}
-\@ifundefined{@emptytoks}{\csname newtoks\endcsname\@emptytoks}{}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@temptokenb}
-% \begin{macrocode}
-\@ifundefined{@temptokenb}{\csname newtoks\endcsname\@temptokenb}{}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@append}
-% \begin{macrocode}
-\def\@append#1#2#3{\@xp\def\@xp#2\@xp{#2#1{#3}}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\star@}
-% Test for a trailing option marked by a star. Usage:
-% \begin{verbatim}
-% \newcommand{\blub}[1]{\star@{\blubaux{#1}}{default}}
-%\end{verbatim}
-% Arg 1 of \cs{star@} is the code to
-% be run, arg 2 is the default value of the option (could be empty).
-% If arg 1 is \ncn{moo}, this test discards a star and expands to
-% \ncn{moo} if a star is found, or expands to |\moo{#2}| if
-% not. As the example shows, arg 1 need not be a single token.
-% \begin{macrocode}
-\def\star@#1#2{%
- \def\star@a##1{#1}%
- \def\star@b{#1{#2}}%
- \futurelet\@let@token\star@test
-}
-
-\def\star@test{\ifx*\@let@token \let\star@b\star@a\fi \star@b}
-% \end{macrocode}
-%
-% Please note: If there is a space before the star, then the star is
-% not treated as an option char.
-%
-% Why use a star? Since it's already part of standard \latex/
-% command syntax, it's unlikely to suffer from catcode changes.
-%
-% Why not just put the star at the beginning in the usual way? It
-% seemed to me that the lack of a trailing option
-% feature was a deficiency in current \latex/ and could be given an
-% experimental implementation in a package like this without any
-% adverse effect on existing documents.
-% \end{macro}
-%
-% Ensure non-weird catcode for relevant characters.
-% \begin{macrocode}
-\@ifundefined{NormalCatcodes}{\RequirePackage{pcatcode}\relax}{}
-\PushCatcodes\NormalCatcodes
-% \end{macrocode}
-%
-% \begin{macro}{\extract@group}
-% Extracts ``group'' from |\group'field|.
-% \begin{macrocode}
-\def\extract@group#1{%
- \@xp\extract@group@a\string#1\@nil
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\extract@group@a}
-% \begin{macrocode}
-\def\extract@group@a#1#2'{#2\@nilgobble}
-% \end{macrocode}
-% \end{macro}
-%
-% \section{Data structures}
-%
-% The result of scanning the key/value pairs is an assignment statement
-% for \cs{rsk@toks}. For example, consider the entry
-% \begin{verbatim}
-% \bib{LelekZ1962}{article}{
-% author={Lelek, A.},
-% author={Zaremba, D.},
-% title={Dimensions of irreducible ...},
-% journal={Fund. Math.},
-% date={1962/63},
-% }
-%\end{verbatim}
-% The scanned result is to assign
-% \begin{verbatim}
-% \global\rsk@toks{%
-% \set:bib'author{Lelek, A.}{}%
-% \set:bib'author{Zaremba, D.}{}%
-% \set:bib'title{Dimensions of irreducible ...}{}%
-% \set:bib'journal{Fund. Math.}{}%
-% \set:bib'date{1962/63}{}%
-% }
-%\end{verbatim}
-% The extra empty arguments on each line are for auxiliary
-% properties (see below).
-% What happens thereafter with \cs{rsk@toks} depends on the code in
-% the last arg of \cs{RestrictedSetKeys}.
-%
-% \section{Auxiliary properties}
-%
-% Unfortunately, the previous section isn't the entire story. In
-% addition to the values of each field, we need to store a set of
-% auxiliary properties associated with those values. Note that
-% properties are explicitly associated with \emph{values}, not with
-% keys, because each value of an additive key could have different
-% properties.
-%
-% All such extra data will be stored in a special field named
-% ``aux'', with embedded tags to indicate which field each piece of
-% the \fld{aux} field is associated with. The extra bits can be
-% extracted on demand using standard techniques, and the primary
-% value of each field is not burdened with any attachments, so that
-% comparisons or scanning of the field contents can remain as
-% simple as possible.
-%
-% Thus in practice there is at least one bit of auxiliary information
-% in every bib item, and our previous example would have the title
-% language indicated:
-% \begin{verbatim}
-% \DSK@def\bib'title{Eine Bemerkung zur Darstellung von Polynomen
-% \"{u}ber Verb\"{a}nden}%
-% \@append\bib'title\bib'aux{\selectlanguage{german}}%
-%\end{verbatim}
-%
-% \begin{macro}{\set@property}
-% \begin{macrocode}
-\def\set@property#1{%
- \begingroup
- \edef\@tempa{\extract@group#1}%
- \edef\@tempa{%
- \@nx\@append\@nx#1\@xp\@nx\csname \@tempa,aux\endcsname
- }%
- \@xp\endgroup
- \@tempa
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\get@property}
-% \begin{macrocode}
-% \get@property\destination\bib'title
-\def\get@property#1#2{%
- \get@nth@property#1#2\m@ne
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\get@nth@property}
-% \begin{macrocode}
-% \get@nth@property\destination\bib'title N
-\def\get@nth@property#1#2#3{%
- \begingroup
- \edef\@tempa{\extract@group#2}%
- \@tempcnta#3\relax
- \@tempcntb\z@
- \@xp\scan@properties\@xp#2\csname \@tempa,aux\endcsname
- \edef\@tempa{\def\@nx#1{\@tempa}}%
- \@xp\endgroup
- \@tempa
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\scan@properties}
-% \begin{macrocode}
-\def\scan@properties#1#2{%
- \begingroup
- \def\@tempa{#1}%
- \let\@tempc\@empty
- \@xp\find@property #2 \@nil\@nil
- \edef\@tempa{\def\@nx\@tempa{\@tempc}}%
- \@xp\endgroup
- \@tempa
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\find@property}
-% \begin{macrocode}
-\def\find@property#1#2{%
- \ifx\@nil#1%
- \else
- \def\@tempb{#1}%
- \ifx\@tempa\@tempb
- \ifnum\@tempcnta<\z@
- \def\@tempc{#2}%
- \else
- \advance\@tempcntb\@ne
- \ifnum\@tempcntb=\@tempcnta
- \def\@tempc{#2}%
- \fi
- \fi
- \fi
- \@xp\find@property
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\reset@property}
-% \begin{macrocode}
-\def\reset@property#1#2{%
- \reset@nth@property#1\m@ne{#2}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\reset@nth@property}
-% \begin{macrocode}
-% \reset@nth@property\bib'title N VALUE
-\def\reset@nth@property#1#2#3{%
- \begingroup
- \edef\@tempa{\extract@group#1}%
- \@tempcnta#2\relax
- \@temptokena{#3}%
- \toks@\@emptytoks
- \@tempcntb\z@
- \@xp\reset@scan\@xp#1\csname \@tempa,aux\endcsname
- \edef\@tempa{%
- \def\@xp\@nx\csname \@tempa,aux\endcsname{\the\toks@}%
- }%
- \@xp\endgroup
- \@tempa
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\reset@scan}
-% \begin{macrocode}
-\def\reset@scan#1#2{%
- \begingroup
- \def\@tempa{#1}%
- \@xp\reset@scan@a #2 \@nil\@nil
- \edef\@tempa{\toks@{\the\toks@}}%
- \@xp\endgroup
- \@tempa
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\find@property}
-% \begin{macrocode}
-\def\reset@scan@a#1#2{%
- \ifx\@nil#1%
- \else
- \def\@tempb{#1}%
- \ifx\@tempa\@tempb
- \ifnum\@tempcnta<\z@
- \@temptokenb\@temptokena
- \else
- \advance\@tempcntb\@ne
- \ifnum\@tempcntb=\@tempcnta
- \@temptokenb\@temptokena
- \fi
- \fi
- \else
- \@temptokenb{#2}%
- \fi
- \edef\@tempb{%
- \toks@{\the\toks@ \@nx#1{\the\@temptokenb}}%
- }%
- \@tempb
- \@xp\reset@scan@a
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \section{Some machinery for finite state automata}
-%
-% Coincidentally I needed to write two finite state automaton parsers
-% for two related packages, so after writing them separately I spent
-% some time analyzing the code fragments they shared in common and
-% abstracted them so that the cs names could be shared.
-%
-% \begin{macro}{\fsa@l}
-% FSA lookahead.
-% \begin{macrocode}
-\def\fsa@l{\futurelet\@let@token\fsa@t}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\fsa@b}
-% FSA bypass a token. Don't delete the space at the end!
-% \begin{macrocode}
-\def\fsa@b{\afterassignment\fsa@l \let\@let@token= }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\fsa@c}
-% FSA copy a token (not space, bgroup, egroup).
-% \begin{macrocode}
-\def\fsa@c#1{\aftergroup#1\fsa@l}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\fsa@n}
-% FSA next action. This is just a placeholder definition.
-% \begin{macrocode}
-\let\fsa@n\@empty
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\fsa@t}
-% FSA test. This is just a placeholder definition.
-% \begin{macrocode}
-\let\fsa@t\@empty
-% \end{macrocode}
-% \end{macro}
-%
-% \section{Now some of the real work}
-%
-% \begin{macro}{\rsk@toks}
-% \begin{macrocode}
-\newtoks\rsk@toks
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\rkvIfEmpty}
-% Beginning here.
-% \begin{macrocode}
-\def\rkvIfEmpty#1#2{%
- \@xp\ifx\csname#1'#2\endcsname\@empty
- \@xp\@firstoftwo
- \else
- \@xp\@secondoftwo
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\rkvIfAdditive}
-% \begin{macrocode}
-\def\rkvIfAdditive#1{%
- \@xp\let\@xp\@let@token \csname \rkv@setter#1\endcsname
- \afterassignment\@nilgobble
- \@xp\let\@xp\@let@token \@let@token \@empty\@empty\@nil
- \ifx\@let@token\DSK@append
- \@xp\@firstoftwo
- \else
- \@xp\@secondoftwo
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\rkv@setter}
-% It irritates me that I can't embed the \ncn{csname} and
-% \ncn{endcsname} in here.
-% \begin{macrocode}
-\def\rkv@setter#1{set:\@xp\@gobble\string#1}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\rkv@DSAK}
-% Define a simple, superseding, or additive key.
-% \begin{macrocode}
-\def\rkv@DSAK#1#2{%
- \addto@group@reset#1{\let#1\@empty}%
- \edef\@tempa{\def\csname \rkv@setter#1\endcsname}%
- \@tempa{#2#1}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\rkv@DDK}
-% This function is used for a dummy key whose value (expansion)
-% should be empty but that should appear non-empty to
-% \cs{rkvIfEmpty}.
-% \begin{macrocode}
-\def\rkv@DDK#1{%
- \addto@group@reset#1{\def#1{\@empty}}%
- \@xp\let\csname \rkv@setter#1\endcsname\@gobble
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\DSK@def}
-% \begin{macrocode}
-\def\DSK@def#1{%
- \ifx#1\@empty\else
- \PackageWarningNoLine{rkeyval}%
- {Key \string#1 should not be repeated}%
- \fi
- \DSK@redef#1%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\DSK@redef}
-% We weed out empty field values for consistency with
-% \cs{DSK@append}.
-% \begin{macrocode}
-\def\DSK@redef#1#2{%
- \@ifempty{#2}{\@gobble}{%
- \def#1{#2}%
- \set@property#1
- }%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\init@group@reset}
-% \begin{macrocode}
-\def\init@group@reset#1{%
- \begingroup
- \edef\@tempb{\@xp\@nx\csname #1@reset\endcsname}%
- \@xp\ifx\@tempb\relax
- \@xp\xdef\@tempb{\let \csname #1,aux\endcsname\@nx\@empty}
- \fi
- \endgroup
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\addto@group@reset}
-% \begin{macrocode}
-\def\addto@group@reset#1{%
- \begingroup
- \edef\@tempa{\extract@group#1}%
- \init@group@reset\@tempa
- \edef\@tempa{%
- \@nx\g@addto@macro\@xp\@nx\csname\@tempa @reset\endcsname
- }%
- \@xp\endgroup
- \@tempa
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\DefineSimpleKey}
-% \begin{macrocode}
-\newcommand{\DefineSimpleKey}[2]{%
- \@xp\rkv@DSAK
- \csname #1'#2\endcsname
- {\DSK@def}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\DefineSupersedingKey}
-% \begin{macrocode}
-\newcommand{\DefineSupersedingKey}[2]{%
- \@xp\rkv@DSAK
- \csname #1'#2\endcsname
- {\DSK@redef}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\DefineAdditiveKey}
-% \begin{macrocode}
-\newcommand{\DefineAdditiveKey}[3]{%
- \@xp\rkv@DSAK
- \csname #1'#2\endcsname
- {\DSK@append#3}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\DSK@append}
-% We weed out empty field values (e.g., |editor={}| or
-% \verb*|editor={ }|) because otherwise an additive field could
-% end up with a value like |\name{}| which appears non-empty to
-% \cs{rkvIfEmpty} but produces no output on the page.
-% \begin{macrocode}
-\def\DSK@append#1#2#3{%
- \@ifempty{#3}{\@gobble}{%
- \@append#1#2{#3}%
- \set@property#2
- }%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\DefineDummyKey}
-% \begin{macrocode}
-\newcommand{\DefineDummyKey}[2]{%
- \@xp\rkv@DDK \csname #1'#2\endcsname
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\RestrictedSetKeys}
-% \begin{macrocode}
-\newcommand{\RestrictedSetKeys}[3]{%
- \global\rsk@toks\@xp{\csname #2@reset\endcsname}%
- \def\rsk@finish{#3}%
- \gdef\rsk@set{\@xp\rsk@set@a\csname#2'}%
- #1\relax
- \begingroup
- \rsk@changecase
- \aftergroup\rsk@set
-% \end{macrocode}
-% Start by removing the opening brace.
-% \begin{macrocode}
- \let\fsa@t\rsk@z
- \fsa@l
-}
-% \end{macrocode}
-% \end{macro}
-%
-% The aftergroup tokens end up looking like this:
-% \begin{verbatim}
-% \lowercase{\rsk@set FIELDNAME\endcsname}
-% --> \@xp\rsk@set@a\csname bib'fieldname\endcsname
-% --> \rsk@set@a\bib'abcdef
-%\end{verbatim}
-%
-% \begin{macro}{\rsk@unknown@key}
-% \begin{macrocode}
-\def\rsk@unknown@key#1{%
- \PackageWarning{rkeyval}{Unknown key: \string#1}%
- \@xp\def\csname\rkv@setter#1\endcsname {\DSK@redef#1}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \section{The state machine}
-%
-%\begin{verbatim}
-% State 0: Skip opening brace (\rsk@z).
-% space -> 0
-% { -> 2
-% other -> error "Missing open brace"
-%
-% State 1: Skip comma (\rsk@a).
-% space -> 1
-% \par -> 1
-% comma -> 2
-% @ -> read optional arg; 1
-% } -> 6
-% other -> error "Missing comma"; 2
-%
-% State 2: Find field name (\rsk@b).
-% space -> 2
-% \par -> 2
-% comma -> 2
-% letter -> 3
-% { -> error "Missing key name"; 4
-% } -> 6
-% other -> error "Invalid key name character"; 2
-%
-% State 3: Scan field name (\rsk@c).
-% letter -> 3
-% comma -> error "Invalid key name character"; 3
-% equal -> 4
-% other punct -> 3
-% space -> 4
-% { -> error "Missing equal sign"; 4
-% } -> error "Missing equal sign"; 4
-% other -> error "Invalid key name character"; 3
-%
-% State 4: Skip equals (\rsk@d).
-% space -> 4
-% equal -> 4
-% { -> 5
-% other -> error "Missing { for value of current key"; 5
-%
-% State 5: Read field value (\rsk@set@a).
-% any -> 1
-%
-% State 6: Done (\rsk@end).
-%\end{verbatim}
-%
-% \begin{macro}{\rsk@z}
-% State 0: Skip opening brace.
-% \begin{macrocode}
-\def\rsk@z{%
- \ifx\bgroup\@let@token
- \let\fsa@t\rsk@b
- \let\fsa@n\fsa@b
- \else
- \ifx\@sptoken\@let@token
- \let\fsa@n\fsa@b
- \else
- \rsk@errf
- \fi
- \fi
- \fsa@n
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\rsk@a}
-% State 1: Skip comma.
-% \begin{macrocode}
-\def\rsk@a{%
- \ifx\@let@token\@sptoken
- \let\fsa@n\fsa@b
- \else
- \ifx\@let@token\par
- \let\fsa@n\fsa@b
- \else
- \ifx,\@let@token
- \endgroup
- \let\fsa@t\rsk@b
- \let\fsa@n\fsa@b
- \else
- \ifx\egroup\@let@token
- \endgroup
- \let\fsa@n\rsk@end
- \else
- \endgroup
- \let\fsa@n\rsk@erraa
- \fi
- \fi
- \fi
- \fi
- \fsa@n
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\rsk@b}
-% State 2: Find field name.
-%
-% Allow \cs{par} here to permit a blank line after
-% the end of one key-val pair and the start of the next (perhaps to
-% break up a long list into sections).
-% \begin{macrocode}
-\def\rsk@b{%
- \ifcat\@nx\@let@token A%
- \let\fsa@t\rsk@c
- \let\fsa@n\fsa@c
- \else
- \ifx\@sptoken\@let@token
- \let\fsa@n\fsa@b
- \else
- \rsk@bb
- \fi
- \fi
- \fsa@n
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\rsk@bb}
-% \begin{macrocode}
-\def\rsk@bb{%
- \ifx,\@let@token
- \let\fsa@n\fsa@b
- \else
- \ifx\bgroup\@let@token
- \let\fsa@n\rsk@errb
- \else
- \ifx\egroup\@let@token
- \let\fsa@n\rsk@end
- \else
- \ifx\par\@let@token
- \let\fsa@n\fsa@b
- \else
- \let\fsa@n\rsk@errc
- \fi
- \fi
- \fi
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\rsk@c}
-% State 3: Scan field name.
-% \begin{macrocode}
-\def\rsk@c{%
- \ifcat\@nx\@let@token A%
- \let\fsa@n\fsa@c
- \else
- \ifx\@sptoken\@let@token
- \let\fsa@t\rsk@d
- \let\fsa@n\fsa@b
- \else
- \ifx=\@let@token
- \let\saw@equal T%
- \let\fsa@t\rsk@d
- \let\fsa@n\fsa@b
- \else
- \rsk@cb
- \fi
- \fi
- \fi
- \fsa@n
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\rsk@cb}
-% \begin{macrocode}
-\def\rsk@cb{%
- \ifx,\@let@token
- \let\fsa@n\rsk@errc
- \else
- \ifcat\@nx\@let@token .%
- \let\fsa@n\fsa@c
- \else
- \ifx\bgroup\@let@token
- \let\fsa@n\rsk@noequal
- \else
- \ifx\egroup\@let@token
- \let\fsa@n\rsk@noequal
- \else
- \let\fsa@n\rsk@errc
- \fi
- \fi
- \fi
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\saw@equal}
-% \begin{macrocode}
-\let\saw@equal=F
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\rsk@d}
-% State 4: Skip equals.
-%
-% If no equal sign ever came
-% along, then give a warning about it and set \cs{saw@equal} to true
-% so that when \cs{rsk@noequal} cycles through again it will take the
-% other branch.
-% \begin{macrocode}
-\def\rsk@d{%
- \ifx\bgroup\@let@token
- \ifx\saw@equal T%
- \aftergroup\endcsname
- \rsk@endcase
- \let\fsa@n\endgroup
- \else
- \let\saw@equal T%
- \let\fsa@n\rsk@noequal
- \fi
- \else
- \ifx\@sptoken\@let@token
- \let\fsa@n\fsa@b
- \else
- \ifx=\@let@token
- \let\saw@equal T%
- \let\fsa@n\fsa@b
- \else
- \let\fsa@n\rsk@erre
- \fi
- \fi
- \fi
- \fsa@n
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\rsk@casesensitive}
-% \begin{macrocode}
-\def\rsk@casesensitive{%
- \let\rsk@changecase\@empty
- \let\rsk@endcase\@empty
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\rsk@startlc}
-% \begin{macrocode}
-\def\rsk@startlc{\aftergroup\lowercase\aftergroup{\iffalse}\fi}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\rsk@endlc}
-% \begin{macrocode}
-\def\rsk@endlc{\iffalse{\fi\aftergroup}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\rsk@lowercase}
-% \begin{macrocode}
-\def\rsk@lowercase{%
- \let\rsk@changecase\rsk@startlc
- \let\rsk@endcase\rsk@endlc
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macrocode}
-\rsk@lowercase
-% \end{macrocode}
-%
-% \begin{macro}{\rsk@resume}
-% Here we get improved reporting of error context by changing
-% end-of-line to be different from normal space. If we don't find a
-% comma on the current line, assume it is an error.
-% \begin{macrocode}
-\def\rsk@resume{%
- \begingroup
- \rsk@changecase
- \aftergroup\rsk@set
- \let\fsa@t\rsk@a
- \begingroup
- \catcode\endlinechar=\active
- \lccode`\~=\endlinechar
- \lowercase{\let~\par}%
- \fsa@l
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\rsk@set@a}
-% State 5: Read field value.
-% \begin{macrocode}
-\def\rsk@set@a#1#2{%
- \star@{\rsk@set@b#1{#2}}{}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\rsk@set@b}
-% \begin{macrocode}
-\def\rsk@set@b#1#2#3{%
- \@xp\ifx \csname\rkv@setter#1\endcsname \relax
- \rsk@unknown@key#1%
- \fi
- \edef\@tempa{\@xp\@nx\csname \rkv@setter#1\endcsname}%
- \toks@\@xp{\@tempa{#2}{#3}}%
- \edef\@tempa{%
- \global\rsk@toks{\the\rsk@toks \the\toks@}%
- }%
- \@tempa
- \rsk@resume
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\rsk@end}
-% State 6: Done.
-%
-% Lets see, now why did I add this?
-% \begin{macrocode}
-\def\rsk@end{%
- \global\let\rsk@set\rsk@terminate
- \rsk@endcase
- \endgroup
- \endcsname
- \afterassignment\rsk@finish
- \toks@\bgroup
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\rsk@terminate}
-% \begin{macrocode}
-\def\rsk@terminate{\@xp\@gobble\csname}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\NoCommaWarning}
-% \begin{macrocode}
-\def\NoCommaWarning{\PackageWarning{rkeyval}{Missing comma}}%
-% \end{macrocode}
-% \end{macro}
-%
-%% % \begin{macro}{\NoCommaError}
-%% % \begin{macrocode}
-%% \def\NoCommaError{\rsk@err{Missing comma}\@ehc}
-%% % \end{macrocode}
-%% % \end{macro}
-%
-% \begin{macro}{\rsk@nocomma}
-% \begin{macrocode}
-\def\rsk@nocomma{\NoCommaWarning}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\rsk@err}
-% \begin{macrocode}
-\def\rsk@err{\PackageError{rkeyval}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\rsk@errf}
-% \begin{macrocode}
-\def\rsk@errf{\rsk@err{Missing open brace}\@ehc\rsk@b}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\rsk@erraa}
-% \begin{macrocode}
-\long\def\rsk@erraa{\rsk@nocomma \let\fsa@t\rsk@b \fsa@l}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\rsk@errb}
-% \begin{macrocode}
-\def\rsk@errb{\rsk@err{Missing key name}\@ehc\rsk@d}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\rsk@errc}
-% \begin{macrocode}
-\def\rsk@errc{\rsk@err{Invalid key name character}\@ehc\fsa@b}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\rsk@noequal}
-% \begin{macrocode}
-\def\rsk@noequal{\rsk@err{Missing equal sign}\@ehc\rsk@d}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\rsk@erre}
-% In this case we guess that the value is without braces but probably
-% terminated with a comma. We want to scan up to the comma in order
-% to get back in synch.
-% \begin{macrocode}
-\def\rsk@erre#1,{%
- \rsk@err{Missing open brace for key value}\@ehc
- \iffalse{\fi
- \endgroup
- \endcsname
- \rsk@endcase }{#1},%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macrocode}
-\PopCatcodes
-% \end{macrocode}
-%
-% The usual \cs{endinput} to ensure that random garbage at the end of
-% the file doesn't get copied by \fn{docstrip}.
-% \begin{macrocode}
-\endinput
-% \end{macrocode}
-%
-% \CheckSum{871}
-% \Finale