(Forgot where I saw this but should be some official doc):

A TEX string (and thus an expl3 string) is a series of characters which have category code 12 (“other”) with the exception of space characters which have category code 10 (“space”).

Why is it catcode 12 "other" but not 11 "letter"? Does this mean even A-Za-z are all "other"s in a string? How does this interact with \makeatletter and \makeatother?

1 Answer 1


That is the convention used by several tex primitives, which makes it natural to follow in expl3. \string, \jobname, \detokenize, \meaning all return token lists that are catcode 12 or 10.

\makeatletter and \makeatother just switch the catcode of @ between 11 and 12, are not directly related to this at all.

  • Then what is the exact difference between catcode 11 and 12? If it's OK to use 12 for letters, why must we switch between 11 and 12 for @ but not let it stay at 12?
    – Cyker
    Jun 27, 2020 at 16:05
  • I mean, doesn't tex require every catcode in a control sequence to be 11?
    – Cyker
    Jun 27, 2020 at 16:05
  • 1
    @Cyker only when parsing a csname as \abc if you use \csname abc\endcsname catcodes are not involved as long as the content expands to any sequence of character tokens of any catcode. Jun 27, 2020 at 16:07
  • 2
    @Cyker when the catcode of @ is 11 then \@empty is a macro defined to be empty, if the catcode of @ is 12 then \@empty is the command \@ followed by the letters empty. Jun 27, 2020 at 16:09
  • That's the point. TYVM
    – Cyker
    Jun 27, 2020 at 16:31

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .