将图形放置在双栏文档中

将图形放置在双栏文档中

我尝试通过两种不同的方式获取文档中的图像:

  1. 位于整个页面顶部,居中
  2. 位于单列顶部

我尝试了双列和多列。我排除了双列,因为每次打开它时都会强制打开一个新页面,因为我需要摘要足够宽,封面页的其余部分需要两列。

以下是这两点的一些示例(从下载的 PDF 中截取的屏幕截图): 下载的 PDF 的屏幕截图

我想实现这两个目标,但不知何故,我只能通过以下方式解决第一点:

\end{multicols}

\begin{figure}
  \centering
    \includegraphics[width=0.5\textwidth]{figure}
  \caption{Dataflow pipeline of the edge detector}
  \label{fig:workflowedge}
\end{figure}

\begin{multicols}{2}

关闭多列然后重新打开会很尴尬吗?

对于我的第二点,我已经尝试了所有方法,但几乎总是,图像根本不显示!我唯一能让它显示的方法是指定位置说明H符,但这会将图像放置在我定义它的文本内,而不是列的顶部。

这是我最好的尝试,但它隐藏了图像并破坏了对以下的所有引用??

\begin{figure}[t!]
  \centering
    \includegraphics[width=0.25\textwidth]{figure}
  \caption{Dataflow pipeline of the edge detector}
  \label{fig:workflowedge}
\end{figure}

我收到警告:

