在某些情况下,手动输入的目录文件(\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类(扩展的bookreport),则 toc 文件不会被删除并重新填充,直到文档结束,因此您可以在整个文档中放置任意数量的 toc。

相关内容