![文档末尾的 \addtocontents 没有写入 .toc 文件?](https://linux22.com/image/234478/%E6%96%87%E6%A1%A3%E6%9C%AB%E5%B0%BE%E7%9A%84%20%5Caddtocontents%20%E6%B2%A1%E6%9C%89%E5%86%99%E5%85%A5%20.toc%20%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我正在尝试为我的大学论文/学位论文风格寻找一种更优雅的 ToC、LoT 和 LoF 格式解决方案。他们的要求的简短形式意味着我需要一种页面样式用于 ToC 的第一页,第二种页面样式用于后续页面直到附录列表开始的位置,还有第三种样式从附录列表到结尾。
看起来我遇到了一个错误,或者我只是缺少一个更好的解决方案。
最小示例 1
\documentclass{report}
\usepackage{lipsum}
\begin{document}
\addtocontents{toc}{\protect\thispagestyle{empty}\protect\pagestyle{plain}}
\tableofcontents
\input{twenty-chapters}
\appendix
\addtocontents{toc}{\protect\pagestyle{headings}\protect\thispagestyle{plain}}
\input{twenty-chapters}
\chapter{Foo} \include{a-chapter}
\addtocontents{toc}{\protect\thispagestyle{headings}}
\end{document}
虽然我不认为这相关,但内容twenty-chapters.tex
是 20 行
\chapter{Foo} \include{a-chapter}
并且a-chapter.tex
只是:
\lipsum[1]
\section{Bar}
\lipsum[2-7]
\begin{figure}[tbp] \caption{Figure N} \end{figure}
\begin{figure}[tbp] \caption{Figure N} \end{figure}
\begin{figure}[tbp] \caption{Figure N} \end{figure}
\section{Baz}
\lipsum[8-9]
\begin{figure}[tbp] \caption{Figure N} \end{figure}
\begin{figure}[tbp] \caption{Figure N} \end{figure}
\begin{figure}[tbp] \caption{Figure N} \end{figure}
这里,我使用空白页面样式代替第一页格式,使用纯文本代替第二页格式,使用标题代替第三页格式。除了目录的最后一页外,这种方法在其他所有页面上都适用,最后一页最终使用纯文本页面样式而不是标题。
最小示例2:
\documentclass{report}
\usepackage{lipsum}
\begin{document}
\addtocontents{toc}{\protect\thispagestyle{empty}\protect\pagestyle{plain}}
\tableofcontents
\input{twenty-chapters}
\appendix
\addtocontents{toc}{\protect\pagestyle{headings}\protect\thispagestyle{plain}}
\input{twenty-chapters}
\addtocontents{toc}{\protect\thispagestyle{headings}}
\chapter{Foo} \include{a-chapter}
\end{document}
与第一个文档完全相同,但现在我的期末考试\addtocontents
在最后一章之前。在这个文档上,一切都运行良好。目录第 1 页为空白页样式,目录第 2 页为纯文本,目录第 3-4 页为标题。
为什么这会产生影响?通过查看.toc
每个示例的文件,我\thispagestyle
失败的示例中缺少我的最终命令。为什么我的\addcontents
命令在某些情况下不起作用?
答案1
解决方案:
将最后一项替换\addtocontents
为以下代码:
\makeatletter
\immediate\write\@auxout{\noexpand\@writefile{toc}{\noexpand\thispagestyle{headings}}}
\makeatother
如果多个文档都需要这样做,您可以为其定义一个宏。在这种情况下,我也会\protect
正确设置(就像正常\addtocontents
情况一样)。这当然是在组内完成的(请注意额外的{ }
一对)。
\makeatletter
\newcommand\immaddtocontents[1]{{%
\let\protect\@unexpandable@protect
\immediate\write\@auxout{\noexpand\@writefile{toc}{#1}}%
}}
\makeatother
可以像这样使用:
\immaddtocontents{\protect\thispagestyle{headings}}
解释:
问题是,它\addtocontents
旨在与排版的材料一起使用。底层\write
宏是所谓的那是什么即只有在稍后找到并执行时才存储当它的框被排版时即当材料(虚拟地)写在页面上时。这样做是因为只有在此时才知道材料的最终位置,即页码。
您的最后一个\addtocontents
从未排版,因此永远不会进入文件。使用上面的代码将直接写入内容行,而无需创建那是什么。请注意,如果您在文档中间使用此代码,您的条目可能会乱序。
备择方案:
\hbox{}
我的第一个想法是在最后一个框后添加一个空框,\addtocontents
以强制那是什么执行。但是,由于最后一段文本位于\include
执行的文本中\clearpage
,因此在之后添加此框会在文档末尾创建一个新的空白页。但是,如果文档的最后内容来自主文件或文件\input
(并且不以手册结尾\clearpage
),则此解决方案应该有效。
另一种可能性是使用filehook
包将直接放置在最后一个文件\addtocontents
之前:\clearpage
\include
\usepackage{filehook}
\AtEndOfIncludeFile{<last file>}{\addtocontents{toc}{\protect\thispagestyle{headings}}}
或者将以下内容直接放在最后一个之前\include
:
\AtEndOfIncludes{\addtocontents{toc}{\protect\thispagestyle{headings}}}
进一步阅读:
看TeXBook它了解一切什么东西。例如在第21章中:制作盒子,第 226 页。