Spaces:
Sleeping
Sleeping
description: All concepts needed to style your document with Typst. | |
# 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]($function) to an [element | |
function]($function/#element-functions) preceded by the `{set}` keyword (or | |
`[#set]` in markup). Only optional parameters of that function can be provided | |
to the set rule. Refer to each function's documentation to see which parameters | |
are optional. In the example below, we use two set rules to change the | |
[font family]($text.font) and [heading numbering]($heading.numbering). | |
```example | |
#set heading(numbering: "I.") | |
#set text( | |
font: "New Computer Modern" | |
) | |
= Introduction | |
With set rules, you can style | |
your document. | |
``` | |
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. | |
```example | |
This list is affected: #[ | |
#set list(marker: [--]) | |
- Dash | |
] | |
This one is not: | |
- Bullet | |
``` | |
Sometimes, you'll want to apply a set rule conditionally. For this, you can use | |
a _set-if_ rule. | |
```example | |
#let task(body, critical: false) = { | |
set text(red) if critical | |
[- #body] | |
} | |
#task(critical: true)[Food today?] | |
#task(critical: false)[Work deadline] | |
``` | |
## 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 [selector], a colon and then a set rule. The most | |
basic form of selector is an [element function]($function/#element-functions). | |
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. | |
```example | |
#show heading: set text(navy) | |
= This is navy-blue | |
But this stays black. | |
``` | |
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 after the colon with an arbitrary [function]. This function | |
receives the element in question and can return arbitrary content. The available | |
[fields]($scripting/#fields) on the element passed to the function again match | |
the parameters of the respective element function. Below, we define a show rule | |
that formats headings for a fantasy encyclopedia. | |
```example | |
#set heading(numbering: "(I)") | |
#show heading: it => [ | |
#set align(center) | |
#set text(font: "Inria Serif") | |
\~ #emph(it.body) | |
#counter(heading).display( | |
it.numbering | |
) \~ | |
] | |
= 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. | |
``` | |
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: | |
- **Everything:** `{show: rest => ..}` \ | |
Transform everything after the show rule. This is useful to apply a more | |
complex layout to your whole document without wrapping everything in a giant | |
function call. | |
- **Text:** `{show "Text": ..}` \ | |
Style, transform or replace text. | |
- **Regex:** `{show regex("\w+"): ..}` \ | |
Select and transform text with a regular expression for even more flexibility. | |
See the documentation of the [`regex` type]($regex) for details. | |
- **Function with fields:** `{show heading.where(level: 1): ..}` \ | |
Transform only elements that have the specified fields. For example, you might | |
want to only change the style of level-1 headings. | |
- **Label:** `{show <intro>: ..}` \ | |
Select and transform elements that have the specified label. See the | |
documentation of the [`label` type]($label) for more details. | |
```example | |
#show "Project": smallcaps | |
#show "badly": "great" | |
We started Project in 2019 | |
and are still working on it. | |
Project is progressing badly. | |
``` | |