知道为什么以下操作不起作用以及如何修复它:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[no markers]
\pgfmathsetmacro{\i}{0}
\foreach \f in {sin(deg(x)),x^2}
{
\addplot {\f} node [pos=0.6,right] {\i};
\pgfmathsetmacro{\i}{\i+1};
}
\end{axis}
\end{tikzpicture}
\end{document}
我得到以下输出:
编辑:
我希望循环中的值\i
在循环的一次传递中是相同的,无论我使用\i
节点还是其他东西(这可能与扩展问题有关),在循环结束时我想设置一个新的值\i
。
或者换句话说:我只想使用变量,\i
就像在其他编程语言中在循环内所做的那样......
答案1
这里涉及两个问题:
- 的赋值
\i
是 引入的组的局部赋值\foreach
,因此\i
每次迭代都会重置。您可以通过用 替换\foreach
来解决这个问题\pgflotsforeachungrouped
,这样不会引入分组。 的内容
node
未展开,而是保存为\i
。环境中的节点(和其他 TikZ 绘图命令)axis
不会立即绘制,而只会在轴完成后绘制(否则不清楚将节点放在哪里)。因此,使用当前代码,您最终会得到两个节点读取(两次迭代后2.0
的最终值)。PGFPlots以定义的方式存储命令,因此您有两个包含的节点,当的值为 2.0 时,它们会在绘图结束时执行。\i
node
\i
\i
要使节点使用调用命令
\i
时的值,您可以将其替换为\addplot
\addplot ...
\edef\doplot{\noexpand\addplot {\f} node [pos=0.6,right] {\i};} \doplot
这样做的目的是创建一个名为 的新宏
\doplot
,其中包含\addplot {<content of \f>} node [pos=0.6, right] {<content of \i>}
,因此两个宏\f
和\i
已经扩展(因此得名*e*def
)。该\addplot
命令不应扩展,因此我们使用来保护它\noexpand
。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[no markers]
\pgfmathsetmacro{\i}{0}
\pgfplotsforeachungrouped \f in {sin(deg(x)),x^2}
{
\pgfmathsetmacro{\i}{\i+1};
\edef\doplot{\noexpand\addplot {\f} node [pos=0.6,right] {\i};}
\doplot
}
\end{axis}
\end{tikzpicture}
\end{document}