BibTeX

Die Versionsnummer von BibTeX lautet nach wie vor 0.99d. Diese Nummer liefert TeX Live 2024 aus, und die offizielle Dokumentation btxdoc.tex trägt weiterhin das Datum 8. Februar 1988 und verspricht weiterhin eine Erweiterung, „wenn BibTeX Version 1.00 erscheint“. Version 1.00 ist nie erschienen. Trotzdem bleibt BibTeX der Bezugspunkt für Literaturverzeichnisse in LaTeX, und zwar aus einem einfachen Grund: Es hat von Anfang an getrennt, was ein Werk ist (die .bib-Datenbank), und wie es gedruckt wird (der .bst-Stil). Diese Seite behandelt das Schreiben einer .bib-Datei, die Aufgaben von \cite, \bibliographystyle und \bibliography, den vierstufigen Ablauf latex → bibtex → latex → latex und die Frage, warum LaTeX Warning: Citation ... undefined manchmal hartnäckig bestehen bleibt.

Warum BibTeX ein von LaTeX getrenntes Programm ist

BibTeX ist kein Teil von LaTeX, sondern ein eigenes ausführbares Programm. Mehr noch: Es liest die .tex-Datei überhaupt nie. Gelesen wird nur die von LaTeX erzeugte .aux; daraus greift es drei Dinge auf – welche Keys zitiert wurden, welcher Stil verlangt ist und welche .bib zu öffnen ist – und schreibt seine Antwort in eine .bbl zurück. Genau diese strikte Arbeitsteilung erklärt die vier Durchläufe des Builds. Die Copyright-Zeile am Kopf der Standardstildateien lautet bis heute „Copyright (C) 1984, 1985, 1988 Howard Trickey and Oren Patashnik“ – Jahre, in denen LaTeX selbst noch Gestalt annahm. BibTeX wurde nicht nachträglich angeflanscht, sondern als beinahe gleichaltriger Begleiter entworfen.

Der Mechanismus besteht aus drei Teilen: der .bib-Datei mit den Rohdaten der Referenzen, den \cite-Aufrufen samt zwei Befehlen im Dokument (\bibliographystyle und \bibliography) und der .bst-Datei, die das Erscheinungsbild festlegt. Referenzen am Dokumentende von Hand mit der Umgebung thebibliography aufzulisten genügt für kleine Texte; sobald dieselben Werke aber in mehreren Aufsätzen wiederverwendet werden, ist unklar, welche Fassung die richtige ist. Genau das löst BibTeX: Liegen die Daten an einer Stelle, kostet ein Wechsel des Publikationsorts ein einziges Stilwort statt eines Nachmittags. Der Gedanke „Struktur von Darstellung trennen“, der ganz LaTeX durchzieht, wird hier schlicht auf die Literatur angewandt.

Wie man einen .bib-Eintrag schreibt: Typ, Zitierschlüssel, Felder

Eine .bib-Datei ist reiner Text, der Einträge auflistet. Jeder Eintrag deklariert einen Eintragstyp wie @article und nennt dann in geschweiften Klammern zuerst den Zitierschlüssel und danach die Felder in der Form fieldname = {value}, durch Kommas getrennt. Der Zitierschlüssel ist ein Bezeichner, der zeichengenau zu \cite{...} im Dokument passen muss; die Benennung steht frei. Üblich ist Nachname plus Jahr wie in knuth1984: kollidiert selten und bleibt auch in einer Gemeinschaftsarbeit im Gedächtnis. Die Reihenfolge der Felder wirkt sich nicht auf die Ausgabe aus – Sortieren und Formatieren übernimmt der Stil.

references.bib
@string{bstj = "Bell System Technical Journal"}

@book{knuth1984,
  author    = {Donald E. Knuth},
  title     = {The {TeX}book},
  publisher = {Addison-Wesley},
  year      = {1984}
}

@article{shannon1948,
  author  = {Claude E. Shannon},
  title   = {A Mathematical Theory of Communication},
  journal = bstj,          % @string abbreviation, no braces
  volume  = {27},
  number  = {3},
  pages   = {379--423},
  year    = {1948}
}

@inproceedings{lamport1987,
  author    = {Leslie Lamport},
  title     = {Document Production: Visual or Logical?},
  booktitle = {Proceedings of TUG},
  year      = {1987},
  pages     = {19--24}
}

