我正在使用 创建 3D 图像pgfplots
。为了指定某些坐标,我创建了一个宏
\newcommand{\setpolarcoord}[4]{ % {Name}{r}{theta}{phi}
\pgfmathsetmacro{\tx}{#2*sin(#3)*cos(#4)}
\pgfmathsetmacro{\ty}{#2*sin(#3)*sin(#4)}
\pgfmathsetmacro{\tz}{#2*cos(#3)}
\coordinate (#1) at (\tx, \ty, \tz);
}
然后pgfplots
我可以使用此宏通过球坐标指定一个坐标:
\setpolarcoord{C}{1}{90}{25};
\draw [->] (0, 0, 0) -- (C);
但是,当我在同一个环境中多次执行此操作时axis
,所有创建的坐标都是相同的(最后创建的坐标),这可能是因为我更改了宏内的和\tx
,并且仅在指定了要绘制的所有内容时才会扩展。\ty
\tz
pgfplots
有没有办法扩展宏里面的值,以便单独创建的坐标以后不会改变?
答案1
定义中的最后一项在读取阶段不会扩展,但会与的最后值一起存储\tx,\ty,\tz
。
为了使它们展开,你可以将最后一行更改为
\edef\temp{\noexpand\coordinate (#1) at (\tx, \ty, \tz);}\temp
这\edef
是扩展定义,它在赋值之前扩展了参数。我们临时定义一个宏 via\edef
并调用它\temp
,但放置 a \noexpand
,它在扩展期间保持\coordinate
不变。因此,我们实际上扩展了除 之外的任何可扩展项\coordinate
。因此,现在我们有一个\temp
定义为
\coordinate (<Name>) at (<num>,<num>,<num>);
但到目前为止,它只定义了一个。因此,我们\temp
在最后添加了另一个来执行它。为了使它真正变得非常严格,你可以这样写
\begingroup\edef\temp{\endgroup\noexpand\coordinate (#1) at (\tx, \ty, \tz);}\temp
\temp
通过关闭定义之前打开的组并仅留下流上的内容,该组在执行后消失。