KLダイバージェンスの || をLaTeXで"正しく"書きたい話

## まえがき
カルバック・ライブラー情報量（KLダイバージェンス）とは
```math
\DeclareMathOperator{\KL}{KL}
\KL[p \parallel q ]:=\int p(x)\log\frac{p(x)}{q(x)}\;\mathrm{d} x
```

と定義される，2つの確率分布 $p$, $q$ の"距離"を測る指標である．
$p$, $q$ に対して非対称であり，数学的な「距離」の定義を満たさないのだが，$p$ が $q$に近いほど小さくなるため統計などの分野でよく用いられる．

この非対称性など，「普通とは違う」感を表すためか，$p$, $q$ の間は $\parallel$ という記号で区切って表記する場合が多い．
本記事はこのダブルバーティカルバー[^db] $\parallel$ という記号をLaTeX上でどう表記するのが適切なのかという話題である．

[^db]: なお，ダブルバーティカルバーは日本語では「[双柱](https://ja.wikipedia.org/wiki/%E5%8F%8C%E6%9F%B1)」と呼ぶらしい

## 結論

先に結論を述べると，一般的には `\parallel` ，分数式を使うときなどカッコの `\left`，`\right` と合わせて縦幅を変えたい場合は `\;\middle\|\;` のように手動でアキを調整するか，`\mathrel{}\middle\|\mathrel{}` のようにゴーストを挿入するのが良いと思われる．
何度も使うならばKLダイバージェンスを示す2引数のコマンドを作ったほうが良いだろう．

```tex
\DeclareMathOperator{\KL}{KL}
\DeclarePairedDelimiterX{\divbrace}[2]{[}{]}{%
    #1\;\delimsize\|\;#2%
}
\newcommand{\KLdiv}{%
    \KL\divbrace%
}
```

と定義しておけば `\KLdiv{p}{q}` で呼び出せて意味もわかりやすくなるし，縦幅の伸縮を切り替えることもできるようになる．

## \mid に対応するコマンド

集合の内包的表記（ $\\{ x\in\mathbb{R}\mid |x|<1\\}$ ）や条件付き確率（ $\Pr(X\mid Y)$ ）など，中置記号として $|$ （バーティカルバー）を使う場合は `\mid` を用いるのが良い．
これは単に `|` と入力した場合，LaTeX上では数学記号ではなくただの文字として扱われ，前後のアキが不適切となるなど不都合は生じるからである．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121120/79026d30-b092-ec63-6acb-8e307845e163.png)
（画像に示すように， $|$ の前後の空白に違いがある）

一方，$\parallel$ をLaTeXで出力するために使われる `\|` は `\delimiter "026B30D` のように括弧類として定義されている．
ノルムなどカッコとして用いるには適切だが，KLダイバージェンスのように中置記号として用いる際はTeXにそのように認識されないため， $|$ と同様にアキがおかしくなってしまう．

また，もちろん `||` や `\mid\mid` と入力するのも避けたほうが良い．これは $|$ 記号2つ分という意味であり， $\parallel$ とは意味が異なる[^norm]し，出力も棒の間の広さが異なる．

そこで「中置記号のバーティカルバー」である `\mid` と対応した「中置記号のダブルバーティカルバー」は何かという問題になるが，この答えは `\parallel` である．
平行記号とはちょっと意味が違うんじゃないかと感じるが，`\mid=\mathchar"326A` [^mathchar]であるのに対し `\parallel=\mathchar"326B` となっており，ちゃんとバーティカルバーとダブルバーティカルバーで対応している．
意味の上で気になるならば `\newcommand{\doublemid}{\parallel}` などのように名前を付けるといいだろう．

入力を色々と変えた際の出力結果は以下のようになる．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121120/996efd42-dc67-3db6-28c8-647477c039b9.png)
（※ `\DeclareMathOperator{\KL}{KL}` で `\KL` を定義している．）

[^norm]: これを許すと $|x||y|$ が $|x|\times|y|$ なのか $ x \parallel y$ の絶対値（？）なのか判別がつかなくなってしまう．

