Typst 数学公式怎么写:对照 LaTeX 的写法

对照 LaTeX 讲 Typst 数学公式的写法:行内公式和独立公式的区别、分数与上下标、希腊字母和符号名、公式里的中文文字、粗体向量、矩阵与分段函数、括号自动放大、求和与积分的上下限、多行对齐、公式编号与写成"式 (1)"的引用、用 #let 定义记号,以及 LaTeX 常用命令的对照表。

最后核对:2026-10-24

Typst 的公式也写在 $...$ 里,但里面的语法和 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 $
Typst 数学公式入门在 JointTex 中打开

分数和上下标怎么写

  • 分数: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) $
Typst 矩阵、分段函数与括号在 JointTex 中打开

括号能自动变大吗

能。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 $
  • 一行里可以有多个 &。它们把每行分成几列,各列依次右对齐、左对齐、右对齐……这和 LaTeX align 的规则相同。
  • 在等式后面写说明文字时,第三列会右对齐,看起来不整齐。用 && 跳过一个右对齐的列,说明文字就是左对齐的。
  • 整个多行公式只占一个编号,编号排在垂直居中的位置。

公式编号和引用怎么做

编号:在文档开头写 #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 可知,向量的长度总是非负的。
Typst 多行公式、编号与引用在 JointTex 中打开

常用的记号怎么定义成简写

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 命令对照表

LaTeXTypst说明
$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、\Gammaalpha、Gamma
\le、\ge、\ne<=、>=、!=或 lt.eq 等名字
\to、\Rightarrow->、=>
\in、\notin、\subseteqin、in.not、subset.eq
\times、\cdot、\pmtimes、dot、plus.minus
\infty、\partial、\nablaoo、partial、nabla
\ldots、\cdotsdots、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}、bmatrixmat(...)、mat(delim: "[", ...); 换行
\begin{cases}cases(...)
\binom{n}{k}binom(n, k)
\int\limits、\sum\nolimitslimits(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 语法说明的。

JointTex

Browser compatibility

JointTex could not start

The application did not finish loading. Check your connection, then try again.

Supported versions

  • Chrome and Edge 88 or later
  • Firefox 84 or later
  • Safari and iOS Safari 14 or later
Reload