🎃

unicode-mathを使うと括弧のスペーシングがおかしくなる件

2024/02/04に公開

はじめに

\LaTeX\left( \right) の余分なスペーシングと戦っていたら、謎の現象と遭遇したのでメモ。

F\!(x)\;\text{\footnotesize (before)} \longrightarrow F(x)\;\text{\footnotesize (after)}

前提

\left \right による余分な空白と、それを解消する mleftright パッケージの説明をします。これらについて既に知っている人は読み飛ばしてもらって大丈夫です。

まず、普通に括弧を書いてみます。

\documentclass{article}

\begin{document}
\begin{equation}
  F(x), G(x), F[x], G[x]
\end{equation}
\end{document}
F(x), G(x), F[x], G[x]

これが一番普通の形です。次に、\left \right を書いてみます。

% ...
\begin{equation}
  F\left(x\right), G\left(x\right), F\left[x\right], G\left[x\right]
\end{equation}
% ...
F\left(x\right), G\left(x\right), F\left[x\right], G\left[x\right]

文字と括弧の間に余分なスペースが挿入されました。これを解消するためのパッケージが mleftright です。

% ...
\usepackage{mleftright}
\mleftright
% ...
F(x), G(x), F[x], G[x]

確かに余分なスペースが消されました。[1]

問題の状況

unicode-math を読み込み、数式フォントとして Laten Modern Math または NewComputerModernMath を使用しているときに、\left \right によるスペーシングの挙動が変化します。

\documentclass{article}

\usepackage{unicode-math}
\usepackage{mleftright}
\mleftright

\begin{document}
\begin{equation}
  F\left(x\right), G\left(x\right), F\left[x\right], G\left[x\right]
\end{equation}
\end{document}
\begin{align*} &F\!(x), G(x), F\![x], G[x] &\quad &\text{\footnotesize (w/ unicode-math)} \\ &F(x), G(x), F[x], G[x] &\quad &\text{\footnotesize (w/o unicode-math)} \end{align*}

F に注目してもらうと、括弧が文字にめり込んでいることがわかります。しかし、同じ文字でも G ではこのようなことは起こっていません。

色々試してみて自分が気づいたことを以下にまとめておきます。

  • F, P, T, Y などの斜体にしたときに右上が飛びてている文字でめりこみが顕著だった
  • 上記2つのフォント以外(例えば TeX Gyre Schola Math)ではこの問題を確認できなかったか、気にならない程度だった

解決法

ここからは私の推測ですが、Laten Modern MathNewComputerModernMath を読み込むときに、文字ごとに後ろのスペースの設定をしているのではないでしょうか。実際、

% ...
\usepackage{unicode-math}

\setmathfont{NewComputerModernMath}
\DeclareMathSymbol{F}{\mathalpha}{letters}{`F}

\usepackage{mleftright}
\mleftright
% ...

とすれば、望んでいた出力 F(x) が得られます。しかし、順番を入れ替えて

% ...
\DeclareMathSymbol{F}{\mathalpha}{letters}{`F}
\setmathfont{NewComputerModernMath}
% ...

とすれば、F\!(x) と詰まった形で出力されてしまいます。

というわけで、解決方法として「全部の大文字をプリアンブルで再定義してあげる」という手段が挙げられます。流石に手打ちはめんどいと思うので、下にコードを掲載しておきます。[2]

コード
\DeclareMathSymbol{A}{\mathalpha}{letters}{`A}
\DeclareMathSymbol{B}{\mathalpha}{letters}{`B}
\DeclareMathSymbol{C}{\mathalpha}{letters}{`C}
\DeclareMathSymbol{D}{\mathalpha}{letters}{`D}
\DeclareMathSymbol{E}{\mathalpha}{letters}{`E}
\DeclareMathSymbol{F}{\mathalpha}{letters}{`F}
\DeclareMathSymbol{G}{\mathalpha}{letters}{`G}
\DeclareMathSymbol{H}{\mathalpha}{letters}{`H}
\DeclareMathSymbol{I}{\mathalpha}{letters}{`I}
\DeclareMathSymbol{J}{\mathalpha}{letters}{`J}
\DeclareMathSymbol{K}{\mathalpha}{letters}{`K}
\DeclareMathSymbol{L}{\mathalpha}{letters}{`L}
\DeclareMathSymbol{M}{\mathalpha}{letters}{`M}
\DeclareMathSymbol{N}{\mathalpha}{letters}{`N}
\DeclareMathSymbol{O}{\mathalpha}{letters}{`O}
\DeclareMathSymbol{P}{\mathalpha}{letters}{`P}
\DeclareMathSymbol{Q}{\mathalpha}{letters}{`Q}
\DeclareMathSymbol{R}{\mathalpha}{letters}{`R}
\DeclareMathSymbol{S}{\mathalpha}{letters}{`S}
\DeclareMathSymbol{T}{\mathalpha}{letters}{`T}
\DeclareMathSymbol{U}{\mathalpha}{letters}{`U}
\DeclareMathSymbol{V}{\mathalpha}{letters}{`V}
\DeclareMathSymbol{W}{\mathalpha}{letters}{`W}
\DeclareMathSymbol{X}{\mathalpha}{letters}{`X}
\DeclareMathSymbol{Y}{\mathalpha}{letters}{`Y}
\DeclareMathSymbol{Z}{\mathalpha}{letters}{`Z}

おわりに

この微妙な空白のために休日が丸一日潰したけど、\LaTeX のことにちょっと詳しくなったし、解決したからヨシ。unicode-math + mleftright という環境をどれだけの人が使っているのかわからないけど、この記事が同じように困った人の一助になれば幸いです。

脚注
  1. mleftright の原理については "Spacing around \left and \right" を参照。簡単に言うと、\left( hoge \right)\mathinner{ ( hoge ) } と見れるから、正しいスペーシングのためには最初と最後にそれぞれ \mathopen{}, \mathclose{} を書いてあげなきゃいけないよね、っていうのをマクロにしたのがこのパッケージ。ここら辺の話は The TeXbook, p.171 を参照。 ↩︎

  2. 参考:$ texdoc souce2eThe LATEX2ε Sources, pp.545-546 ↩︎

Discussion