LaTeX bibliography guide

Bibliographies are where LaTeX most often goes wrong, and where the error messages point least clearly at the cause. This is how the pieces fit together and what the failures actually mean.

Four things with confusingly similar names

Most bibliography confusion is really a naming problem. There are four distinct things, and people use the word "BibTeX" for all of them.

So "BibTeX or biblatex?" is really two questions: which package formats your citations, and which program processes your references. In practice they pair up — traditional BibTeX styles with the bibtexprogram, biblatex with biber.

Which one should you use?

If your template, journal or department specifies one, use that. Publisher classes very often ship a required.bst file, and that decision is not yours to make. Of the909 templates in this catalogue, 194 ship a.bib file and 19 ship their own.bst style — a style file being present is a strong signal the traditional BibTeX route is expected.

For a new document with a free choice, use biblatex with biber. It handles Unicode properly, which the original BibTeX does not; styles are configured with package options rather than by editing an arcane .bst; and it supports things that are painful otherwise — multiple bibliographies, per-chapter reference lists, citation styles that need author names manipulated.

Stay with BibTeX when a required style exists only as a.bst, when you are joining a project already using it, or when your build environment does not have biber.

What each looks like

The traditional route:

BibTeX
\documentclass{article}
\begin{document}
Text with a citation \cite{knuth1984}.

\bibliographystyle{plain}
\bibliography{refs}
\end{document}

And the same document with biblatex:

biblatex + biber
\documentclass{article}
\usepackage[style=authoryear,backend=biber]{biblatex}
\addbibresource{refs.bib}

\begin{document}
Text with a citation \cite{knuth1984}.

\printbibliography
\end{document}

Note the differences: \addbibresource takes the full filename including .bib, where\bibliography takes it without. The style is chosen as a package option rather than by \bibliographystyle, and the list is printed by \printbibliography. Mixing the two interfaces is the cause of a good share of the errors below.

The backend=biber option is the default and can be omitted; it is written out here because being explicit about which program must run is worth more than the saved keystrokes.

Why it takes more than one compile

This is the mechanical fact that explains nearly every bibliography problem. LaTeX makes a single pass through your document. On that pass it does not know what a citation should look like, so it records the request in the .aux file and prints a placeholder. Then:

  1. LaTeX — writes the citation keys to.aux; citations show as [?].
  2. biber (or bibtex) — reads those keys, looks them up in your .bib, writes a formatted .bbl.
  3. LaTeX — pulls in the .bbl, so the bibliography appears and citations resolve.
  4. LaTeX again — fixes page numbers and cross-references that moved when the bibliography was inserted.

Four steps. Most editors and latexmk do this for you, which is why the sequence is invisible until something breaks. If your citations show as [?], the overwhelmingly likely cause is that steps 2 to 4 have not all happened.

Before the backend has run, a real first pass says exactly this:

pdflatex, first pass
LaTeX Warning: Citation 'knuth1984' on page 1 undefined on input line 5.
LaTeX Warning: Empty bibliography on input line 6.
Package biblatex Warning: Please (re)run Biber on the file:
(biblatex)                and rerun LaTeX afterwards.

These are warnings, not errors — the document still produces a PDF, just one with unresolved citations. That is worth knowing, because a successful compile does not mean a correct bibliography.

The single most misdiagnosed error

If you run bibtex on a document that uses biblatex, you get this:

bibtex on a biblatex document
This is BibTeX, Version 0.99d (TeX Live 2025)
The top-level auxiliary file: bib_test.aux
I found no \citation commands---while reading file bib_test.aux
I found no \bibdata command---while reading file bib_test.aux
I found no \bibstyle command---while reading file bib_test.aux
(There were 3 error messages)

The document in question had a citation, a bibliography and a valid.bib file. Nothing it reports is true in the sense a reader would take it: the real problem is that biblatex writes its requests in a different form, into a .bcf file, which bibtex does not read and does not know to look for.

So "I found no \citation commands" almost always means "you ran the wrong program". Run biber instead. The reverse mistake — running biber on a BibTeX document — fails with a missing.bcf, which at least points somewhere useful.

Choosing a style

Citation style is usually dictated by your field or publisher, and if so the decision is already made. Otherwise the choice is between two families:

With biblatex both are package options — style=numeric orstyle=authoryear — so switching is a one-line change and can safely be left until you know where you are submitting. With traditional BibTeX it means a different .bst file, which is a larger change. That alone is a reasonable argument for biblatex on a document whose destination is not yet decided.

Keeping the .bib file clean

Most bibliography problems that are not tool-ordering problems are data problems, and reference managers export imperfect data:

When it will not compile

SymptomUsual causeFix
Citations print as [?] or bold question marksThe bibliography tool has not run yet, or has not run since the last citation was added.Run the full sequence: LaTeX, then biber or bibtex, then LaTeX twice more.
I found no \citation commandsbibtex was run on a document that uses biblatex. The .aux file does not contain what bibtex looks for, so it reports the citations as missing.Run biber instead. This message almost never means what it says.
Package biblatex Warning: Please (re)run BiberExactly what it says — the backend has not been run for this document.Run biber, then LaTeX again. Not an error; the document still compiles.
biber: command not foundbiber is a separate binary from bibtex and is not present in every installation, including some minimal Docker images and CI environments.Install it, or switch the document to backend=bibtex if the style permits.
Empty bibliography, but citations resolveNothing was cited that appears in the .bib file, or \printbibliography sits outside the scope of the entries.Check the citation keys match the .bib entries exactly — they are case-sensitive.
Undefined control sequence at \printbibliographybiblatex is not loaded; the document is using the older BibTeX interface.Use \bibliography{refs} with BibTeX, or load biblatex.
Everything resolves locally but not on a fresh checkoutA stale .bbl or .aux file was committed and is masking a real failure.Delete the build artefacts and compile from clean.

The reliable way to compile

Use latexmk, which works out the sequence — including how many LaTeX passes are needed and which backend to call — and stops when the document has settled:

One command
latexmk -pdf thesis.tex

If you are debugging by hand instead, delete the intermediate files first. A stale .aux, .bbl or .bcfwill happily reproduce yesterday's failure no matter how thoroughly you have fixed today's cause, and that is the single most common reason a correct fix appears not to work.

Choosing a thesis templateWhich engine?Journal templates