Package multicol Warning: Floats and marginpars not allowed inside `multicols' environment!.

我怎样才能使图形不浮动?

我也尝试了figure*环境,但它只是在页面顶部居中创建一个图像,就像我的第一点一样。

答案1

multicol环境并非为支持列浮动而设计的。平衡的概念使得在一般情况下几乎不可能自动提供正确的结果,因此我决定不在multicol2e 中朝这个方向扩展。

例如,multicol您可以在页面中间更改列数,这应该如何反映在浮动位置上,因为 TeX 无法重新分解段落以使其围绕不再适合列宽的浮动元素流动。

对于不太常见的情况,例如,固定的两列布局,只有一点点平衡,可能可以扩展multicol以支持这一点,但它会在更一般的情况下中断,正如我所说的,它不存在。

更新

话虽如此,我还是无法抗拒实现至少一个简单的实现的挑战。这个想法很简单:我们提供一个接受 3 个参数的命令:页码、列号和浮动主体,例如

\multicolfloat{1}{2}{\centering
                     \includegraphics{cat.eps}
                     \captionof{figure}{A test}
                    }

上面是\captionofcaption包中使用的,因为这实际上不是一个浮点数,所以\caption除非它被修改,否则会发出抱怨,而我没有这样做。

此命令可以在环境中使用multicols,并要求将此浮动元素放置在第 1 页的第 2 列顶部。因此,如果文本量发生变化或环境multicols移动,则需要大量手动工作。这可以用不同且更好的方式完成,但这超出了我的时间。

所以这里是代码和测试文件,混合了修补一些钩子multicol并将新功能作为 LaTeX3 属性列表实现。

\begin{filecontents}{multicol-floats.sty}
% Author Frank Mittelbach, 2012, License LPPL
%
% Providing column floats for multicol (proto-type implementation)
%
% Document Interface:   
%
%   \multicolfloat <page-num> <col-num> <float-body>
%
% To be used inside a multicols environment. 
% Can only place floats on full pages not balanced pages.
% Should probably be an environment but didn't do that this time around.
%
% Subject to change and ... No support :-)

\RequirePackage{etoolbox}
\RequirePackageWithOptions{multicol}

% Patching multicol to get a few hooks in as needed

\patchcmd{\multi@column@out}%
  {\setbox\count@ \vsplit\@cclv to\dimen@}%
  {\create@split@column \count@ \dimen@}%
  {\typeout{*** SUCCESS ***}}{\typeout{*** FAIL ***}}

\patchcmd{\multi@column@out}
  {\setbox\mult@rightbox \vsplit\@cclv to\dimen@}
  {\create@split@column \mult@rightbox \dimen@}
  {\typeout{*** SUCCESS ***}}{\typeout{*** FAIL ***}}

\patchcmd\endmulticols
  {\output}{\mc@check@unset@floats\output}
  {\typeout{*** SUCCESS ***}}{\typeout{*** FAIL ***}}

\newcount\mc@column

\patchcmd\process@cols
  {\relax}{\relax\mc@column\@ne}
  {\typeout{*** SUCCESS ***}}{\typeout{*** FAIL ***}}

\patchcmd\process@cols
  {\advance}{\advance\mc@column\@ne\advance}
  {\typeout{*** SUCCESS ***}}{\typeout{*** FAIL ***}}

% Implementation of new functionality

\RequirePackage{xparse}

\ExplSyntaxOn

\DeclareDocumentCommand \multicolfloat { m m m }
   {
     \mc_float:nnn {#1} {#2} {#3} 
   }


% Implementation

\cs_generate_variant:Nn \prop_gpop:NnNT { NxNT }
\cs_generate_variant:Nn \prop_get:NnNTF { NxNTF }

\prop_new:N \__g_mc_float_prop
\tl_new:N   \__l_mc_float_tl

\cs_new:Npn \mc_float:nnn #1#2#3 {
% safe a float body under the property key "page,col"
% if there already exist a float, combine them
   \prop_get:NxNTF \__g_mc_float_prop {#1,#2} \__l_mc_float_tl
       {
         \prop_gput:Nno \__g_mc_float_prop {#1,#2}
            {\__l_mc_float_tl
             \vskip \floatsep
             \vbox{\hsize\columnwidth #3}
            }
       }
       {
         \prop_gput:Nnn \__g_mc_float_prop {#1,#2}
            {\vbox{\hsize\columnwidth #3}}
       }
}

\cs_new:Npn \create@split@column #1#2 {
% look up any saved floats for current page and current column and if they exist
% add them to the to the top of box 255 and then split  off a column
  \prop_gpop:NxNT \__g_mc_float_prop
        {\thepage, \the\mc@column }
        \__l_mc_float_tl
        { 
          \vbox_set:Nn \c_two_hundred_fifty_five
             { \__l_mc_float_tl
               \vskip \textfloatsep
               \vbox_unpack_clear:N \c_two_hundred_fifty_five
             }
        }
  \vbox_set_split_to_ht:NNn #1 \c_two_hundred_fifty_five {#2}
}

\cs_new:Npn \mc@check@unset@floats {
% if the property list is not empty we haven't typeset all floats for some reason
% give error message and a display of the property list content (crude ... but there you go)
  \prop_if_empty:NF \__g_mc_float_prop
     { \PackageError{xmulticol}{Unset~ column~ floats,~ details~ below}
                    { }
       \prop_show:N   \__g_mc_float_prop
       \prop_gclear:N \__g_mc_float_prop
     }
}

\ExplSyntaxOff

\end{filecontents}

\documentclass{article}

\usepackage{lipsum,caption,graphicx}

\usepackage{multicol-floats}

\begin{document}

\begin{multicols}{2}

\multicolfloat{1}{1}{TEST 1-1}

\multicolfloat{1}{2}{\centering
  \includegraphics{cat.eps}
 \captionof{figure}{A test}
}

\multicolfloat{1}{2}{TEST \captionof{figure}{Another test}}

\multicolfloat{2}{1}{TEST 2-1}

\lipsum %\lipsum

\end{multicols}
\end{document}

结果在第一页上得到以下输出,其中三个浮点数位于第一列和第二列:

在此处输入图片描述

\lipsum由于测试文件中只有一个,multicols所以在下一页结束,因此第 2 页第一列的浮点数未排版,我们也收到以下错误消息:

! Package xmulticol Error: Unset column floats, details below.

See the xmulticol package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              

l.136 \end{multicols}

? 
The property list \__g_mc_float_prop contains the pairs (without outer
braces):
>  {2,1}  =>  {\vbox {\hsize \columnwidth TEST 2-1}}.
<recently read> }

l.136 \end{multicols}

不是很好 :-) 但无论如何这只是一个原型。事实上,如果multicols环境从页面中间开始,那么浮动将出现在多列的列顶部,而不是页面顶部。毕竟,列大小可能不同,所以这是一个功能而不是错误......嘿,这上面的任何东西都是一个功能,正如我所说的完全这种形状不受支持--- 无论如何享受

答案2

我建议你使用twocolumn文档类选项而不是multicol包。twocolumn设置选项后,你可以使用figuretable环境来跨越单列文本,以及figure*浮动table*跨越的环境两列。在带星号的环境中,请注意您只能将浮动元素放置在页面顶部(或最末尾)。

此外,正如其他人已经指出的那样,每当文档以每页两列的格式排版时,最好只将浮点数放在页面的顶部;因此,使用[t]单列浮点数的说明符。

答案3

这是我的代码。它适用于 IEEE 期刊模板(两列期刊模板、bare_jrnl_compsoc、bare_jrnl 等)。因此,一页宽的图表位于两列设置纸中。

\begin{figure*}

 \center

  \includegraphics[width=\textwidth]{AAA.eps}

  \caption{PRF and pulses number comparison with eigenwaveform.}

  \label{AAA}

\end{figure*}

希望对你有帮助。

答案4

我自己解决了我的问题。

我从 IEEE 协会找到了一个 IEEE Transactions 模板,它支持 2 列平衡、列图和宽图(问题中的屏幕截图也是 IEEE Transactions 论文)。

交易模板可以在库存 MiKTeX(适用于 Windows)中找到,或者在页。

我使用了 bare_jrnl_compsoc(计算机学会期刊)模板,因为这是唯一允许广泛摘要的模板,并将文档类型改回期刊(如 bare_adv 模板中一样)

相关内容