When does tex do macro expansion

macrostex-core

Having read some chapters of the texbook, I know tex eats input lines from command line or files, then converts them into tokens. When these tokens go into its gastro-intestinal tract, tex prepares to digest them by converting them into boxes, glues and other whatsit, then construts some lists.

With regard to macros, in which stage tex save its macro definition, in which stage tex do the macro expansion for tex replacement?

Best Answer

That's easy! TeX always does macro expansion, except when it doesn't.

On page 215, second double dangerous paragraph, we read

Expansion is suppressed at the following times:

  • When tokens are being deleted during error recovery (see Chapter 6).
  • When tokens are being skipped because conditional text is being ignored.
  • When TeX is reading the arguments of a macro.
  • When TeX is reading a control sequence to be defined by \let, \futurelet, \def, \gdef, \edef, \xdef, \chardef, \mathchardef, \countdef, \dimendef, \skipdef, \muskipdef, \toksdef, \read, and \font.
  • When TeX is reading argument tokens for \expandafter, \noexpand, \string, \meaning, \let, \futurelet, \ifx, \show, \afterassignment, \aftergroup.
  • When TeX is absorbing the parameter text of a \def, \gdef, \edef, or \xdef.
  • When TeX is absorbing the replacement text of a \def or \gdef or \read; or the text of a token variable like \everypar or \toks0; or the token list for \uppercase or \lowercase or \write. (The token list for \write will be expanded later, when it is actually output to a file.)
  • When TeX is reading the preamble of an alignment, except after a token for the primitive command \span or when reading the after \tabskip.
  • Just after a token such as $3 that begins math mode, to see if another token of category 3 follows.
  • Just after a `12 token that begins an alphabetic constant.

Not unreasonable, is it? When doing definitions, we want that nothing is expanded (except for \edef and \xdef) and the fourth, fifth, sixth and seventh bullets deal with this. Similarly if we want to store a token list in a register or in \write.

Similarly, the token after \expandafter, \noexpand, \afterassignment or \aftergroup must not be expanded for obvious reasons; it will later, when TeX examines it again at the appropriate time.

The last bullet has a technical reason: If you want to refer to an alphabetic constant that corresponds to a character with \catcode 0, 5, 9, 13, 14, or 15 it can be “escaped” with a backslash in front of it, but this actually doesn't form a control sequence. So you can do `\^^M if you want to refer to the constant 13 or do \chardef\%=`\%.

The second bullet can be supplemented by an important remark: notwithstanding that TeX does no expansion when skipping conditional text, it does examine the tokens in order to match conditionals with their \else or \fi. Any token that is \let to a primitive conditional, to \else or \fi counts under this respect.