我有以下代码:
\begin{tikzpicture}
\begin{axis}[domain=0:40]
\addplot {x};
\def\a{\pgfmathparse{1+1}\pgfmathresult}
%\draw (\a,20)--(axis cs:20,0);
\node at (axis cs:30,30) {\a};
\end{axis}
\end{tikzpicture}
节点给出了正确的输出,但绘制命令却无法按预期工作。为什么?(取消注释\draw
会破坏代码。)
答案1
该\pgfmathparse
宏不可扩展,不能在坐标内使用。将\pgfmathresult
其放在后面,在另一个宏内,如\a
或单独放置,不会改变任何东西。您需要放置结果,如\pgfmathresult
,它可以在坐标中扩展。但是\pgfmathresult
被覆盖任何内部数学运算,因此不应使用!要么使用\let\a=\pgfmathresult
(=
可选)或\pgfmathsetmacro{\a}{1+1}
(推荐),正如您和 Jake 分别发布的那样,要么将\edef\a{\pgfmathresult}
的当前值存储\pgfmathresult
到其中\a
,然后可以在坐标内安全地使用。
您的原始代码之所以可以\a
在节点内容 ( {\a}
) 内工作,是因为该部分被排版为一个框。框的内容不需要完全展开,但会被执行,也就是说,会\pgfmathparse
按正常方式执行,然后\pgfmathresult
立即排版,之后才能被任何其他代码更改。
答案2
我确实说不出为什么,但以下方法可以正常工作:
\pgfmathparse{1+1}\let\a=\pgfmathresult