\vskip 和 \vspace 之间有什么区别?

\vskip 和 \vspace 之间有什么区别?

我发现自己写道:

\vspace 1 \baselineskip

然后,当它没有编译时,不加思索地更改为:

\vskip 1 \baselineskip

但有什么区别呢?也许知道这一点会让我在将来从一开始就写出正确的文章……

答案1

语法

\vspace 1\baselineskip

是不正确的,因为\vspace(或者更准确地说,内部版本\@vspace)是一个接受一个参数的命令,所以这相当于

\vspace{1}\baselineskip

这会引发错误。但是,这两个调用

\vspace{1\baselineskip}
\vskip 1\baselineskip

并不等价。如果在 LR 模式下(使用 LaTeX 用语;TeX 用语中的水平模式)给出,前者不会强制段落结束,而是在排版文档中出现的行下添加规定的垂直间距。使用 (\vskip这是一个原始的 TeX 命令),当前段落将终止。

\vspace还可以使用 * 版本,它提供不会在分页符处消失的垂直空间;使用 插入的间距\vskip总是在分页符处消失。

一般来说,最好\vspace在段落之间发布,但在某些情况下“段落内”功能可能会派上用场。

最后,

\vskip 1\baselineskip
Plus one

对于那些不熟悉 Plain TeX 术语的人来说,这会给他们带来一些惊讶。

好奇者请注意\vglue 1\baselineskip结束段落并产生不会在分页符处消失的间距。LaTeX 手册中没有记录这一点,这很好。

答案2

我注意到了这个问题,因为它几个小时前出现在活跃问题列表的顶部,我想对@egreg 给出的出色回答添加另一个小小的评论。

还有一个区别

\vskip \medskipamount % say

\vspace{\medskipamount}

\addvspace并且当and/or\addpenalty命令紧随其后时,它们会如何表现。事实上,\vspace添加了一个第二零长度跳过,导致随后的\addvspace(resp., \addpenalty) 命令不是删除前面的空格,然后再添加自己的垂直空间(即惩罚)。当然,这个零长度跳过不是由 添加的\vskip,这是一个原始命令,其效果是,\addvspace紧随其后的(即,没有当前垂直列表中的中间项目)将删除添加的垂直空间,\vskip如果它比其自身参数中指定的空间短。

换句话说,如果你说

\vspace{\medskipamount}
\addvspace{\bigskipamount}

两个都\medskipamount空格将保留,您将获得+的总垂直空间\bigskipamount,而

\vskip \medskipamount
\addvspace{\bigskipamount}

只有较高的一个空间能够保留下来(\bigskipamount在本例中是)。

的行为\addpenalty类似,但为了看得更清楚,我们需要查看 产生的跟踪\showlists。考虑以下 (几乎) MWE:

\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
% \usepackage[ascii]{inputenc}

\showboxbreadth = 1000
\showboxdepth = 10

\begin{document}

Short paragraph~\#1.

\vskip \medskipamount
\addvspace{\bigskipamount}

Short paragraph~\#~2.

\vspace{\medskipamount}
\addvspace{\bigskipamount}

Short paragraph~\#~3.

Let's now consider penalties.  To see the difference, you'll have to look at 
the transcript file, and read the tracing produced by \verb|\showlists|.

Short paragraph~\#4.

\vskip \medskipamount
\addpenalty{123}
\addvspace{\bigskipamount}

Short paragraph~\#~5.

\vspace{\medskipamount}
\addpenalty{123}
\addvspace{\bigskipamount}

Short paragraph~\#~6.

\showlists

\end{document}

这是“短段落”#4 和#5 之间的追踪摘录:

\glue 6.0 plus 2.0 minus 2.0
\glue -7.94397 plus -2.0 minus -2.0
\penalty 123
\glue 1.94397
\glue 6.0 plus 2.0 minus 2.0
\glue -6.0 plus -2.0 minus -2.0
\glue 12.0 plus 4.0 minus 4.0
\glue(\parskip) 0.0 plus 1.0

-7.94397 plus -2.0 minus -2.0如您所见,惩罚项前有一个 (points) 的退格键:此退格键既补偿了6.0 plus 2.0 minus 2.0来自 的前一个垂直空间 (always points) \vskip \medskipamount,也补偿了最后一行文本的深度(后者是最近对旧 LaTeX 错误的更正)。还请注意 之前的第二个退格键\glue 12.0 plus 4.0 minus 4.0,它是 对应的粘合\bigskipamount

另一方面,第 5 段和第 6 段的相应摘录如下

\glue 6.0 plus 2.0 minus 2.0
\glue 0.0
\penalty 123
\glue 12.0 plus 4.0 minus 4.0
\glue(\parskip) 0.0 plus 1.0

在这里您可以看到我们上面提到的零长度垂直空间,并且根本没有退格。

答案3

另一个不同点是。在水平模式下\vskip生成\par(为了终止它),但\vspace表现为\vadjust{\vskip...}。结果是:\vskip具有非常容易理解的行为,但却\vspace是许多混乱的根源。您可以通过检查这个论坛来验证这一点,该论坛是关于用户对\vspaceTeX 中水平/垂直模式的困惑和误解。

相关内容