I would like to know if there is any global command that would prevent any page-breaks inside paragraphs. I'd rather have the whole paragraph on the next page instead of having it cut in the middle. I tried the \nopagebreak
command but it doesn't do the trick. Any idea?
3 Answers
You can inhibit page breaks in the middle of paragraphs by saying in you preamble
\widowpenalties 1 10000
\raggedbottom
Without \raggedbottom
(that the article class does automatically) the pages would be awful.
The primitive \widowpenalties
is an extension to the original TeX program, present in e-TeX based engines (pdftex, xetex and luatex). It generalizes the \widowpenalty
parameter of TeX, which contains the penalty inserted before the last line of a paragraph to help controlling widow lines.
The general syntax of \widowpenalties
is
\widowpenalties
n p1 p2...
pn
where n is a non-negative integer and p1, p2, ..., pn are the values of the penalties inserted before the various lines of a paragraph starting from the bottom. If the paragraph has more than n+1 lines, the last value is repeated. So the following settings are equivalent
\widowpenalty 1000
\widowpenalties 2 1000 0
If one wants to reset the array to zero (and TeX will use the standard parameter \widowpenalty
), it's sufficient to say
\widowpenalties 0
or set the array in a group, of course. It follows from the stated rules that
\widowpenalties 1 10000
will insert a penalty of 10000 (no break) between all lines in every paragraph, thus prohibiting mid-paragraph page breaks.
The array \clubpenalties
is similar, but it works from the top of the paragraph down. So an alternative solution is
\clubpenalties 1 10000
Of course, as lockstep points out, there's a "pure TeX" solution:
\interlinepenalty 10000
but \widowpenalties
is more powerful than this. For example, if we need to break a paragraph before the third line from the bottom, we can say
... here the paragraph ends.
{\widowpenalties 4 10000 10000 -10000 0 \brokenpenalty 0 \par}
which is easier than the TeX method of putting \vadjust{\break}
somewhere in the line that precedes the desired break; \brokenpenalty 0
is needed because otherwise the penalty inserted would be greater than -10000.
Since TeX uses the parameter values which are current at the moment a \par
is sensed, it will use the stated ones, resetting them at group end. The group is (almost) necessary, because the setting of \widowpenalties
is permanent, that is not like \hangindent
, \hangafter
or \parshape
that are automatically reset as part of the action of \par
.
Notes
TeX always uses the values of the parameters that are current at the time of \par
for deciding how to break the paragraph into lines and creating the vertical list to be fed to the "recent contributions", no matter how many times they are changed during the paragraph itself: \leftskip
, \rightskip
, \hangindent
, \hangafter
, \parshape
, \pretolerance
, \tolerance
, \emergencystretch
(and probably others, there are so many). After it has decided the line breaks, it assesses interline penalties and demerits to be transferred to the enclosing vertical list and contributes the boxes it has built inserting also the interline glue based on the values of \baselineskip
, \lineskip
and \lineskiplimits
(also these are among the "unique value" parameters).
Thus one can change the applicable value of, say, \widowpenalties
at the start, in the middle or just before the end of the paragraph and only the last setting will be taken into account. One might solve the "break before the third to last line" by setting \widowpenalties
at the beginning, enclosing the whole paragraph in a group. But the trick of setting it in a group avoids this need. It has some "pros and cons": the pros are that we don't need to reset the changed values; the cons are that \hangindent
, \hangafter
and \parshape
are not effectively reset, because the end of the group annihilates the resetting done by \par
! This may be a problem in a LaTeX list which uses \parshape
; it may be also a problem in some special places where LaTeX redefines \par
in such a way that it redefines itself to a "normal \par
".
-
1Could you maybe explain what the two numbers following
\widowpenalty
refer to?– SeamusJun 30, 2011 at 15:07 -
@Seamus: I just found it in the eTeX manual: it's an array specification, where 1 is the number of entries in 10000 is that one entry. I wonder what the benefit over
\widowpenalty=10000
is? Jun 30, 2011 at 15:19 -
@Martin: see edit; there is a benefit, as you can see. The key is in "repeating the last value if necessary".– egregJun 30, 2011 at 15:26
-
@egreg: Thanks for the explanation (+1). So
\widowpenalties 1 10000
states to use a page break penalty of 10000 for every line of the paragraph, right? Jun 30, 2011 at 15:31 -
1@egreg: To clarify the last line of code in your answer, is
\widowpenalties
something that gets reset after every paragraph, or does it remain in effect until you redefine it or leave the group that localized the definition? And, do you have to set it by the beginning of the paragraph in which it will be used, or can it be set at the very end (as your code seems to imply) and have it work "retroactively" on the preceding paragraph? Jun 30, 2011 at 20:55
I have used the nowidow
package by Raphael Pinson with some success.
\usepackage[<options>]{nowidow}
I use: \usepackage[defaultlines=4,all]{nowidow}
A value of 4 works for me because I can tolerate some breaks in very large paragraphs.
I think you can be pretty sure of banning all page breaks in a paragraph if you set the value of defaultlines
to something quite high.
-
2Thanks for the welcome. I usually never post because almost everything seems answered. Generally, I come here looking for answers. I noticed this particular question because I was looking for an answer to this question, or something close enough. The answers here did not quite work for my particular needs, so I looked elsewhere on the web and found the nowidow package. I came back here not entirely out of altruism but also to "archive" the solution for myself. I can be forgetful, but I know that I will be back here whenever I need a solution. Feb 25, 2014 at 23:21
`
to mark your inline code as I did in my edit.\nopagebreak
is to avoid a page break in the current line, i.e. the line it is used in. It has no global effect.