
Следующий 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.ldf
2021/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\relax
mismath сразу после загрузки, и именно поэтому я не в восторге от использования его \AtBeginDocument
во всех моих макросах.
Еще одна проблема «сомнительной полезности», на которую указал Энрико Грегорио, — это использование с \ensuremath
и \xspace
: на самом деле это касается использования \C (и других команд для числовых наборов) непосредственно в тексте, что встречается очень часто.
Антуан Мисье
решение3
Новый релиз был загружен на CTAN и должен стать доступен через несколько дней. Спасибо за этот отчет об ошибке.