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):

section 354 of TeX

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