\sin 等符号旁边的负号间距

\sin 等符号旁边的负号间距

通常 latex 中负号的间距与减号不同:负号“粘”在它后面的符号上,而减号两边的空间更大。然而,这似乎不适用于 \sin 之类的东西。比较:

$-2-2$. $-u-u$. $-\sin(x)-\sin(x)$.

在此处输入图片描述

负号和第一个“sin”之间的间距似乎与减号和第二个“sin”之间的间距一样。嗯,也许小一点。但绝对不像“2”或“u”。

这是一个错误吗?如果是,该怎么办?

答案1

-在一元符号和字符串之间插入的额外空格sin不是独有于\sin:它适用于全部具有数学状态的对象mathop(“数学运算符”),例如\det\exp\tan等。正如前面的评论者所指出的,这是一个非常有意识的设计决定。至少,这个设计决定使得“sin”被误认为变量名的可能性大大降低。

[在 中$-\sin(x)-\sin(x)$] 负号和第一个“sin”之间的间距似乎与减号和第二个“sin”之间的间距一样。嗯,也许小一点。

第一个符号(一元运算符)和“sin”之间的空格量-由 控制\thinmuskip3mu在我熟悉的大多数文档类中它等于 。(18mu=1em)第二个符号(二元运算符)周围的空格量-由参数 控制\medmuskip,在我熟悉的所有文档类中它等于4mu(加上“胶水”的量)。

答案2

TeX 的间距规则出奇的简单,但对于一大类表达式来说却是一项合理的工作,有时您可能需要用一些额外的空间来帮助它\!(但我这里不这么认为)。

这些规则基于对单个原子(普通、中缀二元运算符或中缀关系、前缀运算符)的分类以及一个矩阵,该矩阵给出了每个类别相邻原子之间的空间分配。没有对表达式的结构进行整体分析,也没有真正理解其“含义”。

首先,正如 Mico 在 中指出的那样$-\sin x$-正如您在问题中评论的那样)从 mathbin 转换为 mathord,因此左侧没有额外的空间,因此和之间的空间-sinmathord 和 mathop 之间的空间。这是一个很窄的空间(略小于通常在 $ab$ 中 mathbin 周围添加的空间)。这个空间必须适用于所有 mathord mathop 情况,它不会以任何特殊方式处理 - 因此典型情况可能是$a \sin x$

$a\sin x$

$a{\sin} x$

$a{\sin x}$

在此处输入图片描述

在您的情况a下被替换,-因此 mathord 和 mathop 之间已经有更好的视觉分离,但 TeX 并不“知道”这一点。

顶部是默认间距(对于最大的情况集来说可能是最好的)第二个使用,{\sin}因此也是一个 mathord,并且根本没有添加额外的空间,因为表达式只有三个 mathord。

第三个也许是您想要的,其中通过制作 mathord 来抑制 \mathop 左侧的空间\sin x,但这不是很好的默认间距,并且即使将 a 替换为 - 也显然没有改善,就像在您最初的例子中所举的那样。

答案3

让我们简化您的示例($-u-u$本质上与相同$-2-2$),并要求 TeX 在开始将数学列表转换为水平列表之前向我们显示数学列表:

\documentclass{article}
\begin{document}

\showboxbreadth=20
\showboxdepth=1000
$-2-2 \showlists$. $-\sin(x)-\sin(x) \showlists$.

\end{document}

(当然您可以选择 20 和 1000 以外的其他值,但如果选择的值太小,您将看不到所需的内容)

这样,您将在日志文件中看到以下内容:

### math mode entered at line 6
\mathbin
.\fam2 ^^@
\mathord
.\fam0 2
\mathbin
.\fam2 ^^@
\mathord
.\fam0 2

这是第一个方程。\mathbin原子是减号,\mathord原子是2s。1感谢Marcel Krüger 的评论,我们知道第一个\mathbin不会真正保持为\mathbin,因为 TeX 不允许在公式开头使用它(我忘记了这个规则)。\mathord就间距而言,它将像 一样起作用 - 见下文。因此,一元减号和之间的小空间2是两个原子之间的空间\mathord。日志文件还将显示从第二个方程构建的数学列表:

