summaryrefslogtreecommitdiff
path: root/docs/src/reference
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2023-02-06 11:50:03 +0100
committerLaurenz <laurmaedje@gmail.com>2023-02-06 11:50:03 +0100
commit0bb0f1c98fc8eff5d7556bbe9d5801f02237a5c0 (patch)
tree83bce472d527cb62c6b6d048059921d8404074fd /docs/src/reference
parent2e87dcdbe014a5327395cfcd138b547426a50e6e (diff)
Import documentation
Co-Authored-By: Martin Haug <mhaug@live.de>
Diffstat (limited to 'docs/src/reference')
-rw-r--r--docs/src/reference/details.yml147
-rw-r--r--docs/src/reference/groups.yml63
-rw-r--r--docs/src/reference/scripting.md265
-rw-r--r--docs/src/reference/styling.md141
-rw-r--r--docs/src/reference/syntax.md136
-rw-r--r--docs/src/reference/types.md837
-rw-r--r--docs/src/reference/welcome.md29
7 files changed, 1618 insertions, 0 deletions
diff --git a/docs/src/reference/details.yml b/docs/src/reference/details.yml
new file mode 100644
index 00000000..24389a24
--- /dev/null
+++ b/docs/src/reference/details.yml
@@ -0,0 +1,147 @@
+types: |
+ To style your document, you need to work with values of different kinds: Lengths
+ specifying the size of your elements, colors for your text and shapes, and more.
+ Typst categorizes these into clearly defined _types_ and tells you where it
+ expects which type of value.
+
+ Apart from very basic types for numeric values and typical types known from
+ programming languages, Typst provides a special type for _content._ A value of
+ this type can hold anything that you can enter into your document: Text,
+ elements like headings and shapes, and style information.
+
+ In some places of Typst more specialized data types are used. Instead of listing
+ all of them here, they are explained where they are relevant.
+
+basics: |
+ Basic structural elements of documents.
+
+text: |
+ Style and transform your text.
+
+ The [text function]($func/text) is of particular interest.
+
+math: |
+ Typst has special [syntax]($syntax/#math) and library functions
+ to typeset mathematical formulas. Math formulas can be displayed inline with
+ text or as separate blocks. They will be typeset into their own block if they
+ start and end with at least one space (e.g. `[$ x^2 $]`).
+
+ In math, single letters are always displayed as is. Multiple letters, however,
+ are interpreted as variables and functions. To display multiple letters
+ verbatim, you can place them into quotes and to access single letter
+ variables, you can use the
+ [hashtag syntax]($scripting/#expressions).
+
+ ```example
+ $ A = pi r^2 $
+ $ "area" = pi dot "radius"^2 $
+ $ cal(A) :=
+ { x in RR | x "is natural" } $
+ ```
+
+ Math mode defines a wide selection of [symbols]($category/math/symbols) like
+ `pi`, `dot`, or `RR`. Many mathematical symbols are available in different
+ variants. You can select between different variants by applying
+ [modifiers]($type/symbol) to the symbol. Typst further recognizes a number of
+ shorthand sequences like `=>` that approximate a symbol. When such a shorthand
+ exists, the symbol's documentation lists it.
+
+ ```example
+ $ x < y => x gt.eq.not y $
+ ```
+
+ Formulas can also contain line breaks. Each line can contain one or multiple
+ _alignment points_ (`&`) which are then aligned.
+ ```example
+ $ sum_(x=0)^n
+ &= 1 + ... + n \
+ &= (n(n+1)) / 2 $
+ ```
+
+ Math mode supports special function calls without the hashtag prefix. In these
+ "math calls", the argument list works a little differently than in code:
+
+ - Within them, Typst is still in "math mode". Thus, you can write math directly
+ into them, but need to use hashtag syntax to pass code expressions (except
+ for strings, which are available in the math syntax).
+ - They support positional and named arguments, but don't support
+ trailing content blocks and argument spreading.
+ - They provide additional syntax for 2-dimensional argument lists. The
+ semicolon (`;`) merges preceding arguments separated by commas into an array
+ argument.
+
+ ```example
+ $ frac(a^2, 2) $
+ $ vec(1, 2, delim: "[") $
+ $ mat(1, 2; 3, 4) $
+ $ lim_x =
+ op("lim", limits: #true)_x $
+ ```
+
+ To write a verbatim comma or semicolon in a math call, escape it with a
+ backslash. The colon on the other hand is only recognized in a special way if
+ directly preceded by an identifier, so to display it verbatim in those cases,
+ you can just insert a space before it.
+
+ Functions calls preceded by a hashtag are normal code function calls and not
+ affected by these rules.
+
+layout: |
+ Arrange elements on the page.
+
+ Combine layout functions to create complex and automatic layouts.
+
+visualize: |
+ Draw and visualize data.
+
+ _Note:_ Functions for plotting and diagrams are not yet available. They will
+ be in the future.
+
+meta: |
+ Modify and use document metadata.
+
+ Here, you can also find functions to work with other elements in the document,
+ such as labels and headings.
+
+symbols: |
+ These two modules give names to symbols and emoji to make them easy to insert
+ with a normal keyboard. Alternatively, you can also always directly enter
+ Unicode symbols into your text and formulas. In addition to the symbols listed
+ below, math mode defines `dif` and `Dif`. These are not normal symbol values
+ because they also affect spacing and font style.
+
+sym: |
+ Insert general symbols by name.
+
+ For example, `#sym.arrow` produces the → symbol. Within
+ [formulas]($category/math), these symbols can be used without the `#sym.`
+ prefix.
+
+emoji: |
+ Insert emoji by name.
+
+ For example, `#emoji.face` produces the 😀 emoji. If you frequently use
+ certain emojis, you can also import them from the `emoji` module (`[#import
+ emoji: face]`) to use them without the `#emoji.` prefix.
+
+foundations: |
+ Foundational functions.
+
+calculate: |
+ Calculate with and process numeric values.
+
+ These functions are part of the `calc` module and not imported by default. In
+ addition to the functions listed below, the `calc` module also defines the
+ constants `pi`, `e`, `inf`, and `nan`.
+
+construct: |
+ Construct and convert between values of different types.
+
+data-loading: |
+ Load data from external files.
+
+ These functions help you with embedding data from experiments and APIs in your
+ documents.
+
+utility: |
+ Useful utility functions.
diff --git a/docs/src/reference/groups.yml b/docs/src/reference/groups.yml
new file mode 100644
index 00000000..476a2a26
--- /dev/null
+++ b/docs/src/reference/groups.yml
@@ -0,0 +1,63 @@
+- name: variants
+ title: Variants
+ functions: ["serif", "sans", "frak", "mono", "bb", "cal"]
+ description: |
+ Alternate typefaces within formulas.
+
+ These functions are distinct from the [`text`]($func/text) function because
+ math fonts contain multiple variants of each letter.
+
+- name: styles
+ title: Styles
+ functions: ["upright", "italic", "bold"]
+ description: |
+ Alternate letterforms within formulas.
+
+ These functions are distinct from the [`text`]($func/text) function because
+ math fonts contain multiple variants of each letter.
+
+- name: underover
+ title: Under/Over
+ functions: [
+ "underline",
+ "overline",
+ "underbrace",
+ "overbrace",
+ "underbracket",
+ "overbracket",
+ ]
+ description: |
+ Delimiters above or below parts of a formula.
+
+ The braces and brackets further allow you to add an optional annotation
+ below or above themselves.
+
+- name: roots
+ title: Roots
+ functions: ["root", "sqrt"]
+ description: Square and non-square roots.
+
+- name: attach
+ title: Attach
+ functions: ["attach", "scripts", "limits"]
+ description: |
+ Subscript, superscripts, and limits.
+
+ The `attach` function backs the `[$a_b^c$]` syntax that adds top and bottom
+ attachments to a part of a formula. Attachments can be displayed either as
+ sub/superscripts, or limits. Typst automatically decides which is more
+ suitable depending on the base, but you can also control this manually with
+ the `scripts` and `limits` functions.
+
+- name: lr
+ title: Left/Right
+ functions: ["lr", "abs", "norm", "floor", "ceil"]
+ description: |
+ Delimiter matching.
+
+ The `lr` function allows you to match two delimiters and scale them with the
+ content they contain. While this also happens automatically for delimiters
+ that match syntactically, `lr` allows you to match two arbitrary delimiters
+ and control their size exactly. Apart from the `lr` function, Typst provides
+ a few more functions that create delimiter pairings for absolute, ceiled,
+ and floored values as well as norms.
diff --git a/docs/src/reference/scripting.md b/docs/src/reference/scripting.md
new file mode 100644
index 00000000..6928d22a
--- /dev/null
+++ b/docs/src/reference/scripting.md
@@ -0,0 +1,265 @@
+---
+description: Automate your document with Typst's scripting capabilities.
+---
+
+# Scripting
+Typst embeds a powerful scripting language. You can automate your documents and
+create more sophisticated styles with code. Below is an overview over the
+scripting concepts.
+
+## Expressions { #expressions }
+In Typst, markup and code are fused into one. All but the most common elements
+are created with _functions._ To make this as convenient as possible, Typst
+provides compact syntax to embed a code expression into markup: An expression is
+introduced with a hashtag (`#`) and normal markup parsing resumes after the
+expression is finished. If a character would continue the expression but should
+be interpreted as text, the expression can forcibly be ended with a semicolon
+(`;`).
+
+```example
+#rect[Hello] \
+#emoji.face \
+#"hello".len()
+```
+
+The example above shows a few of the available expressions, including
+[function calls]($type/function),
+[field accesses]($scripting/#fields), and
+[method calls]($scripting/#methods). More kinds of expressions are
+discussed in the remainder of this chapter. A few kinds of expressions are not
+compatible with the hashtag syntax (e.g. binary operator expressions). To embed
+these into markup, you can use parentheses, as in `[#(1 + 2)]`.
+
+## Blocks { #blocks }
+To structure your code and embed markup into it, Typst provides two kinds of
+_blocks:_
+
+- **Code block:** `{{ let x = 1; x + 2 }}` \
+ When writing code, you'll probably want to split up your computation into
+ multiple statements, create some intermediate variables and so on. Code blocks
+ let you write multiple expressions where one is expected. The individual
+ expressions in a code block should be separated by line breaks or semicolons.
+ The output values of the individual expressions in a code block are joined to
+ determine the block's value. Expressions without useful output, like `{let}`
+ bindings yield `{none}`, which can be joined with any value without effect.
+
+- **Content block:** `{[*Hey* there!]}` \
+ With content blocks, you can handle markup/content as a programmatic value,
+ store it in variables and pass it to [functions]($type/function). Content
+ blocks are delimited by square brackets and can contain arbitrary markup. A
+ content block results in a value of type [content]($type/content). An
+ arbitrary number of content blocks can be passed as trailing arguments to
+ functions. That is, `{list([A], [B])}` is equivalent to `{list[A][B]}`.
+
+Content and code blocks can be nested arbitrarily. In the example below,
+`{[hello]}` is joined with the output of `{a + [ the ] + b}` yielding
+`{[hello from the *world*]}`.
+
+```example
+#{
+ let a = [from]
+ let b = [*world*]
+ [hello ]
+ a + [ the ] + b
+}
+```
+
+## Let bindings { #bindings }
+As already demonstrated above, variables can be defined with `{let}` bindings.
+The variable is assigned the value of the expression that follows the `=` sign.
+The assignment of a value is optional, if no value is assigned, the variable
+will be initialized as `{none}`. The `{let}` keyword can also be used to create
+a [custom named function]($type/function/#definitions). Let bindings can be
+accessed for the rest of the containing block or document.
+
+```example
+#let name = "Typst"
+This is #name's documentation.
+It explains #name.
+
+#let add(x, y) = x + y
+Sum is #add(2, 3).
+```
+
+## Conditionals { #conditionals }
+With a conditional, you can display or compute different things depending on
+whether some condition is fulfilled. Typst supports `{if}`, `{else if}` and
+`{else}` expression. When the condition evaluates to `{true}`, the conditional
+yields the value resulting from the if's body, otherwise yields the value
+resulting from the else's body.
+
+```example
+#if 1 < 2 [
+ This is shown
+] else [
+ This is not.
+]
+```
+
+Each branch can have a code or content block as its body.
+
+- `{if condition {..}}`
+- `{if condition [..]}`
+- `{if condition [..] else {..}}`
+- `{if condition [..] else if condition {..} else [..]}`
+
+## Loops { #loops }
+With loops, you can repeat content or compute something iteratively. Typst
+supports two types of loops: `{for}` and `{while}` loops. The former iterate
+over a specified collection whereas the latter iterate as long as a condition
+stays fulfilled. Just like blocks, loops _join_ the results from each iteration
+into one value.
+
+In the example below, the three sentences created by the for loop join together
+into a single content value and the length-1 arrays in the while loop join
+together into one larger array.
+
+```example
+#for c in "ABC" [
+ #c is a letter.
+]
+
+#let n = 2
+#while n < 10 {
+ n = (n * 2) - 1
+ (n,)
+}
+```
+
+For loops can iterate over a variety of collections:
+
+- `{for letter in "abc" {..}}` \
+ Iterates over the characters of the [string]($type/string).
+ (Technically, iterates over the grapheme clusters of the string. Most of the
+ time, a grapheme cluster is just a single character/codepoint. However, some
+ constructs like flag emojis that consist of multiple codepoints are still only
+ one cluster.)
+
+- `{for value in array {..}}` \
+ `{for index, value in array {..}}`\
+ Iterates over the items in the [array]($type/array). Can also provide the
+ index of each element.
+
+- `{for value in dict {..}}` \
+ `{for key, value in dict {..}}` \
+ Iterates over the values or keys and values of the
+ [dictionary]($type/dictionary).
+
+- `{for value in args {..}}` \
+ `{for name, value in args {..}}` \
+ Iterates over the values or names and values of the
+ [arguments]($type/arguments). For positional arguments, the `name` is
+ `{none}`.
+
+To control the execution of the loop, Typst provides the `{break}` and
+`{continue}` statements. The former performs an early exit from the loop while
+the latter skips ahead to the next iteration of the loop.
+
+```example
+#for letter in "abc nope" {
+ if letter == " " {
+ break
+ }
+
+ letter
+}
+```
+
+The body of a loop can be a code or content block:
+
+- `{for .. in collection {..}}`
+- `{for .. in collection [..]}`
+- `{while condition [..]}`
+- `{while condition [..]}`
+
+## Fields { #fields }
+You can use _dot notation_ to access fields on a value. The value in question
+can be either:
+- a [dictionary]($type/dictionary) that has the specified key,
+- a [symbols]($type/symbol) that has the specified modifier,
+- a [module]($type/module) containing the specified definition,
+- [content]($type/content) that exposes the specified field. Most elements
+ expose some or all of the non-settable arguments passed to them as fields.
+
+```example
+#let dict = (greet: "Hello")
+#dict.greet \
+#emoji.face
+```
+
+## Methods { #methods }
+A method is a kind of a [function]($type/function) that is tightly coupled with
+a specific type. It is called on a value of its type using the same dot notation
+that is also used for fields: `{value.method(..)}`. The
+[type documentation]($type) lists the available methods for each of the built-in
+types. You cannot define your own methods.
+
+```example
+#let array = (1, 2, 3, 4)
+#array.pop() \
+#array.len() \
+
+#("a, b, c"
+ .split(", ")
+ .join[ --- ])
+```
+
+Methods are the only functions in Typst that can modify the value they are
+called on.
+
+## Modules { #modules }
+You can split up your Typst projects into multiple files called _modules._ A
+module can refer to the content and definitions of another module in multiple
+ways:
+
+- **Including:** `{include "bar.typ"}` \
+ Evaluates the file at the path `bar.typ` and returns the resulting
+ [content]($type/content).
+
+- **Import:** `{import "bar.typ"}` \
+ Evaluates the file at the path `bar.typ` and inserts the resulting
+ [module]($type/module) into the current scope as `bar` (filename without
+ extension).
+
+- **Import items:** `{import "bar.typ": a, b}` \
+ Evaluates the file at the path `bar.typ`, extracts the values of the variables
+ `a` and `b` (that need to be defined in `bar.typ`, e.g. through `{let}`
+ bindings) and defines them in the current file.Replacing `a, b` with `*` loads
+ all variables defined in a module.
+
+Instead of a path, you can also use a [module value]($type/module), as shown in
+the following example:
+
+```example
+#import emoji: face
+#face.grin
+```
+
+## Operators { #operators }
+The following table lists all available unary and binary operators with effect,
+arity (unary, binary) and precedence level (higher binds stronger).
+
+| Operator | Effect | Arity | Precedence |
+|:----------:|---------------------------------|:------:|:----------:|
+| `{-}` | Negation | Unary | 7 |
+| `{+}` | No effect (exists for symmetry) | Unary | 7 |
+| `{*}` | Multiplication | Binary | 6 |
+| `{/}` | Division | Binary | 6 |
+| `{+}` | Addition | Binary | 5 |
+| `{-}` | Subtraction | Binary | 5 |
+| `{==}` | Check equality | Binary | 4 |
+| `{!=}` | Check inequality | Binary | 4 |
+| `{<}` | Check less-than | Binary | 4 |
+| `{<=}` | Check less-than or equal | Binary | 4 |
+| `{>}` | Check greater-than | Binary | 4 |
+| `{>=}` | Check greater-than or equal | Binary | 4 |
+| `{in}` | Check if in collection | Binary | 4 |
+| `{not in}` | Check if not in collection | Binary | 4 |
+| `{not}` | Logical "not" | Unary | 3 |
+| `{and}` | Short-circuiting logical "and" | Binary | 3 |
+| `{or}` | Short-circuiting logical "or | Binary | 2 |
+| `{=}` | Assignment | Binary | 1 |
+| `{+=}` | Add-Assignment | Binary | 1 |
+| `{-=}` | Subtraction-Assignment | Binary | 1 |
+| `{*=}` | Multiplication-Assignment | Binary | 1 |
+| `{/=}` | Division-Assignment | Binary | 1 |
diff --git a/docs/src/reference/styling.md b/docs/src/reference/styling.md
new file mode 100644
index 00000000..92b5f8c9
--- /dev/null
+++ b/docs/src/reference/styling.md
@@ -0,0 +1,141 @@
+---
+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 { #set-rules }
+With set rules, you can customize the appearance of elements. They are written
+as a [function call]($type/function) 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]($func/text.family) and
+[heading numbering]($func/heading.numbering) style.
+
+```example
+#set text("Latin Modern Roman")
+#set heading(numbering: "I.")
+
+= 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 { #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.
+
+```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 behind the colon with an arbitrary
+[function]($type/function). This functions receives the element in question and
+can return arbitrary content. Different
+[fields]($scripting/#fields) are available on the element passed
+to the function. Below, we define a show rule that formats headings for a
+fantasy encyclopedia.
+
+```example
+#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.
+```
+
+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` function]($func/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` function]($func/label) for more details.
+
+```example
+#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.
+```
diff --git a/docs/src/reference/syntax.md b/docs/src/reference/syntax.md
new file mode 100644
index 00000000..b4d14e01
--- /dev/null
+++ b/docs/src/reference/syntax.md
@@ -0,0 +1,136 @@
+---
+description: |
+ A compact reference for Typst's syntax. Learn more about the language within
+ markup, math, and code mode.
+---
+
+# Syntax
+Typst is a markup language. This means that you can use simple syntax to
+accomplish common layout tasks. The lightweight markup syntax is complemented by
+set and show rules, which let you style your document easily and automatically.
+All this is backed by a tightly integrated scripting language with built-in and
+user-defined functions.
+
+## Markup { #markup }
+Typst provides built-in markup for the most common document elements. Most of
+the syntax elements are just shortcuts for a corresponding function. The table
+below lists all markup that is available and links to the best place to learn
+more about their syntax and usage.
+
+| Name | Example | See |
+| ------------------ | ------------------------ | ---------------------------- |
+| Paragraph break | Blank line | [`parbreak`]($func/parbreak) |
+| Strong emphasis | `[*strong*]` | [`strong`]($func/strong) |
+| Emphasis | `[_emphasis_]` | [`emph`]($func/emph) |
+| Raw text | ``[`print(1)`]`` | [`raw`]($func/raw) |
+| Link | `[https://typst.app/]` | [`link`]($func/link) |
+| Label | `[<intro>]` | [`label`]($func/label) |
+| Reference | `[@intro]` | [`ref`]($func/ref) |
+| Heading | `[= Heading]` | [`heading`]($func/heading) |
+| Bullet list | `[- item]` | [`list`]($func/list) |
+| Numbered list | `[+ item]` | [`enum`]($func/enum) |
+| Term list | `[/ Term: description]` | [`terms`]($func/terms) |
+| Math | `[$x^2$]` | [Math]($category/math) |
+| Line break | `[\]` | [`linebreak`]($func/linebreak) |
+| Smart quote | `['single' or "double"]` | [`smartquote`]($func/smartquote) |
+| Symbol shorthand | `[~, ---]` | [Symbols]($category/symbols/sym) |
+| Code expression | `[#rect(width: 1cm)]` | [Scripting]($scripting/#expressions) |
+| Character escape | `[Tweet at us \#ad]` | [Below](#escapes) |
+| Comment | `[/* block */, // line]` | [Below](#comments) |
+
+## Math mode { #math }
+Math mode is a special markup mode that is used to typeset mathematical
+formulas. It is entered by wrapping a formula in `[$]` characters. The formula
+will be typeset into its own block if it starts and ends with at least one space
+(e.g. `[$ x^2 $]`). Inline math can be produced by omitting the whitespace (e.g.
+`[$x^2$]`). An overview over the syntax specific to math mode follows:
+
+| Name | Example | See |
+| ---------------------- | ------------------------ | ------------------------ |
+| Inline math | `[$x^2$]` | [Math]($category/math) |
+| Block-level math | `[$ x^2 $]` | [Math]($category/math) |
+| Bottom attachment | `[$x_1$]` | [`attach`]($category/math/attach) |
+| Top attachment | `[$x^2$]` | [`attach`]($category/math/attach) |
+| Fraction | `[$1 + (a+b)/5$]` | [`frac`]($func/frac) |
+| Line break | `[$x \ y ]` | [`linebreak`]($func/linebreak) |
+| Alignment point | `[$x &= 2 \ &= 3$]` | [Math]($category/math) |
+| Variable access | `[$pi$]` | [Math]($category/math) |
+| Field access | `[$arrow.r.long$]` | [Scripting]($scripting/#fields) |
+| Implied multiplication | `[$x y$]` | [Math]($category/math) |
+| Symbol shorthand | `[$->, !=$]` | [Symbols]($category/symbols/sym) |
+| Text/string in math | `[$a "is natural"$]` | [Math]($category/math) |
+| Math function call | `[$floor(x)$]` | [Math]($category/math) |
+| Code expression | `[$#rect(width: 1cm)$]` | [Scripting]($scripting/#expressions) |
+| Character escape | `[$x\^2$]` | [Below](#escapes) |
+| Comment | `[$/* comment */$]` | [Below](#comments) |
+
+## Code mode { #code }
+Within code blocks and expressions, new expressions can start without a leading
+`#` character. Many syntactic elements are specific to expressions. Below is
+a table listing all syntax that is available in code mode:
+
+| Name | Example | See |
+| ------------------------ | ----------------------------- | ---------------------------------------------------- |
+| Variable access | `{x}` | [Scripting]($scripting/#blocks) |
+| Any literal | `{1pt, "hey"}` | [Types]($types) |
+| Code block | `{{ let x = 1; x + 2 }}` | [Scripting]($scripting/#blocks) |
+| Content block | `{[*Hello*]}` | [Scripting]($scripting/#blocks) |
+| Parenthesized expression | `{(1 + 2)}` | [Scripting]($scripting/#blocks) |
+| Array | `{(1, 2, 3)}` | [Array]($type/array) |
+| Dictionary | `{(a: "hi", b: 2)}` | [Dictionary]($type/dictionary) |
+| Unary operator | `{-x}` | [Scripting]($scripting/#operators) |
+| Binary operator | `{x + y}` | [Scripting]($scripting/#operators) |
+| Assignment | `{x = 1}` | [Scripting]($scripting/#operators) |
+| Field access | `{x.y}` | [Scripting]($scripting/#fields) |
+| Method call | `{x.flatten()}` | [Scripting]($scripting/#methods) |
+| Function call | `{min(x, y)}` | [Function]($type/function) |
+| Unnamed function | `{(x, y) => x + y}` | [Function]($type/function) |
+| Let binding | `{let x = 1}` | [Scripting]($scripting/#bindings) |
+| Named function | `{let f(x) = 2 * x}` | [Function]($type/function) |
+| Set rule | `{set text(14pt)}` | [Styling]($styling/#set-rules) |
+| Set-if rule | `{set text(..) if .. }` | [Styling]($styling/#set-rules) |
+| Show rule | `{show raw: it => {..}}` | [Styling]($styling/#set-rules) |
+| Show-set rule | `{show par: set block(..)}` | [Styling]($styling/#show-rules) |
+| Conditional | `{if x == 1 {..} else {..}}` | [Scripting]($scripting/#conditionals) |
+| For loop | `{for x in (1, 2, 3) {..}}` | [Scripting]($scripting/#loops) |
+| While loop | `{while x < 10 {..}}` | [Scripting]($scripting/#loops) |
+| Loop control flow | `{break, continue}` | [Scripting]($scripting/#loops) |
+| Return from function | `{return x}` | [Function]($type/function) |
+| Include module | `{include "bar.typ"}` | [Scripting]($scripting/#modules) |
+| Import module | `{import "bar.typ"}` | [Scripting]($scripting/#modules) |
+| Import items from module | `{import "bar.typ": a, b, c}` | [Scripting]($scripting/#modules) |
+| Comment | `[/* block */, // line]` | [Below](#comments) |
+
+## Comments { #comments }
+Comments are ignored by Typst and will not be included in the output. This
+is useful to exclude old versions or to add annotations.
+To comment out a single line, start it with `//`:
+```example
+// our data barely supports
+// this claim
+
+We show with $p < 0.05$
+that the difference is
+significant.
+```
+
+Comments can also be wrapped between `/*` and `*/`. In this case, the comment
+can span over multiple lines:
+```example
+Our study design is as follows:
+/* Somebody write this up:
+ - 1000 participants.
+ - 2x2 data design. */
+```
+
+## Escape sequences { #escapes }
+Escape sequences are used to insert special characters that are otherwise have
+special meaning in Typst. To escape a character, precede it with a backslash. To
+insert any Unicode codepoint, you can write a hexadecimal escape sequence:
+`[\u{1f600}]`. The same kind of escape sequences also work in
+[strings]($type/string).
+
+```example
+I got an ice cream for
+\$1.50! \u{1f600}
+```
diff --git a/docs/src/reference/types.md b/docs/src/reference/types.md
new file mode 100644
index 00000000..744e1abd
--- /dev/null
+++ b/docs/src/reference/types.md
@@ -0,0 +1,837 @@
+# None
+A type that indicates the absence of any other value.
+
+The none type has exactly one value: `{none}`.
+
+When inserted into the document, it is not visible.
+This is also the value that is produced by empty code blocks.
+It can be [joined]($scripting/#blocks) with any value, yielding
+the other value.
+
+## Example
+```example
+Not visible: #none
+```
+
+# Auto
+A type that indicates a smart default.
+
+The auto type has exactly one value: `{auto}`.
+
+Parameters that support the `{auto}` value have some smart default or contextual
+behaviour. A good example is the [text direction]($func/text.dir) parameter.
+Setting it to `{auto}` lets Typst automatically determine the direction from the
+[text language]($func/text.lang).
+
+# Boolean
+A value with two states.
+
+The boolean type has two values: `{true}` and `{false}`. It denotes whether
+something is active or enabled.
+
+## Example
+```example
+#false \
+#true \
+#(1 < 2)
+```
+
+# Integer
+A whole number.
+
+The number can be negative, zero, or positive. As Typst uses 64 bits to store
+integers, integers cannot be smaller than `{-9223372036854775808}` or larger than
+`{9223372036854775807}`.
+
+## Example
+```example
+#(1 + 2) \
+#(2 - 5) \
+#(3 + 4 < 8)
+```
+
+# Float
+A floating-pointer number.
+
+A limited-precision representation of a real number. Typst uses 64 bits to
+store floats. Wherever a float is expected, you can also pass an
+[integer]($type/integer).
+
+## Example
+```example
+#3.14 \
+#1e4 \
+#(10 / 4)
+```
+
+# Length
+A size or distance, possibly expressed with contextual units.
+Typst supports the following length units:
+
+- Points: `{72pt}`
+- Millimeters: `{254mm}`
+- Centimeters: `{2.54cm}`
+- Inches: `{1in}`
+- Relative to font size: `{2.5em}`
+
+## Example
+```example
+#rect(width: 20pt) \
+#rect(width: 2em) \
+#rect(width: 1in)
+```
+
+# Angle
+An angle describing a rotation.
+Typst supports the following angular units:
+
+- Degrees: `{180deg}`
+- Radians: `{3.14rad}`
+
+## Example
+```example
+#rotate(10deg)[Hello there!]
+```
+
+# Ratio
+A ratio of a whole.
+
+Written as a number, followed by a percent sign.
+
+## Example
+```example
+#set align(center)
+#scale(x: 150%)[
+ Scaled apart.
+]
+```
+
+# Relative Length
+A length in relation to some known length.
+
+This type is a combination of a [length]($type/length) with a
+[ratio]($type/ratio). It results from addition and subtraction
+of a length and a ratio. Wherever a relative length is expected, you can also
+use a bare length or ratio.
+
+## Example
+```example
+#rect(width: 100% - 50pt)
+```
+
+# Fraction
+Defines how the the remaining space in a layout is distributed.
+
+Each fractionally sized element gets space based on the ratio of its fraction to
+the sum of all fractions.
+
+For more details, also see the [h]($func/h) and [v]($func/v) functions and the
+[grid function]($func/grid).
+
+## Example
+```example
+Left #h(1fr) Left-ish #h(2fr) Right
+```
+
+# Color
+A color in a specific color space.
+
+Typst supports:
+- sRGB through the [`rgb` function]($func/rgb)
+- Device CMYK through [`cmyk` function]($func/cmyk)
+- D65 Gray through the [`luma` function]($func/luma)
+
+Furthermore, Typst provides the following built-in colors:
+
+`black`, `gray`, `silver`, `white`, `navy`, `blue`, `aqua`, `teal`, `eastern`,
+`purple`, `fuchsia`, `maroon`, `red`, `orange`, `yellow`, `olive`, `green`, and
+`lime`.
+
+## Methods
+### lighten()
+Lightens a color.
+
+- amount: ratio (positional, required)
+ The factor to lighten the color by.
+
+### darken()
+Darkens a color.
+
+- amount: ratio (positional, required)
+ The factor to darken the color by.
+
+### negate()
+Produces the negative of the color.
+
+# Symbol
+A Unicode symbol.
+
+Typst defines common symbols so that they can easily be written with standard
+keyboards. The symbols are defined in modules, from which they can be accessed
+using [field access notation]($scripting/#fields):
+
+- General symbols are defined in the [`sym` module]($category/symbols/sym)
+- Emoji are defined in the [`emoji` module]($category/symbols/emoji)
+
+Moreover, you can define custom symbols with the [symbol]($func/symbol)
+function.
+
+```example
+#sym.arrow.r \
+#sym.gt.eq.not \
+$gt.eq.not$ \
+#emoji.face.halo
+```
+
+Many symbols have different variants, which can be selected by appending the
+modifiers with dot notation. The order of the modifiers is not relevant. Visit
+the documentation pages of the symbol modules and click on a symbol to see its
+available variants.
+
+```example
+$arrow.l$ \
+$arrow.r$ \
+$arrow.t.quad$
+```
+
+# String
+A sequence of Unicode codepoints.
+
+You can iterate over the characters (or rather, grapheme clusters) of the string
+using a [for loop]($scripting/#loops). Strings can be added with
+the `+` operator, [joined together]($scripting/#blocks) and
+multiplied with integers.
+
+Typst provides utility methods for string manipulation. Many of these methods
+(e.g., `split`, `trim` and `replace`) operate on _patterns:_ A pattern can be
+either a string or a [regular expression]($func/regex). This makes the methods
+quite versatile.
+
+_Note:_ Currently all lengths and indices are expressed in terms of UTF-8 bytes.
+This _might_ change to grapheme clusters in the future.
+
+### Example
+```example
+#"hello world!" \
+#"\"hello\n world\"!" \
+#"1 2 3".split() \
+#"1,2;3".split(regex("[,;]")) \
+#(regex("\d+") in "ten euros") \
+#(regex("\d+") in "10 euros")
+```
+
+### Escape sequences
+Just like in markup, you can escape a few symbols in strings:
+- `[\\]` for a backslash
+- `[\"]` for a quote
+- `[\n]` for a newline
+- `[\r]` for a carriage return
+- `[\t]` for a tab
+- `[\u{1f600}]` for a hexadecimal Unicode escape sequence
+
+## Methods
+### len()
+The length of the string in UTF-8 encoded bytes.
+
+- returns: integer
+
+### first()
+Extract the first character (or rather, grapheme cluster) of the string.
+Fails with an error if the string is empty.
+
+- returns: any
+
+### last()
+Extract the last character (or rather, grapheme cluster) of the string.
+Fails with an error if the string is empty.
+
+- returns: any
+
+### at()
+Extract the first character (or rather, grapheme cluster) after the specified
+index. Fails with an error if the index is out of bounds.
+
+- index: integer (positional, required)
+ The byte index.
+- returns: string
+
+### slice()
+Extract a substring of the string.
+Fails with an error if the start or end index is out of bounds.
+
+- start: integer (positional, required)
+ The start byte index (inclusive).
+- end: integer (positional)
+ The end byte index (exclusive). If omitted, the whole slice until the end of the
+ string is extracted.
+- count: integer (named)
+ The number of bytes to extract. This is equivalent to passing `start + count`
+ as the `end` position. Mutually exclusive with `end`.
+- returns: string
+
+### contains()
+Whether the string contains the specified pattern.
+
+This method also has dedicated syntax: You can write `{"bc" in "abcd"}` instead
+of `{"abcd".contains("bc")}`.
+
+- pattern: string or regex (positional, required)
+ The pattern to search for.
+- returns: boolean
+
+### starts-with()
+Whether the string starts with the specified pattern.
+
+- pattern: string or regex (positional, required)
+ The pattern the string might start with.
+- returns: boolean
+
+### ends-with()
+Whether the string ends with the specified pattern.
+
+- pattern: string or regex (positional, required)
+ The pattern the string might end with.
+- returns: boolean
+
+### find()
+Searches for the specified pattern in the string and returns the first match
+as a string or `{none}` if there is no match.
+
+- pattern: string or regex (positional, required)
+ The pattern to search for.
+- returns: string or none
+
+### position()
+Searches for the specified pattern in the string and returns the index of the
+first match as an integer or `{none}` if there is no match.
+
+- pattern: string or regex (positional, required)
+ The pattern to search for.
+- returns: integer or none
+
+### match()
+Searches for the specified pattern in the string and returns a dictionary
+with details about the first match or `{none}` if there is no match.
+
+The returned dictionary has the following keys:
+* `start`: The start offset of the match
+* `end`: The end offset of the match
+* `text`: The text that matched.
+* `captures`: An array containing a string for each matched capturing group. The
+ first item of the array contains the first matched capturing, not the whole
+ match! This is empty unless the `pattern` was a regex with capturing groups.
+
+- pattern: string or regex (positional, required)
+ The pattern to search for.
+- returns: dictionary or none
+
+### matches()
+Searches for the specified pattern in the string and returns an array of
+dictionaries with details about all matches. For details about the returned
+dictionaries, see above.
+
+- pattern: string or regex (positional, required)
+ The pattern to search for.
+- returns: array
+
+### replace()
+Replaces all or a specified number of matches of a pattern with a replacement
+string and returns the resulting string.
+
+- pattern: string or regex (positional, required)
+ The pattern to search for.
+- replacement: string (positional, required)
+ The string to replace the matches with.
+- count: integer (named)
+ If given, only the first `count` matches of the pattern are placed.
+- returns: string
+
+### trim()
+Removes matches of a pattern from one or both sides of the string, once or
+repeatedly and returns the resulting string.
+
+- pattern: string or regex (positional, required)
+ The pattern to search for.
+- at: alignment (named)
+ Can be `start` or `end` to only trim the start or end of the string.
+ If omitted, both sides are trimmed.
+- repeat: boolean (named)
+ Whether to repeatedly removes matches of the pattern or just once.
+ Defaults to `{true}`.
+- returns: string
+
+### split()
+Splits a string at matches of a specified pattern and returns an array of
+the resulting parts.
+
+- pattern: string or regex (positional)
+ The pattern to split at. Defaults to whitespace.
+- returns: array
+
+# Content
+Representation of text, elements, and more.
+
+This type is at the heart of Typst. All markup you write and most
+[functions]($type/function) you call produce content values. You
+can create a content value by enclosing markup in square brackets. This is also
+how you pass content to functions. Typst does not allow you to peek into
+content, but you can affect its appearance in various ways using set and show
+rules. See the chapter on [styling]($styling) for more details.
+
+```example
+#type([*Hello!*]) \
+#strong[Hello!]
+```
+
+Content can be added with the `+` operator,
+[joined together]($scripting/#blocks) and multiplied with
+integers. Wherever content is expected, you can also pass a
+[string]($type/string) or `{none}`.
+
+### Reactivity
+Content is reactive to the styles that are active where it is inserted.
+When you write a set or show rule, content that was _created_ before the show
+rule is stilled affected by the show rule if it is _inserted_ after the show
+rule.
+
+```example
+// Content is created here.
+#let mytext = [= A heading]
+
+// But still affected by the
+// styles that are active here.
+#show heading: set text(green)
+#mytext
+```
+
+# Array
+A sequence of values.
+
+You can construct an array by enclosing a comma-separated sequence of values
+in parentheses. The values do not have to be of the same type.
+
+You can access and update array elements with the `.at()` method. Indices are
+zero-based and negative indices wrap around to the end of the array. You can
+iterate over an array using a [for loop]($scripting/#loops).
+Arrays can be added together with the `+` operator,
+[joined together]($scripting/#blocks) and multiplied with
+integers.
+
+Empty parenthesis yield an array of length zero and a parentheses-wrapped value
+with trailing comma yields an array of length one.
+
+## Example
+```example
+#let values = (1, 7, 4, -3, 2)
+
+#values.at(0) \
+#(values.at(0) = 3)
+#values.at(-1) \
+#values.find(calc.even) \
+#values.filter(calc.odd) \
+#values.map(calc.abs) \
+#values.rev() \
+#(1, (2, 3)).flatten() \
+#(("A", "B", "C")
+ .join(", ", last: " and "))
+```
+
+## Methods
+### len()
+The number of values in the array.
+
+- returns: integer
+
+### first()
+Returns the first element in the array.
+May be used on the left-hand side of an assignment.
+Fails with an error if the array is empty.
+
+- returns: any
+
+### last()
+Returns the last element in the array.
+May be used on the left-hand side of an assignment.
+Fails with an error if the array is empty.
+
+- returns: any
+
+### at()
+Returns the element at the specified index in the array.
+May be used on the left-hand side of an assignment.
+Fails with an error if the index is out of bounds.
+
+- index: integer (positional, required)
+ The index at which to retrieve the element.
+- returns: any
+
+### push()
+Add a value to the end of the array.
+
+- value: any (positional, required)
+ The value to insert at the end of the array.
+
+### pop()
+Remove the last element from the array and return it.
+Fails with an error if the array is empty.
+
+- returns: any
+ The removed last value.
+
+### insert()
+Insert a value into the array at the specified index.
+Fails with an error if the index is out of bounds.
+
+- index: integer (positional, required)
+ The index at which to insert the element.
+- value: any (positional, required)
+ The value to insert into the array.
+
+### remove()
+Remove the value at the specified index from the array and return it.
+
+- index: integer (positional, required)
+ The index at which to remove the element.
+- returns: any
+
+### slice()
+Extract a subslice of the array.
+Fails with an error if the start or index is out of bounds.
+
+- start: integer (positional, required)
+ The start index (inclusive).
+- end: integer (positional)
+ The end index (exclusive). If omitted, the whole slice until the end of the
+ array is extracted.
+- count: integer (named)
+ The number of elements to extract. This is equivalent to passing `start +
+ count` as the `end` position. Mutually exclusive with `end`.
+- returns: array
+
+### contains()
+Whether the array contains the specified value.
+
+This method also has dedicated syntax: You can write `{2 in (1, 2, 3)}` instead
+of `{(1, 2, 3).contains(2)}`.
+
+- value: any (positional, required)
+ The value to search for.
+- returns: boolean
+
+### find()
+Searches for an element for which the given function returns `{true}` and
+returns the first match or `{none}` if there is no match.
+
+- searcher: function (positional, required)
+ The function to apply to each element. Must return a boolean.
+- returns: any or none
+
+### position()
+Searches for an element for which the given function returns `{true}` and
+returns the index of the first match or `{none}` if there is no match.
+
+- searcher: function (positional, required)
+ The function to apply to each element. Must return a boolean.
+- returns: integer or none
+
+### filter()
+Produces a new array with only the elements from the original one for which the
+given function returns true.
+
+- test: function (positional, required)
+ The function to apply to each element. Must return a boolean.
+- returns: array
+
+### map()
+Produces a new array in which all elements from the original one were
+transformed with the given function.
+
+- mapper: function (positional, required)
+ The function to apply to each element.
+- returns: array
+
+### fold()
+Folds all elements into a single value using an accumulator function.
+
+- init: any (positional, required)
+ The initial value to start with.
+- folder: function (positional, required)
+ The folding function. Must have two parameters: One for the accumulated value
+ and one for an element.
+- returns: any
+
+### any()
+Whether the given function returns `{true}` for any element in the array.
+
+- test: function (positional, required)
+ The function to apply to each element. Must return a boolean.
+- returns: boolean
+
+### all()
+Whether the given function returns `{true}` for all elements in the array.
+
+- test: function (positional, required)
+ The function to apply to each element. Must return a boolean.
+- returns: boolean
+
+### flatten()
+Combine all nested arrays into a single flat one.
+
+- returns: array
+
+### rev()
+Return a new array with the same elements, but in reverse order.
+
+- returns: array
+
+### join()
+Combine all elements in the array into one.
+
+- separator: any (positional)
+ A value to insert between each element of the array.
+- last: any (named)
+ An alternative separator between the last two elements
+- returns: any
+
+### sorted()
+Return a new array with the same elements, but sorted.
+
+- returns: array
+
+# Dictionary
+A map from string keys to values.
+
+You can construct a dictionary by enclosing comma-separated `key: value` pairs
+in parentheses. The values do not have to be of the same type.
+
+A dictionary is conceptually similar to an array, but it is indexed by strings
+instead of integers. You can access and create dictionary entries with the
+`.at()` method. If you know the key statically, you can alternatively use
+[field access notation]($scripting/#fields) (`.key`) to access
+the value. Dictionaries can be added with the `+` operator and
+[joined together]($scripting/#blocks).
+
+You can iterate over the pairs in a dictionary using a
+[for loop]($scripting/#loops).
+Dictionaries are always ordered by key.
+
+Since empty parentheses already yield an empty array, you have to use the
+special `(:)` syntax to create an empty dictionary.
+
+
+## Example
+```example
+#let dict = (
+ name: "Typst",
+ born: 2019,
+)
+
+#dict.name \
+#(dict.launch = 20)
+#dict.len() \
+#dict.keys() \
+#dict.values() \
+#dict.at("born") \
+#dict.insert("city", "Berlin ")
+```
+
+## Methods
+### len()
+The number of pairs in the dictionary.
+
+- returns: integer
+
+### at()
+Returns the value associated with the specified key in the dictionary.
+May be used on the left-hand side of an assignment if the key is already
+present in the dictionary.
+Fails with an error if the key is not part of the dictionary.
+
+- index: integer (positional, required)
+ The index at which to retrieve the element.
+- returns: any
+
+### insert()
+Insert a new pair into the dictionary and return the value.
+
+- key: string (positional, required)
+ The key of the pair that should be inserted.
+- value: any (positional, required)
+ The value of the pair that should be inserted.
+
+### keys()
+Returns the keys of the dictionary as an array in sorted order.
+
+- returns: array
+
+### values()
+Returns the values of the dictionary as an array in key-order.
+
+- returns: array
+
+### pairs()
+Call a function for each key-value pair and return the results in an array.
+
+- mapper: function (positional, required)
+ The function to apply to each pair. Gets passed the key and value as two
+ separate arguments.
+- returns: array
+
+### remove()
+Remove a pair from the dictionary by key and return the value.
+
+- key: string (positional, required)
+ The key of the pair that should be removed.
+- returns: any
+
+# Function
+A mapping from argument values to a return value.
+
+You can call a function by writing a comma-separated list of function
+_arguments_ enclosed in parentheses directly after the function name.
+Additionally, you can pass any number of trailing content blocks arguments to a
+function _after_ the normal argument list. If the normal argument list would
+become empty, it can be omitted. Typst supports positional and named arguments.
+The former are identified by position and type, while the later are written as
+`name: value`.
+
+Within math mode, function calls have special behaviour. See the
+[math documentation]($category/math) for more details.
+
+### Example
+```example
+// Call a function.
+#list([A], [B])
+
+// Named arguments and trailing
+// content blocks.
+#enum(start: 2)[A][B]
+
+// Version without parentheses.
+#list[A][B]
+```
+
+Functions are a fundamental building block of Typst. Typst provides functions
+for a variety of typesetting tasks. Moreover, the markup you write is backed by
+functions and all styling happens through functions. This reference lists all
+available functions and how you can use them. Please also refer to the
+documentation about [set]($styling/#set-rules) and
+[show]($styling/#show-rules) rules to learn about additional ways
+you can work with functions in Typst.
+
+### Defining functions { #definitions }
+You can define your own function with a
+[let binding]($scripting/#bindings) that has a parameter list after
+the binding's name. The parameter list can contain positional parameters,
+named parameters with default values and
+[argument sinks]($type/arguments).
+The right-hand side of the binding can be a block or any other expression. It
+defines the function's return value and can depend on the parameters.
+
+```example
+#let alert(body, fill: red) = {
+ set text(white)
+ set align(center)
+ rect(
+ fill: fill,
+ inset: 8pt,
+ radius: 4pt,
+ [*Warning:\ #body*],
+ )
+}
+
+#alert[
+ Danger is imminent!
+]
+
+#alert(fill: blue)[
+ KEEP OFF TRACKS
+]
+```
+
+### Unnamed functions { #unnamed }
+You can also created an unnamed function without creating a binding by
+specifying a parameter list followed by `=>` and the function body. If your
+function has just one parameter, the parentheses around the parameter list are
+optional. Unnamed functions are mainly useful for show rules, but also for
+settable properties that take functions like the page function's
+[`footer`]($func/page.footer) property.
+
+```example
+#show "once?": it => [#it #it]
+once?
+```
+
+### Notable fact
+In Typst, all functions are _pure._ This means that for the same
+arguments, they always return the same result. They cannot "remember" things to
+produce another value when they are called a second time.
+
+## Methods
+### with()
+Returns a new function that has the given arguments pre-applied.
+
+- arguments: any (variadic)
+ The named and positional arguments to apply.
+- returns: function
+
+### where()
+Returns a selector that filters for elements belonging to this function
+whose fields have the values of the given arguments.
+
+- fields: any (named, variadic)
+ The field values to filter by.
+- returns: selector
+
+# Arguments
+Captured arguments to a function.
+
+Like built-in functions, custom functions can also take a variable number of
+arguments. You can specify an _argument sink_ which collects all excess
+arguments as `..sink`. The resulting `sink` value is of the `arguments` type. It
+exposes methods to access the positional and named arguments and is iterable
+with a [for loop]($scripting/#loops). Inversely, you can spread
+arguments, arrays and dictionaries into a function call with the spread operator:
+`{func(..args)}`.
+
+## Example
+```example
+#let format(title, ..authors) = [
+ *{title}* \
+ _Written by {authors
+ .pos()
+ .join(", ", last: " and ")}._
+]
+
+#format("ArtosFlow", "Jane", "Joe")
+```
+
+## Methods
+### pos()
+Returns the captured positional arguments as an array.
+
+- returns: array
+
+### named()
+Returns the captured named arguments as a dictionary.
+
+- returns: dictionary
+
+# Module
+An evaluated module, either built-in or resulting from a file.
+
+You can access definitions from the module using
+[field access notation]($scripting/#fields) and interact with it using the
+[import and include syntaxes]($scripting/#modules).
+
+## Example
+```example
+<<< #import "utils.typ"
+<<< #utils.add(2, 5)
+
+<<< #import utils: sub
+<<< #sub(1, 4)
+>>> #7
+>>>
+>>> #(-3)
+```
diff --git a/docs/src/reference/welcome.md b/docs/src/reference/welcome.md
new file mode 100644
index 00000000..dc38663d
--- /dev/null
+++ b/docs/src/reference/welcome.md
@@ -0,0 +1,29 @@
+---
+description: |
+ The Typst reference is a systematic and comprehensive guide to the Typst
+ typesetting language.
+---
+
+# Reference
+This reference documentation is a comprehensive guide to all of Typst's
+syntax, concepts, types, and functions. If you are completely new to Typst, we
+recommend starting with the [tutorial]($tutorial) and then coming back to
+the reference to learn more about Typst's features as you need them.
+
+## Language
+The reference starts with a language part that gives an overview over [Typst's
+syntax]($syntax) and contains information about concepts involved in
+[styling documents,]($styling) using
+[Typst's scripting capabilities,]($scripting) and a detailed documentation of
+all [data types]($types) in Typst.
+
+## Functions
+The second part includes chapters on all functions used to insert, style, transform,
+and layout content in Typst documents. Each function is documented with a
+description of its purpose, a list of its parameters, and examples of how to use
+it.
+
+The final part of the reference explains all functions that are used within
+Typst's code mode to manipulate and transform data. Just as in the previous
+part, each function is documented with a description of its purpose, a list of
+its parameters, and examples of how to use it.