Search code examples
latextexpdflatex

Multicol and a floating box at the top of page, with text wrapping around it


I'm writing an article for a magazine. I'm trying to insert a (floating) 2-column box at the upper right corner of a 3-column document, with the text wrapping around it nicely andn the columns being aligned. I'm making the box using the tikz package so I can have a box with rounded edges and a background color. I was trying to do the wrapping using wrapfig (and I've tried some minipage stuff as well), but I can't get it to work.

This is some code that explains what I'm trying to do, and how I've been trying to do it:

\documentclass{article}
\usepackage{wrapfig}
\usepackage{tikz}
\usepackage{multicol}

\definecolor{col}{rgb}{0.6,0.6,0.9}
\setlength{\columnsep}{0.5cm}
\newcommand{\floatingBox}[3]
{
 \noindent
 \begin{wrapfigure}{#1}{#2}
 \begin{tikzpicture}
 \node[rounded corners=5pt, fill=col, text width=\linewidth]{#3};
 \end{tikzpicture}
 \end{wrapfigure}
}

\begin{document}
\begin{multicols}{3}
\large
Some random rambling to fill a page.

Aardvark AB aback abacus abaft abalone abandon abandoned abandonment abase
abasement abash abashed abate abatement abattoir abbess abbey abbot 
abbreviate abbreviation ABC abdicate abdication abdomen abdominal abduct 
abduction abeam abed aberrant aberration abet abeyance abhor abhorrence 
abhorrent abide abiding ability abject abjure ablaze able able-bodied ABM 
abnegation abnormal abnormality aboard abode abolish abolition abolitionist 
A-bomb abominable abominate abomination aboriginal aborigine abort abortion 
abortionist abortive abound about about-face above aboveboard abracadabra 
abrade Abraham abrasion abrasive abreast abridge abridgment abroad abrogate 
abrogation abrupt abscess abscond absence absent absentee absenteeism 
absent-minded absinthe absolute absolute zero absolution absolutism absolve 
absorb absorbency absorbent absorbing absorption abstain abstemious 
abstention abstinence abstinent abstract abstracted abstraction abstruse 
absurd absurdity abundance abundant abuse abusive abut abutment abysmal 
abyss AC acacia academia academic academician academy a cappella accede 
accelerate acceleration accelerator accent accentuate accentuation accept 
acceptability acceptable acceptance access accessibility accessible 
accession.


\floatingBox{tr}{2\columnwidth + 1\columnsep}{
\begin{multicols}{2}
A box that spans 2 columns and should be floating on top of the page with 
the text wrapping around it.  It's aligned to the right, so it would be 
exactly above 2 entire columns, with one column to its left.
\end{multicols}
}


Accessory accident accidental accident-prone acclaim acclamation acclimate 
acclimation acclimatization acclimatize accolade accommodate accommodating 
accommodation accompaniment accompanist accompany accomplice accomplish 
accomplished accomplishment accord accordance accordingly according to 
accordion accost account accountability accountable accountant accounting 
accouterments accredit accreditation accrue accumulate accumulation 
accumulative accuracy accurate accursed accusation accusative accusatory 
accuse accused accusingly accustom accustomed ace acerbic acerbity 
acetaminophen acetate acetic acid acetone acetylene ache achievable achieve 
achievement.

\end{multicols}
\end{document}

Solution

  • It is my experience that such layout (figure spanning more than one, but not all of the columns on the page) is difficult to obtain with latex.

    The best solution that I'm aware of is the flowfram package. The package lets you define the page layout (where should certain boxes be placed) before writing the contents of the document.

    A small code example is given below. It is a restructuring of the poster example that comes with the flowfram package.

    \documentclass[a4wide]{article}
    
    \usepackage{color}
    \usepackage{helvet}
    \usepackage{flowfram}
    
    \setlength{\columnsep}{0.3cm}
    
    % Base the page layout on 3 column with static header.
    \NcolumnStop{3}{1 cm}
    % give the static frame a label to make it easier to keep track of
    \setstaticframe{\value{maxstatic}}{label={title},backcolor=[cmyk]{0.64,0,0.95,0.40},textcolor=white}
    
    % On the first page, replace last two columns with
    % 2 columns and a static above
    \setflowframe{2,3}{pages={>1}}
    
    \computeflowframearea{2,3}
    \twocolumnStopinarea[1]{0.3\ffareaheight}{\ffareawidth}{\ffareaheight}{\ffareax}{\ffareay}
    \setstaticframe{\value{maxstatic}}{label={info},backcolor=[cmyk]{0.26,0,0.76,0},clear}
    
    \setallflowframes{backcolor=[cmyk]{0.15,0,0.69,0}}
    
    \raggedright
    \setlength{\parindent}{15pt}
    
    \begin{document}
    \begin{staticcontents*}{title}
    \begin{center}
    \bfseries\Large Creating stuff in \LaTeX\par
    \end{center}
    \end{staticcontents*}
    
    \pagestyle{empty}
    
    \begin{staticcontents*}{info}
    \begin{staticfigure}
    
    The {flowfram} package is designed to enable you to create
    frames in a document such that the 
    contents of the {document} environment flow from one 
    frame to the next in the order that they were defined.  
    This is useful for creating posters
    or magazines or any other form of document that does not 
    conform to the standard one or two column layout.
    
    \vfill
    
    \caption{The commands used to define the frames for this document g.}
    \protect\label{fig:thisdoc}
    \end{staticfigure}
    \end{staticcontents*}
    
    This is a modified version of the manual for the {flowfram} 
    package.  It is intended to illustrated what can be done. See the 
    full manual (ffuserguide.pdf) for
    a comprehensive description, as this may now be out of date. 
    The commands used to define the frames for
    this document are shown in Figure~\ref{fig:thisdoc}.
    If the columns are very narrow, it may be better to
    use {raggedright}, otherwise \TeX\ may have a
    problem working out the line breaks.
    
    \section{Introduction}
    
    The {flowfram} package is designed to enable you to create
    frames in a document such that the 
    contents of the {document} environment flow from one 
    frame to the next in the order that they were defined.  
    This is useful for creating posters
    or magazines or any other form of document that does not 
    conform to the standard one or two column layout.
    
    \section{Setting up Frames}
    
    The {flowfram} package provides three types of frame:
    {flow frames}, {static 
    frames} and {dynamic frames}.
    
    \subsection{Flow Frames}
    
    The flow frame is the principle type of frame.
    The text of the {document} environment will flow from 
    one frame to the next in order of definition. Each 
    flow frame has an associated width, height, 
    position on the page, and optionally a border.
    
    It is recommended that all the flow frames in a document
    have the same width, otherwise problems may occur
    when a paragraph spans to flow frames of unequal
    widths. This is because \TeX's output routine does not
    register the change in {hsize} until it reaches
    a paragraph break. If it is absolutely necessary for 
    flow frames to have unequal widths, judicious use of
    {framebreak} is required.
    
    
    \end{document}