使用 mathtext 解析器输出 svg 文件

Using mathtext parser to output a svg file

上下文

我正在寻找一种简单的方法来将正确排版的数学(使用 LaTeX)导入 blender. A solution for this has already been given。但这意味着离开搅拌机,使用多种工具,然后返回搅拌机并导入整个东西。

Blender 自带 Python 并且可以导入 svg

我想找到其他方法,Blender 有一套基于 Python 的强大工具。我在想:我可以 Python 解析一些 TeX 输入,然后在 inside blender 中生成一个 svg(虚拟)文件吗?这样就可以解决问题了。

matplotlib“模拟”TeX

可以 install any Python library 并在搅拌机中使用它。所以这让我想到了 matplotlib 的一个可能的“hack”。

mathtext 是一个为字符串提供解析器的模块,它具有类似 TeX 的数学表达式语法。 svg 是可用的“后端”之一。

考虑以下片段。

import matplotlib.mathtext as mathtext

parser = mathtext.MathTextParser('svg')
 
t = parser.parse(r'$\int_{0}^{t} x^2 dx = \frac{t^3}{3}$')

t 是一个包含所有所需信息的元组。但我找不到将其转换为(虚拟)svg 文件的方法(在 backend api 中)。

有什么想法吗?

谢谢

Matplotlib 需要一个图形(目前也是 canvas)才能真正渲染任何东西。因此,为了生成一个仅包含文本(数学文本公式)的 svg 文件,您仍然需要一个图形和一个 canvas 并且文本需要实际位于图形内部,这可以通过 fig.text(..). 然后你可以通过 fig.savefig(..) 将图形保存为 svg。使用 bbox_inches="tight" 选项可确保将图形裁剪到文本范围内。并将 facecolor 设置为透明颜色会删除图形的背景补丁。

from matplotlib.backends.backend_agg import FigureCanvasAgg
from matplotlib.figure import Figure

fig = Figure(figsize=(5, 4), dpi=100)
canvas = FigureCanvasAgg(fig)

fig.text(.5, .5, r'$\int_{0}^{t} x^2 dx = \frac{t^3}{3}$', fontsize=40)
fig.savefig("output.svg", bbox_inches="tight", facecolor=(1,1,1,0))