👨‍💻 about me home CV/Resume News 🖊️ Contact Github LinkedIn I’m a Haskeller 🏆 Best of LuaX hey bang ypp panda lsvg Fizzbuzz Calculadoira TPG todo pwd rrpi

Universal PreProcessor

Universal PreProcessor

UPP is a minimalist and generic text preprocessor using Lua macros.

If you need a Pandoc preprocessor, Panda may be a better choice.

Warning: UPP may not be supported in the future

Their is no plan to support UPP from now on. UPP is meant to be replaced by ypp which combines UPP and Panda features.

Open source

UPP is an Open source software. Anybody can contribute on GitHub to:



Installation from source

$ git clone https://github.com/CDSoft/luax.git && make -C luax install
$ git clone https://github.com/CDSoft/upp.git
$ cd upp
$ make install      # install upp in ~/.local/bin

make install installs upp in ~/.local/bin. The PREFIX variable can be defined to install upp to a different directory (e.g. make install PREFIX=/usr to install upp in /usr/bin).

Note: upp can also be installed with makex.

Precompiled binaries

It is recommended to install upp from the sources.

In case you need precompiled binaries (upp and Luax interpretor included), the latest binaries are available here: UPP precompiled binaries


$ make test


$ upp [options] files

where files is the list of files (- for stdin).



Lua expressions are embedded in the document to process: $( Lua expression ) or @( Lua expression ).

Lua chunks can also be embedded in the document to add new definitions: :( Lua chunk ) or @@( Lua chunk ).

The @ notation has been added as it is more Markdown syntax friendly ($ may interfere with LaTeX equations).

A macro is just a Lua function. Some macros are predefined by upp. New macros can be defined by loading Lua scripts (options -l and -e) or embedded as Lua chunks.

Expression and chunks can return values. These values are formatted according to their types:


The user's home is $(os.getenv "HOME").

Builtin macros


Import a Lua script: :(require "module_name")
Embed a Lua script: :( Lua script )
Evaluate a Lua expression: $( 1 + lua_function(lua_variable) )
Include another document: $(include "other_document_name")
Conditional text: $(when (lang == "fr") [[ Ce texte est écrit en français ! ]])

Additional packages

upp comes with some packages (already included in the binaries, no external dependancies are required).


The counter function generates counters:


The package req provides basic requirement management tools.

Warning: this package is still experimental and not tested…


This file is part of UPP.

UPP is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

UPP is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with UPP.  If not, see <https://www.gnu.org/licenses/>.

For further information about UPP you can visit


Your feedback and contributions are welcome. You can contact me at cdelord.fr.