\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.0001
、ScaleAgain = 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
:
近くScale=1.2
:
近くScale=1.5
:
全て緑線分は安全
Scale
係数を表し、赤線分は問題のある線分を表します。特に
Scale=1.031369386
、、、Scale=1.031374755
およびScale=1.031384644
Scale=1.031390014
すべては! Dimension too large
。 近くScale=1.03138
:
議論
GeorgiaとCambria Mathのx-heightはそれぞれ、986/2048
とです956/2048
。そしては、によってScale=MatchLowercase
正しく変換されます。ここで、Scale=1.03138
fontspec
再定義を提案\__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-math
2回目と3回目ではフォントをわずかに異なるサイズで読み込む必要があります。これらのわずかに異なるサイズは次のようにして得られます。複利ScaleAgain
前回のスケール係数。これがで導入された 主な理由なのでfontspec
、2回目と3回目にunicode-math
行うことができます。ScaleAgain=1.00001
ScaleAgain=0.99999
私のコメント指摘したように、unicode-math
TeX のバイナリ演算により、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}