ト部蛸焼のブログ

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

algorithmパッケージでもcaptionに一貫性を持たせよう

今回はアルゴリズムLaTeX レポートや LaTeX 論文に載せたい人向けの記事です*1

理工系あるいは情報系の学生は,日夜 LaTeX レポートに追われているといいます [要出典].特に情報系の学生の場合には,LaTeX レポートにプログラミングのコードやアルゴリズムの説明を載せる必要があることが少なくありません.

今回は,いくつかあるアルゴリズム記述系パッケージの中でも algorithm.sty と algpseudocode.sty を取り上げ,そこに caption を付けた場合に生じる問題について取り上げます.

algorithm.sty と algpseudocode.sty

アルゴリズムLaTeX で記述する手助けとなるパッケージはいくつか知られています.今回はその中でも algorithm.sty と algpseudocode.sty を取り上げます.なお,それぞれのパッケージの頒布元は以下の通りです*2

algorithm パッケージ: https://ctan.org/pkg/algorithms
algpseudocode パッケージ: https://www.ctan.org/pkg/algorithmicx *3

今回の記事ではこれらのパッケージの基本的な使い方の紹介は省略します.付属の文書*4や別の記事を参照ください.

取り上げる問題点

何も考えずに algorithm パッケージを使うと以下のようなコードを書くことになります.コードの下に出力される結果も示します.

\documentclass[uplatex,dvipdfmx,twocolumn]{jsbook}
\usepackage{algorithm,algpseudocode}
\begin{document}
\chapter{はじめに}
\section{図や表を挿入する}
\begin{figure}[htbp]
  \caption{線分AB}
  %(そのほかは省略)
\end{figure}
\begin{table}[htbp]
  \caption{買い物のメモ}
  %(そのほかは省略)
\end{table}
\section{アルゴリズムを挿入する}
\begin{algorithm}[htbp]
  \caption{典型的なアルゴリズム}
  %(そのほかは省略)
\end{algorithm}
\end{document}

f:id:tobetakoyaki:20200118235913p:plain:w500
そのまま実装ver.

inconsistency を愛していそうなコードですね……具体的には caption の以下の箇所に一貫性がありません.

  1. 「図」や「表」は日本語なのに「Algorithm」は英語
  2. 通し番号の形式が異なる
  3. アルゴリズムのほうは,通し番号と凡例の文章の間が狭い
  4. 図や表のほうはデフォルトなのに,アルゴリズムのほうは太字

次の章で,一つずつこれらを解決していきましょう.
なお,手っ取り早く完成したコードを見たい人は記事の終わりまで飛んでください.

解決法

「Algorithm」を「アルゴリズム」に変更

これで解決します.

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

ただし,この記述は \makeatletter と \makeatother で挟まれた位置でしてください*5

アルゴリズムの通し番号にチャプター番号などを付記する

これについては algorithm.sty を読み込むときにオプションをつければ解決します.オプション引数に代入したカウンタと連動して通し番号が管理されます. (以下の例をご覧ください.)

\usepackage[chapter]{algorithm} % chapterごとに通し番号がリセット
\usepackage[section]{algorithm} % sectionごとに通し番号がリセット


通し番号と凡例の文章との間にスペースを挿入

新しく caption パッケージを読み込みます.何やらエラーメッセージが吐かれますが,大丈夫なようです.(が,まだ完全に大丈夫という確認はとれていません.調査中です.)この部分について文末に追記をしました.パッケージを読み込んだ上で以下のように記述をすれば解決します.

\usepackage{caption}
\captionsetup[plain]{labelsep=quad}
\captionsetup[boxed]{labelsep=quad}
\captionsetup[ruled]{labelsep=quad}


類似した記述が三つあるのは今回のパッケージが上の三つの float 環境のすべてを使用しうるためです.特に何もいじっていない場合は最下の「ruled」だけを書けば十分です.ちなみにこの \captionsetup はちゃんと三つを独立に書く必要があります

しかし,このままだと次の図のように図や表も設定が変わってしまいます.

f:id:tobetakoyaki:20200119000021p:plain:w500
ここまでをまとめると……

こうなる理由は簡単で,caption パッケージの設定はすべての float タイプ*6に適用されるからです.これを修正するためには以下を追加します.

\captionsetup{labelsep=quad} %オプション引数がないことに注意

改めてコンパイルし直すと,結果は次のようになります*7

f:id:tobetakoyaki:20200119000059p:plain:w500
コロン区切りをスペース区切りに変更

「図」と「表」のほうも太字に変更

最後に若干の修正を加えます.先ほど,ラベルの区切りを指定したところに「labelfont=bf」を指定すれば終わりです.
これで冒頭に挙げた問題点は全て直したことになります.

完成コード

実際に最終版のコードと出力結果を掲載しましょう.

\documentclass[uplatex,dvipdfmx,twocolumn]{jsbook}
\usepackage[chapter]{algorithm}
\usepackage{algpseudocode}
\usepackage{caption}
\makeatletter
\renewcommand{\ALG@name}{アルゴリズム}
\captionsetup{labelfont=bf,labelsep=quad}
\captionsetup[plain]{labelfont=bf,labelsep=quad}
\captionsetup[boxed]{labelfont=bf,labelsep=quad}
\captionsetup[ruled]{labelfont=bf,labelsep=quad}
\makeatother
\begin{document}
%%%% ここは変更していない %%%%
\end{document}

f:id:tobetakoyaki:20200119000407p:plain:w500
完成版

これでcaptionに一貫性が戻りました.

追記 (2020-01-16)

caption.sty を読み込んだときのエラーメッセージについてです.caption.sty の説明文書には,次のような記述があります.

The caption package v3.0 did not support any document classes other than the standard LaTeX ones: article, report, and book. Therefore the default settings used to be fixed, but now the caption package supports more classes, therefore they are now set in dependence on the document class used.

したがって,この記述を見る限りは,問題は解決されていると思われます.

*1:ここでは「LaTeX レポート」や「LaTeX 論文」は LaTeX を用いて書かれたレポートや論文を指しています.

*2:パッケージの内部でいくつかの別のパッケージを必要としますのでご注意ください.

*3:陽に呼び出すのは algpseudocode パッケージだけですが,このパッケージの内部でいろいろ呼び出されるので,頒布元の URL にある sty ファイルは全部ダウンロードすることをおすすめします.

*4:ターミナルで「texdoc PACKAGE_NAME」を入力すると開けます.

*5:命令に@を使うときに必要な処理です.なお,sty ファイルではこの処理は不要です.

*6:figure や table のこと.algorithm パッケージが作る algorithm 環境も float タイプの一つ.algorithm パッケージでは内部で float パッケージというものを読み込んで,そこに定義されている「plain」「boxed」「ruled」の三種類の float を利用します.そのため,ここではこれら三つも float タイプの一つになります.

*7:labelsep には「period」や「newline」などほかにも種類があります.詳しくはパッケージの説明文書などを参照ください.また,新たに区切り方を設定することも可能です.その場合はまず「\DeclareCaptionLabelSeparator{periodspace}{.\ }」のように新たなセパレータを定義します.そしてその後に「\captionsetup{labelsep=periodspace}」などと通常通りに設定します.