為什麼 mathtools 套件僅定義運算子 \AtBeginDocument?

為什麼 mathtools 套件僅定義運算子 \AtBeginDocument?

定義諸如using 之\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 (無論是否存在都覆蓋)或條件來適應這一點。

相關內容