LaTeX 提供了许多命令,可用于希望不可见的宏中,即在文本中间使用时不留下任何额外空格。这些宏包括、、\@esphack
和可以在 中找到。\@bsphack
\@Esphack
\@vbsphack
ltspace.dtx
在所有这些命令中, \@vbsphack
它都是独立的,因为它在源代码中进行了描述,但未实现,并进行了如下注释:
另一种变体对于不可见的、不应存在的事物很有用
vmode
(有些人对边际的感觉就是这样)。如果它出现在 vmode 中,那么它会进入 hmode 并确保\@savsk
不为零,以便\ignorespaces
稍后放入。目前不使用。
宏定义复制如下:
\def \@vbsphack{ %
\relax \ifvmode
\leavevmode
\@savsk 1sp
\@savsf \spacefactor
\else
\ifhmode
\@savsk \lastskip
\@savsf \spacefactor
\fi
\fi
}
有人能解释一下为什么应该\@savsk
不为零吗?源代码中提供的解释不是很清楚。
最后,我确信这些宏的名称是不是 lisp 的遗物,有人能提供一下这个姓氏的起源或历史吗?
答案1
我至少可以在命名方面提供帮助:这些是“空间黑客”,旨在避免使用在输出方面“不执行任何操作”的命令弄乱间距。所以你有\@bsphack
= 'begin space hack',\@esphack
= 'end space hack'。我认为\@Esphack
这仅适用于浮点数,但对此我不确定。
答案2
约瑟夫回答了命名问题(我一直很喜欢 esp hack 的想法)。
之所以设为\@savsk
非零,是因为它进入水平模式(\leavevmode
)并\@esphack
检查是否\@savsk
为正。如果是,则它用于\ignorespaces
吞噬空间标记(如引文所述)。
我不太确定我是否知道这可以用于什么。