mismath 的 \C 与 babel 和俄语发生冲突

mismath 的 \C 与 babel 和俄语发生冲突

以下 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.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为了给黑板上加粗的“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 指出的另一个“可疑的实用性”问题是使用\ensuremathand \xspace:实际上它是在文本中直接使用 \C (和其他数字集命令),这是非常常见的。

安托万·米西耶

答案3

新版本已上传至 CTAN,几天后即可使用。感谢您提交此错误报告。

相关内容