%% @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