导航

利益相关:本文作者与极坐标⋅XYZ(jizuobiao.xyz)团队有关联。文中代码都在 Manim Community 0.21.0 桌面版里实际跑过,结论请自行验证。

MathTex 和 MathTypst 有什么区别?同一个公式的两种写法对照(Manim 0.21)

MathTex 和 MathTypst 最后都把公式变成一组矢量字形,上色、Write、TransformMatchingShapes 这些用法一样。区别在三处:排版引擎(LaTeX 和 Typst,本地要装的东西不一样)、写法(反斜杠加大括号,和函数式写法)、怎么取公式的一部分(按位置,和按名字)。MathTypst 是 Manim Community 0.21.0(2026 年 8 月 10 日发布)新加的,MathTex 没有被替代,旧代码照常跑。

下面把两种写法并排放,顺带记下我们对照时踩到的几个坑。

先看一张表

MathTex MathTypst
排版引擎 LaTeX Typst
本地要装 TeX Live 或 MiKTeX,动辄几个 G pip install "manim[typst]",不用装 LaTeX
Python 字符串 反斜杠多,要加 r 前缀或者每个反斜杠写两遍 基本没有反斜杠
取公式的一部分 {{ }} 拆开后按序号取,或按子串匹配 {{ … : 名字 }} 起名,select("名字") 取
网上的教程和示例 绝大多数用它 刚出来,还很少

同一个公式,两种写法

左边是传给 MathTex 的 LaTeX,右边是传给 MathTypst 的 Typst:

公式 MathTex(r"…") MathTypst("…")
求根公式 x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a} x = (-b plus.minus sqrt(b^2 - 4 a c))/(2 a)
求和 \sum_{k=1}^{n} k = \frac{n(n+1)}{2} sum_(k=1)^n k = (n(n+1))/2
定积分 \int_0^1 x^2 \, dx = \frac{1}{3} integral_0^1 x^2 dif x = 1/3
矩阵 \begin{pmatrix} a & b \\ c & d \end{pmatrix} mat(a, b; c, d)
根号、希腊字母、无穷 \sqrt[3]{x} + \alpha + \infty root(3, x) + alpha + oo
欧拉公式 e^{i\pi} + 1 = 0 e^(i pi) + 1 = 0

这六组我们两边各渲了一遍,拆出来的字形数量完全一样(求根公式都是 16 个,矩阵都是 6 个),做动画时按字形数对应的写法不用改。

换过来要记住的规则不多:

  • 分数用 /,分子分母不止一项就加圆括号:(n(n+1))/2
  • 上下标里有多个字符用圆括号,不用大括号:e^(i pi)、sum_(k=1)^n
  • 希腊字母、运算符直接写名字:alpha、pi、plus.minus、dots.c、integral,微分的 d 写 dif
  • 矩阵分号换行、逗号分列:mat(a, b; c, d)
  • 公式里夹中文用英文双引号包起来:"面积" = pi r^2

最容易踩的一个坑:字母连写。 LaTeX 里 4ac 就是 4 乘 a 乘 c;Typst 会把连在一起的多个字母当成一个变量名,MathTypst("4ac") 直接报 unknown variable: ac。要写成 4 a c,字母之间留空格。上面求根公式里的 4 a c、2 a 就是这么来的。

取公式的一部分:一个按位置,一个按名字

把勾股定理左边标蓝、右边标黄,MathTex 这样写:

eq = MathTex(r"{{a^2 + b^2}} = {{c^2}}")
eq[0].set_color(BLUE)    # a² + b²
eq[2].set_color(YELLOW)  # c²,中间的 = 占了 eq[1]

{{ }} 把字符串拆成三段:a² + b²、=、c²,按序号取。也可以用 eq.set_color_by_tex("c^2", YELLOW) 按子串找,但要注意一个细节:双花括号里别留空格。写成 {{ c^2 }} 的话,拆出来的那一段是带空格的 " c^2 ",set_color_by_tex("c^2", …) 就匹配不上,不报错,但也没有上色。我们在 0.21.0 里对照试过,去掉空格就正常了。

MathTypst 换成给每一组起名字:

eq = MathTypst("{{ a^2 + b^2 : lhs }} = {{ c^2 : rhs }}")
eq.select("lhs").set_color(BLUE)
eq.select("rhs").set_color(YELLOW)

