表の直下に脚注を付けたい

<!-- # 表の直下に脚注を付けたい -->

表を書いているときも脚注を与えたいこともあるでしょう。標準 LaTeX で表に脚注を与えるにはちょっと面倒です。

本記事では、[tabularray][] パッケージを利用した表脚注の作成方法やカスタマイズに関して紹介します。

[tabularray]: https://www.ctan.org/pkg/tabularray

:::note info
本記事において、表の直下に脚注内容を配置した脚注を「**表脚注**」と呼称します。これは、ページ最下に脚注内容を配置した脚注（いわゆる “**ページ脚注**”）とは異なります。
:::

## tabularray による表脚注

tabularray パッケージで表脚注を実現するには、talltblr 環境を利用します。（logntblr 環境も表脚注を提供します）

使い方は、`\begin{talltblr}` に続く `[]` 内に `note`（表脚注の内容）を書き込みます。また、表内の表脚注タグには `\TblrNote` を使います。
タグには `\textdagger` 等の記号を適当に手動で与える必要があります。

```latex
\begin{talltblr}[
    label = none, entry = none,
    note{\textdagger} = {ガラル地方では、ガラル粒子の影響でキョダイマックスすることがある},
    note{\textdaggerdbl} = {アローラ地方では、リージョンフォームと呼ばれる特定の環境に対応したライチュウが存在する},
  ]{
    colspec = {ccccl}, hline{1, 2, Z},
    abovesep = 0pt, belowsep = 0pt,
  }
  名前                                 & 高さ(m) & 重さ(kg) & タイプ & 分類             \\
  ピチュー                             & 0.3     & 2.0      & でんき & こねずみポケモン \\
  ピカチュウ \TblrNote{\textdagger}    & 0.4     & 6.0      & でんき & ねずみポケモン   \\
  ライチュウ \TblrNote{\textdaggerdbl} & 0.8     & 30.0     & でんき & ねずみポケモン   \\
\end{talltblr}
```

![talltblr](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/05658cb0-1d30-5b24-7178-b535234f3fce.png "複数 note のみの talltblr")

簡単ですね。

表脚注タグは手動で指定するため、複数の `\TblrNote` が同一の `note` を指定している形を採っていても問題ありません。

```latex
\begin{talltblr}[
    label = none, entry = none,
    note{\textdagger} = {かわいい},
  ]{
    colspec = {ccccl}, hline{1, 2, Z},
    abovesep = 0pt, belowsep = 0pt,
  }
  名前                              & 高さ(m) & 重さ(kg) & タイプ & 分類             \\
  ピチュー   \TblrNote{\textdagger} & 0.3     & 2.0      & でんき & こねずみポケモン \\
  ピカチュウ \TblrNote{\textdagger} & 0.4     & 6.0      & でんき & ねずみポケモン   \\
  ライチュウ \TblrNote{\textdagger} & 0.8     & 30.0     & でんき & ねずみポケモン   \\
\end{talltblr}
```

![talltblr](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/d7084399-467b-1150-5ba5-55d9cd993e36.png "単一 note のみの talltblr")

----------

hypreref パッケージを利用すると、`note` で作成される表脚注にハイパーリンクが作成されます。また、ハイパーリンクを作成する際、リンクのある表脚注タグに枠線を課す場合は以下のようにします。（ドキュメントに明示されていないため実装を参照）

```latex
\SetTblrTemplate{note-border}{normal}
```

### キャプションを取り除く

talltblr 環境では、キャプションを付けることを前提としています。そのため、`caption` キーを利用しなくてもキャプションが挿入されます。また、表のカウンタが +1 されます。

これを避けるには、`label` と `entry` に特別な値 `none` を与えます。

```latex
\begin{talltblr}[
    label = none, entry = none
  ]{...}
  % table contents
\end{talltblr}
```

その都度与えるのが面倒な場合は、`\SetTblrOuter` を利用します。

```latex
\SetTblrOuter[talltblr]{ label = none, entry = none }
```

あるいは、次のようにすることで tblr 環境に表脚注のみを与えることも出来ます。

```latex
\SetTblrOuter[tblr]{ tall, label = none, entry = none }
```

本記事ではキャプションに関して注目していないので、キャプションをこの機能によって取り除いています。

## 表の注釈

talltblr 環境には `note` の他に `remark` があります。これは、表内と関連付けずに表に関する注釈を与えます。

`remark` の使い方は `note` と同じです。ただし表内へのタグはありません。

```latex
\begin{talltblr}[
    label = none, entry = none,
    note{\textdagger} = {ガラル地方では、ガラル粒子の影響でキョダイマックスすることがある},
    note{\textdaggerdbl} = {アローラ地方では、リージョンフォームと呼ばれる特定の環境に対応したライチュウが存在する},
    remark{Reference} = {\ttfamily https://zukan.pokemon.co.jp/},
    remark{ポケモン} = {ポケットモンスター、縮めてポケモン。この星の不思議な不思議な生き物。空に、海に、森に、街に、世界中の至る所でその姿を見ることができる。},
  ]{
    colspec = {ccccl}, hline{1, 2, Z},
    abovesep = 0pt, belowsep = 0pt,
  }
  名前                                 & 高さ(m) & 重さ(kg) & タイプ & 分類             \\
  ピチュー                             & 0.3     & 2.0      & でんき & こねずみポケモン \\
  ピカチュウ \TblrNote{\textdagger}    & 0.4     & 6.0      & でんき & ねずみポケモン   \\
  ライチュウ \TblrNote{\textdaggerdbl} & 0.8     & 30.0     & でんき & ねずみポケモン   \\
\end{talltblr}
```

