algpseudocode.sty の algorithmic 環境で「入力」や「出力」を作る
この記事では algpseudocode.sty の algorithmic 環境を用いて LaTeX で擬似コードを書く場合に、アルゴリズムの「入力」や「出力」を下図のように表示するための方法を紹介します*1。
具体的には、もともとこの sty ファイルに定義されている「Require」や「Ensure」を出力するコマンドと同じように定義をする方法を紹介していきます。
なお、この記事は私の LaTeX 擬似コード系ブログとしては第2弾になります。第1弾はこんな記事でした。第3弾も予定しています*2。
tobetakoyaki.hatenablog.com
概要
先に完成コードを提示します。詳しい説明は本文をお読みください。\usepackage[chapter]{algorithm}% \usepackage[noend]{algpseudocode}% % % augmenting the commands of algorithmicx package \algnewcommand\algorithmicinput{{\bfseries\gtfamily 入力}}% \algnewcommand\algorithmicoutput{{\bfseries\gtfamily 出力}}% \algnewcommand\AlgInput{\item[\algorithmicinput]}% \algnewcommand\AlgOutput{\item[\algorithmicoutput]}% \algrenewcommand\Return{\State\textbf{return} }%
algorithm.sty と algpseudocode.sty
LaTeX でアルゴリズムの擬似コードを書く際に役立つパッケージに algorithm.sty と algpseudocode.sty があります。それぞれのパッケージの頒布元を以下に引用します。- algorithmパッケージ: CTAN: Package algorithms
- algpseudocodeパッケージ: CTAN: Package algorithmicx
この記事ではこの2つのパッケージの基本的な使い方は紹介しません。上記のサイトに掲載のドキュメントや以下に引用する解説記事を参照ください。
解説記事①
qiita.com
解説記事②
li-feel.hatenablog.com
algnewcommand で新しいコマンドを定義する
algorithmic 環境ではこれを踏まえると、「入力」を行頭に出すコマンドは次のように定義できます。
\algnewcommand\algorithmicinput{{\bfseries\gtfamily 入力}}% \algnewcommand\AlgInput{\item[\algorithmicinput]}%
↓使用例はこんな感じです*5。
\begin{algorithm} \caption{Factorial} \label{alg:factorial} \begin{algorithmic}[1] \AlgInput $n$ \State $P \leftarrow 1$ \For{$i=2,\dotsc,n$} \State $P \leftarrow P \times i$ \EndFor \Return $P$ \end{algorithmic} \end{algorithm}
↓出力はこんな感じです*6。
参考文献
algorithm や algpseudocode について1. algorithmsパッケージのCTANホームページ
CTAN: Package algorithms
2. algorithmicxパッケージのCTANホームページ
CTAN: Package algorithmicx
3. 基本的な使い方に関する解説記事①
algorithmicxを使いLaTeXに擬似コードを追加 - Qiita
4. 基本的な使い方に関する解説記事②
LaTeXのalgorithmicxの擬似コードをカスタマイズしてみる - Li::Feel
*1:図では「入力」や「出力」ではなく「Input」と「Output」になっていますがここは自由に変更できます。
*2:と宣言することで自分にプレッシャーをかけています。
*3:コードを見て \newcommand との違いを調べましたが、私には理解できませんでした。力不足……。
*4:list 環境という、itemize 環境や enumerate 環境、description 環境を一般化したものを用いて algorithmic 環境が定義されていることによります。
*5:「\Return」は冒頭にある完成コマンドに載せたもので自ら再定義しています。
*6:for 文の終わりに「endfor」が出力されていないのは「noend」オプションを指定して algorithmic を読み込んでいるためです。