使用Python将乳胶代码转换为图像(或其他可显示格式)

Mar*_*ddy 18 python latex

我有一个我正在消耗的函数,它返回一串乳胶代码.我需要从中生成一个图像.我所看到的大多数方法建议通过子进程模块调用外部应用程序,这将为我生成映像.

但是,管理层并不热衷于此,因为除了我们自己的用户之外,它还需要外部用户安装额外的软件,而我们的用户群并不是我们可以认为是一项简单的任务.

那么是否有任何python库可以完成将乳胶转换为可在GUI中显示的格式(如图像文件)的任务?

asm*_*rer 19

SymPy有一个内置预览功能,可以做到这一点.

expr = sin(sqrt(x**2 + 20)) + 1
preview(expr, viewer='file', filename='output.png')
Run Code Online (Sandbox Code Playgroud)

生成

在此输入图像描述

很多选项可以preview更改输出的格式(例如,如果您不喜欢可以设置的Euler字体euler=False).

preview 如果你有的话,也接受一个LaTeX字符串而不是SymPy表达式

preview(r'$$\int_0^1 e^x\,dx$$', viewer='file', filename='test.png', euler=False)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 为了完整起见,对于其他想要调整乳胶图像分辨率的人,您可以将 dvioptions=["-T", "tight", "-z", "0", "--truecolor", " -D 600"] 用于预览功能参数中的 dpi 600。 (3认同)
  • 好的,自己找到了。你必须将 ["-bg", "Transparent"] 附加到 dvioptions: dvioptions=["-T", "tight", "-z", "0", "--truecolor", "-D 600" , "-bg", "透明"] (2认同)

mul*_*sen 13

在提出问题时可能没有这个答案,但我会在2015年之前为那些寻求解决方案的人添加它.

您可以使用matplotlib.pyplot在带有轴的图形中渲染方程式,然后手动移除轴.你也可以用以下方法生成乳胶sympy:

#!/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()
Run Code Online (Sandbox Code Playgroud)

用sympy 0.7.6和matplotlib 测试1.4.3


Sla*_*bko 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')
Run Code Online (Sandbox Code Playgroud)

请记住,它需要枕头和 matplotlib。

pip install matplotlib pillow
Run Code Online (Sandbox Code Playgroud)


Jou*_*nen 5

看看mathtex


D'N*_*bre 0

您将需要使用 LaTeX 来处理字符串。渲染 LaTex/TeX 的过程非常复杂(通常需要 100+MB 的包才能完成工作),您只是无法投入一个小 python 模块来完成工作。