【问题标题】:Converting latex code to Images (or other displayble format) with Python使用 Python 将乳胶代码转换为图像(或其他可显示格式)
【发布时间】:2018-05-04 14:07:09
【问题描述】:

我有一个正在使用的函数,它返回一串乳胶代码。我需要从中生成图像。我见过的大多数这样做的方法都建议通过 subprocess 模块调用外部应用程序,该模块将为我生成图像。

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

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

【问题讨论】:

  • 你想渲染 LaTeX 代码,还是只显示源代码?如果是前者,请注意在 Python 中重新实现 TeX 很疯狂。
  • 我需要显示渲染的乳胶。如果有助于澄清,我需要显示渲染的数学方程式,而不是整个文档。

标签: python latex


【解决方案1】:

SymPy 具有执行此操作的内置预览功能。

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

生成

lots of optionspreview 来改变输出的格式(例如,如果你不喜欢欧拉字体你可以设置euler=False)。

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

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

【讨论】:

  • 我在我的树莓派上运行这个。当我这样做时,我得到RuntimeError: latex program is not installed。你知道我怎么能安装这个。我试过 texlive,但我不想在我的 pi 上有一个千兆字节的文件
  • @BenWebb 抱歉,LaTeX 是一个不小的依赖项。可能有一种方法可以让精简的安装更适合 pi。 LaTeX 附带了很多你不需要的额外东西,比如额外的字体、文档等等。我会问raspberrypi.stackexchange.com。或者,您也许可以使用 MathJax 获得一些东西,尽管这可能并不容易(有关一些建议,请参阅 stackoverflow.com/questions/9969587/…)。或者只是使用 matplotlib 的渲染器(不如 LaTeX 但易于安装)。查看其他答案。
  • 为了完整起见,以及其他希望调整乳胶图像分辨率的人,您可以将 dvioptions=["-T", "tight", "-z", "0" , "--truecolor", "-D 600"] 在预览函数的参数中为 dpi 600。
  • 好的,我自己找到的。您必须将 ["-bg", "Transparent"] 附加到 dvioptions:dvioptions=["-T", "tight", "-z", "0", "--truecolor", "-D 600" , "-bg", "透明"]
  • man dvipng 将显示所有 dvipng 选项。虽然我们也会接受对 SymPy 的拉取请求,以在 preview 文档字符串中记录常见的 dvipng 选项。
【解决方案2】:

在提出问题时可能没有这个答案,但我会为那些在 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()

用 sympy 0.7.6 和 matplotlib 1.4.3 测试

【讨论】:

  • 但是 pyplot 使用自己的 LaTeX 渲染器,它并不总是最好的(与真正的 LaTeX 相比)。不过,它可以在没有安装 LaTeX 的情况下工作,这可能是一个加号。
【解决方案3】:

看看mathtex

【讨论】:

    【解决方案4】:

    这是我经常使用的有点难看的解决方案,但我发现它在很多情况下最容易使用。

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

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

    pip install matplotlib pillow
    

    【讨论】:

      【解决方案5】:

      也许您可以使用这样的在线服务:http://www.codecogs.com/components/equationeditor/equationeditor.php


      按照 Joel A. Christophel 的建议,这里有一个类似的网站:http://arachnoid.com/latex/

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          如果您只需要数学方程式,那么在 python 中找到 mathml 渲染器可能会更好。这个page 可能会提供一些线索,包括一些乳胶数学翻译器。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-06-23
            • 2011-10-31
            • 1970-01-01
            • 2011-07-28
            • 2010-12-18
            • 1970-01-01
            • 2017-07-18
            • 1970-01-01
            相关资源
            最近更新 更多