ミスマスの\Cとバベルとロシアの衝突

ミスマスの\Cとバベルとロシアの衝突

次のMWEは定義を示している

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

[2023/02/24 v2.5]の267行目よりmismath.sty

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

問題のある行の目的は、最終的には黒板に太字の C を付けることを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代わりに、ロシア語で babel を使用する場合の簡単な解決策 (その場合は\\mm@warning定義しない) が追加されます。\C

最初の即時の解決策は、mismath をロードした直後に使用することです。これが、すべてのマクロに\let\C\relax使用することにあまり積極的ではない理由です。\AtBeginDocument

\ensuremathEnrico Gregorio が指摘した「有用性が疑わしい」もう 1 つの問題は、およびの使用です\xspace。これは、\C (および数値セットの他のコマンド) をテキスト内で直接使用するためのもので、非常に一般的です。

アントワーヌ・ミシエ

答え3

新しいリリースは CTAN にアップロードされており、数日以内に利用可能になるはずです。このバグレポートに感謝します。

関連情報