![talltblr](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/bf5ea724-5411-d0ba-c16a-610c2d20c922.png "note と remark のある talltblr")

### `note` と `remark` の順番を入れ替える

デフォルトでは `note` → `remark` の順で書き込まれます。これは `\begin{talltblr}[...]` 内の `note`・`remark` の順を問いません。

これを入れ替えるには、以下のように `lastfoot` を以下のように定義します。

```latex
\DefTblrTemplate{lastfoot}{default}{
  \UseTblrTemplate{remark}{default}
  \UseTblrTemplate{note}{default}
}
```

ところで、`note` どうし、`remark` どうしの順番はソース内の書き込み順序に従います。

## 表脚注・注釈のカスタマイズ

デフォルトの `note`・`remark` による表脚注・注釈はあまりに主張が強くて良くないねなので、良い感じに変更しましょう。

tabularray における `note`・`remark` は `\DefTblrTemplate` によってカスタマイズできます。

ここでは詳細なカスタマイズ方法の紹介は避けて、`\parbox` を利用したテキストの改行をタグの右側で揃えるようなスタイル例を紹介します。

<details>
<summary><code>\parbox</code> を用いたスタイルの構成例（折りたたみ）</summary>

```latex
%% 新しいスタイル parboxNote と parboxRemark を定義する
\newlength\noteTblrTagLength
\newlength\noteTblrIndent
\newlength\noteTblrWidth
\newlength\remarkTblrTagLength
\newlength\remarkTblrIndent
\newlength\remarkTblrWidth
\newlength\footTblrRightMargin
\setlength{\footTblrRightMargin}{1em}
\ExplSyntaxOn %% 途中で expl3 のコード (\l__tblr_use_hang_tl) が入るため
\DefTblrTemplate{note-tag}{plain}{ \InsertTblrNoteTag }
\DefTblrTemplate{note-text}{parboxNoteText}{ \parbox[t]{\noteTblrWidth}{\InsertTblrNoteText} }
\DefTblrTemplate{remark-tag}{bold}{ \sffamily \gtfamily \itshape \UseTblrFont{remark-tag} \InsertTblrRemarkTag }
\DefTblrTemplate{remark-sep}{fwColon}{：}
\DefTblrTemplate{remark-text}{parboxRemarkText}{ \parbox[t]{\remarkTblrWidth}{\InsertTblrRemarkText} }
\DefTblrTemplate{note}{parboxNote}
  {
    \UseTblrAlign{note}
    \UseTblrIndent{note}
    \MapTblrNotes
    {
      \setlength{\noteTblrIndent}{\l__tblr_use_indent_tl}
      \settowidth{\noteTblrTagLength}{
        \UseTblrTemplate{note-tag}{plain}
        \UseTblrTemplate{note-sep}{normal}
      }
      \setlength{\noteTblrWidth}{\dimexpr \linewidth-(\noteTblrIndent+\noteTblrTagLength+\footTblrRightMargin)}
      \UseTblrTemplate{note-tag}{plain}
      \UseTblrTemplate{note-target}{default}
      \UseTblrTemplate{note-sep}{normal}
      \UseTblrTemplate{note-text}{parboxNoteText}
      \par
    }
    \vspace{0.3em}
  }
\DefTblrTemplate{remark}{parboxRemark}
  {
    \UseTblrAlign{remark}
    \UseTblrIndent{remark}
    \MapTblrRemarks
    {
      \setlength{\remarkTblrIndent}{\l__tblr_use_indent_tl}
      \settowidth{\remarkTblrTagLength}{
        \UseTblrTemplate{remark-tag}{bold}
        \UseTblrTemplate{remark-sep}{fwColon}
      }
      \setlength{\remarkTblrWidth}{\dimexpr \linewidth-(\remarkTblrIndent+\remarkTblrTagLength+\footTblrRightMargin)}
      \UseTblrTemplate{remark-tag}{bold}
      \UseTblrTemplate{remark-sep}{fwColon}
      \UseTblrTemplate{remark-text}{parboxRemarkText}
      \par
    }
    \vspace{0.3em}
  }
\ExplSyntaxOff
```

日本語の斜体化は [この記事][italic-ja] を参照しながら、プリアンブルに以下を追加しています。

[italic-ja]: https://zrbabbler.hatenablog.com/entry/2020/09/05/162347 "LaTeXで和文を斜体する話(1) - マクロツイーター"

```latex
\usepackage{luatexja-fontspec}
\setsansjfont{Harano Aji Gothic}[AutoFakeSlant=0.25]
```

