我确信我不是第一个遇到这个问题的人,但我找不到任何其他问题能够以对我有用的方式来回答这个问题。
如果空间足够,我想在同一列中插入一个节标题,如果空间不够,则将其踢到下一列;我通过在适当的位置设置惩罚项成功实现了这一点。但是,当需要分栏时,我想填充前一列,这样\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
。你可以在示例的第二页上很好地看到这一点,现在如下所示:
也就是说,表现非常好。