TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I'm finding some weird behavior with TikZ's \foreach within an \begin{axis} environment.

This works:

\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))}); 

but this doesn't:

\foreach \x in {-2,-1,...,2} {
  \draw (\x,-5) -- (\x,5);

It gives the error

! Undefined control sequence.
<argument> \x 
l.771     \end{axis}

Here's the really weird part: it only fails when the axis has defined bounds. For example, here's a MWE that works (but doesn't draw anything):

  \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);

but removing the comment causes it to fail.

Why is this and how can I prevent it?

(My end goal is to draw five segments of the tangent function and their verical symptotes.)

share|improve this question
Have you seen tex.stackexchange.com/questions/34197/asymptotes-in-a-plot? I'm not sure it will help with the for loop thing, though. – Sean Allred Mar 16 '14 at 20:29
Yes, I've seen it, but it's next to impossible to get the tangent function to evaluate exactly at n*pi/2 because of floating point errors. In any case, I got the tangent function to plot fine with a for loop; it's the lines that are causing trouble. – wchargin Mar 16 '14 at 20:30
up vote 9 down vote accepted

Pgfplots don't parse the drawing commands as TikZ do. It has to first gather all the paths to be drawn and then does some black magic for obtaining the maximum and minimum etc. Hence for such purposes you need to provide fully expanded path descriptions. In your first problematic one \x never replaced with its value so when pgfplots decide to read your paths it just sees \x which is not defined outside the loop. For that purpose, you have other means of looping and one given below.

Also you need to have axis cs to define the points otherwise they are not guaranteed to be in the visible area of the axis. Instead you can use the following;

  \draw (axis cs:#1,-5) -- (axis cs:#1,5);

enter image description here

But if this is only for asymptotes, then you are better off with extra x ticks and grid options for extra ticks.

share|improve this answer
Ah - extra x ticks is a great idea. Thanks. – wchargin Mar 16 '14 at 20:45

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.