From 7ff51640e2fd3e968488d312879dee70458f2926 Mon Sep 17 00:00:00 2001
From: Karl Berry <karl@freefriends.org>
Date: Fri, 8 Dec 2006 00:25:19 +0000
Subject: eplain 3.1 (5dec06)

git-svn-id: svn://tug.org/texlive/trunk@2630 c570f23f-e606-0410-a88d-b1316a301751
---
 Master/texmf-dist/tex/eplain/btxmac.tex | 906 ++++++++++++++++++++++++++++++++
 1 file changed, 906 insertions(+)
 create mode 100644 Master/texmf-dist/tex/eplain/btxmac.tex

(limited to 'Master/texmf-dist/tex/eplain/btxmac.tex')

diff --git a/Master/texmf-dist/tex/eplain/btxmac.tex b/Master/texmf-dist/tex/eplain/btxmac.tex
new file mode 100644
index 00000000000..4b7fda7c61e
--- /dev/null
+++ b/Master/texmf-dist/tex/eplain/btxmac.tex
@@ -0,0 +1,906 @@
+%% @texfile{
+%%   author = "Karl Berry and Oren Patashnik",
+%%   version = "0.99k-18aug05",
+%%   date = "19 August 2005",
+%%   filename = "btxmac.tex",
+%%   address = "tex-eplain@tug.org",
+%%   checksum = "842    4571   33524",
+%%   codetable = "ISO/ASCII",
+%%   supported = "yes",
+%%   docstring = "Defines macros that make BibTeX work with plain TeX",
+%% }
+% BibTeX-for-TeX macros, version 0.99k, for BibTeX 0.99c, TeX 3.0 or later.
+% Copyright (C) 1990, 1991, 1992, 1995, 2005 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, for 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 (remembering to follow the
+% copyright restrictions above).  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.
+%   04-Aug-04  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.  And made these definitions (and others)
+%                     only effective if not already defined.
+%
+% 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, \textbf, \mbox) 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 fifteen 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 six 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
+% \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.)  The use of `\cite' as a temporary control sequence is
+% a kludge, but it's a reasonably simple way to accomplish what we need
+% without 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
+% new 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} would
+% define \innernewcount to be a non-outer version of \newcount.
+%
+\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:
+%
+\def\@futurenonspacelet#1{\def\cs{#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\cs\@steptwo}%
+\def\@steptwo{\expandafter\ifx\cs\@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\@optionaltemp = #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
+   \else
+      \let\@optionalarg = \empty
+      % We can't do the \temp after the \fi, because then the \temp gets
+      % in the way of reading the optional argument from the input, if
+      % we do have one.
+      \expandafter\@optionaltemp
+   \fi
+}%
+%
+\def\@@getoptionalarg[#1]{%
+   \def\@optionalarg{#1}%
+   \@optionaltemp
+}%
+%
+%
+% 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.
+%
+\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\textbf#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\@numparams
+%
+% \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
+\def\newcommand#1{%
+   \def\@commandname{#1}%
+   \@getoptionalarg\@continuenewcommand
+}%
+\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
+\def\providecommand#1{%
+   \def\@commandname{#1}%
+   %
+   \expandafter\ifx\@commandname \@undefined
+     \let\cs=\@continuenewcommand  % undefined, so we'll define it
+   \else
+     \let\cs=\@gobble              % already defined, so ignore it
+   \fi
+   \@getoptionalarg\cs
+}%
+\fi
+% 
+% 
+% Figure out if this definition has parameters.
+%
+\def\@continuenewcommand{%
+   % If no optional argument, we have zero parameters.  Otherwise, we
+   % have that many.
+   \@numparams = \ifx\@optionalarg\empty 0\else\@optionalarg \fi \relax
+   \@newcommand
+}%
+%
+% \@numparams is how many arguments this command has.  The name of the
+% command is \@commandname.  The replacement text for the new macro is #1.
+%
+\def\@newcommand#1{%
+   \def\@startdef{\expandafter\edef\@commandname}%
+   \ifnum\@numparams=0
+      \let\@paramdef = \empty
+   \else
+      \ifnum\@numparams>9
+         \errmessage{\the\@numparams\space is too many parameters}%
+      \else
+         \ifnum\@numparams<0
+            \errmessage{\the\@numparams\space is too few parameters}%
+         \else
+            \edef\@paramdef{%
+               % This is disgusting, but \loop doesn't work inside \edef,
+               % because \body isn't defined.
+               \ifcase\@numparams
+                  \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\@startdef\@paramdef{#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
-- 
cgit v1.2.3

