`multicol`:根据剩余列空间强制分列

`multicol`:根据剩余列空间强制分列

我确信我不是第一个遇到这个问题的人,但我找不到任何其他问题能够以对我有用的方式来回答这个问题。

如果空间足够,我想在同一列中插入一个节标题,如果空间不够,则将其踢到下一列;我通过在适当的位置设置惩罚项成功实现了这一点。但是,当需要分栏时,我想填充前一列,这样\parskip就不会疯狂地延伸。

无法翻转\parskip整个文档,或者各列不平衡。

梅威瑟:

\documentclass[letterpaper]{article}
\usepackage{multicol}

\makeatletter
\def\articulus{%
    \vskip 3em plus 0.75em minus 0.25em%
    \centerline{\Large\textsc{Articulus }}%
    \penalty10000\vskip 3em plus 0.75em minus 0.25em%
    \normalsize\@afterindentfalse\@afterheading%
}%
\makeatother

\def\text{Now is the time for all good men to come to the
aid of their party.}

\begin{document}
\begin{multicols}{2}
\text\text\text\text\text\text\text\text\text\text

\text\text\text\text\text\text\text\text\text
\text\text\text
\articulus{}
\text\text\text\text\text\text\text\text\text
\text\text\text\text\text\text\text\text\text
\text\text\text\text\text\text\text\text\text
\text\text\text\text\text\text\text\text\text
\text\text\text\text\text\text\text\text\text
\end{multicols}
\end{document}

如果必须在此处进行分页,我想垂直填充该列的剩余部分。这可能吗?如果不行,有没有更好的方法来安排?

答案1

您可能正在寻找类似的东西,对吗?

在此处输入图片描述

如果是的话,代码如下:

\documentclass[letterpaper]{article}
\usepackage{multicol}

\makeatletter
\def\articulus{%
    \vfil \vskip-\prevdepth \nointerlineskip\null 
     \penalty 200  \vfilneg
     \vskip 3em plus 0.75em minus 0.25em%
    \centerline{\Large\textsc{Articulus }}%
    \penalty10000\vskip 3em plus 0.75em minus 0.25em%
    \normalsize\@afterindentfalse\@afterheading%
}%
\makeatother

\def\text{Now is the time for all good men to come to the
aid of their party. }

\begin{document}
\begin{multicols}{2}
\text\text\text\text\text\text\text\text\text\text

\articulus{}

\text\text\text\text\text\text\text\text\text
\text\text

\articulus{}
\text\text\text\text\text\text\text\text\text
\text\text\text\text\text\text\text\text\text

\text\text\text\text\text\text\text\text\text

\text\text\text\text\text\text\text\text\text
\articulus{}
\text\text\text\text\text

\text\text\text\text
\end{multicols}
\end{document}

解释:此代码可实现此目的:

   \vfil 
     \vskip-\prevdepth \nointerlineskip\null 
   \penalty 200  \vfilneg

的组合\vfil \penalty <number> \vfilneg是 TeXbook 中已经解释过的一个技巧。这意味着如果惩罚处有一个中断,则填充上面的空间,否则取消空间。在我们的例子中,使用正惩罚,因为,否则这可能会被视为结束所有列的多列收集阶段的最佳位置,因为可以\vfil任意拉伸(这让我最初有点困惑)。事实上,出于这个原因,在这里使用有限的拉伸和收缩可能会更好。

有趣的额外内容是中间的一行。 multicol 的最新版本正确地删除了列底部的空格(例如列表后的空格等),因此如果在惩罚处中断,列生成时会\vfil删除。为了避免这种情况,我添加了\null缩写,\hbox{}但这通常会添加一个基线跳过,这不是我们想要的,因此\nointerlineskip。但这意味着我们失去了我们的\prefdepth,因此我们首先备份,以便我们实际上位于上一行的基线。

事实上,这确实是我们想要的,因为如果我们在最后一页进行平衡,并且在惩罚处休息一下,那么之前的行很可能是该列的最后一行,而不需要拉伸,然后(由于等于零,\vfil列不会对齐\prevdepth。你可以在示例的第二页上很好地看到这一点,现在如下所示:

在此处输入图片描述

也就是说,表现非常好。

相关内容