図表や数式の通し番号をセクションごとに分けたい

<!-- # 図表や数式の通し番号をセクションごとに分けたい -->

:::note info
個人的に知らなかった上、調べても日本語の記事が出てこなかった LaTeX 小ネタです。
:::

article な文書を書く場合、図表や数式は通し番号になります。

```tree
section 1
  ├─ figure 1
  ├─ figure 2
  ...
section 2
  ├─ figure 3
  ├─ figure 4
  ...
```

しかし、以下のような具合にセクション番号を与えてセクション毎にリセットするスタイルへ変更したいこともあります。

```tree
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 引数のカウンタをリセットします。

すなわちプリアンブルで以下のようにすれば、上で示したような状況を再現できます。

```latex
\counterwithin{figure}{section}
```

これだけです。パッケージの導入などは基本的に不要です。本当に小ネタでした。

これで本題は終わりですが、`\counterwithin` の周辺に関してもう少し掘り下げておきましょう。

## リセットだけしたい

もしも、セクション毎に “第 1 引数のカウンタをリセットしたいだけ” であれば、`*` 付きの `\counterwithin*{}{}` を使います。

```latex
\counterwithin*{figure}{section}
```

これで以下のようになります。

```tree
section 1
  ├─ figure 1
  ├─ figure 2
  ...
section 2
  ├─ figure 1
  ├─ figure 2
  ...
```

リセットだけすると、番号がどれを指しているのか分かりづらくなることに注意してください。

## 逆に通し番号にしたい

`\counterwithin` とは反対に文書全体の通し番号にしたい場合もあるでしょう。

例えば report や book な文書を書く場合、チャプター番号が図表や数式の番号に付随します。

```tree
chapter 1
  ├─ figure 1.1
  ├─ figure 1.2
  ...
chapter 2
  ├─ figure 2.1
  ├─ figure 2.2
  ...
```

これを通し番号にするには <code>\counter**without**{}{}</code> を使います。効果は逆ですが使い方は `\counterwithin` と同じです。
プリアンブルで以下のようにします。

```latex
\counterwithout{figure}{chapter}
```

これによって、次のような通し番号になります。

```tree
chapter 1
  ├─ figure 1
  ├─ figure 2
  ...
chapter 2
  ├─ figure 3
  ├─ figure 4
  ...
```

非常に簡単ですね。

## フォーマットオプションもある

`\counterwithin`・`\counterwithout` にはフォーマットオプションがあります。

例えば次のようにすると、図番号にセクション番号付くのに加えて図番号が `\alph` になります。（ここでは “1-a” となります）

```latex
\counterwithin[\alph]{figure}{section}
```

カウンタを印字するコマンドは他にも `\roman` や `\fnsymbol` 等があります。（[参考][latexref]）

[latexref]: https://latexref.xyz/_005calph-_005cAlph-_005carabic-_005croman-_005cRoman-_005cfnsymbol.html "\alph \Alph \arabic \roman \Roman \fnsymbol (LaTeX2e unofficial reference manual (May 2024))"

## 余談

この `\counterwithin`・`\counterwithout` は、2018 年に [chngcntr][] パッケージが LaTeX カーネルに追加される形で実装されました。[^ltnews]

[chngcntr]: https://ctan.org/pkg/chngcntr "CTAN: Package chngcntr"

[^ltnews]: [LaTeX News][ltnews] によれば、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)

[ltnews]: https://ctan.org/pkg/ltnews "CTAN: Package ltnews"

そのため、2018 年以前の LaTeX では明示的に `\usepackage{chngcntr}` が必要です。

実装からだいぶ経ちますが、どうしてなのか `\counterwithin` の日本語情報が無かったので、小ネタとして投稿しておきました。

ちなみに、`\counterwithin` を使った際にピリオド (`.`) で接続されているのが嫌だという方は、以下のようなよく見る方法でスタイルを変更できます。

```latex
\renewcommand{\thefigure}{\thesection-\arabic{figure}}
```

### TeX on LaTeX な方法もあったよね

日本語の記事でこの手の情報を検索すると、次のような TeX on LaTeX な方法が紹介されています。

```latex
\renewcommand{\thefigure}{\thesection.\arabic{figure}}
\makeatletter
  \@addtoreset{figure}{section}
\makeatother
```

もちろん、この方法でも同じことが実現されますが、TeX on LaTeX な感じ [^makeatletter] であまり LaTeX じゃない感があります :upside_down_face:
また、`\counterwithin` の方が簡単です。こちらを使っていくべきでしょう。

[^makeatletter]: 少なくとも `@` が含まれているという意味。

### 実は類似コマンドがある

[amsmath][] パッケージで提供されている `\numberwithin` は `\counterwithin` と等価なコマンドです。

[amsmath]: https://ctan.org/pkg/amsmath "CTAN: Package amsmath"

そのため、`equation` だけでなく `\numberwithin{figure}{section}` としても `\counterwithin` と同じ結果を得ます。また、`\counterwithin` のコマンドオプションに至っては `\numberwithin` を参考にされています。

しかしながら、`\counterwithin` の方が優先代替なコマンドとされています。こちらを使うべきらしいです。（`\counterwithout` もあるので）

この他にも類似機能として、[caption][] パッケージの `figurewithin`・`tablewithin` オプションや [listings][] パッケージの `numberbychapter` オプションがあるようです。（[参考][refer]）

[caption]: https://ctan.org/pkg/caption "CTAN: Package caption"
[listings]: https://ctan.org/pkg/listings "CTAN: Package listings"
[refer]: https://tex.stackexchange.com/a/28334 "Answer by egreg | floats - Continuous v. per-chapter/section numbering of figures, tables, and other document elements - TeX - LaTeX Stack Exchange"