为什么 \foreach 变量在 \axis 中的 \draw 中不起作用?

为什么 \foreach 变量在 \axis 中的 \draw 中不起作用?

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

相关内容