unicode-math におけるラテン文字・ギリシャ文字とパッケージオプションを理解する

<!-- # unicode-math におけるラテン文字・ギリシャ文字とパッケージオプションを理解する -->

unicode-math で扱うラテン文字とギリシャ文字の字形は数多くあります。（本記事では、ラテン文字とギリシャ文字をまとめて “**シンボルアルファベット**” と呼称します）

シンボルアルファベットの字形を利用する方法は、これまでの LaTeX とは異なります。また、一部の字形はパッケージオプションの影響を受けます。

本記事では、シンボルアルファベットの字形とその入力方法、パッケージオプションについて紹介します。

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

## シンボルアルファベットの基本

unicode-math が扱う Unicode な数学記号の内、シンボルアルファベットには数多くの字形があります。

シンボルアルファベットの字形には 3 つのパラメタがあります。また、それぞれのパラメタには複数の要素があります。
それぞれの字形は、これらのパラメタを組み合わせます。（すべてのパターンがあるわけではありません）

- **Series**：
    - 中字（ふつうの太さ）
    - 太字
- **Shape**：
    - 立体
    - 斜体
- **Style**：
    - セリフ体
    - サンセリフ体
    - 等幅
    - 黒板太字
    - Script 体（カリグラフィー体）
    - フラクトゥール

例えば、これまでにおける `x` は中字斜体のセリフ体、`\mathsf{A}` は中字立体のサンセリフ体です。

これに加えて Unicode には、これまでの LaTeX で表現しえなかった太字立体のサンセリフ体や太字立体の Script 体などが含まれており、unicode-math でも扱うことが出来ます。

unicode-math におけるシンボルアルファベットは 4 つの入力方法があります。

- 基本シンボルアルファベット
- 固有コマンド
- リテラル
- スイッチコマンド

本記事では、以下 108 の記号を “**基本シンボルアルファベット**” と呼称します。

- ラテン文字 (26×2)
    - `a`\~`z`
    - `A`\~`Z`
- ギリシャ文字 (24×2)
    - `\alpha`\~`\omega`
    - `\Alpha`\~`\Omega`
- ギリシャ文字のバリアント (8)
    - `\varepsilon`, `\vartheta`, `\varkappa`, `\varpi`, `\varrho`, `\varsigma`, `\varphi`
    - `\varTheta`

これ以外の 3 つの入力方法は次節以降で解説します。

## 固有コマンド

unicode-math を利用していても、これまで通り `x` や `\alpha` 等の基本シンボルアルファベットを入力することで、シンボルアルファベットを入力することが出来ます。
しかし、unimath-symbols.pdf を見れば明らかなように、それぞれの字形のシンボルアルファベットにはそれぞれにコマンド名が与えられています。（本記事では、これを “**固有コマンド**” と呼称します）

この固有コマンド名は難解ではなく、基本シンボルアルファベットのコマンド名に `m` または `Bbb` から始まる接頭辞が与えられているだけのものです。（ただし、立体セリフ体のラテン文字には接頭辞が与えられず `A` 等、コマンドにはありません）
このような接頭辞を本記事では “**固有コマンド接頭辞**” と呼称することとします。

|                                                                                                                                        |
| :------------------------------------------------------------------------------------------------------------------------------------: |
| `mup`, `mbf`, `mit`, `mbfit`, `msans`, `mbfsans`, `mitsans`, `mbfitsans`, `mtt`, `Bbb`, `mitBbb`, `mscr`, `mbfscr`, `mfrak`, `mbffrak` |

例えば、Script 体には接頭辞として `mscr` が与えられています。そのため、`\mscrA` とすれば Script 体 “𝒜” が出力されます。
また、固有コマンドによる入力は **リテラル入力** (e.g. `𝒜`) と同じ効果を得ます。

:::note warn
このような接頭辞を与えた固有コマンド入力とリテラル入力は、ともにパッケージオプションの影響を受けるシンボルアルファベットがあります。
そのため、期待した記号が TeX ソースのまま出力されない可能性があります。
:::

例えば、`\mbfA` を入力した場合、太字立体セリフ体のラテン文字 “𝐀” が出力されることが期待されます。しかし、`bold-style` オプションが `ISO` の場合、太字斜体セリフ体のラテン文字 “𝑨” が出力されます。

## スイッチコマンド

