Ручной ввод оглавления файла (\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), то файл toc не удаляется и не заполняется заново до конца документа, поэтому вы можете разместить столько toc, сколько захотите, по всему документу.

Связанный контент