上一篇介绍的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. 最好用的AI换脸软件,rope下载介绍(支持cpu)

    随着AI技术的广泛运用,市面上的换脸软件也多了起来,今天给各位介绍其中的王者Rope! 先上两个动图,给大伙看看效果 rope是如何实现这种自然的效果呢?这得益于机器学习技术的不断发展,rope经过深 ...

  2. 13、web 中间件加固-Nginx 加固

    1.隐藏版本信息 避免被针对版本直接使用漏洞 修改 nginx.conf 文件 在 http 模块中添加信息:server_tokens off; 2.限制目录权限 某些目录为运维页面,不要公开访问 ...

  3. ElasticView 是一款用来监控elasticsearch状态和操作elasticsearch索引的web可视化工具。

    ElasticView 是一款用来监控elasticsearch状态和操作elasticsearch索引的web可视化工具. 它由golang开发而成,具有部署方便,占用内存小等优点 es连接树管理( ...

  4. 智慧城市three.js数字孪生三维展示城市建筑轮廓数据获取方法分析和AI算法方案剖析

    一.目前世面上有的2种免费方案是 1.OpenStreetMap开源网站下载, 2.blender的gis插件获取城市建筑轮廓. 缺点是:只有重点城市和省会城市,一些地级市或者县级市基本没有数据. 二 ...

  5. 关于小说阅读前端翻页插件推荐turn.js

    http://www.turnjs.com

  6. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(12.A)- uSDHC eMMC启动时间(RT1170)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1170 uSDHC eMMC启动时间. 本篇是 i.MXRT1170 启动时间评测第五弹,前四篇分别给大家评测了 ...

  7. USRP B210 软件定义的无线网络(SDR)支撑设备

    目录 文章目录 目录 蜂窝网络 蜂窝网络的组成 USRP B210 USRP B210 的功能清单与相关参数 USRP B210 的系统结构与运行原理 相关知识储备 SDR RFIC RF 发展历程 ...

  8. java学习之旅(day.06)

    switch多选择结构 多选择结构还有一个实现方式就是switch case switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支 switch(expression ...

  9. java学习之旅(day.01)

    Markdown学习 标题 一级标题:#空格+标题名字 二级标题:##空格+标题名字 三级标题:###空格+标题名字 字体 粗体:两边都加两个** Hello,world 斜体:两边都加一个* Hel ...

  10. PHP常用排序算法02——快速、归并

    接着上篇,我们继续来学习下工程中最常用的排序算法,适合大规模数据排序的算法,快速排序(quickSort)和归并排序(mergeSort). PS:对排序等算法还不太了解的同学,可以去看下这个链接哦, ...