tex

TeX/LaTeX/PDFLaTeX/XeLaTeX support

Example:

def configure(conf):
        conf.load('tex')
        if not conf.env.LATEX:
                conf.fatal('The program LaTex is required')

def build(bld):
        bld(
                features = 'tex',
                type     = 'latex', # pdflatex or xelatex
                source   = 'document.ltx', # mandatory, the source
                outs     = 'ps', # 'pdf' or 'ps pdf'
                deps     = 'crossreferencing.lst', # to give dependencies directly
                prompt   = 1, # 0 for the batch mode
        )

Notes:

  • To configure with a special program, use:

    $ PDFLATEX=luatex waf configure
    
  • This tool does not use the target attribute of the task generator (bld(target=...)); the target file name is built from the source base name and the output type(s)

waflib.Tools.tex.bibunitscan(self)[source]

Parses TeX inputs and try to find the bibunit file dependencies

Returns:list of bibunit files
Return type:list of waflib.Node.Node
waflib.Tools.tex.exts_deps_tex = ['', '.ltx', '.tex', '.bib', '.pdf', '.png', '.eps', '.ps', '.sty']

List of typical file extensions included in latex files

waflib.Tools.tex.exts_tex = ['.ltx', '.tex']

List of typical file extensions that contain latex

waflib.Tools.tex.re_tex = <_sre.SRE_Pattern object>

Regexp for expressions that may include latex files

waflib.Tools.tex.g_bibtex_re = <_sre.SRE_Pattern object>

Regexp for bibtex files

waflib.Tools.tex.g_glossaries_re = <_sre.SRE_Pattern object>

Regexp for expressions that create glossaries

class waflib.Tools.tex.tex(*k, **kw)[source]

Bases: waflib.Task.Task

Compiles a tex/latex file.

Inheritance diagram of waflib.Tools.tex.latex, waflib.Tools.tex.xelatex, waflib.Tools.tex.pdflatex

exec_command(cmd, **kw)[source]

Executes TeX commands without buffering (latex may prompt for inputs)

Returns:the return code
Return type:int
scan_aux(node)[source]

Recursive regex-based scanner that finds included auxiliary files.

scan()[source]

Recursive regex-based scanner that finds latex dependencies. It uses waflib.Tools.tex.re_tex

Depending on your needs you might want:

  • to change re_tex:

    from waflib.Tools import tex
    tex.re_tex = myregex
    
  • or to change the method scan from the latex tasks:

    from waflib.Task import classes
    classes['latex'].scan = myscanfunction
    
check_status(msg, retcode)[source]

Checks an exit status and raise an error with a particular message

Parameters:
  • msg (string) – message to display if the code is non-zero
  • retcode (boolean) – condition
bibfile()[source]

Parses .aux files to find bibfiles to process. If present, execute waflib.Tools.tex.tex.bibtex_fun()

bibunits()[source]

Parses .aux file to find bibunit files. If there are bibunit files, runs waflib.Tools.tex.tex.bibtex_fun().

makeindex()[source]

Searches the filesystem for .idx files to process. If present, runs waflib.Tools.tex.tex.makeindex_fun()

bibtopic()[source]

Lists additional .aux files from the bibtopic package

makeglossaries()[source]

Lists additional glossaries from .aux files. If present, runs the makeglossaries program.

texinputs()[source]

Returns the list of texinput nodes as a string suitable for the TEXINPUTS environment variables

Return type:string
run()[source]

Runs the whole TeX build process

Multiple passes are required depending on the usage of cross-references, bibliographies, glossaries, indexes and additional contents The appropriate TeX compiler is called until the .aux files stop changing.

hash_aux_nodes()[source]

Returns a hash of the .aux file contents

Return type:string or bytes
call_latex()[source]

Runs the TeX compiler once

_ = ['MAKEGLOSSARIES', 'SRCFILE']
bibtex_fun(tsk)

Execute the program bibtex

hcode = '\tdef run(self):\n\t\t"""\n\t\tRuns the whole TeX build process\n\n\t\tMultiple passes are required depending on the usage of cross-references,\n\t\tbibliographies, glossaries, indexes and additional contents\n\t\tThe appropriate TeX compiler is called until the *.aux* files stop changing.\n\t\t"""\n\t\tenv = self.env\n\n\t\tif not env.PROMPT_LATEX:\n\t\t\tenv.append_value(\'LATEXFLAGS\', \'-interaction=batchmode\')\n\t\t\tenv.append_value(\'PDFLATEXFLAGS\', \'-interaction=batchmode\')\n\t\t\tenv.append_value(\'XELATEXFLAGS\', \'-interaction=batchmode\')\n\n\t\t# important, set the cwd for everybody\n\t\tself.cwd = self.inputs[0].parent.get_bld()\n\n\t\tself.info(\'first pass on %s\', self.__class__.__name__)\n\n\t\t# Hash .aux files before even calling the LaTeX compiler\n\t\tcur_hash = self.hash_aux_nodes()\n\n\t\tself.call_latex()\n\n\t\t# Find the .aux files again since bibtex processing can require it\n\t\tself.hash_aux_nodes()\n\n\t\tself.bibtopic()\n\t\tself.bibfile()\n\t\tself.bibunits()\n\t\tself.makeindex()\n\t\tself.makeglossaries()\n\n\t\tfor i in range(10):\n\t\t\t# There is no need to call latex again if the .aux hash value has not changed\n\t\t\tprev_hash = cur_hash\n\t\t\tcur_hash = self.hash_aux_nodes()\n\t\t\tif not cur_hash:\n\t\t\t\tLogs.error(\'No aux.h to process\')\n\t\t\tif cur_hash and cur_hash == prev_hash:\n\t\t\t\tbreak\n\n\t\t\t# run the command\n\t\t\tself.info(\'calling %s\', self.__class__.__name__)\n\t\t\tself.call_latex()\n'
makeglossaries_fun(tsk)

