Converting latex code to Images (or other displayble format) with Python

前端 未结 7 1101
谎友^
谎友^ 2020-12-05 07:42

I have a function I am consuming that returns a string of latex code. I need to generate an image from this. Most of the methods I have seen for doing so suggest calling a

相关标签:
7条回答
  • 2020-12-05 08:06

    This is a bit ugly solution I often use, but I found it easiest to use in many cases.

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

    Keep in mind, it requires pillow and matplotlib.

    pip install matplotlib pillow
    
    0 讨论(0)
  • 2020-12-05 08:15

    Maybe you could use an online service such as this one: http://www.codecogs.com/components/equationeditor/equationeditor.php.


    Following Joel A. Christophel's suggestion, here's a working similar website: http://arachnoid.com/latex/

    0 讨论(0)
  • 2020-12-05 08:18

    this answer might not have been available at the time when the question was asked, but i will add it for those seeking a solution as of 2015.

    you can use matplotlib.pyplot to render an equation in a graph with axes, and then remove the axes manually. you can also generate the latex with 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()
    

    tested with sympy 0.7.6 and matplotlib 1.4.3

    0 讨论(0)
  • 2020-12-05 08:20

    SymPy has a builtin preview function that does this.

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

    generates

    There are lots of options to preview to change the format of the output (for instance, if you don't like the Euler font you can set euler=False).

    preview also accepts a LaTeX string instead of a SymPy expression if you have that

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

    0 讨论(0)
  • 2020-12-05 08:23

    If it is just math equations that you need, you will probably have better luck finding a mathml renderer in python. This page might provide some clues, including some latex-mathml translators.

    0 讨论(0)
  • 2020-12-05 08:26

    Take a look at mathtex.

    0 讨论(0)
提交回复
热议问题