
Qual é a lógica por trás da definição de operadores como \coloneq
no mathtools.sty
uso \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}
\defeq
permanece 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 \providecommand
garante 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 \def
s (para sobrescrever independentemente da existência) ou condicionamento.