diff --git a/IPython/extensions/sympyprinting.py b/IPython/extensions/sympyprinting.py index c0bd6c0..409ebd7 100644 --- a/IPython/extensions/sympyprinting.py +++ b/IPython/extensions/sympyprinting.py @@ -65,7 +65,7 @@ def print_display_png(o): s = s.strip('$') # As matplotlib does not support display style, dvipng backend is # used here. - png = latex_to_png('$$%s$$' % s, backend='dvipng') + png = latex_to_png(s, backend='dvipng', wrap=True) return png diff --git a/IPython/lib/latextools.py b/IPython/lib/latextools.py index 1d40746..d500b8d 100644 --- a/IPython/lib/latextools.py +++ b/IPython/lib/latextools.py @@ -31,7 +31,7 @@ from IPython.utils.process import find_cmd, FindCmdError #----------------------------------------------------------------------------- -def latex_to_png(s, encode=False, backend='mpl'): +def latex_to_png(s, encode=False, backend='mpl', wrap=False): """Render a LaTeX string to PNG. Parameters @@ -42,6 +42,8 @@ def latex_to_png(s, encode=False, backend='mpl'): Should the PNG data bebase64 encoded to make it JSON'able. backend : {mpl, dvipng} Backend for producing PNG data. + wrap : bool + If true, Automatically wrap `s` as a LaTeX equation. None is returned when the backend cannot be used. @@ -52,25 +54,27 @@ def latex_to_png(s, encode=False, backend='mpl'): f = latex_to_png_dvipng else: raise ValueError('No such backend {0}'.format(backend)) - bin_data = f(s) + bin_data = f(s, wrap) if encode and bin_data: bin_data = encodestring(bin_data) return bin_data -def latex_to_png_mpl(s): +def latex_to_png_mpl(s, wrap): try: from matplotlib import mathtext except ImportError: return None - + + if wrap: + s = '${0}$'.format(s) mt = mathtext.MathTextParser('bitmap') f = StringIO() mt.to_png(f, s, fontsize=12) return f.getvalue() -def latex_to_png_dvipng(s): +def latex_to_png_dvipng(s, wrap): try: find_cmd('latex') find_cmd('dvipng') @@ -83,9 +87,7 @@ def latex_to_png_dvipng(s): outfile = os.path.join(workdir, "tmp.png") with open(tmpfile, "w") as f: - f.write(_latex_header) - f.write(s) - f.write(_latex_footer) + f.writelines(genelatex(s, wrap)) subprocess.check_call( ["latex", "-halt-on-errror", tmpfile], cwd=workdir, @@ -103,17 +105,39 @@ def latex_to_png_dvipng(s): return bin_data -_latex_header = r''' -\documentclass{article} -\usepackage{amsmath} -\usepackage{amsthm} -\usepackage{amssymb} -\usepackage{bm} -\pagestyle{empty} -\begin{document} -''' - -_latex_footer = r'\end{document}' +def kpsewhich(filename): + """Invoke kpsewhich command with an argument `filename`.""" + try: + find_cmd("kpsewhich") + proc = subprocess.Popen( + ["kpsewhich", filename], + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + (stdout, stderr) = proc.communicate() + return stdout.strip() + except FindCmdError: + pass + + +def genelatex(body, wrap): + """Generate LaTeX document for dvipng backend.""" + breqn = wrap and kpsewhich("breqn.sty") + yield r'\documentclass{article}' + packages = ['amsmath', 'amsthm', 'amssymb', 'bm'] + if breqn: + packages.append('breqn') + for pack in packages: + yield r'\usepackage{{{0}}}'.format(pack) + yield r'\pagestyle{empty}' + yield r'\begin{document}' + if breqn: + yield r'\begin{dmath*}' + yield body + yield r'\end{dmath*}' + elif wrap: + yield '$${0}$$'.format(body) + else: + yield body + yield r'\end{document}' _data_uri_template_png = """%s"""