173

Often floats may land quite a bit later in the document than the point they are created, sometimes after a section break.

Is there a way to force a new section to start on a new page, after any unplaced floats?

181

Use the placeins package.

As noted in the comments, you can use

\usepackage[section]{placeins}

to automatically ensure floats do not go into the next section.

The package also gives you a \FloatBarrier command that you can use to prevent floats to appear beyond some point in your document. Use it as

% ... some floats here ...

\FloatBarrier

\subsection{My new subsection} 
  • 40
    Instead of putting manually \FloatBarrier before each new section you can just use section option of placeins package. – przemoc Jul 4 '11 at 11:14
  • 17
    @przemoc namely \usepackage[section]{placeins} – Jodi Schneider Aug 4 '13 at 0:12
  • 8
    @przemoc Note, however, that this doesn't seem to work for subsections. – Filipe Correia Jan 9 '14 at 13:10
  • worked, great, should I remove format specifier's if using the \FloatBarrier? – Brian J Mar 3 '15 at 14:38
  • 1
    @FilipeCorreia, I added \begin{figure}[!h] to the figure and it also works for subsections that way. – Ali Jan 30 '17 at 11:46
61

The command \clearpage will not only start a new page, but will also force any unset floats to be set before the page break. For documents with a left and a right page, \cleardoublepage does the same, but also ensures that the next non-blank page is a right hand page.

This is all independent of the section break, save that if you are using a class that does not put a page break before section breaks, this method will force them. But, from your question, this doesn't seem to be a problem in your case.

  • 1
    This has been driving me nuts for 3 months. THANK YOU! – PengOne Aug 29 '11 at 3:07
  • Simple. Full control. No extra packages needed. What else do you want? – luchonacho Jan 29 '16 at 16:53
  • 2
    This is not a good solution, since it requires clearing things every single time, instead of defining what one wants once and for the whole document. It clutters up the code a little bit. – Zelphir Kaltstahl Jan 6 '17 at 14:25
27

I'm now using:

\usepackage{placeins}

\let\Oldsection\section
\renewcommand{\section}{\FloatBarrier\Oldsection}

\let\Oldsubsection\subsection
\renewcommand{\subsection}{\FloatBarrier\Oldsubsection}

\let\Oldsubsubsection\subsubsection
\renewcommand{\subsubsection}{\FloatBarrier\Oldsubsubsection}

This is shamelessly plugged from the union of this and other answers on the topic, plus this. As I can't comment yet (silly requirement, that..), I'm sharing it with via a new answer instead.

Edit: Plus, for the sake of copy-pastability for others, I've incorporated egregs excellent correction to use the non-argumented version of section redefinition (before, the snippet above read \renewcommand{\section}[1]{\FloatBarrier\Oldsection{#1}} etc. - Thanks, egreg

  • 7
    Don't redefine \section with an argument: \renewcommand{\section}{\FloatBarrier\Oldsection} is sufficient and better, as it allows to still use \section*{title} and \section[Short]{Long title}. The same for \subsection and \subsubsection. – egreg Mar 27 '15 at 10:29
1

Code works well for all sections and subsections for me , package needs to be updated on miktex package library

\usepackage[section]{placeins}

\FloatBarrier

Above/Below every image or section

  • 6
    This doesn't add anything new to answer the question. – Werner Apr 9 '18 at 21:03

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.