\mskip 和 \mkern 之间的区别

\mskip 和 \mkern 之间的区别

\mskip和之间有什么区别\mkernTeXbook 写道:

只需输入命令 ' ⟨muglue⟩',即可将数学胶水插入任何公式中。[...] 类似地,当没有拉伸或收缩时,\mskip您可以使用命令 ' ';[...]。TeX 坚持和只能与一起使用;相反,和(也允许在公式中使用)绝不能给出单位。\mkern\mskip\mkernmu\hskip\kernmu

还有什么需要了解的吗?是否有标准做法或细微的语法使用差异需要注意?例如,\thickmuskip定义为5mu plus 5mu,但\(X X \mkern\thickmuskip X X\)(与相反\(X X \mskip\thickmuskip X X\))编译得很好,因此它似乎\mkern禁用了拉伸或收缩,但并不禁止其参数的此类表达式。

答案1

我引用自TeX 按主题分类,可通过以下方式免费获取texdoc texbytopic

\kern命令指定 TeX 当前所处的模式下的 kern 项。kern 项很像没有拉伸或收缩的 glue 项。它与 glue 的不同之处在于它通常不是合法的断点。因此在

.. text .. \hbox{a}\kern0pt\hbox{b}

TeX 不会在框之间换行;

.. text .. \hbox{a}\hskip0pt\hbox{b}

方框之间可以断线。但是,如果紧排线后面跟着粘连线,则 TEX 可以在紧排线处断线(前提是它不在数学模式下)。在水平模式下,紧排线和粘连线都会在断线处消失。

除了可拉伸性之外,粘连和字距之间的唯一区别在于行或页面是否可以在它们处断行。这在数学模式中同样适用,数学模式也可以跨行和跨页面断行(尽管合法断点要少得多)。

\kern因此,或的正确用法\mkern是“移动光标”,如将符号放置在彼此之上、在将较小的对象拼凑成一个大而概念上统一的对象时消除不需要的空间,或(双重)在两个应该一起出现的对象之间创建一个空间。

再次强调,这与数学模式无关,只是\mkern必须以单位给出其参数mu,就像一样\mskip

答案2

\mkern和之间的区别\mskip仅在于后者可以具有可拉伸性和可收缩性。例如,普通符号和关系符号之间的间距是通过 获得的\mskip\thickmuskip(TeX 会自动执行此操作);相反\joinrel,用于连接虚线以构建更长箭头的 是 ,\mathrel{\mkern-3mu}因此它将提供固定(负)间距,而与线条因对齐而受到的拉伸或收缩无关。

这两个命令后面必须跟有mu单位的长度规范(但 a 的拉伸或收缩分量\mskip可以用单位表示fil(l)(l)):18mu 是当前数学符号字体​​(技术上是 2 族字体)的 em 宽度。因此上标中的 1mu 将小于正常大小的 1mu。

的另一种用法\mkern是,\pmod用于以下语境中

$42 \equiv 2 \pmod{5}$

给出

42 ≡ 2(模 5)

定义是

\def\pmod#1{%
  \allowbreak\mkern18mu({\operator@font mod}\,\,#1)}

为什么这值得注意?因为它显示了一个重要特性:TeX 只会在数学公式中换行仅有的惩罚通常会在关系或运算符号后自动添加,但可以像本例一样手动插入。由于\allowbreak意味着\penalty 0,TeX 可以在开括号前的空格前中断。如果在那里中断,mkern 将会消失。

实际上,说\mskip18mu而不是\mkern18mu也是一样的,因为胶水没有可拉伸性。因此,在\mkern和之间进行选择\mskip更多的是概念上的,而不是实际的。如果从逻辑上讲应该有一个字距,请使用\mkern: 这样更有效率 (非常在宏扩展方面,这种情况会稍微多一些,老实说,这是因为当 TeX 看到mu结束规范的单元时,它不会扩展标记来搜索plusminus组件。


TeX 有三个“muskip”参数:\thinmuskip和,其值通常由\medmuskip以下\thickmuskip方式指定

\thinmuskip=3mu
\medmuskip=4mu plus 2mu minus 4mu
\thickmuskip=5mu plus 5mu

如果说\mkern\medmuskip拉伸和收缩分量被忽略,就像使用粘合参数作为 的参数时发生的情况一样\kern

TeX 还有 256 个“mskip”寄存器\muskip0\muskip255但是这些寄存器很少使用。

答案3

其他答案已经描述了 kerns 和 skips (glue)之间的区别,但是要在您的问题中提到一条评论。\mkern(例如\kern不是解析并默默接受plusminus粘合拉伸表达式。如果给出跳过登记它将接受这一点并默默地丢弃拉伸组件,并使用自然长度,但如果传递了文字长度,它会在自然长度组件之后停止,因此任何后续plusminus只是排版:

在此处输入图片描述

$1\mskip\thickmuskip a $

$2\mkern\thickmuskip a $

$3 \mskip 5mu plus 5mu a$

$4 \mkern 5mu plus 5mu a$

\def\mythickmuskip{5mu plus 5mu }

$5\mskip\mythickmuskip a $

$6\mkern\mythickmuskip a $

\bye

相关内容