1

I am fighting LaTeX over this: I would like to have, in a twocolumn document, a small Fig. 1 at the top of the second column, and a wide Fig. 2 at the bottom of the page. This MWE illustrates this:

\documentclass[twocolumn]{article}
\usepackage{stfloats}
\usepackage{lipsum}

%\renewcommand{\topfraction}{0.1}

\begin{document}
    \global\csname @topnum\endcsname 0

    \lipsum[1]

    \begin{figure}[t]
        \caption{Fig. 1!}
    \end{figure}

    \begin{figure*}[b]
        \caption{Fig. 2!}
    \end{figure*}

    \lipsum[2-6]

\end{document}

However, regardless of what I try, this does not seem to work. Either Fig. 1 is at the top of the first column; or the wide Fig. 2 is on page 2. This seems to be a consequence of

  1. the wide figure having to appear early in the first column, and
  2. the small figure not being able to appear in the first column, otherwise it ends up in that column.

Is there a workaround? I know that once floats are positioned, numbering can be fixed (https://tex.stackexchange.com/a/356902/30810), but positioning has to be correct first.

Update: If that helps: my problem occurs on the last page of the document.

2

The figure* environment places its contents at top of place, and the optional argument doesn't work. You can try an \InsertBoxC, nested in a strip environment, from cuted (sttoolsbundle): strip is a sort of local one column environment.

\documentclass[twocolumn]{article}
\usepackage{stfloats}
\usepackage[unskipbreak]{cuted}
\usepackage{lipsum}
\usepackage{graphicx, caption}
\input{insbox}
\renewcommand{\topfraction}{0.4}

\begin{document}

    \lipsum[1-2]

    \begin{figure}[!t]
\centering\includegraphics[scale=0.5]{Nightmare_Fussli}
        \caption{Nightmare (\emph{Henry Fuseli})}
    \end{figure}
 \lipsum[3-4]
%
\begin{strip}
\InsertBoxC{
\includegraphics[scale =0.8]{SanRomano-all}}
\captionof{figure}{The Battle of San Romano (\emph{Paolo Uccello})}
\end{strip}
\lipsum[4-8]

\end{document} 

enter image description here

  • figure* optional argument works but only t and p and ! are supported by default, b is added by the stdfloats package that the OPs example uses. (but +1 for a working version using cuted:-) – David Carlisle Apr 26 '17 at 14:45
  • Didn't know stfloats added b. I thought of cuted because both are in the sttools bundle. Thanks for the information! Added: Do you happen to know whether there's a way to force a figure to appear in the right column? – Bernard Apr 26 '17 at 15:12
  • Not having your exact images, I found it difficult to reproduce your exact result. In any case, your image shows Fig. 1 at the top of the first column, which is essentially what my MWE does when you remove the \@topnum redefinition. Your en-passant question in your comment is my very question :) – bers Apr 28 '17 at 9:01
  • For the images you don't have, you can fix the dimensions of the images to be inserted and use the demo option of graphicx. Note the result is rather unstable – if you change the number of lipsum paragraphs, the image in the top left corner may not remain there, in spite of the [!h] placement specifier. I tried to use the insbox package and its \InsertBoxR command, but it doesn't seem to work in two-column mode. There's a 3rd package I didn't test, cutwin. – Bernard Apr 28 '17 at 9:17
0

I have tried this. It looks like an awful hack, but I can live with it:

\documentclass[twocolumn]{article}
\usepackage{mwe,lipsum}

% Solution:
\usepackage{capt-of}
\newcommand{\figureTwo}[1]{\makebox[0pt][l]{\raisebox{-#1}[0pt][0pt]{\parbox{\textwidth}{
    \centering
    \includegraphics[scale=0.5]{example-image-16x9}
    \captionof{figure}{Caption}
    \label{fig:Label}
}}}}

% for Calibration:
\usepackage{stfloats}

\begin{document}
    \global\csname @topnum\endcsname 0

    \lipsum[1]

    \begin{figure}[t]
        \caption{Fig. 1!}
    \end{figure}

    \enlargethispage{-10\baselineskip}

    % compare with and without - same thing!
    \noindent\figureTwo{10cm}\indent
    \lipsum[2-5]

%\end{document}

    \cleardoublepage
    Calibration:

    \begin{figure*}[b]
        \centering
        \includegraphics[scale=0.5]{example-image-16x9}
        \captionof{figure}{Caption}
    \end{figure*}

\end{document}

\figureTwo has to be called at the beginning of a paragraph in the left column. \makebox makes sure that the result has zero width (and single-line height, it seems); \raisebox moves the figure vertically to a good position; \parbox is necessary because \captionof does not work in either of the other two boxes (compare \captionof in a box). If this combination could be simplified, I would like that, too :)

Calibration works by compiling both pages, importing in Inkscape, measuring vertical offsets of both figures, and adapting the 10cm parameter accordingly. Should be done when the document is really, really finished.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.