![mismath 的 \C 与 babel 和俄语发生冲突](https://linux22.com/image/461795/mismath%20%E7%9A%84%20%5CC%20%E4%B8%8E%20babel%20%E5%92%8C%E4%BF%84%E8%AF%AD%E5%8F%91%E7%94%9F%E5%86%B2%E7%AA%81.png)
以下 MWE 表明定义
\mm@macro{C}{\ensuremath{\mathset{C}}\xspace}
来自mismath.sty
[2023/02/24 v2.5] 第 267 行 —
\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
为了给黑板上加粗的“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
而不是,并在使用俄语的 babel 时提供了一个简单的解决方案:在这种情况下\\mm@warning
不定义!\C
第一个立即的解决方案是在加载错误计算后立即使用\let\C\relax
,这就是为什么我并不乐意将其用于\AtBeginDocument
所有宏的原因。
Enrico Gregorio 指出的另一个“可疑的实用性”问题是使用\ensuremath
and \xspace
:实际上它是在文本中直接使用 \C (和其他数字集命令),这是非常常见的。
安托万·米西耶
答案3
新版本已上传至 CTAN,几天后即可使用。感谢您提交此错误报告。