我有一份包含三列文本的文档,其中我将图片放置在某些页面的底部。这些图片包含三列项目列表。如下所示:
在第一个要输出的图中,列底部和图形底部之间的空间较小。将第 2 页的图与第 3 页的图进行比较:
显而易见的是,第 2 页上“India”、“Romeo”和“Alfa”与图形底部之间的空间比第 3 页(以及第 4 页,未图示)上的空间要小。
问题似乎出在 multicol 包上。如果仅排版第一列项目而不使用 multicol,间距问题就会消失。但如果可能的话,我想使用 multicol。设置\multicolsep
为 0pt(或其他长度)没有效果。
如何使用 multicol 让这些图形一致地显示,以便项目的最后一行的基线与图形底部的距离始终相同?
我更喜欢像第 2 页图片中那样较短的距离。
(删除\strut
in\newcommand\blockitem[1]{\par#1\strut}
会产生一点外观上的变化,但问题仍然存在,并且仍然需要使每行项目的基线对齐。)
梅威瑟:
\documentclass{article}
\usepackage{geometry}
\usepackage{multicol}
\usepackage{lipsum}
\geometry{b4paper}
\newcommand\blockitem[1]{\par#1\strut}
\newsavebox{\demobox}
\newenvironment{blocklist}
{\begin{figure*}[!b]
\begin{lrbox}{\demobox}\begin{minipage}[b][][b]{\textwidth}
\begin{multicols}{3}
}
{\end{multicols}
\end{minipage}\end{lrbox}\fbox{\usebox{\demobox}}
\end{figure*}
}
\begin{document}
\begin{multicols}{3}
\lipsum[1-8]
\begin{blocklist}
\blockitem{Alfa} \blockitem{Bravo} \blockitem{Charlie} \blockitem{Delta} \blockitem{Echo} \blockitem{Foxtrot} \blockitem{Golf} \blockitem{Hotel} \blockitem{India} \blockitem{Juliett} \blockitem{Kilo} \blockitem{Lima} \blockitem{Mike} \blockitem{November} \blockitem{Oscar} \blockitem{Papa} \blockitem{Quebec} \blockitem{Romeo} \blockitem{Sierra} \blockitem{Tango} \blockitem{Uniform} \blockitem{Victor} \blockitem{Whiskey} \blockitem{X-ray} \blockitem{Yankee} \blockitem{Zulu} \blockitem{Alfa}
\end{blocklist}
\lipsum[1-8]
\begin{blocklist}
\blockitem{Alfa} \blockitem{Bravo} \blockitem{Charlie} \blockitem{Delta} \blockitem{Echo} \blockitem{Foxtrot} \blockitem{Golf} \blockitem{Hotel} \blockitem{India} \blockitem{Juliett} \blockitem{Kilo} \blockitem{Lima} \blockitem{Mike} \blockitem{November} \blockitem{Oscar} \blockitem{Papa} \blockitem{Quebec} \blockitem{Romeo} \blockitem{Sierra} \blockitem{Tango} \blockitem{Uniform} \blockitem{Victor} \blockitem{Whiskey} \blockitem{X-ray} \blockitem{Yankee} \blockitem{Zulu} \blockitem{Alfa}
\end{blocklist}
\lipsum[1-8]
\begin{blocklist}
\blockitem{Alfa} \blockitem{Bravo} \blockitem{Charlie} \blockitem{Delta} \blockitem{Echo} \blockitem{Foxtrot} \blockitem{Golf} \blockitem{Hotel} \blockitem{India} \blockitem{Juliett} \blockitem{Kilo} \blockitem{Lima} \blockitem{Mike} \blockitem{November} \blockitem{Oscar} \blockitem{Papa} \blockitem{Quebec} \blockitem{Romeo} \blockitem{Sierra} \blockitem{Tango} \blockitem{Uniform} \blockitem{Victor} \blockitem{Whiskey} \blockitem{X-ray} \blockitem{Yankee} \blockitem{Zulu} \blockitem{Alfa}
\end{blocklist}
\lipsum[1-8]
\end{multicols}
\end{document}
答案1
您之所以看到这种行为,是因为您在运行中编写了保存框并将其作为底部图形插入。multicols
在输出例程有机会工作之前,您将两个或更多环境插入到底部图形中,我认为这会触发一个错误multicol
(尽管不可否认这是一个极端情况)。
事情是这样的:
首次multicols
组成环境时,列被正确拆分。然后将其作为插入figure*
,并作为该过程的一部分@addtobot
被调用。该例程的一个副作用是\maxdepth
全局设置为零。
如果随后输出页面,这将被重置,并且没有问题。但是,如果multicols
在此之前将另一个环境插入到图形列表中,则将multicol
使用该 0 值\maxdepth
。这意味着它错误地拆分了列并占用了太少的文本,导致最后一行过长。然后,它被迫尝试通过多次尝试来平衡列,并且当它成功时,最终结果是列高比底线的实际深度大(在您的情况下,.3\baselineheight
由于支柱)。
解决此问题的一种方法是预先组合您的保存框。另一种可能性(在下面的解决方案中使用)是进行修补,multicol
以便平衡例程使用正确的值\maxdepth
。
\documentclass{article}
\usepackage{geometry}
\usepackage{multicol}
\usepackage{lipsum}
\usepackage{xpatch}
\geometry{b4paper}
\makeatletter
\xpatchcmd{\balance@columns}{\splitmaxdepth\maxdepth}{\splitmaxdepth\@maxdepth}
{\typeout{balance@columns patch 1 succeeded}}
{\typeout{balance@columns patch 1 failed}}
\xpatchcmd{\balance@columns}{\boxmaxdepth\maxdepth}{\boxmaxdepth\@maxdepth}
{\typeout{balance@columns patch 2 succeeded}}
{\typeout{balance@columns patch 2 failed}}
\makeatother
\newcommand\blockitem[1]{\par#1\strut}
\newsavebox{\demobox}
\newenvironment{blocklist}{%
\begin{lrbox}{\demobox}
\begin{minipage}[b]{\textwidth}
\begin{multicols}{3}}{%
\end{multicols}
\end{minipage}
\end{lrbox}%
\begin{figure*}[!b]
\fbox{\usebox{\demobox}}
\end{figure*}
}
\begin{document}
\begin{multicols}{3}
\lipsum[1-8]
\begin{blocklist}
\blockitem{Alfa} \blockitem{Bravo} \blockitem{Charlie} \blockitem{Delta} \blockitem{Echo} \blockitem{Foxtrot} \blockitem{Golf} \blockitem{Hotel} \blockitem{India} \blockitem{Juliet} \blockitem{Kilo} \blockitem{Lima} \blockitem{Mike} \blockitem{November} \blockitem{Oscar} \blockitem{Papa} \blockitem{Quebec} \blockitem{Romeo} \blockitem{Sierra} \blockitem{Tango} \blockitem{Uniform} \blockitem{Victor} \blockitem{Whiskey} \blockitem{X-ray} \blockitem{Yankee} \blockitem{Zulu} \blockitem{Alfa}
\end{blocklist}
\lipsum[1-8]
\begin{blocklist}
\blockitem{Alfa} \blockitem{Bravo} \blockitem{Charlie} \blockitem{Delta} \blockitem{Echo} \blockitem{Foxtrot} \blockitem{Golf} \blockitem{Hotel} \blockitem{India} \blockitem{Juliet} \blockitem{Kilo} \blockitem{Lima} \blockitem{Mike} \blockitem{November} \blockitem{Oscar} \blockitem{Papa} \blockitem{Quebec} \blockitem{Romeo} \blockitem{Sierra} \blockitem{Tango} \blockitem{Uniform} \blockitem{Victor} \blockitem{Whiskey} \blockitem{X-ray} \blockitem{Yankee} \blockitem{Zulu} \blockitem{Alfa}
\end{blocklist}
\lipsum[1-8]
\begin{blocklist}
\blockitem{Alfa} \blockitem{Bravo} \blockitem{Charlie} \blockitem{Delta} \blockitem{Echo} \blockitem{Foxtrot} \blockitem{Golf} \blockitem{Hotel} \blockitem{India} \blockitem{Juliet} \blockitem{Kilo} \blockitem{Lima} \blockitem{Mike} \blockitem{November} \blockitem{Oscar} \blockitem{Papa} \blockitem{Quebec} \blockitem{Romeo} \blockitem{Sierra} \blockitem{Tango} \blockitem{Uniform} \blockitem{Victor} \blockitem{Whiskey} \blockitem{X-ray} \blockitem{Yankee} \blockitem{Zulu} \blockitem{Alfa}
\end{blocklist}
\lipsum[1-8]
\end{multicols}
\end{document}