Multicols:右列中不需要的垂直空间

Multicols:右列中不需要的垂直空间

当多列环境中的小段落放在页面末尾时,就会出现此问题。我制作了以下 MWE,但这个问题在较长的文档中有时更为明显:

\documentclass[letterpaper]{article}
\usepackage{multicol}\usepackage{biblatex}\usepackage{lipsum}
\usepackage{filecontents}

\begin{filecontents}{\jobname.bib}
@Thesis{biblioEntry,
Title                    = {Sed interdum libero ut metus. Pellentesque placerat. Nam rutrum augue a leo. Morbi sed elit sit amet ante lobortis sollicitudin. Sed interdum libero ut metus. Pellentesque placerat. Nam rutrum augue a leo Sed interdum libero Sed interdum libero Sed interdum libero},
Author                   = {Sed interdum libero},
Location                 = {Sed interdum libero},
Year                     = {1999},
}
\end{filecontents}

\addbibresource{\jobname.bib}

\begin{document} 
\section{Section}
\lipsum[1-3]
\fullcite{biblioEntry}
\section{Section}
\begin{multicols}{2}
Sed interdum libero ut metus. Pellentesque placerat. Nam rutrum augue a leo. Morbi sed elit sit amet ante lobortis sollicitudin. Praesent blandit blandit mauris. Praesent lectus tellus, aliquet aliquam, luctus a, egestas a, turpis.  Mauris lacinia lorem sit amet ipsum.

Sed interdum libero ut metus. Pellentesque placerat. Nam rutrum augue a leo. Morbi sed elit sit amet ante lobortis sollicitudin. Praesent blandit blandit mauris. Praesent lectus tellus, aliquet aliquam, luctus a, egestas a, turpis.  Mauris lacinia lorem sit amet ipsum.

\lipsum[1]

\end{multicols}
\end{document}  

显示页面末尾不平衡列的屏幕截图

实际的 multicols 文档中也出现了同样的问题:

multicols 文档,第 6 页结束

作为一种解决方法,我\setlength{\parskip}{0pt}在 multicol 环境中使用。它有效,但我想知道是否有更好的解决方案。

答案1

出现此问题(正如其他人所说)是因为页面上只剩下 75pt,因此当 multicol 切割列时,它会拆分出该大小的列。但是,默认为\baselineskip12pt,\topskip6 行文本的 10 点等于 70pt,因此在没有拉伸的列中,底部会有 5pt 的间隙,而在只有 的列中,\parskip段落之间会有一个难看的间隙,因为所有这 5 点都在那里。

一般性的修复可能需要更多的技巧,但请尝试一下,看看它总体上能起到多大作用:

\usepackage{multicol}
\usepackage{etoolbox}

\makeatletter
\patchcmd\multi@column@out
{\process@cols}
{%
  \typeout{Requested vsize = \the\dimen@ }%
   \advance\dimen@ -\topskip
   \divide\dimen@ \baselineskip
   \multiply\dimen@ \baselineskip
   \advance\dimen@ \topskip
   \typeout{Reducing vsize to integral number of lines = \the\dimen@ }%
   \process@cols}
{\typeout{Success!}}{\ERROR}
\makeatother  

这应该可以解决问题,不过我想知道如果间隙接近整个基线,是否需要采取不同的措施。所以需要再考虑一下。

无论如何,通过上述内容我得到:

在此处输入图片描述

我认为这就是您正在寻找的。

笔记

正如评论中指出的那样,这会导致整个页面变短(5pt),这是事实,因此与对开页不对齐。但是,这只是因为\raggedbottom使用了(这是文章类中的默认设置)。因此,任何对齐都只是偶然的。因此,如果有人想要上述内容,但页面对齐(有时不仅仅是偶然对齐),那么正确的做法是\flushbottom在序言中使用。

我可以强制让这些页面始终底部对齐,即使\raggedbottom强制这样做也可能会更好,也可能不会更好,但上面的补丁并没有做到这一点。

答案2

添加空格是因为 (La)TeX 试图将列对齐到页面底部(插入\usepackage{showframe}序言即可查看)。为了做到这一点,所有可拉伸的空格都会尽可能/必要地拉伸以实现该目标。在您的示例中,唯一可拉伸的长度是,\parskip并且它只出现在右列中。结果是左列无法对齐,而右列对齐。

如果您想禁用此拉伸,可以\setlength{\parskip}{0pt}像您已经在做的那样使用。这会导致不对齐的列恰好在同一高度结束(因为占用的垂直空间只有\baselineskip可能的倍数)。

另一种方法是将拉伸添加到每个\baselineskip。但请注意, 的\fill“优先级”高于 的拉伸,\parskip因此\parskip不会被拉伸。如果\baselineskips 被拉伸很多,这可能会看起来很难看。您可以将这种方法用于

\addtolength{\baselineskip}{\fill}

另一种可能性是创建一个新的跳过寄存器(\newlength在检查名称是否未使用之后执行的操作)并将其设置为自定义的拉伸值:

\newlength\mybaselinestretch
\mybaselinestretch=0pt plus 0.02pt\relax
\addtolength{\baselineskip}{\mybaselinestretch}

\baselineskip这样,您就可以限制应拉伸的量和\parskip实际拉伸的量。请注意,如果没有其他可用的拉伸,\baselineskip则会根据需要进行拉伸,即使这会导致比指定更多的空间,只要之后的长度plus大于0pt

笔记:

只是为了防止误解:我不建议将可伸缩性添加到\baselineskip全局,而只建议在绝对需要实现合理性的地方添加。总的来说,我认为 Frank Mittelbach 提供的答案比我的更合理,可以更无忧无虑地使用。

相关内容