
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 axis
Umgebung die Auswertung einiger Dinge bis verschiebt \end{axis}
, existieren die Variablen \temps
und \angle
zu diesem Zeitpunkt nicht mehr. In diesem Fall können Sie verwenden, \pgfplotsinvokeforeach
wodurch der Schleifenzähler sofort durch einen beliebigen #1
Wert 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:
Noch ein Hinweis: Im Abschnitt 4.17 „Benutzerdefinierte Anmerkungen“ des pgfplots
Handbuchs erfahren Sie, wie Sie Knotenkoordinaten im Plot-Koordinatensystem mithilfe von angeben können axis cs
.
Technische Details
Anscheinend haben Sie versucht, die Erweiterung von \temps
und \angle
die 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 \temps
scheint es eine schlechte Wahl für einen Makronamen zu sein, obwohl ich nicht sagen kann, warum. Wenn Sie \node
aus 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 \temps
es \temp
jedoch in umbenennen, funktioniert es!
\node
Das erlaubt Ihnen aber immer noch nicht, den Befehl mit \temp
innerhalb der Schleife zu verwenden . Es wird immer noch bemängelt, dass \temp
undefiniert ist, da das \node
Makro nur am Ende der Umgebung ausgewertet wird . Eine Problemumgehung besteht darin, die Erweiterung von und mit wie folgt axis
manuell 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 \angle
auf erweitert -21
, dann \temp
auf 0
und dann \LoopBody{0}{-21}
(usw.). Das ist jedoch nichts, was ich wirklich empfehlen kann, da es schwer zu verstehen und zu debuggen ist. Vielleicht pgfplots
kann jemand mit einem besseren Verständnis der internen Vorgänge mehr Einblicke geben, warum dies überhaupt notwendig ist.