Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
b88b358
Extracted the method get_mob_from_shape_element
henrikmidtiby Nov 13, 2025
e8e003a
Moved more functionality to get_mob_from_shape_element
henrikmidtiby Nov 13, 2025
f9f7138
More cleanup
henrikmidtiby Nov 13, 2025
1a9212b
Parse the svg file while maintaining the group structure.
henrikmidtiby Nov 13, 2025
bd78c43
Make the svg groups available
henrikmidtiby Nov 13, 2025
494708e
Merge branch 'main' into maintain_groups_from_svg
henrikmidtiby Dec 8, 2025
9e364e3
Handle PERF401 issue
henrikmidtiby Dec 8, 2025
9059479
[pre-commit.ci] pre-commit autoupdate (#4506)
pre-commit-ci[bot] Dec 15, 2025
66f456e
Added an example of the issue
henrikmidtiby Dec 15, 2025
d6c6f5d
Experimenting with coloring elements from the latex equation
henrikmidtiby Dec 15, 2025
96db1b0
...
henrikmidtiby Dec 16, 2025
fe411af
Regular expression can now match more than one object
henrikmidtiby Dec 16, 2025
68395df
Process the string by applying the substrings in the order they match
henrikmidtiby Dec 16, 2025
4499c73
Code refactoring and added type annotations
henrikmidtiby Dec 16, 2025
751c718
...
henrikmidtiby Dec 16, 2025
73a08e4
Added a lot of test cases
henrikmidtiby Dec 16, 2025
b9e313e
More examples
henrikmidtiby Dec 16, 2025
63a4c19
More examples
henrikmidtiby Dec 17, 2025
a651d95
Use matched_strings_and_ids to simplify existing methods
henrikmidtiby Dec 17, 2025
b8c9123
Remove unused code
henrikmidtiby Dec 17, 2025
86a1b46
Update get_part_by_tex to use matched_strings_and_ids
henrikmidtiby Dec 17, 2025
1c2d113
This is required for test_MathTable to pass
henrikmidtiby Dec 17, 2025
d9bc03f
Ensure that self.texstring is set.
henrikmidtiby Dec 17, 2025
64894a7
Merge branch 'main' into MathTexFromScratch
henrikmidtiby Dec 17, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
257 changes: 257 additions & 0 deletions issue/MathTexExamples.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,257 @@
from __future__ import annotations

from manim import *


class ExampleScene2(Scene):
def construct(self):
formula = MathTex(
r"P(X=k) = 0.5^k (1-0.5)^{12-k}",
).scale(1.3)
print(formula.id_to_vgroup_dict.keys())
# formula.id_to_vgroup_dict['unique002'].set_color(RED)
# formula.set_color_by_tex("k", ORANGE)
self.add(formula)


class ExampleScene3(Scene):
def construct(self):
formula = MathTex(
r"P(X=k) =",
r"\binom{12}{k}",
r"0.5^{k}",
r"(1-0.5)^{12-k}",
substrings_to_isolate=["k"],
).scale(1.3)
for k in formula.id_to_vgroup_dict:
print(k)
for key in formula.id_to_vgroup_dict:
if key[-2:] == "ss":
formula.id_to_vgroup_dict[key].set_color(GREEN)

# formula.id_to_vgroup_dict['unique000ss'].set_color(RED)
# formula.id_to_vgroup_dict['unique001ss'].set_color(GREEN)
# formula.id_to_vgroup_dict['unique002ss'].set_color(BLUE)
# formula.id_to_vgroup_dict['unique003ss'].set_color(YELLOW)
# formula.set_color_by_tex("k", ORANGE)
self.add(formula)


class ExampleScene4a(Scene):
def construct(self):
formula = MathTex(
r"a^2 + b^2 = c^2 + a^2",
substrings_to_isolate=["a", "b"],
).scale(1.3)
for k in formula.id_to_vgroup_dict:
print(k)
for key in formula.id_to_vgroup_dict:
if key[-2:] == "ss":
formula.id_to_vgroup_dict[key].set_color(GREEN)

self.add(formula)


class ExampleScene4b(Scene):
def construct(self):
formula = MathTex(
r"a^2 + b^2 = c^2 + a^2",
substrings_to_isolate=["c", "a"],
).scale(1.3)
print("Hejsa")
for k in formula.id_to_vgroup_dict:
print(k)
for key in formula.id_to_vgroup_dict:
if key[-2:] == "ss":
formula.id_to_vgroup_dict[key].set_color(GREEN)

self.add(formula)


class ExampleScene5(Scene):
def construct(self):
formula = MathTex(
r"a^2 + b^2 = c^2 + d^2 - a^2",
substrings_to_isolate=["[acd]"],
).scale(1.3)
for k in formula.id_to_vgroup_dict:
print(k)
for key in formula.id_to_vgroup_dict:
if key[-2:] == "ss":
formula.id_to_vgroup_dict[key].set_color(GREEN)

self.add(formula)


# TODO:
# When all scenes are rendered with a single command line call
# uv run manim render MathTexExamples.py --write_all
# ExampleScene6 fails with the following error
# KeyError: 'unique001ss'
# I think it is related to a caching issue, because the error vanishes
# when the scene is rendered by itself.
# uv run manim render MathTexExamples.py ExampleScene6
class ExampleScene6(Scene):
def construct(self):
formula = MathTex(
r"a^2 + b^2 = c^2 + d^2 - a^2",
substrings_to_isolate=["[acd]"],
).scale(1.3)

for k in formula.id_to_vgroup_dict:
print(k)

def set_color_by_tex(mathtex, tex, color):
print(mathtex.matched_strings_and_ids)
for match in mathtex.matched_strings_and_ids:
if match[0] == tex:
mathtex.id_to_vgroup_dict[match[1]].set_color(color)

set_color_by_tex(formula, "c", ORANGE)
set_color_by_tex(formula, "a", RED)

self.add(formula)


class ExampleScene7(Scene):
def construct(self):
formula = MathTex(
r"a^2 + b^2 = c^2 + d^2 - 2 a^2",
substrings_to_isolate=["[acd]"],
).scale(1.3)

for k in formula.id_to_vgroup_dict:
print(k)

def set_color_by_tex(mathtex, tex, color):
print(mathtex.matched_strings_and_ids)
for match in mathtex.matched_strings_and_ids:
if match[0] == tex:
mathtex.id_to_vgroup_dict[match[1]].set_color(color)

set_color_by_tex(formula, "c", GREEN)
set_color_by_tex(formula, "a", RED)

self.add(formula)


class ExampleScene8(Scene):
def construct(self):
formula = MathTex(
r"P(X=k) =",
r"\binom{12}{k}",
r"0.5^{k}",
r"(1-0.5)^{12-k}",
substrings_to_isolate=["k", "1", "12", "0.5"],
).scale(1.3)

def set_color_by_tex(
mathtex: MathTex, tex: str, color: ParsableManimColor
) -> None:
for match in mathtex.matched_strings_and_ids:
if match[0] == tex:
mathtex.id_to_vgroup_dict[match[1]].set_color(color)

set_color_by_tex(formula, "k", GREEN)
set_color_by_tex(formula, "12", RED)
set_color_by_tex(formula, "1", YELLOW)
set_color_by_tex(formula, "0.5", BLUE_D)
self.add(formula)


class ExampleScene9(Scene):
def construct(self):
t2cm = {r"\sum": BLUE, "^{n}": RED, "_{1}": GREEN, "x": YELLOW}
eq1 = MathTex(r"\sum", "^{n}", "_{1}", "x").scale(1.3)
eq2 = MathTex(r"\sum", "_{1}", "^{n}", "x").scale(1.3)

def set_color_by_tex(
mathtex: MathTex, tex: str, color: ParsableManimColor
) -> None:
for match in mathtex.matched_strings_and_ids:
if match[0] == tex:
mathtex.id_to_vgroup_dict[match[1]].set_color(color)

for k, v in t2cm.items():
set_color_by_tex(eq1, k, v)
set_color_by_tex(eq2, k, v)

grp = VGroup(eq1, eq2).arrange_in_grid(2, 1)
self.add(grp)


class ExampleScene10(Scene):
def construct(self):
# TODO: This approach to highlighting \sum does not work right now.
# It changes the shape of the rendered equation.
t2cm1 = {r"\\sum": BLUE, "n": RED, "1": GREEN, "x": YELLOW}
t2cm2 = {r"\sum": BLUE, "n": RED, "1": GREEN, "x": YELLOW}
eq1 = MathTex(
r"\sum^{n}_{1} x", substrings_to_isolate=list(t2cm1.keys())
).scale(1.3)
eq2 = MathTex(
r"\sum_{1}^{n} x", substrings_to_isolate=list(t2cm2.keys())
).scale(1.3)

def set_color_by_tex(
mathtex: MathTex, tex: str, color: ParsableManimColor
) -> None:
for match in mathtex.matched_strings_and_ids:
if match[0] == tex:
mathtex.id_to_vgroup_dict[match[1]].set_color(color)

for k, v in t2cm1.items():
set_color_by_tex(eq1, k, v)
for k, v in t2cm2.items():
set_color_by_tex(eq2, k, v)

grp = VGroup(eq1, eq2).arrange_in_grid(2, 1)
self.add(grp)

# This workaround based on index_labels still work
# labels = index_labels(eq2)
# self.add(labels)
# eq1[0].set_color(BLUE)
# eq2[1].set_color(BLUE)


class ExampleScene11(Scene):
def construct(self):
t2cm = {"n": RED, "1": GREEN, "x": YELLOW}
eq = MathTex(r"\sum_{1}^{n} x", tex_to_color_map=t2cm).scale(1.3)

self.add(eq)


class ExampleScene12(Scene):
def construct(self):
eq = MathTex(r"\sum_{1}^{n} x", substrings_to_isolate=["1", "n", "x"]).scale(
1.3
)
eq.set_color_by_tex("1", YELLOW)
eq.set_color_by_tex("x", RED)
eq.set_opacity_by_tex("n", 0.5)

self.add(eq)


class ExampleScene13(Scene):
def construct(self):
matrix_elements = [[1, 2, 3]]
row = 0
column = 2
matrix = Matrix(matrix_elements)
print(matrix.get_columns()[column][row].tex_string)


class ExampleScene14(Scene):
def construct(self):
start = MathTex("A", r"\to", "B")
end = MathTex("B", r"\to", "A")

self.add(start)
self.play(TransformMatchingTex(start, end, fade_transform_mismatches=True))


# Get inspiration from
# https://docs.manim.community/en/stable/guides/using_text.html#text-with-latex
49 changes: 49 additions & 0 deletions issue/issue3492.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
from __future__ import annotations

from manim import *


class ExampleScene(Scene):
def construct(self):
formula = MathTex(
r"P(X=k) = ",
"\\binom{12}{k} ",
r"0.5^k",
r"(1-0.5)^{12-k}",
substrings_to_isolate=["k"],
).scale(1.3)
self.play(formula.animate.set_color_by_tex("k", ORANGE))


class ExampleScene2(Scene):
def construct(self):
formula = MathTex(
r"P(X=k) = 0.5^k (1-0.5)^{12-k}",
).scale(1.3)
print(formula.id_to_vgroup_dict)
# formula.id_to_vgroup_dict['unique002'].set_color(RED)
# formula.set_color_by_tex("k", ORANGE)
self.add(formula)


class ExampleScene3(Scene):
def construct(self):
formula = MathTex(
r"P(X=k) =",
r"\binom{12}{k}",
r"0.5^{k}",
r"(1-0.5)^{12-k}",
substrings_to_isolate=["k"],
).scale(1.3)
for k in formula.id_to_vgroup_dict:
print(k)
for key in formula.id_to_vgroup_dict:
if key[-2:] == "ss":
formula.id_to_vgroup_dict[key].set_color(GREEN)

# formula.id_to_vgroup_dict['unique000ss'].set_color(RED)
# formula.id_to_vgroup_dict['unique001ss'].set_color(GREEN)
# formula.id_to_vgroup_dict['unique002ss'].set_color(BLUE)
# formula.id_to_vgroup_dict['unique003ss'].set_color(YELLOW)
# formula.set_color_by_tex("k", ORANGE)
self.add(formula)
7 changes: 6 additions & 1 deletion manim/animation/transform_matching_parts.py
Original file line number Diff line number Diff line change
Expand Up @@ -294,4 +294,9 @@ def get_mobject_parts(mobject: Mobject) -> list[Mobject]:

@staticmethod
def get_mobject_key(mobject: Mobject) -> str:
return mobject.tex_string
# Ugly hack to make the following test pass
# test_TransformMatchingTex_FadeTransformMismatches_NothingToFade
try:
return mobject.tex_string
except Exception:
return ""
Loading
Loading