% \iffalse meta-comment -*- mode: doctex -*-
%
% Master bibliography style for The Canadian Journal of Statistics |
% La revue canadienne de statistique
%
% Copyright (C) 2023-2024 Statistical Society of Canada | Société
% canadienne de statistique
%
% This file 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:
%
%   https://www.latex-project.org/lppl.txt
%
% This work has the LPPL maintenance status `maintained'.
%
% The Current Maintainer of this work is Vincent Goulet
% <vincent.goulet@act.ulaval.ca>.
%
% This work derives from merlin.mbs, part of the custom-bib
% collection, a contribution to the LaTeX2e system.
% Copyright 1994-2011 Patrick W Daly
% Max-Planck-Institut f\"ur Sonnensystemforschung
% Max-Planck-Str. 2
% D-37191 Katlenburg-Lindau
% Germany
% E-mail: daly@mps.mpg.de
%
%<*!tail>
% (The following notice appears in bst files generated from this file)
 % -------------------------------------------------------------------
 % Name and version information of the main mbs file:
%\fi
 % \ProvidesFile{cjs-rcs-merlin.mbs}[2024/07/30 v1.1a (VG, PWD, AO, DPC)]
%\iffalse
%</!tail>
%<*a&!a>
% The following ensures that the driver part is not seen by makebst
% The driver part must not contain any \end other than \end{document} !
\ifx\endoptions\undefined\let\tempx=\relax\else
  \long\def\tempx#1\end#2{}\fi\tempx
%</a&!a>
%<*driver>
\NeedsTeXFormat{LaTeX2e}%
\documentclass[nocjs,x11names,french,english]{cjs-rcs-article}
  \usepackage{metalogo}
  \setlrmarginsandblock{40mm}{30mm}{*} % increase left margin
  \checkandfixthelayout

  %% Loading doc.sty creates some conflicts with the class and memoir. We
  %% need to:
  %%
  %% - keep a copy of the class' \maketitle command;
  %% - undefine the 'glossary' environment created by memoir;
  %% - restore the standard LaTeX commands for the glossary that
  %%   doc.sty relies upon.
  \let\makeCJStitle\maketitle   % keep class definition
  \let\theglossary\relax        % avoid conflict with doc.sty
  \let\endtheglossary\relax     % avoid conflict with doc.sty
  \makeatletter
  \def\makeglossary{%
    \newwrite\@glossaryfile
    \immediate\openout\@glossaryfile=\jobname.glo
    \def\glossary{\@bsphack\begingroup
                  \@sanitize
                  \@wrglossary}\typeout
      {Writing glossary file \jobname.glo }%
    \let\makeglossary\@empty
  }
  \@onlypreamble\makeglossary
  \def\@wrglossary#1{%
     \protected@write\@glossaryfile{}%
        {\string\glossaryentry{#1}{\thepage}}%
   \endgroup
   \@esphack}
  \def\glossary{\@bsphack\begingroup\@sanitize\@index}
  \@twosidefalse\@mparswitchfalse % turn off twoside option
  \makeatother
  \usepackage{doc}
  \def\changes#1#2#3{\glossary{#1>#3}} % simplified
  \DisableCrossrefs
  \CodelineNumbered
  \RecordChanges
  \OnlyDescription
  \DontCheckModules

  \AtEndPreamble{%
    \hypersetup{%
      pdfauthor = {Statistical Society of Canada},
      pdftitle = {Master bibliographic style cjs-rcs-merlin.mbs}}}

  %% Configuration of the glossary
  \addto\extrasenglish{%
    \def\glossaryname{History of changes}}
  \GlossaryPrologue{\section*{\glossaryname}%
    \addcontentsline{toc}{section}{\glossaryname}}
  \setlength{\GlossaryMin}{5cm}

  %% Additional semantic typesetting
  \newcommand*\class[1]{\textsf{#1}}
  \newcommand*\btx{\textsc{Bib}\TeX}
  \newcommand*\dtx{\textsf{docstrip}}

  %% Name of the journal
  \makeatletter
  \newcommand*\TheCJS{\@ifstar{\emph{The Journal}}{\emph{\CJS@journalname@en}}}
  \newcommand*\LaRevue{\@ifstar{\emph{La revue}}{\emph{\CJS@journalname@fr}}}
  \newcommand*\CJSclass{\class{cjs-rcs-article}}
  \newcommand*\CJSbsten{\texttt{cjs-rcs-en.bst}}
  \newcommand*\CJSbstfr{\texttt{cjs-rcs-fr.bst}}
  \makeatother

  %% Redefine \year using information from \filedate instead of using
  %% compilation time
  \def\parsedate#1/#2/#3\relax{\def\year{#1}}

  \MakeShortVerb{\|}

\begin{document}
  \DocInput{cjs-rcs-merlin.mbs}
\end{document}
%</driver>
% end of meta-comment \fi
% \GetFileInfo{cjs-rcs-merlin.mbs}
% \expandafter\parsedate\filedate\relax
%
% \changes{0.9}{2023-10-14}{Initial version based on version 4.33 of
% \texttt{merlin.mbs}.}
% \changes{0.92}{2023-10-27}{Relegate the \texttt{makebst} menu
% information to the complete documentation.}
% \changes{0.93}{2023-11-06}{Add a prefix v in the version number like
% the main file.}
% \changes{1.0}{2023-11-29}{First official release distributed through
% CTAN.}
%
% \title[Master bibliographic style file \filename]{%
%   Master bibliographic style file \\
%   of \TheCJS}
% \author{Statistical Society of Canada}
% \affil{Developed by Vincent Goulet, Université Laval}
%
% \begin{englishabstract}
%   The list of references in {\TheCJS} is typeset using the
%   bibliographic styles {\CJSbsten} for articles in English and
%   {\CJSbstfr} for articles in French. These styles are created using
%   the program \texttt{makebst} from the master bibliographic file
%   \texttt{cjs-rcs-merlin.mbs}, and the language definition files
%   \texttt{cjs-rcs-english.mbs} and \texttt{cjs-rcs-french.mbs}.
% \end{englishabstract}
% \begin{frenchabstract}
%   La liste des références dans {\LaRevue} est composée avec les
%   style de bibliographie {\CJSbstfr} pour les articles en français
%   et {\CJSbsten} pour les articles en anglais. Ceux-ci sont générés
%   par le programme \texttt{makebst} à partir du fichier maitre
%   \texttt{cjs-rcs-merlin.mbs} et des fichiers de localisation
%   \texttt{cjs-rcs-english.mbs} et \texttt{cjs-rcs-french.mbs}.
% \end{frenchabstract}
%
% ^^A abusing the 'classification' environment. The final period is
% ^^A added by the environment.
% \begin{classification}[Version]
% \item[] This is the documentation for the file \code{\filename}
%   {\fileversion}, dated {\filedate}
% \end{classification}
%
% \licence{{\year}, Statistical Society of Canada~{\textbar}~Société
% canadienne de statistique}
%
% \makeCJStitle
%
% \section{Introduction}
%
% The class {\CJSclass} typesets manuscripts immediately in accordance
% with the presentation rules of {\TheCJS}. The class uses its own
% bibliographic styles: {\CJSbsten} for articles in English, and
% {\CJSbstfr} for articles in French. The style {\CJSbsten} could best
% be described as ``not unlike \code{apalike}'', whereas {\CJSbstfr}
% is closely derived from the style \code{francais} provided by the
% package %
% \href{https://ctan.org/pkg/francais-bst}{\pkg{francais-bst}}.
%
% The styles were originally generated using the program
% \code{makebst} by Patrick W.~Daly. The master bibliographic style
% and the language definition files are heavily based on their
% counterparts of the package %
% \href{https://ctan.org/pkg/custom-bib}{\pkg{custom-bib}}, %
% namely \code{merlin.mbs}, \code{english.mbs}, and \code{french.mbs}.
%
% \section{Generation of the bibliographic styles}
% \label{sec:generation}
%
% The English style {\CJSbsten} is produced from this master
% bibliographic style file and the language definition file
% \code{cjs-rcs-english.mbs} by running the driver
% \code{cjs-rcs-bst-en.dbj} through {\LaTeX}:
% \begin{quote}
%   \code{latex cjs-rcs-bst-en.dbj}
% \end{quote}
% The French style {\CJSbstfr} is produced similarly using the driver
% \code{cjs-rcs-bst-fr.dbj}:
% \begin{quote}
%   \code{latex cjs-rcs-bst-fr.dbj}
% \end{quote}
%
% \section{Changes compared to \texorpdfstring{\code{merlin.mbs}}{merlin.mbs}}
% \label{sec:changes}
%
% The master bibliographic style \code{\filename} introduces the following
% changes compared to \code{merlin.mbs}.
%
% \begin{enumerate}
% \item The function \code{format.url} is reworked to provide a
%   cleaner URL for digital object identifiers (DOIs). The
%   \code{merlin.mbs} definition would generate a DOI of the form
%   \begin{quote}
%     URL \texttt{http://dx.doi.org/\meta{doi}}
%   \end{quote}
%   The revised definition instead generates the simpler string
%   \begin{quote}
%     doi: \meta{doi}
%   \end{quote}
%   When the package \pkg{hyperref} is loaded, \meta{doi} is a
%   hyperlink to the now recommended URL
%   \code{https://doi.org/\meta{doi}}. This behaviour relies on a
%   command \cmd{\urldoi} provided in the \texttt{.bbl} file. If
%   needed, this command may be redefined by the user.
% \item The command \cmd{\urlprefix} is empty. Again, this may be
%   redefined by the user.
% \item The quotes «~» are typeset by the macro \cmd{\frquote} of
%   \pkg{babel-french} (version $\geq$ 3.1), rather than by the custom
%   commands \cmd{\guillemotleft} and \cmd{\guillemotright}.
% \item The \code{makebst} menu information is only included in the
%   complete documentation. The latter is obtained by commenting out
%   the command \cmd{\OnlyDescription} in \code{\filename} and
%   compiling the file with {pdf\LaTeX} or {\XeLaTeX}.
% \end{enumerate}
%
% \StopEventually{\PrintChanges}
%
% \begin{quote}
%   \itshape From this point on, the documentation is taken without
%   modification from \code{merlin.mbs} by Patrick W.~Daly, but for
%   minute details such as filenames.
% \end{quote}
%
% \section{The Menu Information}\label{sec:menu}
%
% Here I describe the options and menu information for this particular
% master file \texttt{\filename}. To construct a \dtx{} driver file
% to generate a desired \texttt{.bst} file, simply process \texttt{makebst.tex}
% with \TeX\ or \LaTeX, and give
% \begin{quote}\code{\filename}\end{quote}
% when prompted for the name of the master file. Then answer the questions
% in the menus that follow. The menu information is extracted from here.
%
% All the menu information is nested between \dtx{} guard options
% |%<*options>| \dots\ |%</options>|, and the last command is
% |\endoptions|. The rest of the file is nested between
% \begin{quote}
%   |%<*!options&!driver&!bblbst>| \dots\ |</!options&!driver&!bblbst>|
% \end{quote}
% in order to exclude it if \dtx{} is used to
% extract the menu information, the documentation driver, or the
% \texttt{babelbst.tex} file.
%
% The main coding is divided into two sections, the \emph{head} and
% \emph{tail}; in between come any external language or journal name
% support files. The head part is marked with the \dtx{} guard option
% |<!tail>| and the tail with |<!head>|. This roundabout means of
% doing things makes it possible to process \texttt{\filename} with
% \texttt{.dbj} files that were generated for the older
% \texttt{genbst.mbs} file by simply changing the name of the source
% file. If both \texttt{head} and \texttt{tail} (and \texttt{exlang})
% options are omitted, as they are in the older \texttt{.dbj} files,
% \texttt{\filename} is processed completely in one pass. To include
% external files, two passes are needed, one for each part, with the
% external file(s) coming in between.
%
% Note too that if the internal language commands are taken (i.e., if
% \texttt{exlang} option is not given) then the default language is
% English, which is tested for as |<!babel>|. This too permits the simple
% update of older \texttt{.dbj}, at least for English.
%
% \subsection*{Selecting Language}
% Explicit words in the bibliography style, such as \textsl{and},
%      \textsl{editor}, etc.,
% are represented by functions \texttt{bbl.and}, \texttt{bbl.editor}, and so on.
% By default these functions translate to the normal English text, but
% other languages are also possible.
%
% The definitions of these functions for other languages are contained in
% external files. At this point, we can make use of features in
% \texttt{makebst} (version~3.0 or later) to ask for the name of such a
% definition file, and store it in |\cfile|. If no external file is
% specified, then the internal definitions are taken, for which there are
% two possibilities: English or \LaTeX{} commands (Babel).
%
% The commands |\MBswitch|, |\mes|, |\MBaskfile|, |\wr|, |\pc|, |\spsp| are
% defined in \texttt{makebst.tex}.
%
% If |\MBswitch| does not exist, then the version of \texttt{makebst}
% cannot support external files.
%
%    \begin{macrocode}
%<*options>
\expandafter\ifx\csname beginoptiongroup\endcsname\relax
 \mes{^^J******************^^J%
        !!!!!! VERSION CLASH !!!!!!!!!^^J%
        This mbs file requires makebst version 4.0 or more^^J%
        You must update makebst to run it with this mbs file^^J%
        No docstrip batch file can be produced on this run^^J%
         ******************}
 \let\temp\endinput\else\let\temp\relax\fi\temp

\newif\ifnumerical
\newif\ifmytemp
\mes{<<< For more information about the meanings of^^J%
     <<< the various options, see the section on ^^J%
     <<< Menu Information in the .mbs file documentation.}

\umes{EXTERNAL FILES:}
\expandafter\ifx\csname MBswitch\endcsname\relax
 \mes{^^J**************^^J%
        Makebst version is less than 3.0^^J%
        Cannot add external file for language definition^^J%
        **************}
 \umes{No included files.}%
 \def\cfile{}\def\jfile{}%
\else
 \MBaskfile{^^JName of language definition file}(\mroot.\mext)i\cfile
 \edef\ctemp{\mroot.\mext}
 \ifx\ctemp\cfile\def\cfile{}\fi
 \umes{Name of language file: \string\cfile=\cfile.}%
%    \end{macrocode}
%
% A second type of external file that can be added is one containing names
% of journals that are to be prestored into the \texttt{.bst} file.
% Several file names are allowed here, with the root names separated by
% commas, and with the common extension added at the end. To assist later
% parsing of the names, an additional comma is added before the extension.
%
% Note that in this case |\MBaskfile| treats the file(s) as output, i.e.,
% it does not check if the file(s) actually exist.
%
% The macro |\Mgetnext| allows the root names to be extracted from the
% list of file names.
%    \begin{macrocode}
 \def\jfile{}
 \ask{\yn}{^^JInclude file(s) for extra journal names? (NO)}
 \mytempfalse
 \if!\yn!\else\if\yn n\else\if\yn N\else\mytemptrue\fi\fi\fi
 \ifmytemp
  \MBaskfile{^^JFile to include}(physjour,geojour,photjour.mbs)o\jfile
  \edef\jfile{\froot,.\fext}
  \umes{Name of included files: \string\jfile=\jfile.}%
 \else
  \umes{No included files.}%
 \fi
\fi%MBswitch
\def\Mgetnext#1,#2.#3??{\def\froot{#1}\def\Mrest{#2}\def\fext{#3}}
%    \end{macrocode}
%
% If no external files are specified, then both |\cfile| and |\jfile| are
% empty. In this case, do \emph{not} set the options \texttt{head} and
% \texttt{tail}, which control the \dtx{} passes through
% \texttt{filename}. Now only one pass is made.
%
% If there is an external definition file, or an external list of
% journal names, then some extra text must be
% written to fit in with that already written by \texttt{makebst}. This is
% explained in that documentation. The |\MBswitch| command turns the curly
% braces |{..}| into normal characters, and the parentheses |(..)| take on
% their grouping functionality. This permits unbalanced braces to be
% written to the output file.
%
%    \begin{macrocode}
\if!\cfile\jfile!\else
 \begingroup\MBswitch
  \wr(\spsp head,\string\MBopta})
  \if!\cfile!\else
   \wr(\string\from{\cfile}{\string\MBopta})
  \fi
  \if!\jfile!\else
   \let\jxfile\jfile
   \loop
%    \end{macrocode}
%
% Parse the list of journal name files, adding a new |\from| for each one.
%
%    \begin{macrocode}
    \expandafter\Mgetnext\jxfile??
    \wr(\string\from{\froot.\fext}{\string\MBopta})
    \edef\jxfile(\Mrest.\fext)
    \if!\Mrest!\def\Mtst(1)\else\def\Mtst()\fi
   \if!\Mtst!
   \repeat
  \fi
  \wr(\string\from{\mroot.\mext}{tail,\string\MBopta}})
  \wr(\string\def\string\MBopta{\pc)
 \endgroup
\fi
%    \end{macrocode}
%
% Ask whether there is a need for
% explicit English words or \LaTeX{} commands whose definitions are
% to be found in the file \texttt{babelbst.tex}.
%
%    \begin{macrocode}
\beginoptiongroup{INTERNAL LANGUAGE SUPPORT
 (if no external language file)}%
 {\if!\cfile!\relax*\fi}%
\optdef{*}{}{English}{words used explicitly}
\optdef{b}{babel}{Babel}
    {(words replaced by commands defined in babelbst.tex)}
\getans
\endoptiongroup
\if!\cfile!\relax\else
\wr{\spsp\spsp exlang,\pc: External language file}
\fi
%    \end{macrocode}
%
% \subsection*{Author--year or numerical}
% The first question is whether a numerical or author--year citation
% style is to be used. If the latter, the supporting system is my
% \code{natbib.sty}, which expects |\bibitem| to have an optional
% argument containing the short form of the authors, plus year in
% parentheses. E.g.,
% \begin{quote}
% |\bibitem[Daly et al.(1990)]{key}...|
% \end{quote}
% There is now a newer version of \texttt{natbib.sty} (v5.3) that
% supports an optional full author list too, as
% \begin{quote}
% |\bibitem[Daly et al.(1990)Daly, Keppler, and Williams]{key}...|
% \end{quote}
% Other systems are also supported, such as the Harvard family of
% bibliography styles (with \texttt{harvard.sty}), which have entries in the
% form
% \begin{quote}
% |\harvarditem[Daly et al.]{Daly, Keppler,|\\
% |       and Williams}{1990}{key}...|
% \end{quote}
% or the astronomy family (with \texttt{astron.sty}) with entries like
% \begin{quote}
% |\bibitem[\protect\astroncite{Daly et al.}{1990}]{key}...|
% \end{quote}
% or the Chicago family (with \texttt{chicago.sty}) with entries like
% \begin{quote}
% |\bibitem[\protect\citeautheryear{Daly, Keppler, and|\\
% |      Williams}{Daly et al.}{1990}]{key}...|
% \end{quote}
% or the `named' variant of Chicago (with \texttt{named.sty}) with entries like
% \begin{quote}
% |\bibitem[\protect\citeauthoryear{Daly et al.}{1990}]{key}...|
% \end{quote}
% or the so-called ``author--date'' group (with \texttt{authordate1-4.sty})
% with entries of the form
% \begin{quote}
% |\bibitem[\protect\citename{Daly et al.}1990]{key}...|
% \end{quote}
% Finally, there is the \texttt{apalike} format of Oren Patashnik, for use
% with \texttt{apalike.sty} that has entries of the form
% \begin{quote}
% |\bibitem[Daly et al., 1990]{key}...|
% \end{quote}
%
% In addition to numerical or author--year citation styles, there is also a
% \texttt{cite} style available in which the label is the same as the cite
% key. This is for listing entire contents of databases with the cite key
% visible.
%
% A flag |\ifnumerical| is established because some of the following menu
% features depend on which system is to be used.
%
% The \texttt{alph} option produces labels as in \texttt{alpha.bst}; options
% \texttt{alf-1} and \texttt{alf-f} modify these. Standard is: first three
% letters of the single author (Dal90 for Daly, 1990) and first letters of
% first three authors (DK90 for Daly and Kopka, 1990). Alternatives are first
% three letters of the first author, no matter how many authors there are, and
% full name of first author.
%    \begin{macrocode}
\beginoptiongroup{STYLE OF CITATIONS:}{}
\optdef{*}{}{Numerical}{as in standard LaTeX}
\optdef{a}{ay}{Author-year}{with some non-standard interface}
\optdef{b}{alph}{Alpha style, Jon90 or JWB90}{for single or multiple authors}
\optdef{o}{alph,alf-1}{Alpha style, Jon90}{even for multiple authors}
\optdef{f}{alph,alf-f}{Alpha style, Jones90}{(full name of first author)}
\optdef{c}{cite}{Cite key}{(special for listing contents of bib file)}
\getans
\endoptiongroup
\if\ans a\numericalfalse\else\numericaltrue\fi
\if\ans b\mytempfalse   \else\mytemptrue   \fi
\beginoptiongroup{HTML OUTPUT
 (if non author-year citations)}
 {\ifnumerical*\fi}
\optdef{*}{}{Normal LaTeX}{output}
\optdef{h}{html}{Hypertext}{output, in HTML code, in paragraphs}
\optdef{n}{html,htlist}{Hypertext list}{with sequence numbers}
\optdef{k}{html,htdes}{Hypertext with keys}{for viewing databases}
\getans
\endoptiongroup
\beginoptiongroup{AUTHOR--YEAR SUPPORT SYSTEM
 (if author-year citations)}
 {\ifnumerical\else*\fi}
\optdef{*}{nat}{Natbib}{for use with natbib v5.3 or later}
\optdef{o}{}{Older Natbib}{without full authors citations}
\optdef{l}{alk}{Apalike}{for use with apalike.sty}
\optdef{h}{har}{Harvard}{system with harvard.sty}
\optdef{a}{ast}{Astronomy}{system with astron.sty}
\optdef{c}{cay}{Chicago}{system with chicago.sty}
\optdef{n}{nmd}{Named}{system with named.sty}
\optdef{d}{cn}{Author-date}{system with authordate1-4.sty}
\getans
%    \end{macrocode}
% The \texttt{harvard} family has been extended for \LaTeXe, and the new
% \texttt{.bst} files allow the word \textsl{and} and the brackets around years
% to be variable with commands. These features may be added too.
% The URL field used to be exclusively part of Harvard, but now exists
% independently of it too.
%
%    \begin{macrocode}
\beginoptiongroup{HARVARD EXTENSIONS INCLUDED
 (if Harvard support selected)}
 {\if\ans h*\fi}%
\optdef{*}{harnm}{With Harvard extensions}{for LaTeX2e version of harvard.sty}
\optdef{n}{}{Older Harvard}{style, for LaTeX 2.09}
\getans
\endoptiongroup
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{Language switching}
% A \texttt{language} field can be present to specify the original language of
% the reference; with \verb!\setlanguage!, the hyphenation patterns are set for
% setting the title in that language.
%    \begin{macrocode}
\beginoptiongroup{LANGUAGE FIELD}{}
\optdef{*}{}{No language field}{}
\optdef{l}{lang}{Add language field}{to switch hyphenation patterns temporarily}
\getans
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{Annotations}
% Annotations to a reference are additional information not normally printed
% out in the list of references. They are used for listing databases.
% The coding here was offered by Soren Dayton.
%    \begin{macrocode}
\beginoptiongroup{ANNOTATIONS:}{}
\optdef{*}{}{No annotations}{will be recognized}
\optdef{a}{annote}{Annotations}{in annote field or in .tex file of citekey name}
\getans
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{Presentations}
% Presentations are talks at meetings, oral or poster, that are not otherwise
% published. The author making the presentation is indicated with the \texttt{key}
% entry, which is the speaker's number within the author list. The font used
% to highlight the speaker is either bold or italics, depending on the secondary
% option, otherwise not highlighted.
%    \begin{macrocode}
\beginoptiongroup{PRESENTATIONS:}{}
\optdef{*}{}{Do not add presentation type}{for conference talks}
\optdef{p}{pres}{Add presentation, speaker not highlighted}{}
\optdef{b}{pres,pres-bf}{Presentation, speaker bold face}{}
\optdef{i}{pres,pres-it}{Presentaion, speaker italic}{}
\optdef{c}{pres,pres-sc}{Presentaion, speaker in small caps}{}
\getans
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{Ordering of the listed references}
%   Choices here depend on citation style. The default in both cases is
% alphabetical order of all authors. For numerical style, one may also
% choose an unsorted order, which means the order is the same as the original
% citations. This corresponds to \texttt{unsrt.bst}. Order of citation is
% also offered for author--year for \texttt{natbib}-type styles that can
% also be used for numerical listings.
%
% Another possibility is to order first by year, then authors. This too only
% makes sense for numerical citations. However, it is offered for author--year
% in the event that a \texttt{natbib}-type style is used for numerical
% listings.
%
% For the alpha style, the ordering is by label only, so no option is
% offered here (|\ifnumerical| is \meta{true} and |\ifmytemp| is \meta{false}).
%
% For author--year, the second choice is by label. (The label is the
% optional |\bibitem| argument, and is what is printed in place of the
% |\cite| command.) With this option, all the papers with the same first
% author are ordered so that the one-author papers come first, followed by
% the two-author papers, followed by the multiple-author papers. This is a
% more sensible system for author--year citations, and is demanded by some
% journals (like JGR).
%
% One problem that can arise here is when two or more references have the
% same set of authors and year; normally they are then ordered by the
% title, ignoring initial words like \textsl{the} and \textsl{a}, with the
% letters a, b,
% c, \dots, added to the year. This can mean that a set of references with
% a natural sequence will be put into a different order. An alternative is
% to order them by the citation keyword instead of by title. This of course
% assumes that the keywords in this case reflect that natural sequence.
%    \begin{macrocode}
\let\ans\relax
\beginoptiongroup{ORDERING OF REFERENCES
 (if non-author/year and non-alph)}
 {\ifnumerical\ifmytemp*\fi\fi}%
\optdef{*}{}{Alphabetical}{by all authors}
\optdef{c}{seq-no}{Citation order}{(unsorted, like unsrt.bst)}
\optdef{d}{seq-yr}{Year ordered}{and then by authors}
\optdef{r}{seq-yrr}{Reverse year ordered}{and then by authors}
\getans
\endoptiongroup
%
\beginoptiongroup{ORDERING OF REFERENCES
 (if author-year citations)}
 {\ifnumerical\else*\fi}%
\optdef{*}{}{Alphabetical}{by all authors}
\optdef{l}{seq-lab}{By label}%
   {(Jones before Jones and James before Jones et al)}
\optdef{m}{seq-labc}{By label and cite order}%
   {(like above but all Jones et al ordered as cited)}
\optdef{k}{seq-key}{By label and cite key}{instead of label and title, as above}
\optdef{d}{seq-yr}{Year ordered}{and then by authors (for publication lists)}
\optdef{r}{seq-yrr}{Reverse year ordered}{and then by authors (most recent first)}
\optdef{c}{seq-no}{Citation order}{(unsorted, only meaningful for numericals)}
\getans
\endoptiongroup
%    \end{macrocode}
% The standard \btx\ styles consider the \emph{von} part of the name to be a
% fixed part of the surname. European usage tends to alphabetize ignoring these
% honorifics.
%    \begin{macrocode}
\beginoptiongroup{ORDER ON VON PART
 (if not citation order)}
 {\if\ans c\else*\fi}%
\optdef{*}{}{Sort on von part}{(de la Maire before Defoe)}
\optdef{x}{vonx}{Sort without von part}{(de la Maire after Mahone)}
\getans
\endoptiongroup
%    \end{macrocode}
%
% Sorting normally treats authors with the same surname but different initials
% or first name separately; but a strict ordering by cite label would lump all
% Smiths together.
%    \begin{macrocode}
\beginoptiongroup{IGNORE FIRST NAMES (if author-year citations)}
  {\ifnumerical\else*\fi}%
\optdef{*}{}{Respect first names}{or initials, treat as different authors}
\optdef{x}{xintls}{Sort on surname only}{and treat all Smiths as one}
\getans
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{Formatting author names}
% The default is that the full names of the authors are listed, given names
% first, unabbreviated. Of course, if only the initials have been given in
% the \texttt{.bib} file, then that is all that can appear in the list. Other
% possibilities are to use initials (even if full names in the \texttt{.bib}
% file) either before or after the surnames. A specialty of the journals of
% the American Geophysical Union is to have only the first name with
% reversed initials.
%
% If the reference is part of a larger work with editors, then the editor
% names appear later in the reference text, usually as ``edited by \dots''
% or as ``\emph{names} (editors)''. In these cases, the editor names are
% not usually reversed (surname first) even if the authors' names are.
% An option is provided to format such editor names exactly as the authors'.
%    \begin{macrocode}
\beginoptiongroup{AUTHOR NAMES:}{}
\optdef{*}{ed-au}{Full, surname last}{(John Frederick Smith)}
\optdef{f}{nm-revf}{Full, surname first}{(Smith, John Frederick)}
\optdef{i}{nm-init,ed-au}{Initials + surname}{(J. F. Smith)}
\optdef{r}{nm-rev}{Surname + initials}{(Smith, J. F.)}
\optdef{s}{nm-rv}{Surname + dotless initials}{(Smith J F)}
\optdef{w}{nm-rvvc}{Surname + comma + spaceless initials}{(Smith, J.F.)}
\optdef{x}{nm-rvx}{Surname + pure initials}{(Smith JF)}
\optdef{y}{nm-rvcx}{Surname + comma + pure initials}{(Smith, JF)}
\optdef{z}{nm-rvv}{Surname + spaceless initials}{(Smith J.F.)}
\optdef{a}{nm-rev1}{Only first name reversed, initials}%
   {(AGU style: Smith, J. F., H. K. Jones)}
\optdef{b}{nm-revv1}{First name reversed, with full names}%
   {(Smith, John Fred, Harry Kab Jones)}
\getans
\endoptiongroup
\mytempfalse
\if\ans f\mytemptrue\fi
\if\ans r\mytemptrue\fi
\if\ans s\mytemptrue\fi
\if\ans x\mytemptrue\fi
\if\ans y\mytemptrue\fi
\if\ans a\mytemptrue\fi
\if\ans b\mytemptrue\fi
\beginoptiongroup{EDITOR NAMES IN COLLECTIONS
 (if author names reversed)}
 {\ifmytemp*\fi}
