\foreach 変数が \axis の \draw で機能しないのはなぜですか?

\foreach 変数が \axis の \draw で機能しないのはなぜですか?

\foreach環境内でTikZ の動作が奇妙になっていることに気づきました\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}

ただし、コメントを削除すると失敗します。

なぜこのようなことが起こるのでしょうか、またどうすればこれを防ぐことができるのでしょうか?

(私の最終目標は、接線関数の 5 つの線分とその垂直な兆候を描くことです。)

答え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 目盛りと追加の目盛り用のグリッド オプションを使用する方が適切です。

関連情報