📄 equations.md

← Vault

Equations and LaTeX Reference

Basic LaTeX

`python

eq = MathTex(r"E = mc^2")

eq = MathTex(r"f(x) &= x^2 + 2x + 1 \\ &= (x + 1)^2") # multi-line aligned

`

Always use raw strings (r"").

Step-by-Step Derivations

`python

step1 = MathTex(r"a^2 + b^2 = c^2")

step2 = MathTex(r"a^2 = c^2 - b^2")

self.play(Write(step1), run_time=1.5)

self.wait(1.5)

self.play(TransformMatchingTex(step1, step2), run_time=1.5)

`

Selective Color

`python

eq = MathTex(r"a^2", r"+", r"b^2", r"=", r"c^2")

eq[0].set_color(RED)

eq[4].set_color(GREEN)

`

Building Incrementally

`python

parts = MathTex(r"f(x)", r"=", r"\sum_{n=0}^{\infty}", r"\frac{f^{(n)}(a)}{n!}", r"(x-a)^n")

self.play(Write(parts[0:2]))

self.wait(0.5)

self.play(Write(parts[2]))

self.wait(0.5)

self.play(Write(parts[3:]))

`

Highlighting

`python

highlight = SurroundingRectangle(eq[2], color=YELLOW, buff=0.1)

self.play(Create(highlight))

self.play(Indicate(eq[4], color=YELLOW))

`

Annotation

`python

brace = Brace(eq, DOWN, color=YELLOW)

label = brace.get_text("Fundamental Theorem", font_size=24)

self.play(GrowFromCenter(brace), Write(label))

`

Common LaTeX

`python

MathTex(r"\frac{a}{b}") # fraction

MathTex(r"\alpha, \beta, \gamma") # Greek

MathTex(r"\sum_{i=1}^{n} x_i") # summation

MathTex(r"\int_{0}^{\infty} e^{-x} dx") # integral

MathTex(r"\vec{v}") # vector

MathTex(r"\lim_{x \to \infty} f(x)") # limit

`

Matrices

MathTex supports standard LaTeX matrix environments via amsmath (loaded by default):

`python

Bracketed matrix

MathTex(r"\begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}")

Parenthesized matrix

MathTex(r"\begin{pmatrix} a & b \\ c & d \end{pmatrix}")

Determinant (vertical bars)

MathTex(r"\begin{vmatrix} a & b \\ c & d \end{vmatrix}")

Plain (no delimiters)

MathTex(r"\begin{matrix} x_1 \\ x_2 \\ x_3 \end{matrix}")

`

For matrices you need to animate element-by-element or color individual entries, use the IntegerMatrix, DecimalMatrix, or MobjectMatrix mobjects instead — see mobjects.md.

Cases and Piecewise Functions

`python

MathTex(r"""

f(x) = \begin{cases}

x^2 & \text{if } x \geq 0 \\

-x^2 & \text{if } x < 0

\end{cases}

""")

`

Aligned Environments

For multi-line derivations with alignment, use aligned inside MathTex:

`python

MathTex(r"""

\begin{aligned}

\nabla \cdot \mathbf{E} &= \frac{\rho}{\epsilon_0} \\

\nabla \cdot \mathbf{B} &= 0 \\

\nabla \times \mathbf{E} &= -\frac{\partial \mathbf{B}}{\partial t} \\

\nabla \times \mathbf{B} &= \mu_0 \mathbf{J} + \mu_0 \epsilon_0 \frac{\partial \mathbf{E}}{\partial t}

\end{aligned}

""")

`

Note: MathTex wraps content in align* by default. Override with tex_environment if needed:

`python

MathTex(r"...", tex_environment="gather*")

`

Derivation Pattern

`python

class DerivationScene(Scene):

def construct(self):

self.camera.background_color = BG

s1 = MathTex(r"ax^2 + bx + c = 0")

self.play(Write(s1))

self.wait(1.5)

s2 = MathTex(r"x^2 + \frac{b}{a}x + \frac{c}{a} = 0")

s2.next_to(s1, DOWN, buff=0.8)

self.play(s1.animate.set_opacity(0.4), TransformMatchingTex(s1.copy(), s2))

`

substrings_to_isolate for Complex Equations

For dense equations where manually splitting into parts is impractical, use substrings_to_isolate to tell Manim which substrings to track as individual elements:

`python

Without isolation — the whole expression is one blob

lagrangian = MathTex(

r"\mathcal{L} = \bar{\psi}(i \gamma^\mu D_\mu - m)\psi - \tfrac{1}{4}F_{\mu\nu}F^{\mu\nu}"

)

With isolation — each named substring is a separate submobject

lagrangian = MathTex(

r"\mathcal{L} = \bar{\psi}(i \gamma^\mu D_\mu - m)\psi - \tfrac{1}{4}F_{\mu\nu}F^{\mu\nu}",

substrings_to_isolate=[r"\psi", r"D_\mu", r"\gamma^\mu", r"F_{\mu\nu}"]

)

Now you can color individual terms

lagrangian.set_color_by_tex(r"\psi", BLUE)

lagrangian.set_color_by_tex(r"F_{\mu\nu}", YELLOW)

`

Essential for TransformMatchingTex on complex equations — without isolation, matching fails on dense expressions.

Multi-Line Complex Equations

For equations with multiple related lines, pass each line as a separate argument:

`python

maxwell = MathTex(

r"\nabla \cdot \mathbf{E} = \frac{\rho}{\epsilon_0}",

r"\nabla \times \mathbf{B} = \mu_0\mathbf{J} + \mu_0\epsilon_0\frac{\partial \mathbf{E}}{\partial t}"

).arrange(DOWN)

Each line is a separate submobject — animate independently

self.play(Write(maxwell[0]))

self.wait(1)

self.play(Write(maxwell[1]))

`

TransformMatchingTex with key_map

Map specific substrings between source and target equations during transformation:

`python

eq1 = MathTex(r"A^2 + B^2 = C^2")

eq2 = MathTex(r"A^2 = C^2 - B^2")

self.play(TransformMatchingTex(

eq1, eq2,

key_map={"+": "-"}, # map "+" in source to "-" in target

path_arc=PI / 2, # arc the pieces into position

))

`

set_color_by_tex — Color by Substring

`python

eq = MathTex(r"E = mc^2")

eq.set_color_by_tex("E", BLUE)

eq.set_color_by_tex("m", RED)

eq.set_color_by_tex("c", GREEN)

`

TransformMatchingTex with matched_keys

When matching substrings are ambiguous, specify which to align explicitly:

`python

kw = dict(font_size=72, t2c={"A": BLUE, "B": TEAL, "C": GREEN})

lines = [

MathTex(r"A^2 + B^2 = C^2", **kw),

MathTex(r"A^2 = C^2 - B^2", **kw),

MathTex(r"A^2 = (C + B)(C - B)", **kw),

MathTex(r"A = \sqrt{(C + B)(C - B)}", **kw),

]

self.play(TransformMatchingTex(

lines[0].copy(), lines[1],

matched_keys=["A^2", "B^2", "C^2"], # explicitly match these

key_map={"+": "-"}, # map + to -

path_arc=PI / 2, # arc pieces into position

))

`

Without matched_keys, the animation matches the longest common substrings, which can produce unexpected results on complex equations (e.g., "^2 = C^2" matching across terms).