何时使用 \unskip 是良好做法

何时使用 \unskip 是良好做法

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不会删除空格:这可能被故意使用以避免丢失“必需”的空格。

相关内容