考虑以下使用amsart
文档类:
\documentclass{amsart}% http://ctan.org/pkg/amsart
\newcommand{\addtotoc}[1]{\addtocontents{toc}{#1}}
\begin{document}
\tableofcontents
\section{First section}
\addtotoc{abc}
\section{Second section}
\subsection{First subsection}
\addtotoc{def}
\subsection{Second subsection}
\end{document}
文档类amsart
似乎在处理目录内容时表现出延迟;以下是.toc
文件的内容:
\contentsline {section}{\tocsection {}{1}{First section}}{1}
abc
\contentsline {section}{\tocsection {}{2}{Second section}}{1}
def
\contentsline {subsection}{\tocsubsection {}{2.1}{First subsection}}{1}
\contentsline {subsection}{\tocsubsection {}{2.2}{Second subsection}}{1}
为什么条目abc
在第一部分之后结束(如预期的那样),但def
没有在第一个小节之后结束?
答案1
同样的问题已经出现在article
课堂上,并且paragraph
:
\documentclass{article}
\newcommand{\addtotoc}[1]{\addtocontents{toc}{#1}}
\begin{document}
\setcounter{tocdepth}{5}
\tableofcontents
\section{First section}
\addtotoc{abc\endgraf}
\section{Second section}
\subsection{First subsection}
\addtotoc{def\endgraf}
\subsection{Second subsection}
\paragraph{A paragraph}% insert \leavevmode to cure the problem
\addtotoc{ghk\endgraf}
\end{document}
无论是用amsart+subsection
还是用治疗方法都是在之前article+paragraph
添加。\leavevmode
\addtotoc
实际情况是,\addcontentsline
源自小节的 只会作为 中的内容的一部分执行\everypar
,因此位于下一段的开头。这样做\par
没有帮助,因为我们处于垂直模式:紧接着\subsection{First subsection}
小节标题尚未排版。
因此,\addtotoc
在垂直模式下,首先遇到的是,因此内容在文件中的位置.aux
先于产生子节标题本身的相应指令。此顺序在.toc
文件中自然保留。
(有人可能想知道最后一个\addcontentsline
是如何执行的,但在文档的末尾,a\clearpage
已经完成,这\if@noskipsec
就是\iftrue
所做的\leavevmode
事情)