Por que o pacote mathtools define apenas operadores \AtBeginDocument?

Por que o pacote mathtools define apenas operadores \AtBeginDocument?

Qual é a lógica por trás da definição de operadores como \coloneqno mathtools.styuso \AtBeginDocument?

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

O que aconteceria se esses comandos fossem definidos no final de mathtools.sty? Quais são os benefícios deste desvio?

Acabei de notar que no documento

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

\defeqpermanece indefinido por causa disso e é preciso usar

\AtBeginDocument{\let\defeq\coloneqq}

em vez de.

Responder1

Como acontece com qualquer uso de \AtBeginDocument, atrasa a execução até depois do preâmbulo. O benefício é que é possível avaliar as interações com outros pacotes que foram carregados (antesoudepois).

O uso \providecommandgarante que se qualquer outro pacote (por qualquer motivo) criar alguma macro chamada \coloneq, ele não a redefinirá. Porém, se não existir, irá defini-lo.

Como escritor de pacotes, você não sabe quais outros pacotes serão carregados com o seu e, portanto, tenta acomodar isso com definições atrasadas (usando \AtBeginDocument), usando \defs (para sobrescrever independentemente da existência) ou condicionamento.

informação relacionada