第 46 页的以下摘录是什么意思电子书?
TeX在情况 (c) 中进入状态
S
,或在情况 (b) 中针对第 10 类(空格)的字符进入状态
这是否意味着在情况 (b) 中必须跳过空格?如果是,为什么下面的例子显示相反的情况?
\chardef\x=`\%
\% a % case (b) - not skipped
\x a % case (c) - skipped
\bye
此外,“关于第 10 类字符(空格)”部分是否仅与“情况 (b)”相关,还是与两者都相关?
以下为完整段落:
如果TeX在任何状态下看到转义字符(类别 0),它会按如下方式扫描整个控制序列名称。(a)如果行中没有其他字符,则名称为空(如
\csname\endcsname
)。否则(b)如果下一个字符不属于类别 11(字母),则名称由该单个符号组成。否则(c)名称由以当前字母开头并在第一个非字母之前或行末结束的所有字母组成。此名称成为控制序列标记。 TeX进入状态S
,或在情况 (b) 中针对第 10 类(空格)的字符进入状态;否则TeX进入状态M
。
答案1
从不同的角度来看:该段落试图解释 TeX 程序的第 354 节,有关状态的部分是下面的蓝色矩形(包含的第 356 和 355 节恰好不影响state
):
所以它的意思是如果转义字符后面紧接着的字符是字母或空格 [这在 TeXbook 中分别被写为“case (c)”和“case (b) 对于类别 10(空格)的字符”],则 TeX 进入skip_blanks
状态,否则进入mid_line
状态。
由于 TeX 和 TeXbook 错综复杂的进化历史(我的理解是,首先编写了 TeX,然后编写了一本手册来解释它,然后 TeX 被完全重写,手册没有发生太大变化(!),然后手册继续调整以适应对 TeX 的调整),有时(在我看来)通过阅读代码来理解 TeX 的某些方面比阅读电子书。
附录:如果您发现图像难以阅读,这里再次提供该部分,从中取出代码tex.web
并重新格式化并将标签改为大写:
@<Scan a control...@>=
begin
if loc > limit then
cur_cs := null_cs {|state| is irrelevant in this case}
else
begin
START_CS:
k := loc;
cur_chr := buffer[k];
cat := cat_code(cur_chr);
incr(k);
if cat = letter then
state := skip_blanks
else if cat = spacer then
state := skip_blanks
else
state := mid_line;
if (cat = letter) and (k <= limit) then
@<Scan ahead in the buffer until finding a nonletter; if an expanded code is encountered, reduce it and |goto START_CS|; otherwise if a multiletter control sequence is found, adjust |cur_cs| and |loc|, and |goto FOUND|@>
else
@<If an expanded code is present, reduce it and |goto START_CS|@>;
cur_cs := single_base + buffer[loc];
incr(loc);
end;
FOUND:
cur_cmd := eq_type(cur_cs); cur_chr := equiv(cur_cs);
if cur_cmd >= outer_call then
check_outer_validity;
end
答案2
在情况 (c) 中,或对于第 10 类字符 (空格) 的情况 (b) 中;
表示后面的字符\
是字母的情况(情况 c)或者后面的字符\
是空格的情况(情况 b(非字母)如果是空格)
因此在这些情况下,以下空格会被跳过,
在其他情况下(非字母、非空格),则不会跳过空格。
因此,a 的\<space>
作用类似于 b 情况(非字母),因为只有一个字符被视为名称的一部分,但它的作用类似于 c 情况(字母),因为后面的空格会被跳过。