%20%E3%81%AE%E6%89%8B%E5%8B%95%E5%85%A5%E5%8A%9B%E3%81%8C%E7%A9%BA%E3%81%AB%E3%81%AA%E3%82%8B.png)
によると.toc 外部ファイルの使用次のファイルでは、目次が 2 回表示されます。
\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
andクラス)を使用すると、report
ドキュメントの最後まで toc ファイルは削除されず、再入力されるため、ドキュメント全体に好きなだけ toc を配置できます。