Welche Felder Pflicht sind, entscheidet der Stil, nicht BibTeX selbst. Mit dem Standardstil plain wird jede Lücke beim Namen genannt: Warning--empty journal in shannon1948. Das sind Warnungen, keine Fehler, die Verarbeitung läuft also weiter – die Information verschwindet nur kommentarlos aus der Ausgabe, weshalb sich das Lesen der Warnungen lohnt. Mit @string{bstj = "..."} definierte Abkürzungen lassen sich als bloßer Name ohne geschweifte Klammern referenzieren. Und das Feld crossref lässt einen Beitrag von einem übergeordneten @proceedings-Eintrag erben, sodass Tagungsname und Verlag nicht für jeden Beitrag erneut getippt werden müssen.

EintragstypWofürVon plain verlangt
@articleAufsatz in einer Zeitschriftauthor, title, journal, year
@bookBuch aus einem Verlagauthor oder editor, title, publisher, year
@inproceedingsBeitrag in einem Tagungsbandauthor, title, booktitle, year
@incollectionKapitel eines Buchs mit eigenem Titelauthor, title, booktitle, publisher, year
@phdthesisDissertation (@mastersthesis für Masterarbeiten)author, title, school, year
@techreportBericht einer Institutionauthor, title, institution, year
@unpublishedUnveröffentlichter Entwurf oder Mitteilungauthor, title, note
@miscAlles, was sonst nirgends passt, etwa eine WebseiteKeine; howpublished und note übernehmen

Warum plain aus TeX ein tex macht: Großbuchstaben in Klammern schützen

Die Stile plain und abbrv setzen den Titel eines Aufsatzes bis auf den ersten Buchstaben klein. Ein @article mit title = {A Note on TeX and NASA Systems} erscheint daher als „A note on tex and nasa systems“. Eigennamen und Abkürzungen werden gnadenlos eingeebnet. Es gibt genau eine Abwehr: den zu schützenden Teil in ein weiteres Klammerpaar setzen. Als {TeX} und {NASA} geschrieben, bleiben diese Stellen unangetastet. Die Kleinschreibung betrifft dabei Aufsatztitel (title), nicht Buchtitel und nicht booktitle – ein {TeX} in einem @book schadet also nicht, nützt aber auch nichts, und dieses Wissen erspart Verwirrung.

references.bib
% unprotected: plain.bst prints "A note on tex and nasa systems"
@article{bad,
  author  = {A. One},
  title   = {A Note on TeX and NASA Systems},
  journal = {J. Test},
  year    = {2000}
}

% protected: prints "A note on {TeX} and {NASA} systems"
@article{good,
  author  = {B. Two},
  title   = {A Note on {TeX} and {NASA} Systems},
  journal = {J. Test},
  year    = {2000}
}

% names: separate with "and"; brace a corporate author whole
@misc{org,
  author = {{World Health Organization}},
  title  = {Annual Report},
  year   = {2024}
}

Für Autorennamen gilt dieselbe Logik. Mehrere Autoren werden mit and getrennt (author = {A. Smith and B. Jones}); das Komma ist der Trennung von Nach- und Vorname vorbehalten, author = {Smith, Alice} bedeutet also Nachname Smith, Vorname Alice. Endet die Liste auf and others, ersetzt der Stil das durch „et al.“. Heikel sind Körperschaften: Ohne ein weiteres Klammerpaar um den ganzen Namen, wie in {World Health Organization}, zerlegt BibTeX ihn in Nachname und Initialen. Namen werden als Syntax gelesen; was von dieser Analyse ausgenommen werden soll, bringt man mit geschweiften Klammern zum Schweigen – wieder dasselbe eine Werkzeug.

Was \bibliographystyle und \bibliography tatsächlich tun

Beide Befehle drucken weniger, als dass sie eine Nachricht in der .aux hinterlassen. \bibliographystyle{plain} schreibt dort \bibstyle{plain} hinein, \bibliography{references} schreibt \bibdata{references}; BibTeX liest beides und handelt danach. \bibliography hat zusätzlich eine zweite Aufgabe: Es druckt die Referenzliste genau an der Stelle, an der es steht – deshalb gehört es ans Ende des Textkörpers, direkt vor \end{document}. Das Argument trägt keine Endung: Auch wenn die Datei references.bib heißt, schreibt man references. Mehrere Datenbanken werden kommagetrennt angegeben, \bibliography{books,papers}.

document.tex
\documentclass{article}
\begin{document}

TeX was created by Knuth~\cite{knuth1984}, building on
Shannon's information theory~\cite{shannon1948,lamport1987}.

% \nocite{*}            % force every entry of the database into the list
\bibliographystyle{plain}
\bibliography{references}

\end{document}

Im Text zeigt \cite{knuth1984} unmittelbar auf den Zitierschlüssel in der .bib. In die Liste gelangen nur zitierte Werke: Ein Eintrag, der in der .bib steht, aber nie zitiert wird, bleibt unbeachtet. Um die ganze Datenbank zu erzwingen, dient \nocite{*}\nocite meldet ein Werk als zitiert, ohne im Text eine Marke zu setzen. Mehrere Schlüssel lassen sich in einem Aufruf bündeln, \cite{shannon1948,lamport1987}. Die Varianten von \cite selbst – eine Seitenangabe mit \cite[p.~42]{knuth1984} oder Autor-Jahr-Formen wie \citet und \citep aus natbib – gehören auf die Seite zum Zitieren.

Warum der Ablauf latex → bibtex → latex → latex lautet

Vier Durchläufe sind nötig, weil Information jeweils nur in eine Richtung fließt. Ohne die .aux weiß BibTeX nicht, was zitiert wurde; ohne die .bbl weiß LaTeX nicht, was zu drucken ist. Und die Nummern „[1]“, „[2]“ stehen erst fest, wenn das Verzeichnis tatsächlich gesetzt wurde – diese Nummern zurück in die \cite-Marken des Textes zu bringen, kostet eine weitere Runde. Die BibTeX-Dokumentation btxdoc.tex beschreibt dieses Rezept selbst und ergänzt, dass in sehr seltenen Fällen ein zusätzlicher BibTeX- und LaTeX-Lauf nötig sein kann.

  • 1. latex-Lauf — verarbeitet den Text und schreibt die zitierten Schlüssel als \citation{...} sowie Stil und Datenbank als \bibstyle{...} und \bibdata{...} in die .aux. Ein Literaturverzeichnis existiert noch nicht.
  • bibtex — liest ausschließlich die .aux, erfährt daraus Schlüssel, Stil und .bib; holt die passenden Einträge aus der Datenbank; formatiert sie nach den Regeln der .bst; und schreibt eine vollständige thebibliography-Umgebung als .bbl-Datei.
  • 2. latex-Lauf — liest die .bbl und setzt das Verzeichnis. Die \cite-Marken im Text arbeiten jedoch noch mit der alten .aux, weshalb die Warnungen Citation ... undefined in diesem Durchgang bestehen bleiben.
  • 3. latex-Lauf — die Nummern stehen fest, Textzitate und Verzeichnis passen endlich zusammen. Erst jetzt verstummen die Warnungen.
terminal
$ pdflatex document.tex   # writes document.aux (\citation, \bibstyle, \bibdata)
$ bibtex   document       # note: job name, not document.tex -> writes .bbl and .blg
$ pdflatex document.tex   # pulls in .bbl; citations still undefined here
$ pdflatex document.tex   # numbers settle; warnings clear

Die einzige Schreibfalle: bibtex erwartet den Jobnamen ohne Endung, nicht die .tex. Wer bibtex document.tex tippt, schickt es auf die Suche nach document.tex.aux, und es scheitert. Neben seiner Ausgabe schreibt BibTeX ein Protokoll namens .blg; dort schlägt man nach, wenn man den vollen Wortlaut einer Warnung später erneut lesen will. In der Praxis tippt ohnehin niemand die vier Befehle: latexmk prüft die .aux, entscheidet über Notwendigkeit und Anzahl der Läufe, und latexmk -pdf document.tex ist das ganze Rezept.

Citation ... undefined und ein leer bleibendes Literaturverzeichnis

Zu sehen sind LaTeX Warning: Citation ... undefined und LaTeX Warning: There were undefined references., die Zitate im Text erscheinen als [?], und das Literaturverzeichnis fehlt samt Überschrift. In neun von zehn Fällen liegt es schlicht daran, dass zu wenige Durchläufe erfolgt sind. Ohne .bbl druckt LaTeX keine einzige Zeile des Verzeichnisses – und die Überschrift fehlt deshalb, weil die Umgebung thebibliography selbst in der .bbl steht. Also zunächst in Ruhe latex → bibtex → latex → latex vollständig durchlaufen lassen. Bleibt die Warnung, hat BibTeX seinerseits eine andere Meldung ausgegeben.

MeldungWo sie erscheintUrsache und Abhilfe
Citation ... undefinedLaTeXNoch keine oder eine veraltete .bbl. Vollständig latex → bibtex → latex → latex durchlaufen
There were undefined references.LaTeXEin \cite oder \ref ist noch ungelöst; latex erneut laufen lassen
I found no \citation commandsBibTeXWeder \cite noch \nocite vorhanden; etwas zitieren oder \nocite{*} ergänzen
I found no \bibstyle commandBibTeX\bibliographystyle{...} fehlt im Dokument
I found no database filesBibTeX\bibliography{...} fehlt oder die genannte .bib ist nicht auffindbar
I found no style fileBibTeXKeine .bst dieses Namens; Schreibweise prüfen oder die .bst des Verlags ablegen
Warning--I didn't find a database entryBibTeXEin zitierter Schlüssel fehlt in der .bib – Tippfehler oder nie angelegter Eintrag

Hilft das nicht, sind veraltete Hilfsdateien verdächtig. Nach dem Umbenennen eines Schlüssels, dem Verschieben der .bib in ein anderes Verzeichnis oder einem Stilwechsel tragen .aux, .bbl und .blg unter Umständen noch die Angaben des letzten Laufs. latexmk -C löscht die erzeugten Dateien in einem Zug; anschließend von Grund auf neu zu bauen ist der kürzeste Weg. Zu beachten ist außerdem, dass Zitierschlüssel Groß- und Kleinschreibung unterscheiden: Knuth1984 und knuth1984 sind für BibTeX zwei verschiedene Werke.

plain, unsrt, alpha und abbrv im Vergleich

Die vier Standardstile unterscheiden sich in nur drei Punkten – Sortierreihenfolge, Gestalt des Labels und Grad der Abkürzung von Namen und Zeitschriftentiteln –, während die aufgenommenen Felder identisch sind. Kein Zufall: plain.bst, unsrt.bst, alpha.bst und abbrv.bst entstehen alle aus einer einzigen Datei. Eine Vorlage namens btxbst.doc wird dem C-Präprozessor mit -DPLAIN, -DUNSRT, -DALPHA oder -DABBRV übergeben, wie die Datei selbst eingangs erklärt. Die vier wirken nur deshalb leicht verschieden, weil sie bedingte Übersetzungen ein und desselben Textes sind.

StilSortierreihenfolgeLabel und Charakter
plainAlphabetisch nach AutorFortlaufende Nummern [1]; die sicherste Vorgabe
unsrtReihenfolge der ersten Zitierung im TextFortlaufende Nummern [1]; Formatierung wie plain
alphaNach Label, faktisch also Autor und JahrAlphanumerische Labels wie [Knu84]; gut lesbar in formellastigen Fächern
abbrvAlphabetisch nach AutorNummerierung wie plain, kürzt jedoch Vornamen, Monate und Zeitschriftentitel zugunsten des Platzes

Die BibTeX-Distribution bringt außerdem vier Stile mit, die ihr eigenes README „halbstandard“ nennt: acm (ACM Transactions), apalike (APA-ähnliches Autor-Jahr-Format, gemeinsam mit apalike.sty), ieeetr (IEEE Transactions, Nummern in Zitierreihenfolge) und siam (SIAM). Im Ingenieurwesen beginnt man meist mit ieeetr, in der Informatik mit acm, in Psychologie und Sozialwissenschaften mit apalike, wo Autor-Jahr verlangt ist. Darüber hinaus verteilen Fachgesellschaften und Verlage .bst-Dateien passend zu ihren Einreichungsrichtlinien; steht der Publikationsort fest, sucht man zuerst danach. Bei jedem Stilwechsel bleibt keine Zeile der .bib und keiner der \cite-Aufrufe zu ändern.

Warum niemand .bst von Hand schreibt: makebst und custom-bib

Gemieden werden .bst-Dateien, weil sie in einer Postfix-Stapelsprache geschrieben sind. Der offizielle Leitfaden für Stilentwerfer, btxhak.tex (Oren Patashnik, 8. Februar 1988), sagt es gleich zu Beginn: Bibliographiestile schreibt man in einer Postfix-Stapelsprache, und die Stildatei ist ein Programm in einer unbenannten Sprache. Die Sprache trägt nicht einmal einen Namen. Sie kennt nur zehn Befehle, doch jeder Wert wird auf einen Stapel gelegt und wieder heruntergenommen, sodass allein die Formatierung eines author-Feldes zu einer langen Kette umgekehrter polnischer Notation gerät. Eine vorhandene .bst zu kopieren und anzupassen ist machbar; eine von Grund auf zu entwerfen lohnt selten.

terminal
$ latex makebst      # answer the questions; choose "merlin" as the master file
                     # -> writes a .dbj batch job
