我的 LaTeX 文档表现异常。以下是它的简化版本:
\documentclass{article}
\begin{document}
\tableofcontents
\newpage
\addcontentsline{toc}{part}{A Part of My Document}
\include{includedfile}
\end{document}
并且includedfile.tex
:
\section{My Section Title}
Quack.
显然,在目录中,部分的标题应该位于节的标题之前,但事实并非如此!出了什么问题?
答案1
一些人提到的延迟问题是 TeX 会延迟所有\write
命令直到\shipout
时间。如果出于某种原因,您需要立即执行\write
,则可以使用\immediate\write
。为此,这里有一个简单的新宏,其作用类似于\addcontentsline
,但会立即写入辅助文件。
\documentclass{article}
\newcommand\immediateaddcontentsline[3]{%
\begingroup
\let\origwrite\write
\def\write{\immediate\origwrite}%
\addcontentsline{#1}{#2}{#3}%
\endgroup
}
\begin{document}
\tableofcontents
\newpage
\immediateaddcontentsline{toc}{part}{A Part of My Document}
\include{includedfile}
\end{document}
答案2
这是一个棘手的小问题。事实证明,它\include
与 有很大不同\input
;它不只是增加了几个\clearpage
s。我认为正确的解决方案是创建一个自定义\include
命令,其功能几乎与通常的命令一样:
\newcommand{\myinclude}[1]{\clearpage\input{#1}\clearpage}
当您\addcontentsline
直接或间接使用 时,它会在文件上写一行aux
,说“将这个和那个写入toc
文件”。然后它读取aux
文件并按照该指令操作。当您运行 latex 时再次,toc
文件中有正确的内容,并且您会得到一个漂亮的目录。
但是 tex\write
命令有某种延迟(我不明白)。当你\addcontentsline
连续使用几次时,这并不重要,因为它们都以正确的顺序进入写入堆栈。但这里有一个棘手的部分:当你使用\include
,它会产生分离 aux
文件为你要包含的文件,立即地在主aux
文件中写入一条命令,表示“查看其他aux
文件以获取说明”(没有奇怪的延迟)。因此,如果您\include
在 之后立即使用\addcontentsline
,则“查看其他aux
文件”命令将被写入前“在文件中写入一些内容toc
”命令。因此,包含文件中的所有内容条目都会被首先写入!
答案3
\include
当我用替换时,它对我有用\input
。
我认为\include
是针对章节(它强制\clearpage
或类似的东西),所以我从未在实践中使用它。
答案4
尝试将添加内容行移至目录上方:
更新:\addcontentsline
如果与 处于同一级别,则会出现错误的排序\include
。解决方法是将 放在\addcontentsline
包含文件中:
\documentclass{article}
\begin{document}
\tableofcontents
\newpage
\include{includedfile}
\include{some-other-file}
\end{document}
的内容includedfile.tex
\addcontentsline{toc}{part}{First Part of My Document}
\section{My Section Title}
Quack.