problema de dos variables para cada bucle

problema de dos variables para cada bucle

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 axisentorno está posponiendo la evaluación de algunas cosas hasta entonces \end{axis}, las variables ya \tempsno \angleexisten para entonces. En ese caso, puede utilizarlo \pgfplotsinvokeforeachque sustituye inmediatamente el contador de bucle por cualquier #1elemento 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:

Resultado

Una sugerencia adicional: probablemente debería consultar la sección 4.17 "Anotaciones personalizadas" del pgfplotsmanual 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 \tempsy \angleusando \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, \tempsparece ser una mala elección para el nombre de una macro, aunque no puedo decir por qué. Si eliminas el \nodedel 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 \nodecomando \tempdentro del bucle. Todavía se queja de que \tempno está definido, porque la \nodemacro sólo se evalúa al final del axisentorno. Una solución alternativa es forzar manualmente la expansión \tempy \angleel uso \expandafterde 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 \anglea -21, luego \tempa 0y 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 pgfplotsaspectos internos pueda dar una idea más clara de por qué esto es necesario.

información relacionada