ieicej.clsのfigure環境内でminipageしたときにキャプションがおかしくなる件

電子情報通信学会の ieicej.cls を使ってTeXで原稿を書くときに、細いカラムの中に縦長の図を横に2つ並べたいときがたまにある。 このように書いて図を2つ並べようとする。

\begin{figure}[bt]
 \begin{minipage}{.49\hsize}
  \centering
  \fbox{\rule{0pt}{2cm}\rule{2cm}{0pt}}
  \caption{figure環境内でminipageすると,長いcaptionは折り返されないので
  絶望せざるをえない}
 \end{minipage}
 \hfill
 \begin{minipage}{.49\hsize}
  \centering
  \fbox{\rule{0pt}{2cm}\rule{2cm}{0pt}}
  \caption{figure環境内でminipageすると,長いcaptionは折り返されないので
  絶望せざるをえない2}
 \end{minipage}
\end{figure}

しかし、長いキャプションがあることで大変残念なことになった。 誠に遺憾である。

figure_in_minipage

そこで、プリアンブルに以下を記述する。

\makeatletter
\newif\ifcap@minipage
\cap@minipagefalse
\let\minipagebak\minipage
\def\minipage{\cap@minipagetrue\minipagebak}
\let\@captionbak\@caption
\def\@caption{%
 \ifcap@minipage
  \capwidth\hsize\ecapwidth\hsize
 \fi
 \@captionbak}
\makeatother

するとどうであろう。

figure_in_minipage_success

きちんと折り返されて表示されるではないか!

解説

minipage環境内でのcaption幅調整がうまくできていない。 minipage環境内では \hsize を基準にcaption幅を決めるべきところが、 \textwidth を基準に決められている。 なので無理矢理変更してやる。

自分でフラグを導入し、これを参照してキャプションの幅を設定してやる。 minipageやcaptionの定義を変更するのが面倒なので、 \let でコピーしておいてその頭に必要な処理を加えている。 メモリを無駄にしてるけど、昨今のマシンでは問題ないだろう。 ちゃんとfalseにクリアしてないような気がしなくもないけど、気にするなということで。

ちなみに、minipage環境に入ると if@minipage フラグがtrueにsetされる。 なのでこれを参照しようかと思ったが、minipage環境内で最初の要素を出力する際の縦方向のスペース調整に利用された後にfalseに変更されてしまうようだ。 図のキャプションのようにminipage環境の一番下でcaptionを出力する場合には if@minipage フラグはすでにfalseに変更された後となる。