diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /fonts/feyn |
Initial commit
Diffstat (limited to 'fonts/feyn')
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 Binary files differnew file mode 100644 index 0000000000..0ef358242a --- /dev/null +++ b/fonts/feyn/exercise-font.pdf 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 Binary files differnew file mode 100644 index 0000000000..adc1240b72 --- /dev/null +++ b/fonts/feyn/feyn.pdf 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 Binary files differnew file mode 100644 index 0000000000..bd3a412975 --- /dev/null +++ b/fonts/feyn/overheads.pdf 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 Binary files differnew file mode 100644 index 0000000000..815d432cb7 --- /dev/null +++ b/fonts/feyn/sample-massive.png diff --git a/fonts/feyn/sample-phi4.png b/fonts/feyn/sample-phi4.png Binary files differnew file mode 100644 index 0000000000..713ea241bd --- /dev/null +++ b/fonts/feyn/sample-phi4.png diff --git a/fonts/feyn/sample-two-loop-annotated.png b/fonts/feyn/sample-two-loop-annotated.png Binary files differnew file mode 100644 index 0000000000..1ec01333fd --- /dev/null +++ b/fonts/feyn/sample-two-loop-annotated.png diff --git a/fonts/feyn/sample-two-loop.png b/fonts/feyn/sample-two-loop.png Binary files differnew file mode 100644 index 0000000000..b84b3d875e --- /dev/null +++ b/fonts/feyn/sample-two-loop.png diff --git a/fonts/feyn/sample-vertex.png b/fonts/feyn/sample-vertex.png Binary files differnew file mode 100644 index 0000000000..3fd6f6af6c --- /dev/null +++ b/fonts/feyn/sample-vertex.png 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: "; "; +} |