答案1
-
在一元符号和字符串之间插入的额外空格sin
是不是独有于\sin
:它适用于全部具有数学状态的对象mathop
(“数学运算符”),例如\det
、\exp
、\tan
等。正如前面的评论者所指出的,这是一个非常有意识的设计决定。至少,这个设计决定使得“sin”被误认为变量名的可能性大大降低。
[在 中
$-\sin(x)-\sin(x)$
] 负号和第一个“sin”之间的间距似乎与减号和第二个“sin”之间的间距一样。嗯,也许小一点。
第一个符号(一元运算符)和“sin”之间的空格量-
由 控制\thinmuskip
,3mu
在我熟悉的大多数文档类中它等于 。(18mu=1em
)第二个符号(二元运算符)周围的空格量-
由参数 控制\medmuskip
,在我熟悉的所有文档类中它等于4mu
(加上“胶水”的量)。
答案2
TeX 的间距规则出奇的简单,但对于一大类表达式来说却是一项合理的工作,有时您可能需要用一些额外的空间来帮助它\!
(但我这里不这么认为)。
这些规则基于对单个原子(普通、中缀二元运算符或中缀关系、前缀运算符)的分类以及一个矩阵,该矩阵给出了每个类别相邻原子之间的空间分配。没有对表达式的结构进行整体分析,也没有真正理解其“含义”。
首先,正如 Mico 在 中指出的那样$-\sin x$
(-
正如您在问题中评论的那样)从 mathbin 转换为 mathord,因此左侧没有额外的空间,因此和之间的空间-
是sin
mathord 和 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
原子是2
s。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 ^^@
与第一个公式最大的不同在于, 是\sin
a \mathop
,而不是 a ,就像你例子中的s 和s\mathord
一样。如果你使用大括号将第一个a2
u
\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
\thinmuskip
3mu
如果我们将第一个括\sin(x)$
在括号中,使其成为\mathord
,我们再次得到两个连续原子之间的间距\mathord
,即根本没有空间,就像2
s 和u
s 一样。
脚注
如果您想知道为什么减号会以原子核为 的原子出现
\fam2 ^^@
,下面是解释。数学系列 2 是 TeX 用于“基本”数学符号的符号(括号、大括号、积分符号、 、 等可扩展符号\sum
取自\sqrt
系列 3)。默认情况下,分配给该系列的字体是cmsy
,其编码在 中调用OMS
和显示(当前在第 33 页)指南.pdfcmsy10
. 正如您在以下s 字体表 摘录中所看到的: 此字体的 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 页,其中有完整的编码表)。