algorithmicxを使いLaTeXに擬似コードを追加

LaTeXで作成する論文にalgrotithmicパッケージを使った擬似コードを追加する．

# 環境

- pLaTeX2e <2020-10-01>+2
- 検証済み環境
    - Cloud LaTeX
    - Overleaf

# 擬似コード用パッケージ郡

擬似コードを実現する代表的なLaTeXパッケージは以下である．今回は，表現できる形式(例: 関数)が豊富な **algorithmicx** を説明する．algorithmicだけでは，表現できる形式が少ないため拡張されたalgorithmicxの使用を推奨する．

- [algorithmic](https://www.ctan.org/pkg/algorithms)
- [algorithmicx](https://www.ctan.org/pkg/algorithmicx)
- [algorithm2e](https://www.ctan.org/pkg/algorithm2e)
- [program](https://ctan.org/pkg/program?lang=en)

パッケージ毎に対応した記法は，以下のURLにまとめられている．大きな違いの1つに関数の記述がある．algorithmicやprogramだけでは関数を表現できない．algorithm2eでは，関数の入力が `Data:` ，出力が`Result:` で表される．algorithmicxは，関数をFunctionとして記述できる．

[LaTeX/Algorithms - Wikibooks, open books for an open world](https://en.wikibooks.org/wiki/LaTeX/Algorithms)

## 用語の整理

似た単語が多く区別しにくいため以下に単語を整理した．

- **algorithms**
    - algorithmとalgorithmicの2つを含むパッケージ
- **algorithm**
    - 親パッケージ
    - ラップする役割をもつ．
- **algorithmic**
    - 子パッケージ
    - algorithmでalgorithmicをラップして使う．
    - 今回は使わない．
- **algorithmicx**
    - 子パッケージ
    - algorithmicを拡張したパッケージ
    - algorithmでalgorithmicxをラップして使う．
    - いくつかの役割ごとに分けられたファイル郡で構成されている．

# 手順

以降では，**algorithmicx**を使い，以下の擬似コードをLaTeXに埋め込む手順を説明する．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/54c94ed9-9c98-a4ce-50d7-7f528a8395e2.png)

基本的な手順は，以下のドキュメントに書いてある．

http://tug.ctan.org/macros/latex/contrib/algorithmicx/algorithmicx.pdf

## (1) algorithmsをダウンロード

algorithmsには，スタイルファイル algorithm と algorithmic が含まれている．
これを使うことで，埋め込んだ擬似コードにスタイルが適用される．

以下のページにあるからZipファイルをダウンロードする．

https://www.ctan.org/pkg/algorithms

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/d18006a2-9e73-1fb7-ce2c-e7657c587668.png)

## (2) algorithmicxをダウンロード

以下のページにあるからZipファイルをダウンロードする．

https://www.ctan.org/pkg/algorithmicx

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/99aef77c-46a0-f889-0650-aa6c5f7e93c0.png)

## (3) algorithmsとalgorithmicxを配置

ダウンロードしたalgorithms.zipとalgorithmicx.zipを展開する．
algorithmsは，algorithms.dtxがあれば使える．
algorithmicxは，algorithms.styがあれば使える．
ここでは，Functionを表現するためalgpseudocode.styを使う．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/2dc65490-596f-ae81-75ff-b8257ca7f107.png)

ダウンロードしたファイルを配置した階層構造を以下に示す．

```
.
├── paper.tex (論文の本体)
├── algorithms.dtx
└── algpseudocode.sty
```

## (4) texファイルからパッケージを呼び出し

論文ファイル（例: paper.tex）で`\usepackage{}`を使いパッケージを呼び出す．

```tex
\usepackage{algorithm}
\usepackage{algpseudocode}
```

パッケージ `algpseudocode` を呼び出す場合，`algorithmicx`の呼び出しは不要である．

> You don’t need to manually load the algorithmicx package, as this is done by algpseudocode.
出典: [algorithmicx.pdf - P.5](http://tug.ctan.org/macros/latex/contrib/algorithmicx/algorithmicx.pdf)

## (5) texファイルで擬似コードを記述

本文からの呼び出しは，`\ref{your_algorithm_label}`である．
アルゴリズムは，`\begin{algorithm}` で `\begin{algorithmic}` を囲んだ内部に書く．

以下にalgorithmicxを使った疑似コードの例を示す．

```tex
\begin{algorithm}[tb]
\caption{配列から最大値を求める関数}
\label{alg-max-from-array}
\begin{algorithmic}[1]

\Function {max\_in\_array}{$array$}
    \State $max \gets 0$
    \ForAll {$element \gets array$} 
        \If {$element > max$}
            \State $max \gets element$
        \EndIf
    \EndFor
    \State \Return $max$
\EndFunction

\end{algorithmic}
\end{algorithm}

% 本文での参照方法
\ref{alg-max-from-array}
```

以下は，実際にビルドした結果である．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/54c94ed9-9c98-a4ce-50d7-7f528a8395e2.png)

細かな記法は，下記サイトやalgorithmicxに付属するalgorithmicx.pdfに書いてある．

- [LaTeX/Algorithms - Wikibooks, open books for an open world](https://en.wikibooks.org/wiki/LaTeX/Algorithms#Typesetting_using_the_algorithmicx_package)
- [algorithmicx.pdf](http://tug.ctan.org/macros/latex/contrib/algorithmicx/algorithmicx.pdf)

# 便利なコマンド定義

下記のコマンド定義を使うと，ラベルの `Algorithm x` を `アルゴリズム x` へ変更できる．

```tex
% Algorithmをアルゴリズムにする
\makeatletter
\renewcommand{\ALG@name}{アルゴリズム}
\makeatother
```

# 参考URL

- [LaTeX/Algorithms - Wikibooks, open books for an open world](https://en.wikibooks.org/wiki/LaTeX/Algorithms)
- [LaTeXのalgorithmicxの擬似コードをカスタマイズしてみる - Li::Feel](http://li-feel.hatenablog.com/entry/2017/12/19/160618)
- [Algorithms - Overleaf, オンラインLaTeXエディター](https://ja.overleaf.com/learn/latex/Algorithms)