7

I'm using a two column layout and I'm trying to get a figure to appear on the bottom of the page it's currently on. Floats don't work natively in a multicol environment.

Right now I'm getting around this issue by placing the following on the page before the one I want the image to appear on:

\begin{figure*}[b!]
  \centering
  \includegraphics[scale=0.8]{graph}
  \captionof{figure}{graph}
\end{figure*}

It works, but the code sure isn't pretty... What can I do to fix this?

lockstep
  • 250,273
Zak
  • 539

2 Answers2

7

Quoting the multicol documentation, section 2.4:

Stared floats, e.g., figure*, denote page wide floats that are handled in a similar fashion as normal floats outside the multicols environment. However, they will never show up on the page where they are encountered. In other words, one can influence their placement by specifying a combination of t, b, and/or p in their optional argument, but h doesn’t work because the first possible place is the top of the next page.

In other words, your code may not be pretty, but it is as good as it gets in LaTeX(2e). (Float placement in multi-column environments is one of the reasons to eagerly await LaTeX3.)

lockstep
  • 250,273
5

The technical reason that starred float environments never appear in LaTeX's two-column mode on the current page is that LaTeX may have already fully typeset the first column and some material at the break has been dropped. The algorithm could do a little better in case LaTeX is still assembling material for the first column, but that isn't done and would only succeed in about 1/3 of the cases.

In multicols the situation is similar: because the algorithm is gathering material for at least a page worth of text, it doesn't know at the time it sees the float, whether or not the call-out position will really end up on the current page. It therefore simply pushes the float into the queue for consideration when the next page is set up. Anything else would horribly complicate the algorithm as then multicols would need to track the callout positions, check if the page generation with the float(s) placed succeeds and if not defer the float(s) that failed and redo the processing. Conceptially possible, but I decided to follow the standard LaTeX approach for simplicitly.