manim中实现文字换行和设置字体格式
实现换行
from manim import *
class Textline(Scene):
def construct(self):
self.camera.background_color = "#2F4F14"
# 创建中心文本
horizontal_line = Line(start=LEFT * 8, end=RIGHT * 8, color=WHITE).shift(3 * UP)
stext = Text("线性代数", font_size=40,color=RED).next_to(horizontal_line, UP, buff=0.1)
# 完整文本内容,确保在一个字符串中
content =("""线性代数是数学的一个分支,主要研究向量空间及其线性变换。它的主要内容包括向量、矩阵、行列式、线性方程组和特征值等概念。
\n线性代数在许多领域中都有广泛的应用,包括物理、工程、计算机科学、经济学等。线性代数的基本概念和工具包括:
\n\t向量:具有大小和方向的量,通常表示为有序数列。\n矩阵:以矩形阵列的形式组织数值,可以用于表示线性变换以及存储多个向量。
\n线性方程组:包含多个线性方程的集合,解决线性方程组的解法是线性代数的核心内容。\n\n行列式:一种标量值,能够提供矩阵的某些重要性质,如可逆性。
\n特征值与特征向量:矩阵在特定条件下的性质,可以用于简化许多线性代数问题。
\n总之,线性代数提供了一种处理多维数据和问题的有效工具,能够帮助我们理解和解决各种科学和工程问题。
\n """)
# 创建文本对象,并设置宽度以自动换行
text_object = Text(content, font_size=130, width=13.5,font="MS PGothic") # 设置宽度以控制换行
# 将文本对象放置在中心位置
text_object.next_to(stext, DOWN, buff=2).shift(1.8*UP)
# 添加到场景并采用动画效果
self.add(horizontal_line, stext)
self.play(Create(text_object))
self.wait(2) # 等待一会儿以便观看
参数的介绍:
-
self.camera.background_color = "#2F4F14"
: 设置场景的背景颜色为深绿色。 -
horizontal_line = Line(start=LEFT * 8, end=RIGHT * 8, color=WHITE).shift(3 * UP)
: 创建一条水平线,起始点在屏幕左侧8个单位,结束点在屏幕右侧8个单位,颜色为白色,向上平移3个单位。 -
stext = Text("线性代数", font_size=40,color=RED).next_to(horizontal_line, UP, buff=0.1)
: 创建一个文本对象,内容为"线性代数",字体大小为40,颜色为红色,放置在上一步创建的水平线上方0.1个单位的位置。 -
content =("""线性代数是数学的一个分支...""")
: 定义包含完整文本内容的字符串变量。 -
text_object = Text(content, font_size=130, width=13.5,font="MS PGothic")
: 创建一个文本对象,内容为上一步定义的字符串变量,字体大小为130,宽度为13.5(用于控制自动换行),字体为"MS PGothic"。 -
text_object.next_to(stext, DOWN, buff=2).shift(1.8*UP)
: 将上一步创建的文本对象放置在上一步创建的"线性代数"文本对象下方2个单位的位置,并向上平移1.8个单位。 -
self.add(horizontal_line, stext)
: 将水平线和"线性代数"文本对象添加到场景中。 -
self.play(Create(text_object))
: 播放创建文本对象的动画效果。 -
self.wait(2)
: 暂停动画,等待2秒。
字体格式的介绍:
from manim import *
import matplotlib.font_manager
class AllFonts(Scene):
def construct(self):
# 获取系统中所有字体
fonts = matplotlib.font_manager.findSystemFonts(fontpaths=None)
# 创建一个文本框,说明这些字体
title = Text("可用字体示例", font_size=48)
self.play(Write(title))
self.wait(1)
# 存储显示的文本对象
font_texts = VGroup()
# 限制显示前10种字体
for i, font in enumerate(fonts[:10]): # 只取前10个字体
font_name = font.split('/')[-1].replace('.ttf', '') # 获取字体名称
font_text = Text(f"字体: {font_name}", font_size=36, font=font)
font_texts.add(font_text)
self.remove(font_texts)
# 显示所有字体
self.play(Write(font_texts))
# 等待之后结束
self.wait(3)
这段代码是使用Manim库来展示系统中可用的字体示例。下面是对代码及每个参数的解释:
函数和参数解释
-
from manim import *
: 导入Manim库,用于创建动画场景和文本等元素。 -
import matplotlib.font_manager
: 导入matplotlib库中的font_manager模块,用于获取系统中的字体信息。 -
class AllFonts(Scene):
: 定义一个名为AllFonts的场景类,用于展示系统中可用的字体。 -
def construct(self):
: 定义construct方法,用于构建场景中的元素和动画效果。 -
fonts = matplotlib.font_manager.findSystemFonts(fontpaths=None)
: 使用matplotlib库中的findSystemFonts
函数获取系统中所有可用的字体列表。 -
title = Text("可用字体示例", font_size=48)
: 创建一个名为title的文本对象,内容为“可用字体示例”,字体大小为48。 -
self.play(Write(title))
: 播放Write动画效果,将标题文本对象显示在场景中。 -
self.wait(1)
: 等待1秒钟,让标题文本显示一段时间。 -
font_texts = VGroup()
: 创建一个VGroup对象,用于存储显示的字体文对象。 -
for i, font in enumerate(fonts[:10]):
: 遍历前10个系统字体。 -
font_name = font.split('/')[-1].replace('.ttf', '')
: 从字体路径中提取字体名称。 -
font_text = Text(f"字体: {font_name}", font_size=36, font=font)
: 创建一个文本对象,显示字体名称和对应的字体样式。 -
font_texts.add(font_text)
: 将创建的文本对象添加到font_texts中。 -
self.remove(font_texts)
: 从场景中移除font_texts中存储的文本对象。 -
self.play(Write(font_texts))
: 播放Write动画效果,显示所有字体的文本对象。 -
self.wait(3)
: 等待3秒钟,让所有字体文本显示一段时间后结束。
运行结果:
['Arial', 'Bahnschrift', text_mobject.py:461 'Calibri', 'Cambria', 'Cambria Math', 'Candara', 'Cascadia Code', 'Cascadia Mono', 'Comic Sans MS', 'Consolas', 'Constantia', 'Corbel', 'Courier New', 'Cursive', 'DengXian', 'Ebrima', 'FangSong', 'Fantasy', 'Franklin Gothic', 'Gabriola', 'Gadugi', 'Georgia', 'Impact', 'Ink Free', 'Javanese Text', 'KaiTi', 'Leelawadee UI', 'Lucida Console', 'Lucida Sans Unicode', 'MS Gothic', 'MS PGothic', 'MS UI Gothic', 'MV Boli', 'Malgun Gothic', 'Microsoft Himalaya', 'Microsoft JhengHei', 'Microsoft JhengHei UI', 'Microsoft New Tai Lue', 'Microsoft PhagsPa', 'Microsoft Sans Serif', 'Microsoft Tai Le', 'Microsoft YaHei', 'Microsoft YaHei UI', 'Microsoft Yi Baiti', 'MingLiU-ExtB', 'MingLiU_HKSCS-ExtB', 'Mongolian Baiti', 'Monospace', 'Myanmar Text', 'NSimSun', 'Nirmala UI', 'PMingLiU-ExtB', 'Palatino Linotype', 'Sans', 'Sans-Serif', 'Segoe Print', 'Segoe Script', 'Segoe UI', 'Segoe UI Emoji', 'Segoe UI Historic', 'Segoe UI Symbol', 'Segoe UI Variable Display', 'Segoe UI Variable Small', 'Segoe UI Variable Text', 'Serif', 'SimHei', 'SimSun', 'SimSun-ExtB', 'Sitka Banner', 'Sitka Display', 'Sitka Heading', 'Sitka Small', 'Sitka Subheading', 'Sitka Text', 'Sylfaen', 'System-ui', 'Tahoma', 'Times New Roman', 'Trebuchet MS', 'Verdana', 'Yu Gothic', 'Yu Gothic UI'].
这些字体格式是常见的字体名称,用于在文本中指定不同的字体样式。以下是对其中一些常见字体格式的解释:
-
Serif字体:Serif字体是一种在字母末端或笔画交叉处有额外装饰的字体,例如在字母“T”末端有小横线。这种字体风格通常被用于印刷品和书籍中,例如"Georgia"和"Times New Roman"。
-
Sans-Serif字体:Sans-Serif字体是指没有额外装饰的字体,没有末端的装饰线条,通常被认为更现代和简洁。例如"Arial"和"Verdana"就是Sans-Serif字体。
-
Monospace字体:Monospace字体是指每个字符占据相同宽度的字体,适用于排列文本对齐、代码编辑等场景。例如"Courier New"和"Consolas"是Monospace字体。
-
Cursive字体:Cursive字体是指模仿手写笔迹的字体风格,具有连续的笔画和装饰性。例如"Comic Sans MS"就是一种Cursive字体。
-
Fantasy字体:Fantasy字体是指具有装饰性和艺术感的字体,通常用于标题和艺术设计。例如"Gabriola"是一种Fantasy字体。
-
System-ui字体:System-ui字体是指系统默认的UI字体,适用于用户界面设计和系统显示。这种字体通常具有良好的可读性和适配性。
-
Segoe系列字体:Segoe系列是由微软开发的一组字体,包括不同风格和变体,用于Windows系统和应用程序界面。
-
Microsoft系列字体:Microsoft系列字体是由微软开发的字体系列,包括各种字体风格和变体,用于Windows系统和应用程序。