(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?


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 '20 at 16:05
  • I mean, doesn't tex require every catcode in a control sequence to be 11?
    – Cyker
    Jun 27 '20 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 '20 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 '20 at 16:09
  • That's the point. TYVM
    – Cyker
    Jun 27 '20 at 16:31

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.