TeXの記憶(5) — キャプションを自由に付けたいの続き

figure環境の中で\captionを使えば図のキャプションが出力されますが、同じ環境の中に表も入れてtable環境のキャプションも入れたい、なんてことがよくあります。

デザイン上figure環境やtable環境を使うとうまく収まらないのでフロートにはできない、だけど図や表のキャプションは付けたい、なんてこともあります。そんなときに安易にキャプションを入れるマクロを作ってみました。

こんな感じに出力できます。

img20130416

必要なマクロはたった2行です。コマンドというほどでもありませんでした。

\newcommand{\figenv}{\def\@captype{figure}}
\newcommand{\tabenv}{\def\@captype{table}}

ようするに\def\@captype{figure}を直接使えばいいだけのことですが、TeX文書の中で使うには\makeatletterと\makeatotherで囲まなければならないので、あれば便利、かな。

使い方はこんな感じです。

\begin{figure}
  \caption{デフォルトのキャプション}
  \tabenv\caption{figureの中の表のキャプション}
\end{figure}

何もないところでも

\figenv\caption{キャプション}

が使えます。

\@captypeというのは、LaTeXの\captionの定義の中で使われているマクロです。ltfloat.dtxを見てみると、以下のような定義がありました。

\def\caption{%
  \ifx\@captype\@undefined
    \@latex@error{\noexpand\caption outside float}\@ehd
    \expandafter\@gobble
  \else
    \refstepcounter\@captype
    \expandafter\@firstofone
  \fi
  {\@dblarg{\@caption\@captype}}%
}

\captionが呼ばれたら\@captypeの定義を調べて、figureだったりtableのカウンタを増やしてから、キャプションを出力する別のコマンド\@captionを読んでいます。

これを見ると\@captypeが何も定義されていないとエラーになるように定義されています。自分で定義してしまえばfigureやtable環境のようにキャプションを出力できるわけです。

TeXの記憶(4) -- キャプションを自由に付けたい
LaTeXにはfigureやtableなどのfloat環境があるので、その中で\captionを使えば「図1.3」とか「表3.2」のように番号がカウントされたキャプションが出力されます。でも、この場所だけ別のキャプションを付けたいことがまま...

コメント