
El siguiente MWE muestra que la definición
\mm@macro{C}{\ensuremath{\mathset{C}}\xspace}
de la línea 267 de mismath.sty
[2023/02/24 v2.5] -
\mm@macro{C}{\ensuremath{\mathset{C}}\xspace}
— provoca un error cuando se combina con la carga babel
[2023/02/13 3.86] con la opción russian
[ russianb.ldf
2021/01/10 1.3m; ruso 09/09/2020 1.3k]:
\documentclass{article}
\usepackage{amsmath}
\usepackage{mathtools}
\usepackage[T2A,T1]{fontenc}
\usepackage{substitutefont}
\usepackage[russian,english]{babel}
\substitutefont{T2A}{\rmdefault}{Tempora-TLF}
\usepackage{mismath}
\begin{document}
$1+2=3$
\end{document}
El propósito de la línea ofensiva mismath.sty
es, en última instancia, definir \C
una C en negrita en la pizarra.
El error es:
/usr/local/texlive/2022/texmf-dist/tex/latex/mismath/mismath.sty:267: LaTeX Err
or: There's no line here to end.
See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help.
...
l.267 ...macro{C}{\ensuremath{\mathset{C}}\xspace}
Este es un error nuevo que no ocurre con versiones anteriores de mismath
y babel
.
¿Existe alguna solución además de hacer una copia \mismath
en la que la línea infractora esté comentada?
Respuesta1
tl; dr
Hay un error en mismath.sty
: en el código que \mm@macro
debería \\mm@warning{#1}
estar \mm@warning{#1}
.
Es un problema común con paquetes que son esencialmente colecciones de macros que eventualmente chocan con otros paquetes.
En el caso específico, la verificación realizada por \mm@macro
debe retrasarse al inicio del documento. Cuando se cargan codificaciones cirílicas, \C
se define mediante hyperref
. De manera similar para \mm@operator
. Incluso sin hyperref
él puede haber problemas, porque unicode-math
hace la mayor parte de su trabajo al inicio del documento.
El código
\newcommand\mm@macro[2]{
\@ifundefined{#1}{
\expandafter\def\csname #1\endcsname{#2}
}{\\mm@warning{#1}}
}
\newcommand\mm@operator[3][]{%
\ifthenelse{\equal{#1}{}}{\def\tempa{#3}}{\def\tempa{#1}}
\@ifundefined{\tempa}{
\DeclareMathOperator{#2}{#3}
}{\mm@warning{\tempa}}
}
debiera ser
\newcommand\mm@macro[2]{%
\AtBeginDocument{%
\@ifundefined{#1}{%
\expandafter\def\csname #1\endcsname{#2}%
}{\mm@warning{#1}}%
}%
}
\NewDocumentCommand\mm@operator{O{#3}mm}{%
\AtBeginDocument{%
\@ifundefined{#1}{%
\DeclareMathOperator{#2}{#3}%
}{\mm@warning{#1}}%
}%
}
(tenga en cuenta el error \\mm@warning
en el código \mm@macro
), que es la fuente real del error que obtiene.
De todos modos, haciendo
\mm@macro{C}{\ensuremath{\mathset{C}}\xspace}
es de dudosa utilidad: no hay ningún beneficio en usar \xspace
solo para poder escribir \C
texto en lugar de $\C$
eso, que claramente segrega las matemáticas.
Respuesta2
Gracias a Murray por la publicación y a egreg por la respuesta. Muy pronto se subirá una nueva versión con el error corregido \mm@warning
en lugar de \\mm@warning
, y con una solución simple al usar babel con ruso: ¡no definir \C
en ese caso!
Una primera solución inmediata es usarla \let\C\relax
justo después de que la carga no coincida, y es por eso que no estoy entusiasmado de usarla \AtBeginDocument
para todas mis macros.
Otra cuestión de "dudosa utilidad" señalada por Enrico Gregorio es el uso con \ensuremath
y \xspace
: de hecho, sirve para usar \C (y los otros comandos para conjuntos de números) directamente en texto, lo que es muy común.
Antonio Missier
Respuesta3
La nueva versión se subió a CTAN y debería estar disponible en unos días. Gracias por este informe de error.