manim边学边做--MathTex

manim,mathtex · 浏览次数 : 5

小编点评

本文主要介绍了MathTex类在上篇文档中的使用方法和相关概念。MathTex类是在SingleStringMathTex基础上扩展的,主要用于显示复杂的数学公式。相比于SingleStringMathTex,MathTex提供了更多的功能和更灵活的操作。 1. MathTex类主要参数: - tex_stringslist:用于存储多个latex格式的公式。 - arg_separator:设置公式之间的间隔符,默认为空格。 - substrings_to_isolatelist:将公式拆分成多个部分,以便进行个性化设置。 - tex_to_color_map:为公式中不同部分设置颜色。 - tex_environment:用于控制LaTeX环境的设置,不熟悉LaTeX的可不设置。 2. MathTex类主要方法: - get_part_by_tex:获取公式中特定部分的字符串。 - get_parts_by_tex:获取公式中多个部分的字符串列表。 - index_of_part:获取公式中某部分在整个公式中的索引。 - index_of_part_by_tex:获取特定tex string在整个公式中的索引。 - set_color_by_tex:根据tex string设置颜色。 - set_color_by_tex_to_color_map:用字典形式设置多个tex string的颜色。 - set_opacity_by_tex:根据tex string设置透明度。 - sort_alphabetically:按字母顺序排列公式中的各个部分。 3. 使用示例: - 示例展示了如何设置公式之间的间隔、拆分公式、着色、透明度以及排序等功能。 - 示例中的完整代码已提供,可在网盘下载。 总之,MathTex类为数学动画制作提供了丰富的功能和强大的操作能力,使得数学公式的展示更加多样化和个性化。

正文

上一篇介绍的SingleStringMathTex主要用来显示只有一行的数学公式,
对于复杂的数学公式,可以使用MathTex类。

MathTex类继承自SingleStringMathTex,在其基础之上增加了更多的功能。
其实,MathTex是制作数学动画时常用的类,反而SingleStringMathTex用的不多。
image.png
MathTexmanim各个模块中的位置大致如上图中所示。

1. 主要参数

MathTex的主要参数有:

参数名称 类型 说明
tex_strings list 多个latex格式的公式
arg_separator string 多个公式之间的间隔
substrings_to_isolate list 将公式中分离成一个个小部分
tex_to_color_map dict 公式中不同部分的颜色设置
tex_environment str 不熟悉latex的话不要设置

2. 主要方法

MathTex继承了SingleStringMathTex之后,扩展了不少新的方法,可以更好的控制和展示数学公式。

名称 说明
get_part_by_tex 获取 latex公式 中的一部分
get_parts_by_tex 获取 latex公式 中的多个部分
index_of_part 公式的某部分在整个公式中的索引
index_of_part_by_tex 某个tex string在整个公式中的索引
set_color_by_tex 根据某个 tex string 设置颜色
set_color_by_tex_to_color_map 用字典的形式设置多个 tex string 的颜色
set_opacity_by_tex 根据某个 tex string 设置透明度
sort_alphabetically 按字母顺序排列 latex公式 中的各个部分

MathTex的大部分方法都要配合substrings_to_isolate参数来一起使用,
通过substrings_to_isolate将完整的数学公式划分成一个个小部分,然后设置不同的样式。

3. 使用示例

下面的使用示例,大部分是结合参数方法一起使用的。

3.1. 公式之间的间隔

MathTex支持输入多个公式,多个公式之间默认是空格分隔,可以通过arg_separator参数设置不同的分隔。

tex = MathTex("z", "=", 
              "\sqrt{x^2+y^2}")
tex = MathTex("z", "=", 
              "\sqrt{x^2+y^2}", 
              arg_separator="\quad")

\quad表示设置4个空格。
out.gif

3.2. 拆分公式

拆分公式非常有用,拆分之后,可以对公式的一部分进行操作.
比如设置颜色,透明度,甚至可以在公式的不同部分应用不同的动画,做出更酷炫的展现形式。

默认情况下,公式是一个整体,哪怕用公式中的一个字符去获取,也会得到整个公式。

tex = MathTex("z=\sqrt{x^2+y^2}")
print(f"{len(tex) =}")
## 输出结果:
# len(tex) =1

part = tex.get_part_by_tex("x")
print(f"{part = }")
## 输出结果:
# part = SingleStringMathTex('z=\\sqrt{x^2+y^2}')

