% \iffalse % This is feyn.dtx, which manages the use of the feyn Metafont % %% This software is copyright 1991, 1994, 2001-2, 2005, 2008-17, Norman Gray. %% It is distributed under the terms of the 2-clause BSD Licence; %% see the file LICENCE for details. % %<+package|driver>%% VCS Info: Mercurial revision 0a471f8ed572, 2022-07-20 11:23 +0100, tag 0.4.3 + 0 %<+package>\NeedsTeXFormat{LaTeX2e} %<+package>\ProvidesPackage{feyn}[2022/07/20 0.4.3] %<+package>\typeout{Package: `feyn' 0.4.3 <2022/07/20>} % %<*driver> \documentclass{ltxdoc} \usepackage{feyn} \title{The feyn font} \author{Norman Gray\\(\texttt{https://nxg.me.uk})} \date{Version 0.4.3, 2022 July 20} \newcommand\Lopt[1]{\textsf {#1}} \newcommand\file[1]{\texttt {#1}} \newcommand\Lcount[1]{\textsl {\small#1}} \newcommand\pstyle[1]{\textsl {#1}} %% \url macro (url.sty does this better) \def\setpathdots{\discretionary{.}{}{.}} \def\setpathslash{\discretionary{/}{}{/}} {\catcode`\.=\active \catcode`\/=\active \gdef\pathcats{% \catcode`\%=12 \catcode`\~=12 \catcode`\.=\active \let.\setpathdots \catcode`\/=\active \let/\setpathslash \catcode`\#=12 \catcode`\_=12}% } \def\setpath#1{\ttfamily <\nobreak #1\nobreak>\endgroup} \def\url{\begingroup\pathcats\setpath} %\RecordChanges \OnlyDescription \parskip=\medskipamount \parindent=0pt \begin{document} \maketitle \DocInput{feyn.dtx} \end{document} % % % \fi % % % %% \CharacterTable %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z %% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z %% Digits \0\1\2\3\4\5\6\7\8\9 %% Exclamation \! Double quote \" Hash (number) \# %% Dollar \$ Percent \% Ampersand \& %% Acute accent \' Left paren \( Right paren \) %% Asterisk \* Plus \+ Comma \, %% Minus \- Point \. Solidus \/ %% Colon \: Semicolon \; Less than \< %% Equals \= Greater than \> Question mark \? %% Commercial at \@ Left bracket \[ Backslash \\ %% Right bracket \] Circumflex \^ Underscore \_ %% Grave accent \` Left brace \{ Vertical bar \| %% Right brace \} Tilde \~} % % \CheckSum{680} % % % % % \newcommand{\pslash}{p\llap{/\kern-0.3pt}} % \newcommand{\feynx}{\pstyle{feyn}} % \newcommand{\metafont}{Metafont} % % % % This document describes the font \feynx, which can be used to produce relatively % simple Feynman diagrams within equations in a \LaTeX\ document. The % package and font aims to be capable of producing all of the diagrams % of one- and two-loop QED and QCD, plus $\phi^4$ theory. % % The other Feynman diagram package which exists is Thorsten Ohl's % \textsl{feynmf}/\textsl{feynmp} package. That % works by creating \metafont\ or MetaPost figures using a preprocessor. % It's more general than this package, but is at its best when % creating relatively large diagrams, for figures. % In contrast, the present system consists of a carefully-designed font % with which you can easily write simple diagrams, within equations or within text, % in a size matching the surrounding text size. % % \iftrue % \textbf{Contents:} % \def\numberline#1{\space\emph{\S#1}~} % \def\contentsline#1#2#3{#2,~p#3;} % \makeatletter \@starttoc{toc} \makeatother % \fi % % \subsection*{Status} % % The propagators and vertices which are implemented are those of one- % and two-loop QED and QCD, plus $\phi^4$ theory, plus a few extras % which commonly appear in non-figure displays (the practical % definition of `commonly appear' is: `which I wanted' or `which % people asked me for'). I'd be delighted to add others which folk % feel would be useful, as long as they're still in the rather simple % scope of the font. % % \newpage % \section{Description} % % You use the font by including the package \texttt{feyn.sty}, as in % \begin{verbatim} % \usepackage{feyn} % \end{verbatim} % If you use the `amsmath' package, you should load that before % loading the `feyn' package.\footnote{Because of a slight peculiarity % of the amsmath package, the active~`!' command described below will % not work properly within amsmath |{align}| or |{align*}| % environments unless the~`!' is made active globally. This is done % by default if the `amsmath' package is loaded first, and not done by % default otherwise. If you have to override this behaviour for some % very arcane reason, then you can force the global or local declaration % of~`!' using the \Lopt{globalbang} and \Lopt{noglobalbang} options % to the \texttt{$\backslash$usepackage\{feyn\}} command.} % % You write Feynman diagrams in text by writing a sequence of letters % in the maths-mode \feynx\ font, selected with |\Feyn{...}| in text % style and |\feyn{...}| in displays. Most of the characters in the % font are selected using ligatures, so that |\feyn{f}| produces a % fermion propagator, $\feyn{f}$., but |\feyn{fs}| produces a short % fermion, $\feyn{fs}$ and |\feyn{fA}| produces an arrowed one, % $\feyn{fA}$. See below for more detailed description of how to use % the font. % % \makeatletter % \def\refptcirc{\lower\feyn@maxis \hbox to 0pt{\hss$\circ$\hss}} % \makeatother % \begin{table} % \def\tableskip{\noalign{\smallskip}} % \halign{$\refptcirc\Feyn{#}$% % \hfil\quad & $#$\hfil\quad & # \hfil\qquad && # \cr % \omit Character & \omit & Name & Width & Height & Depth \cr % \noalign{\smallskip\hrule\smallskip} % f & f & fermion$^{\dag}$ % & 2 & 0 & 0 \cr \tableskip % fs & fs & short fermion % & 1 & 0 & 0 \cr \tableskip % fl & fl & fermion loop$^{\dag\ddag}$ % & 0 & $2-$ & 0 \cr \tableskip % flS & flS & fermion loop (small)$^{\dag\ddag}$ % & 0 & 1 & 0 \cr \tableskip % flo & flo & fermion loop (for $\phi^4$ theory)$^{\dag}$ % & 0 & 2 & 0 \cr \tableskip % fu & fu & upward fermion$^\dag$ (45$^\circ$) % & $\sqrt2$ & $\sqrt2$ & 0 \cr \tableskip % fd & fd & downward fermion$^\dag$ % & $\sqrt2$ & $\sqrt2$ & 0 \cr \tableskip % fv & fv & vertical fermion$^\dag$ % & 0 & 2 & 0 \cr \tableskip % f0 & f0 & spacer % & 2 & 0 & 0 \cr \tableskip % fs0 & fs0 & short spacer % & 1 & 0 & 0 \cr \tableskip % g & g & gluon/photon$^{\dag}$ % & 2 & 0 & 0 \cr \tableskip % gl & gl & gluon loop$^{\dag\ddag}$ % & 0 & $2-$ & 0 \cr \tableskip % glB & glB & gluon loop (big)$^{\dag}$ % & 0 & 2.67 & 0 \cr \tableskip % glS & glS & gluon loop (small)$^{\dag}$ % & 0 & 1.33 & 0 \cr \tableskip % g1\quad g2 & g1, g2 & gluon loop, 1st \& 2nd quadrants$^{\dag}$ % & 0 & 2 & 0 \cr \tableskip % g4\quad g3 & g4, g3 & gluon loop, 4th \& 3rd quadrants$^{\dag}$ % & 0 & 0 & -2 \cr \tableskip % gu & gu & upward gluon$^\dag$ (45$^\circ$) % & $\sqrt2$ & $\sqrt2$ & 0 \cr \tableskip % gd & gd & downward gluon$^\dag$ % & $\sqrt2$ & $\sqrt2$ & 0 \cr \tableskip % gv & gv & vertical gluon$^\dag$ % & 0 & 2 & 0 \cr \tableskip % m & m & massive fermion$^{\dag}$ % & 2 & 0 & 0 \cr \tableskip % ms & ms & short massive fermion % & 1 & 0 & 0 \cr \tableskip % h & h & ghost$^{\dag}$ % & 2 & 0 & 0 \cr \tableskip % hs & hs & short ghost % & 1 & 0 & 0 \cr \tableskip % hu & hu & upward ghost$^{\dag}$ (45$^\circ$) % & $\sqrt2$ & $\sqrt2$ & 0 \cr \tableskip % hd & hd & downward ghost$^{\dag}$ % & $\sqrt2$ & $\sqrt2$ & 0 \cr \tableskip % hl & hl & ghost loop$^{\dag\ddag}$ % & 0 & $2-$ & 0 \cr\tableskip % x & x & counterterm vertex & 0 & $a$ & $-a$ \cr \tableskip % p & p & proper vertex & - & - & - \cr \tableskip % P & P & proper vertex (variant) & - & - & - \cr \tableskip % c & c & complete vertex & - & - & - \cr \tableskip % a & a & arrow$^\dag$ & 0 & 0 & 0 \cr % } % \caption{\label{chars} The characters in font \feynx, and their % reference points, marked with circles. Characters % marked~$\dag$ have arrowed variants indicated with~`A' and~`V' suffixes; % and characters marked~$\ddag$ have an upside-down variant % indicated with a `u' suffix. The `u' must come before the `A' or % `V'. Character `a' has an `arrowed variant' in the sense that `aV' % produces a backward arrow. A length of `$2-$' indicates a length % slightly less than two units, for aesthetic reasons.} % \end{table} % % The characters in the font are shown in table~\ref{chars}. % These are shown in textstyle size, but all characters are also available in % displaystyle size. % All of the displaystyle characters are additionally offset vertically % up to the math axis, which has height~$a$. % All the dimensions are shown as multiples of the % length of a module which is the length of the short fermion. % The~$\circ$ shows the reference point of each character. % The proper vertex and the complete vertex are specified % in terms of a `blob-radius' which is about half a module. % They have a width of 2~radii, and a height and depth of 1~radius. % % Each of the characters marked with a~$\dag$ in the table has two % arrowed variants, so that |\feyn{fA + gV}| produces $\feyn{fA + % gV}$. The `A' variants produce arrows pointing rightwards or % upwards, and the `V' variants arrows pointing leftwards or % downwards. The characters marked with a~$\ddag$ also have an % upside-down variant, thus `flu' is an upside-down variant of the % fermion loop, and `fluV' an arrowed variant. % % Note that the fermion, gluon and ghost half-loop characters are % slightly shorter than the height you might expect. These characters % are deliberately slightly squashed partly because that makes them % look slightly better (in my opinion!) in a one-loop self-energy % diagram, but also so that the `gl glu' or `fl flu' loop in a % two-loop diagram looks better. The loop formed by the pair of `g1 % g2' is the size you might expect. See section~\ref{s:examples} below % for some illustrations of this. % % The unnassigned positions in the \feynx\ font are filled % with an obviously wrong dummy character, so that |$\feyn{A}$|, for example, % produces $\feyn{fs0Afs0}$. This should help at least some % mistypings stand out. % % If you were to print out a font table, you would discover that many % of the glyphs in the font can be obtained using single % characters, rather than the ligatures mentioned in the table. Do % not be tempted to use this as a shortcut, since the assignment of % glyphs to character positions may be changed without warning from release to % release, as long as the ligature maps remain valid. % % The file \file{feyn.sty} additionally defines a number of macros, % described here. % \begin{description} % \item[\cs{feyn}] Selects the diagram font, in display style -- that % is, suitable for a displayed equation. This must be used % within math mode. \cs{Feyn} selects the textstyle diagram font. % \item[\cs{momentum}\{ch\}\{text\}] sets the character % `ch', which may be a ligature, and puts the given text at the recommended % annotation position for that character. |\momentum[pos]{ch}{text}| % is the same, except that the optional argument indicates the % position relative to the annotation position. It must be one of % `top', `urt', `lrt', `bot', `llft' or `ulft'. This is rarely % used as such, since the |\feyn| and |\Feyn| % commands make~`!' a temporarily active character, and define it % to be |\momentum|. See section~\ref{s:examples} for % examples and further discussion. % \item[\cs{belowl\{\}}] A common pattern in diagrams is to have a pair % of incoming or outgoing propagators. If the lower one of this % pair is enclosed within |\belowl{...}|, then it is set so that it % occupies zero horizontal space, and moved leftwards and % downwards, to fit under the upper of the pair of propagators. % The command |\belowr{...}| is the same, except that the argument % is moved rightwards. % See examples below. % \item[\cs{Diagram\{\}}] This is for building more complicated diagrams. It % takes one argument, which is like the contents of an \texttt{\{array\}} % environment---a series of formulae separated by \&'s and \verb-\\-. See % below for an example. The result is a box on the math-axis. % \item[\cs{maxis}] Raises a formula to the math-axis, which is % occasionally useful within in-text equations: eg % |$\Feyn{fglf} - \maxis{\Feyn{faf}}$| produces % $\Feyn{fglf} - \maxis{\Feyn{faf}}$. % \item[\cs{vertexlabel\{p\}\{text\}}] Allows you to label a vertex. If % the first parameter~$p$ is~$\wedge$, the~\emph{text} is placed above the % point at which the command is given, if it is~\texttt{\_}, it is % placed below. For example, |$\feyn{f\vertexlabel^{a}}$| produces % $\feyn{f\vertexlabel^{a}}$. More often used within |\Diagram| % than elsewhere. % \item[\cs{feynstrut\{h\}\{d\}}] For use within an (eqn)array environment, or % the like. It modifies the control sequence \verb-\strut- to be a strut of % height~$h$ and depth~$d$ modules, which can therefore be used to % space the array out. Note that it modifies |\strut|, rather % than being the strut itself. % \item[\cs{annotate\{x\}\{y\}\{text\}}] Puts the \emph{text}, between dollars, % in a zero width box at offset~$(x,y)$ modules from the position of the % |\annotate| command (which is generally the first command(s) after % entering math-mode). Because the \emph{text} is in math-mode, anything % that is not maths should be in an |\mbox|. You will probably % use this only rarely, as the |\momentum| command supports most % of the annotation you will need. % \end{description} % % The \feynx\ font is modular, in the sense that all the % dimensions are in terms of a module of 10pt, and all sizes given % below are in units of modules. As well as 10pt, the font has % versions for 11pt, 12pt, 18pt and 24pt text, and the most % appropriate one is selected depending on the text size declared (or % defaulted) in the |\documentclass| command. This range of sizes % seems to be appropriate for the sizes required, but the author would % welcome comments on this. The distribution % contains a sample file using the 18pt \feynx\ font in a % \texttt{foiltex} document. % % You draw a diagram by going into math-mode (between \$\dots\$), and selecting % the diagrams font by the font-changing command \verb-\feyn{}- % (exactly as you might use \verb-\mathrm- in math-mode). With a couple of % exceptions, all the characters are obtained by typing a single % letter, or a couple of letters which form a ligature, so that the % letter~$f$ in the diagrams font (\verb-$\feyn{f}$-) produces a % fermion of length~2 (modules), and~$fs$ produces a short fermion of % length~1. As usual in maths mode, space characters are ignored, so % you can add whitespace as required to make the expressions more % legible. Some of the more heavily used characters are available in % both display size and text size, with the text-size version invoked % by |\Feyn{...}|, so that |\feyn{fglf}| gives $\feyn{fglf}$ and % |\Feyn{fglf}| gives $\Feyn{fglf}$. The displaystyle characters % are all on the math-axis, the textstyle ones are on the text line. % % The display and text sizes of diagrams (that is, as produced by % |\feyn| and |\Feyn| respectively) are intended to be used % within equations, and they are sized accordingly. When diagrams % have significantly complicated annotation, however, this size can % look unhelpfully cramped, and it is for this case that there is an % `extended' set of diagram characters, which are approximately double % the size, and are available, in |\displaystyle| only, with the % |\FEYN| and |\DIAGRAM| macros. These are used exactly like the % |\feyn| and |\Diagram| macros. Note % that the line width, the module used by the (rare) |\annotate| command, and the math % axis, do not change from the sizes they have for the |\feyn| % command. That is, this font is \emph{not} the appropriate one to % use if you simply want a larger font size -- in that case, simply % increase the \LaTeX\ font size and the \feynx\ font will change in % size accordingly. See below for an example of the use of |\FEYN|. % % \subsection{More complicated diagrams} % % \newdimen\halftextwidth % \halftextwidth=\textwidth % \advance\halftextwidth by -\tabcolsep % \advance\halftextwidth by -\arrayrulewidth % \divide\halftextwidth by 2 % \newenvironment{codeexample} % {\vskip\medskipamount % \def\Becomes{\cr % \noalign{\vrule width \arrayrulewidth \hskip\tabcolsep}} % \valign\bgroup % \hrule height 0pt depth 0pt width \halftextwidth % \hsize=\halftextwidth % \vfil ## \vfil \cr} % {\crcr\egroup % \vskip\medskipamount} % \newenvironment{examplerhs}{\begin{minipage}[t]{\halftextwidth}} % {\\ \end{minipage}} % % % The \feynx\ font is designed so that simple diagrams are simple to % produce, and are as far as possible writable as a single line of % characters. There are a couple of more complicated diagrams which % are drawable without too much effort. % % A common pattern in diagrams is to have a pair % of incoming or outgoing propagators. If the lower one of this % pair is enclosed within |\belowl{...}|, then it is set so that it % occupies zero horizontal space, and moved leftwards and % downwards, to fit under the upper of the pair of propagators. For % example the sequence |\feyn{f gu \belowl{fd}}| would put the downward % fermion directly below the upward gauge boson. See below for this % and other examples. % % The second way of composing more complicated diagrams is to use the % |\Diagram| macro. This allows you to lay out a diagram in an % array-like environment, each cell of which is set within a % |\feyn{...}| macro. On the right is the same diagram drawn with % lines indicating the boundaries between the cells. % \begin{codeexample} % \begin{verbatim} % \Diagram{ & x \\ % fs & gv f & gu \\ % & & fd } % \end{verbatim} % \Becomes % \begin{examplerhs}$ % \Diagram{ & x \\ % fs & gv f & gu \\ % & & fd } % \qquad\left(\quad % \makeatletter % \Diagram{ &\vrule x &\vrule height \feyn@maxis \\ % \hline fs &\vrule gv f &\vrule height \feyn@module gu \\ % \hline &\vrule height 0.7\feyn@module &\vrule fd \\ % \iffalse \hline &\vrule height \feyn@module &\vrule\fi % } % \quad\right) % $\end{examplerhs} % \end{codeexample} % % The |\Diagram| and |\DIAGRAM| macros take an optional argument of % either `centre' or `bottom': with `centre', the diagram is centred % on the math axis, with `bottom' the reference point of the diagram % is the reference point of the bottom-most row of the array. The % default is `centre'. % % Before the introduction of the |\belowl| macro in \feynx~v0.4, this % was the only way to produce this pair of angled propagators one on % top of the other. With |\belowl|, however, an alternative way of % producing this diagram is as shown below. % \begin{codeexample} % \begin{verbatim} % \feyn{fs % \Diagram[bottom]{x\\gv} % f gu\belowl{fd}} % \end{verbatim} % \Becomes % \begin{examplerhs}$ % \feyn{fs % \Diagram[bottom]{x\\gv} % f gu\belowl{fd}} % $\end{examplerhs} % \end{codeexample} % % Diagrams much more complicated than this are probably better dealt % with using Thorsten Ohl's \textsl{feynmf/feynmp} package. % % \section{Examples} % \label{s:examples} % % A simple propagator: % \begin{codeexample} % \begin{verbatim} % \feyn{\vertexlabel^a % !{fA}p \vertexlabel^b} % = \displaystyle % \frac{i\delta^{ab}} % {\pslash-m_0}} % \end{verbatim} % \Becomes % \begin{examplerhs}$ % \feyn{\vertexlabel^a % !{fA}p \vertexlabel^b} % = \displaystyle % \frac{i\delta^{ab}}{\pslash-m_0} % $\end{examplerhs} % \end{codeexample} % % The |\Diagram| command lays out its arguments as an array. % \begin{codeexample} % \begin{verbatim} % \Diagram{\vertexlabel^a \\ % fd \\ % & g\vertexlabel_{\mu,c} \\ % \vertexlabel_b fu\\ % } % = ig\gamma_\mu (T^c)_{ab} % \end{verbatim} % \Becomes % \begin{examplerhs}$ % \Diagram{\vertexlabel^a \\ % fd \\ % & g\vertexlabel_{\mu,c} \\ % \vertexlabel_b fu\\ % } % = ig\gamma_\mu (T^c)_{ab} % $\end{examplerhs} % \end{codeexample} % The |\Diagram| is here necessary only for the vertex labels. % Without those, it would be as simple as: % \begin{codeexample} % \begin{verbatim} % \feyn{fd \belowl{fu} g % = ig\gamma_\mu (T^c)_{ab}} % \end{verbatim} % \Becomes % \begin{examplerhs}$ % \feyn{fd \belowl{fu} g} = ig\gamma_\mu (T^c)_{ab} % $\end{examplerhs} % \end{codeexample} % % An assortment of two-loop diagrams: % \begin{codeexample} % \begin{verbatim} % \feyn{fs f gl f glu f fs} % \end{verbatim} % \Becomes % $\feyn{fs f gl f glu f fs}$ % \end{codeexample} % This is a ``short-fermion fermion gluon-loop fermion % gluon-loop-upsidedown fermion short-fermion''. % % We can include vertical gluons: % \begin{codeexample} % \begin{verbatim} % \feyn{ms mA g1 gv g2 ms x f} % \end{verbatim} % \Becomes % $\feyn{ms mA g1 gv g2 ms x f}$ % \end{codeexample} % Note, in this example, that the gluon loop is formed by a pair of % `g1 g2' characters. This is because the `gl' half-loop character is % deliberately slightly squashed, and wouldn't meet the vertical gluon % properly. The half-loop character is squashed (as are % the fermion and ghost half-loops) partly because it looks % slightly better in a one-loop self-energy diagram, but also so that % the `gl glu' two-gluon loop in a two-loop diagram looks better: % \begin{codeexample} % \begin{verbatim} % \Diagram{&gl glu\\ % fsf g1 f&f g2 ffs \\} % \end{verbatim} % \Becomes % \begin{examplerhs}$ % \Diagram{&gl glu\\ % fsf g1 f&f g2 ffs \\} % $\end{examplerhs} % \end{codeexample} % The diagrams for `hl hlu' or `flA fluV', for example, are very similar. % % The |\momentum| command (more usually called with simply the~`!' % character) allows you to annotate a propagator with a momentum or a % particle label. For example % \begin{codeexample} % \begin{verbatim} % \feyn{fA + !{fA}{p} + ![bot]{fA}{p}} % \end{verbatim} % \Becomes % \begin{examplerhs}$ % \feyn{fA + !{fA}{p} + ![bot]{fA}{p}} % $\end{examplerhs} % \end{codeexample} % % \begin{codeexample} % \begin{verbatim} % \feyn{f !{g1A}1 !{g2V}2 % !{g3A}3 !{g4V}4 f}, % \feyn{fs f !{flA}{p} % !{fluV}{k} f fs} % \end{verbatim} % \Becomes % \begin{examplerhs}$ % \feyn{f !{g1A}1 !{g2V}2 % !{g3A}3 !{g4V}4 f}, % \feyn{fs f !{flA}{p} % !{fluV}{k} f fs} % $\end{examplerhs} % \end{codeexample} % % \begin{codeexample} % \begin{verbatim} % \feyn{!{fA}p % f!{glBV}k !{glSA}l % a\vertexlabel_{p+k-l} ff} % \end{verbatim} % \Becomes % \begin{examplerhs}$ % \feyn{!{fA}p % f!{glBV}k !{glSA}l % a\vertexlabel_{p+k-l} ff} % $\end{examplerhs} % \end{codeexample} % % \newenvironment{bigdisplay}[1] % {\endgraf % \penalty 50 \vskip 0.5\baselineskip plus 0.5\textheight % \vbox\bgroup % #1\endgraf \smallskip % \vbox{\hrule\hbox to \textwidth{\vrule height 1.5ex\hfil\vrule}}% % \parskip0pt} % {\vbox{\hbox to \textwidth{\vrule height 1.5ex \hfil\vrule}\hrule} % \egroup} % % \begin{bigdisplay}{Bremsstrahlung:} % \begin{verbatim} % \[ % \Diagram{ & x \\ % & ![ulft]{gvV}{q=p'+k-p} & !{guA}k \\ % ![bot]{fA}p & ![bot]{fA}{p'+k} & ![lrt]{fA}{p'} \\ % } % + % \Diagram{ & !{guA}k \\ % !{fA}p & ![bot]{fA}{p-k} fs & !{fA}{p'} \\ % & & ![lrt]{gvA}{q=p'+k-p} \\ % & & x\\ % } % \] % \end{verbatim} % \hrule % \[ % \Diagram{ & x \\ % & ![ulft]{gvV}{q=p'+k-p} & !{guA}k \\ % ![bot]{fA}p & ![bot]{fA}{p'+k} & ![lrt]{fA}{p'} \\ % } % + % \Diagram{ & !{guA}k \\ % !{fA}p & ![bot]{fA}{p-k} fs & !{fA}{p'} \\ % & & ![lrt]{gvA}{q=p'+k-p} \\ % & & x\\ % } % \] % \end{bigdisplay} % % \begin{bigdisplay}{And now the same, with % \texttt{\textbackslash belowl} and \texttt{\textbackslash belowr}:} % \begin{verbatim} % \[ % \def\stack#1#2{\Diagram[bottom]{#1\\#2}} % \feyn{ % !{fA}p % \stack{x}{![ulft]{gvV}{q=p'+k-p}} % ![bot]{fA}{p'+k} % \stack{!{guA}k}{![lrt]{fA}{p'}} % + % !{fA}p % \belowr{![llft]{gdA}k} !{fA}{p-k} % fs % \stack x{!{gvV}{q=p'+k-p}} !{fA}{p'}} % \] % \end{verbatim} % \hrule % \[ % \def\stack#1#2{\Diagram[bottom]{#1\\#2}} % \feyn{ % !{fA}p % \stack{x}{![ulft]{gvV}{q=p'+k-p}} % ![bot]{fA}{p'+k} % \stack{!{guA}k}{![lrt]{fA}{p'}} % + % !{fA}p % \belowr{![llft]{gdA}k} !{fA}{p-k} % fs % \stack x{!{gvV}{q=p'+k-p}} !{fA}{p'}} % \] % \end{bigdisplay} % % The |\stack| macro isn't defined by the \feynx\ package, but % it is useful enough that you might want to define it as one of your % own macros. % % \iffalse % We can also have diagrams in the text, like~$\Feyn{fsfglffs}$, and we can % annotate the diagrams % \begin{codeexample} % \begin{verbatim} % \annotate{2}{-0.5} % {\mbox{counterterm}} % \feyn{ms m gl ![llft]{gv}l % ms x f} % \end{verbatim} % \Becomes % \begin{examplerhs} $ % \annotate{2}{-0.5} % {\mbox{counterterm}} % \feyn{ms m gl ![llft]{gv}l % ms x f} % $\end{examplerhs} % \end{codeexample} % This is a ``short-massive massive gluon-loop gluon-vertical % short-massive counterterm fermion''. % \fi % % \begin{bigdisplay}{The expression for the heavy-fermion self-energy in the \textsc{ope} is:} % \begin{verbatim} % \def\bracket#1{\langle #1 \rangle} % \def\stack#1#2{\Diagram[bottom]{#1\\#2}} % \begin{eqnarray*} % -i\Sigma_{\rm ope} &=& % \left[ \feyn{faf + fsfglffs + \cdots} \right] 1 % \feynstrut{1}{1}\strut \\ % && \quad{}+ \left[ \feyn{ fxfs0glfs0xf + \cdots} \right] % \bracket{\overline\psi M \psi} \\ % && \quad{}+ \left[ % \feyn{fs \stack x{gv} fs \stack x{gv} fs} + \cdots % \right] % \bracket{G_{\mu\nu}^a G_{\mu\nu}^a}\\ % \end{eqnarray*} % \end{verbatim} % \hrule % \def\bracket#1{\langle #1 \rangle} % \def\stack#1#2{\Diagram[bottom]{#1\\#2}} % \begin{eqnarray*} % -i\Sigma_{\rm ope} &=& % \left[ \feyn{faf + fsfglffs + \cdots} \right] 1 % \feynstrut{1}{1}\strut \\ % && \quad{}+ \left[ \feyn{ fxfs0glfs0xf + \cdots} \right] % \bracket{\overline\psi M \psi} \\ % && \quad{}+ \left[ % \feyn{fs \stack x{gv} fs \stack x{gv} fs} + \cdots % \right] % \bracket{G_{\mu\nu}^a G_{\mu\nu}^a}\\ % \end{eqnarray*} % \end{bigdisplay} % % Now for two examples using |\FEYN|: % \begin{codeexample} % \begin{verbatim} % \feyn{f gu \belowl{fd}} % \end{verbatim} % \Becomes % \begin{examplerhs}$ % \feyn{f gu \belowl{fd}} % $\end{examplerhs} % \end{codeexample} % \begin{codeexample} % \begin{verbatim} % \FEYN{ % !{fA}s !{gu}{W^-_\mu} % \belowl{!{fdA}u} % } % \end{verbatim} % \Becomes % \begin{examplerhs}$ % \FEYN{ % !{fA}s !{gu}{W^-_\mu} \belowl{!{fdA}u} % } % $\end{examplerhs} % \end{codeexample} % \begin{codeexample} % \begin{verbatim} % \DIAGRAM{ % !{fA}s &!{gu}{W^-_\mu}\\ % & !{fdA}u % } % \end{verbatim} % \Becomes % \begin{examplerhs}$ % \DIAGRAM{!{fA}s &!{gu}{W^-_\mu}\\ & !{fdA}u} % $\end{examplerhs} % \end{codeexample} % % \begin{bigdisplay}{The Feynman Rules are as follows:} % \begin{verbatim} % \def\arraystretch{3} \arraycolsep=0.2cm % \[ \begin{array}{rcl} % \feyn{\vertexlabel^a !{fA}p \vertexlabel^b} % quark prop % &=& \displaystyle % {i\delta^{ab} \over \pslash- m_0} \\ % % \Diagram{\vertexlabel^a \\ fd \\ & g\vertexlabel_{\mu,c} \\ % \vertexlabel_b fu\\} % 3-point vertex % &=& \displaystyle % ig\gamma_\mu (t^c)_{ab} \\ % % \feyn{\vertexlabel_{\mu, a} !{gA}k \vertexlabel_{\nu, b}} % gluon prop % &=& \displaystyle % {-i\over k^2} \left[g_{\mu\nu} + (a_0 - 1) {k_\mu k_\nu \over k^2}\right] % \delta^{ab} \\ % % \Diagram{\vertexlabel^{\alpha,a} \\ % !{gdA}p \\ % & !{gA}r \vertexlabel_{\gamma,c} \\ % !{guA}q \\ % \vertexlabel_{\beta,b} % } % 3-gluon vertex % &=& \displaystyle % -g f^{abc} ( % g_{\beta\gamma} (q-r)_\alpha + % g_{\gamma\alpha} (r-p)_\beta + % g_{\alpha\beta} (p-q)_\gamma % ) \\ % % \feyn{\vertexlabel^a !hp \vertexlabel^b} % ghost prop % &=& \displaystyle % {i \over p^2} \delta_{ab} \\ % % \Diagram{\vertexlabel^b \\ hd \\ & g\vertexlabel^{\mu,a} \\ % \vertexlabel_c hu\\} % ghost-gluon vertex % &=& \displaystyle % -g f^{abc}p_\mu % \quad\raise 1ex\hbox{\vtop{\hsize=15em % where $p$ is the momentum of the outgoing positive energy % ghost\par}} % \end{array} \] % \end{verbatim} % \end{bigdisplay} % % \begin{bigdisplay}{\dots giving:} % \def\arraystretch{3} \arraycolsep=0.2cm % \[ \begin{array}{rcl} % \feyn{\vertexlabel^a !{fA}p \vertexlabel^b} % &=& \displaystyle % {i\delta^{ab} \over \pslash- m_0} \\ % % \Diagram{\vertexlabel^a \\ fd \\ & g\vertexlabel_{\mu,c} \\ % \vertexlabel_b fu\\} % &=& \displaystyle % ig\gamma_\mu (t^c)_{ab} \\ % % \feyn{\vertexlabel_{\mu, a} !{gA}k \vertexlabel_{\nu, b}} % &=& \displaystyle % {-i\over k^2} \left[g_{\mu\nu} + (a_0 - 1) {k_\mu k_\nu \over k^2}\right] % \delta^{ab} \\ % % \Diagram{\vertexlabel^{\alpha,a} \\ % !{gdA}p \\ % & !{gA}r \vertexlabel_{\gamma,c} \\ % !{guA}q \\ % \vertexlabel_{\beta,b} % } % &=& \displaystyle % -g f^{abc} ( % g_{\beta\gamma} (q-r)_\alpha + % g_{\gamma\alpha} (r-p)_\beta + % g_{\alpha\beta} (p-q)_\gamma % ) \\ % % \feyn{\vertexlabel^a !hp \vertexlabel^b} % &=& \displaystyle % {i \over p^2} \delta_{ab} \\ % % \Diagram{\vertexlabel^b \\ hd \\ & g\vertexlabel^{\mu,a} \\ % \vertexlabel_c hu\\} % &=& \displaystyle % -g f^{abc}p_\mu % \quad\raise 1ex\hbox{\vtop{\hsize=15em % where $p$ is the momentum of the outgoing positive energy % ghost\par}} % \end{array} \] % \end{bigdisplay} % % \begin{bigdisplay}{The diagrams can very naturally appear as parts of equations % (as is perhaps by now obvious):} % \begin{verbatim} % \begin{eqnarray} % \feyn{fcf} &=& \feyn{faf + fpf + fpfpf + \cdots} \\ % &=& \sum_{n=0}^\infty \feyn{fsafs ( pfsafs)}^n \\ % &=& \feyn{\frac{fsafs}{1-(pfsafs)}}. % \end{eqnarray} % \end{verbatim} % \hrule % \begin{eqnarray} % \feyn{fcf} &=& \feyn{faf + fpf + fpfpf + \cdots} \\ % &=& \sum_{n=0}^\infty \feyn{fsafs ( pfsafs)}^n \\ % &=& \feyn{\frac{fsafs}{1-(pfsafs)}}. % \end{eqnarray} % \end{bigdisplay} % % \section{Installation} % % The nominal distribution point for the Feyn package is CTAN, % under \texttt{fonts/feyn}\footnote{\url{https://ctan.org/pkg/feyn}}. % % The feyn package is included in the TeXLive distribution\footnote{\url{https://www.tug.org/texlive/}}, so % you may have it on your machine already. If not, or if you need a % more up-to-date version, read on. % % Since the package is on CTAN, it should be easily installed and % updated using the tools which support this in your TeX distribution. % For TeXLive, that's % `tlmgr'\footnote{\url{https://www.tug.org/texlive/tlmgr.html}}, and % for MikTeX see the maintenance section of the % manual\footnote{\url{https://docs.miktex.org/}}. % % \subsection{Installing by hand} % % If, for some reason, you need to install the package by hand, then % you should be able to find generic instructions for installing % \LaTeX\ files at \url{https://texfaq.org/#installing}. % % In brief: If you have not done so already, you need to extract the package % file from the distribution file using |latex feyn.ins|. The % resulting \file{feyn.sty} should be installed in the usual location % for style files -- that is, something like % \file{texmf.local/tex/latex/feyn.sty}. The \metafont\ source files % \file{*.mf} should be installed in a directory with a location such as % \file{texmf.local/fonts/source/feyn/}. That should be all you need % to do as regards the installation of the fonts -- if your \TeX\ % setup is installed correctly, then the usual font-generation % commands (such as \file{mktexpk} for example) should work as normal, % and these will usually be invoked by default when \LaTeX\ or % pdf\LaTeX\ is run. % % If you are using a \TeX\ system based on TeXLive (which is true of most Unix % installations, and most macOS installations), then you can % determine the style-file and \metafont\ search paths using the commands % \begin{verbatim} % % kpsepath tex % % kpsepath mf % \end{verbatim} % respectively. After you have installed them, you will probably need % to give the command \texttt{mktexlsr} to rebuild the paths database, % and you can confirm that the files are findable with the commands % \texttt{kpsewhich feyn.sty} and \texttt{kpsewhich feyn10.mf}. % % \section{Licence} % % The following is the text of the BSD 2-clause licence. % % All rights reserved. % % Redistribution and use in source and binary forms, with or without % modification, are permitted provided that the following conditions are % met: % % 1. Redistributions of source code must retain the above copyright % notice, this list of conditions and the following disclaimer. % % 2. Redistributions in binary form must reproduce the above copyright % notice, this list of conditions and the following disclaimer in the % documentation and/or other materials provided with the distribution. % % This software is provided by the copyright holders and contributors % ``as is'' and any express or implied warranties, including, but not % limited to, the implied warranties of merchantability and fitness for % a particular purpose are disclaimed. in no event shall the copyright % holder or contributors be liable for any direct, indirect, incidental, % special, exemplary, or consequential damages (including, but not % limited to, procurement of substitute goods or services; loss of use, % data, or profits; or business interruption) however caused and on any % theory of liability, whether in contract, strict liability, or tort % (including negligence or otherwise) arising in any way out of the use % of this software, even if advised of the possibility of such damage. % % % \subsection*{Acknowledgements} % % Thanks to Purnendu Chakraborty, Fabio Correa, Bryan Chen, Hoang % Nghia Nguyen and Luciano Pandola for % suggestions and testing (and encouragement) at various times. % % % \StopEventually{} % % \section{Implementation} % \begin{macrocode} %<*package> % \end{macrocode} % % Start off with the available options. % % A wrinkle is that the |{align}| environment, which is defined % in the amsmath package, reads its contents before processing them, % which means that a `!' within the environment has its catcode fixed % before it can be changed by |\feyn| or |\diagram|. To handle this % situation, we support \Lopt{globalbang} and \Lopt{noglobalbang} % options, which cause the `!' character to be redefined globally or % not. The default depends on whether the amsmath package was loaded % before this one was. % \begin{macrocode} \newif\ifFeyn@globalbang \@ifpackageloaded{amsmath}{\Feyn@globalbangtrue}{\Feyn@globalbangfalse} \DeclareOption{globalbang}{\Feyn@globalbangtrue} \DeclareOption{noglobalbang}{\Feyn@globalbangfalse} % \end{macrocode} % % Now process the options specified in the package command. % \begin{macrocode} \ProcessOptions % \end{macrocode} % % Declare the feyn math font family. The |\skewchar| for this font % (see the \TeX book, p431) can be set to zero, since it's a % completely upright maths font (the least of its peculiarities). We % don't have the font in much of a range of sizes. % \begin{macrocode} \DeclareFontFamily{OMS}{feyn}{\skewchar\font'000} \DeclareFontShape{OMS}{feyn}{m}{n}{% <-10.5>feyn10% <10.5-11.5>feyn11% <11.5-15>feyn12% <15-21>feyn18% <21->feyn24% }{} % \end{macrocode} % % Now do the same for the text-size fonts, declaring the textfeyn math % font family. % \begin{macrocode} \DeclareFontFamily{OMS}{textfeyn}{\skewchar\font'000} \DeclareFontShape{OMS}{textfeyn}{m}{n}{% <-10.5>feyntext10% <10.5-11.5>feyntext11% <11.5-15>feyntext12% <15-21>feyntext18% <21->feyntext24% }{} % \end{macrocode} % % Finally, do the same for the extended-size fonts, declaring the % feynx math font family. % \begin{macrocode} \DeclareFontFamily{OMS}{feynx}{\skewchar\font'000} \DeclareFontShape{OMS}{feynx}{m}{n}{% <-10.5>feynx10% <10.5-11.5>feynx11% <11.5-15>feynx12% <15-21>feynx18% <21->feynx24% }{} % \end{macrocode} % % XXX It would be nice to arrange things so that superscripts in % the feyn font were drawn from cmmi7, or something. The original % feyn.sty arranged this with |\scriptfont\diagramfam=\ninmi|, but % it's not clear what the analogue in the FSS is. % % Now declare the `feynman' symbol font, and make the command |\feyn| % set its argument in that font. Similarly have |\Feyn| invoke the % feynman symbol font for the text sizes. % \begin{macrocode} \DeclareSymbolFont{feynman}{OMS}{feyn}{m}{n} \DeclareSymbolFontAlphabet{\feyn@alphabet}{feynman} \DeclareSymbolFont{textfeynman}{OMS}{textfeyn}{m}{n} \DeclareSymbolFontAlphabet{\Feyn@alphabet}{textfeynman} \DeclareSymbolFont{feynmanextended}{OMS}{feynx}{m}{n} \DeclareSymbolFontAlphabet{\FEYN@alphabet}{feynmanextended} % \end{macrocode} % % Now use these font-setting commands, defining |\feyn| and |\Feyn| to % switch to the given alphabets, defining ! as a shortcut for % |\momentum| (so that |!{x}{y}| is interpreted as |\momentum{x}{y}|). % We have to make sure that the `!' character produces that character % everywhere except within |\feyn| or |\Feyn|. How we do this depends % on the value of the |\ifFeyn@globalbang| switch. % \begin{macro}{\feyn} % \begin{macrocode} \ifFeyn@globalbang \catcode`\!=\active \def!{\char`\!} % ! produces this character everywhere \def\feyn{\begingroup \let!\momentum % ...except within \feyn \feyn@} \def\Feyn{\begingroup \let!\momentum % ...or \Feyn \Feyn@} \def\FEYN{\begingroup \let!\momentum % ...or \FEYN \FEYN@} \else {\catcode`\!=\active % only make ! active within \feyn \gdef\feyn{% \begingroup % ends in \feyn@ \catcode`\!=\active \let!=\momentum \feyn@} \gdef\Feyn{% \begingroup % ends in \Feyn@ \catcode`\!=\active \let!=\momentum \Feyn@} \gdef\FEYN{% \begingroup % ends in \FEYN@ \catcode`\!=\active \let!=\momentum \FEYN@}} \fi \def\feyn@#1{\let\feyn@mfmodule\feyn@mfbasemodule \feyn@alphabet{#1}\endgroup} \def\Feyn@#1{\let\feyn@mfmodule\feyn@mfbasemodule \Feyn@alphabet{#1}\endgroup} \def\FEYN@#1{\let\feyn@mfmodule\feyn@mfextendedmodule \FEYN@alphabet{#1}\endgroup} % \end{macrocode} % \end{macro} % % % Now get the size of the `module' (the length of the fermion), and the % height of the math-axis, from the font. You might think that the % math-axis is obtainable from |\fontdimen22| of the font, but we do % not load it as an |{operator}| font when we invoke % |\DeclareSymbolFont|, so it does not have all 22 parameters that a % symbol font (as the \TeX book uses the term, rather than \LaTeXe's % NFSS). I confess I don't \emph{really} understand the ins and outs % of this, but this route is robust and not wrong. % % The character |"20| in the feyn font is a dummy charcter, with width % |module#| and height |a#| (using the dimensions of the font % file). Use this to set the |\feyn@module| and |\feyn@maxis|. Note % that the `module' used in this package file is twice the module used % in the \metafont\ files themselves. % \begin{macro}{\feyn@module} % \begin{macro}{\feyn@maxis} % \begin{macrocode} \DeclareMathSymbol{\FeynSpaceChar}{\mathord}{feynman}{"20} \setbox0=\hbox{$\FeynSpaceChar$} \newdimen\feyn@mfbasemodule \feyn@mfbasemodule=\wd0 \newdimen\feyn@module \feyn@module=2\wd0 \newdimen\feyn@maxis \feyn@maxis=\ht0 \DeclareMathSymbol{\FeynxSpaceChar}{\mathord}{feynmanextended}{"20} \setbox0=\hbox{$\FeynxSpaceChar$} \newdimen\feyn@mfextendedmodule \feyn@mfextendedmodule=\wd0 % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\Diagram} % Define the |\Diagram| macro, which lays out a semi-complicated % diagram in 2-d. The macro takes an optional argument which can be % either |[bottom]| or |[centre]| % \begin{macrocode} {\catcode`\!=\active \gdef\Diagram{% \begingroup % ends in \Diagram@ \catcode`\!=\active \let!\momentum % \Diagram@ \@ifnextchar[\Diagram@{\Diagram@[centre]}%] }} \let\Diagram@pos@centre\vcenter \let\Diagram@pos@center\vcenter %for Webster fans \let\Diagram@pos@bottom\relax \def\Diagram@[#1]#2{\setbox0=\hbox{\vbox{\offinterlineskip \let\\\cr \halign{&$\displaystyle\feyn{##}$\cr #2\crcr}}}% % \end{macrocode} % At this point, |\box0| has zero depth. It must be an hbox, because % we're fiddling with its height within a enclosing |\vbox|. See the % \TeX book pp 388--389. This takes advantage of appx G, rule 8 to % move box0 down by the height of the math axis. The construction % |\dp0 = -2\fontdimen22 \textfont2| also works, in the sense of % moving the box onto the math axis, but makes the box too small, % which means that surrounding text can encroach. % \begin{macrocode} \@tempdima=\ht0 \advance\@tempdima by 2\feyn@maxis \ht0=\@tempdima % no error checking -- unrecognised placement specifiers just expand to \relax \csname Diagram@pos@#1\endcsname{\box0}% \endgroup}% end group begun in \Diagram % \end{macrocode} % \end{macro} % % Define |\DIAGRAM| identically, except for using |\FEYN| rather than |\feyn|. % \begin{macrocode} {\catcode`\!=\active \gdef\DIAGRAM{% \begingroup % ends in \Diagram@ \catcode`\!=\active \let!\momentum % \DIAGRAM@ \@ifnextchar[\DIAGRAM@{\DIAGRAM@[centre]}%] }} \def\DIAGRAM@[#1]#2{\setbox0=\hbox{\vbox{\offinterlineskip \let\\\cr \halign{&$\displaystyle\FEYN{##}$\cr #2\crcr}}}% \@tempdima=\ht0 \advance\@tempdima by 2\feyn@maxis \ht0=\@tempdima \csname Diagram@pos@#1\endcsname{\box0}% \endgroup}% end group begun in \Diagram % \end{macrocode} % % \begin{macro}{\maxis} % Raise the argument to the math axis. % \begin{macrocode} \def\maxis#1{\raise\feyn@maxis \hbox{$#1$}} % \end{macrocode} % \end{macro} % % \iffalse % I feel that something like the following is surely somehow useful, % but the spacing doesn't quite work out with what I've got here. % \def\fstack#1{\vbox{\baselineskip=0pt \@fstack#1,,}} % \def\@fstack#1,{% % \def\@tempa{#1}% % \ifx\@tempa\@empty % \let\@next\relax % \else % \hbox{$\feyn{#1}$}% % \let\@next\@fstack % \fi % \@next % } % \[ % \feyn{fsfg1\fstack{f0 gl,f0 glu,gv,ff}g2ffs \showlists} % \] % \fi % % \begin{macro}{\belowl} % The argument of the |\belowl| macro is a string of characters in the % \feynx\ font. They are set in a box, and then moved so that the box % takes up zero horizontal width, and is moved downwards by its height % -- that is, it is moved diagonally downwards and leftwards. It % means that the bottom half of a pair of incoming or outgoing % propagators can be set immediately belowl the upper half, without % having to use the |\Diagram| macro. % \begin{macrocode} \def\belowl#1{% \ifdim\feyn@mfmodule=\feyn@mfbasemodule \let\@next\feyn \else \let\@next\FEYN \fi \setbox0\hbox{$\@next{#1}$}% \hskip-\wd0 \lower\ht0\box0 } % \end{macrocode} % \end{macro} % \begin{macro}{\belowr} % The |\belowr| macro is almost exactly the same, except that the % argument is shifted rightwards, which is sometimes more natural to % express. % \begin{macrocode} \def\belowr#1{% \ifdim\feyn@mfmodule=\feyn@mfbasemodule \let\@next\feyn \else \let\@next\FEYN \fi \setbox0\hbox{$\@next{#1}$}% \@tempdima=\wd0 \lower\ht0\box0 \hskip-\@tempdima } % \end{macrocode} % \end{macro} % % \begin{macro}{\momentum} % Manages annotation of characters. |\momentum{ch}{text}| sets the character % ch, which may be a ligature, and puts the given text at the recommended % annotation position for that character. |\momentum[pos]{ch}{text}| % is the same, except that the optional argument indicates the % position relative to the annotation position. It must be one of % `top', `urt', `lrt', `bot', `llft' or `ulft'. % % First, some support macros. % % |\feyn@nudge| is a small amount % which is added to the annotation positions, to keep them clear of the % point they're annotating. % \begin{macrocode} \newdimen\feyn@nudge \feyn@nudge=\feyn@mfbasemodule \divide\feyn@nudge by 3 % \end{macrocode} % % The various |\feyn@pos@| macros position their third argument % adjacent to a point offset by an amount |(#1,#2)| from the current % position. The macro |\feyn@pos@top| has the third argument adjacent % and above the point, |\feyn@pos@urt| has it to the upper-right, and % so on. % \begin{macrocode} \def\feyn@pos@top#1#2#3{% top \leavevmode \@tempdima=#2\feyn@mfmodule \advance\@tempdima\feyn@nudge \setbox1=\hbox{\raise \@tempdima\hbox to 0pt{% \hskip #1\feyn@mfmodule \hbox to 0pt{\hss$\scriptstyle #3$\hss}\hss}}% \ht1=0pt \dp1=0pt \box1} \def\feyn@pos@urt#1#2#3{% urt \leavevmode \@tempdima=#2\feyn@mfmodule \advance\@tempdima\feyn@nudge \setbox1=\hbox{\raise \@tempdima\hbox to 0pt{% \hskip #1\feyn@mfmodule \hskip\feyn@nudge $\scriptstyle #3$\hss}}% \ht1=0pt \dp1=0pt \box1} \def\feyn@pos@lrt#1#2#3{% lrt \leavevmode \setbox0=\hbox to 0pt{\hskip\feyn@nudge $\scriptstyle #3$\hss}% \@tempdima=#2\feyn@mfmodule \advance\@tempdima -\ht0 \advance\@tempdima-\feyn@nudge \setbox1=\hbox{\raise \@tempdima\hbox to 0pt{% \hskip #1\feyn@mfmodule \box0\hss}}% \ht1=0pt \dp1=0pt \box1} \def\feyn@pos@bot#1#2#3{% bot \leavevmode \setbox0=\hbox to 0pt{\hss$\scriptstyle #3$\hss}% \@tempdima=#2\feyn@mfmodule \advance\@tempdima -\ht0 \advance\@tempdima-\feyn@nudge \setbox1=\hbox{\raise \@tempdima\hbox to 0pt{% \hskip #1\feyn@mfmodule \box0\hss}}% \ht1=0pt \dp1=0pt \box1} \def\feyn@pos@llft#1#2#3{% llft \leavevmode \setbox0=\hbox to 0pt{\hss$\scriptstyle #3$\hskip\feyn@nudge}% \@tempdima=#2\feyn@mfmodule \advance\@tempdima -\ht0 \advance\@tempdima-\feyn@nudge \setbox1=\hbox{\raise \@tempdima\hbox to 0pt{% \hskip #1\feyn@mfmodule \box0\hss}}% \ht1=0pt \dp1=0pt \box1} \def\feyn@pos@ulft#1#2#3{% ulft \leavevmode \@tempdima=#2\feyn@mfmodule \advance\@tempdima\feyn@nudge \setbox1=\hbox{\raise \@tempdima\hbox to 0pt{% \hskip #1\feyn@mfmodule \hbox to 0pt{\hss$\scriptstyle #3$\hskip\feyn@nudge}\hss}}% \ht1=0pt \dp1=0pt \box1} % \end{macrocode} % % Now include the definitions of the annotation positions, as extracted % from the Metafont file. These define macros |\feyn@ann@#1|, % where argument |#1| is a given character (or ligature) at the % position |(#2,#3)|, using the various |\feyn@pos@| macros. The % || is either the value of argument |#4|, or the contents of % |\@tempa| if that has been set non-empty by |\momentum@|. % \begin{macrocode} \def\feyn@annotation#1#2#3#4{% \expandafter\def\csname feyn@ann@#1\endcsname##1{% \csname feyn@pos@\ifx\@tempa\@empty #4\else\@tempa\fi\endcsname {#2}{#3}{##1}% #1}} % \end{macrocode} % Now read in the collection of annotation positions. These are % generated by the \texttt{./parse-ligtables} script, and inserted % into this file by the Makefile when \file{feyn.dtx} is generated. % \begin{macrocode} % @FEYNANNOTATIONS@ % commands generated by parse-ligtables... \feyn@annotation{f}{0.99974}{0.35}{top}% 102 = "f" \feyn@annotation{fA}{0.99974}{0.35}{top}% 70 = "F" \feyn@annotation{fV}{0.99974}{0.35}{top}% 6 = 6 \feyn@annotation{flo}{0}{2.25}{top}% 107 = "k" \feyn@annotation{floA}{0}{2.25}{top}% 75 = "K" \feyn@annotation{floV}{0}{2.25}{top}% 11 = 11 \feyn@annotation{fu}{0.70692}{0.95692}{ulft}% 101 = "e" \feyn@annotation{fuA}{0.70692}{0.95692}{ulft}% 69 = "E" \feyn@annotation{fuV}{0.70692}{0.95692}{ulft}% 5 = 5 \feyn@annotation{fd}{0.70692}{0.95692}{urt}% 100 = "d" \feyn@annotation{fdA}{0.70692}{0.95692}{urt}% 68 = "D" \feyn@annotation{fdV}{0.70692}{0.95692}{urt}% 4 = 4 \feyn@annotation{fv}{0}{1.24974}{urt}% 98 = "b" \feyn@annotation{fvA}{0}{1.24974}{urt}% 66 = "B" \feyn@annotation{fvV}{0}{1.24974}{urt}% 2 = 2 \feyn@annotation{m}{0.99974}{0.32802}{top}% 109 = "m" \feyn@annotation{mA}{0.99974}{0.32802}{top}% 77 = "M" \feyn@annotation{mV}{0.99974}{0.32802}{top}% 13 = 13 \feyn@annotation{ms}{0.49986}{0.32802}{top}% 35 = "#" \feyn@annotation{fl}{0}{1.75}{top}% 108 = "l" \feyn@annotation{flA}{0}{1.75}{top}% 76 = "L" \feyn@annotation{flV}{0}{1.75}{top}% 12 = 12 \feyn@annotation{flu}{0}{-1.25}{bot}% 110 = "n" \feyn@annotation{fluA}{0}{-1.25}{bot}% 78 = "N" \feyn@annotation{fluV}{0}{-1.25}{bot}% 14 = 14 \feyn@annotation{flS}{0}{1.16667}{top}% 111 = "o" \feyn@annotation{flSA}{0}{1.16667}{top}% 79 = "O" \feyn@annotation{flSV}{0}{1.16667}{top}% 15 = 15 \feyn@annotation{flSu}{0}{-0.83334}{bot}% 119 = "w" \feyn@annotation{flSuA}{0}{-0.83334}{bot}% 87 = "W" \feyn@annotation{flSuV}{0}{-0.83334}{bot}% 23 = 23 \feyn@annotation{g}{0.99974}{0.45}{top}% 103 = "g" \feyn@annotation{gA}{0.99974}{0.45}{top}% 71 = "G" \feyn@annotation{gV}{0.99974}{0.45}{top}% 7 = 7 \feyn@annotation{gu}{0.70692}{0.95692}{ulft}% 117 = "u" \feyn@annotation{guA}{0.70692}{0.95692}{ulft}% 85 = "U" \feyn@annotation{guV}{0.70692}{0.95692}{ulft}% 21 = 21 \feyn@annotation{gd}{0.70692}{0.95692}{urt}% 118 = "v" \feyn@annotation{gdA}{0.70692}{0.95692}{urt}% 86 = "V" \feyn@annotation{gdV}{0.70692}{0.95692}{urt}% 22 = 22 \feyn@annotation{gv}{0}{1.24974}{urt}% 125 = "}" \feyn@annotation{gvA}{0}{1.24974}{urt}% 93 = "]" \feyn@annotation{gvV}{0}{1.24974}{urt}% 29 = 29 \feyn@annotation{g1}{-1}{1.98206}{ulft}% 113 = "q" \feyn@annotation{g1A}{-1}{1.98206}{ulft}% 81 = "Q" \feyn@annotation{g1V}{-1}{1.98206}{ulft}% 17 = 17 \feyn@annotation{g2}{1.41422}{1.66422}{urt}% 114 = "r" \feyn@annotation{g2A}{1.41422}{1.66422}{urt}% 82 = "R" \feyn@annotation{g2V}{1.41422}{1.66422}{urt}% 18 = 18 \feyn@annotation{g3}{1.41422}{-1.16422}{lrt}% 115 = "s" \feyn@annotation{g3A}{1.41422}{-1.16422}{lrt}% 83 = "S" \feyn@annotation{g3V}{1.41422}{-1.16422}{lrt}% 19 = 19 \feyn@annotation{g4}{-1}{-1.48206}{llft}% 116 = "t" \feyn@annotation{g4A}{-1}{-1.48206}{llft}% 84 = "T" \feyn@annotation{g4V}{-1}{-1.48206}{llft}% 20 = 20 \feyn@annotation{gl}{0}{1.75}{urt}% 121 = "y" \feyn@annotation{glA}{0}{1.75}{urt}% 89 = "Y" \feyn@annotation{glV}{0}{1.75}{urt}% 25 = 25 \feyn@annotation{glu}{0}{-1.25}{llft}% 122 = "z" \feyn@annotation{gluA}{0}{-1.25}{llft}% 90 = "Z" \feyn@annotation{gluV}{0}{-1.25}{llft}% 26 = 26 \feyn@annotation{glB}{1.02051}{2.71367}{urt}% 123 = "{" \feyn@annotation{glBA}{1.02051}{2.71367}{urt}% 91 = "[" \feyn@annotation{glBV}{1.02051}{2.71367}{urt}% 27 = 27 \feyn@annotation{glS}{0}{1.5833}{llft}% 124 = "|" \feyn@annotation{glSA}{0}{1.5833}{llft}% 92 = "\" \feyn@annotation{glSV}{0}{1.5833}{llft}% 28 = 28 \feyn@annotation{h}{0.99974}{0.25}{top}% 104 = "h" \feyn@annotation{hA}{0.99974}{0.25}{top}% 72 = "H" \feyn@annotation{hV}{0.99974}{0.25}{top}% 8 = 8 \feyn@annotation{hu}{0.70464}{0.95464}{ulft}% 105 = "i" \feyn@annotation{huA}{0.70464}{0.95464}{ulft}% 73 = "I" \feyn@annotation{huV}{0.70464}{0.95464}{ulft}% 9 = 9 \feyn@annotation{hd}{0.70464}{0.95464}{urt}% 106 = "j" \feyn@annotation{hdA}{0.70464}{0.95464}{urt}% 74 = "J" \feyn@annotation{hdV}{0.70464}{0.95464}{urt}% 10 = 10 \feyn@annotation{hl}{0}{1.75}{top}% 126 = "~" \feyn@annotation{hlA}{0}{1.75}{top}% 94 = "^" \feyn@annotation{hlV}{0}{1.75}{top}% 30 = 30 \feyn@annotation{hlu}{0}{-1.25}{top}% 127 = 127 \feyn@annotation{hluA}{0}{-1.25}{top}% 95 = "_" \feyn@annotation{hluV}{0}{-1.25}{top}% 31 = 31 \feyn@annotation{hs}{0.49986}{0.25}{top}% 34 = """ \feyn@annotation{c}{0.65044}{0.90044}{top}% 99 = "c" \feyn@annotation{p}{0.65}{0.9}{top}% 112 = "p" \feyn@annotation{P}{0.65044}{0.90044}{top}% 80 = "P" \feyn@annotation{x}{0}{0.55641}{top}% 120 = "x" % \end{macrocode} % % % The |\momentum| macro (finally) invokes its worker macro % |\momentum@|, defaulting that macro's optional argument to empty. % In fact the macro |\momentum| should be only rarely % invoked, since ! is made active and bound to it within |\feyn|. % % The |\momentum@| macro takes two arguments, and expands to a call to % macro |\feyn@ann@#1|, acting on the second argument. This macro is % one of those defined by |\feyn@annotation| above. There is an % optional argument, giving the position for the annotation, if it has % turned out that the default position for this character is % inappropriate. The adjusted position may be one of `top', `urt', % `lrt', `bot', `llft' or `ulft'. % \begin{macrocode} \def\momentum{\@ifnextchar[\momentum@{\momentum@[]}} \def\momentum@[#1]#2#3{% \def\@tempa{#1} \ifx\@tempa\@empty \else \@ifundefined{feyn@pos@#1} {\@latex@error{No annotation position #1}% {You cannot call \string\momentum[#1]{...}^^J(must be one of top, urt, lrt, bot, llft, ulft)}% #2}% \fi \@ifundefined{feyn@ann@#2}% {\@latex@error{No annotation defined for #2}% {You cannot call \string\momentum{#2}{...}}% #2}% {\csname feyn@ann@#2\endcsname{#3}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\vertexlabel} % The command |\vertexlabel^{text}| or |\vertexlabel_{text}| positions % the |{text}| in maths mode either above or below, respectively, the % current position. It's used between characters to label a vertex. % \begin{macrocode} \def\vertexlabel#1#2{\setbox0=\hbox to 0pt{\hss$\scriptstyle #2$\hss} \ifcat #1^ \vbox to 0pt{\vss\box0\nointerlineskip\kern2\feyn@maxis} \else\ifcat #1_ \vbox to 0pt{\kern\feyn@maxis\nointerlineskip\box0\vss} \else \PackageError{feyn} {Bad arguments for \string\vertexlabel} {Usage: \string\vertexlabel^{text} or \string\vertexlabel_{text}} \fi\fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\annotate} % The |\annotate| command takes $x$ and $y$ coordinates in units of % modules, and text (in math mode) to be placed on a |\diagram|. % Deprecated, now that the characters have annotation built in to them. % \begin{macrocode} \def\annotate#1#2#3{\vcenter to 0pt{\vss \hbox to 0pt{\hskip #1\feyn@module\hbox to 0pt{\hss$\scriptstyle #3$\hss}\hss }\vskip #2\feyn@module}} % \end{macrocode} % \end{macro} % \begin{macro}{\tannotate} % The |\tannotate| command is just the same, but the annotating text % is in horizontal mode. % \begin{macrocode} \def\tannotate#1#2#3{\vcenter to 0pt{\vss \hbox to 0pt{\hskip #1\feyn@module\hbox to 0pt{\hss #3\hss}\hss }\vskip #2\feyn@module}} % \end{macrocode} % \end{macro} % % \begin{macro}{\feynstrut} % The macro |\feynstrut#1#2| defines |\strut| to have a height % |#1| modules, and depth |#2| modules. % \begin{macrocode} \def\feynstrut#1#2{\setbox\strutbox=\hbox{\vrule height #1\feyn@module depth #2\feyn@module width 0pt}} % \end{macrocode} % \end{macro} % % \begin{macro}{\arrow} % The command |\arrow#1#2#3| puts an arrow of gradient |#3|${}\times 45^\circ$ % at position |(#1,#2)|(modules). This doesn't work -- the |\char| % results in a |\rm| character appearing, rather than a |\feyn| % character. Putting in a symbol like `+' has the same effect, but % putting in, say, `a' works as expected. In other words, it's to do % with the character's mathcode, and the |\char| % should be replaced by a |\mathchar"7?\@tempcnta| somehow. The % problem is that that depends on the parameter |\fam| having a % suitable value. It's not clear to me what this corresponds to in % \LaTeXe. See the \TeX book, chapter 17. % \begin{macrocode} \def\arrow#1#2#3{\@latex@error{Do not use the \string\arrow macro any more}{}} % \end{macrocode} % \end{macro} % % Declare symbols. All of these are ligatures. % \begin{macrocode} \DeclareMathSymbol{\wfermion}{0}{feynman}{"64} %\DeclareMathSymbol{\Wfermion}{0}{feynman}{"44} \DeclareMathSymbol{\hfermion}{0}{feynman}{"6B} %\DeclareMathSymbol{\Hfermion}{0}{feynman}{"4B} \DeclareMathSymbol{\shfermion}{0}{feynman}{"6C} %\DeclareMathSymbol{\sHfermion}{0}{feynman}{"4C} \DeclareMathSymbol{\whfermion}{0}{feynman}{"6D} %\DeclareMathSymbol{\wHfermion}{0}{feynman}{"4D} \DeclareMathSymbol{\gvcropped}{0}{feynman}{"07} % \end{macrocode} % But the following are not ligatures. % \begin{macrocode} \DeclareMathSymbol{\bigbosonloop}{0}{feynman}{"7B} %\DeclareMathSymbol{\Bigbosonloop}{7}{feynman}{"21} \DeclareMathSymbol{\smallbosonloop}{0}{feynman}{"7C} \DeclareMathSymbol{\bigbosonloopA}{0}{feynman}{"5B} \DeclareMathSymbol{\smallbosonloopA}{0}{feynman}{"5C} \DeclareMathSymbol{\bigbosonloopV}{0}{feynman}{"1B} \DeclareMathSymbol{\smallbosonloopV}{0}{feynman}{"1C} % \end{macrocode} % % % \Finale \endinput