Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

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?

share|improve this question
1  
See also the very related question How to avoid splitting tables between sections for more possible solutions. –  Martin Scharrer Jun 13 '11 at 11:34

3 Answers 3

up vote 90 down vote accepted

Use the placeins package.

It 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
\section{My new section} % will not include floats from previous sections
share|improve this answer
22  
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
6  
@przemoc namely \usepackage[section]{placeins} –  Jodi Schneider Aug 4 '13 at 0:12
4  
@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 at 14:38

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.

share|improve this answer
    
This has been driving me nuts for 3 months. THANK YOU! –  PengOne Aug 29 '11 at 3:07

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

share|improve this answer
3  
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 at 10:29

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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