unicode-math の注意するべき落とし穴

<!-- # unicode-math の注意するべき落とし穴 -->

unicode-math にはこれまでの LaTeX とは異なる注意点がいくつか存在します。
本記事では、unicode-math の利用前後で生じる問題を中心に注意するべきことを紹介します。

<!-- パッケージガイドにもいくつか記述がありますが、紹介に終始するだけで、間違いを誘発する可能性について示唆していないものもあります。また、単純なバグもあります。この辺りを取り上げています。 -->

:::note info
本記事における unicode-math のバージョンは 0.8r です。
:::

## フォントに存在しないシンボル

unicode-math では、コマンド（あるいはリテラル）入力に対応したシンボルが存在しない場合、**単にシンボルを出力しません**。このとき、**警告が生成され正常にタイプセットが終了します**。（[参照][comment-60e689f22803e9a748c5]）
ただし、この警告はエディタが検出しない場合があり、シンボルが出力されていないことに気付かない可能性があります。

[comment-60e689f22803e9a748c5]: https://qiita.com/Yarakashi_Kikohshi/items/5404d1b67144de5be51f#comment-60e689f22803e9a748c5 "zr_tex8r 様によるコメント"

これまでは、存在しないコマンドにはエラーメッセージが生成されていました。しかし、unicode-math では単にフォントにシンボルがないだけでコマンド自体は定義されています。
そのため、**ログや完成したドキュメントを注意深く眺める必要があります**。使用しているフォントに存在しないシンボルのコマンドを使用している可能性があります。

有効な対策方法はありませんが、なるべく **集録シンボル数の多いフォントを利用する** ことをオススメします。
特にデフォルトの Latin Modern Math はシンボル数が少ないので注意してください。

unimath-symbols.pdf に一覧化されているフォントを見ると、利用できるシンボル数が書かれています。

- Latin Modern Math (1585)
- **XITS Math** (2429)
- **STIX Two Math** (2430)
- TeX Gyre Pagella Math (1638)
- DejaVu Math TeX Gyre (1640)
- Fira Math (1052)
- **NewComputerModernMath** (2430)
- GFS Neohellenic Math (1655)
- Erewhon Math (1662)
- XCharter Math (1640)
- Concrete Math (1637)

すべてのシンボルを使うことはありませんが、気付かない内にフォントにないシンボルを使っていることが無いようにした方が良いでしょう。

### NewComputerModernMath

unicode-math では、デフォルトのフォントに Latin Modern Math を利用します。しかし、このフォントは登録されているシンボル数が 1585 しかなく、あまりにも少ないです。

STIX Two Math 等の他のフォントに変更したくない場合、Latin Modern Math に類似した NewComputerModernMath に変更することをオススメします。このフォントでは、**登録されているシンボル数が 2430** あります。

NewComputerModernMath は Latin Modern Math と比べて、以下の点が異なります。

- シンボル数が約 1,000 多い
- 大文字ラテン文字の黒板太字がセリフ体（Latin Modern Math ではサンセリフ体）

NewComputerModernMath に変更するには、`\usepackage{unicode-math}` の後で次のようにします。

```latex
\setmathfont{NewComputerModernMath}
```

## 大文字ギリシャ文字の立体・斜体

amsmath では、大文字ギリシャ文字に `var` を与えた以下のような 11 のコマンドが与えられています。
これらは大文字ギリシャ文字の斜体です。すなわち、`\mathit{\Greek}` の短縮系に相当します。

```latex
\varGamma \varSigma \varDelta
\varUpsilon \varTheta \varPhi
\varLambda \varPsi \varXi
\varOmega \varPi
```

![varGreek by amsmath](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/846700c8-195d-c236-c4c4-bd70b45cfae8.png "amsmath による \varGreek の結果")

unicode-math でも `\varTheta` が定義されていますが、これは **`\Theta` のバリアント** です。そのため、これまでのように `\varTheta` としても “斜体の `\Theta`” が出力されることはありません。

:::note warn
unicode-math では amsmath を読み込むため、`\varTheta` 以外の `\varGamma` 等は unicode-math ではないものが機能しますが、Unicode として斜体ギリシャ文字になっていません。

unicode-math を使っているのであれば、amsmath 由来のギリシャ文字コマンドを使うべきではありません。
また、当然 `math-style` オプションの影響を受けません。
:::

もしも、“斜体の `\Theta`” が欲しければ、`\symit{\Theta}` あるいは `\itTheta` を利用してください。

以下は `math-style = TeX` 下での各コマンドの結果です。このオプション下では、大文字ギリシャ文字は立体です。

![varTheta and itvarTheta](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/698bf0b8-1955-12e4-802d-062f6bb7ff43.png "math-style = TeX 下での \varTheta の様子")

逆に、`math-style = ISO` 下では大文字ギリシャ文字も斜体になるため、立体にしたい場合は `\symup{\Greek}`・`\upGreek` にします。