Execute the program makeglossaries

makeindex_fun(tsk)

Execute the program makeindex

class waflib.Tools.tex.latex(*k, **kw)[source]

Bases: waflib.Tools.tex.tex

Compiles LaTeX files

hcode = '\tdef run(self):\n\t\t"""\n\t\tRuns the whole TeX build process\n\n\t\tMultiple passes are required depending on the usage of cross-references,\n\t\tbibliographies, glossaries, indexes and additional contents\n\t\tThe appropriate TeX compiler is called until the *.aux* files stop changing.\n\t\t"""\n\t\tenv = self.env\n\n\t\tif not env.PROMPT_LATEX:\n\t\t\tenv.append_value(\'LATEXFLAGS\', \'-interaction=batchmode\')\n\t\t\tenv.append_value(\'PDFLATEXFLAGS\', \'-interaction=batchmode\')\n\t\t\tenv.append_value(\'XELATEXFLAGS\', \'-interaction=batchmode\')\n\n\t\t# important, set the cwd for everybody\n\t\tself.cwd = self.inputs[0].parent.get_bld()\n\n\t\tself.info(\'first pass on %s\', self.__class__.__name__)\n\n\t\t# Hash .aux files before even calling the LaTeX compiler\n\t\tcur_hash = self.hash_aux_nodes()\n\n\t\tself.call_latex()\n\n\t\t# Find the .aux files again since bibtex processing can require it\n\t\tself.hash_aux_nodes()\n\n\t\tself.bibtopic()\n\t\tself.bibfile()\n\t\tself.bibunits()\n\t\tself.makeindex()\n\t\tself.makeglossaries()\n\n\t\tfor i in range(10):\n\t\t\t# There is no need to call latex again if the .aux hash value has not changed\n\t\t\tprev_hash = cur_hash\n\t\t\tcur_hash = self.hash_aux_nodes()\n\t\t\tif not cur_hash:\n\t\t\t\tLogs.error(\'No aux.h to process\')\n\t\t\tif cur_hash and cur_hash == prev_hash:\n\t\t\t\tbreak\n\n\t\t\t# run the command\n\t\t\tself.info(\'calling %s\', self.__class__.__name__)\n\t\t\tself.call_latex()\n'
vars = ['LATEX', 'LATEXFLAGS', 'SRCFILE']
class waflib.Tools.tex.pdflatex(*k, **kw)[source]

Bases: waflib.Tools.tex.tex

Compiles PdfLaTeX files

hcode = '\tdef run(self):\n\t\t"""\n\t\tRuns the whole TeX build process\n\n\t\tMultiple passes are required depending on the usage of cross-references,\n\t\tbibliographies, glossaries, indexes and additional contents\n\t\tThe appropriate TeX compiler is called until the *.aux* files stop changing.\n\t\t"""\n\t\tenv = self.env\n\n\t\tif not env.PROMPT_LATEX:\n\t\t\tenv.append_value(\'LATEXFLAGS\', \'-interaction=batchmode\')\n\t\t\tenv.append_value(\'PDFLATEXFLAGS\', \'-interaction=batchmode\')\n\t\t\tenv.append_value(\'XELATEXFLAGS\', \'-interaction=batchmode\')\n\n\t\t# important, set the cwd for everybody\n\t\tself.cwd = self.inputs[0].parent.get_bld()\n\n\t\tself.info(\'first pass on %s\', self.__class__.__name__)\n\n\t\t# Hash .aux files before even calling the LaTeX compiler\n\t\tcur_hash = self.hash_aux_nodes()\n\n\t\tself.call_latex()\n\n\t\t# Find the .aux files again since bibtex processing can require it\n\t\tself.hash_aux_nodes()\n\n\t\tself.bibtopic()\n\t\tself.bibfile()\n\t\tself.bibunits()\n\t\tself.makeindex()\n\t\tself.makeglossaries()\n\n\t\tfor i in range(10):\n\t\t\t# There is no need to call latex again if the .aux hash value has not changed\n\t\t\tprev_hash = cur_hash\n\t\t\tcur_hash = self.hash_aux_nodes()\n\t\t\tif not cur_hash:\n\t\t\t\tLogs.error(\'No aux.h to process\')\n\t\t\tif cur_hash and cur_hash == prev_hash:\n\t\t\t\tbreak\n\n\t\t\t# run the command\n\t\t\tself.info(\'calling %s\', self.__class__.__name__)\n\t\t\tself.call_latex()\n'
vars = ['PDFLATEX', 'PDFLATEXFLAGS', 'SRCFILE']
class waflib.Tools.tex.xelatex(*k, **kw)[source]

