你好,我有一些数据列表,我已将其定义为宏。下面的所有内容都在一个包中。
\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
一个宏。