# catcode in expl3 string

(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? Jun 27 '20 at 16:05
• @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
• @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