\mathbin
.\fam2 ^^@
\mathop\nolimits
.\mathord
..\fam0 s
.\mathord
..\fam0 i
.\mathord
..\fam0 n
\mathopen
.\fam0 (
\mathord
.\fam1 x
\mathclose
.\fam0 )
\mathbin
.\fam2 ^^@
\mathop\nolimits
.\mathord
..\fam0 s
.\mathord
..\fam0 i
.\mathord
..\fam0 n
\mathopen
.\fam0 (
\mathord
.\fam1 x
\mathclose
.\fam0 )

正如您所见,两个减号都再次变成了\mathbin原子(但公式开头的减号最终将被视为\mathord,参见上文和 Marcel Krüger 的评论),确切地说:

\mathbin
.\fam2 ^^@

与第一个公式最大的不同在于, 是\sina \mathop,而不是 a ,就像你例子中的s 和s\mathord一样。如果你使用大括号将第一个a2u\sin(x)子公式,它会被包裹在 中,\mathord并且间距会很紧(我不想评论这是否是好的排版):

\documentclass{article}
\begin{document}

\showboxbreadth=20
\showboxdepth=1000
$-2-2$. $-{\sin(x)}-\sin(x) \showlists$.

\end{document}

第一个\sin(x)然后在日志文件中产生这个输出:

### math mode entered at line 6
\mathbin
.\fam2 ^^@
\mathord
.\mathop\nolimits
..\mathord
...\fam0 s
..\mathord
...\fam0 i
..\mathord
...\fam0 n
.\mathopen
..\fam0 (
.\mathord
..\fam1 x
.\mathclose
..\fam0 )

相应的渲染输出:

在此处输入图片描述

现在,多亏了Marcel Krüger 的评论2,我们可以解释为什么在开始的例子中,在 之前和 之前的公式开头的两个减号后面的空格不同\sin:因为减号是\mathbin出现在公式开头的原子,所以 TeX 实际上将它们视为\mathord原子,因此根据 TeXbook 第 170 页(在egreg 的这个答案),第一个-in后面的空格$-2-2$是两个连续原子之间的空格\mathord,即没有空格。另一方面,第一个-in后面的空格是左右两个 a$-\sin(x)-\sin(x)$之间的空格,即一个细空格(在纯 TeX 中定义为)。\mathord\mathop\thinmuskip3mu

如果我们将第一个括\sin(x)$在括号中,使其成为\mathord,我们再次得到两个连续原子之间的间距\mathord,即根本没有空间,就像2s 和us 一样。


脚注

  1. 如果您想知道为什么减号会以原子核为 的原子出现\fam2 ^^@,下面是解释。数学系列 2 是 TeX 用于“基本”数学符号的符号(括号、大括号、积分符号、 、 等可扩展符号\sum取自\sqrt系列 3)。默认情况下,分配给该系列的字体是cmsy,其编码在 中调用OMS和显示(当前在第 33 页)指南.pdfcmsy10. 正如您在以下s 字体表 摘录中所看到的:摘自 cmsy10 的字体表 此字体的 0 号位置上的字形是减号。这正是\fam2 ^^@我们从 获得的数学列表中的字形(表示为 )\showlists。事实上,由于代码为 0 的 ASCII 字符(又名 NUL)不在可打印字符范围内,因此 TeX 使用其^^符号显示它。在这个符号中,^^@表示代码为 0 的字符,因为 的 TeX 内部代码@是 64,介于 64 和 127 之间;因此,TeX 从这个内部代码中减去 64,得到 0。如果 TeX 内部代码介于 0 和 63 之间,TeX 会将 64 添加到代码中。这条规则在 TeXbook 第 45 页中有描述。如果你好奇,“TeX 内部代码表”先验与传统 TeX 引擎的 ASCII 代码表一致:

    TeX 的内部代码基于美国信息交换标准代码,俗称“ASCII”。

    (引用自 TeXbook 附录 C,第 367 页,其中有完整的编码表)。

相关内容