Como eu deveria ter diagnosticado isso? Descobrir quando inserir código em ganchos para alterar o comportamento de pacotes de terceiros

Como eu deveria ter diagnosticado isso? Descobrir quando inserir código em ganchos para alterar o comportamento de pacotes de terceiros

Esta questão me parece muito confusa, então não tenho certeza se você conseguirá entendê-la.

Eu sei como resolver esse problema (agora). O que eu gostaria de saber é como deveria ter diagnosticado e resolvido. Levei cerca de 24 horas para resolvê-lo (reconheço que esse problema não era minha única ocupação). Parece um tempo excessivamente longo, visto que isolei o problema com relativa facilidade e a solução foi relativamente bem documentada. O que demorou foi descobrironde--- ou, talvez mais precisamente,quandoPara colocá-lo.

Meu código real é um pouco mais complicado, mas a maior complexidade não tornou mais difícil encontrar o problema.

A questão básica é a necessidade de gerar um ou mais glossários, mas impedir glossariesa criação de títulos, entradas de índice e quebras de página no nível superior. Mas quero glossariescriar títulos para subglossários, onde dois ou mais conjuntos de entradas de glossário são agrupados sob um único título principal.

Eu rapidamente encontrei:Imprimir glossários sem títuloeImprimir glossários sem título. [Notavelmente rápido, visto que usei a pesquisa de SE.]

Então passei as 23 horas seguintes tentando descobrir onde/quando intervir.

Em retrospecto, o que complicou foi que eu estava tentando intervir a partir de uma aula e não no próprio documento. Parece que gancho usar é uma questão delicada, embora você possa fazer as alterações antes ou depois, \begin{document}se fizer isso diretamente no documento.

Uma mudança feita begindocumentparece funcionar; um feito begindocument/afternão. Uma alteração feita antes \printglossaryna aula funciona, mas apenas localmente. Tentar alterar o comando de seção da classe parece falhar depois, begindocumentexceto muito, muito perto de \printglossary. No entanto, também cmd/printglossary/beforenão funciona.

Portanto, poucos lugares funcionam em termos de intervenção. Como eu deveria ter encontrado esses lugares específicos? Em particular, como poderia eu ter estabelecido que precisava fazer a mudançamais cedoou apenasmuito tardeem vez de, como eu esperava,um pouco mais tarde?

