¿Por qué una variable \foreach no funciona en \draw en un \eje?

¿Por qué una variable \foreach no funciona en \draw en un \eje?

Estoy encontrando un comportamiento extraño con TikZ \foreachdentro de un \begin{axis}entorno.

Esto funciona:

\foreach \x in {-2,-1,...,2} {
  \addplot[thick, domain=0.05+(\x*2-1)*pi/2:+(\x*2+1)*pi/2-0.05] (x, {tan(deg(x))}); 
}

pero esto no:

\foreach \x in {-2,-1,...,2} {
  \draw (\x,-5) -- (\x,5);
}

da el error

! Undefined control sequence.
<argument> \x 
              ,-5
l.771     \end{axis}

Aquí está la parte realmente extraña: sólo falla cuando el eje tiene límites definidos. Por ejemplo, aquí hay un MWE que funciona (pero no dibuja nada):

\documentclass{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
  \begin{axis} % [ ymin=-3, ymax=3, xmin=-5, xmax=5]
    \foreach \q in {-2,-1,...,2} {
      \draw (axis cs: \q,-5) -- (axis cs: \q,5);
    }
  \end{axis}
\end{tikzpicture}
\end{document}

pero eliminar el comentario provoca que falle.

¿Por qué ocurre esto y cómo puedo prevenirlo?

(Mi objetivo final es dibujar cinco segmentos de la función tangente y sus sintotas verticales).

Respuesta1

Pgfplots no analiza los comandos de dibujo como lo hace TikZ. Primero tiene que reunir todos los caminos a dibujar y luego hace algo de magia negra para obtener el máximo y el mínimo, etc. Por lo tanto, para tales propósitos es necesario proporcionar descripciones de caminos completamente ampliadas. En su primer problema, \xnunca se reemplazó con su valor, por lo que cuando pgfplots decide leer sus rutas, simplemente ve \xcuál no está definida fuera del bucle. Para ello, dispone de otros medios de bucle y uno de los que se detallan a continuación.

También es necesario axis csdefinir los puntos, de lo contrario no se garantiza que estén en el área visible del eje. En su lugar, puede utilizar lo siguiente;

\begin{tikzpicture}
\begin{axis}[ymax=5,ymin=-5,xmax=2.1,xmin=-2.1]
\pgfplotsinvokeforeach{-2,...,2}{
  \draw (axis cs:#1,-5) -- (axis cs:#1,5);
}
\end{axis}
\end{tikzpicture}

ingrese la descripción de la imagen aquí

Pero si esto es solo para asíntotas, entonces estará mejor con ticks x adicionales y opciones de cuadrícula para ticks adicionales.

información relacionada