為什麼 \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 刻度和額外刻度的網格選項。

相關內容