Problem mit einer Foreach-Schleife mit zwei Variablen

Problem mit einer Foreach-Schleife mit zwei Variablen

Ich möchte eine Impulsfolge zeichnen, auf die ich einige Informationen schreibe, wie den entsprechenden Winkel usw. Aber ich glaube, ich habe ein Problem mit den beiden Variablen in der foreach-Schleife, weil ich nicht einmal kompilieren kann, seit ich diese Zeile hinzugefügt habe

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

Der gesamte Code lautet:

\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}

Vielen Dank im Voraus für Ihre Hilfe. Zu meiner Verteidigung: Ich bin ein Anfänger in Tikz-PGF

Antwort1

Da die axisUmgebung die Auswertung einiger Dinge bis verschiebt \end{axis}, existieren die Variablen \tempsund \anglezu diesem Zeitpunkt nicht mehr. In diesem Fall können Sie verwenden, \pgfplotsinvokeforeachwodurch der Schleifenzähler sofort durch einen beliebigen #1Wert im Schleifenkörper ersetzt wird. Der einzige Nachteil besteht darin, dass mehrere Schleifenvariablen nicht unterstützt werden, sodass Sie eine aus der anderen wie folgt berechnen müssen:

\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) {};
}

Dies ergibt:

Ergebnis

Noch ein Hinweis: Im Abschnitt 4.17 „Benutzerdefinierte Anmerkungen“ des pgfplotsHandbuchs erfahren Sie, wie Sie Knotenkoordinaten im Plot-Koordinatensystem mithilfe von angeben können axis cs.


Technische Details

Anscheinend haben Sie versucht, die Erweiterung von \tempsund \angledie Verwendung von zu erzwingen \edef, aber dabei müssen Sie alles schützen, was Sie nicht mit erweitern möchten \noexpand, was ziemlich mühsam ist. Wenn Sie die Erstellung der Pins aus der Achsenumgebung verschieben, funktioniert es, aber dann ist es schwierig, die Pins mit dem Plot auszurichten ...

Abgesehen davon \tempsscheint es eine schlechte Wahl für einen Makronamen zu sein, obwohl ich nicht sagen kann, warum. Wenn Sie \nodeaus der Schleife entfernen, funktioniert es immer noch nicht:

\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>schlägt aus mir unbekannten Gründen mit fehl . Wenn Sie \tempses \tempjedoch in umbenennen, funktioniert es!

\nodeDas erlaubt Ihnen aber immer noch nicht, den Befehl mit \tempinnerhalb der Schleife zu verwenden . Es wird immer noch bemängelt, dass \tempundefiniert ist, da das \nodeMakro nur am Ende der Umgebung ausgewertet wird . Eine Problemumgehung besteht darin, die Erweiterung von und mit wie folgt axismanuell zu erzwingen :\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}
}

Dies wird zuerst \angleauf erweitert -21, dann \tempauf 0und dann \LoopBody{0}{-21}(usw.). Das ist jedoch nichts, was ich wirklich empfehlen kann, da es schwer zu verstehen und zu debuggen ist. Vielleicht pgfplotskann jemand mit einem besseren Verständnis der internen Vorgänge mehr Einblicke geben, warum dies überhaupt notwendig ist.

verwandte Informationen