\documentclass{article}
\usepackage{unicode-math}
\setmainfont{Georgia}
\setmathfont[Scale=MatchLowercase]{Cambria Math}
\begin{document}
n $n \sqrt[n]{n}$
\end{document}
El código anterior, cuando se compone con XeTeX, produce un error que dice "Dimensión demasiado grande". Quitarlo [Scale=MatchLowercase]
lo resuelve, pero necesito la opción para la combinación de otras fuentes de texto y matemáticas que estoy usando.
Este problema parece reciente. La última vez que compuse un documento XeTeX que usa unicode-math
y contiene \sqrt[n]{n}
fue hace aproximadamente un año y el problema no estaba presente en ese momento. ¿Hay algo malo conuna de las últimas versionesde unicode-math
, es decir, 0,8 mo 0,8 n?
Sin embargo, el archivo PDF de salida está bien. No estoy seguro de si debería preocuparme, pero tener que seguir descartando el error es un inconveniente. Como solución alternativa, usaré la notación ^{1/n}
por ahora.
Respuesta1
Actualizar
A partir de unicode-math
la versión 0.8o (04/03/2019), este error se solucionó para Scale
el uso normal. La actualización incluyeuna variante de la respuesta de Ulrike Fischery, lo que es más importante,una configuración más descuidada para las dimensiones de fuente en las familias 2 y 3.
El cambio desde ScaleAgain = 1.00001
y ScaleAgain = 0.99999
hacia ScaleAgain = 1.0001
y ScaleAgain = 0.9999
efectivamentebajadoel límite superior del conjunto Ben el Teorema 1 a continuación. El conjunto Bahora termina en around k=10000
, que es around Scale=0.153
. Esto significa que, siempre y cuando el usuario solicitado Scale
seaarriba 0.153, entonces unicode-math
configuraría las dimensiones de fuente correctamente.
Si lo solicitado Scale
es inferior a 0,153, el problema de dimensión de fuente persiste. Pero se consideró que el uso normal nunca produciría Scale=0.153
ni disminuiría, por lo que estamos seguros en su mayor parte. Ver análisis más detalladoaquíyaquí.
Viejas respuestas
Aunque estoy de acuerdo con Ulrike Fischer en que se trata de un unicode-math
error, me temo que no estoy de acuerdo con la afirmación de que “ \__um_fontdimen_to_percent:nN
está roto”. De hecho, usarlo \dim_to_decimal_in_sp:n
es una gran mejora, pero esnodonde radica el verdadero problema. Primero presentaré mi solución y luego intentaré discutir la causa raíz.
Tenga en cuenta que la siguiente solución es temporal hasta que unicode-math
se solucione este problema en la próxima versión.
Solución
Para una solución relativamente simple, puedes usar la nueva función ScaleAgain
para distorsionar ligeramente el tamaño de la fuente (no será visible para el ojo humano):
\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}
En la práctica, tendrás que probar un rango ScaleAgain
cercano a 1 para poder compilar. Nuevamente, esto se solucionará en la próxima versión de unicode-math
.
Un teorema sobre el comportamiento de desbordamiento de unicode-math
v0.8n
Para aquellos que estén interesados en el extraño comportamiento del desbordamiento, aquí hay un teorema, basado en los dos ScaleAgain
factores fijos en la unicode-math
versión 0.8n.
Primero vienen las visualizaciones sobre cuáles Scale
son seguros y cuáles pueden causar problemas:
Cerca
Scale=1
:
CercaScale=1.2
:
CercaScale=1.5
:
TodoverdeLos segmentos de línea representan los
Scale
factores seguros, mientras querojoLos segmentos de línea representan los problemáticos.Aquí está la rigurosa descripción matemática:
En particular,
Scale=1.031369386
,Scale=1.031374755
,Scale=1.031384644
yScale=1.031390014
todo conduce a! Dimension too large
. CercaScale=1.03138
:
Discusiones
Las alturas x de Georgia y Cambria Math son, respectivamente, 986/2048
y 956/2048
. Y Scale=MatchLowercase
se convierte correctamente Scale=1.03138
en fontspec
. Ahora bien, si aplicáramos laredefinición sugerida de\__um_fontdimen_to_percent:nN
Al utilizar Latin Modern Math, nos sorprendería descubrir que:
\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}
todavía produce el ! Dimension too large.
error.
Aún más extraño, si en su lugar utilizamos un factor de escala de 1.03137
o 1.03139
, entonces su ejemplo de Georgia + Cambria Math se compila correctamente, al igual que mi ejemplo de Latin Modern Math (con o sin la redefinición de \__um_fontdimen_to_percent:nN
).
La causa raíz del problema es la nueva característica ScaleAgain
de fontspec
, que está destinada a resolver un problema de larga data (consulteColocación de superíndice usando Unicode-Math con escalayLa opción de escala no funciona completamente con LuaLaTeX). Ah, y también el hecho de que TeX “no es bueno en matemáticas”.
Para configurar correctamente las dimensiones de fuente heredadas relacionadas con las matemáticas, unicode-math
debe cargar la misma fuente matemáticatres veces. Pero TeX no permitiría cargar la misma fuente dos veces con el mismo tamaño, por lo que unicode-math
tiene que cargar la fuente en tamaños ligeramente diferentes la segunda y tercera vez. Estos tamaños ligeramente diferentes se obtienen mediantecompuestoel factor de escala anterior. Esta fue la razón principal por la que ScaleAgain
se introdujo en fontspec
, así que unicode-math
puedo hacerlo ScaleAgain=1.00001
por segunda y ScaleAgain=0.99999
tercera vez. Comomi comentarioComo señaló, a veces unicode-math
no logra distinguir los tres tamaños debido a la aritmética binaria de TeX.
Su ejemplo tuvo la “mala suerte” de tener Scale=1.03138
, lo que se traduce como Round( 1.03138 * 2^16 ) = 67593
. Después ScaleAgain=1.00001
, TeX ve 1.03139
, lo que se traduce como Round( 1.03139 * 2^16 ) = 67593
. Entonces TeX piensa que la segunda familia y la primera familia son la misma fuente y procede a sobrescribir fontdimen bajo las instrucciones de unicode-math
. Esto provoca el desbordamiento, porque las nuevas dimensiones de fuente ya no son porcentajes inferiores a uno, sino que ahora son longitudes físicas que pueden llegar a ser bastante grandes.
Con \setmathfont[Scale=MatchLowercase,ScaleAgain=0.99999]{Cambria Math}
, básicamente estamos tratando de evitar que TeX cargue accidentalmente la fuente matemática con el mismo tamaño.
Respuesta2
En mi humilde opinión, la definición de \__um_fontdimen_to_percent:nN
es defectuosa, debería usarse \dim_to_decimal_in_sp
en lugar de\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}