
Quiero dibujar un tren de pulsos en el que escribo información como el ángulo correspondiente, etc... Pero creo que tengo un problema con las dos variables para cada bucle porque ni siquiera puedo compilar desde que agregué esta línea.
\addplot[dirac] coordinates {(\temps,0.75)};
El código completo es:
\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}
Gracias de antemano por ayudarme. Para mi defensa, soy principiante en Tikz-PGF.
Respuesta1
Dado que el axis
entorno está posponiendo la evaluación de algunas cosas hasta entonces \end{axis}
, las variables ya \temps
no \angle
existen para entonces. En ese caso, puede utilizarlo \pgfplotsinvokeforeach
que sustituye inmediatamente el contador de bucle por cualquier #1
elemento dado en el cuerpo del bucle. El único inconveniente es que no admite múltiples variables de bucle, por lo que debes calcular una a partir de la otra de esta manera:
\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) {};
}
Esto produce:
Una sugerencia adicional: probablemente debería consultar la sección 4.17 "Anotaciones personalizadas" del pgfplots
manual para ver cómo puede especificar las coordenadas de los nodos en el sistema de coordenadas del trazado usando axis cs
.
Detalles técnicos
Parece que intentaste forzar la expansión de \temps
y \angle
usando \edef
, pero al hacerlo tienes que proteger todo lo que no quieras expandir \noexpand
, lo cual es bastante tedioso. Si mueves la creación de los pines fuera del entorno del eje, funciona, pero luego es difícil alinear los pines con la trama...
Además de eso, \temps
parece ser una mala elección para el nombre de una macro, aunque no puedo decir por qué. Si eliminas el \node
del bucle, todavía no funciona:
\foreach \temps/\angle in {0/-21, 25/-18, 50/-15, 75/-12}{
\addplot[dirac] coordinates {(\temps,0.75)};
}
falla con Incomplete \iffalse; all text was ignored after line <N>
, por razones que desconozco. Sin embargo, si cambia el nombre \temps
, \temp
¡funciona!
Pero eso todavía no te permite usar el \node
comando \temp
dentro del bucle. Todavía se queja de que \temp
no está definido, porque la \node
macro sólo se evalúa al final del axis
entorno. Una solución alternativa es forzar manualmente la expansión \temp
y \angle
el uso \expandafter
de esta manera:
\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}
}
Esto se expande primero \angle
a -21
, luego \temp
a 0
y luego \LoopBody{0}{-21}
(etc.). Sin embargo, eso no es algo que realmente pueda recomendar porque es difícil de entender y depurar. Tal vez alguien con una mejor comprensión de los pgfplots
aspectos internos pueda dar una idea más clara de por qué esto es necesario.