summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/amsrefs/amsrefs.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/amsrefs/amsrefs.dtx')
-rw-r--r--macros/latex/contrib/amsrefs/amsrefs.dtx8389
1 files changed, 8389 insertions, 0 deletions
diff --git a/macros/latex/contrib/amsrefs/amsrefs.dtx b/macros/latex/contrib/amsrefs/amsrefs.dtx
new file mode 100644
index 0000000000..910ef3d889
--- /dev/null
+++ b/macros/latex/contrib/amsrefs/amsrefs.dtx
@@ -0,0 +1,8389 @@
+% \def\filename{amsrefs.dtx}
+% \def\fileversion{2.14}
+% \def\filedate{2013/03/07}
+%
+% \iffalse meta-comment
+%
+% American Mathematical Society
+% Technical Support
+% Publications Technical Group
+% 201 Charles Street
+% Providence, RI 02904
+% USA
+% tel: (401) 455-4080
+% (800) 321-4267 (USA and Canada only)
+% fax: (401) 331-3842
+% email: tech-support@ams.org
+%
+% Copyright 2001, 2004, 2006, 2007, 2010, 2012, 2013 American Mathematical Society.
+%
+% 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.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c 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 Maintainer of this work is the American Mathematical
+% Society.
+%
+% \fi
+%
+% \iffalse
+%<*driver>
+\NeedsTeXFormat{LaTeX2e}
+\documentclass[draft,oneside]{amsdtx}
+
+\setcounter{secnumdepth}{3}
+\setcounter{tocdepth}{3}
+
+\DoNotIndex{\bib,\BibSpec,\@apply,\citesel,\cite@cj,\cite}
+\DoNotIndex{\IfOption,\add@toks@,\@emptytoks}
+
+\makeatletter
+\DeclareRobustCommand{\fld}{\category@index{field}}
+\DeclareRobustCommand{\btype}{\category@index{entry type}}
+\DeclareRobustCommand{\attr}{\category@index{attribute}}
+\makeatother
+
+%\OnlyDescription
+
+\usepackage{amsrefs}
+\usepackage{multicol}
+
+\newcommand{\rpack}[1]{\pkg{amsrefs} package}
+
+\newcommand{\MacroArgs}{%
+ \par
+ \medskip \noindent\emph{Arguments}: \par}
+
+\newcommand{\macroarg}[2]{
+ \texttt{\arg{#1} <- }\emph{#2}\unkern\texttt{.}\par}
+
+\newenvironment{bug}{%
+ \quote
+ \emph{Known bug:}}
+ {\endquote}
+
+% Make this a self-contained document without separate .bbl file.
+\newcommand{\PrintBibliography}{%
+ \begin{bibsection}\begin{biblist}\raggedright
+ \bib{Jones2004}{article}{
+ author={Jones, David M.},
+ title={User's Guide to the \pkg{amsrefs} Package},
+ note={distributed with the \pkg{amsrefs} code}
+ }
+ \bib{SOS99}{book}{
+ author={Swanson, Ellen},
+ author={O'Sean, Arlene},
+ author={Schleyer, Antoinette},
+ title={Mathematics into Type},
+ edition={updated},
+ year={1999},
+ publisher={American Mathematical Society},
+ }
+ \end{biblist}\end{bibsection}
+}
+
+\makeatletter
+
+\def\nametest#1{%
+ \par
+ \begingroup
+ \let\EmptyNameWarning\relax
+ \vdef\@tempa{#1}%
+ {\tt author=\embrace\@tempa}:
+ \name@split#1,,,\@nil
+ G=\@showname{given}
+ S=\@showname{surname}
+ J=\@showname{jr}%
+ \endgroup
+}
+
+\def\@showname#1{%
+ {\ntt\lbracechar}%
+ {\tt\@xp\macrotext\csname bib'#1\endcsname}%
+ {\ntt\rbracechar}
+}
+
+\def\initialtest#1{%
+ \par
+ \begingroup
+ \vdef\@tempa{#1}%
+ {\tt author=\embrace\@tempa}:
+ \name@split#1,,,\@nil
+ I={\ntt\lbracechar}\csname bib'initials\endcsname{\ntt\rbracechar}%
+ \endgroup
+}
+
+\makeatother
+
+\CodelineIndex
+
+\begin{document}
+\title{The \pkg{amsrefs} package}
+\author{Michael Downes and David M. Jones\\American Mathematical Society}
+\date{Version \fileversion, \filedate}
+\DocInput{amsrefs.dtx}
+\PrintIndex
+\end{document}
+%</driver>
+% \fi
+%
+% \MakeShortVerb{\|}
+%
+% \maketitle
+%
+% \tableofcontents
+%
+% \section{Introduction}
+%
+% The \rpack/ is a \latex/ package for bibliographies that provides an
+% archival data format similar to the format of \bibtex/ database
+% files, but adapted to make direct processing by \latex/ easier. The
+% package can be used either in conjunction with \bibtex/ or as a
+% replacement for \bibtex/.
+%
+% This document is written for anyone who wants to implement a new
+% bibliography style for \pkg{amsrefs} or who is just curious about
+% how the package is implemented.
+% The reader should be familiar with the contents of the ``User's
+% Guide to the \pkg{amsrefs} Package''~\cite{Jones2004}
+% (\fn{amsrdoc.tex}).
+%
+% For the publisher or implementor, the chief advantages of the
+% \rpack/ are as follows:
+% \begin{description}
+%
+% \item[Preservation of structure]
+%
+% The internal structural information of the bibliography entries is not
+% lost when they are imported from the database file into the \latex/
+% document. This takes on its greatest significance when archiving
+% documents in \latex/ form or transmitting them to another user (such as a
+% publisher).
+%
+% \item[Deferred formatting]
+%
+% This means that the style of the bibliography can be readily changed
+% without reimporting everything from the original database(s).
+%
+% \item[Setup requires only \latex/ knowledge]
+%
+% All bibliography setup can be done in \latex/; learning another
+% programming language (such as the one used in \bibtex/ \fn{bst}
+% files) is unnecessary.
+%
+% \end{description}
+%
+% \section{Package options}
+%
+% In addition to the options documented in the user's guide, there
+% are a few additional options that were omitted either because
+% they are obsolete or deprecated options included only for
+% backwards compatability or because they are still considered
+% experimental and not yet ready for widespread use.
+%
+% \begin{description}
+%
+% \item[?]
+%
+% Informational option. This causes \pkg{amsrefs} to
+% display a pointer to the User's Guide on the terminal an in the
+% log file. (In previous versions, it displayed much more
+% material, including a summary of package options.)
+%
+% \item[traditional-quotes, logical-quotes]
+%
+% With the \textit{traditional quotes} option
+% (default), quotation marks produced by \cn{bibquotes}
+% (\secref{misc-cmds}) fall outside of other punctuation, ``like
+% this,'' whereas with the \textit{logical quotes} option the order
+% is reversed, ``like this''.
+%
+% \end{description}
+%
+% \section{More about the \cn{bib} command}\label{bib-command}
+%
+% \subsection{Field names for the \cn{bib} command}
+%
+% In addition to the fields discussed in the user's guide, the
+% following fields are used internally:
+% \begin{description}
+%
+% \item[fulljournal]
+%
+% Used internally by \cn{DefineJournal}.
+%
+% \item[name]
+%
+% Used internally by the \btype{name} bibliography type and
+% \cn{DefineName}.
+%
+% \item[transition]
+%
+% A dummy field used inside \cs{BibSpec}s when we want to force an
+% action unconditionally.
+%
+% \end{description}
+%
+% The following fields are included for backwards compatibility:
+% \begin{description}
+%
+% \item[institution, school]
+%
+% These are provided as aliases for \fld{organization} for
+% compatibility with \BibTeX.
+%
+% \item[place]
+%
+% A synonym for \fld{address}. In earlier versions of
+% \pkg{amsrefs}, \fld{place} was preferred and \fld{address} was
+% considered as an alias for \fld{place}. However, this seemed
+% like a gratuitous incompatibility with \BibTeX\ to me, so I have
+% reinstated \fld{address} as the primary field and \fld{place} is
+% now an undocumented alias.
+%
+% \end{description}
+%
+% The following fields are reserved for future use:
+% \begin{description}
+%
+% \item[doi] Digital Object Identifier
+%
+% \item[setup]
+%
+% This is a special field that can be used to give arbitrary
+% commands to be executed at the beginning of the current \cn{bib}
+% entry, after all the fields have been read. The idea is that one
+% can alter the formatting of an individual entry through this
+% field, to handle special cases.
+%
+% This is fully implemented, but I've been unable to think of any
+% good examples of its use; so, I've decided to suppress it until
+% such an example comes to light.
+%
+% \item[url] Universal Resource Locator.
+%
+% \end{description}
+%
+% \subsection{Bibliography entry types}
+%
+% The following additional entry types (or, really, pseudo-entry
+% types) are used internally by \pkg{amsrefs}:
+% \begin{description}
+%
+% \item[collection.article]
+%
+% \item[proceedings.article]
+%
+% \item[partial]
+%
+% \item[conference]
+%
+% \item[innerbook]
+%
+% \item[name]
+%
+% \item[nameLE]
+%
+% \item[nameBE]
+%
+% \item[nameinverted]
+%
+% \item[publisher]
+%
+% \end{description}
+%
+% The following are currently undocumented aliases for various of
+% the standard types:
+% \begin{description}
+%
+% \item[miscellaneous]
+%
+% \item[periodical]
+%
+% \end{description}
+%
+% \section{Customizing the bibliography style}\label{other-styles}
+%
+% If you use the \rpack/ as is, the bibliography style you get is the
+% kind of style customarily seen in AMS publications. The recommended
+% way to get a different bibliography style is to write a \latex/
+% package which loads the \rpack/ with \cn{RequirePackage} and
+% then makes the desired changes by using suitable \cn{BibSpec}
+% commands as explained below. Thus, the general form of the custom
+% package will be
+% \begin{verbatim}
+% \ProvidesPackage{xyzbib}[2002/11/06 v1.28]
+%
+% \RequirePackage{amsrefs}\relax
+%
+% \BibSpec{article}{
+% ...
+% }
+%
+% \BibSpec{book}{
+% ...
+% }
+%\end{verbatim}
+%
+% The interior formatting within entries is specified by \cn{BibSpec}
+% commands, one for each entry type. To illustrate, let's look at an
+% example style specification for entries of type \btype{article}:
+% \begin{verbatim}
+% \BibSpec{article}{%
+% +{}{\PrintAuthors} {author}
+% +{,}{ \textit} {title}
+% +{,}{ } {journal}
+% +{}{ \textbf} {volume}
+% +{}{ \parenthesize} {date}
+% +{,}{ } {pages}
+% +{,}{ } {note}
+% +{.}{} {transition}
+% +{}{ } {review}
+% }
+%\end{verbatim}
+%
+% It should be pretty obvious that each line specifies the formatting
+% for a particular field. After reading the data for a particular
+% \cn{bib} command, \latex/ steps through the style specification and
+% for each
+% field listed, prints the field with the given formatting \emph{if
+% and only if the field has a nonempty value}. The \verb'+' character
+% at the beginning of each field specification must be followed by three
+% arguments: the punctuation to be added if the field is nonempty;
+% space and/or other material to be added after the punctuation; and
+% the field name. It is permissible for the second part to end with a
+% command that takes an argument, such as \cn{textbf}, in which case
+% it will receive the field's value as its argument. By defining a
+% suitable command and using it here you can place material after the
+% field contents as well as before; \cn{parenthesize} is an example
+% of this.
+%
+% The reason that the punctuation and the following space are specified
+% separately is that between them there is a crucial boundary for line
+% breaks. If you put a \cn{linebreak} command at the end of a field value,
+% the break point will actually be carried onward to a suitable point after
+% the next bit of punctuation (whose actual value may vary depending on
+% which of the following fields is the first to turn up with a nonempty
+% value).
+%
+% The meaning of the \cn{parenthesize} command, supplied by
+% \pkg{amsrefs}, should be obvious. The meaning of the \cn{PrintAuthors}
+% command is a different story. But I don't think it is all that hard to
+% understand. If we have two or more author names which were given
+% separately,
+% and we need to combine them into a conventional name list using commas
+% and the word \qq{and}, then it would be nice if we had a command which
+% could take a list of names and Do The Right Thing. And that is just
+% what \cn{PrintAuthors} is.
+%
+% The \pkg{rkeyval} package allows keys to be defined as additive: if the
+% key occurs more than once, each successive value will be concatenated to
+% the previous value, along with a prefix. The setup done by
+% \pkg{amsrefs} for the \fld{author} field is
+% \begin{verbatim}
+% \DefineAdditiveKey{bib}{author}{\name}
+%\end{verbatim}
+% This means that if two names are given, as in
+% \begin{verbatim}
+% author={Bertram, A.},
+% author={Wentworth, R.},
+%\end{verbatim}
+% then the final value of the \fld{author} field seen when \latex/
+% processes the style specification will be
+% \begin{verbatim}
+% \name{Bertram, A.}\name{Wentworth, R.}
+%\end{verbatim}
+%
+% The \fld{transition} field in our \cn{BibSpec} example is a dummy
+% field to be
+% used when punctuation or other material must be added at a certain point
+% in the bibliography without regard to the emptiness or non-emptiness of
+% the fields after it. The \fld{transition} field always tests as non-empty
+% but has no printed content. So when you use it you always get the
+% indicated punctuation and space at the indicated point in the list of
+% fields. If it were the last thing in this \cn{BibSpec} example, it could
+% serve just to put in the final period that is always wanted. But in AMS
+% bibliographies, if a \emph{Mathematical Reviews} reference is given, it is
+% conventionally printed \emph{after} the final period. Using the
+% \fld{transition} field as shown here ensures that the final period will
+% be always printed, even when the \fld{review} field is empty.
+%
+% \section{Miscellaneous commands provided by the \pkg{amsrefs}
+% package}\label{misc-cmds}
+%
+% Most of the following commands are helper commands for use in
+% \cn{BibSpec} statements. The others are intended for use in bibliography
+% data.
+% \begin{description}
+%
+% \item[\cn{parenthesize}]\SpecialUsageIndex{\parenthesize}
+% This command adds parentheses around its
+% argument. It is useful in \cn{BibSpec} statements because there is no
+% special provision for adding material after the field value.
+%
+% \item[\cn{bibquotes}]\SpecialUsageIndex{\bibquotes}
+% This command is much like \cn{parenthesize} but
+% it adds quotes around its argument and it has one other important
+% difference: there are special arrangements to print the closing quote
+% \emph{after} a following comma or similar punctuation (unless the
+% \pkg{amsrefs} package is invoked with the \opt{logical-quotes} option,
+% in which case \cn{bibquotes} puts the closing quote immediately after
+% the quoted material).
+%
+% \item[\cn{voltext}]\SpecialUsageIndex{\voltext}
+% This is used to format volume numbers. By default, it precedes
+% the volume number by ``vol.''
+%
+% \item[\cn{issuetext}]\SpecialUsageIndex{\issuetext}
+% This is used to format issue numbers. By default, it precedes
+% the volume number by ``no.''
+%
+% \item[\cn{editiontext}]\SpecialUsageIndex{\editiontext}
+% This command produces ``ed.''\ following an
+% edition number. See \cn{PrintEdition} for more information.
+%
+% \item[\cn{DashPages}]\SpecialUsageIndex{\DashPages}
+% This command is similar in spirit to
+% \cn{voltext} but more complicated in its implementation. It takes
+% one argument which is expected to contain one or more page numbers
+% or a range of page numbers. The argument is printed with a prefix
+% of \qq{p.} if it seems to be a single page number, otherwise with a
+% prefix of \qq{pp.}.
+%
+% \item[\cn{tsup}, \cn{tsub}, \cn{tprime}]\SpecialUsageIndex{\tsup}
+% \SpecialUsageIndex{\tsub}\SpecialUsageIndex{\prime}
+% These are for text subscripts
+% and superscripts, with \cn{tprime} producing a superscript prime
+% symbol. Unlike the standard \cn{textsuperscript} and
+% \cn{textsubscript} functions provided by \latex/, these do not use
+% math mode at all.\footnote{There is one drawback: If you don't
+% want to get the prime symbol for \cn{tprime} from the \fnt{cmsy}
+% font, you will need to redefine \cn{tprime} in some suitable
+% way.}
+%
+% \item[\cn{nopunct}]\SpecialUsageIndex{\nopunct}
+% This command causes following punctuation to be omitted if it is
+% added with the internal function \cs{@addpunct}.
+%
+% \item[\cn{PrintPrimary}]\SpecialUsageIndex{\PrintPrimary}
+% This is a relatively complicated function that determines the
+% ``primary'' contributors for an entry and formats them, or
+% replaces them by \cn{sameauthors} if appropriate. It should be
+% used when an entry type might have editors or translators instead
+% of authors. It prefers authors over editors and editors over
+% translators and generates a warning if there are no primary
+% contributors.
+%
+% \item[\cn{PrintAuthors}]\SpecialUsageIndex{\PrintAuthors}
+% This is used to format the list of authors as the primary
+% contributors for an entry type.
+%
+% \item[\cn{PrintEditorsA}]\SpecialUsageIndex{\PrintEditorsA}
+% This is similar to \cn{PrintAuthors} but adds |(ed.)| or |(eds.)|
+% following the editors.
+%
+% \item[\cn{PrintEditorsB}]\SpecialUsageIndex{\PrintEditorsB}
+% This is similar to \cn{PrintEditorsA} but puts parentheses around
+% the entire list of editors. It's used by, for example, the
+% \btype{article} type to print the editors of a
+% \btype{proceedings} or \btype{collection}.
+%
+% \item[\cn{PrintEditorsC}]\SpecialUsageIndex{\PrintEditorsC}
+% Similar to \cn{PrintEditorsA} but precedes the editors by
+% |Edited by|. It's used when the editors should be treated as
+% subsidiary contributors, rather than the primary contributor.
+%
+% \item[\cn{PrintTranslatorsA}]\SpecialUsageIndex{\PrintTranslatorsA}
+% This is similar to \cn{PrintEditorsA} but adds |(trans.)|
+% following the translators.
+%
+% \item[\cn{PrintTranslatorsB}]\SpecialUsageIndex{\PrintTranslatorsB}
+% This is similar to \cn{PrintEditorsB}. It's not currently used,
+% but is provided for symmetry.
+%
+% \item[\cn{PrintTranslatorsC}]\SpecialUsageIndex{\PrintTranslatorsC}
+% Similar to \cn{PrintEditorsC} but precedes the translators by
+% |Translated by|.
+%
+% \item[\cn{sameauthors}]\SpecialUsageIndex{\sameauthors}
+% This is a function of one argument. If you use
+% the default set of \cn{BibSpec}s from the \pkg{amsrefs},
+% \cn{sameauthors} is applied to the author name for a given \cn{bib}
+% command if it matches exactly the author name of the preceding
+% \cn{bib} command. Change the definition of \cn{sameauthors} if you
+% don't want to get a bysame dash.
+%
+% \item[\cn{bysame}]\SpecialUsageIndex{\bysame}
+% This is a horizontal rule of length 3~em. The default
+% definition of \cn{sameauthors} prints \cn{bysame} instead of the
+% author names.
+%
+% \item[\cn{Plural}, \cn{SingularPlural}]\SpecialUsageIndex{\Plural}
+% \SpecialUsageIndex{\SingularPlural}
+% These are helper functions
+% that allow you to conditionally
+% print singular or plural forms such as \verb'(ed.)' or \verb'(eds.)'
+% depending on the number of names in the current name list.
+% The definition of \cn{PrintEditorsA} reads, in part,
+% \begin{verbatim}
+% ... (ed\Plural{s}.) ...
+%\end{verbatim}
+%
+% \item[\cn{PrintReviews}]\SpecialUsageIndex{\PrintReviews}
+% This is similar to \cn{AuthorList} but is used for
+% printing (possibly multiple) MR numbers given in the \fld{review}
+% field.
+%
+% \item[\cn{BibField}]\SpecialUsageIndex{\BibField}
+% This is for more complicated programming tasks such
+% as may be necessary for some \cn{BibSpec}s. It takes one
+% argument, a field name, and yields the contents of that field for
+% the current \cn{bib} entry.
+%
+% \item[\cn{IfEmptyBibField}]\SpecialUsageIndex{\IfEmptyBibField}
+% If one writes
+% \begin{verbatim}
+% \IfEmptyBibField{isbn}{A}{B}
+%\end{verbatim}
+% then the commands in A will be executed if the \fld{isbn} field is empty,
+% otherwise the commands in B.
+%
+% \item[\cn{PrintEdition}]\SpecialUsageIndex{\PrintEdition}
+% If a bibliography entry has
+% \begin{verbatim}
+% edition={2}
+%\end{verbatim}
+% and the \cn{BibSpec} used \cn{PrintEdition} to handle this field, then the
+% edition information will be printed as \qq{2nd ed.}\mdash that is, the
+% number is converted to cardinal form and \qq{ed.} is added (taken from
+% \cn{editiontext}).
+%
+% \item[\cn{CardinalNumeric}]\SpecialUsageIndex{\CardinalNumeric}
+% This provides the conversion to cardinal
+% number form used by \cn{PrintEdition}.
+%
+% \item[\cn{PrintDate}, \cn{PrintYear}]\SpecialUsageIndex{\PrintDate}
+% \SpecialUsageIndex{\PrintYear}
+% These functions convert a date in
+% canonical form (ISO 8601) to the form required by the current
+% bibliography style. You can get your preferred date form by
+% redefining these functions or by changing your \cn{BibSpec} statements
+% to use another function of your own devising. The original definition
+% of \cn{PrintDate} adds parentheses (as for the year of a journal article
+% in normal AMS style), whereas the \cn{PrintYear} function simply
+% prints the year without any additional material (as for a book's year
+% of publication in normal AMS style).
+%
+% \item[\cn{mdash}, \cn{ndash}]\SpecialUsageIndex{\mdash}
+% \SpecialUsageIndex{\ndash}
+% These are short forms for \cn{textemdash}
+% and \cn{textendash}, recommended instead of the more usual \verb'---'
+% and \verb'--' notation. From the \pkg{textcmds} package.
+%
+% \item[et cetera \dots] [mjd,2002-01-03] See the \fn{.dtx} files for
+% further possibilities that I have not managed to get properly
+% documented yet!
+% \end{description}
+%
+% \StopEventually{\PrintBibliography}
+% \iffalse
+% \clearpage
+% \typeout{@@@ That was the last page of the OnlyDescription}
+% \fi
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \section{Implementation}
+%
+% \subsection{Overview}
+%
+% It will be a while yet before we get to any actual code. First we
+% need to understand what the code needs to accomplish in order to
+% provide the user interface described above in a way that is as
+% compatible as possible with existing \latex/ mechanisms.
+%
+% \subsubsection{Normal \latex/ processing of cites}
+%
+% \paragraph{First \latex/ pass}
+%
+% Various commands are written to the \fn{.aux} file that are
+% mostly used by \bibtex/.
+% \begin{enumerate}
+% \item A \cnm{cite}{moo} command writes one line to the \fn{.aux} file:
+% \cnm{citation}{moo}. This indicates to \bibtex/ that it should
+% include `moo' in the list of cited items to be searched for.
+% The \cn{cite} command also checks to see if \cs{b@moo} contains
+% the corresponding citation label, but since this is the first
+% pass, the label won't be known yet, so \latex/ emits an `Undefined
+% citation' warning and prints a placeholder (i.e., \textbf{???})
+% instead of the citation label.
+%
+% \item A \cnm{bibliographystyle}{har} command writes one line to the
+% \fn{.aux} file: \cnm{bibstyle}{har}. This indicates to \bibtex/ that it
+% should use \fn{har.bst} to determine the style for sorting and
+% formatting the bibliography items.
+%
+% \item A \cnm{bibliography}{hij,klm,...} command writes one line to the
+% \fn{.aux} file: \cnm{bibdata}{hij,klm,...}. This indicates to \bibtex/
+% that it should look in \fn{hij.bib}, \fn{klm.bib}, \dots\ for
+% bibliographic data. The \cn{bibliography} also tries to input
+% the \fn{.bbl} file, but on the first pass it won't exist
+% yet.
+%
+% \end{enumerate}
+%
+% On the first pass all \cn{cite}'s normally are reported as
+% undefined because the \fn{.bbl} file has not yet been created.
+%
+% \paragraph{\bibtex/ pass}
+%
+% For a document named \fn{xyz.tex}, the command \verb'bibtex xyz' is
+% used to invoke \bibtex/. It looks in \fn{xyz.aux} to find the
+% citation information written there by \latex/. For each \cn{citation} line,
+% \bibtex/ searches for a corresponding entry in the specified
+% \fn{.bib} files and formats it. The entire list is then sorted in
+% whatever way dictated by the bibliography style, and written out to
+% the file \fn{xyz.bbl}. This normally produces entries that look
+% something like:
+% \begin{verbatim}
+% \bibitem{BGL} P. Busch, M. Grabowski and P. J. Lahti:
+% {\it Operational Quantum Physics.}
+% Springer Verlag, New York (1995).
+%\end{verbatim}
+%
+% \paragraph{Second \latex/ pass}
+%
+% Now the \fn{.bbl} file exists and contains some \cn{bibitem}
+% commands. At \cnm{begin}{document}, \latex/ reads the \fn{.aux} file,
+% hoping to find some \cn{bibcite} commands, but it will not find
+% them until the next time around. \cn{citation}, \cn{bibstyle}, and
+% \cn{bibdata} commands in the \fn{.aux} file are simply ignored by \latex/.
+% Then \latex/ proceeds to typeset the body of the document.
+% \begin{enumerate}
+% \item Instances of \cn{cite} still print question marks.
+%
+% \item The \cn{bibliography} command causes \latex/ to input \fn{xyz.bbl}
+% and typeset its contents.
+%
+% \item A \cnm{bibitem}{moo} command writes one line to the
+% \fn{.aux} file: \cnmm{bibcite}{moo}{9}, where 9 is the current item
+% number.
+%
+% \item A \cnom{bibitem}[Moody]{moo} command writes one line to the
+% \fn{.aux} file: \cnmm{bibcite}{moo}{Moody}, using the supplied label
+% instead of a number.
+%
+% \end{enumerate}
+%
+% \paragraph{Third \latex/ pass}
+%
+% Now the \fn{.aux} file contains some \cn{bibcite} commands. Once again,
+% \latex/ reads the \fn{.aux} file when it reaches \cnm{begin}{document}.
+% \begin{enumerate}
+%
+% \item A \cnmm{bibcite}{moo}{Moody} causes \latex/ to define \cs{b@moo}
+% with `Moody' as the replacement text.
+%
+% \item If two \cn{bibcite} commands have the same citation key, \latex/
+% gives a warning message. This happens at \cnm{begin}{document},
+% during the reading of the \fn{.aux} file.
+%
+% \item Instances of \cn{cite} in the body of the document will print
+% the appropriate labels obtained from the \fn{.aux} file.
+%
+% \item If there are any \cn{cite} commands for which the \fn{.aux} file did
+% not have a \cn{bibcite} command, \latex/ will give an `Undefined
+% citation' warning. This often happens if the \fn{.aux} file is incomplete
+% due to a \TeX{} error on the preceding pass.
+% \end{enumerate}
+%
+% \subsection{How cites are processed by \pkg{amsrefs}}
+%
+% In order to support its additional features (e.g., author-year
+% citations and the \opt{backrefs} option), the \rpack/ stores additional
+% information for each cite in the macro \cs{b@whatever}. Instead of
+% simply using the defined or undefined status of this macro to
+% trigger the standard warnings, we add some boolean flags to allow
+% us to discriminate more finely what the current situation is.
+% \begin{itemize}
+% \item Each time an item is cited in the body of the document, a
+% \texttt{backref} entry is added to the info of that item. The
+% \texttt{backref} info
+% is the current page and section location. Section location is a bit
+% hard to get right without better support from the document class.
+% So we provide a hook to allow it to work better when the support is
+% there.
+%
+% \item When a cite occurs, if the info is undefined then a warning is
+% issued and the info structure is created. A \cs{citation} command
+% and a \cs{citedest} command (providing backref info) are written to
+% the \fn{.aux} file. Because the backref info includes page number, it has
+% to be a non-immediate write.
+%
+% An undefined info structure would normally happen only on a first
+% pass when no \fn{.aux} file exists, or when a new cite is added.
+% I.e., when the corresponding \cs{citation} command is not yet
+% present in the \fn{.aux} file.
+%
+% \item When a citation command occurs in the \fn{.aux} file, it initializes
+% the info structure if necessary, setting the ``bib-info-present''
+% flag to 0.
+%
+% \item When a \cs{citedest} command occurs in the \fn{.aux} file, it
+% initializes the info structure if necessary---but this shouldn't
+% happen: if the corresponding \cs{citation} command did not already
+% get processed, then something is wrong. So normally, the
+% \cs{citedest} command merely needs to add its backref info to the
+% existing info structure.
+%
+% \item When a \cs{bibcite} command occurs in the \fn{.aux} file, it will
+% normally find that \cs{b@whatever} is already defined, if the
+% bibliography occurs after all the \cn{cite} commands. What it must
+% do is fill in the appropriate blank slots in the info structure
+% set up by a previous \cs{citation} command.
+%
+% \item The \fn{.aux} file is actually processed two times, once at the
+% beginning of the document and once at the end. In the latter case,
+% \cs{bibcite} should give a warning if the backref-list is empty,
+% since that means there were no \cn{cite} commands for the given
+% key.
+%
+% \item When processing the bibliography: The \cn{bib} command needs to
+% check if it is using a key that is already used by another \cn{bib}
+% command.
+% \end{itemize}
+%
+% We therefore have
+% \begin{verbatim}
+% \b@xyz -> \citesel 00{label}{year}{backref-list}
+%\end{verbatim}
+% where the first~0 is replaced by~1 if there has already been another
+% citation for the same key earlier in the document (some citation
+% styles use abbreviated forms for all instances after the first),
+% and the second~0 is replaced by~1 if the same key was already
+% used by an earlier \cn{bib} command.
+%
+% Because the backref-list often includes page number information, it
+% cannot be built on the fly as we go along; instead we have to write
+% the information to the \fn{.aux} file and read it in at the beginning of
+% the next run.
+%
+% If there was no \cs{bibcite} in the \fn{.aux} file for a given key, then
+% the info is
+% \begin{verbatim}
+% \b@xyz -> \citesel 00{}{}{backref-list}
+%\end{verbatim}
+% If there was neither \cs{citation} nor \cs{bibcite} in the \fn{.aux} file
+% for a given key, then the \cn{cite} command should find that
+% \ncn{b@xyz} is undefined.
+%
+% If the author-year option is in effect, the \qq{label} contains
+% the author last names instead of a label:
+% \begin{verbatim}
+% \b@xyz -> \citesel 00{\name{Smith}\name{Jones}}{...}{...}
+%\end{verbatim}
+% Full name information is included in the data because some citation
+% styles give full names at the first citation and abbreviated forms
+% for subsequent instances.
+%
+% \subsection{Data structures}
+%
+% The result of scanning the key/value pairs of a \cn{bib} command is
+% an assignment statement for \cs{rsk@toks}. (Cf.\@ the \pkg{rkeyval}
+% package.) For example, consider the entry
+% \begin{verbatim}
+% \bib{miller83}{article}{
+% author={Miller, G.},
+% title={Eine Bemerkung zur Darstellung von Polynomen \"{u}ber
+% Verb\"{a}nden}*{language={german}},
+% journal={J. Math. Sent.},
+% volume={10},
+% year={1983},
+% pages={26\ndash 30},
+% }
+%\end{verbatim}
+% The scanned result is to assign
+% \begin{verbatim}
+% \global\rsk@toks{%
+% \set:bib'author{Miller, G.}{}%
+% \set:bib'title{Eine Bemerkung zur Darstellung von Polynomen
+% \"{u}ber Verb\"{a}nden}{language={german}}%
+% \set:bib'journal{J. Math. Sent.}{}%
+% \set:bib'volume{10}{}%
+% \set:bib'year{1983}{}%
+% \set:bib'pages{26\ndash 30}{}%
+% }
+%\end{verbatim}
+% The code in the last arg of \cn{RestrictedSetKeys} then invokes
+% \cs{bib@exec} to do something with the value of \cs{rsk@toks}.
+% \begin{verbatim}
+% \bib@exec{miller83}{\the\rsk@toks}{\setbib@article}{}
+%\end{verbatim}
+%
+% \subsection{Preliminaries}
+%
+% \begin{macrocode}
+%<*pkg>
+% \end{macrocode}
+%
+% Standard declaration of package name and date.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesPackage{amsrefs}[2013/03/07 v2.14]
+% \end{macrocode}
+%
+% \begin{macro}{\amsrefs@warning@nl}
+% \begin{macrocode}
+\def\amsrefs@warning@nl{\PackageWarningNoLine{amsrefs}}
+% \end{macrocode}
+% \end{macro}
+%
+% Backward handling for beta and jpa options.
+% \begin{macrocode}
+\@ifpackagewith{amsrefs}{beta}{%
+ \amsrefs@warning@nl{The beta option is obsolete}%
+}{}
+\@ifpackagewith{amsrefs}{jpa}{%
+ \amsrefs@warning@nl{The jpa option is obsolete}%
+}{}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\IfFileExists{url.sty}{%
+ \RequirePackage{url}\relax
+ \@gobble
+}{%
+ \@firstofone
+}
+{
+ \DeclareRobustCommand{\url}[1]{%
+ \def\@tempa{#1}%
+ \texttt{\@urlsetup $\expandafter\strip@prefix\meaning\@tempa$}%
+ }%
+ \def\@urlsetup{%
+ \check@mathfonts \textfont\@ne\the\font \textfont\z@\the\font
+ \@apply\@urlfix{\do\+\do\=\do\:\do\-\do\.\do\,\do\;}%
+ \@apply\@urlbreak{\do\&\do\/\do\?}%
+ }%
+ \def\@urlbreak#1{%
+ \mathcode`#1="8000
+ \begingroup \lccode`\~=`#1 \lowercase{\endgroup \edef~}%
+ {\mathchar\number`#1\penalty\hyphenpenalty}%
+ }%
+ \def\@urlfix#1{%
+ \mathcode`#1=`#1\relax
+ }%
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@ifundefined{NormalCatcodes}{\RequirePackage{pcatcode}\relax}{}
+\PushCatcodes\NormalCatcodes
+% \end{macrocode}
+%
+% \begin{macrocode}
+%% WARNING WARNING WARNING: Catcode of apostrophe ' is letter
+%% throughout this file.
+\catcode`\'=11 % letter
+% \end{macrocode}
+%
+% \subsection{Utilities}
+%
+% Some of these useful functions are also found in AMS
+% document classes.
+%
+% \begin{macro}{\after@deleting@token}
+% Similar in concept to \cs{afterassignment}, except it deletes the
+% next token in the stream before putting its argument
+% back into the input. Useful for skipping past tokens during
+% parsing.
+% \begin{macrocode}
+\def\after@deleting@token#1{%
+ \afterassignment#1%
+ \let\@let@token= % Don't delete this space!
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@ifempty}
+% \begin{macro}{\@ifnotempty}
+% Some frequently used tests for empty arguments. Note that an
+% argument consisting entirely of spaces (e.g.,
+% \verb*|\@ifempty{ }|) counts as empty.
+% \begin{macrocode}
+\long\def\@ifempty#1{\@xifempty#1@@..\@nil}
+
+\long\def\@xifempty#1#2@#3#4#5\@nil{%
+ \ifx#3#4\@xp\@firstoftwo\else\@xp\@secondoftwo\fi
+}
+
+\long\def\@ifnotempty#1{\@ifempty{#1}{}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\macrotext}
+% \begin{macrocode}
+\def\macrotext{\expandafter\strip@prefix\meaning}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\vdef}
+% ``Verbatim'' def.
+% \begin{macrocode}
+\def\vdef#1#2{%
+ \def#1{#2}%
+ \edef#1{\macrotext#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\auto@protect}
+% Sometimes it's convenient to render a given control sequence
+% unexpandable for a time. \cs{auto@protect} provides a way to do
+% that.\footnote{There really should be a special name for macros
+% that, like \cs{auto@protect}, take a control sequence as an
+% argument and redefine that control sequence in order to achieve
+% some special effect. Pending happier inspiration, I'm
+% going to call them ``wrapper'' macros.\index{wrapper macros,
+% definition}}
+%
+% An earlier version of this code read simply |\let#1\relax| but
+% that had the disadvantage of making all \cs{auto@protect}ed
+% macros compare equal via \cs{ifx}. This version allows macros to
+% keep their identities under comparisons.
+% \begin{macrocode}
+\def\auto@protect#1{\def#1{\@nx#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\auto@stringify}
+% \begin{macrocode}
+\def\auto@stringify#1{\def#1{\string#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\g@undef}
+% Globally undefine a control sequence.
+% \begin{macrocode}
+\def\g@undef#1{\global\let#1\relax}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@concat}
+% Concatenate onto the end of a token list. Expands everything.
+% \begin{macrocode}
+\def\@concat#1#2{\edef#1{#1#2}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\add@toks@}
+% This saves a few tokens of main memory and a lot of typing.
+% \begin{macrocode}
+\def\add@toks@{\addto@hook\toks@}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@lappend}
+% Append an element to a \cs{do}-delimited list. As long as the
+% element to be appended (|#2|) is a single token, nothing is
+% expanded. If it contains multiple tokens, all tokens after the
+% first will be expanded.
+% \begin{macrocode}
+\def\@lappend#1#2{%
+ \begingroup
+ \def\do{\@nx\do\@nx}%
+ \edef\@tempa{\def\@nx#1{#1\do#2}}%
+ \@xp\endgroup
+ \@tempa
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@apply}
+% Apply a macro to each element of a \cs{do}-delimited list.
+% \begin{macrocode}
+\def\@apply#1#2{%
+ \let\do#1%
+ #2%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\get@numberof}
+% This is a generic macro for counting the number of elements in a
+% \latex/-style list.
+% The first argument is a \cs{count} register that will receive the
+% final count; the second argument is the control sequence that
+% separates elements of the list, and the third argument is the
+% list itself. So, for example,
+% \begin{verbatim}
+% \get@numberof\@tempcnta\do\dospecials
+%\end{verbatim}
+% would count the number of special characters in \cs{dospecials}
+% and store the number in \cs{@tempcnta}.
+% \begin{macrocode}
+\def\get@numberof#1#2#3{%
+ \begingroup
+ \def#2{\advance\@tempcnta\@ne \@gobble}%
+ \@tempcnta\z@
+ #3\relax
+ \edef\@tempb{#1=\the\@tempcnta\relax}%
+ \@xp\endgroup
+ \@tempb
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\safe@set}
+% This is a quick and dirty way of extracting an integer prefix
+% from a string and assigning it to a counter. If the string does
+% not begin with an integer, the counter receives the value~0. The
+% suffix after the integer prefix is discarded. (But bad things
+% will happen if the string contains the token \cs{@nil}.)
+% \begin{macrocode}
+\def\safe@set#1#2{%
+ \afterassignment\@nilgobble
+ #1=0#2\relax\@nil
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@chomp}
+% Vaguely reminiscent of Perl's \texttt{chomp} function, which removes
+% a substring from the end of a variable, but ours works with
+% tokens (more-or-less) and takes the substring to be removed as
+% its second argument. Note the use of \cs{@empty} to anchor the
+% chomped substring to the end of the string. Note also that the
+% second argument will be fully expanded during the chomping.
+% \begin{macrocode}
+\def\@chomp#1#2{%
+ \begingroup
+ \toks@\@emptytoks
+ \def\@chomper##1##2#2\@empty##3\@nil{%
+ \ifx\@let@token\bgroup
+ \toks@{{##1}##2}%
+ \else
+ \toks@{##1##2}%
+ \fi
+ }%
+ \@xp\chomp@ #1\@empty#2\@empty\@nil
+ \edef\@tempa{\def\@nx#1\@xp{\the\toks@}}%
+ \@xp\endgroup
+ \@tempa
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chomp@}
+% Before passing control to \cs{@chomper}, we peek ahead at the
+% next token in the stream. That way, if the next token is an open
+% brace, we know we need to surround \cs{@chomper}'s first argument
+% with braces. Unfortunately, this might still remove braces from
+% the second argument, but I think that's ok for our purposes.
+% \begin{macrocode}
+\def\chomp@{%
+ \futurelet\@let@token
+ \@chomper
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\amsrefs@warning}
+% \begin{macrocode}
+\def\amsrefs@warning{\PackageWarning{amsrefs}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\amsrefs@error}
+% \begin{macrocode}
+\def\amsrefs@error{\PackageError{amsrefs}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\MessageBreakNS}
+% This suppresses the leading space in \cs{on@line} in error and
+% warning messages.
+% \begin{macrocode}
+\def\MessageBreakNS{\MessageBreak\romannumeral`\^^@}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@addpunct}
+% The \cs{@addpunct} function is defined by AMS document classes and
+% the \pkg{amsgen} package. But if we find it undefined we had better
+% define it.
+% \begin{macrocode}
+\@ifundefined{@addpunct}{%
+ \def\@addpunct#1{%
+ \relax\ifhmode
+ \ifnum\spacefactor>\@m \else#1\fi
+ \fi
+ }
+ \def\frenchspacing{%
+ \sfcode`\.1006
+ \sfcode`\?1005
+ \sfcode`\!1004
+ \sfcode`\:1003
+ \sfcode`\;1002
+ \sfcode`\,1001\relax
+ }
+}{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\nopunct}
+% Omit any following punctuation that would normally be inserted by
+% \cs{@addpunct}.
+% \begin{macrocode}
+\providecommand{\nopunct}{\spacefactor \@nopunctsfcode}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@nopunctsfcode}
+% \begin{macrocode}
+\def\@nopunctsfcode{1007 }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Declaring package options}
+%
+% We call the \pkg{ifoption} package to facilitate some option tests.
+% \begin{macrocode}
+\RequirePackage{ifoption}[2000/02/15]
+% \end{macrocode}
+%
+% The \opt{sorted} option is a no-op and is no longer documented.
+% I'm only leaving it here for backwards compatibility.
+% \begin{macrocode}
+\DeclareExclusiveOptions{sorted,citation-order}
+% \end{macrocode}
+% The \opt{alphabetic} option corresponds to the standard \bst{alpha}
+% biblio style with labels like Knu66 (three letters from name plus
+% two digits of year). Maybe should provide an alias LllYY for this
+% option. Numeric is the default since it is commoner in AMS
+% publications.
+% \begin{macrocode}
+\DeclareExclusiveOptions{alphabetic,shortalphabetic,author-year,numeric}
+% \end{macrocode}
+%
+% \begin{option}{y2k}
+% \begin{macrocode}
+\DeclareBooleanOption{y2k}
+% \end{macrocode}
+% \end{option}
+%
+% \begin{option}{nobysame}
+% \begin{macrocode}
+\DeclareBooleanOption{nobysame}
+% \end{macrocode}
+% \end{option}
+%
+% The standard \bst{abbrv} bibliography style uses abbreviations for
+% month names and journal names, and first names of people are
+% abbreviated to their initials. Since the second test bibliography
+% that I tested with had unabbreviated month names but abbreviated
+% journal names, perhaps it is a good idea to let these choices be
+% specified separately.
+% \begin{macrocode}
+\DeclareBooleanOption{short-journals}
+% \end{macrocode}
+% \begin{macrocode}
+\DeclareBooleanOption{short-publishers}
+% \end{macrocode}
+% The \opt{short-journals} and \opt{short-publishers} options only
+% affect journal and publisher names that are defined with
+% \cn{DefineJournal} and \cn{DefinePublisher} commands.
+% \begin{macrocode}
+\DeclareBooleanOption{short-months}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareBooleanOption{initials}
+% \end{macrocode}
+% Nevertheless, it's to be expected that the preceding four options
+% would typically be used together, so we provide a short-hand for
+% requesting them all.
+% \begin{macrocode}
+\DeclareOption{abbrev}{%
+ \@pass@ptions
+ \@currext
+ {initials,short-months,short-journals,short-publishers}%
+ \@currname
+}
+% \end{macrocode}
+%
+% In the bibliography, if a title or something is enclosed in quotes,
+% should the closing quotes go inside the punctuation (logical
+% position) rather than outside (traditional)? These options give you
+% a choice.
+% \begin{macrocode}
+\DeclareExclusiveOptions{traditional-quotes,logical-quotes}
+% \end{macrocode}
+%
+% A sequence of cites will be sorted and ranges of length three or
+% greater will be compressed if these options so indicate. Note
+% that the \opt{non-sorted-cites} option automatically disables
+% compression. This is probably a feature.
+% \begin{macrocode}
+\DeclareExclusiveOptions{sorted-cites,non-sorted-cites}
+\DeclareExclusiveOptions{non-compressed-cites,compressed-cites}
+% \end{macrocode}
+%
+% In the bibliography, print page numbers showing where each
+% entry was cited.
+% \begin{macrocode}
+\DeclareBooleanOption{backrefs}
+% \end{macrocode}
+%
+% Option for giving information about the available options:
+% \begin{macrocode}
+\DeclareBooleanOption{?}
+% \end{macrocode}
+%
+% This option means to forgo loading of the \pkg{textcmds} and
+% \pkg{mathscinet} packages.
+% \begin{macrocode}
+\DeclareBooleanOption{lite}
+% \end{macrocode}
+%
+% This option can be used by later releases as a sign that fall-back
+% adaptations need to be done.
+% \begin{macrocode}
+\DeclareBooleanOption{beta}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareBooleanOption{bibtex-style}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareBooleanOption{msc-links}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ExecuteOptions{numeric,traditional-quotes,sorted-cites,compressed-cites}
+
+\ProcessOptions\relax
+
+\ProcessExclusiveOptions
+% \end{macrocode}
+%
+% \begin{macrocode}
+\IfOption{backrefs}{%
+ \IfFileExists{backref.sty}{%
+ \RequirePackage{backref}[1999/05/30]
+ }{%
+ \amsrefs@warning@nl{The backrefs option cannot be used^^J%
+ unless the backref package is also installed.^^J%
+ (backref is part of the hyperref package)}%
+ }%
+}{}
+
+\IfOption{msc-links}{%
+ \IfFileExists{hyperref.sty}{%
+ \RequirePackage{hyperref}[1999/07/08]
+ }{
+ \amsrefs@warning@nl{The msc-links option cannot be used^^J%
+ unless the hyperref package is installed}%
+ }%
+}{}
+% \end{macrocode}
+%
+% \subsubsection{The \opt{?} option}
+%
+% \begin{macrocode}
+\IfOption{?}{%
+ \typeout{^^J%
+ Documentation for the amsrefs package is found in amsrdoc.dvi^^J%
+ (or .pdf or .tex).
+ ^^J%
+ }%
+}{}%
+% \end{macrocode}
+%
+% \subsection{Loading auxiliary packages}
+% Now, if these other packages make use of the \pkg{pcatcode} package
+% like they should, then we don't need to make any fuss here about
+% the special catcode of \texttt{'}. Just load the packages.
+% \begin{macrocode}
+\RequirePackage{rkeyval}[2001/12/22]
+% \end{macrocode}
+%
+% \subsubsection{The \opt{lite} option}
+%
+% In my opinion, this is misguided, since \pkg{amsrefs} shouldn't
+% be loading these packages to begin with. But it's too late to
+% change it now.
+%
+% \begin{macrocode}
+\IfOption{lite}{% True? Then don't load the next two packages.
+}{% False? OK, let's load them:
+ \RequirePackage{textcmds}[2001/12/14]
+ \RequirePackage{mathscinet}[2002/01/01]
+}
+% \end{macrocode}
+%
+% \subsection{Key-value setup}
+%
+% \begin{macro}{\BibField}
+% This provides easy access to individual fields for user-defined
+% formatting functions.
+% \begin{macrocode}
+\newcommand{\BibField}[1]{\csname bib'#1\endcsname}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\IfEmptyBibField}
+% A convenient partial application of \cn{rkvIfEmpty}.
+% \begin{macrocode}
+\newcommand{\IfEmptyBibField}{\rkvIfEmpty{bib}}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Standard field names (the \texttt{bib} group)}
+%
+% And here are the predefined key names. You could always add some
+% more if you needed them. Only worry is about compatibility if you
+% want to share your data with other people.
+%
+% \begin{macro}{\fld@elt}
+% \begin{macro}{\name}
+% We want the list macros used above to be unexpandable except when
+% special processing is done. (It's not clear to me there's any
+% real benefit to using these instead of just using \cn{do}.---dmj)
+% \begin{macrocode}
+\let\fld@elt=?
+\let\name=?
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% First the fields that could be repeated more than once in a single
+% entry. Maybe publisher should be allowed to repeat also, for
+% co-published works. But then need to worry about the address
+% handling.
+% \begin{macrocode}
+\DefineAdditiveKey{bib}{author}{\name}
+\DefineAdditiveKey{bib}{editor}{\name}
+\DefineAdditiveKey{bib}{translator}{\name}
+\DefineAdditiveKey{bib}{contribution}{\fld@elt}
+\DefineAdditiveKey{bib}{isbn}{\fld@elt}
+\DefineAdditiveKey{bib}{issn}{\fld@elt}
+\DefineAdditiveKey{bib}{review}{\fld@elt}
+\DefineAdditiveKey{bib}{partial}{\fld@elt}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DefineSimpleKey{bib}{accessdate}
+\DefineSimpleKey{bib}{address}
+\DefineSimpleKey{bib}{book}
+\DefineSimpleKey{bib}{booktitle}
+\DefineSimpleKey{bib}{conference}
+%\DefineSimpleKey{bib}{contributor}
+\DefineSimpleKey{bib}{copula}
+\DefineSimpleKey{bib}{date}
+\DefineSimpleKey{bib}{doi}
+\DefineSimpleKey{bib}{edition}
+\DefineSimpleKey{bib}{eprint}
+\DefineSimpleKey{bib}{fulljournal}
+\DefineSimpleKey{bib}{hyphenation}
+\DefineSimpleKey{bib}{institution}
+\DefineSimpleKey{bib}{journal}
+\DefineSimpleKey{bib}{label}
+\DefineSimpleKey{bib}{language}
+\DefineSimpleKey{bib}{name}
+\DefineSimpleKey{bib}{note}
+\DefineSimpleKey{bib}{number}
+\DefineSimpleKey{bib}{organization}
+\DefineSimpleKey{bib}{pages}
+\DefineSimpleKey{bib}{part}
+\DefineSimpleKey{bib}{place}
+\DefineSimpleKey{bib}{publisher}
+\DefineSimpleKey{bib}{reprint}
+\DefineSimpleKey{bib}{school}
+\DefineSimpleKey{bib}{series}
+\DefineSimpleKey{bib}{setup}
+\DefineSimpleKey{bib}{status}
+\DefineSimpleKey{bib}{subtitle}
+\DefineSimpleKey{bib}{title}
+\DefineSimpleKey{bib}{translation}
+\DefineSimpleKey{bib}{type}
+\DefineSimpleKey{bib}{url}
+\DefineSimpleKey{bib}{volume}
+\DefineSimpleKey{bib}{xref}
+\DefineSimpleKey{bib}{year}
+% \end{macrocode}
+% The \fld{transition} key is used when we want to insert punctuation
+% or other material at a given point in the sequence
+% unconditionally. The key appears to have a non-empty value to
+% \cn{IfEmptyBibField}, but its value (expansion) is empty.
+% \begin{macrocode}
+\DefineDummyKey{bib}{transition}
+% \end{macrocode}
+%
+% \subsubsection{Auxiliary properties (the \texttt{prop} group)}
+%
+% \begin{macrocode}
+\DefineSimpleKey{prop}{inverted}
+\DefineSimpleKey{prop}{language}
+% \end{macrocode}
+%
+% \subsection{Bibliography type specifications}
+%
+% \begin{macro}{\BibSpec}
+% Accumulate specification material in \cs{toks@}, then define
+% \cs{setbib@TYPE} from it.
+% \begin{macrocode}
+\newcommand{\BibSpec}[2]{%
+ \toks@\@emptytoks
+ \@ifnotempty{#2}{%
+% \end{macrocode}
+% The \cs{@ifnextchar} removes an optional |+| at the beginning of
+% a specification. From then on, each time \cs{bibspec@scan} is
+% invoked, it expects to find four arguments. The four
+% \cs{@empty}s appended to the specification (|#2|) below ensure
+% that this is so.
+% \begin{macrocode}
+ \@ifnextchar{+}{\@xp\bibspec@scan\@gobble}{\bibspec@scan}%
+ #2\@empty\@empty\@empty\@empty
+ }%
+ \@xp\edef\csname setbib@#1\endcsname{\the\toks@}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bibspec@scan}
+% The \cs{bibspec@scan} function scans one field specification
+% from the second arg of \cn{BibSpec}. Each field specification has
+% the form
+% \begin{verbatim}
+% +{punctuation}{prelim material}{field name}
+%\end{verbatim}
+% Note however that because the initial |+| is stripped off by
+% \cs{BibSpec} (see above), the actual order that \cs{bibspec@scan}
+% reads the field specification is
+% \begin{verbatim}
+% #1={punctuation} #2={prelim material} #3={field name} #4=+
+%\end{verbatim}
+% where the fourth argument is actually expected to be either the
+% |+| from the following specification, or one of the special
+% \cs{@empty} tokens inserted by \cs{BibSpec}. If it is neither of
+% these special values, it means we have a malformed specification;
+% so, we issue an error and then try to pick up where we left off.
+% \begin{macrocode}
+\def\bibspec@scan#1#2#3#4{%
+ \add@toks@{\bib@append{#1}{#2}}%
+ \edef\@tempa{%
+ \toks@{\the\toks@ \@xp\@nx\csname bib'#3\endcsname}%
+ }%
+ \@tempa
+ \ifx\@empty#4%
+ \@xp\@gobble % end the recursion
+ \else
+ \ifx +#4\else\bibspec@scan@error\fi
+ \fi
+ \bibspec@scan
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bibspec@scan@error}
+% \begin{macrocode}
+\def\bibspec@scan@error{\amsrefs@error{Bad BibSpec: Expected '+'}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bib@append}
+% The function \cs{bib@append} prints the value of a field, together
+% with associated punctuation and font changes, unless the value is
+% empty. Arg 1 is punctuation (that may need to be swapped with a
+% preceding line break), arg 2 gives the space to be added after the
+% punctuation, and possibly a function to be applied to the contents
+% of arg 3, which is
+% a macro containing the field
+% value. So if we have \cn{moo} and \cn{bib'pages}, from
+% \verb'pages={21\ndash 44}', then we want to arrange to call
+% \begin{verbatim}
+% \moo{21\ndash 44}
+%\end{verbatim}
+% We don't want to simply call \cs{moo}\cs{bib'bar} because that makes
+% it rather difficult for \cs{moo} to look at the contents of
+% \cs{bib@bar}.
+% \begin{macrocode}
+\def\bib@append#1#2#3{%
+ \ifx\@empty#3%
+ \else
+% \end{macrocode}
+% \begin{bug}
+% Need better error message here.
+% \end{bug}
+% \begin{macrocode}
+ \ifx\relax#3%
+ \errmessage{#3=\relax}%
+ \else
+ \begingroup
+ \series@index\m@ne
+ \def\current@bibfield{#3}%
+ \@ifempty{#1}{%
+ \@temptokena{\ifnum\lastkern=\@ne\ignorespaces\fi #2}%
+ }{%
+ \@temptokena{\SwapBreak{#1}#2}%
+ }%
+ \toks@\@xp{#3}%
+ \edef\@tempa{\the\@temptokena{\the\toks@}}%
+ \rkvIfAdditive#3{}{%
+ \get@current@properties
+ \select@auxlanguage
+ }%
+ \@tempa
+ \endgroup
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\select@auxlanguage}
+% \begin{macrocode}
+\def\select@auxlanguage{%
+ \ifx\prop'language\@empty
+ \else
+ \@xp\selectlanguage\@xp{\prop'language}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\erase@field}
+% There are some fields that can appear in more than one place in a
+% reference, depending on context. For example, if a book has an
+% editor but no author, the editor appears at the beginning of the
+% entry, but if the book has both an editor and an author, the
+% editor appears at the end of the entry. A simple way to handle
+% this is to ``erase'' the \fld{editor} field after printing it,
+% which is what \cs{erase@field} is for.
+%
+% The obvious definition of \cs{erase@field} is
+% \begin{verbatim}
+% \def\erase@field#1{\global\let#1\@empty}
+%\end{verbatim}
+% but that doesn't work because the top-level value of
+% \pkg{rkeyval} fields isn't \cs{@empty}; instead, it contains a
+% setter function used by \cs{RestrictedSetKeys} when processing a
+% key-value list (see \cs{rkv@DSAK}, \cs{rsk@set@a} and
+% \cs{rsk@set@b}).
+%
+% On the other hand, rewriting the field locally won't work
+% either, since \cs{erase@field} will typically be executed inside
+% the group established by \cs{bib@append}. Instead, we want to
+% rewrite the value right after \cs{bib@append}'s group ends. One
+% way to do this would be to keep a list of fields to be erased and
+% have \cs{bib@append} iterate over the list after its
+% \ncn{endgroup}.
+%
+% However, as long as the call to \cs{erase@field}
+% is never nested within any deeper groups, it's simpler just to
+% use \cs{aftergroup}, which is what we'll do (``Sufficient unto
+% the day is the evil thereof'' and all that).
+% \begin{macrocode}
+\def\erase@field#1{%
+ \aftergroup\let\aftergroup#1\aftergroup\@empty
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\get@current@properties}
+% This retrieves the auxiliary properties for the current field
+% value, as defined by \cs{current@bibfield} and
+% \cs{series@index}.
+% \begin{macrocode}
+\def\get@current@properties{%
+ \begingroup
+ \@xp\get@nth@property\@xp\@tempa\current@bibfield\series@index
+ \edef\@tempa{%
+ \@nx\RestrictedSetKeys{}{prop}{%
+ \def\@nx\@tempa{\@nx\prop@reset \@nx\the\@nx\rsk@toks}%
+ }{\@tempa}%
+ }%
+ \@tempa
+ \@xp\endgroup
+ \@tempa
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\BibSpecAlias}
+% This is a \cs{def} rather than a \cs{let} because using \cs{let}
+% would make \cn{BibSpecAlias} statements order-sensitive in a way
+% that seems frequently to be a stumbling block to unwary package
+% writers. But then we should probably do at least the simplest
+% kind of infinite loop check.
+% \begin{macrocode}
+\newcommand{\BibSpecAlias}[2]{%
+ \@xp\def\@xp\@tempa\@xp{\csname setbib@#1\@xp\endcsname}%
+ \@xp\ifx\csname setbib@#2\endcsname\@tempa
+ \amsrefs@error{%
+ Mirror alias #1->#2 not allowed (infinite loop)}\@ehc
+ \else
+ \@xp\def\csname setbib@#1\@xp\endcsname
+ \@xp{\csname setbib@#2\endcsname}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{The standard bibliography types}
+%
+% \begin{macrocode}
+\BibSpec{article}{%
+ +{} {\PrintAuthors} {author}
+ +{,} { \textit} {title}
+ +{.} { } {part}
+ +{:} { \textit} {subtitle}
+ +{,} { \PrintContributions} {contribution}
+ +{.} { \PrintPartials} {partial}
+ +{,} { } {journal}
+ +{} { \textbf} {volume}
+% \end{macrocode}
+% The date form is tricky depending on presence or absence of DOI.
+% \begin{macrocode}
+ +{} { \PrintDatePV} {date}
+ +{,} { \issuetext} {number}
+ +{,} { \eprintpages} {pages}
+ +{,} { } {status}
+ +{,} { \PrintDOI} {doi}
+ +{,} { available at \eprint} {eprint}
+ +{} { \parenthesize} {language}
+ +{} { \PrintTranslation} {translation}
+ +{;} { \PrintReprint} {reprint}
+ +{.} { } {note}
+ +{.} {} {transition}
+ +{} {\SentenceSpace \PrintReviews} {review}
+}
+
+\BibSpec{partial}{%
+ +{} {} {part}
+ +{:} { \textit} {subtitle}
+ +{,} { \PrintContributions} {contribution}
+ +{,} { } {journal}
+ +{} { \textbf} {volume}
+ +{} { \PrintDatePV} {date}
+ +{,} { \issuetext} {number}
+ +{,} { \eprintpages} {pages}
+}
+
+\BibSpec{contribution}{%
+ +{} {} {type}
+ +{} { by \PrintNameList} {author}
+}
+
+\BibSpec{book}{%
+ +{} {\PrintPrimary} {transition}
+ +{,} { \textit} {title}
+ +{.} { } {part}
+ +{:} { \textit} {subtitle}
+ +{,} { \PrintEdition} {edition}
+ +{} { \PrintEditorsB} {editor}
+ +{,} { \PrintTranslatorsC} {translator}
+ +{,} { \PrintContributions} {contribution}
+ +{,} { } {series}
+ +{,} { \voltext} {volume}
+ +{,} { } {publisher}
+ +{,} { } {organization}
+ +{,} { } {address}
+ +{,} { \PrintDateB} {date}
+ +{,} { } {status}
+ +{} { \parenthesize} {language}
+ +{} { \PrintTranslation} {translation}
+ +{;} { \PrintReprint} {reprint}
+ +{.} { } {note}
+ +{.} {} {transition}
+ +{} {\SentenceSpace \PrintReviews} {review}
+}
+
+\BibSpec{collection.article}{%
+ +{} {\PrintAuthors} {author}
+ +{,} { \textit} {title}
+ +{.} { } {part}
+ +{:} { \textit} {subtitle}
+ +{,} { \PrintContributions} {contribution}
+ +{,} { \PrintConference} {conference}
+ +{} {\PrintBook} {book}
+ +{,} { } {booktitle}
+ +{,} { \PrintDateB} {date}
+ +{,} { pp.~} {pages}
+ +{,} { } {status}
+ +{,} { \PrintDOI} {doi}
+ +{,} { available at \eprint} {eprint}
+ +{} { \parenthesize} {language}
+ +{} { \PrintTranslation} {translation}
+ +{;} { \PrintReprint} {reprint}
+ +{.} { } {note}
+ +{.} {} {transition}
+ +{} {\SentenceSpace \PrintReviews} {review}
+}
+
+\BibSpec{conference}{%
+ +{} {} {title}
+ +{} {\PrintConferenceDetails} {transition}
+}
+
+\BibSpec{innerbook}{%
+ +{,} { } {title}
+ +{.} { } {part}
+ +{:} { } {subtitle}
+ +{,} { \PrintEdition} {edition}
+ +{} { \PrintEditorsB} {editor}
+ +{,} { \PrintTranslatorsC} {translator}
+ +{,} { \PrintContributions} {contribution}
+ +{,} { } {series}
+ +{,} { \voltext} {volume}
+ +{,} { } {publisher}
+ +{,} { } {organization}
+ +{,} { } {address}
+ +{,} { \PrintDateB} {date}
+ +{.} { } {note}
+}
+
+\BibSpec{report}{%
+ +{} {\PrintPrimary} {transition}
+ +{,} { \textit} {title}
+ +{.} { } {part}
+ +{:} { \textit} {subtitle}
+ +{,} { \PrintEdition} {edition}
+ +{,} { \PrintContributions} {contribution}
+ +{,} { Technical Report } {number}
+ +{,} { } {series}
+ +{,} { } {organization}
+ +{,} { } {address}
+ +{,} { \PrintDateB} {date}
+ +{,} { \eprint} {eprint}
+ +{,} { } {status}
+ +{} { \parenthesize} {language}
+ +{} { \PrintTranslation} {translation}
+ +{;} { \PrintReprint} {reprint}
+ +{.} { } {note}
+ +{.} {} {transition}
+ +{} {\SentenceSpace \PrintReviews} {review}
+}
+
+\BibSpec{thesis}{%
+ +{} {\PrintAuthors} {author}
+ +{,} { \textit} {title}
+ +{:} { \textit} {subtitle}
+ +{,} { \PrintThesisType} {type}
+ +{,} { } {organization}
+ +{,} { } {address}
+ +{,} { \PrintDateB} {date}
+ +{,} { \eprint} {eprint}
+ +{,} { } {status}
+ +{} { \parenthesize} {language}
+ +{} { \PrintTranslation} {translation}
+ +{;} { \PrintReprint} {reprint}
+ +{.} { } {note}
+ +{.} {} {transition}
+ +{} {\SentenceSpace \PrintReviews} {review}
+}
+
+\BibSpec{webpage}{%
+ +{} {\PrintAuthors} {author}
+ +{,} { \emph} {title}
+ +{:} { \emph} {subtitle}
+ +{} { \PrintDate} {date}
+ +{,} { \url} {url}
+ +{.} { Accessed \PrintDateField} {accessdate}
+ +{.} { } {note}
+ +{.} {} {transition}
+}
+% \begin{macrocode}
+\BibSpecAlias{periodical}{book}
+\BibSpecAlias{collection}{book}
+\BibSpecAlias{proceedings}{book}
+\BibSpecAlias{manual}{book}
+\BibSpecAlias{miscellaneous}{book}
+\BibSpecAlias{misc}{miscellaneous}
+\BibSpecAlias{unpublished}{book}
+\BibSpecAlias{proceedings.article}{collection.article}
+\BibSpecAlias{techreport}{report}
+% \end{macrocode}
+%
+% \begin{macro}{\setbib@incollection}
+% \begin{macrocode}
+\edef\setbib@incollection{%
+ \@xp\@nx\csname setbib@collection.article\endcsname
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setbib@inproceedings}
+% \begin{macrocode}
+\edef\setbib@inproceedings{%
+ \@xp\@nx\csname setbib@collection.article\endcsname
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Some more entry types for implementing abbreviations.
+% \begin{macrocode}
+\BibSpec{name}{%
+ +{} {\PrintAuthors} {name}
+}
+
+\BibSpec{publisher}{%
+ +{,} { } {publisher}
+ +{,} { } {address}
+}
+% \end{macrocode}
+%
+% \subsection{The \env{biblist} environment}
+%
+% The \env{biblist} environment can be used with a section or chapter
+% heading.
+%
+% Use a standard \latex/ counter for numbering bibliography items.
+% \begin{macrocode}
+\newcounter{bib}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DefineSimpleKey{biblist}{prefix}
+\DefineSimpleKey{biblist}{labels}
+% \end{macrocode}
+%
+% \begin{environment}{biblist}
+% \begin{macrocode}
+\newenvironment{biblist}{%
+ \setcounter{bib}\z@
+ \@biblist
+}{%
+ \@endbiblist
+}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{biblist*}
+% \begin{macrocode}
+\newenvironment{biblist*}{%
+ \@biblist
+}{%
+ \@endbiblist
+}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\biblistfont}
+% \begin{macrocode}
+\newcommand{\biblistfont}{%
+ \normalfont
+ \footnotesize
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\amsrefs@@lbibitem}
+% \begin{macro}{\amsrefs@bibitem}
+% Reference processing at the AMS sometimes results in raw
+% \cs{bibitem} entries being interspersed with \cs{bib} entries in
+% a bibliography. For that to work, we need to modify
+% \cs{@lbibitem} and \cs{@bibitem} to interoperate more smoothly
+% with \pkg{amsrefs}.
+% \begin{macrocode}
+\def\amsrefs@lbibitem[#1]#2{%
+ \begingroup
+ \def\CurrentBib{#2}%
+ \def\thebib{#1}%
+ \@nmbrlistfalse
+ \item\leavevmode
+ \if@filesw
+ {\let\protect\noexpand
+ \immediate\write\@auxout{\string\bibcite{#2}{{#1}{}}}}%
+ \fi
+ \endgroup
+ \ignorespaces
+}
+
+\def\amsrefs@bibitem#1{%
+ \def\CurrentBib{#1}%
+ \item
+ \if@filesw
+ \immediate\write\@auxout{\string\bibcite{#1}{{\the\value{\@listctr}}{}}}%
+ \fi
+ \ignorespaces
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@biblist}
+% \begin{macrocode}
+\newcommand\@biblist[1][]{%
+ \stepcounter{bib@env}
+ \biblistfont
+ \labelsep .5em\relax
+ \let\@bibitem\amsrefs@bibitem
+ \let\@lbibitem\amsrefs@lbibitem
+ \list{\BibLabel}{%
+ \restore@labelwidth
+ \@maxlabelwidth\z@
+ \@nmbrlisttrue
+ \def\@listctr{bib}%
+ \let\makelabel\bib@mklab
+ #1\relax
+ }%
+ \sloppy
+% \end{macrocode}
+% Discourage page breaks within bibliography entries and disable them
+% completely for entries that are less than four lines long.
+% \begin{macrocode}
+ \interlinepenalty\@m
+ \clubpenalty\@M
+ \widowpenalty\clubpenalty
+ \frenchspacing
+ \ResetCapSFCodes
+ \@ifstar{\@biblistsetup}{}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@biblistsetup}
+% \begin{macrocode}
+\newcommand{\@biblistsetup}[1]{%
+ \RestrictedSetKeys{}{biblist}{\the\rsk@toks}{#1}%
+ \rkvIfEmpty{biblist}{prefix}{}{%
+ \let\amsrefs@label@prefix\biblist'prefix
+ }%
+ \rkvIfEmpty{biblist}{labels}{}{%
+ \@ifundefined{amsrefs@option@\biblist'labels}{%
+ \amsrefs@warning{Invalid label style `\biblist'labels`}%
+ }{%
+ \csname amsrefs@option@\biblist'labels\endcsname
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@endbiblist}
+% Change error for empty list (no items) to warning, to allow authors
+% to leave their bibliography temporarily empty during writing:
+% \begin{macrocode}
+\def\@endbiblist{%
+ \save@labelwidth
+ \def\@noitemerr{\@latex@warning{Empty bibliography list}}%
+ \global\let\previous@primary\@empty
+ \endlist
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@maxlabelwidth}
+% \begin{macrocode}
+\newdimen\@maxlabelwidth
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bib@mklab}
+% \begin{macrocode}
+\def\bib@mklab#1{%
+ \settowidth\@tempdima{#1}%
+ \ifdim \@tempdima > \@maxlabelwidth
+ \global\@maxlabelwidth\@tempdima
+ \fi
+ #1\hfil
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\newcounter{bib@env}
+% \end{macrocode}
+%
+% \begin{macro}{\save@labelwidth}
+% \begin{macrocode}
+\def\save@labelwidth{%
+ \if@filesw
+ \immediate\write\@auxout{%
+ \string\newlabel{[bibenv:\the\c@bib@env]}{\the\@maxlabelwidth}%
+ }%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\restore@labelwidth}
+% \begin{macrocode}
+\def\restore@labelwidth{%
+ \@xp\ifx \csname r@[bibenv:\the\c@bib@env]\endcsname \relax
+ \resetbiblist{00}%
+ \else
+ \@xp\labelwidth\csname r@[bibenv:\the\c@bib@env]\endcsname
+ \leftmargin\labelwidth
+ \advance\leftmargin\labelsep
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ResetCapSFCodes}
+% Presumably this is here because there has been a problem in the
+% past with packages that change the \cs{catcode}s of capital
+% letters.
+% \begin{macrocode}
+\providecommand{\ResetCapSFCodes}{%
+ \count@=`\A
+ \def\@tempa{%
+ \sfcode\count@=\@m
+ \advance\count@\@ne
+ \ifnum\count@>`\Z\relax \expandafter\@gobble \fi
+ \@tempa
+ }%
+ \@tempa
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CurrentBib}
+% In case this is undefined sometimes.
+% \begin{macrocode}
+\def\CurrentBib{??}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\BibLabel}
+% \begin{macrocode}
+\newcommand{\BibLabel}{%
+ \hfill
+ \Hy@raisedlink{\hyper@anchorstart{cite.\CurrentBib}\hyper@anchorend}%
+ [\thebib]%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\resetbiblist}
+% \begin{macrocode}
+\newcommand{\resetbiblist}[1]{%
+ \settowidth\labelwidth{\def\thebib{#1}\BibLabel}%
+ \leftmargin\labelwidth
+ \ifdim\labelwidth=\z@
+ \leftmargin=1em
+ \itemindent=-\leftmargin
+ \else
+ \advance\leftmargin\labelsep
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Processing bibliography entries}
+%
+% There are several things one might want to do when a \cn{bib} entry
+% is encountered:
+% \begin{enumerate}
+%
+% \item Format and print it. This corresponds to the direct entry
+% of bibliography items as described in section~2.1 of the users's
+% guide.
+%
+% \item Copy it into a \fn{.bbl} file. This corresponds to the use
+% of \cn{bibselect} and an external \fn{.ltb} database as described
+% in section~2.2 of the user's guide.
+%
+% \item Store the full information in memory. This is done by
+% \cn{bib*}.
+%
+% \end{enumerate}
+%
+% \begin{macro}{\bib}
+% Here is where the rubber hits the road.
+% \begin{macrocode}
+\newcommand{\bib}{%
+ \begingroup
+ \@ifstar{%
+ \@tempswatrue
+ \let\@bibdef\star@bibdef
+ \BibItem
+ }{%
+ \@tempswafalse
+ \BibItem
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\BibItem}
+% \MacroArgs
+% \macroarg{1}{citekey}
+% \macroarg{2}{bibtype}
+% \begin{macrocode}
+\newcommand{\BibItem}[2]{%
+ \vdef\@tempa{#1}%
+ \edef\@tempa{%
+ \edef\@nx\@tempa{\@nx\@xp\@nx\zap@space\@tempa\space\@nx\@empty}%
+ }%
+ \@tempa
+ \edef\@tempb{%
+ \@nx\@bibdef\@xp\@nx\csname setbib@#2\endcsname{#2}{\@tempa}%
+ }%
+ \@tempb
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@bibdef}
+% \cs{@bibdef} is a pointer to the procedure that should be handed
+% the entry's key-value pairs. It has one of four values:
+% \begin{enumerate}
+%
+% \item \cs{star@bibdef}
+%
+% \item \cs{normal@bibdef}
+%
+% \item \cs{copy@bibdef}
+%
+% \item \cs{selective@bibdef}
+%
+% \end{enumerate}
+% \MacroArgs
+% \macroarg{1}{\cs{setbib@}bibtype}
+% \macroarg{2}{bibtype}
+% \macroarg{3}{citekey}
+% \begin{macrocode}
+\AtBeginDocument{\let\@bibdef\normal@bibdef}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bib@exec}
+% And \cs{bib@exec} is a pointer to the procedure that
+% \cs{normal@bibdef} will invoke to process the key-value pairs
+% after they've been parsed. It has one
+% of these values:
+% \begin{enumerate}
+%
+% \item \cs{bib@store}
+%
+% \item \cs{bib@print}
+%
+% \end{enumerate}
+% \MacroArgs
+% \macroarg{1}{citekey}
+% \macroarg{2}{\cs{the}\cs{rsk@toks}}
+% \macroarg{3}{\cs{setbib@}bibtype}
+% \begin{macrocode}
+\AtBeginDocument{\let\bib@exec\bib@print}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\cs{@bibdef} Implementations}
+%
+% \begin{macro}{\normal@bibdef}
+% \MacroArgs
+% \macroarg{1}{\cs{setbib@}bibtype}
+% \macroarg{2}{bibtype}
+% \macroarg{3}{citekey}
+% \begin{macrocode}
+\def\normal@bibdef#1#2#3{%
+% \end{macrocode}
+% \cs{CurrentBibType} is used by \pkg{export-bibtex}, but there
+% might be a better way to handle it. (dmj)
+% \begin{macrocode}
+ \def\CurrentBibType{#2}%
+ \ifx\relax#1%
+ \amsrefs@error{Undefined entry type: #2}\@ehc
+ \let#1\setbib@misc
+ \fi
+ \RestrictedSetKeys{}{bib}%
+ {\bib@exec{#3}{\the\rsk@toks}{#1}\endgroup}%
+}
+
+\let\@bibdef\normal@bibdef
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\star@bibdef}
+% \MacroArgs
+% \macroarg{1}{\cs{setbib@}bibtype}
+% \macroarg{2}{bibtype}
+% \macroarg{3}{citekey}
+% \begin{macrocode}
+\def\star@bibdef{%
+ \let\bib@exec\bib@store
+ \normal@bibdef
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\copy@bibdef}
+% This is a variation that copies everything into the \fn{.bbl}
+% file. Used by \cn{bibselect*} and \cn{bib*} inside \fn{.ltb}
+% files.
+% \begin{macrocode}
+\def\copy@bibdef{%
+ \if@tempswa
+ \@xp\defer@bibdef
+ \else
+ \@xp\copy@bibdef@a
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\copy@bibdef@a}
+% \begin{macrocode}
+\def\copy@bibdef@a#1#2#3#4{%
+ \@open@bbl@file
+ \process@xrefs{#4}%
+ \bbl@write{%
+ \string\bib\if@tempswa*\fi{#3}{#2}\string{\iffalse}\fi
+ }%
+% \end{macrocode}
+% Since we're supplying our own definition of \cs{rsk@set}, we
+% don't actually need the group argument, so we leave it out to
+% save a few tokens.
+% \begin{macrocode}
+ \RestrictedSetKeys{\global\let\rsk@set\bbl@copy}\@empty
+ {\bbl@write{\iffalse{\fi\string}^^J}%
+ \endgroup}{#4}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\catcode`\:=11
+
+\def\modify@xref@fields{%
+ \let\set:bib'author\output@xref@a
+ \let\set:bib'editor\output@xref@a
+ \let\set:bib'translator\output@xref@a
+ \let\set:bib'journal\output@xref@a
+ \let\set:bib'publisher\output@xref@a
+ \def\set:bib'xref##1##2{\output@xref@{##1}\@empty}%
+ \def\set:bib'book##1##2{\output@inner@xref@{##1}\@empty}%
+ \let\set:bib'conference\set:bib'book
+ \let\set:bib'partial\set:bib'book
+ \let\set:bib'reprint\set:bib'book
+ \let\set:bib'translation\set:bib'book
+}
+
+\catcode`\:=12
+
+\def\process@xrefs#1{%
+ \begingroup
+ \RestrictedSetKeys{\modify@xref@fields}{bib}{\the\rsk@toks}{#1}%
+ \endgroup
+}
+
+\def\output@xref@a#1#2{%
+ \def\@tempa{#1}%
+ \lowercase{\def\@tempb{#1}}%
+ \ifx\@tempa\@tempb
+ \output@xref@{#1}%
+ \fi
+}
+
+\def\output@xref@#1{%
+ \@ifnotempty{#1}{%
+ \@ifundefined{bi@#1}{}{%
+ \begingroup
+ \let\star@bibdef\copy@bibdef@a
+ \csname bi@#1\endcsname
+ \endgroup
+ }%
+ \@xp\g@undef\csname bi@#1\endcsname
+ }%
+}
+
+\def\output@inner@xref@#1{%
+ \in@={#1}%
+ \ifin@\else
+ \output@xref@{#1}%
+ \fi
+}
+% \end{macrocode}
+%
+% \begin{macro}{\bbl@copy}
+% \begin{macrocode}
+\def\bbl@copy#1\endcsname#2{%
+ \begingroup
+ \def\@tempa{#1}%
+ \toks@{{#2}}%
+ \star@{\bbl@copy@a}{}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bbl@copy@a}
+% \begin{macrocode}
+\def\bbl@copy@a#1{%
+ \@ifnotempty{#1}{%
+ \add@toks@{*{#1}}%
+ }%
+ \bbl@write{ \space\@tempa=\the\toks@,}%
+ \endgroup
+ \rsk@resume
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\selective@bibdef}
+% This is a variation that ignores anything not having a known
+% citation key. Used by \cn{bibselect}.
+%
+% \MacroArgs
+% \macroarg{1}{\cs{setbib@}bibtype}
+% \macroarg{2}{bibtype}
+% \macroarg{3}{citekey}
+% \begin{macrocode}
+\def\selective@bibdef#1#2#3{%
+ \@xp\selbibdef@a\csname b@#3\endcsname{#1}{#2}{#3}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\selbibdef@a}
+% \begin{macrocode}
+\def\selbibdef@a#1{%
+ \def\@tempa{\endgroup\@gobblefour}%
+ \ifx\relax#1\else \@xp\selbibdef@b#1\@nil \fi
+ \@tempa
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\selbibdef@b}
+% \begin{macrocode}
+\def\selbibdef@b#1#2#3\@nil{%
+ \ifx 1#2\let\@tempa\copy@bibdef\fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\defer@bibdef}
+% This is a variation that ignores anything not having a known
+% citation key. Used by \cn{bibselect}.
+%
+% \MacroArgs
+% \macroarg{1}{\cs{setbib@}bibtype}
+% \macroarg{2}{bibtype}
+% \macroarg{3}{citekey}
+% \macroarg{4}{key-val pairs}
+% \begin{macrocode}
+\def\defer@bibdef#1#2#3#4{%
+ \@xp\gdef\csname bi@#3\endcsname{%
+ \bib*{#3}{#2}{#4}%
+ }%
+ \@xp\addto@defer@list \csname bi@#3\endcsname
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bibdefer@list}
+% \begin{macrocode}
+\let\bibdefer@list\@empty
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\addto@defer@list}
+% \begin{macrocode}
+\def\addto@defer@list#1{%
+ \begingroup
+ \def\do{\@nx\do\@nx}%
+ \xdef\bibdefer@list{\bibdefer@list\do#1}%
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\cs{bib@exec} Implementations}
+%
+% \begin{macro}{\bib@store}
+% This is the easy one. It just stores the entire set of key-value
+% pairs in \cs{bi@}\emph{citekey}.
+% \begin{macrocode}
+\def\bib@store#1{%
+ \afterassignment\@gobble
+ \@xp\xdef\csname bi@#1\endcsname
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bib@print}
+% \MacroArgs
+% \macroarg{1}{citekey}
+% \macroarg{2}{\cs{the}\cs{rsk@toks}}
+% \macroarg{3}{\cs{setbib@}bibtype}
+% \begin{macrocode}
+\def\bib@print#1#2#3{%
+ \bib@start{#1}%
+ \let\setbib@@#3%
+ #2\relax % execute definitions locally
+ \bib@resolve@xrefs
+ \bib@field@patches
+ \bib@selectlanguage
+ \generate@label
+ \bib'setup
+ \bib@cite{#1}%
+ \kern\@ne sp
+ \ifx\setbib@@\setbib@article
+ \ifx\bib'booktitle\@empty
+ \ifx\bib'book\@empty
+ \ifx\bib'conference\@empty
+ \else
+ \let\setbib@@\setbib@incollection
+ \fi
+ \else
+ \let\setbib@@\setbib@incollection
+ \fi
+ \else
+ \let\setbib@@\setbib@incollection
+ \fi
+ \fi
+ \setbib@@
+ \bib@end
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bib@print@inner}
+% Note that the order of the arguments is reversed with respect to
+% \cs{bib@print}. Maybe that isn't such a great idea.
+% \MacroArgs
+% \macroarg{1}{\cs{setbib@}bibtype}
+% \macroarg{2}{\cs{the}\cs{rsk@toks}}
+% \begin{macrocode}
+\def\bib@print@inner#1#2{%
+ \begingroup
+ #2\relax % execute definitions locally
+ \bib@resolve@xrefs
+ \bib@field@patches
+ \bib'setup
+ #1%
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\current@citekey}
+% \begin{macrocode}
+\let\current@citekey\@empty
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\prev@citekey}
+% \begin{macrocode}
+\let\prev@citekey\@empty
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bib@start}
+% There used to be more to it.
+% \begin{macrocode}
+\def\bib@start#1{%
+ \begingroup
+ \def\current@citekey{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bib@end}
+% Instead of being handled by \cs{bib@end}, ending punctuation is
+% normally handled via the \fld{transition} field (q.v.)
+% \begin{macrocode}
+\def\bib@end{%
+ \relax
+ \@xp\PrintBackRefs\@xp{\CurrentBib}%
+ \par
+ \save@primary
+ \global\let\prev@citekey\current@citekey
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Resolving cross-references}
+%
+% \begin{macro}{\bib@resolve@xrefs}
+% \begin{macrocode}
+\def\bib@resolve@xrefs{%
+ \xref@check@c\bib'xref
+ \xref@check@a\bib'author
+ \xref@check@a\bib'editor
+ \xref@check@a\bib'translator
+ \xref@check@b\bib'journal
+ \xref@check@b\bib'publisher
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\xref@check@a}
+% Resolve a contributor (typically a \cn{DefineName}) alias.
+% Requires rebuilding the list.
+% \begin{macrocode}
+\def\xref@check@a#1{%
+ \ifx\@empty#1\relax
+ \else
+ \begingroup
+ \toks@\@emptytoks
+ \@temptokenb\@emptytoks
+ \series@index\z@
+ \def\name{\xref@check@aa#1}%
+ #1\relax
+ \edef\@tempa{%
+ \def\@nx#1{\the\toks@}%
+ \the\@temptokenb
+ }%
+ \@xp\endgroup
+ \@tempa
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\xref@check@aa}
+% \begin{macrocode}
+\def\xref@check@aa#1#2{%
+ \advance\series@index\@ne
+ \def\@tempa{#2}%
+ \lowercase{\def\@tempb{#2}}%
+ \ifx\@tempa\@tempb
+ \ifx\@tempa\@empty
+ \add@toks@{\name{}}%
+ \else
+ \@ifundefined{bi@#2}{%
+ \BibAbbrevWarning{#2}%
+ \add@toks@{\name{#2}}%
+ }{%
+ \xref@check@ab#1{#2}%
+ }%
+ \fi
+ \else
+ \add@toks@{\name{#2}}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\xref@check@ab}
+% \begin{macrocode}
+\def\xref@check@ab#1#2{%
+ \csname bi@#2\endcsname
+ \ifx\@empty\bib'name
+ \@temptokena{#2}%
+ \else
+ \@temptokena\@xp{\bib'name}%
+ \get@property\@tempa\bib'name
+ \edef\@tempa{%
+ \@nx\addto@hook\@temptokenb{%
+ \@nx\reset@nth@property\@nx#1\the\series@index{\@tempa}%
+ }%
+ }%
+ \@tempa
+ \fi
+ \edef\@tempa{\@nx\add@toks@{\@nx\name{\the\@temptokena}}}%
+ \@tempa
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\xref@check@b}
+% Resolve a \fld{journal} or \fld{publisher} alias (typically a
+% \cn{DefinePublisher} or \cn{DefineJournal} alias).
+% \begin{macrocode}
+\def\xref@check@b#1{%
+ \ifx\@empty#1%
+ \else
+ \toks@\@xp{#1}%
+ \edef\@tempb{\lowercase{\def\@nx\@tempa{\the\toks@}}}%
+ \@tempb
+ \ifx\@tempa#1\relax % all lowercase
+ \@ifundefined{bi@#1}{%
+ \BibAbbrevWarning{#1}%
+ }{%
+% \end{macrocode}
+% We pass control to \cs{xref@check@c} here to handle inheritance
+% of multiple fields properly. This means some of the checking
+% we've just done gets done again, but I can live with that.
+% \begin{macrocode}
+ \let#1\@empty
+ \xref@check@c\@tempa
+ }%
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\xref@check@c}
+% Resolve an \fld{xref} field.
+% \begin{macrocode}
+\def\xref@check@c#1{%
+ \ifx#1\@empty
+ \else
+ \begingroup
+ \@apply\auto@protect\amsrefs@textsymbols
+ \@apply\auto@protect\amsrefs@textaccents
+ \let\DSK@def\xref@add@toks
+ \let\DSK@append\xref@append
+ \toks@\@emptytoks
+ \let\bib@reset\@empty
+% \end{macrocode}
+% The \cs{@for} here is just a fancy way of expanding \arg{1}. (Or
+% is it?)
+% \begin{macrocode}
+ \@for\xref@ID:=#1\do{%
+ \@ifundefined{bi@\xref@ID}{%
+ \XRefWarning{\xref@ID}%
+ }{%
+ \csname bi@\xref@ID\endcsname
+ }%
+ }%
+ \edef\@tempa{\endgroup\the\toks@}%
+ \@tempa
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\xref@add@toks}
+% If any title occurs in an \fld{xref}ed item, assume that it is a book
+% title. This might not always be the best assumption? Let's see how
+% it goes though. [mjd,2001-12-11]
+%
+% \MacroArgs
+% \macroarg{1}{\cs{bib'}field}
+% \macroarg{2}{value}
+% \begin{macrocode}
+\def\xref@add@toks#1#2#3{%
+ \ifx#1\@empty
+ \edef\@tempa{%
+ \@nx\add@toks@{\@xp\@nx\csname\rkv@setter#1\endcsname{#2}{#3}}%
+ }%
+ \@tempa
+ \else
+ \in@\bib'title{#1}%
+ \ifin@
+ \ifx\bib'booktitle\@empty
+ \edef\@tempa{%
+ \@nx\add@toks@{%
+ \@xp\@nx\csname set:bib'booktitle\endcsname
+ }%
+ }%
+ \@tempa
+ \add@toks@{{#2}{#3}}%
+ \fi
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\def\xref@append#1#2#3#4{%
+ \edef\@tempa{%
+ \@nx\add@toks@{\@xp\@nx\csname\rkv@setter#2\endcsname{#3}{#4}}%
+ }%
+ \@tempa
+}
+% \end{macrocode}
+%
+% \begin{macro}{\BibAbbrevWarning}
+% \begin{macrocode}
+\def\BibAbbrevWarning#1{\amsrefs@warning{Abbreviation '#1' undefined}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\XrefWarning}
+% \begin{macrocode}
+\def\XRefWarning#1{\amsrefs@warning{Xref '#1' undefined}}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Bib field preprocessing}
+%
+% \begin{macro}{\current@primary}
+% \begin{macrocode}
+\let\current@primary\@empty
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\previous@primary}
+% \begin{macrocode}
+\let\previous@primary\@empty
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\save@primary}
+% \begin{macrocode}
+\IfOption{nobysame}{%
+ \let\save@primary\@empty
+}{%
+ \def\save@primary{%
+ \global\let\previous@primary\current@primary
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bib@field@patches}
+% Depending on your point of view, this macro either puts the
+% bibitem into a canonical form or, alternatively, it fudges the
+% data to fit our model. Either way, it simplifies formatting the
+% bibliography.
+% \begin{macrocode}
+\def\bib@field@patches{%
+ \ifx\bib'author\@empty
+ \ifx\bib'editor\@empty
+ \let\current@primary\bib'translator
+ \let\print@primary\PrintTranslatorsA
+ \else
+ \let\current@primary\bib'editor
+ \let\print@primary\PrintEditorsA
+ \fi
+ \else
+ \let\current@primary\bib'author
+ \let\print@primary\PrintAuthors
+ \fi
+ \ifx\bib'address\@empty
+ \let\bib'address\bib'place
+ \fi
+ \ifx\bib'organization\@empty
+ \ifx\bib'institution\@empty
+ \let\bib'organization\bib'school
+ \else
+ \let\bib'organization\bib'institution
+ \fi
+ \fi
+ \ifx\bib'date\@empty
+ \ifx\bib'year\@empty
+ \let\bib@year\bib'status
+ \else
+ \bib@parsedate\bib'year
+ \fi
+ \else
+ \bib@parsedate\bib'date
+ \fi
+% \end{macrocode}
+% Example~21 on page~74 of \emph{Mathematics into
+% Type}~\cite{SOS99} seems to indicate that when the year serves as
+% the volume number, the date should be suppressed. If so, this is
+% where that is done.
+% \begin{macrocode}
+ \def\@tempa{year}%
+ \ifx\bib'volume\@tempa
+ \let\bib'volume\bib@year
+ \let\bib'date\@empty
+ \fi
+% \end{macrocode}
+% Some journals have ``numbers'' but no ``volumes''. AMS house
+% style is to treat the number as volume.
+% \begin{macrocode}
+ \ifx\setbib@@\setbib@article
+ \ifx\bib'volume\@empty
+ \ifx\bib'number\@empty\else
+ \let\bib'volume\bib'number
+ \let\bib'number\@empty
+ \fi
+ \fi
+ \fi
+% \end{macrocode}
+% \cs{bib'language} is used for producing the printed rendition of
+% the language. \cs{bib@language} needs to be in the form required by
+% \cn{selectlanguage}.
+% \begin{macrocode}
+ \bib@language@fixup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Date setup}
+%
+% \begin{macro}{\bib@year}
+% \begin{macrocode}
+\let\bib@year\@empty
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bib@month}
+% \begin{macrocode}
+\let\bib@month\@empty
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bib@day}
+% \begin{macrocode}
+\let\bib@day\@empty
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bib@parsedate}
+% Parse an ISO 8601 date into its year, month and day components,
+% but without actually verifying that any of the components are
+% numeric. Hmmm.
+% \begin{macrocode}
+\def\bib@parsedate#1{%
+ \@xp\bib@parsedate@a#1---\@nil
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bib@parsedate@a}
+% \begin{macrocode}
+\def\bib@parsedate@a#1-#2-#3-#4\@nil{%
+ \def\bib@year{#1}%
+ \def\bib@month{#2}%
+ \def\bib@day{#3}%
+% \end{macrocode}
+% The rest of this macro tries to rewrite \cs{bib'date} into a
+% normalized form. I'm not sure if this is a good idea.
+% \begin{macrocode}
+ \ifx\@empty\bib@day
+ \ifx\@empty\bib@month
+ \let\bib'date\bib@year
+ \else
+ \def\bib'date{#1-#2}%
+ \fi
+ \else
+ \def\bib'date{#1-#2-#3}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Language setup}
+%
+% \begin{macro}{\bib@language@fixup}
+% \begin{macrocode}
+\def\bib@language@fixup{%
+ \ifx\bib'hyphenation\@empty
+ \ifx\bib'language\@empty
+ \let\bib@language\biblanguagedefault
+ \else
+ \let\bib@language\bib'language
+ \fi
+ \else
+ \let\bib@language\bib'hyphenation
+ \fi
+ \def\@tempa##1 ##2\@nil{\lowercase{\def\bib@language{##1}}}%
+% \end{macrocode}
+% The mysterious \cs{@firstofone} here is to preserve the space
+% before the \cs{@nil}.
+% \begin{macrocode}
+ \@firstofone{\@xp\@tempa\bib@language} \@nil
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bib@selectlanguage}
+% For \cn{bib} purposes we are interested mainly in testing whether
+% the hyphenation patterns are the same. So we use an
+% if-same-patterns test (by which \pkg{babel}'s `english' and
+% `american' compare as equal) rather than an if-same-language test.
+% Also, the way that the \cn{selectlanguage} command checks to see
+% whether a language has been properly defined for babel use is to
+% see if \cs{dateLANGUAGE} is defined. And if we tried to select an
+% undefined language, the result would be a \latex/ error.
+% \begin{macrocode}
+\def\bib@selectlanguage{%
+ \@ifsame@patterns{\languagename}{\bib@language}{}{%
+ \@ifundefined{date\bib@language}{}{%
+ \@xp\selectlanguage\@xp{\bib@language}%
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@ifsame@patterns}
+% \begin{macrocode}
+\def\@ifsame@patterns#1#2{%
+ \@xp\@ifsamepat\csname l@#1\@xp\endcsname\csname l@#2\endcsname
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@ifsamepat}
+% \begin{macrocode}
+\def\@ifsamepat#1#2{%
+ \ifnum \ifx\relax#1\m@ne\else#1\fi = \ifx\relax#2\m@ne\else#2\fi
+ \@xp\@firstoftwo
+ \else
+ \@xp\@secondoftwo
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\languagename}
+% \begin{macro}{\biblanguageEnglish}
+% \begin{macro}{\biblanguagedefault}
+% \begin{macro}{\bib@language}
+% \begin{macrocode}
+\providecommand{\languagename}{english}
+\def\biblanguageEnglish{english}
+\let\biblanguagedefault\biblanguageEnglish
+\let\bib@language\@empty
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Citation label setup}
+%
+% \begin{macro}{\generate@label}
+% \begin{macrocode}
+\let\generate@label\relax
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cite@label}
+% \begin{macrocode}
+\def\cite@label{\@currentlabel}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\alpha@label}
+% \begin{macrocode}
+\let\alpha@label\relax
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\alpha@label@}
+% \begin{macrocode}
+\def\alpha@label@{%
+ \ifx\@empty\bib'label
+ \def\thebib{\CurrentBib}%
+ \else
+ \let\thebib\bib'label
+ \fi
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\amsrefs@option@numeric}
+% \begin{macrocode}
+\def\amsrefs@option@numeric{%
+ \let\alpha@label\relax
+ \let\generate@label\relax
+ % \@nmbrlisttrue
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\amsrefs@option@alphabetic}
+% \begin{macrocode}
+\def\amsrefs@option@alphabetic{%
+ \let\alpha@label\alpha@label@
+ \let\generate@label\generate@alphalabel
+ \let\calc@author@part\calc@author@part@
+ \let\@suffix@format\@alph
+ \let\append@label@year\append@label@year@
+ % \@nmbrlistfalse
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\amsrefs@option@shortalphabetic}
+% \begin{macrocode}
+\def\amsrefs@option@shortalphabetic{%
+ \let\alpha@label\alpha@label@
+ \let\generate@label\generate@alphalabel
+ \let\calc@author@part\calc@author@part@short
+ \let\@suffix@format\@arabic
+ \let\append@label@year\@empty
+ % \@nmbrlistfalse
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bib@cite}
+% When \cs{bib@cite} is called, author name and year are available
+% in \cs{bib@author} and \cs{bib@year}.
+% \MacroArgs
+% \macroarg{1}{citekey}
+% \begin{macrocode}
+\def\bib@cite#1{%
+ \def\CurrentBib{#1}%
+ \alpha@label % modify \thebib if necessary
+ \item\leavevmode
+ \SK@\SK@@label{#1}%
+ \@xp\bib@cite@a\csname b@#1\endcsname
+ \bibcite@write{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\def\bib@cite@a#1{%
+ \ifx\relax#1%
+ \begingroup
+ \auto@protect\etaltext
+ \protected@edef\@tempa{%
+ \gdef\@nx#1{%
+ \@nx\citesel 01{\cite@label}{\bib@label@year}{}%
+ }%
+ }%
+ \@xp\endgroup
+ \@tempa
+ \else
+ \@xp\bib@cite@check\@xp#1#1\@empty\@empty\@empty\@empty\@empty
+ \fi
+}
+% \end{macrocode}
+%
+% \begin{macro}{\bib@cite@check}
+% For the citation key we want to check if it is already defined. But
+% there is a slight problem. There is already one control
+% sequence in use for each bibliography entry, to store the label or
+% the author/year information needed by \cn{cite}. If we introduce
+% another control sequence to check whether a particular cite is
+% multiply defined, then we double the number of control sequences
+% used. For a large bibliography in a book this is fairly serious.
+% This is addressed by using a \cs{citesel} function.
+%
+% \MacroArgs
+% \macroarg{1}{\cs{b@}citekey}
+% \macroarg{2}{\cs{citesel}}
+% \macroarg{3}{cited?}
+% \macroarg{4}{used?}
+% \macroarg{5}{label}
+% \macroarg{6}{year}
+% \macroarg{7}{backrefs}
+% \begin{macrocode}
+\def\bib@cite@check#1#2#3#4#5#6#7{%
+ \ifx 1#4\relax
+ \DuplicateBibKeyWarning
+ \else
+% \end{macrocode}
+% This has gotten \emph{way} out of hand.
+% \begin{macrocode}
+ \begingroup
+ \auto@protect\etaltext
+ \@apply\auto@protect\amsrefs@textsymbols
+ \@apply\auto@protect\amsrefs@textaccents
+ \@tempswafalse
+ \in@\CitePrintUndefined{#5}%
+ \ifin@
+ \let\@tempa\@empty
+ \else
+ \def\@tempa{#5}%
+ \fi
+ \ifx\@tempa\@empty
+ \else
+ \@xp\ifx\@xp\@currentlabel\cite@label
+ \edef\@tempb{\cite@label}%
+ \else
+ \let\@tempb\cite@label
+ \fi
+ \ifx\@tempa\@tempb
+ \def\@tempa{#6}%
+ \ifx\@tempa\bib@label@year
+ \else
+ \@tempswatrue
+ \fi
+ \else
+ \@tempswatrue
+ \fi
+ \fi
+ \if@tempswa
+ \@ifempty{#6}{%
+ \def\@tempa{#5}%
+ \let\@tempb\cite@label
+ }{%
+ \def\@tempa{#5, #6}%
+ \def\@tempb{\cite@label, \bib@label@year}%
+ }%
+ \amsrefs@warning{Citation label for \extr@cite#1 is
+ changing from `\@tempa ' to `\@tempb '}%
+ \fi
+ \protected@edef\@tempa{%
+ \gdef\@nx#1{%
+ \@nx\citesel #31{\cite@label}{\bib@label@year}{#7}%
+ }%
+ }%
+ \@xp\endgroup
+ \@tempa
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bib@label@year}
+% \begin{macrocode}
+\let\bib@label@year\@empty
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\DuplicateBibKeyWarning}
+% \begin{macrocode}
+\def\DuplicateBibKeyWarning{%
+ \amsrefs@warning{%
+ Duplicate \protect\bib\space key
+ `\CurrentBib ' detected\MessageBreakNS}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\DuplicateBibKeyWarning}
+% \begin{macrocode}
+\def\DuplicateBibLabelWarning{%
+ \amsrefs@warning{%
+ Duplicate biblabel stem `\current@stem ' detected.\MessageBreakNS
+ This usually means the order of the bibitems\MessageBreakNS
+ is incompatible with the style of labels\MessageBreakNS
+ you are using}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bibcite@write}
+% \begin{macrocode}
+\def\bibcite@write#1{%
+ \if@filesw
+ \begingroup
+ \let\citesel\citesel@write
+ \csname b@#1\endcsname
+ \endgroup
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\citesel@write}
+% \begin{macrocode}
+\def\citesel@write#1#2#3#4#5{%
+ \toks@{{#3}{#4}}%
+ \immediate\write\@auxout{\string\bibcite{\CurrentBib}{\the\toks@}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Because duplicate bibs are caught immediately, we don't need
+% \cs{bibcite} to run \cs{@testdef}.
+% \begin{macrocode}
+\AtEndDocument{\let\bibcite\@gobbletwo}
+% \end{macrocode}
+%
+% \subsubsection{Printing the bibliography}
+%
+% \begin{macro}{\bibname}
+% \begin{macrocode}
+\providecommand{\bibname}{Bibliography}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\refname}
+% \begin{macrocode}
+\providecommand{\refname}{References}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bib@div@mark}
+% The AMS document classes automatically take care of the page
+% marks for \cn{section*} and \cn{chapter*}, but for the standard
+% classes, we need to make sure that \cn{@mkboth} gets invoked.
+% \begin{macrocode}
+\let\bib@div@mark\@gobble
+% \end{macrocode}
+% This is verbose, but probably safer than any alternative.
+% \begin{macrocode}
+\@ifclassloaded{amsbook}{}{%
+ \@ifclassloaded{amsart}{}{%
+ \@ifclassloaded{amsproc}{}{%
+ \def\bib@div@mark#1{%
+ \@mkboth{\MakeUppercase{#1}}{\MakeUppercase{#1}}%
+ }%
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{bibchapter}
+% We need to take a little extra trouble here to pre-expand the
+% \cn{bibname}.
+% \begin{macrocode}
+\newenvironment{bibchapter}[1][\bibname]{%
+ \begingroup
+ \protected@edef\@{%
+ \endgroup
+ \protect\chapter*{#1}%
+ \protect\bib@div@mark{#1}%
+ }%
+ \@
+}{\par}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{bibsection}
+% And here to pre-expand the \cn{refname}.
+% \begin{macrocode}
+\newenvironment{bibsection}[1][\refname]{%
+ \begingroup
+ \protected@edef\@{%
+ \endgroup
+ \ifx\@bibtitlestyle\undefined
+ \protect\section*{#1}%
+ \else
+ \protect\@bibtitlestyle
+ \fi
+ \protect\bib@div@mark{#1}%
+ }%
+ \@
+}{\par}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{bibdiv}
+% Here we try to guess whether this is a book-like document or an
+% article-like document.
+% \begin{macrocode}
+\@ifundefined{chapter}{%
+ \newenvironment{bibdiv}{\bibsection}{\endbibsection}
+}{%
+ \newenvironment{bibdiv}{\bibchapter}{\endbibchapter}
+}
+% \end{macrocode}
+% \end{environment}
+%
+% This is what the standard \cls{book} class has for the bibliography
+% title:
+% \begin{verbatim}
+% \newenvironment{thebibliography}[1]
+% {\chapter*{\bibname
+% \@mkboth{\MakeUppercase\bibname}{\MakeUppercase\bibname}}%
+% \list{\@biblabel{\@arabic\c@enumiv}}%
+%\end{verbatim}
+%
+% \begin{environment}{thebibliography}
+% \begin{macrocode}
+\renewenvironment{thebibliography}[1]{%
+ \bibdiv
+ \biblist[\resetbiblist{#1}]%
+}{%
+ \endbiblist
+ \endbibdiv
+}
+% \end{macrocode}
+% \end{environment}
+%
+% \subsection{Name, journal and publisher abbreviations}
+%
+% The commands \cn{DefineName}, \cn{DefinePublisher}, and
+% \cn{DefineJournal} are provided to make abbreviations a little
+% easier.
+%
+% \begin{macro}{\DefineName}
+% \begin{macrocode}
+\newcommand{\DefineName}[2]{%
+ \bib*{#1}{name}{name={#2}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\DefineJournal}
+% \begin{macrocode}
+\newcommand{\DefineJournal}[4]{%
+ \bib*{#1}{periodical}{
+ issn={#2},
+ journal={#4}
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\DefinePublisher}
+% Note that an explicit \fld{address} field in a \cn{bib} entry will
+% override the \fld{address} supplied as part of a
+% \cn{DefinePublisher}.
+% \begin{macrocode}
+\newcommand{\DefinePublisher}[4]{%
+ \bib*{#1}{publisher}{%
+ publisher={#3},
+ address={#4}
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Processing \fn{.ltb} files}
+%
+% If you have a file that contains \pkg{amsrefs}-style
+% \cn{bib} entries, you can use it as a database and extract items
+% from it for use in another document. In typical relatively simple
+% scenarios, the extraction can be done by \latex/ itself on the first
+% pass, so that citations in the text will be successfully resolved
+% on the second pass (possibly even the first, depending on what kind
+% of bibliography sorting is used).
+%
+% \begin{macro}{\bibselect}
+% \begin{macrocode}
+\newcommand{\bibselect}{%
+ \@ifstar{%
+ \let\@bibdef\copy@bibdef
+ \BibSelect
+ }{%
+ \let\@bibdef\selective@bibdef
+ \BibSelect
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\BibSelect}
+% \begin{macrocode}
+\newcommand{\BibSelect}[2][\bblname]{%
+ \if@filesw
+ \typeout{Trying to create bbl file `#1.bbl' ...}%
+ \def\bibselect@msg{%
+ \typeout{ ... rats. Unable to create bbl file.}%
+ }%
+ \let\@open@bbl@file\OpenBBLFile
+ \@for\@tempa:=#2\do{\ReadBibData{\@tempa}}%
+ \fi
+ \@close@bbl@file
+ \@apply\g@undef\bibdefer@list
+ \global\let\bibdefer@list\@empty
+% \end{macrocode}
+% Now read the \fn{.bbl} file we just created.
+% \begin{macrocode}
+ \let\@bibdef\normal@bibdef
+ \@input@{#1.bbl}%
+ \let\BibSelect\MultipleBibSelectWarning
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\MultipleBibSelectWarning}
+% \begin{macrocode}
+\newcommand\MultipleBibSelectWarning[2][]{%
+ \amsrefs@warning{%
+ Multiple \string\bibselect 's found (only one
+ \string\bibselect\space per biblist environment is allowed)%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bblname}
+% \begin{macrocode}
+\def\bblname{\jobname}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bib@dbfile}
+% \begin{macrocode}
+\newread\bib@dbfile
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ReadBibData}
+% \begin{macrocode}
+\newcommand{\ReadBibData}[1]{%
+ \IfFileExists{#1.ltb}{%
+ \openin\bib@dbfile=\@filef@und \relax
+ }{%
+ \IfFileExists{#1.ltx}{%
+ \openin\bib@dbfile=\@filef@und \relax
+ }{%
+ \IfFileExists{#1.tex}{%
+ \openin\bib@dbfile=\@filef@und \relax
+ }{%
+ \begingroup
+ \NoBibDBFile{#1}%
+ \let\ReadBibData@a\endgroup
+ }%
+ }%
+ }%
+ \ReadBibData@a
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\NoBibDBFile}
+% \begin{macrocode}
+\def\NoBibDBFile#1{%
+ \amsrefs@warning{No data file #1.ltb (.ltx, .tex) found}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ReadBibData@a}
+% \begin{macrocode}
+\def\ReadBibData@a{%
+ \ProvidesFile{\@filef@und}\relax
+ \begingroup
+ \let\star@bibdef\defer@bibdef
+ \ReadBibLoop
+ \endgroup
+ \closein\bib@dbfile
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ReadBibLoop}
+% \begin{macrocode}
+\def\ReadBibLoop{%
+ \ifeof\bib@dbfile
+ \@xp\@gobble
+ \else
+ \read\bib@dbfile to\CurLine
+% \end{macrocode}
+% The \cs{@empty} is in case \cs{CurLine} is empty.
+% \begin{macrocode}
+ \@xp\ReadBibLoop@a\CurLine\@empty\@nil
+ \fi
+ \ReadBibLoop
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ReadBibLoop@e}
+% This traps top-level \cn{bib} commands. Note that:
+% \begin{itemize}
+%
+% \item
+% If \cs{CurLine} doesn't contain a complete \cn{bib} entry, the
+% code chokes.
+%
+% \item
+% I \cn{bib} is not the very first non-space token in a line, it
+% will not be recognized.
+%
+% \end{itemize}
+%
+% \begin{macrocode}
+\long\def\ReadBibLoop@a#1#2\@nil{%
+ \ifx\bib#1%
+ \CurLine % just exec it
+ \else
+% \end{macrocode}
+% We're not done yet. The line may contain something like
+% \cn{DefineName}, so we need to expand the first macro in the line
+% and see if it starts with \cn{bib}. But first we check to make
+% sure that the token we're about to expand isn't \cn{endinput}.
+% \begin{macrocode}
+ \ifx\endinput#1%
+ \let\ReadBibLoop\@empty
+ \else
+% \end{macrocode}
+% And this \cs{@empty} is for the admittedly unlikely case that
+% \cs{CurLine} isn't empty, but its expansion is.
+% \begin{macrocode}
+ \@xp\ReadBibLoop@b#1#2\@empty\@nil
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ReadBibLoop@b}
+% \begin{macrocode}
+\long\def\ReadBibLoop@b#1#2\@nil{%
+ \ifx\bib#1%
+ \CurLine % just exec it
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\let\bbl@out=\relax
+\let\bbl@write\@gobble
+\let\@open@bbl@file\relax
+\let\@close@bbl@file\relax
+% \end{macrocode}
+%
+% \begin{macro}{\OpenBBLFile}
+% \begin{macrocode}
+\def\OpenBBLFile{%
+ \if@filesw
+ % Just use the next unused output stream
+ \count@\count17
+ \advance\count@\@ne
+ \ifnum\count@<\sixt@@n
+ \global\chardef\bbl@out=\count@
+ \immediate\openout\bbl@out=\bblname.bbl\relax
+ \global\let\@close@bbl@file\CloseBBLFile
+ \gdef\bbl@write{\immediate\write\bbl@out}%
+ \else
+ \ch@ck\count@\sixt@@n\write
+ \fi
+ \fi
+ \global\let\@open@bbl@file\relax
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CloseBBLFile}
+% \begin{macrocode}
+\def\CloseBBLFile{%
+ \immediate\closeout\bbl@out\relax
+ \global\let\@close@bbl@file\relax
+ \global\let\bbl@write\@gobble
+ \global\let\bbl@out\relax
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Citation processing}
+%
+% \subsubsection{The \cs{citesel} structure}
+%
+% The information used by \cn{cite} for key \texttt{moo} is stored in
+% \cs{b@moo} in the form
+% \begin{verbatim}
+% \citesel{status1}{status2}{label}{year}{backref-info}
+%\end{verbatim}%
+%
+% The first status flag is~1 if this key has already been cited
+% earlier in the same document; 0~otherwise. This is used in some
+% bibliography schemes to print a full list of author names for the first
+% citation and an abbreviated author list for subsequent citations.
+%
+% The second status flag is~1 if this key has already been used by a
+% define-cite command (such as \cn{bib}); 0~otherwise. This makes it
+% possible to issue a warning message as soon as the conflict is seen,
+% on the first \latex/ run, instead of on a subsequent run during the
+% processing of the \fn{.aux} file.
+%
+% When an author/year citation scheme is in use, args 3 and~4 hold
+% respectively author names and year. Otherwise arg~3 simply holds
+% a cite label and arg~4 is empty.
+%
+% And finally, arg~5 holds a list of backref pointers indicating the
+% locations in the document where this entry has been cited.
+%
+% \begin{macro}{\citesel@update}
+% \begin{macrocode}
+\def\citesel@update#1#2#3#4#5#6{%
+ \gdef#6{\citesel 1#2{#3}{#4}{#5}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\citesel@number}
+% \begin{macrocode}
+\def\citesel@number#1#2#3#4#5{#3}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\citesel@year}
+% \begin{macrocode}
+\def\citesel@year#1#2#3#4#5{#4}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\citesel}
+% \begin{macrocode}
+\let\citesel\citesel@number
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{The basic \cn{cite} command}
+%
+% Here is the difference between the various optional forms of
+% \cn{cite}:
+% \begin{verbatim}
+% \cite{xyz} -> \cite@a\citesel{xyz}{}
+% -> \cite@bc\b@xyz\citesel{}
+%
+% \cite{xyz}*{blub} -> \cite@a\citesel{xyz}{blub}
+% -> \cite@bc\b@xyz\citesel{blub}
+%
+% \cite[blub]{xyz} -> \cite@a\citesel{xyz}{blub}
+% -> \cite@bc\b@xyz\citesel{blub}
+%\end{verbatim}
+%
+% Canceling the old \latex/ definition of \verb*'\cite ' prevents
+% certain problems that could arise with the \pkg{showkeys} package.
+% \begin{macrocode}
+\expandafter\let\csname cite \endcsname\relax
+% \end{macrocode}
+%
+% \begin{macro}{\cite}
+% Need to handle the standard [...] option for compatibility's sake.
+% \begin{macrocode}
+\renewcommand{\cite}[2][]{%
+ \if\cite@single#2,\@gobble \else\MultipleCiteKeyWarning{#2}{#1}\fi
+ \@ifempty{#1}{%
+ \cites@o{#2}%
+ }{%
+ \ObsoleteCiteOptionWarning
+ \cites@a{*{#1}}{#2}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\MultipleCiteKeyWarning}
+% \begin{macrocode}
+\def\MultipleCiteKeyWarning#1#2{%
+ \amsrefs@warning{%
+ Use of \string\cites\space is recommended instead of %
+ \string\cite\space\MessageBreak
+ for multiple cites '#1'}%
+ \@ifnotempty{#2}{%
+ \amsrefs@warning{Star option requires \string\citelist\space here}%
+ }%
+ \global\let\MultipleCiteKeyWarning\@gobbletwo
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ObsoleteCiteOptionWarning}
+% \begin{macrocode}
+\def\ObsoleteCiteOptionWarning{%
+ \amsrefs@warning{%
+ The form \string\cite{...}*{...} is recommended\MessageBreak
+ instead of \string\cite[...]{...}}%
+ \global\let\ObsoleteCiteOptionWarning\@empty
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cite@single}
+% \begin{macrocode}
+\edef\cite@single#1,#2{\iffalse{\fi\iffalse{\fi\string}#2.\string}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cites@o}
+% \begin{macrocode}
+\def\cites@o#1{\star@{\cites@oo{#1}}{}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cites@oo}
+% \begin{macrocode}
+\def\cites@oo#1#2{\@ifempty{#2}{\cites@a{}{#1}}{\cites@a{*{#2}}{#1}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cites@a}
+% \begin{macrocode}
+\def\cites@a#1#2{%
+ \begingroup
+ \toks@{\endgroup \cites@b{#1}}%
+ \vdef\@tempa{#2}%
+ \edef\@tempa{%
+ \the\toks@ \@firstofone{\@xp\zap@space\@tempa} \@empty
+ }%
+ \@tempa,\@empty
+ \edef\@tempa{\endgroup\@nx\citelist{\the\toks@}}%
+ \@tempa
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cites@b}
+% \begin{macrocode}
+\def\cites@b#1#2,#3{%
+ \begingroup
+ \toks@{\InnerCite{#2}#1}%
+ \ifx\@empty#3\@xp\@gobble\fi
+ \cites@c#3%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cites@c}
+% \begin{macrocode}
+\def\cites@c#1,#2{%
+ \add@toks@{\InnerCite{#1}}%
+ \ifx\@empty#2\@xp\@gobble\fi
+ \cites@c#2%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\citeleft}
+% \begin{macro}{\citeright}
+% \begin{macro}{\citemid}
+% \begin{macro}{\citepunct}
+% These variables are named to follow the precedent set by
+% Arseneau's \pkg{cite} package. \cs{citemid} is used to separate a
+% citation label from additional information such as \qq{Theorem
+% 4.9}. \cs{citepunct} is used to separate multiple cites, unless
+% one of the cites has additional associated information, in which
+% case \cs{CiteAltPunct} is used.
+% \begin{macrocode}
+\def\citeleft{[}
+\def\citeright{]}
+% \end{macrocode}
+% \begin{macrocode}
+\def\citemid{,\penalty9999 \space}
+\def\citepunct{,\penalty9999 \hskip.13em plus.1em minus.05em\relax}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\citeAltPunct}
+% When a citation list contains one or more citations with optional
+% arguments, we replace \cs{citemid} by \cs{CiteAltPunct}.
+% \begin{macrocode}
+\def\citeAltPunct{;\ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\citeform}
+% This is used for formatting the citation label. It can be used,
+% for example, to bolden the labels (as in \cls{amsbook} and
+% \cls{amsproc}) or to do more elaborate things such as convert the
+% numbers to roman numerals. By default, it's just a no-op.
+%
+% Note that currently there is no corresponding macro for changing
+% the formatting of \cn{cite}'s optional argument. This is
+% probably a bug.
+% \begin{macrocode}
+\providecommand{\citeform}{\@firstofone}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\citelist}
+% The \cs{@citelist} indirection turns out to be helpful in
+% implementing the \cs{ocites} command for the \opt{author-year}
+% option.
+% \begin{macrocode}
+\DeclareRobustCommand{\citelist}{\@citelist}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@citelist}
+% \begin{macrocode}
+\def\@citelist#1{%
+ \leavevmode
+ \begingroup
+ \@citestyle
+ \citeleft\nopunct % suppress first \citepunct
+ \cite@begingroup
+ \in@*{#1}%
+ \ifin@
+ \let\citepunct\citeAltPunct
+ \fi
+ \let\cite@endgroup\@empty
+ \cites@init
+ \def\citeleft{\@addpunct{\citepunct}}%
+ \let\citeright\ignorespaces
+ \def\cite{\InnerCite}%
+ \process@citelist{#1}%
+ \endgroup
+ \citeright
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@citestyle}
+% Reset the font to an upright, medium font (e.g. \fnt{cmr}), per
+% AMS style. Also set $\cs{mathsurround} = 0\,\mathrm{pt}$ just in
+% case there are subscripts in the cite numbers (from
+% \cn{etalchar}, for example).
+% \begin{macrocode}
+\providecommand{\@citestyle}{\m@th\upshape\mdseries}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cite@begingroup}
+% Grouping that encloses an entire cite block (a single cite or a
+% list of cites).
+% \begin{macrocode}
+\def\cite@begingroup{\begingroup\let\cite@begingroup\relax}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cite@endgroup}
+% \begin{macrocode}
+\let\cite@endgroup\endgroup
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cites@init}
+% This needs to be called at the beginning of a list of cites to
+% reset a few things.
+% \begin{macrocode}
+\def\cites@init{%
+ \gdef\prev@names{???}%
+ \let\cites@init\@empty
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\InnerCite}
+% \begin{macrocode}
+\newcommand{\InnerCite}[1]{\star@{\cite@a\citesel{#1}}{}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cite@a}
+% The job of \cs{cite@a} is to convert the cite key to all catcode-12
+% characters and remove any spaces it might contain before passing
+% it on to \cs{cite@b}.
+%
+% \MacroArgs
+% \macroarg{1}{\cs{CITESEL}}
+% \macroarg{2}{citekey}
+% \begin{macrocode}
+\def\cite@a#1#2{%
+ \BackCite{#2}%
+ \cite@begingroup
+ \cites@init
+ \let\citesel#1\relax
+ \ifx\citesel\citesel@author
+ \let\citeleft\@empty
+ \let\citeright\@empty
+ \fi
+ \begingroup
+ \toks@{\endgroup \cite@b}%
+ \vdef\@tempa{#2}%
+ \edef\@tempa{%
+ \the\toks@{\@firstofone{\@xp\zap@space\@tempa} \@empty}%
+ }%
+ \@tempa
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cite@b}
+% \MacroArgs
+% \macroarg{1}{citekey}
+% \macroarg{2}{star-optional-arg}
+% \begin{macrocode}
+\def\cite@b#1#2{%
+ \@xp\cite@bc\csname b@#1\@xp\endcsname {#1}{#2}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cite@bc}
+% If it's uninitialized, plug in an empty cite structure.
+% \cs{cite@bc} should be executed only once for a given instance of a
+% cite key. All further processing should go through \cs{cite@cj}.
+% \begin{macrocode}
+\def\cite@bc#1#2{%
+ \ifx#1\@@undefined \global\let#1\relax \fi
+ \ifx#1\relax \global\let#1\empty@cite \fi
+ \@xp\cite@nobib@test#1{}{}{}{}\@nil#1%
+ \cite@cj#1%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\empty@cite}
+% \begin{macrocode}
+\def\empty@cite{\citesel 00{}{}{}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cite@nobib@test}
+% If arg 4 is empty, it means there wasn't any \cn{bib} command that
+% defined a valid label.
+%
+% \MacroArgs
+% \macroarg{1}{\cs{citesel}}
+% \macroarg{2}{cited?}
+% \macroarg{3}{used?}
+% \macroarg{4}{label}
+% \macroarg{5}{backrefs}
+% \macroarg{6}{\cs{b@}citekey}
+% \begin{macrocode}
+\def\cite@nobib@test#1#2#3#4#5\@nil#6{%
+ \@ifempty{#4}{%
+ \G@refundefinedtrue
+ \UndefinedCiteWarning#6%
+ \xdef#6{\@nx\citesel #2#3{%
+ \@nx\CitePrintUndefined{\extr@cite#6}}{}{}}%
+ }{}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\UndefinedCiteWarning}
+% This is a copy of the standard warning from \cs{@citex}.
+% \begin{macrocode}
+\def\UndefinedCiteWarning#1{%
+ \@latex@warning{%
+ Citation `\extr@cite#1' on page \thepage\space undefined}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CitePrintUndefined}
+% \begin{macrocode}
+\DeclareRobustCommand{\CitePrintUndefined}[1]{%
+ \begingroup\fontshape{n}\fontseries\mddefault \ttfamily ?#1\endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CPU@normal}
+% This has to be a \cs{let}, not a \cs{def}.
+% \begin{macrocode}
+\let\CPU@normal\CitePrintUndefined
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cite@cj}
+% \MacroArgs
+% \macroarg{1}{\cs{b@}citekey}
+% \macroarg{2}{star-optional-arg}
+% \begin{macrocode}
+\def\cite@cj#1#2{%
+ \leavevmode
+ \begingroup
+ \cite@cb#1% write info to aux file
+ \ar@SK@cite#1%
+ \@citeleft
+ \ar@hyperlink{#1}%
+ \@ifnotempty{#2}{\citemid{#2}}%
+ \citeright
+ \endgroup
+ \ignorespaces % ignore spaces inside \citelist
+ \cite@endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@citeleft}
+% The following definition provides some indirection that helps to
+% deal with author-year object cites.
+% \begin{macrocode}
+\def\@citeleft{\citeleft}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cite@cb}
+% \begin{macrocode}
+\def\cite@cb#1{%
+ \if@filesw
+ \immediate\write\@auxout{\string\citation{\extr@cite#1}}%
+ \fi
+% \end{macrocode}
+% Define \cs{citesel} to make \cs{b@whatever} update itself.
+% \begin{macrocode}
+ \begingroup
+ \let\citesel\citesel@update
+ #1#1%
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\extr@cite}
+% Extract \emph{citekey} from \cs{b@}\emph{citekey}.
+% \begin{macrocode}
+\def\extr@cite{\@xp\@gobblethree\string}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Fancier \cn{cite} commands}
+%
+% \begin{macro}{\cites}
+% A list of simple cites. Make it robust in case used inside a figure
+% caption. (But then also, by the way, listoffigures should provide
+% special handling.)
+% \begin{macrocode}
+\DeclareRobustCommand{\cites}{\cites@a{}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\citen}
+% This is just to keep the showkeys package from clobbering the wrong
+% part of our definition of \cn{cite}:
+% \begin{macrocode}
+\providecommand{\citen}{\ocite}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ycite}
+% \cn{cite} gets redefined inside of \cn{citelist}, so we need to
+% \cs{def} \cn{ycite} here instead of just \cs{let}ting everything
+% to \cn{cite}.
+% \begin{macrocode}
+\def\ycite{\cite}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ycites}
+% \begin{macrocode}
+\let\ycites\cites
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ocite}
+% \begin{macrocode}
+\let\ocite\ycite
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ocites}
+% \begin{macrocode}
+\let\ocites\cites
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fullcite}
+% \begin{macrocode}
+\let\fullcite\cite
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fullocite}
+% \begin{macrocode}
+\let\fullocite\ocite
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\citeauthor}
+% \begin{macrocode}
+\let\citeauthor\ycite
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\citeauthory}
+% \begin{macrocode}
+\let\citeauthory\ycite
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{The \cn{nocite} command}
+%
+% \begin{macro}{\nocite}
+% \begin{macrocode}
+\renewcommand{\nocite}[1]{\othercites{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\othercites}
+% \begin{macrocode}
+\newcommand{\othercites}[1]{%
+ \cite@begingroup
+ \let\BackCite\@gobble
+ \let\cite@endgroup\@empty
+ \def\citelist{\othercitelist}%
+ \cites{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\othercitelist}
+% \begin{macrocode}
+\newcommand{\othercitelist}[1]{%
+ \cite@begingroup
+ \let\cite@endgroup\@empty
+ \cites@init
+ \let\citeleft\relax
+ \let\citeright\ignorespaces
+ \def\InnerCite{\OtherCite}%
+ \def\cite@cj ##1##2{%
+ \begingroup
+ \@xp\citesel##1%
+ \cite@cb ##1%
+ \endgroup
+% \end{macrocode}
+% If we detect |\nocite{*}|, we globally alias
+% \cs{selective@bibdef} to \cs{copy@bibdef} so that all succeeding
+% \cn{bibselect} commands act like \cn{bibselect*}.
+% \begin{macrocode}
+ \@xp\ifx\csname b@*\endcsname ##1%
+ \global\let\selective@bibdef\copy@bibdef
+ \fi
+ \ignorespaces
+ \cite@endgroup
+ }%
+ #1\relax
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\OtherCite}
+% \begin{macrocode}
+\def\OtherCite#1{\cite@a\citesel@other{#1}{}{}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\citesel@other}
+% \begin{macrocode}
+\def\citesel@other#1#2#3#4#5#6{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\b@*}
+% This provides a dummy definition to keep things like |\nocite{*}|
+% from generating an error message.
+% \begin{macrocode}
+\@namedef{b@*}{\citesel 11{*}{*}{*}}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Citation sorting}
+%
+% \begin{macro}{\process@citelist@sorted}
+% \begin{macrocode}
+\def\process@citelist@sorted#1{%
+ \ifx\citesel\citesel@number
+ \cite@sorted@s #1\cite@sorted@e
+ \else
+ \NonNumericCiteWarning
+ \process@citelist@unsorted{#1}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\NonNumericCiteWarning}
+% \begin{macrocode}
+\def\NonNumericCiteWarning{%
+ \amsrefs@warning{%
+ Unable to confirm that cite keys are numeric: not sorting%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\process@citelist@unsorted}
+% \begin{macrocode}
+\def\process@citelist@unsorted#1{%
+ \ignorespaces#1\relax
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\process@citelist}
+% By default, citation lists will be sorted.
+% \begin{macrocode}
+\let\process@citelist\process@citelist@sorted
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CPU@sort}
+% By defining this as \TeX's maxint, undefined cites migrate to the
+% end of a sorted list.
+% \begin{macrocode}
+\def\CPU@sort#1{2147483647}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cite@sorted@s}
+% Here's where we prepare to sort the citations and (optionally)
+% compress ranges.
+% \begin{macrocode}
+\def\cite@sorted@s{%
+ \begingroup
+ \let\CitePrintUndefined\CPU@sort
+ \let\cite@cjs\cite@cj
+ \let\cite@cj\cite@compress
+ \begingroup
+ \toks@\@emptytoks
+ \let\cite@cj\cite@sort
+ \ignorespaces
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cite@sorted@e}
+% \begin{macrocode}
+\def\cite@sorted@e{%
+ \@xp\endgroup
+ \the\toks@
+ \cite@dash
+ \prev@cite
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cite@sort}
+% This is essentially an insertion sort. I think.
+%
+% \MacroArgs
+% \macroarg{1}{\cs{b@}citekey}
+% \macroarg{2}{optional arg}
+% \begin{macrocode}
+\def\cite@sort#1#2{%
+ \safe@set\@tempcnta#1% highest number so far
+ \toks@{\cite@cj#1{#2}}%
+ \@temptokena\toks@
+ \let\cite@cj\cite@sort@a
+ \ignorespaces
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cite@sort@a}
+% \begin{macrocode}
+\def\cite@sort@a#1#2{%
+ \safe@set\@tempcntb#1%
+ \ifnum\@tempcntb > \@tempcnta
+ \add@toks@{\cite@cj#1{#2}}%
+ \@tempcnta\@tempcntb
+ \else
+ \let\cite@cj\cite@sort@b
+ \toks@\@emptytoks
+ \def\@tempb{\add@toks@{\cite@cj#1{#2}}}%
+ \the\@temptokena
+ \@tempb
+ \let\cite@cj\cite@sort@a
+ \fi
+ \@temptokena\toks@
+ \ignorespaces
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cite@sort@b}
+% \begin{macrocode}
+\def\cite@sort@b#1#2{%
+ \safe@set\count@#1%
+ \ifnum\@tempcntb < \count@
+ \@tempb
+ \let\@tempb\@empty
+ \fi
+ \add@toks@{\cite@cj#1{#2}}%
+ \ignorespaces
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Range compression}
+%
+% When the time comes to apply compression, we have at our disposal a
+% list of internal cite calls that looks like this:
+% \begin{verbatim}
+% \cite@cj\b@aaa{opta}\cite@cj\b@bbb{optb}...\cite@cj\b@zzz{optz}
+%\end{verbatim}
+% where
+% \[ \ncn{b@aaa} < \ncn{b@bbb} < \cdots < \ncn{b@zzz} \]
+% and the \texttt{opt} arguments are possibly null.
+% To print the citations while collapsing sequences of 3 or more
+% contiguous numbers into ranges of the form $n$--$m$, we bind
+% \cs{cite@cj} to a suitably clever function and then execute the
+% list. In the absence of optional arguments, here's the algorithm:
+%
+% \begin{enumerate}
+% \item[Begin.]
+% Enter state~0. This is done by \cs{cite@sorted@s}.
+% \item[State 0.]
+%^^A This is the initial state.
+% The current citation is the beginning
+% of a range (possibly a singleton range). Print it. Then, set
+% $\mathit{prevnum} := \mathit{number}$ and enter state~1.
+%
+% \item[State 1.]
+% The current citation might be the second element of a range.
+% \begin{enumerate}
+% \item[Case a)]
+% $\mathit{number} = \mathit{prevnum} + 1$. Then the current
+% item is definitely the second element of a range. It might be
+% the last element of the range, but we won't know until we examine
+% the following citation. So, save the current citation in
+% \cs{prev@cite}, set $\mathit{prevnum} := \mathit{number}$, and go
+% to state~2.
+%
+% \item[Case b)]
+% $\mathit{number} \ne \mathit{prevnum} + 1$. The current citation
+% is the beginning of a new range. Print it, set
+% $\mathit{prevnum} := \mathit{number}$ and remain in state~1.
+% (This is essentially identical to stage~0.)
+%
+% \end{enumerate}
+%
+% \item[State 2.]\leavevmode
+% The current citation might be the third (or later) element of a
+% range.
+% \begin{enumerate}
+% \item[Case a)]
+% $\mathit{number} = \mathit{prevnum} + 1$. The current element is
+% definitely part of a range. It might be the last
+% element of the range, but again we won't know until we examine
+% the following citation. Save the current citation
+% in \cs{prev@cite} and set $\mathit{prevnum} := \mathit{number}$.
+% Remain in state~2.
+%
+% \item[Case b)]
+% $\mathit{number} \ne \mathit{prevnum} + 1$. The previous
+% citation was the end of a range and the current citation is the
+% beginning of a new range. Print a dash followed by
+% \cs{prev@cite}, then set $\mathit{prevnum} := \mathit{number}$
+% and enter state~1.
+%
+% \end{enumerate}
+%
+% \item[End.] If \cs{prev@cite} is not empty, print it, preceded by a
+% dash if we were in the middle of a range. (This is done by
+% \cs{cite@sorted@e}.)
+%
+% \end{enumerate}
+%
+% The presence of optional arguments complicates things
+% somewhat, since a citation with an optional argument should never
+% participate in range compression. In other words, when we come
+% across an optional argument, we should finish off the preceding
+% range, print the current citation, and then return to the initial
+% state. More precisely, here are the actions taken in each state
+% when there is an optional argument:
+%
+% \begin{enumerate}
+%
+% \item[State 0.]
+% Print the current citation and remain in state~0.
+%
+% \item[State 1.]
+% Print the current citation and return to state~0.
+%
+% \item[State 2.]
+% Print a dash followed by \cs{prev@cite}. Then print the current
+% citation and return to state~0.
+%
+% \end{enumerate}
+%
+% \begin{macro}{\prev@cite}
+% \begin{macrocode}
+\let\prev@cite\@empty
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\prev@cite@cb}
+% There's one further complication: Even though we're suppressing
+% some of the citation numbers, we need to make sure that each
+% citation is recorded in the \fn{.aux} file. So, in case~2a,
+% before we overwrite \cs{prev@cite}, we first invoke
+% \cs{prev@cite@cb} to record the previous citation (if any).
+% \begin{macrocode}
+\def\prev@cite@cb{%
+ \ifx\@prev@cite\@empty
+ \else
+ \begingroup
+ \def\cite@print##1##2{%
+ \cite@cb##1%
+ }%
+ \prev@cite
+ \endgroup
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cite@print}
+% \begin{macrocode}
+\def\cite@print#1#2{%
+ \begingroup
+ \let\CitePrintUndefined\CPU@normal
+ \cite@cjs#1{#2}%
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cite@dash}
+% Ok, I lied. There was more than one further complication.
+% Suppose that when we hit the end of the list, we're in state~2.
+% We need to know whether to output a dash or a comma. (For
+% example, both the sequences $[2, 3]$ and $[1, 2, 3]$ will end in
+% state~2 with $\mathit{prevcite} = 3$, but in the former case we
+% want a comma before the~3 and in the latter case we want a dash.)
+% So, rather than printing the dash explicitly, we use
+% \cs{cite@dash} to keep track of whether a dash is needed.
+% \begin{macrocode}
+\let\cite@dash\@empty
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\print@one@dash}
+% \begin{macrocode}
+\def\print@one@dash{%
+ \textendash \nopunct
+ \let\cite@dash\@empty
+}
+% \end{macrocode}
+% \end{macro}
+%
+% State 0, 1 and~2 each correspond to a different binding for
+% \cs{cite@cj}. Here they are. The role of $\mathit{prevnum}$ is
+% played by \cs{@tempcnta}, with \cs{@tempcntb} assisting as
+% $\mathit{number}$ at times.
+%
+% \begin{macro}{\cite@compress}
+% State~0:
+% \begin{macrocode}
+\def\cite@compress#1#2{%
+ \cite@print#1{#2}%
+ \@ifempty{#2}{%
+ \safe@set\@tempcnta#1%
+ \let\cite@cj\cite@compress@a
+ }{}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cite@compress@a}
+% State~1:
+% \begin{macrocode}
+\def\cite@compress@a#1#2{%
+ \@ifempty{#2}{%
+ \advance\@tempcnta\@ne
+ \safe@set\@tempcntb#1%
+ \ifnum\@tempcnta=\@tempcntb
+ \def\prev@cite{\cite@print#1{}}%
+ \let\cite@cj\cite@compress@b
+ \else
+ \cite@print#1{}%
+ \@tempcnta\@tempcntb
+ \fi
+ }{%
+ \cite@print#1{#2}%
+ \let\cite@cj\cite@compress
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cite@compress@b}
+% State~2:
+% \begin{macrocode}
+\def\cite@compress@b#1#2{%
+ \@ifempty{#2}{%
+ \advance\@tempcnta\@ne
+ \safe@set\@tempcntb#1%
+ \ifnum\@tempcnta=\@tempcntb
+ \let\cite@dash\print@one@dash
+ \prev@cite@cb
+ \def\prev@cite{\cite@print#1{}}%
+ \else
+ \cite@dash
+ \prev@cite
+ \let\prev@cite\@empty
+ \cite@print#1{}%
+ \@tempcnta\@tempcntb
+ \let\cite@cj\cite@compress@a
+ \fi
+ }{%
+ \cite@dash
+ \prev@cite
+ \let\prev@cite\@empty
+ \cite@print#1{#2}%
+ \let\cite@cj\cite@compress
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Munging the \fn{.aux} file}
+%
+% \begin{macro}{\amsrefs@bibcite}
+% When processing the \fn{.aux} file at begin-document, this is what
+% \cs{bibcite} will do:
+% \begin{macrocode}
+\def\amsrefs@bibcite#1{\@xp\bibcite@a\csname b@#1\endcsname}
+% \end{macrocode}
+% \end{macro}
+% However, \pkg{hyperref} also redefines \cs{bibcite}, so to avoid
+% conflicts and also ensure that it doesn't matter whether
+% \pkg{amsrefs} or \pkg{hyperref} is loaded first, rather than
+% redefining \cs{bibcite} directly, we redefine it inside the
+% \fn{.aux} file.
+% \begin{macrocode}
+\AtBeginDocument{%
+ \if@filesw
+ \immediate\write\@auxout{%
+ \string\@ifundefined{amsrefs@bibcite}{}{%
+ \string\let\string\bibcite\string\amsrefs@bibcite
+ }%
+ }%
+ \fi
+% \end{macrocode}
+% For good measure, we'll redefine it here as well, even though it
+% really shouldn't matter any longer.
+% \begin{macrocode}
+ \let\bibcite\amsrefs@bibcite
+}
+% \end{macrocode}
+%
+% \begin{macro}{\bibcite@a}
+% \MacroArgs
+% \macroarg{1}{\cs{b@}citekey}
+% \macroarg{2}{\embrace{\emph{label}}\embrace{} or \embrace{\emph{author}}\embrace{\emph{year}}}
+% \begin{macrocode}
+\def\bibcite@a#1#2{%
+% \end{macrocode}
+% Most of the time arg 1 will already be defined, by an earlier
+% \cs{citedest} command in the \fn{.aux} file. Then we just need to change
+% the number.
+% \begin{macrocode}
+ \ifx\relax#1%
+ \gdef#1{\citesel 00#2{}}%
+ \else
+ \begingroup
+ \@xp\bibcite@b\@xp#1#1{#2}%
+ \endgroup
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bibcite@b}
+%
+% \MacroArgs
+% \macroarg{1}{\cs{b@}citekey}
+% \macroarg{2}{\cs{citesel}}
+% \macroarg{3}{cited?}
+% \macroarg{4}{used?}
+% \macroarg{5}{label}
+% \macroarg{6}{year}
+% \macroarg{7}{backrefs}
+% \macroarg{8}{\embrace{\emph{newlabel}}\embrace{\emph{newyear}}}
+% \begin{macrocode}
+\def\bibcite@b#1#2#3#4#5#6#7#8{\gdef#1{\citesel#3#4#8{#7}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\citedest}
+% The \cs{citedest} command goes into the \fn{.aux} file to provide
+% back-reference support.
+% \begin{macrocode}
+\newcommand{\citedest}[1]{\@xp\cite@dest\csname b@#1\endcsname}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cite@dest}
+% \begin{macrocode}
+\def\cite@dest#1{%
+ \ifx\relax#1%
+ \gdef#1{\citesel 00{}{}{}}%
+ \fi
+ \@xp\cite@dest@b\@xp#1#1%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cite@dest@b}
+% \MacroArgs
+% \macroarg{1}{\cs{b@}citekey}
+% \macroarg{2}{\cs{citesel}}
+% \macroarg{3}{cited?}
+% \macroarg{4}{used?}
+% \macroarg{5}{label}
+% \macroarg{6}{year}
+% \macroarg{7}{backrefs}
+% \macroarg{8}{\embrace{\emph{more backrefs}}}
+% \begin{macrocode}
+\def\cite@dest@b#1#2#3#4#5#6#7#8{%
+ \@ifempty{#7}{%
+ \def#1{\citesel #3#4{#5}{#6}{{#8}}}%
+ }{%
+ \gdef#1{\citesel #3#4{#5}{#6}{#7,{#8}}}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Back references}
+%
+% \begin{macro}{\ifBR@verbose}
+% \begin{macrocode}
+\@ifundefined{ifBR@verbose}{\let\ifBR@verbose\iffalse \let\fi\fi}{}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\BackCite}
+% \begin{macrocode}
+\let\BackCite\@gobble
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\back@cite}
+% \begin{macrocode}
+\def\back@cite#1{%
+ \ifBR@verbose
+ \PackageInfo{backref}{back cite \string `\extr@cite#1'}%
+ \fi
+ \Hy@backout{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\print@backrefs}
+% In an AMS-style bibliography, the backref info might follow the
+% final period of the reference, or it might follow some
+% \emph{Mathematical Reviews} info, without a period.
+% \begin{macrocode}
+\def\print@backrefs#1{%
+ \space\SentenceSpace$\uparrow$\csname br@#1\endcsname
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintBackRefs}
+% \begin{macrocode}
+\let\PrintBackRefs\@gobble
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\pkg{hyperref}, \pkg{showkeys} and \pkg{shaderef}
+% support}
+%
+% \begin{macro}{\shade@cite}
+% \begin{macrocode}
+\newcommand{\shade@cite}{\printref}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\format@cite}
+% \begin{macrocode}
+\def\format@cite#1{\shade@cite{\citeform{#1}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ar@hyperlink}
+% \begin{macrocode}
+\def\ar@hyperlink#1{%
+ \hyper@@link[cite]{}{cite.\extr@cite#1}{\format@cite{#1}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ar@SK@cite}
+% \begin{macrocode}
+\def\ar@SK@cite#1{\@bsphack\@xp\SK@\@xp\SK@@ref\@xp{\extr@cite#1}\@esphack}
+% \end{macrocode}
+% \end{macro}
+%
+% Turn off \pkg{hyperref} and \pkg{showkeys} support if those
+% packages don't appear to be loaded.
+% \begin{macrocode}
+\AtBeginDocument{%
+ \@ifpackageloaded{shaderef}{}{%
+ \let\shade@cite\@firstofone
+ }%
+ \@ifpackageloaded{hyperref}{}{%
+ \def\ar@hyperlink{\format@cite}%
+ \let\hyper@anchorstart\@gobble
+ \let\hyper@anchorend\relax
+ \let\Hy@raisedlink\@firstofone
+ }%
+ \@ifpackageloaded{showkeys}{%
+ \@ifpackagewith{showkeys}{notcite}{%
+ \let\ar@SK@cite\@gobble
+ }{}
+ }{%
+ \let\ar@SK@cite\@gobble
+ \let\SK@@label\@gobble
+ \let\SK@\@gobbletwo
+ }%
+}
+% \end{macrocode}
+%
+% \subsection{Lexical structure of names}
+%
+% Before we can begin parsing names, we need to give some thought
+% to the lexical structure of names. For the remainder of this
+% document, when we refer to a ``name'' and especially when we
+% speak of a name as a macro argument, we assume that the only
+% tokens contained in the name are
+% \begin{itemize}
+%
+% \item
+% letters and punctuation (i.e., characters with catcode 11 or~12),
+%
+% \item
+% ties (the token |~|$_{13}$),
+%
+% \item
+% accent commands, such as |\"| or |\k|,
+%
+% \item
+% text symbol macros, such as |\i|, |\ae| or |\cprime|,
+%
+% \item
+% grouping characters (braces).
+%
+% \end{itemize}
+%
+% In addition to their normal function of delimiting macro
+% arguments, braces inside names have the following special
+% functions:
+% \begin{enumerate}
+%
+% \item They are used to indicate that multiple characters should
+% be considered a single ``compound'' character when extracting
+% initials. For example, |Yuri| becomes |Y.|, but |{Yu}ri| becomes
+% |Yu.|
+%
+% \label{initial-braces}
+% An important aspect of this use of braces is that it only applies
+% to the first characters of a given name. As we'll see below,
+% this has important implications for our parsing code, which must
+% preserve braces at the beginning of given names, but can be more
+% cavalier with braces in other positions.
+%
+% \item
+% Spaces and commas are ordinarily interpreted as name separators,
+% rather than name components. Similarly, periods and hyphens
+% usually have a special interpretation. All these characters can
+% be stripped of their special meanings by putting them within
+% braces.
+%
+% \end{enumerate}
+%
+% In practice, it might be possible to insert other tokens (such as
+% macros) into names as long as they either (a)~are non-expandable
+% or (b)~expand into a series of tokens of the above enumerated
+% types. However, in such cases it will probably be safer to
+% declare the macro in question as either a text accent or a text
+% symbol.
+%
+% \subsubsection{Text accents}
+%
+% Syntactically, a text accent is a macro that takes a single,
+% undelimited argument, i.e, it has a ``prototype'' of
+% |macro:#1->|. Semantically, the implication is that it takes a
+% letter (the \emph{base}) as an argument and produces a glyph that
+% for certain purposes can be considered equivalent to the
+% base (see the discussion of stem comparison on
+% page~\pageref{stem-comparison}).\footnote{Note that this is meant
+% to be a pragmatic definition for the purposes of this package.
+% No claim is made to greater generality.}
+%
+% \begin{macro}{\amsrefs@textaccents}
+% This will contain a list of accent commands in standard \LaTeX\
+% format (i.e., separated by the token \cs{do}). For example,
+% after registering the \cn{"} and \cn{'} accents, it will contain
+% \begin{verbatim}
+% \do \"\do \'
+%\end{verbatim}
+% \begin{macrocode}
+\let\amsrefs@textaccents\@empty
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\DeclareNameAccent}
+% \MacroArgs
+% \macroarg{1}{accent}
+% \begin{macrocode}
+\def\DeclareNameAccent{%
+ \@lappend\amsrefs@textaccents
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Here are all the standard \LaTeX\ accents, as well as a few
+% nonstandard accents from the \pkg{mathscinet} package.
+% \begin{macrocode}
+\DeclareNameAccent\"
+\DeclareNameAccent\'
+\DeclareNameAccent\.
+\DeclareNameAccent\=
+\DeclareNameAccent\^
+\DeclareNameAccent\`
+\DeclareNameAccent\~%
+\DeclareNameAccent\b
+\DeclareNameAccent\c
+\DeclareNameAccent\d
+\DeclareNameAccent\H
+\DeclareNameAccent\k
+\DeclareNameAccent\r
+\DeclareNameAccent\t
+\DeclareNameAccent\u
+\DeclareNameAccent\v
+% \end{macrocode}
+% From \pkg{mathscinet}:
+% \begin{macrocode}
+\DeclareNameAccent\utilde
+\DeclareNameAccent\uarc
+\DeclareNameAccent\dudot
+\DeclareNameAccent\lfhook
+\DeclareNameAccent\udot
+\DeclareNameAccent\polhk
+\DeclareNameAccent\soft
+% \end{macrocode}
+% \cn{etalchar} and \cn{etaltext} are sort of accent-like if you
+% look at them in the right light.
+% \begin{macrocode}
+\DeclareNameAccent\etalchar
+%\DeclareNameAccent\etaltext
+% \end{macrocode}
+%
+% \subsubsection{Text symbols}
+%
+% Syntactically, a text symbol is a macro with a empty parameter
+% text, i.e., a prototype of |macro:->|. Semantically, it's a
+% letter-like glyph that should not be considered equivalent
+% to any other glyph or group of glyphs. In addition, it may exist
+% in both upper- and lowercase variants, unlike text accents, where
+% we consider the case to be an attribute of the base letter, not
+% of the accent.\footnote{As with text accents, this is not
+% intended as a fully general definition.}
+%
+% \begin{macro}{\amsrefs@textsymbols}
+% This is analogous to \cs{amsrefs@textaccents} but a little more
+% complicated due to the need to store lowercase equivalents. It
+% consists of a list of double entries of the form
+% \begin{verbatim}
+% \do \symbol \do \lcsymbol
+%\end{verbatim}
+% which means that \cs{symbol} is a text symbol whose corresponding
+% lowercase version is \cs{lcsymbol}. (Note that nothing is
+% implied about whether \cs{symbol} is to be considered as
+% uppercase or lowercase.) For example, in
+% \begin{verbatim}
+% \do \ae \do \ae \do \OE \do \oe
+%\end{verbatim}
+% the first four tokens indicate that \cn{ae} is a text symbol with
+% lowercase equivalent \cn{ae}, while the last four tokens indicate
+% that \cn{OE} is a text symbol with lowercase equivalent \cn{oe}.
+% This scheme is somewhat redundant, but pleasingly simple.
+%
+% This also duplicates some of the information in \cs{@uclclist},
+% but it seems safer to do this than to modify \cs{@uclclist}.
+% \begin{macrocode}
+\let\amsrefs@textsymbols\@empty
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\DeclareNameSymbol}
+% \MacroArgs
+% \macroarg{1}{symbol}
+% \macroarg{2}{lowercase}
+% \begin{macrocode}
+\def\DeclareNameSymbol#1#2{%
+ \@lappend\amsrefs@textsymbols#1%
+ \@lappend\amsrefs@textsymbols#2%
+ \ifx#1#2\else
+ \@lappend\amsrefs@textsymbols#2%
+ \@lappend\amsrefs@textsymbols#2%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Here are the standard \LaTeX\ and \pkg{mathscinet} text
+% symbols.
+%
+% \label{anomalies}
+% Note that \cn{i} and \cn{j} are anomalous in being syntactically
+% like text symbols, but semantically more like text accents.
+% \begin{macrocode}
+\DeclareNameSymbol\i\i
+\DeclareNameSymbol\j\j
+\DeclareNameSymbol\AE\ae
+\DeclareNameSymbol\OE\oe
+\DeclareNameSymbol\O\o
+\DeclareNameSymbol\DH\dh
+\DeclareNameSymbol\DJ\dj
+\DeclareNameSymbol\L\l
+\DeclareNameSymbol\NG\ng
+\DeclareNameSymbol\SS\ss
+\DeclareNameSymbol\TH\th
+% \end{macrocode}
+% From \pkg{mathscinet}:
+% \begin{macrocode}
+\DeclareNameSymbol\Dbar\dbar
+\DeclareNameSymbol\lasp\lasp
+\DeclareNameSymbol\rasp\rasp
+\DeclareNameSymbol\cprime\cprime
+\DeclareNameSymbol\cdprime\cdprime
+\DeclareNameSymbol\bud\bud
+\DeclareNameSymbol\cydot\cydot
+% \end{macrocode}
+% |~| can be considered a text symbol in much the same way that
+% \cn{etalchar} can be considered an accent.
+% \begin{macrocode}
+\DeclareNameSymbol~~%
+% \end{macrocode}
+%
+% \subsubsection{\cs{edef}-like macros for names}
+% The following macros all behave sort of like \cs{edef}, in the
+% sense that
+% \begin{verbatim}
+% \X@edef\foo{name}
+%\end{verbatim}
+% defines \cs{foo} to be the result of expanding |name| and
+% applying a certain transformation to it.
+%
+% \begin{macro}{\normalize@edef}
+% This converts accents in the name to a normalized form where the
+% accent and its argument are surrounded by braces. E.g., after
+% \begin{verbatim}
+% \normalize@edef\cs{P\'olya}
+%\end{verbatim}
+% \cs{cs} will contain |P{\'o}lya|. (This might result in a
+% redundant layer of braces if the original text contained, say,
+% ``\verb+P{\'o}lya+'', but that's ok.) This lets us extract the
+% first $n$ characters from a name by using \TeX's macro
+% argument-gobbling mechanism without worrying that an accent
+% will be separated from its base letter.
+% As a bonus, it also replaces ties (|~|) by spaces.
+% \begin{macrocode}
+\def\normalize@edef#1#2{%
+ \begingroup
+ \@apply\auto@protect\amsrefs@textsymbols
+ \@apply\wrap@accent\amsrefs@textaccents
+% \end{macrocode}
+% Redefine \cs{@tabacckludge} in case someone wants to use this
+% with the \pkg{inputenc} package.
+% \begin{macrocode}
+ \let\@tabacckludge\use@accent
+ \let~\space
+ \edef\@tempa{\def\@nx#1{#2}}%
+ \@xp\endgroup
+ \@tempa
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\use@accent}
+% This is identical to \cs{@nameuse} except for the addition of the
+% \cs{string}, which, as per \fn{ltoutenc.dtx}, guards against the
+% eventuality that something like |'| might be active at the point
+% of use. We don't expect to find a \cs{bib} in the middle of a
+% \env{tabbing} environment (do we?)\ so we
+% \begin{macrocode}
+\def\use@accent#1{\csname\string#1\endcsname}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\wrap@accent}
+% Here's a wrapper macro that causes an accent to become
+% auto-wrapping. E.g., after \verb+\wrap@accent\'+, \verb+\'o+
+% will expand to \verb+{\'o}+.
+% \begin{macrocode}
+\def\wrap@accent#1{%
+ \def#1##1{{\@nx#1##1}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lc@edef}
+% This converts all the characters in a name to all lowercase,
+% using the mapping defined by \cs{amsrefs@textsymbols}. So, after
+% \begin{verbatim}
+% \lc@edef\cs{P\'olya}
+%\end{verbatim}
+% \cs{cs} will contain |p\'olya|. Note that accents are not
+% wrapped and ties are passed through unmolested.
+% \begin{macrocode}
+\def\lc@edef#1#2{%
+ \begingroup
+ \let\@tabacckludge\use@accent %%??
+ \@apply\auto@protect\amsrefs@textaccents
+ \@apply\lc@do\amsrefs@textsymbols
+ \edef\@tempa{\lowercase{\def\@nx#1{#2}}}%
+ \@xp\endgroup
+ \@tempa
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lc@do}
+% This is a slighly more complicated wrapper macro than previous
+% ones.
+% The first argument is a text symbol; the second argument is the
+% lowercase variant of the symbol. If they're the same (i.e., the
+% first argument is a lowercase text symbol), we \cs{auto@protect}
+% it. Otherwise we define the first symbol to expand to the
+% second.
+% \begin{macrocode}
+\def\lc@do#1\do#2{%
+ \ifx#1#2%
+ \auto@protect#1%
+ \else
+ \def#1{#2}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\purge@edef}
+% Removes accents and braces from a name and converts ties to
+% spaces, leaving only letters, punctuation and text symbols. For
+% example,
+% \begin{verbatim}
+% \lc@edef\cs{P{\'o}lya}
+%\end{verbatim}
+% will put |Polya| in~\cs{cs}.
+% \begin{macrocode}
+\def\purge@edef#1#2{%
+ \begingroup
+ \@apply\auto@protect\amsrefs@textsymbols
+ \let~\space
+ \@apply\purge@accent\amsrefs@textaccents
+ \let\@tabacckludge\@gobble
+% \end{macrocode}
+% As mentioned above (page~\pageref{anomalies}), \cn{i} and \cn{j}
+% are semantically like text accents; hence, they require special
+% treatment here.
+% \begin{macrocode}
+ \def\i{i}%
+ \def\j{j}%
+ \edef\@tempa{#2}%
+ \toks@\@emptytoks
+ \@xp\purge@edef@ \@tempa \@nil
+ \edef\@tempa{\def\@nx#1{\the\toks@}}%
+ \@xp\endgroup
+ \@tempa
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\purge@edef@}
+% Peek ahead so \cs{purge@edef@a} will know whether its argument
+% was originally surrounded by braces.
+% \begin{macrocode}
+\def\purge@edef@{%
+ \futurelet\@let@token
+ \purge@edef@a
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\purge@edef@a}
+% Process a single ``chunk'' (i.e., one macro-argument's worth) of
+% the name.
+% \begin{macrocode}
+\def\purge@edef@a#1{%
+% \end{macrocode}
+% If we've run into the \cs{@nil} terminator, we're done.
+% \begin{macrocode}
+ \ifx\@let@token\@nil
+ \let\@tempa\@empty
+ \else
+% \end{macrocode}
+% Otherwise, if the argument was originally surrounded by braces,
+% process it recursively before processing the remainder of the
+% token stream.
+% \begin{macrocode}
+ \ifx\@let@token\bgroup
+ \def\@tempa{%
+ \purge@edef@ #1\@nil
+ \purge@edef@
+ }%
+ \else
+% \end{macrocode}
+% If the argument is a single unbracketed token, just copy it into
+% the output.
+% \begin{macrocode}
+ \add@toks@{#1}%
+ \let\@tempa\purge@edef@
+ \fi
+ \fi
+ \@tempa
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\purge@accent}
+% This is similar to \cs{wrap@accent} but it removes the accent
+% command (and possibly a layer of braces surrounding the accent's
+% argument).
+% \begin{macrocode}
+\def\purge@accent#1{%
+ \def#1##1{##1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Name parsing}
+%
+% Parsing names is somewhat complicated because parts of the name
+% can (in principle) be empty (G=given, S=surname, J=jr)):
+% \begin{quote}
+% \nametest{Doe, John, Jr.}
+% \nametest{Doe, John}
+% \nametest{Doe, , Jr.}
+% \nametest{Doe}
+% \nametest{, John, Jr.}
+% \nametest{, John}
+% \nametest{, , Jr.}
+% \nametest{}
+% \end{quote}
+% Not all of these forms are legal, of course, but that's no excuse
+% for not parsing them correctly.
+%
+% We also want to be somewhat lenient about the placement of
+% spaces:
+% \begin{quote}
+% \nametest{ Doe,John,Jr.}
+% \end{quote}
+%
+% However, because one must have some standards, we assume there
+% are no spaces in the following positions in the input:
+% \begin{enumerate}
+% \item before periods,
+%
+% \item before commas,
+%
+% \item at the end of the name,
+%
+% \item before or after hyphens.
+% \end{enumerate}
+%
+% Thus, we make no attempt to compensate for the misplaced spaces
+% in examples like these:
+% \begin{quote}
+% \nametest{Doe , J ., Jr. }
+% \nametest{Doe, J. - M.}
+% \end{quote}
+%
+% Also, unless we are generating initials, we don't try to
+% normalize spaces \emph{after} periods:
+% \begin{quote}
+% \nametest{Doe, J.M.}\\ (not G=\embrace{J. M.})
+% \end{quote}
+%
+% Finally, since we allow authors to group together characters that
+% should be treated as a single unit, we need to be careful to
+% preserve the author's markup in cases like these:
+%
+% \begin{quote}
+% \nametest{Doe, {Yu}ri}
+% \nametest{Doe, {Yu}}
+% \end{quote}
+%
+% This is harder than it seems. For example, consider a naive
+% implementation that uses delimited arguments to pull the name
+% apart:
+% \begin{verbatim}
+% \def\parsename#1,#2\@nil{%
+% \def\bib'surname{#1}%
+% \def\bib'given{#2}%
+% }
+%
+% \parsename Doe, {Yu}ri\@nil
+%\end{verbatim}
+% Unfortunately, this results in the space after the comma
+% becoming part of \cs{bib'given}: ``\verb+ {Yu}ri+''.
+%
+% Our next thought would be to modify the definition slightly to
+% trick \TeX\ into gobbling the space:
+% \begin{verbatim}
+% \def\parsename#1,#2#3\@nil{%
+% \def\bib'surname{#1}%
+% \def\bib'given{#2#3}%
+% }
+%\end{verbatim}
+% Now the space is gone, but---surprise!---so are the braces:
+% ``\verb+Yuri+''. In addition, this approach makes it difficult
+% to handle empty name parts correctly.
+%
+% To sidestep these problems, instead of blindly gobbling macro
+% arguments, we use \cs{futurelet} to look ahead at certain
+% strategic moments so we can take the appropriate action (see
+% \cs{get@namepart@d}--|f|). We only really care about preserving
+% braces at the start of names (page~\pageref{initial-braces}),
+% which simplifies things somewhat.\label{brace-preservation}
+%
+% \begin{macro}{\name@split}
+% \cs{name@split} parses a name into its three parts and stores
+% them in \cs{bib'surname}, \cs{bib'given} and \cs{bib'jr}. If the
+% \opt{initials} option is in force, it also extracts the initials
+% from the given name and stores them in \cs{bib'initials}.
+%
+% It expects the name to be parsed to be terminated by \cs{@nil}
+% and to contain at least three commas. Thus the usual way to
+% invoke it is
+% \begin{quote}
+% \cs{name@split} $\langle\mathit{name}\rangle$\verb+,,,\@nil+
+% \end{quote}
+%
+% \cs{name@split} just uses \cs{get@namepart} to peal off the
+% surname and then passes control to \cs{name@split@given}.
+% (Note the spiffy continuation-passing programming style.)
+% \begin{macrocode}
+\def\name@split{%
+ \get@namepart\bib'surname\name@split@given
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\name@split@given}
+% Pretty much the same, \em{mutatis mutandis}\ldots
+% \begin{macrocode}
+\def\name@split@given{%
+ \get@namepart\bib'given\name@split@jr
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\name@split@jr}
+% And again\ldots
+% \begin{macrocode}
+\def\name@split@jr{%
+ \get@namepart\bib'jr\name@split@finish
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\name@split@finish}
+% We have all three parts now. Do some consistency checking,
+% extract the initials from the given name, and then call
+% \cs{@nilgobble} to remove anything (such as extra commas) left on
+% the stack.
+% \begin{macrocode}
+\def\name@split@finish{%
+ \ifx\bib'surname\@empty \EmptyNameWarning \fi
+% \end{macrocode}
+% Theoretically, we could try to check for uninverted names here,
+% but only at the risk of producing spurious warnings when the name
+% really does only have one part (\verb+author={Arvind}+).
+%
+% A possible solution: Now that we have the
+% \attr{inverted} attribute, we could issue a warning if the given
+% name is empty and the family name contains a space. I'm sure
+% someone could find valid input that would still generate a
+% spurious warning, but this would take care of the most common
+% cases. This bears more thinking about.
+% \begin{macrocode}
+%% \ifx\@empty\bib'given
+%% \NameCheck \bib'surname ??\@nil
+%% \else
+ \extract@initials\bib'given
+%% \fi
+ \@nilgobble
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\get@namepart}
+% Now for the fun part. \cs{get@namepart} takes two arguments.
+% The first (the destination) should be a control sequence; the
+% second (the continuation) will normally also be a control
+% sequence, though technically we only require that it be a single
+% token. \cs{get@namepart} scans everything up to the next level-0
+% comma, places it in the destination, and then calls the
+% continuation.
+% \begin{macrocode}
+\def\get@namepart#1#2{%
+% \end{macrocode}
+% Save the destination in \cs{toks@} and the continuation in
+% \cs{@temptokena}. It's unfortunate that this trashes the
+% previous contents of those token lists (as well as the contents
+% of \cs{@tempa} later on), but preliminary attempts to rewrite the
+% code to leave the calling environment unchanged were not
+% encouraging.
+% \begin{macrocode}
+ \toks@{#1}%
+ \@temptokena{#2}%
+ \get@namepart@a
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\get@namepart@a}
+% Now peek ahead at the next token in the stream and call
+% \cs{get@namepart@b} to examine it.
+% \begin{macrocode}
+\def\get@namepart@a{%
+ \futurelet\@let@token
+ \get@namepart@b
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\get@namepart@b}
+% If the next token is a space token, we want to delete it.
+% Otherwise we're ready to read the name.
+% \begin{macrocode}
+\def\get@namepart@b{%
+ \ifx\@let@token\@sptoken
+ \@xp\get@namepart@c
+ \else
+ \@xp\get@namepart@d
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\get@namepart@c}
+% The next token is a space; we delete it and restart
+% \cs{get@namepart@a}, in case there are multiple spaces.
+% \begin{macrocode}
+\def\get@namepart@c{%
+ \after@deleting@token\get@namepart@a
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\get@namepart@d}
+% We're at the beginning of the name part. However, there are
+% still two special cases we have to watch out for. First, the
+% next token might be a comma, meaning that this name part is
+% empty. Second, the next token might be an open brace (\verb+{+),
+% which we have to be sure to copy into the destination. So, we
+% peek ahead again before proceeding.
+% \begin{macrocode}
+\def\get@namepart@d{%
+ \futurelet\@let@token
+ \get@namepart@e
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\get@namepart@e}
+% If the next token is a comma, it means the name part is empty;
+% so, we set the destination to an empty list and then arrange to
+% execute the continuation after deleting the comma. Otherwise we
+% call \cs{get@namepart@f} to read a non-empty name, leaving
+% \cs{@let@token} undisturbed so that \cs{get@namepart@f} knows
+% what's coming up.
+% \begin{macrocode}
+\def\get@namepart@e{%
+ \ifx\@let@token,%
+ \@xp\let\the\toks@\@empty
+ \edef\@tempa{%
+ \@nx\after@deleting@token\the\@temptokena
+ }%
+ \@xp\@tempa
+ \else
+ \@xp\get@namepart@f
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\get@namepart@f}
+% We know whether or not the name begins with a brace, but we don't
+% know if the corresponding group contains the entire name or only
+% part of it. By reading the name as two arguments, we can handle
+% all cases correctly.\footnote{More or less. If the second
+% argument is brace-delimited, the braces will be lost. But as
+% mentioned above (page~\pageref{brace-preservation}), we don't
+% really care.}
+%
+% Note that the arguments are not expanded.
+% \begin{macrocode}
+\def\get@namepart@f#1#2,{%
+ \ifx\@let@token\bgroup
+ \@xp\def\the\toks@{{#1}#2}%
+ \else
+ \@xp\def\the\toks@{#1#2}%
+ \fi
+ \the\@temptokena
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\EmptyNameWarning}
+% Or translator or contributor or\ldots
+% \begin{macrocode}
+\def\EmptyNameWarning{\amsrefs@warning{Empty contributor name}}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Extracting initials}
+%
+% Extracting initials from the author's given name is tricky
+% because of the numerous special cases that need to be
+% handled. Consider the following examples, some of which are
+% admittedly contrived:
+% \begin{quote}
+% \initialtest{Arvind}
+% \initialtest{Bing, R H}
+% \initialtest{Harish, \'Etienne}
+% \initialtest{Harish, \'E.}
+% \initialtest{Harish, \'{E}.}
+% \initialtest{Harish, {\'E}.}
+% \initialtest{Harish, \'E}
+% \initialtest{Harish, \'Etienne-P\^{\i}erre}
+% \initialtest{Jones, David}
+% \initialtest{Jones, David-Michael}
+% \initialtest{Katzenbach, Nicholas {deB}elleville}
+% \initialtest{Katzenbach, Nicholas deB.}
+% \initialtest{Matiyasevich, {Yu}ri}
+% \initialtest{Matiyasevich, {Yu}}
+% \initialtest{Matiyasevich, Yu.}
+% \end{quote}
+% When processing initials, we loosen our strictures on spaces
+% inside the given name by not requiring spaces after periods and
+% tolerating them around hyphens and after the name:
+% \begin{quote}
+% \initialtest{Jones, D.M.}
+% \initialtest{Jones, David - Michael}
+% \initialtest{Jones, David , Jr.}
+% \end{quote}
+% (Strictly speaking, only the support for the first of these
+% examples was a deliberate design decision; the other two are
+% side-effects of the implementation. In any case, toleration of
+% these quirks is in no way an endorsement of them, especially
+% since they may make it more difficult for third-party software to
+% correctly process bibliography entries.)
+%
+%^^A We also make one additional assumption: a hyphen does not occur
+%^^A as the last character in the name.
+%
+% \subsubsection{The algorithm}
+%
+% As a running example, consider the following contrived input:
+% \begin{quote}
+% {\tt \verb+\'E.-P\^{\i}erre J.K. M+}
+% \end{quote}
+% which we want to turn into {\makeatletter``{\'E}.~\ini@hyphen
+% P.~J.~K.~M''}.
+%
+% We precede by stages.
+% \begin{enumerate}
+%
+% \item
+% Normalize the name by surrounding accents and their arguments by
+% braces:
+% \begin{quote}
+% \verb+{\'E}.-P{\^\i }erre J.K. M+
+% \end{quote}
+% We also replace \verb+~+s by spaces at this stage.
+%
+% \item
+% Replace each hyphen (\verb+-+) by ``\verb*+ \ini@hyphen +'':
+% \begin{quote}
+% \verb+{\'E}. \ini@hyphen P{\^\i }erre J.K. M+
+% \end{quote}
+%
+% \item
+% Add a space after each period:
+% \begin{quote}
+% \verb+{\'E}. \ini@hyphen P{\^\i }erre J. K. M+
+% \end{quote}
+%
+% \item
+% Now we have the name as a list of space-separated components.
+% (In our example, the components are ``\verb+{\'E}.+'',
+% ``\verb+\ini@hyphen+'', ``\verb+P{\^\i }erre+'', ``\verb+J.+'',
+% ``\verb+K.+'', and ``\verb+M+''.) We loop through the compoments
+% and replace each one by its ``initialized'' form. There are
+% four cases:\label{initial_cases}
+% \begin{enumerate}
+%
+% \item
+% The component ends in a period. Copy it and add the token
+% \verb+~+. (In our example, these are the
+% components ``\verb+{\'E}.+'', ``\verb+J.+'' and ``\verb+K.+''.)
+%
+% \item
+% The component consists of a single (possibly compound) character
+% without a period. Again, copy it and add
+% \verb+~+. (In our example, this is the component
+% ``\verb+M+''.)
+%
+% \item
+% The component is the token \verb+\ini@hyphen+. Copy it.
+%
+% \item
+% The component consts of two or more (possibly compound)
+% characters without a period (e.g., ``\verb+P{\^\i }erre+'').
+% Copy the first character and add the tokens \verb+.~+.
+% \end{enumerate}
+%
+% \item
+% The token list generated above will end with an unwanted |~|.
+% Delete it.
+%
+% \end{enumerate}
+%
+% The end result is
+% \begin{verbatim}
+% {\'E}.~\ini@hyphen P.~J.~K.~M
+%\end{verbatim}
+% which, when typeset, does indeed produce
+% {\makeatletter''{\'E}.~\ini@hyphen P.~J.~K.~M''}.\footnote{Tying
+% all the characters together is potentially undesirable when, as
+% in the example, there are a large number of pieces in the given
+% name.}
+%
+% \subsubsection{The implementation}
+%
+% \begin{macro}{\extract@initials}
+% This is pretty straightforward.
+% \begin{macrocode}
+\def\extract@initials#1{%
+ \begingroup
+ \auto@protect\ini@hyphen
+ \auto@protect\nobreakspace
+ \let~\relax
+ \@apply\auto@protect\amsrefs@textsymbols
+ \@apply\auto@protect\amsrefs@textaccents
+ \normalize@edef\@tempa{#1}%
+ \ifx\@tempa\@empty
+ \else
+% \end{macrocode}
+% It would be nice if \cs{process@hyphens} and \cs{process@dots}
+% commuted, and they almost do. However, suppose you have the
+% (admittedly contrived) name |Yu.-{Yu}|, which should be turned
+% into ``Yu.-Yu''. If \cs{process@dots} is applied first, the
+% braces around the second ``Yu'' get removed, so the output is
+% ``Yu.-Y.''. (Even worse would be |P.-\'E|, which would produce
+% ``P.-\'.'')
+% \begin{macrocode}
+ \process@hyphens\@tempa
+ \process@dots\@tempa
+ \process@names\@tempa
+ \@chomp\@tempa{~}%
+ \fi
+ \edef\@tempa{\def\@nx\bib'initials{\@tempa}}%
+ \@xp\endgroup
+ \@tempa
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ini@hyphen}
+% The \cs{unskip} removes the space at the end of a potential (and
+% probable) preceding |~|, but leaves the \cs{nobreak} penalty.
+% \begin{macrocode}
+\def\ini@hyphen{\unskip-\nobreak}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\process@hyphens}
+% This follows the same general pattern as \cs{get@namepart}, but
+% with an extra layer of grouping to avoid unwanted side-effects.
+% Otherwise, it uses the same parsing techniques.
+%
+% One difference is that there is no explicit continuation:
+% instead, we iterate by repeatedly calling
+% \cs{process@one@hyphen@d} until we run into the \cs{@nil}
+% marker.
+% \begin{macrocode}
+\def\process@hyphens#1{%
+ \begingroup
+ \toks@\@emptytoks
+ \@xp\process@one@hyphen #1-\@nil
+ \edef\@tempa{\the\toks@}%
+% \end{macrocode}
+% Because of the |-| we have to stick in as a delimiter above,
+% \cs{process@one@hyphen} will always generate unwanted code at the
+% end of the name. We now delete it. (This also has the necessary
+% side-effect of expanding the \cs{space} macros into space
+% characters.)
+% \begin{macrocode}
+ \@chomp\@tempa{ \ini@hyphen\space}%
+ \edef\@tempa{\def\@nx#1{\@tempa}}%
+ \@xp\endgroup
+ \@tempa
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\process@one@hyphen}
+% Cf.\ \cs{get@namepart@a}.
+% \begin{macrocode}
+\def\process@one@hyphen{%
+ \futurelet\@let@token
+ \process@one@hyphen@a
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\process@one@hyphen@a}
+% Cf.\ \cs{get@namepart@b} and \cs{extract@initial@a}.
+%
+% The tests for \cs{@nil} and~|-| here are purely to supply better
+% error recovery. Without them, a hyphen at the end of the given
+% name (.e.g, |author={Doe, John-}|) would produce a very
+% mysterious error message. Since it's unlikely the hyphen really
+% belongs there, we delete it, but we also issue a warning to the
+% author. (It will still show up as part of the full given name,
+% though.)
+%
+% We borrow \cs{fsa@n} from \pkg{rkeyval} to keep track of the
+% appropriate next action.
+% \begin{macrocode}
+\def\process@one@hyphen@a{%
+ \ifx\@let@token\@nil
+ \let\fsa@n\@gobble
+ \else
+ \ifx\@let@token -%
+ \TrailingHyphenWarning
+ \let\fsa@n\process@one@hyphen@b
+ \else
+ \ifx\@let@token\@sptoken
+ \let\fsa@n\process@one@hyphen@b
+ \else
+ \let\fsa@n\process@one@hyphen@c
+ \fi
+ \fi
+ \fi
+ \fsa@n
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\process@one@hyphen@b}
+% Cf.\ \cs{get@namepart@c}.
+% \begin{macrocode}
+\def\process@one@hyphen@b{%
+ \after@deleting@token\process@one@hyphen
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\process@one@hyphen@c}
+% Cf.\ \cs{get@namepart@f}.
+% \begin{macrocode}
+\def\process@one@hyphen@c#1#2-{%
+ \ifx\bgroup\@let@token
+ \add@toks@{{#1}#2 \ini@hyphen\space}%
+ \else
+ \add@toks@{#1#2 \ini@hyphen\space}%
+ \fi
+ \futurelet\@let@token
+ \process@one@hyphen@d
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\process@one@hyphen@d}
+% Here we just check for \cs{@nil} and terminate if we detect it.
+% Otherwise, we start over.
+% \begin{macrocode}
+\def\process@one@hyphen@d{%
+ \ifx\@let@token\@nil
+ \@xp\@gobble
+ \else
+ \@xp\process@one@hyphen
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TrailingHyphenWarning}
+% Or translator or contributor or\ldots
+% \begin{macrocode}
+\def\TrailingHyphenWarning{%
+ \amsrefs@warning{Trailing hyphen deleted from name}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\process@dots}
+% This is almost completely parallel to \cs{process@hyphens}.
+% \begin{macrocode}
+\def\process@dots#1{%
+ \begingroup
+ \toks@\@emptytoks
+ \@xp\process@one@dot #1.\@nil
+ \edef\@tempa{\the\toks@}%
+ \@chomp\@tempa{. }%
+% \end{macrocode}
+% Since it's legitimate for names to end in periods, we might
+% still have an unwanted space at the end of the name, so we delete
+% it too.
+% \begin{macrocode}
+ \@chomp\@tempa{ }%
+ \edef\@tempa{\def\@nx#1{\@tempa}}%
+ \@xp\endgroup
+ \@tempa
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\process@one@dot}
+% \begin{macrocode}
+\def\process@one@dot{%
+ \futurelet\@let@token
+ \process@one@dot@a
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\process@one@dot@a}
+% This is a bit different from \cs{process@one@hyphen@a} since we
+% expect names sometimes to end in a period---or even two
+% periods---not least because of the |.| we add as a delimiter when
+% invoking \cs{process@one@dot}.
+% \begin{macrocode}
+\def\process@one@dot@a{%
+ \ifx\@let@token .%
+ \def\fsa@n{\after@deleting@token\process@bare@dot}%
+ \else
+ \ifx\@let@token\@sptoken
+ \let\fsa@n\process@one@dot@b
+ \else
+ \let\fsa@n\process@one@dot@c
+ \fi
+ \fi
+ \fsa@n
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\process@bare@dot}
+% \begin{macrocode}
+\def\process@bare@dot{%
+ \add@toks@{. }%
+ \futurelet\@let@token
+ \process@one@dot@d
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\process@one@dot@b}
+% \begin{macrocode}
+\def\process@one@dot@b{%
+ \after@deleting@token\process@one@dot
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\process@one@dot@c}
+% \begin{macrocode}
+\def\process@one@dot@c#1#2.{%
+ \ifx\bgroup\@let@token
+ \add@toks@{{#1}#2. }%
+ \else
+ \add@toks@{#1#2. }%
+ \fi
+ \futurelet\@let@token
+ \process@one@dot@d
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\process@one@dot@d}
+% \begin{macrocode}
+\def\process@one@dot@d{%
+ \ifx\@let@token\@nil
+ \@xp\@gobble
+ \else
+ \@xp\process@one@dot
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\process@names}
+% This is very similar to \cs{process@hyphens} and
+% \cs{process@dots}, but with a couple of twists, as noted below.
+% \begin{macrocode}
+\def\process@names#1{%
+ \begingroup
+ \toks@\@emptytoks
+ \@xp\extract@initial #1 \@nil
+ \edef\@tempa{\def\@nx#1{\the\toks@}}%
+ \@xp\endgroup
+ \@tempa
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\extract@initial}
+% Scan through the token stream replacing words by their initials
+% until we hit the terminating~|'|$_{11}$
+% \begin{macrocode}
+\def\extract@initial{%
+ \futurelet\@let@token
+ \extract@initial@a
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\extract@initial@a}
+% As with \cs{process@one@hyphen@a}, the test for |'|$_{11}$ here
+% is purely to provide better recovery, this time in case the given
+% name has a trailing space (.e.g, |author={Doe, John }|).
+% But since we're just deleting whitespace, we don't bother issuing
+% a warning.
+% \begin{macrocode}
+\def\extract@initial@a{%
+ \ifx\@let@token\@nil
+ \let\fsa@n\@gobble
+ \else
+ \ifx\@let@token\@sptoken
+ \let\fsa@n\extract@initial@b
+ \else
+ \let\fsa@n\extract@initial@c
+ \fi
+ \fi
+ \fsa@n
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\extract@initial@b}
+% \begin{macrocode}
+\def\extract@initial@b{%
+ \after@deleting@token\extract@initial
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\extract@initial@c}
+% Here, instead of just copying the name, we extract its initials
+% and copy those.
+% \begin{macrocode}
+\def\extract@initial@c#1#2 {%
+ \ifx\@let@token\bgroup
+% \end{macrocode}
+% Note that we double-brace the first argument to avoid having to
+% test \cs{@let@token} again inside \cs{@extract@initial}.
+% \begin{macrocode}
+ \@extract@initial {{#1}}#2\@nil
+ \else
+ \@extract@initial #1#2\@nil
+ \fi
+ \futurelet\@let@token
+ \extract@initial@d
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\extract@initial@d}
+% \begin{macrocode}
+\def\extract@initial@d{%
+ \ifx\@let@token\@nil
+ \@xp\@gobble
+ \else
+ \@xp\extract@initial
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@extract@initial}
+% This handles the four cases mentioned on
+% page~\pageref{initial_cases}.
+% \begin{macrocode}
+\def\@extract@initial#1#2\@nil{%
+ \ifx\ini@hyphen#1%
+ \add@toks@{\ini@hyphen}%
+ \else
+ \in@{.\@nil}{#1#2\@nil}% Look for a period at the end of the name
+ \ifin@
+ \add@toks@{#1#2~}%
+ \else
+ \count@chars\@tempcnta{#1#2}%
+ \ifnum\@tempcnta > \@ne
+ \add@toks@{#1.~}%
+ \else
+ \add@toks@{#1~}%
+ \fi
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\count@chars}
+% This sets its first argument (which is assumed to be a count
+% register) to the number of characters in the second argument.
+% Compound characters are counted as a single character.
+% \begin{macrocode}
+\def\count@chars#1#2{%
+ \begingroup
+ \@tempcnta\z@
+ \@count@chars#2\@nil
+ \edef\@tempb{#1=\the\@tempcnta\relax}%
+ \@xp\endgroup
+ \@tempb
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@count@chars}
+% \begin{macrocode}
+\def\@count@chars#1{%
+ \ifx #1\@nil
+ \else
+ \advance\@tempcnta\@ne
+ \@xp\@count@chars
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Generating alphabetic labels}
+%
+% \subsubsection{The algorithm}
+%
+% Like Gaul, an alphabetic label is divided into three parts.
+% \begin{enumerate}
+%
+% \item The author part. In the simplest case, this is formed by
+% extracting the first character of each word of each last name of
+% each author. Thus, if there were two authors with last names
+% ``Vaughan Williams'' and ``Tallis'', the author part would be
+% ``VWT''.
+%
+% If there are more than four authors, only the first three names
+% are used, and a superscript~``+'' is appended to represent the
+% elided names. Similarly, if an author name is ``others'',
+% it is replaced by a superscript~``+'' and any following author
+% names (of which there shouldn't be any) are ignored.
+%
+% Finally, if there is only one author and the author's last name
+% consists of a single word, the first three characters of that
+% name are used.
+%
+% \item The year part. If the \opt{y2k} option is in force, or if
+% the year is less than~1901, the entire year is used. Otherwise
+% the last two digits of the year are used.\footnote{Years with
+% more than 4 digits are not currently handled correctly.
+% \emph{Caveat lector}.}
+%
+% The combination of author part and year part will be referred to
+% as the \emph{stem}.
+%
+% \item[3.] The suffix. If two or more items have the same stems,
+% a suffix consisting of a lowercase latin letter will be appended
+% to each label to make it unique.
+%
+% \end{enumerate}
+%
+% \label{stem-comparison}
+% This third part is more subtle than it might first appear.
+% First, case is ignored when comparing stems, so that, for
+% example, ``Ahl1999'' and ``AHL1999'' are considered identical.
+% Second, existing practice (in English, at least), is to ignore
+% diacritics so that, for example, ``Ahl1999'' and ``\"Ahl1999''
+% are considered identical.
+%
+% Note that when checking for duplicate stems, we assume that
+% bibliography items appear sorted by label, which means that all
+% items with the same stem will be adjacent. This means we can use
+% the naive algorithm (check to see if the current item has the
+% same stem as the previous item and, if so, append a suffix) to
+% detect clashes. This sorting will be done automatically by
+% \bst{amsxport}, but the document author is responsible for
+% ensuring the appropriate order if \bst{amsxport} is not used.
+% This is why it's an error to mix the \opt{alphabetic} and
+% \opt{citation-order} options.
+%
+% \subsubsection{The implementation}
+%
+% \begin{macrocode}
+\let\previous@stem\@empty
+\let\current@stem\@empty
+% \end{macrocode}
+%
+% \begin{macrocode}
+\let\previous@year\@empty
+\let\current@year\@empty
+% \end{macrocode}
+%
+% \begin{macro}{\amsrefs@label@prefix}
+% \begin{macrocode}
+\let\amsrefs@label@prefix\@empty
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\thebib}
+% \begin{macrocode}
+\def\thebib{\amsrefs@label@prefix\@arabic\c@bib}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\append@to@stem}
+% \begin{macrocode}
+\def\append@to@stem{\global\@concat\current@stem}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\generate@alphalabel}
+% \begin{macrocode}
+\def\generate@alphalabel{%
+% \end{macrocode}
+% If the user supplied an explicit \fld{label} field, we use it.
+% Otherwise, we generate our own.
+% \begin{macrocode}
+ \ifx\bib'label\@empty
+ \begingroup
+% \end{macrocode}
+% We begin by saving the previous stem and initializing the
+% current stem to the empty string.
+% \begin{macrocode}
+ \global\let\previous@stem\current@stem
+ \global\let\current@stem\amsrefs@label@prefix
+% \end{macrocode}
+% The list of primary contributors is available to us in
+% \cs{current@primary} in the form
+% \begin{quote}
+% \cnm{name}{$\mathrm{Last}_1, \mathrm{First}_1$}%
+% \cnm{name}{$\mathrm{Last}_2, \mathrm{First}_2$}
+% \ldots
+% \cnm{name}{$\mathrm{Last}_n, \mathrm{First}_n$}
+% \end{quote}
+% We will be executing this list multiple times with various
+% definitions of \cs{name}. So the first thing we want to do is
+% establish a safe environment and normalize the names.
+% \begin{macrocode}
+ \@apply\auto@protect\amsrefs@textsymbols
+ \@apply\auto@protect\amsrefs@textaccents
+ \auto@protect\name
+ \auto@protect\etaltext
+ \normalize@edef\@tempa\current@primary
+% \end{macrocode}
+% Now we count the number of authors in the list and invoke the
+% appropriate macro to calculate the author part of the
+% reference label.
+% \begin{macrocode}
+ \get@numberof\@tempcnta\name\@tempa
+ \calc@author@part
+% \end{macrocode}
+% Next append the year part.
+% \begin{macrocode}
+ \append@label@year
+% \end{macrocode}
+% At this point, the \cs{current@stem} is complete and we're ready
+% to determine what (if any) suffix is needed to disambiguate
+% it from the previous label.
+% \begin{macrocode}
+ \calc@alpha@suffix
+% \end{macrocode}
+% We have all the pieces now. Arrange to end the current group and
+% then define \cs{bib@label} in the enclosing group. (This keeps
+% \cs{bib@label} from being defined outside the group started by
+% \cs{bib@start}. This isn't strictly necessary, but it provides a
+% bit of compartmentalization.)
+% \begin{macrocode}
+ \edef\@tempa{%
+ \def\@nx\bib'label{%
+ \current@stem
+ \alpha@label@suffix
+ }%
+ }%
+ \@xp\endgroup
+ \@tempa
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\calc@author@part@}
+% \begin{macrocode}
+\def\calc@author@part@{%
+ \ifnum \@tempcnta = 1
+ \@xp\@oneauthorlabel\@xp{\@tempa}%
+ \else
+ \@xp\@multiauthorlabel\@xp{\@tempa}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\calc@author@part@short}
+% \begin{macrocode}
+\def\calc@author@part@short{%
+ \@xp\@multiauthorlabel\@xp{\@tempa}%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@firstone}
+% This extracts the first character from a properly prepared author
+% name (i.e., one in which accents are properly wrapped).
+% \begin{macrocode}
+\def\@firstone#1{\@car#1\@empty\@nil}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@firstthree}
+% And this extracts the first three characters.
+% \begin{macrocode}
+\def\@firstthree#1{\@carcube#1\@empty\@empty\@empty\@nil}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@nametoken}
+% \begin{macrocode}
+\let\@nametoken\@firstone
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\hyph@to@space}
+% \begin{macrocode}
+\def\hyph@to@space#1-{#1 \hyph@to@space}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@marknames}
+% Since we have a~' with funny catcode already, let's use it (being
+% able to easily put a space after the |'| makes things easier).
+% \begin{macrocode}
+\def\@marknames#1{%
+ \@ifnotempty{#1}{\surround@names#1 ' }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\surround@names}
+% \begin{macrocode}
+\def\surround@names#1 {%
+ \ifx '#1%
+ \else
+ \@nx\@nametoken{#1}%
+ \@xp\surround@names
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\extract@surnames}
+% \begin{macrocode}
+\def\extract@surnames#1#2{%
+ \get@namepart\@tempb\@nilgobble #2,\@nil
+ \edef\@tempb{\@nx\@marknames{\@xp\hyph@to@space\@tempb\@gobble-}}%
+ \edef#1{\@tempb}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@oneauthorlabel}
+% This is the easy case.
+% \begin{macrocode}
+\newcommand{\@oneauthorlabel}[1]{%
+ \def\name##1{%
+ \extract@surnames\@tempa{##1}%
+ \get@numberof\@tempcnta\@nametoken\@tempa
+ \ifnum \@tempcnta = 1
+ \let\@nametoken\@firstthree
+ \fi
+ \append@to@stem{\@tempa}%
+ }%
+ #1%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@threeauthors}
+% \begin{macrocode}
+\def\@threeauthors\name#1\name#2\name#3#4\@empty{%
+ \name{#1}\name{#2}\name{#3}%
+ \append@to@stem{\etalchar{+}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@multiauthorlabel}
+% \begin{macrocode}
+\newcommand{\@multiauthorlabel}[1]{%
+ \def\name##1{%
+ \ifx\etaltext ##1%
+ \def\@tempa{\@nx\etalchar{+}}%
+ \let\name\@gobble
+ \else
+ \extract@surnames\@tempa{##1}%
+ \fi
+ \append@to@stem{\@tempa}%
+ }%
+ \ifnum \@tempcnta > 4 \@xp \@threeauthors \fi
+ #1\@empty
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\etalchar}
+% \begin{macrocode}
+\newcommand{\etalchar}[1]{$^{#1}$}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\year@short}
+% For alphanumeric labels, we want to extract the last 2 digits of
+% the year. Here's a way to do that, assuming a 4-digit year.
+% \begin{macrocode}
+\def\year@short#1#2#3#4\@nil{#3#4}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\append@label@year@}
+% \begin{macrocode}
+\def\append@label@year@{%
+ \safe@set\@tempcnta\bib@year
+ \edef\bib@citeyear{\the\@tempcnta}%
+ \append@to@stem{%
+ \ifx\bib@year\@empty
+ \else
+ \@xp\year@short \bib@citeyear \@nil
+ \fi
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\let\alpha@label@suffix\@empty
+
+\newcount\alpha@suffix
+\alpha@suffix\@ne
+\let\@suffix@format\@alph
+% \end{macrocode}
+%
+% \begin{macro}{\calc@alpha@suffix}
+% \begin{macrocode}
+\def\calc@alpha@suffix{%
+ \@tempswafalse
+ \compare@stems\previous@stem\current@stem
+ \ifsame@stems
+% \end{macrocode}
+% Under the \opt{alphabetic} option, \cs{previous@year} and
+% \cs{current@year} will always be the same (namely, both will be
+% empty), but including the test allows this code to work with the
+% \opt{author-year} option as well.
+% \begin{macrocode}
+ \ifx\previous@year\current@year
+ \@tempswatrue
+ \fi
+ \else
+ \begingroup
+ \let\name\@firstofone
+ \@apply\auto@stringify\amsrefs@textsymbols
+ \@apply\auto@stringify\amsrefs@textaccents
+ \@ifundefined{amsrefs@stem@\current@stem}{%
+ \expandafter\gdef\csname amsrefs@stem@\current@stem\endcsname{}%
+ }{%
+ \DuplicateBibLabelWarning
+ }%
+ \endgroup
+ \fi
+ \if@tempswa
+ \global\advance\alpha@suffix\@ne
+ \edef\alpha@label@suffix{\@suffix@format\alpha@suffix}%
+ \ifnum\alpha@suffix=\tw@
+ \immediate\write\@auxout{%
+ \string\ModifyBibLabel{\prev@citekey}%
+ }%
+ \fi
+ \else
+ \let\alpha@label@suffix\@empty
+ \global\alpha@suffix\@ne
+ \@xp\ifx \csname b@\current@citekey @suffix\endcsname \relax
+ \else
+ \edef\alpha@label@suffix{\@suffix@format\alpha@suffix}%
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifsame@stems}
+% \begin{macrocode}
+\newif\ifsame@stems
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\compare@stems}
+% \begin{macrocode}
+\def\compare@stems#1#2{%
+ \begingroup
+ \purge@edef\@tempa{#1}%
+ \purge@edef\@tempb{#2}%
+ \lc@edef\@tempa{\@tempa}%
+ \lc@edef\@tempb{\@tempb}%
+ \ifx\@tempa\@tempb
+ \def\@tempa{\same@stemstrue}%
+ \else
+ \def\@tempa{\same@stemsfalse}%
+ \fi
+ \@xp\endgroup
+ \@tempa
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ModifyBibLabel}
+% \begin{macrocode}
+\def\ModifyBibLabel#1{%
+ \global\@xp\let\csname b@#1@suffix\endcsname\@empty
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Generating short alphabetic labels}
+%
+% This style for alphabetic labels is somewhat simpler than the
+% regular alphabetic style. The stem consists only of an author
+% part without a year part. The author part is formed in the same
+% way, except that even when there is only a single author with a
+% one-word last name, only the first letter of the name is used,
+% not the first three. Finally, the suffix used to disambiguate
+% identical stems is numeric rather than alphabetic.
+%
+% See section~\ref{opt:shortalphabetic} on
+% page~\pageref{opt:shortalphabetic} for the implementation.
+%
+% \subsection{Formatting series}
+%
+% The \cn{PrintSeries} command prints a list of objects in series
+% form. The essential idea is to produce something like \qq{A, B, and
+% C} when we are given three elements ``A'', ``B'', and ``C'', with
+% suitable variations in the punctuation and other intervening
+% material depending on the number of elements.
+%
+% More precisely, we can envision \cn{PrintSeries} being
+% called as
+% \begin{quote}
+% |\PrintSeries{|$S$|}{|$i_1$|}{|$i_2$|}{|$i_3$|}{|$E$|}{\do{|$T_1$|}| \dots|\do{|$T_n$|}}|
+%\end{quote}
+% where $S$ and~$E$ are material to be interpolated before the
+% start and after the end of the list, respectively,
+% $i_1$, \dots, $i_3$ are material to be interpolated between the
+% elements, and the final argument is a list of indeterminate
+% length where each element consists of a macro and its
+% argument. If there are exactly two elements, $i_1$ is inserted
+% between them; otherwise, $i_2$ is inserted between each pair of
+% items except for the last pair, where $i_3$ is inserted. Thus,
+% \begin{center}
+% \begin{tabular}{ll}
+% $n$ & output \\
+% 1 & $S$ $T_1$ $E$ \\
+% 2 & $S$ $T_1$ $i_1$ $T_2$ $E$ \\
+% 3 & $S$ $T_1$ $i_2$ $T_2$ $i_3$ $T_3$ $E$ \\
+% 4 & $S$ $T_1$ $i_2$ $T_2$ $i_2$ $T_3$ $i_3$ $T_4$ $E$
+%^^A \\$>4$ & $S$ $T_1$ $i_2$ $T_2$ $i_2$ $T_3$ \dots $T_{n-1}$ $i_3$ $T_n$ $E$
+% \end{tabular}
+% \end{center}
+% and so forth. For example, a standard comma-separated list could
+% be formatted by
+% \begin{verbatim}
+% \PrintSeries{}{ and }{, }{, and }{}{...}
+%\end{verbatim}
+%
+% That is the simple case but in practice there are
+% additional complications. What if user-supplied line breaks have to
+% be supported at the boundaries between elements? What if in
+% addition to adding material between elements we also want to apply
+% some handy function to each element (e.g., \cn{textsc})? Even
+% worse, what if we want the function to be different depending on
+% the position of the element in the list? Indeed if this did not
+% happen to be the case with the current application I would not have
+% gone to the extra trouble of supporting it. But if it must be so,
+% then the output that we need from a list |\do{A}\do{B}...| is
+% \begin{verbatim}
+% f0{A}
+% f0{A} p1 i1 f1{B}
+% f0{A} p2 i2 f2{B} p3 i3 f3{B}
+%\end{verbatim}
+% and so on, where
+% \begin{itemize}
+% \item $f_n$ is a macro taking one argument,
+% \item $p_n$ is punctuation\mdash material that must precede a line
+% break if one occurs at this boundary,
+% \item $i_n$ other interpolated material, as before.
+% \end{itemize}
+% To reduce the number of distinct required objects we decree that
+% each element will get braces wrapped around it as a matter of
+% course; then it is possible for $f_1$, $f_2$, $f_3$ to be
+% assimilated onto the tail end of $i_1$, $i_2$, $i_3$. Since we
+% also have to specify the macro that delimits the elements
+% of the list, we end up with the following rather formidable
+% signature:
+% \begin{quote}\raggedright
+% |\PrintSeries{\m} {|$f_0$|}|
+% |{|$p_1$|}{|$i_1 f_1$|}| |{|$p_2$|}{|$i_2 f_2$|}|
+% |{|$p_3$|}{|$i_3 f_3$|}|
+% \hspace*{2 em} |{|$S$|} {\m{|$T_1$|}|$\dots$|\m{|$T_n$|}} {|$E$|}|
+%\end{quote}
+% and our comma-separated list example becomes
+% \begin{verbatim}
+% \PrintSeries{\do}{} {}{ and } {,}{ } {,}{ and } {}{...}{}
+%\end{verbatim}
+%
+% \begin{macro}{\series@index}
+% First we define a dedicated count register to be used in tracking
+% the ordinal number of the item currently being processed.
+% \begin{macrocode}
+\newcount\series@index
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintSeries}
+% \begin{macrocode}
+\def\PrintSeries#1#2#3#4#5#6#7#8{%
+ \begingroup
+ \def\series@add@a{#2}%
+ \def\series@add@b{\SwapBreak{#3}#4}%
+ \def\series@add@c{\SwapBreak{#5}#6}%
+ \def\series@add@d{\SwapBreak{#7}#8}%
+ \def\series@add@e{\SwapBreak{#7}}%
+ \PrintSeries@a{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrinteSeries@a}
+% For \cs{PrintSeries@a} the first arg is the iterator function
+% present in the list which is arg 3. Args 2 and 4 are extra material
+% to be added before and after the list that may require the use of
+% \cn{Plural} or \cn{SingularPlural}.
+% \begin{macrocode}
+\def\PrintSeries@a#1#2#3#4{%
+ \get@numberof\@tempcnta#1{#3}%
+ \chardef\series@total=\@tempcnta
+ \ifnum\series@total=\@ne
+ \let\SingularPlural\@firstoftwo
+ \else
+ \let\SingularPlural\@secondoftwo
+ \fi
+ \series@index=\z@
+ \let#1\series@add
+ #2#3#4\relax
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\series@add}
+% This is the inner function called by \cn{PrintSeries} that
+% carefully distributes all the material stored previously in
+% \cs{series@add@...} macros.
+%
+% Note that the handling of ``et al.''\ cases is somewhat
+% hardcoded. This seemed preferable to adding yet another argument
+% (or two!\@) to \cs{PrintSeries}.
+% \begin{macrocode}
+\def\series@add#1{%
+ \advance\series@index\@ne
+ \ifx\etaltext#1\relax
+ \ifnum\series@index=\tw@
+ \def\@tempa{\space\SubEtal}%
+ \else
+ \def\@tempa{\series@add@e\space\SubEtal}%
+ \fi
+% \end{macrocode}
+% We assume there are fewer than 20,000 items in the list.
+% \begin{macrocode}
+ \series@index\@MM
+ \else
+ \ifcase\series@index
+ \or
+% \end{macrocode}
+% Material before name 1:
+% \begin{macrocode}
+ \let\@tempa\series@add@a
+ \or
+% \end{macrocode}
+% Material before name 2:
+% \begin{macrocode}
+ \ifnum\series@total<\thr@@
+ \let\@tempa\series@add@b
+ \else
+ \let\@tempa\series@add@c
+ \fi
+ \else
+% \end{macrocode}
+% Material before names 3, 4, 5,\dots
+% \begin{macrocode}
+ \ifnum\series@index=\series@total
+ \let\@tempa\series@add@d
+ \else
+ \ifnum\series@index<\series@total
+ \let\@tempa\series@add@c
+ \else
+ \let\@tempa\@gobble
+ \fi
+ \fi
+ \fi
+ \fi
+ \@tempa{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\SwapBreak}
+% This takes a single argument, which should begin with a
+% punctuation character, and conditionally appends it to the
+% current horizontal list after removing any preceding whitespace.
+% If there was also a penalty at the end of the hlist (presumed to
+% be the result of a |\linebreak| at the end of a field value), it
+% moves the penalty to \emph{after} the argument.
+%
+% \begin{bug}
+% \cn{SwapBreak} interferes with \TeX's kerning mechanism. For
+% example, consider a field value that ends with a~``y'' and that
+% should have a comma automatically appended. \pkg{amsrefs}
+% generates the equivalent of |y\SwapBreak{,}|, which results in
+% ``y\SwapBreak{,}'' (no kern before the comma) rather than~``y,''.
+% Unfortunately, fixing this would likely require a
+% disproportionate effort. In cases where the lack of kerning is
+% unacceptable, a workaround is to add the punctuation mark to the
+% field value manually. For example, |title={...y,}| would
+% generate the equivalent of |y,\SwapBreak{,}|, which in turn would
+% produce ``y,\SwapBreak{,}'' since \cs{SwapBreak} is careful not
+% to add duplicate punctuation.
+% \end{bug}
+% \begin{macrocode}
+\def\SwapBreak#1{%
+ \relax\ifvmode\leavevmode\fi
+ \@tempcnta\@MM
+ \toks@{#1}%
+% \end{macrocode}
+% First, remove any preceding glue. (There usually shouldn't be
+% any of this.)
+% \begin{macrocode}
+ \unskip
+% \end{macrocode}
+% There might be also be kern, typically an italic correction left
+% there by a previous \texttt{TextFontCommand} like \ncn{textit}.
+% But don't remove the special 1\,sp kern used to mark the
+% beginning of a bibliography entry.
+%
+% \begin{bug}
+% Sometimes we want to keep the italic correction.
+% \end{bug}
+% \begin{macrocode}
+ \ifnum \lastkern>\@ne \unkern \fi
+% \end{macrocode}
+% And now look for a penalty and stash it in a safe place.
+% \begin{macrocode}
+ \ifnum\lastpenalty=\z@
+ \else
+ \@tempcnta\lastpenalty
+ \unpenalty
+ \fi
+% \end{macrocode}
+% Now we add the punctuation, \emph{unless} one of the following
+% conditions is true:
+% \begin{enumerate}
+%
+% \item
+% The last item on the horizontal list was a kern of~1\,sp,
+% indicating that we're at the very beginning of a bibliography
+% item.
+%
+% \item
+% The current space factor is equal to the \cs{sfcode} of the
+% puncutation mark we are adding, meaning that the mark is already
+% on the list.
+%
+% \item
+% The current space factor is equal to the special value
+% |\@nopunctsfcode|, meaning that |\nopunct| was specified.
+%
+% \end{enumerate}
+% This relies on distinct punctuation marks having distinct space
+% factors, as established by our definition of \cn{frenchspacing}.
+% \begin{macrocode}
+ \edef\@tempa{%
+ \@nx\deferredquoteslogical
+ \ifnum\lastkern=\@ne
+ \else
+ \ifnum\spacefactor=\sfcode\@xp\@xp\@xp`\@xp\@car\string#1)\@nil
+ \else
+ \ifnum\spacefactor=\@nopunctsfcode
+ \else
+ \the\toks@
+ \fi
+ \fi
+ \fi
+ \@nx\deferredquotes
+ \ifnum\@tempcnta=\@MM \else \penalty\number\@tempcnta\space \fi
+ \ifnum\lastkern=\@ne \ignorespaces \fi
+ }%
+ \@tempa
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Plural}
+% \begin{macro}{\SingularPlural}
+% \cn{Plural} takes one argument and prints it if there were two or
+% more elements in the current list. So, to get \qq{editors} instead
+% of \qq{editor} after printing a list of editor names, write
+% \verb'editor\Plural{s}'.
+%
+% \cn{SingularPlural} takes two arguments and prints the first if
+% there was only one element, otherwise prints the second arg.
+% \begin{macrocode}
+\newcommand{\SingularPlural}[2]{#1}
+\newcommand{\Plural}{\SingularPlural{}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Formatting names and series of names}\label{name-style}
+%
+% Now that we have a general mechanism for formatting series, we
+% can easily specialize to the common case of a comma-separated
+% list of names. First we provide specifications for the three
+% most common name formats.
+%
+% \begin{macro}{\setbib@nameLE}
+% This sets a name in standard western uninverted order, e.g.,
+% ``John Doe Jr.'' (The ``LE'' stands for little-endian.)
+% \begin{macrocode}
+\BibSpec{nameLE}{
+ +{}{}{given}
+ +{}{\IfEmptyBibField{given}{}{ }}{surname}
+ +{}{ }{jr}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setbib@nameBE}
+% Big-endian order, as used for example in traditional Chinese,
+% Japanese, Vietnamese, and Hungarian names: ``Doe John''.
+% Big-endian formatting can be requested for name by setting the
+% ``inverted'' property to ``yes.''
+% \begin{macrocode}
+\BibSpec{nameBE}{
+ +{}{}{surname}
+ +{}{ }{given}
+% \end{macrocode}
+% I don't know what should happen if there's a suffix, so I'm going
+% to just leave it out for now (although I should probably issue a
+% warning). I suspect that either (a)~it never comes up or (b)~if
+% it does come up, there's no set standard for how it should be
+% handled.
+% \begin{macrocode}
+% +{}{ }{jr}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setbib@nameinverted}
+% Inverted western-style names: ``Doe, John, Jr.''
+% \begin{macrocode}
+\BibSpec{nameinverted}{
+ +{} {} {surname}
+ +{,}{ } {given}
+ +{,}{ } {jr}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Incidentally, it would probably be cleaner if names had their
+% own namespace like properties do, i.e., something like
+% \begin{verbatim}
+% \DefineSimpleKey{name}{given}
+% \DefineSimpleKey{name}{initials}
+% \DefineSimpleKey{name}{surname}
+% \DefineSimpleKey{name}{jr}
+%\end{verbatim}
+% followed by
+% \begin{verbatim}
+% \NameSpec{nameLE}{...}
+%\end{verbatim}
+% or
+% \begin{verbatim}
+% \BibSpec[name]{nameLE}{...}
+%\end{verbatim}
+% But this seems a little extravagant at this stage, so I've
+% decided to leave things as-is for now.
+%
+% \begin{macro}{\PrintNames}
+% \cn{PrintNames} is a simplified interface to \cs{PrintSeries} that
+% takes only the last three arguments:
+% \begin{quote}\raggedright
+% |\PrintNames {|$S$|} {|$E$|} {\name{|$T_1$|}|$\dots$|\name{|$T_n$|}}|
+%\end{quote}
+% The order of the last two arguments is reversed to make it
+% moderately easier to use; cf.\ \cn{PrintEditorsA}, etc.
+%
+% The first name in a series is treated differently than the other
+% names in the \opt{author-year} style, so we use a separate
+% formatting macro for it.
+% \begin{macrocode}
+\newcommand{\PrintNames}{%
+ \@ifstar{\PrintNames@a\set@othername}{\PrintNames@a\set@firstname}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintNames@a}
+% \begin{macrocode}
+\newcommand{\PrintNames@a}[4]{%
+ \PrintSeries{\name}
+ {#1}
+ {}{ and \set@othername}
+ {,}{ \set@othername}
+ {,}{ and \set@othername}
+ {#2}{#4}{#3}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\set@firstname}
+% By default, the first name is formatted in little-endian format.
+% The \opt{author-year} option changes this to inverted order.
+% \begin{macrocode}
+\def\set@firstname#1{%
+ \set@name{#1}\setbib@nameLE
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\set@othername}
+% The rest of the names are set in little-endian format by
+% default.
+% \begin{macrocode}
+\def\set@othername#1{%
+ \set@name{#1}\setbib@nameLE
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\set@name}
+% Parse the name into its components and then pass control to
+% \cs{set@name@a}, which will decide what format to use for the
+% name.
+% \begin{macrocode}
+\def\set@name#1{%
+ \name@split#1,,,\@nil
+ \set@name@a
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\set@namea}
+% Use the requested format unless the |order| property has been set
+% to ``inverted.''
+% \begin{macrocode}
+\def\set@name@a#1{%
+ \begingroup
+ \get@current@properties
+ \select@auxlanguage
+ \def\@tempa{yes}%
+ \ifx\@tempa\prop'inverted
+ \setbib@nameBE
+ \else
+ #1%
+ \fi
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintPrimary}
+% \begin{macrocode}
+\def\PrintPrimary{%
+ \ifx\current@primary\@empty
+ \EmptyPrimaryWarning
+ \else
+ \print@primary\current@primary
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\EmptyPrimaryWarning}
+% \begin{macrocode}
+\def\EmptyPrimaryWarning{%
+ \amsrefs@warning{No authors, editors or translators}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintAuthors}
+% The comparison of \cs{previous@primary} and \cs{current@primary}
+% doesn't look at auxiliary properties (see also \cs{PrintEditorsA}
+% and \cs{PrintTranslatorsA}). This is probably ok.
+% \begin{macrocode}
+\newcommand{\PrintAuthors}[1]{%
+ \ifx\previous@primary\current@primary
+ \sameauthors\@empty
+ \else
+ \def\current@bibfield{\bib'author}%
+ \PrintNames{}{}{#1}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\sameauthors}
+% \begin{macrocode}
+\newcommand{\sameauthors}[1]{\bysame#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bysame}
+% \begin{macrocode}
+\def\bysame{%
+ \leavevmode\hbox to3em{\hrulefill}\thinspace
+ \kern\z@
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintNameList}
+% This just prints the names without any additional information.
+% \begin{macrocode}
+\newcommand{\PrintNameList}{\PrintNames{}{}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintEditorsC}
+% \begin{macrocode}
+\newcommand{\PrintEditorsC}[1]{%
+ \PrintNames{Edited by }{}{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintEditorsA}
+% When we consider editor names we have to think about some further
+% complications. First, for the case of a book where editor names are
+% listed in place of author names, just copy the same style with a
+% bit of added text at the end.
+% \begin{macrocode}
+\newcommand{\PrintEditorsA}[1]{%
+ \ifx\previous@primary\current@primary
+ \sameauthors{(ed\Plural{s}.)}%
+ \else
+ \def\current@bibfield{\bib'editor}%
+ \PrintNames{}{ (ed\Plural{s}.)}{#1}%
+ \fi
+ \erase@field\bib'editor
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintEditorsB}
+% \begin{macrocode}
+\newcommand{\PrintEditorsB}{%
+ \PrintNames*{(}{\SwapBreak{,}~ed\Plural{s}.)}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintContributions}
+% \begin{macrocode}
+\newcommand{\PrintContributions}[1]{%
+ \PrintSeries
+ {\fld@elt}
+ {\print@contribution}
+ {}{ and \print@contribution}
+ {,}{ \print@contribution}
+ {,}{ and \print@contribution}{}{#1}{}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\print@contribution}
+% \begin{macrocode}
+\newcommand{\print@contribution}[1]{%
+ \in@={#1}%
+ \ifin@
+ \ifnum\series@index=\@ne with \fi
+ \RestrictedSetKeys{}{bib}{%
+ \bib@print@inner\setbib@contribution{\the\rsk@toks}%
+ }{#1}%
+ \else
+ #1%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\resolve@inner}
+% \begin{macrocode}
+\def\resolve@inner#1#2{%
+ \in@={#2}%
+ \ifin@
+ \RestrictedSetKeys{}{bib}{#1{\the\rsk@toks}}{#2}%
+ \else
+ \@ifundefined{bi@#2}{%
+ \XRefWarning{#2}%
+ }{%
+ #1{\csname bi@#2\endcsname}%
+ }%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintConference}
+% \begin{macrocode}
+\def\PrintConference{%
+ \resolve@inner{\bib@print@inner\setbib@conference}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintConferenceDetails}
+% \begin{macrocode}
+\def\PrintConferenceDetails#1{%
+ \ifx\@empty\bib'address
+ \ifx\@empty\bib'date
+ \else
+ \PrintConferenceDetails@
+ \fi
+ \else
+ \PrintConferenceDetails@
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintConferenceDetails@}
+% \begin{macrocode}
+\def\PrintConferenceDetails@{%
+ \ifnum\lastkern=\@ne\else\space\fi(\kern 1sp
+ \ifx\@empty\bib'address
+ \else
+ \bib'address
+ \fi
+ \ifx\@empty\bib'date
+ \else
+ \SwapBreak{,}\space
+ \print@date
+ \fi
+ )%\spacefactor\sfcode`\,%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintBook}
+% \begin{macrocode}
+\def\PrintBook{%
+ \resolve@inner{\bib@print@inner\setbib@innerbook}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintReprint}
+% \begin{macrocode}
+\def\PrintReprint{%
+ \resolve@inner{\bib@reprint}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bib@reprint}
+% \begin{macrocode}
+\def\bib@reprint#1{%
+ \begingroup
+ #1\relax % execute definitions locally
+ \bib@resolve@xrefs
+ \bib@field@patches
+ \bib'setup
+ \IfEmptyBibField{copula}{reprinted in}{\bib'copula} \nopunct
+ \let\bib'language\@empty
+ \setbib@book
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintTranslation}
+% \begin{macrocode}
+\def\PrintTranslation{%
+ \resolve@inner{\bib@translation}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bib@translation}
+% \begin{macrocode}
+\def\bib@translation#1{%
+ \begingroup
+ #1\relax % execute definitions locally
+ \bib@resolve@xrefs
+ \bib@field@patches
+ \bib'setup
+ \let\PrintPrimary\@empty
+ \bib@append{;}{ % keep this space!
+ \IfEmptyBibField{language}{English}{\bib'language} transl.%
+ \IfEmptyBibField{pages}{ in \kern\@ne sp}{, }%
+ }\bib'transition
+ \let\bib'language\@empty
+ \setbib@@
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintTranslatorsC}
+% \begin{macrocode}
+\newcommand{\PrintTranslatorsC}[1]{%
+ \PrintNames{translated by }{}{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintTranslatorsA}
+% \begin{macrocode}
+\newcommand{\PrintTranslatorsA}[1]{%
+ \ifx\previous@primary\current@primary
+ \sameauthors{(trans.)}%
+ \else
+ \def\current@bibfield{\bib'translator}%
+ \PrintNames{}{ (trans.)}{#1}%
+ \fi
+ \erase@field\bib'translator
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintTranslatorsB}
+% \begin{macrocode}
+\newcommand{\PrintTranslatorsB}[1]{
+ \PrintNames*{(}{\SwapBreak{,}~tran\Plural{s}.)}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Some special handling for ``et alii'' or ``and others''.
+% \begin{macrocode}
+\DefineName{alii}{\etaltext}
+\DefineName{others}{\etaltext}
+% \end{macrocode}
+%
+% \begin{macro}{\etaltext}
+% \begin{macro}{\SubEtal}
+% The Chicago Manual of Style suggests that it is slightly better not
+% to italicize `et al' and some other extremely common abbreviations
+% inherited from Latin. (Compare `etc'.)
+% \begin{macrocode}
+\newcommand{\etaltext}{et al.}
+\newcommand{\SubEtal}[1]{\etaltext}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{The \fld{partial} field}
+%
+% \begin{macro}{\print@partial}
+% \begin{macrocode}
+\newcommand{\print@partial}{%
+ \resolve@inner{\bib@print@inner\setbib@partial}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Special formatting for other fields}
+%
+% \begin{macro}{\parenthesize}
+% The \cn{parenthesize} function adds parentheses around its
+% argument, calling \cn{upn} to optionally prevent italic
+% parentheses from being used.
+% \begin{macrocode}
+\newcommand{\parenthesize}[1]{%
+ \leavevmode\push@bracket)\upn{(}#1\pop@bracket
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\upn}
+% By default, \cn{upn} is a no-op, meaning that this refinement
+% lies dormant unless the \pkg{upref} package or other activation
+% is done. (Probably better done via special fonts, anyway.)
+% \begin{macrocode}
+\providecommand{\upn}[1]{#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\push@bracket}
+% \begin{macro}{\pop@bracket}
+% \begin{macrocode}
+\let\bracket@stack\@empty
+
+\def\push@bracket#1{%
+ \xdef\bracket@stack{#1\bracket@stack}%
+}
+
+\def\pop@bracket{%
+ \iffalse{\fi
+ \@xp\pop@bracket@a\bracket@stack \@empty}%
+}
+
+\def\pop@bracket@a#1{%
+ \leavevmode\/\upn{#1}%
+ \xdef\bracket@stack{\iffalse}\fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\bibquotes}
+% \begin{macrocode}
+\newcommand{\bibquotes}[1]{%
+ \textquotedblleft#1%
+ \gdef\deferredquotes{%
+ \global\let\deferredquotes\@empty
+ \textquotedblright
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mdash}
+% \begin{macro}{\ndash}
+% Cf.\@ \pkg{textcmds}, where there's also a penalty added.
+% \begin{macrocode}
+\providecommand{\mdash}{\textemdash}
+\providecommand{\ndash}{\textendash}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\strip@MRprefix}
+% \begin{macrocode}
+\def\strip@MRprefix#1#2#3#4\@nil{%
+ \def\@tempa{#1#2#3#4}%
+ \if#1M%
+ \if#2R%
+ \def\@tempa{#3#4}%
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\MR}
+% \begin{macrocode}
+\def\MR#1{%
+ \relax\ifhmode\unskip\spacefactor3000 \space\fi
+ \begingroup
+ \strip@MRprefix#1\@nil
+ \edef\@tempa{MR\@nx\MRhref{\@tempa}{\@tempa}}%
+ \@xp\endgroup
+ \@tempa
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\MRhref}
+% For older versions of some AMS document classes, this patch is
+% needed.
+% \begin{macrocode}
+\providecommand{\MRhref}[2]{#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintReviews}
+% Reviews are handled as a list to support the theoretical
+% possibility of multiple reviews.
+% \begin{macrocode}
+\newcommand{\PrintReviews}[1]{%
+ \PrintSeries{\fld@elt}{}{,}{ }{,}{ }{,}{ }{}{#1}{}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintPartials}
+% \begin{macrocode}
+\newcommand{\PrintPartials}[1]{%
+ \PrintSeries
+ {\fld@elt}
+ {\print@partial}
+ {;}{ \print@partial}
+ {;}{ \print@partial}
+ {;}{ \print@partial}{}{#1}{}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintISBNs}
+% And similarly for ISBNs. There seem to be a few different
+% situations where one book might have two different ISBN numbers.
+% Here are the ones I know of so far [mjd,2002-02-18]: separate ISBN
+% numbers for hardback and paperback; separate ISBN numbers for U.S.
+% edition and European edition.
+% \begin{macrocode}
+\newcommand{\PrintISBNs}[1]{%
+ \PrintSeries{\fld@elt}{}{,}{ }{,}{ }{,}{ }{ISBN }{#1}{}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\voltext}
+% \begin{macrocode}
+\newcommand{\voltext}{\IfEmptyBibField{series}{Vol.~}{vol.~}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\issuetext}
+% \begin{macrocode}
+\newcommand{\issuetext}{no.~}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\DashPages}
+% Scan the contents of a page value to see if it is a single page.
+% Presence of \cn{ndash} or hyphen is taken to mean no. Probably
+% should test also for spaces and commas. [mjd,2000/01/24]
+% \begin{macrocode}
+\newcommand{\DashPages}[1]{%
+ p\pp@scan@a#1@\ndash p@\ndash{\pp@scan#1@-p@-{}\@nil}\@nil.~#1%
+}
+
+\def\pp@scan#1-#2@-#3#4\@nil{#3}
+
+\def\pp@scan@a#1\ndash#2@\ndash#3#4\@nil{#3}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\eprintpages}
+% If we have eprint info and pages info and no journal name, the
+% pages information is presumably the number of pages in the eprint.
+% \begin{macrocode}
+\newcommand{\eprintpages}[1]{%
+ #1\IfEmptyBibField{eprint}{}{\IfEmptyBibField{journal}{ pp.}{}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintThesisType}
+% \begin{macrocode}
+\def\PrintThesisType#1{%
+ \thesis@type#1?\@nil{#1}%
+}
+
+\def\thesis@type#1#2\@nil#3{%
+ \ifx p#1%
+ Ph.D. Thesis%
+ \else
+ \ifx m#1%
+ Master's Thesis%
+ \else
+ #3%
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintDOI}
+% Perhaps need to add allowbreak penalties at the parentheses in a DOI.
+% Also what about prohibiting a break after the leading S?
+% \begin{macrocode}
+\newcommand{\PrintDOI}[1]{%
+ DOI #1%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintDatePV}
+% Print date in different forms depending on DOI and volume
+% information.
+% \begin{macrocode}
+\newcommand{\PrintDatePV}[1]{%
+ \IfEmptyBibField{doi}{%
+ \let\@tempa\PrintDate
+ }{%
+ \IfEmptyBibField{volume}{%
+ \let\@tempa\PrintDatePosted
+ }{%
+ \let\@tempa\PrintDate
+ }%
+ }%
+ \@tempa{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintDate}
+% The intent is to handle variations such as \texttt{1987},
+% \texttt{August 1987}, \texttt{1987-08}, and
+% \texttt{1987-08-14}. If the month is present, print August or
+% Aug. or 08 or nothing, at the behest of the bib style.
+%
+% We've taken some special care to parse out the date info ahead of
+% time, so this function just discards arg 1 and uses the
+% already-parsed value.
+% \begin{macrocode}
+\newcommand{\PrintDate}[1]{(\print@date)}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintDateB}
+% The same, but without the parentheses.
+% \begin{macrocode}
+\newcommand{\PrintDateB}[1]{\print@date}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintDateField}
+% \begin{macrocode}
+\newcommand{\PrintDateField}[1]{%
+ \@ifempty{#1}{}{%
+ \begingroup
+ \bib@parsedate{#1}%
+ \print@full@date
+ \endgroup
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\print@full@date}
+% \begin{macrocode}
+\def\print@full@date{%
+ \ifx\bib@month\@empty
+ \else
+ \print@month@day
+ \fi
+ \bib@year
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\print@date}
+% \begin{macrocode}
+\let\print@date\print@full@date
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\print@month@day}
+% \begin{macrocode}
+\def\print@month@day{%
+ \bib@monthname
+ \ifx\@empty\bib@day \else \nobreakspace\number 0\bib@day,\fi
+ \space
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bib@monthname}
+% With the Babel package, month names for a given language are
+% typically available in a macro \cs{month@}\emph{language}:
+% \begin{verbatim}
+% \def\month@german{\ifcase\month\or
+% Januar\or Februar\or M\"arz\or April\or Mai\or Juni\or
+% Juli\or August\or September\or Oktober\or November\or Dezember\fi}
+%\end{verbatim}
+% However this is not true for English.
+% \begin{macrocode}
+\newcommand{\bib@monthname}{%
+ \ifcase 0\bib@month
+ \or January\or February\or March\or April\or May\or June\or
+ July\or August\or September\or October\or November\or December\or
+ Winter\or Spring\or Summer\or Fall\else Unknown Month%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintYear}
+% You can use \cn{PrintYear} if you want to suppress month/day even
+% when supplied in the data.
+% \begin{macrocode}
+\newcommand{\PrintYear}[1]{\bib@year}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintDatePosted}
+% This one is special for AMS use.
+% \begin{macrocode}
+\newcommand{\PrintDatePosted}[1]{\unskip, posted on \print@date}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintEdition}
+% \begin{macrocode}
+\newcommand{\PrintEdition}[1]{%
+ \afterassignment\print@edition
+ \count@ 0#1\relax\@nil
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\print@edition}
+% If the number assignment swept up all the contents, produce a
+% cardinal number from \cs{count@}.
+% \begin{macrocode}
+\def\print@edition#1#2\@nil{%
+ \ifx\relax#1\relax
+ \ifnum\count@>\z@
+ \CardinalNumeric\count@
+ \else
+ ??th%
+ \fi
+ \ \editiontext
+ \else
+ \ifnum \count@>\z@ \number\count@ \fi
+ #1#2\relax
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\editiontext}
+% \begin{macrocode}
+\newcommand{\editiontext}{ed.}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CardinalNumber}
+% \begin{macrocode}
+\newcommand{\CardinalNumeric}[1]{%
+ \number#1\relax
+ \if
+ \ifnum#1<14
+ \ifnum#1>\thr@@ T\else F\fi
+ \else
+ F%
+ \fi
+ T%
+ th%
+ \else
+ \@xp\keep@last@digit\@xp#1\number#1\relax
+ \ifcase#1th\or st\or nd\or rd\else th\fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\keep@last@digit}
+% \begin{macrocode}
+\def\keep@last@digit#1#2{%
+ \ifx\relax#2%
+ \@xp\@gobbletwo
+ \else
+ #1=#2\relax
+ \fi
+ \keep@last@digit#1%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\SentenceSpace}
+% Note how careful we are here to preserve \cn{frenchspacing}.
+% \begin{macrocode}
+\newcommand{\SentenceSpace}{\relax\ifhmode\spacefactor`\. \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\eprint}
+% For now, this does nothing. Could do a url/hyperlink or something.
+% \begin{macrocode}
+\newcommand{\eprint}[1]{\url{#1}}
+% \end{macrocode}
+% \end{macro}
+% The \url{www.arXiv.org} recommendations for citing their eprints are
+% found at \url{http://xxx.lanl.gov/help/faq/references}, including
+% these examples:
+% \begin{verbatim}
+% arXiv:hep-th/9910001
+% arXiv:math.AT/9910001
+% arXiv:physics.acc-ph/9911027
+%\end{verbatim}
+%
+% \subsection{\BibTeX\ support}
+%
+% \begin{macro}{\bibliographystyle}
+% Disable \cn{bibliographystyle} since we're going to handle that
+% behind the scenes.
+% \begin{macrocode}
+\let\bibliographystyle\@gobble
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bibtex@style}
+% \begin{macrocode}
+\def\bibtex@style{amsrn}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\AtBeginDocument{
+ \if@filesw
+ \immediate\write\@auxout{\string\bibstyle{\bibtex@style}}%
+ \fi
+}
+% \end{macrocode}
+%
+% \subsection{Implementing package options}
+%
+% \subsubsection{The \opt{alphabetic} option}
+%
+% \begin{macrocode}
+\IfOption{alphabetic}{%
+ \def\bibtex@style{amsra}%
+ \let\process@citelist\process@citelist@unsorted
+ \amsrefs@option@alphabetic
+}{}
+% \end{macrocode}
+%
+% \subsubsection{The \opt{shortalphabetic} option}
+% \label{opt:shortalphabetic}
+%
+% \begin{macrocode}
+\IfOption{shortalphabetic}{%
+ \def\bibtex@style{amsrs}%
+ \let\process@citelist\process@citelist@unsorted
+ \amsrefs@option@shortalphabetic
+}{}
+% \end{macrocode}
+%
+% \subsubsection{The \opt{backrefs} option}
+% Rather than checking for the \opt{backrefs} option \emph{per se},
+% we check to see if the \pkg{backref} package is loaded. This
+% accomodates authors who load the \pkg{backref} package explicitly
+% but do not pass the \opt{backrefs} option to \pkg{amsrefs}.
+% \begin{macrocode}
+\AtBeginDocument{%
+ \@ifpackageloaded{backref}{%
+ \let\PrintBackRefs\print@backrefs
+ \let\BackCite\back@cite
+% \end{macrocode}
+% The \pkg{backref} package uses \cn{@starttoc} inside
+% \cn{thebibliography} to open and read the \fn{.brf} file. We
+% could do something similar with \cn{biblist}, but it seems
+% cleaner to use \cn{AtBeginDocument}. Unfortunately, \cls{amsart}
+% redefines \cn{@starttoc} in a way that interacts badly with this
+% use. So, we inline the relevant parts of \cn{@starttoc} here.
+% (The group and \cn{makeatletter} are unnecessary at present, but
+% I'll leave them in as future-proofing.)
+% \begin{macrocode}
+ \begingroup
+ \makeatletter
+ \@input{\jobname.brf}%
+ \if@filesw
+ \newwrite\tf@brf
+ \immediate\openout\tf@brf \jobname.brf\relax
+ \fi
+ \endgroup
+ }{}%
+}
+% \end{macrocode}
+%
+% \subsubsection{The \opt{citation-order} option}
+%
+% \begin{macrocode}
+\IfOption{citation-order}{%
+ \IfOption{alphabetic}{%
+ \amsrefs@warning@nl{%
+ The citation-order and alphabetic options are
+ incompatible%
+ }%
+ }{
+ \def\bibtex@style{amsru}%
+ }
+}{}
+% \end{macrocode}
+%
+% \subsubsection{The \opt{initials} option}
+%
+% \begin{macrocode}
+\IfOption{initials}{% TRUE:
+ \BibSpec{nameLE}{
+ +{}{}{initials}
+ +{}{\IfEmptyBibField{initials}{}{ }}{surname}
+ +{}{ }{jr}
+ }
+
+ \BibSpec{nameBE}{
+ +{}{}{surname}
+ +{}{ }{initials}
+ % +{}{ }{jr}
+ }
+
+ \BibSpec{nameinverted}{
+ +{} {} {surname}
+ +{,}{ } {initials}
+ +{,}{ } {jr}
+ }
+}{% initials? FALSE:
+% \let\extract@initials\@gobble
+} % end conditional code for initials option
+% \end{macrocode}
+%
+% \subsubsection{The \opt{logical-quotes} option}
+%
+% \begin{macro}{\deferredquotes}
+% \begin{macrocode}
+\let\deferredquotes\@empty
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\deferredquoteslogical}
+% \begin{macrocode}
+\IfOption{logical-quotes}{%
+ \def\deferredquoteslogical{\deferredquotes}%
+}{%
+ \let\deferredquoteslogical\relax
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{The \opt{non-compressed-cites} option}
+%
+% \begin{macrocode}
+\IfOption{non-compressed-cites}{%
+ \let\cite@compress\cite@print
+}{}
+% \end{macrocode}
+%
+% \subsubsection{The \opt{non-sorted-cites} option}
+%
+% \begin{macrocode}
+\IfOption{non-sorted-cites}{%
+ \let\process@citelist\process@citelist@unsorted
+}{}
+% \end{macrocode}
+%
+% \subsubsection{The \opt{short-journals} option}
+%
+% \begin{macrocode}
+\IfOption{short-journals}{%
+ \renewcommand{\DefineJournal}[4]{%
+ \bib*{#1}{periodical}{
+ issn={#2},
+ journal={#3},
+ }%
+ }
+}{}
+% \end{macrocode}
+%
+% \subsubsection{The \opt{short-publishers} option}
+%
+% \begin{macrocode}
+\IfOption{short-publishers}{%
+ \renewcommand{\DefinePublisher}[4]{%
+ \bib*{#1}{publisher}{%
+ publisher={#2},%
+% \end{macrocode}
+% Maybe \opt{short-publishers} should suppress the \fld{address}? Or
+% is that a separate option? I sense a combinatorial explosion
+% coming on.\ldots
+% \begin{macrocode}
+ address={#4},
+ }%
+ }%
+}{}
+% \end{macrocode}
+%
+% \subsubsection{The \opt{short-months} option}
+%
+% \begin{macrocode}
+\IfOption{short-months}{%
+ \renewcommand{\bib@monthname}{%
+ \ifcase 0\bib@month
+ \or Jan.\or Feb.\or Mar.\or Apr.\or May\or June\or
+ July\or Aug.\or Sep.\or Oct.\or Nov.\or Dec.\or
+ Winter\or Spring\or Summer\or Fall\else Unknown Month%
+ \fi
+ }%
+}{}
+% \end{macrocode}
+%
+% \subsubsection{The \opt{y2k} option}
+%
+% \begin{macrocode}
+\IfOption{y2k}{%
+ \IfOption{alphabetic}{%
+ \def\year@short#1\@nil{#1}%
+ \def\bibtex@style{amsry}%
+ }{%
+ \amsrefs@warning@nl{%
+ The y2k option can only be used with the^^J%
+ alphabetic option%
+ }%
+}
+}{}
+% \end{macrocode}
+%
+% \subsubsection{The \opt{bibtex-style} option}
+%
+% \begin{macrocode}
+\IfOption{bibtex-style}{%
+ \RequirePackage{amsbst}
+}{}
+% \end{macrocode}
+%
+% \subsubsection{The \opt{msc-links} option}
+%
+% \begin{macrocode}
+\IfOption{msc-links}{%
+% \end{macrocode}
+% Unless you're using pdf\TeX, links cannot be broken across
+% lines, which causes problems for long-form MR numbers such as
+% ``MR2149145 (2006d:01012)''. To mitigate the problem, we
+% manually break such numbers into two separate links.
+% \begin{macrocode}
+ \@ifundefined{href}{}{%
+ \def\parse@MR#1 (#2)#3\@nil{%
+ \def\MR@url{http://www.ams.org/mathscinet-getitem?mr=#1}%
+ \def\@tempd{#1}%
+ \def\@tempe{#2}%
+ }%
+ \def\MRhref#1#2{%
+ \begingroup
+ \parse@MR#1 ()\@empty\@nil%
+ \href{\MR@url}{\@tempd\vphantom{()}}%
+ \ifx\@tempe\@empty
+ \else
+ \ \href{\MR@url}{(\@tempe)}%
+ \fi
+ \endgroup
+ }%
+ }{}
+}{}
+% \end{macrocode}
+%
+% \subsubsection{The \opt{author-year} option}
+%
+% Here ends the \pkg{amsrefs} package, unless the \opt{author-year}
+% option is in effect; then we want to use some different
+% bibspecs.
+% \begin{macrocode}
+\IfOption{author-year}{}{\PopCatcodes \endinput}
+% \end{macrocode}
+%
+% \begin{macro}{\@biblistsetup}
+% \begin{macrocode}
+\renewcommand{\@biblistsetup}[1]{%
+ \RestrictedSetKeys{}{biblist}{\the\rsk@toks}{#1}%
+ \rkvIfEmpty{biblist}{prefix}{}{%
+ \amsrefs@warning{%
+ The `prefix' biblist option cannot be used\MessageBreak
+ with the author-year option.%
+ }%
+ }%
+ \rkvIfEmpty{biblist}{labels}{}{%
+ \amsrefs@warning{%
+ The `labels' biblist option cannot be used\MessageBreak
+ with the author-year option.%
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\generate@label}
+% \begin{macrocode}
+\def\generate@label{%
+% \end{macrocode}
+% If the user supplied an explicit \fld{label} field, we use it.
+% Otherwise, we generate our own.
+% \begin{macrocode}
+ \ifx\bib'label\@empty
+ \begingroup
+% \end{macrocode}
+% We begin by saving the previous stem and initializing the
+% current stem to the empty string.
+% \begin{macrocode}
+ \global\let\previous@stem\current@stem
+ \global\let\current@stem\@empty
+ \global\let\previous@year\current@year
+ \global\let\current@year\bib@year
+% \end{macrocode}
+% The list of primary contributors is available to us in
+% \cs{current@primary} in the form
+% \begin{quote}
+% \cnm{name}{$\mathrm{Last}_1, \mathrm{First}_1$}%
+% \cnm{name}{$\mathrm{Last}_2, \mathrm{First}_2$}
+% \ldots
+% \cnm{name}{$\mathrm{Last}_n, \mathrm{First}_n$}
+% \end{quote}
+% We will be executing this list multiple times with various
+% definitions of \cs{name}. So the first thing we want to do is
+% establish a safe environment and normalize the names.
+% \begin{macrocode}
+ \@apply\auto@protect\amsrefs@textsymbols
+ \@apply\auto@protect\amsrefs@textaccents
+ \def\name##1{\@nx\name{\lnscan@a##1,\@nil}}%
+ \auto@protect\etaltext
+ \normalize@edef\current@stem{\current@primary}%
+ \xdef\current@stem{\current@stem}%
+% \end{macrocode}
+% At this point, the \cs{current@stem} is complete and we're ready
+% to determine what (if any) suffix is needed to disambiguate
+% it from the previous label.
+% \begin{macrocode}
+ \calc@alpha@suffix
+% \end{macrocode}
+% We have all the pieces now. Arrange to end the current group and
+% then define \cs{bib@label} in the enclosing group. (This keeps
+% \cs{bib@label} from being defined outside the group started by
+% \cs{bib@start}. This isn't strictly necessary, but it provides a
+% bit of compartmentalization.)
+% \begin{macrocode}
+ \edef\@tempa{%
+ \def\@nx\cite@label{\current@stem}%
+ \def\@nx\bib@label@year{%
+ \current@year
+ \alpha@label@suffix
+ }%
+ }
+ \@xp\endgroup
+ \@tempa
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lnscan@a}
+% \begin{macrocode}
+\def\lnscan@a#1,#2\@nil{#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\citesel@author}
+% \begin{macrocode}
+\def\citesel@author#1#2#3#4#5{\PrintCiteNames{#3}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\citesel@authoryear}
+% \begin{macrocode}
+\def\citesel@authoryear#1#2#3#4#5{\PrintCNY{#3}{#4}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\citesel@object}
+% \begin{macrocode}
+\def\citesel@object#1#2#3#4#5{\PrintCiteNames{#3} \citeleft#4}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\citesel}
+% \begin{macrocode}
+\let\citesel\citesel@authoryear
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\citeleft}
+% \begin{macrocode}
+\def\citeleft{(}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\citeright}
+% \begin{macrocode}
+\def\citeright{)}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@citeleft}
+% \begin{macrocode}
+\def\@citeleft{\ifx\citesel\citesel@object\else\citeleft\fi}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\citepunct}
+% \begin{macrocode}
+\def\citepunct{; }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\BibLabel}
+% \begin{macrocode}
+\def\BibLabel{%
+ \Hy@raisedlink{\hyper@anchorstart{cite.\CurrentBib}\relax\hyper@anchorend}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\process@citelist}
+% \begin{macrocode}
+\let\process@citelist\process@citelist@unsorted
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ycite}
+% \begin{macrocode}
+\DeclareRobustCommand{\ycite}[1]{%
+ \star@{\cite@a\citesel@year{#1}}{}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ycites}
+% \begin{macrocode}
+\DeclareRobustCommand{\ycites}[1]{%
+ \begingroup
+ \def\citepunct{, }%
+ \let\citesel\citesel@year
+ \cites{#1}%
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\citeyear}
+% \begin{macrocode}
+\DeclareRobustCommand{\citeyear}[1]{%
+ \begingroup
+ \let\citeleft\@empty
+ \let\citeright\@empty
+ \star@{\cite@a\citesel@year{#1}}{}%
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ocite}
+% \begin{macrocode}
+\DeclareRobustCommand{\ocite}[1]{%
+ \star@{\cite@a\citesel@object{#1}}{}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ocites}
+% \begin{macrocode}
+\DeclareRobustCommand{\ocites}[1]{%
+ \begingroup
+ \let\@citelist\@ocitelist
+ \cites{#1}%
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ocitelist}
+% \begin{macrocode}
+\def\@ocitelist#1{%
+ \PrintSeries{\InnerCite}%
+ {\ocite}%
+ {}{ and \ocite}%
+% \end{macrocode}
+% For three or more names: print `et al' instead of the last name.
+% Have to putz around with the space factor a bit or the comma
+% between name and year will not be applied.
+% \begin{macrocode}
+ {,}{ \ocite}%
+ {,}{ and \ocite}%
+ {}%
+ {#1}%
+ {}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\citeauthor}
+% \begin{macrocode}
+\DeclareRobustCommand{\citeauthor}[1]{%
+ \star@{\cite@a\citesel@author{#1}}{}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\citeauthory}
+% \begin{macrocode}
+\DeclareRobustCommand{\citeauthory}[1]{%
+ \citeauthor{#1} \ycite{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fullcite}
+% \begin{macrocode}
+\DeclareRobustCommand{\fullcite}[1]{%
+ \begingroup
+ \let\print@citenames\CiteNamesFull
+ \star@{\cite@a\citesel@authoryear{#1}}{}%
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fullocite}
+% \begin{macrocode}
+\DeclareRobustCommand{\fullocite}[1]{%
+ \begingroup
+ \let\print@citenames\CiteNamesFull
+ \star@{\cite@a\citesel@object{#1}}{}%
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Invert the first author's name.
+% \begin{macrocode}
+\def\set@firstname#1{%
+ \set@name{#1}\setbib@nameinverted
+}
+% \end{macrocode}
+%
+% \begin{macro}{\PrintCNY}
+% \begin{macrocode}
+\def\PrintCNY#1#2{%
+ \PrintCiteNames{#1}%
+ \@ifnotempty{#2}{\@addpunct{,} #2}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintCiteNames}
+% \begin{macrocode}
+\def\PrintCiteNames#1{%
+ \leavevmode
+ \def\@tempa{#1}%
+ \ifx\@tempa\prev@names
+ \else
+ \gdef\prev@names{#1}%
+ \@xp\ifx\@car#1.\@nil\CitePrintUndefined
+ #1\relax
+ \else
+ \print@citenames{#1}%
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CiteNames}
+% \begin{macrocode}
+\newcommand{\CiteNames}[1]{%
+ \PrintSeries{\name}%
+ {}%
+ {}{ and }%
+% \end{macrocode}
+% For three or more names: print `et al' instead of the last name.
+% Have to putz around with the space factor a bit or the comma
+% between name and year will not be applied.
+% \begin{macrocode}
+ {}{\@gobble}%
+ {}{ \etaltext\@\@gobble}%
+ {}%
+ {#1}%
+ {}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\print@citenames}
+% \begin{macrocode}
+\let\print@citenames\CiteNames
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CiteNamesFull}
+% \begin{macrocode}
+\newcommand{\CiteNamesFull}[1]{%
+ \PrintSeries{\name}%
+ {}%
+ {}{ and }%
+% \end{macrocode}
+% For three or more names: print `et al' instead of the last name.
+% Have to putz around with the space factor a bit or the comma
+% between name and year will not be applied.
+% \begin{macrocode}
+ {,}{ }%
+ {,}{ and }%
+ {}%
+ {#1}%
+ {}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintDate}
+% No parentheses around the year.
+% \begin{macrocode}
+\renewcommand{\PrintDate}[1]{\bib@label@year}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\print@date}
+% Only print the year, not the month or day.
+% \begin{macrocode}
+\def\print@date{%
+ \IfEmptyBibField{date}{%
+ \IfEmptyBibField{year}{\BibField{status}}{\bib@year}%
+ }{%
+ \bib@year
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\BibSpec{article}{%
+ +{} {\PrintAuthors} {author}
+ +{.} { \PrintDate} {date}
+ +{.} { \textit} {title}
+ +{.} { } {part}
+ +{:} { \textit} {subtitle}
+ +{,} { \PrintContributions} {contribution}
+ +{.} { \PrintPartials} {partial}
+ +{,} { } {journal}
+ +{} { \textbf} {volume}
+ +{,} { \issuetext} {number}
+ +{,} { \eprintpages} {pages}
+ +{,} { } {status}
+ +{,} { \PrintDOI} {doi}
+ +{,} { available at \eprint} {eprint}
+ +{} { \parenthesize} {language}
+ +{} { \PrintTranslation} {translation}
+ +{;} { \PrintReprint} {reprint}
+ +{.} { } {note}
+ +{.} {} {transition}
+ +{} {\SentenceSpace \PrintReviews} {review}
+}
+
+\BibSpec{book}{%
+ +{} {\PrintPrimary} {transition}
+ +{.} { \PrintDate} {date}
+ +{.} { \textit} {title}
+ +{.} { } {part}
+ +{:} { \textit} {subtitle}
+ +{,} { \PrintEdition} {edition}
+ +{} { \PrintEditorsB} {editor}
+ +{,} { \PrintTranslatorsC} {translator}
+ +{,} { \PrintContributions} {contribution}
+ +{,} { } {series}
+ +{,} { \voltext} {volume}
+ +{,} { } {publisher}
+ +{,} { } {organization}
+ +{,} { } {address}
+ +{,} { } {status}
+ +{} { \parenthesize} {language}
+ +{} { \PrintTranslation} {translation}
+ +{;} { \PrintReprint} {reprint}
+ +{.} { } {note}
+ +{.} {} {transition}
+ +{} {\SentenceSpace \PrintReviews} {review}
+}
+
+\BibSpec{collection.article}{%
+ +{} {\PrintAuthors} {author}
+ +{.} { \PrintDate} {date}
+ +{.} { \textit} {title}
+ +{.} { } {part}
+ +{:} { \textit} {subtitle}
+ +{,} { \PrintContributions} {contribution}
+ +{,} { \PrintConference} {conference}
+ +{} {\PrintBook} {book}
+ +{,} { } {booktitle}
+ +{,} { pp.~} {pages}
+ +{,} { } {status}
+ +{,} { \PrintDOI} {doi}
+ +{,} { available at \eprint} {eprint}
+ +{} { \parenthesize} {language}
+ +{} { \PrintTranslation} {translation}
+ +{;} { \PrintReprint} {reprint}
+ +{.} { } {note}
+ +{.} {} {transition}
+ +{} {\SentenceSpace \PrintReviews} {review}
+}
+
+\BibSpec{report}{%
+ +{} {\PrintPrimary} {transition}
+ +{.} { \PrintDate} {date}
+ +{.} { \textit} {title}
+ +{.} { } {part}
+ +{:} { \textit} {subtitle}
+ +{,} { \PrintEdition} {edition}
+ +{,} { \PrintContributions} {contribution}
+ +{,} { Technical Report } {number}
+ +{,} { } {series}
+ +{,} { } {organization}
+ +{,} { } {address}
+ +{,} { \eprint} {eprint}
+ +{,} { } {status}
+ +{} { \parenthesize} {language}
+ +{} { \PrintTranslation} {translation}
+ +{;} { \PrintReprint} {reprint}
+ +{.} { } {note}
+ +{.} {} {transition}
+ +{} {\SentenceSpace \PrintReviews} {review}
+}
+
+\BibSpec{thesis}{%
+ +{} {\PrintAuthors} {author}
+ +{.} { \PrintDate} {date}
+ +{.} { \textit} {title}
+ +{:} { \textit} {subtitle}
+ +{,} { \PrintThesisType} {type}
+ +{,} { } {organization}
+ +{,} { } {address}
+ +{,} { \eprint} {eprint}
+ +{,} { } {status}
+ +{} { \parenthesize} {language}
+ +{} { \PrintTranslation} {translation}
+ +{;} { \PrintReprint} {reprint}
+ +{.} { } {note}
+ +{.} {} {transition}
+ +{} {\SentenceSpace \PrintReviews} {review}
+}
+
+\BibSpec{webpage}{%
+ +{} {\PrintAuthors} {author}
+ +{.} { \PrintDate} {date}
+ +{.} { \emph} {title}
+ +{:} { \emph} {subtitle}
+ +{,} { \url} {url}
+ +{.} { Accessed \PrintDateField} {accessdate}
+ +{.} { } {note}
+ +{.} {} {transition}
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\PopCatcodes
+%</pkg>
+% \end{macrocode}
+%
+% \subsection{The \pkg{amsbst} package}
+%
+% \begin{macrocode}
+%<*bst>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesPackage{amsbst}[2013/03/07 v2.14]
+%\RequirePackage{amsrefs}[2004/03/29]
+% \end{macrocode}
+%
+% \begin{macrocode}
+\BibSpec{article}{%
+ +{} {\PrintAuthors} {author}
+ +{.} { } {title}
+ +{.} { } {part}
+ +{:} { } {subtitle}
+ +{.} { \PrintContributions} {contribution}
+ +{.} { \PrintPartials} {partial}
+ +{.} { \emph} {journal}
+ +{} { } {volume}
+ +{} { \parenthesize} {number}
+ +{:} {} {pages}
+ +{,} { \PrintDateB} {date}
+ +{,} { } {status}
+ +{.} { \PrintTranslation} {translation}
+ +{.} { Reprinted in \PrintReprint} {reprint}
+ +{.} { } {note}
+ +{.} {} {transition}
+}
+
+\BibSpec{partial}{%
+ +{} {} {part}
+ +{:} { } {subtitle}
+ +{.} { \PrintContributions} {contribution}
+ +{.} { \emph} {journal}
+ +{} { } {volume}
+ +{} { \parenthesize} {number}
+ +{:} {} {pages}
+ +{,} { \PrintDateB} {date}
+}
+
+\BibSpec{book}{%
+ +{} {\PrintPrimary} {transition}
+ +{.} { \emph} {title}
+ +{.} { } {part}
+ +{:} { \emph} {subtitle}
+ +{.} { } {series}
+ +{,} { \voltext} {volume}
+ +{.} { Edited by \PrintNameList} {editor}
+ +{.} { Translated by \PrintNameList}{translator}
+ +{.} { \PrintContributions} {contribution}
+ +{.} { } {publisher}
+ +{.} { } {organization}
+ +{,} { } {address}
+ +{,} { \PrintEdition} {edition}
+ +{,} { \PrintDateB} {date}
+ +{.} { } {note}
+ +{.} {} {transition}
+ +{.} { \PrintTranslation} {translation}
+ +{.} { Reprinted in \PrintReprint} {reprint}
+ +{.} {} {transition}
+}
+
+\BibSpec{collection.article}{%
+ +{} {\PrintAuthors} {author}
+ +{.} { } {title}
+ +{.} { } {part}
+ +{:} { } {subtitle}
+ +{.} { \PrintContributions} {contribution}
+ +{.} { \PrintConference} {conference}
+ +{.} { \PrintBook} {book}
+ +{.} { In } {booktitle}
+ +{,} { pages~} {pages}
+ +{.} { \PrintDateB} {date}
+ +{.} { \PrintTranslation} {translation}
+ +{.} { Reprinted in \PrintReprint} {reprint}
+ +{.} { } {note}
+ +{.} {} {transition}
+}
+
+\BibSpec{conference}{%
+ +{} {} {title}
+ +{} {\PrintConferenceDetails} {transition}
+}
+
+\BibSpec{innerbook}{%
+ +{.} { \emph} {title}
+ +{.} { } {part}
+ +{:} { \emph} {subtitle}
+ +{.} { } {series}
+ +{,} { \voltext} {volume}
+ +{.} { Edited by \PrintNameList} {editor}
+ +{.} { Translated by \PrintNameList}{translator}
+ +{.} { \PrintContributions} {contribution}
+ +{.} { } {publisher}
+ +{.} { } {organization}
+ +{,} { } {address}
+ +{,} { \PrintEdition} {edition}
+ +{,} { \PrintDateB} {date}
+ +{.} { } {note}
+ +{.} {} {transition}
+}
+
+\BibSpec{report}{%
+ +{} {\PrintPrimary} {transition}
+ +{.} { \emph} {title}
+ +{.} { } {part}
+ +{:} { \emph} {subtitle}
+ +{.} { \PrintContributions} {contribution}
+ +{.} { Technical Report } {number}
+ +{,} { } {series}
+ +{.} { } {organization}
+ +{,} { } {address}
+ +{,} { \PrintDateB} {date}
+ +{.} { \PrintTranslation} {translation}
+ +{.} { Reprinted in \PrintReprint} {reprint}
+ +{.} { } {note}
+ +{.} {} {transition}
+}
+
+\BibSpec{thesis}{%
+ +{} {\PrintAuthors} {author}
+ +{,} { \emph} {title}
+ +{:} { \emph} {subtitle}
+ +{.} { \PrintThesisType} {type}
+ +{.} { } {organization}
+ +{,} { } {address}
+ +{,} { \PrintDateB} {date}
+ +{.} { \PrintTranslation} {translation}
+ +{.} { Reprinted in \PrintReprint} {reprint}
+ +{.} { } {note}
+ +{.} {} {transition}
+}
+
+\BibSpec{webpage}{%
+ +{} {\PrintAuthors} {author}
+ +{.} { } {title}
+ +{:} { } {subtitle}
+ +{.} { \PrintDateB} {date}
+ +{.} { \url} {url}
+ +{.} { Accessed \PrintDateField} {accessdate}
+ +{.} { } {note}
+ +{.} {} {transition}
+}
+% \end{macrocode}
+%
+% \begin{macro}{\PrintEditorsA}
+% When we consider editor names we have to think about some further
+% complications. First, for the case of a book where editor names are
+% listed in place of author names, just copy the same style with a
+% bit of added text at the end.
+% \begin{macrocode}
+\renewcommand{\PrintEditorsA}[1]{%
+ \def\current@bibfield{\bib'editor}%
+ \PrintNames{}{, editor\Plural{s}}{#1}%
+ \erase@field\bib'editor
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintTranslatorsA}
+% \begin{macrocode}
+\renewcommand{\PrintTranslatorsA}[1]{%
+ \def\current@bibfield{\bib'translator}%
+ \PrintNames{}{, translator\Plural{s}}{#1}%
+ \erase@field\bib'translator
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</bst>
+% \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}
+%
+% \Finale