What is the difference between \vspace{-1em}
and \vskip -1em
, for example? I guess the first is LaTeX, and the latter is TeX. When is the proper time to use one and not the other, and why?
-
I voted to close this question because @egreg has provided a canonical answer for the "question originally asked at tex.sx".– lockstepSep 30, 2011 at 14:27
-
5Okay, but this question was asked first.– GeoffJul 8, 2019 at 16:14
4 Answers
At any point in its processing, TeX is in some mode. There are six modes, divided in three categories:
- horizontal mode and restricted horizontal mode,
- vertical mode and internal vertical mode, and
- math mode and display math mode.
When not typesetting mathematics, TeX is in horizontal or vertical mode. Horizontal mode is typically used to make lines of text; vertical mode is typically used to stack the lines of a paragraph on top of each other.
\vskip
inserts a glue in a vertical list of the lines. Therefore \vskip
breaks the horizontal mode and goes to the vertical mode.
\vspace
can work in horizontal mode and vertical mode.
In horizontal mode \vspace 1mm
is equivalent to \vadjust{\vskip 1mm \vskip 0pt}
and inserts a space after the current line.
In vertical mode \vspace 1mm
is equivalent to \vskip 1mm \vskip 0pt
\vskip 0pt
is needed so \removelastskip
can not remove your vertical space.
Full definition:
\vspace : -> \@ifstar \@vspacer \@vspace
Without *
case (\vspace 1mm
):
\@vspace: #1->\ifvmode \vskip #1 \vskip \z@skip \else \@bsphack \vadjust {\@restore
par \vskip #1 \vskip \z@skip }\@esphack \fi
Note \z@skip
equal to 0pt
, \@bsphack
is needed to save big horizontal space after period.
\@esphack
is needed to return big space settings.
With *
case (\vspace* 1mm
):
\@vspacer:#1->\ifvmode \dimen@ \prevdepth \hrule \@height \z@ \nobreak \vskip #1 \v
skip \z@skip \prevdepth \dimen@ \else \@bsphack \vadjust {\@restorepar \hrule @height \z@ \nobreak \vskip #1 \vskip \z@skip }\@esphack \fi
-
1So if they are used outside of a paragraph (that is, in vertical mode), then the output would be exactly the same? Oct 30, 2015 at 5:52
\vspace
is a LaTeX command and \vskip
is a TeX command. Both can be used in LaTeX.
When \vspace
is used within a paragraph, it inserts space after the current line. But if \vskip
is used within a paragraph it ends the paragraph and inserts the space immediately.
-
Why does
\vskip
start a new line? Is this a side effect of what Charles refers to as "vertical mode?"– GeoffJun 11, 2010 at 13:52 -
8@Geoff:
\vskip
start a new line by design.vskip
is a vertical skip. Donald Knuth decided so. Jun 11, 2010 at 14:05
The difference by example :
\documentclass[preview, border=7mm]{standalone}
\usepackage{xcolor}
\usepackage{blindtext}
\begin{document}
\textcolor{red}{Line with \texttt{vspace} :} \vspace{1cm} \blindtext
\hrulefill
\textcolor{red}{Line with \texttt{vskip} :} \vskip 1cm \blindtext
\end{document}
Exactly as Rob says; to rephrase, \vskip
should be used when you are in, or want to start setting in, vertical mode, and \vspace
makes sense within a paragraph.
The (an?) implementation of \vspace
is discussed in Eijkhout 1990, TUGboat 11(4), p618.