Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

latexpp

Latex preprocessor — apply macro definitions, remove comments, and more

Disclaimer: latexpp is still at an experimental development stage.

https://img.shields.io/github/license/phfaist/latexpp.svg?style=flat

Installation

You can install latexpp using pip directly from latexpp’s github repo:

> pip install git+https://github.com/phfaist/latexpp.git

How it works

The latex preprocessor latexpp reads your main latex document and copies it to an output directory while applying a series of “fixes” that you can configure. For instance, you can remove comments, you can include files that you input with \input macros, or you can replace custom macros by their LaTeX expansion.

You run latexpp in a folder with a lppconfig.yml file that specifies the necessary information such as the main LaTeX document, the output directory, and which fixes to apply.

Sample lppconfig.yml:

# latexpp config for MyDocument.tex
#
# This is YAML syntax -- google "YAML tutorial" to get a quick intro.  Be
# careful with spaces since indentation is important.

# the master LaTeX document -- this file will not be modified, all output will
# be produced in the output_dir
fname: 'MyDocument.tex'

# output file(s) will be created in this directory, originals will not be
# modified
output_dir: 'latexpp_output'

# main document file name in the output directory
output_fname: 'paper.tex'

# specify list of fixes to apply, in the given order
fixes:

  # replace \input{...} directives by the contents of the included file
  - 'latexpp.fixes.input.EvalInput'

  # remove all comments
  - 'latexpp.fixes.comments.RemoveComments'

  # copy any style files (.sty) that are used in the document and that
  # are present in the current directory to the output directory
  - 'latexpp.fixes.usepackage.CopyLocalPkgs'

  # copy figure files to the output directory and rename them fig-1.xxx,
  # fig-2.xxx, etc.
  - 'latexpp.fixes.figures.CopyAndRenameFigs'

  # Replace \bibliography{...} by \input{xxx.bbl} and copy the bbl file to the
  # output directory.  Make sure you run (pdf)latex on the main docuemnt
  # before running latexpp
  - 'latexpp.fixes.bib.CopyAndInputBbl'

  # Expand some macros. Latexpp doesn't parse \newcommand's, so you need to
  # specify here the LaTeX code that the macro should be expanded to. If the
  # macro has arguments, specify the nature of the arguments here in the
  # 'argspec:' key (a '*' is an optional * character, a '[' one optional
  # square-bracket-delimited argument, and a '{' is a mandatory argument). The
  # argument values are available via the placeholders %(1)s, %(2)s, etc. Make
  # sure to use single quotes for strings that contain \ backslashes.
  - name: 'latexpp.fixes.macro_subst.Subst'
    config:
      macros:
        # \tr         -->  \operatorname{tr}
        tr: '\operatorname{tr}'
        # \ket{\psi}  -->  \lvert{\psi}\rangle
        ket:
          argspec: '{'
          repl: '\lvert{%(1)s}\rangle'
        # \braket{\psi}{\phi}  -->  \langle{\psi}\vert{\phi}\rangle
        braket:
          argspec: '{{'
          repl: '\langle{%(1)s}\vert{%(2)s}\rangle'

The config file follows standard YAML syntax (if you’re in doubt, google a YAML tutorial).

Documentation is available at latexpp.readthedocs.io. You can also explore the latexpp/fixes/ directory for the list of possible fixes. The documentation is still a little sparse at the moment (I wrote this preprocessor in the matter of a few days, and I won’t have tons of time to devote to it). But the python source is fairly short and should be relatively decipherable.

Each fix is specified by a qualified python class name. For instance, latexpp.fixes.comments.RemoveComments invokes class RemoveComments from the python module latexpp.fixes.comments. You can specify custom arguments to the class constructor by using the syntax with the ‘name:’ and ‘config:’ keys as shown above. The keys in each ‘config:’ section are directly passed on to the class constructor as corresponding keyword arguments.

The fixes in the latexpp/fixes/pkg/ directory are those fixes that are supposed to apply all definitions of the corresponding package in order to remove a dependency on that package.

It’s also straightforward to write your own fix classes to do more complicated stuff. Create a python package (a new folder mypackage with an empty __init__.py file) and create a python module (e.g. myfixmodule.py) in that package that defines your fix class (e.g. MyFix). You can get inspiration from one of the simple examples in the latexpp/fixes/ folder. Set up your $PYTHONPATH so that your python package is exposed to python. Then simply specify the pacakge/module your fix is located in in the YAML file, e.g., mypackage.myfixmodule.MyFix instead of latexpp.fixes.xxxxx.YYYY.

How it actually works

The latexpp preprocessor relies on pylatexenc 2.0 to parse the latex document into an internal node structure. For instance, the chunk of latex code:

Hello, \textit{world}! % show a greeting

will be parsed into a list of four nodes, a ‘normal characters node’ "Hello, ", a ‘macro node’ \textit with argument a ‘group node’ {world} which itself contains a ‘normal characters node’ world, a ‘normal characters node’ "! ", and a ‘latex comment node’ % show a greeting. The structure is recursive, with e.g. macro arguments and environment contents themselves represented as nodes which can contain further macros and environments. See pylatexenc.latexwalker for more information. The pylatexenc library has a list of some known macros and environments, and knows how to parse their arguments. Some fixes in latexpp add their own macro and environment definitions.

Once the latex document is parsed into the node structure, the document is processed by the given list of fixes. Each fix is called in turn. Each fix traverses the document node structure and applies any relevant changes.

License

(C) 2019 Philippe Faist, philippe dot faist <at@at> bluewin dot ch

MIT Licence, see License.txt

Release files for latexpp 0.2.0a1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for latexpp 0.2.0a1
File Size Uploaded
latexpp-0.2.0a1.tar.gz 79.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for latexpp 0.2.0a1
File Interpreter ABI Platform
latexpp-0.2.0a1-py3-none-any.whl Python 3 none any Details

Total release size: 172.1 kB

Release files / latexpp-0.2.0a1.tar.gz

Download URL latexpp-0.2.0a1.tar.gz
Size 79.8 kB
Tags Source
SHA-256 checksum
How to use checksums
18a7fc86001942a0247410492ad82dc764e4463d871e0643465e2dd93cb3eac1
BLAKE2b-256 checksum
How to use checksums
78683086b6cac1c3fcbc8eecef35a26f948e0aca46e3b0048845e450c2ad1351
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.4.2 CPython/3.10.8 Darwin/22.2.0

Release files / latexpp-0.2.0a1-py3-none-any.whl

Download URL latexpp-0.2.0a1-py3-none-any.whl
Size 92.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c227d56451821f6d209983d9585042e2dfd69dd45ca5b63ba685e770c1ebca75
BLAKE2b-256 checksum
How to use checksums
61b16c8b8153b5e28db63aadad57613bc89d1ab982818b7acb4124d4b2a79e3e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.4.2 CPython/3.10.8 Darwin/22.2.0

Release history Release notifications | RSS feed

This release

0.2.0a1 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page