%% @texfile{
%%   author = "Karl Berry and Oren Patashnik",
%%   version = "0.99q",
%%   date = "2 October 2022",
%%   filename = "btxmac.tex",
%%   address = "tex-eplain@tug.org",
%%   supported = "yes",
%%   docstring = "Defines macros that make BibTeX work with plain TeX",
%% }
% BibTeX-for-TeX macros for BibTeX 0.99c, TeX 3.0 or later.
% Copyright 1990, 1991, 1992, 1995, 2005, 2007, 2013, 2016, 2019, 2022
% Karl Berry & Oren Patashnik.
% 
% Unlimited copying and redistribution of this file are permitted as
% long as this file is not modified. Modifications (and redistribution
% thereof) are permitted, but only if the resulting file is not named
% btxmac.tex.
% 
% This file contains TeX macros that allow BibTeX, a bibliography
% program that was originally designed for use with LaTeX, to work with
% plain TeX.  Please report any bugs (outright goofs, improvable macros,
% misfeatures, or unclear documentation) to Oren Patashnik
% (opbibtex@cs.stanford.edu).  These macros will become frozen shortly
% after BibTeX version 1.00 is released.
%
% AMS-TEX WARNING: We tried very hard, as of version .99i of these macros,
% to make them compatible with AmS-TeX.  We succeeded to the extent
% that, if you use one of the standard bibliography styles, you probably
% won't notice any problems with version 0.99i of btxmac.tex.  But
% ultimately we failed, in that the inherent incompatibilities between
% plain TeX and AmS-TeX kept making these macros break, for certain
% inputs or certain styles.  Examples:  (1) AmS-TeX treats at-signs as
% special, in ways that plain TeX and LaTeX don't, so that, for example,
% you can't have any `@' characters in an argument to the \cite command,
% the way you can in TeX or LaTeX; (2) AmS-TeX decided that plain TeX's
% and LaTeX's macron-accent control sequence `\=' should be undefined;
% so you'll need to define `\=' to be `\B' to get the xampl.bib example
% suggested below to work with AmS-TeX; (3) AmS-TeX redefines the tie
% character `~' of plain TeX, and AmS-TeX's `amsppt' style redefines
% plain TeX's `\nobreak' macro, so that if you use an author-date style
% like `apalike' and you have a multiple-author reference for which the
% author-date style automatically produces a citation in the text like
% `(Jones et~al., 1992)' you will throw AmS-TeX's `amsppt' style into
% an infinite loop, exceeding its input stack size.
% 
% In practice, such incompatibilities surface infrequently; but it is
% now clear to us that it's not worth the effort (perhaps it's not even
% possible) to make the btxmac.tex macros robust when used both with
% plain TeX and Ams-TeX.  If the BibTeX/AmS-TeX results attainable with
% the current btxmac.tex macros are sufficient, fine.  But if there's a
% demand for more robust BibTeX/AmS-TeX behavior, then someone who's
% very familiar with the AmS-TeX package should probably make an
% amsbtxmc.tex version of the macros.  Until then, if you're an AmS-TeX
% user, or a LaTeX or plain TeX user sharing files with an AmS-TeX user,
% beware.
% END OF AMS-TEX WARNING.
%
% To use these macros you should be familiar with how BibTeX interacts
% with LaTeX, since BibTeX's interaction with TeX is very similar; that
% interaction is explained in the LaTeX manual.  It also helps to
% have read "BibTeXing", the documentation that accompanies BibTeX.
% 
% Then, if you want, you should redefine any of the macros that begin
% with `\bbl' or `\biblabel' or `\print' that you need to get formatting
% different from the default (the default settings are designed to
% accompany a bibliography style like BibTeX's standard style `plain').
% The macros you might want to change are described briefly a few
% paragraphs hence.
% 
% To get started without reading any documentation, try running the
% short .tex file below through TeX and BibTeX.
% 
% Remember the general scheme: Running (La)TeX writes information on the
% .aux (auxiliary) file; then running BibTeX reads information from the
% .aux, .bst (style), and .bib (database) files, and writes information
% (the bibliography) on a .bbl file; then running (La)TeX incorporates
% the bibliography; then running (La)TeX once more fixes the remaining
% forward references into the bibliography.  Thus, to get everything
% incorporated into your output, you'll have to run (La)TeX, BibTeX,
% (La)TeX, (La)TeX.  (Standup, sitdown, fight, fight, fight.)
%
% These macros can stand alone or they can be \input into a macro
% package, like Eplain, that is sufficiently compatible with plain TeX.
% To use these macros to format the 0.99 version of the xampl.bib file
% that's distributed with BibTeX (that version of the file has no
% self-identification), you'll need to define \mbox, which is a LaTeX
% command, to be \hbox, as in the example below.
%
% Here's an eight-line plain TeX file for trying out btxmac.tex; of course
% you'll have to remove the comment characters at the beginning of each
% line, and, depending on your system, you might have to take steps so
% that BibTeX can "see" the files xampl.bib and plain.bst (BibTeX will
% give you two empty-field warning messages that you should ignore).
%
%     \input btxmac
%     \noindent This cites Aamport's gnominious article~\cite{article-full}.
%     \medskip
%     \leftline{\bf References}
%     \nocite{*}   % put all database entries into the reference list
%     \bibliographystyle{plain}   % specify plain.bst as the style file
%     \bibliography{xampl}   % specify the database files; here, just xampl.bib
%     \bye
%
%
%   HISTORY
%
% Karl Berry wrote the original version of these macros in 1989 and
% 1990, for use in his `Eplain' package.  Oren Patashnik modified them
% slightly in July 1990, as part of the official BibTeX distribution.
%
%    1-Aug-90  Version 0.99a, not released to the general public.
%   14-Aug-90  0.99b, first general release.
%   26-Aug-90  0.99c, made \@undefinedmessage work with other macro packages.
%    6-Sep-90  0.99d, allowed for general formatting of bibliography labels,
%                     for general formatting of (in-text) citations, and for
%                     changing certain catcodes while reading the .aux file.
%   14-Nov-90  0.99e, changed the way \@setletters works, made some \new...'s
%                     non-outer, and changed the way Eplain reads this file.
%   12-Dec-90  0.99f, made \@resetnumerals change the `,' and `.' catcodes; and
%                     added \biblabelextrahang, \@getoptionalarg, and \bblsc.
%   11-Mar-91  0.99g, made a few minor changes required by the way Eplain reads
%                     this file, but no functional changes.
%   24-Apr-91  0.99h, inhibited the reading and writing of the .aux file if it
%                     isn't used or if the \noauxfile macro is defined, and
%                     removed some .aux-file-opening detritus; printed the
%                     cite-key of undefined citations in \tt font; changed the
%                     catcode of `_' inside \cite; and called \@resetnumerals
%                     from inside a group.
%   29-Feb-92  0.99i, made these macros semi-compatible with AmS-TeX; removed
%                     \@resetnumerals, \@setletters, \@tokstostring, and
%                     friends; changed the way \cite handles catcodes; changed
%                     \@getoptionalarg, and had \bibitem and \newcommand use
%                     it; added \@futurenonspacelet and (to facilitate the use
%                     of multiple reference lists) \bblfilebasename; changed
%                     \biblabelprint to use the new macros \biblabelprecontents
%                     and \biblabelpostcontents, and to, by default, right-
%                     justify numeric labels; and renamed \biblabelextrahang to
%                     the more descriptive \biblabelextraspace.
%   14-Mar-92  0.99j, made 0.99i's use of `\\' local to btxmac.tex.
%   13-Nov-95  0.99k, defined \begin and \end (while reading bbl file) only if
%                     it wasn't already defined.
%   11-Aug-03  0.99l, defined \renewcommand and \providecommand, since some AMS
%                     style files use them.  Also defined \emph, \textbf, and
%                     \mbox, since many .bib files use them.  This version was
%                     never actually released, but these changes appear
%                     starting with 0.99k-18aug05.
%   18-Aug-05  0.99k-18aug05, made the \em, \emph, etc., definitions effective
%                             only if not already defined.  Provided
%                             \printcite{pre,post}item, \bblitemhook.
%   09-Sep-07  0.99k-09sep07, executed \@citedef in a group to avoid potential
%                             save-stack overflow.
%   07-Feb-13  0.99m, made \newcommand and \providecommand be \long, and not
%                     use \edef.  Defined \bbltextbf.
%   30-Sep-13  0.99n, made \@futurenonspacelet be \long,
%                     renamed \@optionaltemp to \@optionalusercs,
%                     ignored spaces after the optional argument.
%   12-May-16  0.99o, renamed \@newcommand and others to \@btx..., to avoid
%                     conflict with Babel's file plain.def.
%   30-May-19  0.99p, one missed rename of \@continuenewcommand to \@btx...,
%                     that made \providecommand fail.
%   02-Oct-22  0.99q, avoid using unprefixed control sequence \cs,
%                     which conflicts with TUGboat's \cs. Doc updates.
%
% The LaTeX-related commands defined in this file include
% (a) the four commands that a user types (\bibliography,
%     \bibliographystyle, \cite, and \nocite); 
% (b) three commands that BibTeX looks for in the .aux
%     file (\bibdata, \bibstyle, and \citation---there is a fourth command
%     that BibTeX looks for, but that command is related to LaTeX's \include
%     facility, so these macros ignore that command); and 
% (c) the LaTeX commands (\newcommand, \renewcommand, \providecommand)
%     that are written by a standard (alpha) or AMS bibliography style.
% (d) a few more LaTeX commands (\emph, \mbox, \textbf) which many .bib
%     files use.
%     
% The definitions here are not the same as the corresponding LaTeX
% definitions (those LaTeX definitions depend on a significant fraction
% of LaTeX itself).  But the only significant differences are with the
% \*command macros, which in LaTeX (a) give warnings in various
% circumstances; (b) allow a second optional argument; and (c) make the
% defined control sequences \long.  The versions here don't do any of
% those things.
% 
% To summarize: Unless you know what you're doing, you shouldn't define
% any control sequences with these ten names:
%
% \bibdata
% \bibliography
% \bibliographystyle
% \bibstyle
% \citation
% \cite
% \newcommand
% \nocite
% \providecommand
% \renewcommand
% 
% There are other commands written by one or more of the four standard
% (plain, abbrv, alpha, unsrt) or four semistandard (acm, apalike,
% ieeetr, siam) bibliography styles, or commonly used in .bib files.
% These take effect only within the bibliography, and are redefinable,
% as explained later:
%
% \em
% \emph
% \mbox
% \newblock
% \sc
% \textbf
%
% There's one control sequence you might want to use (but not redefine)
% in redefining \biblabelprint:
%
% \biblabelwidth
%
% There are sixteen other control sequences (explained later in more detail)
% that the macros of this file will use if you define them---you should
% define them after the \input btxmac command but before the \bibliography
% command.  The first seven begin with `\bbl' and affect fonts, spacing,
% perhaps other characteristics of the bibliography, and which .bbl files
% get read; the next five begin with `\biblabel' and determine how labels
% are formatted in the bibliography; and the last four begin with `\print'
% and determine how the in-text citations are formatted:
%
% \bblem
% \bblfilebasename
% \bblhook
% \bblitemhook
% \bblnewblock
% \bblrm
% \bblsc
% \biblabelcontents
% \biblabelprecontents
% \biblabelprint
% \biblabelpostcontents
% \biblabelextraspace
% \printbetweencitations
% \printcitefinish
% \printcitenote
% \printcitestart
%
% If it's defined before the \input btxmac command, the control sequence
% below inhibits the reading and writing of the .aux file(s), and the
% issuing of related warning messages.  Any definition will do.  This
% feature might help when you're working on draft stages of a document:
%
% \noauxfile
%
%
% Here's another control sequence (it's described later) that you
% probably won't want to redefine unless you are writing another macro
% package; if you do redefine it, however, do it before the \input btxmac
% command (and notice that it has an `@' in its name):
%
% \@undefinedmessage
%
% Any other control sequence in this file that might conflict with
% something you've defined will have an `@' in its name, so such conflicts
% are unlikely; but if you're worried about a specific control sequence
% name, do a text search of this file to look for it.
%
%
% So to start things off we turn `@' into a letter (category code 11),
% keeping track of the old category code for future restoration.
% (Simply resetting it to 12 when we leave these macros is
% insufficient.)  We use `\cite' as a temporary control sequence to
% save the current catcode of @ to avoid possibly overwriting something
% (without an `@' in its name) that might already be defined.
%
\edef\cite{\the\catcode`@}%
\catcode`@ = 11
\let\@oldatcatcode = \cite
\chardef\@letter = 11
\chardef\@other = 12
%
%
% Next come some things that will be useful later.
%
% Make an outer definition into an inner one (due to Chris Thompson).
% The arguments should be the control sequence to be defined, and the
% name of the \outer control sequence, as characters; the control
% sequence #1 is defined to be just the same as \csname#2\endcsname, but
% not \outer.  For example, \@innerdef\innernewcount{newcount}
% defines \innernewcount to be a non-outer version of \newcountb.
%
\def\@innerdef#1#2{\edef#1{\expandafter\noexpand\csname #2\endcsname}}%
%
% We use \@innerdef to make some of our allocations local, because
% Eplain includes our code inside a conditional.  We put @'s in the
% names to minimize the (already small) chance of conflicts.
%
\@innerdef\@innernewcount{newcount}%
\@innerdef\@innernewdimen{newdimen}%
\@innerdef\@innernewif{newif}%
\@innerdef\@innernewwrite{newwrite}%
%
%
% Swallow one parameter.
%
\def\@gobble#1{}%
%
%
% Use TeX 3.0's \inputlineno to get the line number, for better error
% messages, but if we're using an old version of TeX, don't do anything.
%
\ifx\inputlineno\@undefined
   \let\@linenumber = \empty % Pre-3.0.
\else
   \def\@linenumber{\the\inputlineno:\space}%
\fi
%
%
% The following macro \@futurenonspacelet (from The TeXbook) behaves
% essentially like \futurelet except that it discards any implicit or
% explicit space tokens that intervene before a nonspace is scanned:
%
\long\def\@futurenonspacelet#1{\def\@btxcs{#1}%
   \afterassignment\@stepone\let\@nexttoken=
}%
\begingroup % The grouping here avoids stepping on an outside use of `\\'.
\def\\{\global\let\@stoken= }%
\\ % now \@stoken is a space token (\\ is a control symbol, so that
   % space after it is seen).
