Search code examples
pythonmanim

Manim Display Latex Table


Is there a way to display and animate a latex table using manim?

For instance

\begin{table}[]
\centering
\begin{tabular}{lllll}
 &  & \multicolumn{2}{l}{End} &  \\
Top &  & Bottom & Bottom &  \\
 & Top & 40 & 160 & 200 \\
 & Bottom & 640 & 160 & 800 \\
 &  & 200 & 800 & 1000
\end{tabular}
\end{table}

How would you go about in manim?

from manimlib import *
import numpy as np

class TableManim(Scene):
     def construct(self):
     ...

Solution

  • If you want to do it directly with LaTeX it would be like this:

    class Table1(Scene):
        def construct(self):
            table = r"""
            \begin{table}[]
            \centering
            \begin{tabular}{|l|l|l|l|l|}\hline
            &  & \multicolumn{2}{l}{End} &  \\\hline
            Top &  & Bottom & Bottom &  \\
            & Top & 40 & 160 & 200 \\
            & Bottom & 640 & 160 & 800 \\
            &  & 200 & 800 & 1000 \\\hline
            \end{tabular}
            \end{table}
            """
            tex_table = TexText(table)
            self.play(Write(tex_table))
    

    enter image description here

    But, if you want to make a table with Manim it is a bit more complicated, it would be something like this (you could convert to a function in case you need it)

    class Table2(Scene):
        def construct(self):
            table = VGroup(*[
                VGroup(*[
                    Text(f"{t}")
                    for t in row
                ]).arrange(DOWN,aligned_edge=LEFT)
                for row in [
                    ["Top"],
                    ["Top","Bottom"],
                    ["Bottom",40,640,200],
                    ["Bottom",160,160,800],
                    [200,800,1000],
                ]],
            )
            table.scale(0.8)
            BUFF = 0.5
            rectangles = VGroup(*[
                Rectangle(
                    width=mob.get_width()+BUFF,
                    height=max(*[t.get_height() for t in table])+BUFF,
                ).move_to(mob)
                for mob in table
            ])
            for t,r,align_direction in zip(table, rectangles, [UP,None,None,None,DOWN]):
                if align_direction is not None:
                    t.align_to(r,align_direction)
                    t.shift(-align_direction*BUFF/2)
            table_group = VGroup(*[
                VGroup(t,r)
                for t,r in zip(table,rectangles)
            ])
            table_group.arrange(RIGHT,buff=0)
            self.add(table_group)
    

    enter image description here