我班上有一份文档book
,编译为 pdf 时,其中有许多孤行和寡行。我尝试使用包all
的选项删除孤行和寡行nowidow
。它似乎可以通过缩短或延长相关页面来修复孤行/寡行,类似于\enlargethispage
(但我不知道它是如何实现的)。这通常很有效,但有时跨页的两个对开页长度不等。我想找到一种解决方案,确保两个对开页的长度相等,像往常一样,但允许两个不同的跨页具有不同的长度。
理想情况下,我希望有一个像nowidow
包中那样的全局选项,但这可能过于乐观了。我准备浏览文档,\enlargethispage
在出现孤行/孤行时插入命令,并在跨页的另一页上插入相同的命令。有没有更聪明的方法?特别是,有没有办法平等地放大/缩短跨页的两页?
编辑:这是我尝试的 MWE。如果你编译它,你会发现几对对开页的长度不同。这就是我试图避免的。我在页面化妆LaTeX
描述了一种可能的解决方案:
规则 3 要求每个奇数页的长度与每个前一个偶数页的长度相同,因此您将
\enlargethispage
在书中放置成对的命令 >。(几乎可以肯定\enlargethispageandthenext
可以编写宏 >,但据我所知不存在。)
这样的宏很难制作吗?有人能给我一些正确的提示吗?
\documentclass[11pt, icelandic, leqno]{book}
\usepackage[textwidth=112mm,textheight=190mm, paperwidth=153mm, paperheight=230mm]{geometry}
\usepackage[icelandic]{babel}
\usepackage{lmodern}
%\usepackage[utf8]{inputenc} % if using utf8
\usepackage[T1]{fontenc}
\usepackage[parfill]{parskip}
\setlength{\parindent}{0.5cm}
\setlength{\parskip}{0pt}
\usepackage{microtype}
\usepackage{lipsum}
\frenchspacing
% To avoid headers and footers
% choose one of the below:
%\usepackage[defaultlines=2, all]{nowidow}
%\widowpenalty10000
%\clubpenalty10000
\widowpenalty300
\clubpenalty300
\usepackage{titlesec}
\titleformat{\chapter}[display]
{\filright\normalfont\LARGE\bfseries}
{\icelandicordinal{chapter}~\MakeLowercase\chaptertitlename}
{20pt}
{\huge}
\usepackage{titleps}
\newpagestyle{myfancy}{
\sethead[\textsc{\chaptertitle}][][]
{}{}{\textsc{\thesection{} \sectiontitle{}}}
\setfoot[\usepage][][]
{}{}{\usepage}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\title{Title}
\author{Author}
\date{}
\pagestyle{empty}
\begin{document}
\maketitle
\cleardoublepage
\pagestyle{myfancy}
\chapter*{Intro}
\sethead[\textsc{Intro}][][]
{}{}{\textsc{Intro}}
%\lipsum[4-57]
\lipsum[4-8]
\medskip
\lipsum[9-15]
\medskip
\lipsum[16-23]
\medskip
\lipsum[24-35]
\medskip
\lipsum[36-40]
\medskip
\lipsum[41-52]
\medskip
\lipsum[53-57]
\end{document}
答案1
首先,出于测试目的,请添加到 MWE:
showframe
几何包的选项。- 放在
\usepackage[pagewise]{lineno}
序言中。 \linenumbers
在 之后插入\maketitle
。
(每次测试后,编译两次以查看正确的行号。)
好吧,现在冷静地分析一下你在这个 MWE 中对 LaTeX 的要求:
段落之间不可拉伸的胶水(参见什么是胶水拉伸?。) , IE,
\parskip=0pt
某些页面(4、6、8......)必须有 4-8 pt 的额外空白,即
\medskip
。
\baselineskip
避免出现孤行/孤行(即在任何一页中 有相等的额外空白空间)。保持每页的文本长度相同。
简短回答:同时想要一切和其对立面是没有意义的!
我无法像专家一样剖析这一矛盾,但我们可以分部分来看,正如开膛手杰克所说:
1 + 2:只有文本的页面没有任何可伸缩的空间。LaTeX 可以在 MWE 中写入第一行在
11pt
顶部边距的(用 测试\the\topskip
),接下来的行各有13.6pt
(\baselineskip
),因此最大数字将是\textheight
减去\topskip
,减去最后一行的深度(\pagedepth
),除以\baselineskip
,大致为:(540.6-11-2.1)/13.6 = 38.78
。这意味着总共有 39 行,缺少10.7pt
(0.78/textheigh
)以达到底部边距(接近\baselineskip
,但不足以达到第 40 行)。相比之下,由于包含的\medskip
最大数量,带有 的页面被填满8pt
橡胶长度\medskip
。请注意8pt < 10.7pt
,但如果你仔细观察,尽管如此,页面似乎还是被填满了\parskip=0pt
。LaTeX 无论如何都会用超出允许最大值的胶水填充整个文本高度8pt
,但警告被迫这样做是为了避免更糟糕的选择,即只填充页面的 98%:Underfull \vbox (badness 3930) has occurred while \output is active [4]
在第 5 页以及其他没有 的页面中
\medskip
,由于允许的最大粘性为0pt
,因此未充满的情况\vbox
会更糟糕:Underfull \vbox (badness 10000) has occurred while \output is active [5]
因为 10000 的糟糕程度意味着非常糟糕。这意味着 LaTeX 没有可以接受的地方在文本中添加一些“额外的粘性”,因此选择留下 10.7pt 的结尾空间。
1 + 3:如果由于孤行/寡行的惩罚较高而导致最后一行丢失(跳至下一页),情况会更糟,因为上述小粘连无法再过度拉伸 13.6pt。为了保持文本长度,在这种情况下可能发生的最好情况是孤行/寡行的糟糕程度不足以引起任何变化。
2 + 3 -1:由于您没有允许段落之间的分隔设置
\parskip=0pt
,因此该parskip
包在这方面毫无用处。如果没有这个限制性\parskip
设置,默认情况下,空白的最终空间可以或多或少地很好地分布,尽管仍然会产生一些未满\vbox
警告,但可以使用该包完全清除parskip
。代价是段落之间的距离有时会出现难看的差异。
评论:因此,最好的解决办法就是不限制
\parskip
于0pt
。(恕我直言,当然......)
这种间距增加了段落的可读性(即使有缩进),但要坚持问题,总体上保持一致的底部边距。我的建议是将这些肮脏的技巧留作或\enlargethispage
用于\looseness
最终草稿中的紧急情况。在许多情况下,良好的microtype
设置可能可以阻止使用这些命令。
此外,它可以帮助设置普通字体(在此 MWE 中为 13.6pt)的 \baselineskip` 的倍数,因此如果页面填充了最大行数\textheight
,\topskip
则不需要粘合。
但是,由于美德通常是两个极端之间的最佳平衡点,因此您可能希望允许寡妇/孤儿惩罚,保持\medskip
原样,插入另一个垂直元素,此外,段落之间还有类似的小跳跃。这可以通过在 \parskip 中只允许一点拉伸/收缩粘连来实现,这样每页 3-6 个段落的粘连总和就足以几乎完美地填充空白空间10pt
,例如:
\setlength{\parskip}{3pt plus 3pt minus 1pt}
只需尝试其他值,直到找到最适合您的文档的结果(或出于其他原因更简单、更好,留给parskip
包装做的工作)。
如果您发现段落之间的最小间距确实很糟糕,那么还有另一种方法可以添加足够的“垂直胶水”:保留\parskip
0pt 或作为橡胶长度,但\baselineskip
以相同的方式使用(它也可以是橡胶长度)。例如,尝试在第一个之前设置一些内容 \lipsum
:
\setlength{\baselineskip}{2.85ex plus .1ex minus .05ex }
用肉眼观察,细小的基线变化比段落之间的不均匀间隔更难发现,但不幸的是,请注意 (a)\baselineskip
无法在序言中调整,并且 (b) 任何字体大小都会覆盖此设置(见 \baselineskip 是自动定义的吗?)。如果您的工作文档中字体变化较多,您可以考虑重新定义\normalsize
设置默认基线跳过。例如,在序言中添加以下内容:
\makeatletter
\renewcommand\normalsize{%
\@setfontsize\normalsize\@xpt{2.85ex plus .1ex minus .05ex}
\abovedisplayskip 10\p@ \@plus2\p@ \@minus5\p@
\abovedisplayshortskip \z@ \@plus3\p@
\belowdisplayshortskip 6\p@ \@plus3\p@ \@minus3\p@
\belowdisplayskip \abovedisplayskip
\let\@listi\@listI}
\makeatother
在其他情况下,如果您保留MWE 的\parskip
、\texheight
和\baselineskip
设置,则应放弃:
- 窗口/孤儿惩罚和
除整数之外的垂直空间
\baselineskip
。在实际文档中,这同样适用于任何其他具有垂直维度的对象(表格、浮点数等),包括它们周围的垂直空间(当然是一项艰巨的任务……)。仅出于示例的目的(对于工作文档来说,这不是一个好主意),可以重新定义\medskip
:\renewcommand\medskip{\vspace{2\baselineskip}} % LaTeX way of say \medskipamount2\baselineskip
然后,如果允许窗口/孤行,则重新定义
\medskip
不会导致底部边距出现任何差异,因为现在占用与两行普通文本相同的垂直空间。
注:我读过引用TUGboat 文章在第一次回答之后,我意识到我把重点放在了允许“TeX 方法”(\parskip
胶水)和“行间额外引导”方法(\baselineskip
胶水)上,然而,忘记这篇优秀文章中的至少第三种方法是不可原谅的:传统但仍然有效的重写文本。
答案2
这添加行包(使用afterpage
,因此请谨慎使用)提供了\addlines
向当前页面和对开页面添加一个额外 baselineskip 空间的命令。它必须放置在文本中的背面页面,显然,但如果没有,就会出现错误。
根据需要使用\addlines[2]
或等。\addlines[-1]
示例文档(直接来自文档):
\documentclass[twoside]{article}
\usepackage[a5paper,width=30em,lines=30]{geometry}
\usepackage{lipsum}
\usepackage{addlines}
\begin{document}
\lipsum[1-5]
\emph{Here is the command used correctly on an even page.}
\addlines
\lipsum[6-15]
\emph{Here is the command used erroneously on an odd page.}
\addlines
\lipsum[16-20]
\end{document}