home *** CD-ROM | disk | FTP | other *** search
- %% @texfile{
- %% author = "Karl Berry and Oren Patashnik",
- %% version = "0.99j",
- %% date = "14 Mar 1992",
- %% filename = "btxmac.tex",
- %% address = "Please use electronic mail",
- %% checksum = "834 4503 33061",
- %% email = "opbibtex@cs.stanford.edu",
- %% codetable = "ISO/ASCII",
- %% supported = "yes",
- %% docstring = "Defines macros that make BibTeX work with plain TeX",
- %% }
- % BibTeX-for-TeX macros, version 0.99j, for BibTeX 0.99c, TeX 3.0 or later.
- % Copyright (C) 1990--92 by Karl Berry and Oren Patashnik; all rights reserved.
- % You may copy this file provided: that it's accompanied by the
- % "BibTeXing" document, whose text is contained in the file `btxdoc.tex';
- % that any documentation you write for these macros also gives a
- % reference for "BibTeXing"; and that either you make absolutely no
- % changes to your copy, or if you do make changes, (1) you name the file
- % something other than `btxmac.tex' and you remove all occurrences of
- % `btxmac.tex' from the file, (2) you put, somewhere in the first twenty
- % lines of the file, your name, along with an electronic address at which
- % others who might use the file may reach you, and (3) you remove each
- % occurrence of Oren's name and electronic address from this file. These
- % restrictions help ensure that all standard versions of these macros are
- % identical, and that Oren doesn't get deluged with inappropriate e-mail.
- %
- % This file, btxmac.tex, 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 nine-line .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 a nine-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).
- %
- % \def\mbox#1{\leavevmode\hbox{#1}}
- % \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
- % \bibliography{xampl} % specify the database files; here, just xampl.bib
- % \bibliographystyle{plain} % specify plain.bst as the style file
- % \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.
- %
- %
- % The LaTeX-related commands defined in this file include (a) the four
- % commands that a user types (\bibliography, \bibliographystyle, \cite,
- % and \nocite); (b) the 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) a LaTeX
- % command (\newcommand) that's written by one of the four standard
- % bibliography styles (alpha). The definitions here are not exactly the
- % same as the corresponding LaTeX definitions (those eight LaTeX
- % definitions depend on a significant fraction of LaTeX itself). But
- % the only substantial differences are with \newcommand, which here,
- % without complaining, lets you redefine a preexisting control sequence
- % (in LaTeX, \newcommand won't let you redefine a preexisting command),
- % and which here doesn't make the control sequences it defines \long (in
- % LaTeX, that happens automatically); there may also be other minor
- % differences. To summarize: Unless you know what you're doing, you
- % shouldn't define any control sequences with these eight names:
- %
- % \bibdata
- % \bibliography
- % \bibliographystyle
- % \bibstyle
- % \citation
- % \cite
- % \newcommand
- % \nocite
- %
- % There are three other commands written by one or more of the four
- % standard (plain, abbrv, alpha, unsrt) or four semistandard (acm,
- % apalike, ieeetr, siam) bibliography styles; they take effect only
- % within the bibliography, and are redefinable, as explained later:
- %
- % \em
- % \newblock
- % \sc
- %
- % 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.
- \@printcitelabel{#1}%
- \@notfirstcitationtrue
- }%
- %
- % This is in case some macro package wants to redefine \@citelabel to be
- % something that is not fully expandable. Suggested Victor Eijkhout for
- % Lollipop.
- \def\@printcitelabel#1{%
- \csname\@citelabel{#1}\endcsname
- }%
- %
- % 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{%
- \biblabelprint{\csname\@citelabel{##1}\endcsname}%
- \@writeaux{\string\@citedef{##1}{\csname\@citelabel{##1}\endcsname}}%
- \ignorespaces
- }%
- %
- % Do the printing (we're producing the bibliography, remember).
- %
- \let\em = \bblem
- \let\newblock = \bblnewblock
- \let\sc = \bblsc
- % 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}%
- %
- % 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
- %
- %
- % 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
- \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'.
- %
- \def\newcommand#1{%
- \def\@commandname{#1}%
- \@getoptionalarg\@continuenewcommand
- }%
- %
- % 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
-