Liking cljdoc? Tell your friends :D


clj-latex is a library for representing LaTeX code in Clojure, inspired by hiccup and cl-latex.


project.clj dependency:

[clj-latex "0.1.0"]


The easiest way to produce a LaTeX document with clj-latex is to use the render-latex macro in clj-latex.core:

(use 'clj-latex.core)
  (:documentclass 'article)
  (:usepackage ['utf8] "inputenc")

(:documentclass ... is a list starting with a keyword, so is transformed into a LaTeX command by the render-latex macro (This means you cannot use the syntax (:keyword elem) inside the macro to get something out from elem). Each element that follows becomes an argument for that command. If the element is in a vector, it becomes an optional argument for that command (like [utf8]); otherwise it's a required argument (like {article}).

During the rendering, elements that are not strings already are converted automatically:

  • 'quoted => "quoted"
  • 123 => "123"
  • \c => "c"
  • [[[["flattened"]]]] => "flattened" (So your code can produce nested lists, etc.)
  • :keywords-become-commands => "\keywords"-become-commands (A shortcut for writing LaTeX commands)
  (:documentclass 'article)
   "Lorem ipsum."
   ('table [['ht]]
           ('tabular ['|c|c|c|]
                     (tr 1 2 3)
  Lorem ipsum.
      1 & 2 & 3 \\

('document ... is a list starting with a quoted symbol, so is transformed into an environment block (This means you cannot use the syntax ('kw elem) to get something out of elem). If the first element in an environment is a vector, it specifies the arguments for the environment (thus optional arguments will be in a vector inside that vector):

  • ('tabular ['|c|c|c|] ... => \begin{tabular}{|c|c|c|} ...
  • ('table [['ht]] => \begin{table}[ht] ...
  • ('my-env [['opt-arg1 'opt-arg2] 'arg1 'arg2] ... => \begin{my-env}[opt-arg1, opt-arg2]{arg1}{arg2} ...

Note that all arguments for environments must be passed to them in a vector as the first element after the environment name, while arguments for commands don't need to be enclosed in such a vector, because commands don't have bodies.

In the above example, tr is a utility provided by clj-latex to ease the creation of table rows. The library provides a few functions like this:

  • (j 1 "joined" 2) => "1 joined 2"
  • (blk "A" "Block") => ("{" " A" " Block" "}")
  • (b "smaller" "block") => ("{smaller block}")
  • (tr 1 2 3) => "1 & 2 & 3 \\\\"
  • ($ "inline" 'math "mode") => "$inline math mode$"
  • (esc "\\escaped" "$trings") => ("\\\\escaped" "\\$trings")
  • (matrix [[1 2] [3 4]]) => A bmatrix environment with the matrix contents (An alternative environment name can also be passed to the function as the first argument.)
  • The symbols br, $$, & are defined as "\\\\", "$$", \&, respectively.

For more examples, see the examples/ and test/ directories.


The library has two dynamic definitions for indentation control and can be adjusted as needed:

(def ^:dynamic indent-width 2)
(def ^:dynamic indent-unit " ")

For example, to use tab instead of spaces, you may use:

(binding [indent-width 1
          indent-unit "\t"]


The MIT License.

Can you improve this documentation?Edit on GitHub

cljdoc is a website building & hosting documentation for Clojure/Script libraries

× close