
Diese Frage erscheint mir sehr verwirrend und ich bin nicht sicher, ob Sie sie verstehen werden.
Ich weiß (jetzt), wie ich dieses Problem lösen kann. Was ich gerne wissen würde, ist, wie ich es hätte diagnostizieren und lösen sollen. Die Lösung hat mich ungefähr 24 Stunden gekostet (zugegeben, dieses Problem war nicht meine einzige Beschäftigung). Das erscheint mir übermäßig lang, wenn man bedenkt, dass ich das Problem relativ einfach isolieren konnte und die Lösung relativ gut dokumentiert war. Was die Zeit in Anspruch nahm, war herauszufindenWo--- oder, vielleicht genauer,Wannum es auszudrücken.
Mein tatsächlicher Code ist etwas komplizierter, aber die größere Komplexität hat es nicht wirklich schwieriger gemacht, das Problem zu finden.
Das grundlegende Problem besteht darin, dass ein oder mehrere Glossare erstellt werden müssen, aber keine glossaries
Titel, Inhaltsverzeichniseinträge und Seitenumbrüche auf der obersten Ebene erstellt werden dürfen. Ich möchte jedoch glossaries
Titel für Unterglossare erstellen, in denen zwei oder mehr Sätze von Glossareinträgen unter einer einzigen Hauptüberschrift zusammengefasst sind.
Ich fand schnell:Glossare ohne Titel druckenUndGlossare ohne Titel drucken. [Erstaunlich schnell, wenn man bedenkt, dass ich die Suche von SE verwendet habe.]
Also verbrachte ich die nächsten 23 Stunden damit, herauszufinden, wo und wann ich eingreifen sollte.
Im Nachhinein wurde die Sache dadurch kompliziert, dass ich versuchte, von einer Klasse aus einzugreifen und nicht im Dokument selbst. Es scheint, dass es eine heikle Angelegenheit ist, welchen Hook man verwenden soll, obwohl man die Änderungen vorher oder nachher vornehmen kann, \begin{document}
wenn man sie direkt im Dokument macht.
Eine bis zu vorgenommene Änderung begindocument
scheint zu funktionieren; eine in begindocument/after
nicht. Eine direkt davor \printglossary
in der Klasse vorgenommene Änderung funktioniert, aber nur lokal. Der Versuch, den Abschnittsbefehl aus der Klasse zu ändern, scheint nach fehlzuschlagen, begindocument
außer ganz, ganz in der Nähe von \printglossary
. cmd/printglossary/before
Funktioniert aber auch nicht.
Es gibt also nur sehr wenige Orte, an denen Interventionen funktionieren. Wie hätte ich diese Orte finden sollen? Insbesondere, wie hätte ich feststellen können, dass ich die Veränderung entwederfrüheroder nurviel späteranstatt, wie ich erwartet hatte,ein bisschen später?
\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}
Ich kann mir beispielsweise den Inhalt der begindocument
Hooks ansehen:
-> 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 }
?
Dies scheint jedoch zu bestätigen, dass mein Code begindocument/after
ausgeführt wird, nachdem alle Standardeinstellungen vorgenommen wurden. Dies deutet darauf hin, dass dies der Verwendung des Codes im Dokument nach entsprechen sollte \begin{document}
, aber letzteres funktioniert, während ersteres fehlschlägt.
Was ist also der Unterschied zwischen Code, der im begindocument/after
Hook ausgeführt wird, und Code, der danach ausgeführt wird?\begin{document}
, wenn der Hook keinen anderen Code enthält, der stören könnte? Warum muss der Code in einenfrüherHook, obwohl der Zeitpunkt unerheblich ist, wenn er in das Dokument selbst eingefügt wird?