状況によっては目次ファイル (\jobname.toc) の手動入力が空になる

状況によっては目次ファイル (\jobname.toc) の手動入力が空になる

によると.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クラス (拡張されたbookandクラス)を使用すると、reportドキュメントの最後まで toc ファイルは削除されず、再入力されるため、ドキュメント全体に好きなだけ toc を配置できます。

関連情報