在多列中枚举如何将最后一个元素向上移动

在多列中枚举如何将最后一个元素向上移动

代码:

\documentclass{article}
\usepackage[a5paper]{geometry}
\usepackage{multicol}
\setlength{\parindent}{0cm}
\begin{document}
\begin{multicols}{2}
  \begin{enumerate}
  \item text 1
  \item text 2
  \item text 3
  \item text 4
  \item text 5
  \end{enumerate}
\end{multicols}
\end{document}

给出这个:

在此处输入图片描述

如何将“文本 5”向上移动到“文本 4”旁边?

答案1

使用\raggedcolumns命令。根据 David Carlisle 在聊天中的建议,我添加了一个命令来调整enumerate环境后的间距。我不确定这是如何工作的,也不知道为什么会出现这个问题。

\documentclass{article}
\usepackage[a5paper]{geometry}
\usepackage{multicol}
\setlength{\parindent}{0cm}
\newcommand{\fixspacing}{\vspace{0pt plus 1filll}\mbox{}}
\begin{document}
\raggedcolumns
\begin{multicols}{2}
  \begin{enumerate}
  \item text 1
  \item text 2
  \item text 3
  \item text 4
  \item text 5
  \end{enumerate}
  \fixspacing
\end{multicols}
\end{document}

代码输出

答案2

环境的正常行为multicols是平衡列,使它们都具有(大致)相等的垂直长度。如果列包含垂直可拉伸空间(如示例中所示),multicols则将使用此拉伸或收缩组件作为平衡过程的一部分。特别是在最后一列中,这可能会导致一些可见的孔洞,只要结果在技术上仍在指定的“不良程度”范围内。

另一个答案中建议的修复方法(由 David 和 Alan 提出)在最后一列的末尾添加了强垂直可拉伸空间,因此其他空间不会扩大。

实际上,还有一种不同的(可能更简单的)方法可以得到相同的结果:multicols有一个参数\finalcolumnbadness决定最后一列是否垂直对齐或设置为其自然高度。这个想法是,如果最后一列会得到“坏”>,\finalcolumnbadness那么对齐将被放弃,并将该列设置为其自然高度(即,建议的修复实际上是在内部应用的)。因此,只需将此参数设置为合适的值,例如

 \setcounter{finalcolumnbadness}{1000}

\fixspacing将实现与其他答案相同的效果。

但是,如果仔细观察,两者都没有给出正确的结果,的位置比第一列text 5略低。(我添加了一些规则以使其更明显):text 2

在此处输入图片描述

那么为什么会这样呢?

我们必须思考如何multicols平衡它:

  • 它首先根据要平衡的材料计算最小柱高(实际上,它开始时要低一些)。
  • 然后,它会切断所有达到该高度的列(最后一列除外)。
  • 然后它查看剩余材料的高度。如果它小于其他列的高度 - 很好。
  • 如果不行,那就看看是否有可能将材料挤压到所需的柱高。如果这样做有效,并且结果不太“糟糕”(见\finalcolumnbadness上文),则试验被认为是成功的。还进行了一些其他测试,但对于本讨论的目的而言,它们并不重要。
  • 如果试验失败,则multicols开始另一次试验,这次试验高度增加 1pt。最终将取得试验成功。

那么这种方法有什么问题呢?

问题是,当第一列包含一些可拉伸或可收缩的空间时(在我们的例子中确实如此),很有可能找到一个解决方案,其中第一列是不是设置为其自然高度,但略微压缩或拉伸。但是,使用 aboce fix 将设置最后一列为其自然高度,因此基线不会位于相同的位置。

现在能做些什么来解决这个问题吗?

如果你仔细想想,通常不会,除非你设计出一种非常复杂的算法,该算法会查看所有列及其不良程度,并将这些值作为成功/失败的一部分。但即便如此,你也可以很容易地想出导致问题或根本没有解决方案的例子。

但有些事情是可以做的,在很多情况下会有所帮助,这在下面的补丁中实现。

答案很简单:

  • 以列高为倍数(或者更确切地说是第一行的\baselineskip倍数)开始试验;情况已经如此,因此这里无需进行任何更改。\topskip

  • 但随后增加的不是点而是\baselineskip

这样可以提高(但不能保证)列按其自然高度排版的可能性。此代码如下所示:

\makeatletter
\newcommand\balanceincrement{\baselineskip}

\edef\reset@newlinechar{\newlinechar\the\newlinechar}\newlinechar-1 % hack needed for patching \balance@columns

\patchcmd{\balance@columns}{\advance\@tempdima\dp\mult@box}{}{\typeout{Success}}{\typeout{Fail!!}}
\patchcmd{\balance@columns}{\advance\dimen@-\p@}{\advance\dimen@-\balanceincrement\relax}{\typeout{Success}}{\typeout{Fail!!}}
\patchcmd{\balance@columns}{\advance\dimen@\p@}{\advance\dimen@\balanceincrement\relax}{\typeout{Success}}{\typeout{Fail!!}}

\reset@newlinechar
\makeatother

如果我们将其应用到示例中,我们得到:

在此处输入图片描述

这更符合预期。这对那些尝试使用基于网格的排版的人来说也有很​​大帮助,因为现在 a 的结果multicols在高度上是可预测的。

如果我们想要一个不同的增量(或者恢复旧的行为),那么

\renewcommand\balanceincrement{1pt}

就可以了。

答案3

只需添加一个\item不带文本的额外内容即可。对我来说,这个方法有效。

相关内容