BibTeX

Le numéro de version de BibTeX est toujours 0.99d. C’est celui que livre TeX Live 2024, et la documentation officielle btxdoc.tex porte encore la date du 8 février 1988 et promet encore d’être étoffée « quand la version 1.00 de BibTeX sortira ». La version 1.00 n’est jamais sortie. BibTeX reste pourtant la référence pour gérer une bibliographie en LaTeX, pour une raison simple : dès l’origine, il a séparé ce qu’est une référence (la base .bib) de la façon dont elle est imprimée (le style .bst). Cette page traite de l’écriture d’un fichier .bib, du rôle respectif de \cite, \bibliographystyle et \bibliography, de la compilation en quatre passages latex → bibtex → latex → latex, et des raisons pour lesquelles LaTeX Warning: Citation ... undefined refuse parfois de disparaître.

Pourquoi BibTeX est un programme distinct de LaTeX

BibTeX ne fait pas partie de LaTeX : c’est un exécutable distinct. Mieux, il ne lit jamais le fichier .tex. Il lit uniquement le .aux produit par LaTeX, y relève trois informations — quelles clés ont été citées, quel style est demandé, quel .bib ouvrir — et réécrit sa réponse dans un .bbl. Cette division du travail est exactement ce qui impose les quatre passages de compilation évoqués plus loin. La ligne de copyright figurant toujours en tête des styles standard indique « Copyright (C) 1984, 1985, 1988 Howard Trickey and Oren Patashnik » — des années où LaTeX lui-même prenait encore forme. BibTeX n’est pas une extension ajoutée après coup : il a été conçu comme un compagnon quasi contemporain.

Le mécanisme comporte trois pièces : le fichier .bib qui contient les données brutes des références ; les appels \cite et deux commandes dans le document (\bibliographystyle et \bibliography) ; et le fichier .bst qui fixe l’apparence. Dresser la liste à la main en fin de document avec l’environnement thebibliography convient encore à un texte court, mais dès que les mêmes travaux servent dans plusieurs articles, on ne sait plus quelle version fait foi. C’est le problème que BibTeX a résolu : les données tenues en un seul endroit, changer de revue coûte un mot de style et non un après-midi. L’idée de « séparer la structure de l’apparence », qui traverse tout LaTeX, est ici appliquée telle quelle aux références.

Écrire une entrée .bib : type, clé de citation, champs

Un fichier .bib est du texte brut qui énumère des entrées. Chaque entrée déclare un type d’entrée comme @article, puis donne entre accolades d’abord la clé de citation, ensuite les champs, écrits fieldname = {value} et séparés par des virgules. La clé de citation est un identifiant qui doit correspondre caractère pour caractère à \cite{...} dans le document ; son choix vous appartient. L’usage — nom de famille suivi de l’année, comme knuth1984 — entre rarement en collision et reste mémorisable dans un article à plusieurs mains. L’ordre des champs ne change rien au résultat : le tri et la mise en forme sont l’affaire du style.

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}
}

Ce qui compte comme champ obligatoire relève du style, non de BibTeX lui-même. Avec le style standard plain, chaque manque est nommé : Warning--empty journal in shannon1948. Ce sont des avertissements et non des erreurs, le traitement se poursuit donc — l’information disparaît simplement de la sortie sans commentaire, raison pour laquelle il faut les lire. Une abréviation définie par @string{bstj = "..."} se référence ensuite par un nom nu, sans accolades. Enfin, le champ crossref permet à une communication d’hériter d’une entrée @proceedings parente : nom du colloque et éditeur ne sont pas à ressaisir pour chaque article du volume.

Type d’entréeCe qu’il couvreRequis par plain
@articleArticle paru dans une revueauthor, title, journal, year
@bookLivre publié par un éditeurauthor ou editor, title, publisher, year
@inproceedingsCommunication dans des actes de colloqueauthor, title, booktitle, year
@incollectionChapitre de livre portant son propre titreauthor, title, booktitle, publisher, year
@phdthesisThèse de doctorat (@mastersthesis pour un master)author, title, school, year
@techreportRapport publié par une institutionauthor, title, institution, year
@unpublishedManuscrit inédit ou communication privéeauthor, title, note
@miscTout ce qui n’entre nulle part ailleurs, une page web par exempleAucun ; howpublished et note s’en chargent

