如何向宏添加钩子

如何向宏添加钩子

LaTeX 广泛使用钩子,其中一种方法是使用命令g@addto@macro。它在 source2e 中定义为:

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

g@addto@macro我在下面的最小示例中使用了:

\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}

在宏中添加钩子的最佳方法是什么 - 在开头还是在结尾以外的任何地方?

答案1

\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

(完整的工作示例;要将其转变为乳胶,需移除\bye并添加必要的乳胶残余物。)

答案2

看看电子工具箱包,它提供了一组丰富的命令,用于“钩子管理”甚至命令的“修补”。

相关内容