我想为我的论文创建一个多文件项目,其中我使用单独的文件来表示各个部分。为了能够编译这些单独的文件,我尝试使用包subfiles
和standalone
包。
当我将其中一个包与apacite
包结合使用时,会出现问题。然后,在编译文件时main.tex
,我得到了一个。我不明白为什么会出现这个错误。无论包是在之前还是之后加载,LaTeX Error: Can be used only in preamble
都没有关系。apacite
subfiles
standalone
使用包时的main.tex
和文件的示例:chapter1.tex
subfiles
\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
或。此修补程序也适用于!\nocite
standalone
\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