12

I have a custom document class, based on book.cls, for which the following code sometimes produces page breaks between two subsequent sections:

  \section{Introduction}
  % page break may occur here
  \subsection{Getting started}

I am completely puzzled, because my definitions for the sectioning commands are almost identical to those in book.cls:

\newcommand \headingfont {\fontfamily{phv}\fontseries{bc}\fontshape{n}\selectfont}
\newcommand\section{\@startsection {section}{1}{\headerindent}%
                                   {-3.5ex \@plus -1ex \@minus -.2ex}%
                                   {2ex \@plus.2ex}%
                                   {\color{MMIblue}\headingfont\Large}}
\newcommand\subsection{\@startsection{subsection}{2}{\headerindent}%
                                     {-3.25ex\@plus -1ex \@minus -.2ex}%
                                     {2ex \@plus .2ex}%
                                     {\color{MMIblue}\headingfont\large}}
\newcommand\subsubsection{\@startsection{subsubsection}{3}{\headerindent}%
                                     {-3.25ex\@plus -1ex \@minus -.2ex}%
                                     {2ex \@plus .2ex}%
                                     {\color{MMIblue}\headingfont\normalsize}}
% etc.

Any ideas what might cause LaTeX to allow a page break?

migrated from stackoverflow.com Mar 8 '13 at 23:44

This question came from our site for professional and enthusiast programmers.

  • \@startsection initiates itself with \par and therefore allows for a page break before the sectional header. Specific to your code snippet, \section attempts to avoid a page break after it, but \subsection allows a page break before it. – Werner Mar 8 '13 at 19:52
  • 1
    @Hendrik, I would suggest reverting back to the original definitions and changing bit by bit to what you want it to look like, with incremental compilation. You should be able to find your error that way (unless it is actually rooted somewhere else in your custom class). – Sean Allred Mar 9 '13 at 0:19
  • @Werner Could you tell me which part specifically in \section attempts to avoid a page break after it? Is it the 2ex \@plus.2ex? I'd like to understand that. – Jonathan Komar Jun 12 '15 at 8:53
  • In latex.ltx you'll find the definition of \@startsection-used by all sectioning commands in the default sense. At the start of \@startsection you'l see an issue of \par, which should allow for a possible page-break. However, at the end the entire sectional unit setting (you have to follow the command sequence) it executes \@xsect where you'll see a \par\nobreak. \nobreak avoids a page-break. This is conditional on whether you have a display or run-in section. The former doesn't insert a vertical space so avoids a break. – Werner Jun 12 '15 at 16:10
5

The problem is that \color{MMIblue} inserts a whatsit that disrupts the mechanism for disallowing page breaks after sectional titles.

Use

\newcommand\section{%
  \@startsection{section}{1}
    {\headerindent}%
    {-3.5ex \@plus -1ex \@minus -.2ex}%
    {2ex \@plus.2ex}%
    {\headingfont\Large\textcolor{MMIblue}}}

which works because the last instruction in the sixth argument to \@startsection reads the section title (with the number) as a braced group, which can then be interpreted by \textcolor as its second argument.

5

If you want to prevent a page break put your text, section headings, etc. into a samepage area.

\begin{samepage}
\section{Introduction}
% page break may occur here
\subsection{Getting started}
\end{samepage}

Now section and subsection should always be on the same page.

However, if you place a \label in the section/subsection, but outside the samepage environment, references to the label will show the number of the previous section!

  • 4
    Do NOT do this if you have labels in the section. If you put a label into the subsection whose heading is in the samepage environment, without including the label itself in the samepage environment, references to the label will bear the number of the previous section! – Jan Schejbal Jun 29 '14 at 18:34

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.