Bases: waflib.Tools.tex.tex

XeLaTeX files

hcode = '\tdef run(self):\n\t\t"""\n\t\tRuns the whole TeX build process\n\n\t\tMultiple passes are required depending on the usage of cross-references,\n\t\tbibliographies, glossaries, indexes and additional contents\n\t\tThe appropriate TeX compiler is called until the *.aux* files stop changing.\n\t\t"""\n\t\tenv = self.env\n\n\t\tif not env.PROMPT_LATEX:\n\t\t\tenv.append_value(\'LATEXFLAGS\', \'-interaction=batchmode\')\n\t\t\tenv.append_value(\'PDFLATEXFLAGS\', \'-interaction=batchmode\')\n\t\t\tenv.append_value(\'XELATEXFLAGS\', \'-interaction=batchmode\')\n\n\t\t# important, set the cwd for everybody\n\t\tself.cwd = self.inputs[0].parent.get_bld()\n\n\t\tself.info(\'first pass on %s\', self.__class__.__name__)\n\n\t\t# Hash .aux files before even calling the LaTeX compiler\n\t\tcur_hash = self.hash_aux_nodes()\n\n\t\tself.call_latex()\n\n\t\t# Find the .aux files again since bibtex processing can require it\n\t\tself.hash_aux_nodes()\n\n\t\tself.bibtopic()\n\t\tself.bibfile()\n\t\tself.bibunits()\n\t\tself.makeindex()\n\t\tself.makeglossaries()\n\n\t\tfor i in range(10):\n\t\t\t# There is no need to call latex again if the .aux hash value has not changed\n\t\t\tprev_hash = cur_hash\n\t\t\tcur_hash = self.hash_aux_nodes()\n\t\t\tif not cur_hash:\n\t\t\t\tLogs.error(\'No aux.h to process\')\n\t\t\tif cur_hash and cur_hash == prev_hash:\n\t\t\t\tbreak\n\n\t\t\t# run the command\n\t\t\tself.info(\'calling %s\', self.__class__.__name__)\n\t\t\tself.call_latex()\n'
vars = ['XELATEX', 'XELATEXFLAGS', 'SRCFILE']
class waflib.Tools.tex.dvips(*k, **kw)[source]

Bases: waflib.Task.Task

Converts dvi files to postscript

color = 'BLUE'
after = ['latex', 'pdflatex', 'xelatex']
hcode = '${DVIPS} ${DVIPSFLAGS} ${SRC} -o ${TGT}'
orig_run_str = '${DVIPS} ${DVIPSFLAGS} ${SRC} -o ${TGT}'
vars = ['DVIPS', 'DVIPSFLAGS']
class waflib.Tools.tex.dvipdf(*k, **kw)[source]

Bases: waflib.Task.Task

Converts dvi files to pdf

color = 'BLUE'
after = ['latex', 'pdflatex', 'xelatex']
hcode = '${DVIPDF} ${DVIPDFFLAGS} ${SRC} ${TGT}'
orig_run_str = '${DVIPDF} ${DVIPDFFLAGS} ${SRC} ${TGT}'
vars = ['DVIPDF', 'DVIPDFFLAGS']
class waflib.Tools.tex.pdf2ps(*k, **kw)[source]

Bases: waflib.Task.Task

Converts pdf files to postscript

hcode = '${PDF2PS} ${PDF2PSFLAGS} ${SRC} ${TGT}'
orig_run_str = '${PDF2PS} ${PDF2PSFLAGS} ${SRC} ${TGT}'
vars = ['PDF2PS', 'PDF2PSFLAGS']
color = 'BLUE'
after = ['latex', 'pdflatex', 'xelatex']
waflib.Tools.tex.feature(*k)

Decorator that registers a task generator method that will be executed when the object attribute feature contains the corresponding key(s):

from waflib.Task import feature
@feature('myfeature')
def myfunction(self):
        print('that is my feature!')
def build(bld):
        bld(features='myfeature')
Parameters:k (list of string) – feature names
waflib.Tools.tex.before_method(*k)[source]

Decorator that registera task generator method which will be executed before the functions of given name(s):

from waflib.TaskGen import feature, before
@feature('myfeature')
@before_method('fun2')
def fun1(self):
        print('feature 1!')
@feature('myfeature')
def fun2(self):
        print('feature 2!')
def build(bld):
        bld(features='myfeature')
Parameters:k (list of string) – method names
waflib.Tools.tex.apply_tex(self)[source]

Task generator method

Creates waflib.Tools.tex.tex objects, and dvips/dvipdf/pdf2ps tasks if necessary (outs=’ps’, etc).

Feature:tex
waflib.Tools.tex.configure(self)[source]

Find the programs tex, latex and others without raising errors.

Features defined in this module: