首页 / 文档中心 / 排坑

Manim 中文渲染与 LaTeX 公式环境配置(含中文公式完整方案)

发布于 2026-11-02 · 排坑系列 · 约 4 分钟读完 · 中文正文 + English TL;DR
English TL;DR

Chinese text in Manim splits into two separate problems. For plain text, Text() renders through Pango, so any font installed on your OS works: pass font="Microsoft YaHei" / "SimHei" / "Noto Sans CJK SC" and check font_manager if glyphs come out as boxes. For Chinese inside formulas, MathTex compiles through LaTeX, where CJK characters fail unless the ctex package is loaded. The fix is a custom TexTemplate: either TexTemplate.from_package_once("ctex") or add_to_preamble(r"\usepackage{ctex}")... in practice, add_to_preamble(r"\usepackage[UTF8]{ctex}") on a default template, then pass tex_template= to MathTex. This guide covers MiKTeX vs TeX Live package installation, dvisvgm requirements, per-OS font names, mixing Text and MathTex on one line, and a minimal test scene that isolates each failure layer.

先分清两个"中文问题"

症状走的通道解决方向
Text("中文") 显示方块/豆腐块Pango + 系统字体指定已安装的中文字体
MathTex 里含中文报错LaTeX 编译ctex 宏包 + 自定义 TexTemplate

两条通道互不影响,排查时先用下面的最小场景把问题隔离到其中一层。

一、Text 中文:指定字体就行

Text 走 Pango 渲染,系统里装了什么字体就能用什么:

from manim import *

class CnText(Scene):
    def construct(self):
        t1 = Text("中文正常显示", font="Microsoft YaHei", font_size=44)
        t2 = Text("黑体粗字", font="SimHei", font_size=44).next_to(t1, DOWN)
        self.play(Write(t1), Write(t2))
        self.wait()

各平台可用字体名(必须是系统里真实存在的):

  • Windows:Microsoft YaHei(微软雅黑)、SimHei(黑体)、KaiTi(楷体)、SimSun(宋体)
  • macOS:PingFang SC、Heiti SC、Songti SC
  • Linux:Noto Sans CJK SC(装 fonts-noto-cjk)

显示成方块 = 系统没有这个字体或名字写错。用 manim --config 或在 Python 里 import manimpango; print([f for f in manimpango.list_fonts() if 'YaHei' in f or 'Hei' in f]) 查看真实可用字体名。

二、MathTex 中文公式:ctex 方案

LaTeX 默认不支持中文。MathTex(r"\text{面积}=\pi r^2") 会直接报错。标准解法是让公式模板加载 ctex 宏包:

from manim import *

# 方案 A: 让整个文档用 ctex 文档类
cn_template = TexTemplate.from_package_once("ctex")

# 方案 B: 默认模板的导言区加 ctex
cn_template = TexTemplate()
cn_template.add_to_preamble(r"\usepackage[UTF8]{ctex}")

class CnFormula(Scene):
    def construct(self):
        f = MathTex(r"\text{圆的面积} = \pi r^2", font_size=60,
                    tex_template=cn_template)
        self.play(Write(f))
        self.wait()

中文必须包在 \text{} 里——数学模式只接受公式符号,文字(含中文)都要进 text 框。

首次渲染会触发 ctex 宏包下载:MiKTeX 弹窗选"安装";TeX Live 用户确保装过 texlive-lang-chinese;macOS 的 MacTeX 全量版自带。

三、中英混排一行:Text 与 MathTex 组队

大多数教学场景更推荐"中文用 Text、变量公式用 MathTex、VGroup 拼接"的写法,渲染最稳、不用碰 LaTeX 中文:

class Mixed(Scene):
    def construct(self):
        cn = Text("勾股定理:", font="Microsoft YaHei", font_size=44)
        math = MathTex("a^2+b^2=c^2", font_size=60)
        line = VGroup(cn, math).arrange(RIGHT, buff=0.25)
        self.play(Write(line))
        self.wait()
生产建议:能用方案"Text + MathTex 拼接"就不上 ctex——依赖更少、渲染更快、字体更可控。ctex 方案留给必须整段中文公式排版的场合。

四、排查清单(按顺序执行)

  1. latex --version、dvisvgm -v 有输出 → LaTeX 层 OK(没有见安装报错全解)
  2. 渲染纯英文 MathTex("x^2") 成功 → 模板默认可用
  3. 渲染 Text("中文") 成功 → 字体层 OK
  4. 再上 ctex 模板渲染中文公式 → 四层全部打通

常见残留问题

  • ctex 报错 fontset 未找到:加选项 \usepackage[UTF8, fontset=windows]{ctex}(macOS 用 fontset=mac,Linux 用 fontset=fandol)。
  • 公式里中文字体太丑:ctex 的 fontset 参数换成 windows/mac 后会调用系统字体,观感立刻正常。
  • 部分中文仍报错:确认 .py 文件本身保存为 UTF-8(Windows 记事本另存时选 UTF-8)。