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