pyltk/pyltk/documentclass.py

89 lines
2.5 KiB
Python

# -*- encoding: utf-8 -*-
from collections import Iterable
from .element import element
import subprocess
class documentclass(element):
packages = {}
preamble = []
options = []
classname = 'standalone'
templates = {
'package': '\\usepackage{pkgoptions}{{{pkgname}}}',
'options': '[{content}]',
'def': '\\def\\{name}#{nargs}{{{value}}}',
'content': """\\documentclass{options}{{{classname}}}
{packages}
{preamble}
\\begin{{document}}
{content}
\\end{{document}}
"""
}
def __init__(self, classname, childrens=[], options=[], packages=[]):
super().__init__(parent=None, childrens=childrens)
self.options = options
self.classname = classname
self.add_packages(packages)
def add_packages(self, packages):
if type(packages) is str:
self.packages[packages] = True
elif type(packages) is dict:
self.packages.update(packages)
else:
self.packages.update({p: True for p in packages})
def add2preamble(self, value):
if isinstance(value, Iterable):
self.preamble.extend(value)
else:
self.preamble.append(value)
def add_def(self, name, nargs, value):
self.preamble.append(self.fmt().format('def', {
'name': name,
'nargs': nargs,
'value': value
}))
def format_preamble(self, defs):
return '\n'.join(self.preamble)
def format_packages(self, pkgs):
out = []
for pkg, opts in self.packages.items():
options = ''
if opts is not True:
options = self.format_options(opts)
out.append(self.fmt().format('package', {
'pkgname': pkg,
'pkgoptions': options
}))
return '\n'.join(out)
def content(self):
return self.fmt().format('content', {
'options': self.format_options(self.options),
'packages': self.format_packages(self.packages),
'preamble': self.format_preamble(self.preamble),
'classname': self.classname,
'content': super().content()
})
def compile(self, outfile, infile=None, outlog=None):
if infile is None:
infile = '/tmp/pyltk-{}.tex'.format(id(self))
with open(infile, 'w') as infd:
infd.write(self.content())
call = ['pdflatex', '-halt-on-error', '-jobname', outfile, infile]
subprocess.call(call, stdout=outlog)