将一个命令作为参数传递给另一个命令

将一个命令作为参数传递给另一个命令

你好,我有一些数据列表,我已将其定义为宏。下面的所有内容都在一个包中。

\newcommand{\testa}[0]{1/2/2/1,3/4/2/3}

我还有更多这样的预定义命令。我还有一个命令,我想利用我之前定义的这些宏。

\newcommand{\dosomething}[1]{
\begin{tikzpicture}
\foreach \x / \y / \a / \b in {#1} {
\draw[black,line width=0.1cm] (\a,\b) -- (\x,\y);
};
\end{tikzpicture}
}

但问题是,当我尝试在包外使用它们时,就会发生这种情况。

% The following works
\dosomething{1/2/2/1,3/4/2/3}
% This however does not...
\dosomething{\testa}

我最终得到了错误

! Missing = inserted for \ifnum
<to be read again>
                   /

显然我误解了一些东西,但我不确定是什么。我尝试搜索这个问题,但我找不到我想要的东西,或者我对乳胶的了解太少,无法将其与我自己的问题联系起来。谢谢你的帮助。

答案1

由于您要使用坐标,因此可以扩展参数:

\newcommand{\dosomething}[1]{%
  \edef\dosomethingargument{#1}%
  \begin{tikzpicture}
    \foreach \x / \y / \a / \b in \dosomethingargument {
      \draw[black,line width=0.1cm] (\a,\b) -- (\x,\y);
    };
  \end{tikzpicture}%
}

完整示例

\documentclass{article}
\usepackage{tikz}

\newcommand{\dosomething}[1]{%
  \edef\dosomethingargument{#1}%
  \begin{tikzpicture}
    \foreach \x / \y / \a / \b in \dosomethingargument {
      \draw[black,line width=0.1cm] (\a,\b) -- (\x,\y);
    };
  \end{tikzpicture}%
}

\newcommand{\testa}{1/2/2/1,3/4/2/3}

\begin{document}

\section{Explicit}

\dosomething{1/2/2/1,3/4/2/3}

\section{Implicit}

\dosomething{\testa}

\end{document}

在此处输入图片描述

如果可能\testa含有危险物质\edef,请使用

\edef\dosomethingargument{\unexpanded\expandafter{#1}}

有什么诀窍?宏\foreach需要一组变量,后面跟着in;然后检查括号。如果找到,\foreach则将匹配的闭括号之前的文本解释为循环的项目集。否则,后面的标记in应该是一个宏,它\foreach作为循环项目的容器。

因此,\foreach \x/\y/\a/\b in {\testa}循环针对单个项目执行。相反,\foreach \x/\y/\a/\b in \testa将对 中包含的所有项目执行循环\testa。通过这样做,\edef我们始终可以传递\foreach一个宏。

相关内容