%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% TikZ-Feynman
% Feynman Diagrams with TikZ
% Copyright (C) 2015 Joshua Ellis
%
%
% This work may be distributed and/or modified under the conditions of the LaTeX
% Project Public License, either version 1.3 of this license or (at your option)
% any later version.
%
% This work has the LPPL maintenance status `maintained'.
%
% The Current Maintainer of this work is Joshua Ellis.
%
% This program is distributed in the hope that it will be useful, but WITHOUT
% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
% FOR A PARTICULAR PURPOSE. See the LaTeX Project Public License for more
% details.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Shapes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Crossed Circle
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\pgfdeclareshape{crossed circle}
{
\inheritsavedanchors[from=circle]
\inheritanchorborder[from=circle]
\inheritanchor[from=circle]{north}
\inheritanchor[from=circle]{north west}
\inheritanchor[from=circle]{north east}
\inheritanchor[from=circle]{center}
\inheritanchor[from=circle]{west}
\inheritanchor[from=circle]{east}
\inheritanchor[from=circle]{mid}
\inheritanchor[from=circle]{mid west}
\inheritanchor[from=circle]{mid east}
\inheritanchor[from=circle]{base}
\inheritanchor[from=circle]{base west}
\inheritanchor[from=circle]{base east}
\inheritanchor[from=circle]{south}
\inheritanchor[from=circle]{south west}
\inheritanchor[from=circle]{south east}
\inheritbackgroundpath[from=circle]
\foregroundpath{
% Compute south west
\centerpoint
\pgf@xc=\radius
\advance\pgf@x by-0.707107\pgf@xc
\advance\pgf@y by-0.707107\pgf@xc
\pgf@xa=\pgf@x \pgf@ya=\pgf@y % Store coordinates
% Compute north east point
\centerpoint
\pgf@xc=\radius
\advance\pgf@x by0.707107\pgf@xc
\advance\pgf@y by0.707107\pgf@xc
\pgf@xb=\pgf@x \pgf@yb=\pgf@y % Store coordinates
\pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}
\pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
\pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@yb}}
\pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@ya}}
\pgfsetarrowsstart{}
\pgfsetarrowsend{}
}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Decorations
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Complete Sines
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Complete sines replaces the path with a whole number of sine waves.
%% Thanks to
http://tex.stackexchange.com/a/134516/26980
\pgfdeclaredecoration{complete sines}{initial}
{
%% Begin by computing the overall path length and find how many sine waves we
%% can fit in. Nothing happens beyond the computation.
\state{initial}[
width=+0pt,
next state=move,
persistent precomputation={
\def\tikzfeynman@cs@angle@step{30}
\def\tikzfeynman@cs@current@angle{0}
\pgfmathsetlengthmacro{\tikzfeynman@cs@points@per@step}{
\pgfdecoratedinputsegmentlength
/ int(\pgfdecoratedinputsegmentlength
/ \pgfdecorationsegmentlength)
/ 360
* \tikzfeynman@cs@angle@step}
},
]{}
%% Move to the origin to the path
\state{move}[
width=+\tikzfeynman@cs@points@per@step,
next state=draw
]{
\pgfpathmoveto{\pgfpointorigin}
}
%% Draw the sine wave itself. This computes the value every 20 degrees and draws straight edges.
\state{draw}[
width=+\tikzfeynman@cs@points@per@step,
switch if less than=1.25*\tikzfeynman@cs@points@per@step to final, % <- bit of a hack
persistent postcomputation={
\pgfmathparse{mod(\tikzfeynman@cs@current@angle+\tikzfeynman@cs@angle@step, 360)}
\let\tikzfeynman@cs@current@angle=\pgfmathresult%
},
]{
\pgfmathparse{sin(\tikzfeynman@cs@current@angle) * \pgfmetadecorationsegmentamplitude / 2}
\tikz@decoratepathfalse
\pgfpathlineto{\pgfqpoint{0pt}{\pgfmathresult pt}}%
}
\state{final}{
\ifdim\pgfdecoratedremainingdistance>0pt\relax
\pgfpathlineto{\pgfpointdecoratedpathlast}
\fi
}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Keys
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\tikzfeynmanset{
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Hooks
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
execute at begin feynman/.code={},
execute at end feynman/.code={},
every feynman/.style={/tikzfeynman/every feynman@@/.append style={#1}},
every feynman@@/.style={
/tikzfeynman/.cd,
/tikzfeynman/medium,
},
execute at begin feynman@@/.code={} %% Internal version
execute at end feynman@@/.code={}, %% Internal version
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Diagrams
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
every diagram/.style={/tikzfeynman/every diagram@@/.append style={#1}},
every diagram@@/.style={
/tikzfeynman/.cd,
.search also={/tikz/graphs, /tikz},
nodes={
/tikzfeynman/.cd,
/tikzfeynman/.search also={/tikz/graphs, /tikz},
/tikzfeynman/every vertex@@,
/tikzfeynman/every vertex},
edges={
/tikzfeynman/.cd,
/tikzfeynman/.search also={/tikz/graphs, /tikz},
/tikzfeynman/every edge@@,
/tikzfeynman/every edge},
/tikzfeynman/medium,
},
every inline/.style={/tikzfeynman/inline@@/.append style={#1}},
every inline@@/.style={
/tikzfeynman/small,
},
inline/.style={
/tikz/baseline={#1},
/tikzfeynman/every inline@@,
},
every small/.style={/tikzfeynman/small@@/.append style={#1}},
every small@@/.style={
/tikz/node distance=1cm,
/graph drawing/node distance=1.25cm,
/graph drawing/level distance=1cm,
/graph drawing/sibling distance=1.5cm,
/tikzfeynman/every dot@@/.append style={/tikz/minimum size=1mm},
/tikzfeynman/every crossed dot@@/.append style={/tikz/minimum size=2mm},
/tikzfeynman/every blob@@/.append style={/tikz/minimum size=0.5cm},
/tikzfeynman/arrow size=1.2pt,
/tikzfeynman/insertion/size=2.5pt,
},
small/.style={/tikzfeynman/every small@@},
every medium/.style={/tikzfeynman/medium@@/.append style={#1}},
every medium@@/.style={
/tikz/node distance=1.5cm,
/graph drawing/node distance=1.9cm,
/graph drawing/level distance=1.5cm,
/graph drawing/sibling distance=2.25cm,
},
medium/.style={/tikzfeynman/every medium@@},
every large/.style={/tikzfeynman/large@@/.append style={#1}},
every large@@/.style={
/tikz/node distance=2cm,
/graph drawing/node distance=2.5cm,
/graph drawing/level distance=2cm,
/graph drawing/sibling distance=3cm,
/tikz/graphs/edges={thick},
/tikzfeynman/every dot@@/.append style={/tikz/minimum size=2mm},
/tikzfeynman/every crossed dot@@/.append style={/tikz/minimum size=4mm},
/tikzfeynman/every blob@@/.append style={/tikz/minimum size=1cm},
/tikzfeynman/arrow size=1.6pt,
/tikzfeynman/insertion/size=4pt,
},
large/.style={/tikzfeynman/every large@@},
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Vertices
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
every vertex@@/.style={
/tikz/shape=coordinate,
},
every vertex/.style={/tikzfeynman/every vertex@@/.append style={#1}},
vertex/.style={
/tikzfeynman/every vertex@@,
},
every dot@@/.style={
/tikz/shape=circle,
/tikz/graphs/as={},
/tikz/draw,
/tikz/fill,
/tikz/inner sep=0pt,
/tikz/outer sep=0pt,
/tikz/minimum size=1.5mm,
},
every dot/.style={/tikzfeynman/every dot@@/.append style={#1}},
dot/.style={
/tikzfeynman/every dot@@,
},
every square dot@@/.style={
/tikz/shape=rectangle,
},
every square dot/.style={/tikzfeynman/every square dot@@/.append style={#1}},
square dot/.style={
/tikzfeynman/every dot@@,
/tikzfeynman/every square dot@@,
},
every empty dot@@/.style={
/tikz/fill=none,
},
every empty dot/.style={/tikzfeynman/every empty dot@@/.append style={#1}},
empty dot/.style={
/tikzfeynman/every dot@@,
/tikzfeynman/every empty dot@@,
},
every crossed dot@@/.style={
/tikz/fill=none,
/tikz/shape=crossed circle,
/tikz/minimum size=3mm,
},
every crossed dot/.style={/tikzfeynman/every crossed dot@@/.append style={#1}},
crossed dot/.style={
/tikzfeynman/every dot@@,
/tikzfeynman/every crossed dot@@,
},
every blob@@/.style={
/tikz/shape=circle,
/tikz/graphs/as={},
/tikz/draw,
/tikz/fill=none,
/tikz/outer sep=0.5\pgflinewidth,
/tikz/inner sep=0pt,
/tikz/minimum size=0.75cm,
/tikz/pattern=north west lines,
},
every blob/.style={/tikzfeynman/every blob@@/.append style={#1}},
blob/.style={
/tikzfeynman/every blob@@,
},
every particle@@/.style={
/tikz/shape=rectangle,
/tikz/draw=none,
/tikz/fill=none,
/tikz/inner sep=0.3333em,
/tikz/outer sep=0.5\pgflinewidth,
},
every particle/.style={/tikzfeynman/every particle@@/.append style={#1}},
particle/.style args={#1}{
/tikzfeynman/every particle@@,
/tikz/graphs/as={#1},
},
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Edge styles
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Arrow Style
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
arrow size/.store in=\tikzfeynman@arrow@size,
arrow size=1.5pt,
with arrow/.style={
/tikz/decoration={
markings,
mark=at position #1 with {
\node[
transform shape,
xshift=-0.5mm,
fill,
inner sep=\tikzfeynman@arrow@size,
draw=none,
isosceles triangle
] { };
},
},
/tikz/postaction={
/tikz/decorate=true,
},
},
with reversed arrow/.style={
/tikz/decoration={
markings,
mark=at position #1 with {
\node[
transform shape,
xshift=-0.5mm,
rotate=180,
fill,
inner sep=\tikzfeynman@arrow@size,
draw=none,
isosceles triangle
] { };
},
},
/tikz/postaction={
/tikz/decorate=true,
},
},
%% Base Edge Styles
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
every edge@@/.style={},
every edge/.style={/tikzfeynman/every edge@@/.append style={#1}},
%% Specific Styles
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
every plain@@/.style={
/tikz/draw=none,
/tikz/decoration={name=none},
/tikz/postaction={
/tikz/draw
},
},
every plain/.style={/tikzfeynman/every plain@@/.append style={#1}},
plain/.style={
/tikzfeynman/every plain@@,
},
every boson@@/.style={
/tikz/draw=none,
/tikz/decoration={name=none},
/tikz/postaction={
/tikz/draw,
/tikz/decoration={
complete sines,
amplitude=1mm,
segment length=2mm,
},
/tikz/decorate=true,
},
},
every boson/.style={/tikzfeynman/every boson@@/.append style={#1}},
boson/.style={
/tikzfeynman/every boson@@,
},
every charged boson@@/.style={
/tikzfeynman/with arrow=0.5,
},
every charged boson/.style={/tikzfeynman/every charged boson@@/.append style={#1}},
charged boson/.style={
/tikzfeynman/boson,
/tikzfeynman/every charged boson@@,
},
every anti charged boson@@/.style={
/tikzfeynman/with reversed arrow=0.5,
},
every anti charged boson/.style={/tikzfeynman/every anti charged boson@@/.append style={#1}},
anti charged boson/.style={
/tikzfeynman/boson,
/tikzfeynman/every anti charged boson@@,
},
every photon@@/.style={
/tikz/draw=none,
/tikz/decoration={name=none},
/tikz/postaction={
/tikz/draw,
/tikz/decoration={
complete sines,
amplitude=1mm,
segment length=2mm,
},
/tikz/decorate=true,
},
},
every photon/.style={/tikzfeynman/every photon@@/.append style={#1}},
photon/.style={
/tikzfeynman/every photon@@,
},
every scalar@@/.style={
/tikz/draw=none,
/tikz/decoration={name=none},
/tikz/postaction={
/tikz/draw,
/tikz/dashed,
},
},
every scalar/.style={/tikzfeynman/every scalar@@/.append style={#1}},
scalar/.style={
/tikzfeynman/every scalar@@,
},
every charged scalar@@/.style={
/tikz/draw=none,
/tikz/decoration={name=none},
/tikz/postaction={
/tikzfeynman/with arrow=0.5,
},
},
every charged scalar/.style={/tikzfeynman/every charged scalar@@/.append style={#1}},
charged scalar/.style={
/tikzfeynman/scalar,
/tikzfeynman/every charged scalar@@,
},
every anti charged scalar@@/.style={
/tikz/draw=none,
/tikz/decoration={name=none},
/tikz/postaction={
/tikzfeynman/with reversed arrow=0.5,
},
},
every anti charged scalar/.style={/tikzfeynman/every anti charged scalar@@/.append style={#1}},
anti charged scalar/.style={
/tikzfeynman/scalar,
/tikzfeynman/every anti charged scalar@@,
},
every ghost@@/.style={
/tikz/draw=none,
/tikz/decoration={name=none},
/tikz/postaction={
/tikz/draw,
/tikz/dotted,
/tikz/thick,
},
},
every ghost/.style={/tikzfeynman/every ghost@@/.append style={#1}},
ghost/.style={
/tikzfeynman/every ghost@@,
},
every fermion@@/.style={
/tikz/draw=none,
/tikz/decoration={name=none},
/tikz/postaction={
/tikz/draw,
/tikzfeynman/with arrow=0.5,
},
},
every fermion/.style={/tikzfeynman/every fermion@@/.append style={#1}},
fermion/.style={
/tikzfeynman/every fermion@@,
},
every anti fermion@@/.style={
/tikz/draw=none,
/tikz/decoration={name=none},
/tikz/postaction={
/tikz/draw,
/tikzfeynman/with reversed arrow=0.5,
},
},
every anti fermion/.style={/tikzfeynman/every anti fermion@@/.append style={#1}},
anti fermion/.style={
/tikzfeynman/every anti fermion@@,
},
every majorana@@/.style={
/tikz/draw=none,
/tikz/decoration={name=none},
/tikz/postaction={
/tikz/draw,
/tikzfeynman/with arrow=0.33,
/tikzfeynman/with reversed arrow=0.73,
},
},
every majorana/.style={/tikzfeynman/every majorana@@/.append style={#1}},
majorana/.style={
/tikzfeynman/every majorana@@,
},
every anti majorana@@/.style={
/tikz/draw=none,
/tikz/decoration={name=none},
/tikz/postaction={
/tikz/draw,
/tikzfeynman/with reversed arrow=0.33,
/tikzfeynman/with arrow=0.73,
},
},
every anti majorana/.style={/tikzfeynman/every anti majorana@@/.append style={#1}},
anti majorana/.style={
/tikzfeynman/every anti majorana@@,
},
every gluon@@/.style={
/tikz/draw=none,
/tikz/decoration={name=none},
/tikz/postaction={
/tikz/draw,
/tikz/decoration={
coil,
aspect=0.75,
mirror,
segment length=1.5mm
},
/tikz/decorate=true,
},
},
every gluon/.style={/tikzfeynman/every gluon@@/.append style={#1}},
gluon/.style={
/tikzfeynman/every gluon@@,
},
%% Insertions
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
insertion/.search also={/tikzfeynman,/tikz},
%% Parameters
insertion/size/.store in=\tikzfeynman@insertion@size,
insertion/size=3pt,
insertion/style/.store in=\tikzfeynman@insertion@style,
insertion/style={},
%% Styles
insertion@@/.style args={[#1]#2}{
/tikz/decoration={
markings,
mark=at position #2 with {
\tikzfeynmanset{insertion/.cd,#1}
\draw [\tikzfeynman@insertion@style] (-\tikzfeynman@insertion@size, -\tikzfeynman@insertion@size) -- (\tikzfeynman@insertion@size, \tikzfeynman@insertion@size);
\draw [\tikzfeynman@insertion@style] (-\tikzfeynman@insertion@size, \tikzfeynman@insertion@size) -- (\tikzfeynman@insertion@size, -\tikzfeynman@insertion@size);
},
},
/tikz/postaction={
/tikz/decorate=true,
},
},
insertion@@/.default={[]0.5},
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Momentum arrows
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
momentum/.search also={/tikzfeynman,/tikz},
%% Parameters
momentum/label distance/.store in=\tikzfeynman@momentum@label@distance,
momentum/label distance=0pt,
momentum/arrow distance/.store in=\tikzfeynman@momentum@arrow@distance,
momentum/arrow distance=3mm,
momentum/arrow shorten/.store in=\tikzfeynman@momentum@arrow@shorten,
momentum/arrow shorten=0.15,
momentum/label style/.store in=\tikzfeynman@momentum@label@style,
momentum/label style={},
momentum/arrow style/.store in=\tikzfeynman@momentum@arrow@style,
momentum/arrow style={},
%% Styles
momentum@@/.style args={[#1]#2}{
/tikz/preaction={
/tikz/decoration={
show path construction,
moveto code={},
lineto code={
\tikzfeynmanset{momentum/.cd,#1}
\path (\tikzinputsegmentfirst) -- (\tikzinputsegmentlast)
coordinate [pos=\tikzfeynman@momentum@arrow@shorten] (tf@m@1)
coordinate [pos=1 - \tikzfeynman@momentum@arrow@shorten] (tf@m@2);
\draw [-Stealth, \tikzfeynman@momentum@arrow@style]
($(tf@m@1)!\tikzfeynman@momentum@arrow@distance!90:(tf@m@2)$)
-- ($(tf@m@2)!\tikzfeynman@momentum@arrow@distance!-90:(tf@m@1)$)
node [pos=0.5, auto,
outer sep=\tikzfeynman@momentum@label@distance,
\tikzfeynman@momentum@label@style] {#2};
},
curveto code={
\tikzfeynmanset{momentum/.cd,#1}
\path (\tikzinputsegmentfirst)
.. controls (\tikzinputsegmentsupporta) and (\tikzinputsegmentsupportb)
.. (\tikzinputsegmentlast)
{ \foreach \i in {1, ..., 50} {
coordinate [pos=\tikzfeynman@momentum@arrow@shorten + (1-2 * \tikzfeynman@momentum@arrow@shorten)*\i/50] (tf@m@\i) } };
\draw [-Stealth, \tikzfeynman@momentum@arrow@style]
($(tf@m@1)!\tikzfeynman@momentum@arrow@distance!90:(tf@m@2)$)
foreach \i [count=\j from 3] in {2, ..., 24} {
-- ($(tf@m@\i)!\tikzfeynman@momentum@arrow@distance!90:(tf@m@\j)$)
}
-- ($(tf@m@25)!\tikzfeynman@momentum@arrow@distance!90:(tf@m@26)$)
node [pos=0.5, auto,
outer sep=\tikzfeynman@momentum@label@distance,
\tikzfeynman@momentum@arrow@style] {#2}
foreach \i [count=\j from 27] in {26, ..., 49} {
-- ($(tf@m@\i)!\tikzfeynman@momentum@arrow@distance!90:(tf@m@\j)$)
}
-- ($(tf@m@50)!\tikzfeynman@momentum@arrow@distance!-90:(tf@m@49)$);
},
closepath code={
\tikzfeynmanset{momentum/.cd,#1}
\path (\tikzinputsegmentfirst) -- (\tikzinputsegmentlast)
coordinate [pos=\tikzfeynman@momentum@arrow@shorten] (tf@m@1)
coordinate [pos=1 - \tikzfeynman@momentum@arrow@shorten] (tf@m@2);
\draw [-Stealth, \tikzfeynman@momentum@arrow@style]
($(tf@m@1)!\tikzfeynman@momentum@arrow@distance!90:(tf@m@2)$)
-- ($(tf@m@2)!\tikzfeynman@momentum@arrow@distance!-90:(tf@m@1)$)
node [pos=0.5, auto,
outer sep=\tikzfeynman@momentum@label@distance,
\tikzfeynman@momentum@label@style] {#2};
},
},
/tikz/decorate=true,
},
},
momentum'@@/.style args={[#1]#2}{
/tikz/preaction={
/tikz/decoration={
show path construction,
moveto code={},
lineto code={
\tikzfeynmanset{momentum/.cd,#1}
\path (\tikzinputsegmentfirst) -- (\tikzinputsegmentlast)
coordinate [pos=\tikzfeynman@momentum@arrow@shorten] (tf@m@1)
coordinate [pos=1 - \tikzfeynman@momentum@arrow@shorten] (tf@m@2);
\draw [-Stealth, \tikzfeynman@momentum@arrow@style]
($(tf@m@1)!\tikzfeynman@momentum@arrow@distance!-90:(tf@m@2)$)
-- ($(tf@m@2)!\tikzfeynman@momentum@arrow@distance!90:(tf@m@1)$)
node [pos=0.5, auto, swap,
outer sep=\tikzfeynman@momentum@label@distance,
\tikzfeynman@momentum@label@style] {#2};
},
curveto code={
\tikzfeynmanset{momentum/.cd,#1}
\path (\tikzinputsegmentfirst)
.. controls (\tikzinputsegmentsupporta) and (\tikzinputsegmentsupportb)
.. (\tikzinputsegmentlast)
{ \foreach \i in {1, ..., 50} {
coordinate [pos=\tikzfeynman@momentum@arrow@shorten + (1-2 * \tikzfeynman@momentum@arrow@shorten)*\i/50] (tf@m@\i) } };
\draw [-Stealth, \tikzfeynman@momentum@arrow@style]
($(tf@m@1)!\tikzfeynman@momentum@arrow@distance!-90:(tf@m@2)$)
foreach \i [count=\j from 3] in {2, ..., 24} {
-- ($(tf@m@\i)!\tikzfeynman@momentum@arrow@distance!-90:(tf@m@\j)$)
}
-- ($(tf@m@25)!\tikzfeynman@momentum@arrow@distance!-90:(tf@m@26)$)
node [pos=0.5, auto, swap,
outer sep=\tikzfeynman@momentum@label@distance,
\tikzfeynman@momentum@arrow@style] {#2}
foreach \i [count=\j from 27] in {26, ..., 49} {
-- ($(tf@m@\i)!\tikzfeynman@momentum@arrow@distance!-90:(tf@m@\j)$)
}
-- ($(tf@m@50)!\tikzfeynman@momentum@arrow@distance!90:(tf@m@49)$);
},
closepath code={
\tikzfeynmanset{momentum/.cd,#1}
\path (\tikzinputsegmentfirst) -- (\tikzinputsegmentlast)
coordinate [pos=\tikzfeynman@momentum@arrow@shorten] (tf@m@1)
coordinate [pos=1 - \tikzfeynman@momentum@arrow@shorten] (tf@m@2);
\draw [-Stealth, \tikzfeynman@momentum@arrow@style]
($(tf@m@1)!\tikzfeynman@momentum@arrow@distance!-90:(tf@m@2)$)
-- ($(tf@m@2)!\tikzfeynman@momentum@arrow@distance!90:(tf@m@1)$)
node [pos=0.5, auto, swap,
outer sep=\tikzfeynman@momentum@label@distance,
\tikzfeynman@momentum@label@style] {#2};
},
},
/tikz/decorate=true,
},
},
reversed momentum@@/.style args={[#1]#2}{
/tikz/preaction={
/tikz/decoration={
show path construction,
moveto code={},
lineto code={
\tikzfeynmanset{momentum/.cd,#1}
\path (\tikzinputsegmentlast) -- (\tikzinputsegmentfirst)
coordinate [pos=\tikzfeynman@momentum@arrow@shorten] (tf@m@1)
coordinate [pos=1 - \tikzfeynman@momentum@arrow@shorten] (tf@m@2);
\draw [-Stealth, \tikzfeynman@momentum@arrow@style]
($(tf@m@1)!\tikzfeynman@momentum@arrow@distance!-90:(tf@m@2)$)
-- ($(tf@m@2)!\tikzfeynman@momentum@arrow@distance!90:(tf@m@1)$)
node [pos=0.5, auto, swap,
outer sep=\tikzfeynman@momentum@label@distance,
\tikzfeynman@momentum@label@style] {#2};
},
curveto code={
\tikzfeynmanset{momentum/.cd,#1}
\path (\tikzinputsegmentlast)
.. controls (\tikzinputsegmentsupportb) and (\tikzinputsegmentsupporta)
.. (\tikzinputsegmentfirst)
{ \foreach \i in {1, ..., 50} {
coordinate [pos=\tikzfeynman@momentum@arrow@shorten + (1-2 * \tikzfeynman@momentum@arrow@shorten)*\i/50] (tf@m@\i) } };
\draw [-Stealth, \tikzfeynman@momentum@arrow@style]
($(tf@m@1)!\tikzfeynman@momentum@arrow@distance!-90:(tf@m@2)$)
foreach \i [count=\j from 3] in {2, ..., 24} {
-- ($(tf@m@\i)!\tikzfeynman@momentum@arrow@distance!-90:(tf@m@\j)$)
}
-- ($(tf@m@25)!\tikzfeynman@momentum@arrow@distance!-90:(tf@m@26)$)
node [pos=0.5, auto, swap,
outer sep=\tikzfeynman@momentum@label@distance,
\tikzfeynman@momentum@arrow@style] {#2}
foreach \i [count=\j from 27] in {26, ..., 49} {
-- ($(tf@m@\i)!\tikzfeynman@momentum@arrow@distance!-90:(tf@m@\j)$)
}
-- ($(tf@m@50)!\tikzfeynman@momentum@arrow@distance!90:(tf@m@49)$);
},
closepath code={
\tikzfeynmanset{momentum/.cd,#1}
\path (\tikzinputsegmentlast) -- (\tikzinputsegmentfirst)
coordinate [pos=\tikzfeynman@momentum@arrow@shorten] (tf@m@1)
coordinate [pos=1 - \tikzfeynman@momentum@arrow@shorten] (tf@m@2);
\draw [-Stealth, \tikzfeynman@momentum@arrow@style]
($(tf@m@1)!\tikzfeynman@momentum@arrow@distance!-90:(tf@m@2)$)
-- ($(tf@m@2)!\tikzfeynman@momentum@arrow@distance!90:(tf@m@1)$)
node [pos=0.5, auto, swap,
outer sep=\tikzfeynman@momentum@label@distance,
\tikzfeynman@momentum@label@style] {#2};
},
},
/tikz/decorate=true,
},
},
reversed momentum'@@/.style args={[#1]#2}{
/tikz/preaction={
/tikz/decoration={
show path construction,
moveto code={},
lineto code={
\tikzfeynmanset{momentum/.cd,#1}
\path (\tikzinputsegmentlast) -- (\tikzinputsegmentfirst)
coordinate [pos=\tikzfeynman@momentum@arrow@shorten] (tf@m@1)
coordinate [pos=1 - \tikzfeynman@momentum@arrow@shorten] (tf@m@2);
\draw [-Stealth, \tikzfeynman@momentum@arrow@style]
($(tf@m@1)!\tikzfeynman@momentum@arrow@distance!90:(tf@m@2)$)
-- ($(tf@m@2)!\tikzfeynman@momentum@arrow@distance!-90:(tf@m@1)$)
node [pos=0.5,
auto,
outer sep=\tikzfeynman@momentum@label@distance,
\tikzfeynman@momentum@label@style] {#2};
},
curveto code={
\tikzfeynmanset{momentum/.cd,#1}
\path (\tikzinputsegmentlast)
.. controls (\tikzinputsegmentsupportb) and (\tikzinputsegmentsupporta)
.. (\tikzinputsegmentfirst)
{ \foreach \i in {1, ..., 50} {
coordinate [pos=\tikzfeynman@momentum@arrow@shorten + (1-2 * \tikzfeynman@momentum@arrow@shorten)*\i/50] (tf@m@\i) } };
\draw [-Stealth, \tikzfeynman@momentum@arrow@style]
($(tf@m@1)!\tikzfeynman@momentum@arrow@distance!90:(tf@m@2)$)
foreach \i [count=\j from 3] in {2, ..., 24} {
-- ($(tf@m@\i)!\tikzfeynman@momentum@arrow@distance!90:(tf@m@\j)$)
}
-- ($(tf@m@25)!\tikzfeynman@momentum@arrow@distance!90:(tf@m@26)$)
node [pos=0.5,
auto,
outer sep=\tikzfeynman@momentum@label@distance,
\tikzfeynman@momentum@arrow@style] {#2}
foreach \i [count=\j from 27] in {26, ..., 49} {
-- ($(tf@m@\i)!\tikzfeynman@momentum@arrow@distance!90:(tf@m@\j)$)
}
-- ($(tf@m@50)!\tikzfeynman@momentum@arrow@distance!-90:(tf@m@49)$);
},
closepath code={
\tikzfeynmanset{momentum/.cd,#1}
\path (\tikzinputsegmentlast) -- (\tikzinputsegmentfirst)
coordinate [pos=\tikzfeynman@momentum@arrow@shorten] (tf@m@1)
coordinate [pos=1 - \tikzfeynman@momentum@arrow@shorten] (tf@m@2);
\draw [-Stealth, \tikzfeynman@momentum@arrow@style]
($(tf@m@1)!\tikzfeynman@momentum@arrow@distance!90:(tf@m@2)$)
-- ($(tf@m@2)!\tikzfeynman@momentum@arrow@distance!-90:(tf@m@1)$)
node [pos=0.5, auto,
outer sep=\tikzfeynman@momentum@label@distance,
\tikzfeynman@momentum@label@style] {#2};
},
},
/tikz/decorate=true,
},
},
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Modifiers
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
half left/.style={
/tikz/bend left=90,
/tikz/looseness=1.5,
},
half right/.style={
/tikz/bend right=90,
/tikz/looseness=1.5,
},
quarter left/.style={
/tikz/bend left=45,
},
quarter right/.style={
/tikz/bend right=45,
},
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Graceful Failure of LuaTeX keys
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\tikzfeynman@luatex@required@path{
\PackageWarning{tikz-feynman}{The key you tried to use '\pgfkeyscurrentpath/\pgfkeyscurrentname' requires LuaTeX. It will be ignored.}
}
\def\tikzfeynman@luatex@required@key{
\PackageWarning{tikz-feynman}{The key you tried to use '\pgfkeyscurrentpath' requires LuaTeX. It will be ignored.}
}
\ifluatex\else
\pgfkeys{
/graph drawing/.unknown/.code=\tikzfeynman@luatex@required@path,
/tikz/graphs/.unknown/.code=\tikzfeynman@luatex@required@path,
/tikz/horizontal/.code=\tikzfeynman@luatex@required@key,
/tikz/horizontal'/.code=\tikzfeynman@luatex@required@key,
/tikz/vertical/.code=\tikzfeynman@luatex@required@key,
/tikz/vertical'/.code=\tikzfeynman@luatex@required@key,
/tikz/tree layout/.code=\tikzfeynman@luatex@required@key,
/tikz/spring layout/.code=\tikzfeynman@luatex@required@key,
/tikz/layered layout/.code=\tikzfeynman@luatex@required@key,
/tikz/spring electrical layout/.code=\tikzfeynman@luatex@required@key,
/tikz/electric charge/.code=\tikzfeynman@luatex@required@key,
}
% \tikzfeynmanset{
% horizontal/.code={The key 'horizontal' requires LuaTeX. It will be ignored.},
% }
\fi
\endinput