所以,先使用substrings_to_isolate参数拆分公式,
然后就可以使用get_part_by_texget_parts_by_tex这些函数来获取公式的不同部分。

tex = MathTex("y=ax^2+bx+c", 
              substrings_to_isolate=["x", "y"])
print(f"{len(tex) =}")
## 输出结果:
# len(tex) =6

part = tex.get_part_by_tex("y")
print(f"{part = }")
## 输出结果:
# part = SingleStringMathTex('y')

parts = tex.get_parts_by_tex("x")
print(f"{parts = }")
## 输出结果:
# parts = VGroup(SingleStringMathTex('x'), 
#                SingleStringMathTex('x'))

从上面的示例中看出,对于公式 \(y=ax^2+bx+c\),按\(x,y\)分割之后,
整个公式被分成了6份,所以len(tex)=6,分成了:

  1. \(y\)
  2. \(=a\)
  3. \(x\)
  4. \(^2+b\)
  5. \(x\)
  6. \(+c\)

也就是说,substrings_to_isolate中指定的\(x,y\)作为了整个公式的分割点。

tex.get_part_by_tex("y")得到的是包含\(y\)的那部分公式,因为\(y\)substrings_to_isolate中,
所以上面示例中返回的是part = SingleStringMathTex('y')
如果是tex.get_part_by_tex("a")的话,返回的将是part = SingleStringMathTex('=a')

上面分成的6个部分中,有两个部分包含\(x\)
所以parts = tex.get_parts_by_tex("x")返回的VGroup包含两个元素。

通过index_of_partindex_of_part_by_tex可以根据索引来获取公式被分割的各个部分。

tex = MathTex("y=ax^2+bx+c", 
              substrings_to_isolate=["x", "y"])

part = tex.get_part_by_tex("b")
print(tex.index_of_part(part))
## 输出结果
# 3

print(tex.index_of_part_by_tex("b"))
## 输出结果
# 3

在分成的6个部分中,\(b\)所在的部分是第4个index是从0开始的,所以示例中输出结果为3

之所以要拆分公式,就是为了对不同的部分进行不同的操作,下面的示例样式拆分之后带来的应用。

3.3. 公式着色

使用拆分前,虽然也可以通过color属性给公式着色,但是只能给整个公式设置一个颜色:

tex = MathTex(
    "z=\sqrt{x^2+y^2}",
    color=RED,
)

拆分之后,可以通过set_color_by_tex给不同的部分设置不同的颜色:

tex = MathTex("z", "=", "\sqrt{x^2+y^2}", 
              substrings_to_isolate=["x", "y", "z"])
tex.set_color_by_tex("x", RED)
tex.set_color_by_tex("y", GREEN)
tex.set_color_by_tex("z", BLUE)

同时设置多个颜色,也可以用set_color_by_tex_to_color_map方法:

tex.set_color_by_tex_to_color_map({
    "x": BLUE, "y": RED, "z": GREEN
})

上面三种方式着色后的效果如下:
out.gif

3.4. 透明度设置

除了颜色,拆分之后,也可以给不同的部分设置透明度。

tex = MathTex(
    "z",
    "=",
    "\sqrt{x^2+y^2}",
    substrings_to_isolate=["x", "y", "z"],
)
tex.set_opacity_by_tex("x", 0.4)
tex.set_opacity_by_tex("y", 0.4)
tex.set_opacity_by_tex("z", 0.6)
tex.set_color_by_tex_to_color_map({
    "x": BLUE, "y": RED, "z": GREEN
})

\(x,y,z\)方别设置的不同的透明度和颜色,和未设置透明度时的对比如下:
out.gif

3.5. 排序

最后这个是排序功能,是将数学公式的各个部分按照ASCII码的顺序排序。
比如,排序前(正常的公式从左到右的顺序排列各个部分):

tex = MathTex("c>a>b", 
              substrings_to_isolate=["a", "b", "c"])

for i in range(len(tex)):
    print(tex[i])

## 输出结果:
# SingleStringMathTex('c')
# SingleStringMathTex('>')
# SingleStringMathTex('a')
# SingleStringMathTex('>')
# SingleStringMathTex('b')

排序后:

tex.sort_alphabetically()
for i in range(len(tex)):
    print(tex[i])

## 输出结果:
# SingleStringMathTex('>')
# SingleStringMathTex('>')
# SingleStringMathTex('a')
# SingleStringMathTex('b')
# SingleStringMathTex('c')

