两个变量的 foreach 循环问题

两个变量的 foreach 循环问题

我想绘制一个脉冲序列,在上面写一些信息,比如相应的角度等...但我认为我对这两个变量的 foreach 循环有问题,因为自从我添加了这一行后,我甚至无法编译

\addplot[dirac] coordinates {(\temps,0.75)};

整个代码如下:

\documentclass[tikz]{standalone}

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage{pgfplots}

\pgfplotsset{
  dirac/.style={
    mark=triangle*, mark options={scale=2}, ycomb, scatter, blue,
    visualization depends on={y/abs(y)-1 \as \sign},
    scatter/@pre marker code/.code={\scope[rotate=90*\sign,yshift=-2pt]}
  }
}

\begin{document}
  \begin{tikzpicture}
  \tikzset{
    every pin/.style={fill=yellow!50!white,rectangle,rounded                corners=3pt,font=\scriptsize},
    small dot/.style={fill=black,circle,scale=0.2}
}

\begin{axis}[axis lines=middle,x=1,xmin=-25,xmax=375,y=100,ymin=0,ymax=1,
  title={Train d'impulsions à 40MHz},ylabel={Tx},xlabel={Temps/ns},
  every axis y label/.style={at={(ticklabel cs:1)},anchor=near ticklabel},
  every axis x label/.style={at={(ticklabel cs:1)},anchor=near ticklabel},
  ytickmin=2, xtickmax=350, axis y line=left
  ]

  \foreach \temps/\angle in {0/-21, 25/-18, 50/-15, 75/-12}{
     \edef\temp{\noexpand
     \addplot[dirac] coordinates {(\temps,0.75)};
     \node[small dot,pin={$\angle\degres$}]  at (25+\temps,70) {};}
     \temp
  }

    \end{axis}
  \end{tikzpicture}
\end{document}

提前感谢你的帮助。为了辩护,我是 Tikz-PGF 的初学者

答案1

由于axis环境将某些事物的评估推迟到\end{axis},因此变量\temps\angle到那时不再存在。在这种情况下,您可以\pgfplotsinvokeforeach立即使用循环计数器替换#1循环体中给定的任何值。唯一的缺点是它不支持多个循环变量,因此您必须像这样从另一个计算一个:

\pgfplotsinvokeforeach{0,25,...,75}{
  \addplot[dirac] coordinates {(#1,0.75)};
  \node[small dot,pin={
    \pgfmathtruncatemacro{\angle}{#1/25*3-21}%
    $\angle\degres$
  }]  at (25+#1,70) {};
}

得出:

结果

另外提示:您应该查看pgfplots手册的第 4.17 节“自定义注释”,了解如何使用 在绘图坐标系中指定节点坐标axis cs


技术细节

似乎您尝试使用强制扩展\temps和,但这样做您必须保护您不想使用 扩展的所有内容,这非常繁琐。如果您将引脚的创建移出轴环境,它可以工作,但很难将引脚与图对齐...\angle\edef\noexpand

除此之外,这\temps似乎不是一个好的宏名选择,虽然我不知道为什么。如果你\node从循环中删除,它仍然不起作用:

\foreach \temps/\angle in {0/-21, 25/-18, 50/-15, 75/-12}{
   \addplot[dirac] coordinates {(\temps,0.75)};
}

使用 失败Incomplete \iffalse; all text was ignored after line <N>,原因我不清楚。但是,如果您将其重命名\temps\temp,它就可以正常工作!

但这仍然不允许你在循环中使用\node命令 with 。它仍然抱怨未定义,因为宏仅在环境结束时进行评估。一种解决方法是手动强制扩展and使用,如下所示:\temp\temp\nodeaxis\temp\angle\expandafter

\def\LoopBody#1#2{%
  \addplot[dirac] coordinates {(#1,0.75)};
  \node[small dot,pin={$#2\degres$}]  at (25+#1,70) {};
}
\let\EA=\expandafter% For shorter code
\foreach \temp/\angle in {0/-21, 25/-18, 50/-15, 75/-12}{
   \EA\EA\EA\LoopBody\EA\EA\EA{\EA\temp\EA}\EA{\angle}
}

这首先会扩展\angle-21,然后\temp扩展为0,然后\LoopBody{0}{-21}(等等)。但是,我并不推荐这样做,因为它很难理解和调试。也许对pgfplots内部原理有更深入理解的人可以更深入地了解为什么这样做是必要的。

相关内容