LaTeXで擬似コード

Posted: 2015-08-24 (Modified: 2019-03-21)

アルゴリズムやプログラミングに関する文書を書いているとき、擬似コードを書くことがあると思います。この記事ではLaTeXで擬似コードを書く方法と見た目を変更する方法をいくつか説明したいと思います。環境としてはLuaTeXを想定していますが、それ以外の場合でも若干の変更で動くと思います。

1. 主な使い方

まずは algpseudocode というパッケージを読み込みます。 以下のように挿入ソートのアルゴリズムを書いてみます。

\documentclass{article}
\usepackage{newtxtext,newtxmath}
\usepackage{algpseudocode}
\pagestyle{empty}
\begin{document}
    \begin{algorithmic}[1]
        \Procedure{Insertion-Sort}{$A$}
            \For{$j = 2 \, \ldots \, A.\mathrm{length}$}
            \State{$k = A[j]$}
                \State{$i = j - 1$}
                \While{$i > 0$ and $A[i] > k$}
                    \State{$A[i + 1] = A[i]$}
                    \State{$i = i - 1$}
                \EndWhile
                \State{$A[i + 1] = k$}
            \EndFor
        \EndProcedure
    \end{algorithmic}
\end{document}

表示されるのは以下のような擬似コードになります。

疑似コードの例

普段Pythonなど end を明示しない言語に慣れていると少し冗長に感じるかもしれません。そのような記号を明示したくない場合はパッケージ読込時に

\usepackage[noend]{algpseudocode}

のように書いておくと

`End`を用いない疑似コードの例

のようなPython風の擬似コードになります。さらにdoの記述も不要ならば、ヘッダ部分に以下のように記述します。

\algrenewcommand\algorithmicdo{}

いま for の始点と終点の間には を使っていますが、もし変えたければalgpseudocode.sty にならい新しい制御構造\ForTo をプリアンブルで定義します。

\documentclass{article}
\usepackage{newtxtext,newtxmath}
\usepackage[noend]{algpseudocode}
\algnewcommand\algorithmicto{\textbf{to}}
\algdef{SE}[FOR]{ForTo}{EndFor}[2]{%
  \algorithmicfor\ #1\ \algorithmicto\ #2\ \algorithmicdo
}{%
  \algorithmicend\ \algorithmicfor
}
\pagestyle{empty}
\begin{document}
    \begin{algorithmic}[1]
        \Procedure{Insertion-Sort}{$A$}
        \ForTo{$j = 2$}{$A.\mathrm{length}$}
            \State{$k = A[j]$}
                \State{$i = j - 1$}
                \While{$i > 0$ and $A[i] > k$}
                    \State{$A[i + 1] = A[i]$}
                    \State{$i = i - 1$}
                \EndWhile
                \State{$A[i + 1] = k$}
            \EndFor
        \EndProcedure
    \end{algorithmic}
\end{document}

アルゴリズム中 \For を新しく定義した \ForTo に置き換えて次のような出力を得ます。

ForToの表示を変更した疑似コードの例

新しく定義した制御構造については [noend] オプションが適用されないのため、要らなければ algtext*{EndFor}\ForTo の定義の次の行にでも書いておきましょう。

2. よく変更を加える項目について

行間は\setlength{\baselineskip}{Npt}N は自然数 )で変更できます。ここでは新たにbroadalgo という環境を定義することにします。

\newenvironment{broadalgo}{%
  \setlength{\baselineskip}{17pt}
  \begin{algorithmic}[1]
}{%
  \end{algorithmic}
}

この例では出てきませんが\Return には行番号が振られないようになっています。あったほうがよいならば再定義する必要があります。

\let\oldReturn\Return
\renewcommand{\Return}{\State\oldReturn}

上記の設定を使った文書の例です。

\documentclass{article}
\usepackage{amsmath}
\usepackage[noend]{algpseudocode}
%%%%% フォント関連 %%%%%
\usepackage{unicode-math}
\setmainfont[Ligatures=TeX]{TeX Gyre Termes}
\setmathfont{TeX Gyre Termes Math}
\newfontfamily\algfont{TeX Gyre Cursor}
\makeatletter
\renewcommand{\ALG@beginalgorithmic}{\algfont}
\makeatother
%%%%%%%%%%%%%%%%%%%%
\algnewcommand\algorithmicto{\textbf{to}}
\algdef{SE}[FOR]{ForTo}{EndFor}[2]{%
    \algorithmicfor\ #1\ \algorithmicto\ #2\ \algorithmicdo
}{%
    \algorithmicend\ \algorithmicfor
}
\algrenewcommand\algorithmicdo{}
\let\oldReturn\Return
\renewcommand{\Return}{\State\oldReturn}
\algtext*{EndFor}
\algrenewcommand\alglinenumber[1]{{\texttt{#1:}}}
\newenvironment{broadalgo}{%
  \setlength{\baselineskip}{17pt}
  \begin{algorithmic}[1]
}{%
  \end{algorithmic}
}
\pagestyle{empty}
\begin{document}
    \begin{broadalgo}
        \Procedure{Insertion-Sort}{$A$}
        \ForTo{$j = 2$}{$A.\mathrm{length}$}
            \State{$k = A[j]$}
                \State{$i = j - 1$}
                \While{$i > 0$ and $A[i] > k$}
                    \State{$A[i + 1] = A[i]$}
                    \State{$i = i - 1$}
                \EndWhile
                \State{$A[i + 1] = k$}
            \EndFor
        \EndProcedure
    \end{broadalgo}
\end{document}
上記で説明した変更を適用した疑似コードの例