apostrophe/uberwriter/latex_to_PNG.py

111 lines
3.4 KiB
Python
Raw Normal View History

2014-07-06 20:35:24 +00:00
# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
"""
Based on latex2png.py from Stuart Rackham
AUTHOR
Written by Stuart Rackham, <srackham@gmail.com>
The code was inspired by Kjell Magne Fauske"s code:
http://fauskes.net/nb/htmleqII/
2014-07-06 20:35:24 +00:00
See also:
http://www.amk.ca/python/code/mt-math
http://code.google.com/p/latexmath2png/
2014-07-06 20:35:24 +00:00
COPYING
Copyright (C) 2010 Stuart Rackham. Free use of this software is
granted under the terms of the MIT License.
2014-07-06 20:35:24 +00:00
"""
import os
import subprocess
import tempfile
2014-07-06 20:35:24 +00:00
class LatexToPNG:
TEX_HEADER = r"""\documentclass{article}
\usepackage{amsmath}
\usepackage{amsthm}
\usepackage{amssymb}
\usepackage{bm}
\newcommand{\mx}[1]{\mathbf{\bm{#1}}} % Matrix command
\newcommand{\vc}[1]{\mathbf{\bm{#1}}} % Vector command
\newcommand{\T}{\text{T}} % Transpose
\pagestyle{empty}
\begin{document}"""
TEX_FOOTER = r"""\end{document}"""
def __init__(self):
self.temp_result = tempfile.NamedTemporaryFile(suffix=".png")
def latex2png(self, tex, outfile, dpi, modified):
"""Convert LaTeX input file infile to PNG file named outfile."""
outfile = os.path.abspath(outfile)
outdir = os.path.dirname(outfile)
texfile = tempfile.mktemp(suffix=".tex", dir=os.path.dirname(outfile))
basefile = os.path.splitext(texfile)[0]
dvifile = basefile + ".dvi"
temps = [basefile + ext for ext in (".tex", ".dvi", ".aux", ".log")]
skip = False
tex = "{}\n{}\n{}\n".format(self.TEX_HEADER, tex.strip(), self.TEX_FOOTER)
open(texfile, "w").write(tex)
saved_pwd = os.getcwd()
os.chdir(outdir)
args = ["latex", "-halt-on-error", texfile]
p = subprocess.Popen(args,
stderr=subprocess.STDOUT,
stdout=subprocess.PIPE)
output = p.stdout
output_lines = output.readlines()
if os.path.isfile(dvifile): # DVI File exists
# Convert DVI file to PNG.
args = ["dvipng",
"-D", str(dpi),
"-T", "tight",
"-x", "1000",
"-z", "9",
"-bg", "Transparent",
"-o", outfile,
dvifile]
p = subprocess.Popen(args)
p.communicate()
else:
self.clean_up(temps)
"""
Errors in Latex output start with "! "
Stripping exclamation marks and superflous newlines
and telling the user what he"s done wrong.
"""
i = []
error = ""
for line in output_lines:
line = line.decode("utf-8")
if line.startswith("!"):
error += line[2:] # removing "! "
if error.endswith("\n"):
error = error[:-1]
raise Exception(error)
def generatepng(self, formula):
try:
self.temp_result = tempfile.NamedTemporaryFile(suffix=".png")
formula = "$" + formula + "$"
self.latex2png(formula, self.temp_result.name, 300, False)
return True, self.temp_result.name
except Exception as e:
self.temp_result.close()
return False, e.args[0]
def clean_up(self, files):
for f in files:
if os.path.isfile(f):
os.remove(f)