- name
- typst-writing-conventions
- description
- 当编辑/创建 .typ 文件时,必须使用本技能以确保符合 Typst 语法规范(如 subset→subset.eq, \sigma→sigma, integral→integral 等)、符号映射规则、文档层级结构和写作风格约定。尤其适用于新增数学公式较多的笔记时。
- user_invocable
- false
## 1. 文档结构
### 层级体系
| 语法 | 层级 | 含义 |
|------|------|------|
| `#part("...")` | Part | 大知识模块分组 |
| `= ...` | Chapter(一级标题) | 完整知识单元 |
| `== ...` | Section(二级标题) | 章内主要知识点 |
| `=== ...` | Subsection(三级标题) | 节内细分 |
### 标题规则
- 标题标记 `=` 后必须有空格:`= Title`(正确)vs `=Title`(错误)
- 不要跳级使用标题(如从 `=` 直接到 `===`)
---
## 2. 文本格式
| 效果 | 语法 |
|------|------|
| 加粗 | `*text*` |
| 斜体 | `_text_` |
| 行内代码 | `` `code` `` |
| 脚注 | `#footnote[...]` |
| 垂直间距 | `#v(1cm)` |
| 行内高亮 | `#highlight[text]` |
### 列表
- 无序列表:`- item`
- 有序列表:`1. item` / `2. item`
- 嵌套:使用缩进(Tab 或两空格)
---
## 3. 数学公式
### 基本用法
- 行内公式:`$ ... $`(与文本同行)
- 行间公式(display math):`$ ... $`(单独成段,前后有空行或换行)
### 符号映射(LaTeX → Typst)
| LaTeX | Typst |
|-------|-------|
| `\mathbb{R}` | `bb(R)` |
| `\mathcal{F}` | `cal(F)` |
| `\mathscr{M}` | `scr(M)` |
| `\to`, `\rightarrow` | `->` |
| `\Rightarrow` | `=>` |
| `\Leftrightarrow` | `<=>` |
| `\infty` | `oo` |
| `\subseteq` | `subset` |
| `\cup` | `union` |
| `\cap` | `inter` |
| `\notin` | `in.not` |
| `\neq` | `!=` |
| `\land` | `and` |
| `\lor` | `or` |
| `\lnot` | `not` |
| `\circ`(复合) | `compose` |
| `\preceq` | `prec.eq` |
| `\oplus`(对称差) | `plus.o` |
| `\forall` | `forall` |
| `\exists` | `exists` |
| `\partial` | `partial` |
| `\mathrm{d}x` | `dif x` |
| `\liminf` | `liminf` |
| `\limsup` | `limsup` |
| `\sup` | `sup` |
| `\inf` | `inf` |
| `\overline{X}` | `overline(X)` |
| `\chi_A`(特征函数) | `chi_A` |
| `\backslash` | `backslash` |
| `\int` | `integral` |
| `\iint`, `\iiint` | `integral.double`, `integral.triple` |
| `\oint` | `integral.cont`(闭合环路线积分) |
| `\cdot` | `dot` |
| `\sim` | `~` 或 `approx` |
| `\text{...}` | `text("...")`(**必须用字符串引号**) |
| `\left(`, `\right)` | 无对应命令,Typst 自动缩放括号 |
| `\left[`, `\right]` | 无对应命令,Typst 自动缩放方括号 |
### 硬规则(必须遵守)
1. **不属于符号**:写 `$in.not$`,不要写 `$notin$`
2. **子集**:统一写 `$subset$`
3. **箭头**:`$->$`、`$<=>$`,不保留 LaTeX 宏名
4. **不等于**:`$!=$`(注意空格:`$!= $` 或 `$a != b$`)
5. **函数复合**:`$compose$`
6. **微分符号**:使用正体 `dif x`、`dif t`
7. **导数点记号**:`dot(x)`、`dot.double(x)`、`dot.triple(x)`
8. **积分号**:用 `integral`,不是 `int`。二重/三重:`integral.double`、`integral.triple`
9. **`text()` 必须用字符串参数**:写 `text("something")`,不是 `text(something)`
10. **点乘**:写 `a dot b`,不用 `a cdot b`(`cdot` 不存在)
11. **`\left(`/`\right)` 不存在**:Typst 自动缩放括号,不需要 `\left`/`\right`
### 常见陷阱
#### 裸下标问题
Typst 不支持 `$_x$`,下标 `_` 前必须有主体。
```typst
// 错误
$_x$
// 正确:空主体下标
$""_x$
```
#### 多字母变量问题
Typst 将连续字母识别为内置函数名(如 `sin`、`exp`),或把相邻的单字母变量合并为一个未知多字母变量,导致编译错误。
```typst
// 正体多字母变量:用引号包裹
$"ext"$, $"const"$, $"max"$
// 斜体多字母变量:用空格分开
$e x t$
// 示例
$bold(F)_i^("ext")$ // 外力
```
**相邻单字母变量之间必须用空格分隔**,否则整体被识别为一个未知变量(报 `unknown variable: xy` 等):
```typst
// 错误 — 字母连写被合并为单个未知变量
$xy$ // → unknown variable: xy
$2xy$ // → unknown variable: xy
$2 x y z$ 若写成 $2xyz$
// 正确 — 变量与变量之间留空格
$x y$
$2 x y$
```
数字紧跟单个变量(如 `$2x$`)本身合法,但建议统一写成 `$2 x$` 保持风格一致。
**排查指南**:遇到 `unknown variable` 错误时,优先排查两类根因——多字母连写(如 `xy`、`2xy`)与 LaTeX 宏残留(如 `cdot`、`int`、`infty`)。
#### 组件参数中的引号嵌套
组件的 `name:` / `title:` 等字符串参数内部**不能直接嵌套双引号**,否则字符串提前终止,报 `unclosed delimiter` / `expected comma`:
```typst
// 错误 — 内层双引号截断了外层字符串
#note(title: "On the Usage of "Holomorphic" and "Analytic")[...]
// 正确 — 内层改用单引号
#note(title: "On the Usage of 'Holomorphic' and 'Analytic'")[...]
```
#### 组件 name/title 参数中的数学公式
`name:` / `title:` 参数可以传字符串(`"..."`)或 content(`[...]`),两种形式都能正确渲染其中的 `$...$` 数学公式。模板已通过 `eval(name, mode: "markup")` 自动解析字符串中的 markup 语法。
```typst
// 两种写法都正确,数学正常渲染
#definition(name: "$L^p$ Space")[...]
#definition(name: [$L^p$ Space])[...]
// 推荐:字符串形式更简洁
#theorem(name: "Properties of $sin$ and $cos$")[...]
```
**注意**:使用字符串形式时,`$...$` 内的 Typst 数学符号必须正确(如 `!=` 而非 `neq`),否则 `eval` 解析时会报 `unknown variable` 错误。
#### 分数的分子/分母非单因子时必须加括号
`/` 只把紧邻的**单个因子**作为分子和分母。分母(或分子)含多字符结构或运算时必须加括号,否则解析错误。
**绝对值的特殊处理**:使用 `abs()` 函数形式后无需再加外层括号(`abs()` 自身作为一个完整因子)。但若使用 `|...|` 形式则必须加外层括号(见下方「绝对值用 abs(xxx),不用 |xxx|」陷阱):
```typst
// 错误 — 分母只解析出单个因子,多字符结构被截断
$z^5 / |z|^4$ // 分母只取到 "|",剩余 "z|^4" 并排在分数旁
$x + y / 2$ // 实际是 x 加上分数 y/2
// 正确 — abs() 形式(推荐,无需额外括号)
$z^5 / abs(z)^4$
$z / abs(z)$
$x / abs(z)$
$abs(f(z)) / abs(g(z))$
// 正确 — 普通非单因子加括号
$(x + y) / 2$ // 想要 (x+y)/2 必须加括号
$z^5 / (w^4)$ // 含运算的幂次也加括号保险
```
**判定规则**:分子/分母只要不是单个字母或数字(可带上下标,如 `x_i`、`z^2`),就必须加括号。**但 `abs(...)` 作为一个整体函数调用,可以视为单个因子**——这就是统一使用 `abs()` 形式的另一优势。
#### 绝对值用 abs(xxx),不用 |xxx|
Typst 数学模式中的 `|...|` **不会自动调整大小**,且在分式、根号、嵌套结构中容易被解析为独立竖线元素(见上文"分数的分子/分母非单因子时必须加括号"陷阱)。**统一使用函数形式 `abs(xxx)`**,自动缩放并避免歧义:
```typst
// 错误 — |xxx| 不会自动缩放,且容易被误解为单字符
$|z - z_0|$
$|f(z)| / |g(z)|$
$root(n, |a_n|)$
// 正确 — abs() 自动缩放,且作为整体单元参与解析
$abs(z - z_0)$
$abs(f(z)) / abs(g(z))$
$root(n, abs(a_n))$
```
**判定规则**:所有形如 `|表达式|` 的绝对值(含 `|z|`、`|c_n|`、`|z - z_0|`、`|f(z)|` 等)一律改写为 `abs(表达式)`,不论出现在正文公式、分式分子分母、根号内、积分限、求和限等任何位置。
**非绝对值的竖线严禁转换**:`|` 在数学模式中还有其他用途,批量替换前必须逐行分类排查(统计每行 `|` 个数,奇数行必然含非绝对值竖线):
| 用途 | 示例 | 处理 |
|------|------|------|
| 集合构建分隔符 | `{(x, y) \| x, y in bb(R)}` | 保留原样(本仓库写法为 `\|`) |
| 整除符号 | `$q \| k_1 - k_2$`(q 整除 k₁−k₂) | 保留原样 |
| 分隔符参数 | `delim: "\|"` | 保留原样 |
**批量替换流程要求**:先全量统计含 `|` 的行并按奇偶分类 → 偶数行逐行配对转换(行内配对,禁止跨行正则)→ 奇数行逐行人工判定 → 转换后 grep 检查 `abs(` 内是否误含 ` in `、`\|` 等集合构建特征 → `typst compile` 验证退出码为 0。跨行正则(如 `\|([^|]+)\|` 直接作用于全文)会把不同行的孤立竖线错误配对,造成大面积损坏。
**积分/求和限中的集合描述例外**:形如 `integral_({|f| > M})` 的集合描述中的 `|f|` 表示集合定义中的属性条件,作为花括号集合构造语法的一部分,**保持原样不改**——这是集合描述的语法元素,不是绝对值表达式:
```typst
// 保持原样 — 花括号内的集合描述语法
$integral_({|f| > M}) |f| dif mu$ // 集合 {|f| > M} 内的积分
// 但若此处出现了真正的绝对值计算且需要自动缩放,仍应改用 abs()
$abs(f)$
```
#### n 次方根用 root(n, x),不用 sqrt 二参形式
`sqrt(x, n)` 的第二参数(根指数)不能是函数调用或含绝对值的表达式(如 `abs(a_n)`),会报 `unexpected argument`。统一改用 `root(指数, 被开方数)`:
```typst
// 错误 — sqrt 第二参数不接受函数调用
$sqrt(n, abs(a_n))$
// 正确 — root(指数, 被开方数)
$root(n, abs(a_n))$
$root(n, n)$ // n 次根号 n
```
#### 标点位置
独立数学公式的句号等标点必须写在数学环境内部:
```typst
// 错误
$
G(a_n; x) = sum_(n=0)^oo a_n x^n
$.
// 正确
$
G(a_n; x) = sum_(n=0)^oo a_n x^n.
$
```
#### Display math 保持原样
如果原内容是 display math,不要擅自改写成行内数学。
#### 括号自动缩放
Typst 自动缩放普通括号,通常不需要 LaTeX 的 `\left`/`\right`。需要长竖线时使用 `lr(...)`。
#### `int` → `integral` 遗忘
LaTeX 习惯用 `\int`,Typst 必须写 `integral`。`int` 是未知变量,会报错。
```typst
// 错误
$int_0^1 f(x) dif x$
// 正确
$integral_0^1 f(x) dif x$
// 二重积分
$integral.double_S f dif S$
// 闭合曲面积分(无 oint 符号)
GitHubで見る