Pourquoi plain transforme TeX en tex : protéger les majuscules par des accolades

Les styles plain et abbrv passent le titre d’un article en minuscules, hormis la première lettre. Un @article dont le titre s’écrit title = {A Note on TeX and NASA Systems} ressort donc en « A note on tex and nasa systems ». Noms propres et sigles sont aplatis sans état d’âme. Il n’existe qu’une parade : entourer d’une paire d’accolades supplémentaire la portion à préserver. Écrites {TeX} et {NASA}, ces portions sont laissées intactes. Cette mise en minuscules vise les titres d’articles (title), pas les titres de livres ni booktitle : mettre {TeX} dans un @book ne nuit donc pas, mais ne sert à rien non plus, et le savoir évite bien des perplexités.

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}
}

Les noms d’auteurs obéissent à la même logique. On sépare plusieurs auteurs par and (author = {A. Smith and B. Jones}) ; la virgule est réservée à la séparation du nom et du prénom, si bien que author = {Smith, Alice} signifie nom Smith, prénom Alice. Terminez la liste par and others et le style y substitue « et al. ». Le cas délicat est celui des auteurs collectifs : sans une paire d’accolades supplémentaire autour du nom entier, comme dans {World Health Organization}, BibTeX le découpe en patronyme et initiales. Il analyse les noms comme de la syntaxe ; ce qu’on veut soustraire à cette analyse, on le fait taire avec des accolades — toujours le même outil unique.

Ce que font réellement \bibliographystyle et \bibliography

Les deux commandes relèvent moins de l’impression que du fait de laisser un message dans le .aux. \bibliographystyle{plain} y inscrit \bibstyle{plain} et \bibliography{references} y inscrit \bibdata{references} ; BibTeX lit ces lignes et agit en conséquence. \bibliography a en outre une seconde fonction : elle imprime la liste de références à l’endroit où on la place, d’où sa position habituelle en fin de corps, juste avant \end{document}. Son argument ne porte pas d’extension — le fichier a beau s’appeler references.bib, on écrit references — et plusieurs bases se donnent séparées par des virgules, \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}

Dans le corps, \cite{knuth1984} désigne directement la clé de citation du .bib. Seules les œuvres citées atteignent la liste : une entrée présente dans le .bib mais jamais citée est ignorée. Pour forcer l’intégralité de la base, on ajoute \nocite{*}\nocite enregistre une référence comme citée sans imprimer de marque dans le texte. Plusieurs clés se combinent en un seul appel, \cite{shannon1948,lamport1987}. Les variantes de \cite lui-même — un localisateur de page avec \cite[p.~42]{knuth1984}, ou les formes auteur-année \citet et \citep de natbib — relèvent de la page consacrée aux citations.

Pourquoi la compilation enchaîne latex → bibtex → latex → latex

Quatre passages sont nécessaires parce que l’information ne circule que dans un sens à la fois. Sans le .aux, BibTeX ignore ce qui a été cité ; sans le .bbl, LaTeX ignore ce qu’il doit imprimer. Et les numéros « [1] », « [2] » ne sont fixés qu’une fois la liste réellement composée : les reporter dans les marques \cite du corps coûte un tour de plus. La documentation officielle btxdoc.tex énonce elle-même cette recette et ajoute que, dans de très rares cas, un passage supplémentaire de BibTeX et de LaTeX peut être requis.

  • 1er passage latex — traite le corps et inscrit dans le .aux les clés citées sous forme de \citation{...}, ainsi que le style et la base sous forme de \bibstyle{...} et \bibdata{...}. Aucune liste de références n’existe encore.
  • bibtex — ne lit que le .aux, y apprend les clés, le style et le .bib ; extrait les entrées correspondantes de la base ; les met en forme selon les règles du .bst ; puis écrit un environnement thebibliography complet dans le fichier .bbl.
  • 2e passage latex — lit le .bbl et compose la liste. Les marques \cite du corps travaillent pourtant encore sur l’ancien .aux : les avertissements Citation ... undefined ne disparaissent donc pas à ce passage.
  • 3e passage latex — les numéros se fixent et les citations du texte s’accordent enfin à la liste. Les avertissements ne cessent qu’ici.
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

