Update.
This commit is contained in:
88
pyltk/documentclass.py
Normal file
88
pyltk/documentclass.py
Normal file
@@ -0,0 +1,88 @@
|
||||
# -*- 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)
|
||||
Reference in New Issue
Block a user