Explanation of TeX’s reading rules in TeXbook
in case (c), or in case (b) with respect to a character of category 10 (space);
means the cases that the character after \
is a letter (case c) or the character after \
is a space (case b (non-letter) in the case that it is a space)
So in those cases the following space is skipped,
In other cases (non-letter, non-space) then the space is not skipped.
So, a \<space>
acts as case b (non letter) in that only one character is considered part of the name, but it acts like case c (letter) in that following spaces are skipped.
For a different perspective: the paragraph is an attempt to explain section 354 of the TeX program, and the part about the state is the blue rectangle below (the included sections 356 and 355 happen not to affect state
):
So what it means is that if the character immediately after the escape character is either a letter, or a space [this is what is written in the TeXbook as “case (c)” and as “case (b) with respect to a character of category 10 (space)” respectively], then TeX goes into the skip_blanks
state, else it goes into the mid_line
state.
Because of the tangled evolutionary history of TeX and The TeXbook (my understanding is that first TeX was written, then a manual was written explaining it, then TeX was completely rewritten in such a way that the manual didn't change much(!), then the manual continued to be tweaked to account for tweaks to TeX), it can sometimes be easier (IMO) to understand some aspect of TeX by just reading the code than to read the TeXbook.
Appendix: If you find the image hard to read, here is the section again, taking the code from tex.web
and reformatting it a little and putting the labels in uppercase:
@<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