unicode-mathを使うと括弧のスペーシングがおかしくなる件
はじめに
\left( \right)
の余分なスペーシングと戦っていたら、謎の現象と遭遇したのでメモ。
前提
\left \right
による余分な空白と、それを解消する mleftright
パッケージの説明をします。これらについて既に知っている人は読み飛ばしてもらって大丈夫です。
まず、普通に括弧を書いてみます。
\documentclass{article}
\begin{document}
\begin{equation}
F(x), G(x), F[x], G[x]
\end{equation}
\end{document}
これが一番普通の形です。次に、\left \right
を書いてみます。
% ...
\begin{equation}
F\left(x\right), G\left(x\right), F\left[x\right], G\left[x\right]
\end{equation}
% ...
文字と括弧の間に余分なスペースが挿入されました。これを解消するためのパッケージが mleftright
です。
% ...
\usepackage{mleftright}
\mleftright
% ...
確かに余分なスペースが消されました。[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}
色々試してみて自分が気づいたことを以下にまとめておきます。
-
,F ,P ,T などの斜体にしたときに右上が飛びてている文字でめりこみが顕著だったY - 上記2つのフォント以外(例えば
TeX Gyre Schola Math
)ではこの問題を確認できなかったか、気にならない程度だった
解決法
ここからは私の推測ですが、Laten Modern Math
と NewComputerModernMath
を読み込むときに、文字ごとに後ろのスペースの設定をしているのではないでしょうか。実際、
% ...
\usepackage{unicode-math}
\setmathfont{NewComputerModernMath}
\DeclareMathSymbol{F}{\mathalpha}{letters}{`F}
\usepackage{mleftright}
\mleftright
% ...
とすれば、望んでいた出力
% ...
\DeclareMathSymbol{F}{\mathalpha}{letters}{`F}
\setmathfont{NewComputerModernMath}
% ...
とすれば、
というわけで、解決方法として「全部の大文字をプリアンブルで再定義してあげる」という手段が挙げられます。流石に手打ちはめんどいと思うので、下にコードを掲載しておきます。[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}
おわりに
この微妙な空白のために休日が丸一日潰したけど、unicode-math
+ mleftright
という環境をどれだけの人が使っているのかわからないけど、この記事が同じように困った人の一助になれば幸いです。
-
mleftright
の原理については "Spacing around \left and \right" を参照。簡単に言うと、\left( hoge \right)
は\mathinner{ ( hoge ) }
と見れるから、正しいスペーシングのためには最初と最後にそれぞれ\mathopen{}
,\mathclose{}
を書いてあげなきゃいけないよね、っていうのをマクロにしたのがこのパッケージ。ここら辺の話は The TeXbook, p.171 を参照。 ↩︎ -
参考:
$ texdoc souce2e
→ The LATEX2ε Sources, pp.545-546 ↩︎
Discussion