独立包如何处理子前导?

独立包如何处理子前导?

我编写了两个使用独立包集成的简单文件:

主要.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(第一行): 使用 newacro

答案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}

在此处输入图片描述

相关内容