これまでの LaTeX では、例えば立体セリフ体にするには `\mathrm`、立体サンセリフ体にするには `\mathsf` を利用してきました。

unicode-math では、これまでの LaTeX で利用していた字形を変更するコマンド（スイッチコマンド）が異なります。

シンボルアルファベットの字形を変更するには、**必ず `\sym~` を使ってください**。

|        字形        |            これまでの LaTeX             |        unicode-math         |
| :----------------: | :-------------------------------------: | :-------------------------: |
|        立体        |        `\mathrm`・<br>`\mathup`         |          `\symup`           |
|        太字        | `\mathbf`・<br>`\boldsymbol`・<br>`\bm` |         `\symbf` ※1         |
|    サンセリフ体    |                `\mathsf`                |         `\symsf` ※1         |
|  太字サンセリフ体  |                    -                    |        `\symbfsf` ※1        |
|   タイプライター   |                `\mathtt`                |          `\symtt`           |
|      黒板太字      |                `\mathbb`                |          `\symbb`           |
|    斜体黒板太字    |                    -                    |         `\symbbit`          |
|     Script 体      |       `\mathcal`・<br>`\mathscr`        | `\symcal`・<br>`\symscr` ※2 |
|   太字 Script 体   |                    -                    |         `\symbfscr`         |
|   フラクトゥール   |               `\mathfrak`               |         `\symfrak`          |
| 太字フラクトゥール |                    -                    |        `\symbffrak`         |

※1 `\symbf`・`\symsf`・`\symbfsf` は立体と斜体をパッケージオプションによって指定されます。明示的に立体・斜体を指定するには末に `up`・`it` を付けます。(e.g. `\symbfit`)

※2 Unicode にはこれまでの LaTeX における `\mathcal` と `\mathscr` に対応するような文字コードは存在せず、2 つを区別して登録されていません。そのため、`\symscr` と `\symcal` の 2 つのコマンドが用意されていますが、双方とも同じ文字コードの文字を得ます。

----------

これらの **スイッチコマンドは、基本シンボルアルファベットと `mup`・`mit` とそのリテラルのみ引数に受け付けます**。この他の固有コマンドを引数に受け付けることができないことに注意してください。

例えば、次のようにしても太字立体 Script 体は再現されません。
`\symbfscr` のみが太字 Script 体を再現します。

```latex
  \symbf{\mscrA}     \symbf{𝒜}
  \symbfup{\mscrA}   \symbfup{𝒜}
```

一方で、`\symbfscr` に `\mitx` や `𝑥` を与えることが出来ます。
```latex
  % \symbfscr{x} と同じ結果を得る
  \symbfscr{\mitx}   \symbfscr{𝑥}
```

:::note warn
スイッチコマンドは入れ子にして表現しません。

すなわち、`\symbfscr{...}` を `\symbf{\symscr{...}}` のようにしません。
:::

## シンボルアルファベットの字形まとめ

以上の固有コマンドとスイッチコマンドについて表にしました。
スイッチコマンドと固有コマンド接頭辞が類似しないことに注意してください。

![unicode-math command](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/2fdec118-fd88-b922-5795-2e807530295c.png "unicode-math におけるスイッチコマンドと固有コマンドの表")

これまでアラビア数字について説明を避けてきましたが、ここで簡単に説明しておきます。

- 字形は立体のみ
- 固有コマンドは `zero`\~`nine` に固有コマンド接頭辞を与える
- 中字立体は `0`\~`9` であり、固有コマンド接頭辞は与えない
- その他の仕様はシンボルアルファベットと同様

当然ですが、アラビア数字は立体のみなので `\symbf` 等を利用してもパッケージオプションの影響を受けません。（必ず立体になります）

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

unicode-math のパッケージオプションの主要な目的は、ラテン文字とギリシャ文字それぞれの大文字・小文字、計 4 つの立体・斜体を制御することにあります。

これは、TeX の慣習的な表現方法や ISO で規定されている表現方法などが異なるためです。

パッケージオプションの指定方法は以下の通りです。

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

あるいは、`\unimathsetup` を利用することで以下のようにもできます。

```latex
\usepackage{unicode-math}
\unimathsetup{
    math-style = ISO,
    bold-style = ISO,
  }
```

次節以降でパッケージオプションの詳細を紹介します。

### シンボルアルファベット

unicode-math における 3 つの主要なパッケージオプションです。
これらのパッケージオプションは、シンボルアルファベットが立体と斜体のどちらを採るのかを制御します。（いずれのパッケージオプションも独立しています）

| パッケージオプション | スイッチコマンド | 対象字形                     |
| :------------------: | :--------------: | :--------------------------- |
|     `math-style`     |        -         | 中字セリフ体（ふつうの文字） |
|     `bold-style`     |     `\symbf`     | 太字セリフ体                 |
|     `sans-style`     |     `\symsf`     | 中字サンセリフ体             |
|     `sans-style`     |    `\symbfsf`    | 太字サンセリフ体             |

`math-style` と `bold-style` に関して、次の表にまとめました。いずれのオプションもデフォルト値は `TeX` です。
背景色が灰色になっている数式は立体になっています。

![math-style, bold-style package option](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/d9bd4347-b3d6-d8a8-39f7-8629af619cdd.png "unicode-math の math-style/bold-style オプション")

`math-sytle` は、`x` や `\alpha` と入力したときに出力される文字が立体か斜体かを制御しています。
例えば、`math-style = TeX` 下では、大文字ギリシャ文字は立体、これ以外は斜体になります。`ISO` 下ではすべて斜体、`upright` 下ではすべて立体です。

`bold-style` は `\symbf` による字形変更の結果が立体か斜体かを制御しています。
例えば、`bold-style = TeX` は `\mathbf` を踏襲しています。

----------

`sans-style` に関しては次の表にまとめました。デフォルト値は `upright` です。
背景色が灰色になっている数式は立体になっています。

![sans-serif package option](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/8bd1f215-f1ea-5e52-82ac-04ddf0775004.png "unicode-math の sans-style オプション")

サンセリフ体のギリシャ文字は Unicode に存在しないため、`\symsf{\greek}` によってサンセリフ体のギリシャ文字は出力されません。

サンセリフ体には太字サンセリフ体もありますが、`\symbfsf` は `sans-sytle` オプションにのみ影響を受け、`bold-style` からは独立しています。

----------

パッケージオプションは、スイッチコマンドに加えて固有コマンドにも波及します。
例えば、`\mbfA` と `\mbfitA` は `math-style` によって同じ字形になります。

パッケージオプションが影響する範囲を固有コマンド接頭辞で表現すると、次のようになります。

- `math-style` (432)：

    - 接頭辞なし（基本シンボルアルファベット）
    - `mup`（ギリシャ文字のみ）
    - `mit`
    - 上記記号のリテラル

- `bold-style` (432)：

    - `mbf`
    - `mbfit`
    - 上記記号のリテラル

- `sans-style` (640)：

    - `msans`（ラテン文字のみ）
    - `mitsans`（ラテン文字のみ）
    - `mbfsans`
    - `mbfitsans`
    - 上記記号のリテラル

### `\nabla` と `\partial`

`\nabla` と `\partial` はパッケージオプションの影響を受けます。それぞれ `italic` と `upright` を受け入れることが出来ます。

Unicode にはなぜか立体・斜体の `\nabla`・`\partial` の他に、太字セリフ体、太字サンセリフ体があります。
パッケージオプションにおけるそれぞれの字形を表にすると次のようになります。

![nabla and partial](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/2dd8aaa8-67ea-b342-6992-e601d9d73bfb.png "\nabla と \partial のパッケージオプション")

デフォルトは `nabla = upright`、`partial = italic` です。

このオプションは他のオプションから独立しています。
そのため、太字セリフ体の `\nabla`・`\partial` を出力する場合は `\symbf{\nabla}` などとしますが、`bold-style` オプションの影響を受けません。同様に、太字サンセリフ体の `\nabla`・`\partial` を出力する場合は `\symbfsf{\nabla}` 等としますが、`sans-style` オプションの影響を受けません。

----------

パッケージオプションが影響する固有コマンドは次の各 12 つです。

- `nabla`：

    - `\nabla`, `\mitnabla`
    - `\mbfnabla`, `\mbfitnabla`
    - `\mbfsansnabla`, `\mbfitsansnabla`
    - 上記記号のリテラル
    - `\symbf`, `\symbfsf`

- `partial`：

    - `\partial`, `\mitpartial`
    - `\mbfpartial`, `\mbfitpartial`
    - `\mbfsanspartial`, `\mbfitsanspartial`
    - 上記記号のリテラル
    - `\symbf`, `\symbfsf`


