使用 apacite 包与子文件包或独立包会导致 LaTeX 错误:只能在序言中使用

使用 apacite 包与子文件包或独立包会导致 LaTeX 错误:只能在序言中使用

我想为我的论文创建一个多文件项目,其中我使用单独的文件来表示各个部分。为了能够编译这些单独的文件,我尝试使用包subfilesstandalone包。

当我将其中一个包与apacite包结合使用时,会出现问题。然后,在编译文件时main.tex,我得到了一个。我不明白为什么会出现这个错误。无论包是在之前还是之后加载,LaTeX Error: Can be used only in preamble都没有关系。apacitesubfilesstandalone

使用包时的main.tex和文件的示例:chapter1.texsubfiles

\documentclass{article}
\usepackage{subfiles}
\usepackage{apacite}
\begin{document}
\subfile{chapter1}
\end{document}
\documentclass[main.tex]{subfiles} 
\begin{document}
text
\cite{xx19xx}
\end{document}

使用独立包时的文件main.tex示例:chapter1.tex

\documentclass{article}
\usepackage{standalone}
\usepackage{apacite}
\begin{document}
\input{chapter1}
\end{document}
\documentclass{article}
\begin{document}
text
\cite{xx19xx}
\end{document}

在这两种情况下,我都会收到前面提到的错误。有没有办法让我可以apacite为我的项目使用单独的文件?

答案1

原因是使用apacite\cite调用时,会通过测试的定义(这是背后的底层宏)\nocite来检查它是否在前言中。但是,这两个包的定义都发生了变化,因此测试总是认为它仍然在前言中,并使用仅有前言的宏(),这会导致错误。\document\begin{document}\document\AtBeginDocument


避免这种情况的一种方法standalone是进行修补\nocite,使其不\@onlypreamble与进行比较\document,而是\documentclass与 进行比较\sa@documentclass。这是因为通过将所需代码附加到直接在前导码的最末尾standalone设置\documentclass为。1\sa@documentclass\document

% Main document
\documentclass{article}
\usepackage{standalone}
\usepackage{apacite}
\usepackage{etoolbox}% for the \patchcmd
\makeatletter
% Patch after apacite got loaded!
\patchcmd{\nocite}{\@onlypreamble\document}{\documentclass\sa@documentclass}{}{}
\makeatother
\begin{document}
\input{chapter1}
\end{document}

因为subfiles情况有所不同。这里\document仅在子文件本身内部重新定义,因此无法修补测试以比较不同的宏,使其在子文件内部和外部都有效。在这里,我只需将测试替换为始终为真,并且永远不会在它不属于的前言中\ifx使用\cite或。此修补程序也适用于!\nocitestandalone

\documentclass{article}
\usepackage{subfiles}
\usepackage{apacite}
\usepackage{etoolbox}
\makeatletter
\patchcmd{\nocite}{\ifx\@onlypreamble\document}{\iftrue}{}{}
\makeatother
\begin{document}
\subfile{chapter1}
\end{document}

1 ) 但是,内部测试无论如何都是有缺陷的,作者应该将其删除apacite。无论有没有补丁,它在内部调用的仍然\AtBeginDocument有其原始定义,因此它会一次又一次地调用……直到 TeX 耗尽资源并中止! \nocite\document\AtBeginDocument

相关内容