Почему переменная \foreach не работает в \draw in an \axis?

Почему переменная \foreach не работает в \draw in an \axis?

Я замечаю странное поведение TikZ \foreachв определенной \begin{axis}среде.

Это работает:

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

но это не так:

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

Это дает ошибку

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

Вот действительно странная часть: это не срабатывает только тогда, когда ось имеет определенные границы. Например, вот MWE, который работает (но ничего не рисует):

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

но удаление комментария приводит к сбою.

Почему это происходит и как это предотвратить?

(Моя конечная цель — нарисовать пять сегментов касательной функции и их вертикальные симптоты.)

решение1

Pgfplots не анализирует команды рисования, как это делает TikZ. Сначала он должен собрать все пути, которые нужно нарисовать, а затем применить черную магию для получения максимума и минимума и т. д. Поэтому для таких целей вам нужно предоставить полностью развернутые описания путей. В вашем первом проблемном пути он \xникогда не заменяется своим значением, поэтому, когда pgfplots решает прочитать ваши пути, он просто видит, \xчто не определено вне цикла. Для этой цели у вас есть другие средства для циклирования, и одно из них приведено ниже.

Также вам необходимо axis csопределить точки, в противном случае они не гарантированно будут в видимой области оси. Вместо этого вы можете использовать следующее;

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

введите описание изображения здесь

Но если это касается только асимптот, то лучше использовать дополнительные x-отметки и параметры сетки для дополнительных отметок.

Связанный контент