ト部蛸焼のブログ

日頃知ったことをアウトプットするためのブログ

algpseudocode.sty の algorithmic 環境で「入力」や「出力」を作る

この記事では algpseudocode.sty の algorithmic 環境を用いて LaTeX擬似コードを書く場合に、アルゴリズムの「入力」や「出力」を下図のように表示するための方法を紹介します*1

f:id:tobetakoyaki:20210617015000p:plain:h350
冒頭に「Input」と「Output」を追加してアルゴリズムの機能を説明する様子

具体的には、もともとこの 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 があります。それぞれのパッケージの頒布元を以下に引用します。

この記事ではこの2つのパッケージの基本的な使い方は紹介しません。上記のサイトに掲載のドキュメントや以下に引用する解説記事を参照ください。

解説記事①
qiita.com

解説記事②
li-feel.hatenablog.com


algnewcommand で新しいコマンドを定義する

algorithmic 環境では

  • コマンドの定義や再定義には \algnewcommand\algrenewcommand を使う*3
  • \item を使うと行頭に文字を出力できる*4

これを踏まえると、「入力」を行頭に出すコマンドは次のように定義できます。

\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

f:id:tobetakoyaki:20211219021710p:plain:w350
\AlgInputを使用したコードの出力例


参考文献

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 を読み込んでいるためです。