なぜ 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)、\defの使用 (存在に関係なく上書き)、または条件付けによってこれに対応しようとします。

関連情報