個人的に知らなかった上、調べても日本語の記事が出てこなかった 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)
-
少なくとも
@が含まれているという意味。 ↩