为什么手动设置 \spacefactor 时使用花括号?

为什么手动设置 \spacefactor 时使用花括号?

下面texbook.tex的代码用于伪造纯 TeX 格式:

Subsequent paragraphs {\it are\/} indented.*{\spacefactor=3000}
(See?) The computer breaks a paragraph's

显然,花括号在这里不是用来\spacefactor局部设置的。一个原因可能是为了避免吞噬下一个空格。

这里使用花括号的确切原因是什么?还有其他方法可以获得相同的输出吗?

如果我们想手动设置,使用花括号是常用的方法吗\spacefactor

答案1

您可以在 TeXbook 第 277 页底部阅读语法规则。

到目前为止提到的所有分配都将遵循 TeX 的分组结构;即,除非更改是全局的,否则当前组结束时更改的数量将恢复为以前的值。其余分配有所不同,因为它们会影响 TeX 的全局字体表或连字表,或者它们会影响某些控制变量,这些变量非常私密,以至于分组不合适。在以下所有情况下,\global前缀的存在或不存在都没有影响。

⟨全局赋值⟩ → ⟨字体赋值⟩ | ⟨连字符赋值⟩
        | ⟨盒子大小赋值⟩
        | ⟨交互模式赋值⟩
        | ⟨私密赋值⟩
[...]
⟨私密赋值⟩ → ⟨特殊整数⟩⟨等于⟩⟨
        数字⟩ | ⟨特殊尺寸⟩⟨等于⟩⟨尺寸⟩

现在,在第 271 页,你会发现什么是 ⟨特殊整数⟩

⟨特殊整数⟩ → \spacefactor| \prevgraf
        | \deadcycles|\insertpenalties

\spacefactor=3000是一个全局分配,就像\spacefactor=1000水平列表开始时完成的隐式分配一样。

通常情况下,人们会显式地将 赋值给 ,而\spacefactor无需使用花括号。例如,\hgl@宏会说\spacefactor\count@。问题出在哪里?你肯定知道!当 TeX 寻找常量时,它会停在空格处(会被吞掉)或不是数字的不可扩展对象处(在当前数字系统、十进制、八进制、十六进制下)。输入

.*\spacefactor3000\space\space

会很尴尬。

另一种方法可能是.*\afterassignment\space\spacefactor3000 (See?)

这是检查它的代码。

Subsequent paragraphs {\it are\/} indented.*{\spacefactor=3000}
(See?) The computer breaks a paragraph's

Subsequent paragraphs {\it are\/} indented.*\spacefactor=3000\space\space
(See?) The computer breaks a paragraph's

Subsequent paragraphs {\it are\/} indented.*\afterassignment\space\spacefactor=3000
(See?) The computer breaks a paragraph's

%\tracingall

\bye

在所有情况下,使用\tracingall,您将获得

...\tenrm *
...\glue 4.44444 plus 4.99997 minus 0.37036
...\tenrm (

在此处输入图片描述

答案2

\spacefactor是具有“全局行为”的原始 TeX 寄存器。有多个 TeX 寄存器,它们不遵循 TeX 组,并且对它们的每次分配都是全局的。\spacefactor就是一个例子。

引用文本的作者只想保留以下空间,并且他知道这\spacefactor是全局的。因此,他使用了引用的符号:打开组,执行全局分配,关闭组,空间。

如果这里没有组括号,那么 3000 之后的空格将被<number>语法规则占用。

还有另一种可能可以达到同样的效果:\spacefactor=3000 \space

相关内容