[^mathchar]: 「クラス3，ファミリー2の文字コード6Aの文字」という意味

## 中身に合わせて縦幅を変えたい場合

LaTeXでは`\left`，`\right`を使うことで括弧類を中身に合わせて伸ばす機能がある．

```tex
\{\frac{a}{b}\} \rightarrow \left\{\frac{a}{b}\right\}
```
```math
\{\frac{a}{b}\} \rightarrow \left\{\frac{a}{b}\right\}
```

`\left`，`\right`は有名だが，実は `\middle` で真ん中の記号も伸ばすことができる

```tex
\{\frac{a}{b}\mid\frac{c}{d}\} \rightarrow \left\{\frac{a}{b}\middle|\frac{c}{d}\right\}
```
```math
\{\frac{a}{b}\mid\frac{c}{d}\} \rightarrow \left\{\frac{a}{b}\middle|\frac{c}{d}\right\}
```

しかし，`\middle` は（`\left`，`\right` もだが）引数に「括弧類」しか取ることができない．
せっかく前後のアキを意識して `\mid` を使っていたのに，これは数学記号なので `\middle` を適用させようとするとエラーとなってしまう．

そのため，この場合は記号 `|` を使って前後のアキは対処療法的に手動で空白を入れることが多いのだが，自動で調整させるためには「"無"を関係演算子扱させたモノを両側に挿入する」という解決方法がある．
参考：[\middle であり \mid であるもの - マクロツイーター](https://zrbabbler.hatenablog.com/entry/20120411/1334151482)

```tex
\left\{\frac{a}{b}\mathrel{}\middle|\mathrel{}\frac{c}{d}\right\}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121120/9fd6b67b-31e2-3d6f-ed4b-596a7c1e8599.png)
（※MathJaxでは正しくレンダリングされない）

これを使えば，$\parallel$ の場合も同様に伸縮させることができる．
`\middle`を適用した上で関係演算子とするコマンド `\relmiddle` を定義し，各出力結果を比較した．

```tex
\usepackage{mathtools}
\DeclarePairedDelimiter{\Bracket}{[}{]}
\DeclareMathOperator{\KL}{KL}

\newcommand{\relmiddle}[1]{\mathrel{}\middle#1\mathrel{}}

\newcommand{\ab}{\dfrac{a}{b}}
\newcommand{\cd}{\dfrac{c}{d}}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121120/bca07957-83c1-59a4-7c99-e594892fce89.png)


余談だが，`\left`，`\right` を適用するとカッコの扱いが変わってしまう（Pr とカッコ始めとの間にアキが入ってしまう）ため，伸縮するカッコを扱う際は `DeclarePairedDelimiter` を使って定義しておくと良い． `*`をつけて呼び出すと自動で伸縮するようになる．

参考：https://tex.stackexchange.com/questions/151984/double-vertical-bar-notation ではダイバージェンスを表す2引数のコマンドを作ってしまって `\infdiv{P}{Q}` のように呼び出すようにしている．
`\DeclarePairedDelimiterX`の中では `\middle` は使えないようで，代わりに `\delimsize` で大きさの調整をする．
また，ここにゴースト `\mathrel{}` を挿入すると演算子2つ分と扱われてしまうようで[^rel]またアキが狂ってしまうため， `\;` でスペースを挿入することとした．

```tex
\usepackage{mathtools}

\DeclareMathOperator{\KL}{KL}
\DeclarePairedDelimiterX{\divbrace}[2]{[}{]}{%
    #1\;\delimsize\|\;#2%
}
\newcommand{\KLdiv}{%
    \KL\divbrace%
}
```

この場合，`*` をつけることで自動で伸縮させたり，手動で大きさを指定したりできるようになる．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121120/6894f88b-9acc-0565-eb9a-6077b54673b0.png)


[^rel]: [\middle であり \mid であるもの - マクロツイーター](https://zrbabbler.hatenablog.com/entry/20120411/1334151482) でも言及されているが，元々 `\mathrel{}\middle|\mathrel{}` が1つの関係演算子として扱われる時点で結構な謎挙動をしている．TeX言語の話になってくるので深入りは避ける．