Li::Feel

りとるす的雑記帳。

LaTeXのalgorithmicxの擬似コードをカスタマイズしてみる

擬似コードを書くのは、情報系の論文だと結構あるあるだと思います。フローチャートだと長くなりすぎる場合など、シンプルでないアルゴリズムはこっちのほうがきれいに書ける印象です。(※個人の感想です)

僕自身はalgorithmicxパッケージを使って擬似コードを書いていたりとかします。 他にもalgorithmicとかalgorithm2eとかがあるようです*1。 algorithmicxの使い方は以下のリンクがわかりやすいと思います。

github.com

ただし、algorithmicxは日本語の論文(卒論など)を書くときにはキャプションが「Algorithm n」になったりとめんどくさい点がいくつかあります。 それ以外にも、標準の入出力の表現がRequireとEnsureであんまり直感的ではない(※個人の感想です)などといろいろと気に食わない点もあります。 ここでは各種サイトを参考に、いくつか擬似コードまわりのカスタマイズをしたメモを書いていきます。

Require,Ensure -> Input Outputに変える

ここは好みとかがあると思いますが、擬似コードのInputとOutputがRequireとEnsureになっててあんまり直感的ではないので、InputとOutputに書き変えます。 \begin{document}の前に以下のように書きます。

% RequireとEnsureをInputとOutputにする
\renewcommand{\algorithmicrequire}{\textbf{Input:}}
\renewcommand{\algorithmicensure}{\textbf{Output:}}

Algorithm -> アルゴリズムにする

図のキャプションの名前がAlgorithmのままなので、日本語に直します。 \begin{document}の前に以下のように書きます。

\makeatletter
\renewcommand{\ALG@name}{アルゴリズム}
\makeatother

Initialize:ブロックを追加する

初期化処理をまとめたブロックを追加します。 \begin{document}の前に以下のように書きます。

\algnewcommand{\Initialize}[1]{%
  \State \textbf{Initialize:}
  \State \hspace*{\algorithmicindent}\parbox[t]{0.8\linewidth}{\raggedright #1}
}

実際に使うときには、\Initializeの中につらつらと書いていきます。 このとき、\Stateは使わずに、手動で開業する必要があったりします。もう少しいい方法ないかな…

\begin{algorithm}[t]
  \caption{なんとかなアルゴリズム}
  \label{alg:hoge}
  \begin{algorithmic}
  \footnotesize{
    \Require{$x$:なんとか,$\tau$:閾値}
    \Ensure{$x$:ほにゃらら}
    \Function{hoge}{$x$}
      \Initialize{
      $y$ := \Call{Get\_Fuga}{$x$}\\
      $z$ := \Call{Get\_Piyo}{$y$}
      }
      \State return $x$
    \EndFunction
  }
  \end{algorithmic}
\end{algorithm}

結果的に得られる出力

こんな出力が得られれます。論文ぽくていい感じ。 f:id:litols0816:20171219160938p:plain

おわりに

以上、擬似コードを書く時のalgorithmicxのカスタマイズ術でした。 このポストを書く時もそうでしたが、英語でググるといろいろなTipsが大抵の場合引っかかるので、それを参考にするといいと思います。

References

Tips & Tricks: Replace "require" and "ensure" with "input" and "output" in algorithmic package of LaTeX

algorithmicx - Slight change in algorithm - TeX - LaTeX Stack Exchange

naming - Changing name of the label Algorithm - TeX - LaTeX Stack Exchange