![书籍目录:避免在部分内容后分页](https://linux22.com/image/312373/%E4%B9%A6%E7%B1%8D%E7%9B%AE%E5%BD%95%EF%BC%9A%E9%81%BF%E5%85%8D%E5%9C%A8%E9%83%A8%E5%88%86%E5%86%85%E5%AE%B9%E5%90%8E%E5%88%86%E9%A1%B5.png)
我有一本书分为三部分,每部分都用 \part{} 介绍,并使用自定义部分页面在部分页面中添加图形。例如,
\part[Exploratory and Hypothesis-testing Methods]%
{Exploratory and Hypothesis-testing Methods\\[4ex]
\includegraphics[width=\textwidth]{front/fig/partmap2}
}
在目录中,我遇到了一个非常糟糕的断点,导致第二部分在页面末尾单独显示一行。我该如何避免这种情况?
我看不出有任何简单的方法来为此准备 MWE 示例,但如果有帮助的话可以提供更多详细信息。
编辑时添加的注释:本书使用出版商提供的类文件,krantz.cls
而不是book.cls
。执行目录条目的相关代码部分是:
\def\draw@part#1#2{%
\addpenalty{-\@highpenalty}%
\vskip1em plus\p@
\@tempdima1.5em
\begingroup
\parindent\z@\rightskip\@pnumwidth
\parfillskip-\rightskip
\bfseries
\leavevmode
\advance\leftskip\@tempdima
\hskip-\leftskip
{#1\hfil}\nobreak
\if@pdf
\else
\hfil\nobreak\hb@xt@\@pnumwidth{\hss #2}%
\fi
\par
\penalty\@highpenalty\endgroup}
\let\toc@draw\relax
%
\def\l@part#1#2{%
\toc@draw
\gdef\toc@draw{\draw@part{\large #1}{\large #2}}}
答案1
任何文件的目录通常都证实了墨菲定律:如果某件事可能出错,它就会出错。你的例子堪称典范!
要记住的第一条规则是不要恐慌!(记得随身带一条毛巾。)
在文档定稿并确定了几乎所有有关排版问题之前,我们不应该担心目录是否有错误:插入或删除材料可以(根据墨菲定律)改变我们为将标题从目录的第二页移到第一页或反之而进行的任何巧妙调整。
假设我们到了最后阶段,我们看一下目录。哦,天哪!部分的标题位于第一页的底部,相关内容列在第二页的顶部!
放松并欢喜吧!我们的文档已完成,只需一些修饰即可。
\part
转到发出命令的位置,并在该命令之前输入%%% Down with Murphy's law \addtocontents{toc}{\protect\pagebreak} %%% :-) \part[Exploratory and Hypothesis-testing Methods]% {Exploratory and Hypothesis-testing Methods\\[4ex] \includegraphics[width=\textwidth]{front/fig/partmap2}% <--- don't forget this % }
运行 LaTeX 两次。
再次放松!我们的零件标题即将进入第二页!
你也\pagebreak
可以使用\newpage
;区别在于,使用前一个命令时,TeX 将尝试填满页面,而使用后一个命令时,它将截断页面。请自行选择。
在这些排版调整周围添加一系列独特的注释,将使您在准备这本精美书籍的第二版时更容易找到它们。无情的墨菲定律将再次发挥作用,使我们为第一版所做的大部分调整都过时了,因此,拥有一种简单的查找方法将有助于删除它们并添加我们需要的调整。
答案2
这里发生了一些奇怪的事情,我很好奇 OP 使用了哪个文档类。事实上,许多用于制作书籍的最常见类都会自动阻止甚至禁止目录中出现这种糟糕的分页符;特别是,部分标题的 ToC 行后的分页符不应该出现在任何书,回忆录,记事本, 和撰稿人类(以及其他类)。
例如,考虑一下书标准 LaTeX 文档类:它定义\l@part
命令(负责排版部分标题的目录行的命令)如下:
\newcommand*\l@part[2]{%
\ifnum \c@tocdepth >-2\relax
\addpenalty{-\@highpenalty}%
\addvspace{2.25em \@plus\p@}%
\setlength\@tempdima{3em}%
\begingroup
\parindent \z@ \rightskip \@pnumwidth
\parfillskip -\@pnumwidth
{\leavevmode
\large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par
\nobreak
\global\@nobreaktrue
\everypar{\global\@nobreakfalse\everypar{}}%
\endgroup
\fi}
(参见classes.dtx
,代码行 1152-1169)。如您所见,\nobreak
在该行之后插入了 a(代码行 1163;另请参见其上方的注释:“防止在此条目后立即分页”)。
通过\showlists
诊断命令,我们可以检查该命令生成的垂直列表(至少在一般情况下)\tableofcontents
实际上在部分标题行和下一行之间不包含任何合法断点。考虑这个 MWE:
\documentclass[a4paper]{book}
\usepackage[T1]{fontenc}
\usepackage{lipsum}
\begin{document}
\begingroup
\showboxbreadth = 1000
\showboxdepth = 1
\tableofcontents
\showlists
\endgroup
\part{The First Part}
\chapter{One}
\lipsum[1]
\section{One One}
\lipsum[2]
\section{One Two}
\lipsum[3]
\section{One Three}
\lipsum[4]
\chapter{Two}
\lipsum[5]
\section{Two One}
\lipsum[6]
\section{Two Two}
\lipsum[7]
\section{Two Three}
\lipsum[8]
\part{The Second Part}
\chapter{Three}
\lipsum[9]
\section{Three One}
\lipsum[10]
\section{Three Two}
\lipsum[11]
\section{Three Three}
\lipsum[12]
\chapter{Four}
\lipsum[1]
\section{Four One}
\lipsum[2]
\section{Four Two}
\lipsum[3]
\section{Four Three}
\lipsum[4]
\end{document}
下面我们从其生成的记录文件中重现了几个摘录,并添加了一些评论。
这是垂直列表的第一部分标题所在的区域:
\penalty 10000 % <<< Before part 1
\glue 40.0
\glue(\parskip) 0.0 plus 1.0
\glue(\baselineskip) 3.71869
\hbox(8.28131+0.0)x345.0, glue set 219.0308fil
.\T1/cmr/bx/n/12 I
.\glue 13.4967
.\T1/cmr/bx/n/12 T
.\T1/cmr/bx/n/12 h
.\T1/cmr/bx/n/12 e
.\glue 4.4989 plus 2.24945 minus 1.49963
.\T1/cmr/bx/n/12 F
.\T1/cmr/bx/n/12 i
.\T1/cmr/bx/n/12 r
.\T1/cmr/bx/n/12 s
.\T1/cmr/bx/n/12 t
.\glue 4.4989 plus 2.24945 minus 1.49963
.\T1/cmr/bx/n/12 P
.\kern-0.37491
.\T1/cmr/bx/n/12 a
.\T1/cmr/bx/n/12 r
.\T1/cmr/bx/n/12 t
.\glue 0.0 plus 1.0fil
.\hbox(7.78143+0.0)x20.91992, glue set 14.17157fil []
.\penalty 10000
.\glue(\parfillskip) -15.49623
.\glue(\rightskip) 15.49623
\penalty 10000 % <<< After part 1
\glue 9.99756 plus 1.0
\glue(\parskip) 0.0 plus 1.0
\glue(\baselineskip) 5.0989
\hbox(6.9011+0.0)x345.0, glue set 291.88933fil
.\glue(\leftskip) 14.99634
.\glue -14.99634
.\hbox(6.48453+0.0)x14.99634, glue set 9.24774fil []
.\T1/cmr/bx/n/10 O
.\T1/cmr/bx/n/10 n
.\T1/cmr/bx/n/10 e
.\penalty 10000
.\glue 0.0 plus 1.0fil
.\penalty 10000
.\hbox(6.48453+0.0)x17.82068, glue set 12.07208fil []
.\penalty 10000
.\glue(\parfillskip) -15.49623
.\glue(\rightskip) 15.49623
\penalty 301 % <<< After chapter 1
\glue 0.0 plus 0.2
\glue(\parskip) 0.0 plus 1.0
\glue(\baselineskip) 5.1128
\hbox(6.8872+0.0)x345.0, glue set 252.63364fill
.\glue(\leftskip) 37.99074
.\hbox(0.0+0.0)x14.99634
.\hbox(0.0+0.0)x0.0
.\penalty 10000
.\glue -37.99074
.\hbox(6.4151+0.0)x22.9944, glue set 10.21974fil []
.\T1/cmr/m/n/10 O
.\T1/cmr/m/n/10 n
.\T1/cmr/m/n/10 e
.\glue 3.33252 plus 1.66626 minus 1.11084
.\T1/cmr/m/n/10 O
.\T1/cmr/m/n/10 n
.\T1/cmr/m/n/10 e
.\penalty 10000
.\leaders 0.0 plus 1.0fill []
.\penalty 10000
.\hbox(6.4151+0.0)x15.49623, glue set 10.49745fil []
.\penalty 10000
.\glue(\parfillskip) -25.49379
.\glue(\rightskip) 25.49379
\glue 0.0 plus 0.2
等等。你会看到\penalty 10000
第一部分标题前面有一个(我添加了注释的地方% <<< Before part 1
):这是一个特殊设置,仅适用于目录的第一行,以避免在标题“目录”之后立即出现分页符;事实上,我们马上就会看到,部分标题行上方的正常设置实际上是鼓励分页符。相反,请注意\penalty 10000
同一行后面的 (标记为 的位置% <<< After part 1
):如您所见,在写有“第一部分”的行和包含“一”的行之间根本没有断点,这是第一章的标题。还请注意\penalty 301
章节标题行后面的 (% <<< After chapter 1
已添加注释的位置):章节行和该章节第一节(“一一”节)行之间的分页符是允许,但是会受到相当高的惩罚。
现在,让我们看看第二部分标题发生了什么。我们还在其上方添加了一行。
\hbox(6.8872+0.0)x345.0, glue set 244.27457fill
.\glue(\leftskip) 37.99074
.\hbox(0.0+0.0)x14.99634
.\hbox(0.0+0.0)x0.0
.\penalty 10000
.\glue -37.99074
.\hbox(6.4151+0.0)x22.9944, glue set 10.21974fil []
.\T1/cmr/m/n/10 T
.\kern-0.83313
.\T1/cmr/m/n/10 w
.\kern-0.27771
.\T1/cmr/m/n/10 o
.\glue 3.33252 plus 1.66626 minus 1.11084
.\T1/cmr/m/n/10 T
.\T1/cmr/m/n/10 h
.\T1/cmr/m/n/10 r
.\T1/cmr/m/n/10 e
.\T1/cmr/m/n/10 e
.\penalty 10000
.\leaders 0.0 plus 1.0fill []
.\penalty 10000
.\hbox(6.4151+0.0)x15.49623, glue set 10.49745fil []
.\penalty 10000
.\glue(\parfillskip) -25.49379
.\glue(\rightskip) 25.49379
\penalty -301 % <<< Before part 2
\glue 22.4945 plus 1.0
\glue(\parskip) 0.0 plus 1.0
\glue(\baselineskip) 3.71869
\hbox(8.28131+0.0)x345.0, glue set 200.54782fil
.\hbox(0.0+0.0)x0.0
.\T1/cmr/bx/n/12 I
.\kern0.37491
.\T1/cmr/bx/n/12 I
.\glue 13.4967
.\T1/cmr/bx/n/12 T
.\T1/cmr/bx/n/12 h
.\T1/cmr/bx/n/12 e
.\glue 4.4989 plus 2.24945 minus 1.49963
.\T1/cmr/bx/n/12 S
.\T1/cmr/bx/n/12 e
.\T1/cmr/bx/n/12 c
.\T1/cmr/bx/n/12 o
.\T1/cmr/bx/n/12 n
.\T1/cmr/bx/n/12 d
.\glue 4.4989 plus 2.24945 minus 1.49963
.\T1/cmr/bx/n/12 P
.\kern-0.37491
.\T1/cmr/bx/n/12 a
.\T1/cmr/bx/n/12 r
.\T1/cmr/bx/n/12 t
.\glue 0.0 plus 1.0fil
.\hbox(7.78143+0.0)x20.91992, glue set 14.17157fil []
.\penalty 10000
.\glue(\parfillskip) -15.49623
.\glue(\rightskip) 15.49623
\penalty 10000 % <<< After part 2
\glue 9.99756 plus 1.0
\glue(\parskip) 0.0 plus 1.0
\glue(\baselineskip) 5.0989
\hbox(6.9011+0.0)x345.0, glue set 282.52356fil
.\glue(\leftskip) 14.99634
.\glue -14.99634
.\hbox(6.48453+0.0)x14.99634, glue set 9.24774fil []
.\T1/cmr/bx/n/10 T
.\T1/cmr/bx/n/10 h
.\T1/cmr/bx/n/10 r
.\T1/cmr/bx/n/10 e
.\T1/cmr/bx/n/10 e
.\penalty 10000
.\glue 0.0 plus 1.0fil
.\penalty 10000
.\hbox(6.48453+0.0)x17.82068, glue set 6.32349fil []
.\penalty 10000
.\glue(\parfillskip) -15.49623
.\glue(\rightskip) 15.49623
\penalty 301
\glue 0.0 plus 0.2
等等。同样,在部分标题(“第二部分”)和后续章节标题(“三”)之间没有办法分页;但这次,我们也可以看到强烈建议分页(\penalty -301
,由注释标记% <<< Before part 2
)前部分标题本身。实际上,书您可以轻松检查,该类在章节标题的目录行之前执行相同的操作。
可以对所有最常见的文档类别进行类似的测试,包括如上所述的:回忆录,记事本, 和撰稿人或者你可以直接研究它们如何定义相关命令:它们的行为方式都是一样的(实际上,KOMA 脚本类使用\penalty
20010,而不是通常的 10000)。所以,我想知道为什么问题中描述的分页符会出现:它可能是暗示可能存在其他问题的线索,应该予以识别和解决。不幸的是,这个问题在这方面缺乏足够的信息。