BibLaTeX Guide: Modern Bibliography Management in LaTeX
References are where a lot of LaTeX time disappears. BibLaTeX is the modern answer to that problem. It replaces the decades-old BibTeX workflow with something more flexible, gives you proper Unicode, and lets you change citation styles with a single option. This guide walks through setup, the citation commands you will actually use, style customisation, and how to keep your .bib file in sync with Zotero or Mendeley.
BibLaTeX vs BibTeX: what actually changed
The names look alike, which causes endless confusion. They are different things.
BibTeX is the original system from the 1980s. It formats references using .bst style files written in a stack-based language almost nobody can edit by hand, and its character support is essentially ASCII. It still works, and for a simple numeric reference list it is perfectly fine.
BibLaTeX is newer and does the formatting inside LaTeX itself, using Biber as its backend. That single design choice unlocks Unicode, far richer entry types, and styles you can adjust with package options instead of arcane .bst surgery.
For a new project, BibLaTeX is the better default. The one real reason to stay on BibTeX is a journal template that mandates a specific legacy style. If you want the broader comparison and the basics of both, see LaTeX bibliography management.
Getting started
Basic setup
\documentclass{article}
\usepackage[
backend=biber,
style=authoryear
]{biblatex}
\addbibresource{references.bib}
\begin{document}
\textcite{einstein1905} reshaped how physicists think about energy and mass.
\printbibliography
\end{document} Two things to note. You only need natbib=true if you genuinely want to use natbib’s \citep/\citet commands inside BibLaTeX; leave it off otherwise. And \addbibresource takes the full filename including the .bib extension, unlike BibTeX’s \bibliography.
Creating the .bib file
@article{einstein1905,
author = {Einstein, Albert},
title = {Zur Elektrodynamik bewegter K\"orper},
journal = {Annalen der Physik},
volume = {322},
number = {10},
pages = {891--921},
year = {1905},
doi = {10.1002/andp.19053221004},
langid = {german}
}
@book{knuth1984,
author = {Knuth, Donald E.},
title = {The {\TeX}book},
publisher = {Addison-Wesley},
year = {1984},
address = {Reading, Massachusetts},
isbn = {0-201-13447-0}
}
@inproceedings{turing1950,
author = {Turing, Alan M.},
title = {Computing Machinery and Intelligence},
booktitle = {Mind},
volume = {59},
number = {236},
pages = {433--460},
year = {1950},
publisher = {Oxford University Press}
} Citation commands
The everyday set
\cite{einstein1905} % [1] or (Einstein 1905), depending on style
\textcite{einstein1905} % Einstein (1905)
\parencite{einstein1905} % (Einstein 1905)
\citeauthor{einstein1905} % Einstein
\citeyear{einstein1905} % 1905
\citetitle{einstein1905} % Zur Elektrodynamik bewegter Körper Multiple cites, page references, and notes
\cite{einstein1905,knuth1984,turing1950}
\parencite[p.~24]{knuth1984}
\parencite[pp.~24--28]{knuth1984}
\parencite[see][for context]{einstein1905}
\parencite[cf.][pp.~10--15]{knuth1984}
\footfullcite{turing1950} % full citation in a footnote A small correction worth flagging: the page-number argument goes with \parencite or \textcite, not the bare \cite, if you want the brackets to render correctly. Test the output rather than trusting a snippet from a forum.
Styles and customisation
Picking a style
% Numeric
\usepackage[style=numeric]{biblatex}
\usepackage[style=numeric-comp]{biblatex} % compresses [1,2,3] to [1-3]
\usepackage[style=ieee]{biblatex}
% Author-year
\usepackage[style=authoryear]{biblatex}
\usepackage[style=authoryear-comp]{biblatex}
\usepackage[style=apa]{biblatex}
% Author-title and verbose
\usepackage[style=authortitle]{biblatex}
\usepackage[style=verbose]{biblatex} Some styles need extra packages installed (biblatex-apa, biblatex-chicago, biblatex-mla, biblatex-ieee, biblatex-nature). If a style name errors, the package is missing rather than your code being wrong.
Tuning the output
\usepackage[
style=authoryear,
maxcitenames=2, % et al. after two names in a citation
mincitenames=1,
maxbibnames=99, % full author list in the bibliography
giveninits=true,
doi=false,
isbn=false,
url=false
]{biblatex}
\renewcommand{\nameyeardelim}{\addcomma\space}
\renewcommand{\multicitedelim}{\addsemicolon\space} Entry types and useful fields
@book{key2023,
author = {Author, Name},
title = {Book Title},
subtitle = {An Optional Subtitle},
publisher = {Publisher Name},
address = {City},
year = {2023},
edition = {2},
isbn = {978-0-000-00000-0}
}
@phdthesis{key2023phd,
author = {Student, Name},
title = {Dissertation Title},
school = {University Name},
year = {2023},
type = {PhD thesis}
}
@online{key2024web,
author = {Website Author},
title = {Web Page Title},
url = {https://example.com/page},
urldate = {2024-01-30},
year = {2024}
} BibLaTeX also handles non-Latin scripts cleanly, which is where BibTeX falls down. With Biber and the right fonts (via XeLaTeX or LuaLaTeX), an entry with author names in Japanese or Cyrillic compiles without per-character escaping.
Advanced features
Multiple bibliographies
\DeclareBibliographyCategory{primary}
\addtocategory{primary}{einstein1905,knuth1984}
\printbibliography[category=primary,title={Primary Sources}]
\printbibliography[type=article,title={Journal Articles}]
\printbibliography[keyword=quantum,title={Quantum Physics}] A bibliography per chapter
Useful for theses and edited books.
\usepackage[refsection=chapter]{biblatex}
\chapter{Introduction}
\cite{einstein1905}
\printbibliography[heading=subbibliography]
\chapter{Methods}
\cite{knuth1984}
\printbibliography[heading=subbibliography] Keeping references in sync with Zotero and Mendeley
Hardly anyone writes .bib entries by hand for a real paper. References get collected in a reference manager, then exported. The friction is that a plain export is a snapshot. Add three papers next week and your .bib is already behind, so you re-export, overwrite, and hope nothing broke.
The cleanest setup keeps the editor connected to your library instead of importing a frozen copy. inscrive.io does exactly this: an always-synced .bib linked to your Zotero or Mendeley library, plus live citation autocomplete, so typing \parencite{ surfaces your real references inline. Add a source in Zotero, and it appears in the editor without a manual re-export. Plenty of editors only offer one-time import, which is the workflow that leaves you maintaining the .bib by hand.
When you do export manually, the Better BibTeX plugin for Zotero is worth installing. It produces stable, predictable citation keys, which keeps your \cite commands from breaking every time you regenerate the file.
% A typical Better BibTeX export entry
@article{garcia2024quantum,
title = {Experimental Validation of Quantum Entanglement},
author = {García, Maria and Smith, John},
year = {2024},
journal = {Physical Review Letters},
volume = {130},
pages = {041501},
doi = {10.1103/PhysRevLett.130.041501},
langid = {english}
} Coming from a .ris export instead? Pandoc converts it.
pandoc references.ris -t biblatex -o references.bib For the full walkthrough on either side, see Zotero LaTeX integration and Mendeley LaTeX bibliography.
Collaborating on a shared bibliography
Two authors citing into one .bib file run into key collisions and merge conflicts. The usual fix is prefixed keys and version control.
\addbibresource{references-shared.bib}
\addbibresource{references-alice.bib}
% Alice uses keys like alice:einstein1905, Bob uses bob:einstein1905 A real-time editor removes most of this, since everyone edits one live file rather than emailing copies around. inscrive.io handles collaborative editing this way, with advanced version history so you can rewind the file if an entry gets clobbered. There is no AI training on your documents, and the data sits in EU data centres, which matters when your references touch unpublished work.
Troubleshooting
Missing references
Run the full chain: pdflatex -> biber -> pdflatex -> pdflatex. A single pass will not resolve citations. Most online editors do this automatically; locally you have to run it yourself. Check the .blg file when something is off.
Performance on large bibliographies
\usepackage[
backend=biber,
bibencoding=utf8,
maxcitenames=2,
maxbibnames=99,
sorting=nyt
]{biblatex} For very large reference sets, BibLaTeX’s compile time can grow noticeably. A longer compile budget helps here. inscrive.io allows 60-second compiles on the Free plan and 480 seconds on Pro, which covers all but the most extreme bibliographies.
Style examples
APA 7th edition
\usepackage[style=apa,backend=biber]{biblatex}
\DeclareLanguageMapping{english}{english-apa}
% In-text: (García & Smith, 2024) IEEE
\usepackage[style=ieee,backend=biber,sorting=none]{biblatex}
% Citations: [1], [2]-[5], [6], [8] Chicago
\usepackage[style=chicago-authordate,backend=biber]{biblatex}
% Notes-bibliography variant: style=chicago-notes Future-proofing entries
Persistent identifiers are cheap insurance. A DOI, an arXiv ID, or an ORCID makes a reference resolvable years later, even if the URL rots.
@article{future2024,
author = {Researcher, Name},
title = {A Durable Reference},
journal = {Journal Name},
year = {2024},
doi = {10.1000/j.2024.001},
eprint = {2401.00001},
eprinttype = {arXiv},
issn = {1234-5678}
} BibLaTeX is the system to learn if you are starting fresh. Set the backend to Biber, keep your .bib connected to your reference manager instead of re-exporting by hand, and choose a style once. After that, citations mostly take care of themselves.
inscrive.io is a collaborative, EU-hosted LaTeX editor with first-class BibLaTeX support: an always-synced Zotero and Mendeley .bib, live citation autocomplete, and real-time editing. The Free plan is €0 forever (up to 10 active projects, unlimited collaborators, 60-second compiles); Pro is €7/month with 480-second compiles and AI-suggested fixes for compile errors. Data stays in EU data centres (Hetzner, Germany and Finland) and is never used to train AI. Start writing, it’s free.




