Manim 0.21 的 Typst 公式怎么用?不装 LaTeX,在浏览器里写 MathTypst

2026 年 9 月 26 日 · 极坐标⋅XYZ

Manim 0.21 的 Typst 公式怎么用?不装 LaTeX,在浏览器里写 MathTypst

Manim Community 在 0.21.0 里加了两个新类,Typst 和 MathTypst,公式改用 Typst 排版,不再依赖 LaTeX。分数写成 (a+b)/2,求和写成 sum_(k=1)^n,比 \frac、\sum_{k=1}^{n} 短一截;公式里用 {{ … : 名字 }} 圈出来的部分,还能按名字取出来单独上色、单独做动画。

我们 9 月 26 日把极坐标⋅XYZ 工作区里的 Manim 升到了 0.21.0,Typst 这套一起接进来了。打开网页就能写,电脑上不用装 Python,也不用装 LaTeX 或 Typst。下面的例子都是我们在工作区里实际跑过的,代码块上面的「在工作区中打开」点一下就能跑。

一行 MathTypst 源码 MathTypst("{{ e^(i pi) : lhs }} + 1 = {{ 0 : rhs }}") 渲染成欧拉公式,e 的 iπ 次方标成蓝色、0 标成黄色,Manim 0.21 渲染

先跑一个:勾股定理,左边蓝、右边黄

我们在工作区更新日志里放的示例提示词是「用 MathTypst 写勾股定理,a² + b² 标蓝、c² 标黄,逐个写出来」。手写出来是这样:

from manim import *


class PythagorasTypst(Scene):
    def construct(self):
        title = Typst("勾股定理 · *Typst* 排版", font_size=40).to_edge(UP)
        eq = MathTypst("{{ a^2 + b^2 : lhs }} {{ = : eq }} {{ c^2 : rhs }}", font_size=96)
        eq.select("lhs").set_color(BLUE)
        eq.select("rhs").set_color(YELLOW)

        self.play(FadeIn(title))
        for part in ("lhs", "eq", "rhs"):
            self.play(Write(eq.select(part)))
        self.play(Circumscribe(eq.select("rhs"), color=YELLOW))
        self.wait()

MathTypst 里那三对 {{ }} 各起了一个名字:lhs、eq、rhs。之后 eq.select("lhs") 拿到的就是 a² + b² 这五个字形,想上色、想先写它后写别的,都对着这个名字操作。标题用的是 Typst,普通文字里夹 *…* 就是加粗,和 Markdown 差不多。

MathTypst 的 {{ }} 分组示意:a² + b² 被 select("lhs") 取出、标成蓝色,可以单独上色和单独 Write;c² 被 select("rhs") 取出、标成黄色并用 Circumscribe 圈出来

有一处我们第一次写错了。没起名字的组,编号只在没名字的那几组里从 0 数起,跟它在整条公式里排第几没关系。比如 "{{ a^2 + b^2 : lhs }} = {{ c^2 }}",c² 要用 select(0) 取,写 select(1) 会直接报「Group index 1 out of range」。所以我们干脆每组都起名字,读代码的时候也清楚。

还有一处是做封面时撞上的:求和号、分数这类大符号放进 {{ }} 以后,会被排成行内的小号样式,求和的上下限挪到右边,分数也缩小了,外面再套 display() 也没用。我们在工作区和桌面版 0.21.0 里各试了一遍,结果一样。现在的办法是这种公式不分组,整条一起上色;a² + b²、e^(iπ) 这类普通的项分组没有影响。

这段在工作区里 480p 渲染,90 帧,我们这台电脑上一秒半左右出来。

Typst 写公式,到底省在哪

没写过 Typst 的话,把下面这张表扫一眼就大概有数了。左边是以前 MathTex 里的 LaTeX 写法,中间是同一个公式的 Typst 写法,右边是中间那行在 Manim 0.21 里渲出来的结果。

同一个公式的 LaTeX 写法和 Typst 写法对照:求根公式、求和、积分、矩阵四行,右列是 Typst 源码在 Manim 0.21 里渲染的结果

反斜杠和大括号少了很多。Python 字符串里写 LaTeX,要么记得加 r 前缀,要么每个反斜杠写两遍,漏一个就报错,这个麻烦在 Typst 里基本没有了。矩阵从 \begin{pmatrix} … \end{pmatrix} 变成 mat(a, b; c, d),分号换行、逗号分列。

几个常用写法记一下,够应付大部分中学和大学公式:

  • 分数 a/b,分子分母不止一项就加括号,(n(n+1))/2
  • 上下标 x^2、a_n,多个字符加圆括号,e^(i pi)、sum_(k=1)^n
  • 根号 sqrt(x),n 次根 root(3, x)
  • 希腊字母直接写名字 alpha、pi、theta
  • 无穷 oo,正负号 plus.minus,省略号 dots.c,积分 integral,微分的 d 写 dif
  • 公式里要夹中文,用引号包起来,"面积" = pi r^2

完整的符号表查 Typst 官方文档的数学部分。

再跑一个:公式变形,从 1+2+…+n 到求和公式

