Typesetting algorithms in LaTeX

Pseudocode

September 8, 2014 — April 8, 2022

compsci
computers are awful
faster pussycat
LaTeX
plain text
typography
UI
workflow

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

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

\algref{euclid}{init}

If I am running minimalist TeX I need

tlmgr install algorithmicx algorithms

or I can do without algorithms if I do

\usepackage{float}
\newfloat{algorithm}{t}{lop}

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.