\endgroup
\def\@stepone{\expandafter\futurelet\@btxcs\@steptwo}%
\def\@steptwo{\expandafter\ifx\@btxcs\@stoken\let\@@next=\@stepthree
   \else\let\@@next=\@nexttoken\fi \@@next}%
\def\@stepthree{\afterassignment\@stepone\let\@@next= }%
%
%
% \@getoptionalarg\CS gets an optional argument from the input, enclosed
% in brackets, then expands \CS.  We set \@optionalarg to \empty if we
% don't find one, otherwise to the text of the argument.  This assumes
% the brackets don't have a funny category code.
%
\def\@getoptionalarg#1{%
   \let\@optionalusercs = #1%
   \let\@optionalnext = \relax
   \@futurenonspacelet\@optionalnext\@bracketcheck
}%
%
% The \expandafter's in this macro let us avoid the use of \aftergroup,
% which is somewhat more expensive.
%
\def\@bracketcheck{%
   \ifx [\@optionalnext
      \expandafter\@@getoptionalarg % we have an optional arg
   \else
      \let\@optionalarg = \empty    % no optional arg
      \expandafter\@optionalusercs
   \fi
}%
%
% Get the next bracketed text.
\def\@@getoptionalarg[#1]{%
   \def\@optionalarg{#1}%
   % Ignore spaces after the optional arg, too.
   % (We don't actually need to peek ahead, but this is the easiest way
   % to ignore the spaces.)
   \let\@optdummy=\relax % just in case it has become \outer somehow
   \@futurenonspacelet\@optdummy\@optionalusercs
}%
%
%
% From LaTeX.
%
\def\@nnil{\@nil}%
\def\@fornoop#1\@@#2#3{}%
%
\def\@for#1:=#2\do#3{%
   \edef\@fortmp{#2}%
   \ifx\@fortmp\empty \else
      \expandafter\@forloop#2,\@nil,\@nil\@@#1{#3}%
   \fi
}%
%
\def\@forloop#1,#2,#3\@@#4#5{\def#4{#1}\ifx #4\@nnil \else
       #5\def#4{#2}\ifx #4\@nnil \else#5\@iforloop #3\@@#4{#5}\fi\fi
}%
%
\def\@iforloop#1,#2\@@#3#4{\def#3{#1}\ifx #3\@nnil
       \let\@nextwhile=\@fornoop \else
      #4\relax\let\@nextwhile=\@iforloop\fi\@nextwhile#2\@@#3{#4}%
}%
%
%
% This macro tests if a file \jobname.#1 exists, and sets \if@fileexists
% appropriately.  If an optional argument is given, it is used as the
% root part of the filename instead of \jobname.
%
\@innernewif\if@fileexists
%
\def\@testfileexistence{\@getoptionalarg\@finishtestfileexistence}%
\def\@finishtestfileexistence#1{%
   \begingroup
      \def\extension{#1}%
      \immediate\openin0 =
         \ifx\@optionalarg\empty\jobname\else\@optionalarg\fi
         \ifx\extension\empty \else .#1\fi
         \space
      \ifeof 0
         \global\@fileexistsfalse
      \else
         \global\@fileexiststrue
      \fi
      \immediate\closein0
   \endgroup
}%
%
%
%% [[[start of BibTeX-specific stuff]]]
%
% Now come the four main LaTeX commands and their associated .aux
% commands.  Just as in LaTeX, \bibliographystyle defines the BibTeX
% style name (.bst file, that is), and \bibliography defines the
% database (.bib) file(s).  The corresponding .aux-file commands are
% \bibstyle and \bibdata, which are there only for BibTeX's (but not
% LaTeX's) use.
%
\def\bibliographystyle#1{%
   \@readauxfile
   \@writeaux{\string\bibstyle{#1}}%
}%
\let\bibstyle = \@gobble
%
% As well as writing the \bibdata command to tell BibTeX which .bib
% files to read, we read the .bbl file that BibTeX (or a person,
% conceivably) has produced.  We use \bblfilebasename as the root of the
% filename to read; this defaults to \jobname.
%
\let\bblfilebasename = \jobname
\def\bibliography#1{%
   \@readauxfile
   \@writeaux{\string\bibdata{#1}}%
   \@testfileexistence[\bblfilebasename]{bbl}%
   \if@fileexists
      % We just output a non-discardable item (the `whatsit' with the
      % \bibdata command).  This means that the glue that will be
      % inserted next (\parskip or \baselineskip, most likely) will be a
      % legal breakpoint.  Most likely, this is after some kind of
      % heading, where we don't want to allow a page break.  So:
      \nobreak
      \@readbblfile
   \fi
}%
\let\bibdata = \@gobble
%
% The \nocite{label,label,...} command writes its argument to \@auxfile,
% unless instructed not to, but produces no text in the document.  Both
% the \nocite and \cite commands produce \citation commands in the .aux file.
%
\def\nocite#1{%
   \@readauxfile
   \@writeaux{\string\citation{#1}}%
}%
%
\@innernewif\if@notfirstcitation
%
% \cite[note]{label,label,...} produces the citations for the labels as
% well.  If the optional argument `note' is present, it's added after
% the labels.  Since \cite calls \nocite to do its .aux-file writing,
% \cite doesn't need to call \@readauxfile (\nocite does).
%
\def\cite{\@getoptionalarg\@cite}%
%
% Typeset the citations for the labels in #1, followed by the note, if
% it exists.  To change the citation's format in the text, redefine one
% or more `\print...' macros, whose defaults appear later in this file.
%
\def\@cite#1{%
   % Remember the optional argument, in case one of the macros we call
   % below ends up looking for an optional argument itself.  For
   % example, if a \cite[note] triggers reading the .aux file, then the
   % [note] would be clobbered, since \@testfileexistence looks for an
   % optional arg.
   \let\@citenotetext = \@optionalarg
   % Start printing the text, beginning with a left bracket by default.
   \printcitestart
   % It's complicated, but because \nocite puts a `whatsit' onto the list,
   % \nocite should follow \printcitestart.  It's conceivable, but very
   % unlikely, that this `whatsit' will cause a problem (glue that doesn't
   % disappear when you want it to is the most likely symptom), requiring
   % a change either to \printcitestart or to the label that the .bst file
   % produces.
   \nocite{#1}%
   \@notfirstcitationfalse
   \@for \@citation :=#1\do
   {%
      \expandafter\@onecitation\@citation\@@
   }%
   \ifx\empty\@citenotetext\else
      \printcitenote{\@citenotetext}%
   \fi
   \printcitefinish
}%
%
\def\@onecitation#1\@@{%
   \if@notfirstcitation
      \printbetweencitations
   \fi
   %
   \expandafter \ifx \csname\@citelabel{#1}\endcsname \relax
      \if@citewarning
         \message{\@linenumber Undefined citation `#1'.}%
      \fi
      % Give it a dummy definition:
      \expandafter\gdef\csname\@citelabel{#1}\endcsname{%
         {\tt
            \escapechar = -1
            \nobreak\hskip0pt
            \expandafter\string\csname#1\endcsname
            \nobreak\hskip0pt
         }%
      }%
   \fi
   % Now produce the text, whether it was undefined or not.
   \printcitepreitem{#1}%
   \csname\@citelabel{#1}\endcsname
   \printcitepostitem
   \@notfirstcitationtrue
}%
%
% Given a label `foo', the macro `\b@foo' is supposed to
% hold the text that should be produced.
%
\def\@citelabel#1{b@#1}%
%
% So, how does a citation label get defined?  When we read the .bbl file
% (below), a \bibitem writes out a \@citedef command.  And when we read
% the \@citedef, we define \@citelabel{#1}, where #1 is the user's
% label.
%
% The group around the def will keep the save stack from overflowing:
% We are reading the .aux file inside a group.  For undefined
% commands, \csname...\endcsname makes them equivalent to \relax
% locally in that group; when we globally redefine them, TeX enters
% the definitions on the save stack, once for each label.  When done
% in the topmost group, this can overflow a stack of any size, given
% sufficient number of label definitions.  So, we put these
% \csname...\endcsname's inside another group, to pop the stack for
% every label.
\def\@citedef#1#2{{\expandafter\gdef\csname\@citelabel{#1}\endcsname{#2}}}%
%
%
% Reading the .bbl file also produces the typeset bibliography.  Please
% notice, however, that we do not produce the title for the references
% (e.g., `References'), as LaTeX does.  The formatting and spacing of
% that title, whether it should go into the headline, and so on, are all
% things determined by your format.  We cannot know those things in
% advance.  If you wish, you can define \bblhook to produce the title.
% Or just do it before the \bibliography command.
%
\def\@readbblfile{%
   % Define a counter to tell us which item number we are on, unless
   % we've already defined it (because the document has more than one
   % bibliography).
   \ifx\@itemnum\@undefined
      \@innernewcount\@itemnum
   \fi
   %
   \begingroup
      % If another package has already defined \begin, don't define our
      % own simplistic \begin and \end; assume they want to take care of
      % it themselves.  (That way, their \begin's and \end's for other
      % things can be used in the bib files.)
      \ifx\begin\@undefined
         \def\begin##1##2{%
            % ##1 is just `thebibliography'.
            % ##2 is the widest label.
            % We set (new dimen) \biblabelwidth based on the widest label
            \setbox0 = \hbox{\biblabelcontents{##2}}%
            \biblabelwidth = \wd0
         }%
         \let\end = \@gobble % The arg is `thebibliography' again.
      \fi
      %
      % Here we have two possibilities:
      % \bibitem[typesetlabel]{citationlabel}
      % \bibitem{citationlabel}
      % If we have the second of these, the citations are numbered, starting
      % from one; we use our own count register \@itemnum for this.
      %
      \@itemnum = 0
      \def\bibitem{\@getoptionalarg\@bibitem}%
      \def\@bibitem{%
         \ifx\@optionalarg\empty
            \expandafter\@numberedbibitem
         \else
            \expandafter\@alphabibitem
         \fi
      }%
      \def\@alphabibitem##1{%
         % Need \xdef here for various reasons.
         \expandafter \xdef\csname\@citelabel{##1}\endcsname {\@optionalarg}%
         % Left-justify alpha labels, unless \biblabel{pre,post}contents
         % are already defined.
         \ifx\biblabelprecontents\@undefined
            \let\biblabelprecontents = \relax
         \fi
         \ifx\biblabelpostcontents\@undefined
            \let\biblabelpostcontents = \hss
         \fi
         \@finishbibitem{##1}%
      }%
      %
      \def\@numberedbibitem##1{%
         \advance\@itemnum by 1
         \expandafter \xdef\csname\@citelabel{##1}\endcsname{\number\@itemnum}%
         % Right-justify numeric labels, unless \biblabel{pre,post}contents
         % are already defined.
         \ifx\biblabelprecontents\@undefined
            \let\biblabelprecontents = \hss
         \fi
         \ifx\biblabelpostcontents\@undefined
            \let\biblabelpostcontents = \relax
         \fi
         \@finishbibitem{##1}%
      }%
      %
      \def\@finishbibitem##1{%
         \bblitemhook{##1}%
         \biblabelprint{\csname\@citelabel{##1}\endcsname}%
         \@writeaux{\string\@citedef{##1}{\csname\@citelabel{##1}\endcsname}}%
         \ignorespaces
      }%
      %
      % Do the printing (we're producing the bibliography, remember).
      %
      \ifx\undefined\em \let\em=\bblem \fi
      \ifx\undefined\emph \let\emph=\bblemph \fi
      \ifx\undefined\mbox \let\mbox=\bblmbox \fi
      \ifx\undefined\newblock \let\newblock=\bblnewblock \fi
      \ifx\undefined\sc \let\sc=\bblsc \fi
      \ifx\undefined\textbf \let\textbf=\bbltextbf \fi
      %
      % Punctuation won't affect spacing;
      \frenchspacing
      % the penalties below are from LaTeX's [article,book,report].sty;
      \clubpenalty = 4000 \widowpenalty = 4000
      % the next two values come from LaTeX's \sloppy command;
      \tolerance = 10000 \hfuzz = .5pt
      \everypar = {\hangindent = \biblabelwidth
                      \advance\hangindent by \biblabelextraspace}%
      \bblrm
      % the \parskip is a guess at what looks good;
      \parskip = 1.5ex plus .5ex minus .5ex
      % and the space between label and text comes from LaTeX's \labelsep.
      \biblabelextraspace = .5em
      \bblhook
      %
      \input \bblfilebasename.bbl
   \endgroup
}%
%
% The widest label's width is useful for redefining \biblabelprint;
% you redefine \biblabelwidth, in effect, by redefining the
% \biblabelcontents macro that appears below.  And \biblabelextraspace,
% which is redefinable inside \bblhook, is added to \biblabelwidth to
% determine the amount of hanging indentation.
%
\@innernewdimen\biblabelwidth
\@innernewdimen\biblabelextraspace
%
% Now come the main macros that are related to the printing of the
% bibliography.  Since you might want to redefine them, they are given
% default definitions outside of \@readbblfile.
%
% The first one controls the printing of a bibliography entry's label.
% If you change it, make sure that it starts with something like
% \noindent or \indent or \leavevmode that puts TeX into horizontal mode
% (even if the label itself is empty); otherwise, the hanging
% indentation will get messed up in certain circumstances.
%
\def\biblabelprint#1{%
   \noindent
   \hbox to \biblabelwidth{%
      \biblabelprecontents
      \biblabelcontents{#1}%
      \biblabelpostcontents
   }%
   \kern\biblabelextraspace
}%
%
% If you are using numeric labels, and you want them left-justified
% (numeric labels by default are right-justified), do something like:
%     \def\biblabelprecontents{\relax}
%     \def\biblabelpostcontents{\hss}
%
% By default the labels are typeset in \bblrm, and enclosed in brackets.
\def\biblabelcontents#1{{\bblrm [#1]}}%
%
% The main text, too, is typeset using \bblrm, which is \rm by default.
\def\bblrm{\rm}%
%
% Emphasis for producing, e.g., titles, is done with \it by default.
\def\bblem{\it}%
%
% Another way to emphasize, with built-in italic correction.  (Doesn't
% look for a following comma or period, though.)
\def\bblemph#1{{\bblem #1\/}}
%
% And bold.
\def\bbltextbf#1{{\bf #1}}
%
% \mbox is \hbox forcing horizontal mode.
\def\bblmbox{\leavevmode\hbox}
%
% Some styles use a caps-and-small-caps font for author names.  LaTeX
% defines an \sc command but plain TeX doesn't, so we need one here.
% The definition below doesn't load the font unless it's needed, but it
% tries to load only the 10pt version, because it might not exist at
% other point sizes.
%
\def\bblsc{\ifx\@scfont\@undefined
              \font\@scfont = cmcsc10
           \fi
           \@scfont
}%
%
% The major parts of an entry are separated with \bblnewblock.  The
% numbers below are taken from LaTeX's `article' style.
%
\def\bblnewblock{\hskip .11em plus .33em minus .07em }%
%
% Here's where you stick any other bibliography-formatting goodies, or
% redefine the values above.
%
\let\bblhook = \empty
%
% And here you can add code to be executed before each item (before
% \biblabelprint is called).  The parameter is citation label for this
% bibliography entry.
%
\let\bblitemhook = \@gobble
%
%
% Here are the four default definitions for formatting the in-text
% citations.  These are what you redefine (after your \input btxmac but
% before your \bibliography) to get parens instead of brackets, or
% superscripts, or footnotes, or whatever.
%
\def\printcitestart{[}%         left bracket
\def\printcitefinish{]}%        right bracket
\def\printbetweencitations{, }% comma, space
\let\printcitepreitem\@gobble % takes label
\let\printcitepostitem\empty
\def\printcitenote#1{, #1}%     comma, space, note (if it exists)
%
% That scheme is pretty flexible.  For example you could use
%     \def\printcitestart{\unskip $^\bgroup}
%     \def\printcitefinish{\egroup$}
%     \def\printbetweencitations{,}
%     \def\printcitenote#1{\hbox{\sevenrm\space (#1)}}
%     \font\eighttt = cmtt8
%     \scriptfont\ttfam = \eighttt
% to get superscripted in-text citations.  (The scriptfont stuff
% exists only to print an undefined citation; it's in cmtt8 because
% there is no cmtt7.)  To get something radically different, however,
% you'll have to define your own \cite command.
%
% When we read `\citation' from the .aux file, it means nothing.
%
\let\citation = \@gobble
%
%
% Now comes the stuff for dealing with LaTeX's \newcommand.  As
% mentioned earlier, this \newcommand will redefine a preexisting
% command; that's different from how LaTeX's \newcommand behaves.
%
\@innernewcount\@btxnumparams
%
% \newcommand{\foo}[n]{text} defines the control sequence \foo to have n
% parameters, and replacement text `text'.  In LaTeX, this command gives
% a warning if \foo is already defined, and allows a second
% optional argument (which is a default value for the first optional
% arg) but we don't bother with either of these.
%
\ifx\newcommand\undefined
\long\def\newcommand#1{%
   \def\@btxcommandname{#1}%
   \@getoptionalarg\@btxcontinuenewcommand
}%
\fi
%
%
% \renewcommand{\foo}[n]{text}, for our purposes, is the same as
% \newcommand.  In LaTeX, it gives a warning if \foo is not already defined.
%
\ifx\renewcommand\undefined
  \let\renewcommand = \newcommand
\fi
% 
% 
% \providecommand{\foo}[n]{text} defines \foo as in \newcommand only if
% \foo is not already defined.
% 
\ifx\providecommand\undefined
\long\def\providecommand#1{%
   \def\@btxcommandname{#1}%
   %
   \expandafter\ifx\@btxcommandname \@undefined
     \let\@btxcs=\@btxcontinuenewcommand  % undefined, so we'll define it
   \else
     \let\@btxcs=\@gobble                 % already defined, so ignore it
   \fi
   \@getoptionalarg\@btxcs
}%
\fi
% 
% 
% Figure out if this definition has parameters.
%
\def\@btxcontinuenewcommand{%
   % If no optional argument, we have zero parameters.  Otherwise, we
   % have that many.
   \@btxnumparams = \ifx\@optionalarg\empty 0\else\@optionalarg \fi \relax
   \@btxnewcommand
}%
%
% \@btxnumparams is how many arguments this command has.  The name of the
% command is \@btxcommandname.  The replacement text for the new macro is #1.
%
\def\@btxnewcommand#1{%
   \def\@btxstartdef{\expandafter\def\@btxcommandname}%
   \ifnum\@btxnumparams=0
      \let\@btxparamdef = \empty
   \else
      \ifnum\@btxnumparams>9
         \errmessage{\the\@btxnumparams\space is too many parameters}%
      \else
         \ifnum\@btxnumparams<0
            \errmessage{\the\@btxnumparams\space is too few parameters}%
         \else
            \edef\@btxparamdef{%
               % This is sad, but \loop doesn't work inside \edef,
               % because \body isn't defined.
               \ifcase\@btxnumparams
                  \empty  No arguments.
               \or ####1%
               \or ####1####2%
               \or ####1####2####3%
               \or ####1####2####3####4%
               \or ####1####2####3####4####5%
               \or ####1####2####3####4####5####6%
               \or ####1####2####3####4####5####6####7%
               \or ####1####2####3####4####5####6####7####8%
               \or ####1####2####3####4####5####6####7####8####9%
               \fi
            }%
         \fi
      \fi
   \fi
   \expandafter\@btxstartdef\@btxparamdef{#1}%
}%
%
%% [[[end of BibTeX-specific stuff]]]
%
%
% Names of references (arguments given in the \cite and \nocite
% commands) and file names (arguments given in the \bibliography and
% \bibliographystyle commands) are recorded in \jobname.aux, called the
% \@auxfile in these macros.  Here's how they get read in.
%
\def\@readauxfile{%
   \if@auxfiledone \else % remember: \@auxfiledonetrue if \noauxfile is defined
      \global\@auxfiledonetrue
      \@testfileexistence{aux}%
      \if@fileexists
         \begingroup
            % Because we might be in horizontal mode when \@readauxfile
            % is called (if it's in response to a \cite or \nocite), we
            % want to ignore all the would-be spaces at the ends of
            % lines in the aux file.  Fortunately, it's highly unlikely
            % an end-of-line might actually be desired.
            % And because we don't change the category code of anything
            % but @, primitives like \gdef can't be used to define labels
            % in the aux file.  The solution adopted by btxmac.tex is to
            % write `\@citedef{LABEL}{DEFINITION}' to the aux file, and
            % use \csname on LABEL.
            \endlinechar = -1
            \catcode`@ = 11
            \input \jobname.aux
         \endgroup
      \else
         \message{\@undefinedmessage}%
         \global\@citewarningfalse
      \fi
      \immediate\openout\@auxfile = \jobname.aux
   \fi
}%
%
% The \@readauxfile macro does all that work the first time it's called.
% Since it's called once for every \cite, \nocite, \bibliography, and
% \bibliographystyle command that the user issues, we need to remember
% whether the work's been done.  It's considered done if we're not to do
% it---that is, if \noauxfile is defined.
%
\newif\if@auxfiledone
\ifx\noauxfile\@undefined \else \@auxfiledonetrue\fi
%
% It's conceivable you'd want to change how other characters are read;
% to do that, change their category code before doing \input btxmac.
%
%
% After reading the .aux file, \@readauxfile opens it for writing.
% The \@writeaux macro does the actual writing (as long as
% \noauxfile is undefined).
%
\@innernewwrite\@auxfile
\def\@writeaux#1{\ifx\noauxfile\@undefined \write\@auxfile{#1}\fi}%
%
%
% A macro package that uses btxmac.tex might define
% \@undefinedmessage (before doing an \input btxmac).
%
\ifx\@undefinedmessage\@undefined
   \def\@undefinedmessage{No .aux file; I won't give you warnings about
                          undefined citations.}%
\fi
%
% Even if citations are undefined, we want to complain only if
% \@citewarningtrue.  The default is to set \@citewarningtrue unless
% \noauxfile is defined.  Again, a macro package that uses
% btxmac.tex might want to redefine this.
%
\@innernewif\if@citewarning
\ifx\noauxfile\@undefined \@citewarningtrue\fi
%
%
% Finally, before leaving we restore @'s old category code.
%
\catcode`@ = \@oldatcatcode
