手動輸入目錄檔案(\jobname.toc)在某些情況下為空

手動輸入目錄檔案(\jobname.toc)在某些情況下為空

根據使用 .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),則目錄檔案不會被刪除並重新填充,直到文件末尾,因此您可以在整個文件中放置任意數量的目錄。

相關內容