個人的に知らなかった上、調べても日本語の記事が出てこなかった LaTeX 小ネタです。
article な文書を書く場合、図表や数式は通し番号になります。
section 1
├─ figure 1
├─ figure 2
...
section 2
├─ figure 3
├─ figure 4
...
しかし、以下のような具合にセクション番号を与えてセクション毎にリセットするスタイルへ変更したいこともあります。
section 1
├─ figure 1.1
├─ figure 1.2
...
section 2
├─ figure 2.1
├─ figure 2.2
...
本記事ではこのようなセクション番号など別のカウンタの番号を与えたり、別のカウンタが上がるごとにカウンタをリセットする方法を紹介します。
なお、カウンタには図番号の figure
を代表として使いますが、適宜 table
や equation
に置き替えて読んでください。
\counterwithin
を使う
\counterwithin{}{}
は第 1 引数のカウンタを第 2 引数のカウンタ付きに変更します。また、第 2 引数のカウンタが上がるごとに第 1 引数のカウンタをリセットします。
すなわちプリアンブルで以下のようにすれば、上で示したような状況を再現できます。
\counterwithin{figure}{section}
これだけです。パッケージの導入などは基本的に不要です。本当に小ネタでした。
これで本題は終わりですが、\counterwithin
の周辺に関してもう少し掘り下げておきましょう。
リセットだけしたい
もしも、セクション毎に “第 1 引数のカウンタをリセットしたいだけ” であれば、*
付きの \counterwithin*{}{}
を使います。
\counterwithin*{figure}{section}
これで以下のようになります。
section 1
├─ figure 1
├─ figure 2
...
section 2
├─ figure 1
├─ figure 2
...
リセットだけすると、番号がどれを指しているのか分かりづらくなることに注意してください。
逆に通し番号にしたい
\counterwithin
とは反対に文書全体の通し番号にしたい場合もあるでしょう。
例えば report や book な文書を書く場合、チャプター番号が図表や数式の番号に付随します。
chapter 1
├─ figure 1.1
├─ figure 1.2
...
chapter 2
├─ figure 2.1
├─ figure 2.2
...
これを通し番号にするには \counterwithout{}{}
を使います。効果は逆ですが使い方は \counterwithin
と同じです。
プリアンブルで以下のようにします。
\counterwithout{figure}{chapter}
これによって、次のような通し番号になります。
chapter 1
├─ figure 1
├─ figure 2
...
chapter 2
├─ figure 3
├─ figure 4
...
非常に簡単ですね。
フォーマットオプションもある
\counterwithin
・\counterwithout
にはフォーマットオプションがあります。
例えば次のようにすると、図番号にセクション番号付くのに加えて図番号が \alph
になります。(ここでは “1-a” となります)
\counterwithin[\alph]{figure}{section}
カウンタを印字するコマンドは他にも \roman
や \fnsymbol
等があります。(参考)
余談
この \counterwithin
・\counterwithout
は、2018 年に chngcntr パッケージが LaTeX カーネルに追加される形で実装されました。1
そのため、2018 年以前の LaTeX では明示的に \usepackage{chngcntr}
が必要です。
実装からだいぶ経ちますが、どうしてなのか \counterwithin
の日本語情報が無かったので、小ネタとして投稿しておきました。
ちなみに、\counterwithin
を使った際にピリオド (.
) で接続されているのが嫌だという方は、以下のようなよく見る方法でスタイルを変更できます。
\renewcommand{\thefigure}{\thesection-\arabic{figure}}
TeX on LaTeX な方法もあったよね
日本語の記事でこの手の情報を検索すると、次のような TeX on LaTeX な方法が紹介されています。
\renewcommand{\thefigure}{\thesection.\arabic{figure}}
\makeatletter
\@addtoreset{figure}{section}
\makeatother
もちろん、この方法でも同じことが実現されますが、TeX on LaTeX な感じ 2 であまり LaTeX じゃない感があります
また、\counterwithin
の方が簡単です。こちらを使っていくべきでしょう。
実は類似コマンドがある
amsmath パッケージで提供されている \numberwithin
は \counterwithin
と等価なコマンドです。
そのため、equation
だけでなく \numberwithin{figure}{section}
としても \counterwithin
と同じ結果を得ます。また、\counterwithin
のコマンドオプションに至っては \numberwithin
を参考にされています。
しかしながら、\counterwithin
の方が優先代替なコマンドとされています。こちらを使うべきらしいです。(\counterwithout
もあるので)
この他にも類似機能として、caption パッケージの figurewithin
・tablewithin
オプションや listings パッケージの numberbychapter
オプションがあるようです。(参考)
-
LaTeX News によれば、2018 年に実装され、2021 年に
*
やコマンドオプションが追加されました。- Integration of remreset and chngcntr packages into the kernel - Issue 28, April 2018 (LaTeX release 2018-04-01)
- New argument for
\counterwithin/without
- Issue 34, November 2021 (LaTeX release 2021-11-15)
-
少なくとも
@
が含まれているという意味。 ↩