OpenMontage 中的 ManimCE LaTeX 渲染全指南:MathTex/Tex、公式分段着色与数学动画实战
【免费下载链接】OpenMontageWorld's first open-source, agentic video production system. 12 production pipelines, 100+ tools, 700+ agent skill and production-knowledge files. Turn your AI coding assistant into a full video production studio.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMontage
数学公式动画是科普类与教育类视频的核心表现力来源。在 OpenMontage 这套开源、面向 Agent 的视频生产系统中,math_animate 工具负责把任意 LaTeX 数学表达式渲染成可播出的动画素材,而其底层能力规范来自
.agents/skills/manimce-best-practices技能包。本文以其中 rules/latex.md 为骨架,系统讲解 Manim Community(ManimCE)中 MathTex 与 Tex 的渲染机制、逐段着色、自定义宏包、对齐与字号控制等完整技法,并结合仓库中的可运行示例与场景约定,帮助你直接写出可渲染、可动效、可上色的公式动画代码。
在项目中的位置:一条从"公式"到"成片"的链路
在深入语法之前,先建立全局观。OpenMontage 中 ManimCE 并不是孤立运行的:
- 技能定义位于 .agents/skills/manimce-best-practices/SKILL.md,其元数据规定:当用户提到 "manim"、"MathTex"、"Create()",或代码中出现
from manim import *时,Agent 应加载该技能包并按 rules/latex.md 等 23 个规则文件撰写场景代码。 - 工具层在 tools/graphics/math_animate.py 中声明
provider = "manim"、依赖cmd:manim,并把agent_skills = ["manimce-best-practices", "manim-composer"]作为生成场景代码时强制挂载的技能上下文——也就是说,Agent 写的每段 MathTex 代码都应以本规则为依据。 - 生成后的动画还要服从 skills/creative/manim-usage.md 中定义的 OpenMontage 出片约定(
-qh渲染、深色背景、语义化配色、单场景单概念等),最终并入视频流水线。
因此,本文讲解的 LaTeX 语法不是学术笔记,而是 OpenMontage 数学动画生产链路中"最容易被忽略、也最容易写坏"的一环——公式渲染的错误往往是整段场景重渲染的根因。
前置:LaTeX 是 Manim 数学排版的地基
Manim 本身不做数学排版,它调用系统 LaTeX(实际底层经过latex→dvipng或dvisvgm,由 manimpango 配合排版)来渲染数学表达式与格式化文本。这条规则文档开宗明义地指出:
Manim uses LaTeX to render mathematical expressions and formatted text.
这带来三个直接推论,也是后面所有实践的出发点:
- 公式文本不是普通字符串,它是交给 TeX 引擎解析的源码,因此必须使用原始字符串
r"...",避免 Python 把\alpha、\frac中的反斜杠提前转义; - 是否处于数学模式决定你写
E = mc^2还是$E = mc^2$——这正是 MathTex 与 Tex 的关键区别; - 机器必须装有可用的 LaTeX 发行版(如 TeX Live / MiKTeX)。在 OpenMontage 的 math_animate.py 中,前置检查失败时会提示用户先执行
pip install manim与manim checkhealth。
MathTex vs Tex:两种数学文本对象
ManimCE 提供两个常用数学文本类,规则文档用一个对照表式的描述给出定位:
- MathTex:自动将内容包进数学模式(多段文本落在
align*对齐环境中),写纯公式时无需手动加$...$; - Tex:更底层的原始 LaTeX,模式由你自己控制,适合"正文中夹杂公式"或需要完整控制环境的场景。
from manim import * class LaTeXComparison(Scene): def construct(self): # MathTex - auto math mode math = MathTex(r"E = mc^2") # Tex - need explicit math delimiters tex = Tex(r"$E = mc^2$") # Both render the same VGroup(math, tex).arrange(DOWN) self.add(math, tex)两者的关键差异在仓库技能文档 SKILL.md 的对照表中被再次强调——这是 ManimCE 与 3b1b/ManimGL 最常见混淆点:ManimCE 用MathTex(r"\pi"),而 ManimGL 写Tex(R"\pi")。在 OpenMontage 的场景代码里统一遵循 ManimCE 约定,from manim import *由 math_animate.py 在缺省时自动补写。
MathTex 基础表达式
规则文档给出了覆盖大多数数学场景的入门集。逐一拆解每个表达式背后的语义:
class MathTexExample(Scene): def construct(self): # Simple equation eq1 = MathTex(r"x^2 + y^2 = z^2") # Fractions eq2 = MathTex(r"\frac{a}{b}") # Square roots eq3 = MathTex(r"\sqrt{2}") # Greek letters eq4 = MathTex(r"\alpha + \beta = \gamma") # Integrals eq5 = MathTex(r"\int_0^\infty e^{-x} dx") # Summations eq6 = MathTex(r"\sum_{n=1}^{\infty} \frac{1}{n^2}") equations = VGroup(eq1, eq2, eq3, eq4, eq5, eq6).arrange_in_grid(2, 3) self.add(equations)要点:
- 上标
^与下标_后跟单个字符无需花括号,多个字符必须加{},例如e^{-x}、\sum_{n=1}^{\infty}; - 积分上下限
\int_0^\infty、求和上下限\sum_{n=1}^{\infty}都是同一套上/下标机制在不同运算符上的体现; \frac{分子}{分母}是分数最常用的排版命令,\sqrt{n}是根式;- 希腊字母直接以反斜杠命令书写,小写
\alpha与大写\Gamma分开记忆即可。
同一规则文件下,仓库的完整示例 math_visualization.py 进一步演示了这类基础表达式如何进入动画:Write逐笔写入、SurroundingRectangle给结论加框、LaggedStart依次揭示多段结论,公式之间用.to_edge(UP)/.next_to(...)排版。
公式着色:把观众的注意力引到关键项
数学动画最有价值的动作之一是"高亮某个符号/某项"。规则文档给出四条层层递进的策略。
方式一:set_color_by_tex(字符串匹配上色)
最简单直接,按文本子串着色。注意着色目标是 MathTex 解析后拆分出的独立SingleStringMathTex子对象,按你传入的字符串片段匹配:
class ColoredEquation(Scene): def construct(self): eq = MathTex(r"e^{i\pi} + 1 = 0") eq.set_color_by_tex("e", RED) eq.set_color_by_tex(r"\pi", BLUE) eq.set_color_by_tex("i", GREEN) self.add(eq)这里 "e"、"i" 与\pi会被分别染成红、绿、蓝,正好演绎欧拉恒等式e^{iπ} + 1 = 0中每个角色的含义。
方式二:substrings_to_isolate(先隔离再精确着色)
若同一个子串在公式中多次出现(例如多个 "x"),ManimCE 默认不会把每个字符都拆成独立可寻址对象,直接set_color_by_tex可能命中不了预期片段。规则文档的推荐做法是在构造时就显式声明要隔离的子串:
class IsolatedColoring(Scene): def construct(self): eq = MathTex( r"e^x = x^0 + x^1 + \frac{1}{2}x^2 + \cdots", substrings_to_isolate=["x"] ) eq.set_color_by_tex("x", YELLOW) self.add(eq)substrings_to_isolate会强制把每个 "x" 拆为独立可索引对象,随后set_color_by_tex("x", ...)即可稳定命中全部 x——这对幂级数展开、泰勒级数这类"同一符号反复出现"的场景至关重要。
方式三:构造期颜色映射tex_to_color_map
除了规则文档的"先建后染",仓库示例 math_visualization.py 还展示了一种更声明式的等价写法——直接在构造参数里传字典映射,适合在生成代码时就固定语义配色:
example = MathTex( r"\frac{d}{dx}[\sin(x^2)] = \cos(x^2) \cdot 2x", tex_to_color_map={ r"\sin": BLUE, r"\cos": BLUE, r"x^2": YELLOW, r"2x": YELLOW, }, font_size=44 )tex_to_color_map在 MathTex/Tex 构造阶段完成匹配隔离与着色两步,可读性更高。OpenMontage 在 manim-usage.md 中进一步将这种"语义着色"制度化:黄色 = 待求解变量、红色 = 矩阵/算子、青色 = 特征向量/结果、蓝色 = 已知常数,且要求避免红绿唯一区分(兼顾色弱观众)。
方式四:index_labels调试与直接索引
当你要对公式某个"位置"上色时,最可靠的办法是先弄清对象的索引结构。规则文档提供了两个配套手段。
先给对象贴上索引标签,让每个可访问片段显示自己的编号,方便肉眼确认 "哪一段是哪个下标":
class DebugLabels(Scene): def construct(self): eq = MathTex(r"\frac{a}{b}") # Add index labels to see which index is which part self.add(index_labels(eq[0])) self.add(eq)确认下标后,即可直接按下标改颜色。注意 ManimCE 的索引是二维的:第一层是 MathTex 拆分出的"段",第二层是段内按字符拆出的更小子对象:
eq = MathTex(r"a + b = c") eq[0][0].set_color(RED) # 'a' eq[0][2].set_color(BLUE) # 'b' eq[0][4].set_color(GREEN) # 'c'这里eq[0]是整条 "a + b = c"(未隔离时整串算一段),eq[0][k]再按字符索引:a、空格、+、空格、b……因此0/2/4分别落在 a、b、c 上。这种"隔位取字符"的写法依赖空白与运算符占位,规则文档明确提示:要精细控制时优先显式拆分或隔离,而不是赌索引位置。
多段公式:拆开写,才有动画控制权
数学动画的常见需求是"公式各部分先后出现/逐个变色"。ManimCE 的 MathTex 允许把一条公式作为多个字符串传入,每个字符串会成为一个独立子对象eq[i]:
class MultiPartEquation(Scene): def construct(self): eq = MathTex("a", "^2", "+", "b", "^2", "=", "c", "^2") eq[0].set_color(RED) # a eq[3].set_color(BLUE) # b eq[6].set_color(GREEN) # c self.play(Write(eq))此时eq[0]、eq[3]、eq[6]分别对应 a、b、c,索引一目了然,不再需要猜字符位置。仓库示例 math_visualization.py 中的ColorCodedEquation正是这种模式的进阶用法——它不仅拆段、上色,还用TransformMatchingTex完成"旧公式 → 新公式"的逐符号匹配变换,让推导过程中不变的符号(如重复的\vec{v}_1)自然过渡,这是视频推导场景最出效果的动画原语之一。
多段写法的另一大收益在tex_to_color_map失灵时依然可控:每个分段都是独立 mobject,可以单独.animate.set_color(...)做动态高亮(先写入整式、再逐段点亮),见 math_visualization.py 中TexHighlighting的E / = / m / c^2四段式教学演示。
Tex 图文混排:正文里嵌公式
数学公式往往需要和说明文字同屏。Tex 的意义正在于此——你可以在普通文本中内联$...$公式,或独占一行用$$...$$:
class MixedContent(Scene): def construct(self): # Mix text and math tex = Tex(r"The area is $A = \pi r^2$") self.play(Write(tex))这段代码会渲染出 "The area is A = πr²" 的完整一行:$A = \pi r^2$部分按数学模式排版,其余按文本模式排版。规则文档给出的选型结论是:纯数学用 MathTex,混合内容用 Tex——前者省去反复写$,后者把模式控制权还给你。
自定义 LaTeX 宏包与模板:TexTemplate
默认模板只加载了 ManimCE 的常用宏包集合(如 amsmath、amssymb 等)。当公式需要特殊字体/符号(如花体\mathscr{L}、某些扩展符号)时,就要自定义TexTemplate并向导言区追加宏包:
class CustomPackage(Scene): def construct(self): template = TexTemplate() template.add_to_preamble(r"\usepackage{mathrsfs}") eq = Tex( r"$\mathscr{L}$", tex_template=template ) self.add(eq)注意两点:
TexTemplate本身也接受tex_environment、documentclass等参数;add_to_preamble是最常用的"加一行宏包"入口;- 该模板对象可以在多个公式间复用。若整份脚本都要用某个宏包,更推荐放进项目级
manim.cfg或统一在此规则文件外封装模板,避免每个场景重复创建。从 OpenMontage 的工程化视角看,math_animate.py 是每次渲染生成独立临时工作目录(tempfile.mkdtemp(prefix="manim_")),因此"模板内联在每个场景中"比"依赖全局配置"更符合 Agent 逐场景生成、独立可渲染的代码模型。
公式对齐:多行推导的标准排版
多行推导是数学视频的常见形态。MathTex 的多段字符串配合align*环境的对齐符&与换行符\\,即可获得教科书式的等号对齐:
class AlignedEquations(Scene): def construct(self): eqs = MathTex( r"a &= b + c \\", r"d &= e + f + g \\", r"h &= i" ) self.add(eqs)&声明对齐点(这里放在每个等号前),\\声明换行。整组多行公式仍是一个 MathTex 对象,其子索引按行划分,因此之后仍可以对"某一行"甚至"某一行中的某段"独立做动画。这是规则文档推荐在推导类场景中把"整组公式当整体、按行/按段控制"的直接依据。
常用 LaTeX 数学符号速查
规则文档整理了一组高频符号速查,可直接照抄进 MathTex:
# Greek letters MathTex(r"\alpha \beta \gamma \delta \epsilon") MathTex(r"\Gamma \Delta \Theta \Lambda \Pi") # Operators MathTex(r"\times \div \pm \mp \cdot") # Relations MathTex(r"\leq \geq \neq \approx \equiv") # Arrows MathTex(r"\rightarrow \leftarrow \Rightarrow \Leftrightarrow") # Sets MathTex(r"\in \notin \subset \supset \cup \cap") # Calculus MathTex(r"\int \iint \oint \partial \nabla")按类别记忆更高效:希腊字母(小写/大写)、二元运算符、关系符、箭头(单/双、左右)、集合论符号、微积分符号。遇到未收录的符号,规则文档隐含给出通用路径——先查标准 LaTeX 命令,若标准命令缺失再考虑TexTemplate追加宏包。仓库示例 math_visualization.py 中出现的\begin{bmatrix}...\end{bmatrix}矩阵、\lim_{x \to 0}、\vec{v}_1、\lambda等,都是这一速查的实战延伸。
字号控制:font_size与scale
公式大小有两种调整途径,适用场景不同:
# Using font_size parameter eq = MathTex(r"E = mc^2", font_size=72) # Using scale eq = MathTex(r"E = mc^2").scale(2)font_size(构造参数):在 LaTeX 排版阶段就决定字号,等价于直接控制 TeX 字号,适合"一开始就知道公式要大"的场景——数值语义上与普通 mobject 的font_size一致,ManimCE 默认约为 48;.scale(factor)(事后方法):对已渲染出的整体做几何缩放,适合"先排版、后根据版面调整"的场景,也可用在动画中(如equation.animate.scale(1.5)制造强调效果)。
两者可混用:先小字号排版、动画里放大,比大字号再缩放更利于性能与视觉平滑。规则文档之外,OpenMontage 的 manim-usage.md 给出的出片约定是:最终素材以-qh(1920×1080/60fps)渲染,公式Write的run_time控制在 1.5–2.0 秒——字体够大、节奏从容,是数学动画可读性的两个硬指标。
六大最佳实践清单
将规则文档的结论与 OpenMontage 的生产经验合并,得到一套可直接执行的行为准则:
- 一律使用原始字符串
r"...":LaTeX 反斜杠命令极多,普通字符串会被 Python 转义规则破坏(\a、\t等会悄悄变质),用r"..."是零成本且必须的习惯; - 纯数学用 MathTex:自动数学模式免去到处写
$...$,代码更干净、不易漏写分隔符; - 图文混排用 Tex:正文与
$...$公式混排时,把模式控制权交给 Tex; - 为动画而拆分:会被分别动效(出现、变色、位移、变换)的部分,在构造时就拆成独立字符串参数或声明
substrings_to_isolate,避免事后靠脆弱的字符索引; - 重复元素用
substrings_to_isolate:同一符号多次出现时,构造期隔离是set_color_by_tex可靠命中的前提; - 先
index_labels后索引:不确定拆分结构时先打调试标签确认下标,再写eq[i]/eq[i][j]的着色代码。
配合仓库的技能总纲,还有一条 OpenMontage 特有的最佳实践:所有数学场景都应单场景单概念、深色背景(BLACK或#1a1a2e)、语义化配色,并让场景时长与脚本旁白对齐(见 skills/creative/manim-usage.md)。
验证与渲染:让公式代码真正跑起来
规则文档本身聚焦语法,但在 OpenMontage 的链路上,写好的场景需要经过工具与 CLI 的双重校验:
- 环境检查:先确认
manim可用(manim checkhealth),LaTeX 组件缺失是最常见的公式渲染失败源; - 渲染命令:开发期用
manim -pql scene.py MyScene低清预览,出片用-qh高清输出(ManimCE 质量标志-ql/-qm/-qh/-qk详见 SKILL.md 与 manim-usage.md 的规格表); - 工具封装:在 tools/graphics/math_animate.py 中,Agent 生成的场景会被自动补全
from manim import *,写入独立临时目录后以manim命令渲染;缺manim时工具会给出pip install manim与manim checkhealth的安装提示。
换句话说,你写的每个 MathTex 都应达到"直接粘贴进一个.py文件即可用manim渲染"的自洽标准——这正是该规则文档每个示例都给出完整Scene类的原因。
延伸阅读
- 本规则所属技能总纲:.agents/skills/manimce-best-practices/SKILL.md(含 ManimCE 与 ManimGL 差异对照、渲染质量标志、安装与常见坑)
- 配套文字排版规则:.agents/skills/manimce-best-practices/rules/text.md
- 数学可视化完整示例:.agents/skills/manimce-best-practices/examples/math_visualization.py(
ColorCodedEquation、EquationDerivation、MatrixTransformation、IntegralVisualization、TexHighlighting等 10 个可直接运行的场景) - OpenMontage 数学动画生产约定:skills/creative/manim-usage.md
- Manim 渲染工具实现:tools/graphics/math_animate.py
- 场景动画与动效相关规则:.agents/skills/manimce-best-practices/rules/animations.md、.agents/skills/manimce-best-practices/rules/creation-animations.md
【免费下载链接】OpenMontageWorld's first open-source, agentic video production system. 12 production pipelines, 100+ tools, 700+ agent skill and production-knowledge files. Turn your AI coding assistant into a full video production studio.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMontage
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考