Skip to content

Typst

  • Markup-based typesetting system

Modes

ModeHow to enter
Markup[ ... ]
Code#...
Math$ ... $

Markup

  • Heading: == h2
  • Bold: *text*
  • Italic: _text_
  • List:
    • Ordered: + text
    • Unordered: - text
    • Ident to nest
  • Label
    • Declare: <label-name>
    • Reference: @label-name
  • Line break: \
  • Space: ~
  • Comment: //, /* */

Math

  • Inline: $a$, block: $ a $
  • Raw text: "start time" + "duration"
  • Symbols: nebula, arrow.squiggly
  • Function: vec(1,2,3)
  • Fraction: 1/2
  • Sub-expression: e^(a+b), Parentheses are smartly resolved

Code

Data Types

  • None: none, Auto: auto
  • Boolean, Integer, Float, String
  • Length: 32pt, Angle: 90deg
  • Fraction: 2fr, Ratio: 30%
  • Array: (1, 2, 3), Dictionary: (a: 1, b: "hi")
  • Content, Selector, Label
  • Function
  • ...

Function

  • Pure except some builtin ones.
  • Params: positional or settable(keyword).
  • Definition:
typst
#let alert(body, fill: red) = {
  set align(center)
  rect(
    fill: fill,
    [*Warning:\ #body*],
  )
}
  • Anonymous function: it => [#it #it]
  • Set default values: #set fn(param=default_value)
  • Syntax sugar for content argument: #fn(args)[content] = #fn(args, content)

Modules and Packages

  • Include: #include "bar.typ"
  • Import: #import "bar.typ" as baz, #import "bar.typ": a as b
  • From value: #import emoji: face
  • From package: #import "@preview/example:0.1.0": add

Show Rules

typst
#show heading: it => [
  #set align(center)
  #block(smallcaps(it.body))
]

#show: wrapper
paragraph...

Context

  • Context-aware:
typst
#let value = context text.lang
#value  // "en"
#set text(lang: "de")
#value // "de"
  • Context is fixed for each block:
typst
#let c = counter("mycounter")
#c.update(1)
#context [
  #c.update(2)
  #c.display() \       // 1
  #context c.display() // 2
]
  • Compiler iterates to resolve contextual interactions. (Max 5 attempts).

meow

  • The output document can be used like a console: #type( ... ).
  • Love the 3 contexts design.