|
Packit Service |
76cb02 |
#
|
|
Packit Service |
76cb02 |
# Basic module compiling a file with LaTeX
|
|
Packit Service |
76cb02 |
#
|
|
Packit Service |
76cb02 |
import os
|
|
Packit Service |
76cb02 |
import re
|
|
Packit Service |
76cb02 |
import shutil
|
|
Packit Service |
cd7d79 |
from io import open
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
cd7d79 |
from dbtexmf.dblatex.grubber.texbuilder import LatexBuilder
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
class RunLatex:
|
|
Packit Service |
76cb02 |
def __init__(self):
|
|
Packit Service |
76cb02 |
self.fig_paths = []
|
|
Packit Service |
76cb02 |
self.index_style = ""
|
|
Packit Service |
76cb02 |
self.backend = "pdftex"
|
|
Packit Service |
76cb02 |
self.texpost = ""
|
|
Packit Service |
76cb02 |
self.texer = LatexBuilder()
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
def set_fig_paths(self, paths):
|
|
Packit Service |
76cb02 |
# Assume the paths are already absolute
|
|
Packit Service |
76cb02 |
if not(paths):
|
|
Packit Service |
76cb02 |
return
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
# Use TEXINPUTS to handle paths containing spaces
|
|
Packit Service |
76cb02 |
paths_blank = []
|
|
Packit Service |
76cb02 |
paths_input = []
|
|
Packit Service |
76cb02 |
for p in paths:
|
|
Packit Service |
76cb02 |
if p.find(" ") != -1:
|
|
Packit Service |
76cb02 |
paths_blank.append(p + "//")
|
|
Packit Service |
76cb02 |
else:
|
|
Packit Service |
76cb02 |
paths_input.append(p)
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
if paths_blank:
|
|
Packit Service |
76cb02 |
texinputs = os.pathsep.join(paths_blank)
|
|
Packit Service |
76cb02 |
os.environ["TEXINPUTS"] = os.getenv("TEXINPUTS") + os.pathsep + \
|
|
Packit Service |
76cb02 |
texinputs
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
paths = paths_input
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
# Unixify the paths when under Windows
|
|
Packit Service |
76cb02 |
if os.sep != "/":
|
|
Packit Service |
76cb02 |
paths = [p.replace(os.sep, "/") for p in paths]
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
# Protect from tilde active char (maybe others?)
|
|
Packit Service |
76cb02 |
self.fig_paths = [p.replace("~", r"\string~") for p in paths]
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
def set_bib_paths(self, bibpaths, bstpaths=None):
|
|
Packit Service |
76cb02 |
# Just set BIBINPUTS and/or BSTINPUTS
|
|
Packit Service |
76cb02 |
if bibpaths:
|
|
Packit Service |
76cb02 |
os.environ["BIBINPUTS"] = os.pathsep.join(bibpaths +
|
|
Packit Service |
76cb02 |
[os.getenv("BIBINPUTS", "")])
|
|
Packit Service |
76cb02 |
if bstpaths:
|
|
Packit Service |
76cb02 |
os.environ["BSTINPUTS"] = os.pathsep.join(bstpaths +
|
|
Packit Service |
76cb02 |
[os.getenv("BSTINPUTS", "")])
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
def set_backend(self, backend):
|
|
Packit Service |
76cb02 |
if not(backend in ("dvips", "pdftex", "xetex")):
|
|
Packit Service |
76cb02 |
raise ValueError("'%s': invalid backend" % backend)
|
|
Packit Service |
76cb02 |
self.backend = backend
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
def get_backend(self):
|
|
Packit Service |
76cb02 |
return self.backend
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
def _clear_params(self):
|
|
Packit Service |
76cb02 |
self._param_started = 0
|
|
Packit Service |
76cb02 |
self._param_ended = 0
|
|
Packit Service |
76cb02 |
self._params = {}
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
def _set_params(self, line):
|
|
Packit Service |
76cb02 |
# FIXME
|
|
Packit Service |
76cb02 |
if self._param_ended:
|
|
Packit Service |
76cb02 |
return
|
|
Packit Service |
76cb02 |
if not(self._param_started):
|
|
Packit Service |
76cb02 |
if line.startswith("%%<params>"): self._param_started = 1
|
|
Packit Service |
76cb02 |
return
|
|
Packit Service |
76cb02 |
if line.startswith("%%</params>"):
|
|
Packit Service |
76cb02 |
self._param_ended = 1
|
|
Packit Service |
76cb02 |
return
|
|
Packit Service |
76cb02 |
# Expected format is: '%% <param_name> <param_string>\n'
|
|
Packit Service |
76cb02 |
p = line.split(" ", 2)
|
|
Packit Service |
76cb02 |
self._params[p[1]] = p[2].strip()
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
def compile(self, texfile, binfile, format, batch=1):
|
|
Packit Service |
76cb02 |
root = os.path.splitext(texfile)[0]
|
|
Packit Service |
76cb02 |
tmptex = root + "_tmp" + ".tex"
|
|
Packit Service |
76cb02 |
texout = root + "." + format
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
# The temporary file contains the extra paths
|
|
Packit Service |
cd7d79 |
f = open(tmptex, "wt", encoding="latin-1")
|
|
Packit Service |
76cb02 |
if self.fig_paths:
|
|
Packit Service |
76cb02 |
paths = "{" + "//}{".join(self.fig_paths) + "//}"
|
|
Packit Service |
cd7d79 |
f.write(u"\\makeatletter\n")
|
|
Packit Service |
cd7d79 |
f.write(u"\\def\\input@path{%s}\n" % paths)
|
|
Packit Service |
cd7d79 |
f.write(u"\\makeatother\n")
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
# Copy the original file and collect parameters embedded in the tex file
|
|
Packit Service |
76cb02 |
self._clear_params()
|
|
Packit Service |
cd7d79 |
input = open(texfile, "rt", encoding="latin-1")
|
|
Packit Service |
76cb02 |
for line in input:
|
|
Packit Service |
76cb02 |
self._set_params(line)
|
|
Packit Service |
76cb02 |
f.write(line)
|
|
Packit Service |
76cb02 |
f.close()
|
|
Packit Service |
76cb02 |
input.close()
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
# Replace the original file with the new one
|
|
Packit Service |
76cb02 |
shutil.move(tmptex, texfile)
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
# Build the output file
|
|
Packit Service |
76cb02 |
try:
|
|
Packit Service |
76cb02 |
self.texer.batch = batch
|
|
Packit Service |
76cb02 |
self.texer.texpost = self.texpost
|
|
Packit Service |
76cb02 |
self.texer.encoding = self._params.get("latex.encoding", "latin-1")
|
|
Packit Service |
76cb02 |
self.texer.options = self._params.get("latex.engine.options")
|
|
Packit Service |
76cb02 |
self.texer.lang = self._params.get("document.language")
|
|
Packit Service |
76cb02 |
self.texer.set_format(format)
|
|
Packit Service |
76cb02 |
self.texer.set_backend(self.backend)
|
|
Packit Service |
76cb02 |
if self.index_style:
|
|
Packit Service |
76cb02 |
self.texer.index.style = self.index_style
|
|
Packit Service |
76cb02 |
self.texer.index.tool = self._params.get("latex.index.tool")
|
|
Packit Service |
76cb02 |
self.texer.index.lang = self._params.get("latex.index.language")
|
|
Packit Service |
76cb02 |
self.texer.compile(texfile)
|
|
Packit Service |
76cb02 |
self.texer.print_misschars()
|
|
Packit Service |
76cb02 |
except:
|
|
Packit Service |
76cb02 |
# On error, dump the log errors and raise again
|
|
Packit Service |
76cb02 |
self.texer.print_errors()
|
|
Packit Service |
76cb02 |
raise
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
if texout != binfile:
|
|
Packit Service |
76cb02 |
shutil.move(texout, binfile)
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
def clean(self):
|
|
Packit Service |
76cb02 |
self.texer.clean()
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
def reinit(self):
|
|
Packit Service |
76cb02 |
self.texer.reinit()
|
|
Packit Service |
76cb02 |
|