|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T b
Length: 23149 (0x5a6d)
Types: TextFile
Names: »btxmac.tex«
└─⟦52210d11f⟧ Bits:30007239 EUUGD2: TeX 3 1992-12
└─⟦63303ae94⟧ »unix3.14/TeX3.14.tar.Z«
└─⟦c58930e5c⟧
└─⟦this⟧ »TeX3.14/BibTeX.inputs/btxmac.tex«
%% @texfile{
%% author = "Karl Berry and Oren Patashnik",
%% version = "0.99d",
%% date = "6 Sep 1990",
%% filename = "btxmac.tex",
%% address = "Please use e-mail",
%% checksum = "666 3012 23149",
%% 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.99d, for BibTeX 0.99c, TeX 3.0 or later.
% Copyright (C) 1990 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.)]
%
% 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.
%
%
%
% 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) the only LaTeX
% command (\newcommand) that's written by any of the four standard
% bibliography styles. 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 difference is with \newcommand, which here, without
% complaining, lets you redefine a preexisting control sequence (in
% LaTeX, \newcommand won't let you redefine a preexisting command). So
% 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's one control sequence you might want to use (but not redefine)
% in redefining \biblabelprint:
%
% \biblabelwidth
%
% There are ten 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 four begin with `\bbl' and affect fonts, spacing,
% and perhaps other characteristics of the bibliography; the next two
% 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
% \biblabelcontents
% \biblabelprint
% \printbetweencitations
% \printcitefinish
% \printcitenote
% \printcitestart
%
% Here are two more control sequences (that are described later), each
% with an `@' in its name, that you probably won't want to redefine
% unless you are writing another macro package; if you do redefine them,
% however, you should do it before the \input btxmac command.
%
% \@setmoreletters
% \@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 you will
% already have any of them defined).
%
% \@auxfile \@auxfileopenedtrue \@auxfileopenedfalse
% \@citation \@cite \@@cite
% \@citedef \@citelabel \@citenote
% \@citewarningtrue \@citewarningfalse \@citewithnote
% \@commandname \@continuenewcommand \@emptymarkA
% \@emptymarkB \@fileexiststrue \@fileexistsfalse
% \@finishcitedef \@for \@forloop
% \@fornoop \@fortmp \@gobble
% \if@auxfileopened \if@citewarning \@ifempty
% \@@ifempty \if@fileexists \if@notfirstcitation
% \@iforloop \@itemnum \@letter
% \@newcommandwithargs \@newcommand \@next
% \@nextwhile \@nil \@nnil
% \@notfirstcitationtrue \@notfirstcitationfalse \@numparams
% \@oldatcatcode \@onecitation \@openauxfile
% \@other \@paramdef \@readauxfile
% \@readbblfile \@resetnumerals \@setletters
% \@spacesub \@startdef \@testfileexistence
% \@tokstostring \@ttsA \@ttsB
% \@ttsmarkA \@ttsmarkB \@undefined
%
% So to start things off, we turn `@' into a letter (catcode 11),
% keeping track of the old catcode 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.
%
% Swallow one parameter.
%
\def\@gobble#1{}%
%
%
% \@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 routine tests if a file \jobname.#1 exists, and sets
% \if@fileexists appropriately.
%
\newif\if@fileexists
%
\def\@testfileexistence#1{%
\begingroup
\immediate\openin0 = \jobname.#1 % That space is swallowed by TeX.
\ifeof 0
\global\@fileexistsfalse
\else
\global\@fileexiststrue
\fi
\immediate\closein0
\endgroup
}%
%
%
% 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{\write\@auxfile{\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{%
\write\@auxfile{\string\bibdata{#1}}%
\@testfileexistence{bbl}%
\if@fileexists
\@readbblfile
\fi
}%
\let\bibdata = \@gobble
%
%
% The \nocite{label,label,...} command writes its argument to \@auxfile,
% but produces no text in the document. Both \nocite and \cite
% commands produce \citation commands in the .aux file.
%
\def\nocite#1{\write\@auxfile{\string\citation{#1}}}%
%
%
\newif\if@notfirstcitation
%
% \cite[note]{label,label,...} produces the citations for the labels as
% well. If `[note]' is present, it's added after the labels.
%
\def\cite{\futurelet\next\@cite}%
\def\@cite{%
\begingroup \if [\next
\aftergroup\@citewithnote
\else
\global\let\@citenote = \empty
\aftergroup\@@cite
\fi \endgroup
}%
%
% We get here when we have the optional note.
%
\def\@citewithnote[#1]{%
\def\@citenote{#1}%
\@@cite
}%
%
% Typeset the citations for the labels in #1, followed by \@citenote, if
% non\empty. 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\@citenote\else
\printcitenote{\@citenote}%
\fi
\printcitefinish
}%
%
\def\@onecitation#1\@@{%
\if@notfirstcitation
\printbetweencitations
\fi
%
\expandafter \ifx \csname\@citelabel{#1}\endcsname \relax
\if@citewarning
\message{Undefined citation `#1'.}%
\fi
% Give it a dummy definition:
\expandafter\gdef\csname\@citelabel{#1}\endcsname{%
\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
% <number>s.
%
\def\@citedef#1{\@resetnumerals\@finishcitedef{#1}}%
\def\@finishcitedef#1#2{\expandafter\gdef\csname\@citelabel{#1}\endcsname{#2}}%
\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
}%
%
%
% 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 these things in
% advance. If you wish, you can define \bblhook to produce the title.
% Or just do it before the \bibliography command.
%
\def\@readbblfile{%
\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}%
\write\@auxfile
{\string\@citedef{##1}{\csname\@citelabel{##1}\endcsname}}%
\ignorespaces
}%
%
% Do the printing (we're producing the bibliography, remember).
%
\let\em = \bblem
\let\newblock = \bblnewblock
% 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
% 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.
\everypar = {\hangindent = \biblabelwidth \advance\hangindent by .5em}%
\bblrm
\bblhook
%
\input \jobname.bbl
\endgroup
}%
%
% \@itemnum is declared outside of \@readbblfile because \newcount is \outer.
%
\newcount\@itemnum
%
% The widest label's width is useful for redefining \biblabelprint; you
% redefine \biblabelwidth, in effect, by redefining the \biblabelcontents
% macro that appears below.
%
\newdimen\biblabelwidth
%
%
% 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.
%
\def\biblabelprint#1{%
\noindent\hbox to \biblabelwidth{\biblabelcontents{#1}\hfil}\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 in, e.g., titles, uses \it by default:
%
\def\bblem{\it}%
%
% The major parts of an entry are separated with \bblnewblock. The
% numbers below are taken from LaTeX's article.doc.
%
\def\bblnewblock{\hskip .11em plus .33em minus .07em}%
%
% Here's where you stick any other bibliography-formatting goodies.
%
\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, non\empty note
%
% 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
%
%
% Definitions of references are recorded in \jobname.aux, called
% the \@auxfile in these macros, which we open (for writing)
% right after we read it.
%
\newwrite\@auxfile
\newif\if@auxfileopened
%
\def\@openauxfile{%
\if@auxfileopened\else
\@auxfileopenedtrue
\immediate\openout\@auxfile = \jobname.aux
\fi
}%
%
% Those definitions are read in when we call \@readauxfile,
% which happens at the end of this (btxmac.tex) file.
%
% \@readauxfile treats many characters as letters, since it
% makes a control sequence name out of the argument, and yet
% we want to allow general names for labels.
%
\def\@readauxfile{%
\@testfileexistence{aux}%
\if@fileexists
\begingroup
\@setletters
\input \jobname.aux
\endgroup
\else
\message{\@undefinedmessage}%
\@citewarningfalse
\fi
\@openauxfile
}%
%
% We prepare to read certain characters correctly from the .aux file.
%
\def\@setletters{%
\catcode`_ = \@letter
\catcode`+ = \@letter \catcode`- = \@letter
\catcode`@ = \@letter
\catcode`0 = \@letter \catcode`1 = \@letter \catcode`2 = \@letter
\catcode`3 = \@letter \catcode`4 = \@letter \catcode`5 = \@letter
\catcode`6 = \@letter \catcode`7 = \@letter \catcode`8 = \@letter
\catcode`9 = \@letter
\catcode`( = \@letter \catcode`) = \@letter
\@setmoreletters
}%
%
% It's conceivable you'd want to change how other characters are read;
% to do that, define \@setmoreletters before doing an \input btxmac.
%
\ifx\@setmoreletters\@undefined
\let\@setmoreletters = \empty
\fi
%
% Similarly, 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 only want to complain if
% \@citewarningtrue.
%
\newif\if@citewarning \@citewarningtrue
%
%
% 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.
%
\newcount\@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}%
}%
%
%
% Finally, before leaving we read in the .aux file
%
\@readauxfile
%
% and restore @'s old catcode.
%
\catcode`@ = \@oldatcatcode