unicode-math における数式フォントと本文フォント

<!-- # unicode-math における数式フォントと本文フォント -->

[unicode-math][] では、数式のフォントを簡便に変更できます。

多くの場合これに留まらず、数式フォントに合う本文フォントが利用されます。そのため、unicode-math で数式フォントを変更した際には本文フォントも変更することが望まれます。
本文フォントを変更するには [fontspec][] を利用します。

[unicode-math]: https://www.ctan.org/pkg/unicode-math "CTAN: Package unicode-math"
[fontspec]: https://www.ctan.org/pkg/fontspec "CTAN: Package fontspec"

また、数式内には `\mathrm` 等の本文フォントを利用する要素が複数あります。
この `\mathrm` 等で利用されるフォントは、unicode-math や fontspec から細かく制御できます。

本記事では、数式フォントに対応する本文フォントと数式内における本文フォントの扱いを紹介します。

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

## 数式内のテキスト

unicode-math において、数式内で利用する `\mathrm` などの `\math~` は本文フォントを利用する “**テキスト数式英字 (Text math alphabet)**” として利用されます。[^unimath-tma]
これは、`\mathrm` の他に以下のようなスイッチコマンドがあります。

[^unimath-tma]: unicode-math でのみテキスト数式英字と呼称されています。fontspec に関しても紹介しますが、本記事では統一して `\mathrm` 等で利用されるアルファベットを “テキスト数式英字” と呼称しています。

    この呼称は [unicode-math を完全に理解したい話(2) - マクロツイーター](https://zrbabbler.hatenablog.com/entry/20180916/1537052149 "unicode-math を完全に理解したい話(2) - マクロツイーター") から。

- `\mathrm`, `\mathup`
- `\mathit`
- `\mathbf`
- `\mathsf`
- `\mathtt`

これは、`\symbf` などのシンボルアルファベットのためのスイッチコマンドとは異なります。そのため、これらのスイッチコマンド `\sym~` と `\math~` は使い分ける必要があります。

特に、`\math~` が扱うフォントは本文フォントであるのに対して、`\sym~` が扱うフォントは数式フォントです。異なるフォントを利用することになることに注意してください。

:::note info
テキスト数式英字は本文フォントを引き継ぎますが、これまでの `\math~` と同じように半角スペースは無視されます。
:::

<!-- このようなテキスト数式英字とシンボルアルファベットのコマンドの分離は、以下のような効果を生みます。

- 目的の異なるものとして分離する（セマンティクス）
- 異なるフォントを利用できる
    - カーニングが数式フォントと異なる -->

デフォルトでは、テキスト数式英字は本文フォントに従い、数式フォントと本文フォントは対応するものを選ぶべきです。

## 数式フォントに対応する本文フォント

一般的に、本文フォントと数式フォントは統一して利用されます。

以下に、TeX Live に集録されているフォントの内、unicode-math で利用できる数式フォントと、それに対応する本文フォントを表にしました。

|     数式フォント      |    本文フォント     |
| :-------------------: | :-----------------: |
|      Asana Math       |          -          |
|     Concrete Math     |    CMU Concrete     |
|     Erewhon Math      |       erewhon       |
|      Euler Math       |          -          |
|       Fira Math       |      Fira Sans      |
|     Garamond-Math     |     EB Garamond     |
| GFS Neohellenic Math  |   GFSNeohellenic    |
|        KpMath         |       KpRoman       |
|    Libertinus Math    |  Libertinus Serif   |
|   Latin Modern Math   | Latin Modern Roman  |
| NewComputerModernMath | NewComputerModern10 |
|     STIX Two Math     |    STIX Two Text    |
|  TeX Gyre Bonum Math  |   TeX Gyre Bonum    |
| TeX Gyre DejaVu Math  |    DejaVu Serif     |
| TeX Gyre Pagella Math |  TeX Gyre Pagella   |
| TeX Gyre Schola Math  |    TeXGyreSchola    |
| TeX Gyre Termes Math  |    TeXGyreTermes    |
|     XCharter Math     |      XCharter       |
|       XITS Math       |        XITS         |

デフォルトでは、本文フォントは Latin Modern Roman、数式フォントは Latin Modern Math を利用します。

フォントを変更する場合、本文フォントは fontspec、数式フォントは unicode-math を利用して、以下のように指定します。

```latex
% 本文フォント：fontspec
\setmainfont{NewComputerModern10}
% 数式フォント：uincode-math
\setmathfont{NewComputerModernMath}
```

数式フォントに対応する本文フォントがないものに関しては、以下のフォントカタログを参照してください。

- [The LaTeX Font Catalogue - Fonts with math support](https://tug.org/FontCatalogue/mathfonts.html "The LaTeX Font Catalogue - Fonts with math support")
- [A Survey of Free Math Fonts for TeX and LaTeX](http://mirrors.ctan.org/info/Free_Math_Font_Survey/en/survey.html "A Survey of Free Math Fonts for TeX and LaTeX")
- [[Answer] - Which OpenType Math fonts are available? - TeX - LaTeX Stack Exchange](https://tex.stackexchange.com/a/425099 "Which OpenType Math fonts are available? - TeX - LaTeX Stack Exchange")

本文フォントの指定には <code>\set**main**font</code> 以外にも <code>\set**sans**font</code>（サンセリフ）と <code>\set**mono**font</code>（等幅）があります。これらは別個に指定します。

本文フォントの内、斜体や太字、太字斜体は `\setmainfont` によって自動的に判別されます。（個別に指定することも出来ます）

## テキスト数式英字

前述の通り、テキスト数式英字は本文のフォントを引継ぎます。

一方で、テキスト数式英字のフォントのみを変更する方法もあります。
これは、数式フォントに対応する本文フォントが無い場合にも有意義です。

### フォントを変更する

テキスト数式英字のデフォルトフォントは `\setmainfont` で指定されたフォントです。

fontspec や unicode-math では、テキスト数式英字のフォントを変更することで、本文と異なるフォントを利用することが出来ます。
（unicode-math を読み込むと、fontspec も自動的に読み込まれます）

テキスト数式英字のフォントのみを変更するには、大きく 2 つの方法があります。

- fontspec による方法：
    - `\setmathrm{<font>}` (`\mathrm`, `\mathit`, `\mathbf`)
    - `\setmathsf{<font>}` (`\mathsf`)
    - `\setmathtt{<font>}` (`\mathtt`)
- unicode-math による方法：
    - `\setmathfontface\mathrm{<font>}`
    - `\setmathfontface\mathit{<font>}`
    - `\setmathfontface\mathbf{<font>}`
    - `\setmathfontface\mathsf{<font>}`
    - `\setmathfontface\mathtt{<font>}`

fontspec による方法における `\setmathrm` では、`\mathrm` の他に `\mathit`・`\mathbf` にも影響します。

例えば、TeX Gyre Pagella を `\mathrm`・`\mathit`・`\mathbf` に対して適用する場合、以下のように 2 つの指定方法があります。

```latex
% by fontspec
\setmathrm{TeXGyrePagella}
```

```latex
% by unicode-math
\setmathfontface\mathrm{TeXGyrePagella}
\setmathfontface\mathit{TeXGyrePagella-Italic}
\setmathfontface\mathbf{TeXGyrePagella-Bold}
```

### 新しく追加する

新たなテキスト数式英字を `\setmathfontface` から導入することが出来ます。

```latex
\setmathfontface\mathXX{<font>}
```

ここで導入されたフォントは `\mathXX` として利用できるようになります。

例えば、以下のように複数のテキスト数式英字のフォントを導入することが出来ます。

![example of setmathfontface](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/332c229a-64b2-e019-9c0b-8ae79a7a622d.png "\setmathfontface の例")

## 名前演算子のフォント

名前演算子のフォントは `\setoperatorfont` によって制御されます。

デフォルトでは `\setoperatorfont\mathrm` となっているため、名前演算子のフォントは `\mathrm` のフォントに従います。

そのため、次のように `\setmathfontface\mathrm`（あるいは `\setmathrm`）から `\mathrm` のフォントを変更すると、名前演算子のフォントも変更されます。

![sample of set operator font to mathrm](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/2e73dfe8-ba61-28ce-e7e2-0a557333a647.png "sample of set operator font to mathrm")

名前演算子に `\mathrm` 以外のスイッチコマンドを適用したい場合は、次のようにします。

```latex
\setoperatorfont\mathsf
```

この他にも、`\setmathfontface` を利用して追加された新しいフォントを名前演算子のフォントに当てることが出来ます。

```latex
\setmathfontface\mathXYZ{XYZ Font}
\setoperatorfont\mathXYZ
```

慣例的には `\mathrm` のフォントと名前演算子のフォントは同じであるべきですが、以下のようにすることで 2 つに異なるフォントを当てることも出来ます。

![textmathalph-image-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/212e105d-4ab0-d852-dfef-bf0e2b7d974c.png)

この名前演算子のフォントの指定は、`\symup` 等のシンボルアルファベットのスイッチコマンドを指定することも出来ます。
ただし、カーニングが異なるため `\sym~` 系を利用することは避けた方が良さそうです。（文字数が多いと顕著になります）

## 例

STIX Two Math と Euler Math の例を挙げておきます。

### STIX Two Math の例

STIX Two *Math* には STIX Two *Text* があります。そのため、本文フォントまたは `\mathrm` を STIX Two Text に変更します。

ドキュメント全体で STIX Two Math を指定する場合は `\setmainfont` を利用します。

```latex
\setmainfont{STIX Two Text}
\setmathfont{STIX Two Math}
```

![example of name operator with STIX Two Math](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/a9e28d41-9e2b-615a-6ea0-10a4a747a571.png "sample of STIX Two Text and Math")

STIX Two Text には、等幅とサンセリフのフォントが無いことに注意してください。（等幅には Latin Modern Mono、サンセリフには Latin Modern Sans が適用されます）

もしも、本文フォントを STIX Two Text と異なるフォントを指定し、`\mathrm` に STIX Two Text を指定する場合は、`\setmathrm` または `\setmathfontface` を利用します。

```latex
\setmathrm{STIX Two Text}
% or
\setmathfontface\mathrm{STIX Two Text}
\setmathfontface\mathit{STIX Two Text}
\setmathfontface\mathbf{STIX Two Text}
```

### Euler Math の例

Euler Math には対応する本文フォントがありません。

デフォルトの Latin Modern Roman を利用したテキスト数式英字では、シンボルアルファベットの Euler Math に比べて細く貧弱に見えます。

そのため、適当にフォントを別のものに変えておくと良いでしょう。
下の例では、4 つのフォントを `\mathrm` に割り当ててみました。

![sample of text math alphabet with Euler math](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/59660557-7115-2a13-9bec-67eedaa31c3d.png "sample of text math alphabet with Euler Math")

個人的には、Latin Modern Math では細すぎる、STIX Two Text ではちょっと太いと感じます。
TeX Gyre Pagella や URW Classico が適していると思います。あるいは、フォントカタログを見ていると CMU Concrete を勧める記述も多く見られます。

## 数式内の挿入テキスト

数式内で利用される本文フォントは、上で示した `\math~` によるスイッチコマンドや名前演算子の他に、`\text` 等によるテキストの挿入があります。（以降、“**挿入テキスト**” と表現します）

この挿入テキストは、テキスト数式英字とは異なり、本文テキストを数式内に持ち込むだけのため、`\setmathrm` や `\setmathfontface\mathrm` の影響を受けません。

そのため、テキスト数式英字のフォントのみを変更した場合、挿入テキストのフォントと異なることに注意してください。

# 余談

`\setmainfont` と `\setmathfont` とか、`\setmathfontface` と `\setoperatorfont` とか、似たようなコマンド多すぎ問題。
混乱しそうです。

ver. 0.8r のパッケージガイド § 5.5.4 では、`x_\mathrm f` のような、本来の LaTeX に無い構文を利用した書き方をサポートしませんと記述されています。

> **5.5.4 Subscripts and superscripts and symbol alphabets**
>
> In traditional LaTeX, users have for many years exploited a loophole in the implementation of `\mathrm` and similar to write expressions such as `x_\mathrm f` to achieve 𝑥<sub>f</sub> instead of writing the more correct `x_{\mathrm{f}}`. Shorthand notation such as `x_\mathrm f` is not officially documented LaTeX syntax, and due to a particular implementation detail in unicode-math this *incorrect* syntax is no longer supported.

そうでありながら、実際に `x_\mathrm f` としてもタイプセットが通ってしまうのはどうしてでしょうか :thinking:
（サポートの意味を取り違えていますか？）

## ローカルのフォントを探す

フォントを探すには [luafindfont][] が便利です。

[luafindfont]: https://ctan.org/pkg/luafindfont "CTAN: Package luafindfont"

ターミナルで以下のように利用します。（キーワードはスペースやハイフンを除きます）

```console
$ luafindfont stixtwo
  No.                       Filename Symbolic name
            Path
   1.        stixtwomath-regular.otf stixtwomath  d:/texlive/2023/texmf-dist/fonts/opentype/public/stix2-otf/
   2.           stixtwotext-bold.otf stixtwotext  d:/texlive/2023/texmf-dist/fonts/opentype/public/stix2-otf/
   3.     stixtwotext-bolditalic.otf stixtwotext  d:/texlive/2023/texmf-dist/fonts/opentype/public/stix2-otf/
    ⋮
   8.       stixtwotext-semibold.otf stixtwotext  d:/texlive/2023/texmf-dist/fonts/opentype/public/stix2-otf/
   9. stixtwotext-semibolditalic.otf stixtwotext  d:/texlive/2023/texmf-dist/fonts/opentype/public/stix2-otf/
```

また、 `-o <num>` を課すことで該当番号のフォントの情報を otfinfo から得ることが出来ます。（otfinfo は <samp>.otf</samp> のフォントしか対応しないようです）

```console
$ luafindfont -o 1 gfsneohellenic
  No.                 Filename      Symbolic name                                                                  Path
   1.       gfsneohellenic.otf     gfsneohellenic      d:/texlive/2023/texmf-dist/fonts/opentype/public/gfsneohellenic/
   2.   gfsneohellenicbold.otf     gfsneohellenic      d:/texlive/2023/texmf-dist/fonts/opentype/public/gfsneohellenic/
   3. gfsneohellenicboldit.otf     gfsneohellenic      d:/texlive/2023/texmf-dist/fonts/opentype/public/gfsneohellenic/
   4.     gfsneohellenicit.otf     gfsneohellenic      d:/texlive/2023/texmf-dist/fonts/opentype/public/gfsneohellenic/
   5.   gfsneohellenicmath.otf gfsneohellenicmath  d:/texlive/2023/texmf-dist/fonts/opentype/public/gfsneohellenicmath/

Running otfinfo -i on font no.1
otfinfo -i "d:/texlive/2023/texmf-dist/fonts/opentype/public/gfsneohellenic/gfsneohellenic.otf"
Family:              GFS Neohellenic Rg
Subfamily:           Regular
Full name:           GFSNeohellenic-Regular
PostScript name:     GFSNeohellenic-Regular
Preferred family:    GFS Neohellenic
Preferred subfamily: Regular
Version:             Version 1.0
Unique ID:           TakisKatsoulidisandGeorgeD.Matthiopoulos: GFSNeoHellenic: 5953
Designer:            Takis Katsoulidis and George D. Matthiopoulos
Designer URL:        www.greekfontsociety.org
Manufacturer:        Takis Katsoulidis and George D. Matthiopoulos
Vendor URL:          www.greekfontsociety.org
Trademark:           GFSNeohellenic-Regular is a trademark of Takis Katsoulidis and George D. Matthiopoulos.
Copyright:           Copyright (c) Takis Katsoulidis and George D. Matthiopoulos, 1993-2001. All rights reserved.
License URL:         http://scripts.sil.org/OFL
OTHER DEALINGS IN THE FONT SOFTWARE. USE THE FONT SOFTWARE OR FROMINGLme as.ciety.org | gfs@greekfontsociety.org),
Vendor ID:           Alts
```

`\setmainfont` 等で利用するフォント名は `Preferred family` を利用することが望ましいです。これがない場合は `Family` を利用します。

上の例において、`Preferred family` は “GFS Neohellenic” です。
（実際、“GFS Neohellenic Rg” では上手くいきませんでした）

## 新たな OpenType フォントの導入

一部のフォントは CTAN に登録されているにも関わらず、TeX Live の配布条件を満たさないために集録されていないことがあるようです。
[この記事][efonts] では [getnonfreefonts][] を利用することで簡単に導入できると説明されていますが、OpenType フォントだけに限っては、手動で導入してもそれほど難しくありません。

[getnonfreefonts]: https://www.tug.org/fonts/getnonfreefonts/ "getnonfreefonts"
[efonts]: https://www.nagaoka-ct.ac.jp/ec/labo/visu/usb/tex2/efonts.shtml "USB メモリ活用講座【TeX 欧文フォントパッケージ活用】"

例えば [URW Classico][classico] フォントを導入する場合：

[classico]: https://ctan.org/pkg/classico "CTAN: Package classico"

1. CTAN ページで Zip ファイルをダウンロード
1. Zip ファイルを解凍
1. <samp>.otf</samp> ファイルのみを以下のパスに配置
    ```path
    %TEXMFLOCAL%/fonts/opentype/urw/classico
    ```
1. URW Classico フォントを利用したドキュメントのタイプセット実行すると、luaotfload が自動的に更新してくれます

パッケージガイドは `%TEXMFLOCAL%/doc/classico` にドキュメントを配置し、mktexlsr を実行すれば良いです。

ただし、この方法では `\usepackage{classico}` としても、フォントを利用できないことに注意してください。