elijah.run

How I use typst

Published

Table of contents

This week I re-wrote my resume in typst.

Old: old resume

New: new resume

Can you tell the difference? No? Excellent!

Since graduating college I don't write a lot of LaTeX, but so far I prefer typst!

😧 typst is not (just) a better LaTeX

I posted some first impressions on Bluesky:

LaTeX being compatible with TeX makes it feel like the C++ of typesetting; a rich ecosystem with lots of bloat.

typst not being constrained in that way makes it feel like the Zig of typesetting; smaller ecosystem but a much smoother writing experience.

— Elijah Voigt (@elijah.run) July 14, 2025 at 1:25 PM

To elaborate: typst doesn't feel like an improvement on LaTeX, it feels like a from-the-ground-up typsestter that learns from the past uhh -- wait LaTeX came out in 1984? and TeX came out in 1978?? So yeah it learns from the past 41+ years.

🧑‍đŸ’ģ typst is just programming (for me)

To be fair, so is LaTeX. If you give me a programming language I'm gonna program.

The typst docs make it seem like it's markdown with functions, which is somewhat true:

== this is a title

this is a paragraph.

- this
- is
- a
- list

But my resume is more... function heavy than advertised. For example, this:

example styled section

Came from this function:

// Function for printing a role
#let role(org: none, location: none, title: none, date: none, description: ntypone) = {
[
  #set text(weight: "bold")
  #org
  #set text(weight: "regular")
  (
    #text(13pt, location)
  )
  #h(1fr)
  #set text(weight: "bold")
  #title
  #set text(weight: "regular")
  #date
];
text(12pt, description);
};

Invoked like this:

#role(
  org: [CoreOS],
  location: [San Francisco, CA/Remote],
  title: [Documentarian],
  date: [09/2016 - 05/2017],
  description: [
    - #xp([Migration Docs.], [Reviewed, tested, and contributed to public facing Kubernetes developer docs.])
  ]
)

The result looks good, but it certainly doesn't "feel like markdown"... that's OK! I know how to program and the functions are simple!

// function definition:
#myfn(a, b, c) = {
  [
    #set foo(bar="thing")
    #a
    #set foo(other="stuff")
    #b -- #c
  ]
}

// called like so:
#myfn([asdf], [abcd123], [hello world])

// produces:
// asdf abcd123 -- hello world

🐇 typst is fast

Which is... not surprising. Not just because it's written in Rust and I'm a voluntary Rust shill -- any new typesetter would probably be an improvement! Any time you do a full rewrite, and ignore legacy usage, you're gonna go sonic-levels of fast. And again... LaTeX is 41 years old; there's a lot of cruft in that ecosystem.

LaTeX's output looks gorgeous but it is SLOW and BULKY. To build my old resume I needed:

This was my Makefile which was as simple as I could get it:

TARGET=resume

default: pdf

dvi: ${TARGET}.tex
	latex ${TARGET}.tex

ps: dvi
	${DOCKER} dvips -R -Poutline -t letter ${TARGET}.dvi -o ${TARGET}.ps


pdf: ps
	ps2pdf ${TARGET}.ps resume.pdf
	ps2pdf ${TARGET}.ps "Elijah Caine McDade Voigt resume.pdf"
	ps2pdf ${TARGET}.ps "Elijah Caine M. Voigt resume.pdf"

clean:
	rm *.aux
	rm *.log
	rm *.dvi
	rm *.ps

veryclean:
	rm *.aux
	rm *.log
	rm *.dvi
	rm *.ps
	rm *.pdf

shell:
	${DOCKER} /bin/sh

What is this dvips program? What's a dvi file? And .aux?? Why do I need to build a .ps and a .pdf??

Anyway, LaTeX is heavy and (for obvious reasons) typst is relatively light weight.

For comparison here's how I build my current resume:

$ typst compile resume.typ

My dependencies are... typst and the FreeMono font.

🧐 Closing Thoughts

But like I said, I don't write a lot of LaTeX so why re-write my resume -- my only actively maintained LaTeX doc -- in a new typesetter?

Basically: I dread updating my resume because LaTeX is so heavy. Every time I think to add it or tweak it or god forsake make a style change I find about a dozen reasons not to sink hours into that task.

I'm still in the honeymoon phase, but I feel a lot more excited to write with typst. Maybe I'll update my resume more than once a year!

Tags: #how i use #typst