16

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?

11
\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.)

  • Thanks. Looks so much simpler than the LaTeX @g@addto@macro. TeX is fine too. For examples that don't use LaTeX packages I rather prefer TeX myself. – Yiannis Lazarides Dec 7 '10 at 16:30
13

Have a look at the etoolbox package, which provides a rich set of commands for “hook management” and even “patching” of commands.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.