我的 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
,但立即寫入 aux 檔案。
\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
文件並遵循該指令。當你運行乳膠時再次,該toc
文件中包含正確的內容,您將獲得一個不錯的目錄。
但是 tex\write
命令有某種延遲(我不明白)。當您\addcontentsline
連續使用多次時,這並不重要,因為它們都會以正確的順序進入寫入堆疊。但這是棘手的部分:當你使用 時\include
,它會產生一個分離 aux
file 為您所包含的文件以及立即地在主aux
文件中寫入一條命令,表示「查看其他aux
文件以獲取說明」(沒有奇怪的延遲)。因此,如果您\include
在 後立即使用,則會寫入\addcontentsline
「查看其他檔案」命令aux
前“在文件中寫入一些內容toc
”命令。因此,包含文件中的所有內容條目都會先寫入!
答案3
\include
當我替換為時,它對我有用\input
。
我認為\include
是針對章節的(它強制 a\clearpage
或類似的東西),所以我從不在實踐中使用它。
答案4
試著將 addcontents 行移至目錄上方:
更新:\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.