我编写了两个使用独立包集成的简单文件:
主要.tex:
\documentclass{article}
\usepackage[subpreambles]{standalone}
\begin{document}
\input{myfile}
\end{document}
myfile.tex:
\documentclass[class=article, crop=false]{standalone}
\usepackage{lipsum}
\usepackage{acronym}
\begin{document}
\acrodef{FB}{Foo Bar}
First call: \ac{FB} \par Later calls: \ac{FB}
\lipsum[1]
\end{document}
似乎虽然\lipsum
和\ac
命令都是主文件所知道的,但\acrodef
命令却不是,正如我收到的错误所暗示的那样。即使我将命令移至\acrodef
子文件的前言部分,也没有任何变化。
到目前为止,我能解决这个问题的唯一方法是添加缩写包也在主文件的序言中,同时基于独立包,这就是子前导码标签预期要做的事情,并且已经完成了利普萨姆本例中是这样的包。
那么我遗漏了什么或误解了什么?独立包以及它如何处理子前导码?
更新
使用命令\newacro
代替 后\acrodef
,命令的问题\ac
就解决了。因此,第一个调用和其他对 的调用\ac
成功解析为正确的输出。但编译时输出中仍然会出现一行额外的行main.tex
(第一行):
答案1
问题在于,.aux
首字母缩略词放置看似未定义内容的文件是在放置子前言的文件之前输入的.sta
。文件standalone
的输入.sta
发生在begindocument
执行钩子时,而钩子执行时后.aux
正在读取文件。
然而,有一个begindocument/before
钩子前文件.aux
已读取。
在您的示例中,我们可以相当安全地将关键代码添加到此standalone
钩子中,因为您的子文件仅加载包。包永远不会被加载两次,所以这不是问题,但子前言中的自定义定义很可能是一个问题……请谨慎使用以下内容。
另外:您应该将此事报告给软件包作者。
\documentclass{article}
\usepackage[subpreambles]{standalone}
\makeatletter
\AddToHook{begindocument/before}{%
\let\subpreamble\@gobble
\let\endsubpreamble\relax
\let\standalonepreambles\relax
\let\endstandalonepreambles\relax
\ifsa@sortsubpreambles
\let\sa@orig@usepackage\usepackage
\let\usepackage\sa@usepackagewithoutoptions
\fi
\InputIfFileExists{\jobname.sta}{}{}%
}
\makeatother
\begin{document}
\input{myfile}
\end{document}