16

Consider the following minimal, using \linebreak:

\documentclass{article}
\begin{document}
It is impossible to say how first the idea entered
my brain, but, once conceived, it haunted me day
and night. \linebreak

Object there was none. 

\tt\meaning\linebreak
\end{document} 

This produces the output,

enter image description here

I am interested to find out how the explanation of this behaviour. Is LaTeX2e buggy in this respect?

Edit

Based on the suggestions in the answers, I had another look at the TeXBook and it appears the behaviour is embedded in TeX's algorithm, quoting:

Question In one of the paragraphs earlier in this chapter, the author used \break to force a line break in a specific place; as a result, the third line of that particular paragraph was really spaced out. Explain why all the extra space went into the third line, instead of being distributed impartially among the first three lines.

answer Distributing the extra space evenly would lead to three lines of the maximum badness (10000). It's better to have just one bad line instead of three, since TeX doesn't distinguish degrees of badness when lines are really awful. In this particular case the \tolerance was 200, so TeX didn't try any line breaks that would stretch the first two lines; but even if the tolerance had been raised to 10000, the optimum setting would have had only one underfull line. If you really want to spread the space evenly you can do so by using \spaceskip to increase the amount of stretchability between words.

Of course I was wrong in titling the question a failing and apologies to the LaTeX Team and Knuth. However, I still have a feeling that the algorithm has room for improvement in this edge cases or at least \linebreak could be given a better semantic name \maybebreak can be one of them.

4
  • 1
    I would simply use \newline instead. We don't have a \linebreak vs. \newline question yet, it seems, but the difference is similar to the one of \pagebreak vs \newpage. Dec 30, 2011 at 11:31
  • @MartinScharrer It is not a matter of what to use, I was just going through the source2e and experimenting. There is a comment on the analogy between \pagebreak and newpage as well as a note that it is still considered buggy. Dec 30, 2011 at 11:42
  • @barbarabeeton Please see my edit. Dec 30, 2011 at 14:00
  • \linebreak is usually considered a "last resort" command, to be used when nothing else (not even \newline) will easily cause a line to break in a desired place in the middle of a paragraph and it's required to keep an even right margin. Dec 30, 2011 at 14:17

2 Answers 2

18

\linebreak[<value>]
Terminates the current line and formats it in the same way as the preceding line. If that line is justified, this line would be justified as well. The optional argument <value> takes integer values between 0 and 4 inclusive to specify the urgency of the line break; 4 means it must occur.

by the way: \linebreak has the same behaviour as \pagebreak for the vertical adjustment.

2
  • Herbert try \linebreak[2] and \linebreak[4] to see some differences. The [2] breaks ok, whereas the [4] not. Primarily I am trying to understand the way source2e defined it and why? Dec 30, 2011 at 10:00
  • @Yiannis: No, that is the intended behaviour that \linebreak[4] is the same as \linebreak. linebreak[1] ...\linebreak[3] are the same as \newline in your example.
    – user2478
    Dec 30, 2011 at 10:25
12

Here's what texdef -t latex linebreak answers:

\linebreak:
macro:->\@testopt {\@no@lnbk -}4

\@no@lnbk:
macro:#1[#2]->\ifvmode \@nolnerr \else \@tempskipa \lastskip \unskip
\penalty #1\@getpen {#2}\ifdim \@tempskipa >\z@ \hskip \@tempskipa
\ignorespaces \fi \fi 

The default argument to \linebreak is 4; the code is then in common with \nolinebreak (which doesn't add the -). What it does is to save the \lastskip, remove it and then apply a penalty computed by \@getpen (with a minus sign added in front of it). Then the removed glue is put again in the paragraph.

What does \@getpen do?

\@getpen:
macro:#1->\ifcase #1 \z@ \or \@lowpenalty \or \@medpenalty \or \@highpenalty \else \@M \fi 

The argument should be an integer from 0 to 4 (included). In case the argument is 4, 10000 is returned.

So in the case of a final \linebreak, TeX sees this \penalty-10000 which forces a line break. As usual, it tends to accumulate the resulting badness in one line (look for "really spaced out" in the TeX book). Note that the paragraph you get has an empty line after the break and you get two "Underfull \hbox" messages (just like you get usually from \break\break in Plain TeX).

If you say \linebreak[3] (or less), the line break is not forced but only encouraged (\@highpenalty is 301 in the standard setting) and so a correctly typeset paragraph results.

2
  • can you shed more light on this command texdef -t latex
    – js bibra
    Dec 3, 2019 at 14:42
  • @jsbibra It's a shell command, to be given at the shell prompt. Try texdoc texdef.
    – egreg
    Dec 3, 2019 at 14:48

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .