unicode-math で数式フォントを一時的に切り替えたい 

<!-- # 数式フォントを一時的に切り替えたい -->

見出しの中や特定の環境内等、数式のフォントを一時的に切り替えたい場面がいくつかあるでしょう。

LaTeX では、“**Math version**” と呼ばれる数式フォントを制御するシステムがあり、これを利用することで一時的に数式のフォントを替えることができます。

本記事では、[unicode-math][] からこの Math version を構成し、途中で数式フォントを切り替える方法を紹介します。

<!-- :::note info
LuaLaTeX を利用することを前提とします。
::: -->

## デフォルト LaTeX の Math version

unicode-math を使わないデフォルト LaTeX では、次の 2 つの Math version があります。これを `\mathversion` によって指定します。

| Math version | フォント           |
| :----------: | :----------------- |
|   `normal`   | デフォルトフォント |
|    `bold`    | ボールドフォント   |

これ以外にも、特定のフォント関連のパッケージでは、これ以外の Math version が提供されている場合があるらしいです。[^non-um-mv]

[^non-um-mv]: もしも独自で Math version を構成したい場合、`\DeclareMathVersion` や `\DeclareMathAlphabet`・`\SetSymbolFont` 等を構成する必要があります。これらの詳細は [fntguide.pdf][] を確認してください。あるいは、入手困難な通称「[緑の本][green]」に解説があるらしいです。

[green]: https://gihyo.jp/book/2003/4-7741-1758-7 "LaTeX2ε [マクロ＆クラス]プログラミング実践解説：書籍案内｜技術評論社"
[fntguide.pdf]: https://www.latex-project.org/help/documentation/fntguide.pdf "LaTeX2ε font selection - LaTeX Documentation"

Math version の具体的な使用例として、次のようなファイルを作成することが出来ます。
`\mathversion{bold}` 以下ではボールドとなり、`\mathversion{normal}` とすれば元のフォントに戻ります。

```latex
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\begin{document}

「Eulerの公式」とは，複素指数関数と三角関数の間に成り立つ恒等式です．

\mathversion{bold}
\begin{equation}
  e^{ix} = \cos x + i\sin x
\end{equation}
\mathversion{normal}

特に，{\mathversion{bold}\( x = \pi \)}のとき\( \cos\pi = -1 \)，\( \sin\pi = 0 \)を採り，これは「Eulerの等式」と呼ばれます．

{
  \mathversion{bold}
  \begin{equation}
    e^{i\pi} = -1
  \end{equation}
}

\end{document}
```

![mv-sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/39ed2667-4d8c-e625-d0a2-be1a64632c94.png "非 unicode-math で \mathversion を利用した例")

この `\mathversion` は、`\sffamily`・`\gtfamily` や `\color` のようなスタイルコマンドと同じように、`{`\~`}` や `\begin{...}`\~`\end{...}` の中にスコープされます。ただし、`\mathversion` は数式環境内に置きません。必ず数式環境外に置きます。

また、`\mathversion{bold}` に等価な `\boldmath` や `\mathversion{normal}` に等価な `\unboldmath` があります。（[参考][boldmath]）

ちなみに、[amsmath][] パッケージから提供される `\boldsymbol` は、`\mathversion{bold}` を使用しています。
`\boldsymbol` の内部では `\hbox` を利用して数式環境から一旦出てから `\mathversion{bold}` を利用するように定義されています。（そのため、添え字が上手く付けられない等の問題が生じます）

----------

このような機能が unicode-math でも利用できます。加えて、任意の `version` 名を与えるのも簡単です。

## unicode-math で Math version を構成する

ドキュメントの途中で数式フォントを切り替える場合、unicode-math では `\setmathfont` を置くたびにフォントが切り替えられますが、一時的に切り替えたい場合には完全に数式フォントを読み込むため非効率になります。

これを効率的にフォントを切り替える方法として、LaTeX がデフォルトで提供している `\mathversion` を利用します。

### フォントに `version` を指定する

unicode-math が提供する `\setmathfont` には `version` オプションを構成できます。

この `version` は `\setmathfont` や `\setmathfontface` [^fontspec] のオプションで `version = <version name>` の形で構成し、本文内で `\mathversion{<version name>}` として利用できます。

[^fontspec]: [fontspec][] から提供される `\setmathrm` からでも `\mathrm` のフォントを構成できますが、このコマンドでは `version` を指定できません。`\setmathfontface` で構成しましょう。

:::note warn
バージョン 0.8r 現在、`version` オプションと `range` オプションは共存できません。
:::

例えば、メインの数式フォントは NewComputerModernMath で、特定の Math version の時だけ Fira Math にしたい場合は、プリアンブルで次のように構成します。

```latex
\setmainfont{NewComputerModern10}
\setmathfont{NewComputerModernMath}
\setmathfont[version = fira]{Fira Math}
\setmathfontface\mathrm{Fira Sans}[version = fira]
```

これによって、Math version “`fira`” が構成出来ました。あとは好きなところで `\mathversion{fira}` とすれば Fira Math のフォントが適用されます。

ちなみに、`\setmathfontface` に関して `\mathrm` 以外の `\mathbf` 等を使用したい場合も、同じように `version` を指定して構成しましょう。

```latex
\setmathfontface\mathbf{Fira Sans Bold}[version = fira]
```

### 使用例

jlreq 文書クラスの見出しは欧文がサンセリフ体、和文がゴシック体になっているため、数式もサンセリフなフォント (Fira Math) にしてみましょう。

以下のように、見出しの `\section` 内で `\mathversion{fira}` とすれば、本文の数式は NewComputerModernMath、見出しの数式は Fira Math が適用されます。[^jlreq-head]

[^jlreq-head]: 見出しコマンドは jlreq から提供された方法でちゃんと定義するべきですが、今回は簡易的に `\section` 内で `\mathversion` を利用しています。このような方法で `\mathversioin` を指定すると、目次側のフォントにまで影響が出ます。

    正式には、`\ModifyHeading` を使って以下のように構成します。
    ```latex
    \ModifyHeading{section}{
      font = \Large\sffamily\gtfamily\bfseries\mathversion{fira}
      %% デフォルトの構成に \mathversion を加えただけの形になっているはず
      %% https://github.com/abenori/jlreq/blob/9dabcae21986ee2a4a5d2e1b08c0797f6d00d432/jlreq.cls#L6378
    }
    ```
    このようにすると、見出しの数式には Math version の `fira` が適用され、目次の数式はデフォルトのままです。

```latex
\documentclass{jlreq}
\usepackage{unicode-math}
\setmainfont{NewComputerModern10}
\setmathfont{NewComputerModernMath}
\setmathfont[version = fira]{Fira Math}
\setmathfontface\mathrm{Fira Sans}[version = fira]
\begin{document}

\section{
  \mathversion{fira}
  Eulerの公式：
  \( e^{ix} = \cos x + i\sin x \)
}

「Eulerの公式」とは，複素指数関数と三角関数の間に成り立つ恒等式です．
特に，\( x = \uppi \)のとき\( \cos\uppi = -1 \)，\( \sin\uppi = 0 \)を採るので\( e^{i\uppi} = -1 \)となります．
これは「Eulerの等式」と呼ばれます．

\end{document}
```

![head-sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/e8632d82-5b29-5ec4-ce91-c351b86beaf4.png "見出しのフォントを Fira Math にした例")

見出し内の数式は Fira Math になっているのに対して、本文内の数式は NewComputerModernMath になっています。

## unicode-math における `\mathversion{bold}`

:::note warn
unicode-math を利用する際にベクトル等の数学的意味で太字のアルファベットを利用する場合は、`\symbf` を使いましょう。

ボールドの数式フォントを構成することで `\boldsymbol` が使えるようになりますが、ベクトル等の数学的意味付けとは異なるため注意が必要です。
:::

unicode-math における `\mathversion{bold}` は、ボールドフォントに切り替えて強調する意味のみを持ちます。

すなわち、レギュラーフォントにおける `x` とボールドフォントにおける `x` は、数学的に同じ意味を持ちます。単に強調しているかどうかのみが異なります。

逆に言えば、`\mathversion{bold}` 下の `x`（ボールドフォントの 𝑥 (U+1D465)）と `\mathversion{normal}` 下の `\symbfit{x}`（𝒙 (U+1D499)） は非常に見た目が似ている可能性がありますが等価ではありません。

![xcharter-bold.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/e5a01e47-0bfd-220c-124b-40e5cdf50491.png "XCharter Math と XCharter Math Bold の例")

----------

数式のボールドフォントを構成する方法は 2 つあります。どちらも同じ効果を得ます。また、ここでも `\sin` 等の名前演算子のフォントに対しても構成する必要があります。[^mathversion-bold]

[^mathversion-bold]: 実際は `bold` にどのようなフォントを構成していても良いですが、ボールドフォントを構成している方が正当でしょう。また、ボールドではないフォントであれば `bold` 以外のバージョン名を与えるべきでしょう。

- `BoldFont` で構成する
    ```latex
    \setmathfont[
        BoldFont = kpmath-bold.otf
      ]{kpmath-regular.otf}
    \setmathfontface\mathrm{kproman-bold.otf}[version = bold]
    ```
- `version = bold` で構成する
    ```latex
    \setmathfont{kpmath-regular.otf}
    \setmathfont[version = bold]{kpmath-bold.otf}
    \setmathfontface\mathrm{kproman-bold.otf}[version = bold]
    ```

ちなみに、`\setmainfont` 側の `BoldFont` のフォントが `version = bold` でも使えるようになっていてほしいですが、どうやらそのようにはならないようです。`\setmathfontface` を `version = bold` オプション付きで構成しましょう。

<details>
<summary>上手くいかないコード例（折りたたみ）</summary>

