The QMJ-TSX working paper is written in Typst, not LaTeX. I expected this to be a minor technical choice and got mildly surprised by how much it changed the writing experience. This is a short post on what I gained, what I gave up, and when I’d make the same choice again.

The short version

Typst is a modern typesetting system in the LaTeX tradition: same problem (turn marked-up text into a beautiful PDF), same audience (scientific writing), incomparably better tooling underneath. It compiles in milliseconds instead of seconds, the error messages point at the line you actually wrote, and the source file looks like Markdown with a stricter dialect rather than like a 1980s macro language.

For a solo working paper with a handful of tables, figures, and references, the answer is: just use it.

What I gained

Compile speed. typst compile paper/main.typ runs in roughly 100ms on this project. typst watch recompiles on save with no human-perceptible latency. Writing with a live preview pane next to the source file is the closest I have ever come to “writing a paper feels like writing code.” I edited a sentence, glanced right, kept typing. That feedback loop matters more than I’d have guessed.

Readable source. The paper/main.typ driver fits on a screen. A section file looks like this:

1
2
3
4
5
6
= Results <sec:results>

== Replication baseline (AQR QMJ-Canada)
...the Sharpe ratio is $0.64$. The maximum drawdown is $-37.0%$.
A Carhart-style four-factor regression... yields a monthly alpha of
$0.70%$ ($t = 4.46$).

Compare to the same content in LaTeX, where the equivalent prose is interrupted by \section{}, \label{}, \textbf{}, $\backslash$, and \% everywhere. Typst’s = for headings, *bold*, and bare $math$ get out of the way of the words.

Error messages that point at the line you wrote. LaTeX errors are famously cryptic because the macro expansion has already happened by the time the compiler complains. Typst errors say “there is a problem on line 47 of results.typ, here’s the offending token.” This is not a small thing when you are debugging at 11pm the night before a deadline.

A real module system. paper/main.typ just #includes sections/*.typ and tables/*.typ. Each table lives in its own file. There is no \input weirdness, no preamble bloat, no fragile \newcommand resolution order. The project structure mirrors what I would do in any other codebase.

Native programmability without TeX-flavoured pain. Typst is a real expression language. Generating a parameterised table or a caption from a value is #let x = 0.64 ... #x rather than \def\x{0.64} ... \x. I don’t lean on this much in this paper, but the headroom is there if I want to wire numerical outputs from the Python pipeline straight into the paper later.

Single binary, no distribution. brew install typst and you’re done. No 4 GB MacTeX install, no tlmgr update --self --all, no fighting with which TeX distribution shipped which version of which package. The Makefile‘s make paper target is one line.

What I gave up

Citation styles. Typst’s bibliography system handles Chicago author-date out of the box (which is what I use), but if your journal requires an obscure custom .bst file, you may still want LaTeX. Less of an issue for working papers than for journal submissions.

Journal templates. Many journals provide LaTeX templates and no Typst equivalent. Not a constraint for a working paper hosted on a personal site, but if you are submitting to JFE on day one, this matters.

Ecosystem maturity. TikZ, pgfplots, and the long tail of LaTeX packages have no Typst equivalent yet. For a paper with simple tables and externally generated PDF figures (as mine is), this never bit me. For a paper that relies on intricate in-document diagrams, your mileage will vary.

Should you switch?

A short decision tree:

  • Working paper, preprint, personal site, blog series: switch. The compile speed alone changes how you write.
  • Thesis, technical report, internal document: switch. Same reasons. The tooling pays back the migration cost within a week.
  • Journal submission to a venue that mandates a LaTeX template: stay with LaTeX for the final submission. You can still draft in Typst and port at the end if the prose-to-typesetting ratio justifies it; for shorter papers it usually doesn’t.

For QMJ-TSX, the calculus was easy: working paper, hosted on GitHub, regenerated by make paper as part of the pipeline, no journal constraints. Typst was strictly better on every axis I cared about.

One thing that surprised me

I write more in Typst than I did in LaTeX, because revising is cheaper. A revised sentence in LaTeX implies a 2–5 second compile and possibly a chain of \ref warnings to chase. A revised sentence in Typst is invisible — the preview updates as you type. The cost of editing collapsing toward zero changes how willing you are to rewrite a paragraph.

That alone is probably worth the switch.


Source for the paper: paper/main.typ on GitHub. Compile with typst compile paper/main.typ or make paper.