%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% 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.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Pre-requisites
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usetikzlibrary{
 arrows.meta,
 calc,
 decorations,
 decorations.markings,
 decorations.pathmorphing,
 decorations.pathreplacing,
 graphs,
 patterns,
 positioning,
 shapes.geometric,
}
\ifluatex
 \usetikzlibrary{
   graphdrawing
 }
 \usegdlibrary{
   circular,
   force,
   layered,
   trees
 }
\fi

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Function definitions
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% Miscellaneous functions
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\tikzfeynman@empty{}

%% Key Manager
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Setup the tikz-feynman key family
\pgfkeys{
 /tikzfeynman/.is family,
 /tikzfeynman/.search also={/tikz},
}

%% |\tikzfeynmanset| allows keys that belong with tikz-feynman to be easily set.
\def\tikzfeynmanset{\pgfqkeys{/tikzfeynman}}

%% Luatex Waring
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Check if we are using luatex
\newif\iftikzfeynman@warn@luatex%
\tikzfeynmanset{
 warn luatex/.is if=tikzfeynman@warn@luatex,
 warn luatex=true,
}

\AtBeginDocument{
 \ifluatex\else
   \iftikzfeynman@warn@luatex
     \PackageWarning{tikz-feynman}{LuaTeX is required if you wish to have vertices automatically placed.  You can disable this warning by setting /tikzfeynman/warn luatex=false}
   \fi
 \fi
}

