
Esta pregunta me parece muy confusa, así que no estoy seguro de que puedas entenderla.
Sé cómo resolver este problema (ahora). Lo que me gustaría saber es como debería haberlo diagnosticado y solucionado. Resolverlo me llevó aproximadamente 24 horas (es cierto que este problema no era mi única ocupación). Parece un tiempo excesivamente largo dado que aislé el problema con relativa facilidad y la solución estaba relativamente bien documentada. Lo que tomó tiempo fue descubrirdónde--- o, quizás más exactamente,cuandoponer.
Mi código real es bastante más complicado, pero la mayor complejidad no hizo que fuera más difícil encontrar el problema.
El problema básico es la necesidad de generar uno o más glosarios pero evitar glossaries
la creación de títulos, entradas de índice y saltos de página en el nivel superior. Pero sí quiero glossaries
crear títulos para subglosarios, donde dos o más conjuntos de entradas del glosario se agrupan bajo un único título principal.
Rápidamente encontré:Imprimir glosarios sin títuloyImprimir glosarios sin título. [Notablemente rápido dado que utilicé la búsqueda de SE.]
Así que pasé las siguientes 23 horas tratando de averiguar dónde y cuándo intervenir.
En retrospectiva, lo que complicó las cosas fue que intentaba intervenir desde una clase y no desde el documento en sí. Parece que qué gancho usar es un asunto delicado, aunque puedes hacer los cambios antes o después \begin{document}
si lo haces directamente en el documento.
Un cambio hecho begindocument
parece funcionar; uno hecho en begindocument/after
no lo hace. Un cambio realizado justo antes \printglossary
en la clase funciona, pero solo localmente. Intentar cambiar el comando de sección de la clase parece fallar después, begindocument
excepto muy, muy cerca de \printglossary
. Sin embargo, cmd/printglossary/before
tampoco funciona.
Por eso, muy pocos lugares funcionan en términos de intervención. ¿Cómo debería haber encontrado estos lugares en particular? En particular, ¿cómo pude haber establecido que necesitaba hacer el cambio?más tempranoo solomucho más tardeen lugar de, como esperaba,un poco más 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}
Puedo, por ejemplo, ver el contenido de los begindocument
ganchos:
-> 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 }
?
Pero esto parece confirmar que mi código se begindocument/after
está ejecutando después de realizar la configuración predeterminada. Eso sugiere que debería ser equivalente a usar el código en el documento posterior \begin{document}
, pero este último funciona, mientras que el primero falla.
Entonces, ¿qué diferencia hay entre el código que se ejecuta en el begindocument/after
gancho y el código que se ejecuta después \begin{document}
, cuando el gancho no contiene ningún otro código que pueda interferir? ¿Por qué es necesario que el código vaya en unmás tempranogancho, aunque el momento es irrelevante si se inserta en el documento mismo?