Rendering Text and Formulas

渲染文本和公式

有两种不同的方式可以在视频中渲染文本:
1、使用Pango(text_mobject
2、使用乳胶(tex_mobject

如果你想呈现简单的文本,你应该使用文本TextMarkupText,或者它的派生词,比如段落Paragraph。有关更多信息,请参阅不含LaTeX的文本。

当你需要数学排版时,应该使用LaTeX。有关更多信息,请参阅带有LaTeX的文本。

不含LaTeX的文本

向动画中添加文本的最简单方法是使用text类。它使用Pango库来呈现文本。使用Pango,您还可以呈现非英语字母,如你好 或こんにちは 或안녕하세요 或or مرحبا بالعالم。

这是一个简单的Hello World动画。

示例:HelloWorld

from manim import *class HelloWorld(Scene):def construct(self):text = Text("Hello world", font_size=144)self.add(text)

参考:Text

您还可以使用MarkupText,它允许使用PangoMarkup(有关详细信息,请参阅MarkupText文档)来呈现文本。例如:

示例:SingleLineColor

from manim import *class SingleLineColor(Scene):def construct(self):text = MarkupText(f'all in red <span fgcolor="{YELLOW}">except this</span>', color=RED)self.add(text)

参考:MarkupText

使用文本Text

本节介绍文本Text的属性以及如何在动画中使用文本。

使用字体

您可以使用字体设置不同的字体font

笔记
使用的字体必须安装在您的系统中,Pango应该知道这一点。您可以使用manimpango.list_fonts()获得字体列表。

>> import manimpango
>> manimpango.list_fonts()
[...]

示例:FontsExample

from manim import *class FontsExample(Scene):def construct(self):ft = Text("Noto Sans", font="Noto Sans")self.add(ft)

设置倾斜和重量

倾斜是文本的样式,可以是正常(默认)NORMAL、倾斜ITALIC或倾斜OBLIQUE。通常,对于许多字体,斜体和斜体看起来都很相似,但斜体使用罗马风格,而斜体使用斜体风格。

权重指定字体的粗体。您可以在manimpango.Weight中看到权重列表。

示例:SlantsExample

from manim import *class SlantsExample(Scene):def construct(self):a = Text("Italic", slant=ITALIC)self.add(a)

示例:DifferentWeight

from manim import *class DifferentWeight(Scene):def construct(self):import manimpangog = VGroup()weight_list = dict(sorted({weight: manimpango.Weight(weight).valuefor weight in manimpango.Weight}.items(),key=lambda x: x[1],))for weight in weight_list:g += Text(weight.name, weight=weight.name, font="Open Sans")self.add(g.arrange(DOWN).scale(0.5))

使用颜色

可以使用颜色设置文本的颜色color

示例:SimpleColor

from manim import *class SimpleColor(Scene):def construct(self):col = Text("RED COLOR", color=RED)self.add(col)

可以使用t2c之类的实用程序为特定字符着色。如果文本包含连字(如迭代文本中所述),这可能会有问题。

t2c接受两种类型的词典,

  • 键可以包含[2:-1][4:8]之类的索引,其工作原理与Python中切片的工作原理类似。这些值应该是“颜色”中文本的颜色Color
  • 键包含应单独着色的文字或字符,值应为颜色中的颜色Color

示例:Textt2cExample

from manim import *class Textt2cExample(Scene):def construct(self):t2cindices = Text('Hello', t2c={'[1:-1]': BLUE}).move_to(LEFT)t2cwords = Text('World',t2c={'rl':RED}).next_to(t2cindices, RIGHT)self.add(t2cindices, t2cwords)

如果您想避免使用颜色时出现问题(由于连字),请考虑使用MarkupText

使用渐变

可以使用渐变添加渐变gradient。该值必须是任意长度的iterable:

示例:GradientExample

from manim import *class GradientExample(Scene):def construct(self):t = Text("Hello", gradient=(RED, BLUE, GREEN), font_size=96)self.add(t)

您还可以使用t2g表示具有文本特定字符的渐变。它与颜色界面的语法相似:

示例:t2gExample

from manim import *class t2gExample(Scene):def construct(self):t2gindices = Text('Hello',t2g={'[1:-1]': (RED,GREEN),},).move_to(LEFT)t2gwords = Text('World',t2g={'World':(RED,BLUE),},).next_to(t2gindices, RIGHT)self.add(t2gindices, t2gwords)

设置行距

可以使用line_spacing设置行距:

示例:LineSpacing

from manim import *class LineSpacing(Scene):def construct(self):a = Text("Hello\nWorld", line_spacing=1)b = Text("Hello\nWorld", line_spacing=4)self.add(Group(a,b).arrange(LEFT, buff=5))

禁用连字

通过禁用连字,您将获得字符和子对象之间的一对一映射。这解决了文本着色的问题。

警告
请注意,对严重依赖连字(阿拉伯语文本)的文本使用此方法可能会产生意外的结果。

您可以通过将disable_ligatures连字传递给文本Text来禁用连字。例如:

示例:禁用连字

from manim import *class DisableLigature(Scene):def construct(self):li = Text("fl ligature",font_size=96)nli = Text("fl ligature", disable_ligatures=True, font_size=96)self.add(Group(li, nli).arrange(DOWN, buff=.8))

迭代文本

文本对象的行为类似于VGroups。因此,可以对文本进行切片和索引。

例如,可以通过迭代将每个字母设置为不同的颜色。

示例:IterateColor

from manim import *class IterateColor(Scene):def construct(self):text = Text("Colors", font_size=96)for letter in text:letter.set_color(random_bright_color())self.add(text)

警告
请注意,这里的连字可能会导致问题。如果需要字符到子对象的一对一映射,则应将disable\u
ligatures参数传递给文本Text。请参见禁用连字。

使用MarkupText

MarkupText类似于文本Text,它们之间的唯一区别是它接受并处理PangoMarkup(类似于html),而不仅仅是呈现纯文本。

有关PangoMarkup的更多详细信息和更多参考资料,请参阅MarkupText的文档。

示例:MarkupTest

from manim import *class MarkupTest(Scene):def construct(self):text = MarkupText(f'<span underline="double" underline_color="green">double green underline</span> in red text<span fgcolor="{YELLOW}"> except this</span>',color=RED,font_size=34)self.add(text)

带LaTeX的文字

正如您可以使用文本Text向视频中添加文本一样,您也可以使用Tex插入LaTeX。

例如
示例:HelloLaTeX

from manim import *class HelloLaTeX(Scene):def construct(self):tex = Tex(r"\LaTeX", font_size=144)self.add(tex)

笔记
请注意,我们使用的是原始字符串(r'...')而不是常规字符串('...')。这是因为TeX代码使用了许多特殊字符,例如\在常规python字符串中具有特殊含义。另一种方法是写\\以避开反斜杠:Tex('\\ LaTeX')

使用MathTex

默认情况下,传递给MathTex的所有内容都处于数学模式。更准确地说,MathTex是在align*环境中处理的。使用Tex可以实现类似的效果,方法是使用$符号来封装公式:$\xrightarrow{x^6y^8}$

示例:MathTeXDemo

from manim import *class MathTeXDemo(Scene):def construct(self):rtarrow0 = MathTex(r"\xrightarrow{x^6y^8}", font_size=96)rtarrow1 = Tex(r"$\xrightarrow{x^6y^8}$", font_size=96)self.add(VGroup(rtarrow0, rtarrow1).arrange(DOWN))

LaTeX命令和关键字参数,LaTeX commands and keyword arguments

我们可以在AMS数学软件包中使用任何标准的LaTeX命令。例如mathtt数学文本类型或looparrowright箭头。

示例:AMSLaTeX

from manim import *class AMSLaTeX(Scene):def construct(self):tex = Tex(r'$\mathtt{H} \looparrowright$ \LaTeX', font_size=144)self.add(tex)

在Manim方面,Tex类还接受属性来更改输出的外观。这与Text类非常相似。例如,color关键字更改TeX mobject的颜色。

示例:LaTeXAttributes

from manim import *class LaTeXAttributes(Scene):def construct(self):tex = Tex(r'Hello \LaTeX', color=BLUE, font_size=144)self.add(tex)

额外LaTeX 包装

有些命令需要将特殊包加载到TeX模板中。例如,要使用mathscr脚本,我们需要添加`mathrsfs包。由于默认情况下该包没有加载到Manim的tex模板中,因此我们必须手动添加它。

示例:AddPackageLatex

from manim import *class AddPackageLatex(Scene):def construct(self):myTemplate = TexTemplate()myTemplate.add_to_preamble(r"\usepackage{mathrsfs}")tex = Tex(r"$\mathscr{H} \rightarrow \mathbb{H}$}",tex_template=myTemplate,font_size=144,)self.add(tex)

子字符串和零件,Substrings and parts

TeX-mobject可以接受多个字符串作为参数。之后,您可以通过索引(如tex[1])或选择tex代码的部分来引用各个部分。在本例中,我们使用set_color_by_tex()设置大星星\bigstar的颜色:

示例:LaTeXSubstrings

from manim import *class LaTeXSubstrings(Scene):def construct(self):tex = Tex('Hello', r'$\bigstar$', r'\LaTeX', font_size=144)tex.set_color_by_tex('igsta', RED)self.add(tex)

请注意,set_color_by_tex()为包含tex的整个子字符串着色,而不仅仅是特定符号或tex表达式。考虑以下示例:

示例:IncorrectlatexSubstringColor

from manim import *class IncorrectLaTeXSubstringColoring(Scene):def construct(self):equation = MathTex(r"e^x = x^0 + x^1 + \frac{1}{2} x^2 + \frac{1}{6} x^3 + \cdots + \frac{1}{n!} x^n + \cdots")equation.set_color_by_tex("x", YELLOW)self.add(equation)

如你所见,这会将整个等式涂成黄色,这与预期相反。要仅将x涂成黄色,我们必须执行以下操作:

示例:CorrectLatexSubstringColor

from manim import *class CorrectLaTeXSubstringColoring(Scene):def construct(self):equation = MathTex(r"e^x = x^0 + x^1 + \frac{1}{2} x^2 + \frac{1}{6} x^3 + \cdots + \frac{1}{n!} x^n + \cdots",substrings_to_isolate="x")equation.set_color_by_tex("x", YELLOW)self.add(equation)

通过将substring_to_isolate设置为x,我们自动将MathTex分割成子字符串,并将x分量分割成单个子字符串。只有这样,才能使用set_color_by_tex()来实现所需的结果。

注意,Manim还支持一种自定义语法,允许轻松地将TeX字符串拆分为子字符串:只需用双大括号将公式中要隔离的部分括起来。在字符串MathTex(r“{a^2}}+{b^2}={c^2}”)中,呈现的mobject将由子字符串a^2+b^2=、和c^2组成。这使得使用TransformMatchingTex可以轻松编写类似文本片段之间的转换。

使用index_labels标签处理复杂字符串

有时,您可能会使用非常复杂的MathTex mobject,这使得您很难使用其单个组件。这就是调试函数index_labels()非常有用的地方。

该方法显示了mobject子mobject的索引,允许您轻松找到要更改的mobject组件。

示例:IndexLabelsMathTex

from manim import *class IndexLabelsMathTex(Scene):def construct(self):text = MathTex(r"\binom{2n}{n+2}", font_size=96)# index the first (and only) term of the MathTex mobself.add(index_labels(text[0]))text[0][1:3].set_color(YELLOW)text[0][3:6].set_color(RED)self.add(text)

LaTeX数学字体-模板库

当排版数学公式时,在LaTeX中更改字体比常规文本更复杂。它需要更改用于编译TeX的模板。Manim附带了一组TexFontTemplates供您使用。这些模板都将在数学模式下工作:

示例:LaTeXMathFonts

from manim import *class LaTeXMathFonts(Scene):def construct(self):tex = Tex(r"$x^2 + y^2 = z^2$",tex_template=TexFontTemplates.french_cursive,font_size=144,)self.add(tex)

Manim还有一个TexTemplateLibrary,其中包含3Blue1Brown使用的TeX模板。一个例子是用于排版中文脚本的ctex模板。为此,必须在系统上安装ctex LaTeX软件包。此外,如果您只是排版文本,您可能根本不需要Tex,应该使用Text

示例:LaTeXTemplateLibrary

from manim import *class LaTeXTemplateLibrary(Scene):def construct(self):tex = Tex('Hello 你好 \\LaTeX', tex_template=TexTemplateLibrary.ctex, font_size=144)self.add(tex)

对齐公式

MathTex mobject是在LaTeX align*环境中排版的。这意味着您可以在排版多行公式时使用对齐字符(&A):

示例:LaTeXAlignEnvironment

from manim import *class LaTeXAlignEnvironment(Scene):def construct(self):tex = MathTex(r'f(x) &= 3 + 2 + 1\\ &= 5 + 1 \\ &= 6', font_size=96)self.add(tex)

前一篇:
A deep dive into Manim’s internals

下一篇:
Frequently Asked Questions

Manim文档及源码笔记-CE文档-主题化指南3渲染文本和公式相关推荐

  1. Manim文档及源码笔记-CE文档-示例库3使用Manim绘图

    Manim文档及源码笔记-CE文档-示例库3使用Manim绘图 参考原文: Manim Community Edition Example Gallery 前言 笔记随想: 暂未发现官方中文版,自己实 ...

  2. spring aop原理_Spring知识点总结!已整理成142页离线文档(源码笔记+思维导图)...

    写在前面 由于Spring家族的东西很多,一次性写完也不太现实.所以这一次先更新Spring[最核心]的知识点:AOP和IOC 无论是入门还是面试,理解AOP和IOC都是非常重要的.在面试的时候,我没 ...

  3. 【Windows 逆向】CheatEngine 工具 ( CheatEngine 简介 | 使用 Lazarus 编译 CE 源码 | CheatEngine 相关文档资料 )

    文章目录 一.CheatEngine 简介 二.使用 Lazarus 编译 CE 源码 三.CheatEngine 相关文档资料 一.CheatEngine 简介 CheatEngine 简称 CE ...

  4. Live555源码阅读笔记(一):源码介绍文档 及 源码目录结构

    目录 一.Live555介绍 1.Live555项目介绍 2.官网及帮助文档介绍 二.源码目录结构 1.UsageEnvironment 2.BasicUsageEnvironment 3.group ...

  5. 基于JAVA环巢湖区域旅游网站计算机毕业设计源码+数据库+lw文档+系统+部署

    基于JAVA环巢湖区域旅游网站计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVA环巢湖区域旅游网站计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技术栈: 项目架构:B/S架构 开 ...

  6. 基于JAVA工作流流程编辑OA系统计算机毕业设计源码+数据库+lw文档+系统+部署

    基于JAVA工作流流程编辑OA系统计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVA工作流流程编辑OA系统计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技术栈: 项目架构:B/S ...

  7. 基于JAVA博物馆交流平台计算机毕业设计源码+系统+lw文档+部署

    基于JAVA博物馆交流平台计算机毕业设计源码+系统+lw文档+部署 基于JAVA博物馆交流平台计算机毕业设计源码+系统+lw文档+部署 本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开 ...

  8. 基于java的商城后台管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署

    基于java的商城后台管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 基于java的商城后台管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 本源码技术栈 ...

  9. JAVA计算机毕业设计政府采购线上招投标平台Mybatis+源码+数据库+lw文档+系统+调试部署

    JAVA计算机毕业设计政府采购线上招投标平台Mybatis+源码+数据库+lw文档+系统+调试部署 JAVA计算机毕业设计政府采购线上招投标平台Mybatis+源码+数据库+lw文档+系统+调试部署 ...

最新文章

  1. php签名是做什么用的,这个签名在PHP中意味着什么()?
  2. 越过网络层看威胁:为什么全攻击界面才是最重要的
  3. JVM的垃圾回收与内存分配
  4. 网络原理题+复习资料
  5. 视觉平衡与物理平衡_设计中的平衡理论为什么这么重要?
  6. 比特飞-建站100天感悟
  7. 安装VS2008错误解决
  8. 【git系列】提交新的PR-撤销git rebase
  9. 5G 和 AI 双驱动,互联网有望迎来第二春
  10. python enumerate_详解 Python 的 enumerate 函数
  11. win10系统下使用大漠插件后台截图卡住的解决方法
  12. 【转载】使用Winrar对压缩文件进行加密,并且给定解压密码
  13. 如何下载电驴网站Verycd上的资源
  14. IDEA热部署之JRebel破解附反向代理破解exe(安装)
  15. python彩虹蛇_贪吃蛇还能这么玩?绝对是你从未体验过的全新版本(上)
  16. 360浏览器html文件无图标,360浏览器在网页的右键里不显示审查元素怎么了
  17. 正念的奇迹 - 喧嚣的世界中获取安宁
  18. 树莓派 与Pi仪表盘安装
  19. vue-computed 计算属性
  20. Win7启用远程桌面批处理命令

热门文章

  1. javaScript---异步那些事(promise)(21/11/8)
  2. 健身泡沫轴可以带上高铁吗_每次训练结束后用泡沫轴真的好吗?如果想节约时间就这样做!...
  3. 开发快手爬票项目(中)
  4. b站服务器崩溃大会员自动续费,[财经]B站因服务器故障赠送用户1天大会员!回应补偿会自动续费会退款 - 南方财富网...
  5. hive数仓、数据中台数据核对的方法
  6. 春运火车上的这10种人,有一个就是你!
  7. vivo X70系列搭载自研V1芯片9月9日发布
  8. UE4 LOD Screen Size
  9. linux查看附近可用wifi并进行通过命令行连接
  10. arduino 版 PID 算法模板(程序可直接套模板实用)