diff --git a/CHANGES b/CHANGES
index 877046c89..a66b9ae2c 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,9 @@
Release 0.5.2 (in development)
==============================
+* Don't call LaTeX or dvipng over and over again if it was not
+ found once, and use text-only latex as a substitute in that case.
+
* Fix problems with footnotes in the LaTeX output.
* Prevent double hyphens becoming en-dashes in literal code in
diff --git a/sphinx/ext/pngmath.py b/sphinx/ext/pngmath.py
index dc1d2ee8d..5b7f280a5 100644
--- a/sphinx/ext/pngmath.py
+++ b/sphinx/ext/pngmath.py
@@ -82,6 +82,11 @@ def render_math(self, math):
depth = read_png_depth(outfn)
return relfn, depth
+ # if latex or dvipng has failed once, don't bother to try again
+ if hasattr(self.builder, '_mathpng_warned_latex') or \
+ hasattr(self.builder, '_mathpng_warned_dvipng'):
+ return None, None
+
latex = DOC_HEAD + self.builder.config.pngmath_latex_preamble
latex += (use_preview and DOC_BODY_PREVIEW or DOC_BODY) % math
if isinstance(latex, unicode):
@@ -116,12 +121,11 @@ def render_math(self, math):
except OSError, err:
if err.errno != 2: # No such file or directory
raise
- if not hasattr(self.builder, '_mathpng_warned_latex'):
- self.builder.warn('LaTeX command %r cannot be run (needed for math '
- 'display), check the pngmath_latex setting' %
- self.builder.config.pngmath_latex)
- self.builder._mathpng_warned_latex = True
- return relfn, None
+ self.builder.warn('LaTeX command %r cannot be run (needed for math '
+ 'display), check the pngmath_latex setting' %
+ self.builder.config.pngmath_latex)
+ self.builder._mathpng_warned_latex = True
+ return None, None
finally:
chdir(curdir)
@@ -145,12 +149,11 @@ def render_math(self, math):
except OSError, err:
if err.errno != 2: # No such file or directory
raise
- if not hasattr(self.builder, '_mathpng_warned_dvipng'):
- self.builder.warn('dvipng command %r cannot be run (needed for math '
- 'display), check the pngmath_dvipng setting' %
- self.builder.config.pngmath_dvipng)
- self.builder._mathpng_warned_dvipng = True
- return relfn, None
+ self.builder.warn('dvipng command %r cannot be run (needed for math '
+ 'display), check the pngmath_dvipng setting' %
+ self.builder.config.pngmath_dvipng)
+ self.builder._mathpng_warned_dvipng = True
+ return None, None
stdout, stderr = p.communicate()
if p.returncode != 0:
raise MathExtError('dvipng exited with error:\n[stderr]\n%s\n[stdout]\n%s'
@@ -185,9 +188,15 @@ def html_visit_math(self, node):
sm.walkabout(self)
self.builder.warn('display latex %r: ' % node['latex'] + str(exc))
raise nodes.SkipNode
- self.body.append('' %
- (fname, self.encode(node['latex']).strip(),
- depth and 'style="vertical-align: %dpx" ' % (-depth) or ''))
+ if fname is None:
+ # something failed -- use text-only as a bad substitute
+ self.body.append('%s' %
+ self.encode(node['latex']).strip())
+ else:
+ self.body.append(
+ '
' %
+ (fname, self.encode(node['latex']).strip(),
+ depth and 'style="vertical-align: %dpx" ' % (-depth) or ''))
raise nodes.SkipNode
def html_visit_displaymath(self, node):
@@ -207,8 +216,13 @@ def html_visit_displaymath(self, node):
self.body.append('
')
if node['number']:
self.body.append('(%s)' % node['number'])
- self.body.append('\n' %
- (fname, self.encode(node['latex']).strip()))
+ if fname is None:
+ # something failed -- use text-only as a bad substitute
+ self.body.append('%s' %
+ self.encode(node['latex']).strip())
+ else:
+ self.body.append('
\n' %
+ (fname, self.encode(node['latex']).strip()))
self.body.append('