答案1
在默认文档类中,目录中的每个条目都通过宏进行设置\contentsline{<type>}{<title>}{<page>}
。它需要三个参数,第一个参数<type>
决定格式,第二个<title>
和第三个参数<page>
提供要设置的内容。
当你编译以下最小示例时(至少两次)
\documentclass{book}
\begin{document}
\frontmatter
\chapter{Introduction}% ...or \input{introduction}...
\tableofcontents
\mainmatter
\chapter{Main chapter}
\end{document}
您将在 中看到以下内容.toc
:
\contentsline {chapter}{Introduction}{i}
\contentsline {chapter}{\numberline {1}Main chapter}{1}
您的请求是忽略第一个条目的<page>
,但仍将其保留用于后续条目。也就是说,\contentsline
我们想要的是类似 的东西,而不是常规的\nopagecontentsline
:
\let\oldcontentsline\contentsline
\newcommand{\nopagecontentsline}[3]{\oldcontentsline{#1}{#2}{}}
在处理目录时,我们必须谨慎地对重新定义进行包装。因此,在主文档中,您将使用
\addtocontents{toc}{\let\protect\contentsline\protect\nopagecontentsline}
\chapter{Introduction}% ...or \input{introduction}...
\addtocontents{toc}{\let\protect\contentsline\protect\oldcontentsline}
现在你的.toc
会像
\let \contentsline \nopagecontentsline
\contentsline {chapter}{Introduction}{i}
\let \contentsline \oldcontentsline
\contentsline {chapter}{\numberline {1}Main chapter}{1}
更新在使用前插入,使用后恢复。
这是一个完整的最小示例:
\documentclass{book}
\let\oldcontentsline\contentsline
\newcommand{\nopagecontentsline}[3]{\oldcontentsline{#1}{#2}{}}
\begin{document}
\frontmatter
\addtocontents{toc}{\let\protect\contentsline\protect\nopagecontentsline}
\chapter{Introduction}
\addtocontents{toc}{\let\protect\contentsline\protect\oldcontentsline}
\tableofcontents
\mainmatter
\chapter{Main chapter}
\end{document}
一个更简单的选择是设置介绍作为\chapter*
而不是\chapter
。默认情况下,\chapter*
不包含在 ToC 中,因此您需要手动执行:
\chapter*{Introduction}% ...or \input{introduction}...
\addtocontents{toc}{\protect\contentsline{chapter}{Introduction}{}\%}
\%
第二个参数末尾的是\addtocontents
终止符。如果不添加,下一个条目将无法正确格式化。