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)
(render-latex
(:documentclass 'article)
(:usepackage ['utf8] "inputenc")
:myshortcmd)
\documentclass{article}
\usepackage[utf8]{inputenc}
\myshortcmd
(: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)
(render-latex
(:documentclass 'article)
('document
:noindent
"Lorem ipsum."
('table [['ht]]
('tabular ['|c|c|c|]
:hline
(tr 1 2 3)
:hline))))
\documentclass{article}
\begin{document}
\noindent
Lorem ipsum.
\begin{table}[ht]
\begin{tabular}{|c|c|c|}
\hline
1 & 2 & 3 \\
\hline
\end{tabular}
\end{table}
\end{document}
('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]])
=> Abmatrix
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"]
(render-latex
...))
The MIT License.