Equal length to vertices in feynmf

I want to draw the following feynman diagram using feynmf:

I'm happy for the solid blue line to be replaced by a dashed line, but I can't for the life of me work out how to get everything looking elegant. The best I've got is this:

My LaTeX code is here:

\unitlength = 1mm
\begin{fmffile}{feyngraph}
\begin{fmfgraph*}(100,100)
\fmfleft{i2}
\fmfright{o3,o5,o2,o6,o4}
\fmf{fermion}{i2,v1,v2,v3,v4,o2}
\fmf{phantom}{v2,o4}
\fmf{phantom}{v3,o5}
\fmf{phantom}{v3,o6}
\fmf{photon,left,tension=0.1}{v1,v4} % W line
\fmf{dashes}{v2,o3}
\fmflabel{i2}{i2}
\fmflabel{o2}{o2}
\fmflabel{o3}{o3}
\fmflabel{o4}{o4}
\fmflabel{o5}{o5}
\fmflabel{o6}{o6}
\fmflabel{v4}{v4}
\fmflabel{v3}{v3}
\fmflabel{v2}{v2}
\fmflabel{v1}{v1}
\end{fmfgraph*}
\end{fmffile}


Can someone help?

This is doable quite easily with feynmf/feynmp but you need to know a few of the "tricks" that are available but not enormously well documented.

For this issue the "trick" needed is \fmffreeze which tells the layout engine to fix the locations of any points we currently know about now, using only the lines that are currently input.

In this case I did the line of fermions across the centre of the diagram and then froze the layout. Once this is done adding the arc and extra leg is done exactly as normal but no longer pulls the diagram out of shape.

I also added all the labels and symbols in and used points along the bottom for the extra leg as it produced a diagram more similar to the requested diagram. (Note that \fmflabel{TEXT}{V} is shorthand for \fmfv{label=TEXT}{V} but I needed the angle option so used \fmfv directly instead.)

The result is the following code:

\unitlength = 1mm
\begin{fmffile}{feyngraph}
\begin{fmfgraph*}(100,60)
\fmfleft{i}
\fmfright{o}
\fmfbottom{b1,b2,b,b3}
\fmf{fermion,label=$b$}{i,v1}
\fmf{fermion}{v1,v2}
\fmf{fermion,label=$t$}{v3,v2}
\fmf{fermion}{v3,v4}
\fmf{fermion,label=$s$}{v4,o}
\fmffreeze
\fmf{photon,left,label=$W^-$}{v1,v4} % W line
\fmf{dashes,label=$S$}{v2,b}
\fmfv{label=$V_{ts}$,label.angle=-90}{v4}
\fmfv{label=$V_{tb}^*$,label.angle=-90}{v1}
\fmfv{decoration.shape=cross,label=$m_t$,label.angle=90}{v3}
\fmfv{decoration.shape=circle}{v2}
\end{fmfgraph*}
\end{fmffile}


and produces the following diagram

• I like this a lot & \fmffreeze was exactly what I needed, but is there a way to reduce the height of the W? Changing the tension doesn't seem to do anything – Beth Long Oct 21 at 12:18
• Found it: I used left=0.5. Now I would ideally like to place the label on the other side of the dashed line... any ideas? – Beth Long Oct 21 at 14:48
• Found that too: label.side=right – Beth Long Oct 21 at 15:03

Sometimes it is easier to abandon the wonderful automatic layout and do it by hand.

This is done as a regular Metapost diagram, but I have imported feynmp and used the "line decoration" macros directly.

This is wrapped up in luamplib so you need to compile it with lualatex. If you can't switch to lualatex for your whole project, then you could just use this as approach to make stand-alone PDF files and include them with includegraphics.

\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
input feynmp
beginfig(1);
% make a unit size
numeric u; u = 20;

for i=0 upto 10:
z[i] = (i*u, 0);
endfor

% draw the fermions
draw fermion z0 -- z2;
draw fermion z2 -- z4;
draw fermion z6 -- z4;
draw fermion z6 -- z8;
draw fermion z8 -- z10;

% find the mid point then draw the curved photon
z11 = z5 shifted (0, 3/2 u);
draw photon z2 .. z11 .. z8;

% now put the strange blue line in
z12 = (3u, 0) rotated -30 shifted z4;
begingroup; interim linecap := butt; % square ends on the line
draw z4 -- z12 withpen pencircle scaled 4 withcolor 1/4[blue, white];
endgroup;
fill fullcircle scaled 8 shifted z4;

% we need to make our own cross marker for this
picture cross; cross = image(
draw (left--right) scaled 3 rotated 45;
draw (up--down)    scaled 3 rotated 45
);
draw cross shifted z6;

% now to all the labels
interim labeloffset := 6; % with a litte extra space...
label.top("$b$", z1);
label.top("$t$", z5);
label.top("$m_t$", z6);
label.top("$s$", z9);
label.top("$W^-$", z11);
label.llft("$S$", 1/2[z4, z12]);
dotlabel.bot("$V_{tb}^*$", z2);
dotlabel.lrt("$V_{ts}$", z8);

endfig;
\end{mplibcode}
\end{document}

• The image is perfect but I can't get the code to run, I'm compiling with LuaLaTeX and the log doesn't show any errors, but the output is blank. The first line of the log is this: This is LuaTeX, Version 1.10.0 (TeX Live 2019) (format=lualatex 2020.3.31) 21 OCT 2020 13:53 restricted system commands enabled. – Beth Long Oct 21 at 11:55
• it's hard to debug remotely.... do you mean you get a blank pdf? or no output at all? – Thruston Oct 21 at 15:59
• My mistake, the output is fine - the only thing I would like to change is to remove the white background and have only the lines with no background at all. When I download your image from above that's what I get, but not when I c&p and run your code for myself... – Beth Long Oct 22 at 8:04
• In my experience PDFs produced by lualatex always have a white background. To produce the PNG above with a transparent background, I converted the PDF using ImageMagick. convert -density 300 beth.pdf beth.png -- ImageMagick makes the background transparent by default.... (apparently). – Thruston Oct 22 at 10:42
• I installed imagemagick 7.0.10-34 and ran the command that you posted but the background is still white – Beth Long Oct 22 at 13:16

A short code with pstricks:

\documentclass[12pt, border=6pt]{standalone}
\usepackage{pst-node, pst-feyn}

\begin{document}

\begin{pspicture}(0,-2)(10,3)
\pnodes{A}(0,0)(2,0)(4,0)(6,0)(8,0)(10,0)(6.5,-1.2)
\uput[d](A1){$V^*_{tb}$}\uput[d](A4){$V_{ts}$}
\uput[u](A3){$m_t$}
\pcline[linewidth=3pt, linecolor=blue](A2)(A6)\nbput{$S$}
\foreach \i/\j in {0/1,1/2,3/4,4/5,3/2}{\psArrowLine(A\i)(A\j)}
\foreach \i/\l in {1/b,5/t,9/s}{\uput[u](\i, 0){$\l$}}%\uput[u](1,0){$b$}\uput[u](5,0){$t$}\uput[u](9,0){$s$}
\psdots(A1)(A4)\psdot[dotstyle=x, dotscale=1.5](A3)\psdot[dotscale=2](A2)
\psPhotonArc[radius=3.46, amplitude=0.15,windings=11.5](5,-1.7)(30,150)\rput(5,2.2){$W^{-}$}
\end{pspicture}

\end{document}