\AtBeginDocument und Pakete

\AtBeginDocument und Pakete

Hier ist ein sehr rätselhaftes Verhalten des (Lua)LaTeX-Compilers. In der folgenden Situation hängt die Ausgabe davon ab, ob ein Code in ein Paket oder direkt in die Hauptdatei eingefügt wird; die Anforderung eines zusätzlichen \relaxBefehls am Anfang des Dokuments ändert das Verhalten; und ich schaffe es nicht, die Quelle eines mysteriösen Fehlers zu ermitteln ... Ich würde gerne verstehen, was im Hintergrund des Compilers passiert, um ein solches Verhalten zu erzeugen, um ähnliche unerwünschte Verhaltensweisen in der Folge zu vermeiden!

Die Situation ist folgende. Lassen Sie das folgende Dokument main.tex:

\documentclass{minimal}
\usepackage{sandbox}
\begin{document}
$\alpha$
\end{document}

zusammen mit der folgenden sandbox.styDatei:

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{sandbox}
\AtBeginDocument{\relax}
\RequirePackage{unicode-math}
\AtBeginDocument{\renewcommand\alpha{\beta}}
\endinput

Nach dem Kompilieren druckt es ein alphanumerisches Symbol, obwohl es eigentlich ein beta-Symbol hätte drucken sollen...! Dies ist das erste überraschende Verhalten.

Noch mysteriöser, wenn ichentwederder folgenden drei:

  • Kommentieren der Zeile \AtBeginDocument{\relax}in sandbox.sty;
  • Kommentieren der Zeile \RequirePackage{unicode-math}in sandbox.sty;
  • Ersetzen Sie die Zeile \usepackage{sandbox}in main.texdurch den Kerninhalt von sandbox.sty(d. h. die drei Zeilen sind der eigentliche Inhalt des Pakets).

dann druckt es eine Beta aus, wie ursprünglich erwartet... Das scheint völlig inkohärent! Hat jemand eine Ahnung für eine Erklärung?...

Antwort1

Wie in den Kommentaren erwähnt, hat dies mit dem Verhalten beim Hinzufügen zu Hooks zu tun. Material wird zu Hooks hinzugefügt und die Standardreihenfolge ist, dass „frühere“ Dateien ihren Hook-Inhalt früher ausführen,außerdie Einträge der obersten Ebene (das Benutzerdokument) sind zuletzt. Wir können sehen, dass, wenn wir \ShowHook{begindocument}zur Eingabe hinzufügen, Folgendes entsteht:

-> The hook 'begindocument':
> Code chunks:
>     sandbox -> \relax \renewcommand \alpha {\beta }
>     fontspec-luatex -> \tl_set_eq:NN \cyrillicencoding \g_fontspec_encoding_t
l \tl_set_eq:NN \latinencoding \g_fontspec_encoding_tl \RenewDocumentCommand \o
ldstylenums {m}{\__fontspec_main_oldstylenums:n {##1}}\fontspec_maybe_setup_mat
hs: 
>     amsmath -> \reset@strutbox@ \MakeRobust \dddot \MakeRobust \ddddot \Umath
charnumdef \std@minus \Umathcodenum `\-\relax \Umathcharnumdef \std@equal \Umat
hcodenum `\=\relax \expandafter \let \csname overleftarrow \endcsname \@undefin
ed \expandafter \let \csname overrightarrow \endcsname \@undefined \MakeRobust 
\overrightarrow \MakeRobust \overleftarrow \MakeRobust \overleftrightarrow \Mak
eRobust \underrightarrow \MakeRobust \underleftarrow \MakeRobust \underleftrigh
tarrow 
>     unicode-math-luatex -> \__um_define_math_chars: \tl_if_eq:onT {\g__fontsp
ec_mathrm_tl }{\rmdefault }{\__fontspec_setmathrm_hook:nn {}{}}\tl_if_eq:onT {\
g__fontspec_mathsf_tl }{\sfdefault }{\__fontspec_setmathsf_hook:nn {}{}}\tl_if_
eq:onT {\g__fontspec_mathtt_tl }{\ttdefault }{\__fontspec_setmathtt_hook:nn {}{
}}\bool_if:NF \g__um_main_font_defined_bool \__um_load_lm: \__um_setup_mathtext
: \__um_define_prime_commands: \__um_define_prime_chars: \cs_new_protected:Npn 
\__um_patch_url: {\tl_put_left:Nn \Url@FormatString {\__um_switch_to:n {literal
}}\tl_put_right:Nn \UrlSpecials {\do \`{\mathchar `\`}\do \'{\mathchar `\'}\do 
\${\mathchar `\$}\do \&{\mathchar `\&}}}\@ifpackageloaded {url}{\__um_patch_url
: }{}\cs_new_protected:Npn \__um_patch_mathtools_B: {\cs_set_eq:NN \MToverbrack
et \overbracket \cs_set_eq:NN \MTunderbracket \underbracket \AtBeginDocument {\
msg_warning:nn {unicode-math}{mathtools-overbracket}\cs_set:Npn \downbracketfil
l ####1####2{\tl_set:Nn \l_MT_bracketheight_fdim {.27ex}\downbracketend {####1}
{####2}\leaders \vrule \@height ####1\@depth \z@ \hfill \downbracketend {####1}
{####2}}\cs_set:Npn \upbracketfill ####1####2{\tl_set:Nn \l_MT_bracketheight_fd
im {.27ex}\upbracketend {####1}{####2}\leaders \vrule \@height \z@ \@depth ####
1\hfill \upbracketend {####1}{####2}}\cs_set_eq:NN \Uoverbracket \overbracket \
cs_set_eq:NN \Uunderbracket \underbracket \cs_set_eq:NN \overbracket \MToverbra
cket \cs_set_eq:NN \underbracket \MTunderbracket }}\@ifpackageloaded {mathtools
}{\__um_patch_mathtools_B: }{}\cs_new_protected:Npn \__um_patch_mathtools_C: {\
msg_warning:nn {unicode-math}{mathtools-colon}\DeclareDocumentCommand \dblcolon
 {}{\Colon }\DeclareDocumentCommand \coloneqq {}{\coloneq }\DeclareDocumentComm
and \Coloneqq {}{\Coloneq }\DeclareDocumentCommand \eqqcolon {}{\eqcolon }}\@if
packageloaded {mathtools}{\__um_patch_mathtools_C: }{}\Umathcharnumdef \std@min
us \Umathcodenum `-\Umathcharnumdef \std@equal \Umathcodenum `=\debug_suspend: 
\__um_resolve_greek: \debug_resume: \@ifpackageloaded {amsmath}{}{\__um_redefin
e_radical: }\__um_setup_active_frac: \g__um_secret_hook_tl 
> Document-level (top-level) code (executed last):
>     ---
> Extra code for next invocation:
>     ---
> Rules:
>     ---
> Execution order:
>     sandbox, fontspec-luatex, amsmath, unicode-math-luatex.
<recently read> }

Beachten Sie, dass der Hook für sandboxvor dem für auftritt unicode-math, sodass letzteres beim Neudefinieren desselben Eintrags „gewinnt“.

Der Sinn des Hook-Systems besteht darin, die Reihenfolge zu steuern. Sie müssen also nur hinzufügen

\DeclareHookRule{begindocument}{sandbox}{after}{unicode-math-luatex}
\DeclareHookRule{begindocument}{sandbox}{after}{unicode-math-xetex}

zu Ihrer sandboxDatei, um sicherzustellen, dass der Hook-Code geordnet ist:

> Execution order (after applying rules):
>     fontspec-luatex, amsmath, unicode-math-luatex, sandbox.

verwandte Informationen