防止 multicol 环境下由 wrapfigure 导致的空白区域

防止 multicol 环境下由 wrapfigure 导致的空白区域

wrapfigure我在环境中使用multicol将文本环绕在 tikz 图形周围。然而,这会在第二列(之后\columbreak)创建一个不需要的空白区域。我该如何防止这种情况发生?

以下 MWE

\documentclass[a4paper]{article}
\usepackage{tikz,multicol,wrapfig,lipsum}
\usetikzlibrary{graphs,graphs.standard}
\begin{document}
\begin{multicols}{2}
    \begin{wrapfigure}{l}{0pt}
        \tikz \graph [nodes={circle,draw}] {
            subgraph C_n [n=3, counterclockwise]
        };
    \end{wrapfigure}
    \lipsum[1-2]

    \columnbreak

    \lipsum[3-4]
\end{multicols}
\end{document}

生成以下输出: MWE 输出

我必须使用multicol环境,因为两列之前和之后都会有文本。

打印的文件列表\listfiles

 *File List*
 article.cls    2014/09/29 v1.4h Standard LaTeX document class
  size10.clo    2014/09/29 v1.4h Standard LaTeX file (size option)
    tikz.sty    2015/08/07 v3.0.1a (rcs-revision 1.151)
     pgf.sty    2015/08/07 v3.0.1a (rcs-revision 1.15)
  pgfrcs.sty    2015/08/07 v3.0.1a (rcs-revision 1.31)
everyshi.sty    2001/05/15 v3.00 EveryShipout Package (MS)
  pgfrcs.code.tex
 pgfcore.sty    2010/04/11 v3.0.1a (rcs-revision 1.7)
graphicx.sty    2017/06/01 v1.1a Enhanced LaTeX Graphics (DPC,SPQR)
  keyval.sty    2014/10/28 v1.15 key=value parser (DPC)
graphics.sty    2017/06/25 v1.2c Standard LaTeX Graphics (DPC,SPQR)
    trig.sty    2016/01/03 v1.10 sin cos tan (DPC)
graphics.cfg    2016/06/04 v1.11 sample graphics configuration
  pdftex.def    2018/01/08 v1.0l Graphics/color driver for pdftex
  pgfsys.sty    2014/07/09 v3.0.1a (rcs-revision 1.48)
  pgfsys.code.tex
pgfsyssoftpath.code.tex    2013/09/09  (rcs-revision 1.9)
pgfsysprotocol.code.tex    2006/10/16  (rcs-revision 1.4)
  xcolor.sty    2016/05/11 v2.12 LaTeX color extensions (UK)
   color.cfg    2016/01/02 v1.6 sample color configuration
 pgfcore.code.tex
pgfcomp-version-0-65.sty    2007/07/03 v3.0.1a (rcs-revision 1.7)
pgfcomp-version-1-18.sty    2007/07/23 v3.0.1a (rcs-revision 1.1)
  pgffor.sty    2013/12/13 v3.0.1a (rcs-revision 1.25)
 pgfkeys.sty    
 pgfkeys.code.tex
 pgfmath.sty    
 pgfmath.code.tex
  pgffor.code.tex
    tikz.code.tex
multicol.sty    2018/04/20 v1.8s multicolumn formatting (FMi)
 wrapfig.sty    2003/01/31  v 3.6
  lipsum.sty    2018/11/24 v2.1a 150 paragraphs of Lorem Ipsum dummy text
   expl3.sty    2018-11-19 L3 programming layer (loader) 
expl3-code.tex    2018-11-19 L3 programming layer 
l3pdfmode.def    2018-11-19 v L3 Experimental driver: PDF mode
  xparse.sty    2018-10-17 L3 Experimental document command parser
supp-pdf.mkii
epstopdf-base.sty    2016/05/15 v2.6 Base part for package epstopdf
infwarerr.sty    2016/05/16 v1.4 Providing info/warning/error messages (HO)
  grfext.sty    2016/05/16 v1.2 Manage graphics extensions (HO)
kvdefinekeys.sty    2016/05/16 v1.4 Define keys (HO)
 ltxcmds.sty    2016/05/16 v1.23 LaTeX kernel commands for general use (HO)
kvoptions.sty    2016/05/16 v3.12 Key value format for package options (HO)
kvsetkeys.sty    2016/05/16 v1.17 Key value parser (HO)
etexcmds.sty    2016/05/16 v1.6 Avoid name clashes with e-TeX commands (HO)
ifluatex.sty    2016/05/16 v1.4 Provides the ifluatex switch (HO)
pdftexcmds.sty    2018/09/10 v0.29 Utility functions of pdfTeX for LuaTeX (HO)
   ifpdf.sty    2018/09/07 v3.3 Provides the ifpdf switch
epstopdf-sys.cfg    2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Live
 ***********

