##// END OF EJS Templates
Add dvipng backend to latex_to_png
Takafumi Arakaki -
Show More
@@ -19,14 +19,18 b' Authors:'
19 19
20 20 from StringIO import StringIO
21 21 from base64 import encodestring
22 import os
23 import tempfile
24 import shutil
25 import subprocess
22 26
23 27 #-----------------------------------------------------------------------------
24 28 # Tools
25 29 #-----------------------------------------------------------------------------
26 30
27 31
28 def latex_to_png(s, encode=False):
29 """Render a LaTeX string to PNG using matplotlib.mathtext.
32 def latex_to_png(s, encode=False, backend='mpl'):
33 """Render a LaTeX string to PNG.
30 34
31 35 Parameters
32 36 ----------
@@ -34,18 +38,71 b' def latex_to_png(s, encode=False):'
34 38 The raw string containing valid inline LaTeX.
35 39 encode : bool, optional
36 40 Should the PNG data bebase64 encoded to make it JSON'able.
41 backend : {mpl, dvipng}
42 Backend for producing PNG data.
43
37 44 """
45 if backend == 'mpl':
46 f = latex_to_png_mpl
47 elif backend == 'dvipng':
48 f = latex_to_png_dvipng
49 else:
50 raise ValueError('No such backend {0}'.format(backend))
51 bin_data = f(s)
52 if encode:
53 bin_data = encodestring(bin_data)
54 return bin_data
55
56
57 def latex_to_png_mpl(s):
38 58 from matplotlib import mathtext
39 59
40 60 mt = mathtext.MathTextParser('bitmap')
41 61 f = StringIO()
42 62 mt.to_png(f, s, fontsize=12)
43 bin_data = f.getvalue()
44 if encode:
45 bin_data = encodestring(bin_data)
63 return f.getvalue()
64
65
66 def latex_to_png_dvipng(s):
67 try:
68 workdir = tempfile.mkdtemp()
69 tmpfile = os.path.join(workdir, "tmp.tex")
70 dvifile = os.path.join(workdir, "tmp.dvi")
71 outfile = os.path.join(workdir, "tmp.png")
72
73 with open(tmpfile, "w") as f:
74 f.write(_latex_header)
75 f.write(s)
76 f.write(_latex_footer)
77
78 subprocess.check_call(
79 ["latex", "-halt-on-errror", tmpfile], cwd=workdir)
80
81 subprocess.check_call(
82 ["dvipng", "-T", "tight", "-x", "1500", "-z", "9",
83 "-bg", "transparent", "-o", outfile, dvifile], cwd=workdir)
84
85 with open(outfile) as f:
86 bin_data = f.read()
87 finally:
88 shutil.rmtree(workdir)
46 89 return bin_data
47 90
48 91
92
93 _latex_header = r'''
94 \documentclass{article}
95 \usepackage{amsmath}
96 \usepackage{amsthm}
97 \usepackage{amssymb}
98 \usepackage{bm}
99 \pagestyle{empty}
100 \begin{document}
101 '''
102
103 _latex_footer = r'\end{document}'
104
105
49 106 _data_uri_template_png = """<img src="data:image/png;base64,%s" alt=%s />"""
50 107
51 108 def latex_to_html(s, alt='image'):
General Comments 0
You need to be logged in to leave comments. Login now