84

After trying both commands, I noticed that \hspace* opposite to \hspace will insert a space over the end of the line.

So I was wondering if someone could explain how that works and also when to use either command.

2

1 Answer 1

70

Spaces (glues and kerns) disappear after line breaks by rule; by the same rule, line breaks can happen only at the "left edge" of a space. Moreover, if one says \hspace{1cm}\hspace{1cm}, the first \hspace is a feasible break point, but not the second one.

This is how TeX attains alignment to the left margin for normal and ragged right paragraphs (ragged left uses a different feature).

More precisely, a glue (\hspace) can be chosen as break point only if it is preceded by a non discardable item (most commonly a character or a rule). Among discardable items are penalties.

In some cases one wants to have spaces that don't disappear at line breaks: for instance blanks that should filled by hand in an exercise. Thus LaTeX provides the \hspace* variant.

When \hspace*{1cm} is called, LaTeX uses the internal command \@hspacer, which does

\vrule width 0pt \nobreak \hskip 1cm \hskip 0pt plus 0pt minus 0pt
  1. \vrule width 0pt places an invisible object that takes up no space;

  2. \nobreak sets a point where line breaking is impossible, by issuing a very large penalty;

  3. \hskip 1cm cannot be used as a break point, because it is preceded by a discardable item (the penalty);

  4. \hskip 0pt plus 0pt minus 0pt is inserted to avoid possible problems due to the peculiar syntax of the primitive \hskip; it won't be a feasible break point, because it's preceded by a discardable item;

  5. in case \par follows, then that last glob of glue is removed, but not the main one.

Thus \hspace*{1cm} forms, so to speak, an indivisible unit that will never be taken as a break point, nor will disappear at line breaks.

A consequence of this rules is that a space after \hspace*{1cm} cannot be used as break point.

Suppose we want to define a \blank macro for leaving space to be later filled in by hand:

\documentclass{article}

\newcommand{\blank}[1]{\hspace*{#1}}

\begin{document}

\parbox{4cm}{
 Some text to see what's going on: \blank{2cm} and \blank{3cm} with text after them
}

\end{document}

The result will be

enter image description here

(where the rules represent the \hspace*{...} commands; they won't be printed by this command, I used them just to show the effect). You can see that the space after \blank{...} is not used as break point.

With a different definition, the blanks can appear at the end of the line:

\documentclass{article}

\newcommand{\blank}[1]{\hspace*{#1}\linebreak[0]}

\begin{document}

\parbox{4cm}{
 Some text to see what's going on: \blank{2cm} and \blank{3cm} with text after them
}

\end{document}

will result in

enter image description here

Of course the typesetting here is suboptimal, but the point is to show how the thing works.

The \linebreak[0] command just inserts a feasible break point, without stating any particular preference for it.


For the interested readers, the "rule" effect for showing \hspace* has been obtained with the following trick:

\let\TeXhskip\hskip
\def\hskip{\leaders\hrule\TeXhskip}
0

You must log in to answer this question.

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