%% %% This is file `feynmf.mf', generated %% on <1994/7/28> with the docstrip utility (2.2h). %% %% The original source files were: %% %% feynmf.dtx (with options: `base') %% %% Copyright (C) 1989, 1990, 1992-1994 by Thorsten.Ohl@Physik.TH-Darmstadt.de %% %% This file is NOT the source for feynmf, because almost all comments %% have been stripped from it. It is NOT the preferred form of feynmf %% for making modifications to it. %% %% Therefore you can NOT redistribute and/or modify THIS file. You can %% however redistribute the complete source (feynmf.dtx and feynmf.ins) %% and/or modify it under the terms of the GNU General Public License as %% published by the Free Software Foundation; either version 2, or (at %% your option) any later version. %% %% Feynmf is distributed in the hope that it will be useful, but %% WITHOUT ANY WARRANTY; without even the implied warranty of %% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %% GNU General Public License for more details. %% %% You should have received a copy of the GNU General Public License %% along with this program; if not, write to the Free Software %% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% \CheckSum{425} %% \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 \~} %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% vardef parse_RCS (suffix RCS) (expr s) = save n, c; numeric n, RCS[]; string c; RCS[0] := 0; for n = 1 upto length (s): c := substring (n-1,n) of s; exitif ((RCS[0] > 0) and (c = " ")); if ((c = "0") or (c = "1") or (c = "2") or (c = "3") or (c = "4") or (c = "5") or (c = "6") or (c = "7") or (c = "8") or (c = "9")): if RCS[0] = 0: RCS[0] := 1; RCS[RCS[0]] := 0; fi RCS[RCS[0]] := 10 * RCS[RCS[0]] + scantokens (c); elseif c = ".": RCS[0] := RCS[0] + 1; RCS[RCS[0]] := 0; else: fi endfor enddef; vardef require_RCS_revision expr s = numeric n; save TeX_rev, mf_rev; parse_RCS (TeX_rev, s); parse_RCS (mf_rev, "1.5"); for n = 1 upto min (2, TeX_rev[0], mf_rev[0]): if TeX_rev[n] > mf_rev[n]: errhelp "Your version of `feynmf.sty' is higher that of your `feynmf.mf'."; errmessage "feynmf: Metafont macros out of date"; elseif TeX_rev[n] < mf_rev[n]: errhelp "Your version of `feynmf.mf' is higher that of your `feynmf.sty'."; errmessage "feynmf: LaTeX style out of date"; fi exitif (TeX_rev[n] <> mf_rev[n]); endfor enddef; mode_setup; thin#:=1pt#; % dimension of the lines thick#:=2thin#; arrow_width#:=3thick#; % arrows arrow_height#:=2arrow_width#; curly_len#:=3mm#; dash_len#:=3mm#; % 'photon' lines dot_len#:=2mm#; % 'photon' lines wiggly_len#:=4mm#; % 'photon' lines wiggly_slope:=60; shade_black#:=1pt#; % shading shade_white#:=2shade_black#; shade_angle:=60; define_blacker_pixels (thick, thin, shade_black, shade_white, dash_len, dot_len, wiggly_len, curly_len, arrow_height, arrow_width); LaTeX_unitlength := mm; vardef count (text list) = forsuffixes $ = list: + 1 endfor enddef; vardef getopt (suffix opt) (expr s) = numeric opt.first, opt.last, n; string opt[], opt[]arg, c; boolean argp, escape; opt.first := 0; opt.last := 0; opt[opt.last] := ""; argp := false; escape := false; for n = 1 upto length (s): c := substring (n-1,n) of s; if not escape and (c = ","): if substring (n,n+1) of s = ",": escape := true; else: opt.last := opt.last + 1; opt[opt.last] := ""; argp := false; fi elseif not argp and (c = "="): opt[opt.last]arg := ""; argp := true; elseif argp or (c <> " "): if argp: opt[opt.last]arg := opt[opt.last]arg & c; else: opt[opt.last] := opt[opt.last] & c; fi escape := false; fi endfor enddef; def save_picture text t = save t; picture t; forsuffixes p=t: p:=nullpicture; endfor enddef; def begin_sketch = begingroup save_picture currentpicture; sketchlevel := sketchlevel+1; enddef; def end_sketch = sketchlevel := sketchlevel-1; sketchpad[sketchlevel] := currentpicture; endgroup enddef; picture sketchpad[]; sketchlevel := 1; vardef use_sketch text t = addto currentpicture also (sketchpad[sketchlevel] t) enddef; vardef shade expr p_arg = save x,y,d,p,currentpen; path p; pen currentpen; % push pen! pickup pencircle scaled shade_black; p = p_arg rotated - shade_angle; % calculate enclosing rectangle x2' = x3' = xpart directionpoint up of p; % (rotated by |shade_angle|). x1' = x4' = xpart directionpoint down of p; y1' = y2' = ypart directionpoint right of p; y3' = y4' = ypart directionpoint left of p; forsuffixes $=1,2,3,4: z$ = z$' rotated shade_angle; endfor d = abs(z1-z4); % height. begin_sketch % fill rectangle with lines. for k=shade_white/d step (shade_white+shade_black)/d until 1 - shade_white/d: cutdraw k[z1,z4] -- k[z2,z3]; endfor cullit; fill p_arg; unfill z1--z2--z3--z4--cycle; cullit; end_sketch; use_sketch; enddef; vardef arrow = clearxy; % push 'em! x1 - x2 = arrow_height; y2 - y3 = arrow_width; x1 = -3x2; x2 = x3; y1 = y2 + y3 = 0; % center it! z1--z2--z3--cycle enddef; vardef cut_circles (expr diam_a, p_arg, diam_b) = subpath (xpart(p_arg intersectiontimes fullcircle scaled diam_a shifted point 0 of p_arg), xpart(p_arg intersectiontimes fullcircle scaled diam_b shifted point infinity of p_arg)) of p_arg enddef; vardef make_blob (expr z_arg, diameter) = save p,currentpen; path p; pen currentpen; pickup pencircle scaled thick; p = fullcircle scaled diameter shifted z_arg; draw p; shade p; enddef; vardef draw_blob (expr z_arg, diameter) = if sketched_blob_diameter <> diameter: % drawn lately? begin_sketch make_blob (origin, diameter); end_sketch; % redo hard work! sketched_blob_diameter:= diameter; % record it fi use_sketch shifted z_arg; % the easy way ... enddef; def force_new_blob = sketched_blob_diameter := -1; enddef; force_new_blob; % initialize it. vardef put_on_path (expr o_arg, p_arg) = fill o_arg rotated angle direction length(p_arg)/2 of p_arg shifted point length(p_arg)/2 of p_arg; p_arg enddef; vardef pixlen (expr p, n) = for k=1 upto length(p): + segment_pixlen (subpath (k-1,k) of p, n) endfor enddef; vardef segment_pixlen (expr p, n) = for k=1 upto n: + abs (point k/n of p - point (k-1)/n of p) endfor enddef; vardef wiggly (expr p_arg) = numeric wpp; wpp := ceiling (pixlen (p_arg, 10) / (wiggly_len * length(p_arg))); for k=0 upto wpp*length(p_arg) - 1: point k/wpp of p_arg {direction k/wpp of p_arg rotated wiggly_slope} .. point (k+.5)/wpp of p_arg {direction (k+.5)/wpp of p_arg rotated - wiggly_slope} .. endfor if cycle p_arg: cycle else: point infinity of p_arg fi enddef; vardef curly (expr p_arg) = numeric cpp; cpp := ceiling (pixlen (p_arg, 10) / (curly_len * length(p_arg))); if cycle p_arg: for k=0 upto cpp*length(p_arg) - 1: point (k+.33)/cpp of p_arg {direction (k+.33)/cpp of p_arg rotated 90} .. point (k-.33)/cpp of p_arg {direction (k-.33)/cpp of p_arg rotated -90} .. endfor cycle else: point 0 of p_arg {direction 0 of p_arg rotated -90} .. for k=1 upto cpp*length(p_arg) - 1: point (k+.33)/cpp of p_arg {direction (k+.33)/cpp of p_arg rotated 90} .. point (k-.33)/cpp of p_arg {direction (k-.33)/cpp of p_arg rotated -90} .. endfor point infinity of p_arg {direction infinity of p_arg rotated 90} fi enddef; vardef fermion expr path_arg = put_on_path (arrow, path_arg) enddef; vardef photon expr path_arg = wiggly (path_arg) enddef; vardef gluon expr path_arg = curly (path_arg) enddef; save vsty_hash; def style_def suffix s = vsty_hash.s := 1; expandafter quote vardef scantokens ("draw_" & str s) enddef; vardef vsty_exists suffix s = known vsty_hash.s enddef; vardef valid_style expr s = expandafter vsty_exists scantokens (s) enddef; style_def phantom expr path_arg = \ enddef; style_def plain expr p_arg = draw p_arg enddef; style_def vanilla expr p_arg = draw p_arg enddef; style_def fermion (expr p_arg) = draw fermion (p_arg) enddef; style_def quark (expr p_arg) = draw fermion (p_arg) enddef; style_def electron (expr p_arg) = draw fermion (p_arg) enddef; style_def photon (expr p_arg) = draw photon (p_arg) enddef; style_def boson (expr p_arg) = draw photon (p_arg) enddef; style_def gluon (expr p_arg) = draw gluon (p_arg) enddef; style_def dashes (expr p_arg) = numeric dpp; dpp := ceiling (pixlen (p_arg, 10) / (dash_len * length(p_arg))); for k=0 upto dpp*length(p_arg) - 1: draw point k/dpp of p_arg .. point (k+.5)/dpp of p_arg; endfor enddef; style_def scalar (expr p_arg) = draw_dashes (put_on_path (arrow, p_arg)) enddef; style_def dots (expr p_arg) = numeric dpp; dpp := ceiling (pixlen (p_arg, 10) / (dot_len * length(p_arg))); for k=0 upto dpp*length(p_arg): drawdot point k/dpp of p_arg; endfor enddef; style_def ghost (expr p_arg) = draw_dots (put_on_path (arrow, p_arg)) enddef; style_def double (expr p_arg) = begingroup pen oldpen; oldpen := currentpen; pickup oldpen scaled 3; % draw a thick linn draw p_arg; pickup oldpen; cullit; undraw p_arg; cullit; % and remove the stuffing endgroup; enddef; style_def heavy (expr p_arg) = begingroup path discard; draw_double (p_arg); discard = fermion (p_arg); endgroup enddef; tracingstats:=1; boolean vtracing; vtracing := false; % true def vinit = save vhash; numeric vlist.first, vlist.last; vlist.first := 1; vlist.last := 0; pair vlist[]loc; numeric vlist[]arc.first, vlist[]arc.last, vlist[]arc[], vlist[]arc[]tns, vlist[]arc[]lbl.dist; string vlist[]name, vlist[]lbl, vlist[]arc[]sty, vlist[]arc[]lsr, vlist[]arc[]lbl, vlist[]arc[]lbl.side; numeric vlist[]lbl.ang, vlist[]lbl.side, vlist[]blob, vlist[]dot; enddef; def vertices = vlist.first upto vlist.last enddef; def varcs (text i) = vlist[i]arc.first upto vlist[i]arc.last enddef; vardef venter suffix v = if not vexists v: vlist.last := vlist.last + 1; vhash.v := vlist.last; vlist[vhash.v]name := str v; vlist[vhash.v]loc := (whatever,whatever); vlist[vhash.v]arc.first := 1; vlist[vhash.v]arc.last := 0; vlist[vhash.v]lbl := ""; vlist[vhash.v]lbl.ang := whatever; vlist[vhash.v]lbl.dist := 3; vlist[vhash.v]blob := 0; vlist[vhash.v]dot := 0; fi enddef; vardef vexists suffix v = if known vhash.v: true else: false fi enddef; vardef vlookup suffix v = if vexists v: vhash.v else: 0 fi enddef; vardef vloc suffix v = vlist[vlookup v]loc enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% vardef vconnect (expr linesty) (text vl) = save from, nfrom, nto, nopt, sty; numeric from, nfrom, nto, nopt; string sty; getopt (opt, linesty); sty := opt[opt.first]; if known opt[opt.first]arg: message "feynmf: line styles don't take arguments. " & "Argument `" & opt[opt.first]arg & "' ignored."; fi opt.first := opt.first + 1; forsuffixes to = vl: venter to; nto := vlookup to; if known nfrom: vlist[nfrom]arc.last := vlist[nfrom]arc.last + 1; vlist[nto]arc.last := vlist[nto]arc.last + 1; vlist[nfrom]arc[vlist[nfrom]arc.last] := nto; vlist[nto]arc[vlist[nto]arc.last] := nfrom; vlist[nfrom]arc[vlist[nfrom]arc.last]tns := 1; vlist[nto]arc[vlist[nto]arc.last]tns := 1; vlist[nfrom]arc[vlist[nfrom]arc.last]lsr := "s"; vlist[nfrom]arc[vlist[nfrom]arc.last]lbl := ""; vlist[nfrom]arc[vlist[nfrom]arc.last]lbl.side := ""; vlist[nfrom]arc[vlist[nfrom]arc.last]lbl.dist := 3; for nopt = opt.first upto opt.last: if opt[nopt] = "tension": get_argument (opt[nopt], scantokens (opt[nopt]arg), vlist[nfrom]arc[vlist[nfrom]arc.last]tns); get_argument (opt[nopt], scantokens (opt[nopt]arg), vlist[nto]arc[vlist[nto]arc.last]tns); elseif opt[nopt] = "left": vlist[nfrom]arc[vlist[nfrom]arc.last]lsr := "l"; ignore_argument (opt[nopt], opt[nopt]arg); elseif opt[nopt] = "straight": vlist[nfrom]arc[vlist[nfrom]arc.last]lsr := "s"; ignore_argument (opt[nopt], opt[nopt]arg); elseif opt[nopt] = "right": vlist[nfrom]arc[vlist[nfrom]arc.last]lsr := "r"; ignore_argument (opt[nopt], opt[nopt]arg); elseif opt[nopt] = "label": get_argument (opt[nopt], opt[nopt]arg, vlist[nfrom]arc[vlist[nfrom]arc.last]lbl); elseif opt[nopt] = "side": get_argument (opt[nopt], opt[nopt]arg, vlist[nfrom]arc[vlist[nfrom]arc.last]lbl.side); elseif opt[nopt] = "dist": get_argument (opt[nopt], scantokens (opt[nopt]arg), vlist[nfrom]arc[vlist[nfrom]arc.last]lbl.dist); else: ignore_option (opt[nopt], opt[nopt]arg); fi endfor if valid_style sty: vlist[nfrom]arc[vlist[nfrom]arc.last]sty := sty; else: errhelp "feynmf: your linestyle is not recognizable, " & "check spelling and reprocess!"; errmessage "feynmf: line style `" & sty & "' not known, " & "replaced by `vanilla'"; vlist[nfrom]arc[vlist[nfrom]arc.last]sty := "vanilla"; fi vlist[nto]arc[vlist[nto]arc.last]sty := ""; fi nfrom := nto; endfor enddef; vardef get_argument (expr opt, arg) (suffix variable) = if known arg: variable := arg; else: message "feynmf: option `" & opt & "' needs an argument. Ignored."; fi enddef; vardef ignore_argument (expr opt, arg) = if known arg: message "feynmf: option `" & opt & "' doesn't take an argument. " & "Argument `" & arg & "' ignored."; fi enddef; vardef ignore_option (expr opt, arg)= if known arg: message "feynmf: ignoring option " & opt & "=" & arg & "."; else: message "feynmf: ignoring option " & opt & "."; fi enddef; vardef vcycle (expr sty) (suffix v) (expr n) = for $ = 1 upto n - 1: vconnect (sty, v[$], v[$+1]); endfor vconnect (sty, v[n], v[1]); enddef; vardef circle_left (expr a, b) = reverse halfcircle rotated angle (b - a) scaled abs (a - b) shifted .5[a, b] enddef; vardef vcircle_left (suffix a, b) = circle_left (vloc a, vloc b) = enddef; vardef circle_right (expr a, b) = halfcircle rotated angle (a - b) scaled abs (a - b) shifted .5[a, b] enddef; vardef vcircle_right (suffix a, b) = circle_right (vloc a, vloc b) = enddef; vardef vforce (expr z) (suffix v) = venter v; vlist[vlookup v]loc := z; enddef; vardef vshift (expr z) (text vl) = forsuffixes $=vl: if vexists $: vlist[vlookup $]loc := vlist[vlookup $]loc + z; fi endfor enddef; vardef vlabel (expr s) (suffix v) = venter v; vlist[vlookup v]lbl := s; enddef; vardef vvertex (expr vtxsty) (text vl) = save nopt, sty, arg; numeric nopt, arg; string sty; getopt (opt, vtxsty); sty := opt[opt.first]; if known opt[opt.first]arg: arg := scantokens (opt[opt.first]arg): else: arg := .2w; fi opt.first := opt.first + 1; forsuffixes v = vl: venter v; n := vlookup v; if sty = "blob": vlist[n]blob := arg; vlist[n]dot := 0; elseif sty = "dot": vlist[n]blob := 0; vlist[n]dot := 1; fi for nopt = opt.first upto opt.last: if opt[nopt] = "label": get_argument (opt[nopt], opt[nopt]arg, vlist[n]lbl); elseif opt[nopt] = "angle": get_argument (opt[nopt], scantokens (opt[nopt]arg), vlist[n]lbl.ang); elseif opt[nopt] = "dist": get_argument (opt[nopt], scantokens (opt[nopt]arg), vlist[n]lbl.dist); else: ignore_option (opt[nopt], opt[nopt]arg); fi endfor endfor enddef; vardef vblob (expr bd) (text vl)= forsuffixes $=vl: if not vexists $: venter $; fi vlist[vlookup $]blob := bd; vlist[vlookup $]dot := 0; endfor enddef; vardef vdot (text vl)= forsuffixes $=vl: if not vexists $: venter $; fi vlist[vlookup $]dot := 1; vlist[vlookup $]blob := 0; endfor enddef; vardef in_gallery = (.1w,0)..(0,.5h)..(.1w,h) enddef; vardef out_gallery = (.9w,0)..(w,.5h)..(.9w,h) enddef; vardef surround_gallery = superellipse ((w,.5h), (.5w,h), (0,.5h), (.5w,0), .75) enddef; vardef vincoming (text vl) = vdistribute (in_gallery, vl) enddef; vardef voutgoing (text vl) = vdistribute (out_gallery, vl) enddef; vardef vsurround (text vl) = vdistribute (surround_gallery, vl) enddef; vardef vdistribute (expr p) (text vl) = numeric numv, len, off; numv := count (vl); if cycle p: numv := numv + 1; fi len := length (p); if numv = 1: vforce (point len/2 of p, vl); else: off := 0; forsuffixes $ = vl: vforce (point off of p, $); off := off + len/(numv-1); endfor fi enddef; def vmklist (suffix v) (expr n) = for $ = 1 upto n-1: v[$], endfor v[n] enddef; vardef vincomingn (suffix v) (expr n) = vincoming (vmklist (v, n)); enddef; vardef voutgoingn (suffix v) (expr n) = voutgoing (vmklist (v, n)); enddef; vardef vsurroundn (suffix v) (expr n) = vsurround (vmklist (v, n)); enddef; vardef vdistributen (expr p) (suffix v) (expr n) = vdistribute (p, vmklist (v, n)) enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% vardef vposition = for i = vertices: if unknown vlist[i]loc: origin = origin for j = varcs (i): + vlist[i]arc[j]tns * (vlist[i]loc - vlist[vlist[i]arc[j]]loc) endfor; fi endfor if vtracing: vdump; fi enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% vardef vdraw = for i = vertices: if not known vlist[i]loc: errhelp "Your graph specification was not complete (probably a " & "lone vertex). Check logic and reprocess!"; errmessage "feynmf: vertex `" & vlist[i]name & "' not determined, " & "replaced by `(0,0)'."; vlist[i]loc := origin; fi endfor for i = vertices: for j = varcs (i): if vlist[i]arc[j]sty <> "": vdraw_arc (vlist[i]arc[j]sty, cut_circles (vlist[i]blob, if vlist[i]arc[j]lsr = "l": circle_left (vlist[i]loc, vlist[vlist[i]arc[j]]loc) elseif vlist[i]arc[j]lsr = "s": vlist[i]loc .. vlist[vlist[i]arc[j]]loc elseif vlist[i]arc[j]lsr = "r": circle_right (vlist[i]loc, vlist[vlist[i]arc[j]]loc) fi, vlist[vlist[i]arc[j]]blob), vlist[i]arc[j]lbl, vlist[i]arc[j]lbl.side, vlist[i]arc[j]lbl.dist); fi endfor; vdraw_vertex_label (vlist[i]loc, vlist[i]lbl, vlist[i]lbl.ang, vlist[i]lbl.dist); vdraw_vertex_blob (vlist[i]loc, vlist[i]blob); endfor begingroup save currentpen; pen currentpen; pickup pencircle scaled 2thick; for i = vertices: vdraw_vertex_dot (vlist[i]loc, vlist[i]dot); endfor endgroup; enddef; vardef vdraw_arc (expr sty, arc, lbl, side, dist) = scantokens ("draw_" & sty) (arc); vdraw_arc_label (arc, lbl, side, dist); enddef; vardef vdraw_arc_label (expr arc, lbl, side, d) = if lbl <> "": numeric _a; pair _z, _zz, _r; _z := point .5 length (arc) of arc; _r := direction .5 length (arc) of arc rotated - 90; if side = "left": _a := angle (-_r); elseif side = "right": _a := angle (_r); else: _zz = _z - .5[point 0 of arc, point infinity of arc]; if ((_zz/length (_zz)) dotprod _r) >= 0: _a := angle (_r); else: _a := angle (-_r); fi fi LaTeX_text (_z + d * thick * dir _a, _a, lbl); fi enddef; vardef vdraw_vertex_label (expr z, lbl, a, d) = if lbl <> "": numeric _a; if unknown a: _a := angle (z - .5(w,h)); else: _a := a; fi LaTeX_text (z + d * thick * dir _a, _a, lbl); fi enddef; vardef vdraw_vertex_blob (expr z, blob) = if blob > 0: draw_blob (z, blob); fi enddef; vardef vdraw_vertex_dot (expr z, dot) = if dot > 0: drawdot z; fi enddef; vardef LaTeX expr text = message (":" & jobname & "." & decimal charcode & ":" & text & "%%%") enddef; vardef LaTeX_text (expr z, a, txt) = LaTeX "\fmfL(" & (decimal (xpart z/LaTeX_unitlength)) & "," & (decimal (ypart z/LaTeX_unitlength)) & "," & (voctant a) & "){" & txt & "}"; enddef; vardef voctant expr a = voctant_list[floor (a/45 + .5)] enddef; string voctant_list[]; voctant_list[-4] := "r"; voctant_list[-3] := "rt"; voctant_list[-2] := "t"; voctant_list[-1] := "lt"; voctant_list[0] := "l"; voctant_list[1] := "lb"; voctant_list[2] := "b"; voctant_list[3] := "rb"; voctant_list[4] := "r"; vardef vdump = message ">>>>> Vertices and arcs for diagram #" & decimal charcode & " of " & jobname & ".mf:"; for i = vertices: message "> " & vlist[i]name & "=" & decimal_pair (vlist[i]loc) & ": #lines=" & decimal (vlist[i]arc.last - vlist[i]arc.first + 1) if vlist[i]blob <> 0: & ", blob=" & decimal_ (vlist[i]blob) fi if vlist[i]dot <> 0: & ", dot=" & decimal_ (vlist[i]dot) fi if vlist[i]lbl <> "": & ", lbl=" & vlist[i]lbl & ", angle=" & decimal_ (vlist[i]lbl.ang) & ", dist=" & decimal_ (vlist[i]lbl.dist) fi & "."; endfor for i = vertices: for j = varcs (i): if vlist[i]arc[j]sty <> "": message "> " & vlist[i]name & "*" & vlist[vlist[i]arc[j]]name & ": " & vlist[i]arc[j]sty & ", tns=" & decimal_ (vlist[i]arc[j]tns) & ", lsr=" & vlist[i]arc[j]lsr if vlist[i]arc[j]lbl <> "": & ", lbl=" & vlist[i]arc[j]lbl & ", side=" & vlist[i]arc[j]lbl.side & ", dist=" & decimal_ (vlist[i]arc[j]lbl.dist) fi & "."; fi endfor endfor enddef; vardef decimal_ (text n) = if known n: decimal n else: "?" fi enddef; vardef decimal_pair (text z) = "(" & decimal_ (xpart z) & "," & decimal_ (ypart z) & ")" enddef; endinput; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \endinput %% %% End of file `feynmf.mf'.