语法
Typst 是一种标记语言。 这意味着,使用简单的语法就可以进行常用的布局操作, 再辅以 set 和 show 规则,格式化文档更加简单,更加自动化, 这些均是基于紧密集成在 Typst 内的脚本语言, 其内置大量常用函数,用户亦可根据需求自定义函数。
标记模式
Typst 为常用文档元素内置了语法标记。 这些语法标记大多只是相关函数的快捷表达方式, 下表列出了所有语法标记,以及它们的详细使用的链接地址。
| 名称 | 示例 | 详情链接 |
|---|---|---|
| 段落中断 | 空行 | parbreak |
| 着重强调 | *strong* | strong |
| 强调 | _emphasis_ | emph |
| 代码段 | `print(1)` | raw |
| 链接 | https://typst.app/ | link |
| 标签 | <intro> | label |
| 引用 | @intro | ref |
| 标题 | = Heading | heading |
| 无序列表 | - item | list |
| 有序列表 | + item | enum |
| 术语列表 | / Term: description | terms |
| 数学公式 | $x^2$ | Math |
| 行中断 | \ | linebreak |
| 智能引号 | 'single' or "double" | smartquote |
| 快捷符号 | ~, --- | Symbols |
| 代码表达式 | #rect(width: 1cm) | Scripting |
| 转义字符 | Tweet at us \#ad | Below |
| 注释 | /* block */, // line | Below |
数学模式
数学模式是一种特殊的语法标记模式,专门用来输入数学公式。
通过 $ 字符包裹一个数学公式,
如果这个公式头尾都至少一个空格(例如$ x^2 $),这个公式将会形成一个文档块,单独占用一行,
如果头尾没有空格(例如$x^2$),这个公式将会排版在行内,
下面是针对数学模式的语法概述:
| 名称 | 示例 | 详情链接 |
|---|---|---|
| 行内数学公式 | $x^2$ | Math |
| 块级数学公式 | $ x^2 $ | Math |
| 底部附缀 | $x_1$ | attach |
| 顶部附缀 | $x^2$ | attach |
| 分数 | $1 + (a+b)/5$ | frac |
| 行中断 | $x \ y$ | linebreak |
| 对齐点 | $x &= 2 \ &= 3$ | Math |
| 变量访问 | $#x$, $pi$ | Math |
| 字段访问 | $arrow.r.long$ | Scripting |
| 隐式乘积 | $x y$ | Math |
| 快捷符号 | $->, !=$ | Symbols |
| 数学公式内字符串 | $a "is natural"$ | Math |
| 数学函数调用 | $floor(x)$ | Math |
| 代码表达式 | $#rect(width: 1cm)$ | Scripting |
| 转义字符 | $x\^2$ | Below |
| 注释 | $/* comment */$ | Below |
代码模式
在代码块和表达式中,新的表达式不再前缀 # 字符。
许多代码语法元素是表达式特有的,
下面列出了代码模式下所有可用的语法:
| 名称 | 示例 | 详情链接 |
|---|---|---|
| 变量访问 | x | Scripting |
| 字面常量 | 1pt, "hey" | Scripting |
| 代码块 | { let x = 1; x + 2 } | Scripting |
| 文档内容块 | [*Hello*] | Scripting |
| 括号表达式 | (1 + 2) | Scripting |
| 数组 | (1, 2, 3) | Array |
| 字典 | (a: "hi", b: 2) | Dictionary |
| 一元运算符 | -x | Scripting |
| 二元运算符 | x + y | Scripting |
| 赋值 | x = 1 | Scripting |
| 字段访问 | x.y | Scripting |
| 方法调用 | x.flatten() | Scripting |
| 函数调用 | min(x, y) | Function |
| 匿名函数 | (x, y) => x + y | Function |
| let 绑定 | let x = 1 | Scripting |
| 命名函数 | let f(x) = 2 * x | Function |
| set 规则 | set text(14pt) | Styling |
| set-if 规则 | set text(..) if .. | Styling |
| show-set 规则 | show par: set block(..) | Styling |
| 函数式 show 规则 | show raw: it => {..} | Styling |
| show-everything 规则 | show: columns.with(2) | Styling |
| 条件表语句 | if x == 1 {..} else {..} | Scripting |
| for 循环 | for x in (1, 2, 3) {..} | Scripting |
| while 循环 | while x < 10 {..} | Scripting |
| 循环流程控制 | break, continue | Scripting |
| 函数返回 | return x | Function |
| include 模块 | include "bar.typ" | Scripting |
| import 模块 | import "bar.typ" | Scripting |
| 从模块内 import 条目 | import "bar.typ": a, b, c | Scripting |
| 注释 | /* block */, // line | Below |
注释
Typst 会忽略注释,最终生成的文档不会包含它们。
它们通常被用于剔除旧版本,或者添加标注说明。
如果一行开头是 //,这行就会被认为是注释:
// our data barely supports
// this claim
We show with $p < 0.05$
that the difference is
significant.

也可以通过 /* 和 */ 来包裹注释,这种方式,注释可以分布于多行:
Our study design is as follows:
/* Somebody write this up:
- 1000 participants.
- 2x2 data design. */

转义序列
转义序列可以用来插入难于输入的特殊字符,或者 Typst 内有特殊含义的字符。
前缀一个反斜杠转义一个字符,转移序列如果是十六进制,
比如 \u{1f600},就会插入一个 Unicode 码点。
这些类型的转义序列也作用于字符串中。
I got an ice cream for
\$1.50! \u{1f600}
