
Was ist der Grund für die Definition von Operatoren wie \coloneq
bei der mathtools.sty
Verwendung \AtBeginDocument
?
\AtBeginDocument{
...
\providecommand*\coloneq{\vcentcolon\mathrel{\mkern-1.2mu}\mathrel{-}}
...
}
Was würde schiefgehen, wenn diese Befehle am Ende von definiert würden mathtools.sty
? Welche Vorteile bietet dieser Umweg?
Mir ist gerade aufgefallen, dass im Dokument
\documentclass{article}
\usepackage{mathtools}
\let\defeq\coloneqq
\begin{document}
$a\defeq b$
\end{document}
\defeq
bleibt undefiniert, weil man dies und jenes verwenden muss
\AtBeginDocument{\let\defeq\coloneqq}
stattdessen.
Antwort1
Wie bei jeder Verwendung von \AtBeginDocument
verzögert es die Ausführung bis nach der Präambel. Der Vorteil besteht darin, dass man Interaktionen mit anderen Paketen bewerten kann, die geladen wurden (vorodernach).
Die Verwendung von \providecommand
stellt sicher, dass ein Makro mit dem Namen nicht neu definiert wird, wenn es von einem anderen Paket (aus welchem Grund auch immer) erstellt wird \coloneq
. Wenn es jedoch nicht existiert, wird es definiert.
Als Paketautor wissen Sie nicht, welche anderen Pakete mit Ihrem geladen werden, und versuchen daher, dies mit verzögerten Definitionen (mithilfe von \AtBeginDocument
), der Verwendung von \def
s (zum Überschreiben unabhängig von der Existenz) oder Konditionierung zu berücksichtigen.