\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]문제가 해결되지만 사용 중인 다른 텍스트와 수학 글꼴을 조합하는 옵션이 필요합니다.

이 문제는 최근에 발생한 것 같습니다. 내가 마지막으로 사용 unicode-math하고 포함 하는 XeTeX 문서를 조판한 것은 \sqrt[n]{n}약 1년 전이었고 당시에는 문제가 없었습니다. 뭔가 문제가 있는 걸까요최신 버전 중 하나, 즉 unicode-math0.8m 또는 0.8n?

그럼에도 불구하고 출력 PDF 파일은 괜찮습니다. 걱정해야 할지 모르겠지만 계속해서 오류를 무시해야 하는 것은 불편합니다. 해결 방법으로 ^{1/n}지금은 표기법을 사용하겠습니다 .

답변1

업데이트

v0.8o(2019/03/04) 부터 unicode-math 이 버그는 정상적인 Scale사용이 가능하도록 수정되었습니다. 업데이트에는 다음이 포함됩니다.Ulrike Fischer의 답변 변형, 그리고 더 결정적으로,fam 2와 3의 글꼴 크기에 대한 더 엉성한 설정.

변화 는 ScaleAgain = 1.00001효과적으로​​ScaleAgain = 0.99999ScaleAgain = 1.0001ScaleAgain = 0.9999낮아진집합의 상한 아래 정리 1에서. 세트 이제 around 에서 종료됩니다  . k=10000이는 around 입니다 Scale=0.153. 즉, 사용자가 요청한 Scale~ 위에 0.153이면 unicode-math글꼴 크기가 올바르게 설정됩니다.

요청된 값이 Scale0.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

ScaleAgain실제로 컴파일하려면 1 에 가까운 범위를 시도해야 합니다 . 이 문제도 다음 릴리스에서 수정될 예정입니다 unicode-math.


unicode-math v0.8n 의 오버플로 동작에 대한 정리

이상한 오버플로 동작에 관심이 있는 사람들을 위해  v0.8n ScaleAgain의 두 가지 고정 요소를 기반으로 한 정리가 있습니다.unicode-math

Scale먼저 가 안전하고 문제를 일으킬 수 있는 시각화가 나옵니다 .

가까운 Scale=1:
규모1
가까운 Scale=1.2:
규모1.2
가까운 Scale=1.5:
규모1.5

모두녹색선분은 안전 Scale요인을 나타내고,빨간색선분은 문제가 있는 부분을 나타냅니다.

다음은 엄격한 수학적 설명입니다.
정리

특히 , Scale=1.031369386, Scale=1.031374755Scale=1.031384644Scale=1.031390014 모두로 이어진다 ! Dimension too large. 가까운 Scale=1.03138:
규모1.03138


토론

Georgia와 Cambria Math의 x 높이는 각각 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.03137Georgia  1.03139+ Cambria Math 예제가 성공적으로 컴파일되고 라틴 현대 수학 예제도 컴파일됩니다( 재정의 여부에 관계없이 \__um_fontdimen_to_percent:nN).

문제의 근본 원인은 오랜 문제를 해결하기 위한 의 ScaleAgain새로운 기능입니다(참조:fontspec스케일링과 함께 유니코드 수학을 사용한 위 첨자 배치그리고확장 옵션이 LuaLaTeX에서 완벽하게 작동하지 않습니다.). 아, 그리고 TeX이 "수학을 잘 못한다"는 사실도요.

수학 관련 레거시 글꼴 크기를 올바르게 설정하려면 unicode-math동일한 수학 글꼴을 로드해야 합니다 .세 번. 그러나 TeX에서는 동일한 글꼴을 동일한 크기로 두 번 로드하는 것을 허용하지 않으므로 unicode-math두 번째와 세 번째에는 약간 다른 크기로 글꼴을 로드해야 합니다. 이 약간 다른 크기는 다음과 같이 얻습니다.합성이전 축척 계수. 이것이 ScaleAgain에서 소개된  주된 이유 fontspec이므로 2번째와 3번째에도 unicode-math가능합니다 . 처럼ScaleAgain=1.00001ScaleAgain=0.99999내 댓글unicode-mathTeX의 이진 연산으로 인해 세 가지 크기를 구분하지 못하는 경우가 가끔 있습니다 .

귀하의 예는 를 가질 만큼 "불운"했습니다 Scale=1.03138. 이는 로 해석됩니다 Round( 1.03138 * 2^16 ) = 67593. 이후에 TeX는 로 해석되는 을 ScaleAgain=1.00001봅니다 . 그래서 TeX는 두 번째 계열과 첫 번째 계열이 동일한 글꼴이라고 생각하고 의 지시에 따라 글꼴 크기를 덮어쓰게 됩니다 . 새로운 글꼴 크기는 더 이상 1보다 작은 백분율이 아니라 상당히 커질 수 있는 물리적 길이이기 때문에 이로 인해 오버플로가 발생합니다.1.03139Round( 1.03139 * 2^16 ) = 67593unicode-math

를 사용하면 \setmathfont[Scale=MatchLowercase,ScaleAgain=0.99999]{Cambria Math}기본적으로 TeX가 실수로 같은 크기의 수학 글꼴을 로드하는 것을 방지하려고 합니다.

답변2

Imho의 정의에 결함이 있으므로 대신 \__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}

관련 정보