feynmf-1.08.orig/0000775000175000017500000000000010200030070015321 5ustar kmccartykmccarty00000000000000feynmf-1.08.orig/Announce0000664000175000017500000000214706250470140017036 0ustar kmccartykmccarty00000000000000To: ctan-ann@shsu.edu, feynmf-announce@crunch.ikp.physik.th-darmstadt.de Subject: [LaTeX/Metafont] Feynman diagrams: FeynMF v1.08 released This announces version 1.08 of feynmf, a combined LaTeX and Metafont (or Metapost) package for easy drawing of professional quality Feynman (and maybe other) diagrams. Version 1.08 is mainly a bug fix release and offers a driver script as the only new feature. The driver script is still experimental and I will be grateful for portability suggestions (it has been developed with teTeX under Linux). This software will show up through the magic of mirroring at the CTAN host near you. Enjoy, -Thorsten NEWS for Version 1.08 * Improved very short gluon and photon propagators by relaxing overly aggressive rounding. * New (still experimental) `feynmf' script automating the invocation of Metafont (requires perl(1)). /// Thorsten Ohl, TH Darmstadt, Schlossgartenstr. 9, D-64289 Darmstadt, Germany //////////////// net: ohl@crunch.ikp.physik.th-darmstadt.de, ohl@gnu.ai.mit.edu /// voice: +49-6151-16-3116, secretary: +49-6151-16-2072, fax: +49-6151-16-2421 feynmf-1.08.orig/COPYING0000664000175000017500000004307006250470140016400 0ustar kmccartykmccarty00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. feynmf-1.08.orig/Feynman.Diagrams0000664000175000017500000000016705752337340020425 0ustar kmccartykmccarty00000000000000This file is only needed to make 'quote site index feynman' work ... Have a look at the README file in this directory. feynmf-1.08.orig/Makefile0000664000175000017500000001714406250470140017010 0ustar kmccartykmccarty00000000000000# Makefile -- install feynmf. # Copyright (C) 1994,1995 Thorsten.Ohl@Physik.TH-Darmstadt.de # # Feynmf is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 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. # # $Id: Makefile,v 1.27 1996/12/02 09:20:35 ohl Exp $ # ######################################################################## VERSION = 1 RELEASE = 08 STATUS = ######################################################################## # Directories prefix = $(HOME) bindir = $(prefix)/bin mandir = $(prefix)/man/man1 texdir = $(prefix)/tex/inputs mfdir = $(prefix)/mf/inputs docdir = $(texdir)/doc # Commands INSTALL = install -c -m 755 INSTALL_DATA = install -c -m 644 # INSTALL = cp # INSTALL_DATA = cp # This has to be the new LaTeX LATEX = latex # This should be the old LaTeX LATEX209 = tex '&latex209' # This must not have the cmbase preloaded: MF = mf MP = mp MAKEINDEX = makeindex # Your local printer mode MFMODE = laserjet ######################################################################## # No user serviceable parts below: ######################################################################## RESOLVE_XREF = \ $(LATEX) $*.drv && \ while grep 'Rerun to get cross-references right\.' $*.log; \ do \ $(LATEX) $*.drv; \ done RESOLVE_XREF209 = \ $(LATEX209) $*.drv && \ while grep 'Rerun to get cross-references right\.' $*.log; \ do \ $(LATEX209) $*.drv; \ done RUN_METAFONT = \ $(MF) '\mode:=$(MFMODE); input fmfsamp1'; \ $(MF) '\mode:=$(MFMODE); input fmfsamp2'; \ $(MF) '\mode:=$(MFMODE); input fmfsamp3'; \ $(MF) '\mode:=$(MFMODE); input fmfsamp4' RUN_METAPOST = \ $(MP) fmfsamp1; \ $(MP) fmfsamp2; \ $(MP) fmfsamp3; \ $(MP) fmfsamp4; RUN_MAKEINDEX = \ $(MAKEINDEX) -s gind.ist -o $*.ind $*.idx && \ $(MAKEINDEX) -s gglo.ist -o $*.gls $*.glo MANPICS = manpics.1 manpics.2 manpics.3 all: feynmf.sty feynmf.mf feynmf.drv \ feynmp.sty feynmp.mp feynmp.drv $(MANPICS) \ feynmf.1 all209: feynmf209.sty feynmf.mf feynmf209.drv \ feynmp209.sty feynmp.mp feynmp209.drv $(MANPICS) man: fmfman.dvi man209: fmfman209.dvi quick-man: $(MAKE) man RUN_MAKEINDEX=: RESOLVE_XREF=: dvi: feynmf.dvi dvi209: feynmf209.dvi quick-dvi: $(MAKE) dvi RUN_MAKEINDEX=: RESOLVE_XREF=: bigtest: feynmf.dvi feynmp.dvi fmfman.dvi fmfmanps.dvi manual.ps bigtest209: feynmf209.dvi feynmp209.dvi fmfman209.dvi \ fmfman209ps.dvi manual209.ps install: all $(INSTALL_DATA) feynmf.mf $(mfdir) $(INSTALL_DATA) feynmp.mp $(mfdir) $(INSTALL_DATA) feynmf.sty $(texdir) $(INSTALL_DATA) feynmp.sty $(texdir) $(INSTALL_DATA) feynmf.1 $(mandir) $(INSTALL) feynmf.pl $(bindir)/feynmf install.doc: all $(INSTALL_DATA) feynmf.dtx $(docdir) $(INSTALL_DATA) feynmf.drv $(docdir) $(INSTALL_DATA) fmfman.drv $(docdir) $(INSTALL_DATA) $(MANPICS) $(docdir) uninstall: rm -f $(mfdir)/feynmf.mf rm -f $(mfdir)/feynmp.mp rm -f $(texdir)/feynmf.sty rm -f $(texdir)/feynmp.sty rm -f $(bindir)/feynmf rm -f $(mandir)/feynmf.1 uninstall.doc: rm -f $(docdir)/feynmf.dtx rm -f $(docdir)/feynmf.drv rm -f $(docdir)/fmfman.drv feynmf.sty: feynmf.dtx feynmf.ins $(LATEX) feynmf.ins feynmf209.sty: feynmf.dtx feynmf209.ins $(LATEX209) feynmf209.ins feynmf.mf feynmf.drv feynmp.sty feynmp.mp feynmp.drv \ fmfman.drv fmfmanps.drv: feynmf.sty feynmf209.drv feynmp209.sty feynmp209.drv \ fmfman209.drv fmfman209ps.drv: feynmf209.sty feynmf.dvi: feynmf.dtx feynmf.drv feynmf.sty feynmf.mf $(MANPICS) -$(LATEX) $*.drv $(RUN_METAFONT) -$(LATEX) $*.drv $(RUN_MAKEINDEX) $(RESOLVE_XREF) feynmf209.dvi: feynmf.dtx feynmf209.drv feynmf209.sty feynmf.mf $(MANPICS) -$(LATEX209) $*.drv $(RUN_METAFONT) -$(LATEX209) $*.drv $(RUN_MAKEINDEX) $(RESOLVE_XREF209) feynmp.dvi: feynmf.dtx feynmp.drv feynmp.sty feynmp.mp $(MANPICS) -$(LATEX) $*.drv $(RUN_METAPOST) -$(LATEX) $*.drv $(RUN_MAKEINDEX) $(RESOLVE_XREF) feynmp209.dvi: feynmf.dtx feynmp209.drv feynmp209.sty feynmp.mp $(MANPICS) -$(LATEX209) $*.drv $(RUN_METAPOST) -$(LATEX209) $*.drv $(RUN_MAKEINDEX) $(RESOLVE_XREF209) fmfman.dvi: feynmf.dtx fmfman.drv feynmf.sty feynmf.mf $(MANPICS) -$(LATEX) $*.drv $(RUN_METAFONT) -$(LATEX) $*.drv $(RUN_MAKEINDEX) $(RESOLVE_XREF) fmfman209.dvi: feynmf.dtx fmfman209.drv feynmf209.sty feynmf.mf $(MANPICS) -$(LATEX209) $*.drv $(RUN_METAFONT) -$(LATEX209) $*.drv $(RUN_MAKEINDEX) $(RESOLVE_XREF209) fmfmanps.dvi: feynmf.dtx fmfmanps.drv feynmp.sty feynmp.mp $(MANPICS) -$(LATEX) $*.drv $(RUN_METAPOST) -$(LATEX) $*.drv $(RUN_MAKEINDEX) $(RESOLVE_XREF) fmfman209ps.dvi: feynmf.dtx fmfman209ps.drv feynmp209.sty feynmp.mp $(MANPICS) -$(LATEX209) $*.drv $(RUN_METAPOST) -$(LATEX209) $*.drv $(RUN_MAKEINDEX) $(RESOLVE_XREF209) manual.ps.gz: manual.ps gzip < $< > $@ manual.ps: fmfmanps.dvi $(MANPICS) dvips -o $@ $< manual209.ps: fmfman209ps.dvi $(MANPICS) dvips -o $@ $< manpics.1: manpics.mp -mp $< manpics.2 manpics.3: manpics.1 feynmf.1: feynmf.pl pod2man --section 1 \ --release "FeynMF Version $(VERSION).$(RELEASE)$(STATUS)" \ --center "Contributed LaTeX Utilities" $< > $@ clean: rm -f fmfsamp?.* \ *.tfm *.*gf *.*pk \ *.log *.t[1-9] *.t[1-9][0-9] *.t[12][0-9][0-9] \ *.dvi *.aux *.toc *.ilg *.glo *.gls *.idx *.ind \ *.ps *.mpx '#*#' *~ .*~ realclean: clean rm -f feynmf.mf feynmf.sty feynmf.drv feynmp.* fmfman* \ feynmf209.sty feynmf209.drv feynmp209.* distclean: realclean ######################################################################## # Maintenance: DISTFILES = /usr/local/etc/COPYING README Makefile feynmf.dtx \ feynmf.ins feynmf209.ins manpics.mp $(MANPICS) \ feynmf.pl template.tex distdir = feynmf-$(VERSION).$(RELEASE)$(STATUS) CVSTAG = FEYNMF_$(VERSION)_$(RELEASE)$(STATUS) TEXTAG = v$(VERSION).$(RELEASE) M = fileversion: perl -pe \ 's/^\\def\\fileversion\{.*\}/\\def\\fileversion{$(TEXTAG)}/;' \ feynmf.dtx > feynmf.vtmp if cmp -s feynmf.dtx feynmf.vtmp; then \ rm -f feynmf.vtmp; \ else \ mv feynmf.vtmp feynmf.dtx; \ fi commit: fileversion @if test -n "$(M)"; then \ echo "cvs commit -m '$(M)'"; cvs commit -m '$(M)'; \ echo "cvs tag $(CVSTAG)"; cvs tag $(CVSTAG); \ echo "cvs tag -b $(CVSTAG)_"; cvs tag -b $(CVSTAG)_; \ else \ echo "usage: make commit M=''" 1>&2; \ fi dist: $(distdir).tar.gz snap: feynmf-current.tar.gz $(distdir).tar.gz: rm -fr $(distdir) $(distdir).tmp cvs export -r $(CVSTAG) -d $(distdir).tmp feynmf mkdir $(distdir) (cd ./$(distdir).tmp && \ make $(DISTFILES) && \ cp $(DISTFILES) ../$(distdir)) tar cf - $(distdir) | gzip > $@ rm -fr $(distdir) $(distdir).tmp feynmf-current.tar.gz: $(DISTFILES) fileversion rm -fr feynmf-current mkdir feynmf-current touch feynmf-current/1_THIS_IS_A_SNAPSHOT_OF_ touch feynmf-current/2_WORK_IN_PROGRESS_AND__ touch feynmf-current/3_NOT_YET_RELEASED_CODE_ cp $(DISTFILES) feynmf-current # perl -pe \ # 's/\[\\filedate/[(UNRELEASED and UNSUPPORTED snapshot)/;' \ feynmf.dtx > feynmf-current/feynmf.dtx tar cf - feynmf-current | gzip > $@ rm -fr feynmf-current ######################################################################## # Local Variables: # mode:text # End: feynmf-1.08.orig/README0000664000175000017500000001565406250470140016234 0ustar kmccartykmccarty00000000000000# $Id: README,v 1.30 1996/12/02 01:38:45 ohl Exp $ ######################################################################## This is feynmf, a combined LaTeX/Metafont package for easy drawing of professional quality Feynman diagrams. feynmf lays out most diagrams satisfactorily from the structure of the graph without any need for manual intervention. Nevertheless all the power of Metafont is available for more obscure cases. See the documentation for appetizers, examples and more details. A preformatted manual (`manual.ps.gz') is provided to wet your appetite with numerous examples. Anyway, you are invited to share, use, abuse, and improve it, see the file COPYING for details. Enjoy, -Thorsten ######################################################################## Installation: You need a recent LaTeX (LaTeX2e, as of December 1994 is sufficient) to use feynmf, docstrip.tex to install it and doc.sty to typeset the documentation. If it is not already on your system, you can get all this (and much more) from your nearest CTAN host. To install, either use the Makefile or use the installation file feynmf.ins: $ latex feynmf.ins then you can typeset the documentation by $ latex fmfman.drv $ mf '\mode:=laserjet; input fmfsamp1' $ mf '\mode:=laserjet; input fmfsamp2' $ mf '\mode:=laserjet; input fmfsamp3' $ mf '\mode:=laserjet; input fmfsamp4' $ latex fmfman.drv $ makeindex -s gind.ist -o fmfman.ind fmfman.idx $ makeindex -s gglo.ist -o fmfman.gls fmfman.glo $ latex fmfman.drv or by using the Makefile (`make man'). That's it. There is also a simple example `template.tex' that you can use as a template for your own creations. To typeset, either use the feynmf script $ feynmf template or run Metafont manually $ latex template $ mf '\mode:=localfont; input fmftempl' $ latex template Finally, there is another installation file for LaTeX 2.09 compatible versions: feynmf209.ins. This file has to be processed _in addition_ to feynmf.ins! ######################################################################## WARNING: If LaTeX fails with `Unknown graphics extension: 3', you have a slightly out-of-date graphics.sty file (LaTeX will have issued a warning in this case). There has been a change to the user interface, which makes it very hard to support both versions. Sorry. I have chosen to support the current one, which will hopefully be stable. You can work around this by either getting a more recent graphics package from CTAN (macros/latex/packages/graphics) or by using epsf.sty instead (`\let\includegraphics\epsffile\input epsf.sty'). [You can also ignore it and get the preformatted manual. But you will not be able to use the MetaPost version in this case.] ######################################################################## Comments, bug reports and improvements are welcome at: Thorsten.Ohl@Physik.TH-Darmstadt.de (aka: ohl@crunch.ikp.physik.th-darmstadt.de) New versions can be found in: crunch.ikp.physik.th-darmstadt.de:/pub/ohl/feynmf or at CTAN: {ftp.shsu.edu,ftp.tex.ac.uk,ftp.dante.de}: ... macros/latex/contrib/supported/feynmf There are two mailing lists feynmf-announce@crunch.ikp.physik.th-darmstadt.de feynmf-bugs@crunch.ikp.physik.th-darmstadt.de both are open for subscription. The former should be very low volume and carry only important announcements. The latter can serve as a more general discussion forum. To subscribe, send mail to majordomo@crunch.ikp.physik.th-darmstadt.de and NOT to the lists itself. The following commands (on a line in the body of the mail, not in the subject) are useful: `subscribe feynmf-announce', `unsubscribe feynmf-bugs', `help', etc. ######################################################################## NEWS for Version 1.08 * Improved very short gluon and photon propagators by relaxing overly aggressive rounding. * New (still experimental) `feynmf' script automating the invocation of Metafont (requires perl(1)). NEWS for Version 1.07 * Switch off I/O during the first pass in AMS-LaTeX equation environments. This avoids a nasty race condition (thanks to Axel Thimm for reporting this bug). A beneficial side effect is that it saves us 50% processing time in these cases. NEWS for Version 1.06 * New abstraction: polygons. Useful for complex vertices in non-perturbative diagrams. * New commands: \fmfpoly, \fmfpolyn and \fmfrpolyn, implementing polygons. * New option `rubout' for crossing propagators. * Some common typos are detected are appropriate warning messages are issued. * New options `errorstop', `scroll', `nonstop' and `batch' for specifying the desired interactionmode. * Work around an obscure babel/german/feynmf three way destructive interference. NEWS for Version 1.05 * FeynMF now coexists with french.sty and other packages that change the \catcode of ``:''. * Fixed a bug introduced in version 1.03, which could cause problems with font loading. Unfortunately, the fix has to give up some compatibility with earlier versions. Sources for version 1.02 and earlier which used \noexpand in labels have to upgraded or the option `pre-1.03' has to be used. Sorry. NEWS for Version 1.04 * Finally, \fmffixed{(dx,whatever)}{v1,v2} and \fmffixed{(whatever,dy)}{v1,v2} do what you would expect them to. \fmffixedx and \fmffixedy are new synonyms for those. NEWS for Version 1.03 * It is no longer necessary to protect TeX command sequences with \noexpand. Old files using \noexpand will continue to work. NEWS for Version 1.02 * Read the .tfm file before writing the .mf file destructively. This should allow a transparent two pass processing if MakeTeXTFM is enabled. Thanks to Thomas Esser for the suggestion. NEWS for Version 1.01 * new decoration shapes for vertices by popular demand: `cross' (also `triacross', `pentacross' and `hexacross'). * fixed a rounding bug in cut-off ends (noticeable as a spurious thin diagonal line at the left end of double lines). * The maximum size for shaded and hatched areas has been doubled by removing an obsolete speedup hack that was not used anymore. * In an unrelated move, shading and hatching has been reimplemented in a much more general fashion. Now arbitray tilings can be specified as argument to `decoration.filled='. The old style numerical arguments continue to work, but should be replaced by `empty', `full', `shaded', and `hatched' in new documents. ######################################################################## # Local Variables: # mode:indented-text # End: feynmf-1.08.orig/Tutorial0000664000175000017500000000114706150526540017077 0ustar kmccartykmccarty00000000000000All three parts of a tuturial on FeynMF are now available from CERN, both as PostScript and HTML files: PostScript: *********** ftp://asisftp.cern.ch/cnl/220/textproc.ps.gz [Part 1] ftp://asisftp.cern.ch/cnl/221/textproc.ps.gz [Part 2] ftp://asisftp.cern.ch/cnl/222/textproc.ps.gz [Part 3] HTML: ***** http://wwwcn1.cern.ch/cnls/220/node57.html [Part 1] http://wwwcn1.cern.ch/cnls/221/node63.html [Part 2] http://wwwcn1.cern.ch/cnls/222/node38.html [Part 3] A paper has been printed by Computer Physics Communications: T. Ohl, Comp. Phys. Comm. 90 (1995) 340-354 feynmf-1.08.orig/feynmf.dtx0000664000175000017500000077353406250470140017371 0ustar kmccartykmccarty00000000000000% \iffalse % feynmf.dtx - Feynman diagrams with METAFONT for LaTeX(2e) % Copyright (C) 1989, 1990, 1992-1996 by Thorsten.Ohl@Physik.TH-Darmstadt.de % $Id: feynmf.dtx,v 1.30 1996/12/02 09:20:36 ohl Exp $ % % Feynmf is free software; you can redistribute it and/or modify it % under the terms of the GNU General Public License as published by % the Free Software Foundation; either version 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. % % \fi % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %% \CheckSum{924} %% \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 \~} %% % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % \MakeShortVerb{\|} % % \title{% % \FMF: \\ % Drawing Feynman Diagrams \\ % with \LaTeX{} and \MF\thanks{% % This is \texttt{\filename}, version \fileversion, % revision \filerevision, date \filedate.}} % % \author{% % Thorsten Ohl\thanks{e-mail: % {\tt Thorsten.Ohl@Physik.TH-Darmstadt.de}}\\ % \hfil \\ % Technische Hochschule Darmstadt \\ % Schlo\ss gartenstr. 9 \\ % D-64289 Darmstadt \\ % Germany} % % \maketitle % \begin{abstract} % \FMF{} is a \LaTeX{} package for easy drawing of professional % quality Feynman diagrams with \MF{} (or \MP). \FMF{} lays out most % diagrams satisfactorily from the structure of the graph without % any need for manual intervention. Nevertheless all the power of % \MF{} (or \MP) is available for obscure cases. % \end{abstract} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \section*{Copying} % % \FMF{} is free software; you can redistribute it and/or modify it % under the terms of the GNU General Public License as published by % the Free Software Foundation; either version 2, or (at your option) % any later version. % % \FMF{} is distributed in the hope that it will be useful, but % \emph{without any warranty}; without even the implied warranty of % \emph{merchantability} or \emph{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. % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \newpage % \tableofcontents % \newpage % \unitlength=1mm % \def\topfraction{0.9} % \def\bottomfraction{0.9} % \def\textfraction{0.1} % \begin{fmffile}{fmfsamp1} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \section{Introduction} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Purpose and scope} % % In recent years, \TeX\footnote{\TeX{} is a trademark of the American % Mathematical Society.}~\cite{TeX} % and \LaTeX\footnote{\LaTeX{} might be a trademark of Addison Wesley % Publishing Company.}~\cite{LaTeX} % have revolutionized the way % we share information in theoretical physics (and other areas). Not % only does \TeX{} provide typographical capabilities, which transcend % those of commercial ``wordprocessors'' substantially, \TeX{} documents % are also completely portable. Since implementations are available % on essentially all computers in use in the community, documents can % be shared without the usual restrictions of proprietary data % formats. This has enabled us to collaborate on papers with % colleagues on the other side of the globe, to replace the mailing of % hard copy preprints by electronic transmission and to submit these % papers electronically to the publisher. % % This portability comes with a price, though. \TeX{} (and \LaTeX) % do not address the issue of graphical information, apart from the % rudimentary (but very useful) capabilities of the \LaTeX{} |picture| % environment and similar % packages~\cite{LaTeX-Companion}. As an de facto standard for the % inclusion of more complex graphics has emerged the inclusion of % PostScript\footnote{PostScript is a trademark of Adobe Systems % Inc.} % files. The complete document can then % be printed on any PostScript device. % % Still there are areas, where complementary approaches seem worth % pursuing. In particular this is the case, if the graphical % information is highly formalized, like the case at hand. Feynman % diagrams are specified by their topology and the type of particles % connecting the vertices. Thus a given diagram can be reproduced % from a very concise specification, if the software is able to choose % a reasonable layout (semi-)automatically. % % \MF\footnote{\MF{} is a trademark of Addison Wesley Publishing % Company.}~\cite{MF} % and \MP\footnote{John Hobby's \MP{} is a modified version of \MF{} % which generates (encapsulated) PostScript output. \MP{} can be % build trivially on top of the \texttt{web2c} version of \TeX{} and % \MF{} for UNIX. Ports to other systems should be % simple.}~\cite{MetaPost} % appear to be the perfect tool for such a purpose, since % \begin{enumerate} % \item{} \MF{} is part of any (reasonable) \TeX{} installation, thus % available to all potential users, % \item{} both have very powerful graphics primitivs, which allow high % quality output, and % \item{} both have builtin linear algebra, which allows us to choose a % layout automatically. % \end{enumerate} % Still, providing at least the basic interface in \LaTeX{} macros % seems appropriate for boosting the acceptance among the less % technically oriented parts of the audience. Thus % \FMF\footnote{\FMF{} is not anybody's trademark.}~\cite{CPC,CNL} % was conceived. % % \FMF{} is unique among packages for drawing Feynman diagrams in % \emph{combining} the following features: % \begin{itemize} % \item Simplicity and conciseness for common diagrams. E.g.~the % scattering diagram in figure~\ref{fig:simple} can be specified % \emph{completely} in five lines of \LaTeX: % \begin{verbatim} % \begin{fmfgraph*}(40,30) \fmfpen{thick} % \fmfleft{i1,i2} \fmfright{o1,o2} % \fmf{fermion}{i1,v1,o1} \fmf{fermion}{i2,v2,o2} % \fmf{photon,label=$q$}{v1,v2} \fmfdot{v1,v2} % \end{fmfgraph*} % \end{verbatim} % \begin{figure}[t] % \begin{center} % \begin{fmfgraph*}(40,30) \fmfpen{thick} % \fmfleft{i1,i2} \fmfright{o1,o2} % \fmf{fermion}{i1,v1,o1} \fmf{fermion}{i2,v2,o2} % \fmf{photon,label=$q$}{v1,v2} \fmfdot{v1,v2} % \end{fmfgraph*} % \end{center} % \caption{\label{fig:simple}Simple scattering diagram.} % \end{figure} % \item Expressiveness for complicated diagrams (see the examples % below). % \item Extensibility (e.g.~see section~\ref{sec:extensions}). % \item Arbitrary \TeX-labels. This point is more important than it % may seem at first glance because most graphical layout systems % lack the power to produce complicated mathematical expressions. % Having matching fonts in text, equations and diagrams is also an % important esthetical feature. % \end{itemize} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Relation to similar packages} % % Before we start, a couple of words about some complementary packages % on the market are in order: % \begin{itemize} % \item Michael Levine's |feynman| package~\cite{levine} is % implemented on top of the standard \LaTeX{} |picture| % environment~\cite{LaTeX}. This makes it completely portable (no % need for a correct \MF{} installation), but it requires manual % layout and the graphics output is (though very useful) less than % perfect. % \item Jos Vermaseren's |axodraw| package~\cite{axodraw} uses % |\special|s to access PostScript primitives for drawing % diagrams. This approach is inherently not portable (the % ubiquity of PostScript printers makes this a minor point, % though) but as flexible as the present one. Nevertheless, % it still requires manual layout for all diagrams. % \item Last, but not least, I have to mention Thomas Leathrum's % |mfpic|~\cite{mfpic}, which provided the inspiration for moving % \FMF's user interface from \MF{} to \TeX. It might not have % been unreasonable to design and implement \FMF{} as a package on % top of |mfpic|, but closer inspection shows that \FMF{} and % |mfpic| are fairly orthogonal. |mfpic| is most useful for % handling simple graphical building blocks in formally % unconstrained contexts. \FMF{} on the other hand excels in the % formal context of Feynman diagrams (or any other labeled graphs % for that matter), which can be drawn automatically from a % \emph{specification}. % \end{itemize} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Historical note} % % Parts of this code have a rather long history\footnote{% % Which is a partial explanation, if not excuse, for its slightly % incoherent structure.}. % Some of the drawing primitives started in 1989 as % |feynman.mf|, a library of \MF{} macros for drawing Feynman % diagrams in my thesis. The layout had to be specified completely % by hand, which required a long edit-process-preview cycle and made % |feynman.mf| awkward to use. % Nevertheless, it suited my and other's neeeds and survived for five % years without major modifications. Early in % 1994, I became aware of Thomas Leathrum's |mfpic|~\cite{mfpic}. % This inspired me to shift the user interface from \MF{} to % \LaTeX, because this allows a smoother blending of the \LaTeX{} % |picture| environment with \FMF{} for the purpose of labeling the % graphs. While doing this and after % having been taught by Tim Stelzer's and Bill Long's % \texttt{MADGRAPH}~\cite{madgraph} that simply minimizing the length % of the graph gives much better results than I had anticipated, I % added the graph manipulation and layout code. % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Architecture} % % Even though there has never been a proper design phase in the % development of \FMF, a certain structure has emerged, which is % depicted in figure~\ref{fig:arch}. A user who is aware of this % architecture should be able to use \FMF{} more effectively. % % \begin{figure}[t] % \hfuzz=3cm % \begin{center} % \leavevmode % \includegraphics{manpics.3} % \end{center} % \caption{\label{fig:arch}% % Architecture of \FMF{}: the two modes of \FMF{} (immediate mode % and vertex mode) both interact with \LaTeX{} and \MF{} (or \MP, % respectively), but operate on different data types.} % \end{figure} % % The most crucial aspect of the architecture is the existence of two % distinct modes with different fundamental datatypes: % \begin{itemize} % \item \emph{vertex mode,} which deals with graphs as structures % consisting of vertices and arcs and (almost) never deals with % their physical locations. % \item \emph{immediate mode,} which deals with \MF{} |path|s and % |pair|s (i.e.~coordinates) and % allows complete control over the physical locations. % \end{itemize} % It is of course possible to mix these modes in advanced % applications. Commands are provided to translate vertices and arcs % to |pair|s and |path|s and vice versa. % % Novice users with little experience in \MF{} programming should % start with vertex mode to get their job done. Later, immediate mode % can be used to create more and more complex diagrams. It is % possible to create most diagrams that can actually be calculated in % vertex mode. Immediate mode is most useful for extending line % \FMF{} and for drawing diagrams with fancy decorations. % % A word on portability: \FMF{} is implemented as a \LaTeX{} package. % But it should be straightforward to adapt it to other \TeX{} macro % packages because \LaTeX{} macros have been used for convenience only % and can easily be replaced or provided in a compatibility package. % The \LaTeX{} specific \emph{environment} construct can also easily % be replaced by the equivalent construct in another macro package. % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Conclusion} % % It goes without saying that \FMF{} is not perfect. There might be % cases where using a graphical drawing tool with a mouse can give % more pleasing results in less time. But in most cases, \FMF{} % will give satisfactory results without any fine tuning. These will % be reproducible and independent from the computer it is running on. % % Early user reponses have been very encouraging. There seems to be a % relatively steep % learning curve for those \LaTeX{} users that have to find out how to % run \MF{} on their systems. But once this purely technical obstacle % has been % surmounted, users have been enthusiatic as well about the quality of % the generated graphs as about the ease of use of \FMF. % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \newpage % \section{Usage} % % In addition to this manual, there exists also a concise description % of \FMF{} in a journal article~\cite{CPC}, as well as a three part % tutorial~\cite{CNL}. % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{\LaTeX{} package and environments} % \label{sec:environments} % % Instructing \LaTeX{} to use \FMF{} is as simple as\footnote{As % given, this applies to \LaTeX. But the installation file % \texttt{feynmf209.ins} allows to generate special versions % \texttt{feynmf209.sty} and \texttt{feynmp209.sty} which are % compatible with the obsolete \LaTeX{} version 2.09. These files % are to be used as documentstyle options % \begin{quote} % \texttt{\bslash documentstyle[...,feynmf209,...]\{...\}} % \end{quote} % or % \begin{quote} % \texttt{\bslash documentstyle[...,feynmp209,...]\{...\}} % \end{quote} % If you cannot use |epsf.sty| for including PostScript files, you % can either hack |feynmp209.sty| or upgrade to \LaTeX2e. % Please keep in mind that \FMF{} has been developed for \LaTeXe{} % and the \LaTeX~2.09 compatibility version will always be a % retrofitted hack. I will accept bug reports for the 2.09 version, % but I urge everybody to move to \LaTeX2e, which is the one and % only supported \LaTeX{} right now.} % \begin{quote} % |\usepackage{feynmf}| % \end{quote} % If you have \MP, then you can use it alternatively by placing % \begin{quote} % |\usepackage{feynmp}| % \end{quote} % in your \LaTeX{} source.\footnote{% % \FMF{} understands an option \texttt{pre-1.03}, that is % of interest for veteran users: % \begin{quote} % \texttt{\bslash usepackage[pre-1.03]\{feynmf\}} % \end{quote} % or % \begin{quote} % \texttt{\bslash usepackage[pre-1.03]\{feynmp\}} % \end{quote} % The purpose of this option is to enable processing of old input % files (pre v1.02) that use \texttt{\bslash noexpand} in labels. % Since the method for processing these files can clash (in rare % cases) with \LaTeXe's font loading procedure, it has been disabled % by default.} % % \FMF{} has to switch interactions mode and switches to % |\errorstopmode|, because it is impossible in \TeX{} to switch % back. If a different default is required (for automated preprint % processing, in particular), it can be specified as a package option: % \begin{quote} % |\usepackage[errorstop]{feynmf}|\\ % |\usepackage[scroll]{feynmf}|\\ % |\usepackage[batch]{feynmf}|\\ % |\usepackage[nonstop]{feynmf}| % \end{quote} % % \DescribeEnv{fmffile} % All descriptions that should go into one \MF{} file are placed % inside a |fmffile| environment which takes the name of the \MF{} % file as an argument: % \begin{quote} % \begin{flushleft} % |\begin{fmffile}{|\meta{\MF-file}|}|\\ % \qquad\ldots\\ % |\end{fmffile}| % \end{flushleft} % \end{quote} % Upto 255 graphs can be placed into one \MF{} file. Currently % \FMF{} does \emph{not} check that the 255 graph limit per file % is not overrun.\footnote{% % There is also a very primitive, but (unfortunately) popular % operating system, which restricts filenames to eight characters % with a three character extension. On this system, only 99 % graphs can be placed into one \MF{} file because auxiliary % files will not be unambiguous, if more than two digits are used.} % Note that the filename for the \MF{} file given in the argument of % the |fmffile| environment \emph{must not} be identical to the % \LaTeX{} source file name, because the \MF{} |.log| would be % overwritten and \LaTeX{} can no longer access the information in % this |.log| file. It should be obvious that any umber of diagrams % can be generated by using more than one |fmffile| environment with % different filenames. % % \DescribeEnv{fmfgraph} % The |fmfgraph| environment contains the description of a single % Feynman diagram % which will be placed a the location of the environment. % Arguments are the width and the height of the diagram, in units of % |\unitlength|: % \begin{quote} % \begin{flushleft} % |\begin{fmfgraph}(|\meta{width}|,|\meta{height}|)|\\ % \qquad\ldots\\ % |\end{fmfgraph}| % \end{flushleft} % \end{quote} % This environment does \emph{not} support labels, use |fmfgraph*| if % your diagrams contains labels. % % \DescribeEnv{fmfgraph*} % Same as |fmfgraph|, but enclosed in a |picture| environment of the % same size and supporting \LaTeX{} labels. % \begin{quote} % \begin{flushleft} % |\begin{fmfgraph*}(|\meta{width}|,|\meta{height}|)|\\ % \qquad\ldots\\ % |\end{fmfgraph*}| % \end{flushleft} % \end{quote} % % \DescribeMacro{\fmfframe} % Allows to allocate additional space around a |fmfgraph*|, since % the labels (or the diagram itself) might overshoot: % \begin{quote} % |\fmfframe(|\meta{left}|,|\meta{top}|)(|\meta{right}|,|\meta{bottom}^^A % |){|\meta{box}|}| % \end{quote} % puts an invisible frame of the given dimensions (measured in % |\unitlength|) around \meta{box}. % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Auxiliary files} % \label{sec:aux-files} % % \FMF{} needs to share information between \MF{} and \LaTeX{}. For % this task several auxiliary files are needed. % The flow of information depicted in figures~\ref{fig:flow} % and~\ref{fig:flowp} looks much % more complicated than it is. The important feature is that there a % two sets of files which can be used to distribute a document: % \begin{enumerate} % \item{} Iff the recipient has a working \MF{} installation % (which shouldn't be a problem, except for some impoverished % commercial implementations), the document can be typset from the % \LaTeX{} source \emph{alone}, by running \LaTeX{}, \MF{} % and \LaTeX{} again (the latter step might have to be repeated to % get cross references right). % \item{} Another possibility (which doesn't require \MF{} on % the recipient's side), is to distribute the \LaTeX{} source, the % |tfm| and |gf| files (or |pk| files respectively) along with the % label files with extension |t|$n$ (where $n$ as an integer). % Distributing the \MF{} |log| files is a possible alternative % for the latter, but discouraged, because these are prone to be % erased accidentally. % \end{enumerate} % % \begin{figure}[t] % \hfuzz=3cm % \begin{center} % \leavevmode % \includegraphics{manpics.1} % \end{center} % \caption{Interdependency of files in a \FMF{} application. % The arrows show which files are updated in the two \LaTeX{} % passes, the \MF{} pass and the final dvi translation step.} % \label{fig:flow} % \end{figure} % % \begin{figure}[t] % \hfuzz=3cm % \begin{center} % \leavevmode % \includegraphics{manpics.2} % \end{center} % \caption{Interdependency of files in a \FMF{} application using % \MP: The arrows show which files are updated in the two \LaTeX{} % passes, the \MP{} pass and the final dvi translation step.} % \label{fig:flowp} % \end{figure} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Running \MF} % \label{sec:run-mf} % % Processing your document with \LaTeX{} will generate one or more % \MF{} files, which you will have to process with \MF. On % UNIX\footnote{% % UNIX was a trademark of UNIX Systems Laboratory, but is rumored to % have been donored to X/Open.} % systems, \MF{} is invoked as % \manindex{running \MF} % \begin{quote} % |mf '\mode:=|\meta{\MF-mode}|; input |\meta{\MF-file}|'| % \end{quote} % from the shell. Here \meta{\MF-file} is to be replaced by the name % of the input file (which is determined by the argument to the % |fmffile| environment, see section~\ref{sec:environments}) and % \meta{\MF-mode} is the proper \MF-mode for your particular printer. % Please consult your local guide or local wizards about how to run % \MF{} on other systems. % % Note that \meta{\MF-mode} \emph{must} be specified, otherwise \MF{} % will fail or the resulting font will not be usable.\footnote{% % See section~\ref{sec:value-to-large} for the typical error message % and for additional information on printer modes.} % You can look up the correct \MF{} mode in the file |modes.mf| that % comes with the \MF{} distribution. Among the more common laser % printers are |laserjet| for HP Laserjets at 300dpi, |ljfour| for HP % Laserjets at 600dpi, |nexthi| for NeXT laser printers at 400dpi, % etc. % % A non-trivial part can be instructing \TeX{} and your favorite % |dvi|-driver how to find the generated |tfm| and |gf| (resp.~|pk|) % files. This is highly system dependent and can be trivial (as in % the standard UNIX \TeX{} installations, where no further action is % required) or almost impossible without system priviledges (as under % MVS). Please consult your local guide or wizards on this point. % See also section~\ref{sec:out-of-date} for common problems with % |dvi| drivers. % % Some recent \TeX{} implementations (e.g.~|web2c| with |kpathsea| % version 2.6 or later) are able to generate |tfm| files on the fly. % Using such implementations, running \LaTeX{} twice should suffice % and \MF{} will be invoked automagically in the background. Note % however, that the automagically invoked tools might also install the % ``fonts'' corresponding to the Feynman diagrams in a system % directory, where they don't belong. Adding the following lines to % the |maketex.site| script will prevent this mishap in the % te\TeX{} distribution for UNIX (which is derived from |web2c|): % \begin{verbatim} % if [ -r $KPSE_DOT/$NAME.mf ]; then % MT_PKDESTDIR=$KPSE_DOT % MT_TFMDESTDIR=$KPSE_DOT % MT_NAMEPART= % fi % \end{verbatim} % The automagic tools will also \emph{not} notice when a diagram has % changed. These problems suggest that it is a generally a good idea % to invoke \MF{} explicitely, instead of relying on the automagic % tools. % % Running \MP{} is usually trivial, because not printer specific mode % is needed: % \manindex{running \MP} % \begin{quote} % |mp |\meta{\MP-file}|| % \end{quote} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{The \texttt{feynmf} perl script} % UNIX users will be able to take advantage of the \texttt{feynmf} % perl script, that automates the invocation of \LaTeX{} and \MP. % In particular it tries to guess the correct \MF-mode and % magnification. The latter is often different from 1 in slide % classes. Here is the man page of \texttt{feynmf}: % % ^^A LaTeX document produced by pod2latex from "feynmf.pl.pod". % \subsubsection*{NAME} % {\bf feynmf} --- Process {\bf LaTeX} files using {\bf FeynMF} % % \subsubsection*{SYNOPSIS} % {\bf feynmf} {\tt [}{\bf -hvqncfT}{\tt ]} % {\tt [}{\bf -t} {\em tfm\/} {\tt [}{\bf -t} {\em tfm\/} ...{\tt ]}{\tt ]} % {\tt [}{\bf -m} {\em mode\/}{\tt ]} % {\em file\/} {\tt [}{\em file\/} ...{\tt ]} % % {\bf feynmf} {\tt [}{\bf {\tt --}help}{\tt ]} % {\tt [}{\bf {\tt --}version}{\tt ]} {\tt [}{\bf {\tt --}quiet}{\tt ]} % {\tt [}{\bf {\tt --}noexec}{\tt ]} {\tt [}{\bf {\tt --}clean}{\tt ]} % {\tt [}{\bf {\tt --}force}{\tt ]} {\tt [}{\bf {\tt --}notfm}{\tt ]} % {\tt [}{\bf {\tt --}tfm} {\em tfm\/} {\tt [}{\bf {\tt --}tfm} % {\em tfm\/} ...{\tt ]}{\tt ]} {\tt [}{\bf {\tt --}mode} % {\em mode\/}{\tt ]} {\em file\/} {\tt [}{\em file\/} ...{\tt ]} % % \subsubsection*{DESCRIPTION} % The most complicated part of using the {\bf FeynMF} style appears to be the % proper invocation of {\bf Metafont}. The {\bf feynmf} script provides a % convenient front end and will automagically invoke {\bf Metafont} with the % proper mode and magnifincation. It will also avoid cluttering system font % directories and offers an option to clean them. % % \subsubsection*{OPTIONS}% % \index{OPTIONS} % % \begin{description} % % \item[{\bf -h}, {\bf {\tt --}help}]% % \index{-h, --help@{\bf -h}, {\bf {\tt --}help}}% % \hfil\\ % Print a short help text. % % \item[{\bf -v}, {\bf {\tt --}version}]% % \index{-v, --version@{\bf -v}, {\bf {\tt --}version}}% % \hfil\\ % Print the version of {\bf feynmf}. % % \item[{\bf -q}, {\bf {\tt --}quiet}]% % \index{-q, --quiet@{\bf -q}, {\bf {\tt --}quiet}}% % \hfil\\ % Don't echo the commands being executed. % % \item[{\bf -n}, {\bf {\tt --}noexec}]% % \index{-n, --noexec@{\bf -n}, {\bf {\tt --}noexec}}% % \hfil\\ % Don't execute {\bf LaTeX} or {\bf Metafont}. % % \item[{\bf -c}, {\bf {\tt --}clean}]% % \index{-c, --clean@{\bf -c}, {\bf {\tt --}clean}}% % \hfil\\ % Offer to delete font files that have accidentally been placed in a % system directory by the {\bf MakeTeXTFM} and {\bf MakeTeXPK} scripts (these % scripts are run by {\bf tex} (and {\bf latex}) in the background). This % option has only been tested with recent versions of UNIX TeX. % % \item[{\bf -f}, {\bf {\tt --}force}]% % \index{-f, --force@{\bf -f}, {\bf {\tt --}force}}% % \hfil\\ % Don't ask any questions. % % \item[{\bf -T}, {\bf {\tt --}notfm}]% % \index{-T, --notfm@{\bf -T}, {\bf {\tt --}notfm}}% % \hfil\\ % Don't try to prepare fake {\tt .tfm} files for the first run. % % \item[{\bf -t}, {\bf {\tt --}tfm} {\em tfm\/}]% % \index{-t, --tfm tfm@{\bf -t}, {\bf {\tt --}tfm} {\em tfm\/}}% % \hfil\\ % Don't try guess the names of the {\tt .tfm} files to fake for % the first run and use the given {\em name\/}(s) instead. This option % can be useful if our incomplete parsing of the LaTeX input % files fails. % % \item[-{\bf m} {\em mode\/}, {\bf {\tt --}mode} {\em mode\/}]% % \index{-m mode, --mode mode@-{\bf m} {\em mode\/}, {\bf {\tt --}mode} {\em mode\/}}% % \hfil\\ % Select the METAFONT mode {\em mode\/}. The default is guessed or % {\tt localfont} if the guess fails. % % \item[{\em file\/}]% % \index{file@{\em file\/}}% % \hfil\\ % Main {\bf LaTeX} input files. % % \item[{\em file\/} ...]% % \index{file ...@{\em file\/} ...}% % \hfil\\ % Other LaTeX input files that are included by the main file. % % \end{description} % % \subsubsection*{AUTHOR} % Thorsten Ohl $<$Thorsten.Ohl@Physik.TH-Darmstadt.de$>$ % % \subsubsection*{BUGS} % The preparation of {\tt .tfm} files is not foolproof yet, because we can % parse {\bf TeX} files only superficially. % % This script has only been tested for recent {\bf teTeX} distributions % of UNIX {\bf TeX}, though it will probably work with other versions of % UNIX {\bf TeX}. The author will be grateful for portability suggestions, % even concerning {\bf Borg} operating systems, for the benefit of those users % that are forced to live with DOS or Windows. % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Vertex mode} % % These basic features of \FMF{} are (or rather ``should be'') % available through the \LaTeX{} interface. No knowledge of % \MF{} is necessary. % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsubsection{External vertices} % % \DescribeMacro{\fmfleft} % \DescribeMacro{\fmfright} % \DescribeMacro{\fmfbottom} % \DescribeMacro{\fmftop} % \DescribeMacro{\fmfsurround} % \manindex{external vertices} % \manindex{vertices, external} % Positioning of % external vertices has to done explicitely. The technical reason is % that they would otherwise collapse with their neighbors, but % practical reasons also suggest to give the user full control here. % |\fmfleft{|\meta{v1}$[$|,|\ldots$]$|}| places the % vertices in the comma separated list \meta{v1},\ldots\ % equidistantly on a smooth path on the left side of the diagram. % |\fmfright{|\meta{v1}$[$|,|\ldots$]$|}| does the same % thing on the right. Similarly |\fmfbottom| and |\fmftop|, while % |\fmfsurround{|\meta{v1}$[$|,|\ldots$]$|}| % places its arguments on smooth path % surrounding the diagram. % % \def\gallerylabels{% % \fmfdotn{v}{4}% % \fmflabel{$v_1$}{v1}% % \fmflabel{$v_2$}{v2}% % \fmflabel{$v_3$}{v3}% % \fmflabel{$v_4$}{v4}} % \def\gallerydemo{% % \fbox{\begin{fmfgraph*}(15,12) % \fmfpen{thick}% % \fmfbottomn{v}{4}\gallerylabels % \fmfcmd{draw (bottom_gallery);} % \end{fmfgraph*}}\qquad % \fbox{\begin{fmfgraph*}(15,12) % \fmfpen{thick}% % \fmfleftn{v}{4}\gallerylabels % \fmfcmd{draw (left_gallery);} % \end{fmfgraph*}}\qquad % \fbox{\begin{fmfgraph*}(15,12) % \fmfpen{thick}% % \fmfsurroundn{v}{7}\fmfdotn{v}{7}% % \fmflabel{$v_1$}{v1}\fmflabel{$v_2$}{v2}% % \fmflabel{$v_3$}{v3}\fmflabel{$v_4$}{v4}% % \fmflabel{$v_5$}{v5}\fmflabel{$v_6$}{v6}% % \fmflabel{$v_7$}{v7}% % \fmfcmd{draw (surround_gallery);} % \end{fmfgraph*}}\qquad % \fbox{\begin{fmfgraph*}(15,12) % \fmfpen{thick}% % \fmftopn{v}{4}\gallerylabels % \fmfcmd{draw (top_gallery);} % \end{fmfgraph*}}\qquad % \fbox{\begin{fmfgraph*}(15,12) % \fmfpen{thick}% % \fmfrightn{v}{4}\gallerylabels % \fmfcmd{draw (right_gallery);} % \end{fmfgraph*}}} % % \DescribeMacro{\fmfcurved} % \DescribeMacro{\fmfstraight} % \manindex{galleries} % Per default, the \emph{galleries} on which we place the external % vertices are curved as in figure~\ref{fig:curvedgalleries}, but % straight galleries are also available. The macros % |\fmfcurved| and |\fmfstraight| switch between % these alternatives. % % \begin{figure}[t] % \begin{center} % \gallerydemo % \end{center} % \caption{\label{fig:curvedgalleries}% % Curved galleries.} % \end{figure} % % \begin{figure}[t] % \begin{center} % \fmfstraight % \gallerydemo % \fmfcurved % \end{center} % \caption{\label{fig:straightgalleries}% % Straight galleries.} % \end{figure} % % \DescribeMacro{\fmfleftn} % \DescribeMacro{\fmfrightn} % \DescribeMacro{\fmfbottomn} % \DescribeMacro{\fmftopn} % \DescribeMacro{\fmfsurroundn} % \manindex{external vertices} % \manindex{vertices, external} % The macro |\fmfleftn| is similar to |\fmfleft|, but % |\fmfleftn{|\meta{v}\allowbreak|}{|\meta{n}|}| places the % vertices % \meta{v$[$1$]$}\ldots\meta{v$[$n$]$}. Analogously for % the macros |\fmfrightn|, |\fmfbottomn|, |\fmftopn| and % |\fmfsurroundn|. % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsubsection{Arcs and internal vertices} % % \DeleteShortVerb{\|} % \MakeShortVerb{\"} % % \def\linesample#1{% % \begin{fmfgraph}(30,6) % \fmfleft{i} % \fmfright{o} % \fmf{#1}{i,o} % \end{fmfgraph}} % \begin{table}[t] % \hfuzz=3cm % \begin{center} % \begin{tabular}{|l|c|l|l|}\hline % Name & Example & Parameters & Aliases \\\hline\hline % "curly" & \linesample{curly} & "curly_len" & "gluon" \\\hline % "dbl_curly" & \linesample{dbl_curly} & "curly_len" & \\\hline % "dashes" & \linesample{dashes} & "dash_len" & \\\hline % "dashes_arrow" & \linesample{dashes_arrow} & "dash_len" & "scalar" \\\hline % "dbl_dashes" & \linesample{dbl_dashes} & "dash_len" & \\\hline % "dbl_dashes_arrow" & \linesample{dbl_dashes_arrow} & "dash_len" & \\\hline % "dots" & \linesample{dots} & "dot_len" & \\\hline % "dots_arrow" & \linesample{dots_arrow} & "dot_len" & "ghost" \\\hline % "dbl_dots" & \linesample{dbl_dots} & "dot_len" & \\\hline % "dbl_dots_arrow" & \linesample{dbl_dots_arrow} & "dot_len" & \\\hline % "phantom" & \linesample{phantom} & & \\\hline % "phantom_arrow" & \linesample{phantom_arrow} & & \\\hline % "plain" & \linesample{plain} & & "vanilla"\\\hline % "plain_arrow" & \linesample{plain_arrow} & & "fermion", % "electron", % "quark" \\\hline % "dbl_plain" & \linesample{dbl_plain} & & "double" \\\hline % "dbl_plain_arrow" & \linesample{dbl_plain_arrow} & & "double_arrow", % "heavy" \\\hline % "wiggly" & \linesample{wiggly} & "wiggly_len"& "boson", % "photon" \\\hline % "dbl_wiggly" & \linesample{dbl_wiggly} & "wiggly_len"& \\\hline % "zigzag" & \linesample{zigzag} & "zigzag_width"& \\\hline % "dbl_zigzag" & \linesample{dbl_zigzag} & "zigzag_len"& \\\hline % \end{tabular} % \end{center} % \caption{Available line styles} % \label{tab:line-styles} % \end{table} % % \begin{table}[t] % \begin{center} % \begin{tabular}{|l|p{60mm}|}\hline % Name & Explanation \\\hline\hline % "tension" & draw a tighter ($>1$) or more loose ($<1$) arc \\\hline % "left" & draw on a halfcircle on the left \\\hline % "right" & draw on a halfcircle on the right \\\hline % "straight" & draw on a straight line (default) \\\hline % "label" & \TeX{} text for labeling the arc \\\hline % "label.side" & force placement of the label on the "left" or % "right" \\\hline % "label.dist" & place label at a distance "dist" \\\hline % "label.pos" & relative position of the label % (not implemented yet!) \\\hline % "tag" & optional tag for disambiguating arcs\\\hline % "width" & width of the line\\\hline % "rubout" & scale factor for crossing out lines % (doesn't work properly for doubled lines yet)\\\hline % "foreground" & foreground color (\MP{} only!)\\\hline % "background" & background color for doubled lines (\MP{} only!)\\\hline % \end{tabular} % \end{center} % \caption{Available line options} % \label{tab:line-options} % \end{table} % % \DeleteShortVerb{\"} % \MakeShortVerb{\|} % % \DescribeMacro{\fmf} % \manindex{labels} % \manindex{arcs} % This is the the most frequently used macro in \FMF{} applications. % \begin{quote} % |\fmf{|\meta{style}$[$|,|\meta{opt}$[$|=|\meta{val}$]$|,|\ldots$]$^^A % |}{|\meta{v1}|,|\meta{v2}$[$|,|\ldots$]$|}| % \end{quote} % connects the vertices \textit{v1,v2,\ldots} with a line of style % \meta{style}, using a set of options \meta{opt} with (optional) % value \meta{val}. If a vertex is not % known yet, it is added to the diagram. Note that the actual drawing % is not done immediately, because the positions can only be % calculated when \emph{all} vertices are known. The currently % available styles are collected in table~\ref{tab:line-styles}. Most % names should be self explanatory % and are not discussed further. % The |dashes|, |dots|, |phantom| and |plain| styles can optionally be % decorated with an arrow as shown above. All styles, including % |curly|, |wiggly| and |zigzag|, can be doubled. But arrows are not % available % for the latter three, because esthetically pleasing results can not be % expected. The |phantom| % style is special, because it % only enters the vertices and does \emph{not} cause a line to be % drawn. This is extremely useful for advanced layout features, as % explained below. % If you need a line styles that is not listed in % table~\ref{tab:line-styles}, see section~\ref{sec:extensions} for % how to define your own line styles. % % The supported options are collected in % table~\ref{tab:line-options}\footnote{% % One particulary useful further option would be \texttt{smooth}, % allowing for several lines joined smoothly. Early % experimentation has shown however, that the results are not % always what one expects and that there is a lot of room for % abuse.} % Note that each of the dot separated components of the options can be % abbreviated. For example, |l.d| is equivalent to |label.dist|. The % result of ambiguous matches is however undefined. % % Note that because the options are separated by single commata, % commata inside arguments to options (|label| comes to mind) have to % be doubled (similar to quotes in Fortran).\footnote{% % Note that, as of version 1.03, it is no longer necessary to % escape \TeX{} control sequences in arguments. Old files will % continue to work, because \texttt{noexpand} is temporarily % disabled.} % % Arcs that return to their origin are allowed (I will refer to them % as \emph{tadpoles}), but some options have slightly different % semantics. |tension| is here a inverse scale factor for the % tadpole, whose % default size is 2/3 of the average distance the neighboring % vertices. If |left| or |right| are specified, they give the direction % (in degrees) of the preferred gap into which the tadpole is placed. % By default, the largest gap is chosen for \emph{all} tapoles at a % given vertex, which will therefore overlap. This is neither a bug % nor a feature, but a limitation. % % \DescribeMacro{\fmfn} % \manindex{arcs} % The macro |\fmfn| is similar to |\fmf|, but % \begin{quote} % |\fmfn{|\meta{style}$[$|,|\meta{opt}$[$|=|\meta{val}$]$|,|\ldots$]$^^A % |}{|\meta{v}|}{|\meta{n}|}| % \end{quote} % connects the vertices \meta{v$[$1$]$}\ldots\meta{v$[$n$]$}. % % \DescribeMacro{\fmfcyclen} % \DescribeMacro{\fmfrcyclen} % \manindex{arcs} % The macro |\fmfcyclen{|\meta{style}|}{|\meta{v}|}{|\meta{n}|}| % cyclically connects the vertices % \meta{v$[$1$]$}\ldots\meta{v$[$n$]$}. |\fmfrcyclen| operates in % reverse order. % % \DescribeMacro{\fmfpen} % Pick up a pen of the specified size. |\fmfpen{|\meta{weight}|}| % is used for changing the weight (i.e.~thickness) of the lines. % Predefined sizes are |thin| and |thick|. % % \DeleteShortVerb{\|} % \MakeShortVerb{\"} % % \begin{table}[t] % \begin{center} % \begin{tabular}{|l|p{60mm}|}\hline % Name & Explanation \\\hline\hline % "label" & \TeX{} text for labeling the vertex \\\hline % "label.angle" & force placement of the label at the given % angle from the vertex \\\hline % "label.dist" & place label at a distance "dist" \\\hline % "decoration.shape" & shape of decoration \\\hline % "decoration.size" & size of decoration \\\hline % "decoration.filled" & fill, shade or hatch decoration \\\hline % "decoration.angle" & rotate decoration \\\hline % "foreground" & foreground color (\MP{} only!)\\\hline % "background" & background color (\MP{} only!)\\\hline % \end{tabular} % \end{center} % \caption{Available vertex options} % \label{tab:vertex-options} % \end{table} % % \DeleteShortVerb{\"} % \MakeShortVerb{\|} % % \DescribeMacro{\fmfv} % \manindex{internal vertices} % \manindex{vertices, internal} % \manindex{labels} % Declare vertices with options: % \begin{quote} % |\fmfv{|\meta{opt}$[$|=|\meta{val}$][$|,|\meta{opt}$[$|=|\meta{val}$]$^^A % |,|\ldots$]$|}{|\meta{v1}$[$|,|\ldots$]$|}| % \end{quote} % This is used for adding labels to a vertex and for specifying other % decoration. Supported options are collected in % table~\ref{tab:vertex-options}. Here the same abbreviation % mechanism as above is in effect. The available |shape|s are listed % in various filling styles in table~\ref{tab:vertex-shapes}\footnote{% % If the variable \texttt{feymfwizard} is \texttt{true} (e.g.~after % calling the \texttt{\bslash fmfwizard} macro), % it is also possible to specify any \MF{} expression that evaluates % to a \texttt{path}. Naturally, this has to used with great care, % because strange errors can be triggered by typos!}. % The tilings |gray10|, |gray25|, |gray75| and |gray90| are available % in addition to |gray50|. Customized tilings can be created with % the \MF{} function |tile_from_string|. It should be noted however, % that tilings are gobbling up memory at high speed and should be used % with discretion. The halftones\footnote{% % \MP{} will give true halftones (if your printer supports them), % while \MF{} tries to mimic them. The dithering algorithm of the % latter will be improved in the future.} % can be accessed by giving any number from 2 to 99, which will denote % the percentage of saturation ($30\%$ and $70\%$ here)\footnote{% % The old numeric arguments in the range $-1\ldots1$ continue to % work, but are considered obsolete.}. % Again, commata inside arguments to options have to be doubled. % % \end{fmffile} % \begin{fmffile}{fmfsamp2} % % \DeleteShortVerb{\|} % \MakeShortVerb{\"} % % \def\VertexSample#1#2{% % \begin{fmfgraph}(8,8) % \fmfforce{(.5w,.4h)}{c} % \fmfv{d.shape=#1,d.filled=#2}{c} % \end{fmfgraph}} % \def\VertexSamples#1{% % \VertexSample{#1}{full} & \VertexSample{#1}{empty} % & \VertexSample{#1}{shaded} & \VertexSample{#1}{hatched} % & \VertexSample{#1}{gray50} & \VertexSample{#1}{30} % & \VertexSample{#1}{70}} % \begin{table}[t] % \begin{center} % \begin{tabular}{|l|c|c|c|c|c|c|c|}\hline % "filled=" & "full" & "empty" & "shaded" & "hatched" % & "gray50" & "30" & "70" \\\hline\hline % "circle" & \VertexSamples{circle} \\\hline % "square" & \VertexSamples{square} \\\hline % "triangle" & \VertexSamples{triangle} \\\hline % "diamond" & \VertexSamples{diamond} \\\hline % "pentagon" & \VertexSamples{pentagon} \\\hline % "hexagon" & \VertexSamples{hexagon} \\\hline % "triagram" & \VertexSamples{triagram} \\\hline % "tetragram"& \VertexSamples{tetragram} \\\hline % "pentagram"& \VertexSamples{pentagram} \\\hline % "hexagram" & \VertexSamples{hexagram} \\\hline % \end{tabular} % \vspace*{\baselineskip}\\ % \begin{tabular}{|c|c|c|c|}\hline % "triacross" & "cross" & "pentacross" & "hexacross" \\\hline\hline % \VertexSample{triacross}{1} & \VertexSample{cross}{1} % & \VertexSample{pentacross}{1} & \VertexSample{hexacross}{1} \\\hline % \end{tabular} % \end{center} % \caption{Available vertex shapes and fill styles.} % \label{tab:vertex-shapes} % \end{table} % % \DeleteShortVerb{\"} % \MakeShortVerb{\|} % % \DescribeMacro{\fmfblob} % \manindex{blobs} % Draw a blob of the specified diameter at the vertices. Incidentally, % \begin{quote} % |\fmfblob{|\meta{diameter}|}{|\meta{v1}$[$|,|\ldots$]$|}| % \end{quote} % is equivalent to % \begin{quote} % \begin{flushleft} % |\fmfv{decor.shape=circle,decor.filled=shaded,|\\ % \qquad |decor.size=|\meta{diameter}|}{|\meta{v1}$[$|,|\ldots$]$|}| % \end{flushleft} % \end{quote} % % \DescribeMacro{\fmfdot} % \manindex{dots} % Draw a dot at the vertices given as arguments. % \begin{quote} % |\fmfdot{|\meta{v1}$[$|,|\ldots$]$|}| % \end{quote} % is equivalent to % \begin{quote} % \begin{flushleft} % |\fmfv{decor.shape=circle,decor.filled=full,|\\ % \qquad |decor.size=2thick}{|\meta{v1}$[$|,|\ldots$]$|}| % \end{flushleft} % \end{quote} % \DescribeMacro{\fmfvn} % \manindex{internal vertices} % \manindex{vertices, internal} % The macro |\fmfvn| is similar to |\fmfv|, but % \begin{quote} % |\fmfvn{|\meta{opt}$[$|=|\meta{val}$][$|,|^^A % \meta{opt}$[$|=|\meta{val}$]$|,|\ldots$]$|}{|\meta{v}|}{|\meta{n}|}| % \end{quote} % places the vertices \meta{v$[$1$]$}\ldots\meta{v$[$n$]$}. % % \DescribeMacro{\fmfdotn} % \DescribeMacro{\fmfblobn} % \manindex{blobs} % \manindex{dots} % The macros |\fmfdotn| and |\fmfblobn| are similar to the |\fmfdot| % and |\fmfblob|, but |\fmfdotn{|\meta{v}|}{|\meta{n}|}| places the % vertices \meta{v$[$1$]$}\ldots\meta{v$[$n$]$}. Analogously for % |\fmfblobn|. % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsubsection{Polygons} % % Complex vertices with arcs attached at the corners can be % contructed with polygons, which share some characteristics with arcs % and vertices. % % \DescribeMacro{\fmfpoly} % \manindex{polygons} % The macro % \begin{quote} % |\fmfpoly{|\meta{style}$[$|,|\meta{opt}$[$|=|\meta{val}$]$^^A % |,|\ldots$]$|}{|\meta{v1}|,|\meta{v2}$[$|,|\ldots$]$|}| % \end{quote} % places the vertices \meta{v1}, \meta{v2}, \ldots{} on the corners of % a regular polygon. The orientation of the polygon is fixed to be % mathematically positive (i.e.~counter clockwise). Note that this % can have strange results if the orientation is opposite to the % orientation of the vertices the corners are connected to. % The available options are collected in % table~\ref{tab:polygon-options}. The effects of some options are % depicted in table~\ref{tab:polygon-shapes}. % % Note that is is technically \emph{impossible} to fix the size of a % polygon. The size can be controlled by specifying a |tension| for % the edges, which acts like the |tension| of normal arcs. % % \DeleteShortVerb{\|} % \MakeShortVerb{\"} % % \begin{table}[t] % \begin{center} % \begin{tabular}{|l|p{60mm}|}\hline % Name & Explanation \\\hline\hline % "filled" & fill, shade or hatch interior \\\hline % "phantom" & don't draw anything \\\hline % "empty" & draw outline \\\hline % "shade" & shade interior \\\hline % "hatched" & hatch interior \\\hline % "full" & fill interior \\\hline % "pull" & pull edges in ($<0$) or out ($>0$) \\\hline % "tension" & tension of the edges \\\hline % "smooth" & draw smoth corners \\\hline % "label" & \TeX{} text for labeling the polygon \\\hline % "label.angle" & force placement of the label at the given % angle from the vertex \\\hline % "label.dist" & place label at a distance "dist" \\\hline % "foreground" & foreground color (\MP{} only!)\\\hline % "background" & background color (\MP{} only!)\\\hline % \end{tabular} % \end{center} % \caption{Available polygon options} % \label{tab:polygon-options} % \end{table} % % \def\PolygonSample#1#2{% % \begin{fmfgraph}(15,15) % \fmfsurroundn{e}{#1} % \fmfpolyn{shaded,tension=#2}{z}{#1} % \begin{fmffor}{i}{1}{1}{#1} % \fmf{plain}{z[i],e[i]} % \end{fmffor} % \end{fmfgraph}} % \def\PolygonSamples#1#2#3{% % \PolygonSample{#1}{#2,pull=0.75#3} % & \PolygonSample{#1}{#2,pull=1.0#3} % & \PolygonSample{#1}{#2#3} % & \PolygonSample{#1}{#2,pull=1.5#3}} % \begin{table}[t] % \begin{center} % \begin{tabular}{|l|c|c|c|c|}\hline % "pull=" & 0.75 & 1.0 & "?" & 1.5 \\\hline\hline % default & \PolygonSamples{3}{.1}{} \\\hline % "smooth" & \PolygonSamples{3}{.1}{,smooth} \\\hline % default & \PolygonSamples{5}{.6}{} \\\hline % "smooth" & \PolygonSamples{5}{.6}{,smooth} \\\hline % default & \PolygonSamples{7}{1.}{} \\\hline % "smooth" & \PolygonSamples{7}{1.}{,smooth} \\\hline % \end{tabular} % \end{center} % \caption{Some of the available polygon shapes. Note that % \texttt{pull=1.0} is identical to \texttt{pull=?} for straight % lines, but very different for \texttt{smooth} lines.} % \label{tab:polygon-shapes} % \end{table} % % \DeleteShortVerb{\"} % \MakeShortVerb{\|} % % \DescribeMacro{\fmfpolyn} % \DescribeMacro{\fmfrpolyn} % \manindex{polygons} % The macro |\fmfpolyn{|\meta{style}|}{|\meta{v}|}{|\meta{n}|}| % is similar to |\fmfpoly| but connects the vertices % \meta{v$[$1$]$}\ldots\meta{v$[$n$]$}. |\fmfrpolyn| operates in % reverse order. % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsubsection{Color} % % If \MP{} is used for rendering the diagrams, vertices and arcs can % be colored. The corresponding options give a warning message under % \MF{} and are otherwise ignored. % % \manindex{color} % Two colors are available for vertices and arcs: |foreground| and % |background|. Both can either be specified as a linear combination % of the predefined colors |white|, |black|, |red|, |green| and |blue| % or as RBG triples % |(|\meta{red}|,|\allowbreak\meta{green}|,|\allowbreak\meta{blue}|)|. % Note that as always commata have to be doubled in option arguments. % Therefore both |foreground=|\allowbreak|(1,,0,,1)| and % |foreground=|\allowbreak|red+|\allowbreak|blue| are % valid options setting the foreground color to magenta. % For arcs, the background color is used only for the interior of % doubled lines. % % While the color feature is rarely used in papers or books, it can % be very useful for jazzing up your transparencies. See % page~\pageref{rainbow} for a not very serious example. % % \end{fmffile} % \begin{fmffile}{fmfsamp3} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsubsection{Examples} % % After the main features of the vertex mode have been introduced, it % is time for a couple of illustrative examples that are taken from % \emph{The Real World}. % % \begin{examples}{40mm} % % As a first example, consider drawing a straightforward box diagram, % familiar from $K$-$\bar K$, $D$-$\bar D$, and $B$-$\bar B$ mixing. % The commands for the labels are not shown here, they are discussed % in section~\ref{sec:labels} % % Let us start the diagram and pick up a thick pen: % \begin{verbatim} % \begin{fmfgraph}(40,25) % \fmfpen{thick} % \end{verbatim} % The incoming and outcoming vertices are placed on the left and % right hand side, respectively: % \begin{verbatim} % \fmfleft{i1,i2} % \fmfright{o1,o2} % \end{verbatim} % Now we tell \FMF{} how the arcs are connected. % \begin{verbatim} % \fmf{fermion}{i1,v1,v3,o1} % \fmf{fermion}{o2,v4,v2,i2} % \fmf{photon}{v1,v2} % \fmf{photon}{v3,v4} % \end{verbatim} % \marginexample{% % \begin{fmfgraph*}(40,25) % \fmfpen{thick} % \fmfleft{i1,i2} % \fmflabel{$\bar{b}$}{i1} % \fmflabel{$d$}{i2} % \fmfright{o1,o2} % \fmflabel{$\bar{d}$}{o1} % \fmflabel{$b$}{o2} % \fmf{fermion}{i1,v1} % \fmf{fermion,label=$\bar{t},,\bar{c},,\bar{u}$, % l.side=right}{v1,v3} % \fmf{fermion}{v3,o1} % \fmf{fermion}{o2,v4} % \fmf{fermion,label=$t,,c,,u$,l.side=right}{v4,v2} % \fmf{fermion}{v2,i2} % \fmf{photon,label=$W^+$,l.side=left}{v1,v2} % \fmf{photon,label=$W^-$,l.side=right}{v3,v4} % \fmfdotn{v}{4} % \end{fmfgraph*}} % \label{pg:box} % Finally we tell \FMF{} to draw dots at the vertices and we're done. % \begin{verbatim} % \fmfdotn{v}{4} % \end{fmfgraph} % \end{verbatim} % \label{page:simple-examples} % With a little effort the layout of this diagram can actually be % improved by enlarging the inner box, see page~\pageref{pg:newbox} % below. % % Here is the resonant $s$-channel contribution to $e^+e^-\to 4f$. % (From now on, we do no longer display the % \begin{verbatim} % \begin{fmfgraph}(40,25) % \fmfpen{thick} % ... % \end{fmfgraph} % \end{verbatim} % environment surrounding all pictures.) % \begin{verbatim} % \fmfleftn{i}{2} % \fmfrightn{o}{4} % \fmf{fermion}{i1,v1,i2} % \fmf{photon}{v1,v2} % \fmfblob{.15w}{v2} % \fmf{photon}{v2,v3} % \fmf{fermion}{o1,v3,o2} % \fmf{photon}{v2,v4} % \fmf{fermion}{o4,v4,o3} % \end{verbatim} % \marginexample{% % \begin{fmfgraph*}(40,25) % \fmfpen{thick} % \fmfleftn{i}{2} % \fmfrightn{o}{4} % \fmflabel{$e_-$}{i1} % \fmflabel{$e_+$}{i2} % \fmf{fermion}{i1,v1,i2} % \fmf{photon}{v1,v2} % \fmfblob{.15w}{v2} % \fmf{photon}{v2,v3} % \fmflabel{$\mu_+$}{o1} % \fmflabel{$\nu_\mu$}{o2} % \fmf{fermion}{o1,v3,o2} % \fmf{photon}{v2,v4} % \fmflabel{$\bar{c}$}{o4} % \fmflabel{$s$}{o3} % \fmf{fermion}{o4,v4,o3} % \end{fmfgraph*}} % % And the resonant $t$-channel contribution: % \begin{verbatim} % \fmfleftn{i}{2} % \fmfrightn{o}{4} % \fmf{fermion}{i1,v1,v2,i2} % \fmf{photon}{v1,v3} % \fmf{fermion}{o1,v3,o2} % \fmf{photon}{v2,v4} % \fmf{fermion}{o4,v4,o3} % \end{verbatim} % \marginexample{% % \begin{fmfgraph*}(40,25) % \fmfpen{thick} % \fmfleftn{i}{2} % \fmfrightn{o}{4} % \fmflabel{$e_-$}{i1} % \fmflabel{$e_+$}{i2} % \fmf{fermion}{i1,v1,v2,i2} % \fmf{photon}{v1,v3} % \fmflabel{$\mu_+$}{o1} % \fmflabel{$\nu_\mu$}{o2} % \fmf{fermion}{o1,v3,o2} % \fmf{photon}{v2,v4} % \fmflabel{$\bar{c}$}{o4} % \fmflabel{$s$}{o3} % \fmf{fermion}{o4,v4,o3} % \end{fmfgraph*}} % % Two point loop diagrams pose another set of problems. We % must have a way of specifying that one or more of the lines % connecting the two vertices are \emph{not} connected by a straight % line. The options |left|, |right| and |straight| offer the % possibility to connect two vertices by a semicircle detour, either % on the left or on the right. Since by default all lines contribute % to the tension between two vertices, the |tension| option allows us % to reduce this tension. The next examples shows both options in % action. The lower fermion line is given an tension of~$1/3$ to % make is symmetrical with the upper line with consists of three parts. % The loop photon is using a detour on the right and does not % contribute any tension. % \begin{verbatim} % \fmfleft{i1,i2} % \fmfright{o1} % \fmf{fermion,tension=1/3}{i1,v1} % \fmf{plain}{v1,v2} % \fmf{fermion}{v2,v3} % \fmf{photon,right,tension=0}{v2,v3} % \fmf{plain}{v3,i2} % \fmf{photon}{v1,o1} % \end{verbatim} % \marginexample{% % \begin{fmfgraph*}(40,25) % \fmfpen{thick} % \fmfleft{i1,i2} % \fmflabel{$p^{\prime}$}{i1} % \fmflabel{$p$}{i2} % \fmfright{o1} % \fmf{fermion,tension=1/3}{i1,v1} % \fmf{plain}{v1,v2} % \fmf{fermion,label=$p-k$,l.side=left}{v2,v3} % \fmf{photon,right,tension=0,label=$k$}{v2,v3} % \fmf{plain}{v3,i2} % \fmf{photon}{v1,o1} % \end{fmfgraph*}} % The optional argument to |left| and |right| can be used to deform the % corresponding contour as in the following example. % The default value of |left| and |right| is 1. % \begin{verbatim} % \fmfleft{i} \fmfright{o} % \fmf{plain}{i,v1} \fmf{plain}{v2,o} % \fmf{dots,left=.5,tension=0.3}{v1,v2,v1}\fmffreeze % \fmf{plain,left}{v1,v2,v1} % \fmf{dashes,left=1.5}{v1,v2,v1} % \end{verbatim} % \marginexample{% % \begin{fmfgraph}(40,30) % \fmfpen{thick} % \fmfleft{i} \fmfright{o} % \fmf{plain}{i,v1} \fmf{plain}{v2,o} % \fmf{dots,left=.5,tension=0.3}{v1,v2,v1}\fmffreeze % \fmf{plain,left}{v1,v2,v1} % \fmf{dashes,left=1.5}{v1,v2,v1} % \end{fmfgraph}} % % Polygons are particulary useful for depicting non-perturbative % contributions: % \begin{verbatim} % \fmfpen{thick} % \fmfleftn{l}{2}\fmfrightn{r}{2} % \fmfrpolyn{shaded,label=$\Gamma$}{G}{4} % \fmfpolyn{empty,label=$K$}{K}{4} % \fmf{fermion}{l1,G1}\fmf{fermion}{l2,G2} % \fmf{fermion}{K1,r1}\fmf{fermion}{K2,r2} % \fmf{fermion,left=.5,tension=.5}{G3,K3} % \fmf{fermion,right=.5,tension=.5}{G4,K4} % \end{verbatim} % \marginexample{% % \begin{fmfgraph*}(40,25) % \fmfpen{thick} % \fmfleftn{l}{2}\fmfrightn{r}{2} % \fmfrpolyn{shaded,label=$\Gamma$}{G}{4} % \fmfpolyn{empty,label=$K$}{K}{4} % \fmf{fermion}{l1,G1}\fmf{fermion}{l2,G2} % \fmf{fermion}{K1,r1}\fmf{fermion}{K2,r2} % \fmf{fermion,left=.5,tension=.5}{G3,K3} % \fmf{fermion,right=.5,tension=.5}{G4,K4} % \end{fmfgraph*}} % % To conclude this first picture show, here's a self energy in % scalar $\phi^4$-theory showing the simplicity of the tadpole % feature: % \begin{verbatim} % \fmfpen{thick} % \fmfleft{i} % \fmfright{o} % \fmf{plain}{i,v,v,o} % \fmfdot{v} % \end{verbatim} % \marginexample{% % \begin{fmfgraph}(40,25) % \fmfpen{thick} % \fmfleft{i} % \fmfright{o} % \fmf{plain}{i,v,v,o} % \fmfdot{v} % \end{fmfgraph}} % \manindex{tadpoles} % Scalar $\phi^6$-theory needs a little manual intervention to force % the second on the opposite side: % \begin{verbatim} % \fmfpen{thick} % \fmfleft{i} % \fmfright{o} % \fmf{plain}{i,v,v,o} % \fmf{plain,left=90}{v,v} % \fmfdot{v} % \end{verbatim} % \marginexample{% % \begin{fmfgraph}(40,25) % \fmfpen{thick} % \fmfleft{i} % \fmfright{o} % \fmf{plain}{i,v,v,o} % \fmf{plain,left=90}{v,v} % \fmfdot{v} % \end{fmfgraph}} % % \end{examples} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsubsection{Labels} % \label{sec:labels} % % Let us now come back to the examples on % page~\pageref{page:simple-examples} and discuss how to add the % labels. % % \DescribeMacro{\fmflabel} % \manindex{labels} % The macro % \begin{quote} % |\fmflabel{|\meta{label}|}{|\meta{v}|}| % \end{quote} % is equivalent to % \begin{quote} % |\fmfv{label=|\meta{label}|}{|\meta{v}|}| % \end{quote} % and adds the label % \meta{label} to the vertex \meta{v}. In the current implementation, % there can be only a single label for each vertex. Thus earlier % calls to |\fmflabel| for the same vertex will be overwritten. % \meta{label} will be placed with the |\put| command of the \LaTeX{} % |picture| environment.\footnote{% % Note again that, as of version 1.03, it is no longer necessary to % escape \TeX{} control sequences in arguments. Old files will % continue to work, because \texttt{noexpand} is temporarily % disabled.} % Note that the |fmfgraph*| environment must be used to use labels, % they will silently disappear in |fmfgraph|. % % |\fmflabel| gives the user \emph{no} control on the placement of % the the label (use the |\fmfv| macro for a more fine-grained % control). The label is placed using the % following algorithm: % \begin{enumerate} % \item{} The reference point of the box containing \meta{label} is % placed at the distance |3thick| on the continuation of the % straight line connecting the center of the picture with the % vertex \meta{v}. % \item{} The reference point of the box is chosen such that the % contents of the box is on the outside of the vertex (with % respect to the center of the diagram). It is chosen from the % four corners and the four midpoints of the sides. % \end{enumerate} % % Therefore the four external particles in the~$B$-$\bar B$ mixing % diagram on page~\pageref{page:simple-examples} are labelled simply % by: % \begin{verbatim} % \fmflabel{$\bar{b}$}{i1} % \fmflabel{$d$}{i2} % \fmflabel{$\bar{d}$}{o1} % \fmflabel{$b$}{o2} % \end{verbatim} % % \begin{examples}{40mm} % \manindex{labels} % Here is a more systematical demonstration of the default placement % of labels: % \begin{verbatim} % \fmfsurroundn{v}{8}\fmfdotn{v}{8} % \fmflabel{$v_1$}{v1} % \fmflabel{$v_2$}{v2} % \fmflabel{$v_3$}{v3} % \fmflabel{$v_4$}{v4} % \fmflabel{$v_5$}{v5} % \fmflabel{$v_6$}{v6} % \fmflabel{$v_7$}{v7} % \fmflabel{$v_8$}{v8} % \end{verbatim} % \marginexample{% % \begin{fmfgraph*}(40,30) % \fmfsurroundn{v}{8}\fmfdotn{v}{8} % \fmflabel{$v_1$}{v1} % \fmflabel{$v_2$}{v2} % \fmflabel{$v_3$}{v3} % \fmflabel{$v_4$}{v4} % \fmflabel{$v_5$}{v5} % \fmflabel{$v_6$}{v6} % \fmflabel{$v_7$}{v7} % \fmflabel{$v_8$}{v8} % \end{fmfgraph*}} % And here is a demonstration of the explicit placement of % labels\footnote{% % Don't be confused by the \texttt{\bslash fmfiv} command. It is % described below (see section~\ref{sec:fmfiv}) and takes the same % arguments as the \texttt{\bslash fmfv} command. We use it here % for convenience to place multiple vertices at the same point, % i.e.~the center.}: % \begin{verbatim} % \fmfiv{d.sh=circle,d.f=1,d.si=2thin}{c} % \fmfiv{l=-120,l.a=-120,l.d=.2w}{c} % \fmfiv{l=-60,l.a=-60,l.d=.2w}{c} % \fmfiv{l=0,l.a=0,l.d=.2w}{c} % \fmfiv{l=60,l.a=60,l.d=.2w}{c} % \fmfiv{l=120,l.a=120,l.d=.2w}{c} % \fmfiv{l=180,l.a=180,l.d=.2w}{c} % \end{verbatim} % \marginexample{% % \begin{fmfgraph*}(40,30) % \fmfiv{d.sh=circle,d.f=1,d.si=2thin}{c} % \fmfiv{l=-120,l.a=-120,l.d=.2w}{c} % \fmfiv{l=-60,l.a=-60,l.d=.2w}{c} % \fmfiv{l=0,l.a=0,l.d=.2w}{c} % \fmfiv{l=60,lab.ang=60,l.d=.2w}{c} % \fmfiv{l=120,l.a=120,l.d=.2w}{c} % \fmfiv{l=180,l.a=180,l.d=.2w}{c} % \end{fmfgraph*}} % % \end{examples} % % There is no equivalent to |\fmflabel| for arcs. Here options to the % |\fmf| command have to be used. The default placement rules put the % label on the outside at the midpoint of a curved arc. If the arc is % straight, one should use the |label.side| option to push the label % either to the |left| or to the |right|. This |label.dist| option is % treated analogously to same option for vertices. % % Therefore the four internal particles in the~$B$-$\bar B$ mixing % diagram on page~\pageref{page:simple-examples} are labelled simply % by adding options to the |\fmf| commands: % \manindex{labels} % \begin{verbatim} % \fmf{fermion,label=$\bar{t},,\bar{c},,\bar{u}$, % label.side=right}{v1,v3} % \fmf{fermion,label=$t,,c,,u$,label.side=right}{v4,v2} % \fmf{photon,label=$W^+$,label.side=left}{v1,v2} % \fmf{photon,label=$W^-$,label.side=right}{v3,v4} % \end{verbatim} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsubsection{Manipulating the layout} % % The automatic layout algorithms of \FMF{} are rather simple, % therefore it is sometimes necessary to allow for manual intervention % from time to time. % % \DescribeMacro{\fmffreeze} % Calculate the positions of the vertices based on the arcs which are % defined up to this point. Usually this calculation is performed % automatically at the end of the |fmfgraph| environment. Calling it % explicitely is useful for later adding arcs that should not enter % the calculation . The layout is chosen to minimize the overall % length of all arcs. The length of each arc is weighted with the % |tension| option, whose default value is 1. % See section~\ref{sec:skeletons} for more information on % |\fmffreeze|. % % \DescribeMacro{\fmfforce} % |\fmfforce{|\meta{pos}|}{|\meta{v1}\allowbreak$[$|,|\ldots$]$|}| % forces the position \meta{pos} of the vertices \meta{v1}\ldots, % bypassing and overwriting the automatic layout. In all arguments % that are \MF{} |pair|s (i.e.~points), you can use the variable |w| % and |h|, which are predefined to the width and the height of the % whole % diagram respectively. E.g.~the center is specified as |(.5w,.5h)| % and the lower right corner as |(w,0)|. % The center and the four corners of the current subgraph (see the % \texttt{fmfsubgraph} environment on page~\pageref{fmfsubgraph}) are % available as |c|, |nw|, |ne|, |sw| and |se| (for \emph{north-west} % etc). % % \DescribeMacro{\fmfshift} % |\fmfshift{|\meta{dist}|}{|\meta{v1}\allowbreak$[$|,|\ldots$]$|}| % shifts the position of the vertices \meta{v1}\ldots{} by \meta{dist} % from the automatic layout. This command is only useful \emph{after} % a |\fmffreeze| of the corresponding vertex. % % \DescribeMacro{\fmffixed} % |\fmffixed{|\meta{dist}|}{|\meta{v1}\allowbreak$[$|,|\ldots$]$|}| % fixes the distance between subsequent vertices in the list % \meta{v1}\ldots{} to \meta{dist}. % This command should be used with care, because it is possible to % overconstrain the layout of the graph and the error messages will be % obscure for a novice user. % % \DescribeMacro{\fmffixedx} % \DescribeMacro{\fmffixedy} % |\fmffixedx{|\meta{dx}|}{|\meta{v1}\allowbreak$[$|,|\ldots$]$|}| % is identical to % |\fmffixed{(|\meta{dx}|,whatever)}{|\meta{v1}\allowbreak % $[$|,|\ldots$]$|}| % and |\fmffixedy{|\meta{dy}|}{|\meta{v1}\allowbreak$[$|,|\ldots$]$|}| % is identical to % |\fmffixed{(whatever,|\meta{dy}|)}{|\meta{v1}\allowbreak % $[$|,|\ldots$]$|}|. These commands can be used to fix relative % positions in one coordinate, while allowing movement in the other % coordinate. % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsubsection{Skeletons} % \label{sec:skeletons} % % The single most powerful concept for adjusting \FMF's layout % decisions is the use of \emph{skeletons}. By issuing a % |\fmffreeze| after specifying a subgraph (skeleton), we can fix the % location of the skeleton \emph{as if} the other arcs were not there. % We can then successively add more subgraphs whose layout will be % chosen with the skeleton remaining fixed. Similar effects can be % achieved by giving some arcs a vanishing |tension|. % % \begin{examples}{40mm} % % Consider the following example: suppose we want to draw a ladder % diagram contributing to the quark form factor. Simply linking in % the gluons does not produce a satisfactory result: % \begin{verbatim} % \fmfleft{i1} \fmfright{o1,o2} % \fmf{photon}{i1,v4} % \fmf{quark}{o1,v1,v2,v3,v4,v5,v6,v7,o2} % \fmf{gluon}{v1,v7} % \fmf{gluon}{v2,v6} % \fmf{gluon}{v3,v5} % \end{verbatim} % \marginexample{% % \begin{fmfgraph}(40,25) % \fmfpen{thick} % \fmfleft{i1} \fmfright{o1,o2} % \fmf{photon}{v4,i1} % \fmf{quark}{o1,v1,v2,v3,v4,v5,v6,v7,o2} % \fmf{gluon}{v1,v7} % \fmf{gluon}{v2,v6} % \fmf{gluon}{v3,v5} % \end{fmfgraph}} % What went wrong? Obviously the gluons are bonding the quark lines % too strongly. The fix is simple: just create a skeleton excluding % the gluons % \begin{verbatim} % \fmfleft{i1} \fmfright{o1,o2} % \fmf{photon}{i1,v4} % \fmf{quark}{o1,v1,v2,v3,v4,v5,v6,v7,o2} % \end{verbatim} % \marginexample{ % \begin{fmfgraph}(40,25) % \fmfpen{thick} % \fmfleft{i1} \fmfright{o1,o2} % \fmf{photon}{v4,i1} % \fmf{quark}{o1,v1,v2,v3,v4,v5,v6,v7,o2} % \end{fmfgraph}} % and add the gluons later: % \begin{verbatim} % \fmfleft{i1} \fmfright{o1,o2} % \fmf{photon}{i1,v4} % \fmf{quark}{o1,v1,v2,v3,v4,v5,v6,v7,o2} % \fmffreeze % \fmf{gluon}{v1,v7} % \fmf{gluon}{v2,v6} % \fmf{gluon}{v3,v5} % \end{verbatim} % \marginexample{ % \begin{fmfgraph}(40,25) % \fmfpen{thick} % \fmfleft{i1} \fmfright{o1,o2} % \fmf{photon}{v4,i1} % \fmf{quark}{o1,v1,v2,v3,v4,v5,v6,v7,o2} % \fmffreeze % \fmf{gluon}{v1,v7} % \fmf{gluon}{v2,v6} % \fmf{gluon}{v3,v5} % \end{fmfgraph}} % Alternatively, we can use a vanishing |tension|, which will % effectively exclude the gluons from the layout decisions: % \begin{verbatim} % \fmfleft{i1} \fmfright{o1,o2} % \fmf{photon}{i1,v4} % \fmf{quark}{o1,v1,v2,v3,v4,v5,v6,v7,o2} % \fmf{gluon,tension=0}{v1,v7} % \fmf{gluon,tension=0}{v2,v6} % \fmf{gluon,tension=0}{v3,v5} % \end{verbatim} % \marginexample{ % \begin{fmfgraph}(40,25) % \fmfpen{thick} % \fmfleft{i1} \fmfright{o1,o2} % \fmf{photon}{v4,i1} % \fmf{quark}{o1,v1,v2,v3,v4,v5,v6,v7,o2} % \fmf{gluon,tension=0}{v1,v7} % \fmf{gluon,tension=0}{v2,v6} % \fmf{gluon,tension=0}{v3,v5} % \end{fmfgraph}} % Which method is more intuitve is largely a matter of taste and at % the discretion of the user. % % The ``crossed'' version of this diagram is best drawn using the % |rubout| option: % \begin{verbatim} % \fmfleft{i1} \fmfright{o1,o2} % \fmf{photon}{i1,v3} % \fmf{quark}{o1,v1,v2,v3,v4,v5,o2} % \fmffreeze % \fmf{gluon}{v1,v4} % \fmf{gluon,rubout}{v2,v5} % \end{verbatim} % \marginexample{ % \begin{fmfgraph}(40,25) % \fmfpen{thick} % \fmfleft{i1} \fmfright{o1,o2} % \fmf{photon}{i1,v3} % \fmf{quark}{o1,v1,v2,v3,v4,v5,o2} % \fmffreeze % \fmf{gluon}{v1,v4} % \fmf{gluon,rubout}{v2,v5} % \end{fmfgraph}} % If |rubout| is selected, it defaults to~2, but it can be changed to % any (reasonable) value~$>1$. The current implementation should work % for almost all user-defined line styles. However, it does not work % correctly for the predefined |double| line styles yet. % % Another instructive example is the following: imagine you want to % draw a typical non-resonant contribution to~$e^+e^-\to 4f$. The % obvious solution doesn't look right: % \begin{verbatim} % \fmfleft{i1,i2} % \fmfright{o1,o2,o3,o4} % \fmf{fermion}{i1,v1,i2} % \fmf{boson}{v1,v2} % \fmf{fermion}{o1,v2,v3,o4} % \fmf{boson}{v3,v4} % \fmf{fermion}{o3,v4,o2} % \end{verbatim} % \marginexample{% % \begin{fmfgraph}(40,25) % \fmfpen{thick} % \fmfleft{i1,i2} % \fmfright{o1,o2,o3,o4} % \fmf{fermion}{i1,v1,i2} % \fmf{boson}{v1,v2} % \fmf{fermion}{o1,v2,v3,o4} % \fmf{boson}{v3,v4} % \fmf{fermion}{o3,v4,o2} % \end{fmfgraph}} % Again, we should start with a skeleton % \begin{verbatim} % \fmfleft{i1,i2} % \fmfright{o1,o2,o3,o4} % \fmf{fermion}{i1,v1,i2} % \fmf{boson}{v1,v2} % \fmf{fermion}{o1,v2,v3,o4} % \end{verbatim} % \marginexample{% % \begin{fmfgraph}(40,25) % \fmfpen{thick} % \fmfleft{i1,i2} % \fmfright{o1,o2,o3,o4} % \fmf{fermion}{i1,v1,i2} % \fmf{boson}{v1,v2} % \fmf{fermion}{o1,v2,v3,o4} % \end{fmfgraph}} % and add the second $W$ later: % \begin{verbatim} % \fmfleft{i1,i2} % \fmfright{o1,o2,o3,o4} % \fmf{fermion}{i1,v1,i2} % \fmf{boson}{v1,v2} % \fmf{fermion}{o1,v2,v3,o4} % \fmffreeze % \fmf{boson}{v3,v4} % \fmf{fermion}{o3,v4,o2} % \end{verbatim} % \marginexample{% % \begin{fmfgraph}(40,25) % \fmfpen{thick} % \fmfleft{i1,i2} % \fmfright{o1,o2,o3,o4} % \fmf{fermion}{i1,v1,i2} % \fmf{boson}{v1,v2} % \fmf{fermion}{o1,v2,v3,o4} % \fmffreeze % \fmf{boson}{v3,v4} % \fmf{fermion}{o3,v4,o2} % \end{fmfgraph}} % % Here's another example that uses stretchable arcs. Diagrams % of this kind are known as \emph{rainbow} diagrams. If you're using % \MP{} and are watching this on a color device, you'll see why. % \begin{verbatim} % \fmfpen{thick} % \fmfleft{i1,d1} % \fmfright{o1,d2} % \fmfn{plain}{i}{4} % \fmf{plain}{i4,v,o4} % \fmfn{plain}{o}{4} % \fmffreeze % \fmf{gluon,left,fore=red}{i1,o1} % \fmf{gluon,left,fore=green}{i2,o2} % \fmf{gluon,left,fore=blue}{i3,o3} % \fmfdotn{i}{3} % \fmfdotn{o}{3} % \fmfv{d.sh=circle,d.f=empty,d.si=.2w,b=(1,,0,,1), % l=$\Sigma$}{v} % \end{verbatim} % \marginexample{% % \label{rainbow} % \begin{fmfgraph*}(40,25) % \fmfpen{thick} % \fmfleft{i1,d1} % \fmfright{o1,d2} % \fmfn{plain}{i}{4} % \fmf{plain}{i4,v,o4} % \fmfn{plain}{o}{4} % \fmffreeze % \fmf{gluon,left,fore=red}{i1,o1} % \fmf{gluon,left,fore=green}{i2,o2} % \fmf{gluon,left,fore=blue}{i3,o3} % \fmfdotn{i}{3} % \fmfdotn{o}{3} % \fmfv{d.sh=circle,d.f=empty,d.si=.2w,b=(1,,0,,1), % l=$\Sigma$,l.d=0}{v} % \end{fmfgraph*}} % % \end{examples} % % Experience has shown that the method advocated in this section is % more effective than fuzzing around with fractional |tension| % parameters. Using |\fmfshift| or |\fmfforce| should be % a last resort only. % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsubsection{Pulling strings} % \label{sec:strings} % % If you add to any arc one or more |phantom| arcs they will cause % a tighter bonding between the vertices involved % \begin{verbatim} % \fmf{fermion}{v1,v2} % \fmf{phantom}{v1,v2} % \end{verbatim} % which is equivalent to % \begin{verbatim} % \fmf{fermion,tension=2}{v1,v2} % \end{verbatim} % The |phantom| arc has to be added \emph{before} any |\fmffreeze| % involving these vertices, of course. % % \begin{examples}{40mm} % % Here is an example from deep inelastic scattering\footnote{% % Don't be confused by the \texttt{\bslash fmfi} command. It is % described below (see section~\ref{sec:fmfi}) and takes the same % arguments as the \texttt{\bslash fmfv} command. We use it here % for adding to more lines parallel to the incoming proton line. % They do not enter the layout decisions.}: % \begin{verbatim} % \fmfleft{ip,il} % \fmfright{oq1,oq2,d1,oq3,d2,d3,ol} % \fmf{fermion}{ip,vp,vq,oq3} % \fmf{fermion}{vp,oq1} % \fmf{fermion}{vp,oq2} % \fmf{photon}{vl,vq} % \fmf{fermion}{il,vl,ol} % \fmfblob{.15w}{vp} % \fmfdot{vq,vl} % \fmffreeze % \fmfi{plain}{vpath (__ip,__vp) shifted (thick*(0,2))} % \fmfi{plain}{vpath (__ip,__vp) shifted (thick*(1,-2))} % \end{verbatim} % \marginexample{% % \begin{fmfgraph}(40,25) % \fmfpen{thick} % \fmfleft{ip,il} % \fmfright{oq1,oq2,d1,oq3,d2,d3,ol} % \fmf{fermion}{ip,vp,vq,oq3} % \fmf{fermion}{vp,oq1} % \fmf{fermion}{vp,oq2} % \fmf{photon}{vl,vq} % \fmf{fermion}{il,vl,ol} % \fmfblob{.15w}{vp} % \fmfdot{vq,vl} % \fmffreeze % \fmfi{plain}{vpath (__ip,__vp) shifted (thick*(0,2))} % \fmfi{plain}{vpath (__ip,__vp) shifted (thick*(1,-2))} % \end{fmfgraph}} % As it stands, all vertices come out too far to the right, because % the greater number of outgoing lines pulls them over. Adding % |\fmf{phantom}| makes the bond between the incoming vertices and the % interactions tighter and produces a better balanced picture: % \begin{verbatim} % \fmfleft{ip,il} % \fmfright{oq1,oq2,d1,oq3,d2,d3,ol} % \fmf{fermion}{ip,vp,vq,oq3} % \fmf{phantom}{ip,vp} % \fmf{fermion}{vp,oq1} % \fmf{fermion}{vp,oq2} % \fmf{photon}{vl,vq} % \fmf{fermion}{il,vl,ol} % \fmf{phantom}{il,vl} % \fmfblob{.15w}{vp} % \fmfdot{vq,vl} % \fmffreeze % \fmfi{plain}{vpath (__ip,__vp) shifted (thick*(0,2))} % \fmfi{plain}{vpath (__ip,__vp) shifted (thick*(1,-2))} % \end{verbatim} % \marginexample{% % \begin{fmfgraph}(40,25) % \fmfpen{thick} % \fmfleft{ip,il} % \fmfright{oq1,oq2,d1,oq3,d2,d3,ol} % \fmf{fermion}{ip,vp,vq,oq3} % \fmf{phantom}{ip,vp} % \fmf{fermion}{vp,oq1} % \fmf{fermion}{vp,oq2} % \fmf{photon}{vl,vq} % \fmf{fermion}{il,vl,ol} % \fmf{phantom}{il,vl} % \fmfblob{.15w}{vp} % \fmfdot{vq,vl} % \fmffreeze % \fmfi{plain}{vpath (__ip,__vp) shifted (thick*(0,2))} % \fmfi{plain}{vpath (__ip,__vp) shifted (thick*(1,-2))} % \end{fmfgraph}} % Equivalently, we could add |tension| to the lines in question and we % will get the same result: % \begin{verbatim} % \fmfleft{ip,il} % \fmfright{oq1,oq2,d1,oq3,d2,d3,ol} % \fmf{fermion,tension=2}{ip,vp} % \fmf{fermion}{vp,vq,oq3} % \fmf{fermion}{vp,oq1} % \fmf{fermion}{vp,oq2} % \fmf{photon}{vl,vq} % \fmf{fermion,tension=2}{il,vl} % \fmf{fermion}{vl,ol} % \fmfblob{.15w}{vp} % \fmfdot{vq,vl} % \fmffreeze % \fmfi{plain}{vpath (__ip,__vp) shifted (thick*(0,2))} % \fmfi{plain}{vpath (__ip,__vp) shifted (thick*(1,-2))} % \end{verbatim} % \marginexample{% % \begin{fmfgraph}(40,25) % \fmfpen{thick} % \fmfleft{ip,il} % \fmfright{oq1,oq2,d1,oq3,d2,d3,ol} % \fmf{fermion,tension=2}{ip,vp} % \fmf{fermion}{vp,vq,oq3} % \fmf{fermion}{vp,oq1} % \fmf{fermion}{vp,oq2} % \fmf{photon}{vl,vq} % \fmf{fermion,tension=2}{il,vl} % \fmf{fermion}{vl,ol} % \fmfblob{.15w}{vp} % \fmfdot{vq,vl} % \fmffreeze % \fmfi{plain}{vpath (__ip,__vp) shifted (thick*(0,2))} % \fmfi{plain}{vpath (__ip,__vp) shifted (thick*(1,-2))} % \end{fmfgraph}} % \end{examples} % % Conversely, specifing a |tension| $<1$ will make the corresponding % arcs more loose. % % \begin{examples}{40mm} % % Reconsider the box graph on page~\pageref{pg:box} and reduce the % tension on the inner lines\footnote{% % Now that you know, I have also displayed the \texttt{label} % options used.} % \begin{verbatim} % \fmfleft{i1,i2} % \fmflabel{$\bar{b}$}{i1} % \fmflabel{$d$}{i2} % \fmfright{o1,o2} % \fmflabel{$\bar{d}$}{o1} % \fmflabel{$b$}{o2} % \fmf{fermion}{i1,v1} % \fmf{fermion,tension=.5,label=$\bar{t},,\bar{c},,\bar{u}$, % l.side=right}{v1,v3} % \fmf{fermion}{v3,o1} % \fmf{fermion}{o2,v4} % \fmf{fermion,tension=.5,label=$t,,c,,u$,l.side=right}{v4,v2} % \fmf{fermion}{v2,i2} % \fmf{photon,tension=.2,label=$W^+$,l.side=left}{v1,v2} % \fmf{photon,tension=.2,label=$W^-$,l.side=right}{v3,v4} % \fmfdotn{v}{4} % \end{verbatim} % \marginexample{% % \begin{fmfgraph*}(40,25) % \fmfpen{thick} % \fmfleft{i1,i2} % \fmflabel{$\bar{b}$}{i1} % \fmflabel{$d$}{i2} % \fmfright{o1,o2} % \fmflabel{$\bar{d}$}{o1} % \fmflabel{$b$}{o2} % \fmf{fermion}{i1,v1} % \fmf{fermion,tension=.5,label=$\bar{t},,\bar{c},,\bar{u}$, % l.side=right}{v1,v3} % \fmf{fermion}{v3,o1} % \fmf{fermion}{o2,v4} % \fmf{fermion,tension=.5,label=$t,,c,,u$,l.side=right}{v4,v2} % \fmf{fermion}{v2,i2} % \fmf{photon,tension=.2,label=$W^+$,l.side=left}{v1,v2} % \fmf{photon,tension=.2,label=$W^-$,l.side=right}{v3,v4} % \fmfdotn{v}{4} % \end{fmfgraph*}} % \label{pg:newbox} % This result is much nicer than the original. % % \end{examples} % \end{fmffile} % % \begin{fmffile}{fmfsamp4} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Miscellaneous commands} % % \subsubsection{Graphs in graphs} % % \DescribeEnv{fmfsubgraph} % \label{fmfsubgraph} % \manindex{subgraphs} % The |fmfsubgraph| environment contains a subgraph, for which the % galleries will be placed inside the rectangle of width \meta{width} % and height \meta{height}, with lower left corner % at~$(\meta{x},\meta{y})$: % \begin{quote} % \begin{flushleft} % |\begin{fmfsubgraph}(|\meta{x}|,|\meta{y}|)(|^^A % \meta{width}|,|\meta{height}|)|\\ % \qquad \meta{body}\\ % |\end{fmfsubgraph}| % \end{flushleft} % \end{quote} % The center and four corners are available % as |c|, |nw|, |ne|, |sw| and |se| (for \emph{north-west} etc). % Because of the restrictions on the overall size of the diagram in % \MF, this environment will, mainly be useful for preparing % transparencies with \MP. % % \begin{examples}{40mm} % % Here is a not very serious application of this feature: % \begin{verbatim} % \def\subgraphsample#1{% % \fmfleftn{#1i}{2}% % \fmfrightn{#1o}{2}% % \fmf{plain}{#1i1,#1v1}% % \fmf{plain}{#1o1,#1v2}% % \fmf{plain}{#1o2,#1v3}% % \fmf{plain}{#1i2,#1v4}% % \fmfcyclen{plain,tension=0.3}{#1v}{4}} % \begin{fmfgraph}(40,30) % \subgraphsample{a} % \begin{fmfsubgraph}(.3w,.3h)(.4w,.4h) % \subgraphsample{b} % \end{fmfsubgraph} % \begin{fmfsubgraph}(.45w,.45h)(.1w,.1h) % \subgraphsample{c} % \end{fmfsubgraph} % \end{fmfgraph} % \end{verbatim} % \marginexample{% % \def\subgraphsample#1{% % \fmfleftn{#1i}{2}% % \fmfrightn{#1o}{2}% % \fmf{plain}{#1i1,#1v1}% % \fmf{plain}{#1o1,#1v2}% % \fmf{plain}{#1o2,#1v3}% % \fmf{plain}{#1i2,#1v4}% % \fmfcyclen{plain,tension=0.3}{#1v}{4}} % \begin{fmfgraph}(40,30) % \subgraphsample{a} % \begin{fmfsubgraph}(.3w,.3h)(.4w,.4h) % \subgraphsample{b} % \end{fmfsubgraph} % \begin{fmfsubgraph}(.45w,.45h)(.1w,.1h) % \subgraphsample{c} % \end{fmfsubgraph} % \end{fmfgraph}} % More serious applications will use this feature to group together % related diagrams and use other \MF{} drawing commands for % graphical elements that are not available in the \LaTeX{} |picture| % environment. % % \end{examples} % % \subsubsection{Reusing diagrams} % % \DescribeMacro{\fmfkeep} % \DescribeMacro{\fmfreuse} % After saving a pointer with |\fmfkeep{|\meta{name}|}| inside a % |fmfgraph| or |fmfgraph*| environment, the diagram can be reused later % by |\fmfreuse{|\meta{name}|}|. This works across |fmffile| % environments. % % Here's an example that uses centered |\parbox|es to place % diagrams into equations. The celebrated cancelation of quadratic % divergencies in scalar selfenergies in supersymmetric field theories % can be written as: % \begin{verbatim} % \begin{eqnarray} % \parbox{20mm}{\begin{fmfgraph}(20,15)\fmfkeep{boson} % \fmfleft{i} \fmfright{o} \fmf{dashes}{i,v,v,o} % \end{fmfgraph}} & \propto & \Lambda^2 \\ % \parbox{20mm}{\begin{fmfgraph}(20,15)\fmfkeep{fermion} % \fmfleft{i} \fmfright{o} \fmf{dashes}{i,v1} \fmf{dashes}{v2,o} % \fmf{fermion,left,tension=.3}{v1,v2,v1} % \end{fmfgraph}} & \propto & \Lambda^2 \\ % \parbox{20mm}{\fmfreuse{boson}} \quad + \quad % \parbox{20mm}{\fmfreuse{fermion}} & \propto & \ln\Lambda^2 % \end{eqnarray} % \end{verbatim} % The result is: % \begin{eqnarray} % \parbox{20mm}{\begin{fmfgraph}(20,15)\fmfkeep{boson} % \fmfleft{i} \fmfright{o} \fmf{dashes}{i,v,v,o} % \end{fmfgraph}} & \propto & \Lambda^2 \\ % \parbox{20mm}{\begin{fmfgraph}(20,15)\fmfkeep{fermion} % \fmfleft{i} \fmfright{o} \fmf{dashes}{i,v1} \fmf{dashes}{v2,o} % \fmf{fermion,left,tension=.3}{v1,v2,v1} % \end{fmfgraph}} & \propto & \Lambda^2 \\ % \parbox{20mm}{\fmfreuse{boson}} \quad + \quad % \parbox{20mm}{\fmfreuse{fermion}} & \propto & \ln\Lambda^2 % \end{eqnarray} % % \subsubsection{Grouping} % % \DescribeEnv{fmfgroup} % Make the enclosed |\fmfset| assignments local to this environment. % % \subsubsection{Changing parameters} % % \DescribeMacro{\fmfset} % \manindex{parameters} % This command can be used to change the parameters in % table~\ref{tab:parameters} as follows: % \begin{quote} % |\fmfset{|\meta{parameter}|}{|\meta{value}|}| % \end{quote} % Note that these parameters are not stored in the graph data % structure for the individual vertices and arcs. Instead the current % values at the time of |\fmfdraw| are used. % % \DeleteShortVerb{\|} % \MakeShortVerb{\"} % % \begin{table}[t] % \begin{center} % \begin{tabular}{|l|c|c|}\hline % Parameter & Default & Semantics \\\hline\hline % "thin" & 1pt & thin arcs \\\hline % "thick" & 1.5"thin" & thicker arcs \\\hline % "arrow_len" & 4mm & length of arrow head \\\hline % "arrow_ang" & 15 & opening angle of arrow head \\\hline % "curly_len" & 3mm & length of one curl \\\hline % "dash_len" & 3mm & length of one dash \\\hline % "dot_len" & 2mm & distance of two dots \\\hline % "wiggly_len" & 4mm & length of one wiggle \\\hline % "wiggly_slope" & 60 & inclination of wiggles \\\hline % "zigzag_len" & 2mm & length of a zig-zag period \\\hline % "zigzag_width" & 2"thick" & width of zig-zag lines \\\hline % "decor_size" & 5mm & default size of vertex decors \\\hline % "dot_size" & 4"thick" & diameter of dots \\\hline % \end{tabular} % \end{center} % \caption{Available style parameters.} % \label{tab:parameters} % \end{table} % % \DeleteShortVerb{\"} % \MakeShortVerb{\|} % % \subsubsection{Shrinking} % % \DescribeEnv{fmfshrink} % Shrink the linewidths and similar parameters in the enclosed section. % % \subsubsection{Debugging} % % \DescribeMacro{\fmftrace} % \DescribeMacro{\fmfnotrace} % \manindex{tracing} % Enable and disable tracing of the layout decisions. This is not % necessarily printed in an intuitive format, but can be helpful for % debugging. % % \DescribeMacro{\fmfdisplay} % \DescribeMacro{\fmfstopdisplay} % \manindex{displays, online} % \manindex{online displays} % Enable online displays. |\fmfstopdisplay| will halt \MF{} everytime % a graph is complete. % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsubsection{Multiple vertices and arcs} % % \DescribeEnv{fmffor} % \manindex{looping} % The environment % \begin{quote} % \begin{flushleft} % |\begin{fmffor}{|\meta{var}|}{|\meta{from}|}{|\meta{step}|}{|\meta{to}|}|\\ % \qquad \meta{body}\\ % |\end{fmffor}| % \end{flushleft} % \end{quote} % executes \meta{body} multiple times, setting \meta{var} to % $\meta{from}, \meta{from}+\meta{step}, \ldots, \meta{to}$. % An application of this above \FMF{} feature is shown in % figure~\ref{fig:euler-heisenberg}, which is generated by calling % the \TeX{} macro % \begin{verbatim} % \def\EulerHeisenberg#1{% % \begin{fmfgraph}(40,25) % \fmfpen{thick} % \fmfsurroundn{e}{#1} % \begin{fmffor}{n}{1}{1}{#1} % \fmf{photon}{e[n],i[n]} % \end{fmffor} % \fmfcyclen{fermion,tension=#1/8}{i}{#1} % \end{fmfgraph}} % \end{verbatim} % with the arguments 4, 6, 8, and 10, respectively. % \def\EulerHeisenberg#1{% % \begin{fmfgraph}(40,25) % \fmfpen{thick} % \fmfsurroundn{e}{#1} % \begin{fmffor}{n}{1}{1}{#1} % \fmf{photon}{e[n],i[n]} % \end{fmffor} % \fmfcyclen{fermion,tension=#1/8}{i}{#1} % \end{fmfgraph}} % \begin{figure}[t] % \begin{center} % \EulerHeisenberg{4} \qquad \EulerHeisenberg{6} % \end{center} % \begin{center} % \EulerHeisenberg{8} \qquad \EulerHeisenberg{10} % \end{center} % \caption{Higher order terms in the Euler-Heisenberg lagrangian.} % \label{fig:euler-heisenberg} % \end{figure} % % Similarly, we can draw the diagrams from many particle physics in % figures~\ref{fig:PP-rings} and~\ref{fig:PH-rings}: % \begin{verbatim} % \def\PPRing#1{% % \begin{fmfgraph}(20,20) % \fmfsurroundn{v}{#1} % \fmfdotn{v}{#1} % \fmfcyclen{fermion,right=0.25}{v}{#1} % \fmfcyclen{fermion,left=0.25}{v}{#1} % \end{fmfgraph}} % \def\PHRing#1{% % \begin{fmfgraph}(20,20) % \fmfsurroundn{v}{#1} % \fmfdotn{v}{#1} % \fmfcyclen{fermion,right=0.25}{v}{#1} % \fmfrcyclen{fermion,right=0.25}{v}{#1} % \end{fmfgraph}} % \end{verbatim} % \def\PPRing#1{% % \begin{fmfgraph}(20,20) % \fmfsurroundn{v}{#1} % \fmfdotn{v}{#1} % \fmfcyclen{fermion,right=0.25}{v}{#1} % \fmfcyclen{fermion,left=0.25}{v}{#1} % \end{fmfgraph}} % \def\PHRing#1{% % \begin{fmfgraph}(20,20) % \fmfsurroundn{v}{#1} % \fmfdotn{v}{#1} % \fmfcyclen{fermion,right=0.25}{v}{#1} % \fmfrcyclen{fermion,right=0.25}{v}{#1} % \end{fmfgraph}} % \begin{figure}[t] % \begin{center} % \PPRing{3}\qquad\PPRing{4}\qquad\PPRing{5}\qquad\PPRing{6} % \end{center} % \caption{\label{fig:PP-rings}Particle-particle ring diagrams} % \end{figure} % \begin{figure}[t] % \begin{center} % \PHRing{3}\qquad\PHRing{4}\qquad\PHRing{5}\qquad\PHRing{6} % \end{center} % \caption{\label{fig:PH-rings}Particle-hole ring diagrams} % \end{figure} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Immediate mode} % \label{sec:immediate} % % In addition to the automatic layout of vertices, \FMF{} features an % immediate mode, in which \FMF's drawing commands operate directly on % \MF's |pair|s and |path|s. You might want to consult The \MF{} % Book~\cite{MF} or the \MP{} manual~\cite{MetaPost} for further % information on the available |path| expressions. % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsubsection{Arcs} % \label{sec:fmfi} % % \DescribeMacro{\fmfi} % \manindex{arcs} % Immediate mode's brother of |\fmf|. % \begin{quote} % |\fmfi{|\meta{style}$[$|,|\meta{opt}$[$|=|\meta{val}$]$|,|\ldots$]$^^A % |}{|\meta{p}|}| % \end{quote} % draws a line of % style \meta{style} on path \meta{p}. Use the |vpath| function in % \meta{p} (\emph{after} |\fmffreeze|!) to access the \MF{} |path| % connecting two vertices: % |vpath|$[$\meta{tag}$]$|(|\meta{from}|,|\meta{to}|)|. The optional % numeric \meta{tag} can be used together with a matching |tag| option % to |\fmf| to disambiguate arcs that connect the same vertices. % You have to prepend each name of a vertex in |vpath|'s arguments % with two underscores (e.g.~|v1| becomes |__v1|). This is necessary % for avoiding nameclashes with some reserved words in \MF{} % (\textit{sparks} in DEK's terminology). % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsubsection{Vertices} % \label{sec:fmfiv} % % \DescribeMacro{\fmfiv} % \manindex{vertices} % Immediate mode's brother of |\fmfv|. % \begin{quote} % |\fmfiv{|\meta{shape}$[$|=|\meta{val}$][$|,|\meta{opt}^^A % $[$|=|\meta{val}$]$|,|\ldots$]$|}{|\meta{v}|}| % \end{quote} % draws a vertex at position \meta{v}. Note that here \meta{v} is a % \MF{} |pair| and \emph{not} a \FMF{} vertex name. The former's % equivalent of the latter can be accessed (\emph{after} % |\fmffreeze|!) with the |vloc| function: |vloc(|\meta{vertex}|)|. % Again, you have to prepend the name of the vertex in |vloc|'s % argument with two underscores (e.g.~|v1| becomes |__v1|). % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsubsection{Declarations} % % \DescribeMacro{\fmfipath} % The argument(s) are declared \MF{} |path|s. % % \DescribeMacro{\fmfipair} % The argument(s) are declared \MF{} |pair|s (coordinates). % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsubsection{Assignments} % % \DescribeMacro{\fmfiequ} % Establish equality for the two arguments, % i.e.~|\fmfiequ{lval}{rval}| translates to |lval=rval|. % % \DescribeMacro{\fmfiset} % Assign the second argument to the first, % i.e.~|\fmfiset{lval}{rval}| translates to |lval:=rval|. % % Specifying equality of two variables is a very different operation % from assignment in \MF{}. See The \MF{} Book~\cite{MF} for details % on \MF's builtin equation solver. % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsubsection{Examples} % % Here is a non-trivial example of immediate mode, which shows some % useful tricks. The non-trivial aspect of the diagram in question is % that it has lines broken in two, denoting particles coupling to a % condensate. % % \begin{examples}{40mm} % % We start the diagram with a skeleton (the |phantom| lines are shown % as thin lines for clarity): % \begin{verbatim} % \fmfleft{i} % \fmfright{o} % \fmf{dots}{i,v1} % \fmf{dots}{v2,o} % \fmf{phantom,left,tension=0.2,tag=1}{v1,v2} % \fmf{phantom,left,tension=0.2,tag=2}{v2,v1} % \fmfdot{v1,v2} % \fmfposition % \end{verbatim} % \marginexample{% % \begin{fmfgraph}(40,30) % \fmfpen{thick} % \fmfleft{i} % \fmfright{o} % \fmf{dots}{i,v1} % \fmf{dots}{v2,o} % \fmf{phantom,left,tension=0.2,tag=1}{v1,v2} % \fmf{phantom,left,tension=0.2,tag=2}{v2,v1} % \fmfposition % \fmfdraw % \fmfpen{.5thin} % \fmf{plain,left}{v1,v2} % \fmf{plain,left}{v2,v1} % \end{fmfgraph}} % Add the fermions to the skeleton % \begin{verbatim} % \fmfipath{p[]} % \fmfiset{p1}{vpath1(__v1,__v2)} % \fmfiset{p2}{vpath2(__v2,__v1)} % \fmfi{fermion}{subpath (0,length(p1)/3) of p1} % \fmfi{fermion}{subpath (2length(p1)/3,length(p1)) of p1} % \fmfi{fermion}{subpath (0,length(p2)/3) of p2} % \fmfi{fermion}{subpath (2length(p2)/3,length(p2)) of p2} % \end{verbatim} % \marginexample{% % \begin{fmfgraph}(40,30) % \fmfpen{thick} % \fmfleft{i} % \fmfright{o} % \fmf{dots}{i,v1} % \fmf{dots}{v2,o} % \fmf{phantom,left,tension=0.2,tag=1}{v1,v2} % \fmf{phantom,left,tension=0.2,tag=2}{v2,v1} % \fmfdot{v1,v2} % \fmfposition % \fmfipath{p[]} % \fmfiset{p1}{vpath1(__v1,__v2)} % \fmfiset{p2}{vpath2(__v2,__v1)} % \fmfi{fermion}{subpath (0,length(p1)/3) of p1} % \fmfi{fermion}{subpath (2length(p1)/3,length(p1)) of p1} % \fmfi{fermion}{subpath (0,length(p2)/3) of p2} % \fmfi{fermion}{subpath (2length(p2)/3,length(p2)) of p2} % \end{fmfgraph}} % Add condensates and a gluon % \begin{verbatim} % \def\cond#1#2{% % \fmfiv{d.sh=cross,d.ang=#1,d.siz=5thick}{#2}} % \cond{30}{point length(p1)/3 of p1} % \cond{-30}{point 2length(p1)/3 of p1} % \cond{30}{point length(p2)/3 of p2} % \cond{-30}{point 2length(p2)/3 of p2} % \fmfi{gluon}{point length(p1)/10 of p1 % -- point 11length(p1)/12 of p1} % \def\vert#1{% % \fmfiv{d.sh=circle,d.f=1,d.siz=2thick}{#1}} % \vert{point length(p1)/12 of p1} % \vert{point 11length(p1)/12 of p1} % \end{verbatim} % \marginexample{% % \begin{fmfgraph}(40,30) % \fmfpen{thick} % \fmfleft{i} % \fmfright{o} % \fmf{dots}{i,v1} % \fmf{dots}{v2,o} % \fmf{phantom,left,tension=0.2,tag=1}{v1,v2} % \fmf{phantom,left,tension=0.2,tag=2}{v2,v1} % \fmfdot{v1,v2} % \fmfposition % \fmfipath{p[]} % \fmfiset{p1}{vpath1(__v1,__v2)} % \fmfiset{p2}{vpath2(__v2,__v1)} % \fmfi{fermion}{subpath (0,length(p1)/3) of p1} % \fmfi{fermion}{subpath (2length(p1)/3,length(p1)) of p1} % \fmfi{fermion}{subpath (0,length(p2)/3) of p2} % \fmfi{fermion}{subpath (2length(p2)/3,length(p2)) of p2} % \def\cond#1#2{\fmfiv{d.sh=cross,d.ang=#1,d.siz=5thick}{#2}} % \cond{30}{point length(p1)/3 of p1} % \cond{-30}{point 2length(p1)/3 of p1} % \cond{30}{point length(p2)/3 of p2} % \cond{-30}{point 2length(p2)/3 of p2} % \fmfi{gluon}{point length(p1)/10 of p1 -- point 11length(p1)/12 of p1} % \def\vert#1{\fmfiv{d.sh=circle,d.f=1,d.siz=2thick}{#1}} % \vert{point length(p1)/12 of p1} % \vert{point 11length(p1)/12 of p1} % \end{fmfgraph}} % % Here's an interesting abuse of \FMF{} (see the next section for % |\fmfcmd|): % \begin{verbatim} % \begin{fmfgraph*}(40,40) % \fmfipair{o,xm,xp,ym,yp} % \fmfiequ{o}{(.5w,.1h)} % \fmfiequ{xm}{(0,.1h)} % \fmfiequ{xp}{(w,.1h)} % \fmfiequ{ym}{(.5w,0)} % \fmfiequ{yp}{(.5w,h)} % \fmfiv{l=$x$,l.a=-135,l.d=2mm}{xp} % \fmfiv{l=$y=x^2$,l.a=-135,l.d=2mm}{yp} % \fmfpen{thin} % \fmfcmd{draw xm--xp; draw ym--yp;} % \fmfpen{thick} % \fmfiequ{xs}{xpart(xp-o)} % \fmfiequ{ys}{ypart(yp-o)} % \fmfcmd{draw (o + (-xs,ys)) for n = -9 upto 10: % --(o + (xs*(n/10),ys*((n/10)**2))) % endfor;} % \end{fmfgraph*} % \end{verbatim} % \marginexample{% % \begin{fmfgraph*}(40,40) % \fmfipair{o,xm,xp,ym,yp} % \fmfiequ{o}{(.5w,.1h)} % \fmfiequ{xm}{(0,.1h)} % \fmfiequ{xp}{(w,.1h)} % \fmfiequ{ym}{(.5w,0)} % \fmfiequ{yp}{(.5w,h)} % \fmfiv{l=$x$,l.a=-135,l.d=2mm}{xp} % \fmfiv{l=$y=x^2$,l.a=-135,l.d=2mm}{yp} % \fmfpen{thin} % \fmfcmd{draw xm--xp; draw ym--yp;} % \fmfpen{thick} % \fmfiequ{xs}{xpart(xp-o)} % \fmfiequ{ys}{ypart(yp-o)} % \fmfcmd{draw (o + (-xs,ys)) for n = -9 upto 10: % --(o + (xs*(n/10),ys*((n/10)**2))) % endfor;} % \end{fmfgraph*}} % % \end{examples} % % Finally, for the curious, here is how to draw the circular gluons in % figure~\ref{fig:gluons}: % \begin{verbatim} % \fmfi{gluon}{fullcircle scaled .5w shifted (.5w,.5h)} % \fmfi{gluon}{reverse fullcircle scaled .5w shifted (.5w,.5h)} % \end{verbatim} % % \begin{figure}[t] % \begin{center} % \begin{fmfgraph}(40,40) % \fmfi{gluon}{fullcircle scaled .5w shifted (.5w,.5h)} % \end{fmfgraph} % \qquad % \begin{fmfgraph}(40,40) % \fmfi{gluon}{reverse fullcircle scaled .5w shifted (.5w,.5h)} % \end{fmfgraph} % \end{center} % \caption{Circular gluons.} % \label{fig:gluons} % \end{figure} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Raw \MF} % % Some more advanced features of \FMF{} are more conveniently % accessed through raw \MF{} commands. This can either be % achieved by preparing a \MF{} input file or by using |\fmfcmd| % extensively. The latter apprach is usally more convenient. % % \DescribeMacro{\fmfcmd} % The |\fmfcmd| macro writes its argument into the \MF{} input % file generated by \FMF. While some experience in using % \MF{} doesn't hurt here, this approach can simplify the % production of complex diagrams considerably. Note that \emph{no} % semicolon is appended, the user has to provide it explicitely. % % \subsubsection{Extending \FMF} % \label{sec:extensions} % % \manindex{extensions} % \manindex{defining new styles} % \manindex{styles, defining new} % A prominent example for using raw \MF{} is provided by the option to % add new styles for arcs. There is of course always one more style % that \emph{must} be added to the default list. But increasing this % list without bounds will eventually slow down \FMF{} and increase % its memory requirements. It is therefore better to allow users to % define their own styles. This is done with the \MF{} macro % |style_def|, which defines a macro that will be called to do the % drawing and registers this macro with \FMF{} so that it can be used % in the first argument to |\fmf|. % % The macro takes one argument of type |path| and is responsible for % drawing the arc on this path. If \MP's color functionality is to be % used, the color aware functions |cdraw|, |cfill|, |cfilldraw|, % |ccutdraw| and |cdrawdot| should be used instead of |draw|, etc. % % \begin{examples}{40mm} % % \manindex{crossed arcs} % After the following |style_def|, a new style |crossed| will be % available: % \begin{verbatim} % \fmfcmd{% % vardef cross_bar (expr p, len, ang) = % ((-len/2,0)--(len/2,0)) % rotated (ang + angle direction length(p)/2 of p) % shifted point length(p)/2 of p % enddef; % style_def crossed expr p = % cdraw p; % ccutdraw cross_bar (p, 5mm, 45); % ccutdraw cross_bar (p, 5mm, -45) % enddef;} % \end{verbatim} % \fmfcmd{% % vardef cross_bar (expr p, len, ang) = % ((-len/2,0)--(len/2,0)) % rotated (ang + angle direction length(p)/2 of p) % shifted point length(p)/2 of p % enddef; % style_def crossed expr p = % cdraw p; % ccutdraw cross_bar (p, 5mm, 45); % ccutdraw cross_bar (p, 5mm, -45) % enddef;} % it can be used just like any other style: % \begin{verbatim} % \fmfleft{i} % \fmfright{o} % \fmf{plain}{i,v,o} % \fmf{crossed}{v,v} % \fmfdot{v} % \end{verbatim} % \marginexample{% % \begin{fmfgraph}(40,30) % \fmfpen{thick} % \fmfleft{i} % \fmfright{o} % \fmf{plain}{i,v,o} % \fmf{crossed}{v,v} % \fmfdot{v} % \end{fmfgraph}} % And here is an (esthetically questionable!) attempt at wiggly lines % with arrows: % \begin{verbatim} % \fmfcmd{% % style_def wiggly_arrow expr p = % cdraw (wiggly p); % shrink (2); % cfill (arrow p); % endshrink; % enddef;} % \end{verbatim} % \fmfcmd{% % style_def wiggly_arrow expr p = % cdraw (wiggly p); % shrink (2); % cfill (arrow p); % endshrink; % enddef;} % \marginexample{% % \begin{fmfgraph}(40,10) % \fmfpen{thick} % \fmfleft{i} % \fmfright{o} % \fmf{wiggly_arrow}{i,o} % \end{fmfgraph}} % Note how the |shrink| macro (which is the \MF{} equivalent of the % |fmfshrink| environment) is used to temporarily double the % dimensions of the arrowhead which is constructed by the |arrow| % macro. % % In particular theorists beyond the standard model are likely to need % \emph{a lot} of different line styles. The aficionados of majorana % neutrinos might find the following two useful: % \begin{verbatim} % \fmfcmd{% % style_def majorana expr p = % cdraw p; % cfill (harrow (reverse p, .5)); % cfill (harrow (p, .5)) % enddef; % style_def alt_majorana expr p = % cdraw p; % cfill (tarrow (reverse p, .55)); % cfill (tarrow (p, .55)) % enddef;} % \end{verbatim} % \fmfcmd{% % style_def majorana expr p = % cdraw p; % cfill (harrow (reverse p, .5)); % cfill (harrow (p, .5)) % enddef; % style_def alt_majorana expr p = % cdraw p; % cfill (tarrow (reverse p, .55)); % cfill (tarrow (p, .55)) % enddef;} % \marginexample{% % \begin{fmfgraph}(40,30) % \fmfpen{thick} % \fmfleftn{i}{2} \fmfrightn{o}{2} % \fmf{majorana}{i1,v1,o1} % \fmf{alt_majorana}{i2,v2,o2} % \fmfn{boson}{v}{2} % \fmfdotn{v}{2} % \end{fmfgraph}} % Note the use of the |harrow| and |tarrow| functions which return an % arrowhead on the given fraction of the path, with reference points % at the head (|harrow|) or tail (|tarrow|). The |arrow| function % used above is equivalent to |marrow(p,.5)|, which has the reference % point at the center of the arrowhead. Having the three different % reference point available is important for supporting arcs of % substantially differing lengths. % % A problem of the current implementation is that the endpoints of % double lines don't match smoothly at vertices: % \begin{verbatim} % \fmfpen{thick}\fmfleftn{l}{2}\fmfrightn{r}{2} % \fmfpolyn{shaded}{z}{4} % \fmf{dbl_plain_arrow}{l2,z3} % \fmf{dbl_plain_arrow}{l1,z4} % \fmf{dbl_plain_arrow}{z1,r1} % \fmf{dbl_plain_arrow}{z2,r2} % \end{verbatim} % \marginexample{% % \begin{fmfgraph}(40,25) % \fmfpen{thick}\fmfleftn{l}{2}\fmfrightn{r}{2} % \fmfpolyn{shaded}{z}{4} % \fmf{dbl_plain_arrow}{l2,z3} % \fmf{dbl_plain_arrow}{l1,z4} % \fmf{dbl_plain_arrow}{z1,r1} % \fmf{dbl_plain_arrow}{z2,r2} % \end{fmfgraph}} % One way around is to add dots of the right size at the vertices % \emph{after} the arcs have been drawn. % \begin{verbatim} % \fmfpen{thick}\fmfleftn{l}{2}\fmfrightn{r}{2} % \fmfpolyn{shaded}{z}{4} % \fmf{dbl_plain_arrow}{l2,z3} % \fmf{dbl_plain_arrow}{l1,z4} % \fmf{dbl_plain_arrow}{z1,r1} % \fmf{dbl_plain_arrow}{z2,r2} % \fmffreeze\fmfdraw % \fmfvn{d.siz=2thick,d.sh=circle}{z}{4} % \end{verbatim} % \marginexample{% % \begin{fmfgraph}(40,25) % \fmfpen{thick}\fmfleftn{l}{2}\fmfrightn{r}{2} % \fmfpolyn{shaded}{z}{4} % \fmf{dbl_plain_arrow}{l2,z3} % \fmf{dbl_plain_arrow}{l1,z4} % \fmf{dbl_plain_arrow}{z1,r1} % \fmf{dbl_plain_arrow}{z2,r2} % \fmffreeze\fmfdraw % \fmfvn{d.siz=2thick,d.sh=circle}{z}{4} % \end{fmfgraph}} % Without the |\fmffreeze\fmfdraw|, the arcs would ``know'' about the % dots and would be shortened. % % A more elegant solution is to define line styles with dots at the % head, % \begin{verbatim} % \fmfcmd{vardef endpoint_dot expr p = % save oldpen; pen oldpen; % oldpen := currentpen; % pickup oldpen scaled 3; % cdrawdot p; % pickup oldpen; % enddef;} % \fmfcmd{style_def hd_double expr p = % draw_double p; % endpoint_dot point infinity of p; % enddef;} % \fmfcmd{style_def hd_dbl_plain_arrow expr p = % draw_hd_double p; % shrink (1.5); % cfill (arrow p); % endshrink; % enddef;} % \end{verbatim} % \fmfcmd{% % vardef endpoint_dot expr p = % save oldpen; pen oldpen; % oldpen := currentpen; % pickup oldpen scaled 3; % cdrawdot p; % pickup oldpen; % enddef;} % \fmfcmd{% % style_def hd_double expr p = % draw_double p; % endpoint_dot point infinity of p; % enddef;} % \fmfcmd{% % style_def hd_dbl_plain_arrow expr p = % draw_hd_double p; % shrink (1.5); % cfill (arrow p); % endshrink; % enddef;} % tail % \begin{verbatim} % \fmfcmd{style_def td_double expr p = % draw_double p; % endpoint_dot point 0 of p; % enddef;} % \fmfcmd{style_def td_dbl_plain_arrow expr p = % draw_td_double p; % shrink (1.5); % cfill (arrow p); % endshrink; % enddef;} % \end{verbatim} % \fmfcmd{% % style_def td_double expr p = % draw_double p; % endpoint_dot point 0 of p; % enddef;} % \fmfcmd{% % style_def td_dbl_plain_arrow expr p = % draw_td_double p; % shrink (1.5); % cfill (arrow p); % endshrink; % enddef;} % or both % \begin{verbatim} % \fmfcmd{style_def htd_double expr p = % draw_double p; % endpoint_dot point 0 of p; % endpoint_dot point infinity of p; % enddef;} % \fmfcmd{style_def htd_dbl_plain_arrow expr p = % draw_htd_double p; % shrink (1.5); % cfill (arrow p); % endshrink; % enddef;} % \end{verbatim} % \fmfcmd{% % style_def htd_double expr p = % draw_double p; % endpoint_dot point 0 of p; % endpoint_dot point infinity of p; % enddef;} % \fmfcmd{% % style_def htd_dbl_plain_arrow expr p = % draw_htd_double p; % shrink (1.5); % cfill (arrow p); % endshrink; % enddef;} % which can be used as follows to give an equivalent result: % \begin{verbatim} % \fmfpen{thick}\fmfleftn{l}{2}\fmfrightn{r}{2} % \fmfpolyn{shaded}{z}{4} % \fmf{hd_dbl_plain_arrow}{l2,z3} % \fmf{hd_dbl_plain_arrow}{l1,z4} % \fmf{td_dbl_plain_arrow}{z1,r1} % \fmf{td_dbl_plain_arrow}{z2,r2} % \end{verbatim} % \marginexample{% % \begin{fmfgraph}(50,30) % \fmfpen{thick}\fmfleftn{l}{2}\fmfrightn{r}{2} % \fmfpolyn{shaded}{z}{4} % \fmf{hd_dbl_plain_arrow}{l2,z3} % \fmf{hd_dbl_plain_arrow}{l1,z4} % \fmf{td_dbl_plain_arrow}{z1,r1} % \fmf{td_dbl_plain_arrow}{z2,r2} % \end{fmfgraph}} % % \end{examples} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Common traps, trouble shooting and frequently asked % questions (FAQs)} % % \subsubsection{\texttt{! Value is too large}} % \label{sec:value-to-large} % The following will be one of the most frequent errors: % \begin{verbatim} % ! Value is too large (4097). % ; % % beginchar->...rdp:=(EXPR3);w:=hround(charwd*hppp); % h:=... % l.685 ...char(64, 40*2.84526pt#, 25*2.84526pt#, 0) % ; % ? % \end{verbatim} % It can have one of two causes: % \begin{itemize} % \item{} \MF{} was invoked without specifying the |mode|. % This case is easily fixed by looking up the correct \MF{} mode % in the file |modes.mf| that comes with the \MF{} distribution. % This mode \emph{must} be specified on the % command line as |\mode:=laserjet| for HP Laserjets at 300dpi, as % |\mode:=ljfour| for HP Laserjets at 600dpi, as % |\mode:=nexthi| for NeXT laser printers at 400dpi, etc, % just to name three of the more common laser printers in the % physics community. % \item{} The diagrams are too large for the printer at hand. % This case is actually not very likely, because even at 1200dpi % the diagrams can be as large as 86mm. For the popular % laserprinter resolution of 300dpi, even 346mm are possible. % Last time I checked, the diagrams for this manual could be % generated for a \textit{Linotype Linotronic 300} at 2540dpi % (|mode:=linosuper|), but failed in the standard |proof| mode at % 2601.72dpi.\footnote{% % It would be trivial to shrink the diagrams by 1\%\ to make % them work in \texttt{proof} mode (accidentally, the largest % diagram is 40mm wide, while 4096/2601.72dpi corresponds to % 39.99mm). However, I prefer \MF{} to give an error message if % the user forgot to specify the mode. It is much more obscure % when \MF{} works without errors but the \texttt{dvi} driver % fails to find the generated bitmap file.} % In fact, in the current |modes.mf| file, the % \textit{Chelgraph IBX} at 9600dpi and the \textit{Alphatype CRS} % at $5333+1/3$dpi are the only typesetters that can not be used % to typeset this manual.\footnote{% % If someone wants to use \FMF{} with one of these high end % typesetters, I would be glad to try to help them out with % kludges.} % \end{itemize} % % \subsubsection{Diagrams in the document are never updated} % \label{sec:out-of-date} % There are two known reasons why diagrams may not be updated the % document after the source file has been changed: % \begin{itemize} % \item Some |dvi| file previewers (e.g.~|xdvi(1)| under UNIX) do % \emph{not} reread font information if the |tfm| or |pk| files % have changed, even though they reread the |dvi| file if it has % changed. Therefore you have to restart such previewers if you % have made changes in diagrams to see these changes on the screen. % \item Some |dvi| drivers (e.g.~|dvips(1)| under UNIX) do not work % with the |gf| files directly, but convert them with an external % program to |pk| format first. On later occasions, the |dvi| % driver will then use the |pk| file which is out of date with % respect to the sources and the |gf| file. The only known fix is % to delete the |pk| fils before running the |dvi| driver. % \end{itemize} % % \subsubsection{Disgrams show up in the wrong spot} % If you are using \FMF{} with \LaTeX's |\includeonly| feature, you % should watch out for the following situation: % \begin{verbatim} % \includeonly{bar1,bar3} % \begin{fmffile}{foograph} % \include{bar1} % \include{bar2} % \include{bar3} % \end{fmffile} % \end{verbatim} % where |bar1.tex| defines graph \#1, |bar2.tex| graph \#2 and % |bar3.tex| defines graph \#3. If you now proceeded to add graphs to % |bar1.tex|, you will notice that a second graph is accepted, but % instead of the new third graph, the old graph \#3 appears. What % happens is that \LaTeX{} stores the value of the counter for % |fmfgraph|s in each |.aux| file so that because |bar2.tex| is not % processed, this counter is always reset to 3 at the beginning of % |bar3.tex|. % % Even though this situation appears to be contrived, it actually % occured in real life applications and the resulting error is very % confusing. % % The only ``fix'' for this problem would be to use a private counter % behind \LaTeX's back. Unfortunately, it appears that this will % violate the \emph{principle of minimal surprise} even more. It is % therefore usually a good idea to reprocess the complete document % when the number of graphs has changed in an |\include|d file. The % other solution is to have a separate |fmfgraph| environment for each % |\include|d file. % % \subsubsection{Spurious labels show up} % If spurious labels show up in your diagrams, this is most likely % caused by old label files (e.g.~|foo.t|\meta{n}) still lying % around. Just delete these files and rerun \TeX{} and \MF{} (or % \MP{} respectively). % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Known bugs} % % \subsubsection{Chaotic manual} % This is being worked on. It should probably be rewritten from % scratch, but I don't have enough time at the moment (this is a spare % time activity). % % \subsubsection{Delayed error messages} % This can't be fixed. The problem is that errors can manifest % themselves only a long time after the corresponding source line has % been read. Since \TeX{} doesn't allow to access the current source % line number, there is no way to store this information along with % the other information on the graph. % I can only hope to have enough sanity checks in % place some day that error messages from \MF{} won't occur. % % \subsubsection{Multiple tadpoles} % Currently, \FMF{} will not layout multiple tadpoles at a single % vertex automatically. This could be fixed in principle, but these % fixes would cause other problems which are more inconvenient than % having to lay out tadpoles manually. % % \subsubsection{Hard limits} % Currently the most severe limitation lies in the size of the % generated pictures. The largest number \MF{} can represent % internally is~4095.99998 and this is also the largest value any % coordinate measured in pixels can assume. At the most popular % laserprinter resolution of~300 dots per inch (dpi), this corresponds % to a horizontal and vertical extension of about~346mm, which is % plenty and we're more likely to hit the internal limits on the % complexity of a picture. However, at the proof mode resolution % of~2601.72dpi, this is reduced to slightly less than~40mm and we're % running the risk of arithmetic overflow in internal calculations much % earlier. % % There are two potential solutions of different scope and complexity: % \begin{itemize} % \item{} Since John Hobby's \MP{} is now available without a % non-disclosure agreement from AT\&T, one solution is to replace % \MF{} by \MP, which doesn't suffer from the size % limitations. % This comes with a small price paid in reduced portability of the % generated output, but as already stated above in the case of % |axodraw|, the ubiquity of PostScript printers (and the free % GhostScript interpreter) makes this a minor point. % \item{} The more ambitious solutions would be \emph{virtual graphs}, % i.e.~graphs which are larger than the current limit enforced % by numeric overflow at higher resolutions. This could be % implemented by calculating the layout of a miniature graph and % afterwards distributing the full graph among several \MF{} % characters. % \end{itemize} % % \end{fmffile} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \section*{Acknowledgements} % % I am most grateful to Wolfgang Kilian, who pushed \FMF's predecessor % |feynman.mf| to its limits~\cite{Kil94}. Discussions with him % triggered a lot of good ideas. Thanks also to my students and the % people on \emph{The Net} for suggestions, portability fixes and for % volunteering as guinea pigs. % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \begin{thebibliography}{99} % \bibitem{TeX} Donald E.~Knuth, \textit{The \TeX{}book}, % Addison-Wesley, Reading MA, 1986. % \bibitem{LaTeX} Leslie Lamport, \textit{\LaTeX{} --- A % Documentation Preparation System}, % Addison-Wesley, Reading MA, 1985. % \bibitem{LaTeX-Companion} Michel Goosens, Frank Mittelbach, and % Alexander Samarin, \textit{The \LaTeX{} Companion}, % Addison-Wesley, Reading MA, 1994. % \bibitem{MF} Donald E.~Knuth, \textit{The \MF{}book}, % Addison-Wesley, Reading MA, 1986. % \bibitem{MetaPost} John D.~Hobby, \textit{A User's Manual for % \MP}, Computer Science Report \#162, AT\&T Bell % Laboratories, April 1992. % \bibitem{CPC} Thorsten Ohl, % Comp.~Phys.~Comm.~\textbf{90} (1995) 340. % \bibitem{CNL} Thorsten Ohl, % CERN Computer Newsletter~\textbf{220} (1995) 22; % \textbf{221} (1995) 46; \textbf{222} (1996) 24. % \bibitem{levine} Micheal J.~S.~Levine, % Comp.~Phys.~Comm.~\textbf{58} (1990) 181. % \bibitem{axodraw} Jos Vermaseren, % Comp.~Phys.~Comm.~\textbf{83} (1994) 45. % \texttt{axodraw} is available from CTAN % (cf.~p.~\pageref{pg:CTAN}), in the \texttt{graphics} directory. % ^^A Comp.~Phys.~Comm.~\textbf{??} (1995) ???. % \bibitem{mfpic} Thomas E.~Leathrum, \texttt{mfpic}, available from % CTAN (cf.~p.~\pageref{pg:CTAN}), in the \texttt{graphics} % directory. % \bibitem{madgraph} Tim Stelzer and Bill Long, % Comp.~Phys.~Comm.~\textbf{81} (1994) 357. % \bibitem{Kil94} Wolfgang Kilian, Doctoral Thesis, Technical % University Darmstadt, 1994. % \bibitem{Lambda} Alan Jeffrey, \textit{Lists in \TeX's Mouth}, % TUGboat 199?. % \end{thebibliography} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \section*{Distribution} % \label{sec:distribution} % % \FMF{} is available by anonymous internet ftp from any of the % Comprehensive \TeX{} Archive Network (CTAN) hosts % \label{pg:CTAN} % \begin{quote} % |ftp.shsu.edu|, |ftp.tex.ac.uk|, |ttp.dante.de| % \end{quote} % in the directory % \begin{quote} % |macros/latex/contrib/supported/feynmf| % \end{quote} % It is also available from the host % \begin{quote} % |crunch.ikp.physik.th-darmstadt.de| % \end{quote} % in the directory % \begin{quote} % |pub/ohl/feynmf| % \end{quote} % Unsupported snapshots of my work in progress are provided as % \begin{quote} % |pub/ohl/feynmf.versions/feynmf-current.tar.gz| % \end{quote} % There are two mailing lists % \begin{quote} % \begin{flushleft} % |feynmf-announce@crunch.ikp.physik.th-darmstadt.de|\\ % |feynmf-bugs@crunch.ikp.physik.th-darmstadt.de| % \end{flushleft} % \end{quote} % open for subscription. The former should carry only important % announcements, of new versions in particular. To subscribe, send % mail to the (electronic) mailing list manager % \begin{quote} % |majordomo@crunch.ikp.physik.th-darmstadt.de| % \end{quote} % and \emph{not} to the lists itself. The following commands (on a % line in the body of the mail, not in the subject) are useful: % \begin{quote} % \begin{flushleft} % |subscribe feynmf-announce|\\ % |unsubscribe feynmf-announce|\\ % |help| % \end{flushleft} % \end{quote} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \StopEventually{\PrintIndex\PrintChanges} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \newpage % \section{\TeX{} macros} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Startup} % % It's is good practice to identify this version of the document style % option. We do this by parsing an RCS |Id| string and storing the % result in the conventional \TeX{} control sequences: % \changes{v0.1}{1994/05/19}{% % Don't loose on {\tt RCS} strings even iff the dollar signs have % been removed.} % \changes{v0.8}{1995/02/18}{\LaTeX~2.09 compatibility} % \changes{v0.98}{1995/05/01}{% % Revise version control: allow for manual intervention to replace % the inconvenient RCS revision numbers by version numbers.} % \begin{macrocode} %<*style> \def\fileversion{v1.08} %\NeedsTeXFormat{LaTeX2e} {\def\RCS#1#2\endRCS{% \ifx$#1% \@RCS $#2 \endRCS \else \@RCS $*: #1#2$ \endRCS \fi}% \def\@RCS $#1: #2,v #3 #4 #5 #6 #7$ \endRCS{% \gdef\filename{#2}% \gdef\filerevision{#3}% \gdef\filedate{#4}% \gdef\filemaintainer{#6}}% \RCS $Id: feynmf.dtx,v 1.30 1996/12/02 09:20:36 ohl Exp $ \endRCS}% % \end{macrocode} % % And now the standard procedure: % \changes{v0.4}{1994/05/27}{% % \MP{} support: identification part, include % \texttt{graphicx} and pass options.} % \begin{macrocode} %<*!209> %<*!mp> \ProvidesPackage{feynmf}[\filedate\space\fileversion\space LaTeX/Metafont Feynman Diagram Package (\filemaintainer)] % %<*mp> \ProvidesPackage{feynmp}[\filedate\space\fileversion\space LaTeX/MetaPost Feynman Diagram Package (\filemaintainer)] % % % \end{macrocode} % Compatibiliy with sources written for \FMF{} \emph{before} % version~1.03, where macros in labels had to be protected by % |\noexpand|. The |\fmf@noexpandoff| macro will be used of % page~\pageref{pg:usenoexpandoff}. The default is a no-op. % \label{pg:defnoexpandoff} % \changes{v1.05}{1996/05/06}{% % Provide option \texttt{pre-1.03} for processing old files.} % \begin{macrocode} %<*!209> \let\fmf@noexpandoff\relax \DeclareOption{pre-1.03}{% \PackageWarning{feynmf}{% Pre v1.03 compatibility can clash with font loading} \def\fmf@noexpandoff{\let\noexpand\relax}} % \end{macrocode} % Alow the user to override the default interaction mode % |\errorstopmode|. We have to change modes temorarily on % page~\pageref{pg:useinteractionmode} below and \TeX{} % provides no means to save the state we started in. Therefore a % mode differing from the default has to be requested explicitely. % \label{pg:definteractionmode} % \changes{v1.06}{1996/05/21}{% % New options \texttt{errorstop}, \texttt{scroll}, % \texttt{nonstop} and \texttt{batch}.} % \begin{macrocode} \DeclareOption{errorstop}{\let\@interactionmode\errorstopmode} \DeclareOption{scroll}{\let\@interactionmode\scrollmode} \DeclareOption{nonstop}{\let\@interactionmode\nonstopmode} \DeclareOption{batch}{\let\@interactionmode\batchmode} \let\@interactionmode\errorstopmode % \end{macrocode} % Every option we don't understand is sent down to |graphics|: % \begin{macrocode} \DeclareOption*{\PassOptionsToPackage{\CurrentOption}{graphics}} \ProcessOptions % \end{macrocode} % For the sake of Portabilitical Correctness, we use \LaTeX's % |graphics| for including PostScript, instead of the simpler |epsf| % which comes with |dvips| and would have sufficed % \changes{v0.99}{1995/05/02}{% % Switch back to \texttt{graphics} from \texttt{graphicx} to fix % a problem with changing interfaces in the latter. Can't remember % why I used \texttt{graphicx} in the first place, \texttt{graphics} % works fine now.} % \begin{macrocode} %\RequirePackage{graphics}[1994/12/15] % %<*209> \def\fmf@noexpandoff{\let\noexpand\relax} %\input epsf.sty %\let\includegraphics\epsffile % % \end{macrocode} % Compatibility macros for \LaTeX~2.09. Our definition of % |\@inputcheck| is for supporting old and broken \LaTeX~2.09 versions % before March 18, 1992. Unfortunately, I couldn't get |\newread| to % work here with \LaTeX~2.09. % \changes{v0.99}{1995/05/02}{% % \texttt{\protect\bslash @inputcheck}: support for \LaTeX~2.09 % versions before 92/03/18.} % \begin{macrocode} %<*209> \@ifundefined{@inputcheck}{\def\@inputcheck{0}}{}% \def\InputIfFileExists#1#2#3{% \openin\@inputcheck#1 % \ifeof\@inputcheck \closein\@inputcheck #3% \else \closein\@inputcheck #2% \input{#1}% \fi} \def\IfFileExists#1#2#3{% \openin\@inputcheck#1 % \ifeof\@inputcheck \closein\@inputcheck #3% \else \closein\@inputcheck #2% \fi} % % \end{macrocode} % % \begin{dubious} % We should |\||mdqon| at the end only if the German extensions are % really active, not just loaded. % \end{dubious} % \begin{macrocode} \let\mdqrestore\relax \@ifundefined{mdqoff}{}{% \mdqoff \let\mdqrestore\mdqon} % \end{macrocode} % % \begin{macro}{\fmfcmd} % The entrance through which our commands enter the world of % \MF. Note the |\ignorespaces|: we need to avoid spurious % blanks in the output list. % \changes{v1.03}{1996/02/17}{% % Token register \texttt{\protect\bslash fmfbuf@} for single level % evaluation.} % Using a trick suggested in |comp.text.tex|, we use a token register % |\fmfbuf@| to force single level evaluation of commands which are to % be included in \MF{} strings. % \changes{v1.07}{1996/08/19}{% % Only write output if \texttt{\protect\bslash if@fmfio} is true.} % \begin{macrocode} \def\fmfcmd#1{% \if@fmfio \immediate\write\@outfmf{#1}% \fi \ignorespaces} \newif\if@fmfio \@fmfiotrue \newwrite\@outfmf \newtoks\fmfbuf@ % \end{macrocode} % \end{macro} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Environments} % % \begin{macro}{\fmffile} % This environment encloses each \MF{} input file. The single % argument gives the name of the file. % \changes{v0.1}{1994/05/16}{% % Stupid: \texttt{\protect\bslash fileversion} can be reset by other % packages, store the current value in % \texttt{\protect\bslash fmf@fileversion} and use this one.} % \changes{v0.1}{1994/05/20}{% % Pass RCS revision in a string.} % \changes{v0.4}{1994/05/27}{\MP{} support: write \MP{} file.} % \changes{v0.8}{1995/01/18}{% % Protect against wrong arguments to % \texttt{\protect\bslash fmffile}.} % \begin{macrocode} {\catcode`\%=11\gdef\p@rcent{%}} \edef\fmf@revision{\filerevision} \def\fmffile#1{% \def\thefmffile{#1}% \equaltojobname{\thefmffile}{% \errhelp={The argument of \fmffile MUST NOT be identical to the^^J% name of your main input file! I will use fmfdefault.mf^^J% this time around, but you'd better fix your code now!}% \errmessage{Invalid arument of \string\fmffile!}% \def\thefmffile{fmfdefault}}{}% % \end{macrocode} % The following trick has been taken from |mfpic|~\cite{mfpic}: % proceed even if the font is not available yet, because we have to % write the \MF{} file first. % \changes{v0.4}{1994/05/27}{\MP{} support: don't open \texttt{tfm} file.} % \changes{v0.98}{1995/04/30}{% % Save the font for the benefit of \texttt{\protect\bslash fmfkeep} and % \texttt{\protect\bslash fmfreuse}.} % \changes{v1.02}{1996/01/25}{% % Read the \texttt{.tfm} file \emph{before} writing the \MF{} file % destructively. This should allow a transparent two pass % processing if \texttt{MakeTeXTFM} is enabled. Thanks to Thomas % Esser for the suggestion.} % \begin{macrocode} %<*!mp> \batchmode \global\expandafter\font% \csname f@ynmf:\thefmffile\endcsname=\thefmffile % \end{macrocode} % The hardcoded return to |\errorstopmode| is bad for automated preprint % processors, but the integrated knowledge of |comp.text.tex| knows of % no way to implement local mode changes --- short of hacking \TeX{} % itself \ldots\par % Therefore we use a default interaction mode which can be specified % by the user as an option (see page~\pageref{pg:definteractionmode}). % \label{pg:useinteractionmode} % \changes{v1.06}{1996/05/21}{% % Use \texttt{\protect\bslash @interactionmode}.} % \begin{macrocode} \@interactionmode \expandafter\let\expandafter\f@ynmf\csname f@ynmf:\thefmffile\endcsname % \end{macrocode} % Inform the user: % \begin{macrocode} \ifx\f@ynmf\nullfont \def\f@ynmf{Feynman graph:}% \IfFileExists{\thefmffile.mf}% {\typeout{% feynmf: File \thefmffile.tfm not found:^^J% feynmf: Process \thefmffile.mf with METAFONT and then % reprocess this file.}}% {\typeout{% feynmf: Files \thefmffile.mf and \thefmffile.tfm not found:^^J% feynmf: This job will create \thefmffile.mf, process it % later with METAFONT^^J% feynmf: and then reprocess this file. Don't worry about a % harmless premature^^J% feynmf: MakeTeXTFM that might have failed just a moment ago!}}% \else \typeout{% feynmf: File \thefmffile.tfm found.^^J% feynmf: Nevertheless, if the picture has changed, % reprocess \thefmffile.mf.^^J% feynmf: If dimension have changed, reprocess \thefmffile.mf % and \jobname.tex.}% \fi % % \end{macrocode} % Open the \MF{} file. If we're running under AMS-\LaTeX, turn off % I/O during the first pass over equation environments. % \changes{v1.07}{1996/08/19}{% % Only write output if \texttt{\protect\bslash if@fmfio} is true.} % \changes{v1.07}{1996/08/19}{% % Set \texttt{\protect\bslash if@fmfio} to \texttt{\protect\bslash % ifmeasuring@ \protect\bslash else} if the latter is set, i.e.~if % AMS-\LaTeX{} is loaded.} % \begin{macrocode} \if@fmfio \@ifundefined{ifmeasuring@}% {}% {\def\if@fmfio{\ifmeasuring@\else}}% %<*!mp> \immediate\openout\@outfmf=\thefmffile.mf\relax \fmfcmd{\p@rcent\space \thefmffile.mf -- do not edit, % generated automatically by \jobname.tex^^J% input feynmf^^J% require_RCS_revision "\fmf@revision";}% % %<*mp> \immediate\openout\@outfmf=\thefmffile.mp\relax \fmfcmd{\p@rcent\space \thefmffile.mp -- do not edit, % generated automatically by \jobname.tex^^J% input feynmp^^J% require_RCS_revision "\fmf@revision";}% % \fi % \end{macrocode} % Count the graphs % \begin{macrocode} \setcounter{fmfgraph}{0}} \let\thefmffile\relax \newcounter{fmfgraph} % \end{macrocode} % \end{macro} % % \begin{macro}{\equaltojobname} % Here's a kludge for comparing strings to |\jobname|. The |\meaning| % hack is necessary, because |\jobname|'s expansion has different % |\catcode|s % \begin{macrocode} \def\equaltojobname#1#2#3{% \edef\@tempa{#1}% \edef\@tempa{\meaning\@tempa}% \edef\@tempb{\jobname}% \edef\@tempb{\meaning\@tempb}% \ifx\@tempa\@tempb #2 \else #3 \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\endfmffile} % And here is how we close the |fmffile| environment: % \begin{macrocode} \def\endfmffile{% \fmfcmd{\p@rcent\space the end.^^J% end.^^J% endinput;}% \let\thefmffile\relax \if@fmfio \immediate\closeout\@outfmf \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\fmf@graph} % This is the bulk of the environment used for each graph % drawn by \MF. % \changes{v0.5}{1994/08/17}{% % Removed definiton of \texttt{\protect\bslash sharp}. It's never % used and conflicts with the $\sharp$ symbol.} % \changes{v1.06}{1996/05/21}{% % New macro \texttt{\protect\bslash dqu@te}.} % \begin{macrocode} {\catcode`\#=11\gdef\sh@rp{#}% \catcode`\"=11\gdef\dqu@te{"}} \def\fmf@graph#1#2{% % \end{macrocode} % Make sure that a \MF{} file is open, otherwise \emph{really} % obscure error messages are possible: % \changes{v0.3}{1994/05/23}{% % Make sure that a \MF{} file is open, otherwise \emph{really} % obscure error messages are possible.} % \begin{macrocode} \ifx\thefmffile\relax \errhelp={Outside a fmffile environment, I have no clue as to where^^J% the METAFONT commands should go. I will use fmfdefault.mf^^J% for this graph, but you'd better fix your code!}% \errmessage{I detected a fmfgraph environment outside of fmffile}% \fmffile{fmfdefault} \fi % \end{macrocode} % We can't use |\stepcounter| because of the |amstext| option of % AMS-\LaTeX{} disables it sometimes. % \changes{v0.8}{1995/01/07}{Don't use \texttt{\protect\bslash stepcounter}.} % \changes{v0.99}{1995/05/04}{Use \texttt{\protect\bslash fmfsubgraph}.} % \begin{macrocode} \global\expandafter\advance\csname c@fmfgraph\endcsname \@ne % \end{macrocode} % Start \MF{} character:\footnote{% % I'm flying a bit blind here, because I can't figure out why Babel % (unlike stand-alone \texttt{german.sty} breaks with an unprotected % quote here. On all other occasions, \texttt{\protect\bslash % mdqoff} suffices.} % \changes{v1.06}{1996/05/21}{Babel compatibility.} % \begin{macrocode} \fmfcmd{beginchar(\thefmfgraph, #1*\the\unitlength\sh@rp, % #2*\the\unitlength\sh@rp, 0);^^J% \dqu@te feynmf: \thefmfgraph\dqu@te;}% \fmfcmd{LaTeX_unitlength:=\the\unitlength;}% \begin{fmfsubgraph}(0,0)(w,h) \fmfinit \fmfpen{thin}} % \end{macrocode} % \end{macro} % % \begin{macro}{\fmfgraph} % The plain version, no labels, no enclosing |picture| environment % \changes{v0.99}{1995/05/04}{% % Change the name of \texttt{\protect\bslash fmfchar} and friends to % \texttt{\protect\bslash fmfgraph}, which should be more intuitive % to people with less of a \MF{} background. Keep the old names as % aliases for a while.} % \begin{macrocode} \def\fmfgraph(#1,#2){% \fmf@graph{#1}{#2}% \def\fmfkeep##1{\fmf@keep{#1}{#2}{##1}}% % \end{macrocode} % Place the character: % \changes{v0.4}{1994/05/27}{\MP{} support: include PostScript file.} % \changes{v0.8}{1995/02/18}{\LaTeX~2.09 compatibility} % \begin{macrocode} %{\f@ynmf \char\value{fmfgraph}}% %<*mp> \leavevmode \IfFileExists{\thefmffile.\thefmfgraph}% {\includegraphics{\thefmffile.\thefmfgraph}}% {\typeout{% feynmp: File \thefmffile.\thefmfgraph\space not found:^^J% feynmp: Process \thefmffile.mp with MetaPost and then % reprocess this file.}}% % \ignorespaces} % \end{macrocode} % \end{macro} % % \begin{macro}{\endfmfgraph} % \begin{macrocode} \def\endfmfgraph{% \fmffreeze \fmfdraw \end{fmfsubgraph} \fmfcmd{endchar;}% \def\fmfkeep##1{\fmf@nokeep}} % \end{macrocode} % \end{macro} % % \begin{macro}{\fmfchar} % \begin{macro}{\endfmfchar} % \begin{macrocode} \def\fmfchar{\@nameuse{fmfgraph}} \def\endfmfchar{\@nameuse{endfmfgraph}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\fmfgraph*} % The extended version, with labels and |picture| environment. % \begin{macrocode} \@namedef{fmfgraph*}(#1,#2){% \begin{picture}(#1,#2) \fmf@graph{#1}{#2}% \def\fmfkeep##1{\fmf@keepstar{#1}{#2}{##1}}% % \end{macrocode} % Process the \MF{} output for labels (if any), enforcing |%| as % comment character. % \changes{v0.99}{1995/05/07}{% % Don't include the filename in the tag for % \texttt{\protect\bslash grepfile}: it's a waste.} % Not all systems use |.log| as extension of the |log|-file. If there % is no |.log|, but a |.lis|: use the latter. % \changes{v0.99}{1995/05/07}{% % From Scott Snyder (Fermilab): allow \texttt{.lis} % as alternative \texttt{log}-file extension for VMS.} % \changes{v1.07}{1996/08/19}{% % Call \texttt{\protect\bslash grepfile} only if % \texttt{\protect\bslash if@fmfio} is true.} % \begin{macrocode} %<*!mp> \if@fmfio \def\thefmfext{.log}% \IfFileExists{\thefmffile.log}% {}% {\IfFileExists{\thefmffile.lis}% {\def\thefmfext{.lis}}% {}}% {\catcode`\%=14\relax \grepfile% {\thefmfgraph}% {\thefmffile\thefmfext}% {\thefmffile.t\thefmfgraph}}% \fi % % \end{macrocode} % Place the character: % \changes{v0.4}{1994/05/27}{\MP{} support: include PostScript file.} % \begin{macrocode} %\put(0,0){{\f@ynmf \char\value{fmfgraph}}}% %<*mp> \IfFileExists{\thefmffile.\thefmfgraph}% {\put(0,0){\includegraphics{\thefmffile.\thefmfgraph}}}% {\typeout{% feynmp: File \thefmffile.\thefmfgraph\space not found:^^J% feynmp: Process \thefmffile.mp with MetaPost and then % reprocess this file.}}% % \ignorespaces} % \end{macrocode} % \end{macro} % % \begin{macro}{\endfmfgraph*} % \begin{macrocode} \@namedef{endfmfgraph*}{% \endfmfgraph % \end{macrocode} % Enforce |%| as comment character. Disable |\noexpand| if the % option |pre-1.03| is in effect to allow processing of old files % prepared before the new single level expansion had been % implemented. |\fmf@noexpandoff| is defined on % page~\ref{pg:defnoexpandoff}. % \label{pg:usenoexpandoff} % \changes{v1.03}{1996/02/17}{% % Disable \texttt{\protect\bslash noexpand} to allow % processing of old files.} % \changes{v1.05}{1996/05/06}{% % Reenable \texttt{\protect\bslash noexpand} for compatibility with % font loading on demand.} % \changes{v1.07}{1996/08/19}{% % Include the labels file only if \texttt{\protect\bslash if@fmfio} % is true.} % \begin{macrocode} \if@fmfio {\catcode`\%=14\relax \fmf@noexpandoff \InputIfFileExists{\thefmffile.t\thefmfgraph}{}{% \typeout{% feynmf: Label file \thefmffile.t\thefmfgraph\space not found:^^J% % feynmf: Process \thefmffile.mf with METAFONT and then % % feynmf: Process \thefmffile.mp with MetaPost and then % reprocess this file.}}}% \fi \end{picture}} % \end{macrocode} % \end{macro} % % \begin{macro}{\fmfchar*} % \begin{macro}{\endfmfchar*} % \begin{macrocode} \@namedef{fmfchar*}{\@nameuse{fmfgraph*}} \@namedef{endfmfchar*}{\@nameuse{endfmfgraph*}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\fmfkeep} % \changes{v0.98}{1995/04/30}{Implemented.} % \begin{macrocode} \def\fmfkeep#1{\fmf@nokeep} \def\fmf@nokeep{% \errhelp={There's nothing to \string\fmfkeep!}% \errmessage{feynmf: \string\fmfkeep\space outside of `fmfgraph'!}} % \end{macrocode} % Here are the real implementations: % \begin{macrocode} \def\fmf@keep#1#2#3{% \global\@namedef{fmf@k:e:#3}{\begin{fmfgraph}(#1,#2)\end{fmfgraph}}% \global\e@namedef{fmf@k:f:#3}{\thefmffile}% \global\e@namedef{fmf@k:c:#3}{\thefmfgraph}} \def\fmf@keepstar#1#2#3{% \global\@namedef{fmf@k:e:#3}{\begin{fmfgraph*}(#1,#2)\end{fmfgraph*}}% \global\e@namedef{fmf@k:f:#3}{\thefmffile}% \global\e@namedef{fmf@k:c:#3}{\thefmfgraph}} \def\e@namedef#1{\expandafter\edef\csname #1\endcsname} % \end{macrocode} % \end{macro} % % \begin{macro}{\fmfreuse} % \changes{v0.98}{1995/04/30}{Implemented.} % \begin{macrocode} \def\fmfreuse#1{% \@ifundefined{fmf@k:e:#1}% {\typeout{% feynmf: \string\fmfreuse: % missing \string\fmfkeep\space for `#1'!}}% {\edef\thefmffile{\@nameuse{fmf@k:f:#1}}% %<*!mp> \expandafter\let\expandafter\f@ynmf% \csname f@ynmf:\thefmffile\endcsname % \@nameuse{c@fmfgraph}\@nameuse{fmf@k:c:#1}% \advance\@nameuse{c@fmfgraph}-1% \def\fmfcmd##1{}% \@nameuse{fmf@k:e:#1}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\fmfframe} % This is used to allocate additional space around a |fmfgraph*|, since % the labels (or the diagram itself) might overshoot. % |\fmfgraph(|\meta{left}|,|\meta{top}|)(|\meta{right}|,|\meta{bottom}|){|^^A % \meta{box}|}| puts an invisible frame of the given dimensions % (measured in |\unitlength|) around \meta{box}. % \begin{macrocode} \def\fmfframe(#1,#2)(#3,#4)#5{% \leavevmode \hbox{\vbox{\vskip#2\unitlength\par \hbox{\hskip#1\unitlength#5\hskip#3\unitlength}\par \vskip#4\unitlength}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\fmfpen} % Picup a |pencircle| scaled by the argument. % \begin{macrocode} \def\fmfpen#1{\fmfcmd{pickup pencircle scaled #1;}} % \end{macrocode} % \end{macro} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Subgraphs} % % \begin{macro}{\fmfsubgraph} % \begin{macro}{\endfmfsubgraph} % An environment for graphs in graphs: % \changes{v0.99}{1995/05/04}{% % Implement \texttt{\protect\bslash fmfsubgraph}, as suggested by % Wolfgang Kilian (DESY).} % \begin{macrocode} \def\fmfsubgraph(#1,#2)(#3,#4){\fmfcmd{subgraph (#1, #2, #3, #4);}} \def\endfmfsubgraph{\fmfcmd{endsubgraph;}} % % \end{macrocode} % \end{macro} % \end{macro} % % Set up a subgraph: % \begin{macrocode} %<*base> def subgraph (expr x, y, wd, ht) = begingroup save c, ne, nw, sw, se; pair c, ne, nw, sw, se; sw = (x,y); se = sw + (wd,0); nw = sw + (0,ht); ne = sw + (wd,ht); c = .5[sw,ne]; enddef; def endsubgraph = endgroup enddef; % % \end{macrocode} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Grep} % \label{sec:grep} % % \begin{macro}{\grepfile} % The macro |\grepfile{|\meta{pattern}|}{|\meta{in}|}{|\meta{out}|}| % writes all lines matching |:|\meta{pattern}|:| from file \meta{in} % to file \meta{out} after stripping off the pattern. % \begin{dubious} % Pattern matching on lines with a single leading colon fails. % \end{dubious} % \changes{v0.4}{1994/05/28}{% % Don't include the \texttt{\protect\bslash grep} macros in the % \MP{} version. \texttt{\protect\bslash write} makes them % obsolete.} % \begin{macrocode} %<*style> %<*!mp> \def\grepfile#1#2#3{% \begingroup % \end{macrocode} % Hash the pattern and open the input and output streams: % \begin{macrocode} \edef\pattern{\csname*grep*#1*\endcsname}% \immediate\openin\grep@infile #2\relax \ifeof\grep@infile \else \grep@outopenfalse % \end{macrocode} % Don't add anything at the end of input lines and don't expand % anything we've read from the file: % \changes{v1.05}{1996/05/06}{% % Use \texttt{\protect\bslash @sanitize} instead of just changing % the \texttt{\protect\bslash catcode} of % ``\texttt{\protect\bslash}''. Some styles (in particular % \texttt{french.sty}) play dirty tricks with ``\texttt{:}''.} % \begin{macrocode} \endlinechar=-1 \@sanitize % \end{macrocode} % But make sure that |{|, |}| and |%| continue to act as delimiters % and comment character, respectively. |\@sanitize| will usually have % changed at least the |\catcode| of the latter. We need the % delimiters for multi-line reading and |%| for commenting out \MF's % pregress reports. % \begin{macrocode} \catcode`\{=1 \catcode`\}=2 \catcode`\%=14 \relax % \end{macrocode} % Loop over the input lines until end of file occurs. Note that % \TeX's |\read| will automagically continue reading until braces are % balanced. % \begin{macrocode} \loop \read\grep@infile to \grep@lbuf \ifeof\grep@infile \grep@contfalse \else \grep@conttrue % \end{macrocode} % Iff the input line is not empty, use |\grep@aline| to examine its % contents and, iff the pattern matched, write a line to the output file. % \begin{macrocode} \ifx\grep@lbuf\empty \else \expandafter\grep@aline\grep@lbuf\sentinel \ifx\pattern\grep@tag % \end{macrocode} % Delayed open (this avoids empty files): % \begin{macrocode} \ifgrep@outopen \else \immediate\openout\grep@outfile #3\relax \immediate\write\grep@outfile{\p@rcent\space #3 % -- generated automatically from #2}% \immediate\write\grep@outfile{\p@rcent\space Think twice before editing THIS file!}% \grep@outopentrue \fi \immediate\write\grep@outfile{\grep@val}% \fi \fi \fi \ifgrep@cont \repeat % \end{macrocode} % Close the files after we're done. % \changes{v0.1}{1994/05/16}{% % Stupid: \texttt{\protect\bslash closein} the input stream, % don't use \texttt{\protect\bslash closeout} on it.} % \begin{macrocode} \ifgrep@outopen \immediate\closeout\grep@outfile \fi \fi \immediate\closein\grep@infile \endgroup} % \end{macrocode} % \end{macro} % % \begin{macro}{\grep@infile} % \begin{macro}{\grep@outfile} % The I/O streams for the grep facility % \begin{macrocode} \newread\grep@infile \newwrite\grep@outfile % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\ifgrep@cont} % \begin{macro}{\ifgrep@outopen} % and flags for the same % \begin{macrocode} \newif\ifgrep@cont \newif\ifgrep@outopen % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\grep@aline} % Examine one line and set the variables |\grep@tag| and |\grep@val| % iff the line starts with a colon. Subtle point here: |\ifx#1:| will % \emph{not} work if |#1| starts with a |{| followed by two identical % characters. % \begin{macrocode} \def\grep@aline#1#2\sentinel{% \ifx:#1% \grep@splitlbuf#2\sentinel \else \edef\grep@tag{\csname*grep*\endcsname}% \def\grep@val{}% \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\grep@splitlbuf} % Split the line buffer at the remaining colon, hashing the first part. % \begin{macrocode} \def\grep@splitlbuf#1:#2\sentinel{% \edef\grep@tag{\csname*grep*#1*\endcsname}% \def\grep@val{#2}} % % \end{macrocode} % \end{macro} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Lists} % % The following macros are stolen from Alan Jeffrey's % |lambda.sty|~\cite{Lambda}. Alan's implementation is more complete, % this is just the subset we need to do some listprocessing in \TeX's % mouth, e.g.~in the body of a |\write|. Actually, you're not % supposed to understand these macros from first reading. It's better % to read Alan's paper (it is available from CTAN as |lambda.tex|), % where they are described. From a programming point of view, Alan's % macros are probably my favorites. You will find a whole new % perspective on \TeX{} there. % \changes{v0.98}{1995/04/26}{List processing macros.} % \begin{macrocode} \def\Compose#1#2#3{#1{#2{#3}}} \def\gobblefalse\else\gobbletrue\fi#1#2{\fi#1} \def\gobbletrue\fi#1#2{\fi#2} \def\TeXif#1{#1\gobblefalse\else\gobbletrue\fi} \def\Nil#1#2{#2} \def\Cons#1#2#3#4{#3{#1}{#2}} \def\Singleton#1{\Cons{#1}\Nil} \def\Foldr#1#2#3{#3{\Foldr@{#1}{#2}}{#2}} \def\Foldr@#1#2#3#4{#1{#3}{\Foldr{#1}{#2}{#4}}} \def\Map#1{\Foldr{\Compose\Cons{#1}}\Nil} \def\Unlistize#1{#1\Unlistize@{}} \def\Unlistize@#1{#1\Foldr\Commaize{}} \def\Commaize#1#2{, #1#2} \def\Listize#1{\Listize@#1,\relax @@@} \def\Listize@#1,#2@@@{% \TeXif{\ifx\relax#2}% {\Singleton{#1}}% {\Cons{#1}{\Listize@#2@@@}}} % \end{macrocode} % % Protect \MF's namespace: % \changes{v1.03}{1996/02/17}{% % Replace \texttt{\protect\bslash pfx} by % \texttt{\protect\bslash fmfpfx} for namespace sanity.} % \begin{macrocode} \def\fmfpfx@#1{__#1} \def\fmfpfx#1{\Unlistize{\Map\fmfpfx@{\Listize{#1}}}} % \end{macrocode} % % The other \TeX{} command sequences are defined below, along with the % \MF{} macros they are in one-to-one correspondence to. % \begin{macrocode} % % \end{macrocode} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \section{\MF{} macros} % \label{sec:mf-code} % % Now we turn our attention to the \MF{} % macros. % \begin{dubious} % We should find a way (a hack) to index the % \MF{} macros with the |doc| option. % \end{dubious} % Because of name clashes, \FMF{} will not work if the |cmbase| is % loaded. Die with an useful error message: % \changes{v0.5}{1994/06/13}{Don't accept the Computer Modern Base.} % \begin{macrocode} %<*base> if known cmbase: errhelp "feynmf will only work with plain Metafont, as described in the book."; errmessage "feynmf: CMBASE detected. Please use the PLAIN base."; forever: errmessage "No use in trying! You'd better eXit now ..."; errorstopmode; endfor fi % \end{macrocode} % % Make the RCS revision number available for feature testing: % \changes{v0.1}{1994/05/20}{% % Handle arbitrary RCS revision strings.} % \begin{macrocode} 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; % \end{macrocode} % Check that \LaTeX{} style and \MF{} macros are in sync: % \begin{macrocode} vardef require_RCS_revision expr s = save n, TeX_rev, mf_rev; numeric n; parse_RCS (TeX_rev, s); parse_RCS (mf_rev, "$Revision: 1.30 $"); 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; % \end{macrocode} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{\MP{} support} % % This \MP{} support just mimics \MF{}, but it works. % \changes{v0.4}{1994/05/27}{Preliminary \MP{} support: mimic \MF.} % \begin{macrocode} %<*mp> vardef cullit = \ enddef; color foreground; foreground = black; % \end{macrocode} % % \begin{macrocode} vardef beginchar (expr c, wd, ht, dp) = LaTeX_file := ""; beginfig(c); w:=wd; h:=ht; enddef; string LaTeX_file; % \end{macrocode} % % \begin{macrocode} vardef endchar = setbounds currentpicture to (0,0)--(w,0)--(w,h)--(0,h)--cycle; if LaTeX_file <> "": write EOF to LaTeX_file; LaTeX_file := ""; fi endfig enddef; % \end{macrocode} % % Sharped dimensions are useless with \MP. We define them anyway % with trivial translation, so that the \MF{} code can be used % unchanged. % \begin{macrocode} bp# := bp; cc# := cc; cm# := cm; dd# := dd; in# := in; mm# := mm; pc# := pc; pt# := pt; % \end{macrocode} % As I said: trivial translation. % \begin{macrocode} vardef define_blacker_pixels(text t) = forsuffixes $=t: $:=$.#; endfor enddef; % \end{macrocode} % % \begin{macrocode} picture unitpixel; unitpixel = nullpicture; addto unitpixel contour unitsquare; def t_ = \ enddef; % % \end{macrocode} % % \begin{macrocode} %mode_setup; % \end{macrocode} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Basics} % \label{sec:mf-basics} % % Allow the user to life dangerously or not, depending on his % preferences. % \changes{v0.7}{1994/10/23}{\texttt{fmfwizard}: to live dangerously or not.} % \begin{macrocode} boolean feynmfwizard; feynmfwizard := false; % % \end{macrocode} % \begin{macro}{\fmfwizard} % \begin{macro}{\fmfnowizard} % \begin{macrocode} %<*style> \def\fmfwizard{\fmfcmd{feynmfwizard := true;}} \def\fmfnowizard{\fmfcmd{feynmfwizard := false;}} % % \end{macrocode} % \end{macro} % \end{macro} % % Default values of style parameters: % \begin{macrocode} %<*base> thin# := 1pt#; % dimension of the lines thick# := 2thin#; arrow_len# := 4mm#; arrow_ang := 15; curly_len# := 3mm#; dash_len# := 3mm#; % 'photon' lines dot_len# := 2mm#; % 'photon' lines wiggly_len# := 4mm#; % 'photon' lines wiggly_slope := 60; zigzag_len# := 2mm#; zigzag_width# := 2thick#; decor_size# := 5mm#; dot_size# := 2thick#; % \end{macrocode} % Convert ``sharp'' units: % \begin{macrocode} define_blacker_pixels (thick, thin, dash_len, dot_len, wiggly_len, curly_len, zigzag_len, zigzag_width, arrow_len, decor_size, dot_size); % \end{macrocode} % % Back by popular demand: shrinking dimensions. % \changes{v0.5}{1994/06/13}{% % Back by popular demand: shrinking dimensions.} % \begin{macrocode} def shrink expr s = begingroup if shrinkables <> "": save tmp_; forsuffixes $ = scantokens shrinkables: % \end{macrocode} % The sharp dimension might not be known, e.g.~after % |\fmfset{arrow_len}{6mm}|, protect against that: % \changes{v1.06}{1995/05/29}{% % Make \texttt{shrink} work, even if the sharp dimension is not % known.} % \begin{macrocode} if known $.#: tmp_ := $.#; save $; $.# := s * tmp_; define_blacker_pixels ($); else: tmp_ := $; save $; $ := s * tmp_; fi endfor fi enddef; % \end{macrocode} % % \begin{macrocode} def endshrink = endgroup enddef; % % \end{macrocode} % % \begin{macro}{\fmfshrink} % \begin{macro}{\endfmfshrink} % Exporting the whole enchilada to \LaTeX: % \begin{macrocode} %<*style> \def\fmfshrink#1{\fmfcmd{shrink (#1);}} \def\endfmfshrink{\fmfcmd{endshrink;}} % % \end{macrocode} % \end{macro} % \end{macro} % % \begin {macrocode} %<*base> string shrinkables; shrinkables := ""; % \end{macrocode} % % This macro is used to register shrinkable dimensions. It is not % really robust, we have add the first enty by hand: % \begin {macrocode} vardef addto_shrinkables (text l) = forsuffixes $ = l: shrinkables := shrinkables & "," & str $; endfor enddef; shrinkables := "thick,thin"; % \end{macrocode} % % \begin {macrocode} addto_shrinkables (dash_len, dot_len); addto_shrinkables (wiggly_len, curly_len); addto_shrinkables (zigzag_len, zigzag_width); addto_shrinkables (arrow_len); addto_shrinkables (decor_size, dot_size); % \end{macrocode} % % Default to metric units, but this will be reset by |\begin{fmfgraph}| % anyway. % \begin {macrocode} LaTeX_unitlength := mm; % \end{macrocode} % % Count the number of tokens in the argument: % \begin {macrocode} vardef count (text list) = forsuffixes $ = list: + 1 endfor enddef; % \end{macrocode} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Parsing options} % \label{sec:getopt} % % Parse the string |s| into comma separated tokens |opt[]|, ignoring % blanks before |=|'s. Double commas are passed as a single comma. % \changes{v0.8}{1994/10/25}{% % Plugged the string memory leak in \texttt{getopt}: don't create % intermediate one character strings, \MF{} never claims them back.} % \begin {macrocode} vardef getopt (suffix opt) (expr s) = save n, argp, escape, anchor, skip; numeric opt.first, opt.last, n, anchor; string opt[], opt[]arg; boolean opt[]tainted, argp, escape, skip; opt.first := 0; opt.last := 0; opt[opt.last] := ""; argp := false; escape := false; anchor := 0; skip := true; for n = 1 upto length (s): % \end{macrocode} % Skip blanks at the beginning of each option or argument: % \begin {macrocode} if skip and (substring (n-1, n) of s = " "): anchor := anchor + 1; else: skip := false; % \end{macrocode} % If we see a comma which has not been escaped, check for a second % comma and set the |escape| flags and remember to remove the second % comma later or reset the |argp| flag, as appropriate: % \begin {macrocode} if not escape and (substring (n-1, n) of s = ","): if substring (n, n+1) of s = ",": escape := true; opt[opt.last]tainted := true; % \end{macrocode} % Else accept the option or argument: % \begin {macrocode} else: if argp: opt[opt.last]arg := substring (anchor, n-1) of s; else: opt[opt.last] := substring (anchor, n-1) of s; fi anchor := n; argp := false; skip := true; opt.last := opt.last + 1; fi % \end{macrocode} % Start as argument and ignore |=|'s until the next option: % \begin {macrocode} elseif not argp and (substring (n-1, n) of s = "="): opt[opt.last] := substring (anchor, n-1) of s; anchor := n; argp := true; skip := true; % \end{macrocode} % Accept the next character (either option or argument) and reset the % |escape| flag: % \begin {macrocode} elseif argp or (substring (n-1, n) of s <> " "): escape := false; fi fi endfor % \end{macrocode} % Accept the final option or argument: % \begin {macrocode} if argp: opt[opt.last]arg := substring (anchor, length s) of s; else: opt[opt.last] := substring (anchor, length s) of s; fi % \end{macrocode} % We still have to remove possible doubled commata from the arguments. % Theoretically, we could already have done it above (that's the way % earlier versions of \FMF{} did it), but only at the expense of % excessive copying of strings (like |opt[n]arg:=opt[n]arg&c|). Given % \MF's string handling, we should avoid these \emph{at any cost}, % because the wasted string memory will \emph{never} be % reclaimed!\footnote{Actually, \MP{} has code to compact the string % pool, which makes \emph{a lot} of difference in the present case. % But this doesn't help us with \MF.} % Since the more elegant former version had a serious string memory % leak, we'd better stick to the current ugly but space efficient % implementation. % \begin {macrocode} for n = opt.first upto opt.last: if known opt[n]tainted: if opt[n]tainted: opt[n]arg := untaint_string opt[n]arg; fi fi endfor enddef; % \end{macrocode} % Turn double commata into single commata, using as little string % copies as possible: % \begin {macrocode} vardef untaint_string suffix s = save n, anchor; numeric n, anchor; anchor := 0; for n = 1 upto length (s) - 1: if substring (n-1,n+1) of s = ",,": substring (anchor, n-1) of s & hide (anchor := n) fi endfor substring (anchor, length s) of s enddef; % \end{macrocode} % % Split a string into |.|-separated components for matching options. % \begin {macrocode} vardef split_string (suffix comp) (expr s) = save n, anchor; numeric comp.first, comp.last, n, anchor; string comp[]; comp.first := 0; comp.last := 0; comp[comp.last] := ""; anchor := 0; for n = 1 upto length (s): if substring (n-1,n) of s = ".": comp[comp.last] := substring (anchor, n-1) of s; comp.last := comp.last + 1; anchor := n; fi endfor comp[comp.last] := substring (anchor, length s) of s; enddef; % \end{macrocode} % Return |true| iff |prefix| is a prefix of |s|: % \begin {macrocode} vardef match_prefix (expr prefix, s) = (prefix = substring (0, length prefix) of s) enddef; % \end{macrocode} % Match options similarly to |Xt| resource strings, but allowing for % abbreviations: % \changes{v0.7}{1994/10/23}{More general option parsing.} % \begin {macrocode} vardef match_option (expr s, option) = save sc, optionc, n, i; numeric sc.first, sc.last, optionc.first, optionc.last; string sc[], optionc[]; numeric n, i; split_string (sc, s); split_string (optionc, option); n := sc.last - sc.first; if n <> (optionc.last - optionc.first): false else: true for i = 0 upto n: and match_prefix (sc[sc.first+i], optionc[optionc.first+i]) endfor fi enddef; % \end{macrocode} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Manipulating \texttt{picture}s} % \label{sec:pictures} % % This section is leftover from the five year old |feynman.mf| package % and is now obsolete for \MF. Ironically, we still need it to mimic % our \MF{} clipping code in \MP. % % |save_picture (list_of_pictures)| |save|'s each member of % |list_of_pictures| inside a group and reinitializes them as nullpictures. % \begin{macrocode} def save_picture text t = save t; picture t; forsuffixes p=t: p:=nullpicture; endfor enddef; % \end{macrocode} % % |begin_sketch| pushes the sketchpad stack and perform the following % drawing commands (upto the next |end_sketch|) on the new sketchpad. % \begin{macrocode} def begin_sketch = begingroup save_picture currentpicture; sketchlevel := sketchlevel+1; enddef; % \end{macrocode} % % |end_sketch| pops the sketchpad stack. % \begin{macrocode} def end_sketch = sketchlevel := sketchlevel-1; sketchpad[sketchlevel] := currentpicture; endgroup enddef; % \end{macrocode} % % \begin{macrocode} picture sketchpad[]; sketchlevel := 1; % \end{macrocode} % % |use_sketch (transformation)| copies the transformed sketchpad into % the current picture. % \begin{macrocode} vardef use_sketch text t = addto currentpicture also (sketchpad[sketchlevel] t) enddef; % \end{macrocode} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Tilings} % \label{sec:tilings} % % Colored drawing is available with \MP{} only: % \changes{v0.98}{1995/04/29}{Color support.} % \begin{macrocode} vardef cdraw expr p = % draw p withcolor foreground % draw p enddef; vardef cfill expr p = % fill p withcolor foreground % fill p enddef; vardef cfilldraw expr p = % filldraw p withcolor foreground % filldraw p enddef; % \end{macrocode} % |autorounding| would disturb |cutdraw|. % \changes{v1.01}{1995/06/04}{% % No \texttt{autorounding} for \texttt{cutdraw}.} % \begin{macrocode} vardef ccutdraw expr p = % cutdraw p withcolor foreground % interim autorounding := 0; % cutdraw p enddef; vardef cdrawdot expr p = % drawdot p withcolor foreground % drawdot p enddef; % \end{macrocode} % % \changes{v1.01}{1995/06/11}{Implement tilings.} % We also need some textprocessing tools. Here's a slow and portable % incarnation of |isdigit|: % \begin{macrocode} vardef isdigit expr s = save n; (s = "0") for n = 1 upto 9: or (s = decimal n) endfor enddef; % \end{macrocode} % it is used in the next function, which return the interval of the % first digits after |start| in the string |s|: % \begin{macrocode} vardef digits_index (expr s, start) = save n, m, from, to; for n = start upto (length s)-1: if isdigit (substring (n,n+1) of s): from := n; for m = n upto length s: if not isdigit (substring (m,m+1) of s): to := m; fi exitif known to; endfor fi exitif known from; endfor (from, if known to: to else: infinity fi) enddef; % \end{macrocode} % The application is in this function, which takes a |suffix| and % returns it textual representation, with all sequences of digits % replaced by |[]|. We need it later, because declarations like % |picture foo1bar2;| are \emph{verboten} in \MF, they have to be % replaced by |picture foo[]bar[];|. % \begin{macrocode} vardef digits_to_brackets suffix suf = save s, idx; string s; pair idx; s = str suf; idx = (0,0); forever: idx := digits_index (s, xpart idx); exitif unknown xpart idx; s := substring (0,xpart idx) of s & "[]" & substring (ypart idx,infinity) of s; endfor s enddef; % \end{macrocode} % % \begin{macrocode} tile_grain := 1in/300; % \end{macrocode} % % Declare a tile. % \begin{macrocode} vardef def_tile (suffix t) (expr wd, ht) = if not picture tlist.t: picture tlist.scantokens (digits_to_brackets t); fi tlist.t := nullpicture; tlist.t.dx := max (floor wd, 1); tlist.t.dy := max (floor ht, 1); enddef; % \end{macrocode} % % Use the tile |t| to tile a rectangle of width |wd| and height |ht| % with lower left corner at |(x,y)|. The upper and right boundaries % will be rounded to multiples of the tile size. Note that it is % vital for our clipping tricks that \emph{no} pixel gets a weight of % two or more! % \begin{macrocode} vardef use_tile (suffix t) (expr x, y, wd, ht) = %<*mp> fill unitsquare xscaled wd yscaled ht shifted (x,y) withcolor background; if str t = "shaded": shade_rectangle (4thin, x, y, wd, ht); elseif str t = "hatched": shade_rectangle (5thin, x, y, wd, ht); shade_rectangle (-5thin, x, y, wd, ht); else: % if (picture tlist.t): for nx = 0 upto wd/tlist.t.dx: for ny = 0 upto ht/tlist.t.dy: addto currentpicture also (tlist.t shifted ((x,y) + (nx*tlist.t.dx, ny*tlist.t.dy)) t_); endfor endfor else: errhelp "feynmf: your tiling has not been defined, " & "check spelling and reprocess!"; errmessage "feynmf: tiling `" & str t & "' not known, " & "replaced by `shaded'"; use_tile (shaded, x, y, wd, ht); fi %<*mp> fi % enddef; % \end{macrocode} % Shade a square enclosing the rectangle: % \begin{macrocode} vardef shade_rectangle (expr dd, x, y, wd, ht) = save d, u, dx, dy, currentpen; pen currentpen; pickup pencircle scaled thin; d := max (floor (abs dd), 1); dx := max (wd, ht); dy := max (wd, ht); for u = 0 step d/dx until 1: if dd > 0: cdraw (x-d,y+u*dy-d)--(x+(1-u)*dx+d,y+dy+d); cdraw (x+u*dx-d,y-d)--(x+dx+d,y+(1-u)*dy+d); else: cdraw (x-d,y+u*dy+d)--(x+u*dx+d,y-d); cdraw (x+(1-u)*dx-d,y+dy+d)--(x+dx+d,y+(1-u)*dy-d); fi endfor enddef; % \end{macrocode} % Syntatic sugar: % \begin{macrocode} def addto_tile (suffix t) = addto tlist.t enddef; % \end{macrocode} % % Construct a tile from a ASCII picture: % \begin{macrocode} vardef tile_from_string (suffix t) (expr str) = tile_grain := max (floor tile_grain, 1); save grain, mx, x, y, n, c, pic; string c; picture pic; pic := nullpicture; grain := tile_grain; mx := 0; x := 0; y := 0; for n := 1 upto length str: c := substring (n-1,n) of str; if c = "/": mx := max (mx, x); y := y+1; x := 0; elseif c = "*": addto pic also (unitpixel shifted (x,-y) t_); x := x+1; elseif c = ".": x := x+1; fi endfor def_tile (t, grain*mx, grain*(y+1)); addto_tile (t) also (pic shifted (0,y) scaled grain t_); pic := nullpicture; enddef; % \end{macrocode} % % Some standard tiles: % \begin{macrocode} tile_from_string (gray10, " ... /"& " .*. /"& " ... "); % \end{macrocode} % \begin{macrocode} tile_from_string (gray25, " .. /"& " *. "); % \end{macrocode} % \begin{macrocode} tile_from_string (gray50, " .* /"& " *. "); % \end{macrocode} % \begin{macrocode} tile_from_string (gray75, " ** /"& " .* "); % \end{macrocode} % \begin{macrocode} tile_from_string (gray90, " *** /"& " *.* /"& " *** "); % \end{macrocode} % % The |shaded| and |hatched| tiles are handled specially: % \begin{itemize} % \item{} the tiling approach is device dependent and diagonal lines % will not look nice if drawn to coarsely. % \item{} in \MP, we need to conserve memory, because the tiling % approach will quickly exceed \MP's main memory. The solution is % to intercept |use_tile|, as done above. % \end{itemize} % \begin{macrocode} %<*!mp> def_tile (shaded, 4thin, 4thin); pickup pencircle scaled thin; begin_sketch save dx, dy; (dx,dy) = (tlist.shaded.dx,tlist.shaded.dy); shade_rectangle (dx, 0, 0, dx, dy); cullit; fill unitsquare xscaled dx yscaled dy; cull currentpicture keeping (2,infinity); tlist.shaded := currentpicture; end_sketch; % \end{macrocode} % % \begin{macrocode} def_tile (hatched, 5thin, 5thin); begin_sketch save dx, dy; (dx,dy) = (tlist.hatched.dx,tlist.hatched.dy); shade_rectangle (dx, 0, 0, dx, dy); shade_rectangle (-dx, 0, 0, dx, dy); cullit; fill unitsquare xscaled dx yscaled dy; cull currentpicture keeping (2,infinity); tlist.hatched := currentpicture; end_sketch; % % \end{macrocode} % % Halftoning is tricky, this solution is not perfect yet. The idea is % to use highly nonlinear function for displacing adjacent, in order % to avoid regular patterns in thinly populated tiles. The random % number solution works somehow, but hand crafted regular patterns are % still superior. % \begin{macrocode} %<*!mp> vardef make_halftone (suffix t) (expr g, wd, ht) = tile_grain := max (floor tile_grain, 1); if (halftone_cache_g <> g) or (halftone_cache_grain <> tile_grain) or (halftone_cache_wd <> wd) or (halftone_cache_ht <> ht): halftone_cache_g := g; halftone_cache_grain := tile_grain; halftone_cache_wd := wd; halftone_cache_ht := ht; grain := tile_grain; def_tile (t, grain*wd, grain*ht); if g <= 0: addto_tile (t) contour unitsquare xscaled wd yscaled ht scaled grain t_; elseif g < 1: save period, offset, b, w; period := max (1/g, 1/(1-g)); offset := wd - (period * ceiling (wd/period)) mod wd; b := 0; w := 0; randomseed := halftone_randomseed; for y = 0 upto ht-1: for x = 0 upto wd-1: if w > g*(b+w): addto_tile (t) also (unitpixel shifted (floor (x + y*offset + 2*uniformdeviate period) mod wd, y) scaled grain t_); b := b+1; else: w := w+1; fi; endfor endfor cull tlist.t keeping (1,infinity); fi fi enddef; % \end{macrocode} % % \begin{macrocode} halftone_cache_g := -1; halftone_cache_grain := -1; halftone_cache_wd := -1; halftone_cache_ht := -1; halftone_randomseed := 137; % % \end{macrocode} % Halftoning is trivial in \MP: % \begin{macrocode} %<*mp> vardef make_halftone (suffix t) (expr g, wd, ht) = def_tile (t, wd, ht); addto tlist.t contour unitsquare xscaled wd yscaled ht withcolor ((1-g)*foreground + g*background) enddef; % % \end{macrocode} % % \begin{macrocode} vardef tile (suffix t) (expr p) = save u, x, y, max_x, min_x, max_y, min_y, xx, yy; -max_x = -max_y = min_x = min_y = infinity; for u = 0 step 0.1 until length p: x := xpart (point u of p); y := ypart (point u of p); max_x := max(max_x, x); max_y := max(max_y, y); min_x := min(min_x, x); min_y := min(min_y, y); endfor %<*!mp> % \end{macrocode} % Give the already drawn parts a weight of 2. Then they will survive % along with the intersection of the tiling and the interior of the % path |p|: % \begin{macrocode} cullit withweight 2; use_tile (t, min_x, min_y, max_x-min_x, max_y-min_y); fill p; cull currentpicture keeping (2,infinity) % %<*mp> begin_sketch use_tile (t, min_x, min_y, max_x-min_x, max_y-min_y); clip currentpicture to p; end_sketch; use_sketch; % enddef; % \end{macrocode} % % \begin{macrocode} vardef drawtile (suffix t) (expr p) = tile (t, p); cdraw p enddef; % \end{macrocode} % % Use \MP's haltoning features (if available), because they are much % more efficient: % \begin{macrocode} %<*!mp> vardef use_halftone (expr g, x, y, wd, ht) = make_halftone (__tmp_tile__, g, 50, 50); use_tile (__tmp_tile__, x, y, wd, ht) enddef; % \end{macrocode} % % \begin{macrocode} vardef halftone (expr g, p) = make_halftone (__tmp_tile__, g, 50, 50); tile (__tmp_tile__, p) enddef; % \end{macrocode} % % \begin{macrocode} vardef drawhalftone (expr g, p) = halftone (g, p); cdraw p enddef; % % \end{macrocode} % % \begin{macrocode} %<*mp> vardef use_halftone (expr g, x, y, wd, ht) = fill unitsquare xscaled wd yscaled ht shifted (x,y) withcolor ((1-g)*foreground + g*background) enddef; % \end{macrocode} % % \begin{macrocode} vardef halftone (expr g, p) = fill p withcolor ((1-g)*foreground + g*background) enddef; % \end{macrocode} % % \begin{macrocode} vardef drawhalftone (expr g, p) = fill p withcolor ((1-g)*foreground + g*background); cdraw p enddef; % % \end{macrocode} % % \begin{macrocode} vardef shade expr p = tile (shaded, p) enddef; % \end{macrocode} % % \begin{macrocode} vardef hatch expr p = tile (hatched, p) enddef; % \end{macrocode} % % Here come |filldraw|'s sisters: % \begin{macrocode} vardef emptydraw expr p = cullit; unfill p; cullit; cdraw p; enddef; vardef shadedraw expr p = cullit; unfill p; cullit; shade p; cdraw p; enddef; vardef hatchdraw expr p = cullit; unfill p; cullit; hatch p; cdraw p; enddef; % \end{macrocode} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Arrows} % \label{sec:arrows} % % John Hobby has a particulary nice |arrowhead| macro in plain \MP. % Some variations on that theme adapted to our needs are here. % \changes{v0.5}{1994/10/20}{New arrows, which look better on curved arcs.} % Firstly centered on fraction |frac| of |p|: % \changes{v0.99}{1995/05/04}{% % More general arrows \texttt{marrow}, \texttt{harrow} and % \texttt{tarrow} with reference % points in middle, at the head and at the tail, respectively.} % \begin{macrocode} vardef marrow (expr p, frac) = save a, t, z; pair z; a = angle direction frac*length(p) of p; z = point frac*length(p) of p; (t1,whatever) = p intersectiontimes (halfcircle scaled 2/3arrow_len rotated (a+90) shifted z); (t2,whatever) = p intersectiontimes (halfcircle scaled 4/3arrow_len rotated (a-90) shifted z); arrow_head (p, t1, t2, arrow_ang) enddef; % \end{macrocode} % secondly with reference point at the tail: % \begin{macrocode} vardef tarrow (expr p, frac) = save a, t, z; pair z; t1 = frac*length p; a = angle direction t1 of p; z = point t1 of p; (t2,whatever) = p intersectiontimes (halfcircle scaled 2arrow_len rotated (a-90) shifted z); arrow_head (p, t1, t2, arrow_ang) enddef; % \end{macrocode} % and finally with reference point at the head: % \begin{macrocode} vardef harrow (expr p, frac) = save a, t, z; pair z; t2 = frac*length p; a = angle direction t2 of p; z = point t2 of p; (t1,whatever) = p intersectiontimes (halfcircle scaled 2arrow_len rotated (a+90) shifted z); arrow_head (p, t1, t2, arrow_ang) enddef; % \end{macrocode} % Construct an arrowhead on path |p|, ranging from |from| to |to| with % opening angle |ang|: % compatibility: % \begin{macrocode} vardef arrow_head (expr p, from, to, ang) = save tip, ap, t; pair tip; path ap; t1 := from; t2 := to; % \end{macrocode} % |from| and |to| may come from an |intersectiontimes|. This % could have failed, typically if the path is too short: protect % against it. % \changes{v0.6}{1994/10/21}{Fix arrows on too short arcs.} % \begin{macrocode} if t1 = -1: t1 := 0; fi if t2 = -1: t2 := infinity; fi tip = point t2 of p; ap = subpath (t1,t2) of p shifted -tip; (ap rotated ang forced_join reverse ap rotated -ang -- cycle) shifted tip enddef; % \end{macrocode} % The old, plainly centered |arrow|. Retain it for convenience and % compatibility: % \begin{macrocode} vardef arrow expr p = marrow (p, .5) enddef; % \end{macrocode} % Join two paths |p| and |q| even if they don't fit exactly by % adjusting their common point. This is necessary in |arrow| because % rounding errors might induce a small mismatch even if we \emph{know} % that they should match theoretically. This is certainly a kludge % and should be used with care, but it works. % \begin{macrocode} tertiarydef p forced_join q = subpath (0, length p - 1) of p & point (length p - 1) of p .. controls postcontrol (length p - 1) of p and precontrol infinity of p .. .5[point infinity of p, point 0 of q] .. controls postcontrol 0 of q and precontrol 1 of q .. point 1 of q & subpath (1, infinity) of q enddef; % \end{macrocode} % % |cut_decors| expands to a subpath of |path_arg|, excluding the % decoration at the vertices. % \changes{v0.7}{1994/10/22}{Cut general vertex decorations.} % \changes{v0.9}{1995/04/25}{% % Fix \texttt{cut\_decors} to work with tadpoles.} % \begin{macrocode} vardef cut_decors (suffix from) (expr p) (suffix to) = subpath (if known from.decor.shape: xpart (p intersectiontimes (from.decor.shape scaled from.decor.size shifted from.loc)) else: 0 fi, if known to.decor.shape: length p - xpart (reverse p intersectiontimes (to.decor.shape scaled to.decor.size shifted to.loc)) else: infinity fi) of p enddef; % \end{macrocode} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Blobs} % \label{sec:blobs} % % The following functions are obsolete. We keep them for a couple of % releases but users should be aware that they can go away without any % warning! % % The function |make_blob| is the working horse of |draw_blob|. % \begin{macrocode} 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; shadedraw p; enddef; % \end{macrocode} % % |draw_blob (pair_arg, diameter)| draws a shaded blob of diameter % |diameter| centered at |pair_arg|. The thickness of the border is % controlled by the global variable |thick|. % % Hint: It saves time to draw blobs of the same size in sequence. % \begin{macrocode} 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; % \end{macrocode} % % |force_new_blob| forces the redrawing of a blob of the same diameter % (in case you only changed the shading parameters). % \begin{macrocode} def force_new_blob = sketched_blob_diameter := -1; enddef; force_new_blob; % initialize it. % \end{macrocode} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Drawing} % \label{sec:drawing} % % Easier than % \begin{equation} % \int_0^1 dt \left\vert\frac{dx(t)}{dt}\right\vert % \end{equation} % with the integrand the square root of a fourth order polynomial, but % sufficient for all practical purposes is % \begin{macrocode} vardef pixlen (expr p, n) = for k=1 upto length(p): + segment_pixlen (subpath (k-1,k) of p, n) endfor enddef; % \end{macrocode} % % \begin{macrocode} 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; % \end{macrocode} % % |wiggly p| expands to a ``wiggled'' version of |p|. The % slope of the wiggles is controlled by the global variable |wiggle_slope|, % the length of the wiggles by the global variable |wiggly_len|. % \changes{v1.08}{1996/09/01}{% % \texttt{wiggly}: integer number of wiggles for full path instead of % each segment.} % \begin{macrocode} vardef wiggly expr p_arg = save wpp; 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; % \end{macrocode} % % |curly p| expands to a ``curly'' version of |p|. The % the length of the curls is controlled by the global variable % |curly_len|. % \changes{v1.08}{1996/09/01}{% % \texttt{curly}: integer number of curls for full path instead of % each segment.} % \begin{macrocode} vardef curly expr p = save cpp; numeric cpp; cpp := ceiling (pixlen (p, 10) / curly_len) / length p; if cycle p: for k=0 upto cpp*length(p) - 1: point (k+.33)/cpp of p {direction (k+.33)/cpp of p rotated 90} .. point (k-.33)/cpp of p {direction (k-.33)/cpp of p rotated -90} .. endfor cycle else: point 0 of p {direction 0 of p rotated -90} .. for k=1 upto cpp*length(p) - 1: point (k+.33)/cpp of p {direction (k+.33)/cpp of p rotated 90} .. point (k-.33)/cpp of p {direction (k-.33)/cpp of p rotated -90} .. endfor point infinity of p {direction infinity of p rotated 90} fi enddef; % \end{macrocode} % % |zigzag p| expands to a ``zig-zag'' version of |p|. The % the length of the zags is controlled by the global variable % |zigzag_len|. % \changes{v0.9}{1995/04/26}{\texttt{zigzag}: new line style.} % \changes{v1.08}{1996/09/01}{% % \texttt{zigzag}: integer number of zigzacs for full path instead of % each segment.} % \begin{macrocode} vardef zigzag expr p = save zpp; numeric zpp; zpp = ceiling (pixlen (p, 10) / zigzag_len) / length p; if not cycle p: point 0 of p -- fi for k = 0 upto zpp*length(p) - 1: point (k+1/3)/zpp of p shifted (zigzag_width * dir angle (direction (k+1/3)/zpp of p rotated 90)) -- point (k+2/3)/zpp of p shifted (zigzag_width * dir angle (direction (k+2/3)/zpp of p rotated -90)) -- endfor if cycle p: cycle else: point infinity of p fi enddef; % \end{macrocode} % % An inventory of valid line styles is implemented as a hash table: % \begin{macrocode} save vsty_hash; % \end{macrocode} % This is a bit like |mode_def| in plain \MF{} but doesn't use an % array of available modes: |style_def "foo"| will define a macro % |draw_foo| drawing a line of a certain style along any given path: % \begin{macrocode} def style_def suffix s = vsty_hash.s := 1; expandafter quote vardef scantokens ("draw_" & str s) enddef; % \end{macrocode} % % Let \MF{} do the lookup: suffices % \begin{macrocode} vardef vsty_exists suffix s = known vsty_hash.s enddef; % \end{macrocode} % an strings % \begin{macrocode} vardef valid_style expr s = expandafter vsty_exists scantokens (s) enddef; % \end{macrocode} % % \changes{v0.8}{1994/11/21}{Enhance and streamline the line styles.} % |phantom| lines are simple, even with arrows. % \begin{macrocode} style_def phantom expr p = \ enddef; style_def phantom_arrow expr p = cfill (arrow p); enddef; % \end{macrocode} % |plain| lines aren't harder. % \begin{macrocode} style_def plain expr p = cdraw p; enddef; style_def plain_arrow expr p = cdraw p; cfill (arrow p); enddef; style_def dbl_plain expr p = draw_double p; enddef; style_def dbl_plain_arrow expr p = draw_double_arrow p; enddef; % \end{macrocode} % Wiggly lines use |wiggly| from above % \begin{macrocode} style_def wiggly expr p = cdraw (wiggly p); enddef; style_def dbl_wiggly expr p = draw_double (wiggly p); enddef; % \end{macrocode} % and curly lines use |curly| from above % \begin{macrocode} style_def curly expr p = cdraw (curly p); enddef; style_def dbl_curly expr p = draw_double (curly p); enddef; % \end{macrocode} % zig-zag ditto: % \begin{macrocode} style_def zigzag expr p = cdraw (zigzag p); enddef; style_def dbl_zigzag expr p = draw_double (zigzag p); enddef; % \end{macrocode} % |draw_dashes p| draws a dashed line on |p| % \changes{v0.4}{1994/05/27}{% % Rename the line style \texttt{dashed} to \texttt{dashes}, to avoid % a name clash with \MP.} % \changes{v1.08}{1996/09/01}{% % \texttt{dashes}, \texttt{dbl\_dashes}: % integer number of dashes for full path instead of each segment.} % \begin{macrocode} style_def dashes expr p = save dpp; numeric dpp; dpp = ceiling (pixlen (p, 10) / dash_len) / length p; for k=0 upto dpp*length(p) - 1: cdraw point k/dpp of p .. point (k+.5)/dpp of p; endfor enddef; style_def dbl_dashes expr p = save dpp; numeric dpp; dpp = ceiling (pixlen (p, 10) / dash_len) / length p; for k=0 upto dpp*length(p) - 1: draw_double point k/dpp of p .. point (k+.5)/dpp of p; endfor enddef; % \end{macrocode} % Draw arrows for doubled lines larger: % \changes{v1.06}{1995/05/29}{% % Draw larger arrows for doubled lines (scale factor 1.5).} % \begin{macrocode} style_def dbl_dashes_arrow expr p = draw_dbl_dashes p; shrink (1.5); cfill (arrow p); endshrink; enddef; style_def dashes_arrow expr p = draw_dashes p; cfill (arrow p); enddef; % \end{macrocode} % % |draw_dots p| draws a dotted line on |path_arg| % \changes{v0.4}{1994/05/27}{% % Rename the line style \texttt{dotted} to \texttt{dots}, to be % consistent with \texttt{dashes}.} % \changes{v1.08}{1996/09/01}{% % \texttt{dots}, \texttt{dbl\_dots}: % integer number of dots for full path instead of each segment.} % \begin{macrocode} style_def dots expr p = save dpp; numeric dpp; dpp = ceiling (pixlen (p, 10) / dot_len) / length p; for k=0 upto dpp*length(p): cdrawdot point k/dpp of p; endfor enddef; style_def dbl_dots expr p = save dpp; numeric dpp; dpp = ceiling (pixlen (p, 10) / dot_len) / length p; begingroup save oldpen; pen oldpen; oldpen := currentpen; pickup oldpen scaled 3; % draw a thick linn for k=0 upto dpp*length(p): cdrawdot point k/dpp of p; endfor pickup oldpen; cullit; for k=0 upto dpp*length(p): undrawdot point k/dpp of p; endfor cullit; % and remove the stuffing endgroup; enddef; style_def dbl_dots_arrow expr p = draw_dbl_dots p; shrink (1.5); cfill (arrow p); endshrink; enddef; style_def dots_arrow expr p = draw_dots p; cfill (arrow p); enddef; % \end{macrocode} % % |draw_double p| draws a double line. % \begin{macrocode} style_def double expr p = save oldpen; pen oldpen; oldpen := currentpen; % \end{macrocode} % draw a thick linn % \begin{macrocode} pickup oldpen scaled 3; ccutdraw p; % \end{macrocode} % and remove the stuffing % \begin{macrocode} pickup oldpen; cullit; undraw p; cullit; enddef; style_def double_arrow expr p = draw_double p; shrink (1.5); cfill (arrow p); endshrink; enddef; % \end{macrocode} % % Old aliases: % \begin{macrocode} style_def vanilla expr p = draw_plain p enddef; style_def fermion expr p = draw_plain_arrow p enddef; style_def quark expr p = draw_plain_arrow p enddef; style_def electron expr p = draw_plain_arrow p enddef; style_def photon expr p = draw_wiggly p enddef; style_def boson expr p = draw_wiggly p enddef; style_def gluon expr p = draw_curly p enddef; style_def heavy expr p = draw_dbl_plain_arrow p enddef; style_def ghost expr p = draw_dots_arrow p enddef; style_def scalar expr p = draw_dashes_arrow p enddef; % \end{macrocode} % More old aliases: % \begin{macrocode} vardef fermion expr path_arg = cfill (arrow (path_arg)); path_arg enddef; vardef photon expr path_arg = wiggly path_arg enddef; vardef gluon expr path_arg = curly path_arg enddef; % \end{macrocode} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Graphs of vertices} % \label{sec:graphs} % % Here is the fun part of \FMF: \emph{automagic} placement of % vertices. % \begin{macrocode} %tracingmacros:=1; %tracingonline:=1; tracingstats:=1; % \end{macrocode} % % You can say |vtracing:=true| to see what's going on. % \begin{macrocode} boolean vtracing; vtracing := false; % true % \end{macrocode} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsubsection{Data structures} % % \DeleteShortVerb{\|} % \MakeShortVerb{\"} % % \begin{table}[t] % \begin{center} % \begin{tabular}{|l|l|l|}\hline % Type & Name & Purpose \\\hline\hline % "numeric" & "vlist.first" & pointer to first vertex (usually 1) \\\hline % "numeric" & "vlist.last" & pointer to last vertex (starts with 0) \\\hline % "string" & "vlist["$i$"]name" & symbolic name of the vertex\\\hline % "pair" & "vlist["$i$"]loc" & position of the vertex \\\hline % "string" & "vlist["$i$"]lbl" & label \\\hline % "numeric" & "vlist["$i$"]lbl.ang" & angle \\\hline % "numeric" & "vlist["$i$"]lbl.dist" & distance \\\hline % "path" & "vlist["$i$"]decor.shape" & shape of decoration\\\hline % "numeric" & "vlist["$i$"]decor.size" & size of decoration\\\hline % "numeric" & "vlist["$i$"]decor.sty" & filling style of decoration\\\hline % "numeric" & "vlist["$i$"]decor.ang" & rotation angle\\\hline % "numeric" & "vlist["$i$"]fore" & foreground color\\\hline % "numeric" & "vlist["$i$"]back" & background color\\\hline % "numeric" & "vlist["$i$"]arc.first" & pointer to first arc \\\hline % "numeric" & "vlist["$i$"]arc.last" & pointer to last arc \\\hline % "numeric" & "vlist["$i$"]arc["$j$"]" & $j$th arc of the $i$th vertex \\\hline % "string" & "vlist["$i$"]arc["$j$"]sty" & style of the arc\\\hline % "numeric" & "vlist["$i$"]arc["$j$"]tns" & tension of the arc\\\hline % "string" & "vlist["$i$"]arc["$j$"]lsr" & left, straight, right\\\hline % "string" & "vlist["$i$"]arc["$j$"]lbl" & label\\\hline % "string" & "vlist["$i$"]arc["$j$"]lbl.side"& side of the label\\\hline % "numeric" & "vlist["$i$"]arc["$j$"]lbl.dist"& distance of the label\\\hline % "numeric" & "vlist["$i$"]arc["$j$"]tag" & tag \\\hline % "numeric" & "vlist["$i$"]arc["$j$"]wd" & width of the arc\\\hline % "color" & "vlist["$i$"]arc["$j$"]fore"& foreground color\\\hline % "color" & "vlist["$i$"]arc["$j$"]back"& background color\\\hline % "numeric" & "vlist["$i$"]constr.first" & first constraint \\\hline % "numeric" & "vlist["$i$"]constr.last" & last constraint \\\hline % "numeric" & "vlist["$i$"]constr["$j$"]" & constraint on $j$th arc \\\hline % "numeric" & "vlist["$i$"]poly.first" & \\\hline % "numeric" & "vlist["$i$"]poly.last" & \\\hline % "numeric" & "vlist["$i$"]poly["$j$"]" & \\\hline % "numeric" & "vlist["$i$"]poly["$j$"]idx"& \\\hline % \end{tabular} % \end{center} % \caption{Vertex data structure} % \label{tab:VDS} % \end{table} % % \begin{table}[t] % \begin{center} % \begin{tabular}{|l|l|l|}\hline % Type & Name & Purpose \\\hline\hline % "numeric" & "plist.first" & pointer to first polygon (usually 1) \\\hline % "numeric" & "plist.last" & pointer to last polygon (starts with 0) \\\hline % "numeric" & "plist["$i$"]cnt" & number of edges\\\hline % "numeric" & "plist["$i$"]vtx["$j$"]" & pointer to the $j$th vertex\\\hline % "numeric" & "plist["$i$"]pull" & distortion\\\hline % "string" & "plist["$i$"]cona" & connector after\\\hline % "string" & "plist["$i$"]conb" & connector before\\\hline % "string" & "plist["$i$"]sty" & filling\\\hline % "string" & "plist["$i$"]lbl" & label\\\hline % "numeric" & "plist["$i$"]lbl.ang" & direction of the label\\\hline % "numeric" & "plist["$i$"]lbl.dist" & distance of the label\\\hline % "color" & "plist["$i$"]fore" & foreground color\\\hline % "color" & "plist["$i$"]back" & background color\\\hline % \end{tabular} % \end{center} % \caption{Polygon data structure} % \label{tab:PDS} % \end{table} % % \DeleteShortVerb{\"} % \MakeShortVerb{\|} % % The data structure for our graph is shown in % table~\ref{tab:VDS}\footnote{% % \begin{dubious} % \texttt{boolean vlist[i]arc[j]smooth} will indicate that this % arc belongs to a set of arcs which are to be smoothly connected. % The implementation will start by going to the strt of this set, % define a long smooth path and finally do the drawing on the % various subpaths. % \end{dubious}}. % \MF{} turns out to be quite powerful, providing such constructs % in an unconventional, but flexible and concise way. While we use % |save vhash| to forget all previously defined vertices, we leave % |vlist| alone, because we will know from $|vlist.last| < % |vlist.first|$ that it's empty. Note that we can't |vardef| this % because then the |save| would go inside a group. % \begin{macrocode} def vinit = save vhash; numeric vlist.first, vlist.last; vlist.first := 1; vlist.last := 0; pair vlist[]loc; numeric vlist[]decor.size, vlist[]decor.ang, vlist[]arc.first, vlist[]arc.last, vlist[]arc[], vlist[]arc[]lsr, vlist[]arc[]tns, vlist[]arc[]lbl.dist, vlist[]arc[]tag, vlist[]arc[]wd, vlist[]arc[]rub, vlist[]constr.first, vlist[]constr.last, vlist[]constr[], lambdax[][], lambday[][]; string vlist[]name, vlist[]lbl, vlist[]decor.sty, vlist[]arc[]sty, vlist[]arc[]lbl, vlist[]arc[]lbl.side; numeric vlist[]lbl.ang; path vlist[]decor.shape; %<*mp> color vlist[]fore, vlist[]back, vlist[]arc[]fore, vlist[]arc[]back; % % \end{macrocode} % Data structures for polygons (cf.~table~\ref{tab:PDS}): % \changes{v1.06}{1996/05/24}{ % New data structure \texttt{plist} and new entries % \texttt{vlist[]poly}.} % \begin{macrocode} numeric plist.first, plist.last, plist[]cnt, plist[]vtx[], plist[]pull, plist[]lbl.ang, plist[]lbl.dist; string plist[]lbl, plist[]sty, plist[]cona, plist[]conb; plist.first := 1; plist.last := 0; numeric vlist[]poly.first, vlist[]poly.last, vlist[]poly[], vlist[]poly[]idx; pair lambdap[][]; % color plist[]fore, plist[]back; enddef; % % \end{macrocode} % \begin{macro}{\fmfinit} % We can also ask for initialization explicitely from \TeX{} (usually % it is called implicitely by |\begin{fmfgraph}|). This flushes the % vertex table. % \begin{macrocode} % % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macrocode} %<*base> vardef vconnectn (expr linesty) (suffix v) (expr n) = vconnect (linesty, vmklist (v, n)); enddef; % \end{macrocode} % % Here's how to deconstruct a graph: |vpath| returns an arc from % |nfrom| to |nto|, if any. If a suffix is given, it % has to match the |tag| of the arc. % \changes{v0.9}{1995/04/19}{% % \texttt{vpath}: new function.} % \changes{v0.9}{1995/04/20}{% % \texttt{vpath}: new syntax.} % \begin{macrocode} vardef vpath@# (suffix from, to) = save nfrom, nto, origin, index, unknown_path; numeric nfrom, nto, origin, index; path unknown_path; if (known vloc from) and (known vloc to): nfrom := vlookup from; nto := vlookup to; vmatch_path (nfrom, nto, maybe_empty@#); if (unknown origin) or (unknown index): vmatch_path (nto, nfrom, maybe_empty@#); fi fi if (known origin) and (known index): vbuild_cut_arc (origin, index) else: unknown_path fi enddef; % \end{macrocode} % Hack: this will expand to an |unknown| value if the suffix is empty % and to the suffix otherwise. We use it to implement an optional % argument. % \begin{macrocode} vardef maybe_empty@# = save _prefix; _prefix=137; if known _prefix@#: whatever else: @# fi enddef; % \end{macrocode} % This is not a real function but a convenience macro and has the side % effect of setting |origin| and |index| if a match is found. % \begin{macrocode} vardef vmatch_path (expr nfrom, nto, t) = save i; for i = varcs (nfrom): if (vlist[nfrom]arc[i] = nto) and (known vlist[nfrom]arc[i]sty): if unknown t: origin := nfrom; index := i; else: if known vlist[nfrom]arc[i]tag: if vlist[nfrom]arc[i]tag = t: origin := nfrom; index := i; fi fi fi fi endfor enddef; % \end{macrocode} % % \begin{macrocode} vardef vcyclen (expr sty) (suffix v) (expr n) = for $ = 1 upto n - 1: vconnect (sty, v[$], v[$+1]); endfor vconnect (sty, v[n], v[1]); enddef; % \end{macrocode} % And the reverse: % \begin{macrocode} vardef vrcyclen (expr sty) (suffix v) (expr n) = vconnect (sty, v[1], v[n]); for $ = n downto 2: vconnect (sty, v[$], v[$-1]); endfor enddef; % % \end{macrocode} % % \begin{macro}{\fmfcyclen} % \begin{macrocode} %<*style> \def\fmfcyclen#1#2#3{% \fmfbuf@={#1}% \fmfcmd{vcyclen ("\the\fmfbuf@", \fmfpfx{#2}, #3);}} \def\fmfrcyclen#1#2#3{% \fmfbuf@={#1}% \fmfcmd{vrcyclen ("\the\fmfbuf@", \fmfpfx{#2}, #3);}} % % \end{macrocode} % \end{macro} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsubsection{Constraints} % % \begin{macro}{\fmfforce} % \begin{macro}{\fmfshift} % Explicit placement and shifting of vertices is handled in \TeX{} with % \begin{macrocode} %<*style> \def\fmfforce#1#2{\fmfcmd{vforce ((#1), \fmfpfx{#2});}} \def\fmfshift#1#2{\fmfcmd{vshift ((#1), \fmfpfx{#2});}} % % \end{macrocode} % \end{macro} % \end{macro} % % Force the vertex |v| to be placed at position |z|: % \begin{macrocode} %<*base> vardef vforce (expr z) (suffix v) = venter v; vlist[vlookup v]loc := z; enddef; % \end{macrocode} % % Shift the vertex |v| by |z|: % \begin{macrocode} vardef vshift (expr z) (text vl) = forsuffixes $=vl: if vexists $: vlist[vlookup $]loc := vlist[vlookup $]loc + z; fi endfor enddef; % % \end{macrocode} % % \begin{macro}{\fmffixed} % \begin{macro}{\fmffixedx} % \begin{macro}{\fmffixedy} % \changes{v0.8}{1995/01/07}{New command: \texttt{\protect\bslash fmffixed}.} % Place the first two arguments in the distance given by the third % argument. % \changes{v1.04}{1996/02/20}{% % \texttt{\protect\bslash fmffixedx}, % \texttt{\protect\bslash fmffixedy}: new macros.} % \begin{macrocode} %<*style> \def\fmffixed#1#2{\fmfcmd{vconstraint ((#1), \fmfpfx{#2});}} \def\fmffixedx#1#2{\fmfcmd{vconstraint (((#1),whatever), \fmfpfx{#2});}} \def\fmffixedy#1#2{\fmfcmd{vconstraint ((whatever,(#1)), \fmfpfx{#2});}} % % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % This amounts to adding one or more constraints into the vertex data % structure: % \begin{macrocode} %<*base> vardef vconstraint (expr z) (text vl) = save nfrom, nto; numeric nfrom, nto; forsuffixes to = vl: venter to; nto := vlookup to; if known nfrom: vlist[nfrom]constr.last := vlist[nfrom]constr.last + 1; vlist[nto]constr.last := vlist[nto]constr.last + 1; vlist[nfrom]constr[vlist[nfrom]constr.last] := nto; vlist[nto]constr[vlist[nto]constr.last] := nfrom; vlist[nto]loc = vlist[nfrom]loc + z; fi nfrom := nto; endfor enddef; % \end{macrocode} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsubsection{Polygons} % % Define a polygon: % \changes{v1.06}{1996/05/24}{ % New function \texttt{vpolygon}: allocate a polygon.} % \begin{macrocode} vardef vpolygon (expr psty) (suffix v) (text vl) = save nopt, csty, nfrom, nfrom_, nto, i, n, j; numeric nopt, nfrom, nfrom_, nto, i, n, j; string csty; % \end{macrocode} % Allocate a fresh polygon: % \begin{macrocode} n := count (vl) + 1; plist.last := plist.last + 1; plist[plist.last]cnt := n; plist[plist.last]lbl := ""; plist[plist.last]lbl.ang := whatever; plist[plist.last]lbl.dist := 0; % \end{macrocode} % Parse the options: % \begin{macrocode} csty := "phantom"; getopt (opt, psty); for nopt = opt.first upto opt.last: if match_option (opt[nopt], "filled"): get_argument (opt[nopt], opt[nopt]arg, plist[plist.last]sty); elseif match_option (opt[nopt], "tension"): if known opt[nopt]arg: csty := csty & ",tension=" & opt[nopt]arg; else: message "feynmf: option `tension' needs an argument. Ignored."; fi elseif match_option (opt[nopt], "label"): get_argument (opt[nopt], opt[nopt]arg, plist[plist.last]lbl); elseif match_option (opt[nopt], "label.angle"): get_argument (opt[nopt], scantokens (opt[nopt]arg), plist[plist.last]lbl.ang); elseif match_option (opt[nopt], "label.dist"): get_argument (opt[nopt], scantokens (opt[nopt]arg), plist[plist.last]lbl.dist); elseif match_option (opt[nopt], "pull"): get_argument (opt[nopt], scantokens (opt[nopt]arg), plist[plist.last]pull); elseif match_option (opt[nopt], "cona"): get_argument (opt[nopt], opt[nopt]arg, plist[plist.last]cona); elseif match_option (opt[nopt], "conb"): get_argument (opt[nopt], opt[nopt]arg, plist[plist.last]conb); elseif match_option (opt[nopt], "smooth"): plist[plist.last]cona := ".."; plist[plist.last]conb := ".."; ignore_argument (opt[nopt], opt[nopt]arg); %<*mp> elseif match_option (opt[nopt], "foreground"): get_argument (opt[nopt], scantokens (opt[nopt]arg), plist[plist.last]fore); elseif match_option (opt[nopt], "background"): get_argument (opt[nopt], scantokens (opt[nopt]arg), plist[plist.last]back); % %<*!mp> elseif match_option (opt[nopt], "foreground") or match_option (opt[nopt], "background"): message "feynmf: color available with MetaPost only!"; % elseif match_option (opt[nopt], "phantom"): plist[plist.last]sty := "phantom"; elseif match_option (opt[nopt], "empty"): plist[plist.last]sty := "empty"; elseif match_option (opt[nopt], "full"): plist[plist.last]sty := "full"; elseif match_option (opt[nopt], "hatched"): plist[plist.last]sty := "hatched"; elseif match_option (opt[nopt], "shaded"): plist[plist.last]sty := "shaded"; else: ignore_option (opt[nopt], opt[nopt]arg); fi endfor canonicalize_filling plist[plist.last]sty; % \end{macrocode} % Enter the vertices: % \begin{macrocode} vconnect (csty, v, vl, v); i := 1; forsuffixes to = v, vl, v: nto := vlookup to; if known nfrom: % \end{macrocode} % Enter a constraint: % \begin{equation} % \vec v_{i+1} = \vec v_{i} % + R(2\pi/n_P) \left( \vec v_{i} - \vec v_{i-1} \right) % \end{equation} % \begin{macrocode} if known nfrom_: vlist[nto]loc = vlist[nfrom]loc + (vlist[nfrom]loc - vlist[nfrom_]loc) rotated (360/n); fi vlist[nto]poly.last := vlist[nto]poly.last + 1; vlist[nto]poly[vlist[nto]poly.last] := plist.last; vlist[nto]poly[vlist[nto]poly.last]idx := i; plist[plist.last]vtx[i] := nto; i := i + 1; nfrom_ := nfrom; fi nfrom := nto; endfor enddef; % \end{macrocode} % % \changes{v1.06}{1996/05/24}{ % New function \texttt{canonicalize\_filling}: abstracted from % \texttt{vvertex}.} % \begin{macrocode} vardef canonicalize_filling suffix f = if known f: if is_a_number (f): if scantokens f <= 1: f := if scantokens f = 1: "full" elseif scantokens f > 0: "shaded" elseif scantokens f = 0: "empty" else: "hatched" fi; fi fi fi enddef; % \end{macrocode} % % \begin{macrocode} vardef vpolygonn (expr sty) (suffix v) (expr n) = vpolygon (sty, v[1], for $=2 upto n-1: v[$], endfor v[n]); enddef; % \end{macrocode} % % \begin{macrocode} vardef vrpolygonn (expr sty) (suffix v) (expr n) = vpolygon (sty, v[n], for $=n-1 downto 2: v[$], endfor v[1]); enddef; % % \end{macrocode} % % \begin{macro}{\fmfpoly} % \begin{macro}{\fmfpolyn} % \begin{macro}{\fmfrpolyn} % \changes{v1.06}{1996/05/24}{% % New macros \texttt{\protect\bslash fmfpoly} % \texttt{\protect\bslash fmfpolyn}, % \texttt{\protect\bslash fmfrpolyn}.} % \begin{macrocode} %<*style> \def\fmfpoly#1#2{% \fmfbuf@={#1}% \fmfcmd{vpolygon ("\the\fmfbuf@", \fmfpfx{#2});}} \def\fmfpolyn#1#2#3{% \fmfbuf@={#1}% \fmfcmd{vpolygonn ("\the\fmfbuf@", \fmfpfx{#2}, #3);}} \def\fmfrpolyn#1#2#3{% \fmfbuf@={#1}% \fmfcmd{vrpolygonn ("\the\fmfbuf@", \fmfpfx{#2}, #3);}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsubsection{Internal vertices} % % \begin{macro}{\fmflabel} % \begin{macrocode} \def\fmflabel#1#2{% \fmfbuf@={#1}% \fmfcmd{vlabel ("\the\fmfbuf@", \fmfpfx{#2});}} % % \end{macrocode} % \end{macro} % % \begin{macrocode} %<*base> vardef vlabel (expr s) (suffix v) = venter v; vlist[vlookup v]lbl := s; enddef; % % \end{macrocode} % % \begin{macro}{\fmfv} % \begin{macrocode} %<*style> \def\fmfv#1#2{% \fmfbuf@={#1}% \fmfcmd{vvertex ("\the\fmfbuf@", \fmfpfx{#2});}} \def\fmfvn#1#2#3{% \fmfbuf@={#1}% \fmfcmd{vvertexn ("\the\fmfbuf@", \fmfpfx{#2}, #3);}} % % \end{macrocode} % \end{macro} % % \changes{v0.7}{1994/10/22}{% % \texttt{blob} and \texttt{dot} options obsolete, handle generalized % decorations (polygons).} % \begin{macrocode} %<*base> vardef vvertex (expr vtxsty) (text vl) = save nopt, sty, arg; numeric nopt, arg; string sty; getopt (opt, vtxsty); forsuffixes v = vl: venter v; n := vlookup v; for nopt = opt.first upto opt.last: handle_vertex_option (vlist[n], opt[nopt], opt[nopt]arg); endfor endfor enddef; % \end{macrocode} % % \begin{macrocode} vardef handle_vertex_option (suffix v) (expr opt, arg) = if match_option (opt, "label"): get_argument (opt, arg, v.lbl); elseif match_option (opt, "label.angle"): get_argument (opt, scantokens (arg), v.lbl.ang); elseif match_option (opt, "label.dist"): get_argument (opt, scantokens (arg), v.lbl.dist); elseif match_option (opt, "decoration.shape"): if known arg: make_decor_shape (v.decor.shape, arg); else: message "feynmf: option `decor.shape' needs an argument. Ignored."; fi % \end{macrocode} % \MP{} has |filled| reserved, use |sty| instead. % \begin{macrocode} elseif match_option (opt, "decoration.filled"): get_argument (opt, arg, v.decor.sty); % \end{macrocode} % Continue to support the old numeric argument: % \begin{macrocode} canonicalize_filling v.decor.sty; elseif match_option (opt, "decoration.size"): get_argument (opt, scantokens (arg), v.decor.size); elseif match_option (opt, "decoration.angle"): get_argument (opt, scantokens (arg), v.decor.ang); %<*mp> elseif match_option (opt, "foreground"): get_argument (opt, scantokens (arg), v.fore); elseif match_option (opt, "background"): get_argument (opt, scantokens (arg), v.back); % %<*!mp> elseif match_option (opt, "foreground") or match_option (opt, "background"): message "feynmf: color available with MetaPost only!"; % % \end{macrocode} % Ignore bogus options: % \begin{macrocode} else: ignore_option (opt, arg); fi enddef; % \end{macrocode} % Maybe we should replace this long switch by a hashing scheme: % \begin{macrocode} vardef make_decor_shape (suffix p) (expr n) = if match_prefix (n, "circle"): p := fullcircle; elseif match_prefix (n, "square"): p := unitsquare shifted -(.5,.5); elseif match_prefix (n, "cross"): p := polycross 4; elseif match_prefix (n, "triangle"): p := polygon 3; elseif match_prefix (n, "triagon"): p := polygon 3; elseif match_prefix (n, "diamond"): p := polygon 4; elseif match_prefix (n, "tetragon"): p := polygon 4; elseif match_prefix (n, "pentagon"): p := polygon 5; elseif match_prefix (n, "hexagon"): p := polygon 6; elseif match_prefix (n, "triagram"): p := polygram 3; elseif match_prefix (n, "tetragram"): p := polygram 4; elseif match_prefix (n, "pentagram"): p := polygram 5; elseif match_prefix (n, "hexagram"): p := polygram 6; elseif match_prefix (n, "triacross"): p := polycross 3; elseif match_prefix (n, "tetracross"): p := polycross 4; elseif match_prefix (n, "pentacross"): p := polycross 5; elseif match_prefix (n, "hexacross"): p := polycross 6; else: if feynmfwizard: p := scantokens(n); else: message "feynmf: invalid argument `" & n & "' to option `decor.shape'. Ignored."; fi fi enddef; % \end{macrocode} % % \begin{macrocode} vardef is_a_number expr s = save n; if known s: (true for n = 1 upto length s: and ((substring (n-1,n) of s = ".") or (substring (n-1,n) of s = "-") or isdigit substring (n-1,n) of s) endfor) else: false fi enddef; % \end{macrocode} % % \begin{macrocode} vardef vvertexn (expr vtxsty) (suffix v) (expr n) = vvertex (vtxsty, vmklist (v, n)); enddef; % % \end{macrocode} % % \begin{macro}{\fmfblob} % \begin{macro}{\fmfdot} % We can decorate vertices with ``blobs'' and dots from \TeX{} with % the command sequences: % \begin{macrocode} % % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % Here are the ``galleries'' we're hooking our external vertices on % (see figure~\ref{fig:curvedgalleries}): % \changes{v0.99}{1995/05/04}{% % Adjust galleries to subgraphs.} % \begin{macrocode} %<*base> vardef curved_left_gallery = .9[se,sw] .. .5[sw,nw] .. .1[nw,ne] enddef; vardef curved_right_gallery = .9[sw,se] .. .5[se,ne] .. .1[ne,nw] enddef; vardef curved_bottom_gallery = .9[nw,sw] .. .5[sw,se] .. .1[se,ne] enddef; vardef curved_top_gallery = .9[sw,nw] .. .5[nw,ne] .. .1[ne,se] enddef; vardef curved_surround_gallery = superellipse (.5[se,ne], .5[ne,nw], .5[nw,sw], .5[sw,se], .75) enddef; % \end{macrocode} % Here are their straight brothers (see % figure~\ref{fig:straightgalleries}): % \begin{macrocode} vardef straight_left_gallery = sw -- nw enddef; vardef straight_right_gallery = se -- ne enddef; vardef straight_bottom_gallery = sw -- se enddef; vardef straight_top_gallery = nw -- ne enddef; vardef straight_surround_gallery = .5[se,ne] -- ne -- .5[ne,nw] -- nw -- .5[nw,sw] -- sw -- .5[sw,se] -- se -- cycle enddef; % \end{macrocode} % And here's how to switch: % \begin{macrocode} vardef curved_galleries = vardef left_gallery = curved_left_gallery enddef; vardef right_gallery = curved_right_gallery enddef; vardef bottom_gallery = curved_bottom_gallery enddef; vardef top_gallery = curved_top_gallery enddef; vardef surround_gallery = curved_surround_gallery enddef; enddef; vardef straight_galleries = vardef left_gallery = straight_left_gallery enddef; vardef right_gallery = straight_right_gallery enddef; vardef bottom_gallery = straight_bottom_gallery enddef; vardef top_gallery = straight_top_gallery enddef; vardef surround_gallery = straight_surround_gallery enddef; enddef; % \end{macrocode} % The \MF{} code which does the hard work for the above % \TeX{} macros % \begin{macrocode} vardef vleft (text vl) = vdistribute (left_gallery, vl) enddef; vardef vright (text vl) = vdistribute (right_gallery, vl) enddef; vardef vbottom (text vl) = vdistribute (bottom_gallery, vl) enddef; vardef vtop (text vl) = vdistribute (top_gallery, vl) enddef; vardef vsurround (text vl) = vdistribute (surround_gallery, vl) enddef; % \end{macrocode} % % Curved galleries are the default % \begin{macrocode} curved_galleries; % % \end{macrocode} % \begin{macro}{\fmfcurved} % \begin{macro}{\fmfstraight} % but here's how to switch: % \changes{v0.98}{1995/04/29}{shortened galleries switch.} % \begin{macrocode} %<*style> \def\fmfcurved{\fmfcmd{curved_galleries;}} \def\fmfstraight{\fmfcmd{straight_galleries;}} \let\fmfcurvedgalleries\fmfcurved \let\fmfstraightgalleries\fmfstraight % % \end{macrocode} % \end{macro} % \end{macro} % % Distribute the vertices in the list |vl| evenly along the path |p|: % \begin{macrocode} %<*base> vardef vdistribute (expr p) (text vl) = save numv, len, off; numeric numv, len, off; numv = count (vl); % \end{macrocode} % If the path is cyclic, place the first vertex twice: % \begin{macrocode} 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; % % \end{macrocode} % % \begin{macro}{\fmfleftn} % \begin{macro}{\fmfrightn} % \begin{macro}{\fmfbottomn} % \begin{macro}{\fmftopn} % \begin{macro}{\fmfsurroundn} % A short cut: % \begin{macrocode} %<*style> \def\fmfleftn#1#2{\fmfcmd{vleftn (\fmfpfx{#1}, #2);}} \def\fmfrightn#1#2{\fmfcmd{vrightn (\fmfpfx{#1}, #2);}} \def\fmfbottomn#1#2{\fmfcmd{vbottomn (\fmfpfx{#1}, #2);}} \def\fmftopn#1#2{\fmfcmd{vtopn (\fmfpfx{#1}, #2);}} \let\fmfincomingn\fmfleftn \let\fmfoutgoingn\fmfrightn \def\fmfsurroundn#1#2{\fmfcmd{vsurroundn (\fmfpfx{#1}, #2);}} % % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macrocode} %<*base> def vmklist (suffix v) (expr n) = for $ = 1 upto n-1: v[$], endfor v[n] enddef; % \end{macrocode} % % \begin{macrocode} vardef vleftn (suffix v) (expr n) = vleft (vmklist (v, n)); enddef; vardef vrightn (suffix v) (expr n) = vright (vmklist (v, n)); enddef; vardef vbottomn (suffix v) (expr n) = vbottom (vmklist (v, n)); enddef; vardef vtopn (suffix v) (expr n) = vtop (vmklist (v, n)); enddef; vardef vsurroundn (suffix v) (expr n) = vsurround (vmklist (v, n)); enddef; % % \end{macrocode} % % \begin{macro}{\fmffor} % \begin{macro}{\endfmffor} % \begin{macrocode} %<*style> \def\fmffor#1#2#3#4{\fmfcmd{for #1 = #2 step #3 until #4:}} \def\endfmffor{\fmfcmd{endfor}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\fmfgroup} % \begin{macro}{\endfmfgroup} % Syntactic sugar: % \changes{v0.98}{1995/04/29}{\texttt{fmfgroup}: new environment.} % \begin{macrocode} \def\fmfgroup{\fmfcmd{begingroup}} \def\endfmfgroup{\fmfcmd{endgroup;}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\fmfset} % \changes{v0.98}{1995/04/29}{% % \texttt{\protect\bslash fmfset}: new command.} % \begin{macrocode} \def\fmfset#1#2{\fmfcmd{save #1; #1:=#2;}} % % \end{macrocode} % \end{macro} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Choosing a layout for the graph} % % The procedure |vfreeze| is called near the end and % chooses ``optimal'' vertex positions by minimizing the sum of the % weighted lengths of the arcs. Since the quantity to be optimized is % quadratic in the vertices % \begin{equation} % L = \frac{1}{2} \sum_i \sum_{j\in\alpha(i)} % t_{ij} (\vec v_i - \vec v_j)^2\,, % \end{equation} % where~$\alpha(i)$ denotes the set of vertices connectes with the % vertex~$i$, we just have to solve a system of linear equations. % Adding Lagrange multipliers~$\lambda_{ij}$ for the constraints that % have been specified % \begin{equation} % \Lambda = \sum_i \sum_{j\in\gamma(i) \atop j>i} % \vec\lambda_{ij}\cdot(\vec v_i - \vec v_j - \vec d_{ij})\,, % \end{equation} % where~$\gamma(i)$ denotes the set of vertices which have a fixed % distance to the vertex~$i$, the set of linear equations is given by % \begin{eqnarray} % 0 & = & \frac{\partial}{\partial \vec v_i} (L+\Lambda) % = \sum_{j\in\alpha(i)} t_{ij} (\vec v_i - \vec v_j) % + \sum_{j\in\gamma(i) \atop j>i} \vec\lambda_{ij} % - \sum_{j\in\gamma(i) \atop j vardef vfreeze = for i = vertices: % \end{macrocode} % and iff the position of the vertex has not been fixed yet, add % another equation. Note that each arc enters twice (incoming % \emph{and} outgoing) in this procedure. Thus it is easiest to store % them \emph{both} ways in the |vlist| structure % (cf.~page~\pageref{pg:vconnect})\label{pg:vfreeze}. % \begin{macrocode} 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 for j = vconstr (i): if i < vlist[i]constr[j]: + lambda (i, vlist[i]constr[j]) elseif i > vlist[i]constr[j]: - lambda (vlist[i]constr[j], i) fi endfor for j = vpoly (i): + lambdapoly (vlist[i]poly[j], plist[vlist[i]poly[j]]cnt, vlist[i]poly[j]idx) endfor; fi endfor % \end{macrocode} % Inquiring minds might want to see the result in numbers: % \begin{macrocode} if vtracing: vdump; fi enddef; % \end{macrocode} % Separate Langrange multipliers for~$x$ and~$y$: % \changes{v1.04}{1996/02/20}{% % Have separate Langrange multipliers for~$x$ and~$y$.} % \begin{macrocode} vardef lambda (expr i, j) = (if known (xpart(vlist[i]loc - vlist[j]loc)): lambdax[i][j] else: 0 fi, if known (ypart(vlist[i]loc - vlist[j]loc)): lambday[i][j] else: 0 fi) enddef; % \end{macrocode} % % The Lagrange multiplier for a polynomial~$P$ % \begin{equation} % \Lambda_P = \sum_{i=2}^{n_P} \vec\lambda_{P,i} % \left( \vec v_{i+1} - \vec v_i % + R(2\pi/n_P) \left( \vec v_{i-1} - \vec v_i \right) % \right) % \end{equation} % can be reshuffled trivially % \begin{eqnarray} % \Lambda_P & = & % \vec\lambda_{n-1} \vec v_{n} % - \vec\lambda_1 \vec v_2 % + \vec\lambda_2 R(2\pi/n_P) \vec v_1 % - \vec\lambda_n R(2\pi/n_P) \vec v_{n-1} \\ % & & \mbox{} + \sum_{i=2}^{n_P} % \left( \vec\lambda_{i-1} + \vec\lambda_{i+1} R(2\pi/n_P) % - \vec\lambda_i (1 + R(2\pi/n_P)) \right) \vec v_i % \nonumber % \end{eqnarray} % \changes{v1.06}{1996/05/24}{ % New function \texttt{lambdapoly}: Lagrange multipliers for % polygons.} % \begin{macrocode} vardef lambdapoly (expr p, n, i) = origin if i = 1: + lambdap[p][2] rotated (-360/n) elseif i = 2: - lambdap[p][1] fi if i = n - 1: - lambdap[p][n] rotated (-360/n) elseif i = n: + lambdap[p][n-1] fi if (i > 1) and (i < n): + lambdap[p][i-1] + lambdap[p][i+1] rotated (-360/n) - lambdap[p][i] - lambdap[p][i] rotated (-360/n) fi enddef; % % \end{macrocode} % \begin{macro}{\fmffreeze} % Again, we can ask for positioning and drawing explicitely from \TeX{} % (usually called implicitely by |\end{fmfgraph}|). This is useful for % subsequent fine tuning. % \changes{v0.9}{1995/04/27}{% % \texttt{\protect\bslash fmffreeze} % is new name of \texttt{\protect\bslash fmfposition}.} % \begin{macrocode} % % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \subsection{Drawing the graph} % % \begin{macro}{\fmfdraw} % \begin{macrocode} % % \end{macrocode} % \end{macro} % \end{macro} % % Now we're done with the \MF{} macros % \begin{macrocode} %<*base> endinput; % % \end{macrocode} % and the \TeX{} macros too: % \begin{macrocode} %<*style> \mdqrestore % % \end{macrocode} % % \Finale % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \appendix % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \section{Driver file} % % \begin{macrocode} %<*driver> %<*!209> \documentclass[a4paper]{article} \usepackage{doc} % \end{macrocode} % The \MF{} and \MP{} logos come out much nicer if you have |mflogo| % installed: % \begin{macrocode} \IfFileExists{mflogo.sty}% {\usepackage{mflogo}% \def\FMF{\texttt{feyn}\textlogo{MF}}}% {\def\MF{\textsf{META}\-\textsf{FONT}}% \def\MP{\textsf{META}\-\textsf{POST}}% \def\FMF{\texttt{feyn}\textsf{MF}}} % \end{macrocode} % Here is the place to declare your own PostScript aware |dvi| driver % option: % \changes{v1.01}{1995/07/05}{% % Don't force \texttt{dvips} as \texttt{dvi} driver.} % \begin{macrocode} \usepackage{graphics}[1994/12/15] %\usepackage{feynmp} %\usepackage{feynmf} % % \end{macrocode} % Here's the \LaTeX~2.09 compatibility stuff: % \begin{macrocode} %<*209> %\documentstyle[doc,feynmp209]{article} %\documentstyle[doc,feynmf209,epsf]{article} %\let\includegraphics\epsffile \def\textit#1{{\it#1\/}} \def\textbf#1{{\bf#1}} \def\textsf#1{{\sf#1}} \def\texttt#1{{\tt#1}} \def\emph#1{{\em#1\/}} \let\bfseries\bf \def\LaTeXe{\LaTeX$2_\epsilon$} \def\MF{\textsf{META}\-\textsf{FONT}} \def\MP{\textsf{META}\-\textsf{POST}} \def\FMF{\texttt{feyn}\textsf{MF}} % % \end{macrocode} % The rest is common: % \begin{macrocode} \font\manfnt=manfnt \def\dangerousbend/{{\manfnt\char"7F}} \def\dubious{\begin{itemize}\item[\dangerousbend/]} \def\enddubious{\end{itemize}} \def\examples#1{% \begin{list}{}% {\setlength{\leftmargin}{#1}% \addtolength{\leftmargin}{\marginparsep}% \addtolength{\leftmargin}{-\marginparwidth}% \setlength{\rightmargin}{0mm}% \setlength{\itemindent}{\parindent}% \setlength{\listparindent}{\parindent}}% \item} \def\endexamples{\end{list}} \def\marginexample#1{\marginpar{\hbox to\marginparwidth{#1\hss}}} \parindent0pt \def\manindex#1{\SortIndex{#1}{#1}} %\OnlyDescription \EnableCrossrefs \RecordChanges \CodelineIndex \DoNotIndex{\def,\gdef,\long,\let,\begin,\end,\if,\ifx,\else,\fi} \DoNotIndex{\immediate,\write,\newwrite,\openout,\closeout,\typeout} \DoNotIndex{\font,\nullfont,\jobname,\documentclass} \DoNotIndex{\batchmode,\errorstopmode,\char,\catcode,\ } \DoNotIndex{\CodelineIndex,\DocInput,\DoNotIndex,\EnableCrossrefs} \DoNotIndex{\filedate,\filename,\fileversion,\logo,\manfnt} \DoNotIndex{\NeedsTeXFormat,\ProvidesPackage,\RecordChanges,\space} \DoNotIndex{\usepackage,\wlog,\@gobble,\@ifundefined,\@namedef,\@spaces} \DoNotIndex{\begingroup,\csname,\edef,\endcsname,\expandafter,\hbox} \DoNotIndex{\hskip,\ifeof,\ignorespaces,\item,\leavevmode,\loop,\makebox} \DoNotIndex{\newcounter,\newif,\newread,\openin,\par,\parindent,\put} \DoNotIndex{\read,\relax,\repeat,\setcounter,\stepcounter,\the} \DoNotIndex{\value,\vbox,\vskip} \DoNotIndex{\@tempa,\@tempb,\advance,\bf,\bfseries,\closein} \DoNotIndex{\CurrentOption,\DeclareOption,\documentstyle,\em,\emph} \DoNotIndex{\endgroup,\epsilon,\global,\hfuzz,\input,\it,\LaTeX,\LaTeXe} \DoNotIndex{\macrocode,\meaning,\OnlyDescription,\PassOptionsToPackage} \DoNotIndex{\ProcessOptions,\RequirePackage,\sf,\string,\textbf,\textit} \DoNotIndex{\textsf,\texttt,\tt,\unitlength} % \end{macrocode} % Cut the linebreaking some slack for macrocode which might conatin % long lines (it doesn't really hurt if they stick out a bit). % \begin{macrocode} \let\origmacrocode\macrocode \def\macrocode{\hfuzz 5em\origmacrocode} \begin{document} \DocInput{feynmf.dtx} \end{document} % % \end{macrocode} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \endinput Local Variables: mode:LaTeX fill-prefix:"% " indent-tabs-mode:nil change-log-default-name:"TODO" page-delimiter:"^% %%%%%%%%%*\n" End: feynmf-1.08.orig/feynmf.ins0000664000175000017500000001007406250470140017342 0ustar kmccartykmccarty00000000000000% feynmf.ins - Feynman diagrams with METAFONT for LaTeX(2e) % Copyright (C) 1994,1995 by Thorsten.Ohl@Physik.TH-Darmstadt.de % $Id: feynmf.ins,v 1.5 1995/05/06 11:38:11 ohl Exp $ % % Feynmf is free software; you can redistribute it and/or modify it % under the terms of the GNU General Public License as published by % the Free Software Foundation; either version 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. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \def\batchfile{feynmf.ins} \input docstrip.tex \keepsilent %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \preamble Copyright (C) 1989, 1990, 1992-1995 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. As a special exception, you can redistribute parts of this file for the electronic distribution of scientific papers, provided that you include a short note pointing to the complete source. 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. \endpreamble %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \Msg{Generating style file feynmf.sty for the feynmf package:} \generateFile{feynmf.sty}{f}{\from{feynmf.dtx}{style}} \Msg{Generating Metafont base feynmf.mf:} \generateFile{feynmf.mf}{f}{\from{feynmf.dtx}{base}} \Msg{Generating style file feynmp.sty for the MetaPost version:} \generateFile{feynmp.sty}{f}{\from{feynmf.dtx}{style,mp}} \Msg{Generating MetaPost base feynmp.mp:} \generateFile{feynmp.mp}{f}{\from{feynmf.dtx}{base,mp}} \Msg{Generating driver file for manual fmfman.drv:} \generateFile{fmfman.drv}{f}{\from{feynmf.dtx}{driver,manual}} \Msg{Generating alternate MetaPost driver file fmfmanps.drv:} \generateFile{fmfmanps.drv}{f}{\from{feynmf.dtx}{driver,manual,mp}} \Msg{Generating driver file for documentation feynmf.drv:} \generateFile{feynmf.drv}{f}{\from{feynmf.dtx}{driver}} \Msg{Generating alternate MetaPost driver file feynmp.drv:} \generateFile{feynmp.drv}{f}{\from{feynmf.dtx}{driver,mp}} \Msg{***************************************************************} \Msg{*} \Msg{* To finish the installation you have to move the files} \Msg{*} \Msg{*\space\space o feynmf.sty into a directory searched by TeX} \Msg{*\space\space o feynmf.mf into a directory searched by Metafont} \Msg{*\space\space o feynmp.sty into a directory searched by TeX} \Msg{*\space\space o feynmp.mp into a directory searched by MetaPost} \Msg{*} \Msg{* You can remove the latter two if you don't have} \Msg{* John Hobby's MetaPost system. Optionally you can copy the} \Msg{* files fmfman.dtx and fmfmanps.drv into a directory searched by} \Msg{* TeX, so that users can print a copy of the documentation.} \Msg{*} \Msg{***************************************************************} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \endinput Local Variables: mode:LaTeX fill-prefix:"% " page-delimiter:"^% %%%%%%%%%*\n" End: feynmf-1.08.orig/feynmf.pl0000664000175000017500000003051606250470140017167 0ustar kmccartykmccarty00000000000000#! /usr/bin/perl # feynmf.pl -- FeynMF driver for UNIX systems # Copyright (C) 1996 by Thorsten.Ohl@Physik.TH-Darmstadt.de # $Id: feynmf.pl,v 1.5 1996/12/02 01:38:45 ohl Exp $ # # Feynmf is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 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. # ######################################################################## =head1 NAME B - Process B files using B =head1 SYNOPSIS B [B<-hvqncfT>] [B<-t> I [B<-t> I ...]] [B<-m> I] I [I ...] B [B<--help>] [B<--version>] [B<--quiet>] [B<--noexec>] [B<--clean>] [B<--force>] [B<--notfm>] [B<--tfm> I [B<--tfm> I ...]] [B<--mode> I] I [I ...] =head1 DESCRIPTION The most complicated part of using the B style appears to be the proper invocation of B. The B script provides a convenient front end and will automagically invoke B with the proper mode and magnifincation. It will also avoid cluttering system font directories and offers an option to clean them. =head1 OPTIONS =over 4 =item B<-h>, B<--help> Print a short help text. =item B<-v>, B<--version> Print the version of B. =item B<-q>, B<--quiet> Don't echo the commands being executed. =item B<-n>, B<--noexec> Don't execute B or B. =item B<-c>, B<--clean> Offer to delete font files that have accidentally been placed in a system directory by the B and B scripts (these scripts are run by B (and B) in the background). This option has only been tested with recent versions of UNIX TeX. =item B<-f>, B<--force> Don't ask any questions. =item B<-T>, B<--notfm> Don't try to prepare fake C<.tfm> files for the first run. =item B<-t>, B<--tfm> I Don't try guess the names of the C<.tfm> files to fake for the first run and use the given name(s) instead. This option can be useful if our incomplete parsing of the LaTeX input files fails. =item -B I, B<--mode> I Select the METAFONT mode I. The default is guessed or C if the guess fails. =item I Main B input files. =item I ... Other LaTeX input files that are included by the main file. =back =head1 AUTHOR Thorsten Ohl =head1 BUGS The preparation of C<.tfm> files is not foolproof yet, because we can parse B files only superficially. This script has only been tested for recent B distributions of UNIX B, though it will probably work with other versions of UNIX B. The author will be grateful for portability suggestions, even concerning B operating systems, for the benefit of those users that are forced to live with DOS or Windows. =cut ######################################################################## require 5.000; # use strict; use File::Find; use Getopt::Long; ######################################################################## # # Run a program, optionally echoing to standard output. # ######################################################################## sub maybe_run { my ($cmd) = @_; print "feynmf: $cmd\n" unless $opt_quiet; system $cmd unless $opt_noexec; } sub run_latex { my ($tex) = @_; maybe_run "$latex_prog $tex"; } ######################################################################## # # Search for auxiliary programs, some of which are required for running # this script. Bail out if these don't exist. # ######################################################################## sub find_program_on_path { my ($p, $flag) = @_; my (@path, $d); @path = grep {s/^$/./; 1} (split /:/, $ENV{"PATH"}); foreach $d (@path) { return "$d/$p" if -x "$d/$p"; } if ($flag eq 'REQUIRED') { die "feynmf: fatal: Can't find $p on \$PATH\n"; } if ($flag eq 'RECOMMENDED') { warn "feynmf: warning: Can't find $p on \$PATH\n"; return; } if (defined $flag) { die "feynmf: fatal: illegal flag in find_program_on_path: $flag\n"; } return; } sub find_programs { $kpsexpand_prog = find_program_on_path 'kpsexpand', 'RECOMMENDED'; $kpsepath_prog = find_program_on_path 'kpsepath', 'RECOMMENDED'; $kpsetool_prog = find_program_on_path 'kpsetool', 'RECOMMENDED'; $gftopk_prog = find_program_on_path 'gftopk', 'RECOMMENDED'; $pltotf_prog = find_program_on_path 'pltotf', 'RECOMMENDED'; $latex_prog = find_program_on_path 'latex', 'REQUIRED'; $mf_prog = find_program_on_path 'mf', 'REQUIRED'; $dvitype_prog = find_program_on_path 'dvitype', 'REQUIRED'; } ######################################################################## # # System dependent stuff: guess search paths and Metafont mode. # ######################################################################## sub uniq { my $last = ''; my (@result, $d); foreach $d (sort @_) { push @result, $d if $d ne $last; $last = $d; } return @result; } sub path_to_list { my ($p) = @_; grep { s=^~=$1$ENV{HOME}=; s=^!!==; s=//.*$=/=; !m=^\.?$= } split (/:+/, $p); } %TEXENV = ( tex => 'TEXINPUTS', mf => 'MFINPUTS', tfm => 'TFMFONTS', pk => 'PKFONTS', gf => 'GFFONTS' ); sub guess_path { my ($type) = @_; if ($kpsetool_prog) { return path_to_list (`$kpsetool_prog -p $type` or die "feynmf: can't run $kpsetool_prog: $!\n"); } elsif ($kpsepath_prog) { return path_to_list (`$kpsepath_prog $type` or die "feynmf: can't run $kpsepath_prog: $!\n"); } elsif ($TEXENV{$type}) { if ($kpsexpand_prog) { return path_to_list (`$kpsexpand_prog '\$$TEXENV{$type}'` or die "feynmf: can't run $kpsexpand_prog: $!\n"); } else { return path_to_list ($ENV{$TEXENV{$type}}); } } else { return; } } sub guess_mode { my ($TEXMF, $maketex_site, $mode); $mode = "localfont"; if ($kpsexpand_prog) { chomp ($TEXMF = `$kpsexpand_prog '\$TEXMF'`); $maketex_site = "$TEXMF/maketex/maketex.site"; chomp ($mode = `. $maketex_site; echo \$MT_DEF_MODE`) if -r $maketex_site; } return $mode; } ######################################################################## # # Prepare empty TFM files. # ######################################################################## sub guess_tfms { my @tex = @_; my @tfm = (); my $tex; foreach $tex (@tex) { open (TEX, "$tex") or die "feynmf: can't open $tex: $!\n"; while () { if (/^[^%]*\\begin\s*\{fmffile\}\s*\{([^}]+)\}/) { push @tfm, $1; } } close (TEX); } return @tfm; } sub fake_tfms { my @tfm = @_; # Prepare a fake temporary PL file # (/dev/null won't do, because the font must not be empty): my ($pl) = "/tmp/feynmf$$.pl"; my ($tfm); $pltotf_prog or die "feynmf: fatal: pltopf programm required unless -notfm\n"; open (PL, ">$pl") or die "feynmf: can't open temporary file $pl: $!\n"; push @temporay_files, $pl; print PL <<__END_PL__; (FAMILY FEYNMF) (DESIGNSIZE R 10.0) (CHARACTER D 1 (CHARWD R 10.0) (CHARHT R 10.0)) __END_PL__ close (PL); foreach $tfm (@tfm) { maybe_run "$pltotf_prog $pl $tfm.tfm" unless -r "$tfm.tfm"; } } ######################################################################## # # Scan the current directory for Metafont sources and offer to delete # TFM, PK and GF files in the system directories that are in the way. # If the option `-force' is in effect, no questions are asked and all # suspicous files are deleted. # ######################################################################## sub clean_fonts { my (@mfs, $mfre, @junk, $j, $nqya); opendir (DIR, '.') or die "Can't open current directory: $!\n"; @mfs = grep { s/\.mf$// } readdir (DIR); closedir (DIR); if (@mfs) { @junk = (); $mfre = '^(' . join ('|', @mfs) . ')(\.|$)'; find (sub { push @junk, $File::Find::name if /$mfre/ }, grep { -r } uniq (guess_path ('tfm'), guess_path ('pk'), guess_path ('gf'))); grep { print "feynmf: $_ suspicious!\n" } @junk; $nqya = 'n'; $nqya = 'a' if $opt_force; junk: foreach $j (@junk) { if ($nqya ne 'a') { print "delete $j ? [N/q/y/a] "; chop ($nqya = ); $nqya =~ tr/A-Z/a-z/; last junk if $nqya eq 'q' } if ($nqya eq 'y' || $nqya eq 'a') { print "rm $j\n" unless $opt_quiet; if (!unlink $j) { if (-o $j) { warn "feynmf: couldn't unlink your file $j!\n"; } else { warn "feynmf: couldn't unlink foreign file $j!\n"; } } } } } } ######################################################################## # # Run Metafont on the files referenced in the DVI file $dvi: # ######################################################################## sub mf_names { my ($dvi) = @_; my (@mf, $name, $mag); open (DVI, "echo 0 | $dvitype_prog $dvi 2>/dev/null |") or die "feynmf: can't dvitype $dvi: $!\n"; while () { if (/^Font\s*\d+:\s*(\S*)\s*(scaled\s*(\d+))?\s*---\s*loaded/) { $name = $1; $mag = $3 ? $3/1000 : 1; push @mf, [$name, $mag]; } } close (DVI); return @mf; } sub run_mf { my (@mf) = @_; my ($mf, $name, $mag, $gf); for $mf (@mf) { $name = $$mf[0]; $mag = $$mf[1]; if (-r "$name.mf") { maybe_run "$mf_prog '\\mode:=$mode; mag:=$mag; input $name'"; if (!$opt_noexec) { # Check the log file for the name of the generated font # and run gftopk on it: open (LOG, "$name.log") or die "feynmf: can't open $name.log: $!\n"; while () { if (/Output written on\s+(\S+)\s+/) { $gf = $1; maybe_run "$gftopk_prog $gf" if $gftopk_prog; } } close (); } } } } ######################################################################## # # Options: # ######################################################################## sub tex_names { my @in = @_; my (@out, $in); foreach $in (@in) { if ($in !~ /\.tex$/ and -r "$in.tex") { push @out, "$in.tex"; } else { push @out, $in; } } return @out; } @options = ('help|h', 'version|v', 'debug|D', 'quiet|q', 'noexec|n', 'clean|c', 'force|f', 'notfm|T', 'tfm|t=s@', 'mode|m=s'); $usage = <<__USAGE__; usage: feynmf [-hvqncfT] [-t tfm [-t tfm ...]] [-m mode] file [file ...] or: feynmf [--help] [--version] [--quiet] [--noexec] [--clean] [--force] [--notfm] [--tfm tfm [--tfm tfm ...]] [--mode mode] file [file ...] __USAGE__ $help = <<__HELP__; usage: feynmf [OPTIONS] FILE [FILE ...] OPTIONS: -h, --help: this message -v, --version: print version to standard output and exit -q, --quiet: shut up -n, --noexec: don't run LaTeX or Metafont -c, --clean: offer to delete suspicious font files -f, --force: just do it (don't ask questions) -T, --notfm: do not initialize TFM files -t tfm, --tfm name: override the guessing of TFM file names -m mode, --mode mode: override the guessing of the Metafont mode FILE: primary LaTeX file FILES: included LaTeX files __HELP__ die "$usage" unless &GetOptions(@options); die 'This is feynmf: $Id: feynmf.pl,v 1.5 1996/12/02 01:38:45 ohl Exp $' . "\n" if $opt_version; die $help if $opt_help; die "$usage" unless $ARGV[0]; ######################################################################## # # Finally, the main program: # ######################################################################## @temporay_files = (); sub END { unlink @temporay_files; } @tex = tex_names @ARGV; $tex_main = $tex[0]; ($dvi = $tex_main) =~ s/\.[^.]+$/.dvi/; find_programs; $mode = $opt_mode ? $opt_mode : guess_mode; fake_tfms (@opt_tfm ? @opt_tfm : guess_tfms @tex) unless $opt_notfm; run_latex $tex_main; clean_fonts if $opt_clean; run_mf mf_names $dvi; run_latex $tex_main; ######################################################################## feynmf-1.08.orig/feynmf209.ins0000664000175000017500000000720006250470140017572 0ustar kmccartykmccarty00000000000000% feynmf209.ins - Feynman diagrams with METAFONT for LaTeX(2e) % Copyright (C) 1995 by Thorsten.Ohl@Physik.TH-Darmstadt.de % $Id: feynmf209.ins,v 1.2 1995/05/06 11:38:11 ohl Exp $ % % Feynmf is free software; you can redistribute it and/or modify it % under the terms of the GNU General Public License as published by % the Free Software Foundation; either version 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. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \def\batchfile{feynmf209.ins} \input docstrip.tex \keepsilent %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \preamble Copyright (C) 1989, 1990, 1992-1995 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. \endpreamble %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \Msg{Generating style file feynmf209.sty for the feynmf package:} \generateFile{feynmf209.sty}{f}{\from{feynmf.dtx}{style,209}} \Msg{Generating style file feynmp209.sty for the MetaPost version:} \generateFile{feynmp209.sty}{f}{\from{feynmf.dtx}{style,209,mp}} \Msg{Generating driver file for manual fmfman209.drv:} \generateFile{fmfman209.drv}{f}{\from{feynmf.dtx}{driver,209,manual}} \Msg{Generating alternate MetaPost driver file fmfman209ps.drv:} \generateFile{fmfman209ps.drv}{f}{\from{feynmf.dtx}{driver,209,manual,mp}} \Msg{Generating driver file for documentation feynmf209.drv:} \generateFile{feynmf209.drv}{f}{\from{feynmf.dtx}{driver,209}} \Msg{Generating alternate MetaPost driver file feynmp209.drv:} \generateFile{feynmp209.drv}{f}{\from{feynmf.dtx}{driver,209,mp}} \Msg{***************************************************************} \Msg{*} \Msg{* To finish the installation you have to move the files} \Msg{*} \Msg{*\space\space o feynmf209.sty into a directory searched by TeX} \Msg{*\space\space o feynmp209.sty into a directory searched by TeX} \Msg{*} \Msg{* You can remove the latter if you don't have John Hobby's} \Msg{* MetaPost system. Optionally you can copy the files} \Msg{* fmfman209.dtx and fmfman209ps.drv into a directory} \Msg{* searched by TeX, so that users can print a copy of} \Msg{* the documentation.} \Msg{*} \Msg{***************************************************************} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \endinput Local Variables: mode:LaTeX fill-prefix:"% " page-delimiter:"^% %%%%%%%%%*\n" End: feynmf-1.08.orig/manpics.10000664000175000017500000002537606250470140017072 0ustar kmccartykmccarty00000000000000%!PS %%BoundingBox: -8 -5 378 285 %%Creator: MetaPost %%CreationDate: 1996.12.02:1020 %%Pages: 1 %*Font: cmtt10 9.96265 9.96265 23:a777a08000000043fefdffa %*Font: cmr10 9.96265 9.96265 0c:8000000000000040808807e4fbe %*Font: cmcsc10 9.96265 9.96265 61:8 %%EndProlog %%Page: 1 1 3 273.54599 moveto (%) cmtt10 9.96265 fshow 13.4607 273.54599 moveto (foo.tex) cmtt10 9.96265 fshow 3 261.59079 moveto (...) cmtt10 9.96265 fshow 3 249.63559 moveto (\\usepackage{feynmf}) cmtt10 9.96265 fshow 3 237.6805 moveto (...) cmtt10 9.96265 fshow 3 225.7253 moveto (\\begin{fmffile}{fd}) cmtt10 9.96265 fshow 3 213.7701 moveto (\\begin{fmfchar*}\(100,50\)) cmtt10 9.96265 fshow 3 201.81499 moveto (...) cmtt10 9.96265 fshow 3 189.85979 moveto (\\end{fmfchar*}) cmtt10 9.96265 fshow 3 177.90459 moveto (...) cmtt10 9.96265 fshow 3 165.9495 moveto (\\end{fmffile}) cmtt10 9.96265 fshow 3 153.9943 moveto (...) cmtt10 9.96265 fshow 0 1.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash 1 setlinejoin 10 setmiterlimit newpath 0 150.9943 moveto 136.75851 150.9943 lineto 136.75851 283.46451 lineto 0 283.46451 lineto closepath stroke 201.40671 273.54599 moveto (%) cmtt10 9.96265 fshow 211.8674 273.54599 moveto (fd.mf) cmtt10 9.96265 fshow 243.2494 273.54599 moveto (--) cmtt10 9.96265 fshow 258.94041 273.54599 moveto (do) cmtt10 9.96265 fshow 274.6315 273.54599 moveto (not) cmtt10 9.96265 fshow 295.55281 273.54599 moveto (edit) cmtt10 9.96265 fshow 201.40671 261.5909 moveto (input) cmtt10 9.96265 fshow 232.78871 261.5909 moveto (feynmf) cmtt10 9.96265 fshow 201.40671 249.6357 moveto (beginchar\(1,100*1pt#,50*1pt#,0\);) cmtt10 9.96265 fshow 211.8674 237.6805 moveto (vinit;) cmtt10 9.96265 fshow 211.8674 225.72539 moveto (...) cmtt10 9.96265 fshow 211.8674 213.77019 moveto (vfreeze;) cmtt10 9.96265 fshow 211.8674 201.81499 moveto (vdraw;) cmtt10 9.96265 fshow 201.40671 189.8599 moveto (endchar;) cmtt10 9.96265 fshow 201.40671 177.9047 moveto (...) cmtt10 9.96265 fshow newpath 198.40671 174.9047 moveto 377.00789 174.9047 lineto 377.00789 283.46451 lineto 198.40671 283.46451 lineto closepath stroke 139.27658 127.42479 moveto (L) cmr10 9.96265 fshow 141.91669 128.7116 moveto (a) cmcsc10 9.96265 fshow 146.53278 127.42479 moveto (T) cmr10 9.96265 fshow 152.06718 124.4222 moveto (E) cmr10 9.96265 fshow 157.60197 127.42479 moveto (X) cmr10 9.96265 fshow 168.39488 127.42479 moveto (lab) cmr10 9.96265 fshow 181.95518 127.42479 moveto (els) cmr10 9.96265 fshow 150.48738 115.46959 moveto (fd.log) cmtt10 9.96265 fshow newpath 136.27658 110.25568 moveto 196.08018 110.25568 lineto 196.08018 137.3433 lineto 136.27658 137.3433 lineto closepath stroke 260.03513 73.72635 moveto (fon) cmr10 9.96265 fshow 273.31862 73.72635 moveto (t) cmr10 9.96265 fshow 280.51392 73.72635 moveto (metric) cmr10 9.96265 fshow 258.78972 61.77126 moveto (information) cmr10 9.96265 fshow 268.43433 49.81606 moveto (fd.tfm) cmtt10 9.96265 fshow newpath 255.78972 46.81604 moveto 312.4609 46.81604 lineto 312.4609 83.64485 lineto 255.78972 83.64485 lineto closepath stroke 297.70406 124.92326 moveto (fon) cmr10 9.96265 fshow 310.98766 124.92326 moveto (t) cmr10 9.96265 fshow 318.18286 124.92326 moveto (bitmap) cmr10 9.96265 fshow 302.51956 112.96806 moveto (fd.300gf) cmtt10 9.96265 fshow newpath 294.70406 107.75415 moveto 352.17786 107.75415 lineto 352.17786 134.84178 lineto 294.70406 134.84178 lineto closepath stroke 71.11395 73.62527 moveto (L) cmr10 9.96265 fshow 73.75406 74.91208 moveto (a) cmcsc10 9.96265 fshow 78.37015 73.62527 moveto (T) cmr10 9.96265 fshow 83.90456 70.62268 moveto (E) cmr10 9.96265 fshow 89.43935 73.62527 moveto (X) cmr10 9.96265 fshow 100.23225 73.62527 moveto (lab) cmr10 9.96265 fshow 113.79256 73.62527 moveto (els) cmr10 9.96265 fshow 84.93985 61.67007 moveto (fd.t1) cmtt10 9.96265 fshow newpath 68.11395 58.6701 moveto 127.91759 58.6701 lineto 127.91759 83.5438 lineto 68.11395 83.5438 lineto closepath stroke 145.09079 73.62529 moveto (L) cmr10 9.96265 fshow 147.7309 74.9121 moveto (a) cmcsc10 9.96265 fshow 152.34698 73.62529 moveto (T) cmr10 9.96265 fshow 157.8814 70.6227 moveto (E) cmr10 9.96265 fshow 163.41618 73.62529 moveto (X) cmr10 9.96265 fshow 174.20909 73.62529 moveto (lab) cmr10 9.96265 fshow 187.7694 73.62529 moveto (els) cmr10 9.96265 fshow 158.91669 61.67009 moveto (fd.t2) cmtt10 9.96265 fshow newpath 142.0908 58.67009 moveto 201.89441 58.67009 lineto 201.89441 83.54381 lineto 142.0908 83.54381 lineto closepath stroke 3 26.9103 moveto (device) cmr10 9.96265 fshow 33.1647 26.9103 moveto (indep) cmr10 9.96265 fshow 57.2411 26.9103 moveto (enden) cmr10 9.96265 fshow 82.4245 26.9103 moveto (t) cmr10 9.96265 fshow 21.9567 14.9552 moveto (output) cmr10 9.96265 fshow 54.6121 14.9552 moveto (\014le) cmr10 9.96265 fshow 26.3433 3 moveto (foo.dvi) cmtt10 9.96265 fshow newpath 0 0 moveto 89.29892 0 lineto 89.29892 36.8288 lineto 0 36.8288 lineto closepath stroke 344.34131 17.1691 moveto (prin) cmr10 9.96265 fshow 361.8036 17.1691 moveto (ter) cmr10 9.96265 fshow 351.3291 5.2139 moveto (lpr) cmtt10 9.96265 fshow newpath 341.34131 0 moveto 377.00789 0 lineto 377.00789 26.8227 lineto 341.34131 26.8227 lineto closepath stroke [0 5 ] 2.5 setdash 1 setlinecap newpath 60.4738 150.99516 moveto 46.84723 36.82794 lineto stroke [] 0 setdash newpath 45.23123 48.05101 moveto 46.84723 36.82794 lineto 51.05927 47.3554 lineto closepath gsave fill grestore stroke newpath 136.75862 220.95665 moveto 198.4063 224.31696 lineto stroke newpath 187.62993 220.7905 moveto 198.4063 224.31696 lineto 187.31047 226.65115 lineto closepath gsave fill grestore stroke [3 3 ] 0 setdash newpath 225.11256 174.9049 moveto 181.79681 137.34317 lineto stroke [] 0 setdash newpath 188.14877 146.73578 moveto 181.79681 137.34317 lineto 191.99408 142.30142 lineto closepath gsave fill grestore stroke [3 3 ] 0 setdash newpath 286.52142 174.90431 moveto 284.52765 83.64555 lineto stroke [] 0 setdash newpath 281.8328 94.65973 moveto 284.52765 83.64555 lineto 287.70093 94.53152 lineto closepath gsave fill grestore stroke [3 3 ] 0 setdash newpath 305.68536 174.90546 moveto 318.95493 134.84216 lineto stroke [] 0 setdash newpath 312.72559 144.31616 moveto 318.95493 134.84216 lineto 318.29718 146.16156 lineto closepath gsave fill grestore stroke [0 5 ] 2.5 setdash newpath 148.65826 110.25569 moveto 114.10428 83.544 lineto stroke [] 0 setdash newpath 120.97444 92.56421 moveto 114.10428 83.544 lineto 124.56413 87.92065 lineto closepath gsave fill grestore stroke [0 5 ] 2.5 setdash newpath 167.67285 110.25569 moveto 170.62027 83.54402 lineto stroke [] 0 setdash newpath 166.50212 94.10835 moveto 170.62027 83.54402 lineto 172.33601 94.75209 lineto closepath gsave fill grestore stroke [0 5 ] 2.5 setdash newpath 85.42009 58.67027 moveto 63.29907 36.82858 lineto stroke [] 0 setdash newpath 69.03055 46.61168 moveto 63.29907 36.82858 lineto 73.15424 42.43526 lineto closepath gsave fill grestore stroke [0 5 ] 2.5 setdash newpath 142.0902 58.73383 moveto 89.1517 36.82872 lineto stroke [] 0 setdash newpath 98.14958 43.7278 moveto 89.1517 36.82872 lineto 100.39363 38.30455 lineto closepath gsave fill grestore stroke [0 5 ] 2.5 setdash newpath 255.79135 59.69133 moveto 89.29996 27.14331 lineto stroke [] 0 setdash newpath 99.485 32.12442 moveto 89.29996 27.14331 lineto 100.61101 26.36456 lineto closepath gsave fill grestore stroke [6 6 ] 0 setdash newpath 310.79498 46.81592 moveto 341.34155 25.7245 lineto stroke [] 0 setdash newpath 330.66159 29.53247 moveto 341.34155 25.7245 lineto 333.99643 34.36227 lineto closepath gsave fill grestore stroke [6 6 ] 0 setdash newpath 327.92677 107.75453 moveto 354.7327 26.82231 lineto stroke [] 0 setdash newpath 348.50327 36.29648 moveto 354.7327 26.82231 lineto 354.07495 38.1419 lineto closepath gsave fill grestore stroke [6 6 ] 0 setdash newpath 89.2971 17.70421 moveto 341.33954 13.69502 lineto stroke [] 0 setdash newpath 330.34155 10.93483 moveto 341.33954 13.69502 lineto 330.4349 16.80363 lineto closepath gsave fill grestore stroke 0.9 setgray newpath 194.80217 235.03342 moveto 194.80217 241.75908 179.61087 241.76073 167.58246 241.76073 curveto 155.55405 241.76073 140.36275 241.75908 140.36275 235.03342 curveto 140.36275 228.30775 155.55405 228.3061 167.58246 228.3061 curveto 179.61087 228.3061 194.80217 228.30775 194.80217 235.03342 curveto closepath fill newpath 47.99121 93.91153 moveto 47.99121 100.63719 32.79991 100.63884 20.7715 100.63884 curveto 8.74309 100.63884 -6.44821 100.63719 -6.44821 93.91153 curveto -6.44821 87.18587 8.74309 87.18422 20.7715 87.18422 curveto 32.79991 87.18422 47.99121 87.18587 47.99121 93.91153 curveto closepath fill newpath 279.85524 129.27493 moveto 279.85524 135.59476 271.0797 135.5963 263.5022 135.5963 curveto 255.9247 135.5963 247.14914 135.59476 247.14914 129.27493 curveto 247.14914 122.95511 255.9247 122.95357 263.5022 122.95357 curveto 271.0797 122.95357 279.85524 122.95511 279.85524 129.27493 curveto closepath fill newpath 242.53806 3.30302 moveto 242.53806 10.02869 227.34676 10.03033 215.31834 10.03033 curveto 203.28993 10.03033 188.09863 10.02869 188.09863 3.30302 curveto 188.09863 -3.42264 203.28993 -3.42429 215.31834 -3.42429 curveto 227.34676 -3.42429 242.53806 -3.42264 242.53806 3.30302 curveto closepath fill 0 setgray 144.0459 231.98926 moveto (latex) cmtt10 9.96265 fshow 175.4279 231.98926 moveto (foo) cmtt10 9.96265 fshow newpath 194.80217 235.03342 moveto 194.80217 241.75908 179.61087 241.76073 167.58246 241.76073 curveto 155.55405 241.76073 140.36275 241.75908 140.36275 235.03342 curveto 140.36275 228.30775 155.55405 228.3061 167.58246 228.3061 curveto 179.61087 228.3061 194.80217 228.30775 194.80217 235.03342 curveto closepath stroke -2.76506 90.86737 moveto (latex) cmtt10 9.96265 fshow 28.61694 90.86737 moveto (foo) cmtt10 9.96265 fshow newpath 47.99121 93.91153 moveto 47.99121 100.63719 32.79991 100.63884 20.7715 100.63884 curveto 8.74309 100.63884 -6.44821 100.63719 -6.44821 93.91153 curveto -6.44821 87.18587 8.74309 87.18422 20.7715 87.18422 curveto 32.79991 87.18422 47.99121 87.18587 47.99121 93.91153 curveto closepath stroke 250.42635 126.23077 moveto (mf) cmtt10 9.96265 fshow 266.11734 126.23077 moveto (fd) cmtt10 9.96265 fshow newpath 279.85524 129.27493 moveto 279.85524 135.59476 271.0797 135.5963 263.5022 135.5963 curveto 255.9247 135.5963 247.14914 135.59476 247.14914 129.27493 curveto 247.14914 122.95511 255.9247 122.95357 263.5022 122.95357 curveto 271.0797 122.95357 279.85524 122.95511 279.85524 129.27493 curveto closepath stroke 191.78178 0.25887 moveto (dvixx) cmtt10 9.96265 fshow 223.16379 0.25887 moveto (foo) cmtt10 9.96265 fshow newpath 242.53806 3.30302 moveto 242.53806 10.02869 227.34676 10.03033 215.31834 10.03033 curveto 203.28993 10.03033 188.09863 10.02869 188.09863 3.30302 curveto 188.09863 -3.42264 203.28993 -3.42429 215.31834 -3.42429 curveto 227.34676 -3.42429 242.53806 -3.42264 242.53806 3.30302 curveto closepath stroke showpage %%EOF feynmf-1.08.orig/manpics.20000664000175000017500000002446206250470140017066 0ustar kmccartykmccarty00000000000000%!PS %%BoundingBox: -8 -5 378 285 %%Creator: MetaPost %%CreationDate: 1996.12.02:1020 %%Pages: 1 %*Font: cmtt10 9.96265 9.96265 23:a777208000000043fefdffa %*Font: cmr10 9.96265 9.96265 0c:8000000000000040898807c4bbe %*Font: cmcsc10 9.96265 9.96265 61:8 %%EndProlog %%Page: 1 1 3 273.54599 moveto (%) cmtt10 9.96265 fshow 13.4607 273.54599 moveto (foo.tex) cmtt10 9.96265 fshow 3 261.59079 moveto (...) cmtt10 9.96265 fshow 3 249.63559 moveto (\\usepackage{feynmp}) cmtt10 9.96265 fshow 3 237.6805 moveto (...) cmtt10 9.96265 fshow 3 225.7253 moveto (\\begin{fmffile}{fd}) cmtt10 9.96265 fshow 3 213.7701 moveto (\\begin{fmfchar*}\(100,50\)) cmtt10 9.96265 fshow 3 201.81499 moveto (...) cmtt10 9.96265 fshow 3 189.85979 moveto (\\end{fmfchar*}) cmtt10 9.96265 fshow 3 177.90459 moveto (...) cmtt10 9.96265 fshow 3 165.9495 moveto (\\end{fmffile}) cmtt10 9.96265 fshow 3 153.9943 moveto (...) cmtt10 9.96265 fshow 0 1.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash 1 setlinejoin 10 setmiterlimit newpath 0 150.9943 moveto 136.75851 150.9943 lineto 136.75851 283.46451 lineto 0 283.46451 lineto closepath stroke 201.40671 273.54599 moveto (%) cmtt10 9.96265 fshow 211.8674 273.54599 moveto (fd.mp) cmtt10 9.96265 fshow 243.2494 273.54599 moveto (--) cmtt10 9.96265 fshow 258.94041 273.54599 moveto (do) cmtt10 9.96265 fshow 274.6315 273.54599 moveto (not) cmtt10 9.96265 fshow 295.55281 273.54599 moveto (edit) cmtt10 9.96265 fshow 201.40671 261.5909 moveto (input) cmtt10 9.96265 fshow 232.78871 261.5909 moveto (feynmp) cmtt10 9.96265 fshow 201.40671 249.6357 moveto (beginchar\(1,100*1pt#,50*1pt#,0\);) cmtt10 9.96265 fshow 211.8674 237.6805 moveto (vinit;) cmtt10 9.96265 fshow 211.8674 225.72539 moveto (...) cmtt10 9.96265 fshow 211.8674 213.77019 moveto (vfreeze;) cmtt10 9.96265 fshow 211.8674 201.81499 moveto (vdraw;) cmtt10 9.96265 fshow 201.40671 189.8599 moveto (endchar;) cmtt10 9.96265 fshow 201.40671 177.9047 moveto (...) cmtt10 9.96265 fshow newpath 198.40671 174.9047 moveto 377.00789 174.9047 lineto 377.00789 283.46451 lineto 198.40671 283.46451 lineto closepath stroke 80.0949 126.31786 moveto (L) cmr10 9.96265 fshow 82.735 127.60466 moveto (a) cmcsc10 9.96265 fshow 87.35109 126.31786 moveto (T) cmr10 9.96265 fshow 92.8855 123.31526 moveto (E) cmr10 9.96265 fshow 98.42029 126.31786 moveto (X) cmr10 9.96265 fshow 109.2132 126.31786 moveto (lab) cmr10 9.96265 fshow 122.7735 126.31786 moveto (els) cmr10 9.96265 fshow 93.92079 114.36266 moveto (fd.t1) cmtt10 9.96265 fshow newpath 77.0949 111.36263 moveto 136.89851 111.36263 lineto 136.89851 136.23637 lineto 77.0949 136.23637 lineto closepath stroke 154.07172 126.31786 moveto (L) cmr10 9.96265 fshow 156.71182 127.60466 moveto (a) cmcsc10 9.96265 fshow 161.32791 126.31786 moveto (T) cmr10 9.96265 fshow 166.86232 123.31526 moveto (E) cmr10 9.96265 fshow 172.39711 126.31786 moveto (X) cmr10 9.96265 fshow 183.19002 126.31786 moveto (lab) cmr10 9.96265 fshow 196.75032 126.31786 moveto (els) cmr10 9.96265 fshow 167.89761 114.36266 moveto (fd.t2) cmtt10 9.96265 fshow newpath 151.07172 111.36266 moveto 210.87534 111.36266 lineto 210.87534 136.23633 lineto 151.07172 136.23633 lineto closepath stroke 234.55818 79.07835 moveto (encapsulated) cmr10 9.96265 fshow 239.87158 67.12315 moveto (P) cmr10 9.96265 fshow 246.37498 67.12315 moveto (ostScript) cmr10 9.96265 fshow 256.17159 55.16806 moveto (\014le) cmr10 9.96265 fshow 252.07599 43.21286 moveto (fd.1) cmtt10 9.96265 fshow newpath 231.55818 40.21284 moveto 293.51509 40.21284 lineto 293.51509 88.99686 lineto 231.55818 88.99686 lineto closepath stroke 310.6883 149.94449 moveto (encapsulated) cmr10 9.96265 fshow 316.0017 137.98929 moveto (P) cmr10 9.96265 fshow 322.5051 137.98929 moveto (ostScript) cmr10 9.96265 fshow 332.3017 126.0342 moveto (\014le) cmr10 9.96265 fshow 328.2061 114.079 moveto (fd.2) cmtt10 9.96265 fshow newpath 307.6883 111.079 moveto 369.6452 111.079 lineto 369.6452 159.86296 lineto 307.6883 159.86296 lineto closepath stroke 3 26.9103 moveto (device) cmr10 9.96265 fshow 33.1647 26.9103 moveto (indep) cmr10 9.96265 fshow 57.2411 26.9103 moveto (enden) cmr10 9.96265 fshow 82.4245 26.9103 moveto (t) cmr10 9.96265 fshow 21.9567 14.9552 moveto (output) cmr10 9.96265 fshow 54.6121 14.9552 moveto (\014le) cmr10 9.96265 fshow 26.3433 3 moveto (foo.dvi) cmtt10 9.96265 fshow newpath 0 0 moveto 89.29892 0 lineto 89.29892 36.8288 lineto 0 36.8288 lineto closepath stroke 344.34131 17.1691 moveto (prin) cmr10 9.96265 fshow 361.8036 17.1691 moveto (ter) cmr10 9.96265 fshow 351.3291 5.2139 moveto (lpr) cmtt10 9.96265 fshow newpath 341.34131 0 moveto 377.00789 0 lineto 377.00789 26.8227 lineto 341.34131 26.8227 lineto closepath stroke [0 5 ] 2.5 setdash 1 setlinecap newpath 60.4738 150.99516 moveto 46.84723 36.82794 lineto stroke [] 0 setdash newpath 45.23123 48.05101 moveto 46.84723 36.82794 lineto 51.05927 47.3554 lineto closepath gsave fill grestore stroke newpath 136.75862 220.95665 moveto 198.4063 224.31696 lineto stroke newpath 187.62993 220.7905 moveto 198.4063 224.31696 lineto 187.31047 226.65115 lineto closepath gsave fill grestore stroke [3 3 ] 0 setdash newpath 198.40533 177.10634 moveto 128.32295 136.23636 lineto stroke [] 0 setdash newpath 136.30531 144.28853 moveto 128.32295 136.23636 lineto 139.26195 139.21855 lineto closepath gsave fill grestore stroke [3 3 ] 0 setdash newpath 232.73296 174.9049 moveto 193.56981 136.23663 lineto stroke [] 0 setdash newpath 199.30153 146.0201 moveto 193.56981 136.23663 lineto 203.42534 141.84349 lineto closepath gsave fill grestore stroke [3 3 ] 0 setdash newpath 279.40594 174.90564 moveto 266.26721 88.99739 lineto stroke [] 0 setdash newpath 265.0221 100.26695 moveto 266.26721 88.99739 lineto 270.8237 99.37968 lineto closepath gsave fill grestore stroke [3 3 ] 0 setdash newpath 317.22345 174.9049 moveto 325.40309 159.86266 lineto stroke [] 0 setdash newpath 317.59297 168.08232 moveto 325.40309 159.86266 lineto 322.74916 170.88615 lineto closepath gsave fill grestore stroke [0 5 ] 2.5 setdash newpath 99.63902 111.36285 moveto 55.544 36.82936 lineto stroke [] 0 setdash newpath 58.59505 47.75027 moveto 55.544 36.82936 lineto 63.64674 44.76163 lineto closepath gsave fill grestore stroke [0 5 ] 2.5 setdash newpath 164.88574 111.36285 moveto 68.47069 36.82936 lineto stroke [] 0 setdash newpath 75.3413 45.8502 moveto 68.47069 36.82936 lineto 78.93123 41.20634 lineto closepath gsave fill grestore stroke [0 5 ] 2.5 setdash newpath 231.55711 58.03741 moveto 89.30014 27.87999 lineto stroke [] 0 setdash newpath 99.40572 33.02216 moveto 89.30014 27.87999 lineto 100.62291 27.28046 lineto closepath gsave fill grestore stroke [0 5 ] 2.5 setdash newpath 307.6885 123.1377 moveto 89.2974 36.19 lineto stroke [] 0 setdash newpath 98.3867 42.96718 moveto 89.2974 36.19 lineto 100.55754 37.51454 lineto closepath gsave fill grestore stroke [6 6 ] 0 setdash newpath 293.51459 48.19444 moveto 341.34091 22.85867 lineto stroke [] 0 setdash newpath 330.28876 25.39243 moveto 341.34091 22.85867 lineto 333.03635 30.57904 lineto closepath gsave fill grestore stroke [6 6 ] 0 setdash newpath 342.7651 111.07805 moveto 356.92136 26.82234 lineto stroke [] 0 setdash newpath 352.21228 37.13753 moveto 356.92136 26.82234 lineto 358.00076 38.11009 lineto closepath gsave fill grestore stroke [6 6 ] 0 setdash newpath 89.2971 17.70421 moveto 341.33954 13.69502 lineto stroke [] 0 setdash newpath 330.34155 10.93483 moveto 341.33954 13.69502 lineto 330.4349 16.80363 lineto closepath gsave fill grestore stroke 0.9 setgray newpath 194.80217 235.03342 moveto 194.80217 241.75908 179.61087 241.76073 167.58246 241.76073 curveto 155.55405 241.76073 140.36275 241.75908 140.36275 235.03342 curveto 140.36275 228.30775 155.55405 228.3061 167.58246 228.3061 curveto 179.61087 228.3061 194.80217 228.30775 194.80217 235.03342 curveto closepath fill newpath 47.99121 93.91153 moveto 47.99121 100.63719 32.79991 100.63884 20.7715 100.63884 curveto 8.74309 100.63884 -6.44821 100.63719 -6.44821 93.91153 curveto -6.44821 87.18587 8.74309 87.18422 20.7715 87.18422 curveto 32.79991 87.18422 47.99121 87.18587 47.99121 93.91153 curveto closepath fill newpath 252.92401 155.57076 moveto 252.92401 162.53381 243.98402 163.69768 235.87234 163.69768 curveto 227.76065 163.69768 218.82066 162.53381 218.82066 155.57076 curveto 218.82066 148.6077 227.76065 147.44383 235.87234 147.44383 curveto 243.98402 147.44383 252.92401 148.6077 252.92401 155.57076 curveto closepath fill newpath 242.53806 3.30302 moveto 242.53806 10.02869 227.34676 10.03033 215.31834 10.03033 curveto 203.28993 10.03033 188.09863 10.02869 188.09863 3.30302 curveto 188.09863 -3.42264 203.28993 -3.42429 215.31834 -3.42429 curveto 227.34676 -3.42429 242.53806 -3.42264 242.53806 3.30302 curveto closepath fill 0 setgray 144.0459 231.98926 moveto (latex) cmtt10 9.96265 fshow 175.4279 231.98926 moveto (foo) cmtt10 9.96265 fshow newpath 194.80217 235.03342 moveto 194.80217 241.75908 179.61087 241.76073 167.58246 241.76073 curveto 155.55405 241.76073 140.36275 241.75908 140.36275 235.03342 curveto 140.36275 228.30775 155.55405 228.3061 167.58246 228.3061 curveto 179.61087 228.3061 194.80217 228.30775 194.80217 235.03342 curveto closepath stroke -2.76506 90.86737 moveto (latex) cmtt10 9.96265 fshow 28.61694 90.86737 moveto (foo) cmtt10 9.96265 fshow newpath 47.99121 93.91153 moveto 47.99121 100.63719 32.79991 100.63884 20.7715 100.63884 curveto 8.74309 100.63884 -6.44821 100.63719 -6.44821 93.91153 curveto -6.44821 87.18587 8.74309 87.18422 20.7715 87.18422 curveto 32.79991 87.18422 47.99121 87.18587 47.99121 93.91153 curveto closepath stroke 222.7965 153.63354 moveto (mp) cmtt10 9.96265 fshow 238.48749 153.63354 moveto (fd) cmtt10 9.96265 fshow newpath 252.92401 155.57076 moveto 252.92401 162.53381 243.98402 163.69768 235.87234 163.69768 curveto 227.76065 163.69768 218.82066 162.53381 218.82066 155.57076 curveto 218.82066 148.6077 227.76065 147.44383 235.87234 147.44383 curveto 243.98402 147.44383 252.92401 148.6077 252.92401 155.57076 curveto closepath stroke 191.78178 0.25887 moveto (dvixx) cmtt10 9.96265 fshow 223.16379 0.25887 moveto (foo) cmtt10 9.96265 fshow newpath 242.53806 3.30302 moveto 242.53806 10.02869 227.34676 10.03033 215.31834 10.03033 curveto 203.28993 10.03033 188.09863 10.02869 188.09863 3.30302 curveto 188.09863 -3.42264 203.28993 -3.42429 215.31834 -3.42429 curveto 227.34676 -3.42429 242.53806 -3.42264 242.53806 3.30302 curveto closepath stroke showpage %%EOF feynmf-1.08.orig/manpics.30000664000175000017500000001222406250470140017060 0ustar kmccartykmccarty00000000000000%!PS %%BoundingBox: 0 0 378 284 %%Creator: MetaPost %%CreationDate: 1996.12.02:1020 %%Pages: 1 %*Font: cmtt10 9.96265 9.96265 2e:80000000000217b37b85 %*Font: cmr10 9.96265 9.96265 3a:8050242201f7bee9 %*Font: cmcsc10 9.96265 9.96265 49:880400988a51 %*Font: manfnt 9.96265 9.96265 41:8c0e1 %%EndProlog %%Page: 1 1 0.9 setgray newpath 0 283.46451 moveto 377.00789 283.46451 lineto 377.00789 141.73225 lineto 0 141.73225 lineto closepath fill 0.6 setgray newpath 0 141.73225 moveto 377.00789 141.73225 lineto 377.00789 0 lineto 0 0 lineto closepath fill 0.8 setgray newpath 0 255.1185 moveto 211.12029 225.35455 lineto 90.48143 41.10217 lineto 0 28.34601 lineto closepath fill 0.7 setgray newpath 211.12029 225.35455 moveto 301.60172 212.59839 lineto 301.60172 70.86613 lineto 90.48143 41.10217 lineto closepath fill 0 setgray 0 1.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash 1 setlinecap 1 setlinejoin 10 setmiterlimit newpath 197.92957 161.1049 moveto 190.7286 165.05524 183.00302 168.08354 174.92825 170.07828 curveto 160.2565 173.7027 145.27185 173.85275 131.02252 170.87178 curveto stroke newpath 141.4189 175.39806 moveto 137.86195 174.08682 134.39113 172.57457 131.02252 170.87178 curveto 134.79121 170.66212 138.55318 170.23636 142.2892 169.59346 curveto closepath gsave fill grestore stroke newpath 102.22244 107.68922 moveto 109.63477 102.66844 117.87709 98.82445 126.67346 96.37845 curveto 142.14388 92.0766 157.99133 92.20665 172.7073 96.14563 curveto stroke newpath 162.53993 91.12671 moveto 166.04344 92.5819 169.43913 94.2599 172.7073 96.14563 curveto 168.93413 96.14662 165.15437 96.39128 161.39265 96.88281 curveto closepath gsave fill grestore stroke newpath 352.00128 200.6733 moveto 356.07718 181.37106 358.15634 161.62073 358.15634 141.73225 curveto 358.15634 121.84378 356.07718 102.09344 352.00128 82.79121 curveto stroke newpath 351.16791 94.09874 moveto 351.5207 90.33415 351.79851 86.56422 352.00128 82.79121 curveto 353.71217 86.16014 355.35655 89.56389 356.93332 93.0005 curveto closepath gsave fill grestore stroke 1 setgray newpath 142.72241 178.5822 moveto 195.79553 178.5822 lineto 195.79553 192.33093 lineto 142.72241 192.33093 lineto closepath fill 0 setgray 145.72241 182.41241 moveto (\\fmfforce) cmtt10 9.96265 fshow 1 setgray newpath 110.59761 64.45175 moveto 142.74931 64.45175 lineto 142.74931 90.70917 lineto 110.59761 90.70917 lineto closepath fill 0 setgray 116.21281 81.62085 moveto (vloc) cmtt10 9.96265 fshow 113.59761 69.66565 moveto (vpath) cmtt10 9.96265 fshow 1 setgray newpath 309.87466 141.73225 moveto 352.48706 141.73225 lineto 352.48706 155.48099 lineto 309.87466 155.48099 lineto closepath fill 0 setgray 312.87466 145.56247 moveto (\\fmfcmd) cmtt10 9.96265 fshow 1 setgray newpath 204.28741 75.5525 moveto 295.93243 75.5525 lineto 295.93243 207.912 lineto 204.28741 207.912 lineto closepath fill 0 setgray 207.28741 198.1042 moveto (Immedia) cmcsc10 9.96265 fshow 246.4403 198.1042 moveto (te) cmcsc10 9.96265 fshow 261.64992 198.1042 moveto (Mode) cmcsc10 9.96265 fshow 233.3778 174.1938 moveto (Ob) cmr10 9.96265 fshow 247.21492 174.1938 moveto (jects:) cmr10 9.96265 fshow 268.49622 162.23871 moveto (pairs) cmr10 9.96265 fshow 265.75641 150.28351 moveto (paths) cmr10 9.96265 fshow 218.15712 126.3732 moveto (Commands:) cmr10 9.96265 fshow 242.53842 114.418 moveto (\\fmfi{}{}) cmtt10 9.96265 fshow 247.76881 102.4628 moveto (\\fmfiv{}) cmtt10 9.96265 fshow 237.30812 90.5077 moveto (\\fmfiequ{}) cmtt10 9.96265 fshow 273.92052 78.5525 moveto (...) cmtt10 9.96265 fshow 1 setgray newpath 5.66928 69.57495 moveto 90.87238 69.57495 lineto 90.87238 213.88956 lineto 5.66928 213.88956 lineto closepath fill 0 setgray 12.94829 204.08176 moveto (Ver) cmcsc10 9.96265 fshow 31.94908 204.08176 moveto (tex) cmcsc10 9.96265 fshow 53.26907 204.08176 moveto (Mode) cmcsc10 9.96265 fshow 23.89008 180.17145 moveto (Ob) cmr10 9.96265 fshow 37.72708 180.17145 moveto (jects:) cmr10 9.96265 fshow 48.49228 168.21625 moveto (v) cmr10 9.96265 fshow 53.47368 168.21625 moveto (ertices) cmr10 9.96265 fshow 63.98978 156.26115 moveto (arcs) cmr10 9.96265 fshow 42.98508 144.30595 moveto (p) cmr10 9.96265 fshow 48.79668 144.30595 moveto (olygons) cmr10 9.96265 fshow 8.66928 120.39565 moveto (Commands:) cmr10 9.96265 fshow 39.38799 108.44044 moveto (\\fmf{}{}) cmtt10 9.96265 fshow 34.15758 96.48524 moveto (\\fmfv{}{}) cmtt10 9.96265 fshow 28.92728 84.53015 moveto (\\fmfleft{}) cmtt10 9.96265 fshow 64.43268 72.57495 moveto (...) cmtt10 9.96265 fshow 1 setgray newpath 326.35895 253.48004 moveto 358.15634 253.48004 lineto 358.15634 269.29042 lineto 326.35895 269.29042 lineto closepath fill 0 setgray 329.35895 259.48264 moveto (L) cmr10 9.96265 fshow 331.99905 260.76944 moveto (a) cmcsc10 9.96265 fshow 336.61514 259.48264 moveto (T) cmr10 9.96265 fshow 342.14955 256.48004 moveto (E) cmr10 9.96265 fshow 347.68434 259.48264 moveto (X) cmr10 9.96265 fshow 1 setgray newpath 301.01505 14.17409 moveto 358.15634 14.17409 lineto 358.15634 26.1517 lineto 301.01505 26.1517 lineto closepath fill 0 setgray 304.01505 17.1741 moveto (MET) manfnt 9.96265 fshow 323.71884 17.1741 moveto (AF) manfnt 9.96265 fshow 336.11674 17.1741 moveto (ONT) manfnt 9.96265 fshow showpage %%EOF feynmf-1.08.orig/manpics.mp0000664000175000017500000002601106250470140017331 0ustar kmccartykmccarty00000000000000% manpics.mp -- pictures for the feynmf manual % Copyright (C) 1995 by Thorsten.Ohl @ Physik.TH-Darmstadt.de % $Id: manpics.mp,v 1.5 1996/10/08 20:22:02 ohl Exp $ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Feynmf is free software; you can redistribute it and/or modify it % under the terms of the GNU General Public License as published by % the Free Software Foundation; either version 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. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% input boxes verbatimtex \font\sc=cmcsc10 \font\manfnt=manfnt \def\LaTeX{% {\rm L\kern-.36em\raise.3ex\hbox{\sc a}\kern-.15em% T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}} \def\cs#1{{\tt\char`\\#1}} \def\arg#1{{\tt\char`\{#1\char`\}}} \def\c{{\tt\char`\%}} \parindent=0pt \parskip=0pt \def\ctr#1{\vbox{\halign{\hfil##\hfil\cr#1\cr}}} etex; def first_latex_pass = \ enddef; def second_latex_pass = dashed withdots enddef; def mf_pass = dashed evenly enddef; def dvixx_pass = dashed evenly scaled 2 enddef; def connect (suffix from, to) = (from.c -- to.c cutbefore bpath.from cutafter bpath.to) enddef; ahlength := 4mm; ahangle := 30; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% beginfig (1); h := 10cm; w := 13.3cm; pickup pencircle scaled 1.5; boxit.tex (btex \tt\vbox{ \hbox{\c\ foo.tex} \hbox{...} \hbox{\cs{usepackage}\arg{feynmf}} \hbox{...} \hbox{\cs{begin}\arg{fmffile}\arg{fd}} \hbox{\cs{begin}\arg{fmfchar*}(100,50)} \hbox{...} \hbox{\cs{end}\arg{fmfchar*}} \hbox{...} \hbox{\cs{end}\arg{fmffile}} \hbox{...}} etex); boxit.mf (btex \tt\vbox{ \hbox{\c\ fd.mf -- do not edit} \hbox{input feynmf} \hbox{beginchar(1,100*1pt\#,50*1pt\#,0);} \hbox{\quad vinit;} \hbox{\quad ...} \hbox{\quad vfreeze;} \hbox{\quad vdraw;} \hbox{endchar;} \hbox{...}} etex); boxit.log (btex \ctr{\LaTeX{} labels\cr{\tt fd.log}} etex); boxit.t1 (btex \ctr{\LaTeX{} labels\cr{\tt fd.t1}} etex); boxit.t2 (btex \ctr{\LaTeX{} labels\cr{\tt fd.t2}} etex); boxit.tfm (btex \ctr{font metric\cr information\cr{\tt fd.tfm}} etex); boxit.gf (btex \ctr{font bitmap\cr{\tt fd.300gf}} etex); boxit.dvi (btex \ctr{device independent\cr output file\cr{\tt foo.dvi}} etex); boxit.lpr (btex \ctr{printer\cr{\tt lpr}} etex); tex.nw = (0,h); mf.ne = (w,h); dvi.sw = (0,0); lpr.se = (w,0); gf.c = .5[mf.c,lpr.c]; log.c = .5[mf.c,dvi.c]; tfm.c = .75[log.c,gf.c] - (0,2cm); .5[log.c,dvi.c] = .1[t1.c,t2.c]; t2.w - t1.e = (5mm,0); % forsuffixes $ = tex, mf, log, tfm, gf, t1, t2, dvi, lpr: % fill bpath.$ withcolor .9white; % endfor drawboxed (tex, mf, log, tfm, gf, t1, t2, dvi, lpr); drawarrow connect (tex, dvi) second_latex_pass; drawarrow connect (tex, mf) first_latex_pass; drawarrow connect (mf, log) mf_pass; drawarrow connect (mf, tfm) mf_pass; drawarrow connect (mf, gf) mf_pass; drawarrow connect (log, t1) second_latex_pass; drawarrow connect (log, t2) second_latex_pass; drawarrow connect (t1, dvi) second_latex_pass; drawarrow connect (t2, dvi) second_latex_pass; drawarrow connect (tfm, dvi) second_latex_pass; drawarrow connect (tfm, lpr) dvixx_pass; drawarrow connect (gf, lpr) dvixx_pass; drawarrow connect (dvi, lpr) dvixx_pass; circleit.latex1 (btex {\tt latex foo} etex); latex1.dx = latex1.dy; circleit.latex2 (btex {\tt latex foo} etex); latex2.dx = latex2.dy; % circleit.mf.gf (btex {\tt mf fd} etex); % mf.gf.dx = mf.gf.dy; circleit.mf.tfm (btex {\tt mf fd} etex); mf.tfm.dx = mf.tfm.dy; % circleit.mf.log (btex {\tt mf fd} etex); % mf.log.dx = mf.log.dy; circleit.dvixx (btex {\tt dvixx foo} etex); dvixx.dx = dvixx.dy; latex1.s - (0,2mm) = point .5 of connect (tex, mf); latex2.e + (2mm,0) = point .5 of connect (tex, dvi); % mf.gf.w - (2mm,0) = point .5 of connect (mf, gf); mf.tfm.e + (2mm,0) = point .5 of connect (mf, tfm); % mf.log.w - (2mm,0) = point .5 of connect (mf, log); dvixx.n + (0,2mm) = point .5 of connect (dvi, lpr); forsuffixes $ = latex1, latex2, mf.tfm, dvixx: fill bpath.$ withcolor .9white; endfor drawboxed (latex1, latex2, mf.tfm, dvixx); endfig; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% beginfig (2); h := 10cm; w := 13.3cm; pickup pencircle scaled 1.5; boxit.tex (btex \tt\vbox{ \hbox{\c\ foo.tex} \hbox{...} \hbox{\cs{usepackage}\arg{feynmp}} \hbox{...} \hbox{\cs{begin}\arg{fmffile}\arg{fd}} \hbox{\cs{begin}\arg{fmfchar*}(100,50)} \hbox{...} \hbox{\cs{end}\arg{fmfchar*}} \hbox{...} \hbox{\cs{end}\arg{fmffile}} \hbox{...}} etex); boxit.mp (btex \tt\vbox{ \hbox{\c\ fd.mp -- do not edit} \hbox{input feynmp} \hbox{beginchar(1,100*1pt\#,50*1pt\#,0);} \hbox{\quad vinit;} \hbox{\quad ...} \hbox{\quad vfreeze;} \hbox{\quad vdraw;} \hbox{endchar;} \hbox{...}} etex); boxit.t1 (btex \ctr{\LaTeX{} labels\cr{\tt fd.t1}} etex); boxit.t2 (btex \ctr{\LaTeX{} labels\cr{\tt fd.t2}} etex); boxit.p1 (btex \ctr{encapsulated\cr PostScript\cr file\cr{\tt fd.1}} etex); boxit.p2 (btex \ctr{encapsulated\cr PostScript\cr file\cr{\tt fd.2}} etex); boxit.dvi (btex \ctr{device independent\cr output file\cr{\tt foo.dvi}} etex); boxit.lpr (btex \ctr{printer\cr{\tt lpr}} etex); tex.nw = (0,h); mp.ne = (w,h); dvi.sw = (0,0); lpr.se = (w,0); .5[mp.c,dvi.c] = .8[t1.c,t2.c]; t2.w - t1.e = (5mm,0); .5[mp.c,lpr.c] = .8[p1.c,p2.c]; p2.w - p1.e = (5mm,2.5cm); drawboxed (tex, mp, t1, t2, p1, p2, dvi, lpr); drawarrow connect (tex, dvi) second_latex_pass; drawarrow connect (tex, mp) first_latex_pass; drawarrow connect (mp, t1) mf_pass; drawarrow connect (mp, t2) mf_pass; drawarrow connect (mp, p1) mf_pass; drawarrow connect (mp, p2) mf_pass; drawarrow connect (t1, dvi) second_latex_pass; drawarrow connect (t2, dvi) second_latex_pass; drawarrow connect (p1, dvi) second_latex_pass; drawarrow connect (p2, dvi) second_latex_pass; drawarrow connect (p1, lpr) dvixx_pass; drawarrow connect (p2, lpr) dvixx_pass; drawarrow connect (dvi, lpr) dvixx_pass; circleit.latex1 (btex {\tt latex foo} etex); latex1.dx = latex1.dy; circleit.latex2 (btex {\tt latex foo} etex); latex2.dx = latex2.dy; circleit.run.mp (btex {\tt mp fd} etex); run.mp.dx = run.mp.dy; circleit.dvixx (btex {\tt dvixx foo} etex); dvixx.dx = dvixx.dy; latex1.s - (0,2mm) = point .5 of connect (tex, mp); latex2.e + (2mm,0) = point .5 of connect (tex, dvi); run.mp.w - (2mm,0) = point .5 of connect (mp, t2); dvixx.n + (0,2mm) = point .5 of connect (dvi, lpr); forsuffixes $ = latex1, latex2, run.mp, dvixx: fill bpath.$ withcolor .9white; endfor drawboxed (latex1, latex2, run.mp, dvixx); endfig; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% vardef declare_boxes (text l) = forsuffixes $ = l: pair $.n, $.e, $.s, $.w, $.ne, $.se, $.sw, $.nw, $.c; endfor enddef; vardef setup_boxes (text l) = forsuffixes $ = l: $.n = .5[$.nw, $.ne]; $.s = .5[$.sw, $.se]; $.w = .5[$.nw, $.sw]; $.e = .5[$.ne, $.se]; $.c = .5[$.n, $.s]; endfor enddef; vardef border suffix b = b.nw -- b.ne -- b.se -- b.sw -- cycle enddef; beginfig (3); h := 10cm; w := 13.3cm; pickup pencircle scaled 1.5; declare_boxes (mf, tex, immediate, list); setup_boxes (mf, tex); list.n = .5[list.nw, list.ne]; list.s = .5[list.sw, list.se]; list.w = .5[list.nw, list.sw]; % list.e free! list.c = .5[list.n, list.s]; immediate.n = .5[immediate.nw, immediate.ne]; immediate.s = .5[immediate.sw, immediate.se]; % immediate.w free! immediate.e = .5[immediate.ne, immediate.se]; immediate.c = .5[immediate.n, immediate.s]; mf.sw = (0,0); mf.se = (w,0); tex.nw = (0,h); tex.ne = (w,h); mf.nw = tex.sw; mf.ne = tex.se; tex.sw = .5[tex.nw,mf.sw]; tex.se = .5[tex.ne,mf.se]; list.w = .5[tex.nw,mf.sw]; list.e - list.w = immediate.e - immediate.w = (.4w,0); list.nw - list.sw = (0,.8h); immediate.ne - immediate.se = (0,.5h); immediate.w = list.e; immediate.nw = list.ne; immediate.sw = list.se; list.ne = .7[list.nw,immediate.ne]; list.se = .3[list.sw,immediate.se]; fill border tex withcolor .9white; % draw border tex; fill border mf withcolor .6white; % draw border mf; fill border list withcolor .8white; % draw border list; fill border immediate withcolor .7white; % draw border immediate; path imm_to_lst, lst_to_imm, tex_to_mf; imm_to_lst = immediate.c .. .7[immediate.sw,immediate.nw] .. list.c; lst_to_imm = list.c .. .3[immediate.sw,immediate.nw] .. immediate.c; tex_to_mf = .85[tex.nw,tex.ne] .. .95[tex.sw,tex.se] .. .85[mf.sw,mf.se]; drawarrow subpath (.3length(imm_to_lst), .7length(imm_to_lst)) of imm_to_lst; drawarrow subpath (.3length(lst_to_imm), .7length(lst_to_imm)) of lst_to_imm; drawarrow subpath (.3length(tex_to_mf), .7length(tex_to_mf)) of tex_to_mf; boxit.name.imm_to_lst (btex \cs{fmfforce} etex); boxit.name.lst_to_imm (btex \tt\ctr{vloc\cr vpath} etex); boxit.name.tex_to_mf (btex \cs{fmfcmd} etex); boxit.name.tex (btex \LaTeX etex); boxit.name.mf (btex \manfnt METAFONT etex); name.imm_to_lst.s = point .5length(imm_to_lst) of imm_to_lst + (-2mm,3mm); name.lst_to_imm.n = point .5length(lst_to_imm) of lst_to_imm - (0,2mm); name.tex_to_mf.se = point .5length(tex_to_mf) of tex_to_mf - (2mm,0); name.tex.ne = (.95w,.95h); name.mf.se = (.95w,.05h); boxit.name.lst (btex \vbox{\halign{ \hfil # \cr {\sc Vertex Mode}\cr\cr Objects:\qquad\cr vertices\cr arcs\cr polygons\cr\cr Commands:\qquad\cr \cs{fmf}\arg{}\arg{}\cr \cs{fmfv}\arg{}\arg{}\cr \cs{fmfleft}\arg{}\cr {\tt ...}\cr}} etex); boxit.name.imm (btex \vbox{\halign{ \hfil #\cr {\sc Immediate Mode}\cr\cr Objects:\qquad\cr pairs\cr paths\cr\cr Commands:\qquad\cr \cs{fmfi}\arg{}\arg{}\cr \cs{fmfiv}\arg{}\cr \cs{fmfiequ}\arg{}\cr {\tt ...}\cr}} etex); name.lst.w = list.w + (2mm,0); name.imm.e = immediate.e - (2mm,0); forsuffixes $ = imm_to_lst, lst_to_imm, tex_to_mf, imm, lst, tex, mf: fill bpath.name.$ withcolor white; drawunboxed (name.$); endfor endfig; end; endinput %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Local Variables: compile-command:"sh -c 'mp manpics && tex mproof manpics.[0-9]* && dvips mproof'" End: feynmf-1.08.orig/manual.ps.gz0000664000175000017500000057636306250470140017625 0ustar kmccartykmccarty00000000000000㟢2manual.psks$Ǖ%~_iT )Sfd3Z#5<&ʮe I U{="@{FTȌl߾k/?]߽~&o7w-ӲXtw˫E6'-ܜ6׋vZjp|qqsq?ZC6狢u,gsnux{\ݽ|e[-"K뻳Ǜ6 oϻ\:Z?|n>ŧw qs}j;Gon۽z~$dqvwssW,ۛܗw3{׋LJGLN[6i//Nw3{h;{Xde8ۋEZ|'G\lnw{~/>\->Oz-õvs}.E.lqxUsZw~<ջm }BONŧOǰeX/gwgwxLJݭ{|g_n/mKfoif=N=p5??{mQz.6x:|?lި@.wEr/  w߉a-b~{O6맀[pwՇ";M}ne{a\>w[~}gF|]wW~vyo*߇-gww {͏g÷ws;5Ϙ ZW1WGO gSg@ØpPtww`Ɨпvէ?բ$i]nW[ xv T5Wn|ܛក{Ӭg7LϿoE?mcX;siF&{F5O/9Ǣ<7[sݾ_N4s,|>q8\io F gvgj{ڶc89ll招dMg|׶8[^7Skn6&&aiRy8s}6sԻrӼ}=lο:x]ZuۃhnwkG&6k##eοG;Ojpgbvڑ_eexf|8[:((ߙ5z쥶wϮ4s"04]_H?3qP[`'O>Fh#O}c^1 ͖mcr/5k=|%O_Pdžj g#3?/8o(p FUhc|/"L0ʗ LY8b$_m"x٪-O̿XwwO^r}ww?>ŏh/X~!03A2~[|kHې( %OgOLSbސFtg;pa󇫻gQ2Aj04?֠'/8sѤO LA0θ:@ʥs?;s_F,S@[*&=+5-Iwư0Hcy/P[xmMOx׋?RZ$QM9?\m[nLHm՟ElĮw͇7ۿF(ۯEcrl[J?cb% ?Դ_)Bh=afe<~|y#j^xtsO'ovkiDMΖ&5,v q%_iI!~{$>}Rx& r k42;C!qb~4?ӧ*ɿ.<Փ{}{ /O {gỎN' j/o`$V"Njח_:bf_+78}n ~{j?Əѯ%t@0|m@V6jn]"8 -|(=""ؕ8d߼8CK7s,ӍlR/6Nݳ;x_'`ޝ?=;X1!=ZGj: \z=x$fib۫WuL~|;k𻧰_˿;$&^T`@?.ycNȇ;D.%j䭉ԋl^/+Ⱦ.7OؘޜAU tpp6x_l(JR?]*(|KT |->rH;Lrp_iN5moW⺬W#^N]߻xIP[>z_|qҾcpկy_;=^NbƁ揼.3L &\1̣˘mtL摛 پG#mʵvi[͎|F jSsԶ7{0@MLocg)O#[?W`9SGb0 Kd IJ_r]ˉU؍x;c6I.-G|G55WΨoCxiӐ)5w|_e~6Y)o?^E븊3p߀'b9y<$ٌʼn˗xXkWոO?Ƴiq-GDg6m~Mrqns:]s {.4B8mS}kFޕ䒤GqfCɞ]9:Taiqp5\|E]|E*ͤG|O?KG7?Č|tev3n|>f^%'~3REUMGҟO7bN;܇7<]I__lv('1}_?gΞQowa>͸x>ig^쮟h Q/o!o}ގTcS=u+ypl1kr5~aJ8֝6-䶲̛V"D Ӵ^__%>U%l_Y2/WaMWvw,ҢNebO-efeUy&]=tҾ*S\M&m۴zkWi^whDYRXԚKCJKN$ˢ_zb6_VTeKt4mꮭm5I{;T hli^>4 2)觽6I*s`O>`L1ơ~Y$lWf [I0]9,rUf:mz4~cqe= ;8?ï;Z B(K zb^w5cuU]H_u[9ބtjRu"+eR]Զ6)}`OkF%h={Spgsm:p90bӞdV3)ۂ13pXxcXS4^hpXg%bF1٣6 e4][Z{oX $Fa=ԃf-8PD0>ecn44֞A2b#'\`%;͟aYxR9+u,&M7"<˟!ҖM6zhhvnh퓚ܫXRޒh_۹-x_%Y[gdUf7]nNH4 &LlR ޴-bLa 0oX4.;gMpeZ)TZEo; 55OV̾WEc֓$ZfXv| z6So}[A/<3InB;nUiܪr$eo*lhfWL[[&] f/lg>9X8eHT2`Fp+c/qOVh~yc_ҵo~ܜ{ֽq ddʾ܋8q/76 8 om^ cIV˷h d69Z ȎA ~$g`DW۠чiDž-8 _Dg gڦ'In$lWۉ`[8]xrLY$zM?윩mLXL-DB_v!+)6\?ktgӿ {Xue$ 3؛l3 8seNQ Ξ=mNfo -ځdrB@%?<_ ihp 6g ʳ1B%UYnp6n㼵nUKlcWU,71BЁXl2$QnUp-֦/4 ;ֹo-KfVm$LZPo"/PQGKֶLJyA]@S xx[6ou?^( pȥ.:wp*M6$tpfRJ . g|G%WqKxB4g|*?FD7ѥ?hNrl_ydl[jPMuɭZ״˾F ]o$,Zh,,xBGŸ+(H(Ubd(e#U}gPPYC59ItOY8\l1~npnXZb+xUƍy -eLc1Lb`=GEOS-%9Ih r0败%iLVgvm0;Kz'Nj^i<;ݜ|"aLdʲB u7٢WkQ ,R֑rBÃ)56jpi \*R@.,@:RMQ 5%%g"xh%;@shQXf[&5\ =ώjJh홤(꼦i"Gl6=3u =kq7a40R ܄ ikIt|CT2!dVpDl JE\]Ti+p{)n2 9MtiOugPw옯0A0r̉-gUX2.J9{ #4|(͡ BEѡ )\ˌFdl hFmx+$t.F_gldP 9)α39jYE ̵#! Pgo.1^g hkJ^4 ƇҠ xC>ܽc+ %*k/ FX.U<ɒ1+9bvufPjDQixZ\OAFuvȑqNMt$ ǘF_:;r.zI&z1@Egp(cڷG *>w0ܨ0]SP!pV[>*xc}h5a?ݪܿ4}B޴%:HoUV1jɸNo$+Fp z 2C(b,'c@@Cʕ>!gsFeB 84o,9YSi22z ҎaEg2О(L8vDMLx%o_ᵎ]=%b,ȔI(0t( Шֵ3 c@7J,Ysb0<~r{B᎝/@B{`uM薔”ObU/mKWo',;>1YfUٻWkБa|$ -/]X ᩌ@aDܣe \Ôޖzhfj_f>.Y[U=0n a .eC;\+ W7FYʂ 57qԸ 3h~{F:>EMB$ Ȥ(0c= u}r 2}=J`?BAQ͜DWw(qS+Eqgp@waadysAбPK(G` #*yPF; 1"-uZpvKb,zM#iy"> #3:-fIt:e?'K2&Q˙Nce&W:nC@52:lTxi#&3X'U6_DsPfuǩ4 mhX<`BG\;4L*,4vH% Vp}9G`z@$҉Ȯj:3YJ,)b갗`|E1ia)ah{Q/kSFh΃vcz SsA99 din^OzppK raF uwoΤ$Da5N0ȅG$S)bh_B]Ǻ~}]GϧZ*&l;!$ Vk9") P1bYIJ5eD#rLLom Ƅ^QZIVf\R[d/b=ĎB70C2K`B, پvw2Q &j\B{'^dgY KygA8d8!^=*J0#aDgӐϛp{PA<Ԉ2ح*p}|jKU/ؗӼ r6; UI$i4qB_ cZ Y$ L'W.x;jo{[Æ$ 4&t4ս}2d+kaz \D_yT(xxj@j@ 9AIlW8~#K!8NqoV9j|d%t/(8P09`GT]S͓ ckXͪfk\9#O\&=3Z%IS{@N3G4ICDXsI@ K:hg5Ts]9T X0isa&(k(a:бw. #s W01 [~k yԫ!RDwiku} 5 Rw* kv^ ɹa __ b#ps1N@txApȰ(V;X :yTy,F"cC t5A[wtO[P+żDC{ICי`]B! F]D($}O{@aL`!.(QjU£,nNsjpH?:r."ƴш&5MKisz%"s+6RZhG{iO_+r-kH1is-ez 8՛Q1G)D!\/ ~G6,\=Wqni#؉MB m5 49+ [L@\ (iV [N=ʺOdc@}iP(Oϻc Fx7dXC T#d6<7BLvrn GT[{ 0`тBGiZzz*S*.yܓnP(~SDJC / w1XTb@'c{hÜAO{eD嶦p!9AvԁMJ5g r>bu rJ7\(䮜kܘy1PpL^ 3Cdȃq@&.FN[̔.5AЄ(x赥'>VOL]fځ; :^ {?lj+Fidt7:nԔ0-)ޅZ^ ܒҦ.cLŝ"tĜQ7*Fiɢ7z UCtXrG-<[c,環CK&Pتtw%M0zaR΍ccFڨ)^:_DWdֽф6NrWm(:[{53"#}98ETDT#7:Qʬ/ I69{of v [dt31*ԊsC, ?᷊)Q:X6#|K$'dE+."4 *ƌƤq)9;oV_.h+cS{r Zɗ/ S& qz8!ٙl\'xHY⡻ʰ F XQ?Фk<ACiTy4B8(E)#(Q"nS0[/-قs:DO_J> Y0z4ḮP歎GL]ȡO3^ru|!D\ G 9t@{ΫӤ|nHMŘoa369nPLA﵉FІWƍ9)a`YY]L`-Kfu6ZIItl(؃k>a5JTˇIh!urړ:(+\6q534(R#*k;F&>K9G4sA'>SX{kKdK3Qht ϣwI0^7Ȅ.]Y;#LQg&hEY%,&Ɖhƥ`R'ƜB)<(3NOJ`aBd*+uc̵x/[?R:qM_2w?h3L[G|H)n9 N%2CrW0t8՝0]ƅ7]zyuAInWM|+yCu.od Z+A_L1Fid<)%*e7aBC-c\͹وmcY9!Rq~eQ;U0֮=W1y>(vkou%#MK0vBPǩ" I~$@:n$R -ђx5aucB5Ms]Sx@!Ex89Bc<HlUBS|:h ]y$O%+0 8 a;'`W1TGp!Y lXq!OƑQ0&aRG1ghB!;ёA-█܈xUG Ee)k)m&C'rҹm5Mt| #ݏd_m2OLRw߻6s!wGH6vZB4IQ,M`<8Q҆`48Fk"qY24!$n"DwŶ=Ѱh[#VJ\jȅ6Zj`^{2a c1B K RdAaFK*';ewVLZb HuJBp@ 换t3-Z ik0?{`ϊ.iZ"u tz'(KQk 4Sx YPZk{A$iw``jGN pn"hJ)%Q9IT\ P5mQ]y.fJѣ!G +zzb*='ϤpQi(!0nEu@켉ro1V7АW75_D7uJ>DG'gaPxrNאa1?_,x &baYrkAG EJg!OF8K=*LqN4=]9 a'˕#f~&RE>d{;xýtk" 0ccY! |4c| hd5n=uu[=ddSU5?68 .n¤, KQ$jg3|d:E`)cQpo:-aL1]E(61]lѽwe{&Ce2<&bPE.ot&@8BT r6AtHneuYBTD7C,ɷc- ^˜:ؿԧA=ӓ~77<^< c[8:qt|hna,)K38du}l J5:L:oQ* E,䔳.qSaO~PE*+_MJH:~=sPwӝ>JCMPYg=\Gv:q>~.TuC"04srSIГHcbst3M=X 3صm4I]ppTԚ^}6vSǢ)P6'<" A"I)" թ` i Ь1(/WiWFGn)bx5tQ^ j\g {v1y󬚩]1[P05[{)wy5):ѹQ?}2i(đuvy_NN6Y1%idT8@dm/$g|aPq"x}&<Ow.[R% H$HcBa0>ƉtoQq<"neNAd7!Ƿ+Q{nnFGf,(? :˸Ny Z `Qa+ j1ϵN?1=3Wu' UY€!8Zb;j_7} 5 2ʑYs )Z֒H+Gc?&HJ=A@$Er`ܬ'[zxb᨜ۦm:B)!jՄ!~:Zus6x LN\6VH?QFWfv^.Wit9r܆ ؝^"X-PSڅ^ y+e>2&21]I#$(:$XkŚ\Xzpv(McϲQNhԘ.~pbS \TJ$kUrC G V*k+ЈrcdLW `ր\ DD#/p9S +}ꔳ\"$"A(i)E[g\*Sjt],0Iou l\"MK 6yI-̨VlbKNNuݛ@kN麨]$3D <@ұW؄~lfqQ#hsNu1=x˩qDӼMH2)aDB6iwYWqj'h9?Ba]!;xF$6FS\}ToX#˄ʘ~)kK/TQ{7B2*v},1sHgKŃGɌ]iOgt偲B鏦xcEwy2TgӾh(QU=slQK '`gb^J(5xl)D(mxX%SZ0ðj)w2C(/hDyeTU&t^rgI4o {Tvoqrj]G:Y~K ["M>sVT?q)4 Ce#sX{|%O+W\HE,3ti>)g'wPW<`+&*i% :H2YELZ88pgtrrǩ @` )]]J9'GV^|TWYz#wGBL/S mMkUv7_2"-$P7fek^#:*:b嚘 lFH!էm]Mx\ț{8^ 1i)c:DC1eڑ A,kv, a bKU8x*]-"yY:3ͦb,SIoh|guxd ٜf,BR's7Hg*_U : 7F P:rb3>TZ6Bˉ=һ6"u, *mWBHt#1+QҌE zdb'Z 2MP~+$zh@ iJJ\ ?҇RPOsXmPm@ ŬklL0vNW ,  "B:e{F && uv* IhD)CGJS+Dy9(]W|1 tč '>6$H #TJ͛h$FsG Um'‹:ׄIu'o e0Bf䧩Vʲ)5y^[?*^]ij3fu*0;e5ښ9[BSeS?Gz](㱒ql [!Vn>ނ=[ŐGʨme}ܡzxiGi5_^O"-칰wo:jHA7FmAeq~rYxU&y41Cq)B7#Mh֗Y^5է^2Sf+*GllйH7*cxMs1c'P=G&1'M+v>Ӽ;ŢFc ~tLY bp"~MuGlxY'L|zI+*hdRFU{H( 1+4ݧ,x y1`6%K&B#Yo 3EPg_@QCD2Pߡ_63>O:n H1c3;6@VƟ3&oYVE$փ:v\uݵIt47=êqS &PŘ۱bqne^ߘO }I&^+<S>ֶ-UJGh2A^i20#1WQ IJxSbSD ~/0DLI5LC=HS ~O֞#DLaXV~oK~@˔%@2թd(tiVi׉R[!K*c& r.cJ*l4h74ӠLx fJnLbJTn\ Pf5})&p e<KV2FhQVjF!`3'¡"L)Ǫu,\OvD"3]eZf rA*I&#h2InE(S {;z0;+hu1|=qʡг,sVT8,K˘-1YsP.ww)XzAK D)4*j ;%걮@(5+z[Ž1(){rHgz F+pt e$NWBd֫2l,r; p%YZB84P^!!V<5{9{$T@$B"O]@Y"^an5TFk hN?w3~ݼ\ [H,TJGMRV #Ȁ-[I1¯AZ.Ȼ )]nQL̼bN\Wr#ze6Z`AL+䤲'"ΊrPy+Q/}?p0w I23\cr¡AÜѵ$dRkr/JZx tQ\cp1,l]'HNOhm%H.>J3v2aŅelk:V2]pi:`cɨhlK]Rkr[U^rXIa]=B(!7p(,8TrT7Dujz|RStS9>|SC@2RK DU,d%[ʁ#b:/M^>V^0Bdi{cqns+CDif_Jg nfS=̧ pBz\F+JWʫ1i:k) iJ]5hXEN/beEA`y6/ʊn_4"uG?{!_J*U+CX jB)'.l |{m(^X坑5 S0L#5 ?^0\*/W#>pHn?VVu S걨cS<ᜀ?*W9ጔI\Amc`T2 {j T,(b*l,n!$ *n<+QjJ*Ҭ)V ` F-9ǚN1D + gAeZJ<唽*(WHZDb"Ωmrrc3>7Gum!T()64󲒹#QtHԑ_Gz#EGi|tmP/eSLʼnva>cpN .څ@UJSRUʖon}hhFC4$C-%v\h A?|TM$, U@`>ڈ.6m=dĞw$ 7eUa!$|vx\3p{&{xa:&}OX5"U,D1$ܶeDMʿ+t3T&v6;m[:]x:2bFѫV4KP(D=~⼷+uGGFF"€HF(O 2”$UX()A߫!*s$zi5^Qޗ4Ꭺn۸rj_tJ2jTv;Y%zB~B :. Tww4zw›uIyN@ZLu{kО2XY2j&0N;pј&1zKh[ SD5[bzd8`}_R0 n_*d:]* RKʈiּBXb{$}NW,Fb ަ-/=<>KKx1Tqa^4Z\`HX6ٽ5Rg]ɠf'nkel`AzGd-* a 048*eP{ic qgiZK0a(9pR_eɅ^رdꘐtPWp#XxYm>ێ IFQhzFhHʏ3"s~mt$=W,0xpKa@Ⱥn('!GFU8^E觴_ VNAՃ&Btĕ)xB8t'OQo!]y2:NDG4^a*%:g*N.*u#r)36rW:[1K{6L}&h !W8Z=TpkXx ρ ,eVpv,?5Č88IvA.dm)%dB y^F/_?TNkeK ^UA@ײ &#`*rI".:FvTNY.°-Cb 0o^ Axu!t_Wv uv+e͆" !8Y'm@ @ ^—Rޖ}0]6IU* }-!0Ur pᄅu`LeHUG}7.5xX[*WLo_Kp;KycIv3$J(tT#"۠r~85*ݱcA! H VsM*\UP۴VW/-huPfppbD7.S+F>sDDDqб,$W 5['zaV<6PhC<WI&^$K t=J D:/FeELUxhT< +P )^%S+kCNʜH1FS'Cha&ilwhZՍeqBD$EZ3R*i{=дJd*RBNgOT0BVA VEu'dpracx:PLɧQO`Z1Y0z#jZ10;$^&a%b[71!fts!i ft$eZ RYkJC@x(8G,n^C-u}uRoC=2Ft>_:s#(G LPM=%Qy<'@ux^5ܮu sL$<qN{jN/ "x 4+i |t).}̄Xeѓ18;ՙ*1T8a0: _G9^!+\dbSMmڎ1{7*%UqT1DkM^!F1\Yͪq%l^>)+ 5WNR( U W`Y z5RXO:eAչ>"{:ց5yV7:0h2I"vF2 *gT=F!P=ҧwCFnbe|BF  I2 N*[qqXAf177RJO-YqP~ \{롎Mxeiacq<Ep:Y(~~iLV&M֢ Utz^ssD?t3|+dQ˖yqDg&Anvj+~)&PqTNoW珂XHƶ̍sJ,k ca>[1ς"1E s֕a#"I"(EIcB9+a6>U)`d$4Q(׾W'PKݣQ ( YWd|u(@J"9-W0DZCti:&}le0ᾁI P**r' UlP c׎O@ӏQq 萙<^q(Ѭ-Tz9%6]2g"ngŌW> D3p,Mp$g-YͳD3c S1D@/E@Ɣ H9~IԹbDrYJKYTgA8qH` ߄R_eG4ͼ SЊuAL$۠ޑG}K-#ɹQ_A] v|Tp`@iBi.S@xTZU4Yze"&!竩^Rҿ",hc2!o#>>r׀c\ӜFINC!R*pt4cg wb"\wp {φv0 F9!8VyWC4&Fw.*m ~Ƒ^CEZ?niS 9KmP砙n8”o鉬>{=Jh([8E f!4$XM0‘PZ#bv!K5O#u {b2f T}2!PH@V.Bl#$Dp[uʐdJ2σ@^ۆm5iHfnFঋq"EtHyC ȫ*$HQ+0$'}H$A왩.XIUC)iBh3EU,lѶF{ں竷'__C:>hăαsDkLD]Ǹ8 ~v~1FE-؃{F(XOl9+CTrL|V0|VLiCqD>x^琋b5 Td&'$u2$;Gƞs*%38 B+osg v2m5|,yտtQ7^9sᡡ8KdߥT^ަx:Y| Ͳ kLb@] eR֍?02xR+rCǟQ[gXy zh$KUI(FєfhF:YQPi)B0aѰ‹Xgh0CD'V1fȸⵇ$B>o/cT1ED]{16x6rZ &a!\gFZ:0NWl Dw눝(M)|ힽ/RN1W0' 3"0u" }5v{rc?N"HEH{=ݞ+y62#4hXDzĿ,yCwy !ԅv5a-g00YiSQs`̦,cQX[9Y(9~ 0X*[ieiYG i@*.'GԥUE#BxZ)/!Bk| K|hU4b95f*> kfb'Tg Z /55@'êQ>QxelW&C`Etv`j}1;8hǜBU3h/t4܅&&O^D5eXTh-KmEȟCY* WC>nLt[YE` '#qTTJv SJ%DJW[!e!#I:%bG1.F5Sav F\AW"2"~N r},]dSbG$oT]?Ak;1.kIT.fj$'Օ2㘪X55}oUx h\b)_T5vxoPˮD^0( ~0QUgrFNuY.wNI0 b f!gL7Xy&-TAqhȬU%wqąYelz{r zeta XDE2( º:rߐ6jy:)8QYn*qxL ))Dᛩ -644 Be:yHT9ڈIuyP"K@}/ v-`Ʌ!:]z 㵪F1ŽIO`+`т[y=*-4[F4Hz=rMEsM0O)w2#=j FqF@BdȖfXVxze3SkSGe%=¤mB1 5+a`=Og^Ǫ1_,I.[P(Q|OGEPyAV6FCKE |MLq#/ n^d>NT0) uFڽ#"\YhSA ETЬΣW/zzzv4u-m3mdQ Q!HP&CuB(gJĸp#b@Bg(c= _:-z< `lyʧ+ 2@*8RFٿGHxX Pi')a3ReX?X1\bH~Pi]6B$y!06`k6COOQؘa/^2NGZE6{!kb.~^.B&;Wn96zmp1 ̭@T-}> h@XTPȨWȫ-PklU}d\9v9[N}P2Daz$CV+#fE+@)kGD2ʺf[f^߃UCQ)@IЁf{e?[$! 0M䃰S"ɶ[Eџ1 0CV%7mWKE]~fBgaS5T",'":cxɪƄ4"#D%)b 1mɤ8k-vHlY}w6Ik@@<;ìtƝ6nq Y#yrڭJP >L 8_#=~k4q1*+DBMBtgG6򊄪0ZҁdMY Ы'[HS6 JfOXY 5%w'=jz{(e`Ll t]u_L:şl{VjZ{P%Ska%j! WnYFPH(]wOM{ZҐzYe~-4rdv 1L!,ī=8I$ 9fl |#N -6!nw*|sfx PK)u#; f7]EdD3 :j;\bv8;vN!CA0աrS0j|X{A`hi"Z b`9t)k肼δ2[ĠyȄK i#*+@$֓aYu F!<oʈ^E!罈TP;` 6,j&smKN(F|20E2N@Q(7\ `bP&7%ꤍGIg wWcq.JcD[|NJ2 #ߦI)tK,PvCcCN@jq( ]`/;?:nz$|~pd @#z sGo}E7ʮi(e0zf!Ž(Y"\4KɁnMէ5hF&ڡNsW2hoop+KQq8􎭈Hvת(jaVdr$h L&rG|${r*\M?jʂx~ތQNp}!CFvZNgJf%Qu vt7kt`mܬzO!Vo$ɘ(y me1v Paq*(W(uSעBF8q`W·W16{YN1$} t(R?zG'' d&.K0#Eg;'V% ,!Tnfیs;0+$!dP(,6Nj fHر; 0v7 Y=0,S.s)K^b~2-4 DR&<@,mUa0'#?gF%hQE W}J)pE&d](a8b^q 'Py R֡rzE)h]*@ B0!j)bE"<h&X-tQU`͈G'#$.2G 4mфXnU YtI^" x̕А & #l׈$s$xʨdTa y KSԤ ץcnEA7$ (9xjzը[yuLAPMi㸚^Vٿ>0G6$sd"%jE,Tkf2QI!#BS:yq r%ZOeeZ5.PBq*qHt $Bxz ;Im"& G2-J<)RUSc} ^EC0T-!V_=BRi"ICU~**-jy 5h"sTKx%p/HnTZ̢/FxKxHra(p^pZ؁G胠@"l&9X0UN51 ICS}=TސXNB@E8@g6!CUI!7?4Gc17>ye虞5FCjđw|^ Z7I{Ժ|AI Lu|!yyt!jw$4Q&`Y,fՃa"?$<{wj* pNY2G:92zrg {H5zjR2w֬vcD2FoU35 |u)V+mb ^@e"R]RxD$U xpL<eVLT.@ TTd#epaYft G5(mIr;ApٿzBi('QZ kaiH0# N\c\K^zm,*dcUSrI/䅪 cd02+ 4okj0TJAtH]Fk@ch?xҮsV3A2p24B[#5['N#[cIԴjGB08,\g,w CExݺAG sk+;#La7z.#h; JB1EqٳDχYq pKXb6~kغpʟ\]"Ƒ0& /[cAʮ%`XQ]"p~F;`Ѭz1\(fYe,r  [Q8føÜ6>sa1^8tI%?ꋞ@ysU,]$Zx NM*b/W dB15ܽڎ \Uep 8" iρ+Y”?OzW5ыdcq\wFLlcR=g|=FW l1( [|Zc231t5.&U UTKC2IaM2l~3rClk)"$f{Lۢ纫x[YM![+V Plɇ`#̻&ĺUбÒ A^9H {RF,b& ʀ` f"޻3Q{`VKW%b1Gnd:$xP4L2ސ7>=SGodkShv;Ժ{.)E}Pݥ'|F8 G4,Rhpb٫X &c0*QCt?1[LEŽdz'O>Su<򭣞nSX>2uz7 $\z|Ch*s,t'PfñPےR0A/ :jϽnUN{߼Gx텱J̌ }ffeBjf{\kGs<5nŲki :GjbAYف  S*%1-S}9>q(Ԯҵڦ#ATccID>3^9| u*.m6b/*Fw8%E)GQ!@/"HA" # 2#g$XOi?x} SO&%@ԙ n.$&NLPGElI<"cf>9Ι`:6tT?mt890qg¿$e$y3ש^)>Fdn<㳻<*[KBu>!TI{k%Hf&0`Ed~@`ϑpISQ=zrpyb&ݺb *%#Si~}YOEM""X2B"H Z"!_IDPpOf[7R#4b"UvcrLy1.4$LaES2b)Q%~bNϞs_w~Jӛh.Y~mkl㹛Ny 't)Q99^u֩]mXrfM>EL5׬E"仛(nXDݫ@uJ?cC?tz9ktc lh$w#1,vFbȒZFQU^ ʪF. fR2E%P3.g`MK7I/ꉗ_wʩhYɲ?g@s(}s|2T|'TaG1e)m&K/ĕC ~x2[xw. f0, ňmsoRs/+ ' \CΚ~&a5`+!'#9و8 R0ܥ ?*SG#b4:+P ,y8'UĶRXѤC jt ڀQʥQri|fG¢"ypd ȵ^u^+S&A+z3a=1?Q=Y^,L_2{3{–v2̘שw!r M3&׍C!DR~F!{Rg 47m9oX*K'XiR03.|^1Q͐;rw0@-z'!%<}r9ZB&KSQDK䴴MS;TD#tQ 1T8&H̘hgOU7'mHi?o?u e~(LXKҵI7ǂ *V# , #U0%۫C!l~4,Gpzc } kU7}JTG!3OUˆ~نl vӝ*JTd$Z唎|hƂ? Y#jh\Tg%:=v88*bN[&lGb,0]Wo۔7/W=3&eLhSŤ"P5Kx䱌 ¶j;_S\;slo*+1$ xKe3pCfU?+Sf$A&!F1R42(i(w ͼtXA-2Ce@BU ״b%ˆqLԇ${aqF q0yzP'?ߤJjm ԧEGADtN (0>}.FB HbD7Az'QJJc3@m#$~^Q3Ryg;cA7L?NE[J8,&(??:U:qx3d e0"/D>"9bvBv5F UiIr-ͯun%*@lN1ݢ5pvRt٪mpB<0eAuո,hM 6S2HX5.hggrRWW(K.溦c;ATڦ8FD :e-c6}`ǖG78)#:@ÖIԫzJ4n=3Rr{L Px[NTTyT V^$O}ԟf0MS2D&blle+1  Ǐ rrqDKMNR !=Gpd}ߡkvl~PMܚ%hkjv`'+7alb͵O{_5J RNChQ>29X0"1S=% f˴k`@mgSԯ*e'u8:MAQe Dt|)貤kX۾PyCU 1I j XbfP%B}l!\N&o)#4JBW0&ƃ.qd0'tz"#̨Zu{i>]7ՌFE3d`3tH-^bK9|`kӖ!H6:(A %f1#e}bcj 6!+>:mi&h{i (DsDScS kԅhf!4^RElL)} v8^`EMBTzMgδm;(1m_u% $:o(/L2F0B'!7?n9ѥ.8%:(_Xĭ‘ކdZ1lEmS^!K1 {Y  I:5Qy Xz\,*hh<_? Y{gJ.O2EWfOPْV7<ֆm ڤM& G IQ 6.,go)S̝#8zV2ccX ˅8@ jHQq8 ȒQ_Ɍߵg= !ޖHq\cw`U4SD5N#{n-[ªJEƿ:5e&%J.I.>㦝XXS3Bݙ {w5< "JihҲ@gnz<X6ٸ1^SU VD$|xQjVYc]Tg3{k}9(M槻^l3֡UrYXehVV J}DvRE؇{m$6F䩃dbbx@W85mLRĭֵaU?Ȳ)'6`H?v%SZ1pܙG X~_,MTh;Xa%,<(?ozG_.H AU0liܡw&@LU c~E3J-\M(*7TZ#2ƵnO-HnT>QtdZB+eaӢmu>uW=]qKd`UAQďU6$aٟ&ڊIj:YUhMut0v:Whv }vOLK/-|+:N{Gs.RΘp>ӊԧ7 ;k`,Q qXhS S0`RV"+ U ۥFR%.,٦H @?Rƒ4bh?9VuF4;0PvNdb稡ńAi/nzZBB>=0EW,(xzJ*8;"H%F1@NUD}@pV+T:; k;N#@(D\ԃPkZA5\!P~Цlp Kg'Npq efQ 4tXjH+Ef]Y( -$vBbt&E¤LlZv28xErצZ?VBHEd8`:GڀJ >vH,KXJ U#:{(%±ܑ%QA+yWUͭPtkHU)5)%# "8x=ZA`8j[^ːhR&D]O d>ڔ񞎥*qڦZA Y+Cz~'T K=8rڈ4 "3y:/0:\(7 ^ x!lD`F@QaT ǢvXHc,Ոl :?m+DFkG1BAP O,G&6]!fUW6Dᢔ F`|5?r]nX:V +6Yp򊮇YS¾M\>NŽ_ T+ RcE#@uu§v0,c$P a&Zr=t+I,^E1,3Q:Tbg9eۡQX 6|ڷy~AyGf\)F8? A5 VN{,cMIQXE)0y5M(hL՝}1Ҽqbc  }w)҇8r2úQS =c L 5B6eDW"Hijت2VJp\ҳb !7{ċ]D#&k3YP["Sb%pz J(lŰ9VCh}`RFfj'ẗON:8ԬHઓ:Jf bQ7x;a"&Qo.wgW[Sg[ϋ-M-|X=~GlS<7p{|]\u o_Mή]{&G_b倷+v?qƂ>ǥ|nӔԚ}g3ZE,ߞ\l?ܾ_ w~ߔY(td߼=aw{Ƥw'ÛOŻ{ľ׻~ssxS͢r{՛˓߾"TI8YQw5_ { '1=>_ÛWoҼ5ZolQ^}svWofj]ɇ7eoOgoNnw޾9?7='}goz:~g6N|{1zۛSKں4~ZYӾZilƑ yg]zaHƾ|g=ߤ5}fwmA+p|g/ޜ=1qqXН^-,yXTy=>T6Sɔ\\<`u狻n\s;Qśp0.qs{̎"mXeHV" pKr7'O˯-0inFW?|{r ~|{r<6wzw<<\ <%<|x;{p3+ohʚݼ ܤd.GѫL̺#8>6%`9+m;NN?3[ "̨ues}gq+>x78ֹϷwwhw#d~%2oq{vU]mK/wK'}8v8^^]w%̶m]KIa^e^.H;a^"v,MG?@A{\o'yTU,Ӣ4هc2ŝ[ uN}oB;6xWo [5S.Ğ6B%wIq?Bю=o6 Nbd#cxf 9ON˞6z{񏏷Y)&K0؉f3MINpŹ Ll8gCddWމ ?I4c'ۢb'K䟠ᙚ^)|H?v loDәfaGzjoR3U|jd Cѕ}o` %^b~^Cska(SY>qk"+eD8|;4NRI{G Êݪ"[dWˑolv$aaQ2S8C`_^.?ݯ] s[S_o=^j3LjWE~xCиTLڹȓdw OSm닛rLPl{w<Ӕ5>e5YE.okr?8d[.={s#]0텟E?>iYb<v?bIdޫ6Ꙅ; G iWc/X|ExգrLQ='i.N&,)lm ;OvG.wrX1\ۿ>Feľ?hSNo2Ym͛H #qIBf`\?nJ~x喂/HE!)re 4xRBuϰ|rK WY19ۡKR~ˑtcO1N8t^]B;]T EO/`Bց? ZY& u("ʶSb .1cϪqٳv\) nQpH?;yy4_z5ʧ}Mfk;ɞE_O_FPhٟ8w7;xI%a˞?G(BayLT>[ ʪD_z,z֕\EzE.qF{*d՛x`Q&UN~"䁱W<0N(AVu"ϣng7ɲMQ钽0"{Ӛ.2"+^|O,#-w0 PÕG,bww9Ct@Z;Wڝ,GxK<87OR|81zչ#:lׅ;djmӱ`w `K{΁cvF'|)۟m˧z3toFWkM8TI|,XCzv64Gy}nWy^ZRrw{97*Lxe56ιތ F\"\G^tpz7'x>-.9b̏}< F0Ii;pmQtVatz8eeǙL>g8kI w{ iI#g˖wn7ѓ8WN|5(3aDfޜm#R9Y=Vޞ|"β;ssT iv' xm < oWcOSc^l^7xeHnjChX<<|)5ȩЌo'1 >`QJY{3u뒑rc")Y>s Hgۅx`e|xZ6}Qd' -1zm{ã1ؽ/ncb.]Wx"sf[<,W!^|m@׌PjV>XWF5f_BuQoܞ[|ݞ.ADrʴQ`8w{X̅m0ZOS8 CE8vr P%'1^=:?gCw?s>tp6 cB̟rG!@1CXpa{7LJ;;"|a K$[\-tI_܄5{67Fӳ囦JϖQBn@|waPTPǛ%‰A2gHi>P+9ğ@1tR&P_0[rt1?.様)gHy,뒷/2w|酲%^8hjڟw8s]~ [?G-{N)}Qzy j5FZ~Q!8F]QTNOz;gOi~-V[ŝ{gm Pd ;b[_4xP~yLi1iu*Axnk6ggTq7ۛ;d7]bI;J'W#ʗ zu{.-~}>C1K~}GmassJO6+9EGb7Z b>*,xۻݭhbvOBV ZOsss.i4giajt@+wdfMeԎ*>m٘<|ȚӺ-U{Z5D;6za˾5)ݪ.RVieHO+*/G}D.Fj y2nN۬Mcٜ-XR,Cd&5xsui}@Fi">ԧiZkۚ{`=* }iq'VV͎F]|r/2k(섞;gӤjlqiYT).ol.yfd#{BncH$1=[ :"U3(NEvZ^-lZ;oӬ>NFuՋ. *xsk ^У2;MK;՞4}Sښ۽6H1:~+^b P$Vi `*=h M$ZnyAlٻsyǴZe2Ҥ; V(/FUSKlm5iRɑ Ӭ¾go)iږ۶@R^/ă=Q%%0f-OT|j4vo.Nώoͧ̾јgw7!қ)ad+E]P4Ǝtof3 s8ǵ98Kvpy|%,.vKF3٢ʍ4&1SLrWM8EU L n75`}xF0VEZϚӺfpS:I*ǁ1S_DA{im)؟S z A/H[94qtx2c'gyy%y~>ڏIMۂa} tJWIx{8 0Ɓ.LW`]ߎ&muKF bY~dlfa'+m?9[r.~**2(DPJc~45-C]S'_:ٝ*>axHsw`"^}$)ݩCApo_>7UJ4M뇻GS> 9^@ !} ^mk1Nv3zʠ)6ۀD?7r%_淓dܝJ1Aat5y1&_2S װ"9{QaK$0iiG(䛓;c^3x-{gw=\nW|dɩ͛Ol?!V[y{ݞ~)omvat:Dt. qu#O&ۇ‹qE9EWr9l[#.~GȦu>0WCEr = M=3EhB/ks@IGm٪=xdXz5M HDpqe~x,-f7$Nn:{D `1#E 0;@O5nFgdd60=5y<#o7xrzٽ+>]齿݀' [WǛȥLQlJx-F<|̺=1Css-#gn2=CyFw6F5p K^@ "QVU)Ń$ћqΩ,)Ga R:"OQLQ0hƳ,l;scZBp>qݝP}>1N"1o" 䖝Qĸ+%w\lv{ƌ"4\bp>&7%'֌= (>Νe] 31,z=V_!{gLAmwWS U</pN͊#vn.[0aWcv g_d< 8bA2{rHGN}SDva[{@$$ǚ jQ>+A(A:`у ^D3τ}w~I '3ƗImtdR2Y/r K ς#'^GM'i۴ԱPwjoU/ݻdN!bη<⌫w PyHQ><|qBD" MHvt T<^gsS?$A@/Bnw1;>宻ؚoM&_e|4<3nc#Ħg(x>c',)f[yL7q}*NgQV7cF߾l | ^R_:[Ԟ ?5_~*݋  C 0EG]yp: b_W;ߞ !^3ESh6 |56߸ V;fmUh{S$mr?./*)?ұLa@;u^2xy+m z=&}\SO=aIԏ@]sEvaObzEG=aj<Lx;&T\{zeԻc6ԷSn;/DW'P]8ȏg\!(@wE:`އeO|'sC _I;b_3c%@mv&>©Kb_)2rB.]5%{Jg lo9el 2lvI7QŽCpv0zWMٸcLU;DB2hh&''VFghA,D!iiJYQ}i^/ ?|pxFnHڟűo7cLD9r"b;Etm9L)C1'dKO"X9&ڴ1GSB mR 㔨Omʐw77n"Tb>m|Ӵ^9־)`m4lc|m;ݞVw{;eEfb:vJ E-cE1x?#f3匄ٔДJ׸Dgw{Al c"]eg6Ya]Thf"IʕM e s:JuȎ[=l|:jN;–&?<\k2X5-N7cs9Ik7IT@|ȶF_HW&Gc: N- a1e1Vbf}҅Tn[M=yO܋tHHvƆIb3`Gwe[|xy /~5~ߜoGV^2 σ5֩u_54S_ g1 dO.N~4(_VųL|C][dmLE:(l{9(Gw=r?k58Jz62\E@?'|sk,1#AJ6m&Y7ABeᗙ1TCy FʙĘ6 _jdJѿSN (N&6DrY3\/BqJhn 3hnAvTv0fsW /moC'dxF|Ď\$;l ? \In{ xԦx̑ C2uw,shrn͗6fprJynx$T g1K賩)~|\QP-S@wDn0i 1E̅IѿՕFɘ;'G#il4IK)D"}h3[;WL>m[X,0-=Mt+-vKU)۞[ղ1R۽)}M! ~ ⠷Dfdѐ6:mp"AY`\҆Q#Z+meuj#bz*fߍ0ev-KO'ܬ]MiK 6{J;\bq ¶i:o궱N R_dۖLD9ddwU*}޷y l;]l݂. )&`f4ߖHT*s#O̘R\㷦=,.F8A]Rù@xes^M領Z{~姆VƱlk4,=#c1;n AOͼq'ռ ^ %>@c/4vPn =9` wv4$;2mcdv 1o`t:75O wꙴE@1hzB$X:- Yd|~0ݝ<7~)ӴǴ}晌;gJȷ>cSQ7!Dc^/N˄>X f9hX?wǬ4- ǧ?BNʞ?5 (OQeL#ٓۿ>~Y,1wF'|AL+1ikEj!izM&QY2cCMYzq8`v "`:eʞ򏐯 m&+OXXIS?WNƳIN@?YrOmiW*L s7?^qLZ'vQٽr ydɸPLd\k\\ks0v?ry YQJ$p>0.8>c>gX@q`5Mdl/{-tGϊiuI]@Ocx[ИYpwMcgxx1+c&:˅7uz~uN0XgEz| 51y" c'΄ a<LvS@0G|GB%xIg\BK0{pƇv7KUAPy.=`l=-(Y+#{i|9wExe?.Nb, R5X6㟦0Ƒ:n*4*,VUL8 T6G A_ _~eHiv};7[pԮK&Uc9Tw#um(0HTGXj#hvDnk?ᬎM +pu/"Z/H|yoLɧ;xs%)O΃`:N&JN.`# w_<@͘7|}!mCN~!1Z<{ܶwV*HkZGoּ& iҐ2;ɯacnO֛9C=\(Wqgb. tk@yĀ[ I?A?ـyU&i?_@9a^)/Y)FL!w{S<ѷGB1v p^|ÉJ|U GʏcR#T|{xg![H30LpZ*^)jlpM-{fr)/@ *)eJrxyXmzէ,_쮢9!jagSrmNoج25AEލEC *9_ W" Hъ!bͷE4e2OoG`S*\ jtYMh6JR.z,J"QUc!b]]/9y)ny Jpp1k_<"@{uD`?zGD^(5om;b@2A.cwu 1S홹pk N'OSV7(\FihHj | E$~z'AR^3- ^d6qŴw_ |SIb)Ӻ*Zym.TqמX? 6no&Z0pf 8[E~7x蓣ÛHZH Hɔ/Ax "Fcex@IlJ\4*>u'&tIQ'qEG:?@|">Bҷ~.yT~"G6 ca3<#8&v10ߢpE2 ѱ=E. HNZ4a&4O +ͧ)G'- VW`q;oAG=j`a{5 n\_dx:kbrŒXL7:4QGYAcC5U,ZdpԼ]%EGwByZx0nT)'_@pSZv~{ߍ e= |G-bgTp)>"چ$V:o" uϕˢ_8XiEr "}=oa](@yoE,Ezanh/OhU\CS$czu@D7 Y3;Z4oן||1i-И63ocۨf)V&$a~gy`sdarXrc??}n;lW [>WےlGl:gǎ^d.cf컿Ļrfiԡ,6 H=%7+x{З48w$./XAWp*?9jR҃Q?G*tWsC]p˱CjYKB.5<{Tjq|AO# Y&1y|C r :{ON>0ݹ{2惿¯#ݻ9lѧq%Tv;r~>8 SRP ż.b.2Xx]4q`uH:\/_-o K}JIw]Z]+=6\u_:%B}fi_ńB_֓&W{ջHdv 4|?HXY‚33`E) NQ!eZRbʂ[ d.d-\!VaLwn10+_(Ij1?p) }qyw 'gjG#N蘙'gt"V &AcY~S}%T RˋHAst tgCPa+8iSz.澞"Iu A!)5'[TVCy/g=Q3臍Vtx:=qӓYn^TGEeG\躠\~2ش>w^PUȺF;sey_H8 jyX&'tp$?/6? t`8}ser3 ϋ pT4/=̙KLX>.r'T5;`LCo7B\*Fknw >Vadazkdi@nBH$gWQVa]8 *@)}D sLG.U!!m-DR@h`ra>RgHT5|TXPIn47njfo/LA;q n, VBɎi`ixQhrP'O;8}ϗzl~n$ppRo!5}RiKaMİ"=vk\GO'fN}n~q;wa,`ƊrIVF;VIe@5" Gxˍ͓Y ְtӴPB/"uYEP2(jCgB/(Q DK_W(pxQj(j2C2V[oX44mM Z8th1O!8M"֥>5|iR^1Rm:7 R`'o =y{Ih|Λ<NzDt \@EGN vG矼`Mp*BY'd%ŬG_;Ƌݓ&> me:#WWubi3707Ƨ⬧8'>kg}l I33[ѩNVܯN\v7a1G+20)K9S :3hLN *MG7$&|d%_i:J7ge|` ~#?,ȍtH`'Ƀ&N;Q'|&;?20f( *;Hi][9w~ =EKd[2;E#tMLu;9J;la"I!nm5uh*,.PPC8'>5UҼ=-D1'4Kn~JrAӈTWY%eA[p ^MD( b 34JV_Q2.^M,%AZ FTm7q0$4ghUG8|PX38)4ZaeĐfRN`vJd );,:^ĩ|ݠ^QAAӎ\:QXN'oNQVK<%f+4Q'Q[彩p_hHq*sxtM<᪣i( Fx8{վ>A7}vB}XQAiqIk< jh7zvE.[YSn#kRplI82V*savَ(PGM Ke y%tXω`Y,2SO;CĆCG GV1nC9~%e;zD_g<܃%`C}-\gqK޴(qg}Upyh +\7y}lk\t+^I#h 2AIRYJ2hIRiU֛9vzFY;MslXj\pҊ.bva- \boG:ȩ&ƞHb7Ҳ/A%gtI15SQ?OOkGhvCRTGک %|'IT\Ɗi\pȗk~zWVR0ƩeKE4=AA/ KЗߕF5@x&^ Z]mGfRQ!.$NVBR[ʊzKC:oPh$Mpm PA cQb)>yM:k>י"4ғv T$M @b7uQqd!(1>MK43DAaSZABb8Err[qgG;nWpLlq >T]^,mm6"XioLV7ء#hiG~)1d)wu<&JWXW}ƃ5"4iV n`]=s纻WeUHq=t3D<Ŵ{sLYsx/uqău?XጌO(q=!ХE߭4rNʃ@+6ZN_UV9v*;aLN{ E5B"rfHx~%~plӗ’ e))@ʷ}Ѳp>۾_Dz|jP2pYOrG2%RrNwYkZ+Ϟ#h)*1Y` .bֲ|.4wp%˹;zGBlFQ覇t(ȧtātīұtJ\ҹ?9;:s|L۩$ptKa|,PvVY߰]fA CS<:k卻6?*`><~SIMT<}pנ4*}xp J~p%3xvd5@Cں%U>hl0_IC)x7U C"n]pސ{PpKwgvDѭ;C{9A`kW8.99sk! ЋtZP- 5Iٹe]I:NC@&Ym;Pj~Iiڥ..vWRSPb]j7db+f酡)`(Kw7ɓjo{Y*ʣM\DDDDǧwU_:n=M @Acyz*W*}#ƍzS+4g gVȸ$89 "ZKVJB'ln\ c3.$$Do [RS\`to;2(+D`yVq8M%Q]_ܻl!:#suN5 ~RuЃ Gד.8~]/{9 t ,t녚LU48}P |~6E:M/:ңnEz MaBt@7 ]WYCXB+rYSOa$l Bw}zr@sss| 9p4#DuN^]~4P$}7k'FZh E@ :t (כRrQ-J,%,He97j+8888t*־W2`wF2hHR4[ɎL"\rɎ}jvrrns1_:}Xϟr~Qܝը*2_M}pAtrUʈZ"J?.+O~\$8ANW_AwϿ= >-OtvxC;w]!w3bگU5}tZ+wO?/8/{-% /2_ip+gonXP~qA =?/'z5]]uoKwjtxul_O٤[Vb wסJ]%E]>%Z\n d *Ml^.* tW鮸GU G:lkR=ONUcPB Nlo=jp͏;w 嶢.5pL1/ş.اXjz2Op\J玹};:.,8/v#q\Wttߛ3SEn23][hサQ;.hsunr6W᷻wY<;{쑢 Z8~Dh.w'}% DUHQ?wvN9^ZON P5ݗEw脇w}YZC~ܟr"&>>#ywv;WXR;dGVzt~{EW0߄y5vBplOlݭW2B$+YV>TDZ>#s^]Ņ汼e2tx*8z8YGD8zoD{vcdĥ@XY?܇wD3l:N(=Ua~G[8;jӣFH>7!=@w_~O"烜*[w P\K|on5MD-U }`uWgpV骲p㢻 A0p]E 5ǡz_vmD:l2vpaMx5]Njŋi˯mw^]{tUfآ, ;y1-YО)t"ŠϨG?_~GFCfCyʾE#mN˟/?uJƕ(=}~;?:7B~w~WTtRP.34{ 7$ ЍM$Ӫ߄lOݺ#*q.D;۴!ݑnǃ"ْEs&8?"-lЉnk4.vx 0mdwyԷp!?6./q%psg!  -ݽK` Ϙ{s.x^yg,]zwPu9+9_u=-S[툳8$Kஎ㠱+>7]П' >Σ[y`iu8_J`oPO#w+?KWy\0j0{hv ؑVe% h{hbGzQ=bp{L0;gkt9x۫[ߏb YlA)iG2MpֹΌ@0yxC2:7nYd1?z{֥z_,5a^Tw݌ug@7_.vG47dv[OJSSʜ{h3>?uoGՉfw_']+5v* C5VZ] KDzwqyZ׻ť/&F ><,m4)n}g[B;~YHQYs&ztI3XPPaB"AH'sQ Nv?%gf/n{9R:,qఈ+ֲ:Z7-[qv6?s%LCaM3$wO۸Lw8r8z׮.儸+Nx5H\9GڊׁB#rW6|W!3@Dp0)lNz-<z>i38 I<>&0#r޷8 #}w4m}\? ӯKFzWB}Z"达sνw=BC|gk-=H{2{QśWZsbtq2+N~ S0HrQ2RNԱ^brB2 ^s7ݏSԐWxB/'Mg&e UE.(cu6Xoe}\aڏPhI\y%' L?wIKčȄ4Qye~$b~i/C]N7Dۿc_>~ӫ`cY!BCY,iy~g2nvU.<}WB9l! 2QZ:r l)u`ɻ.}E}m7rf~(yvx&aÄDO8[݇5KrC\GU=L-7޷r7/ikOe h(>s"-W-W!B9i+.A;/2ym/6P ۦC{p7:*ޣ*`Dv> ˓Dɠ*>#CDڛ=MGبEaq=g>]$v]g9~<H?Nn쿊 2-Oyׯaj&ly@(=kZyr{^-m9i\ 1}e661+?о^vHwq i]vj?;jB;N8dݥkLn@]_yy=}D淵ֿo/|&lcA(:g4wG8BD{ D޷18Kﶏsnw.+12S<|vE˰:wns~ mb?bh$S r>\\{s#/ [Khur4Nl%*~hmf\C? W.߱;{;K.(M5&}[u>[S.[r>WKnu?Ԓo@dwP5嫣CNJi๦͆2;~KR}9 -H6yT`k9a3hBN B l(bA'zVK~=A)%J]fYSI^+ݨ\_vjfj(ɬi?Hǔ({b?rc5)`af$ҮJ"-t^|dRUtI9 ncDdP%sؖSM)')GKĜfTY)vF2Ab.4R~ҖM␀two)/>9dׇS=IC gyyE-(TZLOS9kʡsϔ\)~'WRVۊ]V?*ѩ"%6ӦSʵ OqKEM Mfa# N.}H@au F;' z ğ &7ZZp k!씚@Y9XIۍvZʹcnz,a7 iw1OsQw)^Y1<@u yY!MVbѼC(e4etA5%soW;YXo CcȡonX$: ݓjOrm@74Ls%E$ Q"U!̱`=H;A_+)zJ5GhH/¬e?Deb9(w)f1:.: D0=]k:GO# :јSDNUE\ qmD((Mh2&}O'c>PDgttjL\s t@& OIztʝLyK6竻J nXBt;)j/vҔW"b܃c馩n'ּRtcev; Xun'Ud_ov.xiF8W7\ [FYͶq~}7U䪣Qk:ewSOAbJ+Ӂt^7䮇KTnfd{mUWeN(U&A#fgKG[֗IH2)oJ"9(r;o5ttI`ι\9ȋ`89IsWCK5Y9#'8Ϣ%O4~VH-jmjcT6_&@ (,̗ һI:؀IiK#> IOjUŃAR:T3tP~  lܵ)k)gL0ZQ7JBܹeN}.HߢggҥMrm a4kR' IE8<^ck꺍=R&H+BB$>OrҋQ}9(lIY ܖK'gOl6@fX`^~ :Tg13dc()tYpLPPR! KzKK̩\(Y~$e0}4̦7"$I%QD`۸ P7Fܔ]b~KBw2KKICݤT_tleѰAYSŴL"`.Js')[(O M|V@ -8 hޯ(,M)%O? tW~СLy)R]O:d5 bITWPxi2z>gytOsb,1m#rAuOcAUPM|JjRM KMEM+85UO׍O#.pk!qp7ROv:pIc;݃6b{\\k~Yp\ 9B D{Ha(]~R;JilDv@3(e=ZXKTZ*Ozڌo_Д9_8RkE=`nQ(wKL&Тj/ewFE֯ Yqw7\=H +ߞ72{.B =.IIWi Ygg@ٿE#ߙÞ$iy0fȢ1]Ֆj -9mpRX9?Q{iF71F6ټDeç[t.*<6Gj,8oM j"z~ID@tds8Íǂ(5up`[yYMXK.AĨ>c`śAe ~iUrút&i &C|NNiviYc H;hVB]j>=X<*wzX5K<_a4%;i{a]˯^u- aaoPe~ikӷȥ-m'A}4yA[\J~AKu@Hu)o]*AwUBh*a{/rGr_a-9KOΦ՜qf͘?9 y*]DD$2Fצ]Z1=ͰFAzs̪N9ΉA=֔< {2sF=XeSxm`^ @@ H'&GƥY,`~7FbTޜvl(,J*R"ʏ2&GB9-h ZLj.ʲPwqY;"I:͢i(a!1 1-ڭG6vwTK%n 89җٌQQ\e5!蛢+(VC 9ӛI)2DzUva#rimzf :vi;l&(W"{- ǵd L *xIH\&I%M-QO~70W='"#QV~oz4zɛ&o9 [Go\]HN2=O+?>Dө~3 s{WE,7tWȷ?2noo:-F)O:b NU )dwM`KB!Em,LҺ]ߓ\Q>t/iP yjtyzS}(5:̈4=,XEɗNWtV9+g1qGfNQm)XgEkXԹiaIZpicpE:,< $C;1bIN.Bo+w(Jn.UGc9T(>)$J5$Aqb~cRu1/Q&&c`#&I7͠TSfj^j$HG!1/prTE,bPEVFu{w}+]j-/ )R4|#rm1/S&&C`#FfY=ݤX]plcѤAY#\_ 4 I,}H_p P3&d"#bw#ӎ" J,-Z1/W3ib2(&Ibaz5MZL%OHƉ\L\#P,b`EŭEcXtϋE Ytb]&zW6t5ǍJPAӯ ӳ77;ʉEhm[t/Ny6;|E:vܽʁn<{*%gGnT~_^iguRgSΦ,bYR"q [:{gV Co،|ͫ0P⚮X~ %ڠU4bcd *@ntG7'4]:U)*-u0.TKHҪ ryCG ܧ#_tV9+уGd+7\l&$}wr}Qgsf<Ɩrվ7*O%q*ס_k\tTt+M8'R tg牭pw5 lgЋ XЫ"D]~JΊW|gE%ڴE"[y/'2~6q6Q_֐l Oc3ѪȀmWn~Aa&+eFעM 1fٹ\^[ ISy%(`F*`4%Hpz8;+XĜFZQy-uV4Ul78Y-NЧ'P֔A4ddOjjjk'ɣ E'G^~sϬ \8xί~|8t]9Lnvx:=!f⟜\^*-2%)de :8?= >9sQ fqΦ|8?8 I9ԦP@KAG$9YZy@s6pfMY3}q[&G *|1a +L; yb}ҥf=!>8TqP:rt6el*ڬ[Ewa-ڋ"It7O,Vp4#VvZ.;vv*o9lC#ț` M2|;젆.,*0q\|?P]Br4b*Q.yjY}?8Z ȯF}fmy͔MMYwf.m U8o I%<b-عnCBN^%yPD);BjC*8偵TM^f[3TnZGM*;+t[Pn:+*ݥˣ`Ap订&ES*şfX)RʰS."|{GwLY2E9_a8YRJ^d*Y^.t?L*Z}Ԡ\Yh&|2r6{lVGlٌVMVX?^aV;[ayr+vj'+CuA3R~dP״OSĠ+bѼ_X\`塉T2+A+#g2-p&9"hy`M:L%}O)ǖI<&wtv;Oۗ}rEyҟ喟;O[E_<-'?Vl斾F4Y馛xS+ǡ5eiդzjǑơ~JS3LBO0 =54Ԉq#X =0=S =5jz*N릆ĞiaqveV0'b(WӰ-bX1,wiY5RuoHޑL{IdqЭ\_Jq`/dIiYNz3*0Uu=#%[.0mQg\iO#21,̲Ӏnb.i|F:Nb37ld?,9(*(]95L ʩa&qb93L(˩abY&RäRn)&1ҽ$A2B-(\[ +ҌB5>pd8@2qNxȭ+)vILƦKr[ ˊQ߱WJs(b?!kyYGn,?vclpcZԤFy٫@e>]/>:.KWT[+n8Vywno[|xJYkpj t]7ݽ7ѧ*Dvwzwo臆6q|iw^Ϸ7zؾ<=Ww'/ч]>Q03ЅӮťB*R黻^>ݟo w텻 ".~}Irmw}{wdqׄ_v㝻3];=IH}ytK9 ב_ sq|sC߹n"sdo9!OWD~}M|Nz~?%~o|__)]Mo]Ae? ܞ߽E>if][3}ֻ>/ wkat;RkT҅ev ؅{Wbzؾ =ŭN|wA&]qb݅Ħcx);v07?DfқUn築{W {MOF8 =~)u+G|ypEXK<Įr]âׇRjAcZR-I8Z_.7OŷIľӇ?RwDwpC[7߄ɯ2{A8[!-w78 ~{p^s@{r^ DN/#™WWvO) qOzt=w{4ቌ (H<;~cio5b߽vW!s=}}uq=}LB'֛`\boqL$)^EC.bǻB~WJ ߢ~щL{C|z[ݍw_a߿{~$p˻cZ6I#TJo4*7zξih?~/&\Qk<о#|@;&,-؇WD抸}p<~XTܓ%? ~a}c,%bO/^Q O\?OzؾgnV \q"> w!:;rXnwODxHg߈"TC3elz,F2>NVbCg$qGpAl%:{ƉDS' (뿆MЍw \ޡ X%Dw{S48 5vޓp>Ux ]gnx!RMw呑;ѹ7 oη8Nm|MɾM uۓǏwC]^ƱwIFkT7.,tAolhu$Ua+_|"=`ѝnTWȶb}N'4!&9VΙx:Ļȁӈ˂w-xeM,x<{̏Cu6ǎly4ޒx92ȇwJpZ}h=VwY|/:')RCMιukl ')@&.1zͳsVNK}؄Gyj$WQ Nԩ..Ex )ꝷ i?,c8aks7 ontB>Ì=hO3B Ao3qZ]=YX*j?b\Gpt .8.@d($l=/~$Ba^04GRmz1tz^02=HV R2#D2GlѸ`+$4tQ+%3Hf賂ABM f,HCwk/Ӄ+5 fDX]ih|Jucudq|q *L>m AS;88d/7[CCnnIF_yj8ٮ/K~uS_-bSNOOTbw#:{pz~=ЎvOܙn%̺+S}b;٦[Bop|W[ *,OwJ,}"ZáA-q`Ӊsܕ'8|vQl(wƼK.{>f9tm:ǟ<:t93֫02}ztΐ^·ap{X[/xp>NztՖ`MwNaJ}YREe]G?vx襰,%hPҁJ/A Ukk\ç2VXi?)R9#[*cYzC-}{K%}$Go2oc 5[cYzC-}ZXRK現>7Goe [fA}>& # y5ъzRg!Yqrg!Yqrg!YqB)> ~cOn%_ :|Iwu9ߡmbC9ʷq'=to<1Hk@΢RS"o-҃'=4j0+zDWyٴ3ل)gS/Ãi GE`姑N ˤ5V&oLhMr͈7 6$f7Hǝ$̴(cRj$1lUHE6mntu{$P\OϩTR8O!xοqk,W5ɍ5-َ-śtTC~+גU95-⹞6B;S~ EQxQFqtno$̭֝RM(s|ֵ@ `޿(o:q?e'r7- &QW_ɫ 9n9`؞Ii'oFzgT}+r+͹ߣ4AhUiPx7yPF@VYq7q2"0了͠xGMbn<拂IsUAǙ-2{բ]ƤDoz'Ds;rKMD'|I!{RPhdm.J'jT=ϜkTF`ox~ (XmĜ6RHfTY++wB55B`/R`ڜK͏ފA dYnrvnM63wڟQMfj8ݸ]ȽΛ &檂3I[DBESF1gRUʝь6BlϽܫ e@{FK~{X63#LXω5L wHfB@>3J&wߢ`r#? ,*.`7[ 6lZw⽨PSVfn]nA:)BsW!~6{=D*];,yxg]7NoJHR]}FTF&(۩) h0WthN#3-6 :Q%śQiBcE;x̚t \D =7B]Y{\Z)mÊ]N 9At6OݰGȭJGI)_oA [uu #ktyEos- &D󃰊 ld=.MO(^JD(H6 Os=al( `*>ٳOa-W@k7ԥmDF5dw_`IALtnQԲyoR7BUY{&]Zj6Q{RM@w0G4",0}鮓s4+>*!Uջ{7*D:sGגs`v`;>,:.[`Ϸ[?ktJ7BUY{&]8#/Ϻ@.:+[ 0sw  d t~@yhM@k6Uu*M|C4c2@Q0AP`*84Ff/4[ 5luNRMQ3w]v {4*S|b `h+)´ ;b,S,yQe ~ˮ/xUy DmQ[- 0nͨPWVjj^j=?82?r Oh@ݍ#vڊ!4{SІǞ"Іch1p m86C Іch1p m86C Іch1p m86C Іch1p m86C>ІO'wiOg+@|C:𕻝K;_)\rU-FNk6= aߝh CbGҼP@oѯ;W0~lZCl٘峉\wqR}=> -DP-ЂUNha}6h֥B&oL`HMY\۩|:;u[ڤ13.C6e͗#(L)Șr6T 9oenfْnO)qNVRX&*4*>'/7m砅XʜJl6lOni]U%qa,i8 gZթvm^&5dD1nqW~<~vQUڄ(|nٳn)=aI(RZؠIi'}7R]Q3{\jzԪ9b11@1 PaFe(beIE~TJJDgK HMEuMTWTjl_n Qѥ@Qt(hC2]qңo7 &/(}"oB®*@[[I&m$e6z~*ND؏fY**wF36C.SڠK)MǦIGc m ]b77״" 4R5QLzvӤv[&W1'J4np2Oz@~4J:DgKOfTZ*wF46Db/T`ڤK(Ed@Tv 4tNX/]Gi'*SŸ)^̐A,=NsM̻\O#tDan~NvS\'66B,6W=6hqI{^[ɨ[j~QfgvqZ1o| |0>64h4=U艸ǂI=kzbG}IAHthԪQi'Iil#6D i.u>i(8.@[.0=zھK]@mlEĸ PBi7mdm( 5=. {Ͽ' h0VtZ#MF ufTZjH 1!"[*0mҥsm`9;*D% ⑚6E#Lsdߥ1h7%%>ъI"J[l~{PSp$9m\w -? :I%śt%rgDc3Dvt 9w˚1@! ipcEn"bpVeE嶳3`BFv2$"?U%Gֈv vz@TIz3*-U;#"[*0mҥmtJ[Ry =i h0VT#- 6:Q)ś^mVAi.+C6;3Yu }Ś$z( ZߴEŸPB7% O;5 7 BM :ez~cUi=МGb%c&A] $Q -6zjcS!eq |D ˷0([t${q h?;аS4Đq@k:IAHtpQԴQY'Jb]IS)"E[y f L6  [L20ʅzv^S"b(bAb*b*` >L 8SS$"? 5% G̥VvN{@RIY**wF46Cb/SڠLw~3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&3&|.y ܳOaO$@LaƮr x)Od@~AXR818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181x<'lLr P.bnn-#bgL ܳ12&W3ʘ`Qa`]_ooާT րjJ|X\ EzSnN#iwq'icz^:A,sXܡ fPQ]"45>FB B;RNFJTZGl+=~2cZ*S@6b8xz>^=?yzx=>NE!VI ˮOO0>^z|{|uEe?!lǧw -5[q-6{oi8n)aRJ R("RS'GQc DC}=[g_N~zw;GhDK*kZVPpܸ hˮ33넁Q^uou' ??}]8}1MUG\8cK/z>}]]]|H?qW+5FUMavuu!K|*fr{oͧf.)>b E ( TyHѰ32.AJ7ЁP< E 2i@3\p+u%ivVX28!sm\[  %IDM8]K%C-x{`p=?0RXU B&S+j(I];OGtZ +8]+EJ1v,TtHD%a]/CC`D /+e7TB%A䂞 ΆD;(:ՠ7(F%Xr$d;'˭IkBm@ndgle1 Gu}Bbx[QBK[؎āvTxm3 k~7o@ʼnyMP{}<V;Xk |oW={I G=oFGHqD#R=3 >^5|P]Yh _t WWaީr_w>Y.p)g%2V*c(EK J˥y1SJn0@A9C6>@)`ZX9@m%xZ>@|C+ AMKvmBnNPlsC FjI$Tt4 0#0eEWё&IY1؊}oSLq1a(nC@ AB1{/M_iOox#Aя." zo<گ2+ukD@ x>׻92rw;,ݝ)'-|sqvJ[?=7:1z>[5a͞*ٜE-{;tPnv!fsA߭ _Ɠ&w~uïTX$`Ω{|yBՋ=~n|>9`S\ɫn=ۋݙo+%N*oI{%(5ҽދܵ.֨ӧz~]> ˇӫU&*x{^(ݝsKJT*1B!j^!A7=4lM7H@uQ>]|vAul'w^[n}}DnQU3snrڃ8|ghK゚[µ?a|.z %LZ&o\qz ߜZG(TmB - +/"t@&ppQ"x "AWE|wݺEqǮrF蕯 hm"oKiwCF܊L\9H[T}a7K|Uv_cg]QtyJx/V2@;v:ةȓc^5-HtBvӃfRԂFƷU#Î1[iԼkh{ ߠD3A#&h_Ԝ6]1`߽a=n8){TWOlb~2gNuSafQ_t[-x:61A tKQ"<s^ٶn C[Ig蝽wNoУ\a{8#=,~8e b)}ʏ@̿M,V;"t΃JZyHz~w;{OSĹw #ɻGLߛ}6z2y_wԣ鿎c؇]$e.߶i#( ] Р+:B yHhwpnVhej"smvza|O?ӯ(<ÿ+8 5lk.\ˬ€irsxz&)#&?PWRJ֓ZW l O.,ShŒ- !bG8Oů0q܎#K 4˖$ 9~*-cnEʛhFa6|g㴛 afq AWү̯ k(*H1gkYpXtuZtׅ:wƃ:8='%52F}s9y|V5q,TjDZЃW83fjyXՕaē湸˫qP;}GՂZ !$υYyzU,_{w)8Ե9dd L~2~wN=z{ak,P*,_K|= /_…v?#a/00l,޽ѾskW;8@hW8=wkA+g<"{ѳ<CUwz2 /7,4_ .uιW(@hGw|&w~oaG?_EyVJ3ZKWAM^J34aKɔhL 1URkLdLZhHgE.RCVRn^.W;#'pHJΪj=cPrYp&͸G yap`ڰά[@}_ 7ƔjN+ѣBҵ_Cbee*O~Vi00*qŕ"FBtL8*iuב֡Ð6{U|I[x +9 4 R zpݺ1;!bG!&9Y#GZJs>p`sE\!Ԓ23 4Da|Xxvi(8 }e'YYkҢ"qkݝ]РM_]m/z~ 2{ uĝ(F@:~6i;/U}fMzzjEү׿=Gn\g8ab(.W@GVӵDiM\iVOYhRJ:P¬y "7pRrlir~~yov]oz/~/h/d_wfiaSӤ^=lN[}JEۆEەstw@OgI[2FK`P,!`1/-7)I9Xi?'(8pz".Tid{7OR# @!,8p5onۻsdidD*U\ CRᵸƓfV-k!Da]^'}"H9 pXX#;e ~6Qa) PYβo\>NOw#K4ÀPv!ovuitd#L <{[H|{o<,cRWjBy>cK#ᱞI )= {&DHijNNxQϭyD^;=}fvSj:C/$^] ;G_.)#[G_;/ȯN+9b'ؼraz%W2N4 11,"(-k}1qK-Q<@^99tv.7, s y; pz`<Us76eiץ_l{;i{1mT)m4naڪi=qnڨŴLwGhx]B}B`}kfOx ?90§b0)Cq?.VbcFl5)T>aE֋9\)r:+Mξ.'DYS9r:+MNUQPsh4u9m&(4mru|")0hZ$(rʍde<f,A+"qi%hD%`` \fLA#2M>pFt'`4"0)8tݺ2uà۬Pn]ˆ^)rʺΊj(PMΡ.PSYmroM]NSYmr꺜CoZW-h]u/+] G%hE$8mr־%`p 1 4}#:O0c  bYQ֭+tu'mWmJFRH̨6IA%$IFR]gFI2jdSc5֙m꺤o$Z$Ԁh:Κ/]0L)h&8}r(  Hl#NT!0c  b5Y 11n'R=iUr[JF^ȫ~T=#/OnFyFށW3Fy#/Ongky-ÏmW3r( l䪠Qf V9hЌ\,te=V/"pƫZQ 8ǀxЊdAZ[8z:3 k7ZgX瞱 啌W1Fy{F^Nh#fэ*F^N(kφ0Z(fy QޙuPArFo΂Nyk-p BXehE/ 8nA+ajYŀ1p He]Cь f@+h.Œ-Fy%#dU ?Qޞ'7d#ȫ~t'7Za56ʫy9}rނiwf=X5 P,NwUj-4# ]bY/ e]Vƀ1"pPƫuE3&L ]Z`1R P-`b@/x Q^+yÏjgɍ6(;0j(bɍly #ejF^N`Ygn@.h&Ek-p BXehE/ 8nA+ajYŀ1p He]Cь ~`¼1 @/`".x Q^+yÏjgɍ6(;0j(bɍly #ejF^N`Zg . Z㿀 tvaZ` 8nA3r*uZ 8pЊ`AZehE1` 8nA+ejYa͎YG?,&}9dypl1I4'tOD@QQ*GT<#*'CFHJ]^m@Қt^anY9f(v/Mk\/e?$Jh"tIfQ#$ǫW>4Afo3CvccccLt ƣ | &P;S^N:zBcP :},zc';[PLj-02o~zoonbLz鋓fLP?~L*RJt*ΡRokͳbPK ɇ Ԙ2曧ԓ2.7@EB.+R,wywWϴS͡&b,7^> M*{DzslGϥXn󜄊ri_-P7KG]/PNKeJyx,O{D^9KG\č-?^?%䆼}Js='w2$ b!<^s])Z[+[=bx@ e▾'B.iwԇ"vy43(Vu8H h'rz2ӂ36'o0FZ˰cۤՌ2#aBskz0ζΜNW*d=S&Y͙J-ZԒi"eUߜ٩ԲUjC/F4p땳 b`gg@F!6قl`AZ52Fy5#/OΆFygss"QxNws^gkZpR NcozbQ1rKNn C{nfre͉l1p He ʡh&fzA1h#ѻg[2-I0Z(fY( u_PV : J*=T( bY"Z喜ܒpwϡ\T-kRdc 91JTq{˃K^@ cSӯcðS/v\ I XǏ;Dr)N@a'=XDU ;@%iZ'EoEt xv<)M>Лꈿ\sgb2DPt/D_Sk,xsJoȻxV@^8jK6F"fG^"}fڤlΌI ץ_lz;nz1mSLH]Z~v)yyPTjg,۔w2"S]鏶Ap1_m5,, |2gŪ^-3bI +^‘u9U&g_Q)ru9u&(q9irΊmSdhr69Tm.h*H (/j2r#Ei8KЊH$qd@ Q XSЈL@O'`  Dd@ D)]nL06:ԭ[Wmrʺ.r2Jdls9uVt.'Df 5[SuVl.'DЛ690v0@7Zסn]ˊdm}(-G0c Z$NoD%`` \fLA#2M>9k߈N0؂FX}r@u ]xAW7 ;}uj_6MRH*IU&i_Q#3d#H6IU]RFpj콆0:3MR]Q#cMS+ cc,mng˪d~(/L!0c Z'No' 8flA#FRF9߈SpHFXr@`̭`̭ۉTρ}:fwDW2*(obQށw` ?Q^`0F^cՌ>94;3Â3Â1*h22s:=Uj-4# ]bY/ eVƀ1"pPƫE>)HƚY0ֹgs-Fy%#dU ?Qޞ'7d#ȫ~t'7Za56ʫy9}rނiwf=T[`sSaZ` 8nA3r*uZ 8pЊ`AZehE1` 8nA+ejYP4c¬g& #0cb@-x Q^+yÏjgɍ6(;0j(bɍly #ejF^N`Ygn@,h&Ek-p BXehE/ 8nA+ajYŀ1p He]Cь f@-h&T X- ނhW2JF^y9}rM6;0G7ʫy9}r?F^k~l'-Fyg֙۹. Z# tzaZ` 8nA3r*uZ 8pЊ`AZehE1` 8nA+ejYP4c¼+0/h& H/ ނhW2JF^y9}rM6;0G7ʫy9}r?F^k~l'-FyYp{ /`8݁]tV9hЌ\,te]V/"pƫuZQ 8ǀxЊdAZeX@RV.gzM2t7Oqi).CJiA)1uo)1F)1MN{g{uwrbK_Usbڟ"'F;D * qZbWurVj5So7ϔw!?>ߘU3Ϊ,O%>ݍg+W@>Xg) ޤ͵r ٍAA\׮i]d/}x\/PŦks@} LԇEu{w=-GzDPE46Zo{G3rz~Ϻ̀n*2yEp}~{9iS`x_Hk"/Ta{CG͒jyJ/ŧsp{6*su/Z_L5U^Rf?Lە9%SַݴUN2%Uh+suFcƹ:h,?cIqʱոXՋ|jUդxRY/sǕ3C]N]gEɩr2Jrmr.bu9%MNꂦDι/j2r#Ei#`eҴ|Iڤ6#h%`p 1 4d  x[ЈP@O@ucnꀩ۬P:nuP9r:+MNUQ"4u9m&(1MΩ1 'uVGHv FZHˌCXM FyXSЈL@O 60 >3(V<l@WT>aǶS;nw&PI:0ΌnT%et65֙m꺤3h$ڞ$֡c6ZS>eUkWp N^fLj c>9{(% 8flA#FRF9؈SpHFXr6@``gYk9m(;0j(bu52Fy5#/O@FygfIpfI00F-#3SRvR NjI CܬOZL*7_pZ 8UVƀ1"pPƫYX+f$}k/XO(;0j(b52Fy5#/OzFyg֊ۑɁjjckZpR NjnlgEŲ&Tp܀Vxղ&ŀ1p HeMh3kL843D4ZQށw` ?Q^uky #ejF^N4ά\9ԢZԂh[+.E*Z 8nA+ajYڊbp8V$xղ&P4c &  &#fэ*F^N\km_ky-ÏmW3r䬧iwf#5> Nw h*@;Zq@/P*7_pZ 8U˚Vƀ1"pPƫ5 hv<Мer\B^Bgy\/r;Fg) c煱C? cv}H C|qR;iaO 6{:DZrl9AGM37RcNũ5_ok>Q1L[oaLc~i&~g=Yb_Nc·gB-O5XtNyRޫJI_?yD@e,9%>G̓%.0&~9rEzQT QeaI{2{)>#?l{4d|a|J; ;,}խy`KluC"[Z/P.Z҇jau'os"{vڢju[NZ6)k&=&r\Eir9=dJ]>7wnz&O;ȔzWmU} 6ѬqG␩tr#xiBIVT?L[SrʺΊj(Qmru9ΊnSd84u9M]N[gŶɩr2J4u9M{]|")0K]D5YENQL G%hE$8m2 ,K)hD&`'NЈN0؂FX}2 ujn]mvٺa0mU׭[Wmrʺ.r2Jdls9uVt.'Df 5[SuVl.'DЛ692v24ZW]eEk#`AM70 .3&VoD'` |flA#BQ>9k%]ݼԭW*^P׵YXLڻ9QhV2JFZŰڤi9e2K6J;0aGIi9e2C'FZHkvlS&FigWcnljymr:ήUfC+F XV9-P pzVC/F4p0X㞱=c@D5`̱`̱XDW2*(oiQށw` ?Q^c0F^cՌ>94;=g{~F&yF^U>Qڟ #a ?Q^L3ZjqaaZ` 8nA3r*uZ 8pЊ`AZehE1` 8nA+ejYP4c¸& # & ̂ 啌W1Fy{F^Nh#fэ*F^N(kφ0Z(fy Qޙuvq H/`B8݁YtV9hЌ\,te]V/"pƫuZQ 8ǀxЊdAZeX@qŶuA=1Ϸ{Qн:{m^C:lL ޠj :~:R׾8jwȢ@̀~Rcm'S-cLݤo^:"_:iON1ybzsH1Y >9.128CTm;pO=K- a:f!{vŏc76VjϋgK}7S,,P^. . ;jƫJ~iqfo磻oq=(P /VU3KiLj,cD/(Zz>? 7+QE!9G0"{N=i]Fvs쓰d@N{GUf0F' uIRW5qtoE{rOzLf?Zױ.[2oMMǙJzR<6*F4BPgEՋ3U4u9m&(4mrҭ5AS3(Vu8t>D튳 -3)蘝e*a5aǶIi9e2F4J;2g@])s$ĜBYkѵ,8'sԷ9b坡vϡvhDm`v8ydiZpR NcozbQ1rKNn C{n*Yi9rs07ɀ2^A9$Z/(md#z zK5i0F^cՌ>9kb坡7 ي=rAAZԂ\T,kRDܒ[rrs`9eMl1p HeMʡhl%6 f"4&'°`MZ52Fy5#/OΚFygͭl/raѠtR NjIsLR{XT,kRDܒ[rrs`Y °hRdc ,uo5Z2*Y&뗨\KM@}~q/R%pR7=DzQc~&m[|Ť5Y{9U-.Z}4ga7Aᢛ4'i7ĻZOc}h8GkcXr})Fqi>[JQr{suqոtR Y-}xeJ5K'*I*_]s*lo7TU.t|*_]sCUI>STU.l|*_]s*io2& >P&K2ڪuME)0upFaQal m7PhCC:@@v;P>ІYOVSU.T|}UcF67T*I>UXi럦*g\&tU647n}LuuQ=LwmRa8H@ BP xamu6ԁ:@w>| y=C}تuL;ANMTGMʺ.$uW7I¡.PPWMuGL[/5u M]B[6IuWզI‰LLP.I8ݵ0aÀDh0 @}@@|852f  `0 ĩ1܇@\UOw.CbN9\)rʺΊj(EMΡ.PSYmr1oM]NSYmr꺜[n䜚QQQheeQZ#`"I69ވJ0̘FdX}r&'`  D (׭k}d0mUԭk_ˆ^)rʺΊj(PMΡ.PSYmroM]NSYmr꺜CoZWf'$cF*ֵYe<f,A+"qi ,K)hD&`'g x[ЈP@OR0!6B=P" zЋ69e]NYSYQmru9%2J9r:+MNUQ"3ir:+MN]Q"cMSDHDP%b4jw2p 38HYFT%`4"0ꓳ <O-hD(` 'gDz*hmFP5z hSu9U&g_Q"3dC]Ρ.Tu9%2ߚ.bu9%2޴9%0HP$Fcl}(-G0c Z$NoD%`` \fLA#2M>9k߈N0؂FX}r@))A[eC/u9e]NUgEd (&Ps˩69U]NF@j췦.i69u]NF7mrN`v4KP`b4vw2p 38HYFT%`4"0ꓳ <O-hD(` 'g_Fi4ˏc%RnjqWPϿzzw8+q]c]ޏU]5bTq jB+Joc(.6k4ڨN^;0P܇N.?P&>4h!gr&X!>"{kO?Tޚ]6 7wv,]I*%NL%T8ST:)tsz~|vc@Mj*{/}tmz> -slQx=}.urܴE:Q9j:#0ܻ꽣.YQd9Z[[9:i[Ygę^@ѽLӯc~snHrX:s↾ }'r]oJ'a<gyC]L[Mv;i-eqxC/6="ոirn]dJ]v)vCԻj݁Oq?ƙq8?PdD1 ä8%Zj\|FĪjR<|ŠiLΡ.Tu9%u969M]NSYmr꺜M]N&'tuASDR̹/j2r#Ei#`eҴ|Iڤ6#h%`p 1 4d  x[ЈP@O@ucnꀩ۬P:nuP9r:+MNUQ"4u9m&(1MΩ1 'uVGHv FZHˌCXM FyXSЈL@O 60 >3(V<l@WT>aǶS;nw&PI:0ΌnT%et65֙m꺤3h$ڞ$֡c6ZS>eUkWp N^fLj c>9{(% 8flA#FRF9؈SpHFXr6@``gYk9m(;0j(bu52Fy5#/O@FygfIpfI00F-#3SRvR NjI CܬOZL*7_pZ 8UVƀ1"pPƫYX+f$}k/XO(;0j(b52Fy5#/OzFyg֊ۑɁjjckZpR NjnlgEŲ&Tp܀Vxղ&ŀ1p HeMh3kL843D4ZQށw` ?Q^uky #ejF^N4ά\9ԢZԂh[+.E*Z 8nA+ajYڊbp8V$xղ&P4c &  &#fэ*F^N\km_ky-ÏmW3r䬧iwf#5> Nw h*@;Zq@/P*7_pZ 8U˚Vƀ1"pPƫ5 hv<ɟp~d2k3pGŧ4*\0*:[sٺ8*>Q1.X߉I0 bd}7JF}q277l?~0@=HutocrY* e4rbFj9a o''ӦPt7WN;ϛ' T}_jߟb&! C_lFDxRʦD1sҒWKO9-TÈl:@W$u\RyWv(4~slSw')IeAԗ{KwhSv%}zWKɱ}.;G}("{aKGWAIZ5G wp3(1ƪ>`^ƺNK{e zh@]9}Nu>_ nqYDN׋%nyIVMۖ?H2 oܚq苍.)[]OK:SFw7.`ҜIߘ~t,~Nϐ=ΐf߮gQd5y=.MR>gPMa\:y̅YL>YOUPMUꚓUd|CU*rSU M|*raU3UL|~Ea&`,H2)^Vekoˆ/JY ԇ 4" 5 `mhu:@}@@r8%APu܁6:pJ>jm*ƛ&먫TyF&dU>YOUPMUꚫ$Poʧ\&TUc|*raUꚫh$:ںuh7mQWyQ{ڤ qFnC )1mu؁:@}@@z8%20]3U*Oom}UME.KꜨ&)GI9ԥR:'IJU`}4XSԥuNl.%6mRNfgbr93|j9u͘a(+B0q"N1o"`4f0AH2ވI0̠6\Xe2@luk׭i_ɚͩSamrʺ.r2Jdls9uVt.'Df5[SuVl.'DƼ69VgjϘfU^TVFe<f,A+"qi ,K)hD&`'g x[ЈP@ORn]뻉AY׾n]eݺʗ hSu9U&g_Q"3dC]Ρ.Tu9%2ߚ.bu9%2޴9N#(F׭|Ye<f,A+"qi ,K)hD&`'g x[ЈP@OR0"FB="mrʺ.r2Jdls9uVt.'Df 5[SuVl.'DЛ69֕٩&#jh %[5J0xXVD &gQ XSЈL@O70 >3(V?aHPDŽz E"A= H`^6MNYSTuVT}]NF̀mru9ΊnSd ~krΊmSdz&Ժ2{*AcCY] G%hE$8mr־%`p 1 4}#:O0c  bYQxguz>cs4}62SzcsGhnR/ZXѭ|TH|:::{]?=w'|k_=vˍP~+O)fzH>N\e6U/W_xI ʝiFTؾ)3v~ %mioI l0oqzR~6Ls;voHOцM/@΀^j|[h w6L~6v(m۸tXo,݀4]a`ͫX9]ns. g7CNB~J0 3?ק/OB5O{|r !9v֟_oN?y8EnoNo"ӻiW_׻ӫtuyssz~|?7·2(>FmSI _puwH/ݽA`39jt>?^O,1tzZ?]t>ޞ^^}\:3R_Dϼ2;2JCBww(+>l#r |ýSe)*] ϯӝzw߬=rqړ_IP-E-}’-F?>~yz/}EM߭7 A6(?ӗ߯m7pz*HW>suuӓso|ǸR7zڹWc6w$Ƽpi_b?ǀc].#r{63u^j`׻Bwۧ=U;PX&Dw>ݝ^B7._[o8԰ǹO{d~wώ3ӓ>׈3u⯿?<%)5' t{;ǑHGpzy'xi&#A3 +jel*; ۝6x)29>S =ҵWtߒlZaVRjUҷk8J5^>VIjFz)?6 éiu+(NTWԱQ;ߓ"ԅˎs{W=CS /޹cu5+ zֻU[DsR%v׮nUYcp-'sJ ϝkw#8}O!򯕇``wwOBݺn:AI==Юc_,ݛ9%!]C!qkɧS$\`3w'=6?<;wͩu"LOV ݣ'ty~qBwXD Ow С?I`X xJw/q[78{*' ++>T`#8:dzA*(>ym8(OЊ^, zȂw>.:(8ʍ]{R=>_9|5DX9v߯ﯷOw=-M|B8l#Q#j온MITݽH;. .wn) ۍhU5盒)Gc%Vo"0&$(ջ#Dr*FͿL(GԴ =MW>`am^Ո_KLLMV{rak]5 `}y黖ė <f M@ƬY̚ZDJLJ-Xf#I`'#Ert/Bozwt(Kŀͽzv.w8 =-'D[[jnp]]T?SO5E?su y Iql ` K/2hWOܙ ؂.g0{nv[w% *At`+6E6G^SwQoOikOh|@ fPs`t)H5;KVgAb*(`8E ?->^I#ψȈ kԥ׫P]2s^oҐo>GMO?shJoo>;Dc5>j>|=lXp- v=n(HީqD#mY}/^4 g|g ^*#n_ir5kC zK8mچ[Dx@E KO9~3P墻Q)Ƹ$G?5t툵~{g,##{'wq#=s?\ۻ7DtL&:嗝CH17s~ NA]/<DaqY VMS"h0.j]X|{ׂ2N(i-.]Ea]%mqt+Ph| &m/:%ycr/?<h}}dow?d"5 ysuL 6ܞyΆo[K=7'AwӁ>%|ىtמ ߮MGii~}?;egnw("^xLxLFq?ak]؃I9R ~Ф=~|ˆ;wPz:@)ZݓTiP[]r79zӞCZ~-CK|룾vO-o_%X(cV( +X9-*)dF( cZ񡅞 =#@>dߏzzzv7[3Hn9C\k}MG^+6 p7 +[p]Ezar\qHEøZDJ[VfV[ M.Wz܎6w%Î ;qWŎoÅG ۊ\QV+;cs``-ePp"3Z3mpѫ&6àsA= vz{ZsB(SrA 6h fja{h#qM<.1HQ% T SU6~:AXnFU|zIRcs.}ƹ,KCꖨt*:H^R}/a<@ X>}C,yas+"RrbH o{$RۣH_滟,ї%}’{(S#H^5V@vQ/7ߋN.DK\#D/2ptevZ@w٧wקmZ"bR\xIKzC/= w<Ԧ-m"ahgrHMh[g&#GnRM*xppZI܎!>{I! r! ;(E\~p{I#ݒ;0HԝoAQߏ}#9Gi޻Fw5AXٝcAL<#-Pw~s_ԏ"# 'W$s4+s:7}Ʃ%H~Ѱp^E_4a\G::3Gg3stf^ݢx Dayeu<s@1.hr.oӃfuKU!>=q𶼰)cAVcȓuGFO,`RvX%t;Rz /Цsߺʴ%};D]/Qތ;W@;yI{KɟyvH"}Ma> $>WD^-G % GcƝD^"[ɓ"L|e+ӆ}VP YRj-3"nqܢ߉{"ð~%2CL j "/%SSMuEqAAY4hÃV>]Z~e9X +nn'ηeϟ [r^Crкس ;. {el=mzB.JC&18);Jn=44t@Siŏn 4ZP:m5'=51I=ϾCxC6Ws1a-%2ȝ O&C^/KLp&urL_-Pʢi/}Im^f.@HP:H {0{\w:|,K)cwKQ7}"u5,= yZ=l(!9J$ z|KDQ+(X$nߓQ/u;d[ 'G-v&` 'Vؿc@<vXv;z^1c+~,|Oߓ.,Woxr`~4ygLw֔ = eVh:7]'S.ls۟]F|]MHe ?LlNWJ ]Ỹ8KhtD1Q:8lA= Ihcs܀$miNgs+9VvLcռ }B7~.k/4ĝ2}@#6jxRG{An_[;,dhcyrFEda[9'[wb.m`ab@ "gI+Yuy.uMLѹ&b\"NiMYEL|@~ Zb4`ȓt C~ a"oʺD`4cݩHɋar#8!u AewD]%ꊨVk]pr#y< GvQvZfn``qȡ;(m5LϵA˸6Tб OH8\'y,af8ۊ 6!k}k}R >VHSB?p+KS'.2W8o%) Y 4sv& т.M(1LxYw)Dן#$uIAz:B[?cFe 4~q*w=E[ͥиb$?`53>p4Ih|؞a05Ƴ00@QT'[t-0r#6 Pic)qqCb=qnj8!$^a5pzOR7Kc]Y[&zX>uu.Zjsxeݛډ,Y9Q)GoyǼʣ3? Z_AT_ߍS&<8q~Nތ, 9YN/P^V^^yY{7 yf8s"yhUx=b;O ԝU:20Omyi%2trŶs><-9:u^eiNLAkc:Q}@nXsw99/ e?tW{ozGE:}w$IK rӉAH ghGJT>bA,3-?çr1u>nY<ƫ| `[NnteXNC@dz:h \/ O2"<%,J=^|YpK_5.QWD]FXn{ C{zK ,Oy:lIH] |GaayB|QO^~G28ԇE}LK. ak2)̋[¼pvGq^@yLOuiQ9;.reà Euq,ͫ)-,H淽S-.I{M@E{kr3,O+M [ڠ:G$BtWTKni`'O )2m^.vvpδҷC@R >T!'02-:@288K^럸DֽuuHX=%eǘZhItQUXS# JQ9#qb)ty!U4}pP#0648IFUNR Xr"9X N6G8(Ά u<%x;,ѧA@'M\?Pn.O`s~:%쯾]oZc\CH_/ʏ>/OG(}:LtB\E]Uӡ0%t6H^e* їOSOq>a scd|29>~ֳAgGhwB pcV :}-hUvegM5]XZiCIJѡF_!\:|s,Z,-y) і2̃uc]&' c;K~^8?c7HƥetЊw.,'aitw|a^K@{>ⳓyP8[oɎxQ˻F-C _kSQ6mR=&a*ռ_;)6dŇ0k͑Yz =~fu}aOc%ՋjT2!$b!y-"$5LEx\ݏ9e!wnww~c(wP5I@RArx,{>Q-Z;04ƪԑ_,'4Ǡt}jkox==$gO}{0H6=94{hACcˬkC;M\DH2G>;o'͝q;/Jx{S=]ijiI9i(ϟ"`xN! cCig[Gfd,M`YrOSi_or*"k.a%J3v_?R5 !Ԯ) :TH˼|vYuw.uC9g9+/#Z;PLdLFS=6v}Õye=-1XQ޵*D렐O(-=8 syqZh`uwq^~׾wYx}Wɋ"XvW|g^Ӈ*󬵞WϹGjǃèM'sP=fR!陞N2՟}Ժ̹h;?|1?4y.~FƎy@%'yo_Bopcc?{DCg8;z ?EuD!GCC ;je7Տ"ـ_~d#n_Ɔ|N6S0$؋S}?2 `"?H~~DڬbZtJMVL@|"6[pUOS1{E FM4@Qfs1XcN(΃/t|5=w<$K׸ݦq;"ogKY7xl|%`dh\6=dk9guD|boy05w>Wtu>v5QP(ӵyɪ @>^àJ4&exTN9}B0flA# }B/kĝE;2Hհ7ʜi&ɞsT牆Q.6iw^d+@Ѩvi ghdCF{wc6/֋hA_jzGܡ1{}K|ȐegŐ= q#݃I6b ;׃t'h< r=wD[s {&@0E0]9?be_b߷s>tG/a79,qtI- 9$,Ho0ͱ`fpOhHEZ HFt!'!({'@=L33ջO1I :t-XZ>(_Wb>TNȗ\'.O˕ļ3s@8a|F~{ec:лXzgfCpIm@ z/{g^8t΅fspW98ГmvNtg;gVظpsfՈb#`6/Lv{_*=;`c7'i]ߝ|ix}凉to4 © #N /_]'RZ7A s7W1ƨME<CЧd'2&acW(葂WTջCp-mS;MNS'G UGyqwY8:TPx\=z\!ѭ)4|@`n̳Bao\ G>¥OCOp{~Y6vogȤQC݃!pt1O,a;?;40T['tOԹ9 O"R!zn}{#."0]aneѻ 9ٿog- mjpR+H 6~l5*8a`5ɶ 0LK3'C3C_=!:o9 O ᛉ=pRh @)9")Z)rHQU萒aOWE &YK|:K%qr'-Hiis${o΂Ҝ'A gF>MB-ٙf]!?-aZI8v s{" +tz"#Y'Oj/\$u MҊ6Af"|2NAMkϦ￈>ɏZ8igU V ;MNU?Ku[͡<{x!ða wP9۽á=wG=gm#ya?BP_3 ){0J6`gǨ;>9v2g!78#=`H >k :~*vó@:|7 Ч tM~?$yPBc>I2u쭤> @zH3| $/ h`k~#IgSdA!2虇y:d`\"@Or>:(3$5Exl_I‘ш]:!O"8ASf2{Aq|9ow'F?|134BoM&xCD2vk8ŶrpV@{fw q110G\; )/Z>v4L:m?VT994k324F~pzv_%CKU7H>bcS^g#Q;-vraEvLLݡq8߿w`ȳ3b~! 8lAxvC_nj]:?t?0J;w=3^vPcf=1k/pf{Z[E7y|~F瓃&=9q֢Ԣu1 8s|p%W'SZvC XtJΫBiʞbK_gR+uZ̭Qɰ9GSijXЉ5vgψ 橢&IP:b D{Q-SaG=~nQzXCR_X&ψeuŢ_ ̗~ovEc~2QPutcwdAJ n#uz:P#%IW y 4k[mGLQ$1JOl@Lֱ;REۭkXRP棝nQ}k&ΰ{pyJ QP\ϹяgL;GdyFl꣡_iMyS?9\70$ NtOF9FTh?v NE$\:Y~w\p,$ȺKm NRčY ^S |5=kM) i: Ԕ5 "/:]8v5\׎90Y!gD_p~)#,x`8"ņ` jECu|uDP!FŰlhlۉ9huW B%2Aueu]J>\b-h2)iB̃ OrbhUBoi@23#SB̭XH9 v~+QU)ZB& DD@T>Tv_l&=zSkcF3QCKPch9CtpFtFΗ=׿EfLCTj{mKu=A|amq?a0[T5tX}\~^h>,+Zo?rp^]-OW7k:dEWԈz:}X]"4oW|}C-?lNW<8Pvuժ/6lIKqBb uz!n'{,;if!'+H M߇lqssIS=9nJE釆_-6ӻ5uy{}z>u\^/0.p:iwxi1=/Æ~bu/~/M_?'=|;gOcCV۷4ouX?ݬn~߭.|,b9SULjyOxa}_>nP&aR`|ͭ)55Nּ>l?|K oIX|k[&Ǔ5Ҭ#J?*5pȟA?z2ӹ"öYR5  `5KD0kѥg].2pF7|wA$$dpx,s@;O'b8xz~Ut<&"-_4 .aLHטTNX#cع2B'22$>l%ȥV]Eaj e8h%N0;< HHEZ\5мuJ:~P^j%Ċp^i\DDgDN{?Ea*53ܘ߭F+2iӡaAn\m р*G]II.G|@u摦HVHu‘ĺoTvoҏOuB9}ӵn81CmJI' $6N.N("q*+taֹ\"^+$m21k5h5h$Dt6{󄔦J٪DYV'rc6Y=@ |hP680' C>8Ci_)>`Z/A"SFd'Tiߒ|3 ߪzk AN{2*QR b ꌇ#6* 6:D-B,fdn3%rOZw\w qQt'F1&hU3Sԟ,1$L5 OPotm xNl}BQ,u?K-ل[ޭdneDBd0Z2,M-^k-)u~yLv'=<1Bp d?zdIX$G-=)}-1k77>Dg1|wO @X8!sJQ(':Bi<읔8|5zq۔6ȶqm"=QGy}L] T7=>r va-}}Pv74'@v-:#S S{~"ޜlг\x&"G`>{oۘ:ĺsu-ױ!YPg=mw*[t߮ч+? :ֈOۺxZqu4Z[Jm(+͔U~_S[Jz<%RӀ~V`S|\p(`9_!]^ QAz8ߋVoG7IT|وk~Bby~w* цmXu_ߡͺ(`!joX#3qt>NoN^VTZt&Gl,5чϜ,?nVY45Fp{aaOa?mYxzywJNoV_.Oy5״_Rn>mY]JrZ` =_oO.I,ڴf}G6Pw?̯.Kkĉ.O˿_:j;ޜ炎=y-qүN;nÆח8As襸;t{9H NC7ˋ:Y!|nQFtNB+޼Ԓ4(|s\BQLNQ9\Cѽ9{ASW+gZlZX!TϾa=v''ra98 Wr:Yn{hiO7|*t "ڰ?|ɢW෭ܤxVZAJ?E*>-*XQ7肱G^A*OКX6;6Je+5 1OAXgP0W:`NvέzE܅:` Ӿg_4Ec52̾#!D馳%]E.;T7:a.yfTC\a >~U r\ VBĖH^I#DH΍^1cu-8#?Fi.m{ɠJSx&ZkNCŤ@-ZmH/ж7ޞ 7LpFau"2[Sf]e]T[I}[ILmENG-Rܶj3?{_6z[GowG0h&ß:/ѻ֯\J{nsw9H??@qW,J=M;~J.4U`&nAB='57jg3?)oʝ?oQy{T>Mo!Tǐ4$Qnd\򑲾1q[uSc `΢~|'q0+*K-| r7ռ$ɯϧ[|xNYW(k<) /h "7sN]xkpʪ7^"®WmT&$q[of{N]oWk Y- pZܥphed1ݐ}HRֵ:;w$]`uHZ-p`-O>q.֙`X-j.%#GŹ⛸ϻYZt|;);.Vw*玭u8KRU9@,@UH}ACˤ8/ 'Cr[Agf ~<*%:p 0B^0dzEZs' /U[p!Q’#-k/yby&_KH C(飬O֥~ HҼfvAtN L/H11智Q:v[O`v %T"JOG*;_H %$ 89ѨI\ ⧄΀a83E~hNN @p0n6$~SE)w_3tr s&IO fAzv$ QCOD/á8a E`$Ay$c cQpt065dZ% Ld`QAT$ˌU!ڴWn%iYYB"p\4Q p3a0TրA 2|52D!,|'[.:<f07\98`k 9.zkf 1TYEG>Qs#;W i, )oKɭ(jE$_ c ,cDT my'].f9.9x&\,Lr@hUg AM$ d'mD]A-يk{VӣAtvb[r|{ɪgMܙǵ1]|̸ΣV}G1sm^.c s/"lVmS],dDѡ6w/*>A#yVwΒZ.HE͟[ʻCF%Ç}Sly©-i2T,ɯ&!53vF/ޏ?3qw,Q ?D:NP> ]8,LIDC#=.i6Z2LDCSDO᙮6Lvd,9Iv/e7o5/H;d -#_f jVaҵdDj߶El͵t6 sؿ2VO=vމ/:|Ukz5TT@Zf<_56q@AQQ mj%ڌ6 1˜[`<ӺӮQZ&2Q' .꾒#`JH1'>sto  sHxQ1Z0|Fh_"6܋4ƹ볙H0}4->Df<K$cJ{1nYs0V.}"¬;eεdtYm[^[Img0+3xyj< <{]`|#t&χd`C,GI L G$1J,{9EdkI 9^ 6H3BDPE(q3i0]aʥ`ZV~{۶-m֕YLvx+Bz`1+"gqaD=% .e&%Ao%6w>u隣D,_6D<(H/D%4ǖt!k 3\Fmf!5x& Y1-x37]IʹR Z\ %{bhkzz(^n?m}e kc}S8nLcχ܂lgdA/Cr#T9oB~@&tF,aեp!\̤kBpp6z/eD|Xx88QUdХi*("JEU2&xFP\l1;B*R Rs)1]'}}}@>c^gR &Rw&'bf+T٦=So2O.Ӈ9lld YdhGs.(ӨJ̸6Gp-Q-8#oj(oB0WMg{גiEη&S;C{ 0#=>DtLzy[:Jc1ҽ_->m!i*aʵdYi߶%lݶ sؾ2N8e_գak?DFKQ`޵!YvC1~,mǁdqoفZ9NLuާ1Ȍ(9Ԯ& f3,rQ趇91nWX֯z۶)mƕYLsbFٵ`fef<)R0[ɄfWiוE,\tH[fn:BP [#fZ+Qe$#XڌkɄ߶l՞v sؼ2>VJA; LML:-"#İ# U)A\m%)}V^}W J}"Cy"#C#NػFF>('R:Bm*iu)˶ޓδ1kkzĕ9?B?̃V=15MLzTMqbNcؔ\d_7~**\SqmMY&2Ȝ'='׃;=ayʘwRs{- ƅaεdk5oM}Zf=q6(KAYv.;􌷁fjeV2q7Elv\r2V;iE:`n3޼kp3|u&OJ?ǟ\v]0QP)Ur6 ԙwMzElv rؿ2V֥q959s1g1Ϳo‡6_mUI z* % o>9Tz+Ծmk >mN簁2V 5q-2mnE(/n]ݠ@jKp+Aqoz#O.}շc(Oܠt 1 a]dԽ8k V5V{/mm4&x Qp=\lw/0(%V2P\ Zv]0kDPsK QE䇮Ed&r=^识V2߶5͵tܶ ^.:oVoVs.s6K\&EQXjԊV1~V,Y πbv1frۮau1ǎKV,{44ig1U10 LM ϞgyۨbR/q /gQϵnBmr!^f~o1#wŰ̼' W3 3Vs<዇<#OoqǗ}34r@;5*9 9OZ3c2mOsi}xZ,iՐprv9ǻ3%pO[ZC{ɘV_,nfLK7͔0hpO5Ư9H:9|n|uX-tK^wwK'rk? kC >JP 4z)P 3Mcm. ݃@0b? 0͖&0- x26ѹ{j * g@ʬS:_bԏ38TbjOHxAt)%eO ;mM\J(]4ۃ8pꯐi& ٕonIAGX ~@_ؗ+`B2^~<_#$=͋g4a@2~'O/7;9ڒf3>Bzyv6Ȇ1 3l>~톓AKIz6D#NqİjUlӥl6szaiJA>t2wq.π剉SRH]D1ӞG:D&u,ycXO0` ˎ, pS7' Y= MXSb@쐓[@ g<@ZL.Ewr0g`s5qa4VitQR25}?%c+en6.]r4#W)CAQ\ 3TwXL^fm>Y&7e~oSp΄2u,Y&Upvrf,਼8t 7κm?ks[`?}$Z0y/oQ?_`W nitSռA §`&"3 w0? x2.@ܮg׏b{ښ`3K QIW_jZ Y]>|gקw +v4xwT@ R=\wO2HH+=Be|ޜ|H FygsF b}q!A䣴gC9Av.`ucwBލoj̐5MTC΀B IȨ%㎦瓤`f2t> &UYLbNqں{d䕝.CcT.򫕘o8XF1!R %쌷=ح l<.>e58 ؤg\$ntO2d7f5< YF H]U>d&v#I"Êi5l͵t_d'³9Ojv 3^y#lwQ% +d6wf>)gxxOn;}MUqr/ӕٺQ5=1ȺqSr6ܳno%7 <&B 6߅|sDX戶Z-~u`cV-koJ%ݧi`~2gu>Q_.o]Y{fyȝ} z:V0Z_z~_S,OQ"O1@b| g l KsBG'QïW2/u@2xVHNx>"Wmi; XbThND=RԈxq$:=?/ih;\y>mWȞg9^Y^̞ʿG[n^=p?|=oꏷ#NP%W0q_?n|k_X qQq0È1dݷLj 4zBO޶nSQm{':n 9uMQqĺay:ÇwGPD<1TWîagID6B]#=^Df+ WSz.9 1f%b$H)4(E0LCHkqE5`MTiw۶QdI 0.>Cn颴Dcsr>k!R>A,]Y0%ٟ(!i2HCځs}ԭ;YH-uZ! kkΉ%;gֻ r&d$!xqA'ܷ'!*N,xu@sJfs"xJVo]=\lq(Zukɕr^/ӫgO#@(V_b]9.Ywt>t>l߯NVV/J/Z:uY<&yuz}~񋕉ȱkZLU_ޭ/pZ1m٨AkT]MFDbsY_Boi98EB-2$l8MAu#rփdqlewrJ~1qULZ]H疗3a v5ˑxB#*qƅ,⼯Q'XG5}cRI&3'[M}I /w߀i_AbDi'Y|y: .mwۏ/~p:En;|XQ3As/ó]HK|tQ{YGCG%eÄ?X@h@ei҉|(`.tY0X*Y4տÊ'~'e±h}"IW{TWM?H؅^W)Ӆ]wm],8އVG?9͊LsY#Clv0nIW7'#: j1?ۻX5pfԊ.c/$;Q] *a Poa7֪V:[}mOۜ&I:v\ ۻbn!X+pU񰨈Șe 8dDgx | uGc[I˾ e6qHڋ'Iiy+ 4Cۅ@:@=T.}F9\ E5H5&Ä;%BNT88R0, T~6,~qMs:6Mb}egB눫B-ToT=Uv/h$ʼ#zSjD?j\8N{>ʪ3Jde'sH M]I%JAmܺy/룴'ZL wAeε`쟶%՞tv^dyBfpnA.D3B4TUh8vJbL焠o퉶Y5sr=N{f\Qf{ڕlmk:F,*hޣ.mimZ[m'ݶMiCl֦1wRmd|gv2c)DMxO'uw<dǓY/Uf8AV.ϣ"jʰL43dh$Z1sAܜ /+=t@ܔz BAnƅ0ޥV2!r3[cO>ZP'O<"2vi,B6`'#^cf>ZO8ڇuZSu'}ݨ6 ?Q>r'D b?<[^nxpbs\=T%;8>x#\,7lYI_.gltw(/K\Ʋ`;_ޯ >i#,-EߟZ9M9Qqr42-ǵj-w_iNa\XˇGnsDc;LTɪyb -e/_wPz63EQPE|z|R//IgKFqtt cO9߲XZZ8ov[ \;RiFst94S*HT~rj (cT#y޽湅2> 98 EC3fҋ0I}˿ʝ$th@!3XGg9L!L5we uʉMPghTGO{săI41m%WLc(S_'&pA~YT#,d"vA-HEmF}yڧm kkm'}iLd?;Wqs &2Vc- ~j-'\I*g&b|{vߐ,(.Nb ]cˌ垓EuWԊ\)eܱ5!Ea36 l^ CFj^<=wߩO8q~i. I{`8g@ [9g'DÅVdp"yǝ\<5ŋ{Cb(`,'U8{,8Klp&vk;.f8|IK>;jcKMLRY3ݚ'kޜ^o/̢P7#S@6gŕw-O@,\nn8S@_,(9Sug z)ějϛZ9@.h݂5[nP'= N_[o ɱþ,Wݹ]`O#z0wܳ|='N#b I{W\xqQ=<}%"SȯG=wu-P92?f#{OG/h]uUzLr܋AN>=qŽO7SMz' 7pJDJNBfw/\<=-wwh+kS~'T~dƟB|V~qHlƾtZ\ ?鶇9/5sb'."hԪܥ wxZB.5ԩ\7<2p7]G5 ".i\)k`g ::EC#]9p7^TG)UGN]jHBxƢC1ǙQcp;WW|132;e0d-3^5CYvK@ȍdeKk욥V!Co~;Z?dw͝L5+hd=)UM& n?ѩZf=XF$*ݺ(s9DxvsVޜ=Wl[4,D>.ۓK/SqIhSEo{[_oߝ+W0ʺ: VC>X̷5q;01vK}Y H^ ʴ&mAhuyyQB1Yp@4f-\+cƊ|F'cs-'dxmzo޿+"1wWߒpwo':}\<'Y>:l;uB`CfyI-at to3Oٚ¼1TGG5G &08ƺo<Ǿ^~Ť@vFyN|U\M ]·\٣]l|LRrI.װ ?7vo F!? GQxL3ڏ oQԟ=`}%{^p|vFw}.qNDhhQժUGյTZ<֑bPBp\@d|1Lj,Cə"ݺ(.Aɴڛrq|G\[ŇHe|٢6EE^ й o \{ڏLn:.nusKVH$Ӈmsiji]@ϟ]]`v!˷]>)/_]!rvف6\i520 6N,!U]p_zQZ[q}=x߮; ml[wG'MRE/wjs͏ #sh޶huvuJ"J>L2K蜘n{[bKl}PDcϿ|Hž=ĭ}),|UGU(Է]vyUu*I7"}daX;+Φ Orf+gn^zp.W 6_q{xn.VpVilEX ^Zu'"_c ^,136B˯.Nr 7Sƕ%d{v#;f0=Ξgt!>(݇77Wb[_Ff.k^nAkVP枷--ymn6lB9P1`SEd鮽f; p= ~9jy~wwFN5->_SzW M,&mӻ!#4?gۻ"$^+hG&$2"j;? z={=2_; wn;fH(YΑU.E{I~Tb0t<A ݡ|H%h`}\)ᄠN ^2 յ$= Pu TF=Nb8K0mU85D 01vELY'ΐƌrۤe ϼGa;۸ \".Z1r$"|K,@XF1_72t}u$IH9ZYtLor.QE73VE>A vXh]Ua# 9Ck\q 2`W"8^@Z4U:Zsb_]Yd*L,SzODQG"WW2#ԑƘ7d땹KЪW)*ţzJb՜Ns_Q \ZS7FQzc`fH6jq['jAjZJ/[j}֒%L_Z %$v+tݿm%ø[^߶JC߭d0|[K8 }גm~i%V"Me&ZdZ4Z+YK+K`M zç,VLֻJ[jT߭^0JR or-h=a~i%Sn/т#ih%&r+i v'yi߶כv-i^HHS1n%{}ZbUfk^߶JQ;0v+ݿm Sü[dVJv+y@{ 4^_ZIՋzu2B"h(h%Ҥ[Vи$TN(z5k?:R :V@6$붒!T ÷1HSS /E1Zh몸qԂ]^>m[K= PgZs4CN q./D^}bQ4Q^\8a=K2۩%eڎ#DnZl׊r#p>h@/jFk4)Qts$ޟW't"o:7țNM'yӉDt"o:7țNM'"+EΟWUJ_y<8Uh>\lHuˮJr(w~[s!.pLgdEÃn 1<rH=sJX Gv`I {j!EnrVr8)BԵC6 ThNk#G!GuqGAk&A]IEu;?cs[mkS CODX J4Ї!nc9Y{%陎5[hjG䢷_?7D.7L8$ȵR=Iw8aM/9N+[͑kR;1CTc埩L=`fjdA]s/h,p5 5$8G$Qkgj:*񲴅CNZ#{l9FbD;::B{7 ێ֘xBQC R̋OLMuZp^L-',6:BcX!i85#9#1 ydSt3c'$٢Fϰ(d(&D_%<3MqqмAh:!&Ѳw %2/ԋCct%*2H煥w~'8LH6()R'`TsNeWdqh&CA d8-Z="cj';)":Rac4i&*-'7uGT'I_H]!y*Nk OLC&S٥h] ZI6ͱJgE!d5bӞSr'3|dNFDZUuIHJˮHtC&ᅳ(O`h>}*g2Ct?=z (YhEE(s3'3@OљkѶeJ] .WCkHdDIhN4qBI:+_TY)C /)H 4ণF}@4+dϭA0ho۸BY%) BW83t#h?J{nÕ#{]MN}($pX:PkD<@U t}k.Hc0Uw[ӮFGWsZ!`L};ѧ5Aⱕ)lPPJ(?\Rq/*z}>'g|_ D}`HC$XqzsɸHo8<@"n}z)JZ5r; 1[/_ 8O\!K`'?tszHZ,\`эw,/91)<]s.p;w8cVE,> <{~ˉ07{{|X\P]?$>'*XU\UZ0ꬢ_0JWFg85 r+U7PJ ;.0}7xT଒UCH\ID_,_RT~tdHU.JrHkrܶxoƩ457UbXiwZ9 t:[2m] IO3?|[Q!񿽟FZ9SQ8@, ,JE&9ofImp/d+\QuVw_ n2g:aaéy lYN+hhoP2ׁghb,-(g~b"%CEGO VT$at*ThdL4 <9rI@N(-Kj2-x=86l`2FÜen ^I2jтr\ P x#0o7lSp:6ZLR|:i@r^{0!{T40Y.GO'tCԵi`t_&~B"Т) b@xf2~-06w3 Wډ3a%,J Y`f#Ӑʠ1sT &Q%ⓘ="&˲T`uh`/.dw F1a)0G f*S I8ؓ<DiX։K$k\topWIg5\ aGދ9Vja4 %X^V#`5n'\Wz3s!d$l܁џ EX6IbKH C,q21'R[~ze\ܯ϶%Qǥ9U۠xlP='={I~ qLٮ(6Q-~Hu@|^Pzc ق4@qbXI"aVtWNyMsŃMXb<9 }c_ؗ7}A&,Oǚ݌%'(# 09Hf"e$)#Kj$]:R>%7"TO*JJVs8#<~%ˢBXz'SgPYOV2|A*dj+\\,?Vɞ..w뿾\?[-k1~dyT_-xK֘ʍ͵_msf!VoV{0B*; z{isvv,&޿Ln?$_~LҔ ZS'=6r'F8d+" ~ d=+a. k 9sa%&4 ̧f6nФ7q*nZ٨-/`px6@Pd$ܲ};8 }bEƔ4.ft7, 15/h kD2H>5Ϸ7[6vm?0v|= "65/ oů9ks' .!b"~~Y7+hQ|^W~sWt( vݓbb>IR 19M`iGI%]~`# %C ߙeuӕr{XDM5'\ faS[ȑ<^M#.D5NFB07Ij9 |X>TX+ĀrePFl>Gg>;:OkB>kr׏X0д_T;dSY(h }9M 08L@CƏT1-GFHe)toamQ=ՏR?w:,쥘ب-{A&v-*"=iLCXҎc+62C|G@EHnHb&lj*fn p6{>o( \gH6 KnlrBJ͖<Ԇ4.6ȩ\6hҖ1aYSs1gLRu+"%Ҕ84dnc'$qH.rj f%Щ=S#t԰f'7PS_HG-Ꜧ ZhpAmhçf4E/푆b L MxailZG"4MgHLS[5F\[+WӘ%\d AnW,Dm$Mz3b [F t\+4FǗ9K"8:e3h8)mwT?a:1PK2֞0 7 vpH zn]_jT դ qLnxb%Mr>&^Y0lkX 0荢<͜F\fs%BOWA%%΋=ёH?A[NHcwǠp` 8FaNq$ BQ@9*΂HvLuǧ jAfpPijGe1.!/b`Hs%Cɕа%>w%i \^qhF)т ٶi#&2izc:K4{PIvHHd4b gf+#jrR/pm a:5}n􊦀:d"Nf$FiwO$ NѰ/^Z}K2U☁9F?" BLh-lJ>ف.'B1/bs##rXg%rmDa/ѱNƠheVf4hUUP̐G~04x.$p`^ Zbw6/@}z ZȫȑHE F [99G L.2 \S5huГT$AVЎk" A!zΌ}2"!(s4̤ xTjDk`ICA<ף EU3CH3ҖDL`fۑX8~eOV̈֎,+e rMƍԳR>G W[Q$fU}߁@'am%JL }~>9)qfgvH$!B rQILЄINTA;fhsE<]`;rT)uI݌,6, zε!"RI8[(ҖF"D `j zq"f"l~"aH M،ڵ`@MbRA͡$> ס,XjHqD8mHWc:n>x2źۺ^1M:vnd=X?f&˻n(NB/@kYzV@BZdgMyEJV֜7cg8[pm,;a`I;cCp Nx:3|\Wph3-;3 n0?ꔈDKJT?eM, SgǪb|@ݾ}IN{LU%w 0`cF/+I4Vu3mhm'&ۺlV{!unjx2{Q֢YVuTGq"Ҏg/KO`CRU!!&z?ͣIļ?# R=繟)gP(nS(2xzXIp[O&:9mM/mZ{m'GnE?u;I'5*(fWJ1@aO~w H h#5eL*k\O?F0R1TW7 9

_@iW@2o5&:N4 Kp%F 4g8iP9ev7p0gӝqh&Nkz,a1EWXԜp+B@יS#Z 7\~&fle~AFsƧ]ՊQZܓD{n : I+hӬtO3448 .DzIs]Ɍ\~?SzlCE!!&aH\eo-tX2]m~mCdpm{;d]on;)x%E-ǯMijC?[WGt|'ҭ;Ù>ӐuyT3CԷy$`۶ޓ޴qS2o6}8vmDv PM򽒴_(_N(ŐFDd[RfDZÛ.-X-<===e7]]X>NTzLz'81QkDLz=>1zd2heaosn%Oao5}mL&;W9*.*_i-J.OL! Rw gX >B-:Ά!wv$KjvwP y;_,i`<%Hvzb嵥.bXi`Ɩ{FS3N}_,^?P4`Sbjxm B?ޱ ҽ >^ޜvsxB|Э{b UTAծ#^H2oMͦZyQkW0^g( ۆ6cn 68 X7Z2/ͺ*sp ?!<'ë "` ѡ[K?9D#sC/h4YzMT{B8FWCZLjW2ܣ2ۖ擨W,uBs?+ecf6==xJDY$:]<"J}H |?D0xkNF9f`aXl @;U@Prp0ysxCp%$#ҴBT'VU-I!̴%qڣƐ:Н4H-L~Xi8e10` 哜çCx%geӸQݑv$ (F)>ǃcA{NpUU9;ta@{ҜL6D?Q'9aԙ" >Brb֖q*uYrIeŲp<D;4ݼ@k#,P:j[BtfX{MWǹVLo8GkT<#@L-yҜ5\BdcZ5.V.Xt@YHfT)$3WּFwm+l$MTD<?A( b@&9gB'mtdd#BR Gc@ jL0sqzEgR ꔇ\NpN-z+S`i9>Z0dmi_+menH^۲2־RWjPza;Vfץ+c*0<~Jﮞ=\ Qsr6e=0U//^fء :dk>)bkTK ӗXz׌}[a 4=&+?&l``>`,?ٸesGWپ1!5d09 {h^lY=׵eti3iu#dEvDj!UZiLIADDZ) s.{QYe[X[Img]-2x$9HPMqq!YuQ~AA,2YT8y%$uO B6#ED47lWdʘiGF #%2V,]`dy>J `xr-3Jd;a_zw_t?%DM! 0w+mJ&/r]3Lt]Ά.i`F׏48WKua$\?;ʥ@pר9oTxeʎAz8$^ J]UZʺb1VS GS g k۸jҬ, ck-/cE8*?"`\>EY,o7E"fxSY,o7E"Y,o7_E@ h"7-~]_.lf}NTzu.JwPLFx$6]s:<Ҥ}l }\@+lm}ᝯVD?3;Ш[],鿅ڕfpXbh$F1lwk(8u-ga7ٱ>3'n?o镅!CRnD1O,\G>iU߿T44סCg:jypM }t;ηs:?e-P\Wei3Z8D l@Yw@΁ +h(?p:tyQɇn] { ϯkxpahe٩-c[ARHs5a'ۑ)ˀx$ cs!N{.YteLƒc~ܚz߰6ȺuuۄOI[C]R[>ۖMßlO:"D#86wDBAʓ &e4 t-? úKnۆ!=o%u“%A⁠ ]QM:@8,9Mx&,Pl[K]Z[Imc(=L6'sM}k;шdl;Hk=Fۗ*v\>􉴒2"klZg6vQ| Կ۫ >nN簳e.5\^P?nGP ߜ:xZBdQyJ#3"nwǕΪFiw˳]]qɣK&ҷ. \Q ʸI$9^$%S^'H@0d/Y/o6g՗ ɃScwu.Sn|f}NCMP8W4$@{Ahp)'b8/ fs)$urjw@!MRm6HqY#uh3mNW%WOP28InOibA}pzsyg9Bh- wߖ{l$պh}ͥk|Nؽ$qSbhgۻF:EƐKnqEZS5|sJ"?,؂VI'ki#*w^՝eV _CDrާS$.i2 d|?9hyN&L v}AF;Nx<\~^'뙬; ?Yn;jgK|0DHeٔAޯg*n\eOmP :!hS@ 5\'SZNiOUXeE|Z_#&,Rp?~jDF \]9 _뛳 CU NB9 uuߗp¢#ВhSBNBx8wP?[כS HW5T`y2Fj,=__?ҙ-0 +%%OƊ`۰}#Gƪ P ָ.3~IڦxbF p 5CM>!KMh*Xn"Io(!r$,Dl^szͧږ 2㿮XeoVpYbv.B4}#H~|Ķ7 '/"7*P9S!L$e61."W;AԋEG ˢ[y$ߌPEzZåO575ѤOVJEuPJ)RzKnӛפ?y{'/x[7:d7֗Uۻn{ObC|[ khc=}DK55n݇w2 r_^/2ǃd5$ t)>ºvrBt4҆NxM) ק߯/7F2'/ b?_Gq U!!lb}][V(rnn_ 'BC>z vXgĉOqY+gQH]3&hޱ Abv3&->OwdgCÎY("je-懶Zi?5kB Bt-z|m{C;493P(&a &;xuGJ%Á ]GQ59+&?Id̚& g/p y: bSG߈C[  qR 13Jg='㺋ޤVsh@U< yʌsY,¦# L+` o\BȽUSkgVUq4_ϵXb Uݞ}?F9 )cNfPj*wOm5xAh .}uQ:Ilsq9Y+&DJn^ׇ y*Mg>Nx:Z廓˾JuCz zG߰,p?PJֿ2 5n>G8ah%*jvcT'"H֗,00?aMnwlѷv[@?,CbhmTum‚;ƕK[;>LPt#/.epjg4/ќ}w)]&Y_$~ܲwj)Teו+EEaE$HHӰHnX$@x7࣡zx[ǵ8GLG8`d: 0f0N]xƢ#87.ۇa:KQ.~^>P4QsFKǵ(J;%  (3=!ne\r5. #_Pr]vn6LyaP2N[.c -`@6D77␱ I[q{ CINVO?^U$?wVrfb'1vjJIwnx^K6N L* R/բ`OI7C,ơXl{o&Ka l8Ն)Ż^fX;#\LoloNG&A.,x}% Gmr) d_KeXr@yZWh8(>,s#qxwsF FD??E-8ݵXkɪQuبǵ=n%tS)SJE@;A^%u].h˩F޹+KB>OCŸrNq܈WfcғK>!U{oodpX&R[}8? 1GVم ય 7I],v[pQ|XxG$'z<6Qsw' > ݚ(cQ=Xd,dO?Nh] xXI-p cф]߉N{ys$P8:c ^[=>ŃŘ~e|kNh? |~u.Fs_p4._[ta1ifg1͋P$ ݃Mbnww$!9k#n?V mCuކZA$fװ=v%, '2Mh}d'ϻǿl n$O4x16n\`mQcNܟx7K]ꀂ HIOT8!FUFl$} @ՐINA!uEp7')0'WԊr>1Z /'NW}m־8FDzECCY[ RИ&$ G RI+IlL}:9IW4yo1o NjۗRz=C+1t!H8n4蚶Д(n^ό]JClŞfFM,FvӅ G$5ugY=S s)tmpGUt*3x\NmZ;dv 2 a/f6RbƆ*`Pl\{NhO [TMH#SL$BX he".> wZt) ܲRȤ1N;W&; K(ЭruטCj\&zƪtw?R|v\sq]/bnG ~|D=cB)`!L=D ÎZ.,J1rC[Ķ *viIɹfdM*>B}3j_m ;τfy l4z&h44Vаv|VI 'D` 0>?$9O:"7'$8y:=M1K 8%T~s7L,513u@)'y!"U2!w.1_J#AeprLܑ\\S J[jh4*ӎhyk 'Fe~HJG07 )ss8Sbq<{( Raыrll3R^dW#0$ŤFaNmh4"aC [,K` NFV2iF&%,jDˬ,3S`.\ߤ5p"DZ4d]nn9'7 &4vȖF`NrT hHe$'2yz=8#<yMGIp%WC3e"q/n Sޡd&TqB^J!mH->BRâ>"r#n໷v3&a! # 'v5{ɪu0;XڦD5#OBy]R H PW ԳVC0FFHd@/X.@r:%Y:r6բĢlvdL<+aK/t R?WX)C2(&v8Dm&="px:1S}zX JqCf$Y!F ҐL䘣 KrRZ[e-.)2XgI0cAYHxt3F MwH^ǂ`MWT6BGÆ_jyK gD= 6IE- SY" )A Y">B R$V?#E00$bf80A> -`.tǗNCD+8SCAVJx  X3c=|]G֋O};LL=xC~2+ɁGUoO# qpz:*I3ŠHҒBsH\OOE sQw`EjFAHVE۹fտAf۹$(&nw$vt$/lIw2ko,Lfŷ,}b[=#PvF8U3?XAg]ȶ\" =T:8Pvqxf @` 1D!(;bs[+ ^HƳ8> 3 #ԠYXKٻ̶%T|Q2瑠z X8|cJ};x P3<d#EQ6'Gio6^k$HP-2L:!9*Dƹy/ c\Qג'Ab̵N,D@>sr-!+5#~|}z01y&S脓x-m&6K$ې |31/*؝\F|%Qˢ}_57Z]N«^x/ܚs]MI5ޅ\7WeNE{W}w9&[@^$k76} vu<_א>=?ߔTa36!${xWv![Ͻɨd #cI}[]H׀]m D7wD8Y;'5|]tKkc:c! dKZ?15S=/`n@< =ƒo6#bk/AN40?{  )jN3lJyY!$;Sәʁ͂9 B b77#N$]"H5$ *7 Cd5ćmՎ!5EAjpIN>ϒPfgV9ZOD#.!>(wkd;[Y X;pTUr$q0_[@|6x% t;$Tl%b-=e'TsZE<C>b5DE @Q $".FBrHcJAk=Wµ% WΩϲPA48 x-;GF+MgRzHbp0G*1#S3lH\5t2G)G<*Ķ(#n3P+ KqMfTV %1 2C84C?#"P񉏸J0cT `Sp^y1(?DZEx@CLƜ`>cwfi/[ 9dx{\ E^ɍV;FBQv Z;)=cDW- /@mt5˶\_o˾;>5bˌ0>e|+sC/emZD!z[! 0yj,{w"iUDV&O3e#Ua4 r`0p5lbv EXfAiPЫ3) kvIk~*cEGE(?:^;%Xz pA31.C!qA]pK>lӞs?vflNq4j-HOb###"B遍 ' : 'Yc 7HMp8v%% F! Bj峌O8Zs$/)Jڔ7JffկH1Uf8˲ڱyX؈N\ ͠$"g :>>r!*L5Q%uW $&-Cyki/] Yw p:s2+xv08fl @,$R1.LXS c_gNǞ=c8;cӀm Ze0sԳZ>Ag3=fjqXNLPҏ,ѽ=k(~QېL7mÊOzOn{Fd?f'DKS>uDB\d P1xuj+Рsj(8U 7πX?3Nlt+cդ~!`oxx? L Si%uCQk L7 2TRat)d/rO:n[9kdAtB\_d7TC8 + v2M ("z=b]1Hȥ`!V{%']bVǛ翌]'{:$6G)e\ևx66J"B<GgY vE˺`N&+cO:?Q܊(IJA] R5QOZ14\{lc ?R p ̈́F w.#Yi9h^b#H @ '0_0 u< !7z"VZ3Ha/(a@3raW1Sbeea5ʟ8U4= ߱ldMJ ^Ds+w`.^Qm&< ȘAe_<WѰBXxd00!L09LȠrc GtZjHX{ C#j]9]VH"rE^rYdQC-'@r%zxz{ _JK|9ZFr'QJ:}RЯd5m>~Ȉlnr!8DjQ}d/-H,pm4@2"W$v!zGb]$\qw"2 w~4Fs6 cn-&Kb/t֫po!\G?? 'nNͮ]ƹK$ؕ@"DcxԫHß8>8G&"ݦD8V%ڢQ,g16Epvt.K!Ić\D(,{zϙv_ 5+%lwBkX{]l X}j~R|a&wo`YQG\Φ=D߸{;ncGmPcx7SKw\>I[v*~ٯWܑv5jWݸ}EUʹvk+'׻ףʉNwfSIDŝ/*)heva.z|1%#Q}v2=jenLj"h7ހzUUR{&fG.RyrEM8rYn`6 l_e6lflp*V^]!8Gxv ٮa5-<܂! PUFe呛\6V5-㫼fl1"p"6nm֛891Yobc6MlfVvnbc6M|Ӹi\^d {)v}Iݭ6TpJ3u(5wXRf=Tn?. t]02ᔵswF[3nAYǛV;OԸ@} 344g,v )U9|tk@ѼHQj#ڵ#8+c1/bmdUf&m{bXbƋZ>퀐cu#RBƉp$g8UghTUYrbjG+߬浂'lܑ,G\cI1 ߀yS~A~^kALd.81cӀ9(QH.v87Q8UP$@t1XJ:`#) ]V&v7/#2mmo1 )70F3),5<PBЕ?KB($CZ6 ~( #{FZTVU얔}ɳ 1b-R8:]O-Հf!̜p]|j|\d1ea?FX-c}e=hG#.];0b=l,C -`pLšg Dm*yGZ79 b$"Ġ$ -Ar:V75$qٰD7g:ijqHeRy nqO /~_kgӁYc%Pj#~WH78o߱8`/B:<n1NHe4yqp .ng#E!*VGz0qĵ yqI:k4pRwO! zx-۞| k|ݽͣi,. &Gg{0G4i|rLF 1;: {$;f+=fhO%..zgn1x#v 9v exijSK䣜jAiut|A<:M6*E60oJXGjQ$>A7CŴ@d&٦Jb#9g#L4#1MᭋEB R'w1 NJq, =f Hҭlx5{x/ΕvY _:-ҚxYDR@1OYH4bJJA2S|2ωa$"142_=9L"1o'hxu \Ʀj! 1$Gc.t,O`FՆ8,WZy5YŒ Ž/:")hx8%2@@c-q8XhmAs(G#(.4|UFXT6EҼXo{* JO[%U qaGHhPZ~y  iD XyNE z>K"RxzAMpX0Z'J'p0des2YV&!_\~`=G_)%^"QS Xbꘞ|^!;"Ɇɴ-/mY?18k#XlYԂ:ߡj0ok(~{1)Q B׷̂(#=6~p-]@emڷmZ{m'}miT2uV@&%F^Yn}{\$ć;n̠'.3 +YhbMͩ#Z;c~5 CdZ~@l'sV-x0֫\váce :Z31?-mB]ݥ:'if|}[9 q7b97:)'vD*r5 Q; y$I Cax]oGXNY><ânoi@,cLn x:J ehx<7Сk S,ץ5﫬}Ѱc2gijdLLGk`vM 4xlOFH:xF ă 8kU'Y {2p17Z>aG6~7,qsSy-S}8/mAGgR\{X*wk* BamFNçuzsuy]םX&?=T-xZ; S9 ^"?׎08EXdv %@KPe\dl>g I-Q29P/D}z C3 ?3 ,B쁀l4h M+)-hrdfZDF}04 =b*gDgLy$x8+4ИoVBpi?HՌbxA"2 % IC]U,=#Evh:aCf\I99zkj$X0u[sR:g% G=ď @QV )VDQI.Ḓ( 8OԉƱK8[ʣY#s bSg$haC%3ӇхX҈rym8%j9˙RGQ~02bm0ko9d`˃~ b׫BdH0j[F3{V#GvrMɋu3F>a-]]d/Em ZчK4u#DA]gFYAG}DP Ae&raXyϲC6U̹9Bpǰ$M鎽 ŠZqrLyng'qܘ|0ݬ̅MNc3k OWK>f֓JЈ!+#.} tye!ZͧiP|{ݓ!^b:L Vb8q۳ 6qL9IG0f4FstwdOaz(*2&3%wf`"*LqXy@Q5!8Fy-e @$aY>lHTrk]{Hp[՜8*~# l@.-49HI )p]I9@йA2>CXp%/INQ,@-h+.Y={:ȱI /9k[k _2WTE3~2RZF #˦_2P2PƐHGs`(|>jiN Q;$2L"9$КV<$GCLA dK~M MѷI)<2gVI)LdaP# ˭AtlvQ[ i}Lԓs5Vr [,B.tF刟8f! k*/tÃn%d ĤDfp W 1`%X8J tE41<,ˏg}2#')IPsz2724+]y ۆ pzq_wiDf#lX++Dmm8t+z n2]ZkYǚ-EGꠁP$4W}ȷ$-w53BUfdDddddd<|{9KJ-HaN)X*||UWZ\>#FKK|)9 +{,J_MHAZTH!_6Z[; EEs]1k:o $ߤ[GH@ߞ(WtJ~,v}15>؈ƑH c 翫衴ϙRcOJr_O$:~"*E*_>>t/-[pد-YHE (;ADp =kJJm\Dfɠ15=őE*G7θmн]ݻa5u."ܑ_nܜf@̀@FN~vZj]mզU#q;zS;SW6N6k@Q~T{%v8zZRi.}*PYU"BArʿ5ks8rW[h AW8Jt-qaR%LmrqR'vN[_AV2/;C{_^ GK9$:9QxwX:=^I<m8i_j#=`ILT.3Zdq{)2@HS;)gN# Өߓ"A B3(NH<6JJDu)ig &x3 PxhU&N˯ ZfՊIK*)T˫^0:29ӓigELz~4E=crSE i&&'k[NS]KrJs&k(1uA d цtbA"`q%8| 4\).,DB+K_68{ -L Nr$+#VJ ` 0ap2eɲNng+t3AE+ Z̮-Ț꣱%Ԅ$pae2R`L⮔~` @[JmW`\ʋ&X Kn w#` 5M% ԁ~ƣI©9Yjkbc6Ia yչ. L??YgQ0HyiQͬ ҆xjCǐFTj.҈ԫhX.H#'b Gnw1d"GT𗃘,Y0+ݢ,V 9Y>9\ `ԥrK|K/L?WT& CAepe@Yg Njvw6i-bUaJ;1+NKʪVU&0f @h:S|˶J});׵@B,db,2uaxo"i ؖfo [֜rYKKtb@1].PL( H+1-ы rjF3A`G zz}N2g<>,G#6Gw^Œz:kaCO~u֞-2zgƧOG?>-o6K~ a#"1ba"}h _qhm<~GmFmkdLf=*nyELrn1͖䲧1~p 9D>&3V#nOwS' :@ww Ќ0Y=waf>j󻹰yU*UBIRfK{hKU7+!435ދ[ :UF?coY5Y>TNJ4+BjҰFi.5fޮ$l48'Aӈ ">1}ì. m`_\`g"ޓtA[yyȎsn}u9;;As&kvu~aLݎ L1<<볖Ɩ sx]d^nG>)y: ؅c*lW ׍Yp7蜷@[D7}5"]άEfy<+0JoGrQL+TWW8EhZvFq+ X8.p<(y)X{~α$_I-UMv%8(y/'HMZfow\{oǁW (2x$>z _s@Z6IpRn+C-`zO[_iJCewp>e-왒Ussy r>@I!+AVv<&א^l-߇%;҄-`e.=}W~-0 -ڳ-;F+/G/Eb"ӉaWU!7] +Xuyy)+#ƝpU'$|A*:r̜@!ന͠]S3fEKTۚ'c࿪s%DrÄ4Q1ZWϢ;fNاm@z 9s0Gܳ90*ۉHЌe 3ځ@w#Yq߹ʃB Za" [,X4_نꎁrHfEzQ:urf[yp){nXrvDtbtgN6YڋŒJN29(P<L*NqZA1R8+" \.#Z3Z%JsѼU}D+ZbU` ]~0tm9~q4:Iq8a1'xWXst$ g2Ũj.p!Ũ*GBB`=Q1?]ͨp3Eܻ%4d\r7;dD9OTsC tu#E8꛳\]%ɴC+gQakϱ|з3@gJz Nªuv/e媝| G Ww4#pӶ:m}t # GG:n$~㷦n}U07?$SԎi dK.Jw6AU䘩W !YMP=I=m"mj\ 1m\Cp&ؾ6z3vᓾ?Y&C9rݠ8 1,|۰շ0J̓HjgbPǂ /`)ت>;mfFjtr@7T@XBp[2P@V*9 TU &F\> ̓`4aۆM'!Vb@vP84\_/QP_[oC^mn.A{ S +g{yep ךiӻc0| U<햯8e,7^ڐ5= ߭B#N"oOg3@1Gror+C8-Er Lv\jŖ+6yL~-2^9QyoEhߊrT;mb+N717|пCzլ%7RNG/&s3jVh'^&^ܯ.i4u]FF~t43‘N8챂Gυ9.a앳IxMQ&G4pO rM@!-;WmJTO J[A-j梄SUH*cB ըRN`M8 \1J& դΕ(UTF5=G0ΎA7/OLiLk8]Qb/*prs! Z!Z38x*JB09_Ə/\::ȹ9F5GܮSȍ>bR]%UCf1N $*P`( Nc\D q"Nˈ6&ZCe,nDD;A~ #O͓ z) "(U1Tr.*FQKbQX WO3]7QթqFb@Tyߡ%s Fz ,<5`ƒr}#i,_0NSpAהsby,|+W7о8D4b;Ld1 Dz63r]~$,rhE*c)%@'K:IQRNu' Sь*P@cUP:| ]92]x `ܰ!cbc~$'ȶqs9=Q ӡ`?3#gm`zY&õ2DldGKw 0rVɖ:2dkrs+Bs+qQs^W$<`[0)HȨUExMh#U9ulùu="%~D圸8 zc8&:/1|pΣqt_" MP1D3إF"=EZVx5ï@ U#+ !qfPѐQf:M IAu@ǃ4O\b>Dbt#qvhc{15> Ǒ e {d,(/Eۥ* щNj4U^d.#A2vASZ7u=C3+fd\iG/9v@DL'N7'r7z86cfoP /"_*HdLM$V:t8A1b>RWy]ucߐOӎB~fBek0#7Lg1TǀabcWajbDp,̓HjRfIq4YpW fdYu4J"[N(,͎'d\6t>?&I.)Q$W\`7Xuۢµ" ?/˾9+u_hL+`?~}q:};X:P q+4nu|% [.KċսYE9&j̟?'@Z/Ps$GHlG͓)|v=wPa6Fz 3~R?9|_He $tEH:2 mpFv/֨8]*('.i]jآ@FkkoHHI3u'EI124އ'E[RpWɥLAx u۟>$Oo%nnPeRD#aZp=X=A1֓@E|TEv7uHD#OD;菱SZC?[Pox$ٍȟ/L_k;|! iW*+_?3.oxwJ:_޿N~ ͪ 征[#9ʧTj)Qz'ÔQP𲍪`V pD->9>@.F1KUwO* }JS^"+ 6%:Ίߒ}\6+9gU @KGB2uHrG d'@Ee1y*%HLs>XL<5\= $ZYG%"XlUsUI ]*Ot46%nd&ޤ`Ѭ 0H[P[iBspY ("b-E`xav4$mhʸ_V^y nL~^Uh21wҔ!q' LeEm%ZUDRR6Я!"  @8%6,PB6% xȺF( >iZayQ @ 0 PrP^@sӿI %R mm$8ΎB ij6ʖgyޅ5k^;bUAZk@wU"ᙑRBCcT$YԸ-<eU`D9`LZ3/DMUͭ|N_`K5N\U=C\cqH9 ZEuCX8uJtD33iVFmMhx\D&bn8eo>1ص9xS; [?חH:e;Aqf,Ns8-C!ҼB3p;Y="ܪyX+&2^iяT׹f*uȱJԙ/;_iOLMiN0`Z#s8,T q)G|RR)J qpo]H2C^s,WIR~f" },I 'E=ji"kNk9c)N:!3~R~-Qyՙ'>.3 0N=VP%SHE'Oep5ckHq?qZU^N;XP#a%LL0%/ @_'@7{ C>Ip m\T0]'/vSP38Z#ߛh+y6vYΐrA(,m8|8]Fc~.fZ3R )(HNu-|+dZ=(]_\{zdGaxZb;UWи;?Ҥ8Y%0Ť@Bgdȍzܻ9-pVKթGvYW-̢q#{U;_K ւXyllm-J57bOp?S礇|INlY uܖ9R:bEWc}}4&!ֹOZAւ,G!vUVsueթY0v5!WV,KQ&7 D2ʭГ[̜؅;&ɐ[KlBX!8{,fj<2MH|:OBʖ=b7FRO6?5.ꄄ<ǠJ>?kwd7Y&pѹ.ҟsu|||{éoa[5nQռ /J #dN_ #ƅ?3!w@-\ M#LN89<_/ NwYckkU5 r_F OϾxk䄥翰rPSənը7}=n.Gp;\z137.a.>VWy5Ȩ7ZWr'@9!LOV0/HshR11y)b*!s #`1^TBp9U,M*yi-'ed:WPc^er )9Ý0nT(2L ~4uP(kz>4 -B1&h©i.I]J 9R DY E)EEܮx_ײ{A0{}āIn֦}Z#ȹ( Mvn%hSy%!ZjN5! tEjK\שT+sHq6/<PŧEd<ec гd +>zJYjx[?_m0D,½hOF^c!d$ޘ@]Dw,1MFښ%h>W? [9rܻ8)0Y7@ثՅw1A8ҴE6^IxIT&GLAp2yJ8c_tsm96u"1:1 Aiz\$[! g@PBz&X/"$ո% |@A)pv9~g\KP"<&8]=X&D Z2 %lւءv+T5Yr=?G#\3SeICTɹ~s"g6\yz5k|_>mX^5#d^ߒ\ɁJ K%@ze(xOfFr_,[D/݄4qLD>[>4Q<%Gx7-)~;70kP]qG.޲P.>@+vwe|GK]gW7}ݳG!>#=ƫɁT()Y0k<7V,G:A<4MSr70W^Z70&&7[\F"$zn,7h5f7fЮ>n|<21&L SmDier{(ظ@w4i3z :gGh|ff|_U$0DXkq)I^3ީ qM")"15\!œ۷wU; fDEƊfּNѺtٷ3QCKa99$z:^oF/@̾kO;[O 1l̉e<; IczbH^SRKҎIv{XdePϡ3@BY]?%POwغ͛ Ms#beK[Ov(\T6l 1_%wM靶ѻOMN#$WYŤ}&Ns";qgf-ENd$_w=l 5&v>k̪Ӵ~Lzk& 5ټ=6d)-Z4q^nlGhNdse֘ LBe%qи;+Ƙ E-DY4fᅗ` `F}B=tuG`C505kamSCKXG$kb l:rGF2c%H--[#7c"Vɷd$V+^k85 K+;D06Jxa$߸^xL"#46 bġscLFhHvШ(*DO;3]/!8qJp BMoYuSw*ρW`oX,kx085JYfͿADD. _̍G.gdo[鞬ڃ13LOefo9#mQZ˘Z;EЪ=霟N% 6Yɕ_c85k%&D>a:qw\O^DDk3i!itlƐ{CJ˻&RƵ۰#"7K|Lc]ъؘU#%DXbjC߭4d.9jl1Wz|D4=Tsz#]|tsÕ縊UAa6u't_<ÖRZjZJK%M?Zih\̱|)^' EYBRHZ5cbww#6#aS.|i|U *+AӐm;ٲo^`Rviq73kQRw j懷 Յ 6az\v5iePkM {OX,2i}%)?uc$KSn|EPڌS`l IiR7m5\Uj~J` é&P,'+FbHZ`D^r׮_ρ/(Ou_BcG=vb [:}|a1>,*GH̒Cê%TjG!<'븫iH^] .^ OU6A=c|P[*I9he29ͱrx4 6>u/ # |$ V&4X;>b:*-=B݌ӔvY9KM(nk4fpT=ſI6R9a%- ?6r-"7=4UNZP->?Lq| J|ɇ7]?g.ط?LֳmFwY!4}F"x0shD [zY{ Ss^"sh .'us ImD-+\gB3@8 E8ۆ~"IW5ytGCHd 뫮w71JSLMTĄK-读U#k>E Qğ!|6~F/0/3y({Q-cz!i$yݡph2##pC9:7U>눎:Ɏ QU(4#5 ?sV,NpbM9'Q<ߝej(W!=Gj͋s4o.tV'x []|;O]`/%D:KB]mH~YWRLErbd(imK}Ńz[yE\ 0rT܈ؼR<Ȩƭ 5 *\bW Հ;忭PٿT$W6cM*PX>$[A 1 )[%@rKX)RQ0&E7Zu6YWa FW•o()KQETIQqOzA4xзg=2'2hZ1*%du!ةr#@fU@a22d3>)LʲPeМH,* d-` sWc3@kitU̓ƀJ(}G"KY_a2x5g=I d :s] 2[F/]70}nCws9wk>Es4>Kl,̎zњY+A1};Vak8d26#6է51$`EI o,=0#۽##G-{R(=ğbw.+H [ beivupĊX[_{45 ?uI>$iwH\,Yci*R(|\wϑ~7gPwyX.ӊ47"zYowtPLnV뷸h8FE~-g&| [D^7Ԥ:}ϕt;=~]e_k;uYa$?J y b7y{*u.5&--1heV~7-d&o3zBS!/M#@K̋7j;D4gཉ:" ,i/GW#|ulY Ѵ|(秔P3d?m&h"cvÛ PB`g^uP56TgNwK_!d#SK/8=ia  m ߶6Qe# oHWӭz#H ( V=g)0,-RqYCY n }RPr.]d_?͟Gh ;}wOԹgDFX\@:,9@I =KA,ќ)RP1#Li@RߍB y7 HY@[I@Aq)xtmu..oީJx}wu>s6p"}#}}#[uc 6B:hR$_BSQ29eYa(TU(ksfƿiQ9 6v߯yy}n&lHy?_|47ϟӯsə8 P)iW뷳=|ȃCz/AT Vyߊ?ŸQʴ(.QKD).QKD).QKD)[G).kڏo.+ep3V898C=>?Bz"I*œ.=I\~PV qXJq.?̛L(IOЅ_pERrACZb"í;Č9e͑}J49.gm@A DeBݠ2 cm׵2d Jl7]?( nsڒO$PK_(<Gg{ӗbD3BK]Lʏ?) p֖dJ?4?( -@$O`FZ.];X*CH ɰ@&|[73=I#ZYd.'Pn5YqP~89ZfrwqE}{VHטRyPI^'} >(\9*HE1C]Dߜk'Gf X3)\xf%ޒ_U!bF Z} Tt ^AAs"H"_('v=u)򭉩{U(꒛,1{ӕȊZk'")H+NP/y.ƄR*R5LhWHcRR$'Rf1)gi)EcRb'%[/M9!FIi9^Z-D*Jkj5RҊ4Ɏ4w-ǃGF9Q!d{-qQe;!cK$1fNVW:F[euT޺#u >CMϊX=,y,0@葉a*eëø_ 0CeIyIr:'J\#FZ8,̿˼Uy6T'5;]Ɋm& \t-&e}RvjeRBi&h"dR{2L%q) ۔}GAL0]|O?ZqiZp˿h'J?y%+F%TK{1'WY XRGzVJwH;k e,UY2Z6eW~,zjY0n$ȽjZsdb5 rh[TWJv+L;7W1B GG[Qҡ'yV|oNMND')?{m'"ɸ@Zh Y>uwrCLN: G}ЛEMȼn<ړSOdiYp $rbTz嚣a Q?)SaK$VaЃ(tgʃw-|sîP  mwINo]s(:P;oZ3䈪ҏ?1 u?"x u1+L*O#/mx׍WBcOw ]{`,Pe,1(U\qEP>&(ʡQŸJu LyNjf鞝<״TFp7;4a|eB86ɗ.RO~'wl`zBYOkHg;BO.OF# IG|蟠f.;<Ăr:Maiy)pdL@uT/i 4p# Uh@ER@e( {E  Rj ?Ͻ[:+"GO}r p"(s&NG0+A:ߨ:" yD 3tvA|Nm Z-]׏haZ c1oIl9_# LM4_Szn6ꪪ-ZumЪ/ 'D5Y7 .Vݢ1C1R,:ZW1΅mҎE,n<Ҹ`P Br:!F3!?w͔D5?4WPC钏on3"W\,h!O7;@g5>l%w&畡o?K_.sJD$掱ZʟlI{IFc ZW'Io@1 ;XC:V~cɊ{G*+j懽Bl^ˑ13Jxow#źxkimEA# Ύg6cgGNaq.~ݢ&cmS@0B ֬'w ["T5$,qT<2}puN]xdv GHXdV=V BkSg턖λ:&͛xoSxNgc68Yt+5ؑStqiE>y6 ptxqi,5򴩘Lvw(nAA/H[63٢H9j:: [2̚YٟUNHauD8ZmdJ_o 9lɇeCB(c.ZVtXb7gQ5-U$O.:Hի+h[GsH=.{vᲆhzEntFU, *2V !fRg&/MwbS `vMۛ OSr|eL1@Xikeo3(/\;p- nȟQqac\Sw8a{˥17}Hm6d+VZ;75# yWʭJ{LM7#( B힦]| c@4gnnxʽKyenɕc<`T= '2sP 0YFlɩnB4EtiC[{i`~Bvzc`?9h =vȌx{YhSGŹ9I\3FQvo4ꔦ`Ͻ,̐27=gl|͂I.nқygm"fτdn=Y17fQ3; _U(_?]M f/MpޭS&^,%ڸŠ봢a*1qz Y|r=O ~^q c0͡;ܸ3VsYw0L| {ki{7KمI "4X[γ{͊cVTvJFVV_S|Ntv=a.KqA1Tű(!W)Ne8LX4޷[e4Zn|kd`?k$j__SNYMW=ȂoMR{\і S$>-pRSu6-dtԴ ?'-.1aP[yik^a!NYn8~E=U_Dߙwc ͻdaJڍYF:K2(ؗ^ϥz6+ |h6vRJބaFjL7ilXU[6XA9>Ydwr.VYJ$0>/RxOd7X[U,o뽸bHӏaؤ*_>B@D3A޸X7t{aS͠X{h&'oB _qAT{>-2MH{`U\=#`M⅃)Az-Af,-m61lXn|X *r]8Z/‘YҳXLp1+$P!VnVt"GF Yhd?o[9}+ 2rbn=9ݣo^`m$_,[ùZnvYi2ڝE"ג[Ɨfe3H0mn ;g,R㶼j7{ kN/u{'B>GJ8?|ԂΟ.ф9so!adڴa͚w(߲C”(fFopnNlšڅ{ q48ر2_@j/ո/bWNH[y^9H;Ԏ= Hd^G+s2q=\: lZ=zX/gv3n,[;̵>|m$q.g|п]utp[s87-s\li;_ËD 3ả6 H8'CW.jX-`' iyk?m`ik|h8pip$1%cq֝|.q-bN6H&4nđ̇C6xr1a6լ$V/*.FԻU֞& ln57gQ|ִ&ȽoV"P^Y6WFE6ɉkvG"k^%E0Z$+;1 [fkLdJd0AsgnW\۵I; EA. f'ޅ@ф Ȓ0ĬjƵ[L?YnD+fqEO֢60$ǁlbelWx,j\fRgnaGYxW|q2fV.MDXWvTCY?^gGȎxu>/p|׊IN*=ÌsF)XrR圇3c8G G>dO}X&f!!5*2;r4fCL-? ui֝`B>o6| nজM7fBQyw8'-Y%:r]X3r y1L61m>O%ʿ 7 @EJ\JB=_3g.:Y_DO*(N͆l(Y]qsFKy{emYul+Giw|7qmkܱ a9mXF9_Xܥ0p cDjln6"$fVi4qp~1.lx {9>cC07A̢]%YdXs>lz.H-H>&xFV~GGS=o8wYK.ɚc& o5mL|x-٠X$~5o\,JǶ~g)O_:M63p➶oF? xBF?s_יįo-v@Z7/6#C$h j F 7P>%GI#:ƿS)~JjgO0YcWZ!a8yʯ-$ْ?5IJ|O7yo~/>v6-c I)fC4r@Θ:J.E ncZ:h3礦4KLۚ3)ms6HrA|Mb9}LfJN\ z g$d-mVoiQH\57H^o(אWd?!O"Ô˫ a@~S;lqw`A\JG/#A&&mNl0iUKKƟ=?#M0wiA5{1#"ٙ`#j6^*rC,qrXlnNx;=bBch\D%\"7\8Bp:Qv{F9&{=) z6Z{TJ KIjyijy:⾭ūw1HfBol~&kC9kڿh5;`56 ғ(|#['uJ.9Ϛw];vYP ŴWvI/JΆ/D26o;s\Xb7Jjtd\ɚ]w?rqa6}֖%kNSA=TISO^>eekSmVIGչQUn_ǴvNмO{a.d}hƳs^#pY3UHwn o>ry([v¿m",T`XmPUb[qr;.# ./gSLA }}ZO-u_{~Y>M:`,"_Om9\xg\"4!5qlt]RÑ.c;9=qOO a|<{T#Ѽ;Fx~;٩o&ATrH  0$B` m$VpXŴ3_)$whh UæHޖܱ[9Wo9أ2vAL9d.Hَ3YlO* (xXw29X`޾ AvX +cE*@^=P"+Mrv/6nka&gQ>;w\R(j_Q`jo0K '8Z7teʛ9|^17!OV !7H?߯>تHN{:/wma~Kljc3_9q?exu)<0Y_Tb.Bh"3 `!PDlO5N gN5_){ ̞pn6k>9L}+.{HXI3IAfxj^ZnlcK #iiOˈwyk; M_$+$ ^1Q4;"P$vD HDP7~ʞ7՗yߤI<"ޡξ V`UHKz頓Ψ#{C;oX:A- btʝ ?.@Sq h[Y ^l%0-/]i"  :y nf.3~P*_O "K@?B$2AQ*/\FO.&,X%h4ٱmO.W>Ґ%6y{'s@73;}Umiwk?KS &ZڦGYv< l &iJM-̠ o4iLg. xtn03[Vp˥j~IN[9]Mce|TZcs|YKU#r*lm"fiz5@ i:{Tpy9 ]չ.EMH}X],Gϴ=ǹ\~WȟC]hMgQVieז%Dlʹ?6Z:^fD)n'Όnztz(B40_턳9<p~4y"C׫m OM4=\V]hSw[*.ky|[t;`&24(2njfH:$DUق!!01#,:;vp$uupJ%58a .:ZT1ĭا-eU wi_+fB--~bk`wёJQx}r\S}lg8mpS@VuMN4Ȟyd~`3g11PF^u1Zzv]zd:?zrehH.-=JM;wP9*: v*D<^籾Sӭ3cwLk1Yq 󌈢,`/$Li>q9X-!kͦ0ߣHPgAa]Q#.ț?Eb-M-w~F'̼|)w&4зhwtvb _k^A?9ާA&kf4&w)J{ޜ?&{ feynmf-1.08.orig/template.tex0000664000175000017500000000126506250470140017702 0ustar kmccartykmccarty00000000000000% template.tex -- trivial FeynMF example % $Id: template.tex,v 1.1 1996/12/02 01:38:45 ohl Exp $ % To typeset, either use the feynmf script % $ feynmf template % or run Metafont manually % $ latex template % $ mf '\mode:=localfont; input fmftempl' % $ latex template \documentclass{article} \usepackage{feynmf}%%%{feynmp} \unitlength=1mm \begin{document} \begin{fmffile}{fmftempl} \begin{fmfchar*}(40,25) \fmfleft{em,ep} \fmflabel{$e^+$}{ep} \fmflabel{$e^-$}{em} \fmf{fermion}{em,Zee,ep} \fmf{photon,label=$\gamma,,Z$}{Zee,Zff} \fmf{fermion}{fb,Zff,f} \fmfright{fb,f} \fmflabel{$\bar f'$}{fb} \fmflabel{$f$}{f} \fmfdot{Zee,Zff} \end{fmfchar*} \end{fmffile} \end{document}