Le seul piège d’écriture est que bibtex attend le nom de job, sans extension, et non le .tex. Taper bibtex document.tex l’envoie chercher document.tex.aux, et il échoue. Outre son résultat, BibTeX écrit un journal nommé .blg : c’est là qu’on relit le texte intégral d’un avertissement. Et en pratique, personne ne saisit les quatre commandes : latexmk inspecte le .aux, décide s’il faut lancer BibTeX et combien de passages sont nécessaires, si bien que latexmk -pdf document.tex suffit.

Citation ... undefined et une bibliographie qui reste vide

Vous voyez LaTeX Warning: Citation ... undefined et LaTeX Warning: There were undefined references., les citations s’impriment en [?], et la bibliographie a disparu, titre compris. Neuf fois sur dix, la cause est simplement que le nombre de passages est insuffisant. Sans .bbl, LaTeX n’imprime pas une ligne de la liste — et le titre manque aussi parce que l’environnement thebibliography lui-même se trouve dans le .bbl. Commencez donc calmement par dérouler latex → bibtex → latex → latex jusqu’au bout. Si l’avertissement persiste, BibTeX aura de son côté affiché un autre message.

MessageOù il apparaîtCause et remède
Citation ... undefinedLaTeXPas encore de .bbl, ou un .bbl périmé. Dérouler tout latex → bibtex → latex → latex
There were undefined references.LaTeXUn \cite ou \ref reste non résolu ; relancer latex
I found no \citation commandsBibTeXNi \cite ni \nocite présent ; citer quelque chose ou ajouter \nocite{*}
I found no \bibstyle commandBibTeX\bibliographystyle{...} manque dans le document
I found no database filesBibTeX\bibliography{...} absent, ou le .bib nommé est introuvable
I found no style fileBibTeXAucun .bst de ce nom ; vérifier l’orthographe ou déposer le .bst de la revue
Warning--I didn't find a database entryBibTeXUne clé citée est absente du .bib : coquille, ou entrée jamais ajoutée

Si le problème résiste, soupçonnez les fichiers auxiliaires périmés. Après le renommage d’une clé, le déplacement du .bib dans un autre répertoire ou un changement de style, .aux, .bbl et .blg peuvent encore porter les informations du passage précédent. latexmk -C supprime d’un coup les fichiers engendrés ; reconstruire ensuite depuis zéro est le chemin le plus court. Rappelons aussi que les clés de citation distinguent la casse : pour BibTeX, Knuth1984 et knuth1984 sont deux références différentes.

plain, unsrt, alpha, abbrv : les différences

Les quatre styles standard ne diffèrent que sur trois points — ordre de tri, forme du libellé et degré d’abréviation des noms et des titres de revues —, les champs retenus étant identiques. Rien d’étonnant : plain.bst, unsrt.bst, alpha.bst et abbrv.bst sont tous produits à partir d’un seul fichier. Un gabarit nommé btxbst.doc est passé au préprocesseur C avec -DPLAIN, -DUNSRT, -DALPHA ou -DABBRV, comme le fichier l’explique lui-même en tête. Les quatre paraissent légèrement différents parce qu’ils sont des compilations conditionnelles d’un même texte.

StyleOrdre de triLibellé et caractère
plainAlphabétique par auteurNumérotation continue [1] ; le défaut le plus sûr
unsrtOrdre de première citation dans le texteNumérotation continue [1] ; mise en forme identique à plain
alphaPar libellé, c’est-à-dire auteur puis annéeÉtiquettes alphanumériques comme [Knu84] ; lisibles dans les domaines très formalisés
abbrvAlphabétique par auteurMême numérotation que plain, mais abrège prénoms, mois et titres de revues pour gagner de la place

La distribution de BibTeX embarque en outre quatre styles que son propre README qualifie de « semi-standard » : acm (ACM Transactions), apalike (auteur-année de type APA, à employer avec apalike.sty), ieeetr (IEEE Transactions, numéroté par ordre de citation) et siam (SIAM). L’ingénierie part en général de ieeetr, l’informatique de acm, la psychologie et les sciences sociales de apalike lorsque l’auteur-année s’impose. Par ailleurs, sociétés savantes et éditeurs diffusent des .bst conformes à leurs consignes : si la revue est déjà choisie, c’est là qu’il faut chercher d’abord. Quel que soit le style adopté, ni le .bib ni les appels \cite ne changent d’une ligne.

Pourquoi personne n’écrit un .bst à la main : makebst et custom-bib

