%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% TikZ-FeynHand, Version 1.1.0 of 2019/08/19
% Feynhand Diagrams with TikZ (LaTex manual version)
% Copyright (C) 2019 Max Dohse
% Copyright (C) 2016 Joshua Ellis
%
% This LaTeX file and the whole package are free:
% you can redistribute it and/or modify it under the
% terms of the GNU General Public License as published by the Free Software Foundation,
% either version 3 of the License, or (at your option) any later version.
%
% This file is a modification of the file tikzlibraryfeynman.code.tex
% of the package tikz-feynman (version 1.1.0 of 2016/02/05)
% which is available online at https://ctan.org/pkg/tikz-feynman
% for a list of changes, see the file CHANGES.TXT
%
% available at https://ctan.org/pkg/tikz-feynhand
% The Current Maintainer of this work is Max Dohse.
%
% 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.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Pre-requisites
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usetikzlibrary{
 arrows.meta,
 calc,
 decorations,
 decorations.markings,
 decorations.pathmorphing,
 decorations.pathreplacing,
 external,
 patterns,
 positioning,
 shapes.geometric,
}

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

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

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

%% |\tikzfeynhandset| allows keys that belong with tikz-feynhand to be easily set.
\def\tikzfeynhandset{\pgfqkeys{/tikzfeynhand}}

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

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

%% Feynhand Environment
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% Provide `\begin{feynhand} ... \end{feynhand}` within TikZ pictures.
\tikzaddtikzonlycommandshortcutlet\feynhand\tikzfeynhand@environment@feynhand
\tikzaddtikzonlycommandshortcutlet\endfeynhand\endtikzfeynhand@environment@feynhand

%% \begin{feynhand}...\end{feynhand}
\def\tikzfeynhand@environment@feynhand{%
 \pgfutil@ifnextchar[{\tikzfeynhand@environment@feynhand@opt}
 {\tikzfeynhand@environment@feynhand@opt[]}}

\def\tikzfeynhand@environment@feynhand@opt[#1]{%
 \begingroup
 %% Local overrides
 \let\tikz@@scan@fig=\tikzfeynhand@scan@fig
 %% Local commands
 \let\vertex=\tikzfeynhand@commands@vertex
 \let\propagator=\tikzfeynhand@commands@propagator
 \let\propag=\propagator
 %% Opening hooks
 \scope
 \tikzfeynhand@tikz@search@tikzfeynhand
 \pgfkeys{/tikzfeynhand/every feynhand@@,#1}
 \pgfkeysvalueof{/tikzfeynhand/execute at begin feynhand@@}%
 \pgfkeysvalueof{/tikzfeynhand/execute at begin feynhand}%
 }

\def\endtikzfeynhand@environment@feynhand{%
 %% Closing hooks
 \pgfkeysvalueof{/tikzfeynhand/execute at end feynhand}%
 \pgfkeysvalueof{/tikzfeynhand/execute at end feynhand@@}%
 \endscope
 \endgroup
 }

%%% Allow empty nodes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newif\iftikzfeynhandallowemptynode
\newif\iftikzfeynhandvertex
\def\tikzfeynhand@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}%
         {\iftikzfeynhandvertex%
            \tikzset{/tikzfeynhand/every vertex@@}%
            \iftikzfeynhandallowemptynode%
              \else%
              \tikzset{/tikzfeynhand/particle}%
              \fi%
           \fi%
           \tikz@fig@main{}
         }
       }
     }
   }
}

%% Include /tikzfeynhand in the search path
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\tikzfeynhand@tikz@search@tikzfeynhand{%
 \pgfkeys{/tikz/.unknown/.code=%
   \let\tikz@key\pgfkeyscurrentname%
   %% Is it a tikzfeynhand key?
   \pgfkeys{/tikzfeynhand/\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
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% SEE ALSO \vertex above!
%% Adapted from |\coordinate| code
\def\tikzfeynhand@commands@vertex{%
 \path \pgfextra{\tikzfeynhandallowemptynodetrue}
       \pgfextra{\tikzfeynhandvertextrue}
       node}

%% Propagators
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcommand{\tikzfeynhand@commands@propagator}[1][]{\draw [#1]}

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

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

%% Slash
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\tikzfeynhand@slash{%
 \pgfutil@ifnextchar[{\tikzfeynhand@key@opt{slash@@}}
 {\tikzfeynhand@key@opt{slash@@}[]}}
\pgfkeyslet{/tikzfeynhand/slash/.@cmd}{\tikzfeynhand@slash}

%% Backslash
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\tikzfeynhand@backslash{%
 \pgfutil@ifnextchar[{\tikzfeynhand@key@opt{backslash@@}}
 {\tikzfeynhand@key@opt{backslash@@}[]}}
\pgfkeyslet{/tikzfeynhand/backslash/.@cmd}{\tikzfeynhand@backslash}

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

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

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

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

% short versions of momentum styles
\pgfkeyslet{/tikzfeynhand/rmomentum/.@cmd}{\tikzfeynhand@momentum@stdr}
\pgfkeyslet{/tikzfeynhand/rmomentum'/.@cmd}{\tikzfeynhand@momentum@stdrp}

\pgfkeyslet{/tikzfeynhand/mom/.@cmd}{\tikzfeynhand@momentum@std}
\pgfkeyslet{/tikzfeynhand/mom'/.@cmd}{\tikzfeynhand@momentum@stdp}

\pgfkeyslet{/tikzfeynhand/revmom/.@cmd}{\tikzfeynhand@momentum@stdr}
\pgfkeyslet{/tikzfeynhand/revmom'/.@cmd}{\tikzfeynhand@momentum@stdrp}

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

\input tikzfeynhand.keys.code.tex

\endinput