summaryrefslogtreecommitdiff
path: root/docs/reference/styling.md
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2023-07-02 19:59:52 +0200
committerLaurenz <laurmaedje@gmail.com>2023-07-02 20:07:43 +0200
commitebfdb1dafa430786db10dad2ef7d5467c1bdbed1 (patch)
tree2bbc24ddb4124c4bb14dec0e536129d4de37b056 /docs/reference/styling.md
parent3ab19185093d7709f824b95b979060ce125389d8 (diff)
Move everything into `crates/` directory
Diffstat (limited to 'docs/reference/styling.md')
-rw-r--r--docs/reference/styling.md145
1 files changed, 145 insertions, 0 deletions
diff --git a/docs/reference/styling.md b/docs/reference/styling.md
new file mode 100644
index 00000000..85095e34
--- /dev/null
+++ b/docs/reference/styling.md
@@ -0,0 +1,145 @@
+---
+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 an
+[element function]($type/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]($func/text.font) and
+[heading numbering]($func/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 { #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]($type/selector), a colon and then a set rule. The most basic form of selector is an
+[element function]($type/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 behind the colon with an arbitrary
+[function]($type/function). This function 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(font: "Inria Serif")
+ \~ #emph(it.body)
+ #counter(heading).display() \~
+]
+
+= 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
+#show "Project": smallcaps
+#show "badly": "great"
+
+We started Project in 2019
+and are still working on it.
+Project is progressing badly.
+```