I use tikz as a general purpose drawing package because of its flexibility etc... I need to draw some Feynman diagrams like these:

Feynman diagrams with vector loops

I tried to draw arc like

 \draw [decorate, decoration={snake}] (0,0) arc (180:0:2);

but the result is ugly looking:

Ugly looking result with Tikz

Googleing I found some interesting link:

Other question


1) I tried to compile and the result was different:

Link result

2) As you can see in the first image I posted, I need arbitrary angle arc and, in the solution presented in the link, it seems possible to draw only semicircles

3) The code is not elegant at all: in particular, using this solution drawing a solid e arc or a snakeish arc requires complete different source code.

I was thinking if it is possible simply to stop the arc when it reaches the specified (final) angle, without any regard to the decoration.


3 Answers 3


All the three Feynman diagrams shown in the question can be realized with a few lines of code using the new TikZ-Feynman package (see also the project page).

Here is the code to produce all of them. You must compile with lualatex in order to take advantage of the automatic positioning of the vertices.

% first diagram
\feynmandiagram [layered layout, horizontal=a to d] {
  a [particle=\(\mu\)] -- [photon] b [dot],
  b -- [anti fermion, half left, edge label=\(k\)] c [dot] --
  [half left, fermion, edge label=\(k + q\)] b,
  c -- [photon] d [particle=\(\nu\)],

% second diagram
\feynmandiagram [layered layout, horizontal=a to d] {
  a -- b [dot] -- [fermion,edge label'=\(p + k\)] c [dot] -- d [particle=\(p\)],
  b -- [photon, half left, edge label=\(k\)] c,

% third diagram
    \vertex (a) {\(\mu\)};
    \vertex [right=of a] (b);
    \vertex [above right=of b] (u1);
    \vertex [above right=of u1] (u2) {\(p'\)};
    \vertex [below right=of b] (d1);
    \vertex [below right=of d1] (d2) {\(p\)};

      (a) -- [photon, edge label'=\(q\)] (b),
      (b) -- [fermion, edge label=\(k+q\)] (u1) -- [fermion] (u2),
      (b) -- [anti fermion, edge label'=\(k\)] (d1) -- [anti fermion] (d2),
      (d1) -- [photon, half right, edge label'=\(p - k\)] (u1),

enter image description here

enter image description here

enter image description here


Just for fun, with feynmp and egreg's feynmp-auto. If on MikTeX or TeX Live 2012 or earlier, compile with --shell-escape (or --enable-write18) as command-line options. All manual positioning (\fmfforce commands) is done to match your sample, but the positions can be computed automatically by leaving these out.


\unitlength = 2mm
  \fmfleft{i} \fmfright{o}
  \fmf{plain}{i,v1} \fmf{plain}{v2,o}

enter image description here

  • 2
    Why not \usepackage{feynmp-auto} that avoids the need of \DeclareGraphicsRule and of redefining \endfmffile? ;-) By the way, since the release of TeX Live 2013, -shell-escape is not needed for running mpost.
    – egreg
    Commented Jul 28, 2014 at 7:48
  • @egreg, thanks for that! I did not know about your feynmp-auto until now. Commented Jul 28, 2014 at 12:27
  • My hope was to learn ONE package that would allow me to get every diagram (Feynman and not Feynman) I wanted. Tikz seemed to me a package like the one I wanted. But evidently it is not... The think that astonish me more is that even \draw[decorate, decoration={snake, segment legth=5mm, post length=0mm}] (0,0) -- (0,2); does not produce the intuitive result (at the end of the wavy line there is a straight segment... this let me think that, at least decorations library is a bit buggy)
    – MaPo
    Commented Jul 28, 2014 at 14:47
  • @MaPo well, this is metapost, so you could learn it and do all your other figures with metapost. Alternatively, Feynman diagrams can be done with pstricks or asymptote (both shown here), which can also be used for more general figures/diagrams. And it is certainly possible with tikz as well. Each package has its advantages and disadvantages for different graphics needs. Commented Jul 28, 2014 at 15:00
  • @Paul Gessler: I knew, as a matter of facts, I asked how to get good-looking (or if you prefer not-ugly-looking) Feynman graph with Tikz, and I've no received any answer yet...
    – MaPo
    Commented Jul 28, 2014 at 17:47

Another solution with tikz, as requested. The problem with the linked answer is that the arguments to the atan function in the pgf low-level layer have been reversed. Switching the arguments inside the wavy semicircle definition solves that issue.

Code for the styles borrowed from here.



% adapted from https://tex.stackexchange.com/a/160358/21344; changed photon style
  fermion/.style={draw=black, postaction={decorate},decoration={markings,mark=at position .55 with {\arrow{Latex}}}},
  vertex/.style={draw,shape=circle,fill=black,minimum size=2pt,inner sep=0pt},
  photon/.style={wavy semicircle,wave amplitude=0.3mm,wave count=10}

% adapted from https://tex.stackexchange.com/a/89003/21344; swapped atan args
    wave amplitude/.initial=0.2cm,
    wave count/.initial=8,
    mirror semicircle/.is if=mirrorsemicircle,
    mirror semicircle=false,
    wavy semicircle/.style={
        to path={
            let \p1 = (\tikztostart),
            \p2 = (\tikztotarget),
            \n1 = {veclen(\y2-\y1,\x2-\x1)},
            \n2 = {atan2(\x2-\x1,\y2-\y1))} in
            plot [
                samples=(\pgfkeysvalueof{/tikz/wave count}+0.5)*8+1, % Calculate the number of samples needed, so the samples are in sync with the wave and fall on the extrema
            ] ({ % Polar coordinates: Angle...
                (\x*180-\n2 + 180 + \ifmirrorsemicircle 1 \else -1 \fi * 90%
            }:{ % ... and radius
                    \n1/2+\pgfkeysvalueof{/tikz/wave amplitude} * %
                        \x * 360 * (\pgfkeysvalueof{/tikz/wave count} + 0.5%
        } (\tikztotarget)

\coordinate (i);
\coordinate[vertex, right=of i] (v1);
\coordinate[vertex, right=of v1] (v2);
\coordinate[right=of v2] (o);
\draw (i) -- (v1);
\draw[fermion] (v1) -- (v2) node[midway,below] {$p+k$};
\draw[photon] (v1) to (v2);
\path (v1) to[in=90,out=90] node[above=2mm]{$k$} (v2); % ghost path for label
\draw (v2) -- (o) node[right] {$p$};

enter image description here

Personally, I feel that feynmp is much better suited for these uses. Knowing how to use a hammer really well doesn't make it a good tool for sawing.

  • Thank you, for your patience. I totally agree with you: feynmp is much better suited for Feynman graph
    – MaPo
    Commented Jul 29, 2014 at 17:52

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .