MathTex 和 MathTypst 有什么区别?同一个公式的两种写法对照(Manim 0.21)
Posted on
2026-09-27 16:48
云南老表
阅读(6)
评论(0)
收藏
举报
利益相关:本文作者与极坐标⋅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 官方文档为准。
浙公网安备 33010602011771号