Столкновение между mismath's \C и babel с русским

Столкновение между mismath's \C и babel с русским

Следующий MWE показывает, что определение

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

из строки 267 из mismath.sty[2023/02/24 v2.5] —

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

— вызывает ошибку при сопряжении с загрузкой babel[2023/02/13 3.86] с опцией russian[ russianb.ldf2021/01/10 1.3m; russian 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}

Целью этой ошибочной строки mismath.styв конечном итоге является выделение \Cна доске жирной буквы С.

Ошибка:

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

                                       

Это новая ошибка, не возникавшая в более ранних версиях mismathи babel.

Есть ли какое-то решение, кроме как сделать копию, \mismathв которой проблемная строка закомментирована?

решение1

вкратце

mismath.styВ коде есть ошибка : \mm@macroтам \\mm@warning{#1}должно быть \mm@warning{#1}.


Это распространенная проблема с пакетами, которые по сути являются наборами макросов и в конечном итоге конфликтуют с другими пакетами.

В конкретном случае проверка, выполненная \mm@macro, должна быть отложена в начале документа. Когда загружаются кириллические кодировки, \Cопределяется hyperref. Аналогично для \mm@operator. Даже без , hyperrefмогут быть проблемы, так как unicode-mathвыполняет большую часть своей работы в начале документа.

Код

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

должно быть

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

(обратите внимание на ошибку \\mm@warningв коде \mm@macro), которая и является фактическим источником ошибки, которую вы получаете.

В любом случае, делая

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

имеет сомнительную полезность: нет никакой выгоды в использовании его \xspaceтолько для того, чтобы иметь возможность набирать \Cтекст, вместо $\C$того, чтобы явно разделять математику.

решение2

Спасибо Murray за пост и egreg за ответ. Скоро будет загружен новый релиз с исправленной ошибкой \mm@warningвместо \\mm@warning, и с простым решением при использовании babel с русским языком: не определение \Cв этом случае!

Первое немедленное решение — использовать \let\C\relaxmismath сразу после загрузки, и именно поэтому я не в восторге от использования его \AtBeginDocumentво всех моих макросах.

Еще одна проблема «сомнительной полезности», на которую указал Энрико Грегорио, — это использование с \ensuremathи \xspace: на самом деле это касается использования \C (и других команд для числовых наборов) непосредственно в тексте, что встречается очень часто.

Антуан Мисье

решение3

Новый релиз был загружен на CTAN и должен стать доступен через несколько дней. Спасибо за этот отчет об ошибке.

Связанный контент