Confronto entre mismath's \C e babel com russo

Confronto entre mismath's \C e babel com russo

O seguinte MWE mostra que a definição

\mm@macro{C}{\ensuremath{\mathset{C}}\xspace}

da linha 267 de mismath.sty[2023/02/24 v2.5] -

\mm@macro{C}{\ensuremath{\mathset{C}}\xspace}

- causa um erro quando emparelhado com o carregamento babel[2023/02/13 3.86]com a opção russian[ russianb.ldf2021/01/10 1,3m; russo 2020/09/09 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}

O objetivo da linha ofensiva mismath.styé, em última análise, definir \Co C em negrito no quadro-negro.

O erro é:

/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 é um novo erro que não ocorre com versões anteriores do mismathe babel.

Existe alguma solução além de fazer uma cópia \mismathna qual a linha incorreta é comentada?

Responder1

dr.

Há um bug em mismath.sty: no código, \mm@macrodeveria \\mm@warning{#1}haver \mm@warning{#1}.


É um problema comum com pacotes que são essencialmente coleções de macros e eventualmente entrarem em conflito com outros pacotes.

No caso específico, a verificação feita pelo \mm@macrodocumento deverá ser adiada no início. Quando as codificações cirílicas são carregadas, \Cé definido por hyperref. Da mesma forma para \mm@operator. Mesmo sem hyperrefpode haver problemas, porque unicode-mathfaz a maior parte do seu trabalho no início do documento.

O 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}}
}

deveria estar

\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}}%
  }%
}

(observe o erro \\mm@warningno código de \mm@macro), que é a fonte real do erro que você obtém.

De qualquer forma, fazendo

\mm@macro{C}{\ensuremath{\mathset{C}}\xspace}

é de utilidade duvidosa: não há nenhum ganho em usar \xspaceapenas para poder digitar \Ctexto, em vez de $\C$segregar claramente a matemática.

Responder2

Obrigado a Murray pela postagem e a egreg pela resposta. Uma nova versão será lançada em breve com o bug corrigido \mm@warningem vez de \\mm@warning, e com uma solução simples ao usar babel com russo: não definir \Cnesse caso!

Uma primeira solução imediata é usar \let\C\relaxlogo após carregar a matemática errada, e é por isso que não estou entusiasmado em usar \AtBeginDocumenttodas as minhas macros.

Outra questão de “utilidade duvidosa” apontada por Enrico Gregorio é o uso with \ensuremathand \xspace: na verdade é para usar \C (e os demais comandos para conjuntos de números) diretamente no texto, o que é muito comum.

Antonio Missier

Responder3

A nova versão foi carregada no CTAN e deve estar disponível em alguns dias. Obrigado por este relatório de bug.

informação relacionada