根据使用 .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。