source2e
在各个地方使用的命令中都会看到\unskip
。我的一般理解是,宏相当于\ignorespacesbehind
。
建议在哪里使用\unskip
?
用于实验的 MWE:
\documentclass{article}
\usepackage{lipsum}
\begin{document}
\lipsum[1]
\def\test{\leavevmode \unskip test }
\def\testa{\leavevmode test\ignorespaces }
\test testing \test
\testa testing \testa test
\end{document}
答案1
除了@Josephs 的观点外,还需要注意以下事项:
\unskip
作用于水平和垂直空间,因此它将移除垂直的段落之间使用空格。\ignorespaces
与影响输入字符和标记之间的转换不同,\unskip
在执行所有标记化和命令后,它会对框内的实际列表起作用。\unskip
不能在外部垂直模式下使用:一旦将项目添加到页面的主垂直列表中,就无法将其删除。因此,虽然在小页面中,您可以使用 删除前面的垂直空间\unskip
,但在主页上,您必须使用\vskip-\lastskip
来备份上一个跳过,而不是实际删除它。这会留下易碎胶水,因此您可能还需要注入一些胶水\penalties
以防止页面断裂。
考虑:
\documentclass{article}
\showoutput
\begin{document}
\setbox0\vbox{
\hbox{g}
\vskip 10pt
\hbox{b}
}
\showbox0
\setbox2\vbox{
\hbox{g}
\vskip 10pt
\unskip\nobreak\hbox{b}
}
\showbox2
\setbox4\vbox{
\hbox{g}
\vskip 10pt
\vskip-\lastskip\nobreak\hbox{b}
}
\showbox2
\hbox{g}
\vskip 10pt
\unskip\nobreak\hbox{b}
\stop
框 0 是
\vbox(26.30554+0.0)x5.55557
.\hbox(4.30554+1.94444)x5.00002
..\OT1/cmr/m/n/10 g
.\glue 10.0
.\glue(\baselineskip) 3.11111
.\hbox(6.94444+0.0)x5.55557
..\OT1/cmr/m/n/10 b
但假设(如框 2 所示)添加的代码b
需要删除上面的空间,它可以使用\unskip
从字面上删除它,从而导致
\vbox(16.30554+0.0)x5.55557
.\hbox(4.30554+1.94444)x5.00002
..\OT1/cmr/m/n/10 g
.\penalty 10000
.\glue(\baselineskip) 3.11111
.\hbox(6.94444+0.0)x5.55557
..\OT1/cmr/m/n/10 b
如果不是删除它,而是添加负空间来补偿 n 框 4,那么你会得到
\vbox(16.30554+0.0)x5.55557
.\hbox(4.30554+1.94444)x5.00002
..\OT1/cmr/m/n/10 g
.\glue 10.0
.\glue -10.0
.\penalty 10000
.\glue(\baselineskip) 3.11111
.\hbox(6.94444+0.0)x5.55557
..\OT1/cmr/m/n/10 b
这看起来相同,但是如果惩罚不是 10000,那么它将是该位置的一个可行断点,这意味着如果列表被取消装箱,则第一部分的末尾将具有深度 0,而不是深度g
可能会对定位产生微妙(或不那么微妙)的影响,很难纠正(或至少很难记住纠正)。
因此,周围的问题\unskip
比组合要简单得多vskip-\lastskip
,但是如果您不在盒子里,您就别无选择,因为主页上的最后一个版本产生了:
! You can't use `\unskip' in vertical mode.
l.46 \unskip
答案2
该\unskip
原语将从当前列表中删除最后一个跳过,其中包括某些文本开头的空格这一常见情况。因此,\unskip
当您希望在输入语法中允许一定的灵活性时,可以使用该原语。例如,它用于某些居中代码中,以避免行开头的空格弄乱对齐。
重要笔记:
\unskip
将仅删除最后一次跳过,因此\space\space\unskip
仍然会有一个空格存在。\unskip
不会删除字距,因此\space\kern0pt\unskip
不会删除空格:这可能被故意使用以避免丢失“必需”的空格。