为什么 mathtools 包只定义运算符 \AtBeginDocument?

为什么 mathtools 包只定义运算符 \AtBeginDocument?

定义运算符\coloneq背后的原理是什么?mathtools.sty\AtBeginDocument

\AtBeginDocument{
  ...
  \providecommand*\coloneq{\vcentcolon\mathrel{\mkern-1.2mu}\mathrel{-}}
  ...
}

如果这些命令在 的末尾定义,会发生什么情况mathtools.sty?这种绕行有什么好处?

我刚刚注意到在文档中

\documentclass{article}
\usepackage{mathtools}
\let\defeq\coloneqq
\begin{document}
$a\defeq b$
\end{document}

\defeq由于这个原因而保持未定义,并且必须使用

\AtBeginDocument{\let\defeq\coloneqq}

反而。

答案1

与 的任何使用一样\AtBeginDocument,它会将执行延迟到序言之后。这样做的好处是可以评估与已加载的其他包的交互(在或者后)。

使用\providecommand可确保如果任何其他包(无论出于何种原因)创建了某个名为 的宏\coloneq,它都不会重新定义它。但是,如果它不存在,它将定义它。

作为包编写者,您不知道其他哪些包会与您的包一起加载,因此您尝试通过延迟定义(使用\AtBeginDocument)、使用\defs(无论是否存在都进行覆盖)或条件来适应这种情况。

相关内容