Я замечаю странное поведение 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-отметки и параметры сетки для дополнительных отметок.