我有几个具有类似结构的宏,例如:
\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