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))

在排版学中,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. 实际应用场景
如果你想做以下动画,就必须禁用连字:
-
逐字染色:你想让
f是红色,l是蓝色。 -
字符位移:你想让
f飞走,而l留在原地。 -
复杂变形:你想让
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 将它们拆散。

浙公网安备 33010602011771号