在动画制作中,文本的展示是一个重要环节。在这个背景下,Text
类作为显示非 LaTeX 文本的 Mobjects(数学对象)被广泛使用。与使用 Tex
和 MathTex
插入 LaTeX 文本相比,Text
允许用户直接添加普通文本,极大地简化了文本处理的流程。
Text
类依赖于 Pango 库,它具备强大的文本渲染能力,包括支持多种字符集和非英语字母的展示。例如,你可以通过 Text
类轻松展示中文(如“你好”)、日文(如“こんにちは”)、韩文(如“안녕하세요”)等,这对于需要国际化显示的项目尤其重要。
使用 Text
类时,用户应该注意文本的字体选择和展示效果。合适的字体不仅能提升文本的美观性,还能提高可读性。因此,建议参考对应的教程“Text Without LaTeX”来获取关于字体的详细信息。
总结来说,Text
类为动画制作人员提供了一种简单而有效的方式来展示各种语言的文本,弥补了仅依赖 LaTeX 处理文本的不足。通过利用 Pango 库,这种方法显著提高了文本处理的灵活性和多样性,使得动画作品能够更加生动、丰富地展示信息。无论是教育视频、广告还是短片,这种能力都可以为观众带来更好的视觉体验。
1.控制文本的外观和行为
MarkupText
是一个用于渲染文本的函数,允许用户通过多种参数来控制文本的外观和行为。
MarkupText(text, fill_opacity=1, stroke_width=0, color=None, font_size=48,
line_spacing=-1, font='', slant='NORMAL', weight='NORMAL', justify=False,
gradient=None, tab_width=4, height=None, width=None, should_center=True,
disable_ligatures=False, warn_missing_font=True, **kwargs)
以下是对每个参数的解释:
text
: 要显示的文本内容。fill_opacity
: 文本填充的透明度,在 0 到 1 之间,默认为 1(完全不透明)。stroke_width
: 文本边缘线的宽度,默认值为 0,表示不画边缘线。color
: 文本的颜色,通常由 RGBA 格式指定。font_size
: 文本字体大小,默认值为 48。line_spacing
: 行间距,默认为 -1,表示使用默认行距。font
: 字体名称(例如 "Arial"),默认值为空字符串,意味着使用默认字体。slant
: 字体倾斜,接受值有 'NORMAL'、'ITALIC' 和 'OBLIQUE',默认为 'NORMAL'。weight
: 字体粗细,接受值有 'NORMAL'、'BOLD',默认为 'NORMAL'。justify
: 是否对齐文本,默认为 False。gradient
: 文本的渐变效果,默认为 None。tab_width
: 制表符宽度,默认为 4。height
: 文本所占的高度,默认为 None,根据内容自动调整。width
: 文本所占的宽度,默认为 None,根据内容自动调整。should_center
: 是否使文本居中,默认为 True。disable_ligatures
: 是否禁用连字,默认为 False。warn_missing_font
: 如果指定字体缺失,是否发出警告,默认为 True。**kwargs
: 其他额外参数。
以下是一个示例代码,展示了如何使用这些参数:
from manim import *
class ExampleScene(Scene):
def construct(self):
# 创建带有多个参数的 MarkupText 对象
text = MarkupText(
"Hello, World!", # 文本内容
fill_opacity=0.8, # 填充透明度
stroke_width=2, # 边缘线宽度
color=BLUE, # 文本颜色
font_size=36, # 字体大小
line_spacing=1.5, # 行间距
font='Arial', # 字体名称
slant='ITALIC', # 字体倾斜状态
weight='BOLD', # 字体粗细
justify=True, # 文本对齐
tab_width=4, # 制表符宽度
should_center=True # 是否居中
)
# 将文本添加到画面中
self.play(Write(text))
self.wait(2) # 等待 2 秒
示例2:
from manim import *
class MarkupExample(Scene):
def construct(self):
text = MarkupText('<span foreground="red" size="x-large" >Blue text</span> is <i>cool</i>!"')
self.add(text)
示例3:
from manim import *
class BasicMarkupExample(Scene):
def construct(self):
# 使用 YELLOW 常量而不是字符串格式
text1 = MarkupText(
"<b>foo</b> <i>bar</i> <span fgcolor='yellow'> <b><i>foobar</i></b> </span>",
color=RED
)
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)
-
创建标记文本:
text1 = MarkupText("<b>foo</b> <i>bar</i> <b><i>foobar</i></b>")
text1
: 使用 HTML 样式标签创建的文本,包含加粗(<b>
)、斜体(<i>
)和嵌套样式(加粗斜体)。结果将呈现为 "foo" 加粗,"bar" 斜体,以及 "foobar" 加粗和斜体。
text2 = MarkupText("<s>foo</s> <u>bar</u> <big>big</big> <small>small</small>")
text2
: 同样使用标记样式,包含删除线(<s>
)、下划线(<u>
)、增大(<big>
)和减小(<small>
)文本的标签。
text3 = MarkupText("H<sub>2</sub>O and H<sub>3</sub>O<sup>+</sup>")
text3
: 显示化学式,使用下标(<sub>
)和上标(<sup>
)显示 "H₂O" 和 "H₃O⁺"。
text4 = MarkupText("type <tt>help</tt> for help")
text4
: 使用<tt>
标签(等宽字体)显示 "help"。
text5 = MarkupText('<span underline="double">foo</span> <span underline="error">bar</span>')
text5
: 通过<span>
标签定义自定义格式,"foo" 使用双下划线,"bar" 使用错误下划线(表示未定义或错误)。
-
将文本组合:
group = VGroup(text1, text2, text3, text4, text5).arrange(DOWN)
- 使用
VGroup
创建一个垂直的文本组,排列所有文本对象(从text1
到text5
),arrange(DOWN)
方法将它们垂直排列。
- 使用
-
添加到场景:
self.add(group)
- 将创建的组添加到场景中,以便渲染和显示。
示例4:
from manim import *
class ColorExample(Scene):
def construct(self):
text1 = MarkupText(
f'all in red <span fgcolor="{YELLOW}">except this</span>', color=RED
)
text2 = MarkupText("nice gradient", gradient=(BLUE, GREEN))
text3 = MarkupText(
'nice <gradient from="RED" to="YELLOW">intermediate</gradient> gradient',
gradient=(BLUE, GREEN),
)
text4 = MarkupText(
'fl ligature <gradient from="RED" to="YELLOW">causing trouble</gradient> here'
)
text5 = MarkupText(
'fl ligature <gradient from="RED" to="YELLOW" offset="1">defeated</gradient> with offset'
)
text6 = MarkupText(
'fl ligature <gradient from="RED" to="YELLOW" offset="1">floating</gradient> inside'
)
text7 = MarkupText(
'fl ligature <gradient from="RED" to="YELLOW" offset="1,1">floating</gradient> inside'
)
group = VGroup(text1, text2, text3, text4, text5, text6, text7).arrange(DOWN)
self.add(group)
示例5:
from manim import *
class JustifyText(Scene):
def construct(self):
ipsum_text = (
"Lorem ipsum dolor sit amet, consectetur adipiscing elit."
"Praesent feugiat metus sit amet iaculis pulvinar. Nulla posuere "
"quam a ex aliquam, eleifend consectetur tellus viverra. Aliquam "
"fermentum interdum justo, nec rutrum elit pretium ac. Nam quis "
"leo pulvinar, dignissim est at, venenatis nisi."
)
psum_text01 = (
"阿尔伯特·爱因斯坦曾说:“想象力比知识更重要。知识是有限的,"
"而想象力环绕着整个世界,促使进步。在科学、艺术,以及各个领域,"
"创造力都是推动人类文明发展的关键。无论遇到什么困难,"
"保持好奇心和探索精神,才能不断发现新的可能性。"
"真正的智慧不仅在于了解世界,更在于启发他人,共同追寻未知的真理。”"
"这句话体现了他对创新和思维的深刻理解。"
)
justified_text = MarkupText(ipsum_text, justify=True).scale(0.5)
not_justified_text = MarkupText(psum_text01, justify=False).scale(0.5)
just_title = Title("English Text")
njust_title = Title("Chines Text")
self.add(njust_title, not_justified_text)
self.wait(2)
self.play(
FadeOut(not_justified_text),
FadeIn(justified_text),
FadeOut(njust_title),
FadeIn(just_title),
)
self.wait(2)