我发现 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 刻度和额外刻度的网格选项。