非常感谢Eureka老师的详细回答以及对@
恐惧症患者的鼓励.
下面有一个小小的疑惑,如果采用重定义\chapter*
定义的操作是不是会影响后续如果需要使用\chapter*
的功能,虽然可以在局部修改,但是个人觉得这种方式远不如修改\tableofcontenst
(将\chapter*
替换为\@schapter
)来得优雅简单.
\documentclass[landscape,openany]{book}
\usepackage[a6paper]{geometry}
\begin{document}
\pagestyle{empty}
\begingroup
\makeatletter
\renewcommand\chapter{\if@openright\cleardoublepage\else\clearpage\fi
%\thispagestyle{plain}%
\global\@topnum\z@
\@afterindentfalse
\secdef\@chapter\@schapter
}
\makeatother
\tableofcontents
\endgroup
% \mainmatter % 读源码的力量 get!
\cleardoublepage
\pagenumbering{arabic}
\chapter{First}
\chapter{Second}
\chapter{Third}
\chapter*{First}
\chapter*{Second}
\chapter*{Third}
\chapter{First}
\chapter{Second}
\chapter{Third}
\end{document}
顺便补充几个命令定义(其实看macro名称也能大致看出它的含义):
\pagenumbering:
macro:#1->\global \c@page \@ne \gdef \thepage {\csname @#1\endcsname \c@page }
\secdef:
macro:#1#2->\@ifstar {#2}{\@dblarg {#1}}
\@starttoc:
macro:#1->\begingroup \makeatletter \@input {\jobname .#1}\if@filesw \expandafter \newwrite \csname tf@#1\endcsname \immediate \openout \csname tf@#1\endcsname \jobname .#1\relax \fi \@nobreakfalse \endgroup
\def\@schapter#1{\if@twocolumn
\@topnewpage[\@makeschapterhead{#1}]%
\else
\@makeschapterhead{#1}%
\@afterheading
\fi}
\def\@makeschapterhead#1{%
\vspace*{50\p@}%
{\parindent \z@ \raggedright
\normalfont
\interlinepenalty\@M
\Huge \bfseries #1\par\nobreak
\vskip 40\p@
}}
对于补充的思考练习:
- case1:如果注释去
\thispagestyle{plain}
行,则可以去除所有ToC标题:
这是因为和正确的结果相比,上面的操作相当于用更底层的\@schapter
命令排版了无编号的标题,同时不改变页码设置,相当于跳过了原有\chapter*
中设定为plain
的步骤,并且直接将当前section
的信息写入.toc
文件读取并刷新缓存;
- case2:变式(指定
\thispagestyle{plain}
)
虽然\@schapter
在排版标题时并没有页码样式仍为empty
,但由于首页还未自然结束,故而会继续进行ToC的排版,而在进行\@schapter
排版之前已经指定了\thispagestyle{plain}
,因此首页ToC会出现页码而后续ToC不出现页码。
- case3:自行测试使用
\clearpage
断页
[上图有个typo,正文是被\chapter
设置为plain
....]
问 对于book文档类如何优雅地去除多页目录页的页码?