Ubuntu 上的 TeX Live 2017 与 Arch 上的 2018 之间的差异文件列表:

32c32
< multicol.sty    2017/04/11 v1.8q multicolumn formatting (FMi)
---
> multicol.sty    2018/04/20 v1.8s multicolumn formatting (FMi)
34c34,38
<   lipsum.sty    2014/07/27 v1.3 150 paragraphs of Lorem Ipsum dummy text
---
>   lipsum.sty    2018/11/24 v2.1a 150 paragraphs of Lorem Ipsum dummy text
>    expl3.sty    2018-11-19 L3 programming layer (loader) 
> expl3-code.tex    2018-11-19 L3 programming layer 
> l3pdfmode.def    2018-11-19 v L3 Experimental driver: PDF mode
>   xparse.sty    2018-10-17 L3 Experimental document command parser
45,46c49,50
< pdftexcmds.sty    2018/01/21 v0.26 Utility functions of pdfTeX for LuaTeX (HO)
<    ifpdf.sty    2017/03/15 v3.2 Provides the ifpdf switch
---
> pdftexcmds.sty    2018/09/10 v0.29 Utility functions of pdfTeX for LuaTeX (HO)
>    ifpdf.sty    2018/09/07 v3.3 Provides the ifpdf switch

可能是 multicol 包中存在错误?


以下 MWE 将使用更新的包产生类似的结果:

\documentclass[a4paper]{article}
\usepackage{tikz,multicol,wrapfig,lipsum}
\usetikzlibrary{graphs,graphs.standard}
\begin{document}
\begin{multicols}{2}
    \begin{wrapfigure}{l}{0pt}
        \tikz \graph [nodes={circle,draw}] {
            subgraph C_n [n=3, counterclockwise]
        };
    \end{wrapfigure}
    Some Text

    \columnbreak

    \lipsum[3-4]
\end{multicols}
\end{document}

微波辐射计

它还会打印 3 条Underfull \hbox警告,所以我不知道这是否真的是一个问题,或者我只是编写了无效的代码。

然而,更改\lipsum[3-4]\lipsum[3] \lipsum[4]会使警告消失并且还会删除空白矩形。

\documentclass[a4paper]{article}
\usepackage{tikz,multicol,wrapfig,lipsum}
\usetikzlibrary{graphs,graphs.standard}
\begin{document}
\begin{multicols}{2}
    \begin{wrapfigure}{l}{0pt}
        \tikz \graph [nodes={circle,draw}] {
            subgraph C_n [n=3, counterclockwise]
        };
    \end{wrapfigure}
    Some Text

    \columnbreak

    \lipsum[3]
    \lipsum[4]
\end{multicols}
\end{document}

MWE2 已修复

答案1

wrapfig 的作用是设置一个特殊的 parshape,理论上,该 parshape 应该在段落设置后取消。

通常,这是通过在 \everypar 中设置激活它来完成的,然后在调用时 \everypar 会自行重置。但如果该调用发生在组内,则在组结束时,旧的 \everypar 会恢复,您将获得两次操作。

如果某个部分后面直接跟着一个列表,则在标准 LaTeX 中也会发生同样的情况。该部分使用上述机制强制在其后添加 2 行文本。但由于该文本位于环境内,因此一旦列表结束,设置就会重复(您会再次看到 clubpenalty 10000)。

在您的 MWE 中可以看到,它在第三段突然再次活跃,这意味着它在 \lipsum[3-4] 处再次活跃。这让我怀疑 \lipsum[1-2] 使用了这样的组,因此在其末尾重新安装了 wrapfig 内容。

lipsum 最近重新实施,在此过程中经过多次更改/修复。使用当前设置(包含 lipsum 2.2 和 multicol 1.8v),一切运行正常。查看您的 \listfiles 输出,您显然拥有较旧的软件包版本(在几种情况下),因此您的系统绝不是“最新的”。

也许使用最新的 lipsum 就足够了,但总的来说,我的建议是更新所有设置,然后重试。

并且不...相当确定这不是多色问题。

更新(关于最近添加的额外 MWE)

实际情况是,您在“Some tex”之后直接明确要求分栏。现在这些词显然不足以围绕您的图片流动,这意味着您实际上已经要求 wrapfig 跨栏/分页符换行,如果您这样做,那么空洞或空洞的一部分可能会出现在下一页/列上(而您的图形显然没有被分割)

您可以使用双列模式和 \pagebreak 而不是 \columnbreak 获得完全相同的结果(没有多列),所以这并不奇怪。

至于最后一个例子没有显示第二列中的漏洞:这与 lipsum 的实施方式有关,如果你愿意的话,这是一个缺陷(添加最后一段额外的段落,你的漏洞就会再次出现)。wrapfig 文档提到了一些关于在列表环境附近使用的限制,这是一个类似性质的问题。

相关内容