当使用不平衡的多列(multicols*
环境)并且页脚包含parbox
换行文本时,页脚会向上移动。有人知道为什么会发生这种情况以及如何避免这种情况发生吗?
梅威瑟:
\documentclass[letterpaper]{article}
\usepackage{lipsum}
\usepackage{multicol}
\usepackage{fancyhdr}
\usepackage[left=22.18mm,top=12.7mm,right=22.18mm,bottom=13.02mm,headsep=4.0mm,headheight=10.70mm,footskip=6.63mm,includeheadfoot=true]{geometry}
\pagestyle{fancy}
\fancyfoot[R]{\parbox[t]{0.4\textwidth}{\raggedleft Long footer text that wraps around to the next line}}
\begin{document}
\section{Footer Normal}
\begin{multicols}{2}
\lipsum
\end{multicols}
\newpage
\section{Footer Moved Up}
\begin{multicols*}{2}
\lipsum
\end{multicols*}
\newpage
\section{Footer Back to Normal}
\lipsum
\end{document}
在我的真实文档中,我有动态的左页脚和右页脚,有时它们足够长而相互碰撞,因此需要parbox
强制换行的解决方案。
答案1
哎哟。看起来这是补丁 pr4395 不久前引入的一个错误。问题是,在组装文本列时,框会被构造和重建,为此我们需要一个与正常页面生成期间使用的\boxmaxdepth
相等的值。\maxdepth
然而,在构建最终页面时(在正常情况下), \boxmaxdepth 不受限制,即\maxdimen
。因此,将列和页脚放在一起使用了 的整个高度\footskip
。
现在,通过将多列设置\boxmaxdepth
为本地设置\maxdepth
,该距离会缩短 :-( 。为什么?因为页脚被定义为“顶部”框,即具有正常高度和较大深度的框。但是,使用\boxmaxdepth
限制时这是不可能的,因此深度会缩短而高度会增加。现在\footskip
分离实际上是一个异常大的基线跳跃,因此如果页脚框的高度很大,基线跳跃就会变小,从而分离也会变小。很棘手。
两种方法都有争议,没有对错之分。问题只是标准 OR 以一种方式进行,而 multicols 的一个分支则以另一种方式进行。
目前,请先加载多列后尝试此操作:
% bug introduced with patch 4395?
\usepackage{etoolbox}
\makeatletter
\patchcmd\multi@column@out{\setbox\@cclv\vbox{\unvbox\partial@page\page@sofar}}
{\boxmaxdepth\maxdimen
\setbox\@cclv\vbox{\unvbox\partial@page\page@sofar}}
{\typeout{Success!!}}{\typeout{Patch failed!!}}
\makeatother
我将在 CTAN 上安装新版本的 multicols(可能是 1.8p 版本),之后该补丁不再需要(尽管它也不会造成任何损害)。
编辑
该软件包的新版本现在应该在 CTAN 上。