$ latex mystyle.dbj  # runs docstrip -> mystyle.bst

Tatsächlich verwendet wird das Paket custom-bib, dessen Eingangstür makebst heißt. Ein latex makebst startet einen interaktiven Fragebogen: Soll der Nachname vorangehen, das Jahr in Klammern stehen, der Titel kursiv gesetzt werden – man antwortet, und am anderen Ende fällt eine .bst heraus. Verfasst hat es Patrick W. Daly, derselbe, der natbib schrieb und Autor-Jahr-Zitate auf die LaTeX-Seite brachte; die von makebst erzeugten Stile sind auf das Zusammenspiel mit natbib ausgelegt. Wenn die Richtlinien einer Zeitschrift fast, aber eben nicht ganz einem vorhandenen Stil entsprechen, ist das der realistischste Ausweg.

Japanische Literatur verarbeiten: pbibtex und upbibtex

Das reine bibtex setzt westlichen Text voraus; eine .bib mit japanischen Autorennamen oder Titeln bringt daher sowohl die Sortierung als auch die Zeichenkettenverarbeitung durcheinander. TeX Live liefert deshalb pbibtex (für pLaTeX, Sortierung nach EUC-JP-Codepunkten) und upbibtex (für upLaTeX, Sortierung nach Unicode-Codepunkten). Entscheidend ist, dass hier mehr als nur die Kodierung getauscht wird: Die Stilsprache selbst ist erweitert. Die neue eingebaute Funktion is.kanji.str$ meldet, ob eine Zeichenkette Nicht-ASCII enthält; substring$ wurde so geändert, dass es nie ein Mehrbyte-Zeichen zerschneidet; und add.period$ setzt nach japanischer Interpunktion wie 。 oder ? keinen weiteren Punkt. Die Linie führt zurück auf Shouichi Matsuis JBibTeX, dessen Geschichte die Distribution bis heute mit dokumentiert.

terminal
$ uplatex   document.tex   # 1st pass: writes .aux
$ upbibtex  document       # Japanese-aware: writes .bbl
$ uplatex   document.tex   # pulls in .bbl
$ uplatex   document.tex   # resolves references
$ dvipdfmx  document.dvi   # DVI -> PDF

Auch japanische Gegenstücke der Stile liegen bei: jplain zu plain, junsrt zu unsrt, jalpha zu alpha, jabbrv zu abbrv und jname, das den Familiennamen voranstellt. Für Fachgesellschaften gibt es jipsj (Information Processing Society of Japan), tipsj, tieice (IEICE) und jorsj – und auch sie werden mit dem C-Präprozessor aus einer einzigen Vorlage namens jbtxbst.doc geschnitten, genau wie auf der westlichen Seite. Der Ablauf ändert nur die Namen: latex wird zu platex oder uplatex, bibtex zu pbibtex oder upbibtex. Da der Weg über DVI führt, steht am Ende die Umwandlung mit dvipdfmx. latexmk lässt sich in seiner Konfigurationsdatei anweisen, diese Programme aufzurufen, sodass sich auch japanische Projekte automatisieren lassen.

Bei BibTeX bleiben oder zu biblatex und biber wechseln?

Die Trennlinie ist klar. Schreibt der Publikationsort eine .bst vor, nimmt man BibTeX; bestimmt man das Format selbst, nimmt man biblatex und biber. BibTeX setzt 8-Bit-Kodierungen voraus, weshalb mehrsprachige Autorennamen und akzentuierte Zeichen Nacharbeit verlangen und die Sortierregeln unerreichbar bleiben. Jede feinere Änderung am Format führt zur .bst – zur unbenannten Stapelsprache aus dem vorigen Abschnitt. Kurz: Alle Schwächen von BibTeX gehen auf einen einzigen Umstand zurück, ein 1988 eingefrorenes Design.

Auf der anderen Seite warten biblatex (ein LaTeX-Paket) und sein Standard-Backend biber. Sie nehmen Unicode, wie es kommt, machen Sortierung und Formatierung zu Optionen auf der LaTeX-Seite und ersparen jede Zeile .bst. Auch die Befehle ändern sich – \cite weicht \autocite und \printbibliography –, und der Ablauf ruft biber statt bibtex. Die .bib-Datei selbst ist beiden gemeinsam, weshalb ein Wechsel weniger kostet, als es aussieht. Genau hier zahlt sich die vor vierzig Jahren getroffene Entscheidung am meisten aus, zu trennen, was ein Werk ist, und wie es gedruckt wird.