\setmathfont に Scale=MatchLowercase オプションがある場合に「寸法が大きすぎます」というエラーが発生する

\setmathfont に Scale=MatchLowercase オプションがある場合に「寸法が大きすぎます」というエラーが発生する
\documentclass{article}
\usepackage{unicode-math}
\setmainfont{Georgia}
\setmathfont[Scale=MatchLowercase]{Cambria Math}
\begin{document}
n $n \sqrt[n]{n}$
\end{document}

上記のコードを XeTeX でタイプセットすると、「寸法が大きすぎます」というエラーが発生します。削除すると[Scale=MatchLowercase]解決しますが、使用している他のテキスト フォントと数式フォントの組み合わせのオプションが必要です。

この問題は最近のようです。XeTeX文書をタイプセットしたのはunicode-math\sqrt[n]{n}1年前で、当時はこの問題は発生していませんでした。最新バージョンの1つつまりunicode-math、0.8m か 0.8n でしょうか?

それでも、出力される PDF ファイルは正常です。心配する必要はないと思いますが、エラーを無視し続けるのは不便です。回避策として、^{1/n}今のところは表記法を使用します。

答え1

アップデート

v0.8o(2019/03/04)現在unicode-math 、このバグは通常のScale使用では修正されています。アップデートには以下が含まれます。ウルリケ・フィッシャーの回答の変形そしてさらに重要なのは、ファミリ 2 と 3 のフォント寸法の設定が雑

ScaleAgain = 1.00001からScaleAgain = 0.99999への変化はScaleAgain = 1.0001ScaleAgain = 0.9999効果的に下げた集合の上限 B下の定理1において、集合 Bは 付近で終了し k=10000、これは 付近ですScale=0.153。つまり、ユーザーが要求した値Scaleその上 0.153 では、unicode-mathフォントのサイズが正しく設定されます。

要求された値Scaleが0.153未満の場合、フォント寸法の問題は残ります。しかし、通常の使用では0.153以下になることはないと判断されたためScale=0.153、ほとんどの部分では安全です。より詳細な分析を見るここそしてここ


古い回答

私はUlrike Fischerの「これはバグだ」という意見には同意しますが、「が壊れている」unicode-mathという主張には同意できません。確かに、を使用することは大きな改善ですが、\__um_fontdimen_to_percent:nN\dim_to_decimal_in_sp:nない実際の問題がどこにあるのか。まずは私の解決策を提示し、その後に根本的な原因について議論したいと思います。

unicode-math次の解決策は、次のリリースで修正されるまでの一時的なものであることに注意してください。


解決

比較的簡単な解決策としては、新しい機能を使用してScaleAgainフォント サイズをわずかに歪ませることができます (人間の目には見えません)。

\documentclass{article}
\usepackage{unicode-math}% v0.8n, 2019/02/15
\setmainfont{Georgia}
\setmathfont[Scale=MatchLowercase,ScaleAgain=0.99999]{Cambria Math}
\begin{document}
n $n \sqrt[n]{n}$
\end{document}

スケールアゲイン

ScaleAgain実際には、コンパイルできるようにするには、1に近い範囲を試す必要があります。これも、の次のリリースで修正される予定ですunicode-math


unicode-math v0.8nのオーバーフロー動作に関する定理

奇妙なオーバーフロー動作に興味のある人のために、 v0.8nScaleAgainの 2 つの固定係数に基づく定理を示します。unicode-math

まず、どれScaleが安全で、どれが問題を引き起こす可能性があるかを視覚化します。

近くScale=1
スケール1
近くScale=1.2
スケール1.2
近くScale=1.5
スケール1.5

全て線分は安全Scale係数を表し、線分は問題のある線分を表します。

厳密な数学的記述は次のとおりです。
定理

特にScale=1.031369386、、、Scale=1.031374755およびScale=1.031384644Scale=1.031390014 すべては ! Dimension too large。 近くScale=1.03138
スケール1.03138