空格随便加,不影响。按名字取的好处在公式改动时最明显:在前面再插一组 {{ x : pre }} +,MathTex 那边的序号全部要往后挪,MathTypst 这边 select("lhs") 取到的还是 a² + b² 那 5 个字形,代码不用动。

不起名字也行,但编号规则容易搞错:没名字的组只在没名字的那几组里从 0 数起。MathTypst("{{ a^2 + b^2 : lhs }} = {{ c^2 }}") 里,c² 要用 select(0) 取;写 select(1) 会报

IndexError: Group index 1 out of range. Available labels: ['lhs', '_grp-0']

所以我们的习惯是每组都起名字。

大号符号放进分组:两边表现不一样

求和号、分数这类大符号,放进 MathTypst 的 {{ }} 以后会被排成行内的小号样式:求和的上下限挪到右边,分数也缩小。我们量了一下,sum_(k=1)^n k = (n(n+1))/2 不分组时整条公式高 1.29,两边各包一组以后只剩 0.74。MathTex 同样分两组,高度前后都是 1.38,不受影响。

所以公式里有大号求和、积分或分数,又要分开上色时,目前要么用 MathTex,要么 MathTypst 那条就不分组、整条一起上色。a² + b²、e^(iπ) 这类普通的项分组没有影响。

能不能混着用

能。两者都是矢量字形组,TransformMatchingShapes 在 MathTex 和 MathTypst 之间也能直接用。下面这段先用 MathTex 写出勾股定理,再变成 MathTypst 版,我们在 0.21.0 里渲出来正常:

from manim import *


class MixedTexTypst(Scene):
    def construct(self):
        old = MathTex(r"{{a^2 + b^2}} = {{c^2}}", font_size=96)
        old[0].set_color(BLUE)
        old[2].set_color(YELLOW)

        new = MathTypst("{{ a^2 + b^2 : lhs }} = {{ c^2 : rhs }}", font_size=96)
        new.select("lhs").set_color(BLUE)
        new.select("rhs").set_color(YELLOW)

        self.play(Write(old))
        self.play(TransformMatchingShapes(old, new))
        self.play(Circumscribe(new.select("rhs"), color=YELLOW))
        self.wait(0.5)

也就是说,已有的 MathTex 项目不用整体迁移,新写的公式用 MathTypst 就行。

该用哪个

  • 已经有 MathTex 代码、或者正跟着网上的教程学:继续用 MathTex,0.21 里照常跑,教程里的写法都能直接对上。
  • 新写公式、不想装 LaTeX、公式经常要改、要按名字拆开做动画:MathTypst 更省事。
  • 大号求和、积分、分数要分组上色:目前 MathTex 更稳,原因见上一节。

不想装环境怎么试

本地用 MathTypst 只要 pip install "manim[typst]"。连 Python 也不想装的话,极坐标⋅XYZ 的网页工作区(jizuobiao.xyz/workspace)已经是 Manim 0.21.0,MathTex 和 MathTypst 都能直接写。第一次用到 Typst 时要下载约 13MB 的编译器,之后走浏览器缓存。工作区里的 AI 助手默认还是用 MathTex 写公式,想让它用 Typst,在提示词里说「用 MathTypst」。手机 App 里没有 Typst 编译器,这类代码要在电脑网页上跑。

MathTypst 的完整上手步骤和更多示例,见极坐标⋅XYZ 的这篇:Manim 0.21 的 Typst 公式怎么用?不装 LaTeX,在浏览器里写 MathTypst。

常见问题

Q:升级到 0.21 以后,MathTex 的旧代码要改吗?
A:不用改。MathTex 照常能用,MathTypst 是新增的一个选择。

Q:MathTypst 能写中文吗?
A:能,用英文双引号包起来:MathTypst("\"面积\" = pi r^2")。普通文字用 Typst 类,中文直接写,公式放在 $…$ 里。

Q:Typst 的完整符号表在哪查?
A:Typst 官方文档的数学部分:typst.app/docs/reference/math/ 。


来源:极坐标⋅XYZ(jizuobiao.xyz)。代码在 Manim Community 0.21.0 桌面版(typst 0.15.0)里验证,2026 年 9 月 27 日。Manim 0.21.0 的发布时间与接口以 Manim Community 官方文档为准。