</details>

以下のように適用すると、次のような表を得られます。

```latex
%% parboxNote と parboxRemark を適用する
\SetTblrTemplate{note}{parboxNote}
\SetTblrTemplate{remark}{parboxRemark}
%% \SetTblrStyle で note と remark の構成を変更する
\SetTblrStyle{note, remark}{
    indent = 1em,
    font = \footnotesize,
    %% hang は使えません
  }
```

![talltblr](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/2f660595-084f-cc47-1c34-37e5b7f3b97d.png "note と remark がカスタマイズされた talltblr")

少しややこしいですが、`note` のスタイル変更は表脚注のみに機能します。そのため、表内の脚注タグには影響しません。（`\TblrNote` 側のタグのスタイルを変更する手段が提供されていない）
もしも `\TblrNote` 側のタグのスタイルを変更したい場合は、`\TblrNote` を再定義するなどの方策を採る必要があるでしょう。

同じような形式で `contfoot`、`conthead`、`caption`、`firsthead`、`middlehead`、`lasthead`、`head`、`firstfoot`、`middlefoot`、`lastfoot`、`foot` のスタイルを変更できます。

このようなカスタマイズの詳細な構成方法はドキュメントを参照してほしいですが、ドキュメントの § 4 を読むだけでは不十分です。§ 8.25\~29 にあるソースコードも参照してください。(v.2023A)

## 余談

表の脚注も注釈も tabularray で出来ちゃう。

----------

表脚注のタグには “†” などの記号が用いられますが、手動でタグを決める必要があるので、以下のような記号類のコマンドを覚えておくと良いでしょう。（`\fnsymbol` による記号は次のような順序で表示されます）

1. `\textasteriskcentered` (∗)
1. `\textdagger` (†)
1. `\textdaggerdbl` (‡)
1. `\textsection` (§)
1. `\textparagraph` (¶)
1. `\textbardbl` (‖)
1. `\textasteriskcentered\textasteriskcentered` (∗∗)
1. `\textdagger\textdagger` (††)
1. `\textdaggerdbl\textdaggerdbl` (‡‡)

----------

ちなみに、そもそも tblr 環境内で `\footnote` が使えないの？と思った人もいるかもしれませんが、これはうまくいきません。なぜなら tabularray パッケージから提供される表環境は複数回に渡って表コンテンツを読むからです。これゆえにカウンタが上手く機能しません。

ページ脚注に関してはリポジトリで [Issue][] が挙がっていますが、いまだ実現には至っていません。

[issue]: https://github.com/lvjr/tabularray/issues/336 "Support for “automatic” page footnotes · Issue #336 · lvjr/tabularray"

### 標準 LaTeX における表と脚注

LaTeX は標準で表（tabular 環境）と脚注 (`\footnote`) を記述することが出来ますが、これを組み合わせることは難しいです。
これは、tabular 環境内で `\footnote` を利用すると、問題なくタイプセットされるのに対して、ページ最下にあるはずの脚注が表示されません。

これを解決するには以下の方法が一般的です。

- `\footnotemark`・`\footnotetext` による手動指定
- `\footnote`＋[tablefootnote][] パッケージ

[tablefootnote]: https://www.ctan.org/pkg/tablefootnote

あるいは、[tabularx][] パッケージから提供される tabularx 環境内では、`\footnote` を使って普通に脚注を利用することが出来ます。

[tabularx]: https://www.ctan.org/pkg/tabularx

----------

一方で、表脚注にする場合は tabular 環境全体を minipage 環境で囲います。これは簡単に実現することが出来ます。（表と脚注の間の罫線は `\footnoterule` です）

```latex
\begin{minipage}{0.85\linewidth}
  \begin{tabular}{ccccl}
    \hline
    名前        & 高さ(m) & 重さ(kg) & タイプ & 分類             \\
    \hline
    ピチュー    & 0.3     & 2.0      & でんき & こねずみポケモン \\
    ピカチュウ \footnote{ガラル地方では、ガラル粒子の影響でキョダイマックスすることがある}
                & 0.4     & 6.0      & でんき & ねずみポケモン   \\
    ライチュウ \footnote{アローラ地方では、リージョンフォームと呼ばれる特定の環境に対応したライチュウが存在する}
                & 0.8     & 30.0     & でんき & ねずみポケモン   \\
    \hline
  \end{tabular}
\end{minipage}
```

![minipage+tabular](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/5e62b4e9-b8ee-ffbd-5f74-84aec0093023.png "脚注のある minipage + tabular")

ただし、この方法では、同一内容の脚注に対して期待した結果を得ることが出来ません。そのため、`\footnotemark`・`\footnotetext` を利用してうまく手動で調整する必要があるでしょう。

![minipage + tabular](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/b88d16c8-3500-cb95-1de4-438c04541806.png "脚注内容が重複した minipage + tabular")

この他に、[threeparttable][] パッケージを利用することでも表脚注を作成できます。

[threeparttable]: https://www.ctan.org/pkg/threeparttable
[nicematrix]: https://www.ctan.org/pkg/nicematrix