Использование синтаксического анализатора mathtext для вывода файла SVG - PullRequest
0 голосов
/ 30 ноября 2018

Context

Я ищу простой способ импортировать правильно набранную математику (с LaTeX) в blender .Решение для этого уже дано .Но это означает, что нужно выйти из blender, использовать несколько инструментов, а затем вернуться в blender и импортировать все это.

Blender поставляется с Python и может импортировать svg

Я бы хотел найтиДругой способ и Blender имеет набор мощных инструментов на основе Python.Я думал: могу ли я заставить Python анализировать некоторые входные данные TeX и затем генерировать SVG (виртуальный) файл внутри блендера.Это решило бы проблему.

matplotlib "эмулирует" TeX

Можно установить любую библиотеку Python и использовать ее внутри блендера.Так что это заставило меня задуматься о возможном "взломе" matplotlib.

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 - это кортеж, содержащий всю необходимую информацию.Но я не могу найти способ (в бэкэнд API ) преобразовать его в (виртуальный) SVG-файл.

Есть идеи?

Спасибо

1 Ответ

0 голосов
/ 30 ноября 2018

Matplotlib нужна фигура (и в настоящее время также холст), чтобы на самом деле можно было что-либо визуализировать.Таким образом, для создания SVG-файла, единственным содержимым которого является текст (формула математического текста), вам все еще нужны фигура и холст, а текст должен фактически находиться внутри фигуры, чего можно достичь с помощью fig.text(..).Затем вы можете сохранить фигуру в SVG через fig.savefig(..).Использование параметра bbox_inches="tight" обеспечивает обрезку рисунка по размеру текста.При установке прозрачного цвета для лица удаляется фоновый участок фигуры.

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

enter image description here

...