Por que uma variável \foreach não funciona em \draw em um \axis?

Por que uma variável \foreach não funciona em \draw em um \axis?

Estou encontrando algum comportamento estranho com TikZ \foreachdentro de um \begin{axis}ambiente.

Isso 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))}); 
}

mas isso não acontece:

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

Dá o erro

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

Aqui está a parte realmente estranha: ele só falha quando o eixo define limites. Por exemplo, aqui está um MWE que funciona (mas não desenha 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}

mas remover o comentário faz com que ele falhe.

Por que isso acontece e como posso evitá-lo?

(Meu objetivo final é desenhar cinco segmentos da função tangente e seus síntotas vericais.)

Responder1

Pgfplots não analisa os comandos de desenho como o TikZ faz. Ele deve primeiro reunir todos os caminhos a serem traçados e depois fazer alguma magia negra para obter o máximo e o mínimo, etc. Portanto, para tais fins, você precisa fornecer descrições de caminhos totalmente expandidas. No seu primeiro problema, \xnunca foi substituído pelo seu valor, então quando o pgfplots decide ler seus caminhos, ele apenas vê \xo que não está definido fora do loop. Para esse propósito, você tem outros meios de loop e um fornecido a seguir.

Além disso, você precisa axis csdefinir os pontos, caso contrário não é garantido que eles estejam na área visível do eixo. Em vez disso, você pode usar o seguinte;

\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}

insira a descrição da imagem aqui

Mas se isso for apenas para assíntotas, então será melhor usar x ticks extras e opções de grade para ticks extras.

informação relacionada