TypstDocumentation

Styling

Typst includes a flexible styling system that automatically applies styling of your choice to your document. With set rules, you can configure basic properties of elements. This way, you create most common styles. However, there might not be a built-in property for everything you wish to do. For this reason, Typst further supports show rules that can completely redefine the appearance of elements.

Set rules

With set rules, you can customize the appearance of elements. They are written as a function call to the respective function preceded by the set keyword (or #set in markup). Only settable parameters must be provided as arguments. Refer to each function's documentation for a list of settable parameters. In the example below, we use two set rules to change the font family and heading numbering style.

#set text("Latin Modern Roman")
#set heading(numbering: "I.")

= Introduction
With set rules, you can style
your document.
Preview

A top level set rule stays in effect until the end of the file. When nested inside of a block, it is only in effect until the end of that block. With a block, you can thus restrict the effect of a rule to a particular segment of your document. Below, we use a content block to scope the list styling to one particular list.

This list is affected:
#[#set list(marker: [--])
 - Dash]

This one is not:
- Bullet
Preview

Sometimes, you'll want to apply a set rule conditionally. For this, you can use a set-if rule.

#let task(body, critical: false) = {
  set text(red) if critical
  [- #body]
}

#task(critical: true)[Food today?]
#task(critical: false)[Work deadline]
Preview

Show rules

With show rules, you can deeply customize the look of a type of element. The most basic form of show rule is a show-set rule. Such a rule is written as the show keyword followed by a function name, a colon and then a set rule. This lets the set rule only apply to the selected element. In the example below, headings become dark blue while all other text stays black.

#show heading: set text(navy)

= This is navy-blue
But this stays black.
Preview

With show-set rules you can mix and match properties from different functions to achieve many different effects. But they still limit you to what is predefined in Typst. For maximum flexibility, you can instead write a show rule that defines how to format an element from scratch. To write such a show rule, replace the set rule behind the colon with an arbitrary function. This functions receives the element in question and can return arbitrary content. Different fields are available on the element passed to the function. Below, we define a show rule that formats headings for a fantasy encyclopedia.

#set heading(numbering: "(I)")
#show heading: it => block[
  #set align(center)
  #set text("Inria Serif")
  \~ _#it.title;_
      #it.numbers \~
]

= Dragon
With a base health of 15, the
dragon is the most powerful
creature.

= Manticore
While less powerful than the
dragon, the manticore gets
extra style points.
Preview

Like set rules, show rules are in effect until the end of the current block or file.

Instead of a function, the right-hand side of a show rule can also take a literal string or content block that should be directly substituted for the element. And apart from a function, the left-hand side of a show rule can also take a number of other selectors that define what to apply the transformation to:

#set text("Noto Serif")
#show "Project": smallcaps
#show "badly": "great"

We started Project in 2019
and are still working on it.
Project is progressing badly.
Preview