```latex
\documentclass{article}
\usepackage{unicode-math}
\setmainfont[
    %% これでは `\mathversion{bold}` に kproman-bold.otf が適用されない
    BoldFont = kproman-bold.otf
  ]{kproman-regular.otf}
\setmathfont[
    BoldFont = kpmath-bold.otf
  ]{kpmath-regular.otf}
\begin{document}

\mathversion{normal}
\( e^{ix} = \cos x + i\sin x \)

\mathversion{bold}
\( e^{ix} = \cos x + i\sin x \)
%% 名前演算子のフォントがデフォルトの Computer Modrn (CMBX10) になる

\end{document}
```

特段、この問題は [unicode-math][github-unimath] と [fontspec][github-fontspec] の両リポジトリで問題提起されていないようでした。

[github-unimath]: https://github.com/latex3/unicode-math/issues "Issues · latex3/unicode-math"
[github-fontspec]: https://github.com/latex3/fontspec/issues "Issues · latex3/fontspec"

</details>

### 多ウェイトな数式フォント

数式フォントは単一ウェイトであることが多いですが、いくつかのフォントには多ウェイトに対応しています。

以下に、TeX Live に収録されている多ウェイトな数式フォントを紹介します。

| フォント名          | ファイル名                                                                         |
| :------------------ | :--------------------------------------------------------------------------------- |
| Erewhon Math        | `erewhon-math.otf`, `erewhon-bold.otf`                                             |
| XCharter Math       | `xcharter-math.otf`, `xcharter-math-bold.otf`                                      |
| KpMath (roman)      | `kpmath-regular.otf`, `kpmath-light.otf`, `kpmath-semibold.otf`, `kpmath-bold.otf` |
| KpMath (sans serif) | `kpmath-sans.otf`, `kpmath-sansbold.otf`                                           |
| XITS Math           | `xitsmath.otf`, `xitsmath-bold.otf`                                                |
| Concrete Math       | `concrete-math.otf`, `concrete-math-bold.otf`                                      |
| Lete Sans Math      | `letesansmath.otf`, `letesansmath-bold.otf`                                        |

多くの場合、`light < regular < medium < bold` の順でウェイトが大きく（太く）なります。（[参考][nisfont]）

[nisfont]: https://www.nisfont.co.jp/blog/2016_05_25/ "【フォントまめ知識】フォントの太さについて| ブログ | ニィスフォント | NIS Font | 長竹産業グループ"

## 余談

unicode-math は Unicode な意味で数学記号を意味付けします。そのため、“`\mathversion{bold}` によるボールドフォント” と “`\symbf` 系によるボールドな数学記号” との混同には気を付けてください。
これらを混同すると、unicode-math を使っている意味が半減するようなものです。

[amsmath]: https://www.ctan.org/pkg/amsmath "amsmath - CTAN"
[unicode-math]: https://www.ctan.org/pkg/unicode-math "unicode-math - CTAN"
[fontspec]: https://www.ctan.org/pkg/fontspec "fontspec - CTAN"
[luacolor]: https://www.ctan.org/pkg/luacolor "luacolor - CTAN"
[color]: https://www.ctan.org/pkg/color "color - CTAN"
[boldmath]: https://latexref.xyz/_005cboldmath-_0026-_005cunboldmath.html "\boldmath & \unboldmath (LaTeX2e unofficial reference manual (September 2023))"
[latexref-fontStyle]: https://latexref.xyz/Font-styles.html "Font styles (LaTeX2e unofficial reference manual (September 2023))"
[aspose-mathFont]: https://docs.aspose.com/tex/java/latex-math-fonts/#83-math-formula-versions "8. Fonts in math formulas | LaTeX font math"

### 数式を色づける

強調のために数式に色付けしたい場合は、[luacolor][] パッケージの `\mathcolor` を使います。[^luacolor]

[^luacolor]: LuaLaTeX を利用することを前提としていますが、XeLaTeX の場合は [color][] パッケージを利用してください。

具体例として、先で示した例を使って `\uppi` だけ赤色にしてみました。

<details>
<summary>コード（折りたたみ）</summary>

```latex
\documentclass{jlreq}
\usepackage{luacolor}
\usepackage{unicode-math}
\setmainfont{erewhon-regular.otf}
\setmathfont{erewhon-math.otf}
\setmathfont[version = bold]{erewhon-math-bold.otf}
\setmathfontface\mathrm{erewhon-bold.otf}[version = bold]
\begin{document}

「Eulerの公式」とは，複素指数関数と三角関数の間に成り立つ恒等式です．

\mathversion{bold}
\begin{equation}
  e^{ix} = \cos x + i\sin x
\end{equation}

\mathversion{normal}
特に，{\mathversion{bold}\( x = {\mathcolor{red}{\uppi}} \)}のとき\( \cos{\mathcolor{red}{\uppi}} = -1 \)，\( \sin{\mathcolor{red}{\uppi}} = 0 \)を採り，これは「Eulerの等式」と呼ばれます．

{
  \mathversion{bold}
  \begin{equation}
    e^{i{\mathcolor{red}{\uppi}}} = -1
  \end{equation}
}

\end{document}
```

luacolor で `\mathcolor` を利用すると色がもれてしまいます。`\color` と同じように `{`\~`}` の中で利用するようにしましょう。

</details>

![mathcolor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/bae4acd8-5909-3925-413f-43572e616ea9.png "π を赤くした例")