其实这几个问题的共同原因都在 \chapter
命令的定义中了, 参见 book.cls
中的定义:
\newcommand\chapter{\if@openright\cleardoublepage\else\clearpage\fi
\thispagestyle{plain}%
\global\@topnum\z@
\@afterindentfalse
\secdef\@chapter\@schapter}
这个命令里面的 \thispagestyle{plain}
就产生了这个页码. 而对应的 \tableofcontents
的定义如下:
\newcommand\tableofcontents{%
\if@twocolumn
\@restonecoltrue\onecolumn
\else
\@restonecolfalse
\fi
\chapter*{\contentsname
\@mkboth{%
\MakeUppercase\contentsname}{\MakeUppercase\contentsname}}%
\@starttoc{toc}%
\if@restonecol\twocolumn\fi
}
这个里面调用的是 \chapter*
命令,其实就是上面的那个 \@schapter
命令. 所以说解决办法也就很简单了, 在一个局部里面, 把 \tableofcontents
内部的这个 \chapter*
改一下就行了. 你可以选择重定义前者,也可以选择重定义后者. 这里我使用前者:
\documentclass[landscape,openany]{book}
\usepackage[a6paper]{geometry}
\makeatletter
\renewcommand\tableofcontents{%
\if@twocolumn
\@restonecoltrue\onecolumn
\else
\@restonecolfalse
\fi
\@schapter{\contentsname
\@mkboth{%
\MakeUppercase\contentsname}{\MakeUppercase\contentsname}}%
\@starttoc{toc}%
\if@restonecol\twocolumn\fi
}
\makeatother
\begin{document}
\pagestyle{empty}
\tableofcontents
\chapter{First}
\chapter{Second}
\chapter{Third}
\chapter{First}
\chapter{Second}
\chapter{Third}
\chapter{First}
\chapter{Second}
\chapter{Third}
\end{document}
编译结果如下:
为了更好的理解这个问题,你可以试试下面这个例子:
\documentclass[landscape,openany]{book}
\usepackage[a6paper]{geometry}
\makeatletter
\begin{document}
\pagestyle{empty}
\@schapter{Contents}
\thispagestyle{plain} % comment this line to test page style
\@starttoc{toc}
\chapter{First}
\chapter{Second}
\chapter{Third}
\chapter{First}
\chapter{Second}
\chapter{Third}
\chapter{First}
\chapter{Second}
\chapter{Third}
\end{document}
至于你后面提到的 tocloft
宏包,你可以自己去看它的实现.
问 对于book文档类如何优雅地去除多页目录页的页码?