LaTeX project checker for academic work

Check the integrity of an academic LaTeX project before you submit it: citation keys against your .bib entries, labels against the cross-references that point at them, bibliography problems including duplicate and uncited entries, and the structure of the project itself. It reads the whole thing — root document, every file it includes, and the bibliography files they declare — rather than one .tex file at a time.

Two things it is not: a grammar or style checker for your prose, and a compiler. It does not compile anything — that distinction is the whole point of the tool, and it is set out in full further down this page.

What a compiler answers, and what this answers

Your compiler

“Does this project build, and what does the PDF look like?” It runs TeX, expands your macros, loads your packages and lays out every page. Nothing else can answer that.

StudyRef

“Is this project internally consistent and ready to hand in?” It reads the source across every included file and reports where the citations, labels and bibliography disagree with each other.

A project can build without a single error and still ship a bibliography entry you dropped a citation to, or a \ref pointing at a label you renamed in another chapter. Those are the ones worth catching before a supervisor does.

What it checks

Project structure

Upload a single .tex file or a .zip of the whole project. The root document is resolved, and \input and \include are followed into one logical document — so a label defined in a chapter file and referenced from another is a resolvable pair, not two unrelated files. Content inside verbatim, lstlisting, minted and comment environments is skipped, because it is text rather than markup.

Citation keys against your bibliography

Every key requested by a citation command is resolved against the entries in your .bib files. Keys with no entry come back as missing; a key that differs only in capitalisation is reported as a case mismatch rather than silently matched; a key with two identical entries is ambiguous and is never resolved to one of them. natbib and biblatex commands are both recognised, including the multi-citation and starred forms, and \nocite — including \nocite{*}.

Bibliography integrity

Duplicate entry keys, keys that collide only by case, and entries nothing in the project cites. BibTeX crossref inheritance is resolved, so an entry used only as a parent is not reported as unused — and a crossref pointing at a missing, duplicated or case-mismatched parent, or forming a cycle, is reported.

Labels and cross-references

\label definitions are matched against \ref, \eqref, \pageref, \autoref, \nameref, \vref and cleveref's \cref and \Cref. Missing targets, duplicate labels and labels nothing refers to are separated, and a missing target may carry a suggestion when one candidate is clearly closest — never when two are equally close.

A word count that understands the markup

Inside the Word Analyzer, the count is taken from the visible text of the expanded project rather than the source, with commands, maths and literal environments handled as what they are.

How much of that to trust

The report says whether the analysis was complete. If the project is missing a file it includes, or its structure could not be determined, the result is analysis-incomplete with the reason — not a clean bill of health with a gap in it.

What it does not do

StudyRef never runs TeX. It reads your project’s source; it does not execute it, expand macros the way an engine does, or produce a PDF. Everything below stays your compiler’s job, and you still need to build the document and read the log.

Syntax errors and unbalanced braces
A missing brace is only definitively an error once TeX tries to read it. Static parsing recovers from malformed input rather than failing the way an engine does.
Missing packages, classes or fonts
Whether \usepackage{foo} resolves depends on the TeX distribution doing the building, not on anything in your project.
Package conflicts and option clashes
Two packages can each be present and still be incompatible. Only loading them reveals it.
Overfull and underfull boxes
These come out of the typesetting pass. Nothing in the source says a line will be too wide.
Float placement and pagination
Where a figure actually lands, and what the page numbers end up being, are decided while the document is being laid out.
The rendered numbering a reference resolves to
A resolvable \ref proves a label exists. Whether it prints "Figure 3" and whether that is the figure you meant is a property of the compiled output.
Engine-specific behaviour
pdflatex, xelatex and lualatex differ on fonts and encodings. The project source is the same in each; the result is not.
Anything a macro decides at expansion time
A citation or label generated inside a macro body, or by a package, exists only once TeX expands it. A static reader sees the definition, not the result.

The two layers do different jobs and you want both: the compiler tells you the document builds, and this tells you the scholarship inside it hangs together.

How to run it

LaTeX project analysis lives inside two tools in the StudyRef dashboard, and both accept a single .tex file or a .zip of the whole project.

Reference Checker → LaTeX Project Health

The integrity report: citation keys, labels and cross-references, bibliography problems and crossref relationships, grouped by severity, each with the real file and line it came from.

Word Analyzer → LaTeX project

A word count taken from the expanded project’s visible text, with the same structure resolution behind it.

Uploading a LaTeX project needs an account and a Starter or Pro plan. There is no anonymous LaTeX upload — resolving a project archive is server work, and it sits behind a plan for that reason. See what each plan includes.

Doing these checks yourself

Every one of these is possible by hand, and on a short paper it is quicker than uploading anything. These guides cover the methods, including the cases a checker cannot settle for you.

Working in Word rather than LaTeX? The Assignment Checker does the equivalent checks on a .docx against its brief.