
Этот вопрос кажется мне очень запутанным, поэтому я не уверен, что вы сможете его понять.
Я знаю, как решить эту проблему (теперь). Я хотел бы знать, как мне следовало ее диагностировать и решить. Решение заняло у меня около 24 часов (правда, эта проблема не была моим единственным занятием). Это кажется чрезмерно долгим временем, учитывая, что я изолировал проблему относительно легко, а решение было относительно хорошо документировано. Время ушло на то, чтобы выяснить,где--- или, может быть, точнее,когдаесли выразиться точнее.
Мой реальный код гораздо сложнее, но большая сложность не усложняет поиск проблемы.
Основная проблема заключается в необходимости создания одного или нескольких глоссариев, но не glossaries
создания заголовков, записей оглавления и разрывов страниц на верхнем уровне. Но я хочу glossaries
создать заголовки для подглоссариев, где два или более набора записей глоссария сгруппированы под одним основным заголовком.
Я быстро нашел:Распечатать глоссарии без заголовкаиРаспечатать глоссарии без заголовка. [Удивительно быстро, учитывая, что я использовал поиск SE.]
Поэтому я провел следующие 23 часа, пытаясь понять, где и когда следует вмешаться.
Оглядываясь назад, я понимаю, что усложняло то, что я пытался вмешаться из класса, а не из самого документа. Кажется, какой хук использовать — дело тонкое, хотя вы можете вносить изменения до или после, \begin{document}
если делаете это напрямую в документе.
Изменение, сделанное до , begindocument
похоже, работает; изменение, сделанное в , begindocument/after
не работает. Изменение, сделанное прямо перед этим \printglossary
в классе, работает, но только локально. Попытка изменить команду раздела из класса, похоже, терпит неудачу после , begindocument
за исключением очень, очень близкого к \printglossary
. Но cmd/printglossary/before
тоже не работает.
Так что очень мало мест работают, с точки зрения вмешательства. Как я должен был найти эти конкретные места? В частности, как я мог установить, что мне нужно было сделать изменение либоранееили толькогораздо позжеа не как я ожидал,немного позже?
\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}
Я могу, например, просмотреть содержимое крючков begindocument
:
-> 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 }
?
Но это, кажется, подтверждает, что мой код в begindocument/after
запускается после выполнения любой настройки по умолчанию. Это предполагает, что это должно быть эквивалентно использованию кода в документе после \begin{document}
, но последний вариант работает, тогда как первый не работает.
Так в чем же разница между кодом, запущенным в begindocument/after
хуке, и кодом, запущенным после него?\begin{document}
, когда хук не содержит другого кода, который мог бы помешать? Почему код должен идти вранеехук, даже если время не имеет значения, если он вставлен в сам документ?