下面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
。