[ManimGL 源碼解讀] SingleStringTex 如何渲染公式
和?Tex
?一樣,定義在?manimlib/mobject/svg/tex_mobject.py
。傳入單個(gè)字符串?tex_string
?渲染出?SVGMobject
。
檢測(cè)類型,保存?tex_string
,調(diào)用?SVGMobject.__init__
。
init_svg_mobject
?大概就是設(shè)置散列(Hash),生成 SVG。
SingleStringTex
?重寫了?SVGMobject.hash_seed
(獲取散列種子方法)。
與父類相比,SingleStringTex.hash_seed
?去掉?file_name
(因?yàn)槭?None
),添加?tex_string
(傳入的 LaTeX 字符串)、alignment
(對(duì)齊方式,默認(rèn)?"\centering"
)、math_mode
(是否開啟數(shù)學(xué)環(huán)境,默認(rèn)?True
)(為什么要這樣做?)。
SVG_HASH_TO_MOB_MAP
?是一個(gè)存儲(chǔ)?VMobject
?的散列值的字典。
generate_mobject
?生成 SVG。
SingleStringTex
?重寫了?get_file_path
?方法。它會(huì)根據(jù)一開始提供的?tex_string
?渲染 SVG 文件,返回文件名。display_during_execution
?給出提示信息。
get_tex_file_body
?獲得最終寫入?.tex
?的字符串。
get_modified_expression
?獲得?tex_string
?特殊處理(大概是補(bǔ)全括號(hào)之類的)后的字符串,用?new_tex
?保存。
modify_special_strings
?特殊處理?tex_string
?(這兩個(gè)函數(shù)直接把我整蒙了,get_modified_expression
?里面就直接?return
?掉,差不多就是起了個(gè)別名。而且它還會(huì)對(duì)一個(gè)字符串?strip
?兩次??我很難理解這樣做的用意)。
(modify_special_strings
?代碼我就不貼了,60+ 行又臭又長)
tex_to_svg_file
?讀取?.tex
?文件位置,根據(jù)?tex_file_content
?計(jì)算散列值構(gòu)造文件名(svg_file
)。如果沒有渲染過,則寫入?.tex
?文件并渲染它。
get_tex_dir
?獲得保存?.tex
?文件的文件夾。
get_temp_dir
?獲得保存臨時(shí)文件的位置。在 Linux 上是?/tmp
。
get_directories
?獲得文件夾設(shè)置。
CUSTOMIZATION
?一開始是空字典,第一次調(diào)用后就會(huì)把?default_config.yml
?和?custom_config.yml
(若存在)轉(zhuǎn)換成字典。可以看出,這里有對(duì)?temporary_storage
?特判:若它是空字符串?""
,則把它設(shè)置為操作系統(tǒng)的默認(rèn)臨時(shí)文件存放位置(tempfile.gettempdir()
)。
guarantee_existence
?保證文件夾存在。如果不存在就新建文件夾。
tex_hash
?根據(jù)?tex_content
?生成對(duì)應(yīng)散列值,這是用于判斷兩個(gè)?SingleStringTex
?是否相等的方法?;叵肭懊娴?SingleStringTex.hash_seed
,增加的內(nèi)容正好共同決定了?tex_content
。其實(shí)現(xiàn)在你還可以再看看?SVGMobject.init_svg_mobject
,相同的不僅不會(huì)重復(fù)渲染,也不會(huì)重復(fù)執(zhí)行?generate_mobject
。
現(xiàn)在我們終于弄清 ManimGL 如何生成?.tex
?的文件名的細(xì)節(jié)了。這時(shí)文件名保存在?tex_to_svg_file
?變量里,最終返回的也是這個(gè)變量。接下來我們來看看 ManimGL 怎么調(diào)用 LaTeX,怎么生成最終的 SVG 文件。
tex_to_svg
?把傳入的?tex_file_content
?渲染成 SVG,寫入傳入的?svg_file
,返回?svg_file
。可以看到,svg_file
?的后綴轉(zhuǎn)換成?.svg
,保存在?tex_file
。接著打開文件,把?tex_file_content
?寫入?tex_file
,開始渲染(如果以前渲染過的話就不會(huì)調(diào)用?tex_to_svg
)。渲染完成后,把除了?.svg
?的文件刪除。
tex_to_dvi
?調(diào)用?letax
(xelatex -no-pdf
) 把?.tex
?渲染成?.dvi
(.xdv
) 文件。
dvi_to_svg
?調(diào)用?dvisvgm
?把?.dvi
?轉(zhuǎn)換成?.svg
?文件。
回到生成 SVG 的?generate_mobject
,后面是雜七雜八地對(duì)?.svg
?一頓操作。不過這些都不是和渲染公式相關(guān)的,不是本文重點(diǎn)。
回到?SVGMobject.__init__
,后面是調(diào)用設(shè)置顏色、位置的方法。
再退回?SingleStringTex.__init__
,后面是設(shè)置高度、給?submobjects
?排序。
沒了。