Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

I have an ellipse in a TikZ diagram and I would like to indicate a direction using an arrow head, but do not wish to draw the path leading up to the arrow head.

I currently have

\draw[->] (0,2) arc (90:45:1 and 2);
\draw (0,0) ellipse (1 and 2);

but I'd like the arc leading up to the arrow to be invisible (so it is not redrawing over the ellipse), so that it's just the head showing.

What is the best way to achieve this?

share|improve this question

4 Answers 4

up vote 10 down vote accepted
+100

You can use path decorations:

\documentclass{article}
\usepackage{tikz}

\usetikzlibrary{decorations.markings}

\begin{document}

\begin{tikzpicture}[decoration={
  markings,
  mark=at position 0.2 with {\arrow{<}}}
]
  \draw[postaction={decorate}] (0,0) ellipse (1 and 2);
\end{tikzpicture}

\end{document}
share|improve this answer

Any easy to type but slightly hackish solution is to use a very small path for the arrow:

\begin{tikzpicture}
    \draw (0,0) ellipse (1 and 2);
    \draw[->] (0,0) ++ (45:1 and 2) arc (45:44.9:1 and 2);
\end{tikzpicture}

To get a flexible "clean" solution one can use markings:

\usetikzlibrary{decorations.markings}
\begin{tikzpicture}
    \draw (0,0) ellipse (1 and 2);
    \draw[decoration={markings,mark=at position 1 with {\arrow{>}}},decorate]
        (0,2) arc (90:45:1 and 2);
\end{tikzpicture}

The marking can also be directly applied to the ellipse (which is drawn counterclockwise from 0 degrees):

\begin{tikzpicture}
    \draw [decoration={markings,mark=at position 1/8 with {\arrowreversed{>}}},postaction={decorate}] 
        (0,0) ellipse (1 and 2);
\end{tikzpicture}

See Section 27.6 of the TikZ manual for the general syntax of the mark option.

share|improve this answer
    
Yes, that should work, but it doesn't seem like a clean solution (not that I currently have one). Another non-clean solution is to just remove the ellipse command and get tikz to draw an arc the entire perimeter of the ellipse, but I'd like to know a general solution to my problem of drawing arrow heads. –  bryn Aug 7 '10 at 9:52
    
I added a second solution that is more flexible. –  Caramdir Aug 7 '10 at 10:12

Tested with TikZ 3.0:

  • load the arrows.meta library instead of arrows
  • add draw opacity=0 as option to \draw, but not to the arrow, such as >={LaTeX[]}

The tail will be completely opaque, i.e. will not be shown, only the head will be visible.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}
\begin{document}
\begin{tikzpicture}
  \draw[->,>={LaTeX[]},draw opacity=0] (0,2) arc (90:45:1 and 2);
  %\draw (0,0) ellipse (1 and 2);% commented out to see only the tip
\end{tikzpicture}
\end{document}

Arrow tip without tail

share|improve this answer

You can do this very simply in plain Metapost. The arrowhead macro takes an arbitrary path as an argument, and returns the path of an arrowhead at the end of the given path.

Using appropriate subpath commands you can position an arrowhead anywhere you like along a path. The standard arrowhead produces a rather solid looking arrow, so you might prefer the open or curly versions included below.

An ellipse with arrowheads

prologues := 3;
outputtemplate := "%j%c.eps";

vardef open_arrowhead expr p =
  save q,e; path q; pair e;
  e = point length p of p;
  q = gobble(p shifted -e cutafter makepath(pencircle scaled 2ahlength))
    cuttings;
  (q rotated .5ahangle & reverse q rotated -.5ahangle)  shifted e
enddef;

vardef curly_arrowhead expr p =
  save q,e; path q, q'; pair e;
  e = point length p of p;
  q = gobble(p shifted -e cutafter makepath(pencircle scaled 2ahlength))
    cuttings;
  q' = q rotatedabout(point 1/2 of q,90);
  (point 0 of q' { direction 0 of q' } 
  .. 
  { direction infinity of q  } point infinity of q { - direction infinity of q } 
  .. 
  { direction infinity of q' } point infinity of q'
  ) shifted e
enddef;

beginfig(1);
path ellipse; 
ellipse = fullcircle xscaled 2cm yscaled 4cm;
draw ellipse withcolor .63 red;
ahlength := 3;
filldraw arrowhead subpath (2,3) of ellipse;
draw open_arrowhead subpath (2,1) of ellipse;
draw curly_arrowhead subpath (1,2) of ellipse;
endfig;
end.

Notice that you need to draw my open-ended arrowheads, whereas the standard one needs filldraw. Note also how you can get reverse paths neatly with subpath.

share|improve this answer

Your Answer

 
discard

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.