Writing in LaTeX is a pleasure. Managing references in LaTeX is a nightmare that each generation of students rediscovers from scratch. This guide is what you'd tell yourself three years ago.
It covers the two-and-a-half reference systems you might encounter (BibTeX, biblatex, and the legacy natbib), how to structure a .bib file so it doesn't fight you, the top errors that make your build fail at 2am, and a clean workflow for keeping references synced across an Overleaf project, a Zotero library, and a submitted manuscript.
Start by getting the history straight. These are not two names for the same thing.
BibTeX is the original, from 1985. It ships with every LaTeX distribution. It uses a .bib file for references and a .bst file for style definitions. It's still the default in most templates and the only thing some journals accept.
biblatex is a modern rewrite from 2006, designed to fix the many irritations of BibTeX. It uses the same .bib file format but processes it through a modern engine called Biber. biblatex handles Unicode correctly, supports many more entry types, lets you customize citation styles in the document itself, and plays much better with hyperref.
If you're starting a project in 2026, use biblatex unless a journal's submission template forces you onto legacy BibTeX. If you inherited a project on legacy BibTeX, leave it alone — migrating mid-stream is rarely worth it.
The natbib package is a bridge: it extends BibTeX to support author-year citations \citep{}, \citet{}. Many templates use it. If you're on biblatex, you don't need natbib — biblatex does all of that natively.
A .bib file is a flat-text database. Each entry looks like this:
@article{vaswani2017attention,
author = {Vaswani, Ashish and Shazeer, Noam and Parmar, Niki},
title = {Attention Is All You Need},
journal = {Advances in Neural Information Processing Systems},
year = {2017},
volume = {30},
pages = {5998--6008},
doi = {10.48550/arXiv.1706.03762}
}
A few rules that will save you hours:
vaswani2017attention beats attn or ref1. A good convention: first-author-surname + year + first-word-of-title.author = {Smith, Jane} consistently, or use author = {Jane Smith}. Mixing breaks author parsing.title = {The {BERT} model for {NLP}} — otherwise BibTeX will lowercase them in some styles.-- for page ranges. Not a single hyphen. pages = {5998--6008}.In order of how often they break a build.
&, %, $, #, _, {, } need to be escaped with a backslash in BibTeX fields, except inside braces. A paper with "R&D" in its title will compile for a while, then fail mysteriously.
Fix: title = {Trends in {R\&D} spending}.
Miss a closing brace and every subsequent entry is silently ignored. BibTeX's error messages for this are famously unhelpful.
Fix: use an editor with bracket matching. VS Code's LaTeX Workshop highlights unmatched braces immediately.
Classic BibTeX doesn't understand Unicode. An em dash (—) copy-pasted from a PDF will silently corrupt your build.
Fix: either switch to biblatex + Biber (recommended), or replace non-ASCII characters with their LaTeX equivalents: \'e for é, \"a for ä, -- for em dash.
Two entries with @article{smith2020, ...} will give you a warning and unpredictable behavior. Biber with biblatex errors loudly; legacy BibTeX just picks one.
Fix: run a quick grep: grep "^@" references.bib | sort | uniq -d. Or use DEEPNOTIS's BibTeX formatter to auto-detect duplicates.
author = {Smith, John, Jr.} is ambiguous. BibTeX doesn't know if "Jr." is a separator or part of the name.
Fix: explicit comma separation: author = {Smith, John, Jr.} — the comma after "John" is the suffix separator. Or use braces: author = {{Smith, John, Jr.}}. Or rewrite: author = {John Smith Jr.}.
Every entry type has required fields. @article needs author, title, journal, year. Leave one out and your bibliography entry is garbage.
Fix: biblatex is strict about this; legacy BibTeX will often silently render a broken entry. Run the validator in /tools/bibtex-formatter to catch these.
You used \bibliographystyle{ieeetr} but the style file is not installed.
Fix: either switch to a style shipped with your LaTeX distribution, use biblatex's \usepackage[style=ieee]{biblatex}, or manually install the .bst.
Overleaf aggressively caches. You edit the .bib, recompile, and nothing changes.
Fix: Menu → Clean compilation cache. Or from the command line, delete *.aux, *.bbl, *.blg and recompile from scratch.
\cite references a key that's not in the .bibYou'll see [?] in the PDF where your citation should be.
Fix: check the citekey against your .bib — a typo is the most common cause. biblatex and Biber will also tell you explicitly which keys are missing.
Loading \usepackage{natbib} and \usepackage{biblatex} in the same document will produce cryptic errors.
Fix: pick one. If you're using biblatex, remove every reference to natbib.
The most common modern LaTeX workflow involves three tools: a reference manager as your source of truth, Overleaf for writing, and your shell for final builds.
.bib directly..bib file. Zotero's Better BibTeX plugin watches a collection and auto-writes a .bib file on every change. DEEPNOTIS exports any project's bibliography to .bib with one click, or use our LaTeX bibliography builder to generate a .bib from a list of DOIs..bib file to your Overleaf project. Overleaf has a Git URL for each project — point the auto-export script there, or use Overleaf's GitHub integration.\cite{vaswani2017attention} works whether you used Better BibTeX, DEEPNOTIS, or hand-edited the file.This workflow has one major benefit: your reference metadata is never hand-edited in the .bib file. Every change propagates from the reference manager. When a reviewer asks you to add 10 new references, you add them in Zotero or DEEPNOTIS, re-export, and keep writing. You never touch the .bib.
One of biblatex's superpowers is styling your bibliography without editing .bst files. For instance:
\usepackage[
backend=biber,
style=apa,
sorting=nyt, % sort by (n)ame, (y)ear, (t)itle
sortcites=true,
maxcitenames=3, % use et al. after 3 authors
maxbibnames=99, % but list all authors in the bibliography
doi=true,
url=false, % suppress URLs when DOI exists
isbn=false
]{biblatex}
\addbibresource{references.bib}
\begin{document}
Hello \cite{vaswani2017attention}.
\printbibliography
\end{document}
The maxcitenames / maxbibnames pair above is especially useful: it lets you use "Smith et al." in the body while still listing every author in the bibliography, as APA 7 prefers.
For some journals, it's worth writing in LaTeX and then using a separate tool to produce the final bibliography in the journal's exact style. This is especially useful when the journal requires a quirky style that no .bst file quite matches.
The workflow: write in LaTeX, then export your citations as CSL-JSON and feed them to a CSL-based tool (DEEPNOTIS, Zotero with the journal's CSL style, Pandoc) to produce the final formatted bibliography. Paste that back into your LaTeX document and wrap it in \begin{thebibliography}. Ugly but robust.
Use biblatex, keep your .bib file auto-exported from a reference manager, and never hand-edit. Everything else in LaTeX reference management is footnotes on that.