:::note info
ギリシャ文字を **強制的に** 立体・斜体を実現したい場合は、`\symup{\Greek}`・`\symit{\Greek}` あるいは `\upGreek`・`\itGreek` とします。（大文字小文字ともに利用可能です）
:::

----------

注意が必要な点として、ギリシャ文字はあらゆる字形を含めてすべてに固有コマンドが与えられています。
例えば、斜体の大文字ガンマは `\mitGamma` が与えられています。

`\mitGreek` はあたかもどのような状況でも斜体大文字ギリシャ文字を得ることが出来ると思えてしまいますが、このコマンドはパッケージオプションの影響を受けます。
すなわち、`math-style = TeX` 下では、立体大文字ギリシャ文字が出力されます。

https://qiita.com/Yarakashi_Kikohshi/items/ac3a31420ad6f754db99

<!-- > [Unicode-math upright symbols - TeX - LaTeX Stack Exchange](https://tex.stackexchange.com/questions/307133/unicode-math-upright-symbols "Unicode-math upright symbols - TeX - LaTeX Stack Exchange") -->

またややこしいことに、`\upGreek`・`\itGreek` を太字に変更する場合、`\symbf{\upGreek}`・`\symbf{\itGreek}` は太字のギリシャ文字を出力しません。
そのため、明示的に `\symbfup{\Greek}`・`\symbfit{\Greek}` とする必要があります。

## `\prime`

これまでの LaTeX では “$x^{\prime\prime}$” のような 2 重のプライムを `x^{\prime\prime}` あるいは `x''` としていました。

しかし、unicode-math では 2 重・3 重・4 重のプライム（マルチプライム）が定義されています。そのため、連続した `\prime` は冗長的な表現になってしまいます。
以下の表に “連続 `\prime`”、“連続 `'`”、“専用コマンド” の違いを表にしました。（“連続 `'`” も専用コマンドと同じシンボルを得ます）

![prime](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/fa533d75-16a3-a886-f686-a7d9aca2f68e.png "unicode-math におけるプライムの取り扱い")

明らかに “連続 `\prime`” では `\prime` どうしのカーニングがおかしくなってしまいます。

パッケージガイドでは、マルチプライムの記号が存在しない場合にエラーメッセージが生成されないため、連続した `'` を利用した方が良いと記載されています。
この方法であれば 5 つ以上のプライムを表現することも出来ます。

なお、この問題は `\backprime` でも同様です。この場合には、`\backdprime`、`\backtrprime` があります。

## ラプラシアンとデルタ

ラプラシアンには三角形に似た記号を利用します。Unicode には、これに対応した文字 U+2206 があります。unicode-math では、`\increment` として定義されています。

一方で、“$\Delta x$” のような差分を表現するデルタは立体の `\symup{\Delta}` または `\upDelta` を利用します。

<!-- この他に、集合論における対称差を表現する三角形があります。これには `\bigtriangleup` を利用します。(binary)

これに対して、同じ文字コードでありながらクラスの異なる `\triangle` (ordinary) があります。
関係演算子として利用するのか、ふつうのシンボルとして利用するのかで使い分ける必要があることに注意してください。 -->

## `\symcal` と `\symscr`

これまでの LaTeX では、`\mathcal`・`\mathscr` としていたような Script 体を 2 つの字形で表現することがありました。
しかし、**Unicode では、Script 体を区別せずに登録されています**。そのため、unicode-math をそのまま利用すると `\symcal` と `\symscr` は同じ字形が出力されます。

これを解消するには、`\symcal`・`\symscr` のいずれか一方に別字形を割り当てる必要があります。

フォントによっては Stylistic set に代替字形が集録されているので、これを利用して 2 つに別個の字形を割り当てることが出来ます。

例えば、STIX Two Math では Stylistic set の `ss01` に `\mathscr` に類似した代替字形が集録されています。そのため、`scr, bfscr` にこの字形を割り当てるように構成します。

```latex
\setmathfont{STIX Two Math}
\setmathfont{STIX Two Math}[
    range = {scr, bfscr},
    StylisticSet = 1,
  ]
```

これによって、`\symcal` で `\mathcal` に相当した字形、`\symscr` で `\mathscr` に相当した字形を得ることが出来ます。
ただし、この 2 つの字形は Unicode 上では同一の文字コードであることに注意してください。

フォントや Stylistic set に関しては以下の記事を参照してください。

https://qiita.com/Yarakashi_Kikohshi/items/7e75c0a2a3f1e622917b

## 異なる記号として区別されないコマンド

これまでの LaTeX では別個の記号として利用されていたものの、uniocde-math では同じ記号として出力されるコマンド組があります。

|    Unicode     | コマンド                   |
| :------------: | :------------------------- |
| [U+210F][210F] | `\hbar`, `\hslash`         |
| [U+2205][2205] | `\emptyset`, `\varnothing` |

[210F]: https://www.compart.com/en/unicode/U+210F "“ℏ” U+210F Planck Constant Over Two Pi Unicode Character"
[2205]: https://www.compart.com/en/unicode/U+2205 "“∅” U+2205 Empty Set Unicode Character"

**これらのコマンド組は同じ記号として出力されます**。

![hslash and emptyset](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/e1a18ca8-3a6c-28d3-8cfe-bab86fd52e8d.png "hslash と emptyset の代替字形 - XCharter-Math.pdf から")

区別されないことでどの程度の問題が生じるか分かりませんが、これらについてはフォントの Character variant や Stylistic set によって字形を変えることが出来ます。

例えば、XCharter Math を利用しているときに `\hslash` を `cv01` 代替字形に、`\emptyset` を `cv02` 代替字形に変更する場合：

```latex
\usepackage{unicode-math}
\setmathfont{XCharter Math}[
    CharacterVariant = { 1, 2 },
  ]
```

残念なことに、異なる 2 つの字形を同時に利用できません。（この 2 つを同時に利用することは滅多にないので、それほど問題にならないはずです）

フォントや Character variant に関しては以下の記事を参照してください。

https://qiita.com/Yarakashi_Kikohshi/items/7e75c0a2a3f1e622917b

## 3 点リーダー

amsmath では次のような 3 点リーダーがあります。

| 3 点リーダー | 説明               |
| :----------: | :----------------- |
|   `\dotsc`   | 列挙用             |
|   `\dotsb`   | 二項演算子の省略用 |
|   `\dotsm`   | 積の省略用         |
|   `\dotsi`   | 積分記号の省略用   |
|   `\dotso`   | その他             |

これらは `\ldots` (`\unicodeellipsis`) と `\cdots` (`\unicodecdots`) のセマンティクス的なコマンドとして利用されてきました。unicode-math でも利用することが出来ます。

amsmath にはこれらに加えて `\dots` があり、これら 5 つの状況を判別して自動的に `\ldots` と `\cdots` を振り分けるようになっています。しかし、**unicode-math では `\dots` で自動判別できません**。
すでにリポジトリで類似した Issue [#593][github-593] が提出されていました。

[github-593]: https://github.com/wspr/unicode-math/issues/593 "`\dots` and integrals · Issue #593 · wspr/unicode-math"

ちなみに、`\idotsint` は `\int\cdots\int` として解釈されます。

## amsmath のパッケージオプション

amsmath では `intlimits`、`sumlimits`、`namelimits` の 3 つの添え字に関するパッケージオプションがあります。

**unicode-math を利用しているとき、これらの添え字に関するパッケージオプションは正常に機能しません**。
この問題はすでにリポジトリで Issue [#497][github-497] が提出されています。

[github-497]: https://github.com/wspr/unicode-math/issues/497 "unicode-math and amsmath options · Issue #497 · wspr/unicode-math"

ただし、明示的な `\limits`・`\nolimits` は機能します。

<!-- ## 不完全な Unicode

Unicode には数多くの文字が登録されていますが、必ずしもすべてのセットが揃っているとは限りません。

例えば黒板太字に関して、ギリシャ文字は 4 つ、斜体ラテン文字は 5 つしかありません。

- 黒板太字：
    - `\Bbbgamma`
    - `\BbbGamma`
    - `\Bbbpi`
    - `\BbbPi`
- 斜体黒板太字：
    - `\mitBbbd`
    - `\mitBbbe`
    - `\mitBbbi`
    - `\mitBbbj`
    - `\mitBbbD`

また、太字サンセリフ体のギリシャ文字はあるにも関わらず、中字サンセリフ体のギリシャ文字は存在しません。

このように、Unicode には数多くのシンボルが登録されているにも関わらず、抜け漏れのようなものもあります。
ある程度 Unicode に何が登録され何が登録されていないか確認しておくと良いでしょう。 -->

<!-- ### ▽ 添え字の記法

これまでの LaTeX では、実装の抜け穴として `x_\mathrm f` のような省略記法を利用することが出来ました。

unicode-math では、このような省略記法が利用できなくなりました。もしも省略記法 (`x_\symup f`) を利用した場合、次のようなエラーメッセージが生成されます。

```log
Missing { inserted.
<to be read again>
\__um_group_begin:
```

```log
Missing } inserted.
<inserted text>
}
```

そのため、次のようにきちんと波括弧を利用します。

```latex
x_{\symup{f}}
``` -->

# 余談

unicode-math にはこれまでの LaTeX にはない注意すべき落とし穴がいくつかあります。

<!-- unicode-math を利用するということは、Unicode の枠の中に入るということを意味します。そのため、Unicode にないシンボルや Unicode では同一視されるシンボルに関して注意深くなる必要があります。 -->

ここでは紹介していませんが、コロンやハイフンを利用する際にはパッケージガイドを参照しておくと良いでしょう。
Unicode にはこれらの類似した記号が複数あるため、どの記号を利用するべきか書いてあります。

# 追記

- 2023/09/05: コメントでの指摘を受けて修正しました。