%% @texfile{ %% author = "Karl Berry and Oren Patashnik", %% version = "0.99h", %% date = "24 Apr 1991", %% filename = "btxmac.tex", %% address = "Please use electronic mail", %% checksum = "812 4053 30557", %% email = "opbibtex@neon.stanford.edu", %% codetable = "ISO/ASCII", %% supported = "yes", %% docstring = "Defines macros that make BibTeX work with plain TeX", %% } % BibTeX-for-TeX macros, version 0.99h, for BibTeX 0.99c, TeX 3.0 or later. % Copyright (C) 1990--91 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@neon.stanford.edu). These macros will become % frozen shortly after BibTeX version 1.00 is released. % % 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. Finally, as long as you follow the guidelines given % by the LaTeX manual and "BibTeXing", you simply \input btxmac. % [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 macro packages % like Eplain. If you want to try out these macros on 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. % % % 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. % % % 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 twelve 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 five begin with `\bbl' and affect fonts, spacing, % and perhaps other characteristics of the bibliography; the next three % 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 % \bblhook % \bblnewblock % \bblrm % \bblsc % \biblabelcontents % \biblabelextrahang % \biblabelprint % \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), with an `@' % in its name, 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: % % \@undefinedmessage % % And here are still more control sequences that, should you already have % them defined, might conflict with the way the btxmac.tex macros use them % (but since each of these has an `@' in its name, it's unlikely that such % conflicts will arise unless you intend them): % % \@auxfile \@auxfiledonefalse \@auxfiledonetrue % \@bracketcheck \@citation \@cite % \@citedef \@citelabel \@citewarningfalse % \@citewarningtrue \@commandname \@continuenewcommand % \@emptymarkA \@emptymarkB \@fileexistsfalse % \@fileexiststrue \@finishcitedef \@finishtestfileexistence % \@for \@forloop \@fornoop % \@fortmp \@getoptionalarg \@@getoptionalarg % \@gobble \@if@auxfiledone \if@citewarning % \@ifempty \@@ifempty \if@fileexists % \if@notfirstcitation \@iforloop \@innerdef % \@innernewcount \@innernewdimen \@innernewif % \@innernewwrite \@itemnum \@letter % \@linenumber \@newcommandwithargs \@newcommand % \@next \@nextwhile \@nil % \@nnil \@notfirstcitationfalse \@notfirstcitationtrue % \@numparams \@oldatcatcode \@onecitation % \@optionalarg \@other \@paramdef % \@readauxfile \@readbblfile \@resetnumerals % \@scfont \@setletters \@spacesub % \@startdef \@testfileexistence \@tokstostring % \@ttsA \@ttsB \@ttsmarkA % \@ttsmarkB \@undefined \@writeaux % % % 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 % % % \@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\temp = #1\futurelet\next\@bracketcheck}% \def\@bracketcheck{\begingroup \if [\next \aftergroup\@@getoptionalarg \else \global\let\@optionalarg = \empty % % We can't do the \aftergroup\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. \aftergroup\temp \fi \endgroup}% % \def\@@getoptionalarg[#1]{% \def\@optionalarg{#1}% \temp }% % % % \@tokstostring converts its argument into a list of character tokens. % It uses no commands that are executed in the stomach, only expansions % handled in the gullet. (This is necessary for use with \edef). % % Control sequences in the argument are not expanded. Blanks become a % \spacesub. The argument shouldn't contain other special characters. % \def\@tokstostring#1{\@ttsA#1 \@ttsmarkA}% % % \@ttsA partitions a sequence of tokens into portions delimited by blanks. % \def\@ttsA#1 #2\@ttsmarkA{% \@ifempty{#1}\else \@ttsB #1\@ttsmarkB % \@ifempty{#2}\else \@spacesub\@ttsA#2\@ttsmarkA \fi \fi }% % % \@ttsB processes a sequence of tokens with no contained blanks. % \def\@ttsB#1{% \ifx #1\@ttsmarkB\else \string #1% \expandafter\@ttsB \fi }% % % This is just so \ifx won't complain about an undefined control sequence. % \def\@ttsmarkB{\@ttsmarkB}% should never be expanded % % The expansion of this macro replaces spaces. % \def\@spacesub{+}% % % % \@ifempty tests if it is given an argument. % \def\@ifempty#1{\@@ifempty #1\@emptymarkA\@emptymarkB}% \def\@@ifempty#1#2\@emptymarkB{\ifx #1\@emptymarkA}% % \def\@emptymarkA{\@emptymarkA}% Again, so \ifx won't complain. % % % 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. % \def\bibliography#1{% \@readauxfile \@writeaux{\string\bibdata{#1}}% \@testfileexistence{bbl}% \if@fileexists \@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 before doing any writing, it % doesn't need to call \@readauxfile. We change the category code of % `_' so that the dummy definition given to the citation label doesn't % include a subcript character; that would cause TeX to complain. % \def\cite{\begingroup\catcode`_ = \@letter \@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{% \nocite{#1}% % Start printing the text, beginning with a left bracket by default. % \printcitestart \@notfirstcitationfalse \@for \@citation :=#1\do {% \expandafter\@onecitation\@citation\@@ }% \ifx\empty\@optionalarg\else \printcitenote{\@optionalarg}% \fi \printcitefinish \endgroup }% % \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 \nobreak\hskip0pt#1\nobreak\hskip0pt}}% \fi % Now produce the text, whether it was undefined or not. \csname\@citelabel{#1}\endcsname \@notfirstcitationtrue }% % % Given a label `foo', the macro `\b@foo' is supposed to % hold the text that should be produced. % \def\@citelabel#1{\@tokstostring{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. But we have to be careful when reading the \@citedef, because % the second argument might have accents or other commands with numbers % as arguments. We have given the numerals category code 11 for reading % the .aux file, and that prevents them from being recognized as TeX % s. Similarly for the other characters that can be part of a % . So we have to reset the category codes before reading the % second argument. We also have to reset them back to letters when we % finish reading the \@citedef's, because there might be more labels % with numerals in them defined afterwards in the .aux file, put there % by Eplain or whatever. % \def\@citedef#1{% \begingroup \@resetnumerals \@finishcitedef{#1}% }% \def\@finishcitedef#1#2{% \expandafter\gdef\csname\@citelabel{#1}\endcsname{#2}% \endgroup }% \def\@resetnumerals{% \catcode`0 = \@other \catcode`1 = \@other \catcode`2 = \@other \catcode`3 = \@other \catcode`4 = \@other \catcode`5 = \@other \catcode`6 = \@other \catcode`7 = \@other \catcode`8 = \@other \catcode`9 = \@other \catcode`" = \@other \catcode`' = \@other \catcode`` = \@other \catcode`, = \@other \catcode`. = \@other }% % % % 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. \@innernewcount\@itemnum % \begingroup \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 }% \def\end##1{}% ##1 is `thebibliography' again. % % 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{\futurelet\next\@bibitem}% \def\@bibitem{% \begingroup \if [\next \aftergroup\@alphabibitem \else \aftergroup\@numberedbibitem \fi \endgroup }% \def\@alphabibitem[##1]##2{% % Need \xdef here for various reasons. \expandafter \xdef\csname\@citelabel{##2}\endcsname {##1}% \@finishbibitem{##2}% }% % \def\@numberedbibitem##1{% \advance\@itemnum by 1 \expandafter \xdef\csname\@citelabel{##1}\endcsname{\number\@itemnum}% \@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 \biblabelextrahang}% \bblrm % the \parskip is a guess at what looks good; \parskip = 1.5ex plus .5ex minus .5ex % and the .5em matches the \enspace of \biblabelprint below. \biblabelextrahang = .5em \bblhook % \input \jobname.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 \biblabelextrahang, % which is redefinable inside \bblhook, is added to \biblabelwidth to % determine the amount of hanging indentation. % \@innernewdimen\biblabelwidth \@innernewdimen\biblabelextrahang % % 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 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{\biblabelcontents{#1}\hss}\enspace}% % % 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{$^\bgroup} % \def\printcitefinish{\egroup$} % \def\printbetweencitations{,} % \def\printcitenote#1{\hbox{\sevenrm\space (#1)}} % to get superscripted in-text citations. To get something radically % different, however, you'll have to define your own \cite command. % % When we read this from the .aux file, \citation 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}% \futurelet\@next\@continuenewcommand }% % % Figure out if this definition has parameters. % \def\@continuenewcommand{\begingroup \if [\@next \aftergroup\@newcommandwithargs \else \global\@numparams = 0 \aftergroup\@newcommand \fi \endgroup}% % \def\@newcommandwithargs[#1]{% \global\@numparams = #1 \@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, there are never any % (non-pathological) cases where an end-of-line might % actually be desired. If you really need to do something % strange, you can redefine \@setletters to do something % besides what it does now (this is intentionally left as % being somewhat painful to do). \endlinechar = -1 \@setletters \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 % % Since lots of characters are allowable inside reference names, and % since a reference name can get converted into a control sequence, % \@readauxfile must treat many characters as letters. It does that by % calling \@setletters, which changes the category code of all \@other % characters to \@letter. The 128/256 business arises because character % codes go up to 256 starting with TeX 3.0, but up to only 128 with % earlier versions. % \def\@setletters{% \count255 = 0 \edef\temp{\ifx\inputlineno\@undefined 128\else 256\fi}% \loop \ifnum\catcode\count255 = \@other \catcode\count255 = \@letter \fi \advance\count255 by 1 \ifnum\count255<\temp \repeat % The Eplain package uses underscores to construct the label names. \catcode`\_ = \@letter }% % % 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