MathTypst 和 MathTex 一样是一组矢量字形,TransformMatchingShapes、ReplacementTransform 这些照常能用。下面这段先写出 1 + 2 + ⋯ + n,再变成求和公式:

from manim import *


class GaussSum(Scene):
    def construct(self):
        text = Typst("高斯求和:从 1 加到 $n$,首尾两两配对", font_size=36).to_edge(UP)
        f1 = MathTypst("1 + 2 + dots.c + n", font_size=72)
        f2 = MathTypst("sum_(k=1)^n k = (n(n+1))/2", font_size=72)

        self.play(Write(text))
        self.play(Write(f1))
        self.wait(0.5)
        self.play(TransformMatchingShapes(f1, f2))
        self.play(Indicate(f2))
        self.wait()

标题那行是 Typst,里面用 $n$ 夹了一个行内公式,中文和公式混排不用拆成两个对象去对齐。工作区自带中文字体,中文直接能显示。

极坐标⋅XYZ 工作区里运行 GaussSum 场景:上面是 MathTypst 代码,下面预览区显示「高斯求和:从 1 加到 n,首尾两两配对」和求和公式,状态栏写着 97 帧、2289ms

第一次用要多等一会儿

Typst 的编译器和它自带的那套字体加起来约 13MB。大多数人写 Manim 用不到 Typst,所以这部分没放进工作区的启动流程,要用的时候才下。

具体是这样的:编辑器里一出现 Typst 或 MathTypst,停手不到一秒,工作区就在后台开始下载,你还在改代码的工夫多半已经下完了。要是点运行时还没下完,预览区会显示「正在下载 Typst 编译器 4.3 / 13.1 MB」这样的进度,不想等可以点停止。下过一次之后走浏览器缓存,再用就跟 MathTex 一样快。

工作区预览区里的下载进度:正在下载 Typst 编译器 4.3 / 13.1 MB(仅首次,之后走缓存),下面有「停止渲染」按钮

我们把网速限到每秒 1.2MB 左右试过,十三四秒下完。

它凭什么和桌面版一样

工作区里的 Typst 编译器,是用 Typst 官方的代码编成能在网页里跑的版本,和桌面上 pip install "manim[typst]" 装的是同一版编译器(0.15)。我们拿同一批公式在两边各渲一遍对过,排出来的公式和位置坐标都一样。

这对你的好处是,在网页里写好的 Typst 代码,拿回自己电脑上照样能跑,而且本地只需要 pip install "manim[typst]",不用再装动辄几个 G 的 TeX Live 或 MiKTeX。以前不少人学 Manim 就卡在装 LaTeX 这一步,公式改用 Typst 写,这一步可以直接跳过。

目前用不了的

  • #import "@preview/…" 引 Typst 在线包暂时不支持,要联网下载包,我们还没做。
  • 极坐标⋅XYZ 的手机 App 也升到了 0.21.0,但里面没有 Typst 编译器,这类代码要在电脑网页上的工作区跑。
  • 工作区里的 AI 助手默认还是用 MathTex 写公式,毕竟不用额外下载。想让它用 Typst,就在提示词里直接说「用 MathTypst」。

想系统学,从哪开始

MathTex 并没有被替代,网上绝大多数 Manim 教程和示例用的还是它,工作区里照常能用。我们的建议是两样都认识,自己写新东西时哪个顺手用哪个。

极坐标⋅XYZ 教程第 10 课「文本与公式」讲的是 MathTex:公式分组上色、多行对齐、TransformMatchingTex 做公式变形。这些学会了,换成 MathTypst 只是换一种写法,拆公式、做变形的思路完全一样。教程的代码都在浏览器里能跑,边看视频边改,第 1 课和第 4 课免费。

常见问题

Q:Manim 0.21 是什么时候发布的,除了 Typst 还有什么变化? A:Manim Community 0.21.0 在 2026 年 8 月 10 日发布,Typst / MathTypst 是这一版最大的新功能。另外官方的 Cairo 渲染器提速明显,Code 类的配色改成完全跟着 Pygments 主题走。完整清单看官方更新日志。

Q:本地要用 MathTypst,需要装什么? A:pip install "manim[typst]",或者单独 pip install typst,不需要装 LaTeX。不想装环境,就直接在工作区里写。

Q:升级到 0.21 以后,原来的 MathTex 代码还能跑吗? A:能。工作区升级时我们把站里 153 个可运行的示例全跑了一遍,都正常,渲出来的帧数和升级前一样。

Q:MathTex 也能用 {{ }} 拆公式,MathTypst 的有什么不一样? A:MathTex 的 {{ }} 拆出来以后,通常按序号或者按 LaTeX 子串去找对应部分。MathTypst 可以给每一组起名字,用 select("lhs") 按名字取,公式改长了、组的顺序变了,代码也不用跟着改序号。

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


想马上试试,打开工作区,把上面任意一段代码贴进去点运行;在本站看这篇的话,直接点代码块上方的「在工作区中打开」。想把公式动画从头学一遍,可以从教程第 1 课开始。

来源:极坐标⋅XYZ(jizuobiao.xyz),2026 年 9 月 26 日更新。Manim 0.21.0 的发布时间和 Typst 接口以 Manim Community 官方文档为准,查询日期 2026 年 9 月 26 日。