\if\ans r
\optdef{*}{}{Editor names NOT reversed}{as edited by J. J. Smith}
\fi
\if\ans s
\optdef{*}{}{Editor names NOT reversed}{as edited by J J Smith}
\fi
\if\ans a
\optdef{*}{}{Editor names NOT reversed}{as edited by J. J. Smith}
\fi
\if\ans x
\optdef{*}{}{Editor names NOT reversed}{as edited by JJ Smith}
\fi
\if\ans f
\optdef{*}{}{Editor names NOT reversed}{as edited by John James Smith}
\fi
\if\ans y
\optdef{*}{}{Editor names NOT reversed}{as edited by J.J. Smith}
\fi
\if\ans b
\optdef{*}{}{Editor names NOT reversed}{as edited by John James Smith}
\fi
\optdef{r}{ed-rev}{Editor names reversed}{just like authors'}
\getans
\beginoptiongroup{POSITION OF JUNIOR
  (if author names reversed)}
  {}
\optdef{*}{jnrlst}{Junior comes last}{as Smith, John, Jr.}
\optdef{m}{}{Junior between}{as Smith, Jr., John}
\getans
\endoptiongroup
\endoptiongroup

\beginoptiongroup{JUNIOR PART IN THE CITATION
 (if author-year citations)}
 {\ifnumerical\else*\fi}%
\optdef{*}{}{No `junior' part in the citations}{but in the ref listing}
\optdef{j}{jnrlab}{`Junior' in citations}{as well as in ref listing}
\getans
\endoptiongroup

\beginoptiongroup{PUNCTUATION BETWEEN AUTHOR NAMES:}{}
\optdef{*}{}{Author names separated by commas}{}
\optdef{s}{aunm-semi}{Names separated by semi-colon}{}
\optdef{h}{aunm-sl}{Names separated by slash}{/}
\getans
\endoptiongroup

\beginoptiongroup{ADJACENT REFERENCES WITH REPEATED NAMES:}{}
\optdef{*}{}{Author/editor names always present}{}
\optdef{d}{nmdash}{Repeated author/editor names replaced by dash}{}
\optdef{2}{nmdash,nmd-2}{Repeated author/editor names replaced by 2 dashes}{}
\optdef{3}{nmdash,nmd-3}{Repeated author/editor names replaced by 3 dashes}{}
\getans
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{Number of authors}
% Normally the complete list of authors as given in the \texttt{.bib} file is
% presented in the reference list. However, some journals prefer to limit
% them to a maximum. If there are more than this maximum number of author
% names, then a minimum number plus \textsl{et al.} are listed.
%
% Because no test for consistency of the numbers is carried out in the
% \texttt{.bst} file itself (it might be possible, but I found it too complex),
% this is done here.
%    \begin{macrocode}
\beginoptiongroup{NUMBER OF AUTHORS IN BIBLIOGRAPHY:}{}
\optdef{*}{}{All authors}{included in listing}
\optdef{l}{nmlm}{Limited authors}{(et al replaces missing names)}
\getans
\endoptiongroup
\if\ans l
\loop
  \ask{\num}{Maximum number of authors (1-99)}
  \ifnum\num>99\relax
  \mes{*** Must be between 1 and 99}
\repeat
\def\parsenum#1#2{\if#2\relax\wr{\spsp\spsp x#1,\pc: Maximum of #1\space authors}
  \else\wr{\spsp\spsp x#10,x#2,\pc: Maximum of #1#2\space authors}\fi}
\expandafter\parsenum\num\relax
\mes{\spsp You have selected maximum \num\space authors}
\edef\numx{\num}
\loop
  \ask{\num}{Minimum number (before et al given) (1-\numx)}
  \ifnum\num>\numx
  \mes{*** Must be between 1 and \numx}
\repeat
\def\parsenum#1#2{\if#2\relax\wr{\spsp\spsp m#1,\pc: Minimum of #1\space authors}
  \else\wr{\spsp\spsp m#10,m#2,\pc: Minimum of #1#2\space authors}\fi}
\expandafter\parsenum\num\relax
\mes{\spsp You have selected minimum \num\space authors}
\fi

%    \end{macrocode}
%
% Something that I finally added after being asked many times, is to allow for
% more than one name in the citation before inserting \textsl{et~al.}
% to allow more than 2 authors before truncating
%    \begin{macrocode}
\beginoptiongroup{AUTHORS IN CITATIONS:}{}
\optdef{*}{}{One author et al}{for three or more authors}
\optdef{m}{mcite}{Some other truncation scheme}{}
\getans
\endoptiongroup
\mytempfalse
\if\ans m\mytemptrue\fi
\beginoptiongroup{MAX AUTHORS BEFORE ET AL:
 (if regular cite not selected)}
 {\ifmytemp*\fi}%
\optdef{*}{mct-1}{One et al}{}
\optdef{2}{mct-2}{One, Two et al}{}
\optdef{3}{mct-3}{One, Two, Three et al}{}
\optdef{4}{mct-4}{One, Two, Three, Four et al}{}
\optdef{5}{mct-5}{One, Two, Three, Four, Five et al}{}
\optdef{6}{mct-6}{One, Two, Three, Four, Five, Six et al}{}
\getans
\endoptiongroup
\beginoptiongroup{MAX AUTHORS WITHOUT ET AL:
 (if regular cite not selected)}
 {\ifmytemp*\fi}%
\optdef{*}{mct-x2}{Two authors without truncating}{}
\optdef{3}{mct-x3}{Three authors}{without truncating}
\optdef{4}{mct-x4}{Four authors}{without truncating}
\optdef{5}{mct-x5}{Five authors}{without truncating}
\optdef{6}{mct-x6}{Six authors}{without truncating}
\getans
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{Typeface of names}
% The author names in the list of references normally appear in the current
% typeface. This may be changed to small caps, bold, or italics.
%
% Alternatively, the surnames only can be formatted, with the first names in the
% regular font. One can also specify that the words `and' and `et~al.'\ should be
% in the regular font, or that `et~al.'\ be italic.
%
% Another possibility is that the names be put into a command |\bibnamefont{..}|,
% which must be defined in the \LaTeX\ document. By default, this command does
% not format its argument. There is also a |\bibfnamefont| command for the first
% names, to be user-defined.
%
% Editor names in a collection or in a book will not normally have these
% fonts applied to them; this may be additionally selected.
%
%    \begin{macrocode}
\beginoptiongroup{TYPEFACE FOR AUTHORS IN LIST OF REFERENCES:}{}
\optdef{*}{}{Normal font for author names}{}
\optdef{s}{nmft,nmft-sc}{Small caps authors}{(\string\sc)}
\optdef{i}{nmft,nmft-it}{Italic authors}{(\string\it\space or \string\em)}
\optdef{b}{nmft,nmft-bf}{Bold authors}{(\string\bf)}
\optdef{u}{nmft,nmft-def}{User defined author font}{(\string\bibnamefont)}
\getans
\endoptiongroup
\mytempfalse
\if\ans i\mytemptrue\fi
\if\ans s\mytemptrue\fi
\if\ans b\mytemptrue\fi
\if\ans u\mytemptrue\fi
\beginoptiongroup{FONT FOR FIRST NAMES
 (if non-default font for authors)}
 {\ifmytemp*\fi}%
\optdef{*}{}{First names same font as surnames}{}
\optdef{r}{fnm-rm}{First names in normal font}{}
\optdef{u}{fnm-def}{First names in user defined font}{(\string\bibfnamefont)}
\getans
\beginoptiongroup{EDITOR NAMES IN INCOLLECTION ETC:}{}
\optdef{*}{}{Editors incollection normal font}{}
\optdef{a}{nmfted}{Editors incollection like authors}{font}
\getans
\endoptiongroup

\beginoptiongroup{FONT FOR `AND' IN LIST:}{}
\optdef{*}{}{`And' in author font}{(JONES AND JAMES)}
\optdef{r}{nmand-rm}{`And' in normal font}{(JONES and JAMES)}
\getans
\endoptiongroup
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{Names in Citation label}
% This applies to author--year style only. The label is the text written
% by the |\cite| command, and for author--year style, this is something like
% `Daly et al.\ (1990b)'. One may select italics for the authors and for the
% extra label attached to the year. The year always remains plain.
%
% This parallels the font selection for the names in the list of references
% except that there no choice for the first names, since only surnames
% are used in the labels. A user-defined |\citefontname| may also
% be selected, but this \emph{must} be defined by the user since there
% will be no default definition for it.
%
% If a font is selected for the cited authors, then the word `and' may be
% optionally put in the normal font.
%
% It is not possible to select the type of brackets for the year, since
% this is determined by the \LaTeX{} style option that manages the
% author--year citations. This is not standard \LaTeX, so that there are a
% number of private style files for achieving this.
%    \begin{macrocode}
\beginoptiongroup{FONT OF CITATION LABELS IN TEXT
 (if author-year citations)}
 {\ifnumerical\else*\fi}%
\optdef{*}{}{Cited authors plain}{as result of \string\cite\space command}
\optdef{i}{lab,lab-it}{Cited authors italic}{}
\optdef{s}{lab,lab-sc}{Cited authors small caps}{}
\optdef{b}{lab,lab-bf}{Cited authors bold}{}
\optdef{u}{lab,lab-def}{User defined citation font}{(\string\citenamefont)}
\getans

\mytempfalse
\if\ans i\mytemptrue\fi
\if\ans s\mytemptrue\fi
\if\ans b\mytemptrue\fi
\if\ans u\mytemptrue\fi
\beginoptiongroup{FONT FOR `AND' IN CITATIONS
 (if non-default font for citation lables)}
 {\ifmytemp*\fi}%
\optdef{*}{}{Cited `and' in author font}{}
\optdef{r}{and-rm}{Cited `and' in normal font}{}
\getans
\endoptiongroup
\beginoptiongroup{FONT OF EXTRA LABEL
 (The extra letter on the year)}{}
\optdef{*}{}{Extra label plain}{}
\optdef{i}{xlab-it}{Extra label italic}{}
\getans
\endoptiongroup
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{Label for missing author names}
%
% If the author and/or editor is missing, the standard \texttt{.bst} files
% use the \texttt{key} field in place of the names for purposes of ordering the
% entries.
%
% For author--year styles, the \texttt{key} field is even inserted in the
% reference list and in the label in place of the authors. Optionally, one can
% suppress the year in this case, which causes \texttt{natbib} (version~7)
% to print only that key text as a code designation for the work. Thus if
% \texttt{KEY = "CS1-345"} and there are no authors, then |\citep| produces
% (CS1-345) and |\citet| simply CS1-345. That is, they behave like
% |\citeauthor|. If \texttt{natbib} did not recognize the blank year, one would
% get (CS1-345, ) and CS1-345 (). (Earlier versions of \texttt{natbib} crash on
% a blank year.)
%    \begin{macrocode}
\beginoptiongroup{LABEL WHEN AUTHORS MISSING
 (if author-year citations)}
 {\ifnumerical\else*\fi}%
\optdef{*}{keyxyr}{Year blank when KEY replaces missing author}{(for natbib 7.0)}
\optdef{y}{}{Year included when KEY replaces missing author}{}
\getans
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{Missing date}
% A missing date can be set to ???? or simply left blank. In the latter case,
% \texttt{natbib} version~7 will print only the authors without any year
% punctuation or brackets.
%
%    \begin{macrocode}
\beginoptiongroup{MISSING DATE
 (if author-year citations)}
 {\ifnumerical\else*\fi}%
\optdef{*}{}{Missing date set to ????}{in label and text}
\optdef{b}{blkyear}{Missing date left blank}{}
\getans
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{Position of date}
% This applies to author--year style only. It makes sense to put the date
% immediately after the author list, since the two items (author and year)
% are the identifiers of the reference. Default position is at the
% end of the references, before any notes. It is also possible to place
% it even after the notes.
%
% Medical journals have a system where the date is part of the journal
% specification, as Lancet 1994;45(2):34--40. Otherwise the date appears at
% the end.
%    \begin{macrocode}
\beginoptiongroup{DATE POSITION:}{}
\optdef{*}{}{Date at end}{}
\optdef{b}{dt-beg}{Date after authors}{}
\optdef{j}{dt-jnl}{Date part of journal spec.}{(as 1994;45:34-40) else at end}
\optdef{e}{dt-end}{Date at very end}{after any notes}
\getans
\endoptiongroup
\if\ans b\mytemptrue\else\if\ans j\mytemptrue\else\mytempfalse\fi\fi
%    \end{macrocode}
%
% \subsection*{Format of date}
% The year may be enclosed in parentheses, brackets, or preceded by a
% colon. If none of these are selected, the date (month plus year) appears.
% For author--year, the date normally consists only of the year, no month,
% but this may be overridden.
%
% If the date comes just after the authors, then one might want special
% punctuation following it, like a colon, or space only. The latter is
% probably desirable if the date is brackets or parentheses.
%
% The date can even be put into bold face.
%    \begin{macrocode}
\beginoptiongroup{DATE FORMAT
 (if non author-year citations)}
 {\ifnumerical*\fi}%
\optdef{*}{}{Plain month and year}{without any brackets}
\optdef{p}{yr-par}{Date in parentheses}{as (May 1993)}
\optdef{b}{yr-brk}{Date in brackets}{as [May 1993]}
\optdef{c}{yr-col}{Date preceded by colon}{as `: May 1993'}
\optdef{d}{yr-per}{Date preceded by period}{as `. May 1993'}
\optdef{m}{yr-com}{Date preceded by comma}{as `, May 1993'}
\optdef{s}{yr-blk}{Date preceded by space}{only, as ` May 1993'}
\getans
\beginoptiongroup{SUPPRESS MONTH:}{}
\optdef{*}{}{Date is month and year}{}
\optdef{x}{xmth}{Date is year only}{}
\getans
\endoptiongroup
\beginoptiongroup{REVERSED DATE
 (if including month)}
 {\if\ans x\else*\fi}%
\optdef{*}{}{Date as month year}{}
\optdef{r}{dtrev}{Date as year month}{}
\getans
\endoptiongroup
\endoptiongroup

\beginoptiongroup{DATE FORMAT
 (if author-year citations)}
 {\ifnumerical\else*\fi}%
\optdef{*}{}{Year plain}{without any brackets}
\optdef{p}{yr-par}{Year in parentheses}{as (1993)}
\optdef{b}{yr-brk}{Year in brackets}{as [1993]}
\optdef{c}{yr-col}{Year preceded by colon}{as `: 1993'}
\optdef{d}{yr-per}{Year preceded by period}{as `. 1993'}
\optdef{m}{yr-com}{Date preceded by comma}{as `, 1993'}
\optdef{s}{yr-blk}{Year preceded by space}{only, as ` 1993'}
\getans
\beginoptiongroup{INCLUDE MONTHS:}{}
\optdef{*}{}{Date is year only}{without the month}
\optdef{m}{aymth}{Include month in date}{}
\getans
\endoptiongroup
\beginoptiongroup{REVERSED DATE
 (if including month)}
 {\if\ans m*\fi}%
\optdef{*}{}{Date as month year}{}
\optdef{r}{dtrev}{Date as year month}{}
\getans
\endoptiongroup
\endoptiongroup

\beginoptiongroup{DATE PUNCTUATION
 (if date not at end)}
 {\ifmytemp*\fi}%
\optdef{*}{}{Date with standard block punctuation}{(comma or period)}
\optdef{c}{yrp-col}{Colon after date}{as 1994:}
\optdef{s}{yrp-semi}{Semi-colon after date}{as 1994;}
\optdef{p}{yrp-per}{Period after date}{even when blocks use commas}
\optdef{x}{yrp-x}{No punct. after date}{}
\getans
\beginoptiongroup{BLANK AFTER DATE:}{}
\optdef{*}{}{Space after date}{and punctuation}
\optdef{x}{yrpp-xsp}{No space after date}{as 1994:45}
\getans
\endoptiongroup
\endoptiongroup
\beginoptiongroup{DATE FONT:}{}
\optdef{*}{}{Date in normal font}{}
\optdef{b}{dtbf}{Date in bold face}{}
\getans
\endoptiongroup
%    \end{macrocode}
%
% Normally in author--year citations, the \texttt{year} entry is truncated
% to the last 4 characters, which should be the 4 digits of the year. Some
% users have requested the possibility of suppressing this truncation so
% that they may put text in the \texttt{year} field, such as ``in press.''
% Another use for it is when years are given as ``1968--72''. Actually,
% I have no idea why the year should be truncated at all.
%    \begin{macrocode}
\beginoptiongroup{TRUNCATE YEAR
 (if author-year citations)}
 {\ifnumerical\else*\fi}%
\optdef{*}{note-yr}{Year text full}{as 1990--1993 or `in press'}
\optdef{t}{}{Year truncated}{to last 4 digits}
\getans
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{Article title in journal}
% The title of an article in a journal or in a collection (a book, or
% conference proceedings) may appear plain, in italics, within single
% or double quotes or even in guillemets. The last is best with T1 coding; a
% poor man's version for OT1 is provided; \LaTeXe\ is required in both cases.
%
% Furthermore, it may have sentence capitalization (first
% word and word following colon) or be capitalized as in the \texttt{.bib} file
% entry. That is why it is recommended to capitalize the entry text as it
% should appear when fully capitalized, putting words that are always
% capitalized in braces. Example:
% \begin{quote}
% |TITLE="The Results of the {Giotto} Mission"|
% \end{quote}
% which produces either ``The results of the Giotto mission'' or ``The
% Results of the Giotto Mission'', depending on option.
%
% Additionally, the article titles may be fully suppressed.
%    \begin{macrocode}
\beginoptiongroup{TITLE OF ARTICLE:}{}
\optdef{*}{}{Title plain}{with no special font}
\optdef{i}{tit-it}{Title italic}{(\string\em)}
\optdef{q}{tit-qq,qt-s}{Title and punctuation in single quotes}{(`Title,' ..)}
\optdef{d}{tit-qq}{Title and punctuation in double quotes}{(``Title,'' ..)}
\optdef{g}{tit-qq,qt-g}{Title and punctuation in guillemets}{(<<Title,>> ..)}
\optdef{x}{tit-qq,qt-s,qx}{Title in single quotes}{(`Title', ..)}
\optdef{y}{tit-qq,qx}{Title in double quotes}{(``Title'', ..)}
\optdef{z}{tit-qq,qt-g,qx}{Title in guillemets}{(<<Title>>, ..)}
\getans
\endoptiongroup
\mytempfalse
\if\ans q\mytemptrue\fi
\if\ans d\mytemptrue\fi
\if\ans g\mytemptrue\fi
\if\ans x\mytemptrue\fi
\if\ans y\mytemptrue\fi
\if\ans z\mytemptrue\fi
\beginoptiongroup{COLLECTION/PROCEEDINGS TITLES
 (if quoted title)}
 {\ifmytemp*\fi}%
\optdef{*}{bt-qq}{Quote collection and proceedings titles}{too}
\optdef{x}{}{Collection and proceedings titles not in quotes}{}
\getans
\endoptiongroup
\beginoptiongroup{CAPITALIZATION OF ARTICLE TITLE:}{}
\optdef{*}{}{Sentence style}{(capitalize first word and those in braces)}
\optdef{t}{atit-u}{Title style}{(just as in bib entry)}
\getans
\endoptiongroup

\beginoptiongroup{ARTICLE TITLE PRESENT:}{}
\optdef{*}{}{Article title present}{in journals and proceedings}
\optdef{x}{jtit-x}{No article title}{}
\getans
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{Journal names}
% Abbreviated journal names normally contain periods; the periods may be
% removed with this option. In fact, only letters, numbers, and spacing are
% retained.
%    \begin{macrocode}
\beginoptiongroup{JOURNAL NAMES:}{}
\optdef{*}{}{Periods in journal names}{are retained, as `Phys. Rev.'}
\optdef{x}{jxper}{Dotless journal names}{as `Phys Rev'}
\getans
\endoptiongroup
%    \end{macrocode}
% Journal name is normally printed in italics; can be left in normal font.
%    \begin{macrocode}
\beginoptiongroup{JOURNAL NAME FONT:}{}
\optdef{*}{}{Journal name italics}{}
\optdef{r}{jttl-rm}{Journal name normal}{font}
\getans
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{Title of Theses and Technical Reports}
% The title of a these (PhD or Master's) is normally treated the same
% as that of a book. Optionally, it may be formatted like that of
% an article.
%
% The title of a technical report is normally treated the same as that
% of an article. Optionally, it may be formatted like that of a book.
%
%    \begin{macrocode}
\beginoptiongroup{THESIS TITLE:}{}
\optdef{*}{}{Thesis titles like books}{}
\optdef{a}{thtit-a}{Thesis title like article}{}
\optdef{x}{thtit-x}{No thesis title}{}
\getans
\endoptiongroup

\beginoptiongroup{TECHNICAL REPORT TITLE:}{}
\optdef{*}{}{Tech. report title like articles}{}
\optdef{b}{trtit-b}{Tech. report title like books}{}
\getans
\endoptiongroup

\beginoptiongroup{TECHNICAL REPORT NUMBER:}{}
\optdef{*}{}{Tech. report and number plain}{as `Tech. Rep. 123'}
\optdef{i}{trnum-it}{Tech. report and number italic}%
      {as `{\string\it\space Tech. Rep. 123'}}
\getans
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{Journal reference}
% Great diversity of opinion exists as to how a journal reference is to be
% formatted. It consists of a volume, possibly a number, and page limits.
% The number is really only necessary if the page numbers within one volume
% start at 1 for each physical `number'. Since journals are often bound
% together in one volume later, it makes more sense to number the pages
% continuously through the whole volume.
%
% I am only aware of one journal that used to reset the pagination for each
% `number', in which case the number was part of the page designation.
% I had erroneously provided an option \texttt{vnum-pg} to achieve this, but I
% now realize that instead, for this one journal, the database entries must
% contain \texttt{pages="(2)33--2(55)"}. This option has been removed at
% version 3.84.
%
% A number of styles for journal specifications are
% \begin{quote}
%   \begin{tabular}{l@{\qquad}l}
% 21(2):33--55             & 21, no.\ 2: 33--55\\
% \textbf{21}(2):33--55    & \textbf{21}, \#2, 33--55\\
% \textit{21}(2), 33--55   & \textit{21} (2); 33--55 \\
% 21(2) (1995) 33--55      & 21(1995), 33-55\\
% 21(2) 33--55             & vol.~21 (2), pp.~33--55
%   \end{tabular}
% \end{quote}
%
% Here both start and stop page numbers have been given; often only the
% start page is wanted.
%
% It is also possible to include the year as part of the journal specification,
% in which case the year is always in parentheses, attached snugly or with space
% to the volume, or preceding the pages.
%
%    \begin{macrocode}
\beginoptiongroup{JOURNAL VOLUME:}{}
\optdef{*}{}{Volume plain}{as vol(num)}
\optdef{i}{vol-it}{Volume italic}{as {\string\em\space vol}(num)}
\optdef{b}{vol-bf}{Volume bold}{as {\string\bf\space vol}(num)}
\optdef{d}{vol-2bf}{Volume and number bold}{as {\string\bf\space vol(num)}}
\getans
\endoptiongroup
%    \end{macrocode}
%
% The form of the `number' is also given: in parentheses, with `no.',
% with \#, or omitted. The \texttt{vnum-b} option is meant to be used
% with \texttt{jdt-v} and \texttt{jdt-vs} but could be used alone.
%    \begin{macrocode}
\beginoptiongroup{JOURNAL VOL AND NUMBER:}{}
\optdef{*}{}{Journal vol(num)}{as 34(2)}
\optdef{s}{vnum-sp}{Journal vol (num)}{as 34 (2)}
\optdef{c}{vnum-cm}{Journal vol, num}{as 34, 2}
\optdef{n}{vnum-nr}{Journal vol, no. num}{as 34, no. 2}
\optdef{h}{vnum-h}{Journal vol, \string\# number}{as 34, \string\#2}
\optdef{b}{vnum-b}{Journal vol number}{as 34 2}
\optdef{x}{vnum-x}{Journal vol, without number}{as 34}
\getans
\endoptiongroup

\beginoptiongroup{VOLUME PUNCTUATION:}{}
\optdef{*}{}{Volume with colon}{as vol(num):ppp}
\optdef{s}{volp-sp}{Volume with colon and space}{as vol(num): ppp}
\optdef{h}{volp-semi}{Volume with semi-colon}{as vol(num); ppp}
\optdef{c}{volp-com}{Volume with comma}{as vol(num), ppp}
\optdef{b}{volp-blk}{Volume with blank}{as vol(num) ppp}
\getans
\endoptiongroup

\beginoptiongroup{YEAR IN JOURNAL SPECIFICATION:}{}
\optdef{*}{}{Journal year like others}{as given by date position}
\optdef{v}{jdt-v}{Journal vol(year)}{as 34(1995)}
\optdef{s}{jdt-vs}{Journal vol (year)}{as 34 (1995)}
\optdef{p}{jdt-p}{Year with pages}{as 34(2), (1995) 1345--1387}
\optdef{c}{jdt-pc}{Year, comma, pages}{as 34(2), (1995), 1345--1387}
\getans
\endoptiongroup

\beginoptiongroup{PAGE NUMBERS:}{}
\optdef{*}{}{Start and stop page numbers}{given}
\optdef{f}{jpg-1}{Only start page number}{}
\getans
\endoptiongroup

\beginoptiongroup{LARGE PAGE NUMBERS:}{}
\optdef{*}{}{No separators for large page numbers}{}
\optdef{c}{pgsep-c}{Comma inserted over 9999}{as 11,234}
\optdef{s}{pgsep-s}{Thin space inserted over 9999}{as 11 234}
\optdef{p}{pgsep-p}{Period inserted over 9999}{as 11.234}
\getans
\endoptiongroup

\beginoptiongroup{WORD `PAGE' IN ARTICLES:}{}
\optdef{*}{}{Article pages numbers only}{as 234-256}
\optdef{p}{jwdpg}{Include `page' in articles}{as pp. 234--256}
\getans
\endoptiongroup
%    \end{macrocode}
%
% Some journals want page numbers at the end, even for books, proceedings, as
% well as for journals.
%    \begin{macrocode}
\beginoptiongroup{POSITION OF PAGES:}{}
\optdef{*}{}{Pages given mid text}{as is normal}
\optdef{e}{pp-last}{Pages at end}{but before any notes}
\getans
\endoptiongroup

\beginoptiongroup{WORD `VOLUME' IN ARTICLES:}{}
\optdef{*}{}{Article volume as number only}{as 21}
\optdef{p}{jwdvol}{Include `volume' in articles}{as vol. 21}
\getans
\endoptiongroup
%    \end{macrocode}
%
% Fiddle with the format and location of the number/series for collections and
% inproceedings.
%    \begin{macrocode}
\beginoptiongroup{NUMBER AND SERIES FOR COLLECTIONS:}{}
\optdef{*}{num-xser}{Allows number without series}{and suppresses word "number"}
\optdef{s}{}{Standard BibTeX}{as: "number 123 in Total Works"; error if number and no series}
\getans
\endoptiongroup

\beginoptiongroup{POSITION OF NUMBER AND SERIES:}{}
\optdef{*}{}{After chapter and pages}{as in standard BibTeX}
\optdef{t}{numser}{Just before publisher}{or organization}
\getans
\endoptiongroup
%    \end{macrocode}
%
% Fiddle with the format and location of series and volume with books and collections.
%    \begin{macrocode}
\beginoptiongroup{VOLUME AND SERIES FOR BOOKS/COLLECTIONS:}{}
\optdef{*}{}{Vol. 23 of Series}{as in standard BibTeX}
\optdef{s}{ser-vol}{Series, vol. 23}{}
\getans
\endoptiongroup

\beginoptiongroup{POSITION OF VOLUME AND SERIES FOR INCOLLECTIONS:}{}
\optdef{*}{}{Series and volume after the editors}{}
\optdef{e}{ser-ed}{Series and volume after booktitle}{and before editors}
\getans
\endoptiongroup
%    \end{macrocode}
%
% It is possible to decide whether the journal name should be
% separated from the following specifications with a blank or comma.
%    \begin{macrocode}
\beginoptiongroup{JOURNAL NAME PUNCTUATION:}{}
\optdef{*}{}{Comma after journal}{name}
\optdef{x}{jnm-x}{Space after journal}{name}
\getans
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{Books}
% The title of a book (as opposed to an article in a book or journal) is
% normally italicized. This may be set to the regular font.
%
% The page numbers in books may be set in parentheses, as (pp.\ 345--350).
%    \begin{macrocode}
\beginoptiongroup{BOOK TITLE:}{}
\optdef{*}{}{Book title italic}{(\string\em)}
\optdef{p}{btit-rm,bt-rm}{Book title plain}{(no font command)}
\getans
\endoptiongroup

\beginoptiongroup{PAGES IN BOOKS:}{}
\optdef{*}{}{Pages in book plain}{as pp. 50-55}
\optdef{p}{bkpg-par}{Pages in book in parentheses}{as (pp. 50-55)}
\optdef{x}{bkpg-x}{Pages in book bare}{as 50-55}
\getans
\endoptiongroup
\beginoptiongroup{TOTAL PAGES OF A BOOK:}{}
\optdef{*}{}{Total book pages not printed}{}
\optdef{p}{pg-bk}{For book: 345 pages}{or pp.}
\optdef{a}{pg-bk,pg-pre}{Total book pages before publisher}{}
\getans
\endoptiongroup
%    \end{macrocode}
% Some psychology journals wish to have the publisher's address preceding
% the name, separated by colon, as
% \begin{quote}New York: Wiley and Sons\end{quote}
%
% Some journals (e.g.\ Nature) put publisher in parentheses with date,
% as (Wiley and Sons, New York, 1983). These normally put the date in
% parentheses at the end anyway, so this is a merging of the two sets of
% parentheses.
%    \begin{macrocode}
\beginoptiongroup{PUBLISHER ADDRESS:}{}
\optdef{*}{}{Publisher, address}{as Harcourt, New York}
\optdef{a}{add-pub}{Address: Publisher}{as New York: Harcourt}
\getans
\endoptiongroup

\beginoptiongroup{PUBLISHER IN PARENTHESES:}{}
\optdef{*}{}{Publisher as normal block}{without parentheses}
\optdef{p}{pub-par}{Publisher in parentheses}{}
\optdef{d}{pub-date}{Publisher and date in parentheses}{(Oxford, 1994)}
\optdef{c}{pub-date,pub-xc}{Publisher and date in parentheses, no comma}{(Oxford 1994)}
\optdef{f}{pub-date,pub-xpar}{Publisher and date without parentheses}{Oxford, 1994}
\optdef{k}{pub-date,pub-xpar,pub-xc}{Publisher and date, no parentheses, no comma}{Oxford 1994}
\getans
\endoptiongroup

\beginoptiongroup{PUBLISHER POSITION:}{}
\optdef{*}{}{Publisher after chapter, pages}{}
\optdef{p}{pre-pub}{Publisher before chapter, pages}{}
\optdef{e}{pre-edn}{Publisher after edition}{}
\getans
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{ISBN, ISSN, DOI numbers}
% Books normally possess an ISBN number. This may be included as an
% optional entry for \texttt{book}, \texttt{inbook}, \texttt{booklet},
% \texttt{incollection}, \texttt{proceedings}, \texttt{inproceedings}.
% However, it should be suppressed for \texttt{inbook} etc.\ when
% there is a crossref to another book with the ISBN number.
%
% Periodicals contain an ISSN number. Add this to \texttt{article}, or
% course, but also to \texttt{inproceedings} and \texttt{proceedings}, since
% they are sometimes printed in a periodical.
%
% Journal articles that appear online are given a DOI number, something more
% robust than a URL that can change as machines are upgraded.
% The American Geophysical Union (AGU) uses the DOI as part of the
% page number substitution for electronic journals, placing the number
% where the pages would normally appear.
%    \begin{macrocode}
\beginoptiongroup{ISBN NUMBER:}{}
\optdef{*}{isbn}{Include ISBN}{for books, booklets, etc.}
\optdef{x}{}{No ISBN}{}
\getans
\endoptiongroup

\beginoptiongroup{ISSN NUMBER:}{}
\optdef{*}{issn}{Include ISSN}{for periodicals}
\optdef{x}{}{No ISSN}{}
\getans
\endoptiongroup

\beginoptiongroup{DOI NUMBER:}{}
\optdef{*}{doi}{Include DOI}{as "doi: number"}
\optdef{u}{url-doi}{Format DOI as URL //doi.org/doi}{(must give url options!)}
\optdef{a}{agu-doi,doi}{Insert DOI AGU style}{as part of page number}
\optdef{x}{}{No DOI}{}
\getans
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{Editor of book without author}
%
% This is normally
% \begin{quote}
%  J. K. James, editor
% \end{quote}
% but may also be
% \begin{quote}
%  J. K. James, (editor)\\
%  J. K. James (editor),
% \end{quote}
% Alternatively, the word \textsl{editor} may be capitalized and/or
% abbreviated.
%
%    \begin{macrocode}
\beginoptiongroup{`EDITOR' AFTER NAMES (EDITED BOOKS WITHOUT AUTHORS):}{}
\optdef{*}{}{Word `editor' after name}{}
\optdef{a}{edpar}{`Name (editor),'}{in parentheses, after name, comma after}
\optdef{b}{edpar,bkedcap}{`Name (Editor),'}{as above, editor upper case}
\optdef{c}{edparc}{`Name, (editor)'}{in parentheses, after name, comma between}
\optdef{d}{edparc,bkedcap}{`Name, (Editor)'}{as above, editor upper case}
\optdef{e}{edparxc}{`Name (editor)'}{in parentheses, after name, no commas}
\optdef{f}{edparxc,bkedcap}{`Name (Editor)'}{as above, editor upper case}
\getans
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{Edited by}
% For an article within an edited collection, the normal form is
% \begin{quote}
% In J. K. James, editor, \emph{Title of Collection} \dots
% \end{quote}
% Alternative forms are
% \begin{quote}
% In J. K. James (editor), \emph{Title} \dots\\
% In \emph{Title}, edited by J. K. James \dots\\
% In \emph{Title} (Edited by J. K. James) \dots
% \end{quote}
% If none of the \texttt{edby} variations is used, then the same system is
% used as for edited books, i.e. \texttt{edpar} applies.
%    \begin{macrocode}
\beginoptiongroup{EDITOR IN COLLECTIONS:}{}
\optdef{*}{}{Same as for edited book}{(names before booktitle)}
\optdef{b}{edby}{In booktitle, edited by .. }{(where .. is names)}
\optdef{p}{edby-par}{In booktitle (edited by ..)}{}
\optdef{c}{edby-parc}{In booktitle, (edited by ..)}{}
\optdef{e}{edby,edbyx}{In booktitle, editor ..}{}
\optdef{f}{edby,edbyw}{In booktitle, (editor) ..}{}
\optdef{k}{edby-par,edbyx}{In booktitle (editor..)}{}
\optdef{g}{edby-parc,edbyx}{In booktitle, (editor..)}{}
\optdef{j}{edby,edbyy}{In booktitle, .., editor}{}
\optdef{m}{edby-par,edbyy}{In booktitle (.., editor)}{}
\getans
\endoptiongroup
\mytempfalse
\if\ans p\mytemptrue\fi
\if\ans k\mytemptrue\fi
\if\ans c\mytemptrue\fi
\if\ans f\mytemptrue\fi
\beginoptiongroup{CAPITALIZE `EDITOR' OR `EDITED BY'
 (if editor capitalizable)}
 {\ifmytemp*\fi}%
\optdef{*}{}{`(editor,..)' or `(edited by..)'}{in lower case}
\optdef{c}{edcap}{`(Editor,..)' or `(Edited by..)'}{in upper case}
\getans
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{Block punctuation}
% Blocks are logical sections of the reference specification, such as the
% author block, the journal block, editor block, etc. These are normally
% separated by periods, but alternatively a comma may be used. Another
% choice is to use commas except after titles where a period is given.
%
% \LaTeX\ offers an \texttt{openbib} option, which means that the blocks
% are not only new sentences, but new lines as well. This can only
% function when the default option here is taken, for then the command
% |\newblock| is placed between the blocks. This command is normally
% defined to do nothing, but \LaTeX\ redefines it to issue a new line
% when open bibliographies are wanted.
%    \begin{macrocode}
\beginoptiongroup{PUNCTUATION BETWEEN SECTIONS (BLOCKS):}{}
\optdef{*}{}{\string\newblock\space after blocks}
   {(periods or new lines with openbib option)}
\optdef{c}{blk-com}{Comma between blocks}{}
\optdef{s}{blk-com,com-semi}{Semi-colon between blocks}{}
\optdef{b}{blk-com,com-blank}{Blanks between blocks}{}
\optdef{t}{blk-tit}{Period after titles of articles, books, etc}{else commas}
\optdef{u}{blk-tit,tit-col}{Colon after titles of articles, books, etc}{else commas}
\optdef{a}{blk-tita}{Period after titles of articles}{else commas}
\optdef{d}{blk-tita,tit-col}{Colon after titles of articles}{else commas}
\getans
\endoptiongroup
\mytempfalse
\if\ans c\mytemptrue\fi
\if\ans s\mytemptrue\fi
\if\ans b\mytemptrue\fi
\if\ans t\mytemptrue\fi
\if\ans a\mytemptrue\fi
\beginoptiongroup{PUNCTUATION BEFORE NOTES
 (if not using \string\newblock)}
 {\ifmytemp*\fi}%
\optdef{*}{}{Notes have regular punctuation}{like all other blocks}
\optdef{p}{blknt}{Notes preceded by period}{}
\getans
\endoptiongroup
\beginoptiongroup{PUNCTUATION AFTER AUTHORS:}{}
\optdef{*}{}{Author block normal}{with regular block punctuation}
\optdef{c}{au-col}{Author block with colon}{}
\getans
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{\textsl{In} with colon}
% When referring to works in a collection, one begins the block describing
% that collection with \textsl{In}. Optionally, one may add a colon.
%    \begin{macrocode}
\beginoptiongroup{PUNCTUATION AFTER `IN':}{}
\optdef{*}{}{Space after `in'}{for incollection or inproceedings}
\optdef{c}{in-col}{Colon after `in'}{(as `In: ...')}
\optdef{i}{in-it}{Italic `in'}{and space}
\optdef{d}{in-col,in-it}{Italic `in' and colon}{}
\optdef{x}{in-x}{No word `in'}{for edited works}
\getans
\endoptiongroup
\beginoptiongroup{`IN' WITH JOURNAL NAMES
 (if using 'in' with collections)}
 {\if\ans x\else*\fi}
\optdef{*}{}{No `in' before journal name}{}
\optdef{i}{injnl}{Add `in' before journal name}{in style for incollection}
\getans
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{Final punctuation}
% The punctuation at the end of the reference is normally a period. This
% may be suppressed.
%    \begin{macrocode}
\beginoptiongroup{FINAL PUNCTUATION:}{}
\optdef{*}{}{Period at very end}{of the listed reference}
\optdef{x}{fin-bare}{No period at end}{}
\getans
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{Abbreviations}
% A number of words may be abbreviated: pages, editors, volume, chapter,
% and so on. The first two may be independently set to abbreviation, the
% rest with a single option.
%
% Additionally, the edition numbers may be
% output as words (first, second, etc.) or as numbers (1st, 2nd, etc.).
% (Recall that the input in the \texttt{.bib} file is always as English
% words.)
%    \begin{macrocode}
\beginoptiongroup{ABBREVIATE WORD `PAGES'
 (if not using external language file)}
 {\if!\cfile!\relax*\fi}%
\optdef{*}{}{`Page(s)'}{(no abbreviation)}
\optdef{a}{pp}{`Page' abbreviated}{as p. or pp.}
\optdef{x}{ppx}{`Page' omitted}{}
\getans
\beginoptiongroup{ABBREVIATE WORD `EDITORS':}{}
\optdef{*}{}{`Editor(s)'}{(no abbreviation)}
\optdef{a}{ed}{`Editor' abbreviated}{as ed. or eds.}
\getans
\endoptiongroup

\beginoptiongroup{OTHER ABBREVIATIONS:}{}
\optdef{*}{}{No abbreviations}{of volume, edition, chapter, etc}
\optdef{a}{abr}{Abbreviations}{of such words}
\getans
\endoptiongroup
\beginoptiongroup{ABBREVIATION FOR `EDITION'
 (if abbreviating words)}
 {\if\ans a*\fi}%
\optdef{*}{}{`Edition' abbreviated as `edn'}{}
\optdef{a}{ednx}{`Edition' abbreviated as `ed'}{}
\getans
\beginoptiongroup{MONTHS WITH DOTS:}{}
\optdef{*}{}{Months with dots}{as Jan.}
\optdef{x}{mth-bare}{Months without dots}{as Feb Mar}
\getans
\endoptiongroup
\endoptiongroup
\beginoptiongroup{EDITION NUMBERS:}{}
\optdef{*}{xedn}{Editions as in database}{saving much processing memory}
\optdef{w}{}{Write out editions}{as first, second, third, etc}
\optdef{n}{ord}{Numerical editions}{as 1st, 2nd, 3rd, etc}
\getans
\endoptiongroup
\endoptiongroup
%    \end{macrocode}
%
% The above choices about abbreviations are made only if the internal
% languages are taken (English or \texttt{babel}). For an external language
% definition file, these choices, along with possible other ones, are made
% in the external file, which is read in at this point.
%    \begin{macrocode}
\umes{Reading external language file \string\cfile=\cfile}%
\if!\cfile!\relax\else
 \input\cfile
\fi
%    \end{macrocode}
%
% This file contains the standard set of stored journal names present in
% the basic bibliography style files. If other files containing journal
% names are to be included, they may only contain the options \texttt{jabr}
% or \texttt{jaa} since these options are selected here. No option
% menus from the journal-name files will be read in.
%    \begin{macrocode}
\beginoptiongroup{STORED JOURNAL NAMES:}{}
\optdef{*}{}{Full journal names}{for prestored journals}
\optdef{a}{jabr}{Abbreviated journal names}{}
\optdef{s}{jabr,jaa}{Abbreviated with astronomy shorthands}{like ApJ and AJ}
\getans
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{Variations on \textsl{and}}
% It is possible to replace the word \textsl{and} with an ampersand \&, and to
% specify whether a comma is to precede \textsl{and} in a list of more than two
% names.
%
% A variable \textsl{and} may be provided for with the command |\BIBand|
% in place of the word. In this case, the command must be defined in the
% document file or some other package called. (This is intended for situations
% where an ampersand is wanted in parenthetical citations, but the word in
% textual ones.)
%
%    \begin{macrocode}
\beginoptiongroup{AMPERSAND:}{}
\optdef{*}{}{Use word `and'}{in author lists}
\optdef{a}{amper}{Use ampersand}{in place of `and'}
\optdef{v}{varand}{Use \string\BIBand}{in place of `and'}
\getans
\endoptiongroup

\beginoptiongroup{COMMA BEFORE `AND':}{}
\optdef{*}{}{Comma before `and'}{as `Tom, Dick, and Harry'}
\optdef{n}{and-xcom}{No comma before `and'}{as `Tom, Dick and Harry'}
\optdef{c}{and-com}{Comma even with 2 authors}{as `Tom, and Harry'}
\getans
\endoptiongroup
\beginoptiongroup{COMMA BEFORE `AND' EVEN FOR COLLECTION EDITORS
 (if using comma before `and' with authors)}
 {\if\ans c*\fi}%
\optdef{*}{and-com-ed}{Comma with 2 editors}{in collections}
\optdef{x}{}{Two editors without comma}{as `Tom and Harry'}
\getans
\endoptiongroup
\beginoptiongroup{NO `AND' IN REFERENCE LIST:}{}
\optdef{*}{}{With `and'}{before last author in reference list}
\optdef{x}{xand}{No `and'}{as `Tom, Dick, Harry'}
\getans
\endoptiongroup

\beginoptiongroup{COMMA BEFORE `ET AL':}{}
\optdef{*}{}{Comma before `et al'}{in reference list}
\optdef{x}{etal-xc}{No comma before `et al'}{}
\getans
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{Font of \textsl{et al}}
% One can chose that \textsl{et~al.}\ be put into italics.
% Or, if the authors are in a different font from the regular one, the
% \textsl{et~al.}\ can still be Roman.
%    \begin{macrocode}
\beginoptiongroup{FONT OF `ET AL':}{}
\optdef{*}{}{Plain et al}{}
\optdef{i}{etal-it}{Italic et al}{}
\optdef{r}{etal-rm}{Roman et al}{even when authors something else}
\getans
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{Additional Data Fields}\label{sec:revtex}
% The American Physical Society's REV\TeX\ package contains \btx\ support
% with a \texttt{bst} file generated from a variant of
% \texttt{\filename}. The extra fields are also available here.
% \begin{itemize}
% \item \textbf{collaboration}: A collaboration name associated with a
% reference.
% \item \textbf{eprint}: The e-print citation for the reference (Los Alamos
% or otherwise). E-print numbers can be turned into hyperlinks to the
% online article. The output is\\
%    \hspace*{2em}|\eprint{|\textit{eprint-spec}|}|
% \item \textbf{archive}: is an optional argument for |\eprint|, as\\
%    \hspace*{2em}|\eprint[|\textit{archive-des}|]{|\textit{eprint-spec}|}|\\
% The \textit{archive-des} is some code such as \texttt{arXiv} that is
% translated to a base URL by a class or package file. The default definition
% of |\eprint| ignores \textit{archive-des} and prints \textit{eprint-spec}
% as a URL.
% \item \textbf{url}: A URL associated with the reference. Can be turned
% into a hyperlink.
% \end{itemize}
%
% A collaboration appears as part of the author list and the other two
% appear at the end of the citaton. The URL field can be selected
% independently of this option.
%
% In addition there are new fields for journals like Phys.\ Rev.~D that
% no longer use page numbers.
% \begin{itemize}
% \item \textbf{eid}: Electronic article identifier.
% \item \textbf{numpages}: Number of pages in an article. For use in
% conjunction with the \textbf{eid} field when page counts are
% desired. Deprecated when submitting to Phys.\ Rev.
%
% The \texttt{eprint} (with \texttt{archive}) and \texttt{url} fields may be
% included independently of the other REV\TeX\ fields.
%
% The \texttt{eid} field is now always included, although it is optional for
% the bibliography entries. This electronic identifier is a replacement for the
% page number in electronic journals: it is the sequence number in the printed
% volume. If present, it will be used in place of the page number.
%
% \end{itemize}
%
%    \begin{macrocode}
\beginoptiongroup{ADDITIONAL REVTeX DATA FIELDS:}{}
\optdef{*}{}{No additional fields}{for REVTeX}
\optdef{r}{revdata,eprint,url,url-blk}{Include REVTeX data fields}
 {collaboration, eid, eprint, archive, numpages, url}
\getans
\mytemptrue
\if\ans r\mytempfalse\fi
\beginoptiongroup{E-PRINT DATA FIELD:
(without REVTeX fields)}
{\ifmytemp*\fi}
\optdef{*}{}{Do not include eprint field}{}
\optdef{e}{eprint}{Include eprint and archive fields}{for electronic publications}
\getans
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{URL address}
% For electronic documents with an Internet address, add a URL entry.
% Harvard already has this, but here it is done for all styles.
% The URL text will be set with the \verb!\url! command in the \texttt{url}
% package by Donald Arseneau. This package must be loaded for the command
% to work right. It allows line breaks at punctuations. Otherwise,
% \verb!\texttt! is used instead, with no line breaks. The URL text is preceded
% by \verb!\urlprefix! which defaults to ``URL '' but may be redefined by the
% user to be whatever s/he wants. The final space must be included.
%
% Note: selecting the REV\TeX\ fields automatically includes this, so the
% offer only is made if REV\TeX\ has been rejected.
%
%    \begin{macrocode}
\beginoptiongroup{URL ADDRESS:
(without REVTeX fields)}{\ifmytemp*\fi}
\optdef{*}{}{No URL}{for electronic (Internet) documents}
\optdef{u}{url,url-blk}{Include URL}{as regular item block}
\optdef{n}{url,url-nt}{URL as note}{}
\optdef{l}{url,url-nl}{URL on new line}{after rest of reference}
\getans
\endoptiongroup
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{Reference Component Tagging}
% If reference component tagging is enabled, we
% apply tags like |\bibinfo| and |\eprint| to the fields of data
% in the content of the |\bibitem| statement. We also ensure that
% these commands have a default meaning within the scope of the |thebibliography|
% environment. The default definitions simply print the field and ignore the
% tag. However, other programs or packages might make use of the tag
% information to separate authors from title, for example.
%
%    \begin{macrocode}
\beginoptiongroup{REFERENCE COMPONENT TAGS:}{}
\optdef{*}{}{No reference component tags}
 {in the \string\bibitem\space entries}
\optdef{b}{bibinfo}{Reference component tags}
 {like \string\bibinfo\space in the content of \string\bibitem}
\getans
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{Define emphasis}
% In everything that been mentioned so far, italicization should be
% understood to mean `emphasize' in the \LaTeX{} sense. This means that the
% command |\em| is used. This is not the same as |\it|, which is always
% italics. Rather, with |\em|, the font style switches between |\rm| and
% |\it| depending on the context. Here one may choose to true italics, or
% to switch off italics altogether.
%    \begin{macrocode}
\beginoptiongroup{EMPHASIS:
 (affects all so-called italics)}{}
\optdef{*}{}{Use emphasis}{ie, \string\em, allows font switching}
\optdef{i}{em-it}{Use true italics}{ie, \string\it, absolute italics}
\optdef{x}{em-x}{No italics}{at all}
\optdef{u}{em-ul}{Underlining}{in place of italics, best with ulem package}
\getans
\endoptiongroup
%    \end{macrocode}
%
% \subsection*{Plain \TeX\ compatibility}
% Bold face, italics, and emphasis are made with the \LaTeXe\ commands,
% which makes them incompatible with the obsolete \LaTeX2.09, and with
% Plain \TeX. There are also some extra testing for existing commands
% that best work with \LaTeXe\ syntax.
%
% If the bibliography style file is to be fully compatible with Plain \TeX,
% do not select the option \texttt{nfss} but do take \texttt{plntx}.
%    \begin{macrocode}
\beginoptiongroup{COMPATIBILITY WITH PLAIN TEX:}{}
\optdef{*}{nfss}{Use LaTeX commands}{which may not work with Plain TeX}
\optdef{t}{plntx}{Use only Plain TeX}{commands for fonts and testing}
\getans
\endoptiongroup
%    \end{macrocode}
%
% Terminate the options list. If a language definition file has been called,
% then we have a closing brace too many, so add another dummy opening brace.
%    \begin{macrocode}
\if!\cfile\jfile!\else
\begingroup\MBswitch
\wr(,{\pc)
\endgroup
\fi

\endoptions
%</options>
%    \end{macrocode}
%
% \section{The Bibliographic Coding}
%
%    \begin{macrocode}
%<*!options&!driver&!bblbst>
%<*!tail>
 %   For use with BibTeX version 0.99a or later
 % -------------------------------------------------------------------
%<*(!nmft&(nmft-it|nmft-sc|nmft-bf|nmft-def))|(!lab&(lab-it|lab-bf|lab-sc|lab-def))>
 %  WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
 %  The input dbj file contains one of the options
%<nmft-it|nmft-sc|nmft-bf|nmft-def> %        nmft-it, nmft-bf, nmft-sc, or nmft-def
%<lab-it|lab-sc|lab-bf|lab-def> %        lab-it, lab-bf, lab-sc, or lab-def
 %  without the corresponding general option(s):
%<nmft-it|nmft-sc|nmft-bf|nmft-def> %              nmft
%<lab-it|lab-sc|lab-bf|lab-def> %              lab
 %  (You may be using an older dbj with a newer version of merlin.mbs)
 %  Please edit your dbj file to add the general option(s) and reprocess.
 %
%</(!nmft&(nmft-it|nmft-sc|nmft-bf|nmft-def))|(!lab&(lab-it|lab-bf|lab-sc|lab-def))>
%<*!exlang>
%<!babel> % This bibliography style file is intended for texts in ENGLISH
%<*babel>
 % This bibliography style file requires a file named  babelbst.tex
 %   containing the definitions of word commands like \bbleditor, etc.
%</babel>
%</!exlang>
%<*exlang>
 % This bibliography style file is intended for texts in
%<bahasa> %   BAHASA
%<brazilian> %   BRAZILIAN
%<catalan> %   CATALAN
%<croatian> %   CROATIAN
%<czech> %   CZECH
%<danish> %   DANISH
%<dansk> %   DANSK
%<dutch> %   DUTCH
%<english> %   ENGLISH
%<esperanto> %   ESPERANTO
%<finnish> %   FINNISH
%<french> %   FRENCH
%<galacian> %   GALACIAN
%<german> %   GERMAN
%<hungarian> %   HUNGARIAN
%<italian> %   ITALIAN
%<norwegian> %   NORWEGIAN
%<norsk> %   NORWEGIAN
%<polski> %   POLISH
%<polish> %   POLISH
%<portuguese> %   PORTUGUESE
%<romanian> %   ROMANIAN
%<russian> %   RUSSIAN
%<slovak> %   SLOVAK
%<slovenian> %   SLOVENIAN
%<slovene> %   SLOVENIAN
%<spanish> %   SPANISH
%<swedish> %   SWEDISH
%<turkish> %   TURKISH
%</exlang>
%<*!html>
%<*ay>
 % This is an author-year citation style bibliography. As such, it is
 % non-standard LaTeX, and requires a special package file to function properly.
 % Such a package is    natbib.sty   by Patrick W. Daly
%<*alk>
 % or:                  apalike.sty  by Oren Patashnik
 % The form of the \bibitem entries is
 %   \bibitem[Jones et al., 1990]{key}...
%</alk>
%<*!(har|ast|alk|cay|nmd|cn)>
 % The form of the \bibitem entries is
 %   \bibitem[Jones et al.(1990)]{key}...
%<nat> %   \bibitem[Jones et al.(1990)Jones, Baker, and Smith]{key}...
 % The essential feature is that the label (the part in brackets) consists
 % of the author names, as they should appear in the citation, with the year
 % in parentheses following. There must be no space before the opening
 % parenthesis!
%<nat> % With natbib v5.3, a full list of authors may also follow the year.
 % In natbib.sty, it is possible to define the type of enclosures that is
 % really wanted (brackets or parentheses), but in either case, there must
 % be parentheses in the label.
 % The \cite command functions as follows:
 %   \citet{key} ==>>                Jones et al. (1990)
%<nat> %   \citet*{key} ==>>               Jones, Baker, and Smith (1990)
 %   \citep{key} ==>>                (Jones et al., 1990)
%<nat> %   \citep*{key} ==>>               (Jones, Baker, and Smith, 1990)
 %   \citep[chap. 2]{key} ==>>       (Jones et al., 1990, chap. 2)
 %   \citep[e.g.][]{key} ==>>        (e.g. Jones et al., 1990)
 %   \citep[e.g.][p. 32]{key} ==>>   (e.g. Jones et al., 1990, p. 32)
 %   \citeauthor{key} ==>>           Jones et al.
%<nat> %   \citeauthor*{key} ==>>          Jones, Baker, and Smith
 %   \citeyear{key} ==>>             1990
%</!(har|ast|alk|cay|nmd|cn)>
%<*har>
 % or:                  harvard.sty  by Peter Williams and Thorsten Schnier
%<harnm> % (needs natbib v5.3  or  harvard v2.0.3)
 % The form of the bibitem entries is
 %   \harvarditem[Jones et al.]{Jones, Baker, and Smith}{1990}{key}...
%</har>
%<*cay>
 % or:                  chicago.sty
 % The form of the bibitem entries is
 %   \bibitem[\protect\citeauthoryear{Jones, Baker, and Smith}
 %        {Jones et al.}{1990}{key}...
%</cay>
%<*nmd>
 % or:                  named.sty
 % The form of the bibitem entries is
 %   \bibitem[\protect\citeauthoryear{Jones et al.}{1990}]{key}...
%</nmd>
%<*ast>
 % or:                  astron.sty
 % The form of the bibitem entries is
 %   \bibitem[\protect\astroncite{Jones et al.}{1990}]{key}...
%</ast>
%<*cn>
 % or:                  authordate1-4.sty
 % The form of the bibitem entries is
 %   \bibitem[\protect\citename{Jones et al.}1990]{key}...
%</cn>
%</ay>
%<*!ay>
%<*!alph&!cite>
 % This is a numerical citation style, and as such is standard LaTeX.
%</!alph&!cite>
%<*alph>
 % This is a labelled citation style similar to the standard alpha.bst,
 %   where labels are of the form Dal90 or DBK89.
%</alph>
%<*cite&!alph>
 % This is a special pseudo-numerical bibliography style, intended to be
 %   used to list all the entries in a bib database
%</cite&!alph>
 % It requires no extra package to interface to the main text.
 % The form of the \bibitem entries is
%<!alph&!cite> %   \bibitem{key}...
%<alph> %   \bibitem[label]{key}...
%<!alph&cite> %   \bibitem[key]{key}...
%<*!cite|alph>
 % Usage of \cite is as follows:
%<*!alph&!cite>
 %   \cite{key} ==>>          [#]
 %   \cite[chap. 2]{key} ==>> [#, chap. 2]
 % where # is a number determined by the ordering in the reference list.
%</!alph&!cite>
%<*alph>
 %   \cite{key} ==>>          [label]
 %   \cite[chap. 2]{key} ==>> [label, chap. 2]
 % The order in the reference list is by label.
%</alph>
%<*seq-no&!alph>
 % The order in the reference list is that by which the works were originally
 %   cited in the text, or that in the database.
%</seq-no&!alph>
%<*!seq-no&!alph>
 % The order in the reference list is alphabetical by authors.
%</!seq-no&!alph>
%</!cite|alph>
%</!ay>
%</!html>
%<*html>
 % This bibliographic style file produces HTML output instead of LaTeX.
 % The LaTeX special characters are not translated, so that the output
 % (which has the .bbl ending still) will have to be further massaged,
 % and renamed with .html or .htm. The title and heading may also need
 % to be revised.
 %
%<htlist&!htdes> % The output is a numbered list.
%<htdes> % The output is an unnumbered list with the keys printed
%<htdes> % before each entry.
%<!htlist&!htdes> % The output is lists each entry as one paragraph.
%</html>
 % -------------------------------------------------------------------

%    \end{macrocode}
%
% \begin{macro}{`ENTRY'}
%  The new \texttt{harvard.sty} of \LaTeXe{} includes an entry URL, or
%  rather it is included in the new \texttt{.bst} files for it. Add it
%  here too, but only for option \texttt{harnm}.
%
% Books normally have an ISBN number.
% This entry is (optionally) included, modelled after that in
% \texttt{xbtxbst.doc}.
%    \begin{macrocode}
ENTRY
  { address
%<annote>    annote
%<eprint>    archive
    author
    booktitle
    chapter
%<revdata>    collaboration
%<doi|url-doi>    doi
    edition
    editor
    eid
%<eprint>    eprint
    howpublished
    institution
%<isbn>    isbn
%<issn>    issn
    journal
    key
%<lang>    language
    month
    note
    number
%<revdata>    numpages
    organization
    pages
    publisher
    school
    series
    title
    type
%<url|harnm|revdata>    url
    volume
    year
  }
  {}
%<!ay&!alph>  { label }
%<!ay&alph>  { label extra.label sort.label }
%<ay>  { label extra.label sort.label short.list }
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
INTEGERS { output.state before.all mid.sentence after.sentence after.block }
%    \end{macrocode}
%
% \begin{macro}{`init.state.consts'}
%    \begin{macrocode}
FUNCTION {init.state.consts}
{ #0 'before.all :=
  #1 'mid.sentence :=
  #2 'after.sentence :=
  #3 'after.block :=
}
%    \end{macrocode}
% \end{macro}
%
% |s| and |t| are general-purpose scratch registers whose value does not persist
% past the end of a function. They also do not appear to be used to communicate
% between functions or to be clobbered within a sub-function call. Hopefully.
%    \begin{macrocode}
STRINGS { s t}
%    \end{macrocode}
%
% \begin{macro}{`output.nonnull'}
%    \begin{macrocode}
FUNCTION {output.nonnull}
{ 's :=
  output.state mid.sentence =
%<!blk-com|(!com-semi&!com-blank)>    { ", " * write$ }
%<blk-com&com-semi>    { "; " * write$ }
%<blk-com&!com-semi&com-blank>    { " " * write$ }
    { output.state after.block =
        { add.period$ write$
          newline$
%<!html>          "\newblock " write$
        }
        { output.state before.all =
            'write$
            { add.period$ " " * write$ }
          if$
        }
      if$
      mid.sentence 'output.state :=
    }
  if$
  s
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`output'}
%    \begin{macrocode}
FUNCTION {output}
{ duplicate$ empty$
    'pop$
    'output.nonnull
  if$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`output.check'}
%    \begin{macrocode}
FUNCTION {output.check}
{ 't :=
  duplicate$ empty$
    { pop$ "empty " t * " in " * cite$ * warning$ }
    'output.nonnull
  if$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`fin.entry'}
% I have often been asked to add an annotation function. This suggestion is
% from Soren Dayton; it inputs a file with the same name as the cite key, or
% uses the text in the \texttt{annote} field. It will only work with \LaTeXe.
%    \begin{macrocode}
FUNCTION {fin.entry}
%<*!fin-bare>
{ add.period$
  write$
%</!fin-bare>
%<*fin-bare>
{ duplicate$ empty$
    'pop$
    'write$
  if$
%</fin-bare>
%<html&htdes>  "</dd>" write$
%<html&!htdes&htlist>  "</li>" write$
%<html&!htdes&!htlist>  "</p>" write$
  newline$
%<*annote>
%<*!html>
  annote missing$
    { "\bibAnnoteFile{" cite$ * "}" * write$ newline$ }
    { "\bibAnnote{" cite$ * "}{" * annote * "}" * write$ newline$
    }
  if$
%</!html>
%<*html>
  "<blockquote><strong>Key:</strong> "
  cite$ * write$
  annote missing$
    { newline$ }
    { "<br><strong>Annotation:</strong>" write$ newline$
      annote write$ newline$
    }
  if$
  "</blockquote>" write$ newline$
%</html>
%</annote>
}

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`new.block'}
%    \begin{macrocode}
FUNCTION {new.block}
{ output.state before.all =
    'skip$
    { after.block 'output.state := }
  if$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`new.sentence'}
%    \begin{macrocode}
FUNCTION {new.sentence}
{ output.state after.block =
    'skip$
    { output.state before.all =
        'skip$
        { after.sentence 'output.state := }
      if$
    }
  if$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`add.blank'}
% When text is printed with \texttt{output} or
% \texttt{output.check}, the \texttt{output.state} is set such that
% a comma will precede the next output text. For special effects, we want to
% suppress this comma, inserting a blank instead. Hence the
% \texttt{output.state} is changed to \texttt{before.all}, meaning no
% punctuation is to be inserted.
%    \begin{macrocode}
FUNCTION {add.blank}
{  " " * before.all 'output.state :=
}

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`add.colon'}
%    \begin{macrocode}
%<*au-col|tit-col>
FUNCTION {add.colon}
{ duplicate$ empty$
    'skip$
    { ":" * add.blank }
  if$
}

%</au-col|tit-col>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`no.blank.or.punct'}
% Another frill is to suppresss both blanks and punctuation. The |\hspace|
% permits a line break at this point.
%    \begin{macrocode}
%<*yrpp-xsp>
FUNCTION {no.blank.or.punct}
%<*!html>
{  "\hspace{0pt}" * before.all 'output.state :=
}
%</!html>
%<html>{  before.all 'output.state := }

%</yrpp-xsp>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`date.block'}
% The \texttt{date.block} function is used for special punctuating effects
% after the date.
%    \begin{macrocode}
FUNCTION {date.block}
{
%<*!yrp-x>
%<yrp-col>  ":" *
%<*!yrp-col>
%<yrp-semi>  ";" *
%<*!yrp-semi>
%<!blk-com&!blk-tit&!blk-tita>  new.block
%<(blk-com|blk-tit|blk-tita)&!yrp-per>  skip$
%<(blk-com|blk-tit|blk-tita)&yrp-per>  new.sentence
%</!yrp-semi>
%</!yrp-col>
%</!yrp-x>
%<*yrp-x|yrp-col|yrp-semi>
%<!yrpp-xsp>  add.blank
%<yrpp-xsp>  no.blank.or.punct
%</yrp-x|yrp-col|yrp-semi>
}

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`not'}
%    \begin{macrocode}
FUNCTION {not}
{   { #0 }
    { #1 }
  if$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`and'}
%    \begin{macrocode}
FUNCTION {and}
{   'skip$
    { pop$ #0 }
  if$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`or'}
%    \begin{macrocode}
FUNCTION {or}
{   { pop$ #1 }
    'skip$
  if$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`non.stop'}
% This function (my invention) tests if the last character in the string
% on the stack is \texttt{. ! ?} by using \texttt{add.period\$}. It is to
% be used for conditional italic correction or adding commas.
%    \begin{macrocode}
%<*!tit-it&tit-qq>
FUNCTION {non.stop}
{ duplicate$
   "}" * add.period$
   #-1 #1 substring$ "." =
}

%</!tit-it&tit-qq>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`remove.dots'}
% This macro removes any periods from the string on the stack. To be used
% for undotting journal names, months, and juniors. Previously
% \texttt{purify\$} was used for this, but that removes more than just
% dots.
%
% May 2007, Joseph A. Wright (Morning Star, UK) contributed a revision to allow
% the dot accent |\.| to be retained.
%    \begin{macrocode}
%<*nm-rv|nm-rvx|nm-rvcx|mth-bare|jxper>
STRINGS {z}

FUNCTION {remove.dots}
{ 'z :=
   ""
   { z empty$ not }
   { z #1 #2 substring$
     duplicate$ "\." =
       { z #3 global.max$ substring$ 'z :=  * }
       { pop$
         z #1 #1 substring$
         z #2 global.max$ substring$ 'z :=
         duplicate$ "." = 'pop$
           { * }
         if$
       }
     if$
   }
   while$
}
%</nm-rv|nm-rvx|nm-rvcx|mth-bare|jxper>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`new.block.checka'}
%    \begin{macrocode}
%<*!ay>
FUNCTION {new.block.checka}
{ empty$
    'skip$
    'new.block
  if$
}
%</!ay>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`new.block.checkb'}
%    \begin{macrocode}
FUNCTION {new.block.checkb}
{ empty$
  swap$ empty$
  and
    'skip$
    'new.block
  if$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`new.sentence.checka'}
%    \begin{macrocode}
%<*!ay>
FUNCTION {new.sentence.checka}
{ empty$
    'skip$
    'new.sentence
  if$
}
%</!ay>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`new.sentence.checkb'}
%    \begin{macrocode}
%<*!ay>
FUNCTION {new.sentence.checkb}
{ empty$
  swap$ empty$
  and
    'skip$
    'new.sentence
  if$
}
%</!ay>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`field.or.null'}
%    \begin{macrocode}
FUNCTION {field.or.null}
{ duplicate$ empty$
    { pop$ "" }
    'skip$
  if$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`emphasize'}
% Emphasis can be either italic or the alternating font. The font command
% may be NFSS or regular \LaTeX~2.09 declarations.
%    \begin{macrocode}
FUNCTION {emphasize}
%<*!em-x>
{ duplicate$ empty$
    { pop$ "" }
%<html>    { "<i>" swap$ * "</i>" * }
%<*!html>
%<em-ul>    { "\uline{" swap$ * "}" * }
%<*!em-ul>
%<*!nfss>
%<!em-it>    { "{\em " swap$ * "\/}" * }
%<em-it>    { "{\it " swap$ * "\/}" * }
%</!nfss>
%<*nfss>
%<!em-it>    { "\emph{" swap$ * "}" * }
%<em-it>    { "\textit{" swap$ * "}" * }
%</nfss>
%</!em-ul>
%</!html>
  if$
}
%</!em-x>
%<em-x>{ skip$ }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`bolden'}
% The bold font command may be NFSS or the regular \LaTeX~2.09 declaration.
%    \begin{macrocode}
%<*nmft-bf|vol-bf|vol-2bf|lab-bf|dtbf|pres-bf>
FUNCTION {bolden}
{ duplicate$ empty$
    { pop$ "" }
%<html>    { "<b>" swap$ * "</b>" * }
%<*!html>
%<!nfss>    { "{\bf " swap$ * "}" * }
%<nfss>    { "\textbf{" swap$ * "}" * }
%</!html>
  if$
}
%</nmft-bf|vol-bf|vol-2bf|lab-bf|dtbf|pres-bf>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`scaps'}
% To put text into small caps.
%    \begin{macrocode}
%<*lab-sc|nmft-sc|pres-sc>
FUNCTION {scaps}
{ duplicate$ empty$
    { pop$ "" }
%<html>    { skip$ }
%<*!html>
%<!nfss>    { "{\sc " swap$ * "}" * }
%<nfss>    { "\textsc{" swap$ * "}" * }
%</!html>
  if$
}
%</lab-sc|nmft-sc|pres-sc>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`bib.name.font'}
% \begin{macro}{`bib.fname.font'}
% \begin{macro}{`cite.name.font'}
% Define functions for formatting the author/editor names, one for the
% surnames (\texttt{bib.name.font}) and one for the first names
% (\texttt{bib.fname.font}). These could be identical, or the latter is
% deactivated if first names are not to be formatted, only the last names.
%
% For citations, we have \texttt{cite.name.font}. Here only surnames appear.
%
% It is also possible to have a user-defined font command for each, which the
% user must define in his work. These are |\bibnamefont{}| and |\bibfnamefont{}|,
% and some defaults are provided that simply repeat the arguments. Two commands
% are needed if \texttt{nmft-def} and \texttt{fnm-def} are both given.
%
% If neither \texttt{fnm-def} nor \texttt{fnm-rm} are given, then the first names
% are formatted the same as the surnames.
%    \begin{macrocode}
%<*nmft>
FUNCTION {bib.name.font}
%<nmft-it>{ emphasize }
%<!nmft-it&nmft-bf>{ bolden }
%<!nmft-it&!nmft-bf&nmft-sc>{ scaps }
%<*!nmft-it&!nmft-bf&!nmft-sc&nmft-def>
{ duplicate$ empty$
  { pop$ "" }
%<!html>  { "\bibnamefont{" swap$ * "}" * }
%<html>  { skip$ }
  if$
}
%</!nmft-it&!nmft-bf&!nmft-sc&nmft-def>
FUNCTION {bib.fname.font}
%<!fnm-rm&!fnm-def>{ bib.name.font }
%<fnm-rm>{ skip$ }
%<*!fnm-rm&fnm-def>
{ duplicate$ empty$
  { pop$ "" }
%<!html>  { "\bibfnamefont{" swap$ * "}" * }
%<html>  { skip$ }
  if$
}
%</!fnm-rm&fnm-def>
%</nmft>
%    \end{macrocode}
%
%    \begin{macrocode}
%<*lab>
FUNCTION {cite.name.font}
%<lab-it>{ emphasize }
%<!lab-it&lab-bf>{ bolden }
%<!lab-it&!lab-bf&lab-sc>{ scaps }
%<*!lab-it&!lab-bf&!lab-sc&lab-def>
{ duplicate$ empty$
  { pop$ "" }
%<!html>  { "\citenamefont{" swap$ * "}" * }
%<html>  { skip$ }
  if$
}
%</!lab-it&!lab-bf&!lab-sc&lab-def>
%</lab>
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{`tie.or.space.prefix'}
% The function \texttt{tie.or.space.prefix} determines whether
% the top item on the stack requires a tie character and
% slips that (or a space character if not) ahead of it.
% At this point a font switch or other function can be applied to
% the top item on the stack, and the appropriate space found
% just ahead of it on the stack.
%
% The sequence \texttt{tie.or.space.prefix} \texttt{*} \texttt{*} is a common idiom
% for joining the top two stack objects with a tie or space
% depending on the length of the top object.
%
% Another idiom is to apply \texttt{tie.or.space.prefix}, apply a font switch,
% and then swap and join. In this case the tie or space follows the object.
%    \begin{macrocode}
FUNCTION {tie.or.space.prefix}
{ duplicate$ text.length$ #3 <
    { "~" }
    { " " }
  if$
  swap$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`capitalize'}
% Capitalizing is easy for regular languages, but for \texttt{babel},
% some trickery stuff is needed; definitions of |\capitalize| and
% |\Capitalize| are written to the \texttt{.bbl} file.
%    \begin{macrocode}

FUNCTION {capitalize}
%<!babel>{ "u" change.case$ "t" change.case$ }
%<babel>{ "\capitalize" swap$ * }

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`space.word'}
% The function \texttt{space.word} adds a space before and after the word or
% words currently on the stack. This was added for the \texttt{bbl.}$nnn$
% functions, that contain only a word without spacing, but replace explicit
% text in the originals that were spaced out. Its seems more flexible to
% define the word functions to be without spacing.
%    \begin{macrocode}
FUNCTION {space.word}
{ " " swap$ * " " * }
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
 % Here are the language-specific definitions for explicit words.
 % Each function has a name bbl.xxx where xxx is the English word.
%    \end{macrocode}
%
%    \begin{macrocode}
%<*!exlang>
%    \end{macrocode}
%
% \begin{macro}{`bbl.xxx'}
% These are the default English words. There is no default language
% option: one of \texttt{english} or \texttt{babel} must be given.
%    \begin{macrocode}
%<*!babel>
 % The language selected here is ENGLISH
FUNCTION {bbl.and}
%<!varand|html>{ "and"}
%<varand&!html>{ "\protect\BIBand{}"}

FUNCTION {bbl.etal}
{ "et~al." }

FUNCTION {bbl.editors}
%<!ed>{ "editors" }
%<ed>{ "eds." }

FUNCTION {bbl.editor}
%<!ed>{ "editor" }
%<ed>{ "ed." }

FUNCTION {bbl.edby}
{ "edited by" }

FUNCTION {bbl.edition}
%<!abr>{ "edition" }
%<abr&!ednx>{ "edn." }
%<abr&ednx>{ "ed." }

FUNCTION {bbl.volume}
%<!abr>{ "volume" }
%<abr>{ "vol." }

FUNCTION {bbl.of}
{ "of" }

FUNCTION {bbl.number}
%<!abr>{ "number" }
%<abr>{ "no." }

FUNCTION {bbl.nr}
{ "no." }

FUNCTION {bbl.in}
{ "in" }

FUNCTION {bbl.pages}
%<!pp&!ppx>{ "pages" }
%<pp>{ "pp." }
%<!pp&ppx>{ "" }

FUNCTION {bbl.page}
%<!pp&!ppx>{ "page" }
%<pp>{ "p." }
%<!pp&ppx>{ "" }

%<*revdata>
FUNCTION {bbl.eidpp}
{ "pages" }

%</revdata>
FUNCTION {bbl.chapter}
%<!abr>{ "chapter" }
%<abr>{ "chap." }

FUNCTION {bbl.techrep}
%<!abr>{ "Technical Report" }
%<abr>{ "Tech. Rep." }

FUNCTION {bbl.mthesis}
{ "Master's thesis" }

FUNCTION {bbl.phdthesis}
{ "Ph.D. thesis" }

%<*!xedn>
FUNCTION {bbl.first}
%<!ord>{ "First" }
%<ord>{ "1st" }

FUNCTION {bbl.second}
%<!ord>{ "Second" }
%<ord>{ "2nd" }

FUNCTION {bbl.third}
%<!ord>{ "Third" }
%<ord>{ "3rd" }

FUNCTION {bbl.fourth}
%<!ord>{ "Fourth" }
%<ord>{ "4th" }

FUNCTION {bbl.fifth}
%<!ord>{ "Fifth" }
%<ord>{ "5th" }

FUNCTION {bbl.st}
{ "st" }

FUNCTION {bbl.nd}
{ "nd" }

FUNCTION {bbl.rd}
{ "rd" }

FUNCTION {bbl.th}
{ "th" }

%</!xedn>
%<*!abr>
MACRO {jan} {"January"}

MACRO {feb} {"February"}

MACRO {mar} {"March"}

MACRO {apr} {"April"}

MACRO {may} {"May"}

MACRO {jun} {"June"}

MACRO {jul} {"July"}

MACRO {aug} {"August"}

MACRO {sep} {"September"}

MACRO {oct} {"October"}

MACRO {nov} {"November"}

MACRO {dec} {"December"}

%</!abr>
%<*abr>
MACRO {jan} {"Jan."}

MACRO {feb} {"Feb."}

MACRO {mar} {"Mar."}

MACRO {apr} {"Apr."}

MACRO {may} {"May"}

MACRO {jun} {"Jun."}

MACRO {jul} {"Jul."}

MACRO {aug} {"Aug."}

MACRO {sep} {"Sep."}

MACRO {oct} {"Oct."}

MACRO {nov} {"Nov."}

MACRO {dec} {"Dec."}

%</abr>
%</!babel>
%    \end{macrocode}
%
% Here are the definitions for \texttt{babel} option, i.e., explicit
% translations are not used, but rather only \LaTeX{} macros that must be
% defined in the file \texttt{babelbst.tex}. This could allow automatic
% language selection.
%    \begin{macrocode}
%<*babel>
 % The BABEL language selection is made here; definitions in babelbst.tex.
FUNCTION {bbl.and}
{ "\bbland{}"}

FUNCTION {bbl.etal}
{ "\bbletal{}"}

FUNCTION {bbl.editors}
%<!ed>{ "\bbleditors{}" }
%<ed>{ "\bbleds{}" }

FUNCTION {bbl.editor}
%<!ed>{ "\bbleditor{}" }
%<ed>{ "\bbled{}" }

FUNCTION {bbl.edby}
{ "\bbledby{}" }

FUNCTION {bbl.edition}
%<!abr>{ "\bbledition{}" }
%<abr>{ "\bbledn{}" }

FUNCTION {bbl.volume}
%<!abr>{ "\bblvolume{}" }
%<abr>{ "\bblvol{}" }

FUNCTION {bbl.of}
{ "\bblof{}" }

FUNCTION {bbl.number}
%<!abr>{ "\bblnumber{}" }
%<abr>{ "\bblno{}" }

FUNCTION {bbl.nr}
{ "\bblno{}" }

FUNCTION {bbl.in}
{ "\bblin{}" }

FUNCTION {bbl.pages}
%<!pp&!ppx>{ "\bblpages{}" }
%<pp>{ "\bblpp{}" }
%<!pp&ppx>{ "" }

FUNCTION {bbl.page}
%<!pp&!ppx>{ "\bblpage{}" }
%<pp>{ "\bblp{}" }
%<!pp&ppx>{ "" }

FUNCTION {bbl.chapter}
%<!abr>{ "\bblchapter{}" }
%<abr>{ "\bblchap{}" }

FUNCTION {bbl.techrep}
%<!abr>{ "\bbltechreport{}" }
%<abr>{ "\bbltechrep{}" }

FUNCTION {bbl.mthesis}
{ "\bblmthesis{}" }

FUNCTION {bbl.phdthesis}
{ "\bblphdthesis{}" }

%<*revdata>
FUNCTION {bbl.eidpp}
{ "\bbleidpp{}" }

%</revdata>
%<*!xedn>
FUNCTION {bbl.first}
%<!ord>{ "\bblfirst{}" }
%<ord>{ "\bblfirsto{}" }

FUNCTION {bbl.second}
%<!ord>{ "\bblsecond{}" }
%<ord>{ "\bblsecondo{}" }

FUNCTION {bbl.third}
%<!ord>{ "\bblthird{}" }
%<ord>{ "\bblthirdo{}" }

FUNCTION {bbl.fourth}
%<!ord>{ "\bblfourth{}" }
%<ord>{ "\bblfourtho{}" }

FUNCTION {bbl.fifth}
%<!ord>{ "\bblfifth{}" }
%<ord>{ "\bblfiftho{}" }

FUNCTION {bbl.st}
{ "\bblst{}" }

FUNCTION {bbl.nd}
{ "\bblnd{}" }

FUNCTION {bbl.rd}
{ "\bblrd{}" }

FUNCTION {bbl.th}
{ "\bblth{}" }

%</!xedn>
MACRO {jan} {"\bbljan{}"}

MACRO {feb} {"\bblfeb{}"}

MACRO {mar} {"\bblmar{}"}

MACRO {apr} {"\bblapr{}"}

MACRO {may} {"\bblmay{}"}

MACRO {jun} {"\bbljun{}"}

MACRO {jul} {"\bbljul{}"}

MACRO {aug} {"\bblaug{}"}

MACRO {sep} {"\bblsep{}"}

MACRO {oct} {"\bbloct{}"}

MACRO {nov} {"\bblnov{}"}

MACRO {dec} {"\bbldec{}"}

%</babel>
%    \end{macrocode}
%
% \begin{macro}{`eng.ord'}
% This function adds English endings for ordinals 1, 2, 3. However, if
% the second last digit is 1, then the ending is `th' for all last digits.
% So far, all other languages included do not have this problem, and it is
% sufficient to add the \textsl{th} equivalent. This might change with further
% languages.
%
% This function must be included with \texttt{babel} too, since that includes
% English. This means that the language definition files must also provide
% for |\bblst|, |\bblnd|, and |\bblrd|, setting them all equal to |\bblth|.
%
%    \begin{macrocode}
%<*(english|!exlang)&!xedn>
FUNCTION {eng.ord}
{ duplicate$ "1" swap$ *
  #-2 #1 substring$ "1" =
     { bbl.th * }
     { duplicate$ #-1 #1 substring$
       duplicate$ "1" =
         { pop$ bbl.st * }
         { duplicate$ "2" =
             { pop$ bbl.nd * }
             { "3" =
                 { bbl.rd * }
                 { bbl.th * }
               if$
             }
           if$
          }
       if$
     }
   if$
}

%</(english|!exlang)&!xedn>
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
%</!exlang>
%    \end{macrocode}
%
%    \begin{macrocode}
%</!tail>
%    \end{macrocode}
%
%    \begin{macrocode}
%<*!head>
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
%<*!jabr>
MACRO {acmcs} {"ACM Computing Surveys"}

MACRO {acta} {"Acta Informatica"}

MACRO {cacm} {"Communications of the ACM"}

MACRO {ibmjrd} {"IBM Journal of Research and Development"}

MACRO {ibmsj} {"IBM Systems Journal"}

MACRO {ieeese} {"IEEE Transactions on Software Engineering"}

MACRO {ieeetc} {"IEEE Transactions on Computers"}

MACRO {ieeetcad}
 {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"}

MACRO {ipl} {"Information Processing Letters"}

MACRO {jacm} {"Journal of the ACM"}

MACRO {jcss} {"Journal of Computer and System Sciences"}

MACRO {scp} {"Science of Computer Programming"}

MACRO {sicomp} {"SIAM Journal on Computing"}

MACRO {tocs} {"ACM Transactions on Computer Systems"}

MACRO {tods} {"ACM Transactions on Database Systems"}

MACRO {tog} {"ACM Transactions on Graphics"}

MACRO {toms} {"ACM Transactions on Mathematical Software"}

MACRO {toois} {"ACM Transactions on Office Information Systems"}

MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"}

MACRO {tcs} {"Theoretical Computer Science"}
%</!jabr>
%    \end{macrocode}
%
% Journal abbreviations have been revised from the original Patashnik
% ones with help of Conrado Badenas and the IUA recommendations.
%    \begin{macrocode}
%<*jabr>
MACRO {acmcs} {"ACM Comput. Surv."}

MACRO {acta} {"Acta Inf."}

MACRO {cacm} {"Commun. ACM"}

MACRO {ibmjrd} {"IBM J. Res. Dev."}

MACRO {ibmsj} {"IBM Syst.~J."}

MACRO {ieeese} {"IEEE Trans. Software Eng."}

MACRO {ieeetc} {"IEEE Trans. Comput."}

MACRO {ieeetcad}
 {"IEEE Trans. Comput. Aid. Des."}

MACRO {ipl} {"Inf. Process. Lett."}

MACRO {jacm} {"J.~ACM"}

MACRO {jcss} {"J.~Comput. Syst. Sci."}

MACRO {scp} {"Sci. Comput. Program."}

MACRO {sicomp} {"SIAM J. Comput."}

MACRO {tocs} {"ACM Trans. Comput. Syst."}

MACRO {tods} {"ACM Trans. Database Syst."}

MACRO {tog} {"ACM Trans. Graphic."}

MACRO {toms} {"ACM Trans. Math. Software"}

MACRO {toois} {"ACM Trans. Office Inf. Syst."}

MACRO {toplas} {"ACM Trans. Progr. Lang. Syst."}

MACRO {tcs} {"Theor. Comput. Sci."}

%</jabr>
%    \end{macrocode}
%
% \begin{macro}{`bibinfo.check'}
%   Define functions that encapsulate the argument
% in a \TeX\ macro that allows for further processing when the
% bibliography is processed, or allows for a separate computer
% program to parse the |\bibitem| contents.
%
% The following table summarizes how each of the \btx{} entries
% is accessed for output; these are the points where
% the \texttt{format.bibinfo} or \texttt{bibinfo.check} functions
% are called.
% \subsubsection*{Trapped via \texttt{format.bibinfo}}
% \begin{description}
% \item[  \texttt{author}        ]\texttt{format.names}
% \item[  \texttt{collaboration} ]\texttt{format.authors}
% \item[  \texttt{editor}        ]\texttt{format.editors} (\texttt{book}, \texttt{inbook}, \texttt{proceedings}), \texttt{format.names.ed} (\texttt{format.in.ed.booktitle})
% \item[  \texttt{eid}           ]\texttt{format.journal.eid} (\texttt{format.vol.num.pages}, article) checks the output from \texttt{format.journal.pages}
% \item[  \texttt{isbn}          ]\texttt{format.isbn}
% \item[  \texttt{issn}          ]\texttt{format.issn}
% \item[  \texttt{journal}       ]\texttt{format.article.crossref}, article
% \item[  \texttt{numpages}      ]\texttt{format.journal.eid}
% \item[  \texttt{organization}  ]\texttt{format.organization.address} (\texttt{inproceedings}, \texttt{proceedings}), \texttt{manual}
% \item[  \texttt{pages}         ]\texttt{format.book}.pages (\texttt{book}, \texttt{booklet}), \texttt{format.pages} (\texttt{format.journal.pages}, \texttt{format.chapter.pages}, \texttt{article}, \texttt{inbook}, \texttt{incollection}, \texttt{inproceedings})
% \item[  \texttt{publisher}     ]\texttt{format.publisher.address} (like \texttt{output.check}, \texttt{inproceedings}, \texttt{proceedings})
% \item[  \texttt{title}         ]\texttt{format.title}, \texttt{format.btitle}, \texttt{misc}, \texttt{presort}, \texttt{bib.sort.order}
% \item[  \texttt{volume}        ]\texttt{format.bvolume}, \texttt{format.vol.num.pages}, \texttt{format.book.crossref}
% \item[  \texttt{year}          ]in optional argument of \texttt{\char`\\bibitem}, \texttt{format.date} (as part of date), \texttt{format.year}, \texttt{format.org.or.pub}
% \item[  \texttt{booktitle}     ]\texttt{format.in.ed.booktitle} (\texttt{incollection}, \texttt{inproceedings}), \texttt{format.incoll.inproc.crossref}
% \item[  \texttt{howpublished}  ]\texttt{booklet}, \texttt{misc}
% \item[  \texttt{edition}       ]\texttt{convert.edition.format.edition}
% \item[  \texttt{institution}   ]\texttt{techreport}
% \item[  \texttt{school}        ]\texttt{mastersthesis}, \texttt{phdthesis}
% \item[  \texttt{address}       ]\texttt{format.org.or.pub}, \texttt{booklet}, \texttt{manual}, \texttt{mastersthesis}, \texttt{phdthesis}, \texttt{techreport}
% \item[  \texttt{chapter}       ]\texttt{format.chapter.pages}
% \item[  \texttt{number}        ]\texttt{format.number.series}, \texttt{format.vol.num.pages}, \texttt{format.tr.number}
% \item[  \texttt{series}        ]\texttt{format.bvolume}, \texttt{format.number.series}, \texttt{format.book.crossref}
% \item[  \texttt{type}          ]\texttt{format.chapter.pages}, \texttt{format.thesis.type}, \texttt{format.tr.number}
% \item[  \texttt{month}         ]\texttt{format.date}
% \item[  \texttt{note}          ]\texttt{format.note}
% \item[  \texttt{annote}        ]\texttt{fin.entry}
% \end{description}
%
% \subsubsection*{Encapsulated via \texttt{\char`\\url}}
% \begin{description}
% \item[  \texttt{url}           ]\texttt{format.url} (\texttt{\char`\\harvardurl}, \texttt{\char`\\url}), \texttt{format.url} (\texttt{\char`\\url}), \texttt{format.note} (\texttt{\char`\\url})
% \end{description}
%
% \subsubsection*{Encapsulated via \texttt{\char`\\doi}}
% \begin{description}
% \item[  \texttt{doi}           ]\texttt{format.doi} (\texttt{\char`\\doi})
% \end{description}
%
% \subsubsection*{Encapsulated via \texttt{\char`\\eprint}}
% \begin{description}
% \item[  \texttt{eprint}        ]\texttt{format.eprint}
% \item[  \texttt{archive}       ]\texttt{format.eprint}
% \end{description}
%
% \subsubsection*{Not encapsulated:}
% \begin{description}
% \item[  \texttt{key}           ]cite key
% \item[  \texttt{language}      ]operand of \texttt{\char`\\selectlanguage}
% \end{description}
%
% \subsubsection*{\texttt{bibinfo} tag, but not a \btx{} field}
% \begin{description}
% \item[  \texttt{date}          ]\texttt{format.date}
% \end{description}
%
% Provides robust access to fields, checking against \texttt{missing\$}
% and \texttt{empty\$}. A \dtx{} option allows giving
% a warning if either is the case.
%
% If not, it encapsulates the argument in a \TeX\ macro |\bibinfo|.
% The encapsulation is enabled by the \texttt{bibinfo} \dtx{} option:
% if turned off, it simply pops the unneeded object.
%
% \texttt{field} \texttt{string} \texttt{->} \texttt{encapsulated-field}
%
% \texttt{empty} \texttt{string} \texttt{->} \texttt{empty}
% Side effect: warning.
%    \begin{macrocode}
FUNCTION {bibinfo.check}
{ swap$
  duplicate$ missing$
    {
%<bibinfo.warning>      swap$ "missing " swap$ * " in " * cite$ * warning$ pop$
%<!bibinfo.warning>      pop$ pop$
      ""
    }
    { duplicate$ empty$
        {
%<bibinfo.warning>          swap$ "empty " swap$ * " in " * cite$ * warning$
%<!bibinfo.warning>          swap$ pop$
        }
        { swap$
%<bibinfo>          "\bibinfo{" swap$ * "}{" * swap$ * "}" *
%<!bibinfo>          pop$
        }
      if$
    }
  if$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`bibinfo.warn'}
% Replaces \texttt{output.check}
% with \texttt{bibinfo.warn} followed by \texttt{output}.
%
% \texttt{field} \texttt{string} \texttt{->} \texttt{encapsulated-field}
%
% \texttt{empty} \texttt{string} \texttt{->} \texttt{empty}
%
% Side effect: warning if the field is empty.
% Note: if the \dtx{} option \texttt{bibinfo} is not in effect,
% then no encapsulation is done.
%    \begin{macrocode}
FUNCTION {bibinfo.warn}
{ swap$
  duplicate$ missing$
    {
      swap$ "missing " swap$ * " in " * cite$ * warning$ pop$
      ""
    }
    { duplicate$ empty$
        {
          swap$ "empty " swap$ * " in " * cite$ * warning$
        }
        { swap$
%<bibinfo>          "\bibinfo{" swap$ * "}{" * swap$ * "}" *
%<!bibinfo>          pop$
        }
      if$
    }
  if$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.eprint'}
% The access function for the \texttt{eprint} field.
%
% If the \texttt{bibinfo} \dtx{} option is selected, then this function
% encapsulates the argument in a \TeX\ macro |\eprint|.
%
% \texttt{->} \texttt{encapsulated-URL}
%    \begin{macrocode}
%<*eprint>
FUNCTION {format.eprint}
{ eprint duplicate$ empty$
    'skip$
    { "\eprint"
      archive empty$
        'skip$
        { "[" * archive * "]" * }
      if$
      "{" * swap$ * "}" *
    }
  if$
}
%</eprint>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`write.url'}
% This function taken over from \texttt{agsm.sty}, the main \texttt{harvard}
% bib style. For non-Harvard styles that want to add the URL on a new line
% after the reference, use this function too, but defined slightly
% differently.
%    \begin{macrocode}
%<*(harnm|url-nl)&!revdata>
FUNCTION {write.url}
%<*!html>
{
%<*url-doi&url>
  doi empty$
    { url }
    { "http://dx.doi.org/" doi * }
  if$
%</url-doi&url>
%<!url-doi|!url>  url
  duplicate$ empty$
    { pop$ }
%<harnm>    { "\newline\harvardurl{" swap$ * "}" * write$ newline$ }
%<!harnm&url-nl>    { "\newline\urlprefix\url{" swap$ * "}" * write$ newline$ }
  if$
}
%</!html>
%<*html>
{
%<*url-doi&url>
  doi empty$
    { url }
    { "http://dx.doi.org/" doi * }
  if$
%</url-doi&url>
%<!url-doi|!url>  url
  duplicate$ empty$
    { pop$ }
    {  duplicate$ "<br><a href=" quote$ * swap$ * quote$
      * ">" * swap$ * "</a>" *  write$ newline$ }
  if$
}
%</html>

%</(harnm|url-nl)&!revdata>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.url'}
% This function is reworked for \texttt{\filename} to provide a
% cleaner URL for DOIs. The definition of \cmd{\urldoi} is written in
% the \texttt{.bbl} file by the function \texttt{begin.bib}. When the
% package \pkg{hyperref} is loaded, the \meta{doi} is a hyperlink to
% \texttt{https://doi.org/\meta{doi}}.
%    \begin{macrocode}
%<*(url-blk&!harnm)|revdata>
FUNCTION {format.url}
{
%<url-doi&url>  doi empty$
%<url-doi&url>    {
      url
      duplicate$ empty$
        { pop$ "" }
%<!html>        { "\urlprefix\url{" swap$ * "}" * }
%<html>        {
%<html>          duplicate$ "<a href=" quote$ * swap$ * quote$ *
%<html>            ">" * swap$ * "</a>" *
%<html>        }
      if$
%<*url-doi&url>
    }
    {
      doi
%<!html>      "\doiprefix\urldoi{" swap$ * "}" *
%<html>      duplicate$ "doi:<a href=" quote$ * "https://doi.org/" *
%<html>        swap$ * quote$ * ">" * swap$ * "</a>" *
    }
  if$
%</url-doi&url>
}

%</(url-blk&!harnm)|revdata>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`check.speaker'}
% The \texttt{presentation} type uses the \texttt{key} entry to indicate which
% author is the speaker, as the sequence number in the author list. The speaker's
% name is put into a different font, depending on the extra option. If no font
% is specified, all names are the same.
%    \begin{macrocode}
INTEGERS { nameptr namesleft numnames }

%<*pres-bf|pres-it|pres-sc>
FUNCTION {check.speaker}
{ key empty$ 'skip$
  { key nameptr int.to.str$ =
    {
%<pres-bf>      bolden
%<pres-it&!pres-bf>      emphasize
%<pres-sc&!pres-it&!pres-bf>      scaps
    }
      'skip$
    if$
  }
  if$
}

%</pres-bf|pres-it|pres-sc>
%    \end{macrocode}
% \end{macro}

% \begin{macro}{`format.names'}
% The \texttt{harvard} package now (version 2.0.3, for \LaTeXe) uses
% |\harvardand| in place of the word \textsl{and} so that it can be changed
% at run time. This is allowed for with the option \texttt{harnm}, which
% need not be used only with the \texttt{har} option.
% This seems like a useless feature for \texttt{.bst} files made from
% this multilanguage source. However, it is included anyway, which means
% if \texttt{harnm} option selected, one must redefine |\harvardand|
% in the document for the language being used.
%
% The location of the junior part for reversed name is not obvious. Prior
% to version 4.0, I always had it attached to the last name, as
% Smith, Jr, John, put it probably is better as Smith, John, Jr. For the
% AGU \texttt{nm-rev1} I always did it this way, probably because I had a
% good AGU example to follow. Dilemma: do I just change them all or add an
% option to do it? The option will maintain consistency with older
% versions, but this could also be considered a bug fix rather than a new
% feature. Solution: use the option, since I have found other \texttt{.bst}
% files from Beebe and Harvard that put junior between surname and first
% name.
%
% |bibinfo| is a variable used to store a string telling it whether the
% names being formatted are authors or editors, since this function is called
% for both purposes. Every call to this function must push the string onto the stack
% just before the call.
%    \begin{macrocode}
STRINGS  { bibinfo}

%    \end{macrocode}
%
% Stack note: if the names argument is a non-nil list, this function returns
% one object on the stack, the formatted list of names.
%
% \texttt{names`string} \texttt{bibinfo`string} \texttt{->} \texttt{author-list`string}
%    \begin{macrocode}
FUNCTION {format.names}
{ 'bibinfo :=
  duplicate$ empty$ 'skip$ {
  's :=
  "" 't :=
  #1 'nameptr :=
  s num.names$ 'numnames :=
  numnames 'namesleft :=
    { namesleft #0 > }
    { s nameptr
%    \end{macrocode}
% Here is the author formatting when the names are not set in any special
% font, or when the entire name set in a single special font.
%    \begin{macrocode}
%<*!(nmft&(fnm-rm|fnm-def))>
%<*!nm-rev1&!nm-revv1>
%<nm-init>      "{f.~}{vv~}{ll}{, jj}"
%<*!nm-init>
%<nm-rev&!jnrlst>      "{vv~}{ll}{, jj}{, f.}"
%<nm-rev&jnrlst>      "{vv~}{ll}{, f.}{, jj}"
%<*!nm-rev>
%<nm-rv&!jnrlst>      "{vv~}{ll}{ jj}{ f{~}}"
%<nm-rv&jnrlst>      "{vv~}{ll}{ f{~}}{ jj}"
%<*!nm-rv>
%<nm-rvx&!jnrlst>      "{vv~}{ll}{ jj}{ f{}}"
%<nm-rvx&jnrlst>      "{vv~}{ll}{ f{}}{ jj}"
%<*!nm-rvx>
%<nm-rvcx&!jnrlst>      "{vv~}{ll}{, jj}{, f{}}"
%<nm-rvcx&jnrlst>      "{vv~}{ll}{, f{}}{, jj}"
%<*!nm-rvcx>
%<nm-rvv&!jnrlst>      "{vv~}{ll}{ jj}{ f{.}.}"
%<nm-rvv&jnrlst>      "{vv~}{ll}{ f{.}.}{ jj}"
%<*!nm-rvv>
%<nm-rvvc&!jnrlst>      "{vv~}{ll}{, jj}{, f{.}.}"
%<nm-rvvc&jnrlst>      "{vv~}{ll}{, f{.}.}{, jj}"
%<*!nm-rvvc>
%<nm-revf&!jnrlst>      "{vv~}{ll}{, jj}{, ff}"
%<nm-revf&jnrlst>      "{vv~}{ll}{, ff}{, jj}"
%<*!nm-revf>
      "{ff~}{vv~}{ll}{, jj}"
%</!nm-revf>
%</!nm-rvvc>
%</!nm-rvv>
%</!nm-rvcx>
%</!nm-rvx>
%</!nm-rv>
%</!nm-rev>
%</!nm-init>
%</!nm-rev1&!nm-revv1>
%<*nm-rev1>
      duplicate$ #1 >
        { "{f.~}{vv~}{ll}{, jj}" }
%<!jnrlst>        { "{vv~}{ll}{, jj}{, f.}" }
%<jnrlst>        { "{vv~}{ll}{, f.}{, jj}" }
      if$
%</nm-rev1>
%<*!nm-rev1&nm-revv1>
      duplicate$ #1 >
        { "{ff~}{vv~}{ll}{, jj}" }
%<!jnrlst>        { "{vv~}{ll}{, jj}{, ff}" }
%<jnrlst>        { "{vv~}{ll}{, ff}{, jj}" }
      if$
%</!nm-rev1&nm-revv1>
      format.name$
%<nm-rv|nm-rvx>      remove.dots
%<nmft&nmand-rm>      bib.name.font
%</!(nmft&(fnm-rm|fnm-def))>
%    \end{macrocode}
% Here is the author formatting when the first and last names are
% set in (possibly different) special fonts.
%
% The junior part is optionally between the reversed names, or after them.
%    \begin{macrocode}
%<*nmft&(fnm-rm|fnm-def)>
%<*!nm-rev1&!nm-revv1>
%<*nm-init>
      "{f.}" format.name$ duplicate$ empty$ 'skip$
        { tie.or.space.prefix bib.fname.font swap$ * }
      if$
      s nameptr
      "{vv~}{ll}" format.name$ bib.name.font *
      s nameptr
      "{jj}" format.name$ duplicate$ empty$ 'skip$
        { bib.fname.font ", " swap$ * }
      if$
%</nm-init>
%<*!nm-init>
%<*nm-rev>
      "{vv~}{ll}" format.name$ bib.name.font
      s nameptr
%<!jnrlst>      "{jj, }{f.}"
%<jnrlst>      "{f.}{, jj}"
      format.name$ duplicate$ empty$ 'skip$
        { bib.fname.font ", " swap$ * }
      if$
%</nm-rev>
%<*!nm-rev>
%<*nm-rv>
      "{vv~}{ll}" format.name$ bib.name.font
      s nameptr
%<!jnrlst>      "{jj }{f{~}}"
%<jnrlst>      "{f{~}}{ jj}"
      format.name$ duplicate$ empty$ 'skip$
        { remove.dots bib.fname.font " " swap$ * }
      if$
%</nm-rv>
%<*!nm-rv>
%<*nm-rvx>
      "{vv~}{ll}" format.name$ bib.name.font
      s nameptr
%<!jnrlst>      "{jj }{f{}}"
%<jnrlst>      "{f{}}{ jj}"
      format.name$ duplicate$ empty$ 'skip$
        { remove.dots bib.fname.font " " swap$ * }
      if$
%</nm-rvx>
%<*!nm-rvx>
%<*nm-rvcx>
      "{vv~}{ll}" format.name$ bib.name.font
      s nameptr
%<!jnrlst>      "{jj, }{f{}}"
%<jnrlst>      "{f{}}{, jj}"
      format.name$ duplicate$ empty$ 'skip$
        { remove.dots bib.fname.font ", " swap$ * }
      if$
%</nm-rvcx>
%<*!nm-rvcx>
%<*nm-rvv>
      "{vv~}{ll}" format.name$ bib.name.font
      s nameptr
%<!jnrlst>      "{jj }{f{.}.}"
%<jnrlst>      "{f{.}.}{ jj}"
      format.name$ duplicate$ empty$ 'skip$
        { bib.fname.font " " swap$ * }
      if$
%</nm-rvv>
%<*!nm-rvv>
%<*nm-rvvc>
      "{vv~}{ll}" format.name$ bib.name.font
      s nameptr
%<!jnrlst>      "{jj, }{f{.}.}"
%<jnrlst>      "{f{.}.}{, jj}"
      format.name$ duplicate$ empty$ 'skip$
        { bib.fname.font ", " swap$ * }
      if$
%</nm-rvvc>
%<*!nm-rvvc>
%<*nm-revf>
      "{vv~}{ll}" format.name$ bib.name.font
      s nameptr
%<!jnrlst>      "{jj, }{ff}"
%<jnrlst>      "{ff}{, jj}"
      format.name$ duplicate$ empty$ 'skip$
        { bib.fname.font ", " swap$ * }
      if$
%</nm-revf>
%<*!nm-revf>
      "{ff}" format.name$ duplicate$ empty$ 'skip$
        { tie.or.space.prefix bib.fname.font swap$ * }
      if$
      s nameptr
      "{vv~}{ll}" format.name$ bib.name.font *
      s nameptr
      "{jj}" format.name$ duplicate$ empty$ 'skip$
        { bib.fname.font ", " swap$ * }
      if$
%</!nm-revf>
%</!nm-rvvc>
%</!nm-rvv>
%</!nm-rvcx>
%</!nm-rvx>
%</!nm-rv>
%</!nm-rev>
%</!nm-init>
%</!nm-rev1&!nm-revv1>
%<*nm-rev1>
      nameptr #1 >
        { "{f.}" format.name$ duplicate$ empty$ 'skip$
            { tie.or.space.prefix bib.fname.font swap$ * }
          if$
          s nameptr
          "{vv~}{ll}" format.name$ bib.name.font *
          s nameptr
          "{jj}" format.name$ duplicate$ empty$ 'skip$
            { bib.fname.font ", " swap$ * }
          if$
        }
        { "{vv~}{ll}" format.name$ bib.name.font
          s nameptr
%<!jnrlst>          "{jj, }{f.}"
%<jnrlst>          "{f.}{, jj}"
          format.name$ duplicate$ empty$ 'skip$
            { bib.fname.font ", " swap$ * }
          if$
        }
      if$
%</nm-rev1>
%<*!nm-rev1&nm-revv1>
      nameptr #1 >
        { "{ff}" format.name$ duplicate$ empty$ 'skip$
            { tie.or.space.prefix bib.fname.font swap$ * }
          if$
          s nameptr
          "{vv~}{ll}" format.name$ bib.name.font *
          s nameptr
          "{jj}" format.name$ duplicate$ empty$ 'skip$
            { bib.fname.font ", " swap$ * }
          if$
        }
        { "{vv~}{ll}" format.name$ bib.name.font
          s nameptr
%<!jnrlst>          "{jj, }{ff}"
%<jnrlst>          "{ff}{, jj}"
          format.name$ duplicate$ empty$ 'skip$
            { bib.fname.font ", " swap$ * }
          if$
        }
      if$
%</!nm-rev1&nm-revv1>
      *
%</nmft&(fnm-rm|fnm-def)>
      bibinfo bibinfo.check
%<*pres-bf|pres-it|pres-sc>
      type$ "presentation" =
        { check.speaker }
        'skip$
      if$
%</pres-bf|pres-it|pres-sc>
      't :=
      nameptr #1 >
        {
%<*nmlm>
%<m1>          nameptr #1
%<m2>          nameptr #2
%<m3>          nameptr #3
%<m4>          nameptr #4
%<m5>          nameptr #5
%<m6>          nameptr #6
%<m7>          nameptr #7
%<m8>          nameptr #8
%<m9>          nameptr #9
%<m0>          nameptr #0
%<m10>          #10 +
%<m20>          #20 +
%<m30>          #30 +
%<m40>          #40 +
%<m50>          #50 +
%<m60>          #60 +
%<m70>          #70 +
%<m80>          #80 +
%<m90>          #90 +
          #1 + =
%<x1>          numnames #1
%<x2>          numnames #2
%<x3>          numnames #3
%<x4>          numnames #4
%<x5>          numnames #5
%<x6>          numnames #6
%<x7>          numnames #7
%<x8>          numnames #8
%<x9>          numnames #9
%<x0>          numnames #0
%<x10>          #10 +
%<x20>          #20 +
%<x30>          #30 +
%<x40>          #40 +
%<x50>          #50 +
%<x60>          #60 +
%<x70>          #70 +
%<x80>          #80 +
%<x90>          #90 +
          > and
            { "others" 't :=
              #1 'namesleft := }
            'skip$
          if$
%</nmlm>
          namesleft #1 >
%<!aunm-semi&!aunm-sl>            { ", " * t * }
%<aunm-semi>            { "; " * t * }
%<aunm-sl&!aunm-semi>            { "/ " * t * }
            {
              s nameptr "{ll}" format.name$ duplicate$ "others" =
                { 't := }
                { pop$ }
              if$
%<(and-com|xand)&!aunm-semi&!aunm-sl>              "," *
%<(and-com|xand)&aunm-semi>              ";" *
%<(and-com|xand)&aunm-sl&!aunm-semi>              "/" *
%<*!and-xcom&!and-com&!xand>
              numnames #2 >
%<etal-xc>              t "others" = not and
%<!aunm-semi&!aunm-sl>                { "," * }
%<aunm-semi>                { ";" * }
%<aunm-sl&!aunm-semi>                { "/" * }
                'skip$
              if$
%</!and-xcom&!and-com&!xand>
              t "others" =
                {
%<nmft&!nmand-rm&!(fnm-rm|fnm-def)&(etal-it|etal-rm)>                  bib.name.font
%<*!etal-it>
%<nmft&(nmand-rm|(fnm-rm|fnm-def))&!etal-rm>                  " " * bbl.etal bib.name.font *
%<!(nmft&(nmand-rm|(fnm-rm|fnm-def)))|etal-rm>                  " " * bbl.etal *
%</!etal-it>
%<etal-it>                  " " * bbl.etal emphasize *
%<nmft&!nmand-rm&!(fnm-rm|fnm-def)&!(etal-it|etal-rm)>                  bib.name.font
                }
%<*!xand>
                {
%<*!harnm>
%<!amper>                  bbl.and
%<amper>                  "\&"
%</!harnm>
%<harnm>                  "\harvardand{}"
%<nmft&!nmand-rm&(fnm-rm|fnm-def)>                  bib.name.font
                  space.word * t *
                }
%</!xand>
%<xand>                { " " * t * }
              if$
            }
          if$
        }
        't
      if$
      nameptr #1 + 'nameptr :=
      namesleft #1 - 'namesleft :=
    }
  while$
%<*nmft&!nmand-rm&!(fnm-rm|fnm-def)>
  t "others" =
    'skip$
    { bib.name.font }
  if$
%</nmft&!nmand-rm&!(fnm-rm|fnm-def)>
  } if$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.names.ed'}
% When editors are used in place of authors to identify the work, the
% names are always formatted just like authors'. However, in collections,
% where ``edited by'' or ``\emph{names} (editors)'' are given, it is
% normal not to reverse the names, even if the authors' are. The option
% \texttt{ed-rev} sees to it that editor names are always formatted exactly
% like those of authors, being reversed if necessary.
%
% The option \texttt{ed-au} is identical to \texttt{ed-rev}, but is more
% logical. It means editors (in incollections) are formatted exactly like
% authors, with all the font, reversing, and number limitations. This is
% selected automatically with \texttt{nm-init} and \texttt{nm-} default to save
% programming memory.
%
% The option \texttt{nm-revf} in this case acts the same as the default
% when no \texttt{nm-} option given: full names with surname last. Therefore
% it is not necessary to test for it at all, since it, like the default,
% has the lowest priority: any other \texttt{nm-} option clobbers it.
%
% The options \texttt{aunm-semi} and \texttt{aunm-sl} will put a semi-colon or
% slash between editor names, just as for authors, when \texttt{ed-rev} not
% selected, in keeping with the idea that in this case both authors and editors
% are to be formatted the same.
%
% This function either dispatches to \texttt{format.names} or executes code
% which is similar. In the latter case, names are always presented first
% followed by surname (``last name''); name limit processing (\texttt{nmlm}) is not executed;
% and endgame processing differs in being qualified by \texttt{nmfted}.
%
% Stack note: if the names (second) argument is a non-nil list, this function returns
% with one object on the stack, the formatted list of names.
%
% \texttt{names`string} \texttt{bibinfo`string} \texttt{->} \texttt{author-list`string}
%    \begin{macrocode}
FUNCTION {format.names.ed}
{
%<ed-rev|ed-au>  format.names
%<*!ed-rev&!ed-au>
  'bibinfo :=
  duplicate$ empty$ 'skip$ {
  's :=
  "" 't :=
  #1 'nameptr :=
  s num.names$ 'numnames :=
  numnames 'namesleft :=
    { namesleft #0 > }
    { s nameptr
%    \end{macrocode}
% Editor name is handled as a single object, with no separation of first and last name.
%    \begin{macrocode}
%<*!(nmft&nmfted&(fnm-rm|fnm-def))>
%<nm-init|nm-rev|nm-rev1>      "{f.~}{vv~}{ll}{, jj}"
%<*!nm-init&!nm-rev&!nm-rev1>
%<nm-revv1>      "{ff~}{vv~}{ll}{, jj}"
%<*!nm-revv1>
%<nm-rv>      "{f{~}~}{vv~}{ll}{ jj}"
%<*!nm-rv>
%<nm-rvx>      "{f{}~}{vv~}{ll}{ jj}"
%<*!nm-rvx>
%<nm-rvcx>      "{f{}~}{vv~}{ll}{ jj}"
%<*!nm-rvcx>
%<nm-rvv|nm-rvvc>      "{f{.}.~}{vv~}{ll}{ jj}"
%<*!nm-rvv&!nm-rvvc>
      "{ff~}{vv~}{ll}{, jj}"
%</!nm-rvv&!nm-rvvc>
%</!nm-rvcx>
%</!nm-rvx>
%</!nm-rv>
%</!nm-revv1>
%</!nm-init&!nm-rev&!nm-rev1>
      format.name$
%<nm-rv|nm-rvx|nm-rvcx>      remove.dots
%<nmft&nmfted&nmand-rm>    bib.name.font
%</!(nmft&nmfted&(fnm-rm|fnm-def))>
%    \end{macrocode}
% Editor first and last name handled separately.
%    \begin{macrocode}
%<*(nmft&nmfted&(fnm-rm|fnm-def))>
%<*nm-init|nm-rev|nm-rev1>
      "{f.}" format.name$ duplicate$ empty$ 'skip$
        { tie.or.space.prefix bib.fname.font swap$ * }
      if$
      s nameptr
      "{vv~}{ll}" format.name$ bib.name.font *
      s nameptr
      "{jj}" format.name$ duplicate$ empty$ 'skip$
        { bib.fname.font ", " swap$ * }
      if$
%</nm-init|nm-rev|nm-rev1>
%<*!nm-init&!nm-rev&!nm-rev1>
%<*nm-revv1>
      "{ff}" format.name$ duplicate$ empty$ 'skip$
        { tie.or.space.prefix bib.fname.font swap$ * }
      if$
      s nameptr
      "{vv~}{ll}" format.name$ bib.name.font *
      s nameptr
      "{jj}" format.name$ duplicate$ empty$ 'skip$
        { bib.fname.font ", " swap$ * }
      if$
%</nm-revv1>
%<*!nm-revv1>
%<*nm-rv>
      "{f{~}}" format.name$ duplicate$ empty$ 'skip$
        { tie.or.space.prefix bib.fname.font swap$ * }
      if$
      s nameptr
      "{vv~}{ll}" format.name$ bib.name.font *
      s nameptr
      "{jj}" format.name$ duplicate$ empty$ 'skip$
        { remove.dots bib.fname.font " " swap$ * }
      if$
%</nm-rv>
%<*!nm-rv>
%<*nm-rvx|nm-rvcx>
      "{f{}}" format.name$ duplicate$ empty$ 'skip$
        { tie.or.space.prefix bib.fname.font swap$ * }
      if$
      s nameptr
      "{vv~}{ll}" format.name$ bib.name.font *
      s nameptr
      "{jj}" format.name$ duplicate$ empty$ 'skip$
        { remove.dots bib.fname.font " " swap$ * }
      if$
%</nm-rvx|nm-rvcx>
%<*!nm-rvx&!nm-rvcx>
%<*nm-rvv|nm-rvvc>
      "{f{.}.}" format.name$ duplicate$ empty$ 'skip$
        { tie.or.space.prefix bib.fname.font swap$ * }
      if$
      s nameptr
      "{vv~}{ll}" format.name$ bib.name.font *
      s nameptr
      "{jj}" format.name$ duplicate$ empty$ 'skip$
        { bib.fname.font " " swap$ * }
      if$
%</nm-rvv|nm-rvvc>
%<*!nm-rvv&!nm-rvvc>
      "{ff}" format.name$ duplicate$ empty$ 'skip$
        { tie.or.space.prefix bib.fname.font swap$ * }
      if$
      s nameptr
      "{vv~}{ll}" format.name$ bib.name.font *
      s nameptr
      "{jj}" format.name$ duplicate$ empty$ 'skip$
        { bib.fname.font ", " swap$ * }
      if$
%</!nm-rvv&!nm-rvvc>
%</!nm-rvx&!nm-rvcx>
%</!nm-rv>
%</!nm-revv1>
%</!nm-init&!nm-rev&!nm-rev1>
      *
%</(nmft&nmfted&(fnm-rm|fnm-def))>
      bibinfo bibinfo.check
      't :=
      nameptr #1 >
        {
          namesleft #1 >
%<!aunm-semi&!aunm-sl>            { ", " * t * }
%<aunm-semi>            { "; " * t * }
%<aunm-sl&!aunm-semi>            { "/ " * t * }
            {
              s nameptr "{ll}" format.name$ duplicate$ "others" =
                { 't := }
                { pop$ }
              if$
%<(and-com-ed|xand)&!aunm-semi&!aunm-sl>              "," *
%<(and-com-ed|xand)&aunm-semi>              ";" *
%<(and-com-ed|xand)&aunm-sl&!aunm-semi>              "/" *
%<*!and-xcom&!and-com-ed&!xand>
              numnames #2 >
%<etal-xc>              t "others" = not and
%<!aunm-semi&!aunm-sl>                { "," * }
%<aunm-semi>                { ";" * }
%<aunm-sl&!aunm-semi>                { "/" * }
                'skip$
              if$
%</!and-xcom&!and-com-ed&!xand>
              t "others" =
                {

%<nmft&nmfted&!nmand-rm&!(fnm-rm|fnm-def)&(etal-it|etal-rm)>                  bib.name.font
%<*!etal-it>
%<nmft&nmfted&(nmand-rm|(fnm-rm|fnm-def))&!etal-rm>                  " " * bbl.etal bib.name.font *
%<!(nmft&nmfted&(nmand-rm|(fnm-rm|fnm-def)))|etal-rm>                  " " * bbl.etal *
%</!etal-it>
%<etal-it>                  " " * bbl.etal emphasize *
%<nmft&nmfted&!nmand-rm&!(fnm-rm|fnm-def)&!(etal-it|etal-rm)>                  bib.name.font
                }
%<*!xand>
                {
%<*!harnm>
%<!amper>                  bbl.and
%<amper>                  "\&"
%</!harnm>
%<harnm>                  "\harvardand{}"
%<nmft&nmfted&!nmand-rm&(fnm-rm|fnm-def)>                  bib.name.font
                  space.word * t *
                }
%</!xand>
%<xand>                { " " * t * }
              if$
            }
          if$
        }
        't
      if$
      nameptr #1 + 'nameptr :=
      namesleft #1 - 'namesleft :=
    }
  while$
%<*nmft&nmfted&!nmand-rm&!(fnm-rm|fnm-def)>
  t "others" =
    'skip$
    { bib.name.font }
  if$
%</nmft&nmfted&!nmand-rm&!(fnm-rm|fnm-def)>
  } if$
%</!ed-rev&!ed-au>
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.key'}
%    \begin{macrocode}
%<*ay>
FUNCTION {format.key}
{ empty$
    { key field.or.null }
    { "" }
  if$
}

%</ay>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.authors'}
%
%    \begin{macrocode}
FUNCTION {format.authors}
{ author "author" format.names
%<*revdata>
    duplicate$ empty$ 'skip$
    { collaboration "collaboration" bibinfo.check
      duplicate$ empty$ 'skip$
        { " (" swap$ * ")" * }
      if$
      *
    }
  if$
%</revdata>
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`get.bbl.editor'}
% Use this function universally when accessing the ``editor'' text entity.
%    \begin{macrocode}
FUNCTION {get.bbl.editor}
{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ }

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.editors'}
% The option \texttt{edpar} puts the word `editor' in parentheses.
% In \texttt{genbst.mbs}, this occurred automatically with the option
% \texttt{ed}, to abbreviate `editor' to `ed'. In \texttt{babel.mbs},
% this was not the case, because of complications with the word functions.
% Now this possibility is added as a special option, which means there is
% some inconsistency with older \texttt{.dbj} files that called \texttt{ed}:
% the abbreviated `ed' is not put in parentheses unless \texttt{edpar} is
% also called.
%
% Note that the code here is very similar to code in \texttt{format.in.ed.booktitle};
% the two should be kept coordinated.
%    \begin{macrocode}
FUNCTION {format.editors}
{ editor "editor" format.names duplicate$ empty$ 'skip$
    {
%<!edpar&!edparxc>      "," *
      " " *
      get.bbl.editor
%<bkedcap>      capitalize
%<edpar|edparc|edparxc>   "(" swap$ * ")" *
      *
    }
  if$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.in.editors'}
% See the note about the option \texttt{edpar} above.
%
% \end{macro}
%
% \begin{macro}{`format.book.pages'}
%    \begin{macrocode}
%<*pg-bk>
FUNCTION {format.book.pages}
{ pages "pages" bibinfo.check
  duplicate$ empty$ 'skip$
    { " " * bbl.pages * }
  if$
}
%</pg-bk>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.isbn'}
%    \begin{macrocode}
%<*isbn>
FUNCTION {format.isbn}
{ isbn "isbn" bibinfo.check
  duplicate$ empty$ 'skip$
    {
%<!blk-com&!blk-tit&!blk-tita>      new.block
      "ISBN " swap$ *
    }
  if$
}

%</isbn>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.issn'}
%    \begin{macrocode}
%<*issn>
FUNCTION {format.issn}
{ issn "issn" bibinfo.check
  duplicate$ empty$ 'skip$
    {
%<!blk-com&!blk-tit&!blk-tita>      new.block
      "ISSN " swap$ *
    }
  if$
}

%</issn>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.doi'}
% DOIs like URLs are encapsulated by their own commands, so need no \texttt{bibinfo.check}.
%    \begin{macrocode}
%<*doi|(url-doi&!url)>
FUNCTION {format.doi}
{ doi empty$
    { "" }
    {
%<!blk-com&!blk-tit&!blk-tita>      new.block
%<!html>      "\doi{" doi * "}" *
%<html>      "doi:" doi *
    }
  if$
}
%</doi|(url-doi&!url)>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`select.language'}
% The \texttt{language} field code has been provided by Bernd Feige, of the
% University of Freiburg.
%    \begin{macrocode}
%<*lang>
FUNCTION {select.language}
{ duplicate$ empty$
    'pop$
    { language empty$
        'skip$
        { "{\selectlanguage{" language * "}" * swap$ * "}" * }
      if$
    }
    if$
}

%</lang>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.note'}
% Notes should be entered as though they were a sentence on their own.
% However, if they appear mid-sentence rather than after a block or sentence,
% the first letter must be lowercase. Thus if a note begins with a proper
% noun, it must be in braces. To avoid a warning about unmatched braces
% with the \texttt{change.case\$} function, check first if the leading
% character is an opening brace.
%
% With options \texttt{url,url-nt}, the URL text is treated as a note, and
% added here. It is output directly, not prepended to the note text. This
% means, if the note is to be a new sentence, the URL text starts that
% sentence, and the regular note is added to that sentence, comma between.
%
%    \begin{macrocode}
FUNCTION {format.note}
{
%<*url-nt&!revdata>
  url empty$
    'skip$
%<!html>    { "\urlprefix\url{" url * "}" * output }
%<html>    { "<a href=" quote$ * url * quote$
%<html>      * ">" * url * "</a>" * output }
  if$
%</url-nt&!revdata>
 note empty$
    { "" }
    { note #1 #1 substring$
      duplicate$ "{" =
        'skip$
        { output.state mid.sentence =
          { "l" }
          { "u" }
        if$
        change.case$
        }
      if$
      note #2 global.max$ substring$ * "note" bibinfo.check
    }
  if$
}

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.title'}
% For a quoted title, any punctuation in the title goes inside the quote.
% Otherwise, the comma or period following the title also goes inside.
% Exception is with \texttt{qx} option, in which case the comma goes
% outside, even when punctuation present; for period (\texttt{!blk-com})
% is added outside only when punctuation is absent.
%    \begin{macrocode}
FUNCTION {format.title}
{ title
%<*!atit-u>
  duplicate$ empty$ 'skip$
    { "t" change.case$ }
  if$
%</!atit-u>
  "title" bibinfo.check
%<*tit-it|tit-qq|lang>
  duplicate$ empty$ 'skip$
    {
%<tit-it>      emphasize
%<*!tit-it&tit-qq>
      "\enquote{" swap$ *
%<*!qx>
%<*blk-com>
      non.stop
%<!com-semi&!com-blank>        { ",} " * }
%<com-semi>        { ";} " * }
%<!com-semi&com-blank>        { "} " * }
        { "} " * }
      if$
%</blk-com>
%<!blk-com>      add.period$ "}" *
%</!qx>
%<*qx>
%<*blk-com>
%<!com-semi&!com-blank>      "}, " *
%<com-semi>      "}; " *
%<!com-semi&com-blank>      "} " *
%</blk-com>
%<!blk-com>      "}" *
%</qx>
%</!tit-it&tit-qq>
%<lang>      select.language
    }
  if$
%</tit-it|tit-qq|lang>
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`end.quote.title'}
% For a quoted title, the punctuation appears in the quotes. For commas
% between block, this means the inter-block punctuation is already present,
% so it must be suppressed after every \texttt{format.title output}. This
% is done by setting the \texttt{output.state} to \texttt{before.all}, but
% only if there really was a title. Call this macro every time after
% titles are output.
%    \begin{macrocode}
%<*blk-com&tit-qq>
FUNCTION {end.quote.title}
{ title empty$
    'skip$
    { before.all 'output.state := }
  if$
}
%</blk-com&tit-qq>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`end.quote.btitle'}
% Similar to |end.quote.title| except that it is only applied if titles of
% proceedings and collections are quoted, and if
% neither \texttt{edby}, \texttt{edby-par}, nor \texttt{edby-par} are selected
% (this is the default case in the relevant menu of the \texttt{makebst.tex} run).
% These options add text after the booktitle,
% so additional punctuation need not be suppressed. Unless there is no editor!
%
% Note: this function is called after the result of \texttt{format.in.ed.booktitle}
% has been output, and attempts to predict what that output had been.
% Would it not be better to call this function while that result is still
% on the stack?
%    \begin{macrocode}
%<*bt-qq>
FUNCTION {end.quote.btitle}
{ booktitle empty$
    'skip$
%<!edby&!edby-par&!edby-parc>    { before.all 'output.state := }
%<*edby|edby-par|edby-parc>
    { editor empty$
        { before.all 'output.state := }
        'skip$
      if$
    }
%</edby|edby-par|edby-parc>
  if$
}
%</bt-qq>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`make.full.names'}
% In versions before 2.2, there were two functions \texttt{calc.long.label}
% and \texttt{format.long.lab.names} that made up the string
% \texttt{long.label} for each entry. This contains the full author list.
% However, there was a bug in the one routine, entered by mistake when an
% earlier bug was removed, and more seriously, the string
% \texttt{long.label} was limited to \texttt{entry.max\$} characters, 100 on
% my system. Author lists were truncated.  Thus, \texttt{make.full.names}
% is used instead to enter the full list of names directly in the
% \texttt{output.bibitem} function, without an intermediate string. This
% involves changing the order of some function definitions, especially
% \texttt{output.bibitem} must come later.
%    \begin{macrocode}
%<*har|cay|nat>
FUNCTION {format.full.names}
{'s :=
 "" 't :=
  #1 'nameptr :=
  s num.names$ 'numnames :=
  numnames 'namesleft :=
    { namesleft #0 > }
    { s nameptr
%<!jnrlab>      "{vv~}{ll}" format.name$
%<*jnrlab>
%<!nm-rv&!nm-rvv&!nm-rvx&!nm-rvcx>      "{vv~}{ll}{, jj}" format.name$
%<nm-rv|nm-rvv|nm-rvx|nm-rvcx>      "{vv~}{ll}{ jj}" format.name$
%</jnrlab>
%<lab&and-rm>      cite.name.font
      't :=
      nameptr #1 >
        {
%<*nmlm>
%<m1>          nameptr #1
%<m2>          nameptr #2
%<m3>          nameptr #3
%<m4>          nameptr #4
%<m5>          nameptr #5
%<m6>          nameptr #6
%<m7>          nameptr #7
%<m8>          nameptr #8
%<m9>          nameptr #9
%<m0>          nameptr #0
%<m10>          #10 +
%<m20>          #20 +
%<m30>          #30 +
%<m40>          #40 +
%<m50>          #50 +
%<m60>          #60 +
%<m70>          #70 +
%<m80>          #80 +
%<m90>          #90 +
          #1 + =
%<x1>          numnames #1
%<x2>          numnames #2
%<x3>          numnames #3
%<x4>          numnames #4
%<x5>          numnames #5
%<x6>          numnames #6
%<x7>          numnames #7
%<x8>          numnames #8
%<x9>          numnames #9
%<x0>          numnames #0
%<x10>          #10 +
%<x20>          #20 +
%<x30>          #30 +
%<x40>          #40 +
%<x50>          #50 +
%<x60>          #60 +
%<x70>          #70 +
%<x80>          #80 +
%<x90>          #90 +
          > and
            { "others" 't :=
              #1 'namesleft := }
            'skip$
          if$
%</nmlm>
          namesleft #1 >
            { ", " * t * }
            {
              s nameptr "{ll}" format.name$ duplicate$ "others" =
                { 't := }
                { pop$ }
              if$
              t "others" =
                {
%<lab&!and-rm&(etal-it|etal-rm)>                  cite.name.font
%<*!etal-it>
%<lab&and-rm&!etal-rm>                  " " * bbl.etal cite.name.font *
%<!lab|!and-rm|etal-rm>                  " " * bbl.etal *
%</!etal-it>
%<etal-it>                  " " * bbl.etal emphasize *
%<lab&!and-rm&!(etal-it|etal-rm)>                  cite.name.font
                }
                {
%<*!harnm>
%<*!and-xcom>
                  numnames #2 >
                    { "," * }
                    'skip$
                  if$
%</!and-xcom>
%<!amper>                  bbl.and
%<amper>                  "\&"
%</!harnm>
%<harnm>                  "\harvardand{}"
                  space.word * t *
                }
              if$
            }
          if$
        }
        't
      if$
      nameptr #1 + 'nameptr :=
      namesleft #1 - 'namesleft :=
    }
  while$
%<*lab&!and-rm>
  t "others" =
    'skip$
    { cite.name.font }
  if$
%</lab&!and-rm>
}

FUNCTION {author.editor.key.full}
{ author empty$
    { editor empty$
        { key empty$
            { cite$ #1 #3 substring$ }
            'key
          if$
        }
        { editor format.full.names }
      if$
    }
    { author format.full.names }
  if$
}

FUNCTION {author.key.full}
{ author empty$
    { key empty$
         { cite$ #1 #3 substring$ }
          'key
      if$
    }
    { author format.full.names }
  if$
}

FUNCTION {editor.key.full}
{ editor empty$
    { key empty$
         { cite$ #1 #3 substring$ }
          'key
      if$
    }
    { editor format.full.names }
  if$
}

FUNCTION {make.full.names}
{ type$ "book" =
  type$ "inbook" =
  or
    'author.editor.key.full
    { type$ "proceedings" =
        'editor.key.full
        'author.key.full
      if$
    }
  if$
}

%</har|cay|nat>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`output.bibitem'}
% A user has pointed out to me that if the label argument in square brackets
% are put into braces (within the squares) it is then resistent to any
% problems if square braces should appear within the label. Do this, but
% only for the \texttt{nat} option.
%    \begin{macrocode}
FUNCTION {output.bibitem}
{ newline$
%<*!html>
%<*ay>
%<!har&!nat>  "\bibitem[" write$
%<!har&nat>  "\bibitem[{" write$
%<har>  "\harvarditem" write$
%<nmd>  "\protect\citeauthoryear{" write$
%<ast>  "\protect\astroncite{" write$
%<cay>  "\protect\citeauthoryear{" make.full.names * "}{" * write$
%<cn>  "\protect\citename{" write$
%<!har>  label write$
%<har>  make.full.names duplicate$ label =
%<har>    'skip$
%<har>    { "[" label * "]" * write$ }
%<har>  if$
%<har>  "{" swap$ * "}{" * write$
%<har>  year duplicate$ empty$
%<cn>  ", }" year duplicate$ empty$
%<cay|nmd|ast>  "}{" year duplicate$ empty$
%<(har|cn|cay|nmd|ast)&blkyear>    { pop$ "" }
%<(har|cn|cay|nmd|ast)&!blkyear>    { pop$ "????" }
%<har|cn|cay|nmd|ast>    'skip$
%<har|cn|cay|nmd|ast>  if$
%<har>  extra.label * "}{" * write$
%<cn>  * extra.label * "]{" * write$
%<cay|nmd|ast>  * extra.label * "}]{" * write$
%<alk>  "]{" write$
%<!(har|cay|nmd|ast|alk|cn|nat)>  ")]{" write$
%<nat>  ")" make.full.names duplicate$ short.list =
%<nat>     { pop$ }
%<nat>     { * }
%<nat>   if$
%<nat>  "}]{" * write$
%</ay>
%<!ay&!(cite|alph)>  "\bibitem{" write$
%<!ay&(cite|alph)>  "\bibitem[" label * "]{" * write$
  cite$ write$
  "}" write$
  newline$
  ""
%</!html>
%<*html>
%<*htdes>
  "<dt><strong><tt>" write$
  cite$ write$
  "</tt></strong></dt>" write$ newline$
  "<dd>"
%</htdes>
%<htlist&!htdes>  "<li>"
%<!htlist&!htdes>  "<p>"
%</html>
  before.all 'output.state :=
}

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`if.digit'}
% Add \texttt{if.digit} and \texttt{n.separate} to convert large page numbers
% to a separated number.
%    \begin{macrocode}
%<*pgsep-c|pgsep-s|pgsep-p>
FUNCTION {if.digit}
{ duplicate$ "0" =
  swap$ duplicate$ "1" =
  swap$ duplicate$ "2" =
  swap$ duplicate$ "3" =
  swap$ duplicate$ "4" =
  swap$ duplicate$ "5" =
  swap$ duplicate$ "6" =
  swap$ duplicate$ "7" =
  swap$ duplicate$ "8" =
  swap$ "9" = or or or or or or or or or
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`n.separate'}
%  \texttt{pgsep-s}, \texttt{pgsep-p}
% Large page numbers are to be separated in threes, with thin space, comma
% or period. The number must be 5 digits before the separation occurs.
% No provision is made for numbers of 7 or more digits.
%    \begin{macrocode}
FUNCTION {n.separate}
{ 't :=
  ""
  #0 'numnames :=
  { t empty$ not }
  { t #-1 #1 substring$ if.digit
      { numnames #1 + 'numnames := }
      { #0 'numnames := }
    if$
    t #-1 #1 substring$ swap$ *
    t #-2 global.max$ substring$ 't :=
    numnames #5 =
      { duplicate$ #1 #2 substring$ swap$
        #3 global.max$ substring$
%<pgsep-c>        "," swap$ * *
%<pgsep-p>        "." swap$ * *
%<pgsep-s&!html>        "\," swap$ * *
%<pgsep-s&html>        " " swap$ * *
      }
      'skip$
    if$
  }
  while$
}
%</pgsep-c|pgsep-s|pgsep-p>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`n.dashify'}
%    \begin{macrocode}
FUNCTION {n.dashify}
{
%<pgsep-c|pgsep-s|pgsep-p>  n.separate
  't :=
  ""
    { t empty$ not }
    { t #1 #1 substring$ "-" =
        { t #1 #2 substring$ "--" = not
            { "--" *
              t #2 global.max$ substring$ 't :=
            }
            {   { t #1 #1 substring$ "-" = }
                { "-" *
                  t #2 global.max$ substring$ 't :=
                }
              while$
            }
          if$
        }
        { t #1 #1 substring$ *
          t #2 global.max$ substring$ 't :=
        }
      if$
    }
  while$
}

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`word.in'}
% The function \texttt{word.in} prints the word \textsl{in} for references
% that are
% contained in a larger work, or in conference proceedings. One may have a
% colon after the word with the option \texttt{in-col}. If blocks of text are
% to be separated with commas (option \texttt{blk-com}) then the word remains
% in lower case, as it is defined in \texttt{bbl.in}; but if blocks act as
% sentences, then it must be capitalized.
%    \begin{macrocode}
FUNCTION {word.in}
%<in-x>{ "" }
%<*!in-x>
%<blk-com|blk-tita>{ bbl.in
%<!blk-com&!blk-tita>{ bbl.in capitalize
%<in-col>  ":" *
%<in-it>  emphasize
  " " * }
%</!in-x>

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.date'}
% The new \texttt{harvard.sty} allows variable brackets around the date
% in the reference list. It uses |\harvardyearleft| and |\harvardyearright|
% in the \texttt{.bst} files. Allow this with the option \texttt{harnm},
% which could actually be used without the \texttt{har} option. Note that
% this overrides the other year formatting options, except for the preceding punctuation.
%    \begin{macrocode}
%<*ay>
FUNCTION {format.date}
{ year "year" bibinfo.check duplicate$ empty$
    {
%<*!blkyear>
      "empty year in " cite$ * "; set to ????" * warning$
       pop$ "????"
%</!blkyear>
    }
    'skip$
  if$
%<*aymth>
  month "month" bibinfo.check duplicate$ empty$
    'skip$
    {
%<dtrev>      swap$
      " " * swap$
    }
  if$
  *
%<mth-bare>  remove.dots
%</aymth>
%<dtbf>  bolden
  extra.label *
%<*!harnm>
%<*yr-par|yr-brk|yr-col|yr-blk|yr-com|yr-per>
  before.all 'output.state :=
%<yr-par>  " (" swap$ * ")" *
%<!yr-par&yr-brk>  " [" swap$ * "]" *
%<!yr-par&!yr-brk&yr-col>  ": " swap$ *
%<!yr-par&!yr-brk&!yr-col&yr-com>  ", " swap$ *
%<!yr-par&!yr-brk&!yr-col&!yr-com&yr-per>  after.sentence 'output.state :=
%<!yr-par&!yr-brk&!yr-col&!yr-com&!yr-per&yr-blk>  " " swap$ *
%</yr-par|yr-brk|yr-col|yr-blk|yr-com|yr-per>
%</!harnm>
%<*harnm>
  before.all 'output.state :=
  " \harvardyearleft " swap$ * "\harvardyearright{}" *
%<yr-col>  ":" swap$ *
%<!yr-col&yr-com>  "," swap$ *
%<!yr-col&!yr-com&yr-per>  after.sentence 'output.state :=
%<!yr-col&!yr-com&!yr-per&yr-blk>  " " swap$ *
%</harnm>
}
%</ay>
%<*!ay>
FUNCTION {format.date}
{
%<!xmth>  month "month" bibinfo.check
%<xmth>  ""
  duplicate$ empty$
  year  "year"  bibinfo.check duplicate$ empty$
    { swap$ 'skip$
        { "there's a month but no year in " cite$ * warning$ }
      if$
      *
    }
    { swap$ 'skip$
        {
%<showstack> month year
%<!dtrev>          swap$
          " " * swap$
        }
      if$
      *
%<mth-bare>      remove.dots
    }
  if$
%<dtbf>  bolden
%<*yr-par|yr-brk|yr-col|yr-com|yr-per|yr-blk>
  duplicate$ empty$
    'skip$
    {
      before.all 'output.state :=
%<yr-par>    " (" swap$ * ")" *
%<!yr-par&yr-brk>    " [" swap$ * "]" *
%<!yr-par&!yr-brk&yr-col>    ": " swap$ *
%<!yr-par&!yr-brk&!yr-col&yr-com>    ", " swap$ *
%<!yr-par&!yr-brk&!yr-col&!yr-com&yr-per>    after.sentence 'output.state :=
%<!yr-par&!yr-brk&!yr-col&!yr-com&!yr-per&yr-blk>    " " swap$ *
    }
  if$
%</yr-par|yr-brk|yr-col|yr-com|yr-per|yr-blk>
}
%</!ay>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.year'}
% For the options that put the year into the journal specifications, use a
% special formatter separate from the regular date formatter.
% The year is always in parentheses (except for appended to journal name).
%    \begin{macrocode}
%<*jdt-p|jdt-pc|jdt-v|jdt-vs>
FUNCTION{format.year}
{ year "year" bibinfo.check duplicate$ empty$
    {  "empty year in " cite$ *
%<ay&!blkyear>       "; set to ????" *
       warning$
%<ay&!blkyear>       pop$ "????"
    }
    {
%<!ay&jdt-vs>  " (" swap$ * ")" *
%<!ay&!jdt-vs>  "(" swap$ * ")" *
    }
  if$
%<*ay>
  extra.label *
%<jdt-vs>  " (" swap$ * ")" *
%<!jdt-vs>  "(" swap$ * ")" *
%</ay>
}
%</jdt-p|jdt-pc|jdt-v|jdt-vs>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.btitle'}
%    \begin{macrocode}
FUNCTION {format.btitle}
{ title "title" bibinfo.check
  duplicate$ empty$ 'skip$
    {
%<!btit-rm>      emphasize
%<lang>      select.language
    }
  if$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`either.or.check'}
%    \begin{macrocode}
FUNCTION {either.or.check}
{ empty$
    'pop$
    { "can't use both " swap$ * " fields in " * cite$ * warning$ }
  if$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.bvolume'}
%    \begin{macrocode}
FUNCTION {format.bvolume}
{ volume empty$
    { "" }
    { bbl.volume volume tie.or.space.prefix
      "volume" bibinfo.check * *
      series "series" bibinfo.check
      duplicate$ empty$ 'pop$
%<*!ser-vol>
        { swap$ bbl.of space.word * swap$
          emphasize * }
%</!ser-vol>
%<ser-vol>        { emphasize ", " * swap$ * }
      if$
      "volume and number" number either.or.check
    }
  if$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.number.series'}
%    \begin{macrocode}
FUNCTION {format.number.series}
{ volume empty$
    { number empty$
        { series field.or.null }
%<*num-xser>
        { series empty$
            { number "number" bibinfo.check }
            { output.state mid.sentence =
                { bbl.number }
                { bbl.number capitalize }
              if$
              number tie.or.space.prefix "number" bibinfo.check * *
              bbl.in space.word *
              series "series" bibinfo.check *
            }
          if$
        }
%</num-xser>
%<*!num-xser>
        { output.state mid.sentence =
            { bbl.number }
            { bbl.number capitalize }
          if$
          number tie.or.space.prefix "number" bibinfo.check * *
          series empty$
            { "there's a number but no series in " cite$ * warning$ }
            { bbl.in space.word *
              series "series" bibinfo.check *
            }
          if$
        }
%</!num-xser>
      if$
    }
    { "" }
  if$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`is.num'}
% This function takes the single-character string on the stack and returns
% 1 if it is a digit, else 0.
%    \begin{macrocode}
%<*!xedn>
FUNCTION {is.num}
{ chr.to.int$
  duplicate$ "0" chr.to.int$ < not
  swap$ "9" chr.to.int$ > not and
}

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`extract.num'}
% This function tests the string on the stack to see if it begins with a
% number. If so, that number is left on the stack; if the string contains
% no numbers at the start, it is left unchanged. The idea is to convert
% \textsl{1st} to \textsl{1} and leave \textsl{first} as is.
% This is used by \code{convert.edition}.
%    \begin{macrocode}
FUNCTION {extract.num}
{ duplicate$ 't :=
  "" 's :=
  { t empty$ not }
  { t #1 #1 substring$
    t #2 global.max$ substring$ 't :=
    duplicate$ is.num
      { s swap$ * 's := }
      { pop$ "" 't := }
    if$
  }
  while$
  s empty$
    'skip$
    { pop$ s }
  if$
}

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`convert.edition'}
% The function \texttt{convert.edition} takes the text in the field
% \texttt{edition} and changes it to the language-specific equivalent. As
% originally planned for \btx, this field should contain the words
% \textsl{First}, \textsl{Second}, etc. Being so explicit,
% it is not so easy to translate, nor to
% convert to \textsl{1st}, \textsl{2nd}, etc., if one wanted.
% This function carries out the translation, by changing
% \textsl{first} or \textsl{1} to \texttt{bbl.first}, and so
% on. The field is reduced to lower case to make it case insensitive. If no
% translation is found, then the original text in \texttt{edition} is used
% instead, as it stands. However, if the original is a number greater than
% the maximum for which text is provided, then \texttt{bbl.th} is added to
% it.
%    \begin{macrocode}
FUNCTION {convert.edition}
{ extract.num "l" change.case$ 's :=
  s "first" = s "1" = or
    { bbl.first 't := }
    { s "second" = s "2" = or
        { bbl.second 't := }
        { s "third" = s "3" = or
            { bbl.third 't := }
            { s "fourth" = s "4" = or
                { bbl.fourth 't := }
                { s "fifth" = s "5" = or
                    { bbl.fifth 't := }
                    { s #1 #1 substring$ is.num
%<!english&exlang>                        { s bbl.th * 't := }
%<english|!exlang>                        { s eng.ord 't := }
                        { edition 't := }
                      if$
                    }
                  if$
                }
              if$
            }
          if$
        }
      if$
    }
  if$
  t
}
%</!xedn>

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.edition'}
% This function formats the text for the edition specification, such as
% ``Second edition''. It combines the edition number with the word
% \textsl{edition}.
%    \begin{macrocode}
FUNCTION {format.edition}
{ edition duplicate$ empty$ 'skip$
    {
%<!xedn>      convert.edition
      output.state mid.sentence =
        { "l" }
        { "t" }
      if$ change.case$
      "edition" bibinfo.check
      " " * bbl.edition *
    }
  if$
}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
INTEGERS { multiresult }
%    \end{macrocode}
%
% \begin{macro}{`multi.page.check'}
%    \begin{macrocode}
FUNCTION {multi.page.check}
{ 't :=
  #0 'multiresult :=
    { multiresult not
      t empty$ not
      and
    }
    { t #1 #1 substring$
      duplicate$ "-" =
      swap$ duplicate$ "," =
      swap$ "+" =
      or or
        { #1 'multiresult := }
        { t #2 global.max$ substring$ 't := }
      if$
    }
  while$
  multiresult
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.pages'}
%    \begin{macrocode}
FUNCTION {format.pages}
{ pages duplicate$ empty$ 'skip$
    { duplicate$ multi.page.check
        {
%<!bkpg-x&!ppx>          bbl.pages swap$
          n.dashify
        }
        {
%<!bkpg-x&!ppx>          bbl.page swap$
        }
      if$
%<!bkpg-x&!ppx>      tie.or.space.prefix
      "pages" bibinfo.check
%<!bkpg-x&!ppx>      * *
%<bkpg-par>     "(" swap$ * ")" *
    }
  if$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`first.page'}
%    \begin{macrocode}
%<*jpg-1>
FUNCTION {first.page}
{ 't :=
  ""
    {  t empty$ not t #1 #1 substring$ "-" = not and }
    { t #1 #1 substring$ *
      t #2 global.max$ substring$ 't :=
    }
  while$
}

%</jpg-1>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.journal.pages'}
% Note: this function gets called with something on the stack.
% It may be the volume and number.
%    \begin{macrocode}
FUNCTION {format.journal.pages}
{ pages duplicate$ empty$ 'pop$
    { swap$ duplicate$ empty$
        { pop$ pop$ format.pages }
        {
%<volp-sp>          ": " *
%<*!volp-sp>
%<volp-blk>          " " *
%<*!volp-blk>
%<volp-com>          ", " *
%<*!volp-com>
%<volp-semi>          "; " *
%<!volp-semi>          ":" *
%</!volp-com>
%</!volp-blk>
%</!volp-sp>
%<!jdt-v&!jdt-vs&jdt-p>          format.year * " " *
%<!jdt-v&!jdt-vs&!jdt-p&jdt-pc>          format.year * ", " *
          swap$
%<jpg-1>          first.page
%<!jpg-1>          n.dashify
%<*jwdpg>
          pages multi.page.check
            'bbl.pages
            'bbl.page
          if$
          swap$ tie.or.space.prefix
%</jwdpg>
          "pages" bibinfo.check
%<jwdpg>          * *
          *
        }
      if$
    }
  if$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.journal.eid'}
%
% This function is called with something on the stack (journal vol, number)
% and appends \texttt{eid} and \texttt{numpages} if those field are non-empty.
% Very similar to \texttt{format.journal.pages}.
%
% For the AGU style of including the DOI as part of the EID, the DOI number
% is appended too.
%    \begin{macrocode}
FUNCTION {format.journal.eid}
{ eid "eid" bibinfo.check
  duplicate$ empty$ 'pop$
    { swap$ duplicate$ empty$ 'skip$
      {
%<volp-sp>          ": " *
%<*!volp-sp>
%<volp-blk>          " " *
%<*!volp-blk>
%<volp-com>          ", " *
%<*!volp-com>
%<volp-semi>          "; " *
%<!volp-semi>          ":" *
%</!volp-com>
%</!volp-blk>
%</!volp-sp>
      }
      if$
      swap$ *
%<*revdata>
      numpages empty$ 'skip$
        { bbl.eidpp numpages tie.or.space.prefix
          "numpages" bibinfo.check * *
          " (" swap$ * ")" * *
        }
      if$
%</revdata>
    }
  if$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.vol.num.pages'}
% Version 3.84, I have rationalized several options that placed the date in the
% journal specifications. It was rather chaotic before, but now it should be
% more systematic. This means some options have been removed, something that I
% do not like to do.
%
% The option \texttt{pp-last} suppresses the pages in the formatting macros, and
% sees to it that the pages are added just before any notes in those entries
% that take pages. This applies to more than just \texttt{article}, but to
% \texttt{inbook}, \texttt{incollection} as well.
%
%    \begin{macrocode}
FUNCTION {format.vol.num.pages}
{ volume field.or.null
  duplicate$ empty$ 'skip$
    {
%<jwdvol>      bbl.volume swap$ tie.or.space.prefix
      "volume" bibinfo.check
%<jwdvol>      * *
    }
  if$
%<vol-bf&!vol-2bf>  bolden
%<!vol-bf&!vol-2bf&vol-it>  emphasize
%<jdt-v|jdt-vs>  format.year *
%<*!vnum-x>
  number "number" bibinfo.check duplicate$ empty$ 'skip$
    {
      swap$ duplicate$ empty$
        { "there's a number but no volume in " cite$ * warning$ }
        'skip$
      if$
      swap$
%<vnum-sp>      "~(" swap$ * ")" *
%<!vnum-sp&vnum-cm>      ", " swap$ *
%<!vnum-sp&!vnum-cm&vnum-nr>      ", " bbl.nr * number tie.or.space.prefix pop$ * swap$ *
%<!vnum-sp&!vnum-cm&!vnum-nr&vnum-h>      ", \#" swap$ *
%<!vnum-sp&!vnum-cm&!vnum-nr&!vnum-h&vnum-b>      " " swap$ *
%<!vnum-sp&!vnum-cm&!vnum-nr&!vnum-h&!vnum-b>      "(" swap$ * ")" *
    }
  if$ *
%<!vol-bf&vol-2bf>  bolden
%</!vnum-x>
%<*!pp-last>
  eid empty$
    { format.journal.pages }
    { format.journal.eid }
  if$
%</!pp-last>
}

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.chapter.pages'}
%    \begin{macrocode}
FUNCTION {format.chapter.pages}
{ chapter empty$
%<!pp-last>    'format.pages
%<pp-last>    { "" }
    { type empty$
        { bbl.chapter }
        { type "l" change.case$
          "type" bibinfo.check
        }
      if$
      chapter tie.or.space.prefix
      "chapter" bibinfo.check
      * *
%<*!pp-last>
      pages empty$
        'skip$
        { ", " * format.pages * }
      if$
%</!pp-last>
    }
  if$
}

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`bt.enquote'}
% This is to place the booktitle for proceedings and collections into quotes.
% If punctuation is to be included, then add a comma unless a stop already
% exists, or add a period under the only circumstances that
% |format.in.ed.booktitle| is followed by |new.sentence|.
%    \begin{macrocode}
%<*bt-qq>
FUNCTION {bt.enquote}
{ duplicate$ empty$ 'skip$
  { "\enquote{" swap$ *
%<*!qx>
    non.stop
      { ",} " * }
      { "}, " * }
    if$
%</!qx>
%<*qx>
    "}, " *
%</qx>
  }
  if$
}
%</bt-qq>
%    \end{macrocode}
%
% \end{macro}
%
% \begin{macro}{`format.booktitle'}
% The function \texttt{format.booktitle} pushes one object
% (the book title, suitably encapsulated) onto the stack.
% It is currently used in \texttt{format.incoll.inproc.crossref}
% and in \texttt{format.in.ed.booktitle}, and should be used whenever accessing
% the \texttt{booktitle} field for eventual output.
%
% If the book title is empty or missing, the function pushes an empty string.
%    \begin{macrocode}
FUNCTION {format.booktitle}
{
  booktitle "booktitle" bibinfo.check
%<!bt-qq&!bt-rm>  emphasize
%<bt-qq>  bt.enquote
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.in.ed.booktitle'}
% Prior to version 3.81, the \textsl{Editor} or \textsl{Edited by} in
% parentheses was meant to be capitalized, but this did not work properly.
% Now the option \texttt{edcap} produces this, and default is not capitalized.
%
% Notes on \dtx{} options:
% \begin{itemize}
% \item
% The following combinations are available through the \texttt{makebst.tex} interface:
% \begin{quote}
% \verb+(+ \\
% \verb+ <default>+ \\
% \verb+ |edby     (      |edbyx       |edbyy|edbyw[edcap])+ \\
% \verb+ |edby-par (|edcap|edbyx[edcap]|edbyy             )+ \\
% \verb+ |edby-parc(|edcap|edbyx                          )+ \\
% \verb+)+
% \end{quote}
% \item
% \texttt{edby}, \texttt{edby-par}, and \texttt{edby-parc} are mutually exclusive
% and, except for the default, exhaustive.
% \item
% \texttt{edbyx}, \texttt{edbyw}, and \texttt{edbyy} are mutually exclusive
% and, except for the default, exhaustive.
% \item
% \texttt{edcap} is independent of the above two groups of options.
% \item
% When parentheses need to be applied, we make sure that the respective
% \dtx{} guard expressions are mutually exclusive.
% It makes no sense for \texttt{edbyw} to be in effect if either of
% \texttt{edby-par} or \texttt{edby-parc} is in effect.
% \item
% \texttt{makebst.tex} only activates \texttt{edcap} in certain cases,
% but we do no checking here, applying it consistently to the
% ``editor'' text entity.
% \item
% The code between \texttt{<!edpar>} and \verb+<edpar\|edparc>+
% \emph{must} match the corresponding code in \texttt{format.editors}.
% This means that in the default case, formatting is controlled by
% a \dtx{} mechanism entirely different from the other cases.
% \item \texttt{ser-ed} has been added to suit AGU. Result of series plus
% volume to go between booktitle and editors; must remove \texttt{format.bvolume}
% from \texttt{incollection} and \texttt{inproceedings}.
% \end{itemize}
%
%    \begin{macrocode}
FUNCTION {format.in.ed.booktitle}
{ format.booktitle duplicate$ empty$ 'skip$
    {
%<showstack>% btitle
%<*ser-ed>
      format.bvolume duplicate$ empty$ 'pop$
        { ", " swap$ * * }
      if$
%</ser-ed>
      editor "editor" format.names.ed duplicate$ empty$ 'pop$
        {
%<*!(edby|edby-par|edby-parc)>
%<showstack>% btitle ednms
%<!edpar&!edparxc>          "," *
          " " *
          get.bbl.editor
%<bkedcap>          capitalize
%<edpar>          "(" swap$ * "), " *
%<!edpar&(edparc|edparxc)>          "(" swap$ * ") " *
%<!edpar&!(edparc|edparxc)>          ", " *
          * swap$
%<showstack>% eds btitle
%</!(edby|edby-par|edby-parc)>
%<*edby|edby-par|edby-parc>
%<showstack>% btitle ednms
%<edbyx|edbyy|edbyw>          get.bbl.editor
%<!(edbyx|edbyy|edbyw)>          bbl.edby
%<edcap>          capitalize
%<!(edby-par|edby-parc)&edbyw>          "(" swap$ * ")" *
%<showstack>% btitle ednms ed
%<(edby-par|edby)&edbyy>          swap$ "," *
          " " * swap$ *
%<showstack>% btitle ednms-ed
%<(edby-par|edby-parc)&!edbyw>          "(" swap$ * ")" *
          swap$
%<edby|edby-parc>          "," *
          " " * swap$
%</edby|edby-par|edby-parc>
%<showstack>% btitle ednms-ed (or ednms-ed btitle)
          * }
      if$
%<showstack>% btitle-ednms-ed (or ednms-ed-btitle) (or btitle)
      word.in swap$ *
    }
  if$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`empty.misc.check'}
%    \begin{macrocode}
%<*!ay>
FUNCTION {empty.misc.check}
{ author empty$ title empty$ howpublished empty$
  month empty$ year empty$ note empty$
  and and and and and
%<!seq-no|alph>  key empty$ not and
    { "all relevant fields are empty in " cite$ * warning$ }
    'skip$
  if$
}
%</!ay>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.thesis.type'}
%    \begin{macrocode}
FUNCTION {format.thesis.type}
{ type duplicate$ empty$
    'pop$
    { swap$ pop$
      "t" change.case$ "type" bibinfo.check
    }
  if$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.tr.number'}
%    \begin{macrocode}
FUNCTION {format.tr.number}
{ number "number" bibinfo.check
  type duplicate$ empty$
    { pop$ bbl.techrep }
    'skip$
  if$
  "type" bibinfo.check
  swap$ duplicate$ empty$
    { pop$ "t" change.case$ }
    { tie.or.space.prefix * * }
  if$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.article.crossref'}
% The \texttt{journal} field was emphasized emplicitly, but it should be
% done by command.
%    \begin{macrocode}
FUNCTION {format.article.crossref}
{
%<*!ay>
  key duplicate$ empty$
    { pop$
      journal duplicate$ empty$
        { "need key or journal for " cite$ * " to crossref " * crossref * warning$ }
        { "journal" bibinfo.check emphasize word.in swap$ * }
      if$
    }
    { word.in swap$ * " " *}
  if$
%</!ay>
%<ay>  word.in
%<!html>  " \cite{" * crossref * "}" *
%<html>  " <tt>" * crossref * "</tt>" *
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.crossref.editor'}
%    \begin{macrocode}
%<*!ay>
FUNCTION {format.crossref.editor}
{ editor #1 "{vv~}{ll}" format.name$
%<nmft&nmfted&nmand-rm>  bib.name.font
  "editor" bibinfo.check
  editor num.names$ duplicate$
  #2 >
    { pop$
%<nmft&nmfted&!nmand-rm&(etal-it|etal-rm)>      bib.name.font
      "editor" bibinfo.check
      " " * bbl.etal
%<etal-it>      emphasize
      *
%<nmft&nmfted&!nmand-rm&!(etal-it|etal-rm)>      bib.name.font
%<nmft&nmfted&!nmand-rm&!(etal-it|etal-rm)>      "others" 't :=
    }
    { #2 <
        'skip$
        { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
            {
%<nmft&nmfted&!nmand-rm&(etal-it|etal-rm)>              bib.name.font
              "editor" bibinfo.check
              " " * bbl.etal
%<etal-it>              emphasize
              *
%<nmft&nmfted&!nmand-rm&!(etal-it|etal-rm)>              bib.name.font
%<nmft&nmfted&!nmand-rm&!(etal-it|etal-rm)>              "others" 't :=
            }
            {
%<*!harnm>
%<!amper>             bbl.and space.word
%<amper>              " \& "
%</!harnm>
%<harnm>              " \harvardand\ "
              * editor #2 "{vv~}{ll}" format.name$
%<nmft&nmfted&nmand-rm>              bib.name.font
              "editor" bibinfo.check
              *
            }
          if$
        }
      if$
    }
  if$
%<*nmft&nmfted&!nmand-rm>
  t "others" =
    'skip$
    { bib.name.font "editor" bibinfo.check }
  if$
%</nmft&nmfted&!nmand-rm>
}
%</!ay>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.book.crossref'}
% The \texttt{series} field was emphasized emplicitly, but it should be
% done by command.
%    \begin{macrocode}
FUNCTION {format.book.crossref}
{ volume duplicate$ empty$
    { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
      pop$ word.in
    }
    { bbl.volume
%<!(blk-com|blk-tita)>      capitalize
      swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word *
    }
  if$
%<*!ay>
  editor empty$
  editor field.or.null author field.or.null =
  or
    { key empty$
        { series empty$
            { "need editor, key, or series for " cite$ * " to crossref " *
              crossref * warning$
              "" *
            }
            { series emphasize * }
          if$
        }
        { key * }
      if$
    }
    { format.crossref.editor * }
  if$
%</!ay>
%<!html>  " \cite{" * crossref * "}" *
%<html>  " <tt>" * crossref * "</tt>" *
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.incoll.inproc.crossref'}
% The \texttt{booktitle} field was emphasized emplicitly, but it should be
% done by command.
%    \begin{macrocode}
FUNCTION {format.incoll.inproc.crossref}
{
%<*!ay>
  editor empty$
  editor field.or.null author field.or.null =
  or
    { key empty$
        { format.booktitle duplicate$ empty$
            { "need editor, key, or booktitle for " cite$ * " to crossref " *
              crossref * warning$
            }
            { word.in swap$ * }
          if$
        }
        { word.in key * " " *}
      if$
    }
    { word.in format.crossref.editor * " " *}
  if$
%</!ay>
%<ay>  word.in
%<!html>  " \cite{" * crossref * "}" *
%<html>  " <tt>" * crossref * "</tt>" *
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.org.or.pub'}
% Psychology journals often want \textit{address}: \textit{publisher}.
%
% \textsl{Nature} wants publisher and date in parentheses, and when both
% are there, they are merged into one set.
%
% Call function \texttt{add.blank} before parentheses so suppress preceding
% punctuation, which looks strange when publisher in parentheses.
%
% MPG Jahrbuch wants publisher and year, but without parentheses. Add
% \texttt{pub-nopar} to be used with \texttt{pub-date}.
%
% Have now (3.87.h) extended this function to include the organization, if
% present. This is for \texttt{inproceedings} and \texttt{proceedings} where
% the publisher is optional, and organization too. If the publisher is missing,
% but the organization present, it is formatted like the publisher. This
% complication comes from styles that want the publisher/organization to have
% the date included, all in parentheses.
%
% This function is called by \texttt{format.publisher.address} and
% \texttt{format.organization.address}, each putting the appropriate text
% into the stack first.
%
%    \begin{macrocode}
FUNCTION {format.org.or.pub}
{ 't :=
  ""
%<*pub-date&!ay>
  year empty$
    { "empty year in " cite$ * warning$ }
    'skip$
  if$
%</pub-date&!ay>
%<*!(pub-date&ay)>
  address empty$ t empty$ and
%<pub-date>  year empty$ and
    'skip$
    {
%</!(pub-date&ay)>
%<pub-par|(pub-date&!pub-xpar)>      add.blank "(" *
%<*add-pub>
      address "address" bibinfo.check *
      t empty$
        'skip$
%</add-pub>
%<*!add-pub>
      t empty$
        { address "address" bibinfo.check *
        }
        { t *
          address empty$
            'skip$
            { ", " * address "address" bibinfo.check * }
          if$
        }
%</!add-pub>
%<*add-pub>
        { address empty$
            'skip$
            { ": " * }
          if$
          t *
        }
%</add-pub>
      if$
%<*pub-date&!ay>
      year empty$
        'skip$
        { t empty$ address empty$ and
            'skip$
%<!pub-xc>            { ", " swap$ * * }
%<pub-xc>            { " " swap$ * * }
          if$
          year "year" bibinfo.check
%<dtbf>          bolden
          *
        }
      if$
%</pub-date&!ay>
%<*pub-date&ay>
      year duplicate$ empty$
%<*!blkyear>
        { "empty year in " cite$ * "; set to ????" * warning$
           pop$ "????" }
%</!blkyear>
%<*blkyear>
        { "empty year in " cite$ * warning$
           pop$ "" }
%</blkyear>
%<!dtbf>        { "year" bibinfo.check extra.label * }
%<dtbf>        { "year" bibinfo.check bolden extra.label * }
      if$
      t empty$ address empty$ and
        { * }
%<!pub-xc>        { ", " swap$ * * }
%<pub-xc>        { " " swap$ * * }
      if$
%</pub-date&ay>
%<pub-par|(pub-date&!pub-xpar)>      ")" *
%<*!(pub-date&ay)>
    }
  if$
%</!(pub-date&ay)>
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.publisher.address'}
%    \begin{macrocode}
FUNCTION {format.publisher.address}
{ publisher "publisher" bibinfo.warn format.org.or.pub
}

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`format.organization.address'}
%    \begin{macrocode}
FUNCTION {format.organization.address}
{ organization "organization" bibinfo.check format.org.or.pub
}

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`name.or.dash'}
% This function stores what is on the stack, compares it with previous value,
% and replaces it with a long dash if they are equal. What is on the stack
% should be author or editor names for the current entry.
%    \begin{macrocode}
%<*nmdash>
STRINGS {oldname}

FUNCTION {name.or.dash}
{ 's :=
   oldname empty$
     { s 'oldname := s }
     { s oldname =
%<*!au-col>
%<!nmd-2&!nmd-3>         { "---" }
%<nmd-2&!nmd-3>         { "---{}---" }
%<nmd-3>         { "---{}---{}---" }
%</!au-col>
%<*au-col>
%<!nmd-2&!nmd-3>         { "---" add.blank }
%<nmd-2&!nmd-3>         { "---{}---" add.blank }
%<nmd-3>         { "---{}---{}---" add.blank }
%</au-col>
         { s 'oldname := s }
       if$
     }
   if$
}

%</nmdash>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`article'}
%    \begin{macrocode}
FUNCTION {article}
{ output.bibitem
  format.authors "author" output.check
%<ay>  author format.key output
%<au-col>  add.colon
%<nmdash>  name.or.dash
%<*dt-beg&!jdt-p&!jdt-pc&!jdt-vs&!jdt-v>
  format.date "year" output.check
  date.block
%</dt-beg&!jdt-p&!jdt-pc&!jdt-vs&!jdt-v>
%<!dt-beg&!blk-com&!blk-tit&!blk-tita>  new.block
%<*!jtit-x>
  format.title "title" output.check
%<blk-com&tit-qq>  end.quote.title
%<!blk-com&!blk-tit&!blk-tita>  new.block
%<*blk-tit|blk-tita>
%<!tit-col>  new.sentence
%<tit-col>  add.colon
%</blk-tit|blk-tita>
%</!jtit-x>
  crossref missing$
    {
      journal
%<jxper>      remove.dots
      "journal" bibinfo.check
%<!jttl-rm>      emphasize
%<injnl>      word.in swap$ *
      "journal" output.check
%<jnm-x>      add.blank
%<*!dt-beg&!dt-end&dt-jnl&!jdt-p&!jdt-pc&!jdt-vs&!jdt-v>
      format.date "year" output.check
      date.block
%</!dt-beg&!dt-end&dt-jnl&!jdt-p&!jdt-pc&!jdt-vs&!jdt-v>
      format.vol.num.pages output
%<doi&agu-doi>  format.doi output
%<*!dt-beg&!dt-end&!dt-jnl&!jdt-p&!jdt-pc&!jdt-vs&!jdt-v>
      format.date "year" output.check
%</!dt-beg&!dt-end&!dt-jnl&!jdt-p&!jdt-pc&!jdt-vs&!jdt-v>
    }
    { format.article.crossref output.nonnull
%<!pp-last>      format.pages output
    }
  if$
%<*pp-last>
  eid empty$
    { format.journal.pages }
    { format.journal.eid }
  if$
%</pp-last>
%<issn>  format.issn output
%<(doi|(url-doi&!url))&!agu-doi>  format.doi output
%<*url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.url output
%</url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
%<(blk-com|blk-tit|blk-tita)&blknt>  new.sentence
  format.note output
%<*!dt-beg&dt-end&!jdt-p&!jdt-pc&!jdt-vs&!jdt-v>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.date "year" output.check
%</!dt-beg&dt-end&!jdt-p&!jdt-pc&!jdt-vs&!jdt-v>
%<eprint>  format.eprint output
%<*revdata>
  format.url output
%</revdata>
  fin.entry
%<harnm|url-nl>  write.url
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`book'}
%    \begin{macrocode}
FUNCTION {book}
{ output.bibitem
  author empty$
    { format.editors "author and editor" output.check
%<ay>      editor format.key output
%<!edpar&(edparc|edparxc)&!au-col>      add.blank
%<au-col>      add.colon
%<nmdash>      name.or.dash
    }
    { format.authors output.nonnull
%<au-col>      add.colon
%<nmdash>      name.or.dash
      crossref missing$
        { "author and editor" editor either.or.check }
        'skip$
      if$
    }
  if$
%<dt-beg&!pub-date>  format.date "year" output.check
%<dt-beg&!pub-date>  date.block
%<!dt-beg&!blk-com&!blk-tit&!blk-tita>  new.block
  format.btitle "title" output.check
  crossref missing$
    { format.bvolume output
%<!blk-com&!blk-tit&!blk-tita>      new.block
%<blk-tit&!tit-col>  new.sentence
%<blk-tit&tit-col>  add.colon
%<!numser>      format.number.series output
%<pre-edn>      format.edition output
%<!blk-com&!blk-tit&!blk-tita>      new.sentence
%<numser>      format.number.series output
%<pg-bk&pg-pre>      format.book.pages output
      format.publisher.address output
    }
    {
%<!blk-com&!blk-tit&!blk-tita>      new.block
%<blk-tit&!tit-col>  new.sentence
%<blk-tit&tit-col>  add.colon
      format.book.crossref output.nonnull
%<!dt-beg&!dt-end&pub-date>      format.date "year" output.check
    }
  if$
%<!pre-edn>  format.edition output
%<!dt-beg&!dt-end&!pub-date>  format.date "year" output.check
%<isbn>  format.isbn output
%<pg-bk&!pg-pre>  format.book.pages output
%<doi|(url-doi&!url)>  format.doi output
%<*url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.url output
%</url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
%<(blk-com|blk-tit|blk-tita)&blknt>  new.sentence
  format.note output
%<*!dt-beg&dt-end&!pub-date>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.date "year" output.check
%</!dt-beg&dt-end&!pub-date>
%<eprint>  format.eprint output
%<revdata>  format.url output
  fin.entry
%<(harnm|url-nl)&!revdata>  write.url
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`booklet'}
%    \begin{macrocode}
FUNCTION {booklet}
{ output.bibitem
  format.authors output
%<ay>  author format.key output
%<au-col>  add.colon
%<nmdash>  name.or.dash
%<ay&dt-beg>  format.date "year" output.check
%<!ay&dt-beg>  format.date output
%<dt-beg>  date.block
%<!dt-beg&!blk-com&!blk-tit&!blk-tita>  new.block
  format.title "title" output.check
%<blk-com&tit-qq>  end.quote.title
%<!blk-com&!blk-tit&!blk-tita>  new.block
%<blk-tit&!tit-col>  new.sentence
%<blk-tit&tit-col>  add.colon
  howpublished "howpublished" bibinfo.check output
  address "address" bibinfo.check output
%<ay&!dt-beg&!dt-end>  format.date "year" output.check
%<!ay&!dt-beg&!dt-end>  format.date output
%<isbn>  format.isbn output
%<pg-bk>  format.book.pages output
%<doi|(url-doi&!url)>  format.doi output
%<*url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.url output
%</url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
%<(blk-com|blk-tit|blk-tita)&blknt>  new.sentence
  format.note output
%<*ay&!dt-beg&dt-end>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.date "year" output.check
%</ay&!dt-beg&dt-end>
%<*!ay&!dt-beg&dt-end>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.date output
%</!ay&!dt-beg&dt-end>
%<eprint>  format.eprint output
%<revdata>  format.url output
  fin.entry
%<(harnm|url-nl)&!revdata>  write.url
}

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`inbook'}
% The medical journals, with option \texttt{dt-jnl}, have the date as part of
% the journal specification. For chapters in books, they want date and pages
% to appear at the end, with a space between them. (For journals, there is to be
% no space.) Suppress the chapter specification (for now).
%
% The \texttt{dt-jnl} option usually behaves as the default, except for some
% special entries, like this one.
%
% Restore the chapter specification (2004 Feb 9) after someone complained.
% There are still some bugs here. If some date punctuation is specified, say
%  with \texttt{yrp-semi} for a semi-colon after the year, this appears always,
%  even if there is no text following. But then this to be an unlikely wish anyway,
%  since such punctuation options are best suited for \texttt{dt-beg}.
%    \begin{macrocode}
FUNCTION {inbook}
{ output.bibitem
  author empty$
    { format.editors "author and editor" output.check
%<ay>      editor format.key output
%<au-col>      add.colon
%<nmdash>      name.or.dash
    }
    { format.authors output.nonnull
%<au-col>      add.colon
%<nmdash>      name.or.dash
      crossref missing$
        { "author and editor" editor either.or.check }
        'skip$
      if$
    }
  if$
%<dt-beg&!pub-date>  format.date "year" output.check
%<dt-beg&!pub-date>  date.block
%<!dt-beg&!blk-com&!blk-tit&!blk-tita>  new.block
  format.btitle "title" output.check
  crossref missing$
    {
%<pre-pub&numser>      format.number.series output
%<pre-pub>      format.publisher.address output
      format.bvolume output
%<*dt-beg|dt-end|!dt-jnl|a|!a>
      format.chapter.pages "chapter and pages" output.check
%</dt-beg|dt-end|!dt-jnl|a|!a>
%<!blk-com&!blk-tit&!blk-tita>      new.block
%<blk-tit&!tit-col>  new.sentence
%<blk-tit&tit-col>  add.colon
%<!numser>      format.number.series output
%<pre-edn>      format.edition output
%<!blk-com&!blk-tit&!blk-tita>      new.sentence
%<!pre-pub&numser>      format.number.series output
%<!pre-pub>      format.publisher.address output
    }
    {
%<*dt-beg|dt-end|!dt-jnl|a|!a>
      format.chapter.pages "chapter and pages" output.check
%</dt-beg|dt-end|!dt-jnl|a|!a>
%<!blk-com&!blk-tit&!blk-tita>      new.block
%<blk-tit&!tit-col>  new.sentence
%<blk-tit&tit-col>  add.colon
      format.book.crossref output.nonnull
%<!dt-beg&!dt-end&!dt-jnl&pub-date>      format.date "year" output.check
    }
  if$
%<!pre-edn>  format.edition output
%<!dt-beg&!dt-end&!dt-jnl&!pub-date>  format.date "year" output.check
%<*isbn>
  crossref missing$
    { format.isbn output }
    'skip$
  if$
%</isbn>
%<*(!dt-beg&!dt-end&dt-jnl)&!pub-date>
  format.date "year" output.check
  date.block
%</(!dt-beg&!dt-end&dt-jnl)&!pub-date>
%<pp-last>  format.pages "pages" output.check
%<doi|(url-doi&!url)>  format.doi output
%<*url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.url output
%</url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
%<(blk-com|blk-tit|blk-tita)&blknt>  new.sentence
  format.note output
%<*!dt-beg&dt-end&!pub-date>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.date "year" output.check
%</!dt-beg&dt-end&!pub-date>
%<eprint>  format.eprint output
%<revdata>  format.url output
  fin.entry
%<(harnm|url-nl)&!revdata>  write.url
}

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`incollection'}
%    \begin{macrocode}
FUNCTION {incollection}
{ output.bibitem
  format.authors "author" output.check
%<ay>  author format.key output
%<au-col>  add.colon
%<nmdash>  name.or.dash
%<dt-beg&!pub-date>  format.date "year" output.check
%<dt-beg&!pub-date>  date.block
%<!dt-beg&!blk-com&!blk-tit&!blk-tita>  new.block
%<*!jtit-x>
  format.title "title" output.check
%<blk-com&tit-qq>  end.quote.title
%<!blk-com&!blk-tit&!blk-tita>  new.block
%<blk-tit&!tit-col>  new.sentence
%<blk-tit&tit-col>  add.colon
%</!jtit-x>
  crossref missing$
    { format.in.ed.booktitle "booktitle" output.check
%<bt-qq>      end.quote.btitle
%<pre-pub&numser>      format.number.series output
%<pre-pub>      format.publisher.address output
%<!ser-ed>      format.bvolume output
%<!numser>      format.number.series output
%<pre-edn>      format.edition output
      format.chapter.pages output
%<!blk-com&!blk-tit&!blk-tita>      new.sentence
%<!pre-pub&numser>      format.number.series output
%<!pre-pub>      format.publisher.address output
%<!pre-edn>      format.edition output
%<!dt-beg&!dt-end&!dt-jnl&!pub-date>      format.date "year" output.check
%<isbn>      format.isbn output
    }
    { format.incoll.inproc.crossref output.nonnull
      format.chapter.pages output
    }
  if$
%<*(!dt-beg&!dt-end&dt-jnl)&!pub-date>
  format.date "year" output.check
  date.block
%</(!dt-beg&!dt-end&dt-jnl)&!pub-date>
%<pp-last>  format.pages "pages" output.check
%<doi|(url-doi&!url)>  format.doi output
%<*url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.url output
%</url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
%<(blk-com|blk-tit|blk-tita)&blknt>  new.sentence
  format.note output
%<*!dt-beg&dt-end&!pub-date>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.date "year" output.check
%</!dt-beg&dt-end&!pub-date>
%<eprint>  format.eprint output
%<revdata>  format.url output
  fin.entry
%<(harnm|url-nl)&!revdata>  write.url
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`inproceedings'}
%    \begin{macrocode}
FUNCTION {inproceedings}
{ output.bibitem
  format.authors "author" output.check
%<ay>  author format.key output
%<au-col>  add.colon
%<nmdash>  name.or.dash
%<dt-beg&!pub-date>  format.date "year" output.check
%<dt-beg&!pub-date>  date.block
%<!dt-beg&!blk-com&!blk-tit&!blk-tita>  new.block
%<*!jtit-x>
  format.title "title" output.check
%<blk-com&tit-qq>  end.quote.title
%<!blk-com&!blk-tit&!blk-tita>  new.block
%<blk-tit&!tit-col>  new.sentence
%<blk-tit&tit-col>  add.colon
%</!jtit-x>
  crossref missing$
    { format.in.ed.booktitle "booktitle" output.check
%<bt-qq>      end.quote.btitle
%<*!pre-pub>
%<!ser-ed>      format.bvolume output
%<!numser>      format.number.series output
%<(dt-beg|dt-end|!dt-jnl)&!pp-last>      format.pages output
%</!pre-pub>
%<!blk-com&!blk-tit&!blk-tita>      new.sentence
%<numser>      format.number.series output
      publisher empty$
        { format.organization.address output }
        { organization "organization" bibinfo.check output
          format.publisher.address output
        }
      if$
%<!dt-beg&!dt-end&!dt-jnl&!pub-date>      format.date "year" output.check
%<*pre-pub>
      format.bvolume output
%<!numser>      format.number.series output
%<(dt-beg|dt-end|!dt-jnl)&!pp-last>      format.pages output
%</pre-pub>
%<isbn>      format.isbn output
%<issn>      format.issn output
    }
    { format.incoll.inproc.crossref output.nonnull
%<(dt-beg|dt-end|!dt-jnl)&!pp-last>      format.pages output
    }
  if$
%<*!dt-beg&!dt-end&dt-jnl&!pp-last>
%<!pub-date>  format.date "year" output.check
%<!pub-date>  date.block
%<jdt-v|jdt-vs|jdt-p|!jdt-pc>  add.blank
  format.pages "pages" output.check
%</!dt-beg&!dt-end&dt-jnl&!pp-last>
%<pp-last>  format.pages "pages" output.check
%<doi|(url-doi&!url)>  format.doi output
%<*url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.url output
%</url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
%<(blk-com|blk-tit|blk-tita)&blknt>  new.sentence
  format.note output
%<*!dt-beg&dt-end&!pub-date>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.date "year" output.check
%</!dt-beg&dt-end&!pub-date>
%<eprint>  format.eprint output
%<revdata>  format.url output
  fin.entry
%<(harnm|url-nl)&!revdata>  write.url
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`conference'}
%    \begin{macrocode}
FUNCTION {conference} { inproceedings }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`manual'}
%    \begin{macrocode}
%<*ay>
FUNCTION {manual}
{ output.bibitem
  format.authors output
  author format.key output
%<au-col>  add.colon
%<nmdash>  name.or.dash
%<dt-beg>  format.date "year" output.check
%<dt-beg>  date.block
%<!dt-beg&!blk-com&!blk-tit&!blk-tita>  new.block
  format.btitle "title" output.check
%<blk-tit&!tit-col>  new.sentence
%<blk-tit&tit-col>  add.colon
%<!blk-com&!blk-tit&!blk-tita>  organization address new.block.checkb
  organization "organization" bibinfo.check output
  address "address" bibinfo.check output
  format.edition output
%<!dt-beg&!dt-end>  format.date "year" output.check
%<doi|(url-doi&!url)>  format.doi output
%<*url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.url output
%</url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
%<(blk-com|blk-tit|blk-tita)&blknt>  new.sentence
  format.note output
%<*!dt-beg&dt-end>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.date "year" output.check
%</!dt-beg&dt-end>
%<eprint>  format.eprint output
%<revdata>  format.url output
  fin.entry
%<(harnm|url-nl)&!revdata>  write.url
}

%</ay>
%<*!ay>
FUNCTION {manual}
{ output.bibitem
  author empty$
    { organization "organization" bibinfo.check
      duplicate$ empty$ 'pop$
        { output
          address "address" bibinfo.check output
        }
      if$
    }
    { format.authors output.nonnull }
  if$
%<au-col>  add.colon
%<nmdash>  name.or.dash
%<ay&dt-beg>  format.date "year" output.check
%<!ay&dt-beg>  format.date output
%<dt-beg>  date.block
%<!dt-beg&!blk-com&!blk-tit&!blk-tita>  new.block
  format.btitle "title" output.check
%<blk-tit&!tit-col>  new.sentence
%<blk-tit&tit-col>  add.colon
  author empty$
    { organization empty$
        {
%<!blk-com&!blk-tit&!blk-tita>          address new.block.checka
          address "address" bibinfo.check output
        }
        'skip$
      if$
    }
    {
%<!blk-com&!blk-tit&!blk-tita>      organization address new.block.checkb
      organization "organization" bibinfo.check output
      address "address" bibinfo.check output
    }
  if$
  format.edition output
%<ay&!dt-beg&!dt-end>  format.date "year" output.check
%<!ay&!dt-beg&!dt-end>  format.date output
%<doi|(url-doi&!url)>  format.doi output
%<*url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.url output
%</url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
%<(blk-com|blk-tit|blk-tita)&blknt>  new.sentence
  format.note output
%<*ay&!dt-beg&dt-end>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.date "year" output.check
%</ay&!dt-beg&dt-end>
%<*!ay&!dt-beg&dt-end>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.date output
%</!ay&!dt-beg&dt-end>
%<eprint>  format.eprint output
%<revdata>  format.url output
  fin.entry
%<(harnm|url-nl)&!revdata>  write.url
}

%</!ay>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`mastersthesis'}
% To format a master's thesis.
%    \begin{macrocode}
FUNCTION {mastersthesis}
{ output.bibitem
  format.authors "author" output.check
%<ay>  author format.key output
%<au-col>  add.colon
%<nmdash>  name.or.dash
%<dt-beg>  format.date "year" output.check
%<dt-beg>  date.block
%<!dt-beg&!blk-com&!blk-tit&!blk-tita>  new.block
%<*!thtit-x>
%<!thtit-a>  format.btitle
%<thtit-a>  format.title
  "title" output.check
%<thtit-a&blk-com&tit-qq>  end.quote.title
%<!blk-com&!blk-tit&!blk-tita>  new.block
%<blk-tit&!tit-col>  new.sentence
%<blk-tit&tit-col>  add.colon
%</!thtit-x>
  bbl.mthesis format.thesis.type output.nonnull
  school "school" bibinfo.warn output
  address "address" bibinfo.check output
%<!dt-beg&!dt-end>  format.date "year" output.check
%<doi|(url-doi&!url)>  format.doi output
%<*url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.url output
%</url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
%<(blk-com|blk-tit|blk-tita)&blknt>  new.sentence
  format.note output
%<*!dt-beg&dt-end>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.date "year" output.check
%</!dt-beg&dt-end>
%<eprint>  format.eprint output
%<revdata>  format.url output
  fin.entry
%<(harnm|url-nl)&!revdata>  write.url
}

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`misc'}
%    \begin{macrocode}
FUNCTION {misc}
{ output.bibitem
  format.authors output
%<ay>  author format.key output
%<au-col>  add.colon
%<nmdash>  name.or.dash
%<ay&dt-beg>  format.date "year" output.check
%<!ay&dt-beg>  format.date output
%<*ay>
%<dt-beg>  date.block
%<!dt-beg&!blk-com&!blk-tit&!blk-tita>  new.block
  format.title output
%<blk-com&tit-qq>  end.quote.title
%<!blk-com&!blk-tit&!blk-tita>  new.block
%<blk-tit&!tit-col>  new.sentence
%<blk-tit&tit-col>  add.colon
%</ay>
%<*!ay>
%<!blk-com&!blk-tit&!blk-tita>  title howpublished new.block.checkb
  format.title output
%<blk-com&tit-qq>  end.quote.title
%<blk-tit&!tit-col>  new.sentence
%<blk-tit&tit-col>  add.colon
%<!blk-com&!blk-tit&!blk-tita>  howpublished new.block.checka
%</!ay>
  howpublished "howpublished" bibinfo.check output
%<ay&!dt-beg&!dt-end>  format.date "year" output.check
%<!ay&!dt-beg&!dt-end>  format.date output
%<doi|(url-doi&!url)>  format.doi output
%<*url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.url output
%</url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
%<(blk-com|blk-tit|blk-tita)&blknt>  new.sentence
  format.note output
%<*ay&!dt-beg&dt-end>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.date "year" output.check
%</ay&!dt-beg&dt-end>
%<*!ay&!dt-beg&dt-end>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.date output
%</!ay&!dt-beg&dt-end>
%<eprint>  format.eprint output
%<revdata>  format.url output
  fin.entry
%<(harnm|url-nl)&!revdata>  write.url
%<!ay>  empty.misc.check
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`phdthesis'}
% To format a doctoral thesis.
%    \begin{macrocode}
FUNCTION {phdthesis}
{ output.bibitem
  format.authors "author" output.check
%<ay>  author format.key output
%<au-col>  add.colon
%<nmdash>  name.or.dash
%<dt-beg>  format.date "year" output.check
%<dt-beg>  date.block
%<!dt-beg&!blk-com&!blk-tit&!blk-tita>  new.block
%<*!thtit-x>
%<!thtit-a>  format.btitle
%<thtit-a>  format.title
  "title" output.check
%<thtit-a&blk-com&tit-qq>  end.quote.title
%<!blk-com&!blk-tit&!blk-tita>  new.block
%<blk-tit&!tit-col>  new.sentence
%<blk-tit&tit-col>  add.colon
%</!thtit-x>
  bbl.phdthesis format.thesis.type output.nonnull
  school "school" bibinfo.warn output
  address "address" bibinfo.check output
%<!dt-beg&!dt-end>  format.date "year" output.check
%<doi|(url-doi&!url)>  format.doi output
%<*url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.url output
%</url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
%<(blk-com|blk-tit|blk-tita)&blknt>  new.sentence
  format.note output
%<*!dt-beg&dt-end>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.date "year" output.check
%</!dt-beg&dt-end>
%<eprint>  format.eprint output
%<revdata>  format.url output
  fin.entry
%<(harnm|url-nl)&!revdata>  write.url
}

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`presentation'}
%    \begin{macrocode}
%<*pres>
FUNCTION {presentation}
{ output.bibitem
  format.authors output
%<ay>  author format.key output
%<au-col>  add.colon
%<nmdash>  name.or.dash
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.title output
%<blk-com&tit-qq>  end.quote.title
%<!blk-com&!blk-tit&!blk-tita>  new.block
%<blk-tit&!tit-col>  new.sentence
%<blk-tit&tit-col>  add.colon
  format.organization.address "organization and address" output.check
  month "month" output.check
  year "year" output.check
%<!blk-com&!blk-tit&!blk-tita>  new.block
%<(blk-com|blk-tit|blk-tita)&blknt>  new.sentence
  format.note output
  new.sentence
  type missing$ 'skip$
  {"(" type capitalize * ")" * output}
    if$
%<*url-blk&!harnm>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.url output
%</url-blk&!harnm>
  fin.entry
%<(harnm|url-nl)&!revdata>  write.url
}

%</pres>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`proceedings'}
%    \begin{macrocode}
%<*ay>
FUNCTION {proceedings}
{ output.bibitem
  format.editors output
  editor format.key output
%<au-col>  add.colon
%<nmdash>  name.or.dash
%<dt-beg>  format.date "year" output.check
%<dt-beg>  date.block
%<!dt-beg&!blk-com&!blk-tit&!blk-tita>  new.block
  format.btitle "title" output.check
  format.bvolume output
%<!numser>  format.number.series output
%<!blk-com&!blk-tit&!blk-tita>  new.sentence
%<numser>  format.number.series output
  publisher empty$
    { format.organization.address output }
    { organization "organization" bibinfo.check output
      format.publisher.address output
    }
  if$
%<!dt-beg&!dt-end&!pub-date>  format.date "year" output.check
%<isbn>  format.isbn output
%<issn>  format.issn output
%<doi|(url-doi&!url)>  format.doi output
%<*url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.url output
%</url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
%<(blk-com|blk-tit|blk-tita)&blknt>  new.sentence
  format.note output
%<*!dt-beg&dt-end&!pub-date>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.date "year" output.check
%</!dt-beg&dt-end&!pub-date>
%<eprint>  format.eprint output
%<revdata>  format.url output
  fin.entry
%<(harnm|url-nl)&!revdata>  write.url
}

%</ay>
%    \end{macrocode}
%    \begin{macrocode}
%<*!ay>
FUNCTION {proceedings}
{ output.bibitem
  editor empty$
    { organization "organization" bibinfo.check output
    }
    { format.editors output.nonnull }
  if$
%<au-col>  add.colon
%<nmdash>  name.or.dash
%<dt-beg>  format.date "year" output.check
%<dt-beg>  date.block
%<!dt-beg&!blk-com&!blk-tit&!blk-tita>  new.block
  format.btitle "title" output.check
  format.bvolume output
%<!numser>  format.number.series output
  editor empty$
    { publisher empty$
%<!numser>        'skip$
%<numser>        {  format.number.series output }
        {
%<!blk-com&!blk-tit&!blk-tita>          new.sentence
%<numser>          format.number.series output
          format.publisher.address output
        }
      if$
    }
    { publisher empty$
        {
%<!blk-com&!blk-tit&!blk-tita>          new.sentence
%<numser>          format.number.series output
          format.organization.address output }
        {
%<!blk-com&!blk-tit&!blk-tita>          new.sentence
%<numser>          format.number.series output
          organization "organization" bibinfo.check output
          format.publisher.address output
        }
      if$
     }
  if$
%<!dt-beg&!dt-end&!pub-date>      format.date "year" output.check
%<isbn>  format.isbn output
%<issn>  format.issn output
%<doi|(url-doi&!url)>  format.doi output
%<*url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.url output
%</url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
%<(blk-com|blk-tit|blk-tita)&blknt>  new.sentence
  format.note output
%<*!dt-beg&dt-end>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.date "year" output.check
%</!dt-beg&dt-end>
%<eprint>  format.eprint output
%<revdata>  format.url output
  fin.entry
%<(harnm|url-nl)&!revdata>  write.url
}

%</!ay>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`techreport'}
%    \begin{macrocode}
FUNCTION {techreport}
{ output.bibitem
  format.authors "author" output.check
%<ay>  author format.key output
%<au-col>  add.colon
%<nmdash>  name.or.dash
%<dt-beg>  format.date "year" output.check
%<dt-beg>  date.block
%<!dt-beg&!blk-com&!blk-tit&!blk-tita>  new.block
%<trtit-b>  format.btitle
%<!trtit-b>  format.title
  "title" output.check
%<!trtit-b&blk-com&tit-qq>  end.quote.title
%<!blk-com&!blk-tit&!blk-tita>  new.block
%<blk-tit&!tit-col>  new.sentence
%<blk-tit&tit-col>  add.colon
%<!trnum-it>  format.tr.number output.nonnull
%<trnum-it>  format.tr.number emphasize output.nonnull
  institution "institution" bibinfo.warn output
  address "address" bibinfo.check output
%<!dt-beg&!dt-end>  format.date "year" output.check
%<doi|(url-doi&!url)>  format.doi output
%<*url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.url output
%</url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
%<(blk-com|blk-tit|blk-tita)&blknt>  new.sentence
  format.note output
%<*!dt-beg&dt-end>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.date "year" output.check
%</!dt-beg&dt-end>
%<eprint>  format.eprint output
%<revdata>  format.url output
  fin.entry
%<(harnm|url-nl)&!revdata>  write.url
}

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`unpublished'}
%    \begin{macrocode}
FUNCTION {unpublished}
{ output.bibitem
  format.authors "author" output.check
%<ay>  author format.key output
%<au-col>  add.colon
%<nmdash>  name.or.dash
%<ay&dt-beg>  format.date "year" output.check
%<!ay&dt-beg>  format.date output
%<dt-beg>  date.block
%<!dt-beg&!blk-com&!blk-tit&!blk-tita>  new.block
  format.title "title" output.check
%<blk-com&tit-qq>  end.quote.title
%<ay&!dt-beg&!dt-end>  format.date "year" output.check
%<!ay&!dt-beg&!dt-end>  format.date output
%<doi|(url-doi&!url)>  format.doi output
%<*url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.url output
%</url-blk&!harnm&!revdata>
%<!blk-com&!blk-tit&!blk-tita>  new.block
%<(blk-com|blk-tit|blk-tita)&blknt>  new.sentence
  format.note "note" output.check
%<*ay&!dt-beg&dt-end>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.date output
%</ay&!dt-beg&dt-end>
%<*!ay&!dt-beg&dt-end>
%<!blk-com&!blk-tit&!blk-tita>  new.block
  format.date output
%</!ay&!dt-beg&dt-end>
%<eprint>  format.eprint output
%<revdata>  format.url output
  fin.entry
%<(harnm|url-nl)&!revdata>  write.url
}

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`default.type'}
%    \begin{macrocode}
FUNCTION {default.type} { misc }
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
READ
%    \end{macrocode}
%
%    \begin{macrocode}
%<*ay|alph|!seq-no>
%    \end{macrocode}
%
% \begin{macro}{`sortify'}
% In \texttt{btxbst.doc}/\texttt{.mbs}, the \texttt{sortify} function is
% left out for unsorted alpha-style citations. This leads to an error,
% because it is still used. So leave it in here too. \emph{In fact, do away
% with unsorted alpha style, since it is as useless as unsorted author--year
% listings.}
%    \begin{macrocode}
FUNCTION {sortify}
{ purify$
  "l" change.case$
}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
INTEGERS { len }
%    \end{macrocode}
%
% \begin{macro}{`chop.word'}
%    \begin{macrocode}
FUNCTION {chop.word}
{ 's :=
  'len :=
  s #1 len substring$ =
    { s len #1 + global.max$ substring$ }
    's
  if$
}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
%<*!ay&alph>
%    \end{macrocode}
%
% \begin{macro}{`format.lab.names'}
% The function \texttt{format.lab.names} formats by author--year or the
% \texttt{alpha} style as in the original \texttt{alpha.bst}.
% Only major difference is that there should be no unsorted (\texttt{seq-no})
% versions of this. Patashnik was clearly very unhappy about accommodating
% such an animal, and in fact, his unsorted alpha style crashes \btx.
% I also provide the \texttt{vonx} option here to ignore the \textsl{von}
% part of the name.
%
%    \begin{macrocode}
INTEGERS { et.al.char.used }
%    \end{macrocode}
%
%    \begin{macrocode}
FUNCTION {initialize.et.al.char.used}
{ #0 'et.al.char.used :=
}
%    \end{macrocode}
%
%    \begin{macrocode}
EXECUTE {initialize.et.al.char.used}
%    \end{macrocode}
%
%    \begin{macrocode}
FUNCTION {format.lab.names}
{ 's :=
%<*alf-1>
%<!vonx>  s #1 "{v{}}{l{}}" format.name$
%<vonx>  s #1 "{l{}}" format.name$
  duplicate$ text.length$ #2 <
    { pop$ s #1 "{ll}" format.name$ #3 text.prefix$ }
      'skip$
    if$
%</alf-1>
%<*!alf-1&alf-f>
%<!vonx>  s #1 "{vv{}}{ll}" format.name$
%<vonx>  s #1 "{ll}" format.name$
%</!alf-1&alf-f>
%<*!alf-1&!alf-f>
  s num.names$ 'numnames :=
  numnames #1 >
    { numnames #4 >
        { #3 'namesleft := }
        { numnames 'namesleft := }
      if$
      #1 'nameptr :=
      ""
        { namesleft #0 > }
        { nameptr numnames =
            { s nameptr "{ff }{vv }{ll}{ jj}" format.name$ "others" =
                { "{\etalchar{+}}" *
                  #1 'et.al.char.used :=
                }
%<!vonx>                { s nameptr "{v{}}{l{}}" format.name$ * }
%<vonx>                { s nameptr "{l{}}" format.name$ * }
              if$
            }
%<!vonx>            { s nameptr "{v{}}{l{}}" format.name$ * }
%<vonx>            { s nameptr "{l{}}" format.name$ * }
          if$
          nameptr #1 + 'nameptr :=
          namesleft #1 - 'namesleft :=
        }
      while$
      numnames #4 >
        { "{\etalchar{+}}" *
          #1 'et.al.char.used :=
        }
        'skip$
      if$
    }
%<!vonx>    { s #1 "{v{}}{l{}}" format.name$
%<vonx>    { s #1 "{l{}}" format.name$
      duplicate$ text.length$ #2 <
        { pop$ s #1 "{ll}" format.name$ #3 text.prefix$ }
        'skip$
      if$
    }
  if$
%</!alf-1&!alf-f>
}
%    \end{macrocode}
%
%    \begin{macrocode}
%</!ay&alph>
%    \end{macrocode}
% The function for the standard citation: one or two authors cited full, but for
%  more than two, only the first with \emph{et~al.} given.
%    \begin{macrocode}
%<*ay&!mcite>
FUNCTION {format.lab.names}
{ 's :=
  "" 't :=
%<!jnrlab>  s #1 "{vv~}{ll}" format.name$
%<*jnrlab>
%<!nm-rv&!nm-rvv&!nm-rvx&!nm-rvcx>  s #1 "{vv~}{ll}{, jj}" format.name$
%<nm-rv|nm-rvv|nm-rvx|nm-rvcx>  s #1 "{vv~}{ll}{ jj}" format.name$
%</jnrlab>
%<lab&and-rm>  cite.name.font
  s num.names$ duplicate$
  #2 >
    { pop$
%<lab&!and-rm&(etal-it|etal-rm)>      cite.name.font
%<*!etal-it>
%<lab&and-rm&!etal-rm>      " " * bbl.etal cite.name.font *
%<!lab|!and-rm|etal-rm>      " " * bbl.etal *
%</!etal-it>
%<etal-it>      " " * bbl.etal emphasize *
%<lab&!and-rm&!(etal-it|etal-rm)>      cite.name.font
%<lab&!and-rm>      "others" 't :=
    }
    { #2 <
        'skip$
        { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
            {
% %<lab&!and-rm&(etal-it|etal-rm)>              cite.name.font
%<*!etal-it>
%<lab&and-rm&!etal-rm>              " " * bbl.etal cite.name.font *
%<!lab|!and-rm|etal-rm>              " " * bbl.etal *
%</!etal-it>
%<etal-it>              " " * bbl.etal emphasize *
%<lab&!and-rm&!(etal-it|etal-rm)>              cite.name.font
%<lab&!and-rm>              "others" 't :=
            }
%<*!harnm>
%<*!amper>
            { bbl.and space.word * s #2 "{vv~}{ll}" format.name$
%<lab&and-rm>              cite.name.font
              * }
%</!amper>
%<*amper>
            { " \& " * s #2 "{vv~}{ll}" format.name$
%<lab&and-rm>              cite.name.font
              * }
%</amper>
%</!harnm>
%<*harnm>
            { " \harvardand{} " * s #2 "{vv~}{ll}" format.name$
%<lab&and-rm>              cite.name.font
              * }
%</harnm>
          if$
        }
      if$
    }
  if$
%<*lab&!and-rm>
  t "others" =
    'skip$
    { cite.name.font }
  if$
%</lab&!and-rm>
}

%</ay&!mcite>
%    \end{macrocode}
%
% The code for formating author--year citations with more than one author
% before \emph{et al.} or selecting a number other than two for truncating,
% is much the same as the \texttt{format.full.names} function.
%    \begin{macrocode}
%<*ay&mcite>
FUNCTION {format.lab.names}
{'s :=
 "" 't :=
  #1 'nameptr :=
  s num.names$ 'numnames :=
  numnames 'namesleft :=
    { namesleft #0 > }
    { s nameptr
%<!jnrlab>      "{vv~}{ll}" format.name$
%<*jnrlab>
%<!nm-rv&!nm-rvv&!nm-rvx&!nm-rvcx>      "{vv~}{ll}{, jj}" format.name$
%<nm-rv|nm-rvv|nm-rvx|nm-rvcx>      "{vv~}{ll}{ jj}" format.name$
%</jnrlab>
%<lab&and-rm>      cite.name.font
      't :=
      nameptr #1 >
        {
%<mct-1>          nameptr #2 =
%<mct-2>          nameptr #3 =
%<mct-3>          nameptr #4 =
%<mct-4>          nameptr #5 =
%<mct-5>          nameptr #6 =
%<mct-6>          nameptr #7 =
%<mct-x2>          numnames #2 > and
%<mct-x3>          numnames #3 > and
%<mct-x4>          numnames #4 > and
%<mct-x5>          numnames #5 > and
%<mct-x6>          numnames #6 > and
            { "others" 't :=
              #1 'namesleft := }
            'skip$
          if$
          namesleft #1 >
            { ", " * t * }
            {
              s nameptr "{ll}" format.name$ duplicate$ "others" =
                { 't := }
                { pop$ }
              if$
              t "others" =
                {
%<lab&!and-rm&(etal-it|etal-rm)>                  cite.name.font
%<*!etal-it>
%<lab&and-rm&!etal-rm>                  " " * bbl.etal cite.name.font *
%<!lab|!and-rm|etal-rm>                  " " * bbl.etal *
%</!etal-it>
%<etal-it>                  " " * bbl.etal emphasize *
%<lab&!and-rm&!(etal-it|etal-rm)>                  cite.name.font
                }
                {
%<*!harnm>
%<*!and-xcom>
                  numnames #2 >
                    { "," * }
                    'skip$
                  if$
%</!and-xcom>
%<!amper>                  bbl.and
%<amper>                  "\&"
%</!harnm>
%<harnm>                  "\harvardand{}"
                  space.word * t *
                }
              if$
            }
          if$
        }
        't
      if$
      nameptr #1 + 'nameptr :=
      namesleft #1 - 'namesleft :=
    }
  while$
%<*lab&!and-rm>
  t "others" =
    'skip$
    { cite.name.font }
  if$
%</lab&!and-rm>
}

%</ay&mcite>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`author.key.label'}
% \begin{macro}{`author.editor.key.label'}
% \begin{macro}{`author.key.organization.label'}
% \begin{macro}{`editor.key.organization.label'}
% \begin{macro}{`editor.key.label'}
% Have to be very careful with the options \texttt{ay}, \texttt{alph}, and
% \texttt{seq-no} here. The first two are actually mutually exclusive, and
% \texttt{ay} should dominate. The \texttt{seq-no} option only applies for
% numerical (\texttt{!ay}) but not alphabetic (\texttt{alph}) selections.
% This whole block of coding dealing with labels is only included for
% author--year or alphabetic or ordered numerical.
% That is, \texttt{ay} or \texttt{alph} or \texttt{!seq-no} is true.
%    \begin{macrocode}
%<*ay|alph>
FUNCTION {author.key.label}
{ author empty$
    { key empty$
        { cite$ #1 #3 substring$ }
%<ay>        'key
%<!ay>        { key #3 text.prefix$ }
      if$
    }
    { author format.lab.names }
  if$
}

FUNCTION {author.editor.key.label}
{ author empty$
    { editor empty$
        { key empty$
            { cite$ #1 #3 substring$ }
%<ay>            'key
%<!ay>            { key #3 text.prefix$ }
          if$
        }
        { editor format.lab.names }
      if$
    }
    { author format.lab.names }
  if$
}

%</ay|alph>
%<*!ay&alph>
FUNCTION {author.key.organization.label}
{ author empty$
    { key empty$
        { organization empty$
            { cite$ #1 #3 substring$ }
            { "The " #4 organization chop.word #3 text.prefix$ }
          if$
        }
        { key #3 text.prefix$ }
      if$
    }
    { author format.lab.names }
  if$
}

FUNCTION {editor.key.organization.label}
{ editor empty$
    { key empty$
        { organization empty$
            { cite$ #1 #3 substring$ }
            { "The " #4 organization chop.word #3 text.prefix$ }
          if$
        }
        { key #3 text.prefix$ }
      if$
    }
    { editor format.lab.names }
  if$
}

%</!ay&alph>
%<*ay>
FUNCTION {editor.key.label}
{ editor empty$
    { key empty$
        { cite$ #1 #3 substring$ }
        'key
      if$
    }
    { editor format.lab.names }
  if$
}

%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{`calc.short.authors'}
%    \begin{macrocode}
FUNCTION {calc.short.authors}
{ type$ "book" =
  type$ "inbook" =
  or
    'author.editor.key.label
    { type$ "proceedings" =
        'editor.key.label
        'author.key.label
      if$
    }
  if$
  'short.list :=
}

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`calc.label'}
%    \begin{macrocode}
FUNCTION {calc.label}
{ calc.short.authors
  short.list
%<!(har|ast|cay|nmd|alk|cn)>  "("
%<har|ast|cay|nmd|alk|cn>  ", "
  *
  year duplicate$ empty$
%<keyxyr>  short.list key field.or.null = or
%<(blkyear|keyxyr)>     { pop$ "" }
%<!(blkyear|keyxyr)>     { pop$ "????" }
%<!note-yr>     { purify$ #-1 #4 substring$ }
%<note-yr>     'skip$
  if$
  *
  'label :=
}

%</ay>
%<*!ay&alph>
FUNCTION {calc.label}
{ type$ "book" =
  type$ "inbook" =
  or
    'author.editor.key.label
    { type$ "proceedings" =
        'editor.key.organization.label
        { type$ "manual" =
            'author.key.organization.label
            'author.key.label
          if$
        }
      if$
    }
  if$
  duplicate$
  year field.or.null purify$ #-1 #2 substring$
  *
  'label :=
  year field.or.null purify$ #-1 #4 substring$
  *
  sortify 'sort.label :=
}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
%</!ay&alph>
%    \end{macrocode}
%
%    \begin{macrocode}
%<*ay>
%    \end{macrocode}
%
%    \begin{macrocode}
%<*har|cay|nmd|ast|cn>
%    \end{macrocode}
%
% \begin{macro}{`calc.short.label'}
%    \begin{macrocode}
FUNCTION {calc.short.label}
{ calc.short.authors short.list
  'label :=
}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
%</har|cay|nmd|ast|cn>
%    \end{macrocode}
%
%    \begin{macrocode}
%</ay>
%    \end{macrocode}
%
% \begin{macro}{`sort.format.names'}
%    \begin{macrocode}
FUNCTION {sort.format.names}
{ 's :=
  #1 'nameptr :=
  ""
  s num.names$ 'numnames :=
  numnames 'namesleft :=
    { namesleft #0 > }
    { s nameptr
%<*xintls>
%<!vonx>      "{vv{ } }{ll{ }}"
%<vonx>      "{ll{ }}"
%</xintls>
%<*!xintls>
%<*!nm-init&!nm-rev&!nm-rev1&!nm-rv&!nm-rvx&!nm-rvcx&!nm-rvv&!nm-rvvc>
%<!vonx>      "{vv{ } }{ll{ }}{  ff{ }}{  jj{ }}"
%<vonx>      "{ll{ }}{  ff{ }}{  jj{ }}"
%</!nm-init&!nm-rev&!nm-rev1&!nm-rv&!nm-rvx&!nm-rvcx&!nm-rvv&!nm-rvvc>
%<*nm-init|nm-rev|nm-rev1|nm-rv|nm-rvx|nm-rvcx|nm-rvv|nm-rvvc>
%<!vonx>      "{vv{ } }{ll{ }}{  f{ }}{  jj{ }}"
%<vonx>      "{ll{ }}{  f{ }}{  jj{ }}"
%</nm-init|nm-rev|nm-rev1|nm-rv|nm-rvx|nm-rvcx|nm-rvv|nm-rvvc>
%</!xintls>
      format.name$ 't :=
      nameptr #1 >
        {
%<*nmlm>
%<m1>          nameptr #1
%<m2>          nameptr #2
%<m3>          nameptr #3
%<m4>          nameptr #4
%<m5>          nameptr #5
%<m6>          nameptr #6
%<m7>          nameptr #7
%<m8>          nameptr #8
%<m9>          nameptr #9
%<m0>          nameptr #0
%<m10>          #10 +
%<m20>          #20 +
%<m30>          #30 +
%<m40>          #40 +
%<m50>          #50 +
%<m60>          #60 +
%<m70>          #70 +
%<m80>          #80 +
%<m90>          #90 +
          #1 + =
%<x1>          numnames #1
%<x2>          numnames #2
%<x3>          numnames #3
%<x4>          numnames #4
%<x5>          numnames #5
%<x6>          numnames #6
%<x7>          numnames #7
%<x8>          numnames #8
%<x9>          numnames #9
%<x0>          numnames #0
%<x10>          #10 +
%<x20>          #20 +
%<x30>          #30 +
%<x40>          #40 +
%<x50>          #50 +
%<x60>          #60 +
%<x70>          #70 +
%<x80>          #80 +
%<x90>          #90 +
          > and
            { "others" 't :=
              #1 'namesleft := }
            'skip$
          if$
%</nmlm>
          "   "  *
          namesleft #1 = t "others" = and
            { "zzzzz" 't := }
            'skip$
          if$
%<*seq-lab|seq-key|seq-labc>
          numnames #2 > nameptr #2 = and
            { "zz" * year field.or.null * "   " *
%<seq-labc>              #1 'namesleft :=
            }
%<seq-labc>            { t sortify * }
%<!seq-labc>            'skip$
          if$
%</seq-lab|seq-key|seq-labc>
%<!seq-labc>          t sortify *
        }
        { t sortify * }
      if$
      nameptr #1 + 'nameptr :=
      namesleft #1 - 'namesleft :=
    }
  while$
}

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`sort.format.title'}
%    \begin{macrocode}
FUNCTION {sort.format.title}
{ 't :=
  "A " #2
    "An " #3
      "The " #4 t chop.word
    chop.word
  chop.word
  sortify
  #1 global.max$ substring$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`author.sort'}
%    \begin{macrocode}
FUNCTION {author.sort}
{ author empty$
    { key empty$
        { "to sort, need author or key in " cite$ * warning$
          ""
        }
        { key sortify }
      if$
    }
    { author sort.format.names }
  if$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`author.editor.sort'}
%    \begin{macrocode}
FUNCTION {author.editor.sort}
{ author empty$
    { editor empty$
        { key empty$
            { "to sort, need author, editor, or key in " cite$ * warning$
              ""
            }
            { key sortify }
          if$
        }
        { editor sort.format.names }
      if$
    }
    { author sort.format.names }
  if$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`negate.year'}
% This function negates the year by substituting each digit by its
% complement. That is, 0 $\rightarrow$ 9, 1 $\rightarrow$ 8, etc. This is used
% to provide ordering by descending year (latest year first).
%    \begin{macrocode}
%<*seq-yrr&!seq-yr>
FUNCTION {negate.year}
{ year empty$
    { "99999" }
    { year #1 #1 substring$ chr.to.int$ #105 swap$ - int.to.chr$
      year #2 #1 substring$ chr.to.int$ #105 swap$ - int.to.chr$ *
      year #3 #1 substring$ chr.to.int$ #105 swap$ - int.to.chr$ *
      year #4 #1 substring$ chr.to.int$ #105 swap$ - int.to.chr$ *
    }
    if$
}
%</seq-yrr&!seq-yr>
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
%<*ay>
%    \end{macrocode}
%
% \begin{macro}{`editor.sort'}
%    \begin{macrocode}
FUNCTION {editor.sort}
{ editor empty$
    { key empty$
        { "to sort, need editor or key in " cite$ * warning$
          ""
        }
        { key sortify }
      if$
    }
    { editor sort.format.names }
  if$
}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
%<*seq-no>
%    \end{macrocode}
%
%    \begin{macrocode}
INTEGERS { seq.num }
%    \end{macrocode}
%
% \begin{macro}{`init.seq'}
%    \begin{macrocode}
FUNCTION {init.seq}
{ #0 'seq.num :=}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
EXECUTE {init.seq}
%    \end{macrocode}
%
% \begin{macro}{`int.to.fix'}
%    \begin{macrocode}
FUNCTION {int.to.fix}
{ "000000000" swap$ int.to.str$ *
  #-1 #10 substring$
}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
%</seq-no>
%    \end{macrocode}
%
% \begin{macro}{`presort'}
% For unsorted author--year, make up the final sorting order in
% \texttt{sort.label} with the original sequence number, for unsorting later.
%    \begin{macrocode}
FUNCTION {presort}
{ calc.label
  label sortify
  "    "
  *
%<*!seq-no>
  type$ "book" =
  type$ "inbook" =
  or
    'author.editor.sort
    { type$ "proceedings" =
        'editor.sort
        'author.sort
      if$
    }
  if$
  #1 entry.max$ substring$
%</!seq-no>
%<*seq-no>
  seq.num #1 + 'seq.num :=
  seq.num  int.to.fix
%</seq-no>
  'sort.label :=
  sort.label
  *
%<seq-yr>  "    " * year field.or.null *
%<seq-yrr&!seq-yr>  "    " * negate.year field.or.null *
%<*!seq-key&!seq-labc&!seq-yr&!seq-yrr>
  "    "
  *
  title field.or.null
  sort.format.title
  *
%</!seq-key&!seq-labc&!seq-yr&!seq-yrr>
%<seq-key|seq-yr|seq-yrr>  "    " * cite$ *
  #1 entry.max$ substring$
  'sort.key$ :=
%  "For " cite$ * ", sort.key=" * sort.key$ * warning$
}

%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
%</ay>
%    \end{macrocode}
%
%    \begin{macrocode}
%<*!ay>
%    \end{macrocode}
%
% \begin{macro}{`author.organization.sort'}
%    \begin{macrocode}
FUNCTION {author.organization.sort}
{ author empty$
    { organization empty$
        { key empty$
            { "to sort, need author, organization, or key in " cite$ * warning$
              ""
            }
            { key sortify }
          if$
        }
        { "The " #4 organization chop.word sortify }
      if$
    }
    { author sort.format.names }
  if$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`editor.organization.sort'}
%    \begin{macrocode}
FUNCTION {editor.organization.sort}
{ editor empty$
    { organization empty$
        { key empty$
            { "to sort, need editor, organization, or key in " cite$ * warning$
              ""
            }
            { key sortify }
          if$
        }
        { "The " #4 organization chop.word sortify }
      if$
    }
    { editor sort.format.names }
  if$
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`presort'}
%    \begin{macrocode}
FUNCTION {presort}
%<*alph>
{ calc.label
  sort.label
  "    "
  *
  type$ "book" =
%</alph>
%<!alph>{ type$ "book" =
  type$ "inbook" =
  or
    'author.editor.sort
    { type$ "proceedings" =
        'editor.organization.sort
        { type$ "manual" =
            'author.organization.sort
            'author.sort
          if$
        }
      if$
    }
  if$
%<alph>  *
  "    "
  *
%<seq-yrr>  negate.year field.or.null sortify
%<!seq-yrr>  year field.or.null sortify
%<!(seq-yr|seq-yrr)|alph>  *
  "    "
  *
%<(seq-yr|seq-yrr)&!alph>  swap$ *
  title field.or.null
  sort.format.title
  *
  #1 entry.max$ substring$
  'sort.key$ :=
}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
%</!ay>
%    \end{macrocode}
%
%    \begin{macrocode}
ITERATE {presort}
%    \end{macrocode}
%
%    \begin{macrocode}
SORT
%    \end{macrocode}
%
%    \begin{macrocode}
%</ay|alph|!seq-no>
%    \end{macrocode}
%
% With version~6.0 of \texttt{natbib}, the author-year styles can also be
% used for numerical citations; then the \texttt{thebibliography} environment
% must have an argument indicating the length of the longest label.
% Simply count the references and add this number as the argument.
%    \begin{macrocode}
%<*ay>
%    \end{macrocode}
%
%    \begin{macrocode}
STRINGS { last.label next.extra }
%    \end{macrocode}
%
% With computer-generated articles, it is possible to have more than 26 articles
% in one year. It has finally occurred that the extra labels go beyond `z'.
% The current code now allows for `aa', \dots `az', 'ba', \dots `zz'. This
% code was provided by Joseph Wright (2007 Oct 10).
%    \begin{macrocode}
INTEGERS { last.extra.num last.extra.num.extended last.extra.num.blank number.label }
%    \end{macrocode}
%
% \begin{macro}{`initialize.extra.label.stuff'}
%    \begin{macrocode}
FUNCTION {initialize.extra.label.stuff}
{ #0 int.to.chr$ 'last.label :=
  "" 'next.extra :=
  #0 'last.extra.num :=
  "a" chr.to.int$ #1 - 'last.extra.num.blank :=
  last.extra.num.blank 'last.extra.num.extended :=
  #0 'number.label :=
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`forward.pass'}
%    \begin{macrocode}
FUNCTION {forward.pass}
{ last.label label =
    { last.extra.num #1 + 'last.extra.num :=
      last.extra.num "z" chr.to.int$ >
       { "a" chr.to.int$ 'last.extra.num :=
         last.extra.num.extended #1 + 'last.extra.num.extended :=
       }
       'skip$
      if$
      last.extra.num.extended last.extra.num.blank >
        { last.extra.num.extended int.to.chr$
          last.extra.num int.to.chr$
          * 'extra.label := }
        { last.extra.num int.to.chr$ 'extra.label := }
      if$
    }
    { "a" chr.to.int$ 'last.extra.num :=
      "" 'extra.label :=
      label 'last.label :=
    }
  if$
  number.label #1 + 'number.label :=
}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
%</ay>
%    \end{macrocode}
%
%    \begin{macrocode}
%<*!ay&alph>
%    \end{macrocode}
%
%    \begin{macrocode}
STRINGS { longest.label last.sort.label next.extra }
%    \end{macrocode}
%
%    \begin{macrocode}
INTEGERS { longest.label.width last.extra.num }
%    \end{macrocode}
%
% \begin{macro}{`initialize.longest.label'}
%    \begin{macrocode}
FUNCTION {initialize.longest.label}
{ "" 'longest.label :=
  #0 int.to.chr$ 'last.sort.label :=
  "" 'next.extra :=
  #0 'longest.label.width :=
  #0 'last.extra.num :=
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`forward.pass'}
%    \begin{macrocode}
FUNCTION {forward.pass}
{ last.sort.label sort.label =
    { last.extra.num #1 + 'last.extra.num :=
      last.extra.num int.to.chr$ 'extra.label :=
    }
    { "a" chr.to.int$ 'last.extra.num :=
      "" 'extra.label :=
      sort.label 'last.sort.label :=
    }
  if$
}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
%</!ay&alph>
%    \end{macrocode}
%
% \begin{macro}{`reverse.pass'}
% The extra label is added in braces so that natbib can treat it as one unit.
% This allows extra labels to be more than one letter long. For non-NFSS
% emphasizing, this is no problem, since labels go in |{\em a}|, but for
% non-emphasizing and for NFSS, it caused troubles without the braces.
% The trouble arises with multiple citations in one |\cite| in which
% authors and years are the same, and only the extra label is given for
% the next one. Note: |\emph{a}| is more than one letter long in this sense,
% so it is not just a problem for more than 26 papers with same authors and
% year.
%
% The command |\natexlab| now encloses the extra label for \texttt{natbib}
% styles. This command normally just prints its argument, but for numerical
% citation mode, it swallows its argument. This allows the extra labels to
% be suppressed for numerical citations where they are superfluous.
% The enclosing braces mentioned above must be included here to make the
% entire extra label text a single token for \texttt{natbib}.
%    \begin{macrocode}
%<*ay>
%    \end{macrocode}
%
%    \begin{macrocode}
FUNCTION {reverse.pass}
{ next.extra "b" =
    { "a" 'extra.label := }
    'skip$
  if$
  extra.label 'next.extra :=
  extra.label
%<xlab-it>  emphasize
%<*!html>
  duplicate$ empty$
    'skip$
    { "{\natexlab{" swap$ * "}}" * }
  if$
%</!html>
  'extra.label :=
%<!(har|ast|cay|nmd|cn)>  label extra.label * 'label :=
}
%    \end{macrocode}
%
%    \begin{macrocode}
%</ay>
%    \end{macrocode}
%
%    \begin{macrocode}
%<*!ay&alph>
%    \end{macrocode}
%
%    \begin{macrocode}
FUNCTION {reverse.pass}
{ next.extra "b" =
    { "a" 'extra.label := }
    'skip$
  if$
  label extra.label * 'label :=
  label width$ longest.label.width >
    { label 'longest.label :=
      label width$ 'longest.label.width :=
    }
    'skip$
  if$
  extra.label 'next.extra :=
}
%    \end{macrocode}
%
%    \begin{macrocode}
%</!ay&alph>
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
%<ay>EXECUTE {initialize.extra.label.stuff}
%<!ay&alph>EXECUTE {initialize.longest.label}
%    \end{macrocode}
%
%    \begin{macrocode}
%<*ay|alph>
ITERATE {forward.pass}
%    \end{macrocode}
%
%    \begin{macrocode}
REVERSE {reverse.pass}
%    \end{macrocode}
%
%    \begin{macrocode}
%</ay|alph>
%    \end{macrocode}
%
%    \begin{macrocode}
%<*ay>
FUNCTION {bib.sort.order}
{ sort.label
  "    "
  *
%<seq-yrr>  negate.year field.or.null sortify
%<!seq-yrr>  year field.or.null sortify
%<(seq-yr|seq-yrr)&!(seq-lab|seq-key|seq-labc)>  swap$
  *
%<*!seq-key&!seq-labc&!seq-yr&!seq-yrr>
  "    "
  *
  title field.or.null
  sort.format.title
  *
%</!seq-key&!seq-labc&!seq-yr&!seq-yrr>
%<seq-key|seq-yr|seq-yrr>  "    " * cite$ *
  #1 entry.max$ substring$
  'sort.key$ :=
%  "For " cite$ * ", bib.sort.key=" * sort.key$ * warning$
%<har|cay|nmd|cn|ast>  calc.short.label
}
%    \end{macrocode}
%
%    \begin{macrocode}
ITERATE {bib.sort.order}
%    \end{macrocode}
%
%    \begin{macrocode}
SORT
%    \end{macrocode}
%
%    \begin{macrocode}
%</ay>
%    \end{macrocode}
%
%    \begin{macrocode}
%<*!ay&!alph>
%    \end{macrocode}
%
%    \begin{macrocode}
STRINGS { longest.label }
%    \end{macrocode}
%
%    \begin{macrocode}
INTEGERS { number.label longest.label.width }
%    \end{macrocode}
%
%    \begin{macrocode}
FUNCTION {initialize.longest.label}
{ "" 'longest.label :=
  #1 'number.label :=
  #0 'longest.label.width :=
}
%    \end{macrocode}
%
%    \begin{macrocode}
FUNCTION {longest.label.pass}
%<*!cite>
{ number.label int.to.str$ 'label :=
  number.label #1 + 'number.label :=
%</!cite>
%<cite>{ cite$ 'label :=
  label width$ longest.label.width >
    { label 'longest.label :=
      label width$ 'longest.label.width :=
    }
    'skip$
  if$
}
%    \end{macrocode}
%
%    \begin{macrocode}
EXECUTE {initialize.longest.label}
%    \end{macrocode}
%
%    \begin{macrocode}
ITERATE {longest.label.pass}
%    \end{macrocode}
%
%    \begin{macrocode}
%</!ay&!alph>
%    \end{macrocode}
%
% \begin{macro}{`begin.bib'}
% The function \texttt{begin.bib} writes  the initial text to the \texttt{.bbl}
% file. The most important matter here is that the \texttt{thebibliography}
% environment is invoked.
%
% Note: the French quotation marks are called `guillimets'; Adobe erroneously
% named the symbols `guillimot', which is an arctic bird. The error has so
% propagated, that it can no longer be corrected. \LaTeX\ took it over.
%    \begin{macrocode}
FUNCTION {begin.bib}
%<*!html>
%<*!ay&alph>
{ et.al.char.used
    { "\newcommand{\etalchar}[1]{$^{#1}$}" write$ newline$ }
    'skip$
  if$
  preamble$ empty$
%</!ay&alph>
%<ay|!alph>{ preamble$ empty$
    'skip$
    { preamble$ write$ newline$ }
  if$
%<ay>  "\begin{thebibliography}{" number.label int.to.str$ * "}" *
%<!ay>  "\begin{thebibliography}{"  longest.label  * "}" *
  write$ newline$
%<*(!nmft&(nmft-it|nmft-sc|nmft-bf|nmft-def))|(!lab&(lab-it|lab-bf|lab-sc|lab-def))>
 "\typeout{**********************************}" write$ newline$
 "\typeout{WARNING WARNING WARNING WARNING WARNING}" write$ newline$
 "\typeout{The bst file has been generated with inconsistent options}"
   write$ newline$
 "\typeout{Read the warning message at the start of the bst file}"
   write$ newline$
 "\typeout{**********************************}" write$ newline$
%</(!nmft&(nmft-it|nmft-sc|nmft-bf|nmft-def))|(!lab&(lab-it|lab-bf|lab-sc|lab-def))>
%<*!plntx>
%<!tit-it&tit-qq&qt-s>  "\newcommand{\enquote}[1]{`#1'}"
%<!tit-it&tit-qq&!qt-s&!qt-g>  "\newcommand{\enquote}[1]{``#1''}"
%</!plntx>
%<*plntx>
%<!tit-it&tit-qq&qt-s>  "\def\enquote#1{`#1'}"
%<!tit-it&tit-qq&!qt-s&!qt-g>  "\def\enquote#1{``#1''}"
%</plntx>
%<*!tit-it&tit-qq&!qt-s&qt-g>
%<!plntx>  "\let\enquote\frquote"
%<*plntx>
  "\def\guillemotleft{%"
  write$ newline$
  "  \leavevmode\raise .27ex\hbox{$\scriptscriptstyle\ll$}}"
  write$ newline$
  "\def\guillemotright{%"
  write$ newline$
  "  \leavevmode\raise .27ex\hbox{$\scriptscriptstyle\gg$}}"
  write$ newline$
  "\def\enquote#1{\guillemotleft#1\guillemotright}"
%</plntx>
%</!tit-it&tit-qq&!qt-s&qt-g>
%<!tit-it&tit-qq>  write$ newline$
%<umlaut>  "\let\qq=\" quote$ * write$ newline$
%<em-ul>  "\expandafter\ifx\csname uline\endcsname\relax\let\uline\underline\fi"
%<em-ul>   write$ newline$
%<*ay>
%<!plntx>  "\providecommand{\natexlab}[1]{#1}"
%<plntx>  "\expandafter\ifx\csname natexlab\endcsname\relax\def\natexlab#1{#1}\fi"
  write$ newline$
%<*har>
  "{\catcode`\|=0\catcode`\#=12\catcode`\@=11\catcode`\\=12" write$ newline$
  "|immediate|write|@auxout{\expandafter\ifx\csname natexlab\endcsname\relax\gdef\natexlab#1{#1}\fi}}"
  write$ newline$
%</har>
%</ay>
%<*nmft&nmft-def>
%<!plntx>  "\providecommand{\bibnamefont}[1]{#1}"
%<plntx>  "\expandafter\ifx\csname bibnamefont\endcsname\relax"
%<plntx>  write$ newline$
%<plntx>  "  \def\bibnamefont#1{#1}\fi"
  write$ newline$
%</nmft&nmft-def>
%<*nmft&fnm-def>
%<!plntx>  "\providecommand{\bibfnamefont}[1]{#1}"
%<plntx>  "\expandafter\ifx\csname bibfnamefont\endcsname\relax"
%<plntx>  write$ newline$
%<plntx>  "  \def\bibfnamefont#1{#1}\fi"
  write$ newline$
%</nmft&fnm-def>
%<*lab&lab-def>
%<!plntx>  "\providecommand{\citenamefont}[1]{#1}"
%<plntx>  "\expandafter\ifx\csname citenamefont\endcsname\relax"
%<plntx>  write$ newline$
%<plntx>  "  \def\citenamefont#1{#1}\fi"
  write$ newline$
%</lab&lab-def>
%<*(url&!harnm)|eprint>
%<*!plntx>
%<nfss>  "\providecommand{\url}[1]{\texttt{#1}}"
%<!nfss>  "\providecommand{\url}[1]{{\tt #1}}"
  write$ newline$
  "\providecommand{\urlprefix}{}"
  write$ newline$
%</!plntx>
%<*plntx>
  "\expandafter\ifx\csname url\endcsname\relax"
  write$ newline$
%<nfss>  "  \def\url#1{\texttt{#1}}\fi"
%<!nfss>  "  \def\url#1{{\tt #1}}\fi"
  write$ newline$
  "\expandafter\ifx\csname urlprefix\endcsname\relax\def\urlprefix{}\fi"
  write$ newline$
%</plntx>
%</(url&!harnm)|eprint>
%<*doi>
  "\expandafter\ifx\csname urlstyle\endcsname\relax"
  write$ newline$
%<*!plntx>
  "  \providecommand{\doi}[1]{doi:\discretionary{}{}{}#1}\else"
  write$ newline$
  "  \providecommand{\doi}{doi:\discretionary{}{}{}\begingroup \urlstyle{rm}\Url}\fi"
  write$ newline$
%</!plntx>
%<*plntx>
  "  \expandafter\ifx\csname doi\endcsname\relax"
  write$ newline$
  "  \def\doi#1{doi:\discretionary{}{}{}#1}\fi \else"
  write$ newline$
  "  \expandafter\ifx\csname doi\endcsname\relax"
  write$ newline$
  "  \def\doi{doi:\discretionary{}{}{}\begingroup \urlstyle{rm}\Url}\fi \fi"
  write$ newline$
%</plntx>
%</doi>
%<*url-doi&url>
  "\providecommand{\doiprefix}{doi: }"
  write$ newline$
  "\expandafter\ifx\csname href\endcsname\relax"
  write$ newline$
  "  \providecommand{\urldoi}[1]{#1}\else"
  write$ newline$
  "  \providecommand{\urldoi}[1]{\href{https://doi.org/#1}{#1}}\fi"
  write$ newline$
%</url-doi&url>
%<*lang>
%<!plntx>  "\providecommand{\selectlanguage}[1]{\relax}"
%<*plntx>
  "\expandafter\ifx\csname selectlanguage\endcsname\relax"
  write$ newline$
  "  \def\selectlanguage#1{}\fi"
%</plntx>
  write$ newline$
%</lang>
%<*!plntx>
%<*babel>
  "\input{babelbst.tex}" write$ newline$
  "\newcommand{\Capitalize}[1]{\uppercase{#1}}" write$ newline$
  "\newcommand{\capitalize}[1]{\expandafter\Capitalize#1}" write$ newline$
%</babel>
%<*annote>
  "\providecommand{\bibAnnoteFile}[1]{%"
  write$ newline$
  "  \IfFileExists{#1}{\begin{quotation}\noindent\textsc{Key:} #1\\"
  write$ newline$
  "  \textsc{Annotation:}\ \input{#1}\end{quotation}}{}}"
  write$ newline$
  "\providecommand{\bibAnnote}[2]{%"
  write$ newline$
  "  \begin{quotation}\noindent\textsc{Key:} #1\\"
  write$ newline$
  "  \textsc{Annotation:}\ #2\end{quotation}}"
  write$ newline$
%</annote>
%</!plntx>
%<*bibinfo>
%<!plntx>  "\providecommand{\bibinfo}[2]{#2}"
%<plntx>  "\expandafter\ifx\csname bibinfo\endcsname\relax\def\bibinfo#1#2{#2}\fi"
  write$ newline$
%</bibinfo>
%<*eprint>
%<!plntx>  "\providecommand{\eprint}[2][]{\url{#2}}"
%<plntx>  "\expandafter\ifx\csname eprint\endcsname\relax\def\eprint#1{\url{#1}}\fi"
  write$ newline$
%</eprint>
}
%</!html>
%<*html>
{
"<html><head><title>Bibliography Listing</title></head>" write$ newline$
"<body>" write$ newline$
"<h2>Bibliography</h2>" write$ newline$
%<htdes>"<dl>" write$ newline$
%<!htdes&htlist>"<ol>" write$ newline$
}
%</html>
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
EXECUTE {begin.bib}
%    \end{macrocode}
%
%    \begin{macrocode}
EXECUTE {init.state.consts}
%    \end{macrocode}
%
%    \begin{macrocode}
ITERATE {call.type$}
%    \end{macrocode}
%
% \begin{macro}{`end.bib'}
%    \begin{macrocode}
FUNCTION {end.bib}
{ newline$
%<!html>  "\end{thebibliography}" write$ newline$
%<html>  "</dl></body></html>" write$ newline$
}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
EXECUTE {end.bib}
%    \end{macrocode}
%
%    \begin{macrocode}
%</!head>
%    \end{macrocode}
%
%    \begin{macrocode}
%</!options&!driver&!bblbst>
%    \end{macrocode}
%
% \section{The File \texttt{babelbst.tex} for English}
% The following contains the definitions for the \texttt{babel} language
% selection as they apply to English. This file may be extracted with
% \dtx{} and the option \texttt{bblbst}.
%    \begin{macrocode}
%<*bblbst>
 % This is babelbst.tex for English.
 % It should serve as a model for other languages.
 % Alternatively, store it under a different name (e.g. englbst.tex)
 % and then \input it with a command in babelbst.tex.
\def\bbland{and}                \def\bbletal{et~al.}
\def\bbleditors{editors}        \def\bbleds{eds.}
\def\bbleditor{editor}          \def\bbled{ed.}
\def\bbledby{edited by}
\def\bbledition{edition}        \def\bbledn{edn.}
\def\bblvolume{volume}          \def\bblvol{vol.}
\def\bblof{of}
\def\bblnumber{number}          \def\bblno{no.}
\def\bblin{in}
\def\bblpages{pages}            \def\bblpp{pp.}
\def\bblpage{page}              \def\bblp{p.}
\def\bbleidpp{pages}
\def\bblchapter{chapter}        \def\bblchap{chap.}
\def\bbltechreport{Technical Report}
\def\bbltechrep{Tech. Rep.}
\def\bblmthesis{Master's thesis}
\def\bblphdthesis{Ph.D. thesis}
\def\bblfirst{First}            \def\bblfirsto{1st}
\def\bblsecond{Second}          \def\bblsecondo{2nd}
\def\bblthird{Third}            \def\bblthirdo{3rd}
\def\bblfourth{Fourth}          \def\bblfourtho{4th}
\def\bblfifth{Fifth}            \def\bblfiftho{5th}
\def\bblst{st}  \def\bblnd{nd}  \def\bblrd{rd}
\def\bblth{th}
\def\bbljan{January}  \def\bblfeb{February}  \def\bblmar{March}
\def\bblapr{April}    \def\bblmay{May}       \def\bbljun{June}
\def\bbljul{July}     \def\bblaug{August}    \def\bblsep{September}
\def\bbloct{October}  \def\bblnov{November}  \def\bbldec{December}
%</bblbst>
%    \end{macrocode}
%
% \Finale