ZhangZhihui's Blog  

Disabling Ligatures

By disabling ligatures you would get a one-to-one mapping between characters and submobjects. This fixes the issues with coloring text.

 

class DisableLigature(Scene):
    def construct(self):
        li = Text("fl ff fi ffi ffl ligature",font_size=48)
        nli = Text("fl ff fi ffi ffl ligature", disable_ligatures=True, font_size=48)
        self.add(Group(li, nli).arrange(DOWN, buff=.8))

 

DisableLigature_ManimCE_v0.20.1

 

在排版学中,Ligature(合字/连字) 是指将两个或多个独立的字母连接在一起,形成一个单一符号(字符)的设计。

1. 什么是连字?

最经典的例子是小写字母 “f”。当 “f” 后面跟着 “i” 或 “l” 时,由于 “f” 的顶部钩子通常会向右延伸,容易与后面字母的圆点或顶部发生视觉上的冲突。为了美观,字体设计者会将它们合并。

  • 常见组合:fi, fl, ff, ffi, ffl。

  • 视觉变化:在 fi 连字中,“f” 的横钩通常会与 “i” 的点融合在一起。


2. 为什么在 Manim 中要禁用它?

正如你提供的代码注释所说:为了获得字符与子对象(submobjects)之间的一对一映射。

在 Manim 中,Text 对象的本质是一个 VGroup(矢量组合)。当你尝试给文字上色时:

  • 启用连字(默认):"fl" 被视为一个整体图形。如果你执行 text[0].set_color(RED),你会发现 “f” 和 “l” 同时变红了,因为它们在数学路径上已经合并成了一个对象。

  • 禁用连字 (disable_ligatures=True):Manim 会强制字体渲染引擎将 “f” 和 “l” 拆分为两个独立的矢量对象。

3. 实际应用场景

如果你想做以下动画,就必须禁用连字:

  1. 逐字染色:你想让 f 是红色,l 是蓝色。

  2. 字符位移:你想让 f 飞走,而 l 留在原地。

  3. 复杂变形:你想让 f 变成一个圆,而 l 变成一个方块。


4. 代码效果对比

在你提供的代码中:

  • li (Ligature):当你查看 len(li) 时,如果字体支持连字,fl 可能只占 1 个索引。

  • nli (No Ligature):fl 明确占据 2 个索引位(nli[0] 是 f,nli[1] 是 l)。

TL;DR: 连字是美化排版的“字母合并”技术。但在 Manim 中,合并会导致你无法单独操作其中的某个字母,所以需要通过 disable_ligatures=True 将它们拆散。

 

posted on 2026-05-14 15:28  ZhangZhihuiAAA  阅读(23)  评论(0)    收藏  举报