Choque entre \C de Misath y Babel con Rusia

Choque entre \C de Misath y Babel con Rusia

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.ldf2021/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.styes, en última instancia, definir \Cuna 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 mismathy babel.

¿Existe alguna solución además de hacer una copia \mismathen la que la línea infractora esté comentada?

Respuesta1

tl; dr

Hay un error en mismath.sty: en el código que \mm@macrodeberí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@macrodebe retrasarse al inicio del documento. Cuando se cargan codificaciones cirílicas, \Cse define mediante hyperref. De manera similar para \mm@operator. Incluso sin hyperrefél puede haber problemas, porque unicode-mathhace 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@warningen 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 \xspacesolo para poder escribir \Ctexto 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@warningen lugar de \\mm@warning, y con una solución simple al usar babel con ruso: ¡no definir \Cen ese caso!

Una primera solución inmediata es usarla \let\C\relaxjusto después de que la carga no coincida, y es por eso que no estoy entusiasmado de usarla \AtBeginDocumentpara todas mis macros.

Otra cuestión de "dudosa utilidad" señalada por Enrico Gregorio es el uso con \ensuremathy \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.

información relacionada