我实施了这份可怕的文件
\documentclass{article}
\newcommand{\testspace}[1]{\hspace*{\fill}\(\vert\)\hspace*{\fill}\\
\null\space\(\vert\)\hspace*{3.3pt plus #1pt}\break}
\begin{document}
\noindent
\(\vert\)\space\(\vert\)\\
\(\vert\)\hspace{3.3pt}\(\vert\)\\
\testspace{1.665}
\end{document}
这样我就可以直观地检查每个垂直条,看看哪些垂直条排列得最好,从而发现单个控制空间的伸展程度。我估计一个空间的宽度约为 3.3pt 加 1.665pt,但是,我无法摆脱这种糟糕的感觉。尽管如此,TeX(我认为是 TeX 而不是 LaTeX)不允许我使用\the\space
。我应该如何计算单个空间的长度?
答案1
正常空间的宽度取决于当前字体。每个字体中都有称为的全局度量项\fontdimen
。\fontdimen2
包括正常空间的基本宽度,\fontdimen3
包括之后的值plus
和\fontdimen4
包括之后的值minus
。\fontdimen7
包括使用时使用的额外空间\spacefactor\ge 2000
。
因为\font
上下文中使用的原语\fontdimen<number>\font
表示当前字体(并且没有正常的声明原语),所以我们可以通过代码打印正常空间的值:
\message{space: \the\fontdimen2\font\space
plus \the\fontdimen3\font\space minus \the\fontdimen4\font}
计算机现代罗马字体 10 pt 给出以下结果:
space: 3.33333pt plus 1.66666pt minus 1.11111pt
您可以使用\hskip
原始空间来创建正常空间
\hskip \fontdimen2\font plus\fontdimen3\font minus\fontdimen4\font
但这仅用于说明目的。普通人使用\space
或\
(控制空间)。
编辑:正常空间在任何情况下都不会生成上面提到的空间\hskip
,因为存在许多例外情况。如果寄存器\spaceskip
非零,\fontdimen
则不使用 s,而是\spaceskip
使用寄存器。此外,如果非零,则使用\xspaceskip
当前\spacefactor\ge 2000
then 。\xspaceskip
\
(控制空间)和\space
(或单词之间的正常空间,catcode 10 的标记)之间有两个区别:
\space
在垂直模式下会被忽略,但\
在垂直模式下会启动水平模式。\space
尊重当前\spacefactor
,但与何时\
执行相同操作。\space
\spacefactor=1000
最后,这意味着什么该空间尊重当前\spacefactor
。设 f=\spacefactor/1000
且 b 为空间的基本宽度,p 为正值,m 为负值。则 p 被 p:=p*f 修改,m 被 m:=m/f 修改,b 保持不变。但是,如果\spacefactor\ge2000
则 b:=b+ \fontdimen7
(\xspaceskip
如果非零则使用或)。
我从 TeXbook naruby 第 105 页添加了一个例子:假设正常空间(当\spacefactor=1000
)为 10pt plus10pt minus10pt。当然\spacefactor=600
后插入空间 10pt plus 6pt minus16.666pt,当然\spacefactor=1500
后插入 10pt plus15pt minus6.666。最后当然\spacefactor=3000
后插入 10pt+ \fontdimen7
plus 30pt minus 3.333pt。
通常,\spacefactor
是 1000,但在某些语言中,\nonfrenchspacing
宏会将特殊字符设置\sfcodes
为几个字符。设置\spacefactor
为水平模式下最后一个排版字符的值。(当和。然后是 new\sfcode
时,有一个例外。)例如,普通 TeX 将句号、问号和感叹号设置为 3000,将逗号设置为 1250,将分号设置为 1500,将冒号设置为 2000。\spacefactor<1000
\sfcode>1000
\spacefactor=1000
\sfcode