
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.ldf
2021/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 \C
o 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 mismath
e babel
.
Existe alguma solução além de fazer uma cópia \mismath
na qual a linha incorreta é comentada?
Responder1
dr.
Há um bug em mismath.sty
: no código, \mm@macro
deveria \\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@macro
documento 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 hyperref
pode haver problemas, porque unicode-math
faz 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@warning
no 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 \xspace
apenas para poder digitar \C
texto, 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@warning
em vez de \\mm@warning
, e com uma solução simples ao usar babel com russo: não definir \C
nesse caso!
Uma primeira solução imediata é usar \let\C\relax
logo após carregar a matemática errada, e é por isso que não estou entusiasmado em usar \AtBeginDocument
todas as minhas macros.
Outra questão de “utilidade duvidosa” apontada por Enrico Gregorio é o uso with \ensuremath
and \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.