Ir al contenido

Texto

Con Manim tenemos 5 formas principales de agregar texto a nuestra escena:

  • Text: Usado para texto normal.
  • Tex: Enfocado a escribir fórmulas con Tex.
  • Typst: Similar a Tex pero usando el motor Typst.
  • MarkupText: Usado para dar estilo al texto como si fuera Markup.
  • Code: Permite agregar bloques de código con resaltado de síntaxis incluido.

En este taller no utilizaremos Tex porque requiere instalar una distribución de Tex y no nos da tiempo. Haremos llorar a Donald Knuth pero es lo que hay.

La forma más sencilla de dibujar texto en Manim es con la clase Text. A esta podemos pasarle una cadena de texto y varios parámetros como el tipo, tamaño y grosor de la fuente, color, y mucho más.

La clase Text utiliza Manim Pango, una adaptación en C de la librería Pango para renderizar texto.

text_example.py
from manim import *
class TextExample(Scene):
def construct(self):
hello = Text("Hello world from")
from_pycones = Text(
"PyConES 2026!",
stroke_width=4,
stroke_color=ORANGE,
fill_color=YELLOW,
font_size=120,
slant=ITALIC
)
text_group = VGroup(hello, from_pycones).arrange(DOWN)
self.add(text_group)

Como hemos comentado antes, vamos a ignorar la clase Tex y usaremos una muy similar: Typst. Tanto Tex como Typst son compositores tipográficos hechos para escribir textos académicos con un gran enfoque hacia las matemáticas.

Con la clase Typst podemos escribir texto usando formato Typst:

hello_typst.py
from manim import *
class HelloTypst(Scene):
def construct(self):
text = Typst(r"*Hello* from _Typst!_", font_size=96)
self.add(text)

Para escribir fórmulas podemos entrar en el modo matemático de Typst usando su sintaxis o directamente usando la clase MathTypst:

math_typst_example.py
from manim import *
class HelloMathTypst(Scene):
def construct(self):
equation = MathTypst(r"sum_(k=1)^n k = (n(n + 1)) / 2", font_size=72)
self.add(equation)

Seguidamente, una de las clases de texto más útiles de Manim es MarkupText. Con ella podemos estilar texto como si fuera un documento de Markup, muy similar a etiquetas de HTML.

markup_example.py
from manim import *
class MarkupExample(Scene):
def construct(self):
text1 = MarkupText("<b>foo</b> <i>bar</i> <b><i>foobar</i></b>")
text2 = MarkupText("<s>foo</s> <u>bar</u> <big>big</big> <small>small</small>")
text3 = MarkupText("H<sub>2</sub>O and H<sub>3</sub>O<sup>+</sup>")
text4 = MarkupText("type <tt>help</tt> for help")
text5 = MarkupText(
'<span underline="double">foo</span> <span underline="error">bar</span>'
)
group = VGroup(text1, text2, text3, text4, text5).arrange(DOWN)
self.add(group)

Con Code podemos renderizar código. El resaltado de sintaxis utiliza Pygments, con el que podemos usar los estilos o temas por defecto o podemos crear los nuestros propios.

code_example.py
from manim import *
class CodeExample(Scene):
def construct(self):
code = '''from manim import Scene, Square
class FadeInSquare(Scene):
def construct(self):
s = Square()
self.play(FadeIn(s))
self.play(s.animate.scale(2))
self.wait()'''
rendered_code = Code(
code_string=code,
language="python",
background="window",
background_config={"stroke_color": "maroon"},
)
self.add(rendered_code)

Renderiza un fragmento del famoso Lorem Ipsum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Solución al ejercicio 1
text_ex_1.py
from manim import *
class TextExerciseOne(Scene):
def construct(self):
lorem_ipsum = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
self.add(
MarkupText(
text=lorem_ipsum,
justify=True
).scale_to_fit_width(12)
)

Usa Typst para renderizar una fórmula. ¡La que más ilusión te haga!

Solución al ejercicio 2
text_ex_2.py
from manim import *
class TextExerciseTwo(Scene):
def construct(self):
formula = Typst("$ d/(d x) integral_a ^x f(t) d t = f(x) $")
formula_name = Text("Fundamental Theorem of calculus").to_edge(UP)
underline = Underline(formula_name)
self.add(
formula_name,
underline,
formula
)

Antes hemos usado Code para renderizar código desde un string. Ahora intenta hacerlo desde uno de los archivos que tienes por ahí guardados de ejemplos anteriores.

Solución al ejercicio 3
text_ex_3.py
from manim import *
class TextExerciseThree(Scene):
def construct(self):
self.add(
Code(
code_file="text_ex_3.py"
)
)