Typesetting algorithms in LaTeX
Pseudocode
September 8, 2014 — April 8, 2022
Need to explain an algorithm? If you are permitted to list real source code, this is possible via the listings. I have yet to encounter a journal or conference that endorses this, however.
Convention dictates explaining an algorithm with pseudocode. This obviates the problem of the uncertain semantics of particular programming languages by replacing them with the semantics of no programming language at all. There is a confusing profusion of options for doing this, and all options are, IMO, inadequate since none of them allow me to typeset higher-order functions naturally, and that is an old, thoroughly mainstream idea that I use a lot. This means, for example, that it is hard to typeset automatic differentiation. But who would need that? Anyway, this is a sub problem which I can awkwardly work around like everyone else.
tl;dr: I use
For formatting,
- algorithmicx +
algpseudocode
(a nice default syntax that comes withalgorithmicx
). - Or algorithms which comes with only one syntax, but everyone knows it
- algorithmicx +
inside an
algorithm
float.
1 algorithmicx
How this looks:
\usepackage{algorithmicx}
\usepackage[noend]{algpseudocode} % skip EndFor etc
\usepackage{algorithm} % custom floats
then
\begin{algorithm}
\caption{Euclid’s algorithm}
\label{euclid}
\begin{algorithmic}[1] % The argument is the first line number
\Procedure{Euclid}{$a,b$}
\Comment{The g.c.d. of a and b}
\State $r\gets a \bmod b$ \label{init}
\While{$r\not=0$}
\Comment{We have the answer if r is 0}
\State $a \gets b$
\State $b \gets r$
\State $r \gets a \bmod b$
\EndWhile\label{euclidendwhile}
\State \textbf{return} $b$
\Comment{The gcd is b}
\EndProcedure
\end{algorithmic}
\end{algorithm}
Algorithm line label references look like
If I am running minimalist TeX I need
or I can do without algorithms
if I do
Or perhaps I wish to typeset real code in a real language? minted enables this, allowing colour-highlighted math-enabled code rendering, bringing to LaTeX documents the conveniences that have been available to everyone else for some decades now.
There are alternatives.
2 algorithms
algorithms provides algorithmic
and an algorithm
float, and seems to be fairly common and also fairly interchangeable with algorithmicx
. The making your own floats does not need a package, but the algorithmic
markup is non-trivial.
This seems intermittently maintained but has better reference syntax, in that referring to a line number just works — \autoref{alg:euclif:init}
does what you would expect. It also seems to be preferred by IEEE.
3 algorithm2e
TBD.
4 program
program does pseudocode formatting but with substantively different syntax and styling. It looks nice but I don’t use it as it’s less compatible with the other so the odds of being able to copy and paste are low and copy-and-pasting ancient code snippets is how academia works.