Typst for linguists

Typst
typesetting
phonokit
synkit
An introduction to Typst for linguists, with animated examples of phonokit (IPA, prosodic structure, autosegmental representations, MaxEnt tableaux) and synkit (syntax trees, movement, glosses, numbered examples).
Author

Guilherme D. Garcia

Published

December 25, 2025

Modified

October 17, 2026

What is it

In a nutshell, Typst is a language designed for typesetting academic and scientific documents. It’s still young, but it is very promising because it is:

  • modern
  • easy to learn
  • intuitive (e.g., error messages that are actually useful)
  • very light
  • extremely fast

If you’ve used LaTeX, you will appreciate all five points above. I have used LaTeX for over a decade, and even though I really like it, it didn’t take me long to be convinced to switch to Typst. For example, suppose you want to create a simple document with some colourful tables, a figure, some references, nice headers and footers. In LaTeX, you would probably load natbib, graphicx, xcolor, colortbl, fancyhdr, booktabs… — these are packages I often use myself. In Typst, you would need exactly zero packages to accomplish the same task.

Where to start?

First, explore their website. Second, follow their tutorial with their own (online and free) editor — this is the most user-friendly way to get started because you don’t need to install anything. I also have this YouTube series (repo here), where I go over the basics and discuss some key aspects for linguists. If you decide to give it a go, you will probably want to work on it off line.

Figure 1: Typst code and its output (click to zoom). Notice the absence of a preamble for a simple document.

I would also strongly recommend one of these two options if you plan to use Typst:

  • Use it with VS Code, Positron, etc. Simply install the Tinymist extension and you’re good to go
  • Use Vim or NeoVim. Same thing: install the Tinymist plugin.

I would also recommend installing the Typst compiler if you enjoy working from the terminal. On a Mac, you can install it with Homebrew.

brew install typst

Installing the Typst CLI can be advantageous if you enjoy working from the terminal. You can easily create bash functions to automate tasks and compile files to PNG, for example. The main commands you will be using are typst preview and typst compile, but typst watch is equally useful, since it allows for continuous compilation on your browser.

Typst for linguists

Can Typst replace LaTeX if you’re a linguist? When I first wrote this post, in December 2025, my answer was “it depends”. Typst is young, and its packages don’t have the breadth or the maturity of what you find for LaTeX. Phonology was already in good shape. Syntax trees were covered too (arborly, lingotree and syntree, for example), but none of these packages was as comprehensive as tikz-qtree, so I told syntacticians they might have to wait a bit.

Since then, I have written two packages to close that gap: phonokit for phonology and phonetics, and synkit for syntax and semantics. Between them, they cover what I need in a linguistics document: IPA transcription, prosodic structure, autosegmental representations, OT and MaxEnt tableaux, syntax trees with movement arrows, interlinear glosses and numbered examples. That is the goal of both packages: you shouldn’t need anything else to typeset linguistics in Typst. In fact, I can now do with Typst much more in linguistics than what I did with LaTeX.

Both are on Typst Universe, so all you need is two lines at the top of your file (make sure you’re loading the latest version on Typst Universe). You can also clone both repos and load them locally. As I write this post, phonokit’s latest version is 0.6.1 in its official repo, but 0.6.0 on Typst Universe.

#import "@preview/phonokit:0.6.0": *
#import "@preview/synkit:0.1.0": *

The animations below show the code on the left and the output on the right, updating as the code is typed. I left out the import lines to keep them short. There are other linguistics packages on Typst Universe too, and it’s worth browsing it if you need something specific.

Phonology: phonokit

My goal with phonokit is to do everything I need for phonology in Typst, although at this point it does more than what I need, thanks to people who have suggested a wide range of additional functions. The manual documents every function, and there is a shorter web version here. Here are five of them.

The first one is #ipa(). You type tipa-style shortcuts and get IPA symbols: D is ð, I is ɪ, @ is a schwa, and so on. You don’t need to hunt for special characters or switch keyboards, and if you already know tipa, there is nothing new to learn.

Figure 2: IPA transcription from tipa-style input (import line omitted).

Prosodic structure takes a single string. In #word(), dots separate syllables, parentheses mark feet and an apostrophe marks stress. From that one string, the function draws the whole structure, from the prosodic word down to onsets, rhymes and nuclei. #syllable(), #foot() and their moraic versions work the same way: below, #word-mora() takes the same string and draws moras instead of onsets and rhymes. The function recognizes stress and adjusts dominance lines accordingly.

