[Tex/LaTex] How to add a hook to a macro

expansionhooksmacrosprogrammingtex-core

LaTeX uses hooks extensively, one method employed is the command g@addto@macro. It is defined in source2e as:

 \long\def\g@addto@macro#1#2{%
  \begingroup
     \toks@\expandafter{#1#2}%
     \xdef#1{\the\toks@}%
  \endgroup}

I have used the g@addto@macro in the minimal example below:

\documentclass{article} 
\begin{document}

\long\def\mainmacro{Preambles in main macro. \par}
\xdef\testOne{Contents of first macro. \par }
\xdef\testTwo{Contents of second macro. \par }

\makeatletter
  \g@addto@macro{\mainmacro}{\testOne}
  \g@addto@macro{\mainmacro}{\testTwo \par}
  \g@addto@macro{\mainmacro}{Adhoc contents (1). \par}
  \g@addto@macro{\mainmacro}{\xdef\@elt{ Test } }
  \g@addto@macro{\mainmacro}{Adhoc contents (2).\@elt \par}
\makeatother

\mainmacro
\end{document}

What would be the best way to add a hook to the macro – at the beginning or for that matter anywhere but the end?

Best Answer

\def\foo{\message{Here is the original \string\foo}}
\def\foohook{\message{Whatever.}}

% Add a hook to \foo (\foohook does not have be predefined):
\toks0\expandafter{\expandafter\foohook\foo}
\edef\foo{\the\toks0}

% Demo:
\foo
\def\foohook{\message{Redefined \string\foohook}}
\foo
\bye

(Complete working example; to turn it into latex, remove \bye and add necessary latex cruft.)

Related Question