用Python将LaTeX代码转换为图片(或其他可显示格式)
我有一个函数,它返回一串latex代码。我需要从这串代码生成一张图片。大多数我看到的方法都是通过调用外部程序,比如用subprocess模块,这样可以帮我生成图片。
不过,管理层对此不太赞同,因为这会要求外部用户在我们的软件之外再安装额外的软件,而考虑到我们的用户群体,这并不是一件简单的事情。
所以,有没有什么Python库可以直接把latex转换成可以在图形界面上显示的格式(比如图片文件)呢?
8 个回答
7
这是我常用的一种不太优雅的解决方案,但在很多情况下我发现它是最简单的。
import matplotlib.pyplot as plt
import io
from PIL import Image, ImageChops
white = (255, 255, 255, 255)
def latex_to_img(tex):
buf = io.BytesIO()
plt.rc('text', usetex=True)
plt.rc('font', family='serif')
plt.axis('off')
plt.text(0.05, 0.5, f'${tex}$', size=40)
plt.savefig(buf, format='png')
plt.close()
im = Image.open(buf)
bg = Image.new(im.mode, im.size, white)
diff = ImageChops.difference(im, bg)
diff = ImageChops.add(diff, diff, 2.0, -100)
bbox = diff.getbbox()
return im.crop(bbox)
latex_to_img(r'\frac{x}{y^2}').save('img.png')
请记住,这个方法需要用到pillow和matplotlib这两个库。
pip install matplotlib pillow
18
这个回答可能在提问时并不存在,但我会把它加上,方便2015年后寻找解决方案的人。
你可以使用 matplotlib.pyplot
来在图表中显示一个方程,并且可以手动去掉坐标轴。你还可以用 sympy
来生成latex格式的方程:
#!/usr/bin/env python2.7
import matplotlib.pyplot as plt
import sympy
x = sympy.symbols('x')
y = 1 + sympy.sin(sympy.sqrt(x**2 + 20))
lat = sympy.latex(y)
#add text
plt.text(0, 0.6, r"$%s$" % lat, fontsize = 50)
#hide axes
fig = plt.gca()
fig.axes.get_xaxis().set_visible(False)
fig.axes.get_yaxis().set_visible(False)
plt.draw() #or savefig
plt.show()
这个方法是在使用 sympy 0.7.6
和 matplotlib 1.4.3
时测试过的。
37
SymPy 有一个内置的预览功能,可以做到这一点。
expr = sin(sqrt(x**2 + 20)) + 1
preview(expr, viewer='file', filename='output.png')
这个功能会生成如下内容:
对于 preview
,有很多选项可以改变输出的格式(比如,如果你不喜欢欧拉字体,可以设置 euler=False
)。
如果你有 LaTeX 字符串,也可以直接用它来替代 SymPy 表达式,preview
也能接受。
preview(r'$$\int_0^1 e^x\,dx$$', viewer='file', filename='test.png', euler=False)