\ renewenvironment e ganchos do meio ambiente
Esta questão se refere ao sistema de gancho do LaTeX 2e introduzido em outubro de 2020 ( lthooks).
Como \renewenvironmentinterage com seus ganchos?
- Os ganchos foram limpos ou o código já adicionado aos ganchos permanece?
- Quando a definição original do ambiente é restaurada (por exemplo, encerrando o grupo), os ganchos são restaurados aos seus valores anteriores?
- As respostas a essas perguntas também se aplicam ao
documentmeio ambiente ou ele se comporta de maneira diferente a esse respeito?
Respostas
Tentarei responder suas perguntas uma por uma. Primeiro, para contexto:
Os ganchos são executados por \begine \end. O código do ambiente não é alterado de forma alguma. Com lthooks, \beginfaz (simplificado demais)
\UseHook{env/#1/before}%
\begingroup
\UseHook{env/#1/begin}%
\csname #1\endcsname
e \endfaz
\UseHook{env/#1/end}%
\csname end#1\endcsname
\endgroup
\UseHook{env/#1/after}%
onde #1está o nome do ambiente. Este é basicamente o mesmo layout que os etoolboxganchos eram antes lthooks.
- Os ganchos foram limpos ou o código já adicionado aos ganchos permanece?
Eles permanecem. Tudo o que foi adicionado env/foo/beforeserá executado env/foo/beforeindependentemente da definição do ambiente. Do jeito que está, não é possível para o código do gancho saber que \foofoi redefinido entre dois pontos no documento.
- Quando a definição original do ambiente é restaurada (por exemplo, encerrando o grupo), os ganchos são restaurados aos seus valores anteriores?
As operações em ganchos são sempre globais, portanto, adicionar código dentro de um grupo não é restaurado no final. Em vez disso, você deve removê-lo explicitamente, se precisar (veja minha resposta sobre como remover código de ganchos ).
- As respostas a essas perguntas também se aplicam ao ambiente do documento ou ele se comporta de maneira diferente a esse respeito?
document, como um ambiente, tem todos os ganchos que os ambientes usuais têm (exceto por env/document/after, que não é executado porque a execução do TeX é encerrada antes disso). Mas \documenta macro também tem vários ganchos adicionais que são codificados na macro:
begindocument/before: a primeira coisa executada por\document(após o\endgroupque cancela o\begingroupfeito por\begin). Este é um gancho “único”, o que significa que qualquer um\AddToHook{begindocument/before}{<code>}após este ponto fará com que o<code>seja executado imediatamente;begindocument: o good'ol\@begindocumenthook(você pode adicionar código a ele com a nova\AddToHookinterface ou com\AtBeginDocument). Este também é um gancho único; ebegindocument/end: a última coisa executada por\documentexceto a final\ignorespaces. Também um gancho único.
Se você redefinir \document, os ganchos de ambiente serão executados normalmente como para qualquer ambiente, mas os \documentganchos específicos não (a menos que você os adicione à sua redefinição, é claro).