用Python将LaTeX代码转换为图片(或其他可显示格式)

29 投票
8 回答
26559 浏览
提问于 2025-04-15 14:05

我有一个函数,它返回一串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)

这里是图片描述

撰写回答