Hans Aberg (>) and myself (>>) wrote >>Undescore in names >>~~~~~~~~~~~~~~~~~~~ >>Changing the _ catcode prevents from using explicit subscript characters. >>I think there are better candidates: "other" character except =, <, >, >>. (sadly), , (ie, comma), - and +. (Namely /, !, ?, : (already used), ;, >>@, |...) > > This is something I worried about at first. But it is possible to build a >new development level above the fundamental one where _ works as usual: [snip] Yet another level? No, please! ;-) Furtunately, the \lccode / \lowercase trick allows to introduce explicit subscripts in all of the known levels, but it's a mess. >>Argument specifiers >>~~~~~~~~~~~~~~~~~~~~ >.. >>\let:NN{\arg1}{\arg2} is particularly amusing because the first N is >>\arg1 and the second one is { with an unmatched brace. > > One variation could be \<module name>_<command name>:<argument type>:, >with a final ":" delimiting the argument type (\let:N: etc). [snip] That is not the problem. The first argument is an actual macro argument which it's read as usual, removing the braces if present. That expands to \let\arg1= which in turn reads the very first token doesn't matter its categorie, in this case {. This leaves \arg2} unused, where you can see the unmatched brace. A bit tricky but clear when you are using TeX; with \let:NN is not so clear what are you doing -- except when you learn its TeX equivalence! (Admittedly this example is typical of a warped mind :-) ) Regards Javier Bezos