summaryrefslogtreecommitdiff
path: root/fonts/feyn
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /fonts/feyn
Initial commit
Diffstat (limited to 'fonts/feyn')
-rw-r--r--fonts/feyn/LICENCE25
-rw-r--r--fonts/feyn/README62
-rw-r--r--fonts/feyn/VERSION1
-rw-r--r--fonts/feyn/exercise-font.pdfbin0 -> 161649 bytes
-rw-r--r--fonts/feyn/exercise-font.tex290
-rw-r--r--fonts/feyn/feyn.dtx1505
-rw-r--r--fonts/feyn/feyn.html167
-rw-r--r--fonts/feyn/feyn.ins12
-rw-r--r--fonts/feyn/feyn.mf811
-rw-r--r--fonts/feyn/feyn.pdfbin0 -> 322819 bytes
-rw-r--r--fonts/feyn/feyn10.mf47
-rw-r--r--fonts/feyn/feyn11.mf47
-rw-r--r--fonts/feyn/feyn12.mf47
-rw-r--r--fonts/feyn/feyn18.mf47
-rw-r--r--fonts/feyn/feyn24.mf47
-rw-r--r--fonts/feyn/feynmac.mf141
-rw-r--r--fonts/feyn/feyntext10.mf47
-rw-r--r--fonts/feyn/feyntext11.mf47
-rw-r--r--fonts/feyn/feyntext12.mf47
-rw-r--r--fonts/feyn/feyntext18.mf47
-rw-r--r--fonts/feyn/feyntext24.mf47
-rw-r--r--fonts/feyn/feynx10.mf47
-rw-r--r--fonts/feyn/feynx11.mf47
-rw-r--r--fonts/feyn/feynx12.mf47
-rw-r--r--fonts/feyn/feynx18.mf47
-rw-r--r--fonts/feyn/feynx24.mf47
-rw-r--r--fonts/feyn/overheads.pdfbin0 -> 56052 bytes
-rw-r--r--fonts/feyn/overheads.tex28
-rw-r--r--fonts/feyn/release-notes.html107
-rw-r--r--fonts/feyn/sample-massive.pngbin0 -> 1707 bytes
-rw-r--r--fonts/feyn/sample-phi4.pngbin0 -> 1993 bytes
-rw-r--r--fonts/feyn/sample-two-loop-annotated.pngbin0 -> 2867 bytes
-rw-r--r--fonts/feyn/sample-two-loop.pngbin0 -> 1742 bytes
-rw-r--r--fonts/feyn/sample-vertex.pngbin0 -> 1233 bytes
-rw-r--r--fonts/feyn/style.css268
35 files changed, 4122 insertions, 0 deletions
diff --git a/fonts/feyn/LICENCE b/fonts/feyn/LICENCE
new file mode 100644
index 0000000000..0a12b69241
--- /dev/null
+++ b/fonts/feyn/LICENCE
@@ -0,0 +1,25 @@
+This software is copyright 1991, 1994, 2001-2, 2005, 2008-17, Norman Gray.
+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.
diff --git a/fonts/feyn/README b/fonts/feyn/README
new file mode 100644
index 0000000000..4477b02799
--- /dev/null
+++ b/fonts/feyn/README
@@ -0,0 +1,62 @@
+
+Feyn: a Metafont for Feynman diagrams
+-------------------------------------
+
+Version 0.4.1.
+
+This package is intended to produce relatively simple Feynman diagrams, for
+example within equations.
+
+This package differs from Thorsten Ohl's feynmf/feynmp package.
+FeynMP 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.
+
+The propagators and vertices which are implemented are those which
+seem to appear most often in non-figure displays (the practical
+definition of ‘appear most often’ is ‘which I wanted’ and ‘which people
+asked me for’). I have no current plans to extend the package
+further, but I'm willing add other features if you can make a case for
+them, and they fit within the package's remit of ‘diagrams for use in
+equations’.
+
+There is further documentation, plus numerous examples, in the package
+documentation (feyn.pdf).
+
+See the package's home page on the web: http://purl.org/nxg/dist/feyn
+
+
+Installation
+------------
+
+Extract the package file from the distribution file using `latex
+feyn.ins`. The resulting `feyn.sty` should be installed in the usual
+location for style files -- that is, something like
+`texmf.local/tex/latex/feyn.sty`. The Metafont source files `*.mf`
+should be installed in a directory with a location such as
+`texmf.local/fonts/source/feyn/` (on a system which has the command,
+`kpsepath mf` will indicate the possibilities here, but these
+typically include the current directory). 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
+`mktexpk` for example) should work as normal, and they should be
+invoked by default when you LaTeX the feyn.dtx file.
+
+You should be able to find generic instructions for installing LaTeX files at
+http://www.tex.ac.uk/cgi-bin/texfaq2html?label=installthings
+
+
+Licence
+-------
+
+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.
+
+
+Norman Gray
+http://nxg.me.uk
diff --git a/fonts/feyn/VERSION b/fonts/feyn/VERSION
new file mode 100644
index 0000000000..9b1b241646
--- /dev/null
+++ b/fonts/feyn/VERSION
@@ -0,0 +1 @@
+feyn-0.4.1
diff --git a/fonts/feyn/exercise-font.pdf b/fonts/feyn/exercise-font.pdf
new file mode 100644
index 0000000000..0ef358242a
--- /dev/null
+++ b/fonts/feyn/exercise-font.pdf
Binary files differ
diff --git a/fonts/feyn/exercise-font.tex b/fonts/feyn/exercise-font.tex
new file mode 100644
index 0000000000..928d1cd7f6
--- /dev/null
+++ b/fonts/feyn/exercise-font.tex
@@ -0,0 +1,290 @@
+\documentclass[10pt]{article}
+
+\usepackage{feyn}
+
+\expandafter\ifx\csname useextended\endcsname\relax
+ \let\ff\feyn
+ \let\dd\Diagram
+\else
+ \let\ff\FEYN
+ \let\dd\DIAGRAM
+\fi
+
+\makeatletter
+\def\refptcirc{\lower\feyn@maxis \hbox to 0pt{\hss$\circ$\hss}}
+\makeatother
+\let\\\cr
+
+\parindent=0pt
+
+\begin{document}
+
+Alphabetically:
+
+\halign{#\hfil\quad&$\refptcirc\ff{#}$\cr
+a & a \\
+b & b \\
+c & c \\
+d & d \\
+e & e \\
+f & f \\
+g & g \\
+h & h \\
+i & i \\
+j & j \\
+k & k \\
+l & l \\
+m & m \\
+n & n \\
+o & o \\
+p & p \\
+q & q \\
+r & r \\
+s & s \\
+t & t \\
+u & u \\
+v & v \\
+w & w \\
+x & x \\
+y & y \\
+z & z \\
+}
+
+\vskip 2cm
+
+\newdimen\feynmod
+\makeatletter
+\feynmod=\feyn@module
+Dimensions:
+Feyn module: \the\feyn@module,
+math-axis: \the\feyn@maxis.
+\makeatother
+
+\newpage
+
+With ligatures:
+\def\T{\tracingmacros=2 \tracingcommands=2 }
+
+\halign{&\vrule width 0pt height 1\feynmod #\hfil\quad&$\refptcirc\ff{#}$\qquad \cr
+a & a & aA & aA & aV & aV\\
+f & f & fA & fA & fV & \momentum{fV}{pk} \\
+fu & fu & fuA & fuA & fuV & \momentum{fuV}{pk} \\
+fd & fd & fdA & fdA & fdV & \momentum{fdV}{pk} \\
+fv & fv & fvA & fvA & fvV & \momentum{fvV}{pk} \\
+fl & fl & flA & flA & flV & \momentum{flV}{pk} \\
+flu & flu & fluA & fluA & fluV & \momentum{fluV}{pk} \\
+flS& flS & flSA & flSA & flSV & \momentum{flSV}{pk} \\
+flSu& flSu & flSuA & flSuA & flSuV & \momentum{flSuV}{pk} \\
+flo & flo & floA & floA & floV & \momentum{floV}{pk} \\
+fs & |fs| \\
+fs0 & |fs0| \\
+g & g & gA & gA & gV & \momentum{gV}{pk} \\
+gu & gu & guA & guA & guV & \momentum{guV}{pk} \\
+gd & gd & gdA & gdA & gdV & \momentum{gdV}{pk} \\
+gv & gv & gvA & gvA & gvV & \momentum{gvV}{pk} \\
+g1 & g1 & g1A & g1A & g1V & \momentum{g1V}{pk} \\
+g2 & g2 & g2A & g2A & g2V & \momentum{g2V}{pk} \\
+g3 & g3 & g3A & g3A & g3V & \momentum{g3V}{pk} \\
+g4 & g4 & g4A & g4A & g4V & \momentum{g4V}{pk} \\
+gl & gl & glA & glA & glV & \momentum{glV}{pk} \\
+glu & glu & gluA & gluA & gluV & \momentum{gluV}{pk} \\
+glB & glB \\
+glS & glS \\
+m & m & mA & mA & mV & \momentum{mV}{pk} \\
+ms & ms & ms & \momentum{ms}{pk} \\
+h & h & hA & hA & hV & \momentum{hV}{pk} \\
+hu & hu & huA & huA & huV & \momentum{huV}{pk} \\
+hd & hd & hdA & hdA & hdV & \momentum{hdV}{pk} \\
+hs & hs & hs & \momentum{hs}{pk} \\
+hl & hl & hlA & hlA & hlV & \momentum{hlV}{pk} \\
+hlu & hlu & hluA & hluA & hluV & \momentum{hluV}{pk} \\
+x & x & x & \momentum{x}{pk} \\
+p & p & P & \momentum{P}{pk} \\
+c & c & c & \momentum{c}{pk} \\
+a & a & A & A \\
+}
+
+\newpage
+
+\def\twice#1{#1 & #1 }
+
+\halign{&#\hfil\quad&$\refptcirc\ff{#}$\qquad\cr
+\twice{fs f gl gv f fs}&vertical gluon doesn't meet -- OK\\
+\twice{fs f glA gv f fs}\\
+\twice{fs fA glA gvV f fs}\\
+\twice{fs fA g1A gvV g2V fA fs}&vertical gluon meets\\
+\twice{msmA g1gvg2 msxf}&and here\\
+}
+
+\vskip10ex
+
+\textbf{More complicated diagrams}
+
+Fermion, gluon and ghost loop:
+\[
+\Diagram{\hline&fl flu \\
+\hline
+fsf g1 f&f g2 ffs \\
+\hline}
+\quad
+\Diagram{\hline&gl glu\\
+fsf g1 f&f g2 ffs \\}
+\quad
+\Diagram{\hline&hlA hluV \\
+fsf g1 f&f g2 ffs \\}
+\]
+
+\textbf{Annotations:}
+
+a: $\ff{!f1\momentum{fA}2}$ (arrow rightward)
+
+b: $\ff{f !{gluV}k f}$ (arrow leftward)
+\vskip 10ex
+
+c: $\ff{f !{g1A}1 \momentum{g2V}2 \momentum{g3A}3 \momentum{g4V}4 f}$
+(arrows are 1=right, 2=left, 3=right, 4=left)
+\vskip 10ex
+
+d: $\ff{\momentum{gl}a\momentum{gluV}b}$
+(arrow leftwards)
+\vskip 10ex
+
+e: $\ff{fs f \momentum{flA}{pk} \momentum{fluV}{pk} f fs}$
+(arrows right then left)
+\vskip 10ex
+
+f: $\ff{fs f \momentum{flSA}{pk} \momentum{flSuV}{pk} f fs}$
+\vskip 10ex
+
+g: $\ff{fflof\momentum{floV}{p}f\momentum{floA}{p}f}$
+
+%error: $\ff{\momentum{x}x}$
+
+\newpage
+
+Vertex Feynman diagram:
+\[
+\dd{\vertexlabel^a \\
+ fd \\
+& g\vertexlabel_{\mu,c} \\
+\vertexlabel_b fu \\
+}
+=
+\dd{\vertexlabel^a \\
+ fdA \\
+& gA\vertexlabel_{\mu,c} \\
+\vertexlabel_b fuV \\
+}
+=
+\dd{\momentum{fdA}a\\
+ & \vertexlabel_{\gamma_\mu} \momentum{gA}{\mu,c} \\
+\momentum{fuV}b
+}
+=
+ig\gamma_\mu (T^c)_{ab}
+\]
+
+Use of the `belowl' macro:
+\[
+\feyn{fd \belowl{fu} g
+ +
+ fA guA \belowl{fdA}
+}
+=
+\FEYN{fd \belowl{fu} g
+ +
+ fA guA \belowl{fdA}
+}
+\]
+
+Two-loop diagram:
+\[
+\ff{ff gl ff}
+\to
+\ff{ff\bigbosonloopA\smallbosonloopV ff}
+=
+\ff{!{fA}p f!{glBV}k !{glSA}l a\vertexlabel_{p+k-l} ff}
+\]
+
+Bremsstrahlung:
+\[
+ \dd{ & x \\
+ & ![ulft]{gvV}{q=p'+k-p} & !{guA}k \\
+ ![bot]{fA}p & ![bot]{fA}{p'+k} & ![lrt]{fA}{p'} \\
+ }
+ +
+ \dd{ & !{guA}k \\
+ !{fA}p & fs ![bot]{fA}{p-k} & !{fA}{p'} \\
+ & & ![lrt]{gvA}{q=p'+k-p} \\
+ & & x\\
+ }
+\]
+
+OPE:
+\def\bracket#1{\langle #1 \rangle}
+\begin{eqnarray*}
+-i\Sigma_{\mathrm{ope}} &=&
+ \left[\ff{faf + fsfglffs
+ + \cdots} \right] 1 \\
+ && \quad{}+
+ \left[ \ff{ fxfs0glfs0xf
+ + \cdots} \right]
+ \bracket{\overline\psi M \psi} \\
+ && \quad{}+ \left[
+ \dd{ &x &x \\
+ &gv &gv \\
+ fs &fs &fs \\} + \cdots
+ \right]
+ \bracket{G_{\mu\nu}^a G_{\mu\nu}^a}\\
+\end{eqnarray*}
+
+Complete vertex:
+\begin{eqnarray*}
+\ff{fcf} &=& \ff{faf + fpf + fpfpf + \cdots} \\
+ &=& \sum_{n=0}^\infty \ff{fA ( pfA)}^n \\
+ &=& \ff{\frac{fA}{1-(pfA)}}.
+\end{eqnarray*}
+
+\iffalse
+\halign{&#\hfil\quad&$\refptcirc\ff{#}$ \cr
+a & a \\
+c & c \\
+f & f \\
+F & F \\
+fs & fs \\
+fl & fl \\
+fu & fu \\
+fd & fd \\
+fv & fv \\
+f0 & f0 \\
+fs0 & fs0 \\
+g & g \\
+G & G \\
+gl & gl \\
+glu & glu \\
+$\backslash$ smallbosonloop & \smallbosonloop \\
+$\backslash$ bigbosonloop & \bigbosonloop \\
+gu & gu \\
+gd & gd \\
+gv & gv \\
+gvs & gvs \\
+gvb & gvb \\
+h & h \\
+hs & hs \\
+hu & hu \\
+hd & hd \\
+k & k \\
+l & l \\
+m & m \\
+ms & ms \\
+n & n \\
+o & o \\
+p & p \\
+x & x \\
+w & w \\
+%000 & \arrow000\\
+%00 45 & \arrow00{45}\\
+}
+\fi
+
+\end{document}
diff --git a/fonts/feyn/feyn.dtx b/fonts/feyn/feyn.dtx
new file mode 100644
index 0000000000..cb371f9019
--- /dev/null
+++ b/fonts/feyn/feyn.dtx
@@ -0,0 +1,1505 @@
+% \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 558acb5f2e14, 2017-11-03 14:43 +0000, tag 0.4.1 + 0
+%<+package>\NeedsTeXFormat{LaTeX2e}
+%<+package>\ProvidesPackage{feyn}[2017/11/03 0.4.1]
+%<+package>\typeout{Package: `feyn' 0.4.1 <2017/11/03>}
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{feyn}
+\title{The feyn font}
+\author{Norman Gray\\(\texttt{norman@astro.gla.ac.uk})}
+\date{Version 0.4.1, 2017 November 03}
+\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}
+%</driver>
+%
+% \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.}
+%
+% \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}$.
+%
+% 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. This must be used
+% within math mode. \cs{Feyn} selects the text-mode 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{http://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/faq/maintenance.html}}.
+%
+% \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{http://www.tex.ac.uk/cgi-bin/texfaq2html?label=installthings}.
+%
+% 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@<x>| 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@<x>| macros. The
+% |<x>| 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
diff --git a/fonts/feyn/feyn.html b/fonts/feyn/feyn.html
new file mode 100644
index 0000000000..64d26c31cd
--- /dev/null
+++ b/fonts/feyn/feyn.html
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding='utf-8'?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Feyn font</title>
+<link href="http://nxg.me.uk" rev="author"/>
+<link type="text/css" rel="stylesheet" href="style.css"/>
+</head>
+
+<body>
+<h1>Feyn font</h1>
+<div class="abstract">
+<p>A package of fonts for displaying Feynman diagrams.</p>
+<p>Version 0.4.1, 2017 November 03.</p>
+<p>Persistent URL: <code style='font-size: larger;'>http://purl.org/nxg/dist/feyn</code></p>
+</div>
+
+
+<p>This package is intended to produce relatively simple Feynman diagrams,
+primarily for use within equations.</p>
+
+<p><img class="smallimage" src="sample-two-loop.png" alt="Two-loop diagram"
+/>This package differs from Thorsten Ohl’s
+<code>feynmf/feynmp</code> package (at <a href="https://ctan.org/pkg/feynmf">CTAN</a>,
+or see the
+<a href="http://www.tex.ac.uk/cgi-bin/texfaq2html?label=drawFeyn" >TeX FAQ</a>).
+FeynMP 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.</p>
+
+<p><img class="smallimage" src="sample-massive.png" alt="Massive fermions"
+/>The propagators and vertices which are implemented are those which
+seem to appear most often in non-figure displays (the practical
+definition of ‘appear most often’ is ‘which I wanted’ and ‘which people
+asked me for’). I have no current plans to extend the package
+further, but I’m willing add other features if you can make a case for
+them.</p>
+
+<p>There is further documentation, plus numerous examples, in the
+<a href="feyn.pdf" >package documentation</a>.</p>
+
+<p><strong>[By the way, I have little idea of how many people actually
+use this package. If you do use it, I’d be most grateful if you could
+drop me a line just to say so]</strong></p>
+
+<h2>Licence</h2>
+
+<p>This software is copyright 1991, 1994, 2001-2, 2005, 2008-17, Norman Gray..
+It is distributed under the terms of the <a href='LICENCE'>2-clause BSD Licence</a>.</p>
+
+<h2>History</h2>
+
+<dl>
+
+<!-- @RELEASENOTES@ -->
+<dt><span class='attention'>Version 0.4.1, 2017 November 3</span></dt>
+<dd><p>The package is now licensed under the terms of the 2-clause BSD licence.</p>
+<p>The only other changes from v0.4b2 are mild documentation adjustments
+(sorry for the long delay between 0.4b2 and 0.4).</p>
+<p>Version 0.4 was not widely released.</p></dd>
+
+<dt>Version 0.4b3, 2013 April 12</dt>
+<dd><ul>
+<li>Changed <code>\below</code> to <code>\belowl</code>, and added
+companion <code>\belowr</code>.</li>
+<li>Documentation updates</li>
+</ul></dd>
+
+<dt>Version 0.4b2, 2011 April 9</dt>
+<dd><p><img class="smallimage" src="sample-phi4.png" alt="Vertex"/> As
+for version 0.4b1, but with the addition of <code>aV</code> for a
+backward arrow (rarely used, but included for consistency; thanks to
+Thomas Pruschke for the suggestion). Also added: <code>flo</code> for
+the closed fermion loop, for phi^4 theory (plus <code>floV</code> and
+<code>floA</code> for completeness; thanks to Hoang Nghia Nguyen for the suggestion;
+the font should <em>now</em> be able to produce all scalar theory
+diagrams).</p></dd>
+
+<dt>Version 0.4b1, 2010 January 23</dt>
+<dd><p>Addition of the extended-size `feynx' fonts, and the <code>\FEYN</code> macro
+(thanks to Luciano Pandola for the suggestion).</p>
+<p>Adjustments to the sizing of half-loops
+(the half-loops are now squashed, though the quarter-loops aren't).
+Added ghost loops; we can now do all the diagrams of 2-loop QCD.
+The quarter-loop gluons now taper at both ends, so that two quarter-loops
+are no longer the same as one half-loop.</p></dd>
+
+
+<dt>...</dt>
+<dd><a href='release-notes.html'>Earlier release notes</a> are available</dd>
+
+</dl>
+
+<h2>Download and installation</h2>
+
+<p>The nominal distribution point for the Feyn package is CTAN,
+under <a href="https://ctan.org/pkg/feyn">fonts/feyn</a>.</p>
+
+<p>The feyn package is included in the
+<a href='http://www.tug.org/texlive/'>TeXLive distribution</a>, so
+you may have it on your machine already. If not, or if you need a
+more up-to-date version, read on.</p>
+
+<p>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 <a href='https://www.tug.org/texlive/tlmgr.html'>tlmgr</a>,
+and for MikTeX see the
+<a href='https://docs.miktex.org/faq/maintenance.html'>maintenance
+section of the manual</a>.</p>
+
+<h3>Doing the installation by hand</h3>
+
+<p>...how thoroughly old-skool of you!</p>
+
+<ol>
+<li>Download either
+<a href="feyn-0.4.1.tar.gz" >feyn-0.4.1.tar.gz</a>
+or
+<a href="feyn-0.4.1.zip" >feyn-0.4.1.zip</a>
+and unpack it.</li>
+
+<li>Run LaTeX on the file <code>feyn.ins</code> – this will unpack the
+style file <code>feyn.sty</code> amongst other files. Place this
+‘somewhere where TeX can find it’. Similarly, place the
+<code>.mf</code> files somewhere where the font-generation mechanism
+for your platform can find them. For example, in the TeXLive
+distribution, the feyn <code>*.mf</code> files appear in the directory
+<code>/usr/local/texlive/2008/texmf-dist/fonts/source/public/feyn/</code>
+and the <code>feyn.sty</code> file in
+<code>/usr/local/texlive/2008/texmf-dist/tex/latex/feyn/feyn.sty</code>,
+so that if I were installing them ‘privately’, I would put them in
+<code>/usr/local/texlive/texmf-local/fonts/source/local/feyn/</code>
+and
+<code>/usr/local/texlive/texmf-local/tex/latex/feyn/feyn.sty</code>.
+With the teTeX and TeXLive Unix distributions, the output of
+<code>kpsepath mf</code> shows the list of places where TeX will look
+for Metafont source files. The font files <em>should</em> be
+generated on the fly when you first refer to them. See also the
+relevant discussion in the TeX FAQ about <a
+href='http://www.tex.ac.uk/cgi-bin/texfaq2html?label=inst-wlcf'
+>‘where LaTeX can find them’</a>.</li>
+
+<li>Run LaTeX on the file <code>feyn.dtx</code> to obtain the
+documentation, which is prebuilt in <code><a href="feyn.pdf"
+>feyn.pdf</a></code> (this should
+generate the font files as a side-effect).</li>
+</ol>
+
+<p>You should be able to find generic instructions for installing LaTeX files at
+<a href='http://www.tex.ac.uk/cgi-bin/texfaq2html?label=installthings' >the TeX FAQ</a>.</p>
+
+
+
+<div class="signature">
+<a href="http://nxg.me.uk" >Norman Gray</a><br/>
+2017 November 03
+</div>
+
+</body>
+</html>
+
+
+<!-- Local Variables: -->
+<!-- mode: nxml -->
+<!-- End: -->
diff --git a/fonts/feyn/feyn.ins b/fonts/feyn/feyn.ins
new file mode 100644
index 0000000000..f69f819db8
--- /dev/null
+++ b/fonts/feyn/feyn.ins
@@ -0,0 +1,12 @@
+\input docstrip
+\preamble
+ Feyn: package to manage the font feyn10
+\endpreamble
+\keepsilent
+\askforoverwritefalse
+
+\generate{\file{feyn.drv}{\from{feyn.dtx}{driver}}
+ \file{feyn.sty}{\from{feyn.dtx}{package}}
+ }
+
+\endbatchfile
diff --git a/fonts/feyn/feyn.mf b/fonts/feyn/feyn.mf
new file mode 100644
index 0000000000..60a64f4d01
--- /dev/null
+++ b/fonts/feyn/feyn.mf
@@ -0,0 +1,811 @@
+% This is the metafont for the feynfont font, release 0.4.1, 2017 November 03
+%
+% Copyright 1991, 1994, 2001, 2002, 2005, 2008-10, Norman Gray.
+% See the file LICENCE for licence details.
+%
+% Mercurial revision 558acb5f2e14, 2017-11-03 14:43 +0000, tag 0.4.1 + 0
+%
+%
+%
+% When I look at the property list of the generated TFM (using
+% tftopl) it starts with `(FAMILY CMR)': but this isn't in the cmr
+% family. I can't find anything in cmbase.mf which would cause
+% this. Perhaps I need to read the Metafont Book more closely.
+
+
+mode_setup; font_setup;
+
+% a# is the position of the characters above the baseline.
+a# := on_math_axis * math_axis#; % math_axis is defined by cmr
+
+% Feyn macros
+input feynmac;
+
+define_pixels (module,bigarrow,littlearrow,blobr,a);
+define_blacker_pixels (linewidth,thinlinewidth);
+
+pickup pencircle scaled linewidth;
+diagram_pen := savepen;
+
+% general definitions
+phangle := 75; % photon angle
+
+squash := 0.75; % the amount by which some loops are squashed
+
+% The caller must set the following parameters to values such as these
+%boson_wiggles := 4; %this must be an even number
+%boson_wiggles_loop_small := 4;
+%boson_wiggles_loop_normal := 6;
+%boson_wiggles_loop_large := 8;
+
+
+% All the character positions between 0 and hex"7F"
+% have characters in them. Not all of these characters are ones
+% which should appear on paper; some (such as `s' or `l') only
+% appear in ligatures, and others shouldn't appear at all. If,
+% however, there are no characters in these positions, some DVI
+% readers (including TFtoPL and OzTeX for example) complain about a
+% `bad TFM file'. These locations are therefore occupied by the
+% character generated by the errorchar macro, which is 0pt wide, and
+% 1module# high. This character doesn't generate any real error,
+% but the glyph will be manifestly peculiar on paper.
+%
+% Add code to extra_beginchar so that we keep a record of all the
+% characters that we generate, so that we can generate an errochar
+% character for each of the codepoints that we've skipped. `charcode'
+% is defined in the expansion of beginchar()
+
+numeric donechar[];
+string donecharerror;
+donecharerror := "Duplicate character";
+extra_beginchar := extra_beginchar & "if known donechar[charcode]: errmessage donecharerror; fi donechar[charcode] := 1;";
+
+path charpath, charpathb;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Digits 0x30--0x39. Obtain these from the cmr source file: romand.mf.
+input romand;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Fermions
+
+def path_fermion (expr scale_sharp, ang) =
+ begingroup
+ save scale;
+ scale := hround(scale_sharp*hppp);
+ if ang > 0: % slopes upward
+ (0,a) .. (scale*(cosd ang), scale*(abs sind ang)+a)
+ else :
+ (0,scale*(abs sind ang)+a) .. (scale*(cosd ang), a)
+ fi
+ endgroup
+enddef;
+
+threechars ("f", "fermion",
+ path_fermion(2module#, 0), 0.5, 2module#, 0, 0,
+ (0,0.1module), "top");
+
+begingroup % make closed fermion loop, for phi^4 theory
+ clearxy;
+ save height;
+ height# := 2module#;
+ define_pixels(height);
+ z2 = (0, height); %top of loop
+ y1 = y3 = 2y2/3;
+ x1+x3 = 0;
+ x1-x3 = 2height/3;
+ charpath := origin .. z1 .. z2 .. z3 .. origin;
+ threechars ("k", "fermion loop",
+ charpath shifted (0,a), 2,
+ 0, 2module#, 0,
+ 0, "top");
+endgroup;
+
+beginchar (hex"21", module#, 0, 0);
+ "short fermion";
+ pen;
+ draw path_fermion(module#, 0);
+endchar;
+
+
+% The following characters are in boxes the same vertical size as the black
+% bit of the character, but they project out of the top by an amount equal to
+% the height of the math axis, and are that same height clear of the bottom
+% of the box.
+%
+%%%% -90 <= ang <= +90, or all hell will break loose
+
+threechars ("e", "upward fermion",
+ path_fermion(2module#, 45), 0.5,
+ 2module#*(cosd 45), 2module#*(abs sind 45), 0,
+ 0, "ulft");
+
+threechars ("d", "downward fermion",
+ path_fermion(2module#, -45), 0.5,
+ 2module#*(cosd -45), 2module#*(abs sind -45), 0,
+ 0, "urt");
+
+threechars ("b", "vertically upward fermion",
+ path_fermion(2module#, 90), 0.5,
+ 2module#*(cosd 90), 2module#*(abs sind 90), 0,
+ 0, "urt");
+
+charpath := path_fermion(2module#, 0);
+beginchar("m", 2module#, 0, 0); "massive fermion";
+ pen;
+ draw charpath shifted (0,linewidth);
+ draw charpath shifted (0,-linewidth);
+ annotate_at(point 0.5 of charpath shifted (0,linewidth), "top");
+endchar;
+
+beginchar("M", 2module#, 0, 0); "r-arrowed massive fermion";
+ pen;
+ draw charpath shifted (0,linewidth);
+ draw charpath shifted (0,-linewidth);
+ drawarrow (bigarrow, point 0.5 of charpath, 0);
+ annotate_at(point 0.5 of charpath shifted (0,linewidth), "top");
+endchar;
+
+beginchar(byte"m"-hex"60", 2module#, 0, 0); "l-arrowed massive fermion";
+ pen;
+ draw charpath shifted (0,linewidth);
+ draw charpath shifted (0,-linewidth);
+ drawarrow (bigarrow, point 0.5 of charpath, 180);
+ annotate_at(point 0.5 of charpath shifted (0,linewidth), "top");
+endchar;
+
+charpath := path_fermion(module#, 0);
+beginchar(hex"23", module#, 0, 0); "short massive fermion";
+ pen;
+ draw charpath shifted (0,linewidth);
+ draw charpath shifted (0,-linewidth);
+ %drawarrow (littlearrow, point 0.5 of charpath, 0);
+ annotate_at(point 0.5 of charpath shifted (0,linewidth), "top");
+endchar;
+
+begingroup
+ clearxy;
+ save width;
+ width# := 4module#;
+ define_pixels(width);
+ x2-x0 = 2(x1-x0) = width;
+ x1 = 0;
+ y0 = y2 = 0;
+ y1 = 2squash*module;
+ charpath := z0 .. z1 .. z2;
+
+ threechars("l", "fermion loop",
+ charpath shifted (0,a), 1,
+ 0, 2squash*module#+a#, 0,
+ 0, "top");
+ threechars("n", "fermion loop, inverted",
+ charpath yscaled -1 shifted (0,a), 1,
+ 0, a#, 0,
+ 0, "bot");
+ threechars("o", "fermion loop, small",
+ charpath scaled 0.66667 shifted (0,0.66667a), 1,
+ 0, module#+a#, 0,
+ 0, "top");
+ threechars("w", "fermion loop, small, inverted",
+ charpath xscaled 0.66667 yscaled -0.66667 shifted(0,0.66667a), 1,
+ 0, module#+a#, 0,
+ 0, "bot");
+endgroup;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Gauge bosons
+%
+
+def path_boson (expr scale_sharp, ang, taper) =
+ begingroup
+ save scale;
+ clearxy;
+ scale := hround(scale_sharp*hppp);
+ x1 = 0;
+ x99 = scale*(cosd ang);
+ if ang > 0 : % slopes upward
+ y1 = a;
+ y99 = scale*(abs sind ang) + a;
+ else :
+ y1 = scale*(abs sind ang) + a;
+ y99 = a;
+ fi
+ for i = 3 upto boson_wiggles:
+ z[i] - z[i-1] = z2-z1;
+ endfor
+ z99 - z[boson_wiggles] = z2-z1;
+ def ::(expr b) = {dir (ang+b)} looselink {dir (ang-b)} enddef;
+
+ z1 ::(phangle)z2
+ for i = 3 step 2 until boson_wiggles:
+ ::(-phangle) z[i] ::(phangle)z[i+1]
+ endfor
+ if taper <> 0 :
+ {dir (ang-phangle)} .. tension 1 and 0.8 .. {dir (ang+phangle/2)}
+ else :
+ ::(-phangle)
+ fi
+ z99
+ endgroup
+enddef;
+
+% the following is a simpler version of the above, without the
+% boson_wiggles, to document what it's supposed to be doing
+def path_boson_orig (expr scale_sharp, ang, taper) =
+ begingroup
+ save scale;
+ clearxy;
+ scale := hround(scale_sharp*hppp);
+ x1 = 0; x5 = scale*(cosd ang);
+ if ang > 0 : % slopes upward
+ y1 = a;
+ y5 = scale*(abs sind ang) + a;
+ else :
+ y1 = scale*(abs sind ang) + a;
+ y5 = a;
+ fi
+ z2-z1 = z3-z2 = z4-z3 = z5-z4;
+ def ::(expr b) = {dir (ang+b)} looselink {dir (ang-b)} enddef;
+
+ z1 ::(phangle) z2 ::(-phangle) z3 ::(phangle) z4
+ if taper <> 0 :
+ {dir (ang-phangle)} .. tension 1 and 0.8 .. {dir (ang+phangle/2)}
+ else :
+ ::(-phangle)
+ fi
+ z5
+ endgroup
+enddef;
+
+threechars ("g", "gluon",
+ path_boson(2module#, 0, 0), boson_wiggles/2,
+ 2module#, 0, 0,
+ (0, 0.2module), "top");
+threechars ("u", "upward gluon",
+ path_boson(2module#, 45, 0), boson_wiggles/2,
+ 2module#*(cosd 45), 2module#*(abs sind 45), 0,
+ 0, "ulft");
+threechars ("v", "downward gluon",
+ path_boson(2module#, -45, 0), boson_wiggles/2,
+ 2module#*(cosd -45), 2module#*(abs sind -45), 0,
+ 0, "urt");
+threechars (hex"7D",
+ "vertical gluon",
+ path_boson(2module#, 90, 1), boson_wiggles/2,
+ 0, 2module#, 0,
+ 0, "urt");
+
+% plus or minus phangle, depending on whether n is odd or even
+def pm_angle(expr n) =
+ if odd n: -1 else: 1 fi*phangle
+enddef;
+
+% a gluon quarter loop, in the upper-right quadrant:
+% wid: radius of loop in modules
+% nopts: number of points
+% inv: if 1, the loop goes from the axis to the top;
+% if 0, from the top down to the axis
+% negang: if 1, negate the photon angle (so it wiggles oppositely);
+% if 0, don't
+% taper: if 1 or 3, the line tapers as it approaches the axis
+% if 2 or 3, the line tapers as it approaches the top
+% if 0, the line does not taper
+% (I can't help feeling this macro has become more complicated than it
+% really need be...)
+def path_quadloop (expr wid, nopts, inv, negang, taper) =
+ begingroup
+ save halfwidth, myangle;
+ clearxy;
+ halfwidth# := wid*module#;
+ define_pixels(halfwidth);
+ myangle = if negang <> 0: -phangle else: phangle fi;
+ z0 = (halfwidth, 0); % z0 is on the axis
+ for x = 1 upto nopts:
+ z[x] = z0 rotated (x*90/nopts);
+ endfor
+ if inv = 0:
+ def ::(expr p,ang) = p{p rotated(-90-ang)} looselink enddef;
+ if (taper = 2) or (taper = 3):
+ z[nopts]{dir(0-myangle/2)} .. tension 0.8 and 1 ..
+ else:
+ ::(z[nopts], pm_angle(nopts+negang))
+ fi
+ for x=nopts-1 downto 2:
+ ::(z[x], pm_angle(x+negang))
+ endfor
+ if (taper = 1) or (taper = 3):
+ z[1]{z[1] rotated(-90+myangle)} .. tension 1 and 0.8 .. {dir -(90+myangle/2)}
+ else:
+ ::(z[1], pm_angle(1+negang))
+ fi
+ z0
+ else:
+ def ::(expr p,ang) = looselink {p rotated (90+ang)}p enddef;
+ if (taper = 1) or (taper = 3):
+ z0 {dir (90+myangle/2)} .. tension 0.8 and 1 .. z[1]{z[1] rotated(90-myangle)}
+ else:
+ z0{dir (90+myangle)}
+ ::(z[1], pm_angle(1+negang))
+ fi
+ for x=1 upto nopts-1:
+ ::(z[x], pm_angle(x+negang))
+ endfor
+ if (taper = 2) or (taper = 3):
+ .. tension 0.8 and 1 .. {z[nopts] rotated (90+myangle/2)}z[nopts]
+ else:
+ ::(z[nopts], pm_angle(nopts+negang))
+ fi
+ fi
+ endgroup
+enddef;
+
+% next_odd: evaluate to the next odd number greater than or equal to n
+def next_odd(expr n) =
+ (2*floor(n/2)+1)
+enddef;
+
+threechars ("q", "gluon, quadrant 1",
+ path_quadloop(2, boson_wiggles_loop_normal, 1, 0, 3) xscaled -1 shifted (0,a),
+ next_odd(2boson_wiggles_loop_normal/3),
+ 0, 2module#, 0, % height is 2module#, not 2module#+a#, so that
+ % they line up OK in \Diagram
+ 0, "ulft");
+threechars ("r", "gluon, quadrant 2",
+ path_quadloop(2, boson_wiggles_loop_normal, 0, 0, 3) shifted (0,a),
+ next_odd(boson_wiggles_loop_normal/2),
+ 0, 2module#, 0,
+ 0, "urt");
+threechars ("s", "gluon, quadrant 3",
+ path_quadloop(2, boson_wiggles_loop_normal, 0, 1, 3) yscaled -1 shifted (0,a),
+ next_odd(boson_wiggles_loop_normal/2),
+ 0, a#, a#-2module#,
+ 0, "lrt");
+threechars ("t", "gluon, quadrant 4",
+ path_quadloop(2, boson_wiggles_loop_normal, 1, 1, 3) scaled -1 shifted (0,a),
+ next_odd(2boson_wiggles_loop_normal/3),
+ 0, a#, a#-2module#,
+ 0, "llft");
+
+% The two loops following have the annotation off-centre, to keep
+% it clear of the wiggles. Would it look better being "top" and "bot"
+% again, but with a non-zero offset in the second-last argument?
+% These two are vertically squashed so that they take up less than 2
+% modules vertically, which means in turn that {gl glu} can sit in a
+% two-loop diagram without crashing into the baseline.
+threechars ("y", "gluon half loop",
+ ((path_quadloop(2, boson_wiggles_loop_normal, 1, 0, 1) xscaled -1)
+ .. path_quadloop(2, boson_wiggles_loop_normal, 0, 0, 1)) yscaled squash shifted (0,a),
+ boson_wiggles_loop_normal+1,
+ 0, 2squash*module#+a#, 0,
+ 0, "urt");
+threechars ("z", "gluon half loop, inverted",
+ ((path_quadloop(2, boson_wiggles_loop_normal, 1, 1, 1) scaled -1)
+ .. (path_quadloop(2, boson_wiggles_loop_normal, 0, 1, 1) yscaled -1)) yscaled squash shifted (0,a),
+ boson_wiggles_loop_normal+1,
+ 0, a#, a#-2module#,
+ 0, "llft");
+
+% Small and large boson half loops are at positions which are not characters.
+% That's OK -- they can still be accessed by ligatures.
+% 7b='{', 7c='|'
+threechars (hex"7B", "large gluon half loop",
+ ((path_quadloop(2.66667, boson_wiggles_loop_large, 1, 0, 1) xscaled -1)
+ .. path_quadloop(2.66667, boson_wiggles_loop_large, 0, 0, 1)) shifted (0,a),
+ 1.5boson_wiggles_loop_large,
+ 0, 2.66667module#+a#, 0,
+ 0, "urt");
+threechars (hex"7C", "small gluon half loop",
+ ((path_quadloop(1.3333, boson_wiggles_loop_small, 1, 0, 1) xscaled -1)
+ .. path_quadloop(1.3333, boson_wiggles_loop_small, 0, 0, 1)) shifted (0,a),
+ 1.5boson_wiggles_loop_small,
+ 0, 1.3333module#+a#, 0,
+ 0, "llft");
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Ghosts
+
+ghost_points = 2(boson_wiggles + 1); % should be at least 8?
+def draw_ghost(expr a, b, apos) =
+ begingroup
+ % pattern for ghost_points=10: "-_--_--_--_-"
+ clearxy;
+ z1 = a; z[ghost_points] = b;
+ z2-z1 = z[ghost_points]-z[ghost_points-1];
+ for i = 2 step 2 until (ghost_points-1):
+ z2-z1 = z[i+1]-z[i];
+ endfor
+ z4-z3 = 2(z2-z1);
+ for i = 5 step 2 until (ghost_points-2):
+ z4-z3 = z[i+1]-z[i];
+ endfor
+ pen;
+ draw z1--z2; draw z[ghost_points-1]--z[ghost_points];
+ for i = 3 step 2 until (ghost_points-2):
+ draw z[i]--z[i+1];
+ endfor
+ annotate_at(0.5[z1,z[ghost_points]], apos);
+ endgroup
+enddef;
+% the following is a simpler version of the above, without the
+% ghost_points parameter, to document what it's supposed to be doing
+def draw_ghost_orig(expr a, b, apos) =
+ begingroup
+ clearxy;
+ z1 = a; z10 = b;
+ z4-z3 = 2(z2-z1);
+ z4-z3 = z6-z5 = z8-z7;
+ z2-z1 = z3-z2 = z5-z4 = z7-z6 = z9-z8 = z10-z9;
+ pen;
+ draw z1..z2; draw z3..z4; draw z5..z6; draw z7..z8; draw z9..z10;
+ annotate_at(0.5[z5,z6], apos);
+ endgroup
+enddef;
+
+beginchar ("h", 2module#, 0, 0); "ghost";
+ pen;
+ draw_ghost((0,a), (w,a), "top");
+endchar;
+beginchar (byte "h"-hex"20", 2module#, 0, 0); "r-arrowed ghost";
+ pen;
+ draw_ghost((0,a), (w,a), "top");
+ drawarrow (littlearrow, .5[(0,a), (w,a)], 0);
+endchar;
+beginchar (byte "h"-hex"60", 2module#, 0, 0); "l-arrowed ghost";
+ pen;
+ draw_ghost((0,a), (w,a), "top");
+ drawarrow (littlearrow, .5[(0,a), (w,a)], 180);
+endchar;
+beginchar ("i", 2module#*(cosd 45), 2module#*(sind 45), 0); "upward ghost";
+ pen;
+ draw_ghost((0,a), (w,h+a), "ulft");
+endchar;
+beginchar (byte"i"-hex"20", 2module#*(cosd 45), 2module#*(sind 45), 0);
+ "r-arrowed upward ghost";
+ pen;
+ draw_ghost((0,a), (w,h+a), "ulft");
+ drawarrow (littlearrow, .5[(0,a), (w,h+a)], 45);
+endchar;
+beginchar (byte"i"-hex"60", 2module#*(cosd 45), 2module#*(sind 45), 0);
+ "l-arrowed upward ghost";
+ pen;
+ draw_ghost((0,a), (w,h+a), "ulft");
+ drawarrow (littlearrow, .5[(0,a), (w,h+a)], 45+180);
+endchar;
+beginchar ("j", 2module#*(cosd 45), 2module#*(sind 45), 0);
+ "downward ghost";
+ pen;
+ draw_ghost((0,h+a), (w,a), "urt");
+endchar;
+beginchar (byte"j"-hex"20", 2module#*(cosd 45), 2module#*(sind 45), 0);
+ "r-arrowed downward ghost";
+ pen;
+ draw_ghost((0,h+a), (w,a), "urt");
+ drawarrow (littlearrow, .5[(0,a), (w,h+a)], -45);
+endchar;
+beginchar (byte"j"-hex"60", 2module#*(cosd 45), 2module#*(sind 45), 0);
+ "l-arrowed downward ghost";
+ pen;
+ draw_ghost((0,h+a), (w,a), "urt");
+ drawarrow (littlearrow, .5[(0,a), (w,h+a)], -45+180);
+endchar;
+
+% ghost loops
+begingroup
+ clearxy; clearit; % clear current picture
+ picture ghostloop;
+ pair refpt, arrowpoint;
+ refpt := (-2module, 0);
+ for i=0 upto 23:
+ z[i] = refpt rotated -(i/24*180) yscaled squash shifted (0,a);
+ endfor
+ arrowpoint := z[12];
+ transform below;
+ below := identity rotatedaround ((0,a), 180);
+ pen;
+ for i=0 step 2 until 22:
+ draw z[i]--z[i+1];
+ endfor
+ ghostloop := currentpicture; clearit;
+ beginchar (hex"7E", 0, 2squash*module#+a#, 0); "ghost loop";
+ addto currentpicture also ghostloop;
+ annotate_at(arrowpoint, "top");
+ endchar;
+ beginchar (hex"7E"-hex"20", 0, 2squash*module#+a#, 0); "r-arrowed ghost loop";
+ addto currentpicture also ghostloop;
+ drawarrow(littlearrow, arrowpoint, 0);
+ annotate_at(arrowpoint, "top");
+ endchar;
+ beginchar (hex"7E"-hex"60", 0, 2squash*module#+a#, 0); "l-arrowed ghost loop";
+ addto currentpicture also ghostloop;
+ drawarrow(littlearrow, arrowpoint, 180);
+ annotate_at(arrowpoint, "top");
+ endchar;
+ beginchar (hex"7F", 0, a#, 0); "ghost loop, inverted";
+ addto currentpicture also ghostloop transformed below;
+ annotate_at(arrowpoint transformed below, "top");
+ endchar;
+ beginchar (hex"7F"-hex"20", 0, a#, 0); "r-arrowed ghost loop, inverted";
+ addto currentpicture also ghostloop transformed below;
+ drawarrow(littlearrow, arrowpoint transformed below, 0);
+ annotate_at(arrowpoint transformed below, "top");
+ endchar;
+ beginchar (hex"7F"-hex"60", 0, a#, 0); "l-arrowed ghost loop, inverted";
+ addto currentpicture also ghostloop transformed below;
+ drawarrow(littlearrow, arrowpoint transformed below, 180);
+ annotate_at(arrowpoint transformed below, "top");
+ endchar;
+endgroup;
+
+beginchar (hex"22", module#, 0, 0); "short ghost";
+ pen;
+ z1 = (0,a); z6 = (w,a);
+ z4-z3 = 2(z2-z1);
+ z2-z1 = z3-z2 = 1/2(z4-z3) = z5-z4 = z6-z5;
+ draw z1..z2; draw z3..z4; draw z5..z6;
+ annotate_at(0.5[z3,z4], "top")
+endchar;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Odds and sods
+
+beginchar (hex"60", 2module#, 0, 0);
+ "spacer";
+endchar;
+
+beginchar (hex"40", module#, 0, 0);
+ "short spacer";
+endchar;
+
+beginchar ("c", 2blobr#, blobr# + a#, blobr#); "complete vertex";
+ pen;
+ draw (0,a) .. (w,a) .. cycle;
+ annotate_at((w/2,w/2+a), "top");
+endchar;
+
+%beginchar ("d", module#/2, 0, 0); "weeny fermion";
+% pen;
+% draw (0,a)..(w,a);
+%endchar;
+%
+%beginchar ("k", module#/2, 0, 0); "weeny massive fermion";
+% pen;
+% y1 - a = y2 - a = a - y3 = a - y4 = module#/3.5;
+% x1 = x3 = 0;
+% x2 = x4 = w;
+% draw z1--z2;
+% draw z3--z4;
+%endchar;
+%
+%beginchar ("l", module#, 0, 0); "short massive fermion";
+% pen;
+% y1 - a = y2 - a = a - y3 = a - y4 = module#/3.5;
+% x1 = x3 = 0;
+% x2 = x4 = w;
+% draw z1--z2;
+% draw z3--z4;
+%endchar;
+
+%beginchar ("n", 4module#, 2module#-a#, 2module#-a#);
+% pen; "fermion loop";
+% z0 = (0,a); z1 = (w,a);
+% draw z0{dir phangle} ..tension 1.15.. {dir -phangle}z1;
+% draw z0{dir -phangle} ..tension 1.15.. {dir phangle}z1;
+%endchar;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Other symbols
+
+garrow("a", 0, 1);
+garrow(hex"03", 180, 1);
+
+beginchar ("p", 2blobr#, blobr# + a#, blobr# - a#);
+ pen; "proper vertex";
+ picture p[];
+ pair t[];
+ fill (-blobr, 0) .. (blobr, 0) .. cycle;
+ p1 := currentpicture; clearit;
+ draw (-blobr, 0) .. (blobr, 0) .. cycle;
+ p2 := currentpicture; clearit;
+ t1 = 5/6[origin, (0,blobr)] shifted (-blobr, 0);
+ t7 = 5/6[origin, (0,blobr)] shifted (+blobr, 0);
+ forsuffixes s = 2,3,4,5,6 :
+ t[s] = t[s-1] shifted (0, -blobr/3);
+ t[s+6] = t[s+5] shifted (0, -blobr/3);
+ endfor
+ forsuffixes s = 1,2,3,4,5,6,7,8,9,10,11,12 :
+ z[s] = t[s] rotated 45;
+ endfor
+ forsuffixes s = 1,2,3,4,5,6 :
+ draw z[s] -- z[s+6];
+ endfor
+ addto currentpicture also p1;
+ cull currentpicture keeping (2,2); % & the two pictures
+ addto currentpicture also p2;
+ currentpicture := currentpicture shifted (blobr,a);
+ labels (range 1 thru 12);
+ annotate_at((blobr,blobr+a), "top");
+endchar;
+
+beginchar ("P", 2blobr#, blobr#+a#, blobr#-a#); % see complete vertex "c"
+ pen; "proper vertex 2";
+ fill (0,a) .. (w,a) .. cycle;% withcolor black;
+ annotate_at((w/2,w/2+a), "top");
+endchar;
+
+beginchar ("x", 0, a#, -a#); "counterterm";
+ pen;
+ -x1 = -x2 = x3 = x4;
+ y1 = -y2 = y3 = -y4;
+ z3 = (2blobr/3, 0) rotated 45;
+ draw z1 .. z4;
+ draw z2 .. z3;
+ currentpicture := currentpicture shifted (0,a);
+ annotate_at(0.5[z1,z3] shifted (0,a), "top");
+endchar;
+
+beginchar (hex"20", module#, a#, 0); "space block";
+ pen;
+ message "spacer: width=" & decimal w & ", height=" & decimal h;
+ draw origin--(w,h);
+ draw (0,h)--(w,0);
+endchar;
+
+
+% Now generate an errorchar() in each of the code positions we've skipped
+for n = 0 upto hex"7F":
+ if not known(donechar[n]):
+ beginchar (n, 0, module#, 0); errorchar(h); endchar;
+ fi
+endfor
+
+
+% Construct the ligature tables.
+ligtable "a" : % arrow
+ "A" =: "a", % right-arrow, for symmetry
+ "V" =: hex"03"; % left-arrow
+
+ligtable "f" : % fermion
+"A" =: "F", % right-arrowed
+"V" =: hex"06", % left-arrowed
+"u" =: "e", % upward
+"d" =: "d", % downward
+"v" =: "b", % vertical
+"s" =: hex"21", % short
+"l" =: "l", % loop
+"0" =: hex"60"; % spacer
+
+ligtable "e" : % upward fermion, fe
+"A" =: "E", % arrowed
+"V" =: hex"05";
+
+ligtable "d" : % downward fermion, fd
+"A" =: "D",
+"V" =: hex"04";
+
+ligtable "b" : % vertical fermion, fv
+"A" =: "B",
+"V" =: hex"02";
+
+ligtable hex"21" : % short fermion
+"0" =: hex"40"; % short spacer
+
+ligtable "k" : % fermion closed loop
+"A" =: "K", % arrowed
+"V" =: hex"0b";
+
+ligtable "l" : % fermion loop
+"u" =: "n", % upside down
+"o" =: "k", % closed loop (for scalar theory)
+"S" =: "o", % small
+"A" =: "L",
+"V" =: hex"0C";
+
+ligtable "g" : % gluon
+"A" =: "G",
+"V" =: hex"07",
+"u" =: "u",
+"d" =: "v",
+"v" =: oct"175",
+"l" =: "y", % gluon half-loop
+"1" =: "q", % gluon quarter-loop, 1st quadrant (upper-left)
+"2" =: "r", % 2nd
+"3" =: "s", % 3rd
+"4" =: "t"; % 4th
+
+ligtable "m" : % massive fermion
+"A" =: "M",
+"V" =: hex"0D",
+"s" =: hex"23";
+
+ligtable "n" : % inverted fermion
+"A" =: "N",
+"V" =: hex"0E";
+
+ligtable "o" : % fermion loop small
+"u" =: "w", % upside down
+"A" =: "O",
+"V" =: hex"0F";
+
+ligtable "q" : % gluon, 1st quadrant
+"A" =: "Q",
+"V" =: hex"11";
+
+ligtable "r" : % gluon, 2nd quadrant
+"A" =: "R",
+"V" =: hex"12";
+
+ligtable "s" : % gluon, 3rd quadrant
+"A" =: "S",
+"V" =: hex"13";
+
+ligtable "t" : % gluon, 4th quadrant
+"A" =: "T",
+"V" =: hex"14";
+
+ligtable "u" : % upward gluon
+"A" =: "U",
+"V" =: hex"15";
+
+ligtable "v" : % downward gluon
+"A" =: "V",
+"V" =: hex"16";
+
+ligtable "w" : % fermion loop, small, upside-down
+"A" =: "W",
+"V" =: oct"027";
+
+ligtable oct"175" : % vertical gluon
+"A" =: oct"135",
+"V" =: oct"035";
+
+ligtable "y" : % gluon half-loop
+"A" =: "Y",
+"V" =: hex"19",
+"B" =: hex"7B", % large
+"S" =: hex"7C", % small
+"u" =: "z"; % ...upside down
+
+ligtable hex"7B" : % large gluon half loop
+"A" =: hex"5B",
+"V" =: hex"1B";
+
+ligtable hex"7C" : % small gluon half loop
+"A" =: hex"5C",
+"V" =: hex"1C";
+
+ligtable "z" : % upside-down gluon loop
+"A" =: "Z",
+"V" =: hex"1A";
+
+ligtable "h" : % ghost
+"A" =: "H",
+"V" =: hex"08",
+"u" =: "i", % upward
+"d" =: "j", % downward
+"s" =: hex"22", % short
+"l" =: hex"7E"; % ghost loop
+
+ligtable hex"7E" : % ghost loop
+"A" =: hex"5E", % r-arrowed
+"V" =: hex"1E", % l-arrowed
+"u" =: hex"7F"; % upside down
+
+ligtable hex"7F" : % ghost loop inverted
+"A" =: hex"5F", % r-arrowed
+"V" =: hex"1F"; % l-arrowed
+
+ligtable "i" : % upward ghost
+"A" =: "I",
+"V" =: hex"09";
+
+ligtable "j" : % downward ghost
+"A" =: "J",
+"V" =: hex"0A";
diff --git a/fonts/feyn/feyn.pdf b/fonts/feyn/feyn.pdf
new file mode 100644
index 0000000000..adc1240b72
--- /dev/null
+++ b/fonts/feyn/feyn.pdf
Binary files differ
diff --git a/fonts/feyn/feyn10.mf b/fonts/feyn/feyn10.mf
new file mode 100644
index 0000000000..46b81eb048
--- /dev/null
+++ b/fonts/feyn/feyn10.mf
@@ -0,0 +1,47 @@
+% Feynman diagram font, 10pt display size, release 0.4.1, 2017 November 03.
+%
+% This software is copyright 1991, 1994, 2001-2, 2005, 2008-17, Norman Gray.
+% Mercurial revision 558acb5f2e14, 2017-11-03 14:43 +0000, tag 0.4.1 + 0
+
+font_identifier "FEYN"; font_size 10pt#;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% First the base size
+
+module# := 10pt#;
+
+% phfudge is ... what?!
+phfudge# := 0pt#; % must be, for \Diagram macro
+
+linewidth# := 0.75pt#; % pen width
+thinlinewidth# := 0.5pt#; % thin pen
+bigarrow# := 6pt#; % size of arrows
+littlearrow# := 4pt#;
+blobr# := 6.5pt#; % radius of blobs and crosses
+
+on_math_axis := 1;
+
+% Boson wiggles
+boson_wiggles := 4; %this must be an even number
+boson_wiggles_loop_small := 4;
+boson_wiggles_loop_normal := 6;
+boson_wiggles_loop_large := 8;
+
+% We want the roman digits from the corresponding cmr font, and that's
+% all. Therefore, we don't want to obey the `generate' command in
+% cmr??.mf. To do this, we read in cmbase, and then set generate to
+% gobble its argument.
+def gobble primary g=enddef; % gobbles its argument
+input cmbase; % Read it explicitly, rather than
+ % implicitly within cmr10
+let generate=gobble;
+input cmr10; % ...but miss out the `generate roman'
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% To business....
+
+input feyn;
+
+end
diff --git a/fonts/feyn/feyn11.mf b/fonts/feyn/feyn11.mf
new file mode 100644
index 0000000000..14a593cd5a
--- /dev/null
+++ b/fonts/feyn/feyn11.mf
@@ -0,0 +1,47 @@
+% Feynman diagram font, 11pt display size, release 0.4.1, 2017 November 03.
+%
+% This software is copyright 1991, 1994, 2001-2, 2005, 2008-17, Norman Gray.
+% Mercurial revision 558acb5f2e14, 2017-11-03 14:43 +0000, tag 0.4.1 + 0
+
+font_identifier "FEYN"; font_size 11pt#;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% First the base size
+
+module# := 11pt#;
+
+% phfudge is ... what?!
+phfudge# := 0pt#; % must be, for \Diagram macro
+
+linewidth# := 0.85pt#; % pen width
+thinlinewidth# := 0.55pt#; % thin pen
+bigarrow# := 6.5pt#; % size of arrows
+littlearrow# := 4.5pt#;
+blobr# := 7pt#; % radius of blobs and crosses
+
+on_math_axis := 1;
+
+% Boson wiggles
+boson_wiggles := 4; %this must be an even number
+boson_wiggles_loop_small := 4;
+boson_wiggles_loop_normal := 6;
+boson_wiggles_loop_large := 8;
+
+% We want the roman digits from the corresponding cmr font, and that's
+% all. Therefore, we don't want to obey the `generate' command in
+% cmr??.mf. To do this, we read in cmbase, and then set generate to
+% gobble its argument.
+def gobble primary g=enddef; % gobbles its argument
+input cmbase; % Read it explicitly, rather than
+ % implicitly within cmr10
+let generate=gobble;
+input cmr11; % ...but miss out the `generate roman'
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% To business....
+
+input feyn;
+
+end
diff --git a/fonts/feyn/feyn12.mf b/fonts/feyn/feyn12.mf
new file mode 100644
index 0000000000..eb8ea8864e
--- /dev/null
+++ b/fonts/feyn/feyn12.mf
@@ -0,0 +1,47 @@
+% Feynman diagram font, 12pt display size, release 0.4.1, 2017 November 03.
+%
+% This software is copyright 1991, 1994, 2001-2, 2005, 2008-17, Norman Gray.
+% Mercurial revision 558acb5f2e14, 2017-11-03 14:43 +0000, tag 0.4.1 + 0
+
+font_identifier "FEYN"; font_size 12pt#;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% First the base size
+
+module# := 12pt#;
+
+% phfudge is ... what?!
+phfudge# := 0pt#; % must be, for \Diagram macro
+
+linewidth# := 0.9pt#; % pen width
+thinlinewidth# := 0.6pt#; % thin pen
+bigarrow# := 7pt#; % size of arrows
+littlearrow# := 5pt#;
+blobr# := 7.5pt#; % radius of blobs and crosses
+
+on_math_axis := 1;
+
+% Boson wiggles
+boson_wiggles := 4; %this must be an even number
+boson_wiggles_loop_small := 4;
+boson_wiggles_loop_normal := 6;
+boson_wiggles_loop_large := 8;
+
+% We want the roman digits from the corresponding cmr font, and that's
+% all. Therefore, we don't want to obey the `generate' command in
+% cmr??.mf. To do this, we read in cmbase, and then set generate to
+% gobble its argument.
+def gobble primary g=enddef; % gobbles its argument
+input cmbase; % Read it explicitly, rather than
+ % implicitly within cmr10
+let generate=gobble;
+input cmr12; % ...but miss out the `generate roman'
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% To business....
+
+input feyn;
+
+end
diff --git a/fonts/feyn/feyn18.mf b/fonts/feyn/feyn18.mf
new file mode 100644
index 0000000000..360e822304
--- /dev/null
+++ b/fonts/feyn/feyn18.mf
@@ -0,0 +1,47 @@
+% Feynman diagram font, 18pt display size, release 0.4.1, 2017 November 03.
+%
+% This software is copyright 1991, 1994, 2001-2, 2005, 2008-17, Norman Gray.
+% Mercurial revision 558acb5f2e14, 2017-11-03 14:43 +0000, tag 0.4.1 + 0
+
+font_identifier "FEYN"; font_size 18pt#;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% First the base size
+
+module# := 18pt#;
+
+% phfudge is ... what?!
+phfudge# := 0pt#; % must be, for \Diagram macro
+
+linewidth# := 1.5pt#; % pen width
+thinlinewidth# := 0.75pt#; % thin pen
+bigarrow# := 9pt#; % size of arrows
+littlearrow# := 6pt#;
+blobr# := 10pt#; % radius of blobs and crosses
+
+on_math_axis := 1;
+
+% Boson wiggles
+boson_wiggles := 4; %this must be an even number
+boson_wiggles_loop_small := 4;
+boson_wiggles_loop_normal := 6;
+boson_wiggles_loop_large := 8;
+
+% We want the roman digits from the corresponding cmr font, and that's
+% all. Therefore, we don't want to obey the `generate' command in
+% cmr??.mf. To do this, we read in cmbase, and then set generate to
+% gobble its argument.
+def gobble primary g=enddef; % gobbles its argument
+input cmbase; % Read it explicitly, rather than
+ % implicitly within cmr10
+let generate=gobble;
+input cmr10; % ...but miss out the `generate roman'
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% To business....
+
+input feyn;
+
+end
diff --git a/fonts/feyn/feyn24.mf b/fonts/feyn/feyn24.mf
new file mode 100644
index 0000000000..fae595c974
--- /dev/null
+++ b/fonts/feyn/feyn24.mf
@@ -0,0 +1,47 @@
+% Feynman diagram font, 24pt display size, release 0.4.1, 2017 November 03.
+%
+% This software is copyright 1991, 1994, 2001-2, 2005, 2008-17, Norman Gray.
+% Mercurial revision 558acb5f2e14, 2017-11-03 14:43 +0000, tag 0.4.1 + 0
+
+font_identifier "FEYN"; font_size 24pt#;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% First the base size
+
+module# := 24pt#;
+
+% phfudge is ... what?!
+phfudge# := 0pt#; % must be, for \Diagram macro
+
+linewidth# := 2.25pt#; % pen width
+thinlinewidth# := 1.5pt#; % thin pen
+bigarrow# := 9pt#; % size of arrows
+littlearrow# := 12pt#;
+blobr# := 20pt#; % radius of blobs and crosses
+
+on_math_axis := 1;
+
+% Boson wiggles
+boson_wiggles := 4; %this must be an even number
+boson_wiggles_loop_small := 4;
+boson_wiggles_loop_normal := 6;
+boson_wiggles_loop_large := 8;
+
+% We want the roman digits from the corresponding cmr font, and that's
+% all. Therefore, we don't want to obey the `generate' command in
+% cmr??.mf. To do this, we read in cmbase, and then set generate to
+% gobble its argument.
+def gobble primary g=enddef; % gobbles its argument
+input cmbase; % Read it explicitly, rather than
+ % implicitly within cmr10
+let generate=gobble;
+input cmr10; % ...but miss out the `generate roman'
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% To business....
+
+input feyn;
+
+end
diff --git a/fonts/feyn/feynmac.mf b/fonts/feyn/feynmac.mf
new file mode 100644
index 0000000000..c99ac3a888
--- /dev/null
+++ b/fonts/feyn/feynmac.mf
@@ -0,0 +1,141 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Macros to support feyn.mf
+% Release 0.4.1, 2017 November 03
+
+
+def looselink = ..tension 0.75.. enddef;
+def pen = pickup diagram_pen enddef;
+
+numeric nn;
+def dirlooselink(expr point,rtn) =
+ looselink{(-point) rotated (90-rtn)}point enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Draw three related characters, one plain, one with an right-pointing
+% arrow, and one with a left-pointing one, at basechar, basechar-0x20 and
+% basechar-0x60.
+def threechars(expr basechar, name, cp, apoint, wsharp, hsharp, dsharp, anudge, apos) =
+ % basechar : the charcode of the character in the lowercase range
+ % name : the name of the character
+ % cp : the path to be drawn
+ % apoint : the point along the path where arrow and annotation are to go
+ % wsharp, hsharp, dsharp : the sharped dimensions of the character
+ % anudge : if a pair, the offset from (point apoint of cp) where
+ % the annotation is to go (usually numeric 0, indicating
+ % no offset)
+ % apos : one of the apos arguments to annotate_at
+ beginchar (basechar, wsharp, hsharp, dsharp);
+ name;
+ pen;
+ draw cp;
+ annotate_at(point apoint of cp if (pair anudge): shifted anudge fi,
+ apos);
+ endchar;
+ beginchar (byte basechar-hex"20", wsharp, hsharp, dsharp);
+ "r-arrowed " & name;
+ pen;
+ draw cp;
+ drawarrow (littlearrow,
+ point apoint of cp,
+ angle(direction apoint of cp));
+ annotate_at(point apoint of cp if (pair anudge): shifted anudge fi,
+ apos);
+ endchar;
+ beginchar (byte basechar-hex"60", wsharp, hsharp, dsharp);
+ "l-arrowed " & name;
+ pen;
+ draw cp;
+ drawarrow (littlearrow,
+ point apoint of cp,
+ angle(direction apoint of cp) + 180);
+ annotate_at(point apoint of cp if (pair anudge): shifted anudge fi,
+ apos);
+ endchar;
+enddef;
+
+
+% Writes on the log file a string consisting of
+% annotate charcode xofs yofs apos
+% where charcode is the current character code, and xofs and yofs are the
+% positions of the given point, relative to the reference point, in units
+% of the font module. The string apos is one of top, bot, urt, ulft, lrt,
+% llft, to indicate where the annotation is to sit, relative to the
+% indicated position.
+%
+% Must be called within beginchar()...endchar;
+def annotate_at (expr p, apos) =
+ message "annotate " & decimal charcode & " " &
+ decimal (xpart p/module) & " " & decimal (ypart p/module) & " "
+ & apos & " ";
+enddef;
+
+% Draw an arrow.
+def drawarrow (expr size, pos, ang) =
+ % size : the scale of the arrow
+ % pos : the position of the arrow, relative to the reference point
+ % ang : the direction in which the arrow points
+ begingroup
+ pair t[];
+ y0 = y1 = y4 = 0;
+ x1 = -4x4 = -2x2 = size;
+
+ x2 = x3 = x0;
+ y2 - y0 = y0 - y3 = size/2;
+
+ forsuffixes s = 1,2,3,4 :
+ t[s] := z[s] rotated ang shifted pos;
+ endfor;
+ fill t4--t2--t1--t3--cycle;
+
+ endgroup
+enddef;
+
+def garrow (expr code, ang, onaxis) =
+ numeric localarrowsize;
+% if onaxis = 1 :
+% localarrowsize := bigarrow;
+% else :
+ localarrowsize := littlearrow;
+% fi
+
+ beginchar (code, 0, 0, 0); "garrow";
+ drawarrow (localarrowsize, (0, onaxis*a), ang);
+ endchar;
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Error character.
+%
+% The parameter ht is the nominal height of the character.
+def errorchar (expr ht) =
+ begingroup
+ numeric rad,npetals,ilowest;
+ pair cent;
+ cent=(0,2ht/3); % centre of the flower
+ rad=ht/6; % radius of the inner points
+ npetals=5; % number of petals
+ pickup pencircle scaled (thinlinewidth); % thin line
+ z0 = cent shifted (rad,0);
+ for i=1 upto npetals-1:
+ z[i] = z0 rotatedabout (cent, i*360/npetals);
+ endfor
+ draw z0{dir 0}
+ for i=1 upto npetals-1:
+ .. tension 0.75 ..{dir (i*360/npetals+180)}z[i]{dir (i*360/npetals)}
+ endfor
+ ..{dir 180}z0;
+ ilowest := 0;
+ for i=1 upto npetals-1:
+ if y[i] <= y[ilowest]: ilowest := i; fi
+ endfor
+ draw z[ilowest]{dir (ilowest*360/npetals)}..origin;
+ pair leafend;
+ xpart(leafend) = 3rad; % want something like currentpicture.rt;
+ ypart(leafend) = 2y[ilowest]/3;
+ draw origin{dir 60} .. leafend;
+ draw leafend .. {dir 180}origin;
+ endgroup
+enddef;
diff --git a/fonts/feyn/feyntext10.mf b/fonts/feyn/feyntext10.mf
new file mode 100644
index 0000000000..08a0db7b79
--- /dev/null
+++ b/fonts/feyn/feyntext10.mf
@@ -0,0 +1,47 @@
+% Feynman diagram font, 10pt text size, release 0.4.1, 2017 November 03.
+%
+% This software is copyright 1991, 1994, 2001-2, 2005, 2008-17, Norman Gray.
+% Mercurial revision 558acb5f2e14, 2017-11-03 14:43 +0000, tag 0.4.1 + 0
+
+font_identifier "FEYN"; font_size 10pt#;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% First the base size
+
+module# := 5pt#;
+
+% phfudge is ... what?!
+phfudge# := 0pt#; % must be, for \Diagram macro
+
+linewidth# := 0.5pt#; % pen width
+thinlinewidth# := 0.3pt#; % thin pen
+bigarrow# := 4pt#; % size of arrows
+littlearrow# := 3pt#;
+blobr# := 3.5pt#; % radius of blobs and crosses
+
+on_math_axis := 0;
+
+% Boson wiggles
+boson_wiggles := 4; %this must be an even number
+boson_wiggles_loop_small := 4;
+boson_wiggles_loop_normal := 6;
+boson_wiggles_loop_large := 8;
+
+% We want the roman digits from the corresponding cmr font, and that's
+% all. Therefore, we don't want to obey the `generate' command in
+% cmr??.mf. To do this, we read in cmbase, and then set generate to
+% gobble its argument.
+def gobble primary g=enddef; % gobbles its argument
+input cmbase; % Read it explicitly, rather than
+ % implicitly within cmr10
+let generate=gobble;
+input cmr10; % ...but miss out the `generate roman'
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% To business....
+
+input feyn;
+
+end
diff --git a/fonts/feyn/feyntext11.mf b/fonts/feyn/feyntext11.mf
new file mode 100644
index 0000000000..7280b4f633
--- /dev/null
+++ b/fonts/feyn/feyntext11.mf
@@ -0,0 +1,47 @@
+% Feynman diagram font, 11pt text size, release 0.4.1, 2017 November 03.
+%
+% This software is copyright 1991, 1994, 2001-2, 2005, 2008-17, Norman Gray.
+% Mercurial revision 558acb5f2e14, 2017-11-03 14:43 +0000, tag 0.4.1 + 0
+
+font_identifier "FEYN"; font_size 11pt#;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% First the base size
+
+module# := 5.5pt#;
+
+% phfudge is ... what?!
+phfudge# := 0pt#; % must be, for \Diagram macro
+
+linewidth# := 0.5pt#; % pen width
+thinlinewidth# := 0.4pt#; % thin pen
+bigarrow# := 4.5pt#; % size of arrows
+littlearrow# := 3.5pt#;
+blobr# := 3.5pt#; % radius of blobs and crosses
+
+on_math_axis := 0;
+
+% Boson wiggles
+boson_wiggles := 4; %this must be an even number
+boson_wiggles_loop_small := 4;
+boson_wiggles_loop_normal := 6;
+boson_wiggles_loop_large := 8;
+
+% We want the roman digits from the corresponding cmr font, and that's
+% all. Therefore, we don't want to obey the `generate' command in
+% cmr??.mf. To do this, we read in cmbase, and then set generate to
+% gobble its argument.
+def gobble primary g=enddef; % gobbles its argument
+input cmbase; % Read it explicitly, rather than
+ % implicitly within cmr10
+let generate=gobble;
+input cmr11; % ...but miss out the `generate roman'
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% To business....
+
+input feyn;
+
+end
diff --git a/fonts/feyn/feyntext12.mf b/fonts/feyn/feyntext12.mf
new file mode 100644
index 0000000000..1abf5cbe87
--- /dev/null
+++ b/fonts/feyn/feyntext12.mf
@@ -0,0 +1,47 @@
+% Feynman diagram font, 12pt text size, release 0.4.1, 2017 November 03.
+%
+% This software is copyright 1991, 1994, 2001-2, 2005, 2008-17, Norman Gray.
+% Mercurial revision 558acb5f2e14, 2017-11-03 14:43 +0000, tag 0.4.1 + 0
+
+font_identifier "FEYN"; font_size 12pt#;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% First the base size
+
+module# := 6pt#;
+
+% phfudge is ... what?!
+phfudge# := 0pt#; % must be, for \Diagram macro
+
+linewidth# := 0.55pt#; % pen width
+thinlinewidth# := 0.45pt#; % thin pen
+bigarrow# := 5pt#; % size of arrows
+littlearrow# := 4pt#;
+blobr# := 4pt#; % radius of blobs and crosses
+
+on_math_axis := 0;
+
+% Boson wiggles
+boson_wiggles := 4; %this must be an even number
+boson_wiggles_loop_small := 4;
+boson_wiggles_loop_normal := 6;
+boson_wiggles_loop_large := 8;
+
+% We want the roman digits from the corresponding cmr font, and that's
+% all. Therefore, we don't want to obey the `generate' command in
+% cmr??.mf. To do this, we read in cmbase, and then set generate to
+% gobble its argument.
+def gobble primary g=enddef; % gobbles its argument
+input cmbase; % Read it explicitly, rather than
+ % implicitly within cmr10
+let generate=gobble;
+input cmr12; % ...but miss out the `generate roman'
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% To business....
+
+input feyn;
+
+end
diff --git a/fonts/feyn/feyntext18.mf b/fonts/feyn/feyntext18.mf
new file mode 100644
index 0000000000..5798fe7c92
--- /dev/null
+++ b/fonts/feyn/feyntext18.mf
@@ -0,0 +1,47 @@
+% Feynman diagram font, 18pt text size, release 0.4.1, 2017 November 03.
+%
+% This software is copyright 1991, 1994, 2001-2, 2005, 2008-17, Norman Gray.
+% Mercurial revision 558acb5f2e14, 2017-11-03 14:43 +0000, tag 0.4.1 + 0
+
+font_identifier "FEYN"; font_size 18pt#;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% First the base size
+
+module# := 10pt#;
+
+% phfudge is ... what?!
+phfudge# := 0pt#; % must be, for \Diagram macro
+
+linewidth# := 1.0pt#; % pen width
+thinlinewidth# := 0.8pt#; % thin pen
+bigarrow# := 8pt#; % size of arrows
+littlearrow# := 6pt#;
+blobr# := 7pt#; % radius of blobs and crosses
+
+on_math_axis := 0;
+
+% Boson wiggles
+boson_wiggles := 4; %this must be an even number
+boson_wiggles_loop_small := 4;
+boson_wiggles_loop_normal := 6;
+boson_wiggles_loop_large := 8;
+
+% We want the roman digits from the corresponding cmr font, and that's
+% all. Therefore, we don't want to obey the `generate' command in
+% cmr??.mf. To do this, we read in cmbase, and then set generate to
+% gobble its argument.
+def gobble primary g=enddef; % gobbles its argument
+input cmbase; % Read it explicitly, rather than
+ % implicitly within cmr10
+let generate=gobble;
+input cmr10; % ...but miss out the `generate roman'
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% To business....
+
+input feyn;
+
+end
diff --git a/fonts/feyn/feyntext24.mf b/fonts/feyn/feyntext24.mf
new file mode 100644
index 0000000000..9933f42804
--- /dev/null
+++ b/fonts/feyn/feyntext24.mf
@@ -0,0 +1,47 @@
+% Feynman diagram font, 24pt text size, release 0.4.1, 2017 November 03.
+%
+% This software is copyright 1991, 1994, 2001-2, 2005, 2008-17, Norman Gray.
+% Mercurial revision 558acb5f2e14, 2017-11-03 14:43 +0000, tag 0.4.1 + 0
+
+font_identifier "FEYN"; font_size 24pt#;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% First the base size
+
+module# := 15pt#;
+
+% phfudge is ... what?!
+phfudge# := 0pt#; % must be, for \Diagram macro
+
+linewidth# := 1.5pt#; % pen width
+thinlinewidth# := 1.2pt#; % thin pen
+bigarrow# := 12pt#; % size of arrows
+littlearrow# := 9pt#;
+blobr# := 11pt#; % radius of blobs and crosses
+
+on_math_axis := 0;
+
+% Boson wiggles
+boson_wiggles := 4; %this must be an even number
+boson_wiggles_loop_small := 4;
+boson_wiggles_loop_normal := 6;
+boson_wiggles_loop_large := 8;
+
+% We want the roman digits from the corresponding cmr font, and that's
+% all. Therefore, we don't want to obey the `generate' command in
+% cmr??.mf. To do this, we read in cmbase, and then set generate to
+% gobble its argument.
+def gobble primary g=enddef; % gobbles its argument
+input cmbase; % Read it explicitly, rather than
+ % implicitly within cmr10
+let generate=gobble;
+input cmr10; % ...but miss out the `generate roman'
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% To business....
+
+input feyn;
+
+end
diff --git a/fonts/feyn/feynx10.mf b/fonts/feyn/feynx10.mf
new file mode 100644
index 0000000000..2cfbe3d94d
--- /dev/null
+++ b/fonts/feyn/feynx10.mf
@@ -0,0 +1,47 @@
+% Feynman diagram font, 10pt extended size, release 0.4.1, 2017 November 03.
+%
+% This software is copyright 1991, 1994, 2001-2, 2005, 2008-17, Norman Gray.
+% Mercurial revision 558acb5f2e14, 2017-11-03 14:43 +0000, tag 0.4.1 + 0
+
+font_identifier "FEYNX"; font_size 10pt#;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% First the base size
+
+module# := 17.5pt#; % 175% of 10pt
+
+% phfudge is ... what?!
+phfudge# := 0pt#; % must be, for \Diagram macro
+
+linewidth# := 0.75pt#; % pen width
+thinlinewidth# := 0.5pt#; % thin pen
+bigarrow# := 6pt#; % size of arrows
+littlearrow# := 4pt#;
+blobr# := 6.5pt#; % radius of blobs and crosses
+
+on_math_axis := 1;
+
+% Boson wiggles
+boson_wiggles := 8; %this must be an even number
+boson_wiggles_loop_small := 6;
+boson_wiggles_loop_normal := 8;
+boson_wiggles_loop_large := 12;
+
+% We want the roman digits from the corresponding cmr font, and that's
+% all. Therefore, we don't want to obey the `generate' command in
+% cmr??.mf. To do this, we read in cmbase, and then set generate to
+% gobble its argument.
+def gobble primary g=enddef; % gobbles its argument
+input cmbase; % Read it explicitly, rather than
+ % implicitly within cmr10
+let generate=gobble;
+input cmr10; % ...but miss out the `generate roman'
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% To business....
+
+input feyn;
+
+end
diff --git a/fonts/feyn/feynx11.mf b/fonts/feyn/feynx11.mf
new file mode 100644
index 0000000000..4e789fea9d
--- /dev/null
+++ b/fonts/feyn/feynx11.mf
@@ -0,0 +1,47 @@
+% Feynman diagram font, 11pt extended size, release 0.4.1, 2017 November 03.
+%
+% This software is copyright 1991, 1994, 2001-2, 2005, 2008-17, Norman Gray.
+% Mercurial revision 558acb5f2e14, 2017-11-03 14:43 +0000, tag 0.4.1 + 0
+
+font_identifier "FEYNX"; font_size 11pt#;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% First the base size
+
+module# := 19.25pt#; % 175% of 11pt
+
+% phfudge is ... what?!
+phfudge# := 0pt#; % must be, for \Diagram macro
+
+linewidth# := 0.85pt#; % pen width
+thinlinewidth# := 0.55pt#; % thin pen
+bigarrow# := 6.5pt#; % size of arrows
+littlearrow# := 4.5pt#;
+blobr# := 7pt#; % radius of blobs and crosses
+
+on_math_axis := 1;
+
+% Boson wiggles
+boson_wiggles := 8; %this must be an even number
+boson_wiggles_loop_small := 6;
+boson_wiggles_loop_normal := 8;
+boson_wiggles_loop_large := 12;
+
+% We want the roman digits from the corresponding cmr font, and that's
+% all. Therefore, we don't want to obey the `generate' command in
+% cmr??.mf. To do this, we read in cmbase, and then set generate to
+% gobble its argument.
+def gobble primary g=enddef; % gobbles its argument
+input cmbase; % Read it explicitly, rather than
+ % implicitly within cmr10
+let generate=gobble;
+input cmr11; % ...but miss out the `generate roman'
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% To business....
+
+input feyn;
+
+end
diff --git a/fonts/feyn/feynx12.mf b/fonts/feyn/feynx12.mf
new file mode 100644
index 0000000000..ff77747b94
--- /dev/null
+++ b/fonts/feyn/feynx12.mf
@@ -0,0 +1,47 @@
+% Feynman diagram font, 12pt extended size, release 0.4.1, 2017 November 03.
+%
+% This software is copyright 1991, 1994, 2001-2, 2005, 2008-17, Norman Gray.
+% Mercurial revision 558acb5f2e14, 2017-11-03 14:43 +0000, tag 0.4.1 + 0
+
+font_identifier "FEYNX"; font_size 12pt#;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% First the base size
+
+module# := 21pt#; % 175% * 12pt
+
+% phfudge is ... what?!
+phfudge# := 0pt#; % must be, for \Diagram macro
+
+linewidth# := 0.9pt#; % pen width
+thinlinewidth# := 0.6pt#; % thin pen
+bigarrow# := 7pt#; % size of arrows
+littlearrow# := 5pt#;
+blobr# := 7.5pt#; % radius of blobs and crosses
+
+on_math_axis := 1;
+
+% Boson wiggles
+boson_wiggles := 8; %this must be an even number
+boson_wiggles_loop_small := 6;
+boson_wiggles_loop_normal := 8;
+boson_wiggles_loop_large := 12;
+
+% We want the roman digits from the corresponding cmr font, and that's
+% all. Therefore, we don't want to obey the `generate' command in
+% cmr??.mf. To do this, we read in cmbase, and then set generate to
+% gobble its argument.
+def gobble primary g=enddef; % gobbles its argument
+input cmbase; % Read it explicitly, rather than
+ % implicitly within cmr10
+let generate=gobble;
+input cmr12; % ...but miss out the `generate roman'
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% To business....
+
+input feyn;
+
+end
diff --git a/fonts/feyn/feynx18.mf b/fonts/feyn/feynx18.mf
new file mode 100644
index 0000000000..ae282a3d22
--- /dev/null
+++ b/fonts/feyn/feynx18.mf
@@ -0,0 +1,47 @@
+% Feynman diagram font, 18pt extended size, release 0.4.1, 2017 November 03.
+%
+% This software is copyright 1991, 1994, 2001-2, 2005, 2008-17, Norman Gray.
+% Mercurial revision 558acb5f2e14, 2017-11-03 14:43 +0000, tag 0.4.1 + 0
+
+font_identifier "FEYNX"; font_size 18pt#;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% First the base size
+
+module# := 31.5pt#; % 175% of 18pt
+
+% phfudge is ... what?!
+phfudge# := 0pt#; % must be, for \Diagram macro
+
+linewidth# := 1.5pt#; % pen width
+thinlinewidth# := 0.75pt#; % thin pen
+bigarrow# := 9pt#; % size of arrows
+littlearrow# := 6pt#;
+blobr# := 10pt#; % radius of blobs and crosses
+
+on_math_axis := 1;
+
+% Boson wiggles
+boson_wiggles := 8; %this must be an even number
+boson_wiggles_loop_small := 6;
+boson_wiggles_loop_normal := 8;
+boson_wiggles_loop_large := 12;
+
+% We want the roman digits from the corresponding cmr font, and that's
+% all. Therefore, we don't want to obey the `generate' command in
+% cmr??.mf. To do this, we read in cmbase, and then set generate to
+% gobble its argument.
+def gobble primary g=enddef; % gobbles its argument
+input cmbase; % Read it explicitly, rather than
+ % implicitly within cmr10
+let generate=gobble;
+input cmr10; % ...but miss out the `generate roman'
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% To business....
+
+input feyn;
+
+end
diff --git a/fonts/feyn/feynx24.mf b/fonts/feyn/feynx24.mf
new file mode 100644
index 0000000000..4279e99113
--- /dev/null
+++ b/fonts/feyn/feynx24.mf
@@ -0,0 +1,47 @@
+% Feynman diagram font, 24pt extended size, release 0.4.1, 2017 November 03.
+%
+% This software is copyright 1991, 1994, 2001-2, 2005, 2008-17, Norman Gray.
+% Mercurial revision 558acb5f2e14, 2017-11-03 14:43 +0000, tag 0.4.1 + 0
+
+font_identifier "FEYNX"; font_size 24pt#;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% First the base size
+
+module# := 42pt#; % 175% of 24pt
+
+% phfudge is ... what?!
+phfudge# := 0pt#; % must be, for \Diagram macro
+
+linewidth# := 2.25pt#; % pen width
+thinlinewidth# := 1.5pt#; % thin pen
+bigarrow# := 9pt#; % size of arrows
+littlearrow# := 12pt#;
+blobr# := 20pt#; % radius of blobs and crosses
+
+on_math_axis := 1;
+
+% Boson wiggles
+boson_wiggles := 8; %this must be an even number
+boson_wiggles_loop_small := 6;
+boson_wiggles_loop_normal := 8;
+boson_wiggles_loop_large := 12;
+
+% We want the roman digits from the corresponding cmr font, and that's
+% all. Therefore, we don't want to obey the `generate' command in
+% cmr??.mf. To do this, we read in cmbase, and then set generate to
+% gobble its argument.
+def gobble primary g=enddef; % gobbles its argument
+input cmbase; % Read it explicitly, rather than
+ % implicitly within cmr10
+let generate=gobble;
+input cmr10; % ...but miss out the `generate roman'
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% To business....
+
+input feyn;
+
+end
diff --git a/fonts/feyn/overheads.pdf b/fonts/feyn/overheads.pdf
new file mode 100644
index 0000000000..bd3a412975
--- /dev/null
+++ b/fonts/feyn/overheads.pdf
Binary files differ
diff --git a/fonts/feyn/overheads.tex b/fonts/feyn/overheads.tex
new file mode 100644
index 0000000000..fb4823391a
--- /dev/null
+++ b/fonts/feyn/overheads.tex
@@ -0,0 +1,28 @@
+\documentclass{beamer}
+% Quick example of overheads, using the sample beamer description at
+% http://www.miwie.org/presentations/presentations.html#beamer
+
+\usepackage{feyn}
+
+\title{Feynman diagrams}
+\author{Norman Gray\\University of Glasgow}
+\date{v0.4.1, 2017 November 03}
+
+%\parindent0pt
+
+\begin{document}
+
+\frame{\titlepage}
+
+\section{A diagram}
+\frame
+{
+Here is a text diagram $\Feyn{fglf}$, and a displayed one:
+\[
+ \Diagram{\vertexlabel^a \\ fd \\ & g\vertexlabel_{\mu,c} \\
+ \vertexlabel_b fu\\}
+ = \displaystyle
+ ig\gamma_\mu (t^c)_{ab}
+\]
+}
+\end{document}
diff --git a/fonts/feyn/release-notes.html b/fonts/feyn/release-notes.html
new file mode 100644
index 0000000000..3b0a380f72
--- /dev/null
+++ b/fonts/feyn/release-notes.html
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding='utf-8'?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>The Feyn font – release notes</title>
+<link href="http://nxg.me.uk" rev="author"/>
+<link type="text/css" rel="stylesheet" href="style.css"/>
+<style type='text/css'>
+dd ul { padding: 0pt; margin: 0pt; }
+</style>
+</head>
+
+<body>
+<h1>The Feyn font – release notes</h1>
+
+<dl>
+<!-- @CURRENT@ -->
+<dt><span class='attention'>Version 0.4.1, 2017 November 3</span></dt>
+<dd><p>The package is now licensed under the terms of the 2-clause BSD licence.</p>
+<p>The only other changes from v0.4b2 are mild documentation adjustments
+(sorry for the long delay between 0.4b2 and 0.4).</p>
+<p>Version 0.4 was not widely released.</p></dd>
+
+<dt>Version 0.4b3, 2013 April 12</dt>
+<dd><ul>
+<li>Changed <code>\below</code> to <code>\belowl</code>, and added
+companion <code>\belowr</code>.</li>
+<li>Documentation updates</li>
+</ul></dd>
+
+<dt>Version 0.4b2, 2011 April 9</dt>
+<dd><p><img class="smallimage" src="sample-phi4.png" alt="Vertex"/> As
+for version 0.4b1, but with the addition of <code>aV</code> for a
+backward arrow (rarely used, but included for consistency; thanks to
+Thomas Pruschke for the suggestion). Also added: <code>flo</code> for
+the closed fermion loop, for phi^4 theory (plus <code>floV</code> and
+<code>floA</code> for completeness; thanks to Hoang Nghia Nguyen for the suggestion;
+the font should <em>now</em> be able to produce all scalar theory
+diagrams).</p></dd>
+
+<dt>Version 0.4b1, 2010 January 23</dt>
+<dd><p>Addition of the extended-size `feynx' fonts, and the <code>\FEYN</code> macro
+(thanks to Luciano Pandola for the suggestion).</p>
+<p>Adjustments to the sizing of half-loops
+(the half-loops are now squashed, though the quarter-loops aren't).
+Added ghost loops; we can now do all the diagrams of 2-loop QCD.
+The quarter-loop gluons now taper at both ends, so that two quarter-loops
+are no longer the same as one half-loop.</p></dd>
+
+<!-- @ENDCURRENT@ -->
+
+<dt>Version 0.3.3, 2009 October 8</dt>
+<dd>Minor documentation improvements.</dd>
+
+<dt>Version 0.3.2, 2009 August 5</dt>
+<dd>Minor documentation improvements – no functional difference from 0.3.1</dd>
+
+<dt>Version 0.3.1, 2008 February 29</dt>
+<dd>No changes from 0.3b3</dd>
+
+<dt>Version 0.3b3, 2008 January 30</dt>
+<dd>This time it works properly, with the ‘globalbang’ mechanism fixed
+(thanks again to Bryan Chen’s patience).</dd>
+
+<dt>Version 0.3b2, 2008 January 27</dt>
+<dd>Now works properly with amsmath package, as long as it’s loaded
+second (and the <code>{no,}globalbang</code> options have been added to force
+behaviour when necessary). Thanks to Bryan Chen for the bugreport.</dd>
+
+<dt>Version 0.3b1, 2008 January 17</dt>
+<dd>Added small fermion loops (including inverted, and arrowed); added
+a variant of the proper vertex which is all-black rather than hatched
+(both these suggestions from Bryan Chen). Some documentation improvements.</dd>
+
+<dt>Version 0.2-2, 2005 December 2</dt>
+<dd><img class="smallimage" src="sample-two-loop-annotated.png" alt="Vertex"
+/>It turned out that the <code>.dtx</code> documentation wasn’t
+generated properly when called in the not-terribly-useful
+<code>\AlsoImplementation</code> mode; fixed, and that mode is no
+longer the default.</dd>
+
+<dt>Version 0.2-1, 2005 December 2</dt>
+<dd>Doh! The new files <code>feyn18.mf</code>, <code>feyn24.mf</code>
+and their textsize counterparts were not included in the 0.2
+distribution; thanks to Purnendu Chakraborty from the Saha Institute
+for discovering this. This release also includes fixed gluon loop
+characters: they were all 1 module high before, but now have the
+correct sizes.</dd>
+
+<dt>Version 0.2, 2005 March 24</dt>
+
+<dd>Substantial restructuring. Most particularly, (almost) all of the
+propagators now have versions with arrows integrated into the
+character, and each of the characters has an ‘annotation point’
+defined, and accessed using the <code>\momentum</code> macro, or the
+‘!’ abbreviation. This makes the ‘a’ character (the arrow) largely
+redundant and the <code>\vertexlabel</code> macro rather less
+important.</dd>
+
+<dt>Version 0.1, 1991, 1994, 2001</dt>
+<dd><img class="smallimage" src="sample-vertex.png" alt="Vertex"
+/>Initial version. The font was first produced in 1991 or so,
+first released in 1994, and tidied up and more carefully re-released
+as version 0.1 in 2001.</dd>
+</dl>
+
+</body>
+</html>
diff --git a/fonts/feyn/sample-massive.png b/fonts/feyn/sample-massive.png
new file mode 100644
index 0000000000..815d432cb7
--- /dev/null
+++ b/fonts/feyn/sample-massive.png
Binary files differ
diff --git a/fonts/feyn/sample-phi4.png b/fonts/feyn/sample-phi4.png
new file mode 100644
index 0000000000..713ea241bd
--- /dev/null
+++ b/fonts/feyn/sample-phi4.png
Binary files differ
diff --git a/fonts/feyn/sample-two-loop-annotated.png b/fonts/feyn/sample-two-loop-annotated.png
new file mode 100644
index 0000000000..1ec01333fd
--- /dev/null
+++ b/fonts/feyn/sample-two-loop-annotated.png
Binary files differ
diff --git a/fonts/feyn/sample-two-loop.png b/fonts/feyn/sample-two-loop.png
new file mode 100644
index 0000000000..b84b3d875e
--- /dev/null
+++ b/fonts/feyn/sample-two-loop.png
Binary files differ
diff --git a/fonts/feyn/sample-vertex.png b/fonts/feyn/sample-vertex.png
new file mode 100644
index 0000000000..3fd6f6af6c
--- /dev/null
+++ b/fonts/feyn/sample-vertex.png
Binary files differ
diff --git a/fonts/feyn/style.css b/fonts/feyn/style.css
new file mode 100644
index 0000000000..f0a3150cca
--- /dev/null
+++ b/fonts/feyn/style.css
@@ -0,0 +1,268 @@
+body {
+ color: #333;
+ background: white;
+ margin-left: +30%;
+ width: 50%; /* body is 50% of screen width */
+ padding: 0.5em; /* this will make a difference if I decide to
+ have the background a different colour */
+ /* I can't decide on font: Optima's always nice, but Gill looks
+ agreeably intense. Helvetica's a decent fallback. */
+ font-family: "Helvetica Neue", Helvetica, "Gill Sans", gill, sans-serif;
+ /* font-family: Optima, "Gill Sans", gill, Helvetica, sans-serif; */
+ /* font-family: "Gill Sans", gill, Helvetica, sans-serif; */
+ /* I seem to have used 11pt at some point in the past, but this
+ is far too big -- did I ever have a reason for that, or is it
+ just due to browser changes? */
+ font-size: 10pt;
+ line-height: 150%;
+}
+
+/* adapt to wider screens */
+@media screen and (min-width: 700pt) {
+ body {
+ margin-left: 210pt;
+ width: 350pt;
+ }
+}
+
+/* The following appears not to work in Safari or Chrome
+ -- don't know why, yet.
+@media print {
+ @page :right {
+ size: auto;
+ body {
+ margin-top: 2cm;
+ margin-bottom: 3cm;
+ margin-left: 10%;
+ width: 60%;
+ margin-right: 30%;
+ color: #d33;
+ }
+ }
+ @page :left {
+ size: auto;
+ body {
+ margin-top: 2cm;
+ margin-bottom: 3cm;
+ margin-left: 30%;
+ width: 60%;
+ margin-right: 10%;
+ color: #33d;
+ }
+ }
+}
+*/
+
+div.topsidebar {
+ float: right;
+ width: 50%; /* ...of the body width (ie, 50% x 50% of screen) */
+ font-size: smaller;
+ margin-left: 1em;
+ padding-left: 1em;
+ border-left: solid thin #AAA;
+}
+
+/* On wider screens, move the sidebar out to the right hand side */
+/* This uses CSS3 media queries: http://www.w3.org/TR/css3-mediaqueries/ */
+@media screen and (min-width: 700pt) and (max-width: 850pt) {
+ body {
+ margin-left: 210pt;
+ width: 350pt; /* 50% of 700pt */
+ margin-right: auto;
+ }
+ div.topsidebar {
+ position: absolute;
+ /* I feel this size should be 595pt (350 + 210 + 0.05*700),
+ but that's clearly not right -- I don't think I understand what the -5%
+ in the h1 spec below is actually 5% of! */
+ left: 570pt;
+ width: auto;
+ margin-left: 0pt;
+ padding-left: 0pt;
+ border: none;
+ }
+}
+/* On still-wider screens, expand the left-margin, keeping the sidebar attached to the right-hand edge.
+ When the screen is 850pt wide (expanding from the @media case above),
+ the left margin will be 210pt, the width 350pt, and the right margin therefore 290pt.*/
+@media screen and (min-width: 850pt) {
+ body {
+ margin-right: 290pt; /* 290 = 850-(210+350) */
+ width: 350pt;
+ margin-left: auto; /* ...takes up the slack */
+ }
+ div.topsidebar {
+ position: absolute;
+ width: 290pt; /* same 290pt as above */
+ left: auto;
+ right: 0%;
+ padding-left: 0pt;
+ border: none;
+ }
+}
+
+
+code, pre {
+ font-family: Monaco, fixed;
+ font-size: 9pt;
+}
+
+a { text-decoration: none; }
+a:link { color: #66C; }
+a:visited { color: #669; }
+a[href]:hover { background: #EEE; }
+
+div.abstract {
+ font-style: oblique;
+ text-align: left;
+}
+div.abstract em { font-style: normal; }
+div.abstract code {
+ font-style: normal;
+ font-size: 80%;
+}
+
+/* a span/div style for attracting attention */
+.attention {
+ color: #822;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #822;
+ font-weight: 100; /* few fonts have ultra-light weights */
+ line-height: 100%; /* no need to spread out titles */
+}
+
+h1 {
+ margin-left: -40%;
+ margin-right: -5%;
+ padding: 0.5em;
+ border: solid thin #666;
+ text-align: right;
+}
+
+h2 {
+ margin-left: -40%;
+ margin-right: -5%;
+ padding: 0.2em;
+ border-top: solid thin #666;
+ clear: both;
+}
+
+h2.appendices {
+ margin-top: 10ex;
+ border-top: double medium #666;
+}
+
+h3 {
+ margin-left: -30%;
+ float: left;
+ width: 25%;
+ display: block;
+ text-align: right;
+ vertical-align: bottom;
+ padding-top: 0pt;
+ padding-right: 0.5em;
+ margin-top: 0pt;
+ line-height: 120%;
+}
+
+/*
+h4 {
+ color: #C66;
+}
+*/
+
+pre, table { background: #dde; }
+
+pre {
+ padding: 1em;
+ line-height: 130%;
+}
+
+table {
+ font-size: smaller;
+}
+td {
+ padding: 0.5ex;
+}
+
+Q:before { content: "“"; }
+Q:after { content: "”"; }
+
+img.smallimage {
+ float: right;
+ margin: 24pt;
+ margin-right: -30%;
+}
+
+div.signature {
+ margin-left: -40%;
+ margin-right: -5%;
+ margin-top: 4ex;
+ text-align: right;
+ border: solid thin #666;
+ padding: 0.3em;
+ clear: both;
+}
+
+/* ============================================================
+ * Some other curiosities of my one-time formatting for web pages
+ */
+.doc-history {
+ font-size: xx-small;
+ background: #eee;
+ line-height: 100%;
+}
+
+div.subtoc, div.subsubtoc { display: none; }
+
+/* ============================================================
+ * Special formatting for ToC
+ */
+
+/*
+ If there's significant amount of text in front of the first subsection,
+ then the following are good to put in the per-document stylesheet:
+ width: 25%;
+ float: right;
+*/
+div#toc {
+ color: #888;
+ padding: 0;
+ font-size: smaller;
+ text-align: right;
+}
+div#toc a:link { color: #888; }
+div#toc > ul {
+ padding: 0pt;
+ margin: 0pt;
+ list-style: none;
+}
+div#toc li {
+ padding: 0pt;
+ display: inline-block;
+}
+div#toc li:before {
+ content: "§ ";
+ margin-left: 1em;
+}
+/* the following elements aren't currently generated by structure.lx */
+div#toc li ul {
+ padding-left: 1em;
+ margin-left: 0;
+ font-style: italic;
+ display: inline;
+}
+div#toc li ul:before {
+ content: "( ";
+}
+div#toc li ul:after {
+ content: " ) ";
+}
+div#toc li li {
+ padding-left: 0pt;
+}
+div#toc li li:after {
+ content: "; ";
+}