使用 pgfplots 的 foreach 循环中的 pgfmathsetmacro 问题

使用 pgfplots 的 foreach 循环中的 pgfmathsetmacro 问题

知道为什么以下操作不起作用以及如何修复它:

\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

这里涉及两个问题:

  1. 的赋值\i是 引入的组的局部赋值\foreach,因此\i每次迭代都会重置。您可以通过用 替换\foreach来解决这个问题\pgflotsforeachungrouped,这样不会引入分组。
  2. 的内容node未展开,而是保存为\i。环境中的节点(和其他 TikZ 绘图命令)axis不会立即绘制,而只会在轴完成后绘制(否则不清楚将节点放在哪里)。因此,使用当前代码,您最终会得到两个节点读取(两次迭代后2.0的最终值)。PGFPlots以定义的方式存储命令,因此您有两个包含的节点,当的值为 2.0 时,它们会在绘图结束时执行。\inode\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}

相关内容