多列中的微小列表导致列不平衡

多列中的微小列表导致列不平衡

我偶然发现了一个奇怪的效果。请考虑以下两列数字的示例:

\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。不幸的是,我得到了以下不平衡的列: 错误图像 仅当加载xcolortikz包时,并且仅当的 basicstylelstlisting设置为\tiny或时,才会发生此错误\scriptsize。我完全不知道为什么会发生这种情况。

为什么会发生这种情况?我该如何解决?

答案1

嗯,有点棘手。在环境之前和之后lstlisting添加aboveskip和(默认情况下它们大约为 6pt)。现在,由于列表作为多列中的第一个项目开始,因此删除了所有垂直空间,因为在最开始就删除了。但保留了,这意味着我们没有 4 行,而是或多或少有 5 行(最后一行有一些空白)。belowskipaboveskipbelowskip

解决这个问题的一种方法是设置

  \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}

相关内容