%% Version check
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Check which version is expected and which is installed
\def\tikzfeynman@compat@parse#1.#2.#3\pgfeov{
 \edef\tikzfeynman@compat@major{#1}
 \edef\tikzfeynman@compat@minor{#2}
 \edef\tikzfeynman@compat@patch{#3}
 \edef\tikzfeynman@compat{#1.#2.#3}
}
\let\tikzfeynman@compat=\tikzfeynman@empty
\pgfkeyslet{/tikzfeynman/compat/.@cmd}{\tikzfeynman@compat@parse}
\ProcessPgfPackageOptions{/tikzfeynman}

\AtBeginDocument{
 \ifx\tikzfeynman@version\tikzfeynman@compat\else
   \ifx\tikzfeynman@compat\tikzfeynman@empty
     \PackageWarning{tikz-feynman}{Consider loading TikZ-Feynman with \string\usepackage[compat=\tikzfeynman@version]{tikz-feynman} so that you can be warned if TikZ-Feynman changes.}
   \else
     \ifx\tikzfeynman@compat@major\tikzfeynman@version@major
       \ifx\tikzfeynman@compat@minor\tikzfeynman@version@minor
         \ifx\tikzfeynman@compat@patch\tikzfeynman@version@patch\else
           \PackageInfo{tikz-feynman}{The preamble requested version \tikzfeynman@compat, but the system version is \tikzfeynman@version.  This should cause no issue.}
         \fi
       \else
         \PackageWarning{tikz-feynman}{The preamble requested version \tikzfeynman@compat, but the system version is \tikzfeynman@version.  This may change some diagrams.}
       \fi
     \else
       \PackageError{tikz-feynman}{The preamble requested version \tikzfeynman@compat, but the system version is \tikzfeynman@version.  They are most likely incompatible.  Please download the appropriate version from jpellis.me/projects/tikz-feynman.}
     \fi
   \fi
 \fi
}

%% Override Lua code if necessary
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\tikzfeynman@apply@patch#1{
 \directlua{require("tikzfeynman.patch.#1.lua")}
}

%% Version 3.0.0, 3.0.1 and 3.0.1a need to be patched.
\ifluatex
 \def\tikzfeynman@temp{3.0.0}
 \ifx\pgfversion\tikzfeynman@temp
   \tikzfeynman@apply@patch{3.0.0}
 \else
   \def\tikzfeynman@temp{3.0.1}
   \ifx\pgfversion\tikzfeynman@temp
     \tikzfeynman@apply@patch{3.0.1}
   \else
     \def\tikzfeynman@temp{3.0.1a}
     \ifx\pgfversion\tikzfeynman@temp
       \tikzfeynman@apply@patch{3.0.1}
     \fi
   \fi
 \fi
\fi

%% Feynman Environment
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% Provide `\begin{feynman} ... \end{feynman}` within TikZ pictures.
\tikzaddtikzonlycommandshortcutlet\feynman\tikzfeynman@environment@feynman
\tikzaddtikzonlycommandshortcutlet\endfeynman\endtikzfeynman@environment@feynman

%% \begin{feynman}...\end{feynman}
\def\tikzfeynman@environment@feynman{%
 \pgfutil@ifnextchar[{\tikzfeynman@environment@feynman@opt}
 {\tikzfeynman@environment@feynman@opt[]}}

\def\tikzfeynman@environment@feynman@opt[#1]{%
 \begingroup
 %% Local overrides
 \let\tikz@@scan@fig=\tikzfeynman@scan@fig
 \let\tikzfeynman@orig@graph=\graph
 %% Local commands
 \let\vertex=\tikzfeynman@commands@vertex
 \let\diagram=\tikzfeynman@commands@diagram
 \let\graph=\tikzfeynman@commands@graph
 %% Opening hooks
 \scope
 \tikz@lib@ignore@sizetrue
 \tikzfeynman@tikz@search@tikzfeynman
 \pgfkeys{/tikzfeynman/every feynman@@,#1}
 \pgfkeysvalueof{/tikzfeynman/execute at begin feynman@@}%
 \pgfkeysvalueof{/tikzfeynman/execute at begin feynman}%
}

\def\endtikzfeynman@environment@feynman{%
 %% Closing hooks
 \pgfkeysvalueof{/tikzfeynman/execute at end feynman}%
 \pgfkeysvalueof{/tikzfeynman/execute at end feynman@@}%
 \endscope
 \endgroup
}

%% \feynmandiagram
\def\feynmandiagram{%
 \pgfutil@ifnextchar[{\feynmandiagram@opt}
 {\feynmandiagram@opt[]}}
\def\feynmandiagram@opt[#1]{%
 \pgfutil@ifnextchar[{\feynmandiagram@opt@opt[#1]}
 {\feynmandiagram@opt@opt[#1][#1]}}
\def\feynmandiagram@opt@opt[#1][#2]{%
 \tikz [/tikzfeynman/.cd,#1]
 \graph [/tikzfeynman/.cd,/tikzfeynman/every diagram@@,/tikz/graphs/spring layout,#2]}

%% Allow empty nodes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newif\iftikzfeynmanallowemptynode
\newif\iftikzfeynmanvertex
\def\tikzfeynman@scan@fig{%
 \pgfutil@ifnextchar a{\tikz@fig@scan@at}
 {\pgfutil@ifnextchar({\tikz@fig@scan@name}
   {\pgfutil@ifnextchar[{\tikz@fig@scan@options}%
     {\pgfutil@ifnextchar\bgroup{\tikz@fig@main}%
     {\iftikzfeynmanvertex%
        \tikzset{/tikzfeynman/every vertex@@}%
        \iftikzfeynmanallowemptynode%
        \else%
          \tikzset{/tikzfeynman/particle}%
        \fi%
      \fi%
      \tikz@fig@main{}}}}}}%}}

%% Include /tikzfeynman in the search path
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\tikzfeynman@tikz@search@tikzfeynman{%
 \pgfkeys{/tikz/.unknown/.code=%
   \let\tikz@key\pgfkeyscurrentname%
   %% Is it a tikzfeynman key?
   \pgfkeys{/tikzfeynman/\tikz@key/.try={##1}}%
   \ifpgfkeyssuccess%
   \else%
     %% Is it a pgf key?
     \pgfkeys{/pgf/\tikz@key/.try={##1}}%
     \ifpgfkeyssuccess%
     \else%
       \expandafter\pgfutil@in@\expandafter!\expandafter{\tikz@key}%
       \ifpgfutil@in@%
         %% this is a color!
         \expandafter\tikz@addoption\expandafter{\expandafter\tikz@compat@color@set\expandafter{\tikz@key}}%
         \edef\tikz@textcolor{\tikz@key}%
       \else%
         \pgfutil@doifcolorelse{\tikz@key}
         {%
           \expandafter\tikz@addoption\expandafter{\expandafter\tikz@compat@color@set\expandafter{\tikz@key}}%
           \edef\tikz@textcolor{\tikz@key}%
         }%
         {%
           %% Ok, second chance: This might be an arrow specification:
           \expandafter\pgfutil@in@\expandafter-\expandafter{\tikz@key}%
           \ifpgfutil@in@%
             %% Ah, an arrow spec!
             \expandafter\tikz@processarrows\expandafter{\tikz@key}%
           \else%
             %% Ok, third chance: A shape!
             \expandafter\ifx\csname pgf@sh@s@\tikz@key\endcsname\relax%
               \pgfkeys{/errors/unknown key/.expand
               once=\expandafter{\expandafter/\expandafter t\expandafter
               i\expandafter k\expandafter z\expandafter/\tikz@key}{##1}}%
             \else%
               \edef\tikz@shape{\tikz@key}%
             \fi%
           \fi%
         }%
       \fi%
     \fi%
   \fi%
 }
}


%% Vertex
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Adapted from |\coordinate| code
\def\tikzfeynman@commands@vertex{
 \path \pgfextra{\tikzfeynmanallowemptynodetrue}
       \pgfextra{\tikzfeynmanvertextrue}
       node}

%% Diagram
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\tikzfeynman@commands@diagram{\@ifstar
 \tikzfeynman@commands@diagram@star%
 \tikzfeynman@commands@diagram@nostar}

\def\tikzfeynman@commands@diagram@nostar{%
 \pgfutil@ifnextchar[{\tikzfeynman@commands@diagram@nostar@opt}
 {\tikzfeynman@commands@diagram@nostar@opt[]}}
\def\tikzfeynman@commands@diagram@nostar@opt[#1]{%
 \tikzfeynman@orig@graph [/tikzfeynman/every diagram@@,/tikz/graphs/spring layout,#1]}

\def\tikzfeynman@commands@diagram@star{%
 \pgfutil@ifnextchar[{\tikzfeynman@commands@diagram@star@opt}
 {\tikzfeynman@commands@diagram@star@opt[]}}
\def\tikzfeynman@commands@diagram@star@opt[#1]{%
 \tikzfeynman@orig@graph [/tikzfeynman/every diagram@@,#1]}

%% Graph
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\tikzfeynman@commands@graph{%
 \pgfutil@ifnextchar[{\tikzfeynman@commands@graph@opt}
 {\tikzfeynman@commands@graph@opt[]}}
\def\tikzfeynman@commands@graph@opt[#1]{%
 \PackageWarning{tikz-feynman}{It is not recommended to use \string\graph.  Use \string\diagram\space or \string\diagram* instead.}
 \tikzfeynman@orig@graph [/tikzfeynman/every diagram@@,#1]}

%% Optional argument in style key
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\tikzfeynman@key@opt#1[#2]#3\pgfeov{%
 \tikzfeynmanset{#1={[#2]#3}}}

%% Insertion
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\tikzfeynman@insertion{%
 \pgfutil@ifnextchar[{\tikzfeynman@key@opt{insertion@@}}
 {\tikzfeynman@key@opt{insertion@@}[]}}
\pgfkeyslet{/tikzfeynman/insertion/.@cmd}{\tikzfeynman@insertion}

%% Momentum
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\tikzfeynman@momentum@std{%
 \pgfutil@ifnextchar[{\tikzfeynman@key@opt{momentum@@}}
 {\tikzfeynman@key@opt{momentum@@}[]}}
\pgfkeyslet{/tikzfeynman/momentum/.@cmd}{\tikzfeynman@momentum@std}

\def\tikzfeynman@momentum@stdp{%
 \pgfutil@ifnextchar[{\tikzfeynman@key@opt{momentum'@@}}
 {\tikzfeynman@key@opt{momentum'@@}[]}}
\pgfkeyslet{/tikzfeynman/momentum'/.@cmd}{\tikzfeynman@momentum@stdp}

\def\tikzfeynman@momentum@stdr{%
 \pgfutil@ifnextchar[{\tikzfeynman@key@opt{reversed momentum@@}}
 {\tikzfeynman@key@opt{reversed momentum@@}[]}}
\pgfkeyslet{/tikzfeynman/reversed momentum/.@cmd}{\tikzfeynman@momentum@stdr}
\pgfkeyslet{/tikzfeynman/rmomentum/.@cmd}{\tikzfeynman@momentum@stdr}

\def\tikzfeynman@momentum@stdrp{%
 \pgfutil@ifnextchar[{\tikzfeynman@key@opt{reversed momentum'@@}}
 {\tikzfeynman@key@opt{reversed momentum'@@}[]}}
\pgfkeyslet{/tikzfeynman/reversed momentum'/.@cmd}{\tikzfeynman@momentum@stdrp}
\pgfkeyslet{/tikzfeynman/rmomentum'/.@cmd}{\tikzfeynman@momentum@stdrp}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Styles
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\input tikzfeynman.keys.code.tex

\endinput