图形内部多列后的间距不一致

图形内部多列后的间距不一致

我有一份包含三列文本的文档,其中我将图片放置在某些页面的底部。这些图片包含三列项目列表。如下所示:

在此处输入图片描述

在第一个要输出的图中,列底部和图形底部之间的空间较小。将第 2 页的图与第 3 页的图进行比较:

在此处输入图片描述

显而易见的是,第 2 页上“India”、“Romeo”和“Alfa”与图形底部之间的空间比第 3 页(以及第 4 页,未图示)上的空间要小。

问题似乎出在 multicol 包上。如果仅排版第一列项目而不使用 multicol,间距问题就会消失。但如果可能的话,我想使用 multicol。设置\multicolsep为 0pt(或其他长度)没有效果。

如何使用 multicol 让这些图形一致地显示,以便项目的最后一行的基线与图形底部的距离始终相同?

我更喜欢像第 2 页图片中那样较短的距离。

(删除\strutin\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}

相关内容