I'm trying to get images in my document in two different ways:

  1. On top of the entire page, centered
  2. On top of a single column

I tried it with both twocols and multicols. I ruled out twocols because it forces a new page every time you turn it on, because I need the abstract to be wide and the rest of the cover page to be two columns.

Here are some examples of both points (screenshot from a downloaded PDF): screenshot from a downloaded PDF

I want to achieve both, but somehow I can only solve the first point with:


  \caption{Dataflow pipeline of the edge detector}


Is it awkward to turn off multicols, then turn it back on again?

For my second point, I've tried everything, but almost always, the image doesn't show up at all! The only way I can get it to show at all is by specifying the H placement specifier, but that places the image inside the text where I defined it, not on top of the column.

This is my best try, but it hides the image and breaks all references to ??:

  \caption{Dataflow pipeline of the edge detector}

and I'm getting the warning:

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

How can I make a figure a non-float?

I also tried the figure* environment, but that just creates an image centered on top of the page, like my first point.

  • 1
    Welcome to TeX.SX! Nice question, but I believe that the solution is just to stick to top or bottom page wide insertions: placing them in the middle would confuse your reader about what's the correct reading order.
    – egreg
    Commented May 29, 2012 at 10:23
  • It seems that the figure* environment solves the 1st image problem just fine within the multicols environment.
    – k-dubs
    Commented May 1, 2015 at 17:53

4 Answers 4


The multicol environment is not designed to support column floats. The concept of balancing makes this next to impossible to automatically provide correct results in the general case and therefore I decided not to extend multicolin this direction for 2e.

For example, with multicol you can change the number of columns mid-page, how should that reflect on float placements, given that TeX can't re-break prargraphs so that they flow around floats that then not fit the column width any longer.

For the less general case, e.g., fixed 2-column layout with only a little bit of balancing, one could probably extend multicol to support this, but it would then break in the more generic cases, and as I said it isn't there.


Having said the above, I couldn't resist the challenge to implement at least a trivial implementation of this. The idea is simple: we offer a command that takes 3 arguments: a page number, a column number, and a float body, e.g.

                     \captionof{figure}{A test}

The above is using \captionof from the caption package as this isn't really a float so \caption would complain unless it gets modified which I didn't do.

This command can be used inside a multicols environment and asks for this float to be placed on top column 2 on page 1. So a lot of manual work if the amount of text is changing or the multicols environment is moved. This could be done differently and better, but that is more than I had time for.

So here is the code and a test file, a mixture of patching some hooks into multicol and implementing the new functionality as a LaTeX3 property list.

% 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 :-)


% Patching multicol to get a few hooks in as needed

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

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

  {\typeout{*** SUCCESS ***}}{\typeout{*** FAIL ***}}


  {\typeout{*** SUCCESS ***}}{\typeout{*** FAIL ***}}

  {\typeout{*** SUCCESS ***}}{\typeout{*** FAIL ***}}

% Implementation of new functionality



\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}
             \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 }
          \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








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

 \captionof{figure}{A test}

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

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

\lipsum %\lipsum


As a result one gets the following output on the first page with the three floats placed in column one and two:

enter image description here

With only one \lipsum in the test file, the multicols ends on the next page and thus the float for page 2 column one isn't typeset and we get the following error message as well:

! 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
>  {2,1}  =>  {\vbox {\hsize \columnwidth TEST 2-1}}.
<recently read> }

l.136 \end{multicols}

