附加到新定义的命令的自定义 \def 命令

附加到新定义的命令的自定义 \def 命令

我有几个具有类似结构的宏,例如:

\def\firstmacro#1{\myinitializer ...actual code... \myfinalizer}
\def\secondmacro#1{\myinitializer ...actual code... \myfinalizer}
\def\thirdmacro#1{\myinitializer ...actual code... \myfinalizer}

\myinitializer\myfinalizer只是更复杂的初始化代码的占位符。)我在想如何通过定义自定义\def宏来简化这个通用结构。我得到了

\def\custom@def#1{
  \def#1{\myinitializer\csname custom@#1\endcsname}
  \expandafter\def\csname custom@#1\endcsname
}

\custom@def\firstmacro#1{...actual code... \myfinalizer}
\custom@def\secondmacro#1{...actual code... \myfinalizer}
\custom@def\thirdmacro#1{...actual code... \myfinalizer}

因此,\custom@def定义要调用的命令\myinitializer并传递给包含实际定义的内部命令。第一个参数之后的所有内容\def都传递给\def该内部宏。但是,使用这种方法,\myfinalizer仍然需要明确指定。有什么想法可以消除这个问题吗?

答案1

提供etoolbox了一个\appto\preto,可用于将一些代码附加或添加到现有宏的前缀中。但是,对于您的情况,我会直接收集参数文本和替换文本作为宏参数,并在其周围添加 init 和 final 代码。

{通过在宏定义中将 a 放在#the 之前,您可以收集到下一个开头之前的所有内容{。这样,您就可以收集宏名称和参数文本:

\documentclass{article}

\makeatletter
\def\custom@def#1#{%
    \@custom@def{#1}%
}
\def\@custom@def#1#2{%
  \def#1{\myinitializer#2\myfinalizer}%
}


\custom@def\mytest{test}
\show\mytest

\custom@def\mytest#1#2{(#1)(#2)}

\show\mytest

\makeatother
\begin{document}


\end{document}

给出:

> \mytest=macro:
->\myinitializer test\myfinalizer .
l.14 \show\mytest

? 
> \mytest=macro:
#1#2->\myinitializer (#1)(#2)\myfinalizer .
l.18 \show\mytest

相关内容