我尝试通过两种不同的方式获取文档中的图像:
- 位于整个页面顶部,居中
- 位于单列顶部
我尝试了双列和多列。我排除了双列,因为每次打开它时都会强制打开一个新页面,因为我需要摘要足够宽,封面页的其余部分需要两列。
以下是这两点的一些示例(从下载的 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
环境并非为支持列浮动而设计的。平衡的概念使得在一般情况下几乎不可能自动提供正确的结果,因此我决定不在multicol
2e 中朝这个方向扩展。
例如,multicol
您可以在页面中间更改列数,这应该如何反映在浮动位置上,因为 TeX 无法重新分解段落以使其围绕不再适合列宽的浮动元素流动。
对于不太常见的情况,例如,固定的两列布局,只有一点点平衡,可能可以扩展multicol
以支持这一点,但它会在更一般的情况下中断,正如我所说的,它不存在。
更新
话虽如此,我还是无法抗拒实现至少一个简单的实现的挑战。这个想法很简单:我们提供一个接受 3 个参数的命令:页码、列号和浮动主体,例如
\multicolfloat{1}{2}{\centering
\includegraphics{cat.eps}
\captionof{figure}{A test}
}
上面是\captionof
从caption
包中使用的,因为这实际上不是一个浮点数,所以\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
设置选项后,你可以使用figure
和table
环境来跨越单列文本,以及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 模板中一样)