根據使用 .toc 外部文件,以下檔案應顯示兩次目錄:
\documentclass{report}
\begin{document}
\tableofcontents
\chapter*{Contents (manual input)}
\makeatletter
\input{\jobname.toc}
\makeatother
\chapter{Foo}
\section{Bar}
\end{document}
但手動輸入的\jobname.toc
卻是空的。
如果\jobname.toc
確實存在(例如,在第一次編譯前一個.tex
檔案之後),一旦刪除或註釋,此手動輸入就會給出預期的(非空)結果:
- 任何一個
\tableofcontents
, - 或者
\chapter{Foo}
。
你明白發生了什麼事嗎?
答案1
連結的問題是關於輸入.toc
與不同的文件.
當你使用它時\input{\jobname.toc}
它肯定是空的,因為\tableofcontents
輸入它然後打開文件寫入它,從而清除它。
然後該.toc
文件將在結束文件中重新填入。
查看shorttoc
應該可以解決您真正問題的軟體包。
不過,解決這個問題很容易,只需延遲開啟檔案以便在結束文件中寫入即可。
\documentclass{report}
\usepackage{atveryend}
\makeatletter
\def\@starttoc#1{%
\begingroup
\makeatletter
\@input{\jobname.#1}%
\if@filesw
\AfterLastShipout{%
\@ifundefined{tf@#1}{%
\expandafter\newwrite\csname tf@#1\endcsname
\immediate\openout \csname tf@#1\endcsname \jobname.#1\relax
}{}%
}%
\fi
\@nobreakfalse
\endgroup}
\makeatother
\begin{document}
\tableofcontents
\chapter*{Contents (manual input)}
\InputIfFileExists{\jobname.toc}{}{Missing toc}
\setcounter{tocdepth}{0}
\renewcommand{\contentsname}{Short contents}
\tableofcontents
\chapter{Foo}
\section{Bar}
\end{document}
您會發現您可以輸入多次目錄;\InputIfFileExists
應該使用,因為該.toc
文件可能仍然丟失。
答案2
\tableofcontents
輸入目錄,然後開啟它用於寫作所以這會刪除原始文件,然後您在寫入文件時輸入一個文件,因此您會受到作業系統文件緩衝的影響。
答案3
如果您使用memoir
類別(擴展的book
類別report
),則目錄檔案不會被刪除並重新填充,直到文件末尾,因此您可以在整個文件中放置任意數量的目錄。