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

MathTex类继承自SingleStringMathTex,在其基础之上增加了更多的功能。
其实,MathTex是制作数学动画时常用的类,反而SingleStringMathTex用的不多。

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个空格。

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

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

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\)方别设置的不同的透明度和颜色,和未设置透明度时的对比如下:

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

4. 附件

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

manim边学边做--MathTex的更多相关文章

  1. 学EE做硬件找工作不如学CS做软件,为什么会这样?

    学EE做硬件找工作不如学CS做软件,为什么会这样? 电子工程(EE)就业最好的方向居然是转计算机,也许让有的人觉得很不公平,EE也是很重要的学科,我们学习也很努力,为什么就业会不如CS?也有的人好奇, ...

  2. 牛腩学Kotlin做Android应用

    牛腩学Kotlin做Android应用,蹭热度视频,边学边做, 01-kotlin插件安装及hello world 02-kotlin基础语法速览 哔哩哔哩观看地址:http://www.bilibi ...

  3. php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习)

    php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习) 一.总结 1.递归不优化的话,30层开外就有点吃力了 2.php因为定义变量的时候不用定义变量类型,所以数组里面的类型也是p ...

  4. html5-3 html5标签(热点地图如何实现)(边学边做)

    html5-3 html5标签(热点地图如何实现)(边学边做) 一.总结 一句话总结:热点地图用绝对定位实现. 1.自定义列表怎么弄? dl  自定义列表dt  自定义标题dd  自定义列表内容 2. ...

  5. 第一份开发工作,边学边做android

    我刚刚毕业,在培训学校学的Java web开发,虽然学的没有大学生那么丰富细致,没有他们理论基础扎实,但是这是我学习软件开发的唯一方式了. 从小学我学习就是倒数2.3等,所有人都认为我是个没法学习的孩 ...

  6. 边学边做,简单的 GraphQL 实例

    项目中有功能要调用 API,对方 API 用的是 GraphQL 实现,就简单学了下,感叹技术进步真快,Facebook 发明的这玩意儿咋这么牛逼,使前端开发人员变得主动起来,想要什么接口.返回什么结 ...

  7. LabVIEW Actor Framwork (2)________ 边学边做server&client

    回顾下初始需求: 现在要做一个类似聊天的demo,一个server端,若干个client端:首先是server启动,通过server可以打开若干个client端,然后每个client可以独立给serv ...

  8. 牛腩学ASP.NET CORE做博客(视频)

    牛腩学习ASP.NET CORE做的项目,边学边做. 目录: 01-dotnetcore网站部署到centos7系统上(时长 2:03:16) 02-前期准备及项目搭建 (时长:0:23:35) 03 ...

  9. 牛腩学用MUI做手机APP

    斗鱼直播间直播学习撸码,最终目标是用MUI做一个手机APP(暂定android平台,攒钱买IPHONE 7SE!!!),直播内容含整个软件APP的制作过程(含后台接口的制作,放到自己买的阿里云服务器, ...

  10. 技术的止境(客户价值第一,快速实现第二,边做边学,迅速成为牛人。紧贴客户的需求去做技术,立于不败之地。追求的目标:把一项产品去做好,用产品去养活自己和家人)good

    作为一个依靠技术来谋生的程序员,我最近一直在思考一个问题,有限的生命里,面对无限的技术更新,我要研究到什么程度才能算是完成我的成为技术大牛的目标呢?换而言之,那就是技术的止境在哪儿呢?深入的思考下去, ...

随机推荐

  1. 使用亚马逊AWS云服务器进行深度学习——免环境配置/GPU支持/Keras/TensorFlow/OpenCV

    前言 吐槽:由于科研任务,需要在云端运行一个基于神经网络的目标识别库,需要用到GPU加速.亚马逊有很多自带GPU的机器,但是环境的配置可折腾坏了,尤其是opencv,每次总会出各种各样的问题! 无奈中 ...

  2. 51k+ Star!动画图解、一键运行的数据结构与算法教程!

    大家好,我是 Java陈序员. 我们都知道,<数据结构与算法> -- 是程序员的必修课. 无论是使用什么编程语音,亦或者是前后端开发,都需要修好<数据结构与算法>这门课! 在各 ...

  3. SAP HANA计算视图

    Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. 越来越多的SAP用户正在将SAP HANA实施为现有SAP BW的基础和数据库. ...

  4. Python第三方库的安装和导入

    目录 一.Python第三方库的安装 1. 使用pip命令行安装 2. 使用PyCharm进行安装 3. 下载第三方库文件到本地进行安装 4. 通过国内源进行安装 二.Python第三方库的导入 1. ...

  5. U.2与M.2接口

    U.2接口 U.2接口别称SFF-8639,是由固态硬盘形态工作组(SSD Factor Work Group)推出的接口规范.U.2接口不但能支持SATA-Express(一种PCI-E与SATA混 ...

  6. Docker打包程序镜像

    简介 做了一个视频检测程序,它是由golang和c++编写的.因为公司要做私有化部署,因此需要打包成镜像然后放到公司的registry镜像仓库里.之前一直没有去熟悉docker,现在刚好机会来了,咱就 ...

  7. JDK源码阅读-------自学笔记(八)(数组演示冒泡排序和二分查找)

    冒泡排序 算法 比较相邻的元素.如果第一个比第二个大,就交换他们两个 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数 针对所有的元素重复以上的步骤,除 ...

  8. C 语言编程 — 高级数据类型 — 数组

    目录 文章目录 目录 前文列表 数组 声明数组 初始化数据 访问数组元素 二维数组 指向数组的指针 将数组指针作为实参传入函数 从函数返回一个数组指针 指针数组 数组名和取数组首地址的区别 前文列表 ...

  9. 4G EPS 的架构模型

    目录 文章目录 目录 前文列表 EPS 的架构 EPS 的架构模型 E-UTRAN UE eNodeB EPC MME(移动性管理) SGW(本地移动性锚点) PGW(业务锚点) HSS(用户认证及鉴 ...

  10. salesforce零基础学习(一百三十七)零碎知识点小总结(九)

    本篇参考: https://help.salesforce.com/s/articleView?id=release-notes.rn_lab_conditional_visibiliy_tab.ht ...