l3basics.dtx mentions \c_space_chartok, evidently the equivalent of \@sptoken, but it's not defined anywhere. In fact there is a group of similar "character-token primitives". For experimentation purposes I would suggest giving them new LaTeX3 names in l3basics. Some, if not all of these, as I recall, are dealt with off somewhere in another package, but it did not get included in the expl3 release. (catcode 1) \bgroup -> \group_begin_lbrace: (?) (catcode 2) \egroup -> \group_end_rbrace: (?) (catcode 3) $ -> \math_start: (and also \math_end:) \gdef:Npn \math_start_display: {\math_start:\math_start:} \gdef:Npn \math_end_display: {\math_end:\math_end:} (catcode 4) & -> \align_end_cell: (catcode 6) # -> \param_marker: (catcode 7) ^ -> \math_superscript:w (catcode 8) _ -> \math_subscript:w (catcode 10) space -> \c_space_chartok Some interesting tricks can be done when a control sequence \param_marker: instead of a character # is embedded in macro definitions. The behavior of the macro is affected at run-time by the current local definition of the control sequence. (LaTeX already uses this in constructing preambles for array and tabular, but I played around with the idea a little more, some time ago.) If you wanted to handle the above single-character functions in l3names.dtx in full generality, one could argue that you need 256 names for each catcode. But I guess 1 or 2 will be enough :-) The following which are used by TeX when scanning numbers and dimens probably are also useful to have (must be assigned with def, not let). (catcode 12) ' -> \num_octal (catcode 12) " -> \num_hex (catcode 12) - -> \num_minus (catcode 12) . -> \num_decimal (catcode 12) = -> \num_equal (catcode 12) ` -> \num_alph "alphabetic constant" Michael Downes