
対応する角度などの情報を書き込むパルス列を描画したいのですが、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
\node
axis
\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
内部をよりよく理解している人なら、これがなぜ必要なのかについて、さらに詳しい説明をしてくれるかもしれません。