按照ASCII码的顺序重新排列了各个部分。

这样排列有什么用呢?通过动画来显示公式时,渲染的顺序不一样。
排序前,从左到右一次显示c, >, a, >, b
排序后,显示顺序为变为>, >, a, b, c
out.gif

4. 附件

文中完整的代码放在网盘中了(math_tex.py),
下载地址: 完整代码 (访问密码: 6872)

与manim边学边做--MathTex相似的内容:

manim边学边做--MathTex

上一篇介绍的SingleStringMathTex主要用来显示只有一行的数学公式,对于复杂的数学公式,可以使用MathTex类。 MathTex类继承自SingleStringMathTex,在其基础之上增加了更多的功能。其实,MathTex是制作数学动画时常用的类,反而SingleStringMa

【manim】之滚动字幕

概要 manim 是一个做数学视频的 python 库,这个库功能非常强大。具体可以参考官方介绍:https://github.com/ManimCommunity/manim/ 它本身只是封装数学相关的几何体和一些基础动画,所以,制作视频时,需要进一步封装更复杂的动画来满足视频的要求。最近做的一个

【manim】之圆规动画

概要 前端时间做尺规作图相关的动画的时候,封装了一个圆规的动画,顺便研究了下 manim 库的动画函数。 manim 本身就是做动画的库,所以,基于它封装自定义的动画非常方便。 动画原理 对于单个的元素,manim本身就提供了非常多的动画函数。 比如:创建/消除的动画,移动元素的动画,旋转元素的动画

【manim】之目录动画

概要 最近,结合视频剪辑工具剪映制作短视频时, 如果不是数学相关的内容,使用视频剪辑工具配置字幕,添加图片等等比 manim更加方便。 所以,用 manim封装一个目录的动画,用来配合剪辑工具中的其他资源。 代码封装 基于manim封装一个目录显示的 class。 主要属性就是 titles,也就是

【manim动画教程】-- 安装

manim是基于python语言开发的开源框架,是由 3blue1brown 开发的。 本来是他们自己用来制作数学视频用的,因为其友好的API和漂亮的UI效果,在开源之后,立刻流行起来。 原先开源的地址是: 后来托管给了社区,现在安装最新的版本请从这里下载: 改版之后,命令行更加清晰,简单。 支持的

【manim动画教程】-- 基本图形

制作数学视频时,各类几何图形是使用最频繁的。 一般来说,常用的几何图形包括:点,线,圆以及多边形。 1. 点 点是最简单图形,也是其他所有图形的基础。 绘制其他任何图形时,都是用点来定位的。 manim中生成一个点很方便,只要给定一个坐标即可。 这里的坐标包含 [x, y, z]3个维度,如果绘制二

【manim动画教程】-- 图形样式

manim绘制图形时,除了上一节提到的那些必须的参数,还有一些可选的参数, 这些参数可以控制图形显示的样式。 绘制各类基本图形(点,线,圆,多边形等)时,每个图形都有自己的默认的样式,比如上一节的图形, 有的默认是白色,有的默认是红色。 控制图形样式的参数最常用的有以下四个: stroke_widt

【manim动画教程】-- 文字和公式

manim中提供了两种方式来表示文字信息,一种是 Text系列,一种是 Tex系列。 从目前我自己的使用的体验来看, Text系列在显示文字信息方面,提供了更多的的属性来调整显示效果。如果有大段的文字要排版,或者对文字的显示效果要求高的话,建议使用 Text。 而 Tex系列最大的优势是支持 Lat

【manim动画教程】-- 文本样式

文本的样式主要指颜色和字体相关的属性设置。 对于manim的两个文本对象 Text和 Tex来说, Text对象有更多的属性可以调整样式,相对来说,由于 Tex主要用来显示数学公式,所以关于样式的属性要少一些。 下面介绍一些我在视频制作时最常用的一些颜色和字体相关的属性。 1. 颜色相关 颜色设置主

【manim动画教程】-- 坐标系

没有引入坐标系之前,在绘制图形时,也有一个隐含的坐标系,它和屏幕的像素相关。 比如,我们之前示例中的各个图形,屏幕的中心就是坐标原点([0, 0]), 横轴坐标的范围大概是 [-3.5, 3.5],纵轴的坐标范围大概是 [-4, 4],这个范围与设置的视频分辨率有关,分辨率设置的越高的话,坐标范围越