使用相同的宏创建不同的坐标

使用相同的宏创建不同的坐标

我正在使用 创建 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\tzpgfplots

有没有办法扩展宏里面的值,以便单独创建的坐标以后不会改变?

答案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通过关闭定义之前打开的组并仅留下流上的内容,该组在执行后消失。

相关内容