Figure 3: The same prosodic word with onsets and rhymes, and with moras (import line omitted).

Metrical grids follow the same idea. You add a number after each syllable for its level of prominence, and #met-grid() builds the columns of x’s.

Figure 4: A metrical grid for butterfly (import line omitted).

#autoseg() takes a list of segments and a list of features (or tones). Links are pairs of positions, counted from zero, so (2, 1) links the third feature to the second segment, drawn as a dashed line. The same function handles delinking, floating tones, contour tones and one-to-many links.

Figure 5: Nasal spreading in an autosegmental representation (import line omitted).

Finally, tableaux are also supported, from classic OT to Harmonic Grammar to MaxEnt. In an OT tableau, #tableau() adds the pointing hand next to the winner and shades the cells that no longer matter. MaxEnt tableaux go one step further: you list the candidates, constraints, violations and weights, and #maxent() computes each candidate’s harmony and probability for you, with bars showing the distribution.

Figure 6: A MaxEnt tableau with harmonies and probabilities computed from the weights (import line omitted).

There is a lot more in the package: vowel and consonant charts, feature matrices, feature geometry, ToBI labels, sonority profiles, and VOT and formant plots. See the manual for all of them.

Syntax: synkit

synkit draws syntax trees from labelled bracket notation, plus the other things a syntax paper needs. Its manual covers every option.

A tree is a single string. Spacing inside it doesn’t matter, so a missing space before ]] won’t cost you a compile error.

Figure 7: A simple tree (import line omitted).

Movement arrows are declared separately from the tree. Every node gets a name automatically (the first DP is DP1, the second trace is t2, and so on), and an arrow simply goes from one name to another. If you’re not sure what a node is called, add show-refs: true and synkit prints each name next to its node.

Figure 8: Wh-movement and T-to-C movement with curved arrows (import line omitted).

Glosses are written as a list: the original, the gloss and the translation. synkit aligns the words for you, and anything inside curly braces is set in small caps, which is what you want for labels like 1SG.PRS.

Figure 9: An interlinear gloss of a Portuguese sentence (import line omitted).

Numbered examples come from #eg(), and list items inside it become sub-examples. Glosses and examples share the same counter, so (1), (2), (3)… run through the document whichever function you use. Inside an example, #move() shows movement in running text: labelled brackets with subscripts and an arrow underneath.

Figure 10: A numbered example with sub-examples and inline movement (import line omitted).

synkit also draws several trees on one canvas with lines between equivalent nodes (#garden()), colours nodes and branches, adds annotations next to nodes, and draws Lewis-style systems of spheres for conditional semantics.

Is the output good enough?

Since it’s faster, lighter, more user-friendly and more modern, the question I had was whether Typst could match the quality of tex outputs. I believe it can. In December 2025, I said that syntacticians might have to wait for a complete switch, or keep LaTeX only for trees (say, with LaTeXit on a Mac). With synkit, I don’t think that’s the case anymore.

Since December 2025, I have used Typst for my CV, my slides (for teaching and conferences), and my writing in general. I haven’t experienced any downsides yet.

Common questions and concerns

  • But most journals don’t accept it. True. But many journals in linguistics don’t accept tex files either. So this is hardly a new problem. Indeed, many journals by Cambridge University Press still use doc files. Of course, this will likely change as more people adopt the language.
  • I already have a comprehensive setup in tex. I did too. With AI agents, it is obviously much faster to learn a new language and adapt our documents and templates. I think new adopters are usually more common than switchers. In other words, graduate students who would learn LaTeX would likely favor Typst if they knew about it. If tex works well for you, why change?
  • How would Typst improve my workflow? It would make your typesetting faster and “cleaner”. For example, in my slides, I have a “switch” to make solutions appear and disappear for in-class exercises. This works fine with LaTeX (I use Beamer), but it does require multiple lines of code, and it is a bit finicky at times. With Typst, the same task is accomplished in a much “cleaner” fashion. It always works, and it is very fast. The level of automation is also potentially much higher in Typst. In my phonokit package, the function #maxent() calculates probabilities automatically, for example.
  • How will I deal with my references…? Typst also accepts bib files, so that doesn’t really change. It does introduce a new system (yml), but you don’t have to use it.
  • Any caveats? Yes. Typst doesn’t work with non-local files. For example, if you have a bib file somewhere on your computer and you like to use absolute paths to it, you will need to create symlinks. It is also very picky about bib files, which may force you to fix any inconsistencies you may have in your library of references.

Copyright © Guilherme Duarte Garcia