以下 MCE:
% Subfile
%%%%%%%%%
\begin{filecontents}[overwrite]{subfile.tex}
\documentclass{article}
\tcbuselibrary{documentation}
\begin{document}
Foo.
\end{document}
\end{filecontents}
% Main file
%%%%%%%%%%%
\documentclass{article}
\usepackage{tcolorbox}
\usepackage[subpreambles]{standalone}
%
\tcbuselibrary{documentation} % ← To be removed
%
\begin{document}
\input{subfile}
\end{document}
编译非常顺利,除非\tcbuselibrary{documentation}
从主文件中删除 if (至少编译两次)。错误如下:
!LaTeX hooks 错误:对 'begindocument' 钩子的排序规则应用得太晚。(钩子)请尝试尽早设置此规则。
如需立即帮助,请输入 H...
l.421 ...开始文档}{显示键}{之前}{名称引用}
然后:
! 未定义控制序列。\csname tcb@doc@index@\idx@format \endcsname \hypersetup { citeco... l.237 }}
? ! 未定义控制序列。\kvtcb@colhyper
第237节
我知道 Ulrike 的警告:
这个子前言部分看起来相当脆弱,例如由于加载太晚而出现 hyperref 错误,[...]
在如果使用 \file_input:n 而不是 \input,独立包会错误地声称子文件的子前言已更改但您了解发生了什么以及如何解决这个问题吗?
答案1
当设置了standalone
package 选项时subpreambles
,子前言首先收集在.sta
文件中,然后在文档开头加载(\AtBeginDocument
)。但一般来说,加载包\AtBeginDocument
不是一个好主意,请参阅问题中的先前讨论latex3/hyperref#242。
我已将此情况报告给standalone
(请参阅问题MartinScharrer/独立#3) 并建议改用\AddToHook{begindocument/before}
。
以下是一个解决方法。它使用内部、特定于实现的信息,\RemoveFromHook{<hook>}[<label>]
将全局存储已删除的代码\l__hook_return_tl
。
% Subfile
%%%%%%%%%
\begin{filecontents}[overwrite]{subfile.tex}
\documentclass{article}
\tcbuselibrary{documentation}
\begin{document}
Foo.
\end{document}
\end{filecontents}
% Main file
%%%%%%%%%%%
\documentclass{article}
\usepackage{tcolorbox}
\usepackage[subpreambles]{standalone}
% move standalone code in hook `begindocument` to `begindocument/before`
\RemoveFromHook{begindocument}[standalone]
\ExpandArgs{nv}\AddToHook{begindocument/before}{l__hook_return_tl}
%
%\tcbuselibrary{documentation} % ← To be removed
%
\begin{document}
\input{subfile}
\end{document}