議論

GeorgiaとCambria Mathのx-heightはそれぞれ、986/2048とです956/2048。そしては、によってScale=MatchLowercase正しく変換されます。ここで、Scale=1.03138fontspec再定義を提案\__um_fontdimen_to_percent:nNラテン現代数学を使用すると、次のことに驚くでしょう:

\documentclass{article}
\usepackage{unicode-math}% v0.8n, 2019/02/15
% https://tex.stackexchange.com/a/475802, by Ulrike Fischer:
\ExplSyntaxOn
\cs_set:Nn \__um_fontdimen_to_percent:nN
  {
    \fp_eval:n { \dim_to_decimal_in_sp:n { \fontdimen #1 #2 } / 100 }
  }
\ExplSyntaxOff

\newcommand*\tempscale{1.03138}% Also fails at 1.02, 1.05, 1.07
\setmathfont[Scale=\tempscale]{latinmodern-math.otf}

\begin{document}
n $n \sqrt[n]{n}$
\end{document}

それでも! Dimension too large.エラーが発生します。

さらに奇妙なことに、スケール係数として または 1.03137を 使用する1.03139と、Georgia + Cambria Math の例は正常にコンパイルされ、私の Latin Modern Math の例も同様にコンパイルされます ( の再定義の有無にかかわらず\__um_fontdimen_to_percent:nN)。

この問題の根本的な原因は、長年の課題を解決することを目的としたScaleAgainの新機能にあります(fontspecスケーリング付き Unicode 数学を使用した上付き文字の配置そしてスケールオプションはLuaLaTeXでは完全には機能しません)。ああ、TeX は「数学が得意ではない」という事実もあります。

数学関連のレガシーフォントサイズを正しく設定するには、unicode-math同じ数学フォントをロードする必要があります。3回しかし、TeXでは同じフォントを同じサイズで2回読み込むことはできないため、unicode-math2回目と3回目ではフォントをわずかに異なるサイズで読み込む必要があります。これらのわずかに異なるサイズは次のようにして得られます。複利ScaleAgain前回のスケール係数。これがで導入された 主な理由なのでfontspec、2回目と3回目にunicode-math行うことができます。ScaleAgain=1.00001ScaleAgain=0.99999私のコメント指摘したように、unicode-mathTeX のバイナリ演算により、3 つのサイズを区別できない場合があります。

あなたの例では、 という「不運」がありScale=1.03138、これは に変換されますRound( 1.03138 * 2^16 ) = 67593。 の後にScaleAgain=1.00001、TeX は を見て1.03139、これは に変換されますRound( 1.03139 * 2^16 ) = 67593。そのため、TeX は 2 番目のファミリと最初のファミリが同じフォントであると判断し、 の指示に従ってフォント寸法を上書きしますunicode-math。これにより、オーバーフローが発生します。新しいフォント寸法は 1 未満のパーセンテージではなくなり、非常に大きくなる可能性のある物理的な長さになったためです。

では\setmathfont[Scale=MatchLowercase,ScaleAgain=0.99999]{Cambria Math}、基本的に、TeX が誤って同じサイズで数式フォントを読み込むのを防ごうとしています。

答え2

私の意見では、の定義は\__um_fontdimen_to_percent:nN間違っているので、\dim_to_decimal_in_sp代わりに\dim_to_decimal:n

\documentclass{article}
\usepackage{unicode-math}
\ExplSyntaxOn
\cs_set:Nn \__um_fontdimen_to_percent:nN
  {
    \fp_eval:n { \dim_to_decimal_in_sp:n {  \fontdimen #1 #2 } / 100 }
  }
\ExplSyntaxOff
\setmainfont{Georgia}
\setmathfont[Scale=MatchLowercase]{Cambria Math}

\begin{document}
n $n \sqrt[n]{n}$
\end{document}

関連情報