![Multicols:右列中不需要的垂直空间](https://linux22.com/image/366668/Multicols%EF%BC%9A%E5%8F%B3%E5%88%97%E4%B8%AD%E4%B8%8D%E9%9C%80%E8%A6%81%E7%9A%84%E5%9E%82%E7%9B%B4%E7%A9%BA%E9%97%B4.png)
当多列环境中的小段落放在页面末尾时,就会出现此问题。我制作了以下 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 文档中也出现了同样的问题:
作为一种解决方法,我\setlength{\parskip}{0pt}
在 multicol 环境中使用。它有效,但我想知道是否有更好的解决方案。
答案1
出现此问题(正如其他人所说)是因为页面上只剩下 75pt,因此当 multicol 切割列时,它会拆分出该大小的列。但是,默认为\baselineskip
12pt,\topskip
6 行文本的 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
不会被拉伸。如果\baselineskip
s 被拉伸很多,这可能会看起来很难看。您可以将这种方法用于
\addtolength{\baselineskip}{\fill}
另一种可能性是创建一个新的跳过寄存器(\newlength
在检查名称是否未使用之后执行的操作)并将其设置为自定义的拉伸值:
\newlength\mybaselinestretch
\mybaselinestretch=0pt plus 0.02pt\relax
\addtolength{\baselineskip}{\mybaselinestretch}
\baselineskip
这样,您就可以限制应拉伸的量和\parskip
实际拉伸的量。请注意,如果没有其他可用的拉伸,\baselineskip
则会根据需要进行拉伸,即使这会导致比指定更多的空间,只要之后的长度plus
大于0pt
。
笔记:
只是为了防止误解:我不建议将可伸缩性添加到\baselineskip
全局,而只建议在绝对需要实现合理性的地方添加。总的来说,我认为 Frank Mittelbach 提供的答案比我的更合理,可以更无忧无虑地使用。