重点解説！ unicode-mathをもっと幸せに使う話

:::note info
これは「[TeX & LaTeX Advent Caleandar 2023](https://adventar.org/calendars/9305)」の14日目の記事です。
（13日目は[CareleSmith9 さん](http://circle9tym.blog.fc2.com/blog-entry-434.html)です。15日目は [h-kitagawa さん](https://adventar.org/calendars/9305)です。）
:::

以前に[「徹底解説！ unicode-mathパッケージでココが変わる」][zr-old]と題してunicode-mathパッケージの「フォント選択命令の使い方」について解説しました。その内容の通り、unicode-mathでは従来のLaTeXと比べるとフォント選択命令が“体系化”されて解りやすく[^easy]なっています。

[^easy]: “簡単”であるかについては、人によって感じ方が異なると思います。実際、普段使う範囲での命令の数が増えて「難しくなった」と考える人もいるでしょう。

ところが、その中でも**​「立体と斜体の自動振り分け」​**の話は複雑であまり直感的とはいえません。特に、**ラテン文字とギリシャ文字で挙動が異なる**のは、せっかく「unicode-mathではギリシャ文字のフォント選択もフツーにできるようになった」メリットを台無しにしている感じもします:frowning:

本記事では**​「立体と斜体の指定」​**をもっと単純にするためのunicode-mathのパッケージオプション`math-style`について解説します。このオプションを使えばunicode-mathをもっと**幸せ**:blush:に使えるかもしれません。

:::note info
[例の記事][zr-old]では「unicode-mathを使い始める際の最低限必要な知識」をカバーすることを目的としているため、敢えてunicode-mathの**既定の設定**を前提にしました。unicode-mathに関する他の解説文献を読むにあたっては既定の挙動を知っておく必要があるからです。
:::

## 前提知識

* [例の記事][zr-old]を読んで内容を理解している。

:::note warn
本記事での説明では多くの数学の分野のように「立体と斜体の使い分けは原則行わない[^no-disc]」状況を前提とします。ただしunicode-mathの機能自体の記述についてはこの限りではないので、物理学や論理学などの「立体と斜体の区別も活用する[^physics]」状況でもunicode-mathの機能の説明は有用でしょう。
:::

[^no-disc]: ここで「使い分けを行わない」というのは「立体と斜体の違いしかない文字の組（例えば“a”と“*a*”）の**両方**が使われることがない」という意味です。また、unicode-mathの`\sym～`系の命令の話であるため「単文字の識別子」を前提にしています。

[^physics]: 例えば「質量 *m* の質点 m」（*m* と m は別のものを指している）のような使い方を指しています。

## 復習：unicode-mathの既定設定の挙動

数式中の（ラテン・ギリシャ）文字[^letter]について、“そのまま”（フォント命令無し）の場合（セリフ・中字）や`\symbf`の場合（セリフ・太字）は**立体と斜体の何れかに自動的に振り分けられる**のでした。どちらになるかは**文字種**（ラテン文字かギリシャ文字か、大文字か小文字か）により決まります。

[^letter]: ここでは「文字」はラテン文字とギリシャ文字のことを指し、数字は含まないものとします。数字は常に「数字」として言及します。

```latex
\[ a + A = ω + Ω \]
\[ \symbf{a} + \symbf{A} = \symbf{ω} + \symbf{Ω} \]
```

![umms-image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14550/6147354e-651b-6dfb-fca1-9d826f4acb95.png)

同様に立体と斜体を振り分ける`\symsf`と`\symbfsf`を加えると、unicode-mathの既定設定での「に立体と斜体の振り分け」の規則は以下のようになっています[^greek-sf]。

[^greek-sf]: 例の記事の脚注でも言及しましたが、Unicodeの数式文字が「ギリシャ文字のサンセリフは太字だけサポートして中字はしない」という極めて**不可解**な規定になっているため、unicode-mathでもギリシャ文字のサンセリフ・中字はサポートされていません。

| 書体 ＼ 文字種 | ラテン | ギリシャ大 | ギリシャ小 |
|:-:|:-:|:-:|:-:|
| そのまま（セリフ・中字）       | 斜体 | 立体 | 斜体 |
| `\symbf`（セリフ・太字）       | 立体 | 立体 | 斜体 |
| `\symsf`（サンセリフ・中字）   | 立体 | ―   | ―   |
| `\symbfsf`（サンセリフ・太字） | 立体 | 立体 | 立体 |

率直に言って**わけがわかりません**:weary: この複雑な規則に何か根拠があればまだいいのですが、実際のところ、ほとんど[^us-latin]は「単に旧来の(La)TeXに合わせただけ」という**アレ**:sushi:な理由によるものだったりします。

[^us-latin]: ラテン文字（セリフ）について「中字は斜体で太字は立体にする」のは米国の習慣に基づきます。そもそも数式の文字を斜体にするのは、欧文（例えば「Let *a* be a number.」のような記述）で数式文字と地の文が紛れないようにするためであり、太字ではその必要性が薄いのでしょう。

この面倒を回避する手段として、`\symbf{a}`（セリフ・太字）などの「振り分けが発生する記述」を避けて`\symbfup{a}`（セリフ・太字・**立体**）や`\symbfit{a}`（セリフ・太字・**斜体**）などの**具体的な書体を常に指定する**というものが考えられます。ただこれを貫徹させようとすると、“そのまま”で`a`（セリフ・中字）のように書くことも禁止となってしまい流石にこれは不便です。結局バランスをとる必要があり、[例の記事][zr-old]では（数字も含めて）次のような組み合わせを提案しました[^default]。

[^default]: サンセリフについては明示的には述べていませんが、本文の内容から判断するとその表のようになるはずです。サンセリフ・太字は滅多に使われないので省きました。なお、「―」印の書体（サンセリフ・中字のギリシャ文字および斜体の数字）はサポートされません。

| 書体 ＼ 文字種 | ラテン | ギリシャ | 数字 |
|:-:|:-:|:-:|:-:|
| セリフ・中字・立体     |`\symup`  |`\symup`  |そのまま |
| セリフ・中字・斜体     |そのまま  |`\symit`  | ―      |
| セリフ・太字・立体     |`\symbf`  |`\symbfup`|`\symbf` |
| セリフ・太字・斜体     |`\symbfit`|`\symbfit`| ―      |
| サンセリフ・中字・立体 |`\symsf`  | ―       |`\symsf` |
| サンセリフ・中字・斜体 |`\symsfit`| ―       | ―      |

## 全て斜体に寄せたいとき

翻って**日本での数式書体の習慣**はどうだったかを考えてみると、少なくとも私の感覚では「文字種によらず中字でも太字でも文字は**全て斜体にする**」のが一般的だと考えられます。(La)TeXで作られた本では文字種により立体が使われることも多いですが、それは「単に(La)TeXの既定をそのまま使っただけ」であり何か別の習慣を“主張”する意図はないことがほとんどでしょう。そこで、文字種にかかわらず**常に斜体を優先する**設定があれば**幸せ**:blush:になれそうです。

unicode-mathでは「立体と斜体の振り分け」の方法を制御するためのパッケージオプション[^option]として`math-style`を用意しています。`math-style=‹値›`という形で指定し、値には`TeX`[^ms-tex]・`ISO`・`french`・`upright`・`literal`の何れかをとります。このうち「常に斜体を優先する」に相当する設定は`math-style=ISO`[^ms-iso]です。

[^option]: `math-style`（および他の大部分のunicode-mathの設定オプション）はパッケージオプション以外の箇所でも使えるのですが、その辺りの話は本記事では扱いません。
[^ms-tex]: `math-style`の既定値は`TeX`です。すなわち`TeX`は前節で述べた**アレ**:sushi:な振り分け規則を指します。
[^ms-iso]: ISOはむしろ「立体と斜体を意味により区別する」ことを推奨しているので、「常に斜体を優先する」設定にISOの名前が付いているのは奇妙な気がします。

```latex
\usepackage[math-style=ISO]{unicode-math}
```

この設定により文字の「立体と斜体の振り分け」（そのまま・`\symbf`・`\symup`・`\symbfup`）の結果は**全て斜体**になります。

```latex
\[ a + A = ω + Ω \]
\[ \symbf{a} + \symbf{A} = \symbf{ω} + \symbf{Ω} \]
```

![umms-image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14550/49f18089-5c24-221d-f010-ae12361223bd.png)

挙動が単純（常に斜体）になった「振り分け命令」を積極的に使うことにすると、各文字種・書体に対して使うべき命令の組み合わせは以下のようになります。

| 書体 ＼ 文字種 | ラテン・ギリシャ | 数字 |
|:-:|:-:|:-:|
| セリフ・中字・立体     |`\symup`  |そのまま |
| セリフ・中字・斜体     |そのまま  | ―      |
| セリフ・太字・立体     |`\symbfup`|`\symbf` |
| セリフ・太字・斜体     |`\symbf`  | ―      |
| サンセリフ・中字・立体 |`\symsfup`|`\symsf` |
| サンセリフ・中字・斜体 |`\symsf`  | ―      |

ラテン文字とギリシャ文字の挙動が統一されて**かなり単純**になりました。まだ数字の挙動は異なりますが、数字は元々立体しかサポートされないので、ここで「文字（ラテン・ギリシャ）は原則的に[^exception]**斜体しか使わない**」ことに決めると、結果的に「立体と斜体の**使い分けという概念がなくなる**（常に数字は立体で文字は斜体）」ことになります。この場合に使うべき命令の組み合わせは以下の通りです。

[^exception]: もし原則から外れる例外があるなら「それについては`\symbfup{R}`のように具体的な書体を指定する」ということを認識していればいいでしょう。

| 書体 ＼ 文字種 | ラテン・ギリシャ・数字 |
|:-:|:-:|
| セリフ・中字     |そのまま  |
| セリフ・太字     |`\symbf`  |
| サンセリフ・中字 |`\symsf`  |

**トッテモ簡単**になりました！:blush:

### でもサンセリフは立体にしたいとき

`math-style=ISO`は「振り分け命令」を常に斜体にするため、サンセリフ（中字）用の命令`\symsf`も斜体になります。

```latex
\[ \symbf{e} \in \symsf{E} \]
```

![umms-image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14550/c4297cbc-012c-0934-6f81-836e426cd11a.png)

日本においてサンセリフを立体と斜体のどちらにするのが一般的かはよく知りませんが、もし「**サンセリフは原則的に立体**を使う」ようにしたいのであればその設定も可能です。unicode-mathのパッケージオプションに`math-style=ISO`に**加えて**`sans-style=upright`を指定します。

```latex
\usepackage[math-style=ISO,sans-style=upright]{unicode-math}
```

これにより「サンセリフの振り分け命令（`\symsf`と`\symbfsf`）」だけ（文字種によらず）**立体**になります。先程の数式の出力は以下のようになります。

![umms-image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14550/911ddc93-76cf-ffa0-27f8-ce9d2f041c6e.png)

## まとめ

unicode-mathで（日本の習慣的に）フツーの数式を書きたい人は、`math-style=ISO`を指定して**幸せ**:blush:になりましょう！

[zr-old]: https://qiita.com/zr_tex8r/items/648b024e55126f3ba077