2つの変数のforeachループの問題

2つの変数のforeachループの問題

対応する角度などの情報を書き込むパルス列を描画したいのですが、2つの変数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。唯一の欠点は、複数のループ変数をサポートしていないため、次のように 1 つをもう 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で コマンドを使用することはできません。マクロは環境の最後でのみ評価されるため、 は未定義であると依然としてエラーが出ます。回避策の 1 つは、次のようにしてとの展開を手動で強制することです。\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内部をよりよく理解している人なら、これがなぜ必要なのかについて、さらに詳しい説明をしてくれるかもしれません。

関連情報