
Das folgende MWE zeigt, dass die Definition
\mm@macro{C}{\ensuremath{\mathset{C}}\xspace}
aus Zeile 267 von mismath.sty
[2023/02/24 v2.5] —
\mm@macro{C}{\ensuremath{\mathset{C}}\xspace}
— verursacht einen Fehler, wenn es mit dem Laden von babel
[2023/02/13 3.86] mit der Option russian
[ russianb.ldf
2021/01/10 1.3m; russisch 2020/09/09 1.3k] gepaart ist:
\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}
Der Zweck der anstößigen Zeile mismath.sty
besteht letztlich darin, \C
ein fettgedrucktes C an die Tafel zu geben.
Der Fehler ist:
/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}
Dies ist ein neuer Fehler, der bei früheren Versionen von mismath
und nicht auftritt babel
.
Gibt es eine andere Lösung als das Erstellen einer Kopie, \mismath
in der die fehlerhafte Zeile auskommentiert ist?
Antwort1
tl;dr
Es gibt einen Fehler in mismath.sty
: Im Code davon \mm@macro
sollte \\mm@warning{#1}
stehen \mm@warning{#1}
.
Es ist ein häufiges Problem bei Paketen, bei denen es sich im Wesentlichen um Sammlungen von Makros handelt, dass sie schließlich mit anderen Paketen kollidieren.
Im konkreten Fall \mm@macro
sollte die Prüfung durch am Anfang des Dokuments verzögert werden. Wenn kyrillische Kodierungen geladen werden, \C
wird durch definiert hyperref
. Gleiches gilt für \mm@operator
. Auch ohne hyperref
kann es zu Problemen kommen, da unicode-math
die meiste Arbeit am Anfang des Dokuments erledigt wird.
Der Code
\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}}
}
sollte sein
\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}}%
}%
}
(beachten Sie den Fehler \\mm@warning
im Code für \mm@macro
), der die eigentliche Fehlerquelle ist, die Sie erhalten.
Wie auch immer,
\mm@macro{C}{\ensuremath{\mathset{C}}\xspace}
ist von zweifelhafter Nützlichkeit: Es bringt überhaupt nichts, es \xspace
nur zu verwenden, um Text eingeben zu können, \C
anstatt $\C$
es von der Mathematik abzugrenzen.
Antwort2
Danke an Murray für den Beitrag und an egreg für die Antwort. In Kürze wird eine neue Version hochgeladen, in der der Fehler behoben ist \mm@warning
, \\mm@warning
und mit einer einfachen Lösung für die Verwendung von Babel mit Russisch: \C
in diesem Fall nicht definieren!
Eine erste unmittelbare Lösung besteht darin, Mismath direkt nach dem Laden zu verwenden \let\C\relax
, und aus diesem Grund bin ich nicht begeistert davon, es \AtBeginDocument
für alle meine Makros zu verwenden.
Ein weiteres Problem „zweifelhafter Nützlichkeit“, auf das Enrico Gregorio hingewiesen hat, ist die Verwendung mit \ensuremath
und \xspace
: Tatsächlich dient es der Verwendung von \C (und den anderen Befehlen für Zahlensätze) direkt im Text, was sehr üblich ist.
Antoine Missier
Antwort3
Die neue Version wurde auf CTAN hochgeladen und sollte in ein paar Tagen verfügbar sein. Danke für diesen Fehlerbericht.