Manim如何在数学公式中完美显示中文?

很多刚开始学习 ManimCE 的同学,在兴致勃勃地想要制作中文数学动画时,都会遇到同一个"拦路虎":一旦在公式里输入中文,程序直接报错,红一片!

比如你想写"勾股定理",直接这样写:

python 复制代码
# 错误示范 ❌
tex = MathTex("勾股定理:a^2+b^2=c^2")

运行后,你会得到一堆 LaTeX 编译错误。这是因为默认的 LaTeX 模板是不支持中文字符的。

别担心,今天我们就来彻底解决这个问题,教会大家如何在 MathTex、Tex 以及 Title 组件中优雅地显示中文。

1. 为什么会出现报错?

Manim 底层使用 LaTeX 来渲染公式。

标准的 LaTeX 环境主要针对英文和数学符号设计,如果没有加载特定的中文宏包(如 ctex),它就无法识别汉字,从而导致编译失败。

所以,核心思路就是:告诉 Manim 使用支持中文的 LaTeX 模板。

2. 三大组件的中文显示方案

在 ManimCE 中,常用的可以显示数学公式的三个组件是 MathTex、Tex 和 Title。

它们显示中文的设置略有不同,我们逐个来看。

2.1. MathTex 组件

MathTex 主要用于数学公式。要显示中文,只需要添加一个关键参数:tex_template。

  • 解决方法 :设置 tex_template=TexTemplateLibrary.ctex
  • 代码示例:
python 复制代码
# 正确示范 ✅
tex02 = MathTex(
    r"\text{勾股定理}: a^2+b^2=c^2",
    tex_template=TexTemplateLibrary.ctex,  # 关键!
)

注意:中文最好包裹在 \text{} 中,这样 LaTeX 才知道这是文本而不是数学变量。

2.2. Tex 组件

Tex 组件通常用于包含更多文本内容的段落。对于中文显示,它比 MathTex 多了一个要求。

  • 解决方法 :需要同时设置 tex_template 和 tex_environment。
  • 关键参数 :
    1. tex_template=TexTemplateLibrary.ctex
    2. tex_environment="align*"
  • 代码示例:
python 复制代码
# 正确示范 ✅
tex01 = Tex(
    r"\text{勾股定理}: a^2+b^2=c^2",
    tex_environment="align*",              # 关键!
    tex_template=TexTemplateLibrary.ctex,  # 关键!
)

2.3. Title 组件

Title 组件用于生成标题。很多同学不知道,其实 Title 底层是继承自 Tex 组件的。

  • 解决方法 :既然它继承自 Tex,那么它显示中文的要求也与 Tex 完全一致。
  • 关键参数 :同样需要 tex_environment="align*" 和 tex_template=TexTemplateLibrary.ctex。
  • 代码示例:
python 复制代码
# 正确示范 ✅
title = Title(
    r"\text{勾股定理}: a^2+b^2=c^2",
    tex_environment="align*",              # 关键!
    tex_template=TexTemplateLibrary.ctex,  # 关键!
)

3. 完整代码演示

为了让大家能够直接运行成功,我整理了一份完整的代码示例。你可以直接复制到你的编辑器中尝试。

python 复制代码
from manim import *

class Keshihua(Scene):
    def construct(self):
        # 1. Tex 组件显示中文
        # 需要两个参数:tex_environment 和 tex_template
        tex01 = Tex(
            r"\text{勾股定理}: a^2+b^2=c^2",
            tex_environment="align*",
            tex_template=TexTemplateLibrary.ctex,
        ).set_color_by_gradient(RED, GREEN)
        self.play(Write(tex01))

        # 2. MathTex 组件显示中文
        # 只需要一个参数:tex_template
        tex02 = MathTex(
            r"\text{勾股定理}: a^2+b^2=c^2",
            tex_template=TexTemplateLibrary.ctex,
        ).set_color_by_gradient(YELLOW, BLUE)
        tex02.next_to(tex01, DOWN)
        self.play(Write(tex02))

        # 3. Title 组件显示中文
        # 因为继承自 Tex,所以参数要求与 Tex 相同
        title = Title(
            r"\text{勾股定理}: a^2+b^2=c^2",
            tex_environment="align*",
            tex_template=TexTemplateLibrary.ctex,
        )
        self.play(Write(title))

        self.wait()

4. 总结与建议

为了方便记忆,我把今天的重点整理成了一个小表格:

组件类型 是否需要中文模板? 是否需要指定环境? 关键参数设置
MathTex ✅ 是 ❌ 否 tex_template=TexTemplateLibrary.ctex
Tex ✅ 是 ✅ 是 tex_template=..., tex_environment="align*"
Title ✅ 是 ✅ 是 同 Tex 组件

小贴士:

  1. 环境配置 :确保你的电脑已经安装了 LaTeX 环境(如 TeX Live 或 MiKTeX),并且安装了 ctex 宏包。Manim 调用的是系统本地的 LaTeX 编译器。
  2. 转义字符 :在 Python 字符串中,记得在公式前加 r(如 r"\text{...}"),防止反斜杠被转义。
  3. 文本包裹 :尽量用 \text{} 包裹中文,这样排版会更规范。

希望这篇教程能帮你扫清障碍,做出更漂亮的中文数学动画!

相关推荐
用户9562562542911 小时前
跟做:Firecrawl 单页转 Markdown 再丢进沙箱总结
python·api
威哥爱编程11 小时前
模拟面试智能体开发实战 02:回答等半分钟,谁还愿意练?把服务端和流式输出搭起来
python·agent·harmonyos
威哥爱编程12 小时前
模拟面试智能体开发实战 01:面试挂了都不知道挂在哪?用 Python 给自己造一个随叫随到的 AI 面试官
python·agent·harmonyos
2601_9679801112 小时前
Python行情API量化 02:顺序拉 20 要 2 秒?并发批量把时间压到 0.5 秒
python·api·限流·并发·量化
伞伞悦读12 小时前
【第81期】特征缩放怎么选:标准化、MinMax 与 Robust 的原理、泄漏对照和完整实验
人工智能·python·深度学习·机器学习
新*13 小时前
从一段 WebSocket 代码聊开:bytes 不是 zlib、binaryType 决定一切,15MB 大消息的零拷贝优化
javascript·python·websocket·性能优化·blob·zlib·arraybuffer
卷无止境15 小时前
mathmodel-figure-templates 以及两个上手案例
后端·python
锋行天下15 小时前
服务器 Python 2.7 装不了 langgraph-cli?用本地生成 Dockerfile 曲线救国
人工智能·后端·python
一条大祥脚15 小时前
深入理解 PyTorch FlexAttention:从 Score Mod 到 Mask Mod 的稀疏加速之道
人工智能·pytorch·python·注意力机制·flex attention·可编程注意力
2601_9679801116 小时前
Python自动化办公:模块、库与样式调整教程
python·excel·自动化办公·openpyxl·样式调整