用于定义单个参数宏的宏

时间:2015-04-08 11:15:28

标签: macros latex

我正在尝试定义一个可以简化定义后续宏的宏。

我想模拟的行为如下:

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

如何实现这种行为?

1 个答案:

答案 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采用单个(强制)参数。