如何在Manim的Table组件中为单元格文本添加删除线效果
问题根源
两种实现尝试不生效的核心原因:
- 传入纯字符串作为单元格内容时,
Table类默认直接调用Text()构造文本对象,不会自动开启Pango富文本标记解析,手写的<span>标签会被识别为普通字符直接渲染。 - Table单元格默认使用
Text类渲染内容而非Tex/MathTex类,原生不解析LaTeX语法,直接写入LaTeX删除线命令无法被正确识别。
可行实现方案
方案1:单独传入带删除线的Text对象(推荐,灵活度最高)
Table支持直接传入已实例化的Mobject作为单元格内容,无需局限于纯字符串。仅需要给加删除线的单元格传入构造时带strikethrough参数的Text对象即可,其余单元格仍可使用普通字符串。
完整可运行示例:
from manim import * class TableExamples(Scene): def construct(self): t0 = Table( [ # 第一个单元格传入带红色删除线的Text对象 [Text("This", strikethrough=True, strikethrough_color=RED), "is a"], ["simple", "Table in \n Manim."] ] ) t1 = Table( [["This", "is a"], ["simple", "Table."]], row_labels=[Text("R1"), Text("R2")], col_labels=[Text("C1"), Text("C2")]) t1.add_highlighted_cell((2,2), color=YELLOW) t2 = Table( [["This", "is a"], ["simple", "Table."]], row_labels=[Text("R1"), Text("R2")], col_labels=[Text("C1"), Text("C2")], top_left_entry=Star().scale(0.3), include_outer_lines=True, arrange_in_grid_config={"cell_alignment": RIGHT}) t2.add(t2.get_cell((2,2), color=RED)) t3 = Table( [["This", "is a"], ["simple", "Table."]], row_labels=[Text("R1"), Text("R2")], col_labels=[Text("C1"), Text("C2")], top_left_entry=Star().scale(0.3), include_outer_lines=True, line_config={"stroke_width": 1, "color": YELLOW}) t3.remove(*t3.get_vertical_lines()) g = Group( t0,t1,t2,t3 ).scale(0.7).arrange_in_grid(buff=1) self.add(g)
该方案无需修改表格全局配置,单个单元格的字体、颜色、特殊效果都可以单独自定义,适配绝大多数场景。
方案2:全局开启富文本解析,支持标签写删除线
如果需要批量给多个单元格添加删除线、字体颜色、斜体等富文本效果,可以在初始化Table时指定element_to_mobject参数,全局开启Text的markup解析能力,之后即可直接在字符串中使用Pango支持的富文本标签。
核心代码示例:
t0 = Table( [ # 直接在字符串中写删除线标签 ['<span strikethrough="true" strikethrough_color="red">This</span>', "is a"], ["simple", "Table in \n Manim."] ], # 全局配置单元格文本构造逻辑,开启markup解析 element_to_mobject=lambda content: Text(content, markup=True) )
注意:开启markup解析后,字符串中的
<、>、&等特殊字符需要按照Pango标记规则做转义。
方案3:切换LaTeX渲染,用LaTeX命令实现删除线
如果表格内包含大量数学公式,需要全量使用LaTeX渲染内容,可以将单元格渲染类切换为Tex,引入ulem包后使用\sout命令实现删除线。
核心代码示例:
from manim import TexTemplate t0 = Table( [ [r"\sout{This}", "is a"], ["simple", "Table in \n Manim."] ], # 切换为Tex渲染,引入ulem包支持删除线命令 element_to_mobject=lambda content: Tex( content, tex_template=TexTemplate(preamble=r"\usepackage{ulem}") ) )
该方案渲染普通文本的效率低于Text类,仅建议在有大量公式需求的场景使用。
内容的提问来源于stack exchange,提问作者FluidMechanics Potential Flows
相关产品推荐
相关产品推荐