Si l’on évite les fichiers .bst, c’est qu’ils sont écrits dans un langage à pile en notation postfixée. Le guide officiel destiné aux concepteurs de styles, btxhak.tex (Oren Patashnik, 8 février 1988), l’annonce dès ses premières lignes : les styles bibliographiques s’écrivent dans un langage à pile postfixé, et le fichier de style est un programme écrit dans un langage sans nom. Ce langage n’a même pas de nom. Il ne compte que dix commandes, mais chaque valeur est empilée puis dépilée, si bien que la simple mise en forme d’un champ author s’étire en une longue notation polonaise inverse. Reprendre un .bst existant pour l’adapter reste faisable ; en concevoir un de zéro est rarement rentable.

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

Ce que l’on emploie réellement, c’est le package custom-bib, dont la porte d’entrée est makebst. Un latex makebst lance un questionnaire interactif : le nom de famille vient-il en premier, l’année va-t-elle entre parenthèses, les titres sont-ils en italique — on répond, et un .bst sort à l’autre bout. Son auteur est Patrick W. Daly, celui-là même qui a écrit natbib et apporté les citations auteur-année du côté LaTeX ; les styles que produit makebst sont prévus pour fonctionner de concert avec natbib. Quand les consignes d’une revue frôlent un style existant sans y correspondre tout à fait, c’est la sortie de secours la plus réaliste.

Traiter des références en japonais : pbibtex et upbibtex

Le bibtex brut suppose du texte occidental : un .bib contenant des noms d’auteurs ou des titres japonais met donc en défaut à la fois son tri et son traitement des chaînes. TeX Live livre pour cela pbibtex (pour pLaTeX, tri selon les points de code EUC-JP) et upbibtex (pour upLaTeX, tri selon les points de code Unicode). L’essentiel est qu’il ne s’agit pas d’un simple changement d’encodage : le langage de style lui-même est étendu. Une nouvelle fonction intégrée, is.kanji.str$, indique si une chaîne contient un caractère non ASCII ; substring$ a été modifié pour ne jamais couper un caractère multi-octets ; et add.period$ a appris à ne pas ajouter de point après une ponctuation japonaise telle que 。 ou ?. La filiation remonte au JBibTeX de Shouichi Matsui, dont la distribution conserve encore l’histoire dans sa documentation.

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

Des équivalents japonais des styles sont également fournis : jplain pour plain, junsrt pour unsrt, jalpha pour alpha, jabbrv pour abbrv, et jname, qui place le nom de famille en tête. Pour les sociétés savantes, on trouve jipsj (Information Processing Society of Japan), tipsj, tieice (IEICE) et jorsj — eux aussi découpés au préprocesseur C à partir d’un unique gabarit, jbtxbst.doc, exactement comme du côté occidental. La compilation ne change que de noms : latex devient platex ou uplatex, bibtex devient pbibtex ou upbibtex. Le chemin passant par DVI, on termine par une conversion avec dvipdfmx. latexmk peut être configuré pour appeler ces programmes : le japonais s’automatise donc tout aussi bien.

Rester avec BibTeX ou passer à biblatex et biber ?

La ligne de partage est nette. Si la revue impose un .bst, prenez BibTeX ; si vous maîtrisez vous-même le format, prenez biblatex et biber. La conception de BibTeX suppose des encodages 8 bits : noms d’auteurs multilingues et caractères accentués demandent des rustines, et les règles de tri restent hors d’atteinte. Modifier le format dans le détail conduit tôt ou tard au .bst, ce langage à pile sans nom vu à la section précédente. En somme, toutes les faiblesses de BibTeX découlent d’un seul fait : une conception figée en 1988.

De l’autre côté attendent biblatex (un package LaTeX) et son backend par défaut, biber. Ils prennent l’Unicode tel quel, exposent le tri et la mise en forme sous forme d’options côté LaTeX, et dispensent d’écrire la moindre ligne de .bst. Les commandes changent aussi — \cite cède la place à \autocite et \printbibliography — et la compilation appelle biber au lieu de bibtex. Le fichier .bib lui-même reste commun aux deux : la migration coûte donc moins qu’il n’y paraît. C’est là que la décision prise il y a quarante ans — séparer ce qu’est une référence de la façon dont elle est imprimée — rapporte le plus.