防止书中出现孤行和孤行,保持对开页的长度相同

防止书中出现孤行和孤行,保持对开页的长度相同

我班上有一份文档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 的要求:

  1. 段落之间不可拉伸的胶水(参见什么是胶水拉伸?。) , IE,\parskip=0pt

  2. 某些页面(4、6、8......)必须有 4-8 pt 的额外空白,即\medskip

  3. \baselineskip避免出现孤行/孤行(即在任何一页中 有相等的额外空白空间)。

  4. 保持每页的文本长度相同。

简短回答:同时想要一切和其对立面是没有意义的!

我无法像专家一样剖析这一矛盾,但我们可以分部分来看,正如开膛手杰克所说:

  • 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.7pt0.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。代价是段落之间的距离有时会出现难看的差异。

评论:因此,最好的解决办法就是不限制\parskip0pt

(恕我直言,当然......)

这种间距增加了段落的可读性(即使有缩进),但要坚持问题,总体上保持一致的底部边距。我的建议是将这些肮脏的技巧留作或\enlargethispage用于\looseness最终草稿中的紧急情况。在许多情况下,良好的microtype设置可能可以阻止使用这些命令。

此外,它可以帮助设置普通字体(在此 MWE 中为 13.6pt)的 \baselineskip` 的倍数,因此如果页面填充了最大行数\textheight\topskip则不需要粘合。

但是,由于美德通常是两个极端之间的最佳平衡点,因此您可能希望允许寡妇/孤儿惩罚,保持\medskip原样,插入另一个垂直元素,此外,段落之间还有类似的小跳跃。这可以通过在 \parskip 中只允许一点拉伸/收缩粘连来实现,这样每页 3-6 个段落的粘连总和就足以几乎完美地填充空白空间10pt,例如:

\setlength{\parskip}{3pt plus 3pt  minus 1pt}

只需尝试其他值,直到找到最适合您的文档的结果(或出于其他原因更简单、更好,留给parskip包装做的工作)。

如果您发现段落之间的最小间距确实很糟糕,那么还有另一种方法可以添加足够的“垂直胶水”:保留\parskip0pt 或作为橡胶长度,但\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}

相关内容