我正在尝试定义一个可以简化定义后续宏的宏。
我想模拟的行为如下:
\def\mydef#1{MAGIC}
\mydef{foo}
\mydef{bar}
\foo{sometext}% outputs a decorated "foo:sometext"
\bar{sometext}% outputs a similarly decorated "bar:sometext"
我一直在试验以下内容:
\def\mydef#1{%
\expandafter\def% % define when argument is ready
\csname #1\endcsname% % set the new macro's handle
???% % handle arguments to new macro
{\decorate{#1}{???}}% % decorate appropriately
}
如何实现这种行为?
答案 0 :(得分:1)
在您的实例中,技术上无需处理\mydef
内的参数。例如,您可以执行以下操作:
FOO:sometext
条:sometext
\documentclass{article}
\def\mydef#1{%
\expandafter\def% % define when argument is ready
\csname #1\endcsname% % set the new macro's handle
{\decorate{#1}}% % decorate appropriately
}
\newcommand{\decorate}[2]{#1:#2}
\begin{document}
\mydef{foo}
\mydef{bar}
\foo{sometext}% outputs a decorated "foo:sometext"
\bar{sometext}% outputs a similarly decorated "bar:sometext"
\end{document}
\decorate
确实有两个参数,即使你只在\mydef
创建中传递了一个参数。但是,由于(La)TeX是一种宏扩展语言,扩展只是将\decorate{.}
插入到输入流中,让\decorate
接收后面跟随的任何内容(两个标记)。
您会看到\show\foo
将以下内容打印到.log
:
> \foo=macro:
->\decorate {foo}.
暗示\foo
没有参与。
如果您希望在\mydef
内部创建宏的过程中捕获参数,那么您应该double the #
:
\def\mydef#1{%
\expandafter\def% % define when argument is ready
\csname #1\endcsname% % set the new macro's handle
##1% % handle arguments to new macro
{\decorate{#1}{##1}}% % decorate appropriately
}
\show\foo
现在显示
> \foo=macro:
#1->\decorate {foo}{#1}.
意味着\foo
采用单个(强制)参数。