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.
- The
.bibfile. A plain-text database of references. Every system on this page reads this same format, and your reference manager exports it. It is the part you own and the part worth looking after. - BibTeX, the program. The original tool, from the 1980s. Reads the
.auxfile your document produced, looks up references, and writes a formatted.bbl. biblatex, the package. A modern LaTeX package that handles citations and formatting in LaTeX itself, rather than in a.bststyle file.- biber, the program. The backend written for biblatex. It replaces the BibTeX program, not the
.bibformat.
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:
\documentclass{article}
\begin{document}
Text with a citation \cite{knuth1984}.
\bibliographystyle{plain}
\bibliography{refs}
\end{document}And the same document with biblatex:
\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:
- LaTeX — writes the citation keys to
.aux; citations show as[?]. - biber (or bibtex) — reads those keys, looks them up in your
.bib, writes a formatted.bbl. - LaTeX — pulls in the
.bbl, so the bibliography appears and citations resolve. - 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:
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:
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:
- Numeric — citations appear as
[1]. Compact, and the norm in engineering, computer science and much of the physical sciences. IEEE and Vancouver styles are numeric. - Author–year — citations appear as (Knuth, 1984). Easier to read when the reader knows the literature, and the norm in the humanities and social sciences. APA, Harvard and Chicago author–date are all of this kind.
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:
- Protect capitals with braces. Many styles lowercase titles. Write
{LaTeX}and{DNA}so they survive. - Keep keys stable. Citation keys are how your document refers to entries; regenerating them wholesale breaks every citation.
- Use the right entry type. A conference paper is
@inproceedings, not@article. Styles select fields by type, so the wrong type silently drops information. - Mind the encoding. biber handles UTF-8 directly; the original BibTeX does not, which is why older
.bibfiles are full of escapes like{\"o}. - Delete entries you do not cite only if you mean to — by default neither system prints uncited work, which surprises people expecting a full reading list.
When it will not compile
| Symptom | Usual cause | Fix |
|---|---|---|
| Citations print as [?] or bold question marks | The 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 commands | bibtex 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 Biber | Exactly 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 found | biber 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 resolve | Nothing 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 \printbibliography | biblatex 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 checkout | A 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:
latexmk -pdf thesis.texIf 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.