latex improvements

- move latex preamble into a deck var and include amsmath by default
- include the pre/postamble in the hash, so changes to the preamble result in
  newly generated images
This commit is contained in:
Damien Elmes 2010-12-11 02:05:00 +09:00
parent b0f300bb74
commit 70eb44bce2
2 changed files with 16 additions and 13 deletions

View file

@ -164,7 +164,7 @@ class Deck(object):
self.lastSessionStart = 0 self.lastSessionStart = 0
self.queueLimit = 200 self.queueLimit = 200
# if most recent deck var not defined, make sure defaults are set # if most recent deck var not defined, make sure defaults are set
if not self.s.scalar("select 1 from deckVars where key = 'mediaURL'"): if not self.s.scalar("select 1 from deckVars where key = 'latexPost'"):
self.setVarDefault("suspendLeeches", True) self.setVarDefault("suspendLeeches", True)
self.setVarDefault("leechFails", 16) self.setVarDefault("leechFails", 16)
self.setVarDefault("perDay", True) self.setVarDefault("perDay", True)
@ -174,6 +174,14 @@ class Deck(object):
self.setVarDefault("revInactive", self.suspended) self.setVarDefault("revInactive", self.suspended)
self.setVarDefault("newSpacing", 60) self.setVarDefault("newSpacing", 60)
self.setVarDefault("mediaURL", "") self.setVarDefault("mediaURL", "")
self.setVarDefault("latexPre", (
"\\documentclass[12pt]{article}\n"
"\\special{papersize=3in,5in}"
"\\usepackage[utf8]{inputenc}"
"\\usepackage{amssymb,amsmath}"
"\\pagestyle{empty}\n"
"\\begin{document}"))
self.setVarDefault("latexPost", "\\end{document}")
self.updateCutoff() self.updateCutoff()
self.setupStandardScheduler() self.setupStandardScheduler()

View file

@ -13,12 +13,6 @@ from anki.utils import genID, checksum, call
from anki.hooks import addHook from anki.hooks import addHook
from htmlentitydefs import entitydefs from htmlentitydefs import entitydefs
latexPreamble = ("\\documentclass[12pt]{article}\n"
"\\special{papersize=3in,5in}"
"\\usepackage[utf8]{inputenc}"
"\\pagestyle{empty}\n"
"\\begin{document}")
latexPostamble = "\\end{document}"
latexDviPngCmd = ["dvipng", "-D", "200", "-T", "tight"] latexDviPngCmd = ["dvipng", "-D", "200", "-T", "tight"]
regexps = { regexps = {
@ -61,22 +55,23 @@ def latexImgFile(deck, latexCode):
key = checksum(latexCode) key = checksum(latexCode)
return "latex-%s.png" % key return "latex-%s.png" % key
def mungeLatex(latex): def mungeLatex(deck, latex):
"Convert entities, fix newlines, and convert to utf8." "Convert entities, fix newlines, convert to utf8, and wrap pre/postamble."
for match in re.compile("&([a-z]+);", re.IGNORECASE).finditer(latex): for match in re.compile("&([a-z]+);", re.IGNORECASE).finditer(latex):
if match.group(1) in entitydefs: if match.group(1) in entitydefs:
latex = latex.replace(match.group(), entitydefs[match.group(1)]) latex = latex.replace(match.group(), entitydefs[match.group(1)])
latex = re.sub("<br( /)?>", "\n", latex) latex = re.sub("<br( /)?>", "\n", latex)
latex = latex.encode("utf-8") latex = latex.encode("utf-8")
latex = (deck.getVar("latexPre") + "\n" +
latex + "\n" +
deck.getVar("latexPost"))
return latex return latex
def buildImg(deck, latex): def buildImg(deck, latex):
log = open(os.path.join(tmpdir, "latex_log.txt"), "w+") log = open(os.path.join(tmpdir, "latex_log.txt"), "w+")
texpath = os.path.join(tmpdir, "tmp.tex") texpath = os.path.join(tmpdir, "tmp.tex")
texfile = file(texpath, "w") texfile = file(texpath, "w")
texfile.write(latexPreamble + "\n") texfile.write(latex)
texfile.write(latex + "\n")
texfile.write(latexPostamble + "\n")
texfile.close() texfile.close()
# make sure we have a valid mediaDir # make sure we have a valid mediaDir
mdir = deck.mediaDir(create=True) mdir = deck.mediaDir(create=True)
@ -125,7 +120,7 @@ def imageForLatex(deck, latex, build=True):
def imgLink(deck, latex, build=True): def imgLink(deck, latex, build=True):
"Parse LATEX and return a HTML image representing the output." "Parse LATEX and return a HTML image representing the output."
latex = mungeLatex(latex) latex = mungeLatex(deck, latex)
(ok, img) = imageForLatex(deck, latex, build) (ok, img) = imageForLatex(deck, latex, build)
if ok: if ok:
return '<img src="%s">' % img return '<img src="%s">' % img