![多列中的微小列表导致列不平衡](https://linux22.com/image/366219/%E5%A4%9A%E5%88%97%E4%B8%AD%E7%9A%84%E5%BE%AE%E5%B0%8F%E5%88%97%E8%A1%A8%E5%AF%BC%E8%87%B4%E5%88%97%E4%B8%8D%E5%B9%B3%E8%A1%A1.png)
我偶然发现了一个奇怪的效果。请考虑以下两列数字的示例:
\documentclass{article}
\usepackage{xcolor}
\usepackage{tikz}
\usepackage{multicol}
\usepackage{listings}
\begin{document}
\begin{multicols}{2}
\begin{lstlisting}[basicstyle=\tiny]
1
2
3
4
\end{lstlisting}
\end{multicols}
\end{document}
我希望这会产生两列具有相同行数的列。第一列应包含 1 和 2,第二列应包含 3 和 4。不幸的是,我得到了以下不平衡的列:
仅当加载
xcolor
或tikz
包时,并且仅当的 basicstylelstlisting
设置为\tiny
或时,才会发生此错误\scriptsize
。我完全不知道为什么会发生这种情况。
为什么会发生这种情况?我该如何解决?
答案1
嗯,有点棘手。在环境之前和之后lstlisting
添加aboveskip
和(默认情况下它们大约为 6pt)。现在,由于列表作为多列中的第一个项目开始,因此删除了所有垂直空间,因为在最开始就删除了。但保留了,这意味着我们没有 4 行,而是或多或少有 5 行(最后一行有一些空白)。belowskip
aboveskip
belowskip
解决这个问题的一种方法是设置
\begin{lstlisting}[basicstyle=\tiny,belowskip=0pt]
出于相同的原因,使用的multicols=2
作品,因为现在跳过是添加到 multicol 之外,而不是内部。
我可能应该补充一点,multicols
通常还会删除最后一列末尾的垂直空间,以确保平衡效果良好。然而,belowskip
添加的空间lstlisting
实际上是隐藏的,因为它后面跟着 a) 额外的 0pt 跳过和 b) 颜色变化,即我们在那里看到的
.\penalty -50
.\glue 6.0 plus 2.0 minus 2.0 % <-- that's belowskip
.\glue 0.0
.\pdfcolorstack 0 pop
因此 multicol 没有机会将其移除。我认为这可以视为一个错误,因为listings
这样的空间应该可以从外部访问,例如,它应该能够与之交互,\addvspace
而这也由于 colorstack 命令而无法实现。
也许这应该引起列表维护者的注意。
答案2
加载包后multicol
,可将其用于排版多列列表。这些使用以下multicols
键指定:
\documentclass{article}
\usepackage{xcolor}
\usepackage{tikz}
\usepackage{multicol}
\usepackage{listings}
\begin{document}
\begin{lstlisting}[multicols=2,basicstyle=\tiny]
1
2
3
4
\end{lstlisting}
\end{document}