### 完全なリテラル入力

unicode-math はこれまで見てきたようにパッケージオプションによって字形が制御します。
紹介した 5 つのオプションの他に、このような制御を完全に執筆者側に委ねる `literal` が用意されています。この `literal` は `math-style = literal` とすることですべてのパッケージオプションが `literal` にセットされます。

この入力状態では、通常の中字斜体セリフ体のラテン文字でさえ `x` ではなく `𝑥` または `\mitx` と入力する必要があることに注意してください。
ギリシャ文字には立体・斜体ともに固有コマンドがありますが、入力が基本シンボルアルファベット入力の場合は中字斜体になります。

また、`\symbf`・`\symsf`・`\symbfsf` は立体・斜体を入力されたリテラルに依存するようになります。

このようなリテラル入力は TeX ソースが見やすくなる一方で、ただただ入力が面倒になります。
また、エディタによる入力補助があったとしても、TeX ソース内で立体・斜体や中字・太字を見た目で判断する必要があるため、TeX ソース内の確認が面倒になる可能性があります。
以上を踏まえると、`literal` の指定は避けた方が良いでしょう。

もしも `literal` 以外のオプション下で部分的にリテラル入力をしたい場合は、`\symliteral` を利用します。

## unicode-math の推奨構成

unicode-math を利用している際の **最低限の推奨構成** を紹介しておきます。

~~日本における数式の慣習~~ これまでの LaTeX の挙動に準拠すると [^opinion]、セリフ体は中字・太字に関わらず以下のようにしていると思います。（太字は `\boldsymbol` あるいは bm 準拠）

[^opinion]: 私個人の知見が狭いために「日本における～」などと主語の大きい主張をしてしまいましたが、「これまでの LaTeX の挙動に準拠すると～（`\boldsymbol` や `\bm` を利用した場合）」とした方が正しいです。[参照][x-opinion-zr]

[x-opinion-zr]: https://twitter.com/zr_tex8r/status/1697207775724753022 "某ZR（ざんねん🙃）さん / X"

- 斜体：
    - 小文字ラテン文字
    - 大文字ラテン文字
    - 小文字ギリシャ文字
- 立体：
    - 大文字ギリシャ文字

この挙動は `TeX` と `ISO` のどちらとも異なります。そのため、完全にこれに一致させることは出来ません。

なるべくこの挙動に従わせるには、以下のように構成すると良いでしょう。

```latex
\usepackage{unicode-math}
\unimathsetup{
    math-style = TeX,
    bold-style = ISO,
    sans-style = upright,
  }
```

太字大文字ギリシャ文字だけ気にする必要がありますが、他のラテン文字・小文字ギリシャ文字に比べれば、気にするべき箇所は少ないでしょう。

また、数式フォントは最低限 NewComputerModernMath に変更しておくと良いでしょう。

```latex
\setmathfont{NewComputerModernMath}
\setmathfont{NewComputerModernMath}[
    range = {scr, bfscr},
    StylisticSet = 1,
  ]
```

NewComputerModernMath はデフォルトの Latin Modern Math と類似した字形でありながら、シンボル数は約 1,000 多いです。
また、Stylistic set を利用して、`\symcal` と `\symscr` に別個の字形を割り当てています。

これに加えて、fontspec パッケージで本文英字フォントを NewComputerModern に変更しておくこともオススメしておきます。

```latex
\setmainfont{NewComputerModern10}
\setsansfont{NewComputerModernSans10}
\setmonofont{NewComputerModernMono10}
```

# 余談

unicode-math では、同じシンボルアルファベットを複数の方法で入力できるため、ちゃんと理解しようとするとかなり面倒です。

パッケージオプションが影響する範囲を思えば、これに影響されない黒板太字や Script 体は固有コマンドで入力した方が楽でしょう。
（実際、amssymb では “𝕜” が `\Bbbk` と定義されていました）

固有コマンドにしてもリテラル入力にしても、TeX ソース内で見やすく見分けが付く範囲で上手に使っていくと良いでしょう。
すべてスイッチコマンドで記述すると、冗長的で見づらいものになってしまうことも事実です。

記事の中盤に出したクソデカ情報モリモリ表は、自己満足的に作ったので意味が伝わりづらいかも知れません……

# 追記

- 2023/09/05: 推奨構成について、主観的な主張を改めました。