Typst 数学公式怎么写:对照 LaTeX 的写法
对照 LaTeX 讲 Typst 数学公式的写法:行内公式和独立公式的区别、分数与上下标、希腊字母和符号名、公式里的中文文字、粗体向量、矩阵与分段函数、括号自动放大、求和与积分的上下限、多行对齐、公式编号与写成"式 (1)"的引用、用 #let 定义记号,以及 LaTeX 常用命令的对照表。
最后核对:2026-10-24Typst 的公式也写在 $...$ 里,但里面的语法和 LaTeX 不一样:命令前面不加反斜杠,参数用圆括号和逗号,分组用圆括号而不是花括号。习惯了 LaTeX 的人最容易出错的,是把 \frac{a}{b} 原样粘贴进来。本文按写公式时最常遇到的问题逐个说明 Typst 的写法并对照 LaTeX,最后有一张常用命令的对照表。
行内公式和独立公式怎么区分
LaTeX 用不同的定界符区分两种公式:$...$ 是行内公式,\[...\] 或 equation 环境是独立公式。Typst 只有 $,由美元符号内侧有没有空格决定:
$x^2$:内侧没有空格,是行内公式,和文字排在同一行;$ x^2 $:开头和结尾的$内侧都有空格(或换行),是独立公式,单独成行并居中;- 只有一侧有空格(
$ x$)仍然是行内公式。
公式意外地单独成行,或者想单独成行却挤在句子里,先看美元符号旁边的空格。
// title: Typst 数学公式入门
#set text(font: ("Libertinus Serif", "Noto Serif CJK SC"), lang: "zh", region: "cn")
// 公式默认只用数学字体,其中的汉字靠字体回退找字形,找到的不一定是简体中文(这里会用到日文字形)
// 把中文字体排在数学字体后面,公式里的汉字就用简体中文字形
#show math.equation: set text(font: ("New Computer Modern Math", "Noto Serif CJK SC"))
#set heading(numbering: "1.")
= 行内公式和独立公式
// 美元符号内侧没有空格:行内公式,和文字排在同一行
质能方程 $E = m c^2$ 写在句子里。
// 美元符号内侧各有至少一个空格(或换行):独立公式,单独成行并居中
$ E = m c^2 $
= 分数、上下标
// a/b 排成分数;分子分母有多项时用圆括号括起来,括号本身不会印出来
// frac(a, b) 是同样的分数,写法更像 LaTeX
$ a/b quad (a + b)/(c + d) quad frac(1, 2) $
// 上下标超过一个字符时也用圆括号分组,相当于 LaTeX 的花括号
// x_i j 中只有 i 是下标,j 是普通的乘数
$ x_(i j) quad x_i j quad x^(n + 1) quad e^(i pi) quad a_n^2 $
= 希腊字母和符号
// 希腊字母直接写名字,大写开头就是大写字母
$ alpha, beta, gamma, Gamma, Delta, omega, pi $
// 常用符号有两种写法:名字(如 arrow.r、lt.eq)和简写(如 ->、<=)
$ x -> 0 quad a <= b quad a >= b quad a != b quad a approx b $
$ x arrow.r 0 quad a lt.eq b quad A subset.eq B quad x in RR quad oo $
$ a times b quad a dot b quad 1, 2, dots, n quad partial f quad nabla f $
= 公式里的文字
// 多个字母连写会被当成变量名,所以文字要放在双引号里
// 引号内的空格会原样保留,中文也一样写在引号里
$ v_"平均" = s/t, quad "其中" t > 0 $
$ f(x) = 0 quad "if" x < 0 $
// sin、log、lim 等常用函数名已经是正体;没有的用 op("...") 自己写
$ sin x + log y quad op("argmax")_x f(x) $
= 字体样式
// bold 是粗斜体,适合向量;要直立的粗体(像 LaTeX 的 \mathbf)用 upright(bold(...))
$ bold(v) quad upright(bold(v)) quad bb(R) quad cal(A) quad upright(d) $
// dif 是直立的微分号 d,并自动带上前面的间距
$ integral_0^1 x^2 dif x $
分数和上下标怎么写
- 分数:
a/b直接排成分数。分子或分母有多项时用圆括号括起来,(a + b)/(c + d),这对括号不会印出来。也可以写frac(a, b)。 - 上下标:
x^2、x_i和 LaTeX 相同,但多于一个字符时用圆括号分组:x_(i j)、x^(n + 1)。LaTeX 的x_{ij}照搬过来会报unknown variable: ij;x^{n+1}这样不报错,但花括号会原样印出来。 x_i j中只有i是下标,j是后面的普通字母。
多个字母连写是一个名字。 LaTeX 里 $ab$ 是 a 乘 b;Typst 里 ab 被当成一个叫 ab 的变量,找不到就报错:
error: unknown variable: ab
= hint: if you meant to display multiple letters as is, try adding spaces between each letter: `a b`
= hint: or if you meant to display this as text, try placing it in quotes: `"ab"`
表示相乘时字母之间加空格,a b、x y;数字和字母之间可以不加,2x 没有问题。更多公式报错见 Typst 编译报错。
希腊字母和符号怎么输入
希腊字母直接写名字,不加反斜杠:alpha、beta、pi,首字母大写就是大写字母,Gamma、Delta、Omega。
符号有两种写法,可以混用:
- 简写:常用的关系和箭头可以直接打出来,
<=、>=、!=、->、=>、<=>; - 名字:所有符号都有名字,用点号加修饰词区分变体,例如
arrow.r(→)、arrow.l(←)、arrow.r.double(⇒)、lt.eq(≤)、subset.eq(⊆)、in.not(∉)、dots.c(居中的省略号)。
常用的还有 times(×)、dot(·)、plus.minus(±)、approx(≈)、oo 或 infinity(∞)、partial(∂)、nabla(∇)、dots(…)。实数集等黑板粗体字母有现成的名字:RR、NN、ZZ、QQ、CC。
不知道某个符号叫什么时,查 Typst 文档的符号列表(typst.app/docs/reference/symbols/sym/),每个名字旁边都印着符号的样子。
公式里怎么写文字和中文
LaTeX 用 \text{},Typst 用双引号:
$ v_"平均" = s/t, quad "其中" t > 0 $
- 引号里的内容按正文文字排,空格原样保留:
$x "if" y$两边有空格,$x"if"y$就挤在一起。 - 不加引号写中文会报错。
$v_平均$中"平均"被当成一个变量名,报unknown variable: 平均,提示里同样建议加引号。 sin、cos、log、ln、lim、max、det等函数名已经是正体,不用加引号;没有现成名字的算子用op("argmax")。它和直接写"argmax"的区别是按算子处理两边的间距,还能把下标放到正下方(见下文)。
公式里的汉字可能用错字形。 公式默认只用数学字体(New Computer Modern Math),里面没有汉字,Typst 就从所有字体里回退寻找。用 JointTex 页面上的字体编译时,回退找到的是 Noto Serif CJK 的日文字形,而不是正文设置的简体中文字形。在文档开头加一条规则,把中文字体排在数学字体后面即可:
#show math.equation: set text(font: ("New Computer Modern Math", "Noto Serif CJK SC"))
本文的示例都带了这一行。正文字体的设置方法见 Typst 中文排版。
粗体向量为什么是斜的
LaTeX 的 \mathbf{v} 是直立粗体。Typst 的 bold(v) 只把字母加粗,保留原来的斜体,得到的是粗斜体。要和 LaTeX 一样的直立粗体,写 upright(bold(v))。
其他样式见文末的对照表。微分号可以写 dif,它是正体的 d,并在前面自动加一点间距:integral_0^1 f(x) dif x。
矩阵、向量和分段函数怎么写
Typst 不需要环境,三种结构都是函数:
- 矩阵
mat:逗号分隔同一行的元素,分号结束一行,mat(1, 2; 3, 4)。默认用圆括号,delim: "["换成方括号,delim: "|"是行列式,相当于 LaTeX 的pmatrix、bmatrix、vmatrix。 - 列向量
vec:vec(x_1, x_2, x_3),元素用逗号分隔。 - 分段函数
cases:每一种情况是一个参数,用逗号分隔,&对齐后面的条件,条件里的中文照样写在引号里。
矩阵里的省略号用 dots.h(水平)、dots.v(竖直)和 dots.down(斜向),对应 \cdots、\vdots、\ddots。
// title: Typst 矩阵、分段函数与括号
#set text(font: ("Libertinus Serif", "Noto Serif CJK SC"), lang: "zh", region: "cn")
// 公式里的汉字用简体中文字体(原因见"Typst 数学公式入门"示例)
#show math.equation: set text(font: ("New Computer Modern Math", "Noto Serif CJK SC"))
#set heading(numbering: "1.")
= 矩阵和向量
// mat:逗号分隔同一行的元素,分号结束一行;默认用圆括号
$ A = mat(1, 2; 3, 4) $
// delim 换括号:"[" 方括号,"|" 行列式,"{" 花括号
$ I = mat(delim: "[", 1, 0; 0, 1) quad det mat(delim: "|", a, b; c, d) = a d - b c $
// 省略号:dots.h 水平,dots.v 竖直,dots.down 斜向
$ mat(a_11, dots.h, a_(1n); dots.v, dots.down, dots.v; a_(m 1), dots.h, a_(m n)) $
// vec 是列向量,元素之间用逗号
$ bold(x) = vec(x_1, x_2, x_3) $
= 分段函数
// cases 的每一项用逗号分隔,& 对齐条件;中文条件写在引号里
$ f(x) = cases(
x^2 & "当" x >= 0,
-x & "其他情况",
) $
= 括号自动变大
// 成对的 ()、[]、{} 会自动按内容的高度放大
$ (a/b) quad [x/2] quad {1/n} $
// 竖线不会自动变大:|a/b| 保持原大小,要用 abs 或 lr
$ |a/b| quad abs(a/b) quad lr(|a/b|) quad norm(bold(v)) $
// lr 里的 mid 让中间的竖线跟着变大;lr 也能放大不成对的括号
$ lr({ x/2 mid(|) x > 0 }) quad lr([0, 1/2)) $
= 求和、积分与极限
// 独立公式里,sum、lim 的上下限在符号的正上方和正下方
$ sum_(i = 1)^n i = (n(n + 1))/2 quad lim_(x -> 0) (sin x)/x = 1 $
// 积分号的上下限默认在右侧;要放到正上下方,用 limits(...)
$ integral_0^1 x dif x quad limits(integral)_0^1 x dif x quad integral.double_D f dif A $
// 行内公式里 sum 的上下限在右侧,这样不会撑高行距:
行内的 $sum_(i = 1)^n i$ 和强制放在上下方的 $limits(sum)_(i = 1)^n i$。
// 自己写的算子:op 的 limits 设为 true,上下限就放在正下方
$ op("argmax", limits: #true)_(x in RR) f(x) $
括号能自动变大吗
能。LaTeX 要写 \left( ... \right);Typst 里成对的 ()、[]、{} 会自动按里面内容的高度放大,(a/b) 的括号就和分数一样高。
几个例外:
- 竖线不会自动放大。
|a/b|保持原来的大小。绝对值写abs(a/b),范数写norm(x),或者用lr(|a/b|)。 - 不成对的括号,如半开区间
[0, 1/2),也用lr包起来:lr([0, 1/2))。 - 中间的分隔线用
mid,它会跟着两边的括号一起放大:lr({ x/2 mid(|) x > 0 }),相当于 LaTeX 的\middle|。
求和、积分的上下限放在哪
和 LaTeX 的默认行为一致:
- 独立公式里,
sum、product、lim、max的上下限在符号的正上方和正下方;行内公式里放在右侧,以免撑高行距。 - 积分号
integral的上下限默认在右侧。
要改变位置,用 limits() 和 scripts():limits(integral)_0^1 把上下限放到积分号正上下方(相当于 \int\limits),scripts(sum)_(i=1)^n 反过来强制放在右侧(相当于 \sum\nolimits)。行内公式里想让 sum 的上下限在正上下方,同样写 limits(sum)。自己定义的算子要让上下限在下方,写 op("argmax", limits: #true)。
多行公式怎么对齐
Typst 没有 align 环境,直接在独立公式里用 \ 换行、& 标出对齐位置,和 LaTeX align 的写法几乎一样,只是换行是一个反斜杠:
$ f(x) & = (x + 1)^2 \
& = x^2 + 2x + 1 $
- 一行里可以有多个
&。它们把每行分成几列,各列依次右对齐、左对齐、右对齐……这和 LaTeXalign的规则相同。 - 在等式后面写说明文字时,第三列会右对齐,看起来不整齐。用
&&跳过一个右对齐的列,说明文字就是左对齐的。 - 整个多行公式只占一个编号,编号排在垂直居中的位置。
公式编号和引用怎么做
编号:在文档开头写 #set math.equation(numbering: "(1)"),之后所有独立公式都按 (1)、(2)…… 编号;行内公式不编号。
标签和引用:在公式后面紧跟一个标签 <expand>,正文里写 @expand 引用,不需要像 LaTeX 那样编译两次。没有打开编号就引用公式会报错:
error: cannot reference equation without numbering
= hint: you can enable equation numbering with `#set math.equation(numbering: "1.")`
引用写出来是什么:文档设置了 lang: "zh" 时,@expand 写出"式 1":前缀是"式",而且不带括号,即使公式旁边的编号是 (1)。前缀可以在引用处换掉,@expand[公式] 写出"公式 1"。
想要"式 (1)":中文论文常写"式 (1)",与公式旁的编号一致。下面这条 show 规则只改公式的引用,按公式自己的编号格式写出编号,其他引用(图、表、章节)不受影响:
#show ref: it => {
let el = it.element
if el != none and el.func() == math.equation {
link(el.location(), [式~#numbering(el.numbering, ..counter(math.equation).at(el.location()))])
} else {
it
}
}
引用后面紧跟汉字时要留空格。 汉字也可以出现在标签名里,所以 由@expand展开 中的标签名会被读成 expand展开,报 label `<expand展开>` does not exist in the document。@ 前面可以紧挨汉字,后面要留一个空格(由@expand 展开);后面是中文标点时不用。也可以写成 #ref(<expand>)。
// title: Typst 多行公式、编号与引用
#set text(font: ("Libertinus Serif", "Noto Serif CJK SC"), lang: "zh", region: "cn")
// 公式里的汉字用简体中文字体(原因见"Typst 数学公式入门"示例)
#show math.equation: set text(font: ("New Computer Modern Math", "Noto Serif CJK SC"))
#set heading(numbering: "1.")
// 给所有独立公式编号,编号格式写成 "(1)";行内公式不编号
#set math.equation(numbering: "(1)")
// 常用的记号用 #let 定义一次,后面在公式里直接用名字
#let vv = $upright(bold(v))$
#let RR = $bb(R)$
#let norm2(x) = $lr(|| #x ||)_2$
= 多行公式
// \ 换行,& 标出对齐的位置;整个多行公式只有一个编号
$ f(x) & = (x + 1)^2 \
& = x^2 + 2x + 1 $ <expand>
// 一行里可以有多个 &:它们把每行分成几列,各列依次右对齐、左对齐、右对齐……
// 说明文字想左对齐,就用 && 跳过一个右对齐的列
$ x + y & = 3, && quad "第一个方程" \
2x - y & = 1, && quad "第二个方程,系数不同" $ <system>
= 标签和引用
// 标签 <名字> 紧跟在公式后面,正文里用 @名字 引用
// 在 lang: "zh" 下,引用写出"式 1":前缀是"式",编号不带括号
// @ 前面可以紧挨汉字;后面要留一个空格,否则后面的汉字会被当成标签名的一部分
由@expand 展开,联立@system 可解出 $x = 4/3$。
// 用 [] 换掉前缀,这里写成"公式 2"
方程组也可以写成@system[公式]。
= 引用也带括号
// 下面这条 show 规则只改公式的引用:写出"式 (1)",与公式旁的编号一致
// 其他引用(图、表、章节)原样不变
#show ref: it => {
let el = it.element
if el != none and el.func() == math.equation {
link(el.location(), [式~#numbering(el.numbering, ..counter(math.equation).at(el.location()))])
} else {
it
}
}
再看@expand 和@system。
= 自定义记号
// #let 定义的 vv、RR、norm2 和内置的名字用法一样
$ vv in RR^3, quad norm2(vv) = sqrt(v_1^2 + v_2^2 + v_3^2) $ <norm>
由@norm 可知,向量的长度总是非负的。
常用的记号怎么定义成简写
LaTeX 用 \newcommand,Typst 用 #let:
#let vv = $upright(bold(v))$
#let norm2(x) = $lr(|| #x ||)_2$
定义之后,在公式里直接写 vv、norm2(vv),用法和内置的名字一样。几点注意:
#let要写在使用之前,它只对后面的内容有效。- 名字至少要两个字母。 公式里单个字母总是当作字母本身:定义了
#let v = $upright(bold(v))$,公式里的v仍然是普通的斜体 v,所以示例里起名叫vv。 - 带参数的定义里,参数要写成
#x。#let sq(x) = $x^2$中的x只是字母 x,sq(a)排出来是 x²;写成$#x^2$才是 a²。 - 名字不要和内置的名字重复,否则会把内置的覆盖掉。比如定义了
#let dot = ...,后面的dot就不再是点乘号。
LaTeX 命令对照表
| LaTeX | Typst | 说明 |
|---|---|---|
$x$、\[ x \] | $x$、$ x $ | 内侧有无空格决定 |
\frac{a}{b} | a/b、frac(a, b) | |
x_{ij}、x^{n+1} | x_(i j)、x^(n+1) | 圆括号分组 |
\sqrt{x}、\sqrt[3]{x} | sqrt(x)、root(3, x) | |
\alpha、\Gamma | alpha、Gamma | |
\le、\ge、\ne | <=、>=、!= | 或 lt.eq 等名字 |
\to、\Rightarrow | ->、=> | |
\in、\notin、\subseteq | in、in.not、subset.eq | |
\times、\cdot、\pm | times、dot、plus.minus | |
\infty、\partial、\nabla | oo、partial、nabla | |
\ldots、\cdots | dots、dots.c | |
\text{其中} | "其中" | |
\mathbf{v} | upright(bold(v)) | bold(v) 是粗斜体 |
\mathbb{R}、\mathcal{A}、\mathrm{d} | bb(R) 或 RR、cal(A)、upright(d) | |
\hat{x}、\tilde{x}、\bar{x}、\vec{v} | hat(x)、tilde(x)、macron(x)、arrow(v) | |
\overline{AB} | overline(A B) | |
\operatorname{argmax} | op("argmax") | |
\left( \right) | 自动;lr(...) | |
\begin{pmatrix}、bmatrix | mat(...)、mat(delim: "[", ...) | ; 换行 |
\begin{cases} | cases(...) | |
\binom{n}{k} | binom(n, k) | |
\int\limits、\sum\nolimits | limits(integral)、scripts(sum) | |
\quad、\, | quad、thin | |
\\、&(align 中) | \、& | 直接写在独立公式里 |
\label{eq:a}、\eqref{eq:a} | <eq:a>、@eq:a | 写出"式 1" |
\newcommand | #let |
能不能直接粘贴 LaTeX 公式
能,用 Typst Universe 上的 mitex 宏包。它把 LaTeX 公式转换成 Typst 再排版,我们在 Typst 0.15.1 上试过 0.2.7 版:
#import "@preview/mitex:0.2.7": mitex, mi
#mitex(`\frac{a}{b} + \sum_{i=1}^n x_i^2`)
行内公式写成 #mi(`\sqrt{x^2 + 1}`)。
mitex 适合迁移已有的大量公式。新写的公式建议直接用 Typst 语法,本文讲的编号、引用和 #let 简写都是按 Typst 语法说明的。