\begin{filecontents}[overwrite]{\jobname-g1.tex}
\ProvidesFile{\jobname-g1.tex}
\newglossaryentry{a}{name=a,description=A,type=ga}
\newglossaryentry{b}{name=b,description=B,type=gb}
\newglossaryentry{c}{name=c,description=C,type=gc}
\newglossaryentry{m}{name=m,description=M}
\end{filecontents}
\documentclass{book}
\ExplSyntaxOn
% the next line doesn't work
\hook_gput_code:nnn { begindocument / after } { . / my glossaries }
% the next line does work (begindocument/before works, too)
% \hook_gput_code:nnn { begindocument } { . / glossaries }
% the following line also works
% \hook_gput_code:nnn { package/glossaries/after } { . }
{
  \setglossarysection {subsection}
  \renewcommand* \glsclearpage {}
}
\ExplSyntaxOff
\NewDocumentCommand \mything {+m}
{%
  \cleardoublepage
  {\parindent=0pt
    \hrule\par
    {\Huge #1\par}%
    \hrule\par   
  }%
}
\NewDocumentCommand \mywords {ommo}
{% intervening up here somewhere doesn't work
  \mything{#3}%
  \addcontentsline{toc}{section}{#3}%
    \IfValueTF{#4}{%
      % intervening here works, but { cmd/printglossary/before } doesn't
      \printglossary[title={#2},type=#2]%
      \printglossary[title={#4},type=#4]%
    }{%
      \printglossary[title={},type=#2]%
    }
}
\usepackage[nonumberlist,subentrycounter,toc,xindy]{glossaries}
\newglossary[ga-glg]{ga}{ga-gls}{ga-glo}{As} 
\newglossary[gb-glg]{gb}{gb-gls}{gb-glo}{Bs} 
\newglossary[gc-glg]{gc}{gc-gls}{gc-glo}{Cs} 
\setglossarystyle{altlist}
\loadglsentries{\jobname-g1}
\makeglossaries
% Uncommenting the following line works
% \setglossarysection{subsection}
\begin{document}
% uncommenting this line works
% \setglossarysection{subsection}
\tableofcontents

\mything{T}
\gls{a} \gls{b}  \gls{c} \gls{m}

\mywords[b]{ga}{A-B-Words}[gb]

\mywords{gc}{C-Words}

\mywords{main}{M-Words}

\end{document}

Posso, por exemplo, visualizar o conteúdo dos begindocumentganchos:

-> The hook 'begindocument/after':
> The hook is not declared.
> Code chunks:
>     top-level/myglossaries -> \setglossarysection {subsection}\renewcommand *
\glsclearpage {}
> Document-level (top-level) code:
>     ---
> Extra code for next invocation:
>     ---
> Rules:
>     ---
> Execution order:
>     Not set because the hook is undeclared.
<recently read> }

l.895 \hook_show:n { begindocument/after }

?

-> The hook 'begindocument':
> Code chunks:
>     amsmath -> \reset@strutbox@ \MakeRobust \dddot \MakeRobust \ddddot \mathc
hardef \std@minus \mathcode `\-\relax \mathchardef \std@equal \mathcode `\=\rel
ax \expandafter \let \csname overleftarrow \endcsname \@undefined \expandafter
\let \csname overrightarrow \endcsname \@undefined \MakeRobust \overrightarrow
\MakeRobust \overleftarrow \MakeRobust \overleftrightarrow \MakeRobust \underri
ghtarrow \MakeRobust \underleftarrow \MakeRobust \underleftrightarrow
>     datatool-base -> \@ifundefined {texteuro}{}{\DTLnewcurrencysymbol {\texte
uro }}\@ifundefined {textdollar}{}{\DTLnewcurrencysymbol {\textdollar }}\@ifund
efined {textstirling}{}{\DTLnewcurrencysymbol {\textstirling }}\@ifundefined {t
extyen}{}{\DTLnewcurrencysymbol {\textyen }}\@ifundefined {textwon}{}{\DTLnewcu
rrencysymbol {\textwon }}\@ifundefined {textcurrency}{}{\DTLnewcurrencysymbol {
\textcurrency }}\@ifundefined {euro}{}{\DTLnewcurrencysymbol {\euro }}\@ifundef
ined {yen}{}{\DTLnewcurrencysymbol {\yen }}
>     glossaries -> \ifglsacronym \providecommand *{\printacronyms }[1][]{\prin
tglossary [type=\acronymtype ,##1]}\fi \ifx \gls@codepage \@empty \@ifpackagelo
aded {fontspec}{\def \gls@codepage {utf8}}{}\fi \gls@begindocdefs \@ifpackagelo
aded {amsmath}{\let \gls@if@measuring \@gls@if@measuring }{}\let \gls@org@refst
epcounter \refstepcounter \let \gls@org@label \label \renewcommand *{\@gls@adju
stmode }{\ifvmode \mbox {}\fi }
> Document-level (top-level) code (executed last):
>     ---
> Extra code for next invocation:
>     ---
> Rules:
>     ---
> Execution order:
>     amsmath, datatool-base, glossaries.
<recently read> }

l.896 \hook_show:n { begindocument }
?

-> The hook 'begindocument/before':
> The hook is empty.
<recently read> }

l.897 \hook_show:n { begindocument/before }

?

Mas isso parece confirmar que meu código está em begindocument/afterexecução após a conclusão de qualquer configuração padrão. Isso sugere que deveria ser equivalente a usar o código no documento depois \begin{document}, mas o último funciona, enquanto o primeiro falha.

Então, o que há de diferente no código executado no begindocument/aftergancho e no código executado depois \begin{document}, quando o gancho não contém nenhum outro código que possa interferir? Por que o código precisa entrar em ummais cedogancho, mesmo que o momento seja irrelevante se inserido no próprio documento?

informação relacionada