Not really great :-) but then this is just a proto-type anyway. In fact, if a multicols environment starts in the middle of a page then the float will appear on the top of the column of the multicol not at the top of the page. After all, the column sizes might differ, So that is rather a feature not a bug ... hey anything on this is a feature as I said totally unsupported in this shape --- enjoy nevertheless

  • 1
    I'm a noob at latex so I don't even dare go anywhere near extending anything (what do you mean by 2e anyway?). I don't need general cases, but just 2 columns, starting in the middle of my title page (which rules out \twocolumn) Commented May 29, 2012 at 14:46
  • 2
    2e is the current version of LaTeX (called LaTeX2e). I wasn't really suggesting you can extend it, It is rather close to impossible in the boundaries of the current LATeX release, so I what I was trying to say is really, LaTeX doesn't have a solution for you if you want both banacing and those floats automatically. Commented May 29, 2012 at 15:02
  • How about, is there a way to specify that the figure should be on a specific page on a specific location? (in one of either column, but relative to the page rather than to text) That wouldn't mess with the flowing (of text), and if my figure ever becomes too far separated from the relevant text, I'll just move the figure to another spot. Is that possible? Commented May 30, 2012 at 5:42
  • 1
    Hmm, doesn't seem to what you have been asked for initially and shown in the picture example. If it is just a con-column portion on top of a non-balancing two-column, then yes indeed the \twocolumn command would sufficient. You only have to place title and abstract into its optional argument. But if you want balancing AND column figures then you should try my extension. So if this question is resolved for you you should consider checkmarking on of the answer to your question. Commented Jun 7, 2012 at 10:31
  • 1
    If you you found your own answer and this this is helpful to others then yes, add it and checkmark it if it is the best solution. One comment though, you should probably also adjust your question, because it asks about solving it with multicols. One major feature of multicols is "balancing" of column material. The class you finally used ieeetran does not balance columns it is using \twocolumn[...] internally as suggested by @Mico's answer. Commented Jun 8, 2012 at 7:37

I recommend you use the twocolumn document class option instead of the multicol package. With the twocolumn option set, you can use figure and table environments to span a single column of text, and figure* and table* environment for floats to span both columns. With the starred environments, do note that you're restricted to placing floats at the top of the page (or at the very end).

In addition, as others have pointed out already, whenever a document is typeset in a two-columns-per-page format, it's best to only ever place floats at the top of a page; hence, use the [t] specifier for single-column floats.

  • 2
    I tried, but the problem with \twocolumn is that it starts a new page, and the title page, including abstract, a single column, from there on two columns. (that PDF is too) Commented May 29, 2012 at 14:42
  • 2
    the \twocolumn command has an optional argument where you can put your "title" stuff, see this question: tex.stackexchange.com/questions/57584/…
    – yo'
    Commented May 30, 2012 at 11:50
  • I will always be puzzled by how in TeX.SE the most complicated solutions are often the most upvoted...
    – Albert
    Commented May 9 at 12:01

Here is my code. it works for IEEE journal template (two columns journal template, bare_jrnl_compsoc, bare_jrnl, and so on). So one page-wide figure is in two columns setting paper.




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



Hope it works for you.

  • 1
    It worked! Very elegant solution :) Commented Aug 11, 2014 at 18:10
  • 3
    The * makes the difference. Commented Sep 11, 2018 at 18:23
  • It does not work for me using multicol
    – G M
    Commented Jun 29, 2022 at 16:56

I solved my question myself.

I found an IEEE Transactions template from the IEEE society that has supports 2 columns with balancing, column figures and wide figures (the screenshot in the question is also an IEEE Transactions paper).

The Transactions templates can be found inside stock MiKTeX (for windows), or otherwise on this page.

I used the template called bare_jrnl_compsoc (computer society journal) as that's the only one allowing a wide abstract, and changed the document type back to journal (as in the bare_adv template)

  • 8
    What exactly do you mean by "balancing"? The IEEE templates do not do any text balancing whatsoever. If you mean that the columns align at the bottom, this is not traditionally called balancing but in the TeX world but in the TeX world this is called \flushbottom. Balancing would be when at the and of the document (or in the middle if explicitly requested) two columns are made equally high and leave the same amount of white space at the bottom. Commented Jul 1, 2012 at 11:09
  • could you please elaborate your answer a bit more. Plus, the code would be helpful...
    – Vadim
    Commented Feb 19, 2018 at 11:07
  • I'm a TeX noob and this answer is just my 'two cents'. I don't use TeX anymore now so I can't help you anymore. Commented Feb 21, 2018 at 15:26

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .