diff options
author | Karl Berry <karl@freefriends.org> | 2006-07-01 23:18:44 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2006-07-01 23:18:44 +0000 |
commit | d6c7c85a6b1261a182a60431f6af860b855ec216 (patch) | |
tree | 794c53fc0f09ba53c39a272379fbf0004390c6eb | |
parent | d6dd1c3b1739f957dd0acc6f89e480825511c927 (diff) |
mfpic 0.9 update
git-svn-id: svn://tug.org/texlive/trunk@1747 c570f23f-e606-0410-a88d-b1316a301751
30 files changed, 34222 insertions, 22402 deletions
diff --git a/Build/cdbuild/ctan2tds.pl b/Build/cdbuild/ctan2tds.pl index 35f8e41143f..32033d98686 100755 --- a/Build/cdbuild/ctan2tds.pl +++ b/Build/cdbuild/ctan2tds.pl @@ -307,7 +307,8 @@ chdir $startdir || die "chdir($startdir) failed: $!"; $standardsource='\.fdd|\.dtx|\.ins|\.c$|Makefile|\.drv'; %specialfoundry = ( - 'fc', 'jknappen', + 'fc', 'jknappen', + 'mfpic', 'metafont', ); $standardfoundry='public'; @@ -365,6 +366,7 @@ $standardfoundry='public'; 'latexmp', 'metapost', 'leawood', 'fonts', 'lfb', 'fonts', + 'mfpic', 'generic', 'multido', 'generic', 'ofs', 'generic', 'pictex', 'generic', @@ -397,6 +399,7 @@ $standardsourcefmt='latex'; 'ifxetex', 'generic', 'jadetex', 'jadetex', 'metatex', 'plain', + 'mfpic', 'generic', 'ocherokee', 'lambda', 'ofs', 'generic', 'passivetex', 'xmltex', @@ -457,6 +460,7 @@ $standardfmt='latex'; 'lfb', 'fonts', 'lshort-portuguese', 'portuguese', 'metatex', 'plain', + 'mfpic', 'generic', 'mpattern', 'metapost', 'ofs', 'generic', 'pacioli', 'fonts', @@ -563,7 +567,7 @@ $standardtex='\.cfg|\.sty|\.clo|\.ldf|\.cls|\.def|\.fd$'; 'manjutex', '\.sty|\.clo|\.ldf|\.cls|\.def|\.fd$|manju.tex', 'metatex', 'metatex.tex', 'mff', '\.sty|mf[^f].*\.tex', - 'mfpic', 'mfpic.tex', + 'mfpic', 'mfpic.tex|mfpic.sty|mfppatch.tex', 'mh', '\.sty|\.cls|\.fix', 'minitoc', "\.ml[do]|$standardtex", 'misc', '\.sty|\.ltx|\.cls', @@ -695,7 +699,7 @@ $standardtex='\.cfg|\.sty|\.clo|\.ldf|\.cls|\.def|\.fd$'; 'metatex', 'NULL', 'mff', 'mffdoc.tex', 'mfnfss', 'NULL', - 'mfpic', 'mfpicdoc.tex', + 'mfpic', 'NULL', 'midnight', '\.doc', 'minutes', 'Sample.tex', 'natbib', 'natbib.dtx|natnotes.tex', @@ -779,7 +783,7 @@ $standardtex='\.cfg|\.sty|\.clo|\.ldf|\.cls|\.def|\.fd$'; $standarddvi='NULL'; # let's try relying on authors uploading pdf's. -# packages which need special Metapost files +# packages which need special MetaPost files %specialmp= ( 'feynmp', 'feynmp.mp', 'latexmp', 'latexmp.mp', @@ -1010,14 +1014,19 @@ sub donormal { if ($inspatt eq "") { $inspatt=$standardins; } - $Foundry = $specialfoundry{$package }; - if ($Foundry eq "") { - $Foundry=$standardfoundry; - } + + my $Foundry = $specialfoundry{$package} || $standardfoundry; + &runins($inspatt); # rebuild the list of files in the directory &buildfilelist; - &domf; + + if ($Foundry eq "metafont") { + &dosimplemf; + } else { + &domf; + } + &dodvi; # rebuild again, as we have .dvi files now &buildfilelist; @@ -1099,10 +1108,9 @@ sub dobst { } sub dosimplemf { -# there may be some simple MF files - $mfpatt = $specialmf{$package }; - if ($mfpatt eq "") { $mfpatt=$standardmf; } - &install("$DEST/metafont/$package",$mfpatt); +# there may be some simple MF files, e.g., if specialfoundry eq "metafont". + my $mfpatt = $specialmf{$package} || $standardmf; + &install ("$DEST/metafont/$package", $mfpatt); } sub domp { # there may be some Metapost files @@ -1253,12 +1261,12 @@ sub killfiles { } -# rebuild list of files +# rebuild list of input files, e.g., after flattening sub buildfilelist { opendir(DIR,'.') || die ("ERROR: cannot open directory"); @filenames =grep(!/^\.\.?$/,readdir(DIR)); closedir(DIR); - print " [list rebuilt]\n"; + print " [file list rebuilt]\n"; } sub runmf { @@ -1325,12 +1333,11 @@ sub MAKEflatten { # so far we've only seen README's at one level. &SYSTEM('for d in *; do test -r $d/README && mv $d/README README.$d; done'); - &SYSTEM("$MV -f */*/*/*/* ."); - &SYSTEM("$MV -f */*/*/* ."); - &SYSTEM("$MV -f */*/*/* ."); - &SYSTEM("$MV -f */*/* ."); - &SYSTEM("$MV -f */*/* ."); - &SYSTEM("$MV -f */* ."); + -d <*/*/*/*/*/.> && &SYSTEM("$MV -f */*/*/*/* ."); + -d <*/*/*/*/.> && &SYSTEM("$MV -f */*/*/* ."); + -d <*/*/*/.> && &SYSTEM("$MV -f */*/* ."); + -d <*/*/.> && &SYSTEM("$MV -f */*/* ."); + -d <*/.> && &SYSTEM("$MV -f */* ."); &SYSTEM("find -type d -print | xargs rmdir 2>/dev/null"); &buildfilelist; &donormal; diff --git a/Build/tools/tpm-ctan-check b/Build/tools/tpm-ctan-check index 2b731b56080..7a2875f1f75 100755 --- a/Build/tools/tpm-ctan-check +++ b/Build/tools/tpm-ctan-check @@ -61,7 +61,7 @@ sub main "ltabptch", "ltxmisc", #"malayalam", # missing C sources on CTAN, wrote author 5jun05. #"mathspic", # inside pictex, later - "makecell", "makeplot", "mathmode", "mcaption", "memoir", + "makecell", "makeplot", "mathmode", "mcaption", "memoir", "mfpic", "mhchem", "minitoc", "microtype", "minitoc", "mla-paper", "movie15", #"mpattern", # not up-to-date on CTAN, wrote author 28may05. "nag", "ncclatex", "ncctools", "newlfm", "nomencl", "nomentbl", diff --git a/Master/texmf-dist/doc/generic/mfpic/README b/Master/texmf-dist/doc/generic/mfpic/README index 411fdfc8bce..ff9292a13ce 100644 --- a/Master/texmf-dist/doc/generic/mfpic/README +++ b/Master/texmf-dist/doc/generic/mfpic/README @@ -1,5 +1,5 @@ -%%% File: README.txt -%%% A part of mfpic 0.7a beta 2004/04/16 +%%% File: README +%%% A part of mfpic 0.9 2006/05/26 %%% MFpic defines a command group \mfpic...\endmfpic (optionally in LaTeX @@ -7,248 +7,166 @@ an environment, mfpic) and drawing commands to be used inside this group. When TeX (or LaTeX) is run on a file containing those commands, a Metafont (or MetaPost) source file is created. When that file is correctly processed by Metafont (or MetaPost), and LaTeX or TeX is run again, the -result is a figure in the TeX document in the location of each -environments. +result is a figure in the TeX document at the location of each +environment. See install.txt for initial setup and brief installation instructions. See mfpguide.pdf for a short tutorial. See below for a summary of -features added since the previous official release (0.6c beta). See the +features added since the previous official release (0.8a beta). See the manual mfpman.pdf for more detailed instructions and descriptions of features. -This is mfpic version 0.7a beta. +This is mfpic version 0.9. LEGALITIES ---------- - All files of the core mfpic distribution (listed below) may be distributed and/or modified under the conditions of the LaTeX Project -Public License, either version 1.2 of this license or (at your option) +Public License, either version 1.3b of this license or (at your option) any later version. The latest version of this license is in + http://www.latex-project.org/lppl.txt -and version 1.2 or later is part of all distributions of LaTeX version -1999/12/01 or later. + +and version 1.3b or later is part of all distributions of LaTeX version +2006/12/01 or later. While every effort has been made to make mfpic useful, it comes with no warranty, expressed or implied. - MANIFEST -------- - Here is a list, plus explanation of purpose, of all files in the mfpic distribution. Read it *before* trying to process any of the example files. These, and the files generated by TeXing mfpic.ins, constitute the mfpic distribution to which the LPPL applies. -The three files marked with * below are the only ones essential +The four files marked with * below are the only ones essential for using all the facilities of mfpic. All the *.tex files in the src directory (except the plainTeX file -refcard.tex) require the LaTeX style file mfpdoc.sty. The manual is -mfpman.pdf. +mfpcard.tex) require the LaTeX style file mfpdoc.sty. The mfpic manual +is mfpman.pdf. TeX/LaTeX code: -------------- -*mfpic.dtx Contains mfpic.sty and mfpic.tex -*mfpic.ins The unpacking script, run latex on it. It reads in - mfpic.dtx and grafbase.dtx and produces the only - required files: mfpic.sty, mfpic.tex, grafbase.mf, - grafbase.mp, and dvipsnam.mp +*mfpic.dtx Contains mfpic.sty and mfpic.tex +*mfpic.ins The unpacking script, run tex or latex on it. It + reads in mfpic.dtx and grafbase.dtx and produces + the only required files: mfpic.sty, mfpic.tex, + grafbase.mf, grafbase.mp, and dvipsnam.mp +*mfppatch.tex patches and bugfixes. Not required unless there are + some MetaPost/Metafont code: ---------------------- -*grafbase.dtx Contains grafbase.mf, grafbase.mp and dvipsnam.mp +*grafbase.dtx Contains grafbase.mf, grafbase.mp and dvipsnam.mp Documentation: ------------- - install.txt Basic information on installation - README.txt This file. - changes.txt Rambling history of (most) changes - mfpguide.pdf Precompiled tutorial - mfpman.pdf Precompiled manual - src/refcard.tex reference card, landscape, should fit on two sides - of either USletter or A4paper. Plain TeX source. - src/mfpdoc.sty LaTeX style used by the next two - src/mfpguide.tex tutorial (LaTeX source, requires mfpdoc.sty and mfpic) - src/mfpman.tex manual (LaTeX source, requires mfpdoc.sty) + changes.txt Summary of changes + install.txt Basic information on installation + README This file. + mfpguide.pdf Precompiled tutorial (usletter) + mfpman.pdf Precompiled manual (usletter) + mfpcard.pdf Precompiled reference card (usletter landscape). + src/mfpcard.tex reference card source, should fit on two sides + of either USletter or A4, rotated. Plain TeX. + src/mfpdoc.sty LaTeX style used by the next two + src/mfpguide.tex LaTeX source for mfpguide.pdf, requires mfpdoc.sty and mfpic + src/mfpman.tex LaTeX source for mfpman.pdf, requires mfpdoc.sty + src/coil.mps Figure included in mfpman.tex examples/pictures.tex Run tex, produce pics.mf file examples/lapictures.tex Run latex, produce pics.mf file (same) - examples/data.dat External data file needed for above two + examples/data.dat Sample data file needed for above two examples/forfun.tex Example of \mfsrc: Run tex, produce forfun.mp +This distribution, the latest updates, and some past versions, should also be +available at my web site: -NEW FEATURES since Version 0.6c + <http://comp.uark.edu/~luecking/tex/mfpic.html>. + +IMPORTANT NOTE +-------------- +A minor (I hope) backward incompatibility has been introduced: + +By historical accident, the MetaPost macros of mfpic (grafbase.mp) have +overwritten the primitive MetaPost commands "dashed" and "clipped". +With this version, these commands are no longer overwritten. The files +written by mfpic have not contained "dashed" for over 6 years, and have +never (I believe) contained "clipped". + +However, if you learned enough about grafbase macros to use these +commands, or if you try to run mpost on old files created by mfpic, you +may need to change occurences of "clipped" to "Clipped" and change +occurences of "dashed" to "Dashed". If you run mpost on files created +for Metafont, there may be occurances of "clip" that need to be changed +to "Clipped". + +Also, if you have been delving into mfpic internals, almost all internal +commands have been renamed. + +NEW FEATURES since Version 0.8a ------------------------------- - -- Mfpic is now distribution in two .dtx files and an unpacking - script (mfpic.ins). The manual is now supplied as a linked PDF file - written in LaTeX. A short introductory guide is supplied, also PDF. - - -- New path modification commands that produce a subpath of a - given path: - \partpath{<frac1>,<frac2>}<path> - The arguments are fractions of the length of <path> indicating - where the subpath begins and ends. - \subpath{n,m}<path> - {n,m} are the `times' on <path> where the subpath begins and - ends. (See the Metafontbook for the meaning of `time'.) - \cutoffbefore{X}<path> - X is a symbolic name for a path previously defined using \store. - The subpath produced begins where X and <path> first intersect, - and ends where <path> ends. - \cutoffafter{X}<path> - Similar to \cutoffafter but starts where <path> starts and ends - where X and <path> _last_ intersect. - \trimpath{<dim1>,<dim2>}<path> - The dimensions are the lengths trimmed from the start and end - of the following path. - - -- Color commands now work under Metafont in the sense that no errors - or even warnings are caused by the commands that set and change - colors, and moreover, \draw[white]<path>. will erase the pixels - along <path> and \gfill[<color>]<closed path> will attempt to convert - the color to a shade of gray and approximate that by filling with a - pattern of pixels. All the following: \draw, \dashed, \dotted, - \plot, \plotnodes, all hatching commands, \point and \plotsymbol are - limited to black and white. \gfill and \polkadot will produce - shades of gray if the color is not black or white. filling (or - polkadotting) with white will erase pixels. - - For this to work, bare MetaPost color triples should not be used, - but only color functions (e.g., rgb(1,.5,0)) or names defined with - \mfpdefinecolor. The colors defined in dvipsnam.mp are not - recognized by Metafont. - - -- New color setting command, \pointcolor. The \point and \plotsymbol - commands now draw in the color set with \pointcolor. (In Metafont - this can be black or white.) - - -- The dashpatterns, colors, and symbols used by the \plotdata command - for different curves can be reconfigured by the user with - \reconfigureplot {dashes}{<list>}, - \reconfigureplot {colors}{<list>}, and - \reconfigureplot{symbols}{<list>}, - where <list> is a comma separated list of dash patterns, colors, or - symbols. The builtin defaults can be restored with - \defaultplot{dashes}, etc. - - -- \circle now accepts an optional argument similar to \arc that - allows one to define the circle in different ways. For example, - \circle[t]{<p1>,<p2>,<p3>}, will draw the circle that passes - through the three given points. - - -- For those curve creation commands that accept an optional tension - argument, the default (= 1) can be changed with the command - \settension. The affected commands are \curve, \cyclic, \function, - \plrfcn, \datafile, \plotdata, \bclosed, \sclosed, \btwnfcn, - \plrregion, \fcncurve, \mfbezier, and \closedmfbezier. - - -- The closure commands \bclosed and \sclosed now accept an optional - argument for the tension to be used in the closing link. The - commands \sclosed\curve and \cycle have always produced the same - path. Now the same is true when tension is used: - \sclosed[1.5]\curve[1.5] = \cycle[1.5] The default tension is the - same as for \curve. - - -- The commands to surround text with a path (\tlabelrect, \tlabeloval - and \tlabelellipse) now accept a second optional argument that - is the same as that taken by \tlabel for justification/rotation of - the text. In order to use it, the first optional argument must be - present (though it may be empty to select the default). The - preloaded default for this new argument is [cc]. This can be - changed with \tlpathjustify. - - Moreover, the first optional argument of \tlabelrect (which gives - the radius of the rounded corners) may now consist of the keyword - "roundends" which tells mfpic to use the maximum reasonable radius: - so that the short sides of the rectangle become half-circles. - - -- All commands that take an optional argument can now take an empty - optional argument to select the default. Useful only when a command - has 2 optional arguments and you want only to change the second. - - -- A command \overlaylabels (or package option) is available to make - the behavior of labels under mplabels close to the same as without - mplabels: this option causes them to be added last, on top of all - picture elements. They are then not covered up by any drawing - commands and they are not clipped off under the clip option or by - the \gclip command. - - -- A command \clearsymbols (or package option) that makes - \plotsymbol and \plotnodes behave like \point does when - \pointfillfalse: the portions of the drawing in the interior of the - open symbols is cleared (erased). \noclearsymbols restores the - previous default. - - -- New figures: - \makesector\arc - Makes a sector by connecting the arc's center to the arc's - endpoints. Calculates the center automatically. - \mfbezier[<tens>]{<list>} - \closedmfbezier[<tens>]{<list>} - Connect the list of point with the standard MF connector ".." - or optionally with "..tension <tens>..". - \qbeziers{<list>} - \closedqbeziers{<list>} - Make a path by connecting the first point in the list to the - third, then the fifth, etc., with quadratic Bezier curves using - the second, fourth, etc., points as controls. The equivalent of - a series of LaTeX \qbezier commands. - \regpolygon{<n>}{<name>}{<eqn1>}{<eqn2>} - Makes a regular polygon with n sides, <name> being a symbolic - name for the array of points. The last two parameters are - equations that should fix the location of two of the vertices, - or of the center and one vertex. In the equations, <name>0 is - the center, <name>1 through <name><n> are the vertices - anticlockwise. Example: - \regpolygon{17}{Bob}{Bob0=(0,0)}{Bob1=(0,1)} - After this, the names Bob0 through Bob17 can be used in drawing - commands where MF or MP point data is required (but not in TeX - commands like \tlabel without mplabels). - - -- \pairarray{<name>}{<list-of-ordered-pairs>} - \numericarray{<name>}{<list-of-numbers>} - These define <name>1, <name>2, etc., as symbolic names for the - elements in the list. After - \pairarray{Bob}{(0,1),(1,2),(3,0)} - one can draw a triangle with \polygon{Bob1,Bob2,Bob3}. The - symbolic names are only recognized by MF or MP and so can't be - used to position text without mplabels. - - -- \hgridlines{<yspace>}: like \gridlines, but draw only horizontal - lines. Similarly: \vgridlines{<xspace>} . All three commands now - draw their lines within the margins set by \axismargin and its - relatives. - - -- \gridarcs{<dr>}: Like \plrgrid except only the arcs are drawn. - Similarly: \gridrays{<dtheta>} - - -- Enhanced \barchart: the data can be ordered pairs that specifiy a - _both_ ends of the bar (Gantt diagrams). - - -- Almost all commands that set or change an mfpic variable or value - now arrange for the change to be global when outside an mfpic - environment, unconstrained by other groups, but local when inside. - The main exceptions are \store and \patharr, which need to be - inside a picture to work at all and so are always global. There may - be other exceptions. - - -- Some backward incompatibilities have been introduced; the above - changes in scope is the main one. Also: a permitted but - undocumented syntax in \plottext is no longer permitted. Points and - symbols are drawn in pointcolor, where in the past the filled - symbols were drawn in fillcolor and unfilled symbols in drawcolor. - - -- All old commands have been reexamined and most rewritten or - tweaked. All known bugs have been removed. (Unknown bugs might well - have been increased.) + -- \arrowhead{<shape>} adds <shape> to head of a path. + -- \arrowtail{<shape>} adds <shape> to tail of a path. + -- \arrowmid {<shape>} adds <shape> to middle of a path. + -- \zigzag, \sinewave, \coil: three new ways to render a path. + + -- \tlabel now allows a list of points even without mplabels. + + -- \border: a closed rectangle tracing the lines of the border axes. + + -- \startbacktext, \stopbacktext: Between these, labels are added in + the background; all other elements of the figure are on top of them. + + -- \axisline{<letter>}: the line (without arrowhead) that + \axis{<letter>} would draw. + + -- \griddotsize: a length command, the default size for dots in \grid. + + -- \vectorfield, a field of arrows determined by a formula in x and y. + -- \plrvectorfield: vector formula is in polar variable r and t. + + -- \globalassignmfvalue: a global version of \assignmfvalue + (\global\assignmfvalue didn't work with mplabels). + + -- \globalsetmfvariable, a global version of \setmfvariable. + + -- \norender: a prefix macro that cancels automatic rendering. + + -- \everymfpic, \everyendmfpic: commands to add to the start/end of + every mfpic environment. + + -- \closedcurve = \cyclic (a possibly more easily remembered name). + -- \closedconvexcurve = \convexcyclic + -- \closedpolyline = \polygon + + -- \randomizepath: random changes to the nodes and controls of a path. + -- \randomlines: connects randomly changed nodes with straight lines. + + -- \arc has a *-form that produces the complement of the arc that + would have been formed otherwise. + -- \arccomplement, used in front of any arc, produces the + complementary arc. Arc need not be one produced by \arc. + + -- Loops (\mfploop, \mfpwhile and \mfpfor) are allowed outside mfpic + environments as long as no drawing commands are used in them. + + -- \mfpbarchart, \mfppiechart: versions of \barchart, \piechart for use + outside \mfpic..\endmfpic. (Actual drawing must still be inside.) + + -- Somewhat better cooperation with babel. Also better handling of + filenames with special characters. + + -- \useraggedcaptions (option raggedcaptions) sets multiline captions + (from \tcaption) raggedright. With centeredcaptions both sides are + ragged. \noraggedcaptions restores the default justified captions. + + -- centeredcaptions option corrected in LaTeX. -This distribution, the latest updates, and some past versions, should also be -available at my web site: -<http://comp.uark.edu/~luecking/tex/mfpic.html>. -- Dan Luecking <luecking at uark dot edu> diff --git a/Master/texmf-dist/doc/generic/mfpic/changes.txt b/Master/texmf-dist/doc/generic/mfpic/changes.txt index a362e6d95a1..faedb731f78 100644 --- a/Master/texmf-dist/doc/generic/mfpic/changes.txt +++ b/Master/texmf-dist/doc/generic/mfpic/changes.txt @@ -1,38 +1,19 @@ -%%% File: changes.tex -%%% A part of mfpic 0.7a beta 2004/04/16 +%%% File: changes.txt +%%% A part of mfpic 0.9 2006/05/26 %%% - Changes History. - -VERSION 0.0.x: - -Development versions. Never released. - + Summaries of changes. VERSION 0.1: First version released to network, 30 June 1992. -VERSION 0.1.x: - -Test versions for new features, fixes, etc. None of them -were released for general distribution. Many new features added, bugs -worked out, code cleaned up. - - VERSION 0.2: Second version released to network, 7 Sept. 1992. (Still had 0.1.13.1 -version number in code---oops!) - - -VERSIONS 0.2.x: - -Resumed serious development of TeX code: Sun 7 Nov. 1993. Much work -done on graphbase code in meantime, especially by Geoffrey Tobin. The -primary task at this point was a radical rewrite of the TeX code, -including defining a prefix form for shading macros. +version number in code---oops!) Many new features added, bugs +worked out, code cleaned up. VERSION 0.2.5 of Wed 10 Nov. 1993: @@ -40,53 +21,33 @@ VERSION 0.2.5 of Wed 10 Nov. 1993: Bug fix release Primarily work by Geoffrey Tobin. -REVISION 0.2.(5.0.)9 of Mon 28 Feb. 1994: - -Intended to release as version 0.3 to network. Release delayed, as -picture operator code is overhauled to cope with arbitrary overlays: 11 -Mar. 1994. - -Horizontal offset by unwanted glue is traced to missing comment -characters: Fri 29 Apr. 1994. - -Vertical displacement of shading reported for MF modes with -nonrectangular pixels: Mon 23 May 1994. - - REVISION 0.2.5.1 of Wed 13 July 1994: Bug fix release Corrected "unxconv" bug which remained in version 0.2.5's graphbase.mf. -Alpha Test Versions. - VERSION 0.2.9 Alpha of Thu 11 August 1994: A test release prior to any official version 0.3, is ready for intrepid users. Introduces coordinate transforms, and other novelties. -UPDATE 0.2.9.1 Alpha} of Thu 8 September 1994: Fixes a bug in \sclosed -and a bug in \white, corrects some omissions and typos in the -documentation, and adds the \shadewd, \hatchwd, \lhatch and \rhatch -macros. +UPDATE 0.2.9.1 Alpha} of Thu 8 September 1994: +Fixes a bug in \sclosed and a bug in \white, corrects some omissions and +typos in the documentation, and adds the \shadewd, \hatchwd, \lhatch and +\rhatch macros. -UPDATE 0.2.9.2 Alpha of Fri 24 February 1995: Rearranges some code in -mfpic.tex; little else to report. In 0.2.9.3 Alpha of Thu 21 March 1995: -GT renamed \fill to \gfill, in order to avoid conflict with the LaTeX -\fill macro. +Renamed \fill to \gfill, in order to avoid conflict with the LaTeX \fill +macro. UPDATE 0.2.9.4 Alpha of Thu 13 April 1995: -Contributes a test for an existing definition of each macro in -mfpic.tex, - Renaming of \label to \tlabel, and \caption to \tcaption, in order to avoid conflict with the LaTeX macros with those names. @@ -98,17 +59,9 @@ because user-defined functions provide more power, and function plotting macros were added that accept Metafont function names instead of Metafont expressions. -Renaming of graphbase.mf and graphdoc.tex to grafbase.mf and grafdoc.tex -to emphasise incompatible upgrade of mfpic Metafont macros, and to -provide $8+3$ filenames for ms-dos users. - -Added \hbox{} to start of \mfpic, for some now forgotten reason to do -with formatting, I suppose. VERSION 0.2.9.5 Alfa of Wed 19 July 1995: -Replaces TeX dimensions by font dimensions for economy. - Renames \mfcmd to \mfsrc for clarity. Renames \wedge to \sector to avoid conflict with the character name @@ -120,19 +73,11 @@ Abolishes \plrpoint, \plrlines, \plrcurve and \plrcyclic as redundant specializations. The meaning of \turtle is changed to a Cartesian form, for flexibility. -Changed objects.tex to use \tmtitle, \plr, \mfsrc, \gfill, -\gclear, \tlabel, and \tcaption. - Rendering macros redesigned, and \setrender introduced. Coordinate transforms in grafbase.mf made slightly more robust. Begin an attempt to make grafbase.mf compatible with John Hobby's MetaPost drawing program. -Added comment in grafbase.mf about dangers of text arguments, - -Updated the documentation files grafdoc.tex, Acknowl.tex, README2, -MANIFEST and mfpicdoc.tex. - UPDATE 0.2.9.6 Alfa of Mon 24 July 1995: @@ -141,317 +86,21 @@ Contributes \thatch which provides hatching by lines at any angle. Modifications to \pen, \shadewd and \hatchwd, along with changes to grafbase.mf to make drawing, shading and hatching more independent. -Decided that the behavior of \point inside a connect environment was -bizarre, hazardous, and an unnecessary complication to the mfpic macros, -so \point has reverted to its original, obvious and simple definition. - Renamed \rotate to \rotatepath. Also renamed the affine transform macros, so that they no longer use the -`s' of the present tense, which could be mistaken for a plural. (The -sample files did not hitherto use the affine transform macros, so the -damage may be slight.) - -Modified grafbase.mf to use a transform stack to implement local -Metafont coordinate systems; this may be more robust, and extensible to -other graphic localizations. - - -UPDATE 0.2.9.7 alfa, Fri 18 August 1995: - -Changes to pictures.tex: - -Replaced version from "0.2.9.1 alpha Thu 8 September 1994" to -"0.2.9.7 alfa Sat 5 August 1995". - -Added a comment containing an ASCII sketch of the commutative diagram -example, and indicated where each arc is drawn. - -Replaced all uses of \label by \tlabel, \caption by \tcaption, -\fill by \gfill, \wedge by \sector. - -Added some uses of \mftitle. - -Moved one arrow in the commutative diagram, to illustrate the b -option of the \arrow command. - -Simplified Metafont algebraic expressions used in function plots, so -that they use fewer * operators. - -Edited the example of \turtle to allow for the new semantics of -rectangular coordinates. - -Captioned all eight figures, with figure numbers and descriptions. - -Deleted an instance of "\vfill\eject". - -Increased the complexity of the seventh figure, to illustrate use of -hatching, closing, point, dotted curves, and so forth. - -Made figures seven and eight twice as large. - - -Changes to lapictures.tex: - -Renamed version from "0.2.9.1 alpha Thu 8 September 1994" to -"0.2.9.7 alfa Thu 17 August 1995". - -Magnified the LaTeX pictures document to the same scale as the plain TeX -one, using the \mag command. - -Set \fboxsep to zero. - -Initialized arrow heads using \headshape. - -Commented out the center environment around the commutative diagram -example. - -Placed \fbox commands around each picture. - -Other changes as in pictures.tex. - - -Extensive changes to grafbase.mf: - -Turned warningcheck off. - -Used an explicit designsize. - -Debugging refined. - -Rearranged some code. - -Made ClipOn boolean (instead of numeric). - -Added maparr macro. - -Eliminated mistake of using hround in graph-to-pixel coordinate -transformation. - -Remarked that clipping can distort paths by changing their points. - -Tried to clip on character boundary. - -Added Metafont vector coordinate transform, to complement affine -transform for geometric points. - -Write message when drawing nominal Metafont bounding box. - -Changed beginmfpic Metafont macro to take only the character code as -an argument. - -Introduced global Metafont transform stack, for coordinate changes. - -Replaced currentpen by drawpen in path stroking. - -Changed ourfill and ourunfill to use an undelimited path argument. - -Added setdotpath, ourdot. - -Changed onedot to use dotpath instead of a scaled shape path. - -Edited tightbbox and bbox to take a path described in pixel -coordinates as their first argument, instead of one in graph -coordinates. - -Added tbbox. - -Did some more saving of local variables in Metafont functions. - -Deleted lhatchf and rhatchf. - -Added thatchf, thatch, hhatch and xhatch. - -Rewrote lhatch and rhatch to use thatch. - -Edited dotted, renamed it dashed. - -Added a separate dotted Metafont macro. - -Changed head from a def to a vardef; edited head to clarify its -code. - -Altered axis tic mark macros, xmarks and ymarks to ensure that the -tic marks are always at right angles to their axes, irrespective of -coordinate transforms. - -Added a grid command. - -Renamed mkellipse to ellipse, deleted old ellipse. - -Renamed mkarc to arc. +`s' of the present tense, which could be mistaken for a plural. UPDATE 0.2.9.8 alfa, Mon 11 September 1995: -Added to Acknowl.tex. - - -In mfpic.tex: - -Add comment about use of \ignorespaces to skip spaces in user's -document after \mfpic command. - Retain line separations of user's document's mfpic environment when writing Metafont file. This prevents long Metafont commands from exceeding Metafont's input buffer. -UPDATE 0.2.9.9 alfa, Thu 5 October 1995: - -In mfpicdoc.tex: - -changed \wedge references to \sector, and \rotateabout to -\rotatearound. - -Added some logical formatting commands to mfpicdoc.tex. - -Included much more information about recent changes (from 0.2.9.1 to -0.2.9.8). - - -In mfpic.tex: - -Renamed \@graph to \@graphfont for identifiability. - - -UPDATE 0.2.9.10 alfa, Fri 6 October 1995: - -In grafbase.mf: - -Deleted spurious argument to \xyswap. - -Changed \store to take two arguments, and to logically bracket the -second, which is the path description. - - -UPDATE 0.2.9.11 alfa, Fri 24 November 1995: - -In grafbase.mf: - -Fixed X-coordinate rounding bug in thatchf. - - -REVISION 0.2.10.0 alfa, Wed 17 January 1996: - -In mfpic.tex and grafbase.mf: - -Changed names of five Metafont macros: xslanted, yslanted, zslanted, -boosted, and xyswapped to xslant, yslant, zslant, boost, xyswap. - - -In grafbase.mf: - -Replaced my dash and dot code by Frank Michielsen's, modified to use -suffix arguments instead of text for l-values. - -Also, the dotsize argument to dotted is now effective. - -Deleted the unused ourdraw, ourfill, ourunfill macros. - -Simplified the dotpath and onedot initialization code; it was too -baroque. - -Added a pixdot macro as a shorthand for picdot(active_plane,onedot,p). - -Replaced the apoint (w, a) macro by bpoint (w, b) which is a -shorthand for fullcircle scaled w shifted b. - -Gratuitously added Bruce Leban's overlay macros from the METAFONTbook, -page 295. - -Cosmetic reformatting of source. - - -In Acknowl.tex: - -Add Frank Michielsen's name. - - -REVISION 0.2.10.1 alfa, Thu 18 January 1996: - -In grafbase.mf: - -Fixed wrong declaration in dotted of dp from path to pair. - - -REVISION 0.2.10.2 alfa, Tue 23 January 1996: - -Editing to restore compatibility with older graphbase.mf versions used -with xfig's (actually, transfig's fig2dev's) mf driver (genmf.c). - - -In mfpic.tex: - -Edited writing of setting of Metafont variables xscale and yscale to -omit factor of unitlen. - -Changed references to drawwd to penwd in \drawpen. - - -In grafbase.mf: - -Add declarations and initializations of these variables: unitlen, -xscale, yscale, xneg, xpos, yneg, ypos. - -Renamed drawwd to its former name, penwd. - -Again made penwd, hdwdr, hdten into newinternal variables, and -assign them using interim. - -Definition of ztr now includes unitlen as a factor in the x and y -scaling. - -mfpicenv and endmfpicenv defined as empty statements. - -bounds defined for setting xneg, xpos, yneg, ypos. - -beginchar now includes unitlen. - - -REVISION 0.2.10.3 alfa, Tue 6 February 1996: - -In mfpicdoc.tex: - -Updated documentation to cover to \dotted, \dotsize and \dotspace -on the one hand, and \dashed, \dashlen and \dashspace on the other. - - -REVISION 0.2.10.4 alfa, Mon 26 February 1996: - -In mfpic.tex: - -Let internal \sim@gdef (simple global definition) stand for \gdef. - -Added \newgdef for new global definitions with a test for previous -definition. - -Replaced use of \obeylines by \mfpicobeylines, to use \endgraf instead -of \par, because LaTeX(2e) redefines \par with unpleasant effects on -Metafont files when using LaTeX's center environment. (To wit, LaTeX's -center environment would write \@@par to the Metafont file. - -Defined \preservelines to call \mfpicobeylines then set -\newlinechar to control-M (carriage return). - -Use \preservelines in \mfsrc, thus bypassing (I hope) the mischief -arising from LaTeX in the center environment. - -Wrapped replacement text of \mfsrc in a layer of braces. - -Added descriptive comments for \tlabel and \tcaption. - -Set TeX's primitives \leftskip and \rightskip to zero dimension -inside \tcaption, so as to protect typesetting of diagrams' captions -from unwanted effects. - - REVISION 0.2.10.5 alfa, Sat 9 March 1996: -Minor reformatting of mfpic.tex, including adding spaces, adding -comment characters at end of more lines, and renaming some internal -register variables. - Introduced \polyline as an alternative name for \lines. In order to avoid repetition of side-effects, changed \tcaption to use @@ -460,25 +109,10 @@ In order to avoid repetition of side-effects, changed \tcaption to use REVISION 0.2.10.6 alfa, (two hours later) on Sat 9 March 1996: -Updated mfpic.tex and documentation files to incorporate improvements -by Dan Luecking: - -a loading check that automatically saves and restores the catcode of -`@'; - -the name of the graph base is now stored in a macro near the top of -mfpic.tex; - -\leavevmode is now moved [GT has, for now, commented it out -completely]; - -\polyline introduced as a synonym for \lines; a \polygon figure -has been introduced; +\polygon figure has been introduced; \\ specifies explicit line breaks in tlabels and tcaptions; -\onelevel causes one level of expansion in an \edef; - \savepic and \copypic allow saving, use and copying of an entire mfpic picture, including its tcaptions and tlabels. @@ -490,514 +124,171 @@ Petrovic. REVISION 0.2.10.7 alfa, Sat 28 March 1996: First release via Geoffrey Tobin's School's local anon ftp site: - ftp.ee.latrobe.edu.au : pub/gt/mfpic -Added skip-pix.tex file, which tests whether TeX's \leftskip -primitive breaks up mfpic's typesetting of diagrams. Fortunately, it -seems not. - REVISION 0.2.10.8 alfa, Tue 26 May 1996: Second, and bug fix, release via Geoffrey Tobin's anonymous ftp area. -Due to change in syntax of \store to take the path command as a second -argument (which made coding of mfpic.tex easier), objects.tex and -part of mfpicdoc.tex needed to be amended. Reported by Miroslav Dont -(Thu 16 May 1996). - -Descriptions of LaTeX environments clarified to emphasise that mfpic's -plain TeX command names may be used in LaTeX. This is useful to know -when designing automatic code generators. Reported by Van Snyder (Fri -17 May 1996). - -Added hyphenation to \MFbook in documentation macro file header.tex. - -Noticed that the method by which the line breaks in the TeX file are -copied into the Metafont file can cause command arguments to be omitted -from the Metafont file unless at least the left brace (immediately -before the arguments) occurs on the same line as the command. Corrected -objects.tex to obey this restriction. Also noted this phenomenon in -mfpicdoc.tex. Effect reported by Miroslav Dont (Thu 16 May 1996). - -Updated lapictures.tex to LaTeX2e. - -Added LaTeX2e logo to header.tex. - REVISION 0.3.0 alpha, 1998: Numbers jump a lot from here because I (Dan Luecking) have been lax in -keeping track of changes. First version with support for Metapost. -(Yes!) - -Translated grafbase.mf to grafbase.mp, retaining all(?) -functionality. Now any(?) .mf file created by a recent mfpic can be -run through Metapost to produce a PostScript picture. Lots of problems -with Metapost capacity, especially with shading. It is apparently a lot -more memory intensive to hold thousands of circular paths in memory than -hundreds of thousands of pixels. Ultimately recoded the grafbase.mp -shading macros to simply calculate a gray colored fill. - -Added grafbase functions sin, cos, and their inverses invsin, -etc., that compute in radian measure. Also tan and cot. +keeping track of changes. First version with support for Metapost. Now +any(?) .mf file created by a recent mfpic can be run through Metapost +to produce a PostScript picture. -Wrote mppicdoc.tex, which can be TeX-ed alone or input from -mfpicdoc.tex. Should probably combine the two documents. Made small -changes to header.tex: added logos for pdfTeX and pdfLaTeX. Changed -The macros \MF and \MP to use small capitals. Minor modifications to -\LaTeX and \LaTeXe +Added functions sin, cos, and their inverses invsin, +etc., that compute in radian measure. Also tan and cot. REVISION 0.3.8 alpha, 1999: -Color has been added. Standard colors for lines/curves (drawcolor), +Color has been added. Default colors for lines/curves (drawcolor), fills (fillcolor), hatch patterns (hatchcolor), and arrowheads -(headcolor) added to grafbase.mp. Corresponding macros in mppic.tex -for setting these colors. Optional arguments for color added to \gfill, -\draw, \arrow, and all the hatching macros. A new macro \polkadot -creates polkadot fill patterns. +(headcolor). Optional arguments for color added to \gfill, \draw, +\arrow, and all the hatching macros. A new macro \polkadot creates +polkadot fill patterns. Changed some of the commands for setting dimensions so that they actually worked, and so they are local to mfpic environments. Added support for LaTeX2e's \usepackage command and options. Added -graphics inclusion code, summoning the following packages: epsf for -plain TeX or LaTeX209, graphics for LaTeX2e and pdfLaTeX, the macro -files supp-pdf.tex and supp-mis.tex from the ConTeXt distribution -for plain \pdfTeX). Added code to detect which TeX format was in use. +graphics inclusion code. Added code to detect which TeX format was in +use. REVISION 0.3.9 alpha, 2000: -Altered almost all messages written to the log file or the terminal to -announce they were from mfpic. Altered format detection code to test -against both \UndEfInEd _and_ \relax (lest some previous package -convert certain commands to \relax using the \csname style test). -Minor change to definition of \circle to avoid error messages in LaTeX. +Minor change to definition of \circle to avoid error messages in LaTeX. Changed the graphic placement code so that it tests for the existence of -the graphic first (to avoid all those error messages from epsf, -graphics, etc., on the first pass, or when Metapost fails to make a -graphic). - -Tried to find and change code in grafbase where we could inadvertently -divide by zero. Added another closure prefix \uclosed and its -corresponding grafbase support, to close a path smoothly (meaning -simply matching directions at both ends), but keep the original curve -Unchanged. The current (\sclosed simply closes with ..cycle which -alters the original curve. +the graphic first. REVISION 0.3.10 alpha, 2000: -Put mfpic version, date and package name into macros for use in -messages. Decided the package name is "mfpic" if it is input as -mfpic.tex or mfpic.sty, otherwise mppic, regardless of whether the -metafont or metapost option is used. There are four files -m[fp]ic.[sty,tex], which simply set the package name and input -mppic.tex if necessary. Also put this version and date info into -strings in grafbase.mf. - -Added changes contributed by Jaromir Kuben (Thanks!): An option -centercaptions and command \centercaptions to center the lines in a -\tcaption. Also \nocentercaptions; these can be used at any point to -turn the feature on and off. Improvements (corrections?) to the code -that positions text labels (so that) labels that extend outside the -picture are correctly taken into account. Changes to the positioning -parameters in \tlabel. Both c and b now take into account the -depth of the text b puts the absolute bottom of the text in line with -the point. A new parameter B to align the baseline of the text with -the point. Jaromir also contributed several corrections to grafbase.mp -(mostly inadvertently introduced by me, DHL). +Added changes contributed by Jaromir Kuben: An option centercaptions +and command \centercaptions to center the lines in a \tcaption. Also +\nocentercaptions. Improvements to the code that positions text labels +(so that) c and b now take into account the depth of the text. A new +parameter B to align the baseline of the text with the point. Added option dvipsnames to allow color names as in the dvips header -color.pro. Requires file dvipsnam.mp. Added grafbase.mp macros: -cmyk, RGB, gray and rgb to convert from the indicated color space -to Metapost's internal color space (which is rgb, so the last is a -no-op). In plain TeX the command \dvipsnames can be used in the -preamble (before \opengraphsfile). - -Added macro \ConTeXt to header.tex, a macro \opt for style of -LaTeX2e option names. Changed \prog to typeset its argument in -sans serif font. Changed \tmtitle in mppic.tex so it _doesn't_ ignore -following spaces (it ended with \mftitle which invokes \ignorespaces). +color.pro. Later removed and made default. Added color functions +cmyk, RGB, gray and rgb. Added functions tanh, its inverse atanh, and additional trig functions secd, sec, cscd, csc, atan, invtan. Made log a synonym for ln. Added complex variables functions Arg, cis, zexp and Log. -Changed all trig, hyperbolic, exp, log, etc, to use syntax "vardef -<name> primary X" so as to match (I hope) as close as possible the -behavior of the built-in sind and cosd. - -Changed \do@ptparami so that it does not strip too many braces. This -was done by changing the line \redef\@ptparami to be parameterless -(delaying the reading of the optional parameter). The old code read the -optional parameter, replaced it, then read it again. This strips two -levels of braces, making two levels of bracing necessary to hide an -enclosed bracket: - \draw[{{\color[cmyk]{1,1,0,0}}}]... -(Such use of LaTeX color macros has not yet been added, but might be one -day.) This strategy is closer to LaTeX's optional parameter handling -technique. - REVISION 0.3.11 alpha, 2000: -Added \plot (usage \plot[<size>,<separation>]{<shape>}...) similar to -\dotted except: -1) explicit shape required (shapes Triangle, Square, Circle, Plus, - Cross, Star, SolidTriangle, SolidSquare, SolidCircle). -2) initial size and separation are 2pt and 5pt. -3) Size is governed by \plotsymbolsize, and separation by - \plotsymbolspace. The dimension \plotsymbolsize corresponds - roughly to the _average_ diameter of the shape. - -Added code to mkfcn and parafcn so that the end of the curve falls -on the given endpoint (even if bst doesn't go evenly into bmax-bmin). -Also ensure the loop parameter doesn't exceed infinity. Also avoid -problems if the sign of bmax-bmin differs from that of bst. +Added \plot similar to \dotted but these shapes can be placed: + Triangle, Square, Circle, Plus, Cross, Star, SolidTriangle, + SolidSquare, or SolidCircle REVISION 0.3.12 alpha, 2000: -Save and restore catcodes of certain punctuation (@.,:;!?{}`'=/- and -parentheses), as well as spaces, setting punctuation to 12 while reading -mppic.tex to ensure the right stuff gets written to the .log and .mp -files. - Added macro \datafile to read a file of number pairs and create the -polygonal path connecting them. Works like the other figure macros -(i.e., may take any prefixes). - -Added options clip (to clip all pictures to the specified dimensions), -truebbox (to give the metapost output file the true bounding box rather -than the one specified in the \mfpic arguments), and debug (write -debugging info to terminal and log file). Command forms: \clipmfpic -turns it on \noclipmfpic turns it off. Similarly, \usetruebbox and -\notruebbox. For debug we can define \mfpicdebug before loading -mfpic.tex (which will turn on debugging information written prior to -option processing), and in the rest of a source file, \mfpicdebugtrue -and \mfpicdebugfalse will switch it on and off. - -%%% Revised after here, adding spaces before and after code and math -%%% removing blank lines, stray TeX markup, reformatting paragraphs, etc. +polygonal path connecting them. + +Added options clip, truebbox, and debug. +Command forms: \clipmfpic, \noclipmfpic, \usetruebbox, +\notruebbox, \mfpicdebugtrue, and \mfpicdebugfalse. + Changed names of various commands to a more imperative form: -\usingmetapost becomes \usemetapost, \usingmetafont becomes -\usemetafont, \dvipsnames becomes \usedvipsnames, etc. Also changed -name of option centercaptions to centeredcaptions. Changed many -internal names, prefixing most with "mfp@", inserting "@mfp@" in the -\if... commands. +\usemetapost, \usemetafont, +Changed name of option centercaptions to centeredcaptions. REVISION 0.3.13 alpha, 2000: -\datafile rewritten, now ignores leading blank lines and comments, and -won't gag on commented out EOLs. Code somewhat modularized. +\datafile now ignores leading blank lines and comments, +and won't gag on commented out EOLs. -Went back to technique of expanding argument of \tcaption twice -(caveat emptor). +Went back to technique of expanding argument of \tcaption twice: +caveat emptor. New command \plotdata reads a data file and draws one (polygonal) path for each non-blank sequence of lines in the data file. Exits when a pair of blank lines is encountered (or EOF). Cycles through six different drawing styles for successive curves. User may elect different colors (with \coloredlines), different symbols (\pointedlines), or -different dashing patterns (\dashedlines). NOT a figure macro, (i.e., -no prefixes). +different dashing patterns (\dashedlines). New command \using affects what \datafile and \plotdata write to -the .mf output. Default is \using{#1 #2 #3}{#1,#2}, meaning: of two -or more space delimited numbers, write the first two separated by a -comma. - -Brand new dashing and dotting code in grafbase. A complete -reorganization of the code made dashing faster. That was followed by -another reorganization and the gendashed (generalized dashes) command -added to grafbase. Now any dashing pattern can be drawn. A dashing -pattern, ptrn, consists of three arrays: ptrn.start[], ptrn.rep[], -ptrn.finish[]. The command gendashed (ptrn) p; draws the path p -beginning with ptrn.start, repeating ptrn.rep, and ending with -ptrn.finish. The arrays are numeric and specify the lengths of dashes -and gaps. A command - dashpat (suffix name) (text dims) -takes a comma separated list dims, assigns them to the array name.rep, -and computes reasonable name.start and name.finish. +the .mf output. \gendashed{<pattern>}... is a generalized dashing command; <pattern> is the name of a dashing pattern. - \dashpat{<name>}{<dim1>,<dim2>,...,<dim2n>} -will create a dashing pattern with the specified name. Here <dim1>, -etc., are dimensions specifying the length of dashes (odd positions) and -the length of gaps (even positions). A dash length of 0 is written as a -dot. Patterns dashtype0 through dashtype5 are predefined and used by -\plotdata when \dashedlines is selected. - -Commented out several macros in grafbase that were never used -elsewhere, and also some that were only used once (replacing that use by -the replacement text). I haven't done any comparisons, but for the macro -dotted, avoiding two expansions out of four (what it used to take to -draw a dot) might be a significant time saving when thousands of dots -are being drawn. - -Added a couple of rounding commands to the .mf shading code. All dots -now pixel aligned, looks infinitely better. +\dashpat{<name>}{<dim1>,<dim2>,...,<dim2n>} creates a dashing pattern +with the specified name. -Corrections to mkfcn and parafcn, they could still have overshot the -value of bmax. +All dots now pixel aligned in shading. Looks infinitely better. -Removed all spaces (commenting out EOL's) in mppic.tex. It can now be -\input in horizontal mode without generating any spaces (even without -switching to \nullfont). Removed \nullfont. +Added Diamond and SolidDiamond to the symbols available. -Changed some more internal names. Added Diamond and SolidDiamond to -the symbols available to \plot and \plotsymbol. - -At some point (perhaps this or the last revision) I added a command -\fcncurve that draws a function (i.e., curve doesn't double back) if -the x-values are unique and listed in order. It has an optional -tension-like argument. Added an optional tension parameter to \curve, -also. +A command \fcncurve that draws a function (i.e., curve doesn't double +back) if the x-values are unique and listed in order. REVISION 0.3.14 alpha, 2000: -Added \@@tlabel to write label text to output file between btex and -etex. Added mplabels to make \tlabel use it instead of original -\@tlabel. Commands \usemplabels and \nomplabels to turn the option -on and off. Added third part to the optional argument of \tlabel to -rotate the text (ignored in \@tlabel) so \tlabel[Bl45] will place -the left baseline at the point and rotate 45 degrees around that point. +Added optiom mplabels to make \tlabel write btex ... etex groups +to the .mp file. Commands \usemplabels and \nomplabels. +Added third part to the optional argument of \tlabel to +rotate the text. Ignored without mplabels New macro \mfpdatacomment so that \datafile and \plotdata can now -have their comment character reset. A side effect is that `%'s in the -data file will be recognized. Commands \makepercentother and +have their comment character reset. Commands \makepercentother and \makepercentcomment created to allow the user to use `%' in \using arguments. Gave \plotdata the ability to cycle through 8 colors or 9 symbols -(instead of only 6), but still only 6 dash patterns. (Too many makes for -confusion. Only increased colors and symbols because it was so easy.) - -Added framing macro. On the first TeX run (indicated by nonexistence of -.tfm or fig.1), now show a visible rectangle of appropriate size with -the figure number inside. For plain TeX users, the internal code is made -available in the user level command \framed[<fgap>]{...}. Parameters -\framegap and \framethickness control the default appearance. -(Internal code for undefined figures uses \framegap =-\framethickness -so not to take up any extra space.) - -Added some error checking: when option mplabels is selected without -metapost, issue error message and ignore. Same when \usemetapost is -used after \opengraphsfile. Remove dvipsnames option, making all -dvips color names always available to mfpic. - -Multiple changes to documentation: Added \GS for Ghostscript and \sc -for small caps to header.tex. Folded all the new macros and their -descriptions into mfpicdoc.tex. Still keeping mppicdoc.tex for more -detail on differences between the Metafont and Metapost support. - -Made some small additions to MFobjs.tex and MPobjs.tex to better -illustrate some new features. Adjusted pictures.tex and -lapictures.tex so they produce the same output and no overfull boxes. -Changed TeXMPobjs.tex and LTXMPobjs.tex so that they work better in -pdfTeX and pdfLaTeX, resetting \pdfpageheight and \pdfpagewidth (which -otherwise get magnified by \mag=1200). - -Replaced curves.dat with curves1.dat and curves2.dat to better -show features of \plotdata. - -Changed the default for \using to \using{#1 #2 #3}{(#1,#2)}, -(redundant parentheses). - -Added \fdef, which seemed to be documented, but not defined! Changed -the format slightly and adjusted the documentation to reflect that. +(instead of only 6). + +Draw a frame for figures not yet created. Add command \frame for users. + +Added \fdef, which seemed to be documented (see Update 0.2.9.4 above), +but somehow not defined. Changed \savepic: Now use \newpic{\foo} to allocate a box, \savepic{\foo} to store the next picture, and \usepic{\foo} to copy -it. Now more like LaTeX's system of save boxes. +it. REVISION 0.3.15 alpha, 2000: -In grafbase, changed secd and cscd so that abs(temp) < -nottoosmall is tested instead of temp itself (which was incorrect when -temp < -nottoosmall). Renamed dashed to DASHED to make primitive -dashed available to power users. Added some error checking to dashing -code. Added save in several places in *fcn commands. Changed -hatching code in grafbase.mp so that all (even those not used by mfpic) -respect hatchcolor. - -Redefined parafcn so it can call mkfcn like all the other function -drawing commands. - Added \mfpverbtex to write verbatimtex block to .mp file. -Changed a few \newdef-s and \newlets to \def and \let to keep -ConTeXt from complaining. Affected commands are \rotate, \mirror, -\scale and \grid. Changed code for date written to output file for -same reason. - Changed \newpic to \newsavepic to more closely parallel LaTeX's \newsavebox command. Allow plotting of a number in a data file against its sequence position with \using{...}{...\sequence...}. -Rename \mf@gobble to \mfp@gobble. Move the definition of \newdef -earlier and use it more (didn't catch any new conflicts). - -Changed \rotatepath from a \@modmac to a \@closmac (even though it -doesn't close anything), because that makes its behavior vis-a-vis -rendering more in line with what one might expect. Actually, closing and -rotating both simply accept a path, change it, and pass the result on. -So both should be handled the same. - -Added contributed macro \pointdef: \pointdef{A}(1,3) makes \A expand -to (1,3), with \Ax and \Ay expanding -to 1 and 3, respectively. - -Provide a directory structure to the distribution. Rename file mppic.tex -to mfpic.tex and provide files mppic.tex, mfpic.sty, and mppic.sty -as wrappers to input it. Made Metapost the default when mppic.* are -used. - -Add some error correction to dashpat: force an even number of -dimensions. - - -REVISION 0.3.16 alpha, 2000: - -In grafbase: - -Change name of glabel (in grafbase.mp) to gblabel so as not to -conflict with glabel from graph.mp in the standard Metapost -distribution. Adjusted mfpic.tex accordingly. - -Correct the change to dashpat made in 0.3.15: don't force dashing when -there are fewer than 2 dimensions in the list. Instead, this is the -signal to draw a solid curve. - -Save the variables dashes and dots used in the macros DASHED and -dotted. - -Uncomment three macros commented out in 0.3.13: tightbbox, tbbox and -bbox. Though these are not used in any other macro, but they might -nevertheless be useful to users of grafbase. - -Change the dashtype[] arrays that mix dots and dashes so they begin -with a dot. This will produce a dot at the ends of the curve. This just -looks better than a partial dash. - -Added unbound.tex updating mfpic info in "TeX Unbound". - -Restored mf-revu.tex, somewhat altering its formatting and correcting a -TeX error. - -Changed \endconnect so it tests for its use in LaTeX as an -environment and if so issues \aftergroup\@startfigtrue and -\aftergroup\@imrendtrue to bypass the LaTeX-supplied \endgroup. -Added a similar test to \endmfpic to set \@ignoretrue. +Added \pointdef: \pointdef{A}(1,3) makes \A expand to (1,3), with +\Ax and \Ay expanding to 1 and 3, respectively. REVISION 0.4.0 beta, Aug 2000: -Released to CTAN. Removed mppic.*, package is named mfpic regardless -of whether MF or MP support is needed. +Released to CTAN. REVISION 0.4.01 beta, Nov/Dec 2000: -Sergei V. Znamenskii reported (and mostly solved) an incompatibility -with AmSTeX using amsppt style if mfpic.tex is input after the -\documentstyle[amsppt] command. The file amstex.tex loads the dummy -font, setting 22 font dimensions. Then amsppt.sty loads some more fonts. -It appears that if font loading intervenes, mfpic.tex cannot add extra -font dimension parameters to dummy to use with \newfdim. Solved by -changing - \font\@dummy=dummy -to - \font\@dummy=dummy scaled 1002 -in mfpic.tex - -Also corrected code that purported to detect LaTeX when in fact AmSTeX -was in use. - -Added documentation of a bug in supp-pdf.tex which requires -\usemetapost (as well as \usepackage[metapost]{mfpic}) to come before -\usepackage[french]{babel} when running pdfLaTeX. The conflict was -reported by Pascal Chantriaux. - -Changed \tmtitle and \mftitle so they read the argument as a token -list and write it to .mf file and .log file without expansion. Simple -things like "\'" expand to quite long expressions in LaTeX2e. - -Added commands \MFPdebugwrite (to write its argument only in presence -of debug option), \MFPmsg (as a synonym for \immediate\write16) and -\MFPICmsg (to write its argument preceded by "MFpic: ". - -Added \restoreCODE to shorten all the lines in \mfpic-package that -restore the category codes of punctuation. - -Added a few new debug lines in response to previous failure to detect -\AmSTeX. - -Rewrote \mfp@now (which generates a time-stamp for the output file) to -use only 2 \count registers instead of three. - -Added \dimendef\mfp@scratch=255 for scratch use instead having -\dimen255 hard coded. This will make changes easier should use of -\dimen255 cause any problem. - -Added \penwd as a synonym for \pen (to be more in line with -\shadewd, etc.). - -Removed redundant parentheses from default \using. - -Changed internal command \mfp@rwdata, which is responsible for reading -and writing in the \datafile and \plotdata commands, so that it -outputs - polyline (false)((x_1,y_1),(x_2,y_2),...,(x_n,y_n)); -instead of - (x_1,y_1)--(x_2,y_2)--...--(x_n,y_n); -The intent is to have a better interface if ever we get 3D support -started. For example, polyline calls textpairs which processes the -list of coordinates. In a hypothetical 3D environment, we'd need to -change only \using to write triples, and then textpairs could choose -to run some command that processes triples instead of pairs. - -Changed use of \unpreservelines in \plotdata, etc., to the expicit -resetting of the category of ascii 13 (which was its only purpose -anyway). - -Added macros \xaxis[<hlen>] and \yaxis[<hlen>] with the obvious -meanings. Plan on adding something like \leftaxis, \bottomaxis, etc., -with changes to \xmarks and \ymarks for putting tics on them. -(Haven't figured out the best interface yet.) - -Added some new error messages. Rewrote almost all error messages, adding -linebreaks. Added command \mfp@errmsg to format error messages and set -the \errhelp tokens. +Generate a time-stamp for the output file. +Added \penwd as a synonym for \pen. -REVISION 0.4.02 beta, Jan 2001: - -Backward comparability was inadvertently destroyed when \curve was -given an optional parameter and the definition of curve in grafbase.m? -was changed. Any .mf file created by using \curve with an older -version of mfpic would give curve the wrong number of parameters for the -new grafbase files. I renamed the new curve to tcurve and gave curve -a definition equivalent to its old one. - - -REVISION 0.4.03 beta, Feb 2001: - -Corrected a typo in vardef thegblabel: had zz for a parameter, but -used z in the replacement text. I am surprised \tlabel _ever_ worked -when the mplabels option was selected. +Added macros \xaxis[<hlen>] and \yaxis[<hlen>] with the obvious +meanings. REVISION 0.4.04 beta, Mar 2001: @@ -1006,375 +297,85 @@ Added \smoothdata[<tension>] to cause \datafile and \plotdata to draw smooth curves with optional tension setting. And \unsmoothdata to restore the default. -Changed \pointedlines to work as documented (causing \plotdata to -issue the equivalent of \plot{<symbol>}) and added \datapointsonly to -behave as it used to (causing \plotdata to issue the equivalent of -\plotnodes, plotting only the data points). -Some documentation changes: added info that something like -\xmarks{-4 step 2 until 6} is valid. +REVISION 0.4.10 beta, May 2001: +Renamed \framed to \mfpframed, similarly: \mfpframegap and +\mfpframethickness. -REVISION 0.4.05 beta, Mar 2001: +\tlabeloffset{<hadj>}{<vadj>} and \tlabelsep{<dimen>} added to apply +offsets to label placement. -Changed vc=vt; to vc:=vt; in function clipsto. When used on an -array of paths, the original caused an "Inconsistent equation" error -on the second iteration. Fortunately, this does not come up in mfpic -except for very advanced users. +Added macros for drawing axes along the borders of the picture, and +tickmarks along those axes. Syntax eventually settled on in 0.4.16: + \axis{<axis>}, draws an axis (\axis{x} almost equivalent to \xaxis). + Allowed values for <axis>: x, y, l, b, r, and t. + \axismargin{<axis>}{<num>}, sets the axis margin (lbrt only) + \setaxismargins{<num>}{<num>}{<num>}{<num>}, sets all 4 margins. + \setallaxismargins{<num>}, sets all 4 margins. -REVISION 0.4.10 beta, May 2001: + \xmarks, \ymarks, \lmarks, \bmarks, \rmarks, \tmarks, place the marks. + \setaxismarks{<axis>}{<pos>}, sets position of tic marks. Allowed + <pos> are inside, outside, ontop, onbottom, and centered. 2 + abbreviations: \setxmarks and \setymarks. + \setbordermarks{<pos>}{<pos>}{<pos>}{<pos>} + \setallbordermarks{<pos>} -Renamed \fileversion and \filedate to \mfpfileversion and -\mfpfiledate to avoid name clashes with other packages. Most packages -only use these macros for messages while loading, but mfpic writes the -information as a header comment in the output file - -Added \mfp@ifnextchar, a clone of LaTeX's \@ifnextchar, and -redefined the macros \do@ptparam and \alt@ptparam in terms of it. -Copied LaTeX's code to eat one space after a command into the macro -\eatspacedef. - -Added \mfp@delim as an all-purpose argument delimiter. For debugging -purposes, its definition is to issue an error message saying it -shouldn't ever be triggered. - -Slight rewrite of \mfp@now and \mfp@today. - -Renamed \framed and related macros by prefixing mfp or mfp@. Some -formats and packages (ConTeXt, for example) have a \framed macro. Now -\mfpframed _can_ be used, and _must_ be used if \framed already -exists (as in ConTeXt). Replaced \framegap and \framethickness -with \mfpframegap and \mfpframethickness. If \framed is already -defined, the old version is kept and the user may not get the effect -described. - -Slight change to what is printed in the .dvi file when a mfpic detects -that Metafont or Metapost has not been run, or the figure is absent. - -New dimensions: \tlabel@hadj, \tlabel@vadj and \tlabel@sep for -shifting \tlabel text. The first is a horizontal adjustment, the second -vertical, added to every label. The third shifts the label directly away -from the point of placement (unless optional argument "[Bc]" or -"[cc]" is used). A label is shifted by \tlabel@sep downward when the -`t' parameter is found, upward for `b', rightward for `l' and -leftward for `r'. The first two dimensions can be set with a new macro -\adjustlabels{<hadj>}{<vadj>} (name later changed to \tlabeljustify, -and the third with \tlabelsep{<dimen>}. Need to do it this way because -under mplabels they need to write the information to the output file. - -Added \expandafter before \@render\fi in several places. This now -appears not to be needed, but the \fi following \@render caused -problems with some experimental versions of optional argument handling. - -Added the following macros for drawing axes along the borders of the -picture: - \leftaxis - \rightaxis - \topaxis - \bottomaxis - \bottomleftaxes - \borderaxes - \leftaxisshift - \rightaxisshift - \topaxisshift - \bottomaxisshift -The first four draw the appropriate axis (no head by default), the last -four set an amount (in graph units) to shift the axis inward. - -For tick marks we have: - \lmarks - \rmarks - \tmarks - \bmarks - \lmarksposition - \rmarksposition - \tmarksposition - \bmarksposition - \xmarksposition - \ymarksposition -The first four set the positions (and optionally size) of the tick marks -on the corresponding axis, the next six determine if the marks are -centered, or on one side of the axis. They take an argument which must -be one of inside, outside, centered, ontop, onbottom, -onleft, or onright. For side axes the default is inside, while -for x- and y-axes it is centered. - -For arrowheads on the side axis we have \sideaxishead which takes a -dimension argument and sets the length of the arrowhead. To turn heads -off again set the length to 0pt. - -Added \gridlines to draw a regular grid of lines. It's syntax is the -same as that of \grid. Changed the behavior of \grid so that instead -of starting at the left and bottom, it draws the grid centered on the -origin of the graph coordinates. - -Changed most of the \if-tests so that if an incorrect optional parameter -is used, the default behavior will be seen. For example, \function -takes an optional argument of [s] or [p] with s the default. The -code had been: - \if ##1s true\else false\fi -and I changed it to - \if ##1p false\else true\fi -so for the typographical error \function[o], the user will get the effect -of the default s. - -Added the command \labeljustify to change the default justification -of text labels. For example, \labeljustify[cr] makes the default -[cr] instead of [Bl]. - -When truebbox is in effect, but mfpic detects that Metapost has not -been run, truebbox is turned off for each picture. Before, this was -global, now it is local (so that it doesn't affect a new \opengraphsfile -command, even though mfpic does not officially support more than one -\opengraphsfile commands per file). + +For arrowheads on the side axis, a dimesion \sideheadlen was added. + +Added \gridlines to draw a regular grid of lines. + +Added \tlabeljustify to change the default justification of text +labels. Added the command \tlabels (note the plural). It has one mandatory argument which contains a concatenation of arguments for one or more -\tlabel commands. These arguments may (but need not be) separated by -spaces or new-lines. +\tlabel commands. -Replaced all occurrences of \@labeldim, which had been \let equal to -\mfp@scratch, to the explicit control sequence \mfp@scratch. This was -to avoid confusion that could have been caused by changing one of them, -not realizing they should be the same. +REVISIONs 0.4.11--15 beta, July 2001: +Added support for multiline labels under mplabels. -REVISIONs 0.4.11--15 beta, July 2001: +Added ability to create a curve surrounding some text: +\tlabelrect creates a rectangle, with optionally rounded corners, +\tlabeloval creates an ellipse with aspect ratio the same as the block + of text (optionally multiplied by a given factor), +\tlabelellipse creates an ellipse with an optional aspect ratio + (default = 1), +\tlablecircle is \tlabelellipse[1]. -Restored a lost backward comparability: I stored the (Metapost) -primitive meaning of dashed in the command dashed_ and made dashed -synonymous with DASHED. Power users will have to use dashed_ if they -wish to invoke that primitive after loading grafbase.mp - -Added \MFPICwarn in addition to \MFPICmsg and \mfp@errmsg. Added -"MFpic error: " to the front of all mfpic generated error messages. -Introduced \on@line (from LaTeX) to place the line number in warnings. - -Removed many more spaces and eols from mfpic.tex (lest it be input -with spaces or eols active). Added some spaces between a command and -`!' lest the latter have category 11. - -Changed name of \restoreCODE (and others) to \MFPrestorecode (etc.) -after running across a package which defined \restorecode. Introduced -\@xp (from AMSLaTeX) for \expandafter. Removed saving of the current -font as \@torig, since we no longer change to \nullfont. - -Added test for equality to \relax in \testdef. Removed \newlet -(later put it back), \sim@def and \sim@gdef as they are not used (any -longer). The latter two were used once each and those were changed. - -Changed handling of \if@mfp@metafont and \if@mfp@metapost to ensure -they are kept mutually exclusive. Changed handling of -\@if@mfp@beforefileopen from a simple \if...\else...\fi to saving the -alternatives in a macro and then issuing the macro after the test. -Changed \mfp@clip to make it global if issued before \opengraphsfile. -Redid \mfp@truebbox to ensure it is global, but leave an out so that -\@mfp@truebboxtrue/false could be set locally. Made similar -changes to mplabels. - -Removed \unpreservelines from \mfsrc since grouping restores EOLs. -Also made \mfsrc check that a .mf/p file has been opened. - -Removed the definition of \mf@bsl since it is not used (any longer). - -Delayed the definition of \mfp@data until \@mfpic@graf@macs. -Introduce the hook \mfp@additions, to be expanded last in -\@mfpic@graf@macs. - -Changed the name of macro \mfplinestyle to \mfplinetype and the -\count register \mfp@linestyle to \mfp@linetype. -Changed name of \missinggraphfileerror to \nooutputfileerror. -Changed name of \adjustlabels to \tlabeloffset. -Changed name of \labeljustify to \tlabeljustify. - -Try to support multiline labels even in the case of mplabels by writing -appropriate definition of `\\' to the .mp. - -Changed definition of \mfp@scratch from \dimension255 to a register -defined by \newdimen. - -Added ability to create a curve surrounding some text: macro -\textboundary creates a rectangle, with optionally rounded corners, -\textoval creates an ellipse with aspect ratio the same as the block of -text, \textellipse creates an ellipse with a given aspect ratio, -\textcircle is \textellipse with aspect ratio of 1. TeX measures -the text and transmits the information to Metafont. - -New macro \axislabels. This takes a letter indicating the axis, an +Added \axislabels. This takes a letter indicating the axis, an optional justification parameter (as in \tlabel) and a comma separated -list of TeX text and numbers. The numbers indicating the position on the -given axis to place the text. Since side axes may be offset from the -edge of the graph, the utility \mfp@addto is used to add the boundary -coordinate (one of the parameters of \mfpic) to the appropriate offset, -returning the result in graph units for use in a \tlabel command. The -default justification depends on the axis. It is chosen so that the text -ends up outside the border axes, below the x-axis and left of the -y-axis. - -Color additions: added \tlabelcolor and grafbase color variable -tlabelcolor to control color of Metapost placed text; added -\backgroundcolor to set the color variable background, the color used -by \gclear and by all plain Metapost unfill operations. Had to -rewrite the various color setting macros since, till now, all assumed -the color variable name ended with the string "color". - -Changed the macros introduced in 0.4.10 or previous that controlled the -position of the side axis. Now instead of saying - \leftaxisshift{<num>} -one says - \axismargin{l}{<num>}. -One can set all 4 margins at once with - \setaxismargins{<num>}{<num>}{<num>}{<num>}. -or all margins to the same number with - \setallaxismargins{<num>}. - -A similar change was made to the setting of the axis marks position -(i.e., inside, outside or centered). Instead of - \lmarksposition{inside} -one writes - \setaxismarks{l}{inside}. -One can also set the position of all the border marks at once with -\setbordermarks, or all border marks to the same position with -\setallbordermarks. - -Command \drawaxes added: it takes a comma separated list of -letters chosen from x, y, l, b, r and t, and draws the specified -axes. Later renamed to \doaxes, and commas omitted. - -Added optional parameter to \plotdata and \datafile which -has the form p or s<num>. "[p]" causes a polygonal curve to be -plotted and "[s<num>]" causes a smooth curve to be drawn, with the -given number as the tension. The number may be omitted, and then -grafbase's value of curvetension (default 1.0) will be used. Any -other letter or none is the same as [p]. Internally, the optional -parameter is passed to \mfp@rwdata, which now, of course, takes -parameters. Along with this, \smoothdata was revamped to simply -change the default optional parameter, rather than set a switch. - -When option metapost is selected, each mfpic environment writes the -current font to the output file (in verbtimtex) to have at least the -chance (under mplabels) to match the fonts that TeX would use in -tlabels. - -Framing code: in addition to \framed or \mfpframed, we now have a -LaTeX environment: \begin{mfpframe}...\end{mfpframe} or, in plain TeX, -a command group \mfpframe...\endmfpframe. This is actually recommended -(over the first form) if the user wishes to frame an mfpic environment. -This ensures that category codes are not prematurely set by reading the -whole picture as an argument. - -Changes to grafbase: - -Moved interim warningcheck:=0; after mode_setup because mode_setup -sets it to 1. Now that warningcheck is correctly set, we can change -the test of parameters in secd, etc., from comparing with nottoosmall, -to comparing with reallysmall. - -Streamlined minpair and maxpair. - -Define transform vtr on its own in setztr rather than only the macro -vconv being defined (in terms of ztr). Define ztr in terms of vtr -(the "right way to do things", said the linear algebra teacher). -Remove definition of invztr and use inverse ztr the few times necessary. - -Remove the "complicated zconv" entirely. - -Added plain Metapost's image command to grafbase.mf. - -Changed the command executed when clipall is true to clipto instead -of clipsto. - -Added textboundary, textoval and textellipse to put paths around -text. Only the size and center point of the text is passed by mfpic, not -the actual text. These implement the mfpic commands \textboundary, etc. - -Added parameters pair label_adjust and numeric label_sep. -These are used in grafbase.mp for shifting labels. They are also -used there and in grafbase.mf for positioning and sizing textboundary, -textoval and textellipse. - -Added test for ClipOn to dashing code, plotsymbol and plotnodes. - -arrowdraw now checks for hlen > 0 before drawing head. - -Complete rewrite of axes code and drawing of hash marks on axes. Four -new axes added leftaxis, etc. - -Changed code for grid so it is fitted to the coordinates: integer -multiples of xspace and yspace are plotted. Added gridlines. - -Changed arcppp in grafbase for more robustness (I hope) and better -result on small values of sweep. +list of TeX text and numbers. +Added \tlabelcolor to control color of Metapost placed text. +Added \backgroundcolor to set the color variable background, the +color used by \gclear. -REVISION 0.4.16 beta, July 28--30 2001: +Added \doaxes. It takes a set of letters chosen from {xylbrt}, and +draws the specified axes. --- Changed name of \textboundary to \tlabelboundary and then - \tlabelrect. --- Changed name of \textoval to \tlabeloval. --- Changed name of \textellipse to \tlabelellipse. --- Added "star form" of each that defines the curve without placing the - label. --- Renamed grafbase command textboundary to textrect. +Added optional parameter to \plotdata and \datafile; can be used +instead of \(un)smoothdata. -Replaced the four commands \leftaxis, etc., with single -command - \axis[<hlen>]{<one-axis>} -(example \axis{l}) and \borderaxes, etc., with - \doaxes[<hlen>]{<axis-list>} -(example \doaxes{lbrt} for the 4 borders). +Added \mfpframe...\endmfpframe to frame the contents. -Recoded \mfp@now so that only 1 count register is used. + +REVISION 0.4.16 beta, July 28--30 2001: + +Added "star form" of each \tlabel<path> that defines the curve without +placing the label. REVISION 0.4.17 beta, July 28--Aug 10, 2001: -Changed grafbase.mp commands textrect, etc., so the first two -parameters (dimensions of some unspecified text) became one parameter, -which could be either of type pair (the two dimensions), string, or -picture (e.g., a btex...etex expression). In the latter two cases, -Metapost measures it and uses those dimensions to make a rectangle, etc. - -Gave all commands that take a [s] smoothness specification the -option to make it [s<tension>] to draw the curve more tightly. -Commands affected: \function, \parafcn, \plrfcn, \btwnfcn and -\plrregion. This necessitated changes in grafbase code to mkfcn so -that it accepts a tension parameter. Plus changes to all the macros that -call it: parafcn, xfcn, function, rfcn, and plrfcn. Those that -are used by mfpic, like function, were altered as follows. The name was -changed to tfunction, it was given a tension parameter and the call to -mkfcn passes that parameter. A new macro named function simply calls -tfunction with default tension. This was to make the new grafbase -accept old files generated by mfpic. Those macros not used by mfpic -(rfcn and xfcn) simply call mkfcn with tension equal to 1. - -Redid doplot, plotsymbol, and plotnodes so that the plotting symbol -can be a picture as well as a path. If a path, it is scaled by the scale -parameter. A picture is not scaled, since this is essentially not -possible in Metafont and since it is expected that in Metapost it will -be a btex...etex expression and the size is determined by the font. -Because this is expected to be the typical case, the picture is shifted -so that its center at the chosen position (instead of the left -baseline). This is not done in Metafont since finding the center of a -picture is non-trivial. In grafbase.mp the first parameter is also -allowed to be a string, and is then converted to a picture with the -infont operator. In all other cases it reverts to a default dot scaled -by the second parameter. +Commands: \function, \parafcn, \plrfcn, \btwnfcn and +\plrregion now take an option of the form [s<tension>]. Changed the \mfpic command so both optional parameters may be omitted -(scale 1 is then assumed). Also, the first parameter is no longer saved -in \@param. That was not a serious problem, but I did experience a -hard-to-debug problem from using the same temporary name in another -command. (It seems that \@param is not expanded until \@xconv and -\@yconv are used in tlabels, and I included a redefinition of \@param -in a command that calls \tlabel). - -Added EOL, `*', `"' and `$' to the list of symbols whose catcodes -are saved, changed while reading mfpic.tex, and restored at the end. -`$' is put in category 12 and used then in several \if tests for empty -arguments (previously `!' was used, then `@'. (Changed again a couple -of times!) +(scale 1 is then assumed). REVISION 0.4.18 beta, Aug 10--20, 2001: @@ -1382,185 +383,40 @@ REVISION 0.4.18 beta, Aug 10--20, 2001: Added point size option to \grid. Added a macro \plottext similar to \plotsymbol except instead of a -symbol, it takes a bit of TeX text. The macro runs entirely in TeX, -issuing a sequence of \tlabel commands. - -Changed grid and gridlines so the lines and points are fitted to the -pixel grid. We now use safedraw on -hroundpair(zconv(p1))--hroundpair(zconv(point)) instead of on -zconv((p1)--(p2)). When grid and gridlines are used with the same -parameters, this seems to make the picture periodic. +symbol, it takes a bit of TeX text. Added \plrgrid and \plrpatch. Added \piechart and \piewdge. -Removed \d@adv, \i@mul, \i@div, \q@mul as it turns out they are -either no longer used or unnecessary: \i@mul and \i@div, were only -used in \q@mul and it isn't needed as \x= 1.2\x works for fdims. -\d@adv seems to have disappeared from use. - REVISION 0.4.19 beta, Aug 20--26, 2001: Added \mfpicnumber to set the number of the next character or figure. -Removed explicit references to gcode, instead of writing -beginmfpic(incr gcode), \mfpic now writes -beginmfpic(\number\mfp@count). This way TeX's understanding of the -current figure number and Metafont's understanding are guaranteed to be -the same. The opening code of beginmfpic sets gcode in case any existing -files make use of it. This simplifies maintenance, and such things as -\noship and \mfpicnumber. - -Speaking of which, added code to \noship to set a switch so -\endmfpic could skip placing an empty box. I hope this makes an -mfpic environment a typesetting no-op. The only worry is that an -invisible character or box might creep into the output. (It hasn't yet, -that I've noticed, but checking would require testing virtually every -macro we've defined that can be used in an mfpic.) - REVISION 0.4.20 beta, Aug 26--Sep 1, 2001: -Added \barchart (it was easy after \piechart) after seeing comments -on gnuplot list that deprecated pie charts as a means of conveying -quantitative information. The rectangles become available as -\chartbar{<n>}. Where <n> is the number of the bar. - -Changed the code (again!) for shade in grafbase.mf. I was certain -there had to be a faster way. The key turned out to be not to do a -double loop. Instead, draw the bottom row of pixels in one loop, and -then copy that row in a separate loop. The original looped O(nm) times -if n and m are the dimensions of the rectangle. The new one loops, -O(n+m) times. A slight extra bit of efficiency in coding is obtained -by finding the smallest repeating pattern and repeating that (avoids -shifting every other row). This turned out to be two dots at a 45 degree -angle placed \shadespace apart. Then copy _that_ picture. - -I was worried that this algorithm had to copy a much larger picture the -second loop, but it seemed to make little difference. The bottleneck -seems to be the loop overhead. There was a seven-fold speed increase in -shading a 100pt by 100pt rectangle with a \shadespace of 1.2pt -(this is about the most dots MiKTeX's Metafont could handle). I came up -with another algorithm that is O(m/n + \log n), when n < m. But it -was only marginally better at the sizes Metafont could handle. Plus it -traded memory for speed. It built a shading rectangle of size at least -n/8 in O(\log n) iterations and then tiled with O(m/n) of them. -This could require up to an additional 12.5% more memory, as the last -row or column could overshoot by up to n/8. - -Changed timing so that \mfp@count is initialized to 1, and -incremented only in \endmfpic (where it is in the code skipped if -\noship is used). - -Changed \newdef to \def for \arrow so eplain won't generate a -complaint. +Added \barchart. REVISION 0.4.21 beta, Sept 1--10, 2001: -Got tired of typing "\macro" so I changed it to \mac. Also got -tired of "\vskip\myskip", etc., so I wrote \bcd and \ecd to -bracket the headers of command descriptions. For examples, I wrote -\bex and \eex. Changed the font for \prog to small caps and for -\opt to sans serif. Added \null to the end of the definition of \TeX -for \spacefactor reasons (saw this somewhere). - -Wrote a \myverbatim macro for mfpicdoc.tex since header.tex's -verbatim wouldn't work for me. Completely rewrote \head and \subhead -for better spacing and page breaks. (One of these days I will give them -numbers and perhaps translate everything to either LaTeX or eplain to -provide cross references.) - -Added SolidStar to symbols allowed by \plot, etc. Changed grafbase -code so that Star produces an open five-pointed star instead of the -asterisk previously drawn. Added Asterisk in case anyone prefers the -old way. - -Separated the part of \mfp@rwdata that writes the rendering code from -the part that writes the data. This is for later enhancements. The -wrapper that writes the rendering code is called \do@datafile. Took -out of \mfp@rwdata the code that wraps the point in (redundant) -parentheses. Now the parentheses _must_ be added by \using. - -Changed the name of \mfpic-package to MFPicpackagE, (part of -the paranoia that catcodes of punctuation might be changed). - -Added code to several commands to test for empty optional arguments. The -reason: when an optional argument has two parts, as in \plotdata[s1.2] -the code splits it up as [#1#2] so that s is assigned to -#1 and 1.2 is assigned to #2. If 1.2 is omitted, then #2 is -empty, but if both parts are accidentally omitted, then the closing -bracket is assigned to #1 and TeX searches for another right -bracket. This can cause extremely unhelpful error messages from internal -commands generated much later. Now, a command like \plotdata[] is -treated as if there were no optional argument: default values are used. -The user can deduce from incorrect output where an error occurred. - -Did the above for \tlabel, but only for the second part of the -optional parameter (laziness). - -Added commands similar to \rotatepath: \shiftpath{p}, \scalepath{p,sc}, -\xscalepath{x,sc}, \yscalepath{y,sc} and \slantpath{y,sl}. "p" is a -point "sc" is a scale factor, "x" is an x-coordinate, "y" is a -y-coordinate and "sl" is a slant factor. These commands accept a -following path and pass back the corresponding transformed path (to -preceding prefix macros). - -Released to alpha testers. +Added SolidStar to symbols available. Changed Star to produces an +open five-pointed star instead of the asterisk previously drawn. Added +Asterisk to duplicate the old Star. + +Added \shiftpath{p}, \scalepath{p,sf}, \xscalepath{x,sf}, +\yscalepath{y,sf} and \slantpath{y,sl}. "p" is a pair "sf" is a +scale factor, "x" is an x-coordinate, "y" is a y-coordinate and "sl" +is a slant factor. REVISION 0.4.22 beta, Sept 11--22, 2001: -Added \reflectpath{p1,p2}, \xyswappath and \yslantpath{x,sl}. Added -also \xslantpath as a synonym for \slantpath. - -Removed grouping in \mftitle that inadvertently caused \tmtitle's -argument to be omitted from the .log file. Rewrote both to call a -third macro. The third macro loads the argument in a token list and -writes to the .mf file. \mftitle supplies the grouping to preserve -the token variable. \tmtitle also adds the grouping, plus writes to -the .log and to the document. - -Redid \tlabel so that it checks for completely empty optional -parameter. - -Also avoid duplicating every \@...tlabel command. Only ever did that -to avoid the message about rotation being ignored in the \nomplabels -case. Somewhere along the way handling of default optional parameters -made that moot. - -Now \tlabel begins a group, then sets \tlabel@rot to empty (not -zero!) if mplabels is not in effect, then passes -"[\tlabel@vpos\tlabel@hpos\tlabel@rot]" as the optional parameter. The -two different commands \@tlabel and \@@tlabel ultimately end the -group. This necessitated changing a number of commands that call for -tlabels: I thought it more efficient to say - - \if@mfp@mplabels\expandafter\@tlabels\else\@@tlabels\fi... - -than to call \tlabel directly. But now that would unbalance the -grouping. - -Somehow I overwrote the version of mfpic.tex in which I made the above -three paragraphs of changes with the previous version. So I did it all -again, but now it does the following. \tlabel starts a group and calls -two different commands: if no "[]" follows, it defines \tlabel@rot -to be empty under \nomplabels; and if "[]" follows, it calls -\tlabeljustify. Finally it calls either \@@tlabel or \@tlabel, -depending on mplabels, feeding the arguments \tlabel@vpos, -\tlabel@hpos and \tlabel@rot. This ensures that insufficient optional -parameters produce default results, as \tlabeljustify does default -things with empty parameters. - -In grafbase: push vtr in bcoords command and pop it in ecoords. -Added vtr:=ztr shifted -zconv((0,0)); to apply_t. It seems coords -and apply_t were broken ever since I defined vconv in terms of vtr -instead of zconv. - -Added \@firstoftwo and \@secondoftwo and rewrote several commands to -use them, including \@if@mfp@beforefileopen.. +Added \reflectpath{p1,p2}, \xyswappath and \yslantpath{x,sl}; also +\xslantpath (a synonym for \slantpath). + REVISION 0.5.0 beta, Sept 24--Oct25, 2001: @@ -1568,408 +424,67 @@ Change comment written at the top of the output file. Now includes the name of the output file, as well as the \jobname of the TeX source that produced it. -Changed how \grid handles optional point size. Now it writes a command -vgrid that takes the extra parameter (and the old grid just calls -vgrid with default parameter). - Made \mfpic and \endmfpic write the source line number to the output for debugging use. -Added token list \every@tlabel and a command \everytlabel for -setting it (and writing the settings to the .mp file when mplabels -is in effect.) In order to make this local to mfpic -environments, now \mfpic writes "verbatimtex \begingroup etex" to -output and \endmfpic ends the group (under mplabels). - -Renamed \if@graphfileexists to \ifmfpicFirstTime which -required reversing the sense of all \if... tests. This will allow the -user to override the behavior of mfpic in unusual circumstances. - -Restored the command that expands to a backslash with category 12, for -writing the outer token \newtoks to the output file. +Added \everytlabel for setting commands issued at the outermost level +at the start of each label. -Because \mfsrc ends with \ignorespaces (should it?) commands -can generate a space under metafont but not under metapost with -mplabels (because they write TeX code to the output). I have therefore -started to look out for such differences and am adding \ignorespaces -when I notice them. +\mfpic now writes "verbatimtex \begingroup etex" to +output and \endmfpic ends the group (under mplabels). -Released to CTAN, Oct ??, 2001. +Released to CTAN, Oct, 2001. REVISION 0.5.01 beta -This modification actually occurred in February 2002, but I made it on -version 0.5.0, correcting a small bug by adding some braces around the -point arguments of \tlabel in a couple of places. The problem was that -Metapost code in the point argument could contain parentheses or commas, -and these had to be hidden inside braces. The code of \tlabels and -other commands would read this argument twice so two levels of braces -were needed, but that would cause errors in other contexts. The internal -braces in the right places meant the user need only use one. All of this -was only a problem with mplabels. - - -REVISION 0.5.02 alpha, Oct 26--Nov 8, 2001: - -Put most of the catcode changes (in the "paranoia" section of -mfpic.tex) in a command \mfp@sanitize for possible reuse. - -In preparation for a planned enhancement, I have divided \@figmac into -three parts: the set-up, write, and post-write phases. The idea is that, -e.g., \@curve[1.2] will do the setup, and write the code -tcurve(1.2, false) but not the points or the ending semicolon, then -close with the all-purpose macro \@figmacdata. This macro will scoop up -the last parameter (listing the points), write them to output, adding -the semicolon, and then issue the post-write code. Why? Ultimately I -would like to be able to present the data in more than one form. -\@figmacdata would detect the form and do the appropriate thing. In -particular I would like to be able to do something like -\curve[1.2]\datafile{file.dat} to draw a curve connecting the points -listed in file.dat. - -Have actually changed the definition of \curve and \cyclic to use -this scheme, although \@figmacdata just writes the inline data points -to output. Shouldn't be unusually hard to make it open the file handle -and call \mfp@rwdata. I will first try to organize the opening, -reading, writing and closing of files into reusable modules. - - -REVISION 0.5.03 alpha, Nov 8, 2001--???: - -Further modified \@figmacdata: Split it in two. First, \mfp@writelist -writes the list, enclosed in parentheses and followed by a semicolon, -then issue \@figmacend. This is because lists are also used by -"non-figmacs", like \xmarks and \point. For these I just use -\mfp@writelist. Perhaps it wouldn't hurt to include \@figmacend on -those, but I wasn't prepared to chance it. Also put the common -combination \@figmacstart\mfsrc{#1}\@figmacdata in a new macro -\@listmac. - -Now all those macros that take a list as last argument (thank goodness -it always _is_ the last argument) follow the scheme. This includes -\xmarks, \ymarks, \lmarks, \bmarks, \rmarks, \tmarks, \point, -\plotsymbol, \piechart, \barchart, \polyline, \polygon, \fcncurve, -\curve, \cyclic, \qspline, \closedqspline, \cspline, -\closedcspline, and \turtle. Ultimately, I may make \@figmacdata -write data from a file (if the next token is \datafile) or data listed -inline as if in a file (if the next token is \inline). - -I rewrote the code in \@mfpic that loads the figure into \@wholegraph -so that when \ifmfpicdraft is true then it is skipped completely and -\@wholegraph is just set to an empty box. Then, at the end of \@mfpic, -if \ifmfpicdraft is true, the figure number in \tt is set as a -\tlabel (so the size of the figure will automatically adjust to -accommodate it). - -Oops! Had to change the above behavior: \tlabel doesn't expand its -contents when writing to the .mp file in mplabels. So it is -impossible to get \mfp@count (the picture number) written as a number. -Rather than have to write the definition of \mfp@count to the output -file, I changed the code that loads the figure into \@wholegraph to put -the figure number into the box as straight text. Now, the figure number -may again overwrite the boundaries of the box, but that's OK, I guess, -since it's just a temporary situation. +Corrects a small bug by adding some braces around the point arguments of +\tlabel in a couple of places. REVISION 0.5.04 alpha, ???--April 11, 2002: -Added \@XP which expands to three \expandafters. - -Changed what the truebbox option writes to the .mf file. The scope -in Metafont should now more closely match the scope in TeX. - -Added options draft, final, and nowrite (as well as command -versions \mfpicdraft, \mfpicfinal, and \mfpicnowrite) which should -avoid including the pictures (draft) or include the pictures (final), -overriding automatic decisions. Option nowrite avoids writing anything -to the .mf file. - -Made several assignments, such as \mfp@count, \@graphfont, etc., -global, in case the command \opengraphsfile is issued inside a group. +Added options draft, final, and nowrite (commands \mfpicdraft, +\mfpicfinal, and \mfpicnowrite) which should avoid including the +pictures (draft) or include the pictures (final), overriding automatic +decisions. Option nowrite avoids writing anything to the .mf file. Rewrote \tlabel and friends so that the point arguments could -optionally be enclosed in braces. This was done by checking for a left -parenthesis with \mfp@ifnextchar and branching on that. This allowed -me to change the gblabel command to accept a list of points, and now -\tlabel can, under mplabels accept a list of points in braces. - -Completely reorganized the data file reading macros (much smaller and -free of \loop...\repeat constructs). Also added the previously -mentioned capability to replace any list after a macro such as -\curve{...} with the construct such as \curve\datafile{<file>} to -construct the list from the data in file - -Changed explicit value of 5 data points per line to the value of -\mfpdataperline when plotting data files. - -Added error messages \nodatafileerror and \emptydatafileerror. +be enclosed in braces. -Added command resizedrawpen to grafbase to unclutter the -output file. +All those macros that take a list as last argument can now substitute +"\datafile{name}" in place of the list. Collected the common code in \xmarks, \ymarks, etc., so that now they -are implemented with \marks x, etc. +are implemented with \marks x, etc. (Later renamed to \axismarks.) Added aliases \lattice and \gridpoints for \grid. -Changed the option handling in \tlabel so that it is translated into -integer values and \ifcase can be used, making for simpler conditional -code. Added \mfp@justifyerror to the \tlabeljustify command, to -occur if an invalid letter is used. - -Added \extra@tlabel command at the end of \@tlabel and \@@tlabel. -Redefining this makes it easier to write macros looping through many -\tlabel commands. - REVISION 0.5.05 alpha, April 16, 2002: Corrected bug in \mfpverbtex which caused # symbols to be doubled in -the output: simply change catcode of # before reading the verbatimtex -material into the token list. - -Remove \DeclareGraphicsRule commands issued in mfpic.tex so -as not to interfere with the graphics package error checking. Instead -the equivalent is done inside a group for each picture with -\@namedef{Gin@rule@.\mfp@count}. - -Added a command index to \mfpicdoc.tex. The distribution now includes -a recent version of eplain.tex for the indexing macros and the actual -index mfpicdoc.ind. The makeindex style file that was used, -mfpic.ist, is also included. +the output. REVISION 0.5.06 alpha, April 16--May 7, 2002: -After installing new MiKTeX and forgetting to set localfont, I found -that textrect, textoval and textellipse (in grafbase.mf) fail due -to arithmetic overflow. This is because rather simple text can be (say) -40pt by 40pt. Since that is 400 by 400 pixels (under mode:=ljfour), -and we have to compute numbers on the order of their product, we exceed -the 32K limit on numbers. Changed these commands to do computations in -graph coordinates. That is at least resolution independent. Also change -some formulas involving sqrt to instead use ++ or abs to minimize -such problems. - -Updated most docs. Changed mfpic.ist so it will write an mfpic package -comment to the top of mfpicdoc.ind. +Made changes to avoid MF/MP overflow in \tlabelellipse/oval. -REVISION 0.5.07 alpha, May 7--June 25, 2002: +REVISION 0.5g (= 0.5.07) alpha, May 7--June 25, 2002: Added \usingpairdefault to reset the \using specification to the -default. Also \usingnumericdefault for commands that take a numeric -list (equivalent to \using{#1 #2}{#1} ). - -Documented \marks<axis> commands. - - -REVISION 0.5g alpha, June 26--July 31, 2002: +default. Also \usingnumericdefault for commands that take numeric +data. Changed version numbering scheme so LaTeX file utilities like the snapshot package are better served. -Change the graphic inclusion to use \@setmfpicgraphic which, in -addition to executing \setmfpicgraphic, also runs any additional -commands that may be needed and should be transparent to the user. These -include the above setting of the graphics inclusion rule, and now also a -scheme for recovering the bounding box (for future feature allowing -truebbox without mplabels). The graphics package makes this hard by -not saving it globally except in \@gtempa, which hardly seems safe to -rely on. Nevertheless that is what I use now, though it doesn't get used -yet. - -Changed \DeclareOption* to print a warning or a message (depending on -whether graphics was already loaded or not) instead of just passing -the option on to graphics package). - -The default verbatimtex stuff that was written to the out file in -\opengraphsfile is now stored in a token register -\mfp@commonverbatimtex and then written. - -\opengraphsfile now checks for the existence of a file with the -extension of the current value of \mfp@count (default 1) in case the -user changes its value (with \mfpicnumber) before that command. -mfpic.tex now sets it to 1 rather than rely on \opengraphsfile to do -so. - -Changed \tlabel to place its contents in a simple left aligned -\halign. This makes it possible to right-align or center multi-line -labels with an \hfill or \hfil on left. - -Corrected bugs in file read/write (\plotdata, etc.): Moved whitespace -resetting to \@processdatafile, and changed one \def in -\mfp@rwdataloop to \edef. - -Moved the LaTeX2e graphics rule stuff to \mfpic, \usemetapost now just -saves the graphics rule signature ("eps" or "mps") for use in that -stuff. - -Remove eplain.tex, substituting indexing.tex which contains only(?) -macros necessary to process the one indexing command actually used in -mfpicdoc.tex, and the two-column printing of the index. - REVISION 0.5h alpha, Aug 1--6, 2002: -Added code to \@setmfpicgraphic to retain the lower left corner of the -picture under metapost. I did this by redefining \Gin@def@bp to make -its definitions (of \Gin@llx, etc.) global. Then added that info to -\@xconv and \@yconv. This allows truebbox to work without mplabels. -Added code to graphbase.mp that keeps track of maximum bounding box of -all the text labels and to adjust the figure's bounding box if that -extends past the boundary of the mfpic environment. This allows labels -to expand the size of the graph (as documented) in the remaining case: -with mplabels but without truebbox. - -This requires that any user who redefines \setmfpicgraphic must also -redefine a command \getmfpicoffset that stores the coordinates of the -lower left corner in the macros \mfpicllx and \mfpiclly. - -Reverted to the previous \tlabel method of producing multiline -labels. The \halign method (specifically the \let\\=\cr) produces -an error when either of the packages latexsym or amsfonts is used. So it -is not (yet) possible to right align or center multiline labels. - -Reverted back when I discovered that \def\\{\cr} did _not_ conflict -and seems to work just as well. It is again possible to right align and -center multiline labels. - -Added \gclip rendering macro (did no one ever miss this?), that clips -the current picture to the interior of the following path. And added an -example to *objs.tex. - - - -REVISION 0.5i alpha, Aug 7--12, 2002: - -Rearranged the endmfpic code of grafbase.mp so that truebbox, clip -and mplabels interact properly, meaning that text which is clipped off -_doesn't_ expand the bounding box. - -Announced to mfpic mailing list. Maybe this will become version 0.6 beta. -(Ha!) - - -REVISION 0.5j alpha, Aug 12--15, 2002: - -Changed name of \marks command (introduced in 0.5.04) to \axismarks -to avoid name clash with \eTeX primitive command (reported by Guy -Worthington). - - -REVISION 0.5k alpha, Aug 15--26, 2002: - -Rearrangement of \begingroup-s at some point caused a problem with -\datafile commands: the \@figmacend was issued inside a group. -(reported by Jaromir Kuben). - -I moved the location of \@figmacstart and \@figmacend and that -solved it but caused a problem with \plotdata, which reused that code. -Solved by putting an appropriate \@figmacend in the \plotdata code. - - -REVISION 0.5l alpha, Aug 26--29, 2002: - -Changed the code that saves the lower left corner of the picture under -metapost. Instead of making \Gin@llx, etc., global, I redefine -\Gread@parse@bb to store them globally in our own macros. This -redefinition happens only in the \mfpic environment (in fact only -inside the box where the graphic is included). - -I settled on this as having almost no side effects. Perhaps there is a -reason the \Gin@* commands are local even though no one on -comp.text.tex came up with one. - -Also, since now the only \begingroup/\endgroup pair in the -file read/write code is in one place: the \@processdatafile command, I -deleted all the \global in front of \read commands. - - -REVISION 0.5m alpha, Aug 29--30, 2002: - -Updates to *.txt, readme.1st, and documentation. - -Changed \mfp@ifnextchar so that when looking for the next token, it -will skip over \relax. This means one can put the optional argument on -another line even when \preservelines is in effect (at which time the -line end character is active and has been \let equal to \relax) - -Change \@figmaclist and \@mfp@writelist so they preserve lines. -Since all commands that write lists of data to the output file -ultimately run one of these, all those commands preserve lines. Then I -removed \preservelines from \mfpic. Now we no longer need the -caution about putting a macro and its arguments on the same line. - - -REVISION 0.5n alpha, Aug 30--Sep 04, 2002: - -Allow \tlabelsep and \tlabeloffset to have any <dimen> argument. I -was so stupid: it was just a matter of setting the TeX dimensions first -and then writing their values to the output. - -Documented \mfpdataperline. Also changed it to a macro rather than a -\count because LaTeX users are unfamiliar with count registers -(\newcounter, yes, \newcount, no). I could have called it -\c@mfpdataperline, but then it wouldn't be user-level for plain TeX. - -Changed "\ifnum\mfp@n=\mfpdataperline" to -"\ifnum\mfp@n<\mfpdataperline" and exchanged the true and false clauses. -Just in case some user sets \mfpdataperline to some number which is not a -positive integer. - -Added \space to "\mfsrc{verbatimtex\endgroup\space etex}", just in -case TeX could enter a state where it doesn't append a space when it -writes the \endgroup. - - -REVISION 0.5o alpha, Sep 04--06, 2002: - -Corrected LTXMFobj.tex and LTXMPobj.tex. After testing various -combinations of mplabels and truebbox, I'd incorrectly added these -options to the former file and failed to restore them to the latter. - - -REVISION 0.5p alpha, Sep 06--09, 2002: - -Added commands \setpapersize and \setpagegeometry to header.tex. -Now the preamble of almost every .tex file in the docs directory is -reduced to using these two commands. - -Deleted old verbatim macros which were no longer used. - -Removed save piecenter; from grafbase. This variable was documented to -be set by the piechart command, but saving it made it unavailable. - -Corrected the example concerning \datafile with \xmarks: the -parameters of \using needed a space between them. - - -REVISION 0.5q alpha, Sep 09--12, 2002: - -Multiple documentation refinements. - -Removed \if@mfp@metafont, using only the switch \if@mfp@metapost. - -Added \mfp@ifdefined: it checks if a token is neither \undefined nor -\relax. Used in macros to detect format. Moved definition of -\@firstoftwo and \@secondoftwo before it. - -Made some definitions in \usemetapost global, in case it is -mistakenly issued inside a group. - -Removed \@eatspacedef since it was used only once to define something, -and it was shorter to define it directly. - -Changed all \ifx in \@@arrowoption to \if in case someone wants to -pass the the letter as a macro - -In axis code, changed `\x to simply `x lest \x have some -definition and some TeX state causes it to be expanded. - -Gave \newsavepic a definition closer to \newsavebox, which uses -\@ifundefined rather than strictly testing against \undefined. +Added \gclip rendering macro that clips the current picture to a path. REVISION 0.6 beta, Sep 12, 2002: @@ -1979,15 +494,15 @@ Uploaded to CTAN. REVISION 0.6a alpha, Sep 12--Nov 5, 2002. -Added \let\par\relax in the definition of \@mfpic to -nullify blank lines in user code. Needed since I stopped using -\preservelines. (Reported by Jaromir Kuben.) Put in commands to -restore \par to its normal meaning in labels and captions. +Added \let\par\relax (later \@empty) in \mfpic to nullify blank lines +in user code. (Reported by Jaromir Kuben.) Put in commands to restore +\par to its normal meaning in labels and captions. REVISION 0.6b beta, Nov 6--, 2002. -Incorrect sign on sinh function in grafbase. +Correct sign on sinh function with negative argument + REVISION 0.6c beta, Nov 6--, 2002. @@ -1995,788 +510,139 @@ Bounding box had the horizontal and vertical data reversed if all of the following three options were selected: metapost, mplabels and clip. -REVISION 0.63 alpha - -Mfpic: +REVISION 0.63(=0.6c) alpha -Added code to write into the graphs file a test of the major version -number (to assure that the files mfpic.tex and graphbase.mf/p are -comparable). +New numbering scheme: increment hundreds (perhaps also thousands) digit +for alpha, add letters only for patches to released beta version. -Added a switch \in@mfpicenv that is true inside an mfpic environment and -false outside. This allows macros to make global changes outside and -local changes inside, helping TeX and Metafont stay in sync. Modified -some commands to use it (clip and truebbox options, so far). Added -\mfp@local which expands to nothing inside and mfpic environment and -to \global outside. +Added check that versions match to mfpic and grafbase. -Changed \@dummy to \mfp@dummy (mfpic.tex) lest its name clash with -other packages. - -Added a \partialpath{a,b} command. It's argument is two fractions -separated by a comma and produces the subpath of the following path f -that goes from a*length(f) to b*length(f). (Hmmm...so -\partialpath{1,0} would inefficiently reverse a path!) +Added a \partialpath{a,b} (later \partpath) command to produce the +subpath of the following path f that goes from a*length(f) to +b*length(f). Also added \subpath{a,b} to give the equivalent of the MF code subpath (a, b) of <following path> -Added command \closed[<tension>]{<method>} where <method> is l, b, -s, cb, or u so that, for example, \closed[2]{s} does the same as -\sclosed, except that added or modified links will have tension equal -to 2. Then I defined the previous commands in terms of this one (tension is -ignored for \lclosed and \cbclosed since they specify exactly what the -link should be.) Default for <tension> is 1. - -Moved \fdef to a global location and added "save #1;" to its -definition. Functions defined with it should now be local if it is used -in an mfpic environment and global otherwise. +Added tension option to closure commands where it makes sense. -Redefine \+ for entire mfpic.tex. Avoids somewhat complicated -work-around of its outerness in \usemetapost. Restore previous meaning -at end of file. - -Added \@bsphack and \@esphack (as in LaTeX). +Moved \fdef to a global location. Rewrote \tlabelrect, etc., so that they take a second optional -parameter: the label justification. Made the current \tlabel defaults -the default for \tlabel<path> also. Might change this to [cc] after -talking to Jaromir. - -Changed \store to be usable as a prefix command. It still takes a -second argument but doesn't wrap anything around it, so -\store{m}\circle{...} is as valid as \store{m}{\circle{...}}. But now - \xscalepath{0,2}\store{m}\circle{...} -is also valid, storing the untransformed circle. It is written as a -\@rendmac so that it turns off automatic path rendering. It invokes a -new grafbase command stored , which stores the path and passes it on -(as the other prefix macros do). This may have restored the old behavior -(prior to 0.2.9.10 alpha), but I can't tell, since I never had any -experience using those versions and don't know why the change was made. - -Streamlined \arrow so that instead of a chain of 4 macros (that all -did the same thing!), each calling the next, it loops until no more -optional arguments are found. - -Renamed \mfpicdebugwrite to \mfpDBwrite to streamline the source -file. Later renamed to \mfp@DBlog to remind me that it only writes to -the .log . - -Change \getmfpicoffset and \preparemfpicgraphic so they take an -argument: the name of the figure file. The default versions do nothing -with it. Changed \@setmfpicgraphic so it calls them with the name of -file. In case a power user needed the file name in his redefinition. - -Shortened \usemetapost. Defined as much as possible outside it, and -include only what needs to be changed. E.g., we no longer redefine -\@setmfpicgraphic inside it (nor \preparemfpicgraphic in the -non-LaTeX version). - -Rearranged code so that \usemetapost is defined in three ways instead -of two: LaTeX2e, plain pdfTeX and plain TeX. Formerly the second two -were combined in one which contained an \ifpdf-\else-\fi construct. That -is now moved to an outer level. Shortened the name of \if@mfp@pdftex to -\if@mfp@pdf since pdftex could be used to produce dvi output, and we -want this to be true only when pdf is being produced. - -Added \mfcmd (adds semicolon to argument) and \mflist (wraps argument -in parentheses). Done so that we can delay reading the argument and -therefore preserve lines. Both of these and \mfsrc now call \@mfwrite -with an appropriate argument. It initiates \preservelines and -continues with \@mfcmd, \@mflist, or \@mfsrc. These read the -argument and end with \@mfsrc, which ends line preserving. - -Rearranged code of \@figmac. It now issues \@startfigtrue before -writing its argument and doesn't do \@imrendtrue. This allows it to -end with the code to read the argument, and avoids some cases of having -to read large arguments before \preservelines is issued. There was -only one case where the timing mattered: \connect, and there we needed -the current order! - -Simplified the scheme for list macros (\mfp@writedata). The above -rearrangement meant there was no longer any need for different treatment -of figmacs and non-figmacs. - -Grafbase: - -Added code to grafbase file to test if the major version of mfpic -(assuming it is input by an mfpic generated file) and that of -grafbase.mf/p are comparable. Added a boolean MFPIC that is true if -the test succeeds. Not used yet. - -Rewrote most of the arc commands in grafbase, focusing on trying to make -any points that were explicitly specified into actual nodes of the path -(i.e., use nothing that could result in round-off error) plus trying to -increase robustness. - -"Corrected" cbclosed command in grafbase. Its code used to put in one -cubic B-spline link and connect that to the beginning and end of the -path f with two ordinary MF Bezier path joins. Now it connects with -three cubic B-spline links, the middle one being the same as before. - -removed w, d, and h as internal variables because of another user -name clash, this time with \fdef(h)... . - -Rewrote grafbase messages and error messages for consistency and -pithiness. - -Changed gblabel to newlabel, but gblabel remains as an interface for old -files, calling newlabel. There are now three parameters rather than four -for horizontal and vertical adjustment. The first gives the fraction -of the text left of the point of placement. The third is a -boolean. If false, the second parameter is taken as the absolute -fraction of the text below this point. If true, it represents the same -except the depth of the text is ignored. This (.5,0,true) gives [Bc] -placement, while (.5,0,false) gives [bc]. - -Added textrectx, textellipsex and textovalx which now allow horizontal -and vertical adjustment and rotation, just like gblabel. The original -commands just call it with the old default (centered, not rotated). - -Rewrote nearly all error messages in grafbase.mf/p. Changed "GUBED" to -"END DEBUG". (That has always bothered me.) - -Reintroduced "bounds" to the mfpic file. It seemed a reasonable -shorthand, replacing four lines of code with one. And has been around -forever. - -Reexamined clipping, trying to make sure that when ClipOn is true, -nothing is written outside the clipping paths. Except there are things -drawn for debugging purposes, so I added noclip() which executes its -contents in a group where ClipOn is set to false. Added DoClip(v) as a -shorthand for: - if ClipOn and (ClipPath > 0) : clipsto (v, ClipPath); fi -Correspondingly changed several commands to write to a temporary picture -variable, which is then DoClip-ed before adding to active_plane. This -turned out to be a prescient act for the purpose of using color in MF -(see below). - -Changed P1 in headpath (giving the direction of the arrowhead) -from "direction n of g" to "point n of g - precontrol n of g". -This gives the arrowhead from \arrow\rect{...} a reasonable direction -without having to rotate it +/- 45 degrees. - -Determined that the filling commands shade , polkadot and tess (all -these are my doing) did not respect aspect_ratio. Changed all of -them to invoke a macro, filledwith, that returns a rectangular picture -tiled with shifted copies of a given picture. This macro respects -aspect_ratio (i.e, invokes .t_ where it should -- I hope). - -Introduced color to Metafont (gray levels only): made color synonymous -with numeric; assigned numeric gray levels to the variables red, -green, etc. Defined the color commands (rgb, RGB, cmyk, gray and -named) to produce appropriate gray levels. Added macro makegray for -this purpose. Allow black or white in drawing commands and gray -levels in filling commands. Gray fill is implemented by a new macro -shaded which is similar in some ways to the internal code of shade and -may one day replace it. Right now shade uses round dots and respects -shadewd and the spacing parameter. But shaded just builds a square -picture which is either two black almost-squares in a white background -(gray levels > .5) or two white almost-squares in a black background. -Works well in simple tests so far. - -Changed the code executed if mode is unknown back to switching on a -default mode, but this time ljfour instead of cx. - -Removed the aspect_ratio scaling from resizedrawpen, and also from -the definition of drawpen and hatchpen. Added that scaling to -shpath. - -Added partialpath and gsubpath to support mfpic's \partialpath -and \subpath . - -Docs: - -Changed this file (changes.tex) from a .tex file to a .txt file for -simplicity of maintenance. - -Transcribed mfpicdoc.tex to a LaTeX file adding mfpdoc.sty to preserve -most of the previous formatting. Adds a table of contents; allows an index -without the extra files indexing.tex and mfpic.ist (both now removed). -Added hyperref, producing a linked .pdf file if pdflatex is used. Did -the same with grafdoc.tex and mf-revu.tex, except the latter has no -index. Have removed mppicdoc.tex since the small part of it that was -not already covered in mfpicdoc.tex has been added in an additional -appendix. - -Made mfpic.dtx, mfpic.ins and grafbase.dtx files. Processing -mfpic.ins produces mfpic.tex and mfpic.sty from mfpic.dtx, plus -grafbase.mf, grafbase.mp and dvipsnam.mp from grafbase.dtx. - -REVISION 0.64 alpha - -Grafbase: - -Rewrote the mfpic macro \polkadotwd so all it does is set the width -(omitting the code "thepolkadot := setdot(...)"). The grafbase polkadot -command now remakes the dot each time it is run. This is really just for -simplicity (for the \cs{polkadotwd} macro). Same was done for \shadewd -and shade. To change the shape of the dots used, I've added -shadedotpath and polkadotpath in addition to dotpath. The last is -now only used for dotted lines and grid. - -Added command threeangles (suffix s) (expr A, B, C) that finds the -three angles of the triangle ABC and assigns them to the s1, s2, and -s3. Now used in arcppp and the new command circleppp . Later -threeangles was replaced by three calls to a new vardef: cornerangle -(A,B,C) , which was useful on its own. - -Added circleppp producing the circle through three points. - -Added circlecp producing the circle with center at a given point, and -passing through a given point. - -Added circlepps producing the circle completing the arc produced by -the corresponding arcpps. These three form their circle from arcs, -ensuring that the circle (a) begins at the first given point on the -circumference, (2) has all the given points as nodes (though more may -have to be added, of course), and (iii) it is at least as robust as the -arc commands, into which a lot of thought was put. - -Added commands that produce circles related to triangle. A triangle Q -is, by definition, required to be a closed path in the form -Q0--Q1--Q2--cycle. - -circumcircle Q produces the circle through all three corners -incircle Q produces the inscribed circle (inside the triangle - and tangent to all three sides) -excircle n of Q produces the exscribed circle opposite Q[n] (tangent - to Q[n-1]--Q[n+1], and to the extensions of - Q[n]--Q[n-1] and Q[n]--Q[n+1] outside the triangle) -ninepointcircle Q The circle through the base of all three altitudes, - through all three midpoints of the sides and through - the points on each median that is halfway - between the corner and the common intersection of - the medians. - -And commands that produce points related to a triangle: -incenter Q center of incircle Q (= intersection of angle - bisectors) -circumcenter Q center of circumcircle Q -excenter n of Q center of excircle n of Q -ninepointcenter Q center of ninepointcircle Q - -None of the triangle related command integrated into mfpic yet. - -Added command pathcenter c which obtains the center of a circle c -(or a rectangle c!) by finding the intersection of the perpendicular -bisectors of two chords. It will happily find the "center" of any path. - -Mfpic: - -Rewrote \function, \plrfcn and \parafcn so they all simply define -\mfp@fcnname to the appropriate grafbase command name and call the -same macro to write the code. As with a lot of other commands, we now -write the old shorter commands when the new parameter (in this case the -tension) is absent: \function {...} produces "function (true) (...)" -while \function[s1.5]{...} produces "tfunction (true) (1.5) (...)". -In retrospect it would have made cleaner code if I had placed the extra -"t" at the end of the name and the tension parameter at the beginning of -the parameters. - -Made similar changes to \btwnfcn and \plrregion . - -All the commands that have an optional argument for the color (\draw, -\gfill, \arrow and all the hatching commands) now have an empty value -for color as the default. When the color is empty we write the old -simpler commands. That is, "\draw..." or "\draw[]..." produces -"drawn ..." rather than "colordrawn (drawcolor) ..." Trying to -streamline the output file. - -Added optional argument to \circle (similar to the ones for \arc). So -the circle through three points can be easily drawn, filled, etc. - -Renamed \@graphdp to \@graphbot, since it is not the TeX depth, but -the coordinate of the bottom recalculated after each \tlabel . Also -\@graphht -> \@graphtop for the consistency. - -Streamlined some aspects of tlabel macros, reducing number of -macros in the chain. Also keep track of the \@graphleft, etc., -calculations so that we can later set the label on the graph with only -two kerns and no \if-clauses. \tb@moveright is the accumulated value to -kern horizontally, and \tb@raise is the amount to move vertically. +parameter: the label justification. -Streamlined \tlabel<path> macros, including consolidating main code into -one, rather than two alternative macros. +Redid all(?) optional argument handling so that an empty optional +argument is the same as no optional argument. -Added \@firstofone and use it in place of \mfp@identity . Also use it -when passing a pair of coordinates for \tlabel : provides grouping that -is not stripped by parameter matching, but also not written into output -file. +Changed \store to be usable as a prefix command. -Assigned numbers to axes: x=0, y=1, l=2, b=3, r=4, t=5 . Defined -\get@axisnum similar to \tlabeljustify to assign the numbers, and can -now use \ifnum in \axis and \ifcase in \axislabels to branch on. -This also consolidates the error message in one place. +Removed bug reintroduced into filling commands (shade , polkadot and +tess) so they did not respect aspect_ratio (affected only MF). -Rewrote the \endmfpic debug messages to give me information I want to -see: compare \@graphleft and \@graphright with \wd\@wholegraph, etc. +Introduced color to Metafont: color functions (rgb, cmyk, etc.) return a +numeric. Drawing commands subtract white paths (and simply draw others). +A process something like \shade is used to produce gray polkadots and +fills. -Rewrote \plottext under the assumption that all points are specified -as in other plotting commands: pairs separated by commas (i.e., no -braces). Changed docs to reflect it. +Transcribed documentation to latex. -Redid \axislabels so that it could proceed gracefully on an empty -argument. In fact... +Packaged mfpic in mfpic.dtx, mfpic.ins and grafbase.dtx. -Added \mfp@ifempty as an abbreviation for - \if~#1~\@xp\@firstoftwo \else \@xp\@secondoftwo\fi -to make several such changes possible. Redid \do@mtparam using it. +REVISION 0.64 alpha -Docs: - -Documented some aspects of MF naming conventions (basically: no -suffixes) and suggested only letters be used. +Added optional argument to \circle (similar to the ones for \arc). So +the circle through three points can be easily drawn, filled, etc. REVISION 0.65 alpha -Mfpic: - -Rename \mfp@metaposttrue to \mfp@mposttrue, etc. - -Since \@mfp@mposttrue is never otherwise used, we don't define it -(i.e., remove \newif command), instead, replace its use in -\mfp@mposttrue with \global\let\if@mfp@mpost\iftrue . Similar -changes for the false version and for other switches: \if@mfp@clip, -\if@mfp@centcapt (formerly \if@mfp@centercaptions), \if@mfp@mplabels - -Added \mfp@ifmpost{1}{2} as shorthand for \if@mfp@mpost 1\else 2\fi. -Added \@ifmplabels{1}{2} as shorthand for \if@mfp@mplabels 1\else 2\fi. - -Added \xxxfalse (initializations). Though unnecessary, it provides -documentation of the default. - -Renamed \@if@mfp@beforefileopen to \@if@mfp@filenotopen (since it -could conceivably have been previously opened but then closed). - -Added \setdatadashes, \setdatacolors, and setdatasymbols, to allow -the user to set the dashing style, colors and symbols used when -\dashedlines, \coloredlines , or \pointedlines (or \datapointsonly), -respectively, are in effect. (later removed them, see below). - -Added \@nameuse and \@namedef and replaced a several lines of code -with shorter versions using them. - -Added \@ifmtarg (from ifmtarg.sty) and use it when possible instead -of \mfp@ifempty - -Reordered much of both mfpic.dtx and grafbase.dtx (many times!) to -make documentation more natural. - -Rather extensive revision of \axislabels , mainly so that braces around -the text argument are not prematurely stripped (bug introduced when we -tried to "gracefully" handle empty portions of the arguments). - -Added \@makeother and used it in \mfp@sanitize. - -Removed a number of \newif's : those whose values are always set by -another command. These commands now contain \let\ifxxx\iftrue instead -of \xxxtrue . This saves a couple of strings of pool. - -Added \mf@T for the frequently used string "true" , and \mf@F for -"false" . - -Removed grafdoc.tex from the manifest (grafbase.dtx documents the -grafbase macros). Also removed mf-revu.tex (because I'm lazy). -But will add mfpguide.tex as a short intro/tutorial. - -Set \@mfp@verbtexfalse after writing the verbatimtex in -\opengraphsfile (in case it a user tries to have more than one -\opengraphsfile command in a document). - -The utility \mfp@gettoks that was only used in \tmtitle and -\mftitle has now been used to abbreviate similar \afterassignment -constructs elsewhere. - -Rewrote \curve and \cyclic so both call the same command (as was -done some time ago with \polyline and \polygon though not documented -until now). - Rewrote \noship and added \stopshipping and \resumeshipping so that shipping can be turned off for several figures. -Simplifies \mfpdatacomment so that it just sets the register -\@datacommentchar to the character code. Then \mfp@setcomment -changes the category of \@datacommentchar to 14 (comment). - Added \transformpath , similar to \applyT except that it is a -modification macro for figures. It's argument is a transformer +modification macro for figures. It's argument is a transformer. Added \cutoffafter {<obj>} and \cutoffbefore {<obj>} as prefix macros that cut the following path after its intersection with the named -<obj> (a name defined with \store) +<obj>. Added \trimpath{<dim1>,<dim2>} , a prefix macro that removes the part of the following path within <dim1> of its start and within <dim2> of its end. -Grafbase: - -Added transformedpath (transformer) expr f that reads a path f , applies -the transformer and returns the result. This is to supply the correct -syntax for the \transformpath macro. - -Added gbcutafter and gbcutbefore . Unlike the similarly named MP -macros, these try to cut off as much as possible. Later changed the -names to cutoffafter and cutoffbefore, but gave them standard mfpic -syntax: "vardef cutoffbefore (expr b) expr f =". Also reverted to -essentially the same as the MP definitions. - -Added trimmedpath (expr a,b) to implement \trimpath . - -Rewrote textovalx and textellipsex so they now simply call a common -command, xellipse with a switch set that affects only two lines of the -calculations. - -Slightly revised MF handling of colors. Now the only real difference -between MF and MP is in one macro, makeclr , plus the "color" keyword -("color" still means "numeric" in MF). What makeclr does is accept -three parameters and calculate a gray level in MF, but simply return a -color triple in MP. Then rgb(r, g, b) means - makeclr(snapto(r), snapto(g), snapto(b)) -while all other color functions (except named ) call rgb . - REVISION 0.66 alpha -Grafbase: - -Will try to converge behavior of labels between options mplabels and -nomplabels . Therefor, we add the labels in grafbase on top of the -drawing, after any clipping. We do this in newgblabel (oh, yes, I -renamed newabel to newgblabel) by adding the label to their own -picture: currentlabels. Then currentlabels is added onto the picture -as the very last thing in endmfpic . - -Added emin(x,y) and emax(x,y) as somewhat more efficient versions -of min() and max() . They are vardefs and take two expression -arguments rather than a text parameter with an arbitrary list. - -Added the possibility for textrectx to be given "maximally" rounded -corners: each quarter circle meets the one at the nearest corner so the -end is a semicircle. This is done by allowing the radius parameter to be -a boolean. When it is true, maximal roundedness is used, when false the -corners are not rounded. Provided a mfpic interface by defining the -boolean variable roundends, which is true by default. - -Added TruncateWarn and NoCycleWarn , that print common warning -messages. - -Added pointcolor , the color in which points are drawn by pointd and -in which symbols are drawn by plotsymbol . Now implement pointd with -plotsymbol . However plotnodes , being a drawing command, uses -drawcolor . - -Removed "withcolor fillcolor" from the definition of interior , which -is normally only used in grafbase.mp in some other command that has a -color parameter. The only really "benefit" of having it there was a -dubious one: plotsymbol produced fillcolor solid symbols and -drawcolor open ones. Now all are in pointcolor . Also moved a couple -of other instances of withcolor out of low level commands and into -higher level commands. - -Removed the color parameter from thatchf . For MF to respond to -hatchcolor , the color has to be invoked when the hatching is added to -active_plane , and only the higher level command, thatch , does that. - -Rearranged some of grafbase.dtx for documentation purposes. I am -trying to follow this order: bitwise operations, picture manipulation -commands with use-motivated names, and then the rendering commands that -use those to manipulate active_plane, finally followed by the graph -coordinate rendering commands. - -Added vardefs pnt@#(f) , pre@#(f) and post@#(f) as abbreviations -for point @# of f , precontrol @# of f and postcontrol @# of f . - -Changed a few "max (x,0)" to "abs(x)". These had mostly been not -well-thought-out attempts to gracefully handle erroneous negative values -of "x". The "abs(x)" versions avoid problems in more situations - -Mfpic: - -I will eventually move the import of the picture from the beginning of -the environment (\mfpic) to the end (\endmfpic). Labels (when TeX is -placing them) will be kept in a separate box, and it will be added onto -the picture at the end. +Added \pointcolor , the color in which points are drawn by \point and +in which symbols are drawn by \plotsymbol. The optional parameter of \tlabelrect may now be the literal word "roundends". This will make the radius of the quarter circles equal to half the narrower dimension of the rectangle, giving the "rectangle" semicircular ends. -Added \pointcolor for setting the color of points (for \point) and for -symbols (\plotsymbol), but \plotnodes is interpreted as a drawing -command, and so still uses \drawcolor. - -Changed (again!) the name of \@if@mfp@filenotopen, this time to -\@if@mfp@fileisopen, reversing its sense, and reversed the order of all -commands. - -Moved the undefining of \mfp@filename in \closegraphsfile outside -the conditional (just in case). - - REVISION 0.67 alpha -Grafbase: - -Added knownarray suffix arr, which returns a boolean: true if arr is -the name of a known array (arr is numeric and a positive integer and -arr[1] through arr[arr] are known). Added isdashpat suffix pat, -which applies knownarray to pat.start, pat.rep and pat.finish. - -Added defaultdashes, defaultsymbols, and defaultcolors, which -contains the code to define dashtype0, etc., pointtype0, etc., and -colortype0, etc. - -Added setdatadashes, setdatasymbols, and setdatacolors to allow the -user to change the definitions of the dashtype, pointtype, and -colortype arrays. - -Added getdashpat, getsymbol, and getcolor which perform the modding -operation that used to be done in TeX for reverting (for example) to -pointtype0 after the ninth curve is drawn by \plotdata. - -Changed thepolkadot (in MF) so it is shaded. But we should make it -cover other contents of a region, and we need to subtract black ones -before we add gray ones. Done. +Allow the use of \usetruebbox in an mfpic environment. -Added regularpolygon (expr n) (suffix P) (text eqns), where n -is the number of sides, P is the name of the array of vertices, and -eqns is a pair of equations specifying either the center, P0, and one -vertex, or two vertices. Vertices are numbered anticlockwise (otherwise -two points are not enough data). +Added \reconfigureplot which takes the word `dashes', `colors', or +`symbols' for an argument, followed by a list to be used by \plotdata. +Added \defaultplot which takes the same arguments and restores the +builtin defaults. -Added variables default_tension and fcn_tension to be used as the -default in path creation commands instead of the hard coded values 1 and -1.2. +Added \regpolygon{n}{P}{<eqn1>}{<eqn2>}. -Mfpic: - -Realized that the opening code of \mfpic no longer needs to know the -setting of truebbox. No longer make it an error to use it in an mfpic -environment. - -Replaced the three commands \setdatadashes, \setdatacolors etc., with -a single command \reconfigureplot which takes the word `dashes', -`colors', or `symbols' for an argument. Added \defaultplot which -takes the same arguments and restores the builtin defaults. - -Changed name of \partialpath to \partpath. - -Added \regpolygon{n}{P}{<eqn1>}{<eqn2>} which writes -reguralpolygon (n) (P) (<eqn1>;<eqn2>;) (see above). - -Moved the loading of the figure to \endmfpic. Now tlabels are added -to a box \@alltlabels which is appended to the figure right after it -is loaded. This helps keep most of the box loading in one place. It also -permits the possibility of adding a write-18 capability for on-the-fly -figure creation. +Moved the loading of the figure to \endmfpic. Added \mpobj as a synonym for \mfobj. Added \settension to set the grafbase variable default_tension. -and \setfcntension to set the grafbase variable fcn_tension. - -Docs: +and \setfcntension to set the grafbase variable fcn_tension (this +second one later removed). Started mfpguide.tex, a beginner's tutorial. -Renamed mfpicdoc.tex to mfpicman.tex (can't remember why -- maybe -because I got it confused with mfpdoc.sty). - REVISION 0.68 alpha -Grafbase: +Added complex function sgn Z : returns (0,0) if Z = (0,0), +otherwise unitvector Z. -Improved fcncurve: fcncontrol does `the right thing' when two -successive points have the same x-coordinate. This gives the curve a -decent ending if, instead of extending the sequence by symmetry (in -order to calculate the controls for the endpoints) we extend by making -the additional points equal to the endpoints. Looks _so_ much better! -That was surprising given that all I tried to do was avoid dividing by -0! - -Modified plotnodes as well as plotsymbol so that both store the -relevant pairs in an array and call dosymbols, which draws the symbol -at each coordinate in the array. And dosymbols call another command, -addsymbols, one or two times (once to clear). - -Added boolean: clearsymbols. When true, those symbols place by -plotsymbol or plotnodes which are `clearable' (open paths that satisfy -their first point equals their last) are first closed and filled with -background color in MP (cleared in MF) before being drawn. - -Added complex function sgn Z : returns 0 if Z is (0,0) otherwise -unitvector Z. - -Modified shadepic. The main point to make sure we don't divide by 0. -But also, set dimensions for the picture by doing the lowest resolution -first (thus ensuring both dimensions are at least 2 _pixels_). - -Modified the arrowhead routine so that when the head is filled, the -extra line that closes the head is also drawn. - -Modified arcpps so that angles less than 45 are drawn as a single -segment without passing through a midpoint. - -Modified pathcenter c so it can find the center when c is only an -arc. - -Added barycenter expr t to average the points of the the path t. - -Added makesector expr p, where p is an arc (or any path). Connects -pathcenter p to its endpoints. Could be a little more accurate if we -limited it to arcpps and used arccenter. - -Added boolean: overlaylabels. When true, labels are added to -current_labels, which is then overlayed at endmfpic (new behavior), -when false, labels are added immediately to active_plane. - -Changed these so they produce a path (line segment); used to be they -returned the endpoint. (You can get the point by invoking -"point 1 of altitude n of Q".) - -altitude n of Q the altitude from Q[n] to the opposite side - (produced if necessary). -median n of Q the median from Q[n] to the opposite side -anglebisector n of Q the angle bisector from Q[n] to the opposite - side - -Added - tbezier (expr tens, cyclic) (text lst) -which makes the simple cubic bezier (connects the points in the list -with ..tension tens.. ), as well as its non-tense counterpart bezier. -Also added - mkbezier (expr tens, cyclic) (suffix pts) -which is called by the above after loading the text list in the -the array pts. - -For quadratic Be'ziers we have qbezier, and mkqbezier. - -Removed fcn_tension, using instead 1.2*default_tension. This is for -consistency, all curves responding to the same default - -Added verbatimtex definition to grafbase.mf. It just gobbles -everything to the next semicolon. - -Redid openqbs and closedqbs so they behave like most other -path-making commands: they call textpairs and then some common code, -mkqbs with the name of an array. Also redid mkclosedcbs so it -utilizes mkopencbs. - - -Mfpic: - -Changed the axis commands so they explicitly call \arrow. The purpose -was to ensure that the arrowhead is drawn _after_ the shaft. -Significant only for colored heads. This turns out to make axis@# in -grafbase unnecessary \arrow[l##1]\@figmac{axisline.##2} is all that is -required. - -Added \makesector, a \@closmac prefix that can make a sector out of -a following arc. Useful when the arc is given without a known center -([t] or [s]). - -Added \let\@nl=\@activectrlM to \@mfwrite so that \@nl can -be used for line breaks when catcodes of EOL are already fixed (e.g., in -macro definitions) +Added \makesector, a prefix that can make a sector out of +a following arc. Added check to \opengraphsfile that no previous file is still open. -Added \clearsymbols \noclearsymbols to interface with the grafbase -clearsymbols boolean. Added clearsymbols LaTeX option - -Added \newdef\pinumber{3.14159}. - -Added new option: overlaylabels and commands \overlaylabels and -\nooverlaylabels. Similar in implementation to truebbox: a TeX -boolean is used only to communicate the setting to \opengraphsfile -before a file is open. Otherwise a MetaPost boolean (above) is switched -on or off. +Added option clearsymbols option and commands \clearsymbols and +\noclearsymbols. Open symbols used with \plotsymbol can have their +interiors cleared -Moved \@processdatafile outside \@mfpic@graf@macs. Also moved -\skipBlanksandComments and definition of \mfp@data since they are -used by \@processdatafile. Also moved \skipcoomments because it -seemed it should go along with \skipBlanksandComments. Then I rewrote -the latter to actually call \skipcomments, so now it _has_ to go where -it goes. - -Renamed \mfp@empty to \@empty. +Added option: overlaylabels and commands \overlaylabels and +\nooverlaylabels. Saves mplabels in a separate picture added on at +endmfpic. Added \pairarray{<name>}{<list-of-pairs>} and -\numericarray{<name>}{<list-of-numbers>}. They define, respectively, an -array of pairs and an array of numbers. They can be used outside an mfpic -environments (unlike \patharr), and have the usual scoping properties. +\numericarray{<name>}{<list-of-numbers>} that define an array of pairs +and an array of numbers. -Added \mfbezier[<tens>]{<list>} to interface with grafbase's new -bezier command. Also \closedmfbezier. +Added \mfbezier[<tens>]{<list>} to produce standard MF bezier path. +Also \closedmfbezier. -And the equivalent of (a sequence of) LaTeX \qbezier: \qbeziers and +Add the equivalent of (a sequence of) LaTeX \qbezier: \qbeziers and \closedqbeziers. -Removed \setfcntension because grafbase's fcn_tension was removed. -Adjusted docs. - -Renamed \if@mfp@mpost to \ifmfpmpost so power users can use it to -write code dependent on the figure processor. The commands to change it -are still private: \mfp@mposttrue/false . - -Added the test for file being open to \setmfvariable. Saves a lot of -tokens. It seems we never used it without \@if@mfp@fileisopen. Require -moving it considerably earlier. +Added \ifmfpmpost so users can use it to write code that adapts to the +figure processor. -Added \mfp@let as abbreviation for \mfp@local\let. Likewise -\mfp@def. - -Renamed \mfp@addto to \mfpaddto for power users (i.e., me) and added -\mfpmultiply (same syntax and similar effect). - -Renamed \@if@mfp@fileisopen to \@ifmfpfileisopen (it was just too -many @'s !) - -Changed \everytlabel so it tests for metapost rather than mplabels. -This allows it to be used anywhere without worrying whether \nomplabels -might have cancelled its effect. - -Renamed \massage@data to \parse@data. - -Make sure every write of verbatimtex ... etex ends with a semicolon so -it can be used by grafbase.mf (see above). - - -Docs: - -First version of mfpguide.tex finished. Writing it exposed a number of -bugs that got by the usual suite of tests. It is the first documentation -that actually shows the code and its result together. - -Second version of mfpguide.tex, adds appendices. Planning to ship a -PDF version. +Renamed \mfp@addto to \mfpaddto and added \mfpmultiply for power +users. REVISION 0.69 alpha and 0.69a -Mfpic: - -Rewrote \do@ptparam so its first parameter is the command token (e.g., -\do@ptparam\@draw{} instead of the old \do@ptparam{@draw}{}). Added a -command \simple@opt to process simple optional arguments (those that -don't need further parsing), it calls a second command to read the -option, substitute the default if empty, and then call the command with -the given or supplied option as a normal (brace enclosed) argument. The -idea is to make all empty optional arguments the same as none at all. -Added a command \null@opt which is essentially \do@ptparam with a null -second argument. It turns out that now all commands can be handled by -the last two: \do@ptparam and \alt@ptparam are not used anywhere -anymore, although the bare "\mfp@ifnextchar[" does appear once or twice. - -Make \gridlines honor the settings of \axismargin (see grafbase -section below). +Make \gridlines honor the settings of \axismargin. Added \hgridlines to draw only the horizontal and \vgridlines to draw only the vertical. @@ -2784,270 +650,167 @@ draw only the vertical. Added \gridarcs and \gridrays to draw only the arcs or rays of a polar grid. -Added \setmfboolean for \setmfvariable{boolean}. -Added \setmfnumeric for \setmfvariable{numeric}. - - -Grafbase: - -Rewrote gridlines to honor the axis margins (laxis, baxis, raxis, -and taxis). - -Added hgridlines (expr ysp) and vgridlines (expr xsp) - -Corrected polargrid. How did it ever last this long without a bug -report? The computation of rmin was wrong, and it seems a semicolon -was missing! Added gridarcs (expr rstep) to draw only the arcs, and -gridrays (tstep) for only the rays. Complemented plrpatch with -patcharcs and patchrays for this purpose. - -Corrected polargrid again! It seems the calculation of max and min -angles didn't take into account that angle (0,0) was undefined but -could occur in the code. - -Redid resizedrawpen to save drawpen and currentpen (not just -penwd). - -Removed mindiam and substituted minpenwd in the MP version (they -were equal anyway). +Added \setmfboolean and \setmfnumeric for the indicated instances of +\setmfvariable. Added \InputIfFileExists{mfpic.cfg} in the LaTeX section just before \ProcessOptions. Added code to detect and input mfppatch.tex if it exists. -Docs: - -Added a file plotting example to pictures.tex and lapictures.tex. - -Added some of the new commands to Objects.tex . Converted Objects.tex -to use built-in \ifmfpmpost instead of the ad hoc \ifmetapost -defined in TeXMPobj.tex and LTXMPobj.tex. - -Renamed mfpicman.tex to mfpman.tex. - - -Distribution: - -Packed up for distribution in mfpic69b.zip: - - mfpic.dtx - grafbase.dtx - mfpic.ins - README.txt - install.txt - changes.txt - mfpman.pdf - mfpguide.pdf - examlpes\pictures.tex - examlpes\lapictures.tex - examlpes\forfun.tex - examlpes\data.dat - scr\mfpman.tex - scr\mfpguide.tex - scr\refcard.tex - scr\mfpdoc.sty - -And placed on web site. +Renamed manual to mfpman.tex. Provide a linked mfpman.pdf with +TOC, and two indices. REVISION 0.69c alpha -Grafbase: - -Redid gendashed so that it balances speed versus memory: If there are -n repeated patterns, add sqrt(_n) of them to the picture _v, then -DoClip (_v); coloraddto (drawcolor) (active_plane, _v); <repeat>. Doing -that for each pattern was too slow, doing it only once wasted memory. - -Put on web site. +Lowered MF memory usage of \gendashed (and therefore also for \dashed, +\dotted and \plot). Problem reported by J. Kuben. REVISION 0.69d -Grafbase: - -Modified barchart so that the data can be pairs. Interpret (a,b) -as an interval and creates bars that begin at a and end at b (Gantt -diagrams). +\barchart can now take pair data. Interpreting (a,b) as an interval +and creates bars that begin at a and end at b (Gantt diagrams). -Added predirection@# (expr p) and postdirection@# (expr p) which -give correct results *whenever* the path p is nontrivial. Based on -the easily prove fact (which I only recently discovered) that for a -nontrivial single knot with keypoints A, B, C and D, the direction at A -is towards the first one of B, C or D that is not equal to A. The -predirection[j] returns (0,0) if the path is trivial. If the path is -trivial upto time j, it returns postdirection[j]. postdirection[j] -is analogous. - -Changed headpath to use predirection[length p](p) instead of -point length p of p - precontrol length p of p. +Added \gantt (= \barchart) -Mfpic: +REVISION 0.69f -Added \gantt (= \barchart) +Made [cc] the default for \tlabelrect, etc. Added command +\tlpathjustify to change the default. +Added code to input user additions, defaults, etc., in mfpic.usr, if +it exists. -Distribution: -Placed on web site, announced on c.t.t. +REVISION 0.69g +Bug fix to \tlabelrect. -REVISION 0.69e -Grafbase: +REVISION 0.7 beta, 14 Nov 2003 -Somehow the last version of grafbase included failed to include a -long-ago change to colorsafefill in which non-black fills first -subtract the interior under MF. Corrected that. +Packed up and put on web page and CTAN. -Experimented with a O(log n) loop for filledwith. Made no significant -difference in speed in tests. Must be the extra overhead. Keeping old -O(n) method. -Experimented with using "..tension atleast tens.." in mksmooth and -sclosed. All other tension using operations either call these or -require different treatment. The one case in the test suite where a -visible difference occured, it looked worse. Returned to old method. +REVISION 0.7a beta, 16 Apr 2004 -Proofed grafbase.dvi, the documentation of grafbase macros. +Change one semicolon (;) in a string written by \opengraphsfile to a +colon (:) to work around a bug in the perl scripts mptopdf and/or +texexec. -Docs: +REVISIONS 0.71 alpha--0.8 beta, 17 May 2005 -Proofed mfpguide. +Added + \arc[r], \arc[q], \circle[r], circle[q]. + \arrow* (star form). + \mfpimage...\endmfimage. + \globalsetvariable. + \levelcurve. + \convexcurve, \convexcyclic. + \doubledraw, \parallelpath. + \tlpointsep, \tlpathsep. + \computedspline, \closedcomputedspline. + \fcnspline, \periodicfcnspline, \btwnplrfcn +Changed the "\begingroup" and "\endgroup" written to output +to "\bgroup" and "\egroup". -REVISION 0.69f +Added \assignmfvalue, \mfpreadlog and option mfpreadlog for +requesting and receiving values calculated by MF. -Mfpic: +Added \setmfarray and redefined \numericarray and \pairarray to +call it. Added \colorarray. -Made [cc] the default for \tlabelrect, etc. Added command -\tlpathjustify to change the default. +Added \mfpdraftfont, the font to use in draft when text replaces a +figure. -Added code to input local additions, defaults, etc., in mfpic.usr, if -it exists. +Added loop structures + \mfpfor{<header>} ... \endmfpfor + \mfpwhile{<condition>} ... \endmfpwhile + \mfploop ... \mfpuntil{<condition>} ... \endmfploop -Changed \let\par\relax to \let\par\@empty at the beginning of -\@mfpic. It isn't really necessary to use \relax, we just want -to disable blank lines, we don't necessarily want to skip over them in -\mfp@ifnextchar. In fact, for catching errors, it is better if a blank -line stops \mfp@ifnextchar. +Added a \norender command. -Grafbase: +Added new.txt to contain what used to be the part of changes.txt +that covers the changes since the last version. -New definition of image (writing on active_plane) prevents use of -plain.mp macros (draw and undraw, for example) inside it. Revert -to plain.mp version. +Renamed file refcard.tex to mfpcard.tex. -Change patcharcs and patchrays so they draw on a suffix parameter -This avoids the use of image and saves memory since drawing on a -picture takes less memory (in some circumstances) than creating a -picture and then assigning it. Actually, the least memory would be to -clip each line as created and add that directly to active_plane. +Rewrote mfppatch.tex (formerly empty when there is no patch) to test +the version info and emit a message if there is a mismatch. -Re-examined use (or lack of use) of mono(). Added a few. +Sent to CTAN 13 May 2005. -REVISION 0.69g +REVISION 0.8a 17 May 2005 -Packed it up in mfpic69g.zip and put it on my web site. +Added forgotton \belowfcn plus the documentation of \btwnplrfcn. -Docs: -Added documentation that several arrays become defined after a -\piechart or \barchart command. +REVISION 0.8b 27 Sep 2005 -Added documentation on \mfpicversion. Added a couple of overlooked -\index entries and a couple of commands omitted from the "by type" -list. +Bug fixed concerning unprintable characters in filenames. +NOT uploaded. -Grafbase: -Modified piechart and barchart so that the documentation about -arrays was correct What was missing: pieangle and piedirection -(without numeric suffixes) were not declared, nor given the correct -value. +REVISION 0.89 08 May 2006 -Modified code of textrectx so that documentation of \tlabelrect was -accurate: negative values of the optional argument should now produce -indented arcs and reversed path. All that needed doing was reversing the -order of the path connections for negative radii. +Added: \arrowhead, \arrowtail and \arrowmid for arrows. -Fine tune the calculation of gray level for the MP version of shade so -that the result more closely matches the MF version on modern printers -(600+ DPI). Formula is now gray = 1 - (.88*shadewd/sp)**2, which gives -a lighter gray than before. We therefore rewrite the MF code to permit -shadewd to be as high as sp/.88 before resorting to filling. The -number .88 was empirically arrived at (i.e. I determined what number -made most of the MP and MF shaded figures in Objects.tex look the most -similar on two different printers; then I averaged the two values). +Added: \zigzag, \sinewave and \corkscrew renderings. -Change pi and deg to internals (along with radians). +Added \border, a closed rectangle around the border, adjusted inward by +the axis margin amounts. -Make plrpatch do what it used to do: draw in drawcolor. Also change -polarpatch back to calling plrpatch. +Added \randomizepath and \randomlines. +Added \startbacktext ... \stopbacktext for background text. -REVISION 0.7 beta, 14 Nov 2003 +Added \arccomplement to produce the complementary arc. -Packed up and put on web page and CTAN. +Gave \arc a *-form which produces the complementary arc. +Added \vectorfield and \plrvectorfield. -REVISION 0.7a beta, 16 Apr 2004 +\tlabel command handles a list of points in either TeX or MP label mode. -Change one semicolon (;) in a string written by \opengraphsfile to a -colon (:) to work around a bug in the perl scripts mptopdf and/or -texexec. +Added redefinition of \mpxshipout to correct mpost vers 0.901. +Added \axisline for maximum flexibility in rendering axes. ------------------------------------------------------------------------- +Added \globalassignmfvalue since \global\assignmfvalue didn't work. - Stuff To Do +New dimension \griddotsize for size of grid dots. ------------------------------------------------------------------------- +\circle and \arc now produce grafbase command "fallbackpath" when +the optional letter is not a valid choice. - Pie-in-the-sky stuff +Added \@safe@activestrue to the beginning of \mfpic and +\@safe@activesfalse to each tlabel placed by TeX and to tcaption. -A command to obtain the boundary of a region defined by F(x,y), where -F is a boolean valued function. Easy if the region is convex. +Added \everymfpic and \everyendmfpic. -A command to draw a path paralleling another path. Will need -predirection and postdirection and some notion of what to do when -they differ. Inside corners/cusps should be easy, +Added \closedcurve as an alias for \cyclic, \closedconvexcurve +for \convexcyclic and \closedpolyline for \polygon. - /\ /\ - / \ --> / \ - / \ / /\ \ +Allow loops outside mfpic environments. -outside corners might need some limit on "mitering": - __ /\ - / \ / \ - /\ --> / /\ \ or / /\ \ or a rounded (circular?) connection. +Added \mfppiechart and \mfpbarchart as versions of \piechart and +\barchart that are available outside the mfpic environment. The old +names can still be used inside the environment. +Correct centeredcaptions (broken in LaTeX). -A command to render a path with a "photon"? +Added \pageref commands to the "List of commands by type" in +mfpman.tex. -Try 'write18' on-the-fly creation of figures? Most straightforward would -be to mimic \opengraphsfile with each \mfpic. That would require -rethinking those commands that write to the graph file _outside_ an -mfpic figure. Maybe redo \mfsrc so it added to some macro or token list, -and write _that_ after the file is opened. +Corrected behavior of mfpic environments with regard to \everypar. -Or maybe: \opengraphsfile at beginning of document, then -\closegraphsfile just before processing the figure, then \opengraphsfile -again right afterwards. Then only commands we insert occur when a file -is closed. -Truebbox for MF? Might be done if every drawing command kept track of -bounding boxes (commands that fill, hatch, etc. already get this info -with gbbox). Would just need to add it to plotsymbol (for pointd and -plotnodes) and to the drawing commands (drawn, gendashed, etc.). Might -want to skip the lower-level things like safedraw, safefill, etc. (or -maybe add it _only_ there). Don't want to do it for anything that -doesn't add to active_plane. But some things only add pictures to -active_plane and by then it's impossible to determine the size. Once a -bounding box is known, endmfpic can adjust tfm dimensions. and shift the -picture before shipout. +REVISION 0.90 01 Jun 2006 +Uploaded to CTAN diff --git a/Master/texmf-dist/doc/generic/mfpic/coil.mps b/Master/texmf-dist/doc/generic/mfpic/coil.mps new file mode 100644 index 00000000000..d8fb9cd6ec0 --- /dev/null +++ b/Master/texmf-dist/doc/generic/mfpic/coil.mps @@ -0,0 +1,139 @@ +%!PS +%%BoundingBox: 0 0 33 7 +%%HiResBoundingBox: 0 0 32.87663 6.37607 +%%Creator: MetaPost 0.901 +%%CreationDate: 2006.05.23:1308 +%%Pages: 1 +%%BeginProlog +%%EndProlog +%%Page: 1 1 + 1 0 0 setrgbcolor +newpath 0.49814 2.98878 moveto +0.49814 3.12091 0.44563 3.24759 0.35222 3.341 curveto +0.2588 3.43442 0.13213 3.48692 0 3.48692 curveto +-0.13213 3.48692 -0.2588 3.43442 -0.35222 3.341 curveto +-0.44563 3.24759 -0.49814 3.12091 -0.49814 2.98878 curveto +-0.49814 2.85666 -0.44563 2.72998 -0.35222 2.63657 curveto +-0.2588 2.54315 -0.13213 2.49065 0 2.49065 curveto +0.13213 2.49065 0.2588 2.54315 0.35222 2.63657 curveto +0.44563 2.72998 0.49814 2.85666 0.49814 2.98878 curveto closepath fill +newpath 3.48701 3.00691 moveto +3.48701 3.13904 3.43451 3.26572 3.3411 3.35913 curveto +3.24768 3.45255 3.121 3.50505 2.98888 3.50505 curveto +2.85675 3.50505 2.73007 3.45255 2.63666 3.35913 curveto +2.54324 3.26572 2.49074 3.13904 2.49074 3.00691 curveto +2.49074 2.87479 2.54324 2.74811 2.63666 2.6547 curveto +2.73007 2.56128 2.85675 2.50877 2.98888 2.50877 curveto +3.121 2.50877 3.24768 2.56128 3.3411 2.6547 curveto +3.43451 2.74811 3.48701 2.87479 3.48701 3.00691 curveto closepath fill +newpath 6.47589 3.025 moveto +6.47589 3.15712 6.42339 3.2838 6.32997 3.37721 curveto +6.23656 3.47063 6.10988 3.52313 5.97775 3.52313 curveto +5.84563 3.52313 5.71895 3.47063 5.62553 3.37721 curveto +5.53212 3.2838 5.47961 3.15712 5.47961 3.025 curveto +5.47961 2.89287 5.53212 2.76619 5.62553 2.67278 curveto +5.71895 2.57936 5.84563 2.52686 5.97775 2.52686 curveto +6.10988 2.52686 6.23656 2.57936 6.32997 2.67278 curveto +6.42339 2.76619 6.47589 2.89287 6.47589 3.025 curveto closepath fill +newpath 9.46477 3.04312 moveto +9.46477 3.17525 9.41226 3.30193 9.31885 3.39534 curveto +9.22543 3.48875 9.09875 3.54126 8.96663 3.54126 curveto +8.8345 3.54126 8.70782 3.48875 8.61441 3.39534 curveto +8.521 3.30193 8.46849 3.17525 8.46849 3.04312 curveto +8.46849 2.911 8.521 2.78432 8.61441 2.6909 curveto +8.70782 2.59749 8.8345 2.54498 8.96663 2.54498 curveto +9.09875 2.54498 9.22543 2.59749 9.31885 2.6909 curveto +9.41226 2.78432 9.46477 2.911 9.46477 3.04312 curveto closepath fill +newpath 12.45364 3.06125 moveto +12.45364 3.19337 12.40114 3.32005 12.30772 3.41347 curveto +12.21431 3.50688 12.08763 3.55939 11.9555 3.55939 curveto +11.82338 3.55939 11.6967 3.50688 11.60329 3.41347 curveto +11.50987 3.32005 11.45737 3.19337 11.45737 3.06125 curveto +11.45737 2.92912 11.50987 2.80244 11.60329 2.70903 curveto +11.6967 2.61562 11.82338 2.56311 11.9555 2.56311 curveto +12.08763 2.56311 12.21431 2.61562 12.30772 2.70903 curveto +12.40114 2.80244 12.45364 2.92912 12.45364 3.06125 curveto closepath fill +newpath 15.44252 3.07936 moveto +15.44252 3.21149 15.39001 3.33817 15.2966 3.43158 curveto +15.20319 3.525 15.0765 3.5775 14.94438 3.5775 curveto +14.81226 3.5775 14.68558 3.525 14.59216 3.43158 curveto +14.49875 3.33817 14.44624 3.21149 14.44624 3.07936 curveto +14.44624 2.94724 14.49875 2.82056 14.59216 2.72714 curveto +14.68558 2.63373 14.81226 2.58122 14.94438 2.58122 curveto +15.0765 2.58122 15.20319 2.63373 15.2966 2.72714 curveto +15.39001 2.82056 15.44252 2.94724 15.44252 3.07936 curveto closepath fill +newpath 18.4309 3.09746 moveto +18.4309 3.22958 18.37839 3.35626 18.28497 3.44968 curveto +18.19156 3.54309 18.06488 3.5956 17.93275 3.5956 curveto +17.80063 3.5956 17.67395 3.54309 17.58054 3.44968 curveto +17.48712 3.35626 17.43462 3.22958 17.43462 3.09746 curveto +17.43462 2.96533 17.48712 2.83865 17.58054 2.74524 curveto +17.67395 2.65182 17.80063 2.59932 17.93275 2.59932 curveto +18.06488 2.59932 18.19156 2.65182 18.28497 2.74524 curveto +18.37839 2.83865 18.4309 2.96533 18.4309 3.09746 curveto closepath fill +newpath 21.41977 3.11557 moveto +21.41977 3.2477 21.36726 3.37437 21.27385 3.46779 curveto +21.18044 3.5612 21.05376 3.61371 20.92163 3.61371 curveto +20.7895 3.61371 20.66283 3.5612 20.56941 3.46779 curveto +20.476 3.37437 20.4235 3.2477 20.4235 3.11557 curveto +20.4235 2.98344 20.476 2.85677 20.56941 2.76335 curveto +20.66283 2.66994 20.7895 2.61743 20.92163 2.61743 curveto +21.05376 2.61743 21.18044 2.66994 21.27385 2.76335 curveto +21.36726 2.85677 21.41977 2.98344 21.41977 3.11557 curveto closepath fill +newpath 24.40865 3.1337 moveto +24.40865 3.26582 24.35614 3.3925 24.26273 3.48592 curveto +24.16931 3.57933 24.04263 3.63184 23.9105 3.63184 curveto +23.77838 3.63184 23.6517 3.57933 23.55829 3.48592 curveto +23.46487 3.3925 23.41237 3.26582 23.41237 3.1337 curveto +23.41237 3.00157 23.46487 2.8749 23.55829 2.78148 curveto +23.6517 2.68806 23.77838 2.63556 23.9105 2.63556 curveto +24.04263 2.63556 24.16931 2.68806 24.26273 2.78148 curveto +24.35614 2.8749 24.40865 3.00157 24.40865 3.1337 curveto closepath fill +newpath 27.39752 3.15182 moveto +27.39752 3.28395 27.34502 3.41063 27.2516 3.50404 curveto +27.15819 3.59746 27.03151 3.64996 26.89938 3.64996 curveto +26.76726 3.64996 26.64058 3.59746 26.54716 3.50404 curveto +26.45375 3.41063 26.40125 3.28395 26.40125 3.15182 curveto +26.40125 3.0197 26.45375 2.89302 26.54716 2.7996 curveto +26.64058 2.70619 26.76726 2.65369 26.89938 2.65369 curveto +27.03151 2.65369 27.15819 2.70619 27.2516 2.7996 curveto +27.34502 2.89302 27.39752 3.0197 27.39752 3.15182 curveto closepath fill +newpath 30.3864 3.1699 moveto +30.3864 3.30203 30.3339 3.42871 30.24048 3.52213 curveto +30.14706 3.61554 30.02039 3.66805 29.88826 3.66805 curveto +29.75613 3.66805 29.62946 3.61554 29.53604 3.52213 curveto +29.44263 3.42871 29.39012 3.30203 29.39012 3.1699 curveto +29.39012 3.03778 29.44263 2.9111 29.53604 2.81769 curveto +29.62946 2.72427 29.75613 2.67177 29.88826 2.67177 curveto +30.02039 2.67177 30.14706 2.72427 30.24048 2.81769 curveto +30.3339 2.9111 30.3864 3.03778 30.3864 3.1699 curveto closepath fill +newpath 33.37477 3.18803 moveto +33.37477 3.32016 33.32227 3.44684 33.22885 3.54025 curveto +33.13544 3.63367 33.00876 3.68617 32.87663 3.68617 curveto +32.7445 3.68617 32.61783 3.63367 32.52441 3.54025 curveto +32.431 3.44684 32.3785 3.32016 32.3785 3.18803 curveto +32.3785 3.05591 32.431 2.92923 32.52441 2.83582 curveto +32.61783 2.7424 32.7445 2.6899 32.87663 2.6899 curveto +33.00876 2.6899 33.13544 2.7424 33.22885 2.83582 curveto +33.32227 2.92923 33.37477 3.05591 33.37477 3.18803 curveto closepath fill + 0 setgray 0 0.49814 dtransform truncate idtransform setlinewidth pop + [] 0 setdash 1 setlinecap 1 setlinejoin 10 setmiterlimit +newpath 0 2.98878 moveto +2.98888 3.00691 lineto +3.0082 -0.18108 lineto +6.81596 -0.158 7.27444 6.22098 5.21121 6.20848 curveto +3.14795 6.19598 3.68372 -0.17706 7.49153 -0.15393 curveto +11.29922 -0.1308 11.75749 6.24817 9.69423 6.23564 curveto +7.63097 6.22311 8.16666 -0.14981 11.97432 -0.12674 curveto +15.7821 -0.10367 16.24059 6.27533 14.17735 6.26283 curveto +12.11414 6.25034 12.64987 -0.12263 16.45766 -0.09956 curveto +20.26543 -0.07649 20.7239 6.30249 18.66068 6.29 curveto +16.59741 6.2775 17.13318 -0.09555 20.941 -0.07242 curveto +24.74869 -0.04929 25.20695 6.32968 23.14369 6.31715 curveto +21.08043 6.30463 21.61612 -0.0683 25.42378 -0.04523 curveto +29.23155 -0.02216 29.69003 6.35683 27.6268 6.34433 curveto +25.56357 6.33183 26.09929 -0.04115 29.90707 -0.01808 curveto +29.88776 3.1699 lineto +32.87663 3.18803 lineto stroke +showpage +%%EOF diff --git a/Master/texmf-dist/doc/generic/mfpic/data.dat b/Master/texmf-dist/doc/generic/mfpic/data.dat index 24db6380230..c93a1732c12 100644 --- a/Master/texmf-dist/doc/generic/mfpic/data.dat +++ b/Master/texmf-dist/doc/generic/mfpic/data.dat @@ -1,8 +1,8 @@ ### File: data.dat -### A part of mfpic 0.7a beta 2004/04/16 +### A part of mfpic 0.9 2006/05/26 ### # A file of data to plot a function curve -# (Sharp, not percent, must be comment character when this is read.) +# ("#", not "%", must be comment character when this is read.) # diff --git a/Master/texmf-dist/doc/generic/mfpic/forfun.tex b/Master/texmf-dist/doc/generic/mfpic/forfun.tex index 8f9279a8763..75dca0bd47f 100644 --- a/Master/texmf-dist/doc/generic/mfpic/forfun.tex +++ b/Master/texmf-dist/doc/generic/mfpic/forfun.tex @@ -1,94 +1,106 @@ %%% File: forfun.tex -%%% A part of mfpic 0.7a beta 2004/04/16 +%%% A part of mfpic 0.9 2006/05/26 %%% \nopagenumbers \input mfpic.tex \usemetapost \usetruebbox -\opengraphsfile{forfun} +\opengraphsfile{fun} \mfpicunit=1bp \noindent -\mfpic[1]{-1.25}{118.5}{-11.25}{40} - -% meta-ness: -\mfsrc{h:=25; % height of "m" - s:=10; % width of stems +\mfpic{-1.25}{118.5}{-11.25}{40} +% +% "meta"-ness: +% +\mfsrc{h:=25; % height of "m" These are graph units + s:=10; % width of stems } - +% % Calculate key points: -\mfsrc{% the "m" -z1=(0,0); -y1=y2=y5=y6=y9=y10; -x2-x1=x6-x5=x10-x9=s; -x6-x1=x10-x5=h; -z15-z1=z3-z2=z4-z5=z7-z6=z8-z9=z11-z10=(0,h/2); -y12=y1+h; x12=.5[x6,x9]; -y14=y12; x14=.5[x2,x5]; -z13= arcppp(z7,z14,z15) intersectionpoint arcppp(z11,z12,z4);} - -\mfsrc{% the "f" -z21=z10; % start "f" where the "m" ends -z22=z21+(s,0); -z23=z22+(0,h-s); -z24=z23+(3s/4,0); -z25=z24+(0,s); -z26=z23+(0,s); -z27=z26+(0,s/4); -z28=z27+(s/4,0)+ (s/4)*dir(30); -z29=z28+s*dir(30); -x30=x21; y30=y27;}% - -\mfsrc{% the "p" -x31=x24; -y31=y21; -z32=z31-(0,s); -z33=z32+(s,0); -z35=(x33,h/2); -z39=z31+(h,h)/2; %center of round part -z34=(z33--z35) intersectionpoint (fullcircle scaled h shifted z39); -z36=z39+(h/2,0); -z37=z31+(0,h/2);}% - -\mfsrc{% the "i" -z41=(x36,y31); -z42=z41+(s,0); -z43=z42+(0,h); -z44=z41+(0,h); -x45=0.5[x41,x42]; y45=y43 + s/2 +3/50;}% Center of dot - -\mfsrc{% the "c" -z51=z42; -z52=z51+(h,h)/2; %center -z53=z52+(h/2)*dir(15); -z54=z52-(h/2,0); -z55=z52+(h/2)*dir(-15); -z56=z52+(s/4)*dir(-15); -z57=z52-(s/4,0); -z58=z52+(s/4)*dir(15);}% - -\pen{2.5*\the\mfpicunit} - -% Calculate bounding box - +% +% "m" +% +\mfsrc{% + z1=(0,0); + y1=y2=y5=y6=y9=y10; + x2-x1=x6-x5=x10-x9=s; + x6-x1=x10-x5=h; + z15-z1=z3-z2=z4-z5=z7-z6=z8-z9=z11-z10=(0,h/2); + y12=y1+h; x12=.5[x6,x9]; + y14=y12; x14=.5[x2,x5]; + z13= arcppp(z7,z14,z15) intersectionpoint arcppp(z11,z12,z4);} +% +% "f" +% +\mfsrc{% + z21=z10; % start "f" at "m"'s end + z22=z21+(s,0); + z23=z22+(0,h-s); + z24=z23+(3s/4,0); + z25=z24+(0,s); + z26=z23+(0,s); + z27=z26+(0,s/4); + z28=z27+(s/4,0)+ (s/4)*dir(30); + z29=z28+s*dir(30); + x30=x21; y30=y27;}% +% +% "p" +% +\mfsrc{% + x31=x24; + y31=y21; + z32=z31-(0,s); + z33=z32+(s,0); + z35=(x33,h/2); + z39=z31+(h,h)/2; %center of round part + z34=(z33--z35) intersectionpoint (fullcircle scaled h shifted z39); + z36=z39+(h/2,0); + z37=z31+(0,h/2);}% +% +% "i" +% +\mfsrc{% + z41=(x36,y31); + z42=z41+(s,0); + z43=z42+(0,h); + z44=z41+(0,h); + x45=0.5[x41,x42]; y45=y43 + s/2 +3/50;}% Center of dot +% +% "c" +% \mfsrc{% + z51=z42; + z52=z51+(h,h)/2; %center + z53=z52+(h/2)*dir(15); + z54=z52-(h/2,0); + z55=z52+(h/2)*dir(-15); + z56=z52+(s/4)*dir(-15); + z57=z52-(s/4,0); + z58=z52+(s/4)*dir(15);}% +% +\penwd{2.5*\the\mfpicunit} +\mfsrc{% +% +% Calculate bounding box +% % Need to account for half the thickness of pen; % penwd is in absolute units so we need to convert. % This is a displacement, so use invvconv (not invzconv): -begingroup -save border,ll,ur; -pair border,ll,ur; border:= invvconv((penwd,penwd))/2; -ll=(0,y32)-border; -ur=(x55,y30+(x29-x30)/2)+border;} - -\gfill[yellow]\rect{ll,ur} - + begingroup + save border,ll,ur; + pair border,ll,ur; border:= invvconv((penwd,penwd))/2; + ll=(0,y32)-border; + ur=(x55,y27+5s/4)+border;} +% +\gfill[yellow]\rect{ll,ur} % background \mfsrc{endgroup;} - +% \fillcolor{blue} \drawcolor{green} - +% +% "m" \mftitle{m} \draw\gfill\lclosed \connect @@ -100,8 +112,8 @@ ur=(x55,y30+(x29-x30)/2)+border;} \arc[t]{z11,z12,z13} \arc[t]{z13,z14,z15} \endconnect - - +% +% "f" \mftitle{f} \draw\gfill\lclosed \connect @@ -110,28 +122,39 @@ ur=(x55,y30+(x29-x30)/2)+border;} \lines{z28,z29} \arc[s]{z29,z30,150} \endconnect - +% +% "p" \mftitle{p} \draw\gfill\lclosed \connect \lines{z31,z32,z33,z34} \arc[t]{z34,z36,z37} \endconnect - \draw\gfill[yellow]\circle{z39,(h/2-s)} - +% +% "i" \mftitle{i} -\draw\gfill\lclosed\lines{z41,z42,z43,z44} +\draw\gfill\polygon{z41,z42,z43,z44} \draw\gfill\circle{z45,s/2} - +% +% "c" \mftitle{c} \draw\gfill\lclosed \connect \arc[t]{z53,z54,z55} \arc[t]{z56,z57,z58} \endconnect - +% uncoment to exhibit the points +%\pointsize2bp +%\pointfillfalse +%\penwd{.2pt} +%\point{z1,z2,z3,z4,z5,z6,z7,z8,z9,z10,z11,z12,z13,z14} +%\point{z21,z22,z23,z24,z25,z26,z27,z28,z29,z30} +%\point{z31,z32,z33,z34,z35,z36,z37} +%\point{z41,z42,z43,z44,z45} +%\point{z51,z52,z53,z54,z55,z56,z57,z58} +% done \endmfpic -\closegraphsfile%{forfun} +\closegraphsfile % {fun} \bye diff --git a/Master/texmf-dist/doc/generic/mfpic/install.txt b/Master/texmf-dist/doc/generic/mfpic/install.txt index 9e881942298..c20b18c76e2 100644 --- a/Master/texmf-dist/doc/generic/mfpic/install.txt +++ b/Master/texmf-dist/doc/generic/mfpic/install.txt @@ -1,9 +1,9 @@ -%%% File: instruct.txt -%%% A part of mfpic 0.7a beta 2004/04/16 +%%% File: install.txt +%%% A part of mfpic 0.9 2006/05/26 %%% -This is an alpha-test version of mfpic. See README.txt for a list of -files and a brief description of each. +This is version 0.9 of mfpic. See README.txt for a list of files and a +brief description of each. Generating and installing the files ----------------------------------- @@ -20,13 +20,14 @@ Generating and installing the files -- If you have an older version of mfpic, remove the old files with the same names as the above five from your TeX directories, or ensure that the following procedure overwrites them (back them up somewhere - else first if you wish). + else first if you wish). Do the same for mfppatch.tex. --- Copy mfpic.tex (and mfppatch.tex, if it exists) where TeX or LaTeX - will find it, and mfpic.sty where LaTeX will find it. On any TDS - compliant system (such as teTeX, fpTeX, TeXLive, or MiKTeX) they can - both be put in $TEXMF/tex/generic/mfpic/ (where $TEXMF indicates a - directory serving as a root of a texmf tree). +-- Copy mfpic.tex and mfppatch.tex where TeX and LaTeX will find it, and + mfpic.sty where LaTeX will find it. On any TDS compliant system (such + as teTeX, fpTeX, TeXLive, or MiKTeX) they can all be put in + $TEXMF/tex/generic/mfpic/ + (where $TEXMF indicates a directory serving as a root of a texmf + tree). -- Copy grafbase.mp and dvipsnam.mp where MetaPost will find them, for example $TEXMF/metapost/mfpic/ . @@ -34,13 +35,24 @@ Generating and installing the files -- Copy grafbase.mf where Metafont will find it. For example, $TEXMF/metafont/mfpic/ . --- Copy mfpguide.pdf and mfpman.pdf where documentation is kept. For - example, $TEXMF/doc/generic/mfpic/ . Optionally, copy src/*.* to the - LaTeX input path, and examples/*.* to either the same place or the - documentation area. +-- Copy mfpguide.pdf, mfpman.pdf. mfpcard.pdf where documentation is + kept. For example, $TEXMF/doc/generic/mfpic/ . Optionally, copy + src/*.* and examples/*.* either to the documentation area or to + the same place as mfpic.tex. Also optional: copy the two .dtx files + and mfpic.ins to the source area ($TEXMF/source/generic/mfpic/). --- If required by your TeX system (MiKTeX, teTeX, fpTeX, TeXLive - DO require it): UPDATE THE TeX FILENAME DATABASE ! +-- Some distributions might have a copy of the file grafbase.mf in the + directory $TEXMF/fonts/public/mfpic. If so, delete it or replace it + with a copy of the new one. If some package needs that particular + version, put it someplace where mf and mpost will _not_ find it and + arrange for that package to find it when necessary. + +-- If required by your TeX system (MiKTeX, teTeX, fpTeX, XemTeX, and + TeXLive all DO require it): + + ************************************* + * UPDATE THE TeX FILENAME DATABASE! * + ************************************* There is one optional step that may be useful (if you only wish to use mfpic to produce MetaPost pictures, you may skip this): find the file @@ -56,60 +68,69 @@ change, regenerate the mf.base file (fmtutil on teTeX, fpTeX or TeXLive; MiKTeX Options in MiKTeX). On some systems this may be named plain.base. Read mfpguide.pdf before trying anything further. If you are already -familiar with mfpic, version 0.2.10.9 or later, you can probably get +familiar with mfpic (version 0.2.10.9 or later) you can probably get going right away. If you want to read the documented source code for mfpic, run latex on mfpic.dtx and grafbase.dtx (Peter Wilson's docmfp.sty is required for grafbase.dtx) 2 or 3 times each. Then run makeindex for each: - makeindex -s gind.ist -o mfpic.ind mfpic.idx + makeindex -s gind.ist -o mfpic.ind mfpic.idx makeindex -s gind.ist -o grafbase.ind grafbase.idx and then latex again (once each). The docmfp package can be found at your favorite CTAN mirror. A copy of docmfp.sty is also on my web page -(see README.txt). +(see README). (Some TeX distributions (e.g., TeXLive) contain a rogue +copy of ltxdoc.cfg in the TeX input path (e.g., tex/latex/subfig), which +can mess up the indexes of these documents. Move it from the texinputs +area to the documentation area of your system. ------------------------------------------------------------------------ If you desire to remake the mfpic manual (and why in the world would you be wanting to do a daft thing like that?), make sure mfpman.tex and mfpdoc.sty are in the current directory or where LaTeX can find them. -Edit, if you like, the paper size option in the \documentclass command -in mfpman.tex. Make sure mfpdoc.sty is where LaTeX will find it. Then -run pdflatex two (2) times: +Make sure that coil.mps is also where LaTeX can find it. Edit, if you +like, the paper size option in the \documentclass command in mfpman.tex. +Make sure mfpdoc.sty is where LaTeX will find it. (The document uses +Times for the main font family, LuxiMono for a typewriter font, and CMSS +for a sans serif font. Packages mathptmx amd luximono are required.) +Then run pdflatex three times: - pdflatex mfpman - pdflatex mfpman + pdflatex mfpman (Hundreds of undefined labels messages) + pdflatex mfpman (Labels have changed message) + pdflatex mfpman (All resolved) -then run makeindex: +Now page numbers should be correct in the index, so run makeindex: - makeindex mfpman + makeindex -o mfpman.ind mfpman.idx -then run latex two (2) more times +(or just "makeindex mfpman" on many systems) then run latex two more +times: - pdflatex mfpman - pdflatex mfpman + pdflatex mfpman (mfpman.toc now has index added) + pdflatex mfpman (Document toc now correct) -The last run is required to get the index into the table of contents. You can use latex instead of pdflatex, but you won't get clickable links -in the result. (I was too lazy to work out the kinks.) +in the result. (I was too lazy to make that work.) You could do something similar for mfpguide.tex (but that, too, would be daft): - pdflatex mfpguide - mpost guide.mp - pdflatex mfpguide - pdflatex mfpguide + + pdflatex mfpguide (produces guide.mp) + mpost guide.mp (creates guide.1, guide.2, etc.) + pdflatex mfpguide (includes figures, which changes pagination) + pdflatex mfpguide (All resolved) This relies on mfpic so you should probably wait to do that until after you are accustomed to that process. (And then take a cold shower until this compulsion passes.) And finally, if you forgot: - **************************************** - * ! UPDATE THE TeX FILENAME DATABASE ! * - **************************************** + + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! UPDATE THE TeX FILENAME DATABASE !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -- Dan Luecking (luecking at uark dot edu) diff --git a/Master/texmf-dist/doc/generic/mfpic/lapictures.tex b/Master/texmf-dist/doc/generic/mfpic/lapictures.tex index 52a9f060d9e..ec637dccaeb 100644 --- a/Master/texmf-dist/doc/generic/mfpic/lapictures.tex +++ b/Master/texmf-dist/doc/generic/mfpic/lapictures.tex @@ -1,5 +1,5 @@ %%% File: lapictures.tex -%%% A part of mfpic 0.7a beta 2004/04/16 +%%% A part of mfpic 0.9 2006/05/26 %%% % Magnify to same scale as pictures.tex : % (Use of \mag is against the law of LaTeX, but Bugs Bunny set a precedent.) @@ -22,8 +22,8 @@ \setlength{\evensidemargin}{\oddsidemargin} \setlength{\footskip}{\baselineskip} -% Add the metapost option if you prefer. -\usepackage{mfpic} +% Use the metafont option if you prefer. +\usepackage[metapost,raggedcaptions]{mfpic} \ifx\pdfoutput\UndEfInEd \else @@ -36,7 +36,7 @@ \setlength{\mfpframesep}{0pt} \headshape{1}{1}{true} \newcommand{\vs}{\bigskip\filbreak} -\renewcommand\raggedright{\rightskip 0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax} +%\renewcommand\raggedright{\rightskip 0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax} \begin{document} \mftitle{Commutative Diagram example.} @@ -44,15 +44,20 @@ % |\ /| % | C-F | % |/ \| -% B- - -E +% B.....E \noindent \begin{mfpframe} \begin{mfpic}[12]{0}{10}{0}{10} \tlabeljustify{cc} -\tcaption[2.0,1.0]{\raggedright{\it Figure 1:} Commutative diagram example.} -\tlabels{(1,9){A} (1,1){B} (3,5){C} (9,9){D} (9,1){E} (7,5){F}} -\setrender{\draw\arrow\trimpath{6pt}} +\tcaption[2.0,1.0]{{\it Figure 1:} Commutative diagram example.} +\tlabels{(1,9){A} + (1,1){B} + (3,5){C} + (9,9){D} + (9,1){E} + (7,5){F}} +\setrender{\arrow\draw\trimpath{6pt}} \lines{(1,9), (1,1)} % A -> B. \lines{(1,9), (3,5)} % A -> C. \lines{(3,5), (1,1)} % C -> B. @@ -63,7 +68,7 @@ \lines{(3,5), (7,5)} % C -> F. % B- - ->E : %\dotted\arrow[r90][b-12pt]\arrow[b15pt]\reverse\arrow\lines{(1.5,1), (8.5,1)} -\dotted\arrow\arrow[b10pt]\reverse\arrow\trimpath{6pt}\lines{(1,1), (9,1)} +\arrow\arrow[b10pt]\reverse\arrow\dotted\trimpath{6pt}\lines{(1,1), (9,1)} \end{mfpic} \end{mfpframe} @@ -76,7 +81,7 @@ \begin{mfpic}[20]{-3}{3}{-3}{3} \axes \function{-2,2,0.1}{((x**3)-x)/3} -\tcaption{\raggedright{\it Figure 2:} Function Plot with Cartesian Axes.} +\tcaption{{\it Figure 2:} Function Plot with Cartesian Axes.} \end{mfpic} \end{mfpframe} @@ -89,7 +94,7 @@ \begin{mfpic}[30]{-1.5}{1.5}{-1}{1} \parafcn{0,6,0.1}{cosd(150t)*dir(90t)} \gfill\circle{(0,0),0.25} -\tcaption{\raggedright{\it Figure 3:} Parametric Function Plot, and Filled Circle.} +\tcaption{{\it Figure 3:} Parametric Function Plot, and Filled Circle.} \end{mfpic} \end{mfpframe} @@ -105,7 +110,7 @@ \darkershade \shade\draw\rect{(1,0),(2,1)} \hatch\draw\rect{(2,0),(3,2)} -\tcaption{\raggedright{\it Figure 4:} Bar Graph.} +\tcaption{{\it Figure 4:} Bar Graph.} \end{mfpic} \end{mfpframe} @@ -120,7 +125,7 @@ \shade\sector{(0,0), 1, 60,105} \turtle{(0,0), \plr{(1,105)}} \sector{(0,0), 1, 60,360} -\tcaption{\raggedright{\it Figure 5:} Pie Chart.} +\tcaption{{\it Figure 5:} Pie Chart.} \end{mfpic} \end{mfpframe} @@ -134,7 +139,7 @@ \begin{mfpframe} \begin{mfpic}[20]{-2}{2}{-1}{1} \arrow\circle{(0,0),1} -\tcaption{\raggedright{\it Figure 6:} Circle with Arrow.} +\tcaption{{\it Figure 6:} Circle with Arrow.} \end{mfpic} \end{mfpframe} @@ -153,7 +158,7 @@ \lines{(-1,1), (-1,-1), (1,-1.5)} \point{(0,0)} \dotted\reverse\lines{(-2,2), (-2,-2), (2,-3)} -\tcaption{\rightskip= 0pt plus 3em {\it Figure 7:} Use of hatch, draw, lclosed, connect, +\tcaption{{\it Figure 7:} Use of hatch, draw, lclosed, connect, curve, point, lines, dotted, reverse.} \end{mfpic} \end{mfpframe} @@ -165,13 +170,13 @@ \noindent \begin{mfpframe} \begin{mfpic}[40]{-1}{1}{-1}{1} % Was `[20]'. -\tcaption{\raggedright{\it Figure 8:} Simpler variant of the previous figure.} +\tcaption{{\it Figure 8:} Simpler variant of the previous figure.} \hatch\draw\lclosed\connect \curve{(1,0), (0.5,0.25), (0.5,0.5), (0,0.75)} \point{(0,0)} \endconnect \reverse\lines{(-0.5,0.5), (-0.5,-0.5), (0.5,-0.75)} -\tcaption{\raggedright{\it Figure 8:} Simpler variant of the previous figure.} +\tcaption{{\it Figure 8:} Simpler variant of the previous figure.} \end{mfpic} \end{mfpframe} @@ -179,6 +184,7 @@ \mftitle{Graph of data from file.} +\noindent \begin{mfpframe} \begin{mfpic}[6]{-10}{10}{-2}{12} \makepercentother @@ -187,6 +193,7 @@ \mfpdatacomment\# \fcncurve\datafile{data.dat} \axes +\tcaption{{\it Figure 9:} Example of a graph drawn from data in a file} \end{mfpic} \end{mfpframe} diff --git a/Master/texmf-dist/doc/generic/mfpic/mfpcard.pdf b/Master/texmf-dist/doc/generic/mfpic/mfpcard.pdf Binary files differnew file mode 100644 index 00000000000..b645f027e42 --- /dev/null +++ b/Master/texmf-dist/doc/generic/mfpic/mfpcard.pdf diff --git a/Master/texmf-dist/doc/generic/mfpic/mfpcard.tex b/Master/texmf-dist/doc/generic/mfpic/mfpcard.tex new file mode 100644 index 00000000000..3f1a16a9a39 --- /dev/null +++ b/Master/texmf-dist/doc/generic/mfpic/mfpcard.tex @@ -0,0 +1,650 @@ +%%% File: mfpcard.tex +%%% A part of mfpic 0.9 2006/05/26 +%%% +% (Ask your driver to print so that longer dimension is horizontal.) +\newdimen\paperlongside + \paperlongside 11 truein +\newdimen\papershortside + \papershortside 8.5 truein + +\ifx\pdfoutput\undefined +\else\ifx\pdfoutput\relax +\else\ifnum\pdfoutput>0 + \pdfpagewidth\paperlongside + \pdfpageheight\papershortside +\fi\fi\fi + +\font\manual=cmcsc8 +\def\MF{{\manual meta}\-{\manual font}} +\def\MP{{\manual meta}\-{\manual post}} +\def\TeX{{\rm T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\null}} +\def\plainTeX{{\rm plain\kern -.15em\TeX}} +\def\LaTeX{{\rm L\raise.42ex\hbox{\kern-.36em \manual a}\kern-.15em\TeX}} +%\def\LaTeXe{\LaTeX$2_{\textstyle\varepsilon}$} +\def\gobble#1{} +\def\bsl{{\tt\char\escapechar}} + +\def\cs#1{{\tt\char`\\#1}} +\def\marg#1{{\tt\char`\{#1\char`\}}} +\def\oarg#1{{\tt[#1]}} +\def\parg#1{{\tt(#1)}} + +% logical markup to typeset filenames, program names, MF code, +% grafbase identifiers, environment names, email addresses, and +% emphasis. +\def\file#1{{\tt #1}} +\def\prog#1{{\sf #1}} % didn't want everything in \tt +\def\mfc#1{{\tt #1}} +\def\opt#1{{\tt #1}} % LaTeX2e option names +\def\gbc#1{{\tt #1}} +\def\env#1{{\tt #1}} +\def\mail#1{{\tt #1}} +\def\emph#1{{\it #1\/}} + +% Forced, Clean, Linebreak. + +\def\brk{\nobreak\hfil\break} + +\newcount\columnsperpage + +% Entries are too wide for 3 columns. Print 2 columns landscape +\columnsperpage=2 + +% The rest of this header is nicked from gnuplot (which took it from +% Emacs) but was drastically adapted for mfpic. +% +% This file is intended to be processed by plainTeX. +% +% You will need to inform your dvi driver to print it in landscape +% and, optionally, double sided. +% Author of GNU Emacs Refcard: +% Stephen Gildea +% UUCP: mit-erl!gildea +% Internet: gildea@erl.mit.edu +% +% Person who ripped off the formatter for gnuplot: +% Alex Woo +% NASA Ames Research Center +% Internet: woo@ames.arc.nasa.gov +% +% Modified on 9 Dec 1992 by: +% Daniel S. Lewart +% University of Illinois +% Internet: d-lewart@uiuc.edu +% +% Modified on 29 Sep 1999, 11 Jul 2002, 29 Sep 2003 (for mfpic) by: +% Daniel H. Luecking +% University of Arkansas +% luecking@uark.edu + +\newdimen\intercolumnskip +\newbox\columna +\newbox\columnb + +\hsize4.75truein +\vsize 7.25truein + +% Equal left right, right and middle margins, about .5in on USletter +\intercolumnskip=\paperlongside +\advance\intercolumnskip -2\hsize +\intercolumnskip .33333\intercolumnskip +\hoffset\intercolumnskip +\advance\hoffset -1truein + +% Equal top and bottom margins, about .4in on A4 paper +\voffset\papershortside +\advance\voffset-\vsize +\voffset .5\voffset +\advance\voffset -1truein + +\topskip8truept + +\font\manual=cmcsc10 at 8pt +\font\titlefont=cmbx10 scaled \magstep1 +\font\headingfont=cmbx10 +\font\smallfont=cmr6 +\font\smallsy=cmsy6 +\font\eighti=cmmi8 +\font\sixi=cmmi6 +\font\eightex=cmex10 at 8pt +\font\eightrm=cmr8 +\font\eightbf=cmbx8 +\let\subheadingfont\eightbf +\font\sixbf=cmbx6 +\font\eightit=cmti8 +\font\eighttt=cmtt8 +\font\eightsy=cmsy8 +\font\sixsy=cmsy6 +\font\eightsf=cmss10 at 8pt +\font\eightsl=cmsl8 +\font\tensf=cmss10 +\textfont0=\eightrm \scriptfont0=\smallfont +\textfont1=\eighti \scriptfont1=\sixi +\textfont2=\eightsy \scriptfont2=\sixsy +\textfont3=\eightex \scriptfont3=\eightex \scriptscriptfont3=\eightex +\textfont\bffam\eightbf \scriptfont\bffam\sixbf +\def\rm{\fam0\eightrm} +\def\bf{\fam\bffam\eightbf} +\def\it{\eightit} +\def\tt{\eighttt} +\def\sf{\eightsf} +\def\sl{\eightsl} +\smallskipamount 2pt plus 1pt minus 0pt +\medskipamount 5pt plus 2pt minus 2pt +\bigskipamount 10pt plus 3pt minus 3pt +\normalbaselineskip=10pt +\normalbaselines +\rm +\setbox\strutbox=\hbox{\vrule height6.8pt depth3.2pt width0pt} + +\def\abc{a} +\output={% + \if b\abc \multicolumnformat \global\def\abc{a} + \else\if a\abc + \global\setbox\columna\columnbox \global\def\abc{b} + \global\setbox\columnb\hbox to -\intercolumnskip{} + \fi\fi} +\def\multicolumnformat{\shipout\vbox{% + \hbox{\box\columna\hskip\intercolumnskip + \box\columnb\hskip\intercolumnskip\columnbox}}\advancepageno} +\def\columnbox{\leftline{\pagebody}} + +\def\bye{\par\vfill\supereject + \if a\abc \else\null\vfill\eject\fi + \if a\abc \else\null\vfill\eject\fi + \end} + +% Typewriter type braces (redefinitions of escaped braces) : +\def\{{{\tt \char`\{}} +\def\}{{\tt\char`\}}} + + +\parindent 0pt + +\def\title#1{{\titlefont\centerline{#1}}\vskip 1ex plus .5ex} + +\def\section#1{\par + \penalty-100 + \vskip 2.25ex plus 2ex minus 2ex {\headingfont #1}% + \par \nobreak + \vskip 1.25ex plus 1ex minus 1.5ex} + +\def\subsection#1{\par + \ifdim\lastskip<1.5ex + \vskip -\lastskip + \vskip 1.5ex plus 1ex minus 1ex + \fi + {\subheadingfont #1}% + \par \nobreak + \vskip .75ex plus .5ex minus .5ex} + +\newdimen\describeindent +\describeindent=0em + +\def\meta#1{$\langle\hbox{\it #1\/}\rangle$} +\def\alt{\unskip$\;|\;$\hfilbreak} +\def\hfilbreak{\hfil\allowbreak\hfilneg} + +\newdimen\secondkeyindent + +\def\describe#1#2{\leavevmode\vtop + {\hsize=\firstkeyfrac\hsize\rightskip=1em plus 1 fill\relax + \secondkeyindent\describeindent \advance\secondkeyindent 1em + \hangindent\secondkeyindent \hangafter1 + \hskip\describeindent\relax\strut#1\nobreak\hskip0pt\strut}% + \vtop + {\hsize=\secondkeyfrac\hsize\rightskip=0pt plus 1 fill\relax + \leavevmode\strut#2\unskip\strut}\par} +\def\code#1{{\sf #1}} + +\title{MFPIC Quick Reference} + +\centerline{(Copyright 2000--2006 by Daniel Luecking)} +\medskip +This information was prepared for version 0.9 of \prog{mfpic}. + +\section{Preamble commands} + +\def\firstkeyfrac{.4} +\def\secondkeyfrac{.6} + +\describe{Load \prog{mfpic} package (\LaTeX)} + {\cs{usepackage}\oarg{\meta{options}}\marg{mfpic}} +\describe{Options}{\opt{metafont} \alt \opt{metapost}, \opt{mplabels}, + \opt{overlaylabels}, \opt{centeredcaptions}, + \opt{raggedcaptions}, \opt{clip}, \opt{truebbox}, \opt{draft}, + \opt{final}, \opt{nowrite}, \opt{mfpreadlog}} +\describe{Load \prog{mfpic}; activate options (\plainTeX)} + {\cs{input} \file{mfpic}. \cs{usemetafont} \alt + \cs{usemetapost}, \cs{usemplabels}, \cs{overlaylabels} + \cs{usecenteredcaptions}, \cs{useraggedcaptions}, + \cs{clipmfpic}, \cs{usetruebbox}, \cs{mfpicdraft}, + \cs{mfpicfinal}, \cs{mfpicnowrite}, \cs{mfpreadlog}} +\describe{Turn off some options} + {\cs{nomplabels}, \cs{nooverlaylabels}, + \cs{nocenteredcaptions}, \cs{noraggedcaptions}, \cs{noclipmfpic}, + \cs{notruebbox}} +\describe{Set up/close the output file} + {\cs{opengraphsfile}\marg{\meta{base name}}$\ldots$\cs{closegraphsfile}} + +\section{The {\tensf mfpic} environment} + +\def\firstkeyfrac{.30} +\def\secondkeyfrac{.70} + +\describe{Start an \prog{mfpic} figure} + {\cs{mfpic}\oarg{\meta{xscale}}\oarg{\meta{yscale}}% + \marg{\meta{$x_{\min}$}}\allowbreak\marg{\meta{$x_{max}$}}\allowbreak + \marg{\meta{$y_{min}$}}\allowbreak\marg{\meta{$y_{max}$}}\brk + \null\quad\meta{mfpic commands}\brk + \cs{endmfpic}} +\describe{\quad\LaTeX{} (optional)} + {\cs{begin}\marg{mfpic}${}\equiv{}$\cs{mfpic}, + \cs{end}\marg{mfpic}${}\equiv{}$\cs{endmfpic}} + + +\section{Dimensions (lengths)} + +\def\firstkeyfrac{.58} +\def\secondkeyfrac{.42} + +\describe{\sl Purpose; where used:} {\sl Name and default value:} +\vskip1pt +\describe{Unit of length; \cs{mfpic}} {\cs{mfpicunit}, \tt 1pt} +\describe{Size of a symbol; \cs{point}, \cs{plot}, and \cs{plotsymbol}} + {\cs{pointsize}, \tt 2pt} +\describe{Darkness of shading; \cs{shade}} {\cs{shadespace}, \tt 1pt } +\describe{Space between dots; \cs{polkadot}} + {\cs{polkadotspace}, \tt 10pt} +\describe{Space between hatch lines; hatching macros} + {\cs{hatchspace}, \tt 3pt} +\describe{Size of arrowhead; \cs{arrow}} {\cs{headlen}, \tt 3pt} +\describe{Size of x-, y-axis arrowhead; xy-axes macros} + {\cs{axisheadlen}, \tt 5pt} +\describe{Size of border axis arrowhead; side axis macros} + {\cs{sideheadlen}, \tt 0pt} +\describe{Size of marks on axes; axis marks} {\cs{hashlen}, \tt 4pt} +\describe{Size of dashes; \cs{dashed}} {\cs{dashlen}, \tt 4pt} +\describe{Space between dashes; \cs{dashed}} {\cs{dashspace}, \tt 4pt} +\describe{Size of dots; \cs{dotted}} {\cs{dotsize}, \tt 0.5pt} +\describe{Space between dots; \cs{dotted}} {\cs{dotspace}, 3pt} +\describe{Space between symbols; \cs{plot}} {\cs{symbolspace}, \tt 5pt} + +\medskip +The following commands are used to change the size of some dimension +parameters: + +\smallskip +\describe{{\sl Purpose} ({\sl default\/}):} {\sl Command:} +\vskip1pt +\describe{Set diameter of drawing pen ({\tt 0.5pt})} + {\cs{penwd}\marg{\meta{dimen}}} +\describe{Set diameter of shading dots ({\tt 0.5pt})} + {\cs{shadewd}\marg{\meta{dimen}}} +\describe{Set diameter of polkadot ({\tt 5pt})} + {\cs{polkadotwd}\marg{\meta{dimen}}} +\describe{Set diameter of hatching pen ({\tt 0.5pt})} + {\cs{hatchwd}\marg{\meta{dimen}}} +\describe{Multiply \cs{shadespace} by 1.2} {\cs{lightershade}} +\describe{Divide \cs{shadespace} by 1.2} {\cs{darkershade}} + +%\vfil\eject +\section{Colors} + +\def\firstkeyfrac{.45} +\def\secondkeyfrac{.55} + +\smallskip +\describe{Set color for curves} {\cs{drawcolor}\marg{\meta{color}}} +\describe{Set color for fills} {\cs{fillcolor}\marg{\meta{color}}} +\describe{Set color for points, symbols} {\cs{pointcolor}\marg{\meta{color}}} +\describe{Set color for hatching} {\cs{hatchcolor}\marg{\meta{color}}} +\describe{Set color for arrowheads} {\cs{headcolor}\marg{\meta{color}}} +\describe{Set color for tlabels} {\cs{tlabelcolor}\marg{\meta{color}}} +\describe{Set color used by \cs{gclear}} {\cs{backgroundcolor}\marg{\meta{color}}} +\describe{\quad \LaTeX{} syntax} + {\cs{drawcolor}\oarg{\meta{model}}\marg{\meta{clrspec}}, etc.} +\describe{Define a color name} {\cs{mfpdefinecolor}\marg{\meta{name}}\marg{\meta{model}}\marg{\meta{clrspec}}} + + +\section{Common geometric figures} + +Drawing commands that operate on a variable length list in braces may +be followed by \cs{datafile}\marg{\meta{filename}} instead of the list. + +\subsection{Points} + +\def\firstkeyfrac{.42} +\def\secondkeyfrac{.58} + +\describe{Place a symbol at given point(s)} + {\cs{plotsymbol}\oarg{\meta{size}}\marg{\meta{name}}% + \marg{($x_0,y_0$),($x_1,y_1$),$\ldots$}} +\describe{\quad Available symbol names} {{\tt Triangle}, {\tt Square}, {\tt Circle}, {\tt + Diamond}, {\tt Star}, {\tt SolidTriangle}, {\tt SolidSquare}, {\tt SolidCircle}, + {\tt SolidDiamond}, \tt{SolidStar}, {\tt Plus}, {\tt Cross}, + {\tt Asterisk}} +\describe{Points (filled or unfilled circles)} + {\cs{point}\oarg{\meta{size}}\marg{($x_0,y_0$),($x_1,y_1$),$\ldots$}} +\describe{Force filled/open circles in \cs{point}:} + {\cs{pointfilltrue}/\cs{pointfillfalse}} + +\subsection{Lines} + +\def\firstkeyfrac{.45} +\def\secondkeyfrac{.55} + +\describe{Connect points with lines} + {\cs{polyline}\marg{($x_0,y_0$),($x_1,y_1$),$\ldots$}, + or (\cs{lines})} +\describe{Closed polygon} + {\cs{polygon}\marg{($x_0,y_0$),($x_1,y_1$),$\ldots$}} +\describe{Concatenate vectors} + {\cs{turtle}\marg{\meta{initialpoint},\meta{$v_1$},\meta{$v_2$},$\ldots$}} +\describe{Rectangle (upright) with given corners} + {\cs{rect}\marg{($x_0,y_0$),($x_1,y_1$)}} + +\subsection{Circles, arcs and ellipses} + +\def\firstkeyfrac{.55} +\def\secondkeyfrac{.45} + +\describe{Circles} {} +\describe{\qquad polar form (default):} + {\cs{circle}\oarg{p}\marg{\meta{center},\meta{radius}}} +\describe{\qquad three-point form:} + {\cs{circle}\oarg{t}\marg{($x_0,y_0$),($x_1,y_1$),($x_2,y_2$)}} +\describe{\qquad center-point form:} + {\cs{circle}\oarg{c}\marg{\meta{center},\meta{point}}} +\describe{\qquad point-sweep form:} + {\cs{circle}\oarg{s}\marg{($x_0,y_0$),($x_1,y_1$),\meta{angle}}} +\describe{Arcs} {} +\describe{\qquad polar form:} + {\cs{arc}\oarg{p}\marg{\meta{center},\meta{$\theta_1$},\meta{$\theta_2$},% + \meta{radius}}} +\describe{\qquad three-point form:} + {\cs{arc}\oarg{t}\marg{($x_0,y_0$),($x_1,y_1$),($x_2,y_2$)}} +\describe{\qquad center-point-angle form:} + {\cs{arc}\oarg{c}\marg{\meta{center},\meta{point},\meta{angle}}} +\describe{\qquad point-sweep form (default):} + {\cs{arc}\oarg{s}\marg{($x_0,y_0$),($x_1,y_1$),\meta{angle}}} +\describe{Ellipse, center $(x_0,y_0)$, radii \meta{$r_x$}, \meta{$r_y$}, angle +\meta{$\theta$}} + {\cs{ellipse}\oarg{\meta{$\theta$}}% + \tt\{($x_0,y_0$),\meta{$r_x$},\meta{$r_y$}\}} + +\section{General curves} + +\def\firstkeyfrac{.45} +\def\secondkeyfrac{.55} + +A \meta{spec} can be {\tt p} (for polyline) or {\tt s} (for smooth) +followed by a number for the tension. + +\smallskip +\describe{Smooth curve through points} + {\cs{curve}\oarg{\meta{tension}}\marg{($x_0,y_0$),($x_1,y_1$),$\ldots$}} +\describe{Graph of $y=f(x)$} + {\cs{function}\oarg{\meta{spec}}\marg{$x_{\min}$,$x_{\max}$,% + $\Delta x$}\marg{$f(\hbox{\tt x})$}} +\describe{Graph of parametric curve $(x(t),y(t))$} + {\cs{parafcn}\oarg{\meta{spec}}\marg{$t_{\min}$,$t_{\max}$,$\Delta t$}% + \marg{($x(\hbox{\tt t})$, $y(\hbox{\tt t})$)}} +\describe{Graph of $r = f(\theta)$} + {\cs{plrfcn}\oarg{\meta{spec}}% + \marg{$\theta_{\min}$,$\theta_{\max}$,$\Delta\theta$}\marg{$f(\hbox{\tt t})$}} +\describe{Interpolate with a smooth {\it function}} + {\cs{fcncurve}\oarg{\meta{tension}}\marg{($x_0,y_0$),($x_1,y_1$),$\ldots$}} +\describe{Curve from data in a file} + {\cs{datafile}\oarg{\meta{spec}}\marg{\meta{file}}} +\describe{\quad Set how \cs{datafile} processes a line} + {\cs{using}\marg{\meta{read\_pattern}}\marg{\meta{write\_pattern}}\brk + Default is \cs{using}\marg{\#1 \#2 \#3}\marg{(\#1,\#2)}} + + +\section{Regions} + +\def\firstkeyfrac{.45} +\def\secondkeyfrac{.55} + +Curves are not necessarily `closed' even if the start and end are the +same. The following are closed (may be filled), as are \cs{rect}, +\cs{polygon}, \cs{circle}, and \cs{ellipse}. + +\smallskip +\describe{Closed curve through given points} + {\cs{cyclic}\oarg{\meta{tension}}\marg{$(x_1,y_1),(x_2,y_2),\ldots$}} +\describe{Circular sector (pie slice)} + {\cs{sector}\marg{\meta{center},\meta{radius},\meta{$\theta_1$},% + \meta{$\theta_2$}}} +\describe{Region between two functions} + {\cs{btwnfcn}\oarg{\meta{spec}}\marg{$x_{\min}$,% + $x_{\max}$,$\Delta x$}\marg{$f(\hbox{\tt x})$}\marg{$g(\hbox{\tt x})$}} +\describe{Region in polar coordinates} + {\cs{plrregion}\oarg{\meta{spec}}\marg{$\theta_{\min}$,$\theta_{\max}$,% + $\Delta \theta$}\marg{$f(\hbox{\tt t})$}} +\describe{Curves surrounding text} + {\cs{tlabelrect}\oarg{\meta{radius}}\parg{\meta{x},\meta{y}}\marg{\meta{text}}\brk + \cs{tlabeloval}\oarg{\meta{mult}}\parg{\meta{x},\meta{y}}\marg{\meta{text}}\brk + \cs{tlabelellipse}\oarg{\meta{ratio}}\parg{\meta{x},\meta{y}}\marg{\meta{text}}\brk + \meta{radius}: round corners. \meta{mult}: stretch horizontally. + \meta{ratio}: width/height of ellipse} + + +\section{Prefix macros} + +\subsection{Drawing curves} + +\def\firstkeyfrac{.4} +\def\secondkeyfrac{.6} + +\describe{Dashed path}{\cs{dashed}\oarg{\meta{length},\meta{gap}}$\ldots$} +\describe{Dotted path}{\cs{dotted}\oarg{\meta{size},\meta{gap}}$\ldots$} +\describe{Trace a path with symbols} + {\cs{plot}\oarg{\meta{size},\meta{gap}}\marg{\meta{symbol}}$\ldots$} +\describe{Generalized dashes}{\cs{gendashed}\marg{\meta{patname}}$\ldots$} +\describe{\quad Define a named dash pattern} + {\cs{dashpattern}\marg{\meta{patname}}\marg{\meta{len$_1$},\meta{len$_2$},$\ldots$,% + \meta{len$_{2n}$}}} +\describe{Place a symbol at all nodes} + {\cs{plotnodes}\oarg{\meta{size}}\marg{\meta{symbol}}$\ldots$} +\describe{Solid curve}{\cs{draw}\oarg{\meta{color}}$\ldots$} + + +\subsection{Closing a curve} + +\def\firstkeyfrac{.45} +\def\secondkeyfrac{.55} + +These turn any path into a `closed' path (result may be filled). + +\smallskip +\describe{Close with a straight line,}{\cs{lclosed}$\ldots$} +\describe{Close with a smooth join, like \cs{cycle},}{\cs{sclosed}$\ldots$} +\describe{Close letting \MF{} choose}{\cs{bclosed}$\ldots$} + +\subsection{Filling closed curves} + +\def\firstkeyfrac{.4} +\def\secondkeyfrac{.6} + +These filling prefixes turn off drawing of the curve. + +\smallskip +\describe{Solid fill} {\cs{gfill}\oarg{\meta{color}}$\ldots$} +\describe{Unfill} {\cs{gclear}$\ldots$} +\describe{Hatched fills} + {\cs{thatch}\oarg{\meta{space},\meta{angle}}\oarg{\meta{color}}$\ldots$} +\describe{\qquad \meta{angle}${}=45\,$deg} + {\cs{rhatch}\oarg{\meta{space}}\oarg{\meta{color}}$\ldots$} +\describe{\qquad \meta{angle}${}=-45\,$deg} + {\cs{lhatch}\oarg{\meta{space}}\oarg{\meta{color}}$\ldots$} +\describe{\qquad crosshatching} + {\cs{xhatch}\oarg{\meta{space}}\oarg{\meta{color}}$\ldots$} +\describe{} {\cs{hatch} $=$ \cs{xhatch}} +\describe{Shading} + {\cs{shade}\oarg{\meta{space}}$\ldots$} +\describe{Polkadot fill}{\cs{polkadot}\oarg{\meta{space}}$\ldots$} +\describe{Fill with copies of a tile} {\cs{tess}\marg{\meta{tile}}$\ldots$} +\describe{\quad Define a tile*} + {\cs{tile}\marg{\meta{name},\meta{unit},\meta{width},\meta{height},\meta{clip}} + \meta{drawing commands} \cs{endtile}} + +\smallskip +* Creates a mini-mfpic, clipped if \meta{clip}${}={}${\tt true}. + +\subsection{Storing and reusing a path} + +\describe{Store a path} {\cs{store}\marg{\meta{name}}$\ldots$} +\describe{\quad reusing a stored path} {\cs{mfobj}\marg{\meta{name}}} + +\subsection{Subpaths} + +\describe{Subpath by fraction of length} + {\cs{partpath}\marg{\meta{frac1},\meta{frac2}}$\ldots$} +\describe{Subpath by node number} {\cs{subpath}\marg{\meta{m},\meta{n}}$\ldots$} +\describe{Cutting by another path} + {\cs{cutoffafter}\marg{\meta{obj}}$\ldots$, + \cs{cutoffbefore}\marg{\meta{obj}}$\ldots$.\brk + \meta{obj} is a name created with \cs{store}} +\describe{Trim the ends of a path} + {\cs{trimpath}\marg{\meta{dim1},\meta{dim2}}$\ldots$} + + +\subsection{Modifying a curve} + +\def\firstkeyfrac{.4} +\def\secondkeyfrac{.6} + +\describe{Add arrowhead to the end} + {\cs{arrow}\oarg{l\meta{length}}\oarg{r\meta{angle}}% + \oarg{b\meta{backset}}\oarg{c\meta{color}}$\ldots$} +\describe{\quad Define arrowhead shape} + {\cs{headshape}\marg{\meta{ratio}}\marg{\meta{tension}}\marg{\meta{filled}}} +\describe{Reverse a curve} {\cs{reverse}$\ldots$} +\describe{Double arrow} {\cs{arrow}\cs{reverse}\cs{arrow}$\ldots$} +\describe{Rotate around a point} {\cs{rotatepath}\marg{($x_0$,$y_0$),\meta{angle}}$\ldots$} +\describe{Reflect about a line} {\cs{reflectpath}\marg{($x_0$,$y_0$),($x_1$,$y_1$)}$\ldots$} +\describe{Shift} {\cs{shiftpath}\marg{($dx$,$dy$)}$\ldots$} +\describe{Scale around a point} {\cs{scalepath}\marg{($x_0$,$y_0$),\meta{scale}}$\ldots$} +\describe{xscale about line $x=x_0$} {\cs{xscalepath}\marg{$x_0$,\meta{scale}}$\ldots$} +\describe{yscale about line $y=y_0$} {\cs{yscalepath}\marg{$y_0$,\meta{scale}}$\ldots$} +\describe{slant, pivoting on line $y=y_0$} {\cs{slantpath}\marg{$y_0$,\meta{slant}}$\ldots$} +\describe{yslant, pivoting on line $x=x_0$} {\cs{yslantpath}\marg{$x_0$,\meta{slant}}$\ldots$} +\describe{Swap x and y} {\cs{xyswappath}$\ldots$} + + +\section{Axes} + +\def\firstkeyfrac{.30} +\def\secondkeyfrac{.70} + +\describe{Draw x- and/or y-axes} {\cs{axes}\oarg{\meta{headlen}}, + \cs{xaxis}\oarg{\meta{headlen}}, \cs{yaxis}\oarg{\meta{headlen}}} +\describe{Draw various axes} + {\cs{axis}\oarg{\meta{headlen}}\marg{\meta{axis}}, \ \meta{axis} is one of + {\tt x}, {\tt y}, {\tt l}, {\tt b}, {\tt r}, or {\tt t}.} +\describe{Draw many axes} {\cs{doaxes}\oarg{\meta{headlen}}\marg{\meta{list}}, \ + \meta{list} of letters, no commas.} +\describe{Shift border axis inward} + {\cs{axismargin}\marg{\meta{axis}}\marg{\meta{amt}}, \ \meta{amt} is + in graph units.} +\describe{Add hashmarks to axes}{% + \cs{axismarks}\marg{\meta{axis}}\oarg{\meta{len}}\marg{$c_1$,$c_2$,$\ldots$}, \ + $c_j$ are positions.\brk Abbrev. by + \cs{xmarks} for \cs{axismarks}\marg{x}, etc.} +\describe{Change position of hash marks} + {\cs{setaxismarks}\marg{\meta{axis}}\marg{\meta{pos}} \ \meta{pos} is one of + {\tt inside}, {\tt outside}, {\tt centered}, {\tt ontop}, + {\tt onbottom}, {\tt onleft}, or {\tt onright}.} + +\section{Miscellaneous} + +\def\firstkeyfrac{.30} +\def\secondkeyfrac{.70} + +\describe{Text labels} + {\cs{tlabel}\oarg{\meta{pos}\meta{$\theta$}}% + \parg{\meta{x},\meta{y}}\marg{\meta{\TeX{} text}}\brk + \cs{tlabels}\marg{\meta{args$_1$}\meta{args$_2$}$\ldots$}\brk + \cs{axislabels}\marg{\meta{axis}}\oarg{\meta{pos}\meta{$\theta$}}% + \marg{\marg{\meta{txt$_1$}}\meta{$n_1$},% + \marg{\meta{txt$_2$}}\meta{$n_2$},$\ldots$}\brk + \meta{pos} is a two-letter sequence, \meta{$\theta$} the + angle* of rotation in degrees; + \meta{args$_j$} is an entire set of arguments as in \cs{tlabel}; + \meta{axis} is a letter, \meta{txt$_j$} is label, \meta{$n_j$} + is coordinate on axis} +\describe{Clipping to a path} {\cs{gclip}$\ldots$} +\describe{Polar conversion} + {\cs{plr}\marg{($r_0$,$\theta_0$),($r_1$,$\theta_1$),$\ldots$}} +\describe{Connect paths} {\cs{connect} \meta{path1} \meta{path2} $\ldots$ + \cs{endconnect}} +\describe{Draw many curves from one datafile} + {\cs{plotdata}\oarg{\meta{spec}}\marg{\meta{file}}, \ \meta{spec} is {\tt + p} or {\tt s\meta{num}} where \meta{num} is the (optional) tension + in the smooth curve} +\describe{Set how \cs{plotdata} draws curves$^{\dag}$}{\cs{dashedlines} + \ (different dash patterns)\brk + \cs{coloredlines} \ (different colors, \MP{} only)\brk + \cs{pointedlines} \ (different symbols, like \cs{plot})\brk + \cs{datapointsonly} \ (different symbols, like \cs{plotnodes})} + +\smallskip +* The angle is optional, and ignored unless option \opt{mplabels} is +in effect.\brk +$^{\dag}$ \cs{plotdata} also respects the \cs{using} setting (see +\cs{datafile} in section {\bf General curves}). + +\bye + +% Other commands: +\cs{setrender}[\<\TeX{} commands\>] + +\cs{coords}$\ldots$\cs{endcoords} +\cs{applyT}[\<transformer\>] +\cs{rotate}[$\theta$] +\cs{rotatearound}[$p$][$\theta$] +\cs{turn}[?$p$][$\theta$] +\cs{mirror}[$p_1$][$p_2$] +\cs{reflectabout}[$p_1$][$p_2$] +\cs{shift}[$p$] +\cs{scale}[$s$] +\cs{xscale}[$s$] +\cs{yscale}[$s$] +\cs{zscale}[$p$] +\cs{xslant}[$s$] +\cs{yslant}[$s$] +\cs{zslant}[$s$] +\cs{boost}[$\chi$] +\cs{xyswap} + +\cs{fdef}[\<fcn\>]% + (\<param1\>,\<param2\>,$\ldots$)% + [\<mf-expr\>] + +\cs{tcaption}[?\<maxwd\>,\<linewd\>][\<caption text\>] + +\cs{savepic}\bsl\<picname\> +\cs{newsavepic} +\cs{usepic} + +\cs{dashlineset}, \cs{dotlineset} + +\cs{mfsrc}[\<metafont code\>] +\cs{noship} + +\cs{store}[\<path variable\>][\<path\>] +\cs{mfobj}[\<path expression\>] +\cs{patharr}[\<pv\>]$\ldots$\cs{endpatharr} + +\cs{mftitle}[\<title\>] +\cs{tmtitle}[\<title\>] + +\cs{newfdim}[\<fdim\>] + +\cs{setmfpicgraphic} +\cs{getmfpicoffset} +\cs{setfilename} + +\bye diff --git a/Master/texmf-dist/doc/generic/mfpic/mfpdoc.sty b/Master/texmf-dist/doc/generic/mfpic/mfpdoc.sty index 674dc965061..46c2077ca96 100644 --- a/Master/texmf-dist/doc/generic/mfpic/mfpdoc.sty +++ b/Master/texmf-dist/doc/generic/mfpic/mfpdoc.sty @@ -1,34 +1,48 @@ %%% File: mfpdoc.sty -%%% A part of mfpic 0.7a beta 2004/04/16 +%%% A part of mfpic 0.9 2006/05/26 %%% -\ProvidesPackage{mfpdoc}[2003/11/14 v0.5 macros for mfpic documentation] - -\RequirePackage{ifpdf} - -\newcommand\mfpversion{0.7a beta} -\newcommand\mfpdate {2004/04/16} - -% Text size: - -\textwidth 5.4167 in -\textheight 7.4166 in - -% Equal LR margins -\oddsidemargin 0.5\paperwidth - \advance\oddsidemargin-.5\textwidth - \advance\oddsidemargin-1truein +\ProvidesPackage{mfpdoc}[2006/05/26 v0.9 macros for mfpic documentation] + +\newif\if@chapters +\@chaptersfalse +\DeclareOption{chapters}{\@chapterstrue} + +\newif\if@stupidlogos +\@stupidlogostrue +\DeclareOption{nologos}{\@stupidlogosfalse} +\ProcessOptions + +\IfFileExists{ifpdf.sty}{\RequirePackage{ifpdf}} + {\csname newif\expandafter\endcsname\csname ifpdf\endcsname \pdffalse + \ifx\pdfoutput\undefined + \else\ifx\pdfoutput\relax + \else\ifnum0=\pdfoutput + \else + \pdftrue + \fi\fi\fi} + +\newcommand\mfpversion{0.9} +\newcommand\mfpdate {2006/05/26} + +%% Text size: + +\textwidth 5.5 in +\textheight7.5 in +\oddsidemargin .5in \evensidemargin\oddsidemargin - -% "Equal" TB margins (if headings are ignored). -\topmargin 0.5\paperheight - \advance\topmargin-0.5\textheight +\topmargin .75in \advance\topmargin-\headheight \advance\topmargin-\headsep - \advance\topmargin-1truein \ifpdf \pdfpageheight\paperheight \pdfpagewidth\paperwidth + \def\mfpHyOpts{% + pdftex,colorlinks,pdfpagemode=none,% + pdfstartview={XYZ null null null},% + plainpages=false,hypertexnames=true} + \def\mfpHyDisable{% + \def\cs##1{\otherbackslash##1}\let\opt\@firstofone\let\prog\@firstofone} \else \ifx\mfpdvipdfm\UndEfInEd \special{papersize=\the\paperwidth,\the\paperheight} @@ -36,8 +50,7 @@ \special{pdf: pagesize width \the\paperwidth\space height \the\paperheight} \fi \fi - -\renewcommand\section{\@startsection {section}{1}{\z@}% +\renewcommand\section{\@startsection{section}{1}{\z@}% {-2.4ex \@plus -.5ex \@minus -.1ex}% {1.0ex \@plus.1ex}% {\normalfont\large\bfseries}} @@ -46,9 +59,20 @@ {.75ex \@plus .1ex}% {\normalfont\bfseries}} \renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}% - {-1.2ex\@plus -.3ex \@minus -.1ex}% + {-1.5ex\@plus -.3ex \@minus -.1ex}% {.5ex \@plus .1ex}% {\normalfont\scshape\raggedright}} +\renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}% + {-1ex\@plus -.2ex \@minus -.1ex}% + {.4ex \@plus .1ex}% + {\normalfont\itshape\raggedright}} + +\if@chapters + \let\chapter\section + \let\section\subsection + \let\subsection\subsubsection + \let\subsubsection\paragraph +\fi \def\mfpicversiontext{\prog{Mfpic} version: \mfpversion.} @@ -75,6 +99,16 @@ \def\mfpindexheading{} \def\mfpindexpagemarks{} +\def\@listi{\leftmargin\leftmargini + \parsep \z@ \@plus\p@ \@minus\z@ + \topsep 1ex \@plus.2ex \@minus 1ex + \itemsep\parsep} +\let\@listI\@listi \@listi +\renewcommand\labelitemi{\normalfont\bfseries \textendash} +\renewcommand\labelitemii{\textasteriskcentered} +\renewcommand\labelitemiii{\textperiodcentered} +\leftmargini 1.5\parindent + \renewenvironment{theindex} {% \@restonecoltrue @@ -89,31 +123,66 @@ } {\clearpage} -% command descriptions: -\newenvironment{cd} - {\def\ {\leavevmode\null\quad}% small space at beginning of line - \par\addvspace{1.75ex plus .3ex minus .1ex} - \vbox\bgroup\parindent0pt\ignorespaces} - {\unskip\strut\egroup\nobreak\vspace{.75ex plus .3ex minus .1ex}% - \@ignoretrue} -% examples: +%% Because \pageref doesn't link to the actual page: +\newcommand\pagelabel{\ifpdf \phantomsection \fi\label} + +%% Displays %%%%%%%%%%% +%% command descriptions: +\newenvironment{cd} + {\par\addvspace{1.75ex plus .3ex minus .1ex} + \parindent0pt + \vbox\bgroup\hsize\textwidth + \def\ {\leavevmode\null\quad}% small space at beginning of line + } + {\unskip\strut\egroup\@ignoretrue + \aftergroup\@afterindenttrue\aftergroup\@afterheading + \nobreak\vskip.75ex plus .3ex minus .1ex} + +%% examples: \newenvironment{ex} - {\par\def\ {\leavevmode\null\quad}% - \addvspace{1ex plus.2ex minus.1ex}\leftskip2\parindent\relax - \vbox\bgroup\parindent0pt\ignorespaces} - {\unskip\egroup\vskip 1ex plus.2ex minus.1ex \@ignoretrue\@endpetrue} - -\def\pdfTeX{pdf\kern.04em\TeX} -\def\pdfLaTeX{pdf\kern.06em\LaTeX} -\def\ConTeXt{Con\kern-.16em \TeX \kern-0.06em t} -\def\eTeX{e\kern-.10em \TeX} -\def\AmSTeX{$\cal A$\kern-.1667em\lower.5ex - \hbox{$\cal M$}\kern-.125em$\cal S$-\TeX} -\def\PiCTeX{P\kern-.12em\lower.5ex\hbox{I}\kern-.075emC\kern-.11em\TeX} + {\par\addvspace{1ex plus.2ex minus.1ex}% + \parindent0pt + \vbox\bgroup\hsize\textwidth + \leftskip\leftmargini + \def\ {\leavevmode\null\quad}} + {\unskip \strut \egroup \vskip 1ex plus.2ex minus.1ex + \@ignoretrue\@endpetrue} + +%% verbatim: +\RequirePackage{verbatim} +\def\verbatim@processline{\hspace{\leftmargini}\the\verbatim@line\par} + +%% other: +\newenvironment{display}{\list{}{}\item[]}{\endlist} +%% end displays %%%%%%% + +%% Logos %%%%%%%%%%%%%% +\if@stupidlogos + \def\TeX{T\kern-.1667em\lower.4ex\hbox{E}\kern-.125emX} + \def\pdfTeX{pdf\kern.04em\TeX} + \def\pdfLaTeX{pdf\kern.06em\LaTeX} + \def\ConTeXt{Con\kern-.16em \TeX \kern-0.06em t} + \def\eTeX{e\kern-.10em \TeX} + \def\CMcal{\fontencoding{OMS}\fontfamily{cmsy}\selectfont} + \def\AmSTeX{{\CMcal A\kern-.1667em\lower.5ex\hbox{M}\kern-.125em S}-\TeX} +% \def\PiCTeX{P\kern-.12em\lower.5ex\hbox{I}\kern-.075emC\kern-.11em\TeX} + \def\PiCTeX{P\kern-.06em\lower.4ex\hbox{I}\kern-.075emC\kern-.06em\TeX} +\else + \def\TeX {\textsc{TeX}} + \def\LaTeX {\textsc{LaTeX}} + \def\pdfTeX {\textsc{pdfTeX}} + \def\pdfLaTeX{\textsc{pdfLaTeX}} + \def\ConTeXt {\textsc{ConTeXt}} + \def\eTeX {\textsc{eTeX}} + \def\AmSTeX {\textsc{$AMS$-TeX}} + \def\PiCTeX {\textsc{PiCTeX}} +\fi +%% end Logos %%%%%%%%%% \hyphenation{meta-font meta-post Post-Script Ghost-script} +%% Special words %%%%%% \def\MF{\prog{metafont}} \def\CMF{\prog{Metafont}} \def\MP{\prog{metapost}} @@ -126,12 +195,13 @@ \def\grafbase{\prog{grafbase}} \def\Grafbase{\prog{Grafbase}} +%% font commands \def\mytt#1{\relax \ifmmode \mathtt{#1} - \else {\upshape\mdseries\ttfamily#1}\fi} -\def\mfc{\begingroup\mdseries\ttfamily\catcode`\_=12 \grabit} + \else {\upshape\ttfamily#1}\fi} +\def\mfc{\begingroup\ttfamily\catcode`\_=12 \grabit} \def\grabit#1{#1\endgroup} -\def\_{{\tt\char`\_}} +\def\_{{\upshape\ttfamily\char`\_}} \def\prog#1{{\mdseries\scshape#1}} % programs, packages \let\file\mytt % filenames \def\opt#1{{\upshape\sffamily#1}} % LaTeX option names @@ -157,16 +227,23 @@ \let\@mkboth\markboth \def\sectionmark##1{\thispagestyle{plain}} \def\subsectionmark##1{% - \markright {\thesubsection\quad##1}}% + \markright {\thesection\quad##1}}% \def\subsubsectionmark##1{}} +\if@chapters \renewcommand\tableofcontents{\pagenumbering{roman}% - \section*{\contentsname + \chapter*{\contentsname \@mkboth{\scshape\contentsname}{\scshape\contentsname}}% \@starttoc{toc}\clearpage\pagenumbering{arabic}} +\fi -% figures at top of float pages: +%% figures: \@fptop=-\@fpsep +\@addtoreset{figure}{section} + +%% misc: +\def\tallstrut{\vbox to 10pt{}} +\def\deepstrut{\vtop to 5pt{}} \frenchspacing \endinput diff --git a/Master/texmf-dist/doc/generic/mfpic/mfpguide.pdf b/Master/texmf-dist/doc/generic/mfpic/mfpguide.pdf Binary files differindex 6567586c67e..2bed5cc99e2 100644 --- a/Master/texmf-dist/doc/generic/mfpic/mfpguide.pdf +++ b/Master/texmf-dist/doc/generic/mfpic/mfpguide.pdf diff --git a/Master/texmf-dist/doc/generic/mfpic/mfpguide.tex b/Master/texmf-dist/doc/generic/mfpic/mfpguide.tex index ea0eaf04d88..1a12dbfc49b 100644 --- a/Master/texmf-dist/doc/generic/mfpic/mfpguide.tex +++ b/Master/texmf-dist/doc/generic/mfpic/mfpguide.tex @@ -1,18 +1,10 @@ %%% File: mfpguide.tex -%%% A part of mfpic 0.7a beta 2004/04/16 +%%% A part of mfpic 0.9 2006/05/26 %%% % Tutorial on mfpic \documentclass[letterpaper]{article} -\usepackage{pslatex} - -\usepackage{mfpdoc} -\usepackage{verbatim} - -\makeatletter -\def\verbatim@processline{\hspace{20pt}\the\verbatim@line\par} -\@addtoreset{figure}{section} -\makeatother +\usepackage[chapters]{mfpdoc} \renewcommand{\thefigure}{\thesection.\arabic{figure}} @@ -20,15 +12,20 @@ {\figure[htb] \centering \refstepcounter{figure} \label{#1}} {\par\medskip Figure \thefigure. \endfigure} -\usepackage[dvipdfm]{graphics} +\ifpdf + \usepackage[pdftex,final]{graphics} +\else + \usepackage[dvips,final]{graphics} +\fi \usepackage[metapost]{mfpic} \opengraphsfile{guide} +\dotsize1pt \ifpdf -\usepackage[pdftex,colorlinks,pdfpagemode=none,pdfstartview=FitH,% -plainpages=false,hypertexnames=true]{hyperref} -\pdfstringdefDisableCommands{\def\cs#1{\otherbackslash#1}% - \def\opt#1{#1}\def\prog#1{#1}} +\expandafter\usepackage\expandafter + [\mfpHyOpts]{hyperref} +\expandafter\pdfstringdefDisableCommands\expandafter + {\mfpHyDisable} \fi \def\theHfigure{\thefigure} @@ -42,7 +39,7 @@ plainpages=false,hypertexnames=true]{hyperref} \maketitle \tableofcontents -\section{Introduction}\label{sec:intro} +\chapter{Introduction}\label{sec:intro} As this document aims only to instruct the reader in the building of figures with \mfp{}, we will not be too concerned with the intricacies @@ -58,16 +55,17 @@ We will start right out with the ``Hello, world'' of \mfp{}. Construct a \LaTeX{} document by typing the following in a text editor and saving it as \file{first.tex}. \begin{verbatim} - \documentclass{article} - \usepackage[metapost]{mfpic} - \opengraphsfile{myfigs} - \begin{document} - My first figure: - \begin{mfpic}[72]{-1}{1}{-1}{1} - \ellipse{(0,0),1,.5} - \end{mfpic} - \closegraphsfile - \end{document} +% first.tex +\documentclass{article} + \usepackage[metapost]{mfpic} + \opengraphsfile{myfigs} +\begin{document} + My first figure: + \begin{mfpic}[72]{-1}{1}{-1}{1} + \ellipse{(0,0),1,.5} + \end{mfpic} + \closegraphsfile +\end{document} \end{verbatim} Run the command \begin{ex} @@ -116,20 +114,21 @@ of \pdfLaTeX). This file should be created only after running If you get an error message from \LaTeX{}, carefully check your typing. Also check whether an older version of \mfp{} might have been used instead of the current version. If you get an error message from \MP{} -do the same, especially within the \env{mfpic} environment. If you get a -message from \MP{} that ``Grafbase'' believes your \mfp{} installation -may be broken, check the log files (\file{first.log} and -\file{myfigs.log}) to find out the locations of these input files: +do the same, especially checking the typing within the \env{mfpic} +environment. If you get a message from \MP{} that ``Grafbase'' believes +your \mfp{} installation may be broken, check the log files +(\file{first.log} and \file{myfigs.log}) to find out the locations of +these input files: \begin{ex} \file{mfpic.tex} and \file{grafbase.mp} \end{ex} and make sure that both these files are from the most recently installed \mfp{} package. If you are only evaluating \mfp{} without committing to -upgrading it, just make sure all the files mentioned in the previous +installing it, just make sure all the files mentioned in the previous paragraphs are in the current directory. If \pdfLaTeX{} complains it can't write on the file \file{first.pdf}, -unload first.pdf from your pdf viewer and try again. +unload \file{first.pdf} from your pdf viewer and try again. If the figures look a little choppy in Acrobat Reader, turn on ``smooth line art'' in the edit preferences dialogue. @@ -140,9 +139,9 @@ obtain the ellipse of figure~\ref{fig1}. Each time you change an change the file \file{myfigs.mp} produced and you should repeat the sequence: \begin{verbatim} - pdflatex first - mpost myfigs - pdflatex first +pdflatex first +mpost myfigs +pdflatex first \end{verbatim} to be sure of seeing the changes. @@ -151,18 +150,18 @@ is positioned quite a bit above the base line of the text. This is because \mfp{} reserves the amount of space specified in the arguments of the \env{mfpic} environment. These arguments are \verb$[72]{-1}{1}{-1}{1}$, which means the each unit in the picture is -72 times the value of \cs{mfpicunit}, that is, about one inch. the first +72 times the value of \cs{mfpicunit}, that is, about one inch. The first pair of mandatory arguments, \verb${-1}{1}$, indicate the $x$-coordinates run from $-1$ to $1$. Since these differ by 2, they indicate a width of two inches. The second pair similarly represents a height of two inches. But the ellipse is centered at $(0,0)$, which is one inch above the bottom (bottom is at $y = -1$), and its vertical -radius is .5. So the lowest point on the ellipse should be .5 inches +radius is .5. So the lowest point on the ellipse should be 0.5 inches above the bottom of the space reserved. \Mfp{} provides a way to fit the space reserved to the actual extent of `ink' in the picture. That is by the option \opt{truebbox}: \begin{verbatim} - \usepackage[metapost,truebbox]{mfpic} +\usepackage[metapost,truebbox]{mfpic} \end{verbatim} This would then produce something like figure~\ref{fig2}. From now on, this option will be in effect in our examples. @@ -180,16 +179,16 @@ still needed in order to establish the coordinate system that the ordered pairs refer to (for example \texttt{(0,0)} in the \cs{ellipse} arguments). -\section{Positioning text}\label{sec:text} +\chapter{Positioning text}\label{sec:text} By now you are probably thinking: ``This so-called `Hello, world' of \mfp{} doesn't say `Hello, world' anywhere!'' We correct that with the following example: \begin{verbatim} - \begin{mfpic}[72]{-1}{1}{-1}{1} - \ellipse{(0,0),1,.5} - \tlabel[cc](0,0){Hello, world.} - \end{mfpic} +\begin{mfpic}[72]{-1}{1}{-1}{1} + \ellipse{(0,0),1,.5} + \tlabel[cc](0,0){Hello, world.} +\end{mfpic} \end{verbatim} This should give you figure~\ref{fig3}. \begin{mfpfig}{fig3} @@ -214,10 +213,10 @@ communicate to both the text placement and the curve generation procedures that they are to be centered at the point $(0,0)$. (We'll see an easier way to do this later.) \begin{verbatim} - \begin{mfpic}[72]{-1}{1}{-1}{1} - \tlabeljustify{cc} - \tlabeloval(0,0){Hello, world.} - \end{mfpic} +\begin{mfpic}[72]{-1}{1}{-1}{1} + \tlabeljustify{cc} + \tlabeloval(0,0){Hello, world.} +\end{mfpic} \end{verbatim} This produces figure~\ref{fig4}. \begin{mfpfig}{fig4} @@ -228,37 +227,40 @@ This produces figure~\ref{fig4}. \end{mfpfig} This would be better still if a little space is left around the text so -the ellipse doesn't touch it. The \cs{tlabelsep} command can do that: +the ellipse doesn't touch it. The \cs{tlpathsep} command can do that: \begin{verbatim} - \begin{mfpic}[72]{-1}{1}{-1}{1} - \tlabeljustify{cc} - \tlabelsep{3pt} - \tlabeloval(0,0){Hello, world.} - \end{mfpic} +\begin{mfpic}[72]{-1}{1}{-1}{1} + \tlabeljustify{cc} + \tlpathsep{3pt} + \tlabeloval(0,0){Hello, world.} +\end{mfpic} \end{verbatim} producing figure~\ref{fig5}. \begin{mfpfig}{fig5} - \begin{mfpic}[72]{-1}{1}{-1}{1} - \tlabeljustify{cc} - \tlabelsep{3pt} - \tlabeloval(0,0){Hello, world.} - \end{mfpic} +\begin{mfpic}[72]{-1}{1}{-1}{1} + \tlabeljustify{cc} + \tlpathsep{3pt} + \tlabeloval(0,0){Hello, world.} +\end{mfpic} \end{mfpfig} -Now it would be nice to make the text pop out a bit with some color. -Adding \verb$\gfill[yellow]$ in front of either \verb$\ellipse$ or -\verb$\tlabeloval$ will do that: +It would be nice to make the text pop out a bit with some color% + \footnote{Colors are included in this document only to give + examples of their use in \prog{mfpic}. I do not necessarily + recommend any of them.}% +. You can do that by adding \verb$\gfill[yellow]$ in front of either +\verb$\ellipse$ or \verb$\tlabeloval$: \begin{verbatim} - \begin{mfpic}[72]{-1}{1}{-1}{1} - \tlabelsep{3pt} - \tlabeljustify{cc} - \gfill[yellow]\tlabeloval(0,0){Hello, world.} - \end{mfpic} +\begin{mfpic}[72]{-1}{1}{-1}{1} + \tlpathsep{3pt} + \tlabeljustify{cc} + \gfill[yellow]\tlabeloval(0,0){Hello, world.} +\end{mfpic} \end{verbatim} This will produce figure~\ref{fig6}. \begin{mfpfig}{fig6} \begin{mfpic}[72]{-1}{1}{-1}{1} - \tlabelsep{3pt} + \tlpathsep{3pt} \tlabeljustify{cc} \gfill[yellow]\tlabeloval(0,0){Hello, world.} \end{mfpic} @@ -272,28 +274,28 @@ before the \verb$\gfill$. You can draw the curve in a color other than black with an optional argument. We can also make the line thicker with the command \verb$\penwd$: \begin{verbatim} - \begin{mfpic}[72]{-1}{1}{-1}{1} - \penwd{1.5pt} - \tlabelsep{3pt} - \tlabeljustify{cc} - \draw[blue]\gfill[yellow]\tlabeloval(0,0){Hello, world.} - \end{mfpic} +\begin{mfpic}[72]{-1}{1}{-1}{1} + \penwd{1.5pt} + \tlpathsep{3pt} + \tlabeljustify{cc} + \draw[blue]\gfill[yellow]\tlabeloval(0,0){Hello, world.} +\end{mfpic} \end{verbatim} This will produce figure~\ref{fig7}. \begin{mfpfig}{fig7} \begin{mfpic}[72]{-1}{1}{-1}{1} \penwd{1.5pt} - \tlabelsep{3pt} + \tlpathsep{3pt} \tlabeljustify{cc} \draw[blue]\gfill[yellow]\tlabeloval(0,0){Hello, world.} \end{mfpic} \end{mfpfig} This last version doesn't look too bad, but it seems that the oval ought -to be a little fatter (slightly higher than it now is). By default, +to be a little fatter (slightly higher than it is now). By default, \verb$\tlabeloval$ will make the ratio of width to height the same as that of the text, or rather of the text plus the additional space -specified by \verb$\tlabelsep$. This can be changed with an optional +specified by \verb$\tlpathsep$. This can be changed with an optional argument, a number that multiplies the width-to-height ratio. Decreasing this ratio will decrease the width (slightly) and increase the height. Here we have also omitted the \cs{tlabeljustify} command and shown that @@ -302,17 +304,17 @@ Here we have also omitted the \cs{tlabeljustify} command and shown that include the first optional argument; if the default is intended, an empty pair of brackets may be used. \begin{verbatim} - \begin{mfpic}[72]{-1}{1}{-1}{1} - \penwd{1.5pt} - \tlabelsep{3pt} - \draw[blue]\gfill[yellow]\tlabeloval[.8][cc](0,0){Hello, world.} - \end{mfpic} +\begin{mfpic}[72]{-1}{1}{-1}{1} + \penwd{1.5pt} + \tlpathsep{3pt} + \draw[blue]\gfill[yellow]\tlabeloval[.8][cc](0,0){Hello, world.} +\end{mfpic} \end{verbatim} This will produce figure~\ref{fig8}. \begin{mfpfig}{fig8} \begin{mfpic}[72]{-1}{1}{-1}{1} \penwd{1.5pt} - \tlabelsep{3pt} + \tlpathsep{3pt} \draw[blue]\gfill[yellow]\tlabeloval[.8][cc](0,0){Hello, world.} \end{mfpic} \end{mfpfig} @@ -327,22 +329,27 @@ only thing that can be used to surround text. See the manual Here is a more common use of \verb$tlabel$ commands: labeling a graph and axes. In the following example we have given \cs{tlabel} the option \texttt{[bl]} to place the bottom left corner of the text at the given -coordinates. However, we have used \verb$\tlabelsep{3pt}$ (which has the -additional effect of moving text away from its nominal location) to -prevent the text from colliding with the curve. +coordinates. However, we have used \verb$\tlpointsep{3pt}$, which has +the effect of shifting text away from its nominal location, to prevent the +text from colliding with the curve.% + \footnote{One can also use \cs{tlabelsep}, which is equivalent to + \cs{tlpathsep} plus \cs{tlpointsep}.} +The value set by \cs{tlpointsep} has an effect only if the point is on +the edge of the text, so there would be no shifting with the +\texttt{[cc]} placement used earlier. \begin{verbatim} - \begin{mfpic}[72]{0}{2.5}{0}{1} - \tlabelsep{3pt} - \polyline{(0,.2),(.5,1),(1,.7),(1.5,0),(2,.3)} - \tlabel[bl](.5,1){Max output} - \dashed\polyline{(0,.2),(.5,.6),(1,.3),(1.5,.7),(2,.1)} - \tlabel[bl](1.5,.7){Max input} - \end{mfpic} +\begin{mfpic}[72]{0}{2.5}{0}{1} + \tlpointsep{3pt} + \polyline{(0,.2),(.5,1),(1,.7),(1.5,0),(2,.3)} + \tlabel[bl](.5,1){Max output} + \dashed\polyline{(0,.2),(.5,.6),(1,.3),(1.5,.7),(2,.1)} + \tlabel[bl](1.5,.7){Max input} +\end{mfpic} \end{verbatim} This will produce figure~\ref{fig9}. \begin{mfpfig}{fig9} \begin{mfpic}[72]{0}{2.5}{0}{1} - \tlabelsep{3pt} + \tlpointsep{3pt} \polyline{(0,.2),(.5,1),(1,.7),(1.5,0),(2,.3)} \tlabel[bl](.5,1){Max output} \dashed\polyline{(0,.2),(.5,.6),(1,.3),(1.5,.7),(2,.1)} @@ -355,24 +362,24 @@ Notice that \verb$\polyline$ alone produces a solid line while by dressing up this figure with axes, some fat dots marking the keypoints, and hash marks on the axes: \begin{verbatim} - \begin{mfpic}[72]{0}{2.5}{0}{1} - \tlabelsep{3pt} - \polyline{(0,.2),(.5,1),(1,.7),(1.5,0),(2,.3)} - \point[3pt]{(0,.2),(.5,1),(1,.7),(1.5,0),(2,.3)} - \tlabel[bl](.5,1){Max output} - \dashed\polyline{(0,.2),(.5,.6),(1,.3),(1.5,.7),(2,.1)} - \pointfillfalse - \point[3pt]{(0,.2),(.5,.6),(1,.3),(1.5,.7),(2,.1)} - \tlabel[bl](1.5,.7){Max input} - \axes - \xmarks{0,0.5,1,1.5,2} - \axislabels x{{$50$} .5, {$100$} 1, {$150$} 1.5, {$200$} 2} - \end{mfpic} +\begin{mfpic}[72]{0}{2.5}{0}{1} + \tlpointsep{3pt} + \polyline{(0,.2),(.5,1),(1,.7),(1.5,0),(2,.3)} + \point[3pt]{(0,.2),(.5,1),(1,.7),(1.5,0),(2,.3)} + \tlabel[bl](.5,1){Max output} + \dashed\polyline{(0,.2),(.5,.6),(1,.3),(1.5,.7),(2,.1)} + \pointfillfalse + \point[3pt]{(0,.2),(.5,.6),(1,.3),(1.5,.7),(2,.1)} + \tlabel[bl](1.5,.7){Max input} + \axes + \xmarks{0,0.5,1,1.5,2} + \axislabels x{{$50$} .5, {$100$} 1, {$150$} 1.5, {$200$} 2} +\end{mfpic} \end{verbatim} This will produce figure~\ref{fig10}. \begin{mfpfig}{fig10} \begin{mfpic}[72]{0}{2.5}{0}{1} - \tlabelsep{3pt} + \tlpointsep{3pt} \polyline{(0,.2),(.5,1),(1,.7),(1.5,0),(2,.3)} \point[3pt]{(0,.2),(.5,1),(1,.7),(1.5,0),(2,.3)} \tlabel[bl](.5,1){Max output} @@ -394,7 +401,7 @@ specified in the argument of the \env{mfpic} environment. The axis, and a comma separated list of labels, each of which is specified by some text to place (in braces) and the x-coordinate to place it at. -\section{Drawing figures} +\chapter{Drawing figures} \Mfp{} has several predefined figures and commands to obtain essentially any curve (provided one can obtain enough points on it with sufficient @@ -408,12 +415,12 @@ They can be preceded by \verb$\dashed$ to make the lines dashed or \verb$dotted$ to make them dotted. If the figure is a closed curve, \verb$\gfill$ will fill them in. \begin{verbatim} - \begin{mfpic}[72]{0}{4}{0}{1} - \rect{(0,0),(1,.75)} - \circle{(1.5,.5),.45} - \arc[s]{(3,0),(2,1),45} - \ellipse[20]{(3.5, 0.5), 0.6, 0.4} - \end{mfpic} +\begin{mfpic}[72]{0}{4}{0}{1} + \rect{(0,0),(1,.75)} + \circle{(1.5,.5),.45} + \arc[s]{(3,0),(2,1),45} + \ellipse[20]{(3.5, 0.5), 0.6, 0.4} +\end{mfpic} \end{verbatim} This produces figure~\ref{fig11}. The \verb$\arc$ command has several forms. The optional argument picks the form to use. This one specifies @@ -438,13 +445,13 @@ also draw smooth curves. Lets take the same points from our \cs{polyline} example (figure~\ref{fig9}), but change \cs{polyline} to \cs{curve}, omit the text, and add the points from figure~\ref{fig10}: \begin{verbatim} - \begin{mfpic}[72]{0}{2.5}{0}{1} - \curve{(0,.2),(.5,1),(1,.7),(1.5,0),(2,.3)} - \point[3pt]{(0,.2),(.5,1),(1,.7),(1.5,0),(2,.3)} - \dashed\curve{(0,.2),(.5,.6),(1,.3),(1.5,.7),(2,.1)} - \pointfillfalse - \point[3pt]{(0,.2),(.5,.6),(1,.3),(1.5,.7),(2,.1)} - \end{mfpic} +\begin{mfpic}[72]{0}{2.5}{0}{1} + \curve{(0,.2),(.5,1),(1,.7),(1.5,0),(2,.3)} + \point[3pt]{(0,.2),(.5,1),(1,.7),(1.5,0),(2,.3)} + \dashed\curve{(0,.2),(.5,.6),(1,.3),(1.5,.7),(2,.1)} + \pointfillfalse + \point[3pt]{(0,.2),(.5,.6),(1,.3),(1.5,.7),(2,.1)} +\end{mfpic} \end{verbatim} This should produce figure~\ref{fig12}. \begin{mfpfig}{fig12} @@ -465,18 +472,20 @@ the points are, and how sharp the turns at each point. High tension makes the curve look a little more like a polyline. The default tension is 1, a tension of about 5 makes the result look somewhat like a polyline with very slightly rounded corners, very high tensions make the -curve indistinguishable from a polyline. Another effect of increased -tension is to reduce the little wobbles we can see in the first curve. -Let's try a tension of 1.5, which can be specified as an optional -argument to \cs{curve}: +curve indistinguishable from a polyline. Tension must (almost) always be +greater than $0.75$. + +Another effect of increased tension is to reduce the little wobbles we +can see in the first curve. Let's try a tension of 1.5, which can be +specified as an optional argument to \cs{curve}: \begin{verbatim} - \begin{mfpic}[72]{0}{2.5}{0}{1} - \curve[1.5]{(0,.2),(.5,1),(1,.7),(1.5,0),(2,.3)} - \point[3pt]{(0,.2),(.5,1),(1,.7),(1.5,0),(2,.3)} - \dashed\curve[1.5]{(0,.2),(.5,.6),(1,.3),(1.5,.7),(2,.1)} - \pointfillfalse - \point[3pt]{(0,.2),(.5,.6),(1,.3),(1.5,.7),(2,.1)} - \end{mfpic} +\begin{mfpic}[72]{0}{2.5}{0}{1} + \curve[1.5]{(0,.2),(.5,1),(1,.7),(1.5,0),(2,.3)} + \point[3pt]{(0,.2),(.5,1),(1,.7),(1.5,0),(2,.3)} + \dashed\curve[1.5]{(0,.2),(.5,.6),(1,.3),(1.5,.7),(2,.1)} + \pointfillfalse + \point[3pt]{(0,.2),(.5,.6),(1,.3),(1.5,.7),(2,.1)} +\end{mfpic} \end{verbatim} This give figure~\ref{fig13}. \begin{mfpfig}{fig13} @@ -494,17 +503,17 @@ connecting points or if we are trying to graph a function. It \emph{cannot} enforce the requirement, which every function must satisfy, that the curve should travel left-to-right. The command \cs{fcncurve} does enforce this (assuming the points to be connected are -listed in left-to-right order). This command also permits a tension -argument. The dotted line in figure~\ref{fig14} is produced with -\cs{curve}, the solid one with \cs{fcncurve}. One might want -to increase the tension a bit here, too. +listed in left-to-right order). This command also permits an optional +tension argument. The dotted line in figure~\ref{fig14} is produced with +\cs{curve}, the solid one with \cs{fcncurve}. One might conceivably want +to decrease the tension a bit here. \begin{verbatim} - \begin{mfpic}[72]{0}{2.5}{0}{1} - \dotted\curve{(0,.2),(.5,0),(.85,.5),(1,1),(1.5,0),(2,.3)} - \fcncurve{(0,.2),(.5,0),(.85,.5),(1,1),(1.5,0),(2,.3)} - \pointfillfalse - \point[3pt]{(0,.2),(.5,0),(.85,.5),(1,1),(1.5,0),(2,.3)} - \end{mfpic} +\begin{mfpic}[72]{0}{2.5}{0}{1} + \dotted\curve{(0,.2),(.5,0),(.85,.5),(1,1),(1.5,0),(2,.3)} + \fcncurve{(0,.2),(.5,0),(.85,.5),(1,1),(1.5,0),(2,.3)} + \pointfillfalse + \point[3pt]{(0,.2),(.5,0),(.85,.5),(1,1),(1.5,0),(2,.3)} +\end{mfpic} \end{verbatim} \begin{mfpfig}{fig14} \begin{mfpic}[72]{0}{2.5}{0}{1} @@ -522,7 +531,7 @@ Other figures available include\leftmargini=2\leftmargini \item[\cs{polygon}] Used just like \cs{polyline} except it connects the last point to the first with a straight line. \item[\cs{sector}] Makes a wedge with two straight lines and an arc. The - arguments are almost the same as \cs{arc}\oarg{s}, but the order is + arguments are almost the same as \cs{arc}\oarg{p}, but the order is different: center, radius and two angles. \end{description} @@ -541,7 +550,7 @@ without placing the text. \end{description} -\section{Functions} +\chapter{Functions} \CMP{} is able to calculate a number of functions natively, and still more have been defined in \mfp{}. Also available are the usual @@ -550,24 +559,24 @@ one unknown \gbc{x} and producing a numerical result can be graphed. Here is an example of the graphs of $y = x^2$ and $y = \pm\sqrt{x}$. Note that exponentials are denoted by \texttt{**} and it is important to -note that it has the same precedence as multiplication (denoted by -a single \texttt{*}). That is, in a formula like \mfc{3*3**2}, the -operations are performed in order, left to right, producing $9^2 = 81$ and -not $3\cdot 9 = 27$. Parentheses are needed if the latter is intended: -\mfc{3*(3**2)}. +note that it has the same precedence as multiplication (denoted by a +single \texttt{*}). That is, in a formula like \mfc{3*3**2}, the +operations are performed in order, left to right, producing $(3\cdot +3)^2 = 81$ and not $3\cdot 3^2 = 27$. Parentheses are needed if the +latter is intended: \mfc{3*(3**2)}. \begin{verbatim} - \setlength{\mfpicunit}{1cm} - \begin{mfpic}{-2.5}{2.5}{-1.5}{4} - \function{-2,2,.1}{x**2} - \function{0,2,.1}{sqrt x} - \function{0,2,.1}{-sqrt x} - \axes - \xmarks{-2,-1,1,2} - \ymarks{-1,1,2,3} - \tlabelsep{3pt} - \axislabels x{{$-2$}-2,{$-1$}-1,{$1$}1,{$2$}2} - \axislabels y{{$-1$}-1,{$1$}1,{$2$}2,{$3$}3} - \end{mfpic} +\setlength{\mfpicunit}{1cm} +\begin{mfpic}{-2.5}{2.5}{-1.5}{4} + \function{-2,2,.1}{x**2} + \function{0,2,.1}{sqrt x} + \function{0,2,.1}{-sqrt x} + \axes + \xmarks{-2,-1,1,2} + \ymarks{-1,1,2,3} + \tlpointsep{3pt} + \axislabels x{{$-2$}-2,{$-1$}-1,{$1$}1,{$2$}2} + \axislabels y{{$-1$}-1,{$1$}1,{$2$}2,{$3$}3} +\end{mfpic} \end{verbatim} This produces figure~\ref{fig15}. \begin{mfpfig}{fig15} @@ -579,7 +588,7 @@ This produces figure~\ref{fig15}. \axes \xmarks{-2,-1,1,2} \ymarks{-1,1,2,3} - \tlabelsep{3pt} + \tlpointsep{3pt} \axislabels x{{$-2$}-2,{$-1$}-1,{$1$}1,{$2$}2} \axislabels y{{$-1$}-1,{$1$}1,{$2$}2,{$3$}3} \end{mfpic} @@ -595,18 +604,18 @@ the graph is constructed by connecting the calculated points with straight lines. Here is the same example with larger step size to emphasize the difference (see figure~\ref{fig16}) \begin{verbatim} - \setlength{\mfpicunit}{1cm} - \begin{mfpic}{-2.5}{2.5}{-1.5}{4} - \function[p]{-2,2,.5}{x**2} - \function[p]{0,2,.5}{sqrt x} - \function[p]{0,2,.5}{-sqrt x} - \axes - \xmarks{-2,-1,1,2} - \ymarks{-1,1,2,3} - \tlabelsep{3pt} - \axislabels x{{$-2$}-2,{$-1$}-1,{$1$}1,{$2$}2} - \axislabels y{{$-1$}-1,{$1$}1,{$2$}2,{$3$}3} - \end{mfpic} +\setlength{\mfpicunit}{1cm} +\begin{mfpic}{-2.5}{2.5}{-1.5}{4} + \function[p]{-2,2,.5}{x**2} + \function[p]{0,2,.5}{sqrt x} + \function[p]{0,2,.5}{-sqrt x} + \axes + \xmarks{-2,-1,1,2} + \ymarks{-1,1,2,3} + \tlpointsep{3pt} + \axislabels x{{$-2$}-2,{$-1$}-1,{$1$}1,{$2$}2} + \axislabels y{{$-1$}-1,{$1$}1,{$2$}2,{$3$}3} +\end{mfpic} \end{verbatim} \begin{mfpfig}{fig16} \setlength{\mfpicunit}{1cm} @@ -617,7 +626,7 @@ emphasize the difference (see figure~\ref{fig16}) \axes \xmarks{-2,-1,1,2} \ymarks{-1,1,2,3} - \tlabelsep{3pt} + \tlpointsep{3pt} \axislabels x{{$-2$}-2,{$-1$}-1,{$1$}1,{$2$}2} \axislabels y{{$-1$}-1,{$1$}1,{$2$}2,{$3$}3} \end{mfpic} @@ -653,16 +662,16 @@ any of the coordinates of points in drawing commands like \cs{polyline} example (from now on the value of \cs{mfpicunit} is set to \texttt{1cm}):\setlength{\mfpicunit}{1cm} \begin{verbatim} - \begin{mfpic}{-.5}{2.5}{-1.5}{1.5} - \polyline{(2,-sqrt 2),(1,-1),(.5,- sqrt .5),(0,0), - (.5,sqrt .5),(1,1),(2,sqrt 2)} - \axes - \xmarks{1,2} - \ymarks{-1,1} - \tlabelsep{3pt} - \axislabels x{{$1$}1,{$2$}2} - \axislabels y{{$-1$}-1,{$1$}1} - \end{mfpic} +\begin{mfpic}{-.5}{2.5}{-1.5}{1.5} + \polyline{(2,-sqrt 2),(1,-1),(.5,- sqrt .5),(0,0), + (.5,sqrt .5),(1,1),(2,sqrt 2)} + \axes + \xmarks{1,2} + \ymarks{-1,1} + \tlpointsep{3pt} + \axislabels x{{$1$}1,{$2$}2} + \axislabels y{{$-1$}-1,{$1$}1} +\end{mfpic} \end{verbatim} \begin{mfpfig}{fig17} \begin{mfpic}{-.5}{2.5}{-1.5}{1.5} @@ -671,7 +680,7 @@ example (from now on the value of \cs{mfpicunit} is set to \axes \xmarks{1,2} \ymarks{-1,1} - \tlabelsep{3pt} + \tlpointsep{3pt} \axislabels x{{$1$}1,{$2$}2} \axislabels y{{$-1$}-1,{$1$}1} \end{mfpic} @@ -696,10 +705,10 @@ it as the graph of the pair-valued function \mfc{dir(t)}. The expression \mfc{dir(t)} gives the point whose distance from $(0,0)$ is $1$ in the direction given by the angle \mfc{t}. \begin{verbatim} - \begin{mfpic}{-2}{4}{-2}{2} - \parafcn{-2,2,.1}{(t**2,t)} - \dotted\parafcn{45,315,5}{1.5*dir(t)} - \end{mfpic} +\begin{mfpic}{-2}{4}{-2}{2} + \parafcn{-2,2,.1}{(t**2,t)} + \dotted\parafcn{45,315,5}{1.5*dir(t)} +\end{mfpic} \end{verbatim} \begin{mfpfig}{fig22} \begin{mfpic}{-2}{4}{-2}{2} @@ -713,9 +722,9 @@ Here is an example of a graph of the polar coordinate function $r=2\sin 3\theta$ (figure~\ref{fig23}). We use the degree version \mfc{sind} in order to work with integers. \begin{verbatim} - \begin{mfpic}{-2}{2}{-2}{2} - \plrfcn{0,180,5}{2*sind 3t} - \end{mfpic} +\begin{mfpic}{-2}{2}{-2}{2} + \plrfcn{0,180,5}{2*sind 3t} +\end{mfpic} \end{verbatim} \begin{mfpfig}{fig23} \begin{mfpic}{-2}{2}{-2}{2} @@ -724,7 +733,7 @@ $r=2\sin 3\theta$ (figure~\ref{fig23}). We use the degree version \end{mfpfig} -\section{Transforming figures} +\chapter{Transforming figures} \CMP{} is capable of any affine transformation (things like shifting, rotating, scaling, reflecting and slanting) of any path. The figures @@ -736,10 +745,10 @@ of `drawing' the path with \emph{prefix macros}. We've seen \cs{dashed}, \Mfp{} also provides for modifying the shape and position of the path with other prefixes. Here's a simple example. \begin{verbatim} - \begin{mfpic}{-.5}{2.5}{-.5}{2.5} - \rotatepath{(1,.5), 45}\rect{(0,0),(2,1)} - \point{(1,.5)} - \end{mfpic} +\begin{mfpic}{-.5}{2.5}{-.5}{2.5} + \rotatepath{(1,.5), 45}\rect{(0,0),(2,1)} + \point{(1,.5)} +\end{mfpic} \end{verbatim} The command \cs{rotatepath} obviously rotates the path that follows, but it needs to know what the center of rotation will be, and how much to @@ -757,15 +766,15 @@ Notice that we have no drawing prefix. A combination of transformation-plus-figure is treated as a figure in its own right and behaves the same. If we want the figure dashed, we could write \begin{verbatim} - \dashed\rotatepath{(1,.5),45}\rect{(0,0),(2,1)} +\dashed\rotatepath{(1,.5),45}\rect{(0,0),(2,1)} \end{verbatim} It may not be obvious, but we can also write a drawing macro between the rotation and the figure, producing figure~\ref{fig19} \begin{verbatim} - \begin{mfpic}{-.5}{2.5}{-.5}{2.5} - \rotatepath{(1,.5), 45}\draw\rect{(0,0),(2,1)} - \point{(1,.5)} - \end{mfpic} +\begin{mfpic}{-.5}{2.5}{-.5}{2.5} + \rotatepath{(1,.5), 45}\draw\rect{(0,0),(2,1)} + \point{(1,.5)} +\end{mfpic} \end{verbatim} \begin{mfpfig}{fig19} \begin{mfpic}{-.5}{2.5}{-.5}{2.5} @@ -784,67 +793,71 @@ rectangle is drawn. Finally, try to guess what happens if we add another prefix at the front: \begin{verbatim} - \begin{mfpic}{-.5}{2.5}{-.5}{2.5} - \dotted\rotatepath{(1,.5), 45} - \draw\rect{(0,0),(2,1)} - \end{mfpic} +\begin{mfpic}{-.5}{2.5}{-.5}{2.5} + \dotted\rotatepath{(1,.5), 45} + \draw\rect{(0,0),(2,1)} +\end{mfpic} \end{verbatim} and if we add another rotation in front of that. \begin{verbatim} - \begin{mfpic}{-.5}{2.5}{-.5}{2.5} - \rotatepath{(0,0),45} - \dotted\rotatepath{(1,.5), 45} - \draw\rect{(0,0),(2,1)} - \end{mfpic} +\begin{mfpic}{-.5}{2.5}{-.5}{2.5} + \rotatepath{(0,0),45} + \dotted\rotatepath{(1,.5), 45} + \draw\rect{(0,0),(2,1)} +\end{mfpic} \end{verbatim} -Transformations availiable include \cs{scalepath}, -\cs{shiftpath}, \cs{xscalepath}, \cs{yscalepath}, \cs{slantpath}, and -\cs{reflectpath}. See the manual for a description of what arguments are -required for each. Here's a final example, producing figure~\ref{fig20} + +Available transformations include +\begin{display}\raggedright + \cs{scalepath}, \cs{shiftpath}, \cs{xscalepath}, \cs{yscalepath}, + \cs{slantpath}, and \cs{reflectpath}. +\end{display} +See the manual for a description of what arguments are required for +each. Here's a final example, producing figure~\ref{fig20} \begin{verbatim} - \begin{mfpic}{-.5}{2.5}{-.5}{2.5} - \shiftpath{(-1,1)}\draw[red]\slantpath{.5,1}\dotted - \rotatepath{(0,0), 90}\dashed\rect{(0,0),(2,1)} - \point{(0,0),(2,1)} - \tlabelsep{2pt} - \tlabel[tr](0,0){$(0,0)$} - \tlabel[bl](2,1){$(2,1)$} - \end{mfpic} +\begin{mfpic}{-.5}{2.5}{-.5}{2.5} + \shiftpath{(-1,1)}\draw[red]\slantpath{.5,1}\dotted + \rotatepath{(0,0), 90}\dashed\rect{(0,0),(2,1)} + \point{(0,0),(2,1)} + \tlpointsep{2pt} + \tlabel[tr](0,0){$(0,0)$} + \tlabel[bl](2,1){$(2,1)$} +\end{mfpic} \end{verbatim} \begin{mfpfig}{fig20} \begin{mfpic}{-.5}{2.5}{-.5}{2.5} \shiftpath{(-1,1)}\draw[red]\slantpath{.5,1}\dotted \rotatepath{(0,0), 90}\dashed\rect{(0,0),(2,1)} \point{(0,0),(2,1)} - \tlabelsep{2pt} + \tlpointsep{2pt} \tlabel[tr](0,0){$(0,0)$} \tlabel[bl](2,1){$(2,1)$} \end{mfpic} \end{mfpfig} -\section{Rendering figures} +\chapter{Rendering figures} \emph{Rendering} is the act of making a description of a figure visible. Examples are: drawing a solid curve, drawing a dashed curve, or filling its interior, For \mfp{} figure macros the default, in the absence of explicit commands, is to use \cs{draw}. That is, \begin{verbatim} - \rect{(0,0),(1,2)} +\rect{(0,0),(1,2)} \end{verbatim} has the same result as \begin{verbatim} - \draw\rect{(0,0),(1,2)} +\draw\rect{(0,0),(1,2)} \end{verbatim} The default rendering can be changed. Just say \cs{setrender}\marg{\cs{dashed}}, and all figures afterward will be dashed (see figure~\ref{fig21}). \begin{verbatim} - \begin{mfpic}{0}{2}{0}{1} - \setrender{\dashed} - \rect{(0,0),(1,1)} - \circle{(1.5,.5),.5} - \end{mfpic} +\begin{mfpic}{0}{2}{0}{1} +\setrender{\dashed} + \rect{(0,0),(1,1)} + \circle{(1.5,.5),.5} +\end{mfpic} \end{verbatim} \begin{mfpfig}{fig21} \begin{mfpic}{0}{2}{0}{1} @@ -873,15 +886,15 @@ produce closed paths, but \cs{polyline}, \cs{curve}, \cs{function}, The following example illustrates filling with a hatching pattern (parallel lines) and an \emph{unfilling}. Clearing the interior of a -path may not seem like rendering, it is treated in exactly the same way +path may not seem like rendering, but it is treated in exactly the same way (think of it as a negative rendering). We first hatch a rectangle, then clear out a smaller rectangle with rounded corners to place our text inside. The results are in figure~\ref{fig24}. \begin{verbatim} - \begin{mfpic}{0}{2}{0}{2} - \draw[red]\lhatch[2pt][blue]\rect{(0,0),(2,2)} - \gclear\tlabelrect[6pt][cc](1,1){Hatching!} - \end{mfpic} +\begin{mfpic}{0}{2}{0}{2} + \draw[red]\lhatch[2pt][blue]\rect{(0,0),(2,2)} + \gclear\tlabelrect[6pt][cc](1,1){Hatching!} +\end{mfpic} \end{verbatim} \begin{mfpfig}{fig24} \begin{mfpic}{0}{2}{0}{2} @@ -904,15 +917,15 @@ the second example the hatching goes over the dots (and a bit of the dashes as well). If the \cs{gfill} were first, it would cover almost everything else. \begin{verbatim} - \begin{mfpic}{0}{6}{0}{2} - \penwd{2pt} - \hatchwd{2pt} - \drawcolor{blue} - \hatchcolor{red} - \fillcolor{green} - \dashed\polkadot\rhatch[5pt]\gfill[yellow]\rect{(0,0),(2.8,1.8)} - \rhatch[5pt]\dashed\polkadot\gfill[yellow]\rect{(3,0),(5.8,1.8)} - \end{mfpic} +\begin{mfpic}{0}{6}{0}{2} + \penwd{2pt} + \hatchwd{2pt} + \drawcolor{blue} + \hatchcolor{red} + \fillcolor{green} + \dashed\polkadot\rhatch[5pt]\gfill[yellow]\rect{(0,0),(2.8,1.8)} + \rhatch[5pt]\dashed\polkadot\gfill[yellow]\rect{(3,0),(5.8,1.8)} +\end{mfpic} \end{verbatim} We've added a couple of other new features to this example. To emphasize effects, we've increased the thickness of the drawing pen (\cs{penwd}) @@ -947,15 +960,15 @@ mandatory argument, the name of a dashing pattern. Named dashing patterns may be created with the \cs{dashpattern} command, as shown by the following example (see figure~\ref{fig27}): \begin{verbatim} - \begin{mfpic}{-3.5}{3.5}{-1}{1} - \dashpattern{dotdash}{0pt,4pt,3pt,4pt} - \gendashed{dotdash}\function{-pi,pi,.2}{sin 2x} - \function{-pi,pi,.2}{cos 2x} - \axes - \end{mfpic} +\begin{mfpic}{-3.5}{3.5}{-1.2}{1.2} + \dashpattern{dotdash}{0pt,4pt,3pt,4pt} + \gendashed{dotdash}\function{-pi,pi,.2}{sin 2x} + \function{-pi,pi,.2}{cos 2x} + \axes +\end{mfpic} \end{verbatim} \begin{mfpfig}{fig27} - \begin{mfpic}{-3.5}{3.5}{-1}{1} + \begin{mfpic}{-3.5}{3.5}{-1.2}{1.2} \dashpattern{dotdash}{0pt,4pt,3pt,4pt} \gendashed{dotdash}\function{-pi,pi,.2}{sin 2x} \function{-pi,pi,.2}{cos 2x} @@ -979,12 +992,12 @@ something other than tiny dots. The \cs{plot} command does that. It takes one mandatory argument, the name of a symbol to use instead of a dot. Here are the same two curves \cs{plot}-ed (figure~\ref{fig28}): \begin{verbatim} - \begin{mfpic}{-3.5}{3.5}{-1.2}{1.2} - \setlength{\pointsize}{2.5pt} - \plot{Triangle}\function{-pi,pi,.2}{sin 2x} - \plot[2pt,6pt]{SolidCircle}\function{-pi,pi,.2}{cos 2x} - \axes - \end{mfpic} +\begin{mfpic}{-3.5}{3.5}{-1.2}{1.2} + \setlength{\pointsize}{2.5pt} + \plot{Triangle}\function{-pi,pi,.2}{sin 2x} + \plot[2pt,6pt]{SolidCircle}\function{-pi,pi,.2}{cos 2x} + \axes +\end{mfpic} \end{verbatim} \begin{mfpfig}{fig28} \begin{mfpic}{-3.5}{3.5}{-1.2}{1.2} @@ -1006,10 +1019,10 @@ case of \cs{function}, these are the points $(x_k, f(x_k))$ with $x_k$ stepping through all the $x$-values determined by the first argument of \cs{function} (figure~\ref{fig29}). \begin{verbatim} - \begin{mfpic}{-3.5}{3.5}{-1.2}{1.2} - \plotnodes[2.5pt]{Square}\function{-pi,pi,pi/16}{sin 2x} - \axes - \end{mfpic} +\begin{mfpic}{-3.5}{3.5}{-1.2}{1.2} + \plotnodes[2.5pt]{Square}\function{-pi,pi,pi/16}{sin 2x} + \axes +\end{mfpic} \end{verbatim} \begin{mfpfig}{fig29} \begin{mfpic}{-3.5}{3.5}{-1.2}{1.2} @@ -1021,7 +1034,7 @@ stepping through all the $x$-values determined by the first argument of See the manual for the list of predefined symbols available to the \cs{plot} and \cs{plotnodes} command. -\section{More on text} +\chapter{More on text} The text positioning commands used so far in this guide are entirely handled by \TeX{} or \LaTeX. This is why we have occasionally had to say @@ -1037,20 +1050,20 @@ the first we try to use \LaTeX's \cs{rotatebox} command, and in the second we turn on \MP{} handling of labels and use a rotation option to the \cs{tlabel} command. \begin{verbatim} - \begin{mfpic}{0}{1}{0}{1} - \point{(0,0)} - \polyline{(0,0),(1,1)} - \tlabel[Bl](0,0){\rotatebox{45}{\hspace{5pt}Test text}} - \end{mfpic}\renewcommand\thefigure{\thesection.\arabic{figure}a} +\begin{mfpic}{0}{1}{0}{1} + \point{(0,0)} + \polyline{(0,0),(1,1)} +\tlabel[Bl](0,0){\rotatebox{45}{\hspace{5pt}Test text}} +\end{mfpic} \end{verbatim} \begin{verbatim} - \usemplabels - \begin{mfpic}{0}{1}{0}{1} - \point{(0,0)} - \polyline{(0,0),(1,1)} - \tlabelsep{5pt} - \tlabel[Bl45](0,0){Test text} - \end{mfpic} +\usemplabels +\begin{mfpic}{0}{1}{0}{1} + \point{(0,0)} + \polyline{(0,0),(1,1)} + \tlpointsep{5pt} + \tlabel[Bl45](0,0){Test text} +\end{mfpic} \end{verbatim} \begin{figure}[!hb] \centering @@ -1069,7 +1082,7 @@ the \cs{tlabel} command. \begin{mfpic}{0}{1}{0}{1} \point{(0,0)} \polyline{(0,0),(1,1)} - \tlabelsep{5pt} + \tlpointsep{5pt} \tlabel[Bl45](0,0){Test text} \end{mfpic}\renewcommand\thefigure{\thesection.\arabic{figure}b} \refstepcounter{figure}\label{fig30b} @@ -1094,10 +1107,10 @@ $$ This is then placed by the \cs{tlabel} command with the lower left corner of the \emph{outer} box at $(0,0)$. But \LaTeX's axis of rotation was at the lower left corner of the inner box. In the second case, \MP{} -placed the label. The command \cs{tlabelsep}\marg{5pt} and the parameter +placed the label. The command \cs{tlpointsep}\marg{5pt} and the parameter \oarg{Bl45} explicitly request that the label be placed with its left -baseline 5 points from $(0,0)$ and rotated 45 degrees \emph{about that -point}. +baseline 5 points from $(0,0)$ and rotated 45 degrees \emph{about the +point $(0,0)$}. The \cs{usemplabels} command used above asks \MP{} to arrange for the setting of labels. Adding the option \opt{mplabels} to the @@ -1119,7 +1132,7 @@ them pass the final responsability for text placement to \MP{} if \opt{mplabels} is in effect. See the manual for more details. -\section{Arrows} +\chapter{Arrows} The command \cs{arrow} adds an arrowhead onto the \emph{end} of any path that follows. For this to have predictable effects, you need to know @@ -1136,59 +1149,63 @@ points are written. Anyway, here are a few examples, illustrating the use of \cs{arrow}, and some of its optional arguments. \begin{verbatim} - \begin{mfpic}{0}{4}{0}{4} - \arrow[r -5]\circle{(1,1),.5} - \arrow[b 4pt]\arrow\polyline{(3,2),(3,0)} - \arrow[c red]\reverse\arrow\polyline{(0,3),(2,3)} - \arrow[l 5pt]\rect{(4,2),(2,4)} - \end{mfpic} +\begin{mfpic}{0}{4}{0}{4} + \arrow[r-5]\circle{(1,1),.5} + \arrow[b4pt]\arrow\polyline{(3,2),(3,0)} + \arrow[cred]\reverse\arrow\polyline{(0,3),(2,3)} + \arrow[l 5pt]\rect{(4,2),(2,4)} +\end{mfpic} \end{verbatim} See figure~\ref{fig31} for the results of this example. There are four possible optional arguments, the first character inside the brackets tells what option the rest of the argument applies to. The first example above starts with `\texttt{r}', which stands for `rotate' and asks for -the arrowhead to be rotated -5 degrees (5 degrees clockwise). The second -starts with `\texttt{b}', which stands for `backset' and it moves the -head back \texttt{4pt} from where it would otherwise be placed. In the -example, this is used to put a double arrowhead on the line. In the -third example we put an arrow at both ends by reversing the sense of the -curve in between the two \cs{arrow} prefixes. We also used the letter -`\texttt{c}' in the optional argument of one arrowhead. This stands for -`color' and the requested color is `\texttt{red}'. Finally, the -\texttt{l} option, standing for `length', changes the length of the -arrowhead to \texttt{5pt} (from the default \texttt{3pt}). The space -between the letter and the value in these arguments may be omitted. +the arrowhead to be rotated 5 degrees (positive rotation means +anticlockwise, negative means clockwise). This is frequently useful for +arrows on curved paths, as the default direction (tangent to the path) +often just looks wrong). The second example starts with `\texttt{b}', +which stands for `backset' and it moves the head back \texttt{4pt} from +where it would otherwise be placed. In the example, this is used to put +a double arrowhead on the line. In the third example we put an arrow at +both ends by reversing the sense of the curve in between the two +\cs{arrow} prefixes. We also used the letter `\texttt{c}' in the +optional argument of one arrowhead. This stands for `color' and the +requested color is `\texttt{red}'. Finally, the \texttt{l} option +(that's a lowercase `ell', not the number `one') changes the length of +the arrowhead to 5 points (from the \verb$3pt$ default).% + \footnote{I have put a space between the \texttt{l} and the + \texttt{5pt} so it won't be mistaken for `$15$pt. Normally one + should avoid spaces in \mfp{} optional arguments, but this is one + case where it will cause no harm.} \begin{mfpfig}{fig31} \begin{mfpic}{0}{4}{0}{4} - \arrow[r -5]\circle{(1,1),.5} - \arrow[b 4pt]\arrow\polyline{(3,2),(3,0)} - \arrow[c red]\reverse\arrow\polyline{(0,3),(2,3)} + \arrow[r5]\circle{(1,1),.5} + \arrow[b4pt]\arrow\polyline{(3,2),(3,0)} + \arrow[cred]\reverse\arrow\polyline{(0,3),(2,3)} \arrow[l 5pt]\rect{(4,2),(2,4)} \end{mfpic} \end{mfpfig} The options can be combined in one command: \cs{arrow}\oarg{cblue}\oarg{b4pt}\oarg{r25}\oarg{l6pt} would produce a -\texttt{6pt} long blue arrowhead rotated 25 degrees anticlockwise, set back -\texttt{4pt}. The setting back is done in the direction determined +\texttt{6pt} long blue arrowhead rotated 25 degrees anticlockwise, set +back \texttt{4pt}. The setting back is done in the direction determined \emph{after} rotation. The order of the options is not significant. -The need to occasionally tweak the arrowhead with a small rotation will -be apparent if you look closely at the circle example without any -rotation. - The shape of the arrowhead can be changed with the \cs{headshape} command. The following example draws the arrowhead first normally, and -then after an instance of this command. We increase the length of head -and the thickness of the pen to emphasize the effects. +then after an instance of this command. We draw it a third time, exactly +like the second time, except we use the *-form. We have increased the +length of head and the thickness of the pen to emphasize the effects. \begin{verbatim} - \begin{mfpic}{0}{4}{0}{4} - \setlength{\headlen}{20pt} - \penwd{3pt} - \arrow\polyline{(0,3),(4,3)} - \headshape{.5}{2}{true} - \arrow\polyline{(0,1),(4,1)} - \end{mfpic} +\begin{mfpic}{0}{4}{0}{4} + \setlength{\headlen}{20pt} + \penwd{3pt} + \arrow\polyline{(0,3),(4,3)} + \headshape{.5}{2}{true} + \arrow\polyline{(0,2),(4,2)} + \arrow*\polyline{(0,1),(4,1)} +\end{mfpic} \end{verbatim} The results are pictured in figure~\ref{fig32}. The first argument to \cs{headshape} sets the ratio of width to height for the head. We have @@ -1196,19 +1213,23 @@ cut it in half here. The second argument sets the tension in the curves that form the sides of the head. This reduces the curvature in the sides. The third argument can be only \texttt{true} or \texttt{false} and determines whether the head is a solid shape, or only the two -`barbs'. The defaults correspond to \verb$\headshape{1}{1}{false}$ +`barbs'. The defaults correspond to \verb$\headshape{1}{1}{false}$. The +filled form does not draw the outline so what we see is the pointy +arrowhead on top of a thick line. The *-form tries to erase part of the +line so that one sees an actual pointy arrow. \begin{mfpfig}{fig32} \begin{mfpic}{0}{4}{0}{4} \setlength{\headlen}{20pt} \penwd{3pt} \arrow\polyline{(0,3),(4,3)} \headshape{.5}{2}{true} - \arrow\polyline{(0,1),(4,1)} + \arrow\polyline{(0,2),(4,2)} + \arrow*\polyline{(0,1),(4,1)} \end{mfpic} \end{mfpfig} -\section{Color} +\chapter{Color} We saw the use of color in earlier sections, and now it's time to be systematic about it. The several rendering commands have a color option; @@ -1235,8 +1256,7 @@ and an optional argument to be described later. figure macros used without any rendering prefix, as well as \cs{axes} and related commands. \item[\cs{fillcolor}] This sets the default color used by \cs{gfill}. It - is also the color used by \cs{polkadot} (which has no color - option). + is also used by \cs{polkadot} (which has no color option). \item[\cs{hatchcolor}] This sets the default color used by any hatching command. \item[\cs{headcolor}] This sets the default color for arrowheads added @@ -1260,36 +1280,36 @@ The optional argument is one of the \emph{color models}. See the manual for details, but the syntax is just like that of the \prog{color} package's \cs{color} command. For example, \begin{verbatim} - \pointcolor[rgb]{0,1,0} +\pointcolor[rgb]{0,1,0} \end{verbatim} would use the color model \opt{rgb} with parameters 0, 1, and 0 (this is green). After each of these commands a certain color name is assigned a value. For example, a use of the \cs{pointcolor} command assigns a value -to the color named \gbc{pointcolor}. This pattern is followed for all the -color setting commands above (i.e., \cs{drawcolor} sets \gbc{drawcolor}) -except \cs{backgroundcolor}, which assigns its value to the color named -\gbc{background}. +to the color named \gbc{pointcolor}. Also \cs{drawcolor} sets +\gbc{drawcolor} and this pattern is followed for all the color setting +commands above except \cs{backgroundcolor}, which assigns its value to +the color named \gbc{background}. Color names for \mfp{} use can be defined using the \cs{mfpdefinecolor} command. Here's an example (figure~\ref{fig33}). Note the use of the color name \gbc{pointcolor} to make arrowheads and points have the same color. \begin{verbatim} - \begin{mfpic}{0}{3.5}{0}{3.5} - \tlabelcolor{red} - \pointcolor{rgb(0,1,0)}% green - \drawcolor[rgb]{0,0,1} % blue - \fillcolor{Goldenrod} % from dvipsnam.mp - \headcolor{pointcolor} % will be green after above - \mfpdefinecolor{DarkerRed}{rgb}{.67,0,0} - \hatchcolor{DarkerRed} - \penwd{1pt} - \gfill\circle{(1,1),.5} - \point[3pt]{(1,.5),(1,1.5),(.5,1),(1.5,1)} - \hatch\rect{(2.5,2.5),(3.5,3.5)} - \arrow[l 5pt]\polyline{(1,1),(3,3)} - \tlabel[cc](1,3){Examples \\of\\colors} - \end{mfpic} +\begin{mfpic}{0}{3.5}{0}{3.5} + \tlabelcolor{red} + \pointcolor{rgb(0,1,0)}% green + \drawcolor[rgb]{0,0,1} % blue + \fillcolor{Goldenrod} % from dvipsnam.mp + \headcolor{pointcolor} % will be green after above + \mfpdefinecolor{DarkerRed}{rgb}{.67,0,0} + \hatchcolor{DarkerRed} + \penwd{1pt} + \gfill\circle{(1,1),.5} + \point[3pt]{(1,.5),(1,1.5),(.5,1),(1.5,1)} + \hatch\rect{(2.5,2.5),(3.5,3.5)} + \arrow[l 5pt]\polyline{(1,1),(3,3)} + \tlabel[cc](1,3){Examples\\of\\colors} +\end{mfpic} \end{verbatim} \begin{mfpfig}{fig33} \begin{mfpic}{0}{3.5}{0}{3.5} @@ -1305,11 +1325,11 @@ color. \point[3pt]{(1,.5),(1,1.5),(.5,1),(1.5,1)} \hatch\rect{(2.5,2.5),(3.5,3.5)} \arrow[l 5pt]\polyline{(1,1),(3,3)} - \tlabel[cc](1,3){Examples \\of\\colors} + \tlabel[cc](1,3){Examples\\of\\colors} \end{mfpic} \end{mfpfig} -\section{Closing paths} +\chapter{Closing paths} There are many different ways to modify a figure. We have already seen \cs{arrow}, which appends an arrowhead, \cs{reverse} which reverses the @@ -1324,41 +1344,40 @@ that can do the job, the simplest being \cs{lclosed}, which closes with a straight line. Putting \cs{lclosed} in front of \cs{polyline}, for example, produces the same result as \cs{polygon}. Another macro is \cs{sclosed} which produces a smooth closure. Putting it in front of -\cs{curve} gives the same result as \cs{cyclic}. There is one other -useful macro, \cs{bclosed}, which also informs \MP{} to make a -smooth closure. The difference between \cs{sclosed} and -\cs{bclosed} is that the first modifies slightly the original path (in -order to achieve the effect that -\cs{sclosed}${}+{}$\cs{curve}${}={}$\cs{cyclic}), the second just asks -\MP{} to do its best to connect the ends smoothly. Here's an example -comparing the two smooth methods (figure~\ref{fig34}). +\cs{curve} gives (almost) the same result as \cs{cyclic}. There is one +other useful macro, \cs{bclosed}, which also informs \MP{} to make a +smooth closure. The difference between \cs{sclosed} and \cs{bclosed} is +that the first modifies slightly the original path (in order to achieve +the effect that \cs{sclosed}${}+{}$\cs{curve}${}\approx{}$\cs{cyclic}), +the second just asks \MP{} to do its best to connect the ends smoothly. +Here's an example comparing the two smooth methods (figure~\ref{fig34}). \begin{verbatim} - \begin{mfpic}{0}{4}{0}{4} - % an open curve: - \curve{(0.49,3),(.5,3.7),(1,4),(1.5,3.7),(1.51,3)} - % \sclosed a shifted copy: - \draw\gfill[green]\sclosed\shiftpath{(2,0)} - \curve{(0.49,3),(.5,3.7),(1,4),(1.5,3.7),(1.51,3)} - % \bclosed another copy: - \draw\gfill[yellow]\bclosed\shiftpath{(2,-2)} - \curve{(0.49,3),(.5,3.7),(1,4),(1.5,3.7),(1.51,3)} - % \cyclic with same points, shifted: - \draw\gfill[red]\shiftpath{(0,-2)} - \cyclic{(0.49,3),(.5,3.7),(1,4),(1.5,3.7),(1.51,3)} - \tlabeljustify{bc} - \nomplabels - \tlabels{ - (1,2.4){\cs{curve}} - (3,2.4){\cs{sclosed}} - (1,0.4){\cs{cyclic}} - (3,0.4){\cs{bclosed}} - } - % Some points to help illustrate - \point{(0.49,3),(.5,3.7),(1,4),(1.5,3.7),(1.51,3)} - \point{(2.49,3),(2.5,3.7),(3,4),(3.5,3.7),(3.51,3)} - \point{(0.49,1),(.5,1.7),(1,2),(1.5,1.7),(1.51,1)} - \point{(2.49,1),(2.5,1.7),(3,2),(3.5,1.7),(3.51,1)} - \end{mfpic} +\begin{mfpic}{0}{4}{0}{4} + % an open curve: + \curve{(0.49,3),(.5,3.7),(1,4),(1.5,3.7),(1.51,3)} + % \sclosed a shifted copy: + \draw\gfill[green]\sclosed\shiftpath{(2,0)} + \curve{(0.49,3),(.5,3.7),(1,4),(1.5,3.7),(1.51,3)} + % \bclosed another copy: + \draw\gfill[yellow]\bclosed\shiftpath{(2,-2)} + \curve{(0.49,3),(.5,3.7),(1,4),(1.5,3.7),(1.51,3)} + % \cyclic with same points, shifted: + \draw\gfill[red]\shiftpath{(0,-2)} + \cyclic{(0.49,3),(.5,3.7),(1,4),(1.5,3.7),(1.51,3)} + \tlabeljustify{bc} + \nomplabels + \tlabels{ + (1,2.4){\cs{curve}} + (3,2.4){\cs{sclosed}} + (1,0.4){\cs{cyclic}} + (3,0.4){\cs{bclosed}} + } + % Some points to help illustrate + \point{(0.49,3),(.5,3.7),(1,4),(1.5,3.7),(1.51,3)} + \point{(2.49,3),(2.5,3.7),(3,4),(3.5,3.7),(3.51,3)} + \point{(0.49,1),(.5,1.7),(1,2),(1.5,1.7),(1.51,1)} + \point{(2.49,1),(2.5,1.7),(3,2),(3.5,1.7),(3.51,1)} +\end{mfpic} \end{verbatim} \begin{mfpfig}{fig34} \begin{mfpic}{0}{4}{0}{4} @@ -1394,28 +1413,27 @@ provided we had used \verb$\mfpverbtex$ to write the appropriate \LaTeX{} preamble to the \file{.mp} output. It would need to be some subset of the preamble of this document. -\appendix -\section{Appendices} +\chapter{Appendices} In addition to \pdfLaTeX, \Mfp{} works with plain \pdfTeX, \LaTeX, and plain \TeX{}. Instead of \MP{} as the figure processor, \MF{} can also be used. Let's start with the difference between using \mfp{} in a plain~\TeX{} document and using it in a \LaTeX{} document. -\subsection{\Mfp{} in plain \TeX} +\section{\Mfp{} in plain \TeX} Here is a sample plain \pdfTeX{} document with results the same as our first ``Hello, world'' example. Let's call this file \file{plfirst} \begin{verbatim} - \input mfpic - \usemetapost - \opengraphsfile{myfigs} - My first figure: - \mfpic[72]{-1}{1}{-1}{1} - \ellipse{(0,0),1,.5} - \endmfpic - \closegraphsfile - \end +\input mfpic + \usemetapost +\opengraphsfile{myfigs} + My first figure: + \mfpic[72]{-1}{1}{-1}{1} + \ellipse{(0,0),1,.5} + \endmfpic + \closegraphsfile +\end \end{verbatim} The main difference is the lack of \LaTeX{} commands. The crucial difference is in the first two lines. There we simply @@ -1434,41 +1452,41 @@ Also, plain \TeX{} doesn't have environments, so instead of The external processing is essentially the same: \begin{verbatim} - pdftex plfirst - mpost myfigs - pdftex plfirst +pdftex plfirst +mpost myfigs +pdftex plfirst \end{verbatim} should produce \texttt{plfirst.pdf} with the same picture of an ellipse. -\subsection{\Mfp{} without PDF} +\section{\Mfp{} without PDF} If we wish to use nonPDF versions of \LaTeX{} or plain \TeX, the only difference is in the processing steps. To process \file{first.tex} with \LaTeX, run the command -\begin{ex} - \texttt{latex first} -\end{ex} +\begin{verbatim} +latex first +\end{verbatim} followed by -\begin{ex} - \texttt{mpost myfigs} -\end{ex} +\begin{verbatim} +mpost myfigs +\end{verbatim} followed by latex again. -\begin{ex} - \texttt{latex first} -\end{ex} +\begin{verbatim} +latex first +\end{verbatim} Then run the dvi processor of your choice. It should be one that can successfully handle eps figures (or at least the simple eps produced by \MP). Certainly \prog{dvips} can do it: -\begin{ex} - \texttt{dvips first} -\end{ex} +\begin{verbatim} +dvips first +\end{verbatim} will produce \file{first.ps}. The file{.ps} file can be viewed with \prog{gsview} or printed, or converted to PDF with some distillation -program like \prog{ps2pdf}. Also \prog{dvipdfm} (if recent, and properly +program like \prog{ps2pdf}. Also \prog{dvipdfm} (if properly configured) can be used convert the \file{.dvi} file to PDF. -\subsection{\Mfp{} without \MP} +\section{\Mfp{} without \MP} \Mfp{} can produce figures using \MF{} instead of \MP. What it does is work with \MF{} to produce a made-to-order font, where each picture is a @@ -1495,7 +1513,7 @@ colors actually produced will be black and white (and occasionally a pattern of pixels that simulate gray). The processing steps are different. After \begin{ex} - \texttt{latex first} \quad(or \texttt{tex plfirst}) +\texttt{latex first} \quad(or \texttt{tex plfirst}) \end{ex} run \MF: \begin{ex} @@ -1507,7 +1525,7 @@ might have a different number on your system) is called a \emph{generic font} (GF) file and contains the bitmap descriptions. If the file produced is \texttt{myfigs.2602gf}, and the \file{.tfm} is not produced, that indicates a configuration problem with your system that we'll get -to later. If this did work, one needs to convert the \file{gf} file to a +to later. If this did work, one needs to convert the GF file to a PK font file, the standard format for bitmap fonts in the \TeX{} world. This may be done with \begin{ex} @@ -1528,7 +1546,7 @@ You'll have to check what your system has and what its usage might be, and what it might do with the PK file produced. After the above, one again runs `\texttt{latex first}' (or `\texttt{tex -plfirst}'), and then the {.dvi} can be viewed or processed with dvips. +plfirst}'), and then the \file{.dvi} can be viewed or processed with dvips. The two files \file{myfigs.log} and \file{myfigs.600gf} can be deleted; only \file{myfigs.tfm} and \file{myfigs.600pk} are needed. If the viewed image shows the pictures at a far different size than you expect, this can @@ -1543,15 +1561,18 @@ should \emph{always} follow the \MF{} step with the \prog{gftopk} step. You might even want to write a batch script or makefile to ensure that this happens. -Another problem, more an annoyance, that can occur comes from the +Another problem (more an annoyance) that can occur comes from the behavior of most dvi viewers: most will reload a \file{.dvi} file if -they detect that it has changed (or if asked to), but will usually -\emph{not} reload any fonts even if they have changed. So if one is -going through a edit-compile-view cycle involving \mfp{} figures, one -usually has to close the viewer and open it again before one can see -changes that were made in the figures after starting the viewer. +they detect that it has changed (or if asked to), but none that I know +of will reload any fonts even if they have changed. So if one is going +through a edit-compile-view cycle involving \mfp{} figures, one usually +has to close the viewer and open it again before one can see changes +that were made in the figures after starting the viewer. It is also +possible that PK fonts are cached and shared by other programs, so you +may need to close other programs to ensure the cache is cleared and the +new figures loaded. -\subsection{\MF{} configuration problems} +\section{\MF{} configuration problems} To diagnose these problems it important to know something about \emph{printer modes}. \CMF{} produces bitmap images of characters. This @@ -1597,10 +1618,8 @@ be changed. This can be done with an ordinary text editor, or your If you say ``\texttt{mf myfigs}'' on an \mfp{} file \file{myfigs.mf}, \mfp's internal code will detect that no mode was defined on the command line. It will then check if \mfc{localfont} is defined and if so, use that for -the printer mode. Finally, if that fails, it will select \mfc{ljfour}. -If even that is unknown, \MF{} will go into \emph{proof mode} and set -\mfc{pixels_per_inch} equal to approximately 2602 (and it will -\emph{not} produce a \file{.tfm} file). +the printer mode. If that fails, it will try to select \mfc{ljfour}. +If even that is unknown, \mfp{} will define its own generic 600 DPI mode. \Mfp{} doesn't need to know all the parameters associated to a printer mode, only the value of \mfc{pixels_per_inch}. If you get a GF file that @@ -1609,6 +1628,6 @@ for the line in \file{modes.mf} that sets \mfc{localfont} to be corrected. At the very least it should equate \mfc{localfont} to a name defined in \file{modes.mf} and associated to a printer with the same DPI as yours. After changing \file{modes.mf}, you need to run whatever -programs your \TeX{} systems requires to remake the \MF{} format. +programs your \TeX{} system requires to remake the \MF{} format. \end{document} diff --git a/Master/texmf-dist/doc/generic/mfpic/mfpman.pdf b/Master/texmf-dist/doc/generic/mfpic/mfpman.pdf index ac9baa1ca69..a80f7d35cc0 100644 --- a/Master/texmf-dist/doc/generic/mfpic/mfpman.pdf +++ b/Master/texmf-dist/doc/generic/mfpic/mfpman.pdf @@ -1,4 +1,5 @@ -%PDF-1.3 +%PDF-1.4 +%ÐÔÅØ 5 0 obj << /S /GoTo /D (section.1) >> endobj @@ -39,6927 +40,12622 @@ endobj << /S /GoTo /D (subsection.2.1) >> endobj 32 0 obj -(metapost, \usemetapost ) +(metapost, \usemetapost .) endobj 33 0 obj << /S /GoTo /D (subsection.2.2) >> endobj 36 0 obj -(mplabels, \usemplabels , \nomplabels ) +(mplabels, \usemplabels , \nomplabels .) endobj 37 0 obj << /S /GoTo /D (subsection.2.3) >> endobj 40 0 obj -(overlaylabels, \overlaylabels , \nooverlaylabels ) +(overlaylabels, \overlaylabels , \nooverlaylabels .) endobj 41 0 obj << /S /GoTo /D (subsection.2.4) >> endobj 44 0 obj -(truebbox, \usetruebbox , \notruebbox ) +(truebbox, \usetruebbox , \notruebbox .) endobj 45 0 obj << /S /GoTo /D (subsection.2.5) >> endobj 48 0 obj -(clip, \clipmfpic , \noclipmfpic ) +(clip, \clipmfpic , \noclipmfpic .) endobj 49 0 obj << /S /GoTo /D (subsection.2.6) >> endobj 52 0 obj -(centeredcaptions, \usecenteredcaptions , \nocenteredcaptions ) +(centeredcaptions, \usecenteredcaptions , \nocenteredcaptions .) endobj 53 0 obj << /S /GoTo /D (subsection.2.7) >> endobj 56 0 obj -(debug, \mfpicdebugtrue , \mfpicdebugfalse ) +(raggedcaptions, \useraggedcaptions , \noraggedcaptions .) endobj 57 0 obj << /S /GoTo /D (subsection.2.8) >> endobj 60 0 obj -(clearsymbols, \clearsymbols , \noclearsymbols ) +(debug, \mfpicdebugtrue , \mfpicdebugfalse .) endobj 61 0 obj << /S /GoTo /D (subsection.2.9) >> endobj 64 0 obj -(draft, final, nowrite, \mfpicdraft , \mfpicfinal , \mfpicnowrite ) +(clearsymbols, \clearsymbols , \noclearsymbols .) endobj 65 0 obj << /S /GoTo /D (subsection.2.10) >> endobj 68 0 obj -(Option Scoping Rules) +(draft, final, nowrite, \mfpicdraft , \mfpicfinal , \mfpicnowrite .) endobj 69 0 obj -<< /S /GoTo /D (section.3) >> +<< /S /GoTo /D (subsection.2.11) >> endobj 72 0 obj -(The Macros.) +(mfpreadlog, \mfpreadlog .) endobj 73 0 obj -<< /S /GoTo /D (subsection.3.1) >> +<< /S /GoTo /D (subsection.2.12) >> endobj 76 0 obj -(Files and Environments.) +(Scoping Rules.) endobj 77 0 obj -<< /S /GoTo /D (subsection.3.2) >> +<< /S /GoTo /D (section.3) >> endobj 80 0 obj -(Figures.) +(Metafont Data Types.) endobj 81 0 obj -<< /S /GoTo /D (subsubsection.3.2.1) >> +<< /S /GoTo /D (subsection.3.1) >> endobj 84 0 obj -(Metafont Pairs.) +(Metafont numerics and pairs.) endobj 85 0 obj -<< /S /GoTo /D (subsubsection.3.2.2) >> +<< /S /GoTo /D (subsection.3.2) >> endobj 88 0 obj -(Points, Lines, and Rectangles.) +(Metapost colors.) endobj 89 0 obj -<< /S /GoTo /D (subsubsection.3.2.3) >> +<< /S /GoTo /D (subsection.3.3) >> endobj 92 0 obj -(A Word on List Arguments) +(Metafont paths, pictures and booleans.) endobj 93 0 obj -<< /S /GoTo /D (subsubsection.3.2.4) >> +<< /S /GoTo /D (section.4) >> endobj 96 0 obj -(Axes, Axis Marks, and Grids.) +(The Macros.) endobj 97 0 obj -<< /S /GoTo /D (subsubsection.3.2.5) >> +<< /S /GoTo /D (subsection.4.1) >> endobj 100 0 obj -(Circles and Ellipses.) +(Files and Environments.) endobj 101 0 obj -<< /S /GoTo /D (subsubsection.3.2.6) >> +<< /S /GoTo /D (subsection.4.2) >> endobj 104 0 obj -(Curves.) +(Common objects.) endobj 105 0 obj -<< /S /GoTo /D (subsubsection.3.2.7) >> +<< /S /GoTo /D (subsubsection.4.2.1) >> endobj 108 0 obj -(Circular Arcs.) +(Points, lines, and rectangles) endobj 109 0 obj -<< /S /GoTo /D (subsubsection.3.2.8) >> +<< /S /GoTo /D (subsubsection.4.2.2) >> endobj 112 0 obj -(Other Figures.) +(A word about list arguments) endobj 113 0 obj -<< /S /GoTo /D (subsubsection.3.2.9) >> +<< /S /GoTo /D (subsubsection.4.2.3) >> endobj 116 0 obj -(Bar Charts and Pie Charts.) +(Axes, axis marks, and grids) endobj 117 0 obj -<< /S /GoTo /D (subsubsection.3.2.10) >> +<< /S /GoTo /D (subsubsection.4.2.4) >> endobj 120 0 obj -(Polar Coordinates to Rectangular.) +(Circles, arcs and ellipses) endobj 121 0 obj -<< /S /GoTo /D (subsection.3.3) >> +<< /S /GoTo /D (subsubsection.4.2.5) >> endobj 124 0 obj -(Colors) +(Curves) endobj 125 0 obj -<< /S /GoTo /D (subsubsection.3.3.1) >> +<< /S /GoTo /D (subsubsection.4.2.6) >> endobj 128 0 obj -(Setting the Default Colors.) +(Bar charts and pie charts) endobj 129 0 obj -<< /S /GoTo /D (subsubsection.3.3.2) >> +<< /S /GoTo /D (subsection.4.3) >> endobj 132 0 obj -(Metapost Colors.) +(Colors.) endobj 133 0 obj -<< /S /GoTo /D (subsubsection.3.3.3) >> +<< /S /GoTo /D (subsubsection.4.3.1) >> endobj 136 0 obj -(Color Models.) +(Setting the default colors) endobj 137 0 obj -<< /S /GoTo /D (subsubsection.3.3.4) >> +<< /S /GoTo /D (subsubsection.4.3.2) >> endobj 140 0 obj -(Defining a Color Name.) +(Metapost colors) endobj 141 0 obj -<< /S /GoTo /D (subsubsection.3.3.5) >> +<< /S /GoTo /D (subsubsection.4.3.3) >> endobj 144 0 obj -(Color in Metafont) +(Color models) endobj 145 0 obj -<< /S /GoTo /D (subsection.3.4) >> +<< /S /GoTo /D (subsubsection.4.3.4) >> endobj 148 0 obj -(Shape-Modifier Macros.) +(Defining a color name) endobj 149 0 obj -<< /S /GoTo /D (subsubsection.3.4.1) >> +<< /S /GoTo /D (subsubsection.4.3.5) >> endobj 152 0 obj -(Closure of Paths.) +(Color in Metafont) endobj 153 0 obj -<< /S /GoTo /D (subsubsection.3.4.2) >> +<< /S /GoTo /D (subsection.4.4) >> endobj 156 0 obj -(Reversal, Connection and Subpaths.) +(Modifying the figures.) endobj 157 0 obj -<< /S /GoTo /D (subsubsection.3.4.3) >> +<< /S /GoTo /D (subsubsection.4.4.1) >> endobj 160 0 obj -(Arrows.) +(Closure of paths) endobj 161 0 obj -<< /S /GoTo /D (subsection.3.5) >> +<< /S /GoTo /D (subsubsection.4.4.2) >> endobj 164 0 obj -(Rendering macros) +(Reversal, connection and other path modifications) endobj 165 0 obj -<< /S /GoTo /D (subsubsection.3.5.1) >> +<< /S /GoTo /D (subsubsection.4.4.3) >> endobj 168 0 obj -(Drawing.) +(Arrows) endobj 169 0 obj -<< /S /GoTo /D (subsubsection.3.5.2) >> +<< /S /GoTo /D (subsection.4.5) >> endobj 172 0 obj -(Shading, Filling, Erasing, Clipping, Hatching.) +(Rendering figures.) endobj 173 0 obj -<< /S /GoTo /D (subsubsection.3.5.3) >> +<< /S /GoTo /D (subsubsection.4.5.1) >> endobj 176 0 obj -(Changing the Default Rendering.) +(Drawing) endobj 177 0 obj -<< /S /GoTo /D (subsubsection.3.5.4) >> +<< /S /GoTo /D (subsubsection.4.5.2) >> endobj 180 0 obj -(Examples.) +(Shading, filling, erasing, clipping, hatching) endobj 181 0 obj -<< /S /GoTo /D (subsection.3.6) >> +<< /S /GoTo /D (subsubsection.4.5.3) >> endobj 184 0 obj -(Functions and Plotting.) +(Changing the default rendering) endobj 185 0 obj -<< /S /GoTo /D (subsubsection.3.6.1) >> +<< /S /GoTo /D (subsubsection.4.5.4) >> endobj 188 0 obj -(Defining Functions) +(Examples) endobj 189 0 obj -<< /S /GoTo /D (subsubsection.3.6.2) >> +<< /S /GoTo /D (subsection.4.6) >> endobj 192 0 obj -(Plotting Functions) +(Functions and Plotting.) endobj 193 0 obj -<< /S /GoTo /D (subsubsection.3.6.3) >> +<< /S /GoTo /D (subsubsection.4.6.1) >> endobj 196 0 obj -(Plotting external data files) +(Defining functions) endobj 197 0 obj -<< /S /GoTo /D (subsection.3.7) >> +<< /S /GoTo /D (subsubsection.4.6.2) >> endobj 200 0 obj -(Labels and Captions.) +(Plotting functions) endobj 201 0 obj -<< /S /GoTo /D (subsubsection.3.7.1) >> +<< /S /GoTo /D (subsubsection.4.6.3) >> endobj 204 0 obj -(Setting Text.) +(Plotting external data files) endobj 205 0 obj -<< /S /GoTo /D (subsubsection.3.7.2) >> +<< /S /GoTo /D (subsection.4.7) >> endobj 208 0 obj -(Curves surrounding text) +(Labels and Captions.) endobj 209 0 obj -<< /S /GoTo /D (subsection.3.8) >> +<< /S /GoTo /D (subsubsection.4.7.1) >> endobj 212 0 obj -(Saving and Reusing an mfpic Picture.) +(Setting text) endobj 213 0 obj -<< /S /GoTo /D (subsection.3.9) >> +<< /S /GoTo /D (subsubsection.4.7.2) >> endobj 216 0 obj -(Picture frames.) +(Curves surrounding text) endobj 217 0 obj -<< /S /GoTo /D (subsection.3.10) >> +<< /S /GoTo /D (subsection.4.8) >> endobj 220 0 obj -(Affine Transforms.) +(Saving and Reusing an mfpic Picture.) endobj 221 0 obj -<< /S /GoTo /D (subsubsection.3.10.1) >> +<< /S /GoTo /D (subsection.4.9) >> endobj 224 0 obj -(Affine Transforms of the Metafont Coordinate System.) +(Picture Frames.) endobj 225 0 obj -<< /S /GoTo /D (subsubsection.3.10.2) >> +<< /S /GoTo /D (subsection.4.10) >> endobj 228 0 obj -(Transformation of Paths.) +(Affine Transforms.) endobj 229 0 obj -<< /S /GoTo /D (subsection.3.11) >> +<< /S /GoTo /D (subsubsection.4.10.1) >> endobj 232 0 obj -(Parameters.) +(Transforming the Metafont coordinate system) endobj 233 0 obj -<< /S /GoTo /D (subsection.3.12) >> +<< /S /GoTo /D (subsubsection.4.10.2) >> endobj 236 0 obj -(For Advanced Users.) +(Transforming paths) endobj 237 0 obj -<< /S /GoTo /D (subsubsection.3.12.1) >> +<< /S /GoTo /D (subsection.4.11) >> endobj 240 0 obj -(Power Users.) +(Parameters.) endobj 241 0 obj -<< /S /GoTo /D (subsubsection.3.12.2) >> +<< /S /GoTo /D (subsection.4.12) >> endobj 244 0 obj -(Hackers.) +(For Advanced Users.) endobj 245 0 obj -<< /S /GoTo /D (section.4) >> +<< /S /GoTo /D (subsubsection.4.12.1) >> endobj 248 0 obj -(Appendices) +(Splines) endobj 249 0 obj -<< /S /GoTo /D (subsection.4.1) >> +<< /S /GoTo /D (subsubsection.4.12.2) >> endobj 252 0 obj -(Acknowledgements.) +(B\351ziers) endobj 253 0 obj -<< /S /GoTo /D (subsection.4.2) >> +<< /S /GoTo /D (subsubsection.4.12.3) >> endobj 256 0 obj -(Changes History.) +(Raw Metafont code) endobj 257 0 obj -<< /S /GoTo /D (subsection.4.3) >> +<< /S /GoTo /D (subsubsection.4.12.4) >> endobj 260 0 obj -(Summary of Options) +(Creating Metafont variables) endobj 261 0 obj -<< /S /GoTo /D (subsection.4.4) >> +<< /S /GoTo /D (subsubsection.4.12.5) >> endobj 264 0 obj -(Plotting styles for \plotdata ) +(Miscelaneous pair expressions) endobj 265 0 obj -<< /S /GoTo /D (subsection.4.5) >> +<< /S /GoTo /D (subsubsection.4.12.6) >> endobj 268 0 obj -(Special considerations when using Metafont) +(Manipulating Metafont picture variables) endobj 269 0 obj -<< /S /GoTo /D (subsection.4.6) >> +<< /S /GoTo /D (subsubsection.4.12.7) >> endobj 272 0 obj -(Special considerations when using Metapost) +(Metafont loops) endobj 273 0 obj -<< /S /GoTo /D (subsubsection.4.6.1) >> +<< /S /GoTo /D (subsubsection.4.12.8) >> endobj 276 0 obj -(Required support) +(Miscellaneous) endobj 277 0 obj -<< /S /GoTo /D (subsubsection.4.6.2) >> +<< /S /GoTo /D (section.5) >> endobj 280 0 obj -(Metapost is not Metafont) +(Appendices) endobj 281 0 obj -<< /S /GoTo /D (subsubsection.4.6.3) >> +<< /S /GoTo /D (subsection.5.1) >> endobj 284 0 obj -(Graphic inclusion) +(Acknowledgements.) endobj 285 0 obj -<< /S /GoTo /D (subsection.4.7) >> +<< /S /GoTo /D (subsection.5.2) >> endobj 288 0 obj -(Mfpic and the rest of the world) +(Changes History.) endobj 289 0 obj -<< /S /GoTo /D (subsubsection.4.7.1) >> +<< /S /GoTo /D (subsection.5.3) >> endobj 292 0 obj -(The literature) +(Summary of Options.) endobj 293 0 obj -<< /S /GoTo /D (subsubsection.4.7.2) >> +<< /S /GoTo /D (subsection.5.4) >> endobj 296 0 obj -(Other programs) +(Plotting Styles for \plotdata .) endobj 297 0 obj -<< /S /GoTo /D (subsection.4.8) >> +<< /S /GoTo /D (subsection.5.5) >> endobj 300 0 obj -(Index of commands, options and parameters by page) +(Special Considerations When Using Metafont.) endobj 301 0 obj -<< /S /GoTo /D (subsection.4.9) >> +<< /S /GoTo /D (subsection.5.6) >> endobj 304 0 obj -(List of commands by type) +(Special Considerations When Using Metapost.) endobj 305 0 obj -<< /S /GoTo /D (subsubsection.4.9.1) >> +<< /S /GoTo /D (subsubsection.5.6.1) >> endobj 308 0 obj -(Figures) +(Required support) endobj 309 0 obj -<< /S /GoTo /D (subsubsection.4.9.2) >> +<< /S /GoTo /D (subsubsection.5.6.2) >> endobj 312 0 obj -(Figure modifiers) +(Metapost is not Metafont) endobj 313 0 obj -<< /S /GoTo /D (subsubsection.4.9.3) >> +<< /S /GoTo /D (subsubsection.5.6.3) >> endobj 316 0 obj -(Figure renderers) +(Graphic inclusion) endobj 317 0 obj -<< /S /GoTo /D (subsubsection.4.9.4) >> +<< /S /GoTo /D (subsection.5.7) >> endobj 320 0 obj -(Lengths) +(Mfpic and the Rest of the World.) endobj 321 0 obj -<< /S /GoTo /D (subsubsection.4.9.5) >> +<< /S /GoTo /D (subsubsection.5.7.1) >> endobj 324 0 obj -(Coordinate transformation) +(The literature) endobj 325 0 obj -<< /S /GoTo /D (subsubsection.4.9.6) >> +<< /S /GoTo /D (subsubsection.5.7.2) >> endobj 328 0 obj -(Axes, grids, and marks) +(Other programs) endobj 329 0 obj -<< /S /GoTo /D (subsubsection.4.9.7) >> +<< /S /GoTo /D (subsection.5.8) >> endobj 332 0 obj -(Setting options) +(Index of commands, options and parameters.) endobj 333 0 obj -<< /S /GoTo /D (subsubsection.4.9.8) >> +<< /S /GoTo /D (subsection.5.9) >> endobj 336 0 obj -(Changing values) +(List of commands by type.) endobj 337 0 obj -<< /S /GoTo /D (subsubsection.4.9.9) >> +<< /S /GoTo /D (subsubsection.5.9.1) >> endobj 340 0 obj -(Changing colors) +(Figure macros) endobj 341 0 obj -<< /S /GoTo /D (subsubsection.4.9.10) >> +<< /S /GoTo /D (subsubsection.5.9.2) >> endobj 344 0 obj -(Defining arrays) +(Macros that render) endobj 345 0 obj -<< /S /GoTo /D (subsubsection.4.9.11) >> +<< /S /GoTo /D (subsubsection.5.9.3) >> endobj 348 0 obj -(Changing behavior) +(Macros that append \(arrows\)) endobj 349 0 obj -<< /S /GoTo /D (subsubsection.4.9.12) >> +<< /S /GoTo /D (subsubsection.5.9.4) >> endobj 352 0 obj -(Files and environments) +(Macros that modify) endobj 353 0 obj -<< /S /GoTo /D (subsubsection.4.9.13) >> +<< /S /GoTo /D (subsubsection.5.9.5) >> endobj 356 0 obj -(Text) +(Lengths) endobj 357 0 obj -<< /S /GoTo /D (subsubsection.4.9.14) >> +<< /S /GoTo /D (subsubsection.5.9.6) >> endobj 360 0 obj -(Misc) +(Coordinate transformation) endobj 361 0 obj -<< /S /GoTo /D [362 0 R /FitH ] >> +<< /S /GoTo /D (subsubsection.5.9.7) >> +endobj +364 0 obj +(Symbols, axes, grids, marks) +endobj +365 0 obj +<< /S /GoTo /D (subsubsection.5.9.8) >> +endobj +368 0 obj +(Symbol names) +endobj +369 0 obj +<< /S /GoTo /D (subsubsection.5.9.9) >> +endobj +372 0 obj +(Setting options) +endobj +373 0 obj +<< /S /GoTo /D (subsubsection.5.9.10) >> +endobj +376 0 obj +(Setting values) +endobj +377 0 obj +<< /S /GoTo /D (subsubsection.5.9.11) >> +endobj +380 0 obj +(Changing colors) +endobj +381 0 obj +<< /S /GoTo /D (subsubsection.5.9.12) >> +endobj +384 0 obj +(Defining arrays) +endobj +385 0 obj +<< /S /GoTo /D (subsubsection.5.9.13) >> +endobj +388 0 obj +(Changing behavior) +endobj +389 0 obj +<< /S /GoTo /D (subsubsection.5.9.14) >> +endobj +392 0 obj +(Files and environments) +endobj +393 0 obj +<< /S /GoTo /D (subsubsection.5.9.15) >> +endobj +396 0 obj +(Text) endobj -364 0 obj << -/Length 2177 +397 0 obj +<< /S /GoTo /D (subsubsection.5.9.16) >> +endobj +400 0 obj +(Misc) +endobj +401 0 obj +<< /S /GoTo /D [402 0 R /XYZ null null null ] >> +endobj +404 0 obj << +/Length 3237 /Filter /FlateDecode >> stream -xÚí\[sÛ¶~÷¯à£4S!XÜq^ÚÔµÝvÚŸT3íLOh™¶9‘IŠŠ“àÅ/ÖűbÇžÌX” -·”PÊð¹§pÂ#†»CŒe®ÎÓƒ7ÇÚ *˜^øºÓó¿G¿ÿ™þZ”Z»2àøe…ãñDÁèÿ²Ñ/þïáÝ+µ8¦ˆV¾ò¯ñ„I::gù2‹Å·8)>§îí@"© -&œ0füKGþwE¬fÁݯù_'À-Ê7ø€s™/ºó«BäïQ^¤I^|“ó»ŸOÓEÞ¡•Òuw‚s«]ûŒàåý”•¼J¯Ã²ÓG¤øü- -ó«lyߘV£“(½39ºÈ¢1ÈÑçjd†ŽÒ3¨oÐÐÀ«ŠéÁ~sa7_¾±ÿRÊ{úÅ4aÀƒI]ï§0‰£y!ÿçª3Ëhö!N.ë÷ëf¬ ŠÉF+Œªº–ÅZÜ,#Ì?z¦¬¯Ê°Co -ý+€ƒÂ²²ðž†Ú=ç—.‰¹º§ãÍé¬åßuTПWcÅ÷mùB…óÙÛeC€›F‡û@õKœ˜GúÖ>r÷Ñšhñ-VgzXo=k…‘„JSBDn
VC$íǦbÔØW||óøà5>¼4ô ú[–Ä åzÈW -"<ÌuÌ·!Âè
1$wÇÚCb
†ò9Ëèltt–: -\ªWØûQÀ(pR®/nâYa£ÄP»
V„̲4¨Šb´’ßZÓ6Ô#IWOgj΢$²è|ñGå1„mIÙ× -H–ÌæHFøõ]Q‚µ„L£%’}I³ÖNncŒ&à)ª_¯Qÿ9ú0FGËË®Š˜ÀðJo®woPÞòÒyžê£±‹¼‹p¾ˆ:êÆ€8rcT°'nt:F=<å‚HíDf¯ŠÂlñùú,íeÐn/jGs¿4¥p(l+»Ñ’·"¦‰ó¦¾é'Ç…Ú°ÁhØJûø°ÙžFÛu¶'sô9¼èI&F¶£ò†œ-SÊ’pÞ#D!Y÷©ÚH|\x[û8ï1_~w~‡U˜¯¬wxRc·´„qï w•¤·Y9Æ•Å`pˆbpŠÇ[ž «€sµ{5…@±Ë²ÊÖüÌÒ·¿ï¿¼_ΣnjÈa|05$ä‹O󷱈¸–ôqÌÚƒÒõ¼L×O¯¢òØJ8+>tS÷Èœ…àǤ6kR÷æ§îy}èá8žWG}ê8GÉXÐÑÇ8K“kVzü
X¢äË6Š½&Ý·Kº›ý™/^Ÿg8Ž/ÝQ¯îf“$̲!:d5ÝŽ|è>$-Nûmx˜¶ßwU†Nr¤Ú€ŒggtxëÀ˜l3Ô¨uO$€S‘©#°p:æ0zëÏûÞùç—…ª"\”\¥ÒOß -㬋A ¸ì ‰¡ÏzåÁ¶i(´7™ž|œyaØíÓ4F÷ñ]yþ1N¢ê¹v5ï£z—<L.ç=f$ö@ÛA;ÄØó·CL5N yªv—Š}[hïOt6+uYñàßâEy¦÷gD—KdNË]>ŒR˜ÁR¡¿õ„1XCÛ”" -1õyæ"ÄÈqš”wÊ©£žîá,ÊCR_´Æ¾£wS™™bFÜf´®Z›»f¸?*<A>ƒñˆ«uB¦îêöó0ÏÒ³ˆDçK.ëîÝ5P¾©ˆåкd}Ÿüyyiû‡e˜}pÒ»÷¦ËYfh‰™éWæ„ãðdïÿ +xÚíœY“ã¶ÇßçSðQªòÀ8 "/‰³ÞõQq¼±§*©²ýÀÑpfkD…’öøöi<D£Ö›Œ×µU«cZÆ?4 +F¨²Û÷ÜSIä”h©pƒ§‘w4ÖQm*xÂèÒZt‹ã è?€<H¤z$‘V;Jc‰”t)˜´ Úà\z¥è°,wS.5#Ežõ>##‚³@‹m™ì‹ýÉs‘L·@Odº FnÒ<¦‹9Ä1?GirR‰òØÚx e +g¤>=ÎH}ÆŽl}ò(ΘrâÌ5Pu$‹³<‚ó®ÙCâ®n}&¯-×ï¢Y\B;Ÿ•ÅÁ3¸ß},žvv<‹çŒgá¢YÜÚ êvY| î³Ê∠+Ù÷¼Áà¸S“%Lª¿@? ZÙ@Õ)Á•^ +Ftq ü‡ «#kä(M*RÒ…—2…Y¥@A
&žS}„Ó¦|xèZ:Á¥_ò3fÚÀåÛ@°°SçÌÞ×õ1—EN„NO·MI£Èzý"×ð¼ ¦±„ÞT1Ôø7ΫHÀ¬XÀ‡nlÀ:†*¦Ëe9Uh›Ïð›“gµ8Âê]u„î"Û"$)¤:'7 +µ7ñL›£åªœÃÊ°Ù¾ +kÄÔÕ}ÖĹ*˨·<‡ª‹3'ϘC×]ÒpCôvÓ@¯Ý´5‚ ¦¯P°ð©Ì@ßvŠétÕz¤ÓU¹I(x!Ï°¾ù‘,lÂmz,M7¥Ý|÷>rÖù¦¦?›º:@z³UÄ—&¹â§ùZ»k/omlË]$? +ðŸ3Oö¿)c•<¸hr²³ûåº\}(gëúmèAçŸ
íÃ`2àbJt°Aá‘0&jàù€³",¼®Ãa᥻RÒ¥}N +räjK0 =îèÐ{¿ºäfÖT®³Üæ«:2S’ÊÝ[<&ðyu†_äJù)wWÝÈýP¦ÜiIÚÛ¡I>…»¡ˆj=àiÕFn¬jEït1—Ò-ìÚîȈlß´Ptöã¢ÞؽØnôûU5ÝëÀiN 7(d +U°A#銻4ŒäÝm“‘¸'‘xì(Í RR¿±¦8ec
Œ8D dcMk`ƒ‘ä#ÓŽýCæ,î²á üõ¥{Ââf.Øì÷€Å+÷ÿ÷îë¿»÷7ý–ü^XÊ6qYîÊvÏ¿–³÷›ò\@é2TmŠ|°Áëß5È@“ÚÞÃvsœØëæÉ^ßÚ8íýÆx"*N+Ζù€½¡ÊëýSÕ,Ûу&›rÙDäÖ`<¨ÿTî`ƒÖšœ@v=¨õsÝÝ—H˜F]ŠÀ4;ŠiSVÒ…ã/É9þ Gkã‰åûz@ì)b¼cí%õE½ªclBXœ³lz$x´~V;ô°zŸÌÆÓˈ¦=ˈ¦cGi–‘’.¼+Àµ ¹Æ—gY|´ì»)wÛÏBÊ=x¶°ËÄ·u½ªÊÈÖV»u@ •
êÝ^`mPÚíCžÇöI(Õ˜ +F¶<ëœH;¶öD +ñ6x.ƒHXò9Anh5ÅÉݲ7OwË`ã$èž|µ\MzÉËõ\ÒÙ›eS¯Ÿìó›ÓáAB×5QN‡‡`ƒÆf·)KÈ>ÃØ~Cª³!úõ
Ñoì(•ëlHQ—Îk¸&…Äo·6ºö¡ÀõÓSž÷®oÿ]-bŒ1X\«ÞC”±`ƒ†bç)*/BùÔ~Iñ‡hÛó‡h;väøQþ¢„²÷Ãù©üIE +e“>¬¡‹"‘ô‚Qkøsiƒ$¯ë%$¶0YX-×Uû¾K‚
PYÎÙlý`äd£V£<Ë!D6jy4N»Üà…>ˆóïÐ +4 ªôX!ªŒ9¬d+¤¨K±¢Â!blZ¬xÀêÏÎÛ9ƒÄÖ’ÊÛz¿kIÛ¶§P¸ÇÃþÉnÚœ‘Àí9Ldƒh¦„4䎰AÈÏŸ0D•ž0D•±#GXtkVÔ…„1æO\MK˜h {gÏïèÓÕ»e˜½=•Í¯“$öàîBÞEò—&š©lI$y4Ü–®a¸Ïž.L•Ž.L•±£4]XQ—ÒUPB9ž¿Z›–.èz±l«®fr)³Z–€ÔfíÞÑûŽ_Ïô6híõÌa¿›ë™D£ž0D£±#@O”0¤(·Êº®l©=hɸú®~ú…fw`òí%oá=%̘°RíwþóêêÇ«Œèöàyð´~{È®”„T”Ã0ªåè~ˆßji7þYÈÁ‘Sþb'›9Õ¹µP·÷WÞ¸œÙl—õ:œ='éÎ}R¾“ÚÓœ +B)¨9QáÒÅÁ¹OÝ•+Æ0n‡¦?éhc‡ü÷~'„+ºÿ™óÜ›úÓIçBõÁ„R "Åè\({='Z«Q0^½Upù—= ¤ºÛOâÏ
a”õ§q ÁÜšl¿^.J¿ëÕ}ç‹z˜+Hwà »f1Š0ºÛXý…;¼u¸€6o÷ÀlëýêΗx[ù×meë²ïvµ}¥³Ýã2DUîwu3WÊv3ûÅëp¦•ý +endstream endobj -362 0 obj << +402 0 obj << /Type /Page -/Contents 364 0 R -/Resources 363 0 R +/Contents 404 0 R +/Resources 403 0 R /MediaBox [0 0 612 792] -/Parent 410 0 R -/Annots [ 375 0 R 376 0 R 377 0 R 378 0 R 379 0 R 380 0 R 381 0 R 387 0 R 388 0 R 389 0 R 390 0 R 391 0 R 392 0 R 393 0 R 394 0 R 395 0 R 396 0 R 397 0 R 398 0 R 399 0 R 400 0 R 401 0 R 402 0 R 403 0 R 404 0 R 405 0 R 406 0 R 407 0 R 408 0 R 409 0 R ] +/Parent 452 0 R +/Annots [ 417 0 R 418 0 R 419 0 R 420 0 R 421 0 R 422 0 R 423 0 R 430 0 R 431 0 R 432 0 R 433 0 R 434 0 R 435 0 R 436 0 R 437 0 R 438 0 R 439 0 R 440 0 R 441 0 R 442 0 R 443 0 R 444 0 R 445 0 R 446 0 R 447 0 R 448 0 R 449 0 R 450 0 R 451 0 R ] >> endobj -375 0 obj << +417 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [110.002 540.517 181.006 549.513] +/Rect [107.004 543.539 178.007 552.516] /Subtype /Link /A << /S /GoTo /D (section.1) >> >> endobj -376 0 obj << +418 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 526.544 173.594 537.488] +/Rect [121.948 529.547 170.595 540.451] /Subtype /Link /A << /S /GoTo /D (subsection.1.1) >> >> endobj -377 0 obj << +419 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 516.631 173.644 525.533] +/Rect [121.948 519.649 170.645 528.496] /Subtype /Link /A << /S /GoTo /D (subsection.1.2) >> >> endobj -378 0 obj << +420 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 504.651 175.855 513.578] +/Rect [121.948 507.694 172.857 516.54] /Subtype /Link /A << /S /GoTo /D (subsection.1.3) >> >> endobj -379 0 obj << +421 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 492.696 173.395 501.623] +/Rect [121.948 495.739 170.396 504.585] /Subtype /Link /A << /S /GoTo /D (subsection.1.4) >> >> endobj -380 0 obj << +422 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [110.002 468.891 163.202 479.775] +/Rect [107.004 471.898 160.204 482.777] /Subtype /Link /A << /S /GoTo /D (section.2) >> >> endobj -381 0 obj << +423 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 457.093 252.683 467.75] +/Rect [121.948 460.029 253.839 470.712] /Subtype /Link /A << /S /GoTo /D (subsection.2.1) >> >> endobj -387 0 obj << +430 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 445.138 312.551 455.794] +/Rect [121.948 448.073 312.442 459.196] /Subtype /Link /A << /S /GoTo /D (subsection.2.2) >> >> endobj -388 0 obj << +431 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 433.134 364.068 443.839] +/Rect [121.948 436.118 363.835 447.241] /Subtype /Link /A << /S /GoTo /D (subsection.2.3) >> >> endobj -389 0 obj << +432 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 421.693 311.34 431.884] +/Rect [121.948 424.66 312.608 435.286] /Subtype /Link /A << /S /GoTo /D (subsection.2.4) >> >> endobj -390 0 obj << +433 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 409.273 285.045 419.929] +/Rect [121.948 412.208 285.421 423.331] /Subtype /Link /A << /S /GoTo /D (subsection.2.5) >> >> endobj -391 0 obj << +434 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 397.317 426.249 407.974] +/Rect [121.948 400.253 426.745 411.375] /Subtype /Link /A << /S /GoTo /D (subsection.2.6) >> >> endobj -392 0 obj << +435 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 385.237 342.071 396.019] +/Rect [121.948 388.298 399.144 399.42] /Subtype /Link /A << /S /GoTo /D (subsection.2.7) >> >> endobj -393 0 obj << +436 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 373.358 354.391 384.063] +/Rect [121.948 376.342 341.663 387.465] /Subtype /Link /A << /S /GoTo /D (subsection.2.8) >> >> endobj -394 0 obj << +437 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 361.787 415.786 372.108] +/Rect [121.948 364.387 353.645 375.51] /Subtype /Link /A << /S /GoTo /D (subsection.2.9) >> >> endobj -395 0 obj << +438 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 349.209 237.862 360.153] +/Rect [121.948 352.734 420.175 363.555] /Subtype /Link /A << /S /GoTo /D (subsection.2.10) >> >> endobj -396 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [110.002 329.309 180.438 338.305] -/Subtype /Link -/A << /S /GoTo /D (section.3) >> ->> endobj -397 0 obj << +439 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 317.354 246.589 326.28] +/Rect [121.948 340.477 256.145 351.6] /Subtype /Link -/A << /S /GoTo /D (subsection.3.1) >> +/A << /S /GoTo /D (subsection.2.11) >> >> endobj -398 0 obj << +440 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 303.381 182.231 314.325] +/Rect [121.948 328.302 207.187 339.205] /Subtype /Link -/A << /S /GoTo /D (subsection.3.2) >> +/A << /S /GoTo /D (subsection.2.12) >> >> endobj -399 0 obj << +441 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 293.443 254.848 302.37] +/Rect [107.004 306.518 224.97 317.397] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.2.1) >> +/A << /S /GoTo /D (section.3) >> >> endobj -400 0 obj << +442 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 279.471 301.832 290.415] +/Rect [121.948 294.429 275.45 305.333] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.2.2) >> +/A << /S /GoTo /D (subsection.3.1) >> >> endobj -401 0 obj << +443 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 267.516 290.335 278.459] +/Rect [121.948 284.411 223.217 293.377] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.2.3) >> +/A << /S /GoTo /D (subsection.3.2) >> >> endobj -402 0 obj << +444 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 256.313 300.288 266.504] +/Rect [121.948 270.518 312.531 281.422] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.2.4) >> +/A << /S /GoTo /D (subsection.3.3) >> >> endobj -403 0 obj << +445 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 243.605 263.366 254.549] +/Rect [107.004 250.638 177.439 259.614] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.2.5) >> +/A << /S /GoTo /D (section.4) >> >> endobj -404 0 obj << +446 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 233.668 212.299 242.594] +/Rect [121.948 238.703 243.591 247.549] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.2.6) >> +/A << /S /GoTo /D (subsection.4.1) >> >> endobj -405 0 obj << +447 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 221.712 238.171 230.639] +/Rect [121.948 224.69 217.15 235.594] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.2.7) >> +/A << /S /GoTo /D (subsection.4.2) >> >> endobj -406 0 obj << +448 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 207.74 239.287 218.684] +/Rect [144.862 212.735 289.697 223.639] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.2.8) >> +/A << /S /GoTo /D (subsubsection.4.2.1) >> >> endobj -407 0 obj << +449 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 197.722 287.715 206.728] +/Rect [144.862 200.78 291.909 211.684] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.2.9) >> +/A << /S /GoTo /D (subsubsection.4.2.2) >> >> endobj -408 0 obj << +450 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 183.829 316.218 194.773] +/Rect [144.862 188.825 288.711 199.729] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.2.10) >> +/A << /S /GoTo /D (subsubsection.4.2.3) >> >> endobj -409 0 obj << +451 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 173.892 176.423 182.818] +/Rect [144.862 176.869 277.234 187.773] /Subtype /Link -/A << /S /GoTo /D (subsection.3.3) >> +/A << /S /GoTo /D (subsubsection.4.2.4) >> >> endobj -365 0 obj << -/D [362 0 R /XYZ 110.999 687.904 null] +405 0 obj << +/D [402 0 R /XYZ 108 690.907 null] >> endobj -366 0 obj << -/D [362 0 R /XYZ 110.999 662.997 null] +406 0 obj << +/D [402 0 R /XYZ 108 666 null] >> endobj -374 0 obj << -/D [362 0 R /XYZ 110.999 558.866 null] +416 0 obj << +/D [402 0 R /XYZ 108 561.946 null] >> endobj -363 0 obj << -/Font << /F78 368 0 R /F80 371 0 R /F85 373 0 R /F87 383 0 R /F88 386 0 R >> +403 0 obj << +/Font << /F94 409 0 R /F95 412 0 R /F105 415 0 R /F90 426 0 R /F107 429 0 R >> /ProcSet [ /PDF /Text ] >> endobj -413 0 obj << -/Length 2124 +455 0 obj << +/Length 3413 /Filter /FlateDecode >> stream -xÚí\[SÛF}çWøQž)Û½_)¤&a€>5}PlšÈ’+Ë¡ù÷ýV7_¤
¶J -ïý‹²Gq‚¸®xV²•Qï$ß¼ÈÌ©|UPƒ-ZM=`rÉÛï!‰å¡ÇðbêPª!´êÈÔa¥‰È‘-ÌÀûdDMÁVqîÀØ ©éK3Ýça!wEœôk,x‰ø›àÆ4®ý‚_:>ø³ -J/±é -ß½=˜Ú• Î_E|ÖR ®èÓÐà@Ã.jþ&õQ¿*4MïMœ:5žš -GØ]žÓ˜<G߸IÛ¹â¢úų*¬ýçÏæQÐǃˆ˜¹&æj°Áhƒõ^è籘éŽË2;_Æy -µ(s¨*ºˆ’¼×Ò:ÀŒ WZͱÊêÝÊêºÏÙ/WAØVY}ňFAE#Á©+CTM³Ÿë*ÞªfõƒHÛ„›;&lhéiÖŠt`Ó¬ÿ² ý¨ødêg¶Ægg?8ÿ¦‚Bæɾ#ÓæÅ%`)(îî½÷ÇY•ÞûOÿsm»îSžÏê–Š¸DJ'¤xÈ©·çºÀ+¿ö0È¢÷àT»Zêz¬êùÞ”DP$ˆ+å"CQíÇáßÁÔ^ýt™Í‘Ò,–iš,ãé*E/ùЦ‹ÐÚåæ%tmO^õiéuÕööÇ{_Wâ—ÊÚ_ËÅÚ§
Á! -å@®çµ–Žx¿çÛ§MD9’²ò¼‹p’-Ó ¥›‡V®”€Ó ³Ü¾eÍÕ»j$˜î“,¦$K WÁ‰›ÔŸµÔvìmPåšû†Ê¡Ýöèí6fúdÁ0h ÀÉí¶æI~PÅLx©/n’tÖ¤¾R58Ê~®hA?
Œ¶¡¢ÂSaS[c+û
wÂbÜ|O€GJ³¹¡á`¸FšÊZ§¤¯øY9¬«o‹,˜µTT1R£E‘bOÎÌí¹)¢ÐeÐiúÄþJ/ÓPµÊç<qâ\H¡ž™`¦§‘÷Z
¤0ôÖÝgAË¢i ùsfÿÒ¼Þº}wVh›@íÌ -Ö++hÁŠsËŠJQ}2ýj=€O‚2økÑÆ[*ÒÆM9”Š*ð^[÷„VÀE¡¼«dÓíàkŽ” ®ŸÁtÀþYa_ÆïüÉ+Ðhõ
WãcÐ!|¸Ó¿kQ@н`0˜Ž)€èï@‹²Ù’€üí¼ŸÏƒxNšÍÉà<‡ÎƒH„×Ë8mß"•ÏcÃE»ñ¶PýÛZÆÉäK\(˜Þ³ ÎÚÜGÔUɤÀ_=¤¬¦¬‚÷¼Ò‹~.5«êÚïÂE–¤ßÆR4oÄĹ³œE”Ø#0ÞŸT©X7—À—³™ðo$¯çƒDÜYÂÂj°…0ýƒjéߦ¦a‘}‹*ËpùM^`Òk0æÍ^åa|ç纇m²p—–®èÇðý4ôÓ5Ê© ú¤Bµ„äjLÂJË2NƒÔ_2Þ‰w”•®¢CÖ(eBÔCòjâþ¥ÌÍÒ-¬Pç‹äÏž/5¦ƒ@†î*p²OüåNøsãÝ?økà_¹À‡èÂÕeÀ‹gÒCßæ€`ˆ™]†Š…ë|Mºzü»Óª’µXÎçIšµVÚ)[ÕDë€÷[Ü7Üû¾-èéë~[PX:8É_Ea$Xþâ xÌ•¨H$劉CÈ%;«Ì¾Mýù]8©^<2‰Ào$qÓ˜Pds¿8JÆdOc¢ûŒrá¬j3%ÌJ#«lá|Í~¸Ráüe)öŒZU/‡KƒEÖì§WÁ)|šFÓ¦u€,L¹…÷tPäµQÈôéVºÛë -Ï(Ìlôi%WÛ0¨SWïêë=#_)n?ÂT.[hó4¹MýYóýà\\oŸáˆóáísÝ–ÉIÜ©y‘¢cÝæµËC6.ð?ÊOïendstream +xÚíßsÛ6ÇßóWðQš©qÄ/’xLÝä~Ì¥Éľ§ë=°2kN–<”Ü6ýë +¦_Ru"ööKf_|ŽÇ-$©¤»,HÎcWÚ£nP^ÈË¿aD./(ËóÅåcûÓ’ÊE³ûÊrýIʳHûÄ_/]`T’\•ÈòBjë¿õ_B©ßKõoò×(ÄB‰."(Ä^†x¬È„˜ñ$}ÀTO¥DIùdü„6^1ŒŸ“ñø¿oëvyÁd¾XÝÕíao_×ÛûâaÝ„w—tq˜BZú«ô'!u2ÐQV1Â8ú‡€ñ; {Œ2£@ˆÑXQG™HRLñŠ’\O¥Œ1¢„ÐŽqF(;’䜗±”qÍX®á¹Ümví~Z +¢¨Ê"ÅÓ©ÅÉ`ëeIJ–ÈúsEçÏKà·à¿…±¢Î" '057²\W'R “qpêRàUs8¬·_l¢;ܹŒwÓÜ.©N…›ƒK»Î€äi +,‰ä<‹|H¤@+íS`äèKK F2£±"@05—2SÇÒuž“ñ”1C“‹Q½«k13JD%\©úÎÕµœ.Þv…î§î]¡kË`¯¡7Êõ+_쮺,;SRRÐ,ò|ʦ£cÒXŽîE%Õc¼‚¸^AàÆŠ +8dj\ñdàÌò;/0pNÆ'pß5?ä9Ûö3qÝO»žÃm}ßL(, +"õ7"²<¥ÐÉ@÷XiVütàÞ3§ðb T1ª±"€057§•ºH’#æd<bršÓÖÛÉ|\è4¤Q·³é‡¾çÍÊlñ¾›‰CsŠÙYy8ã*RÊ,ò31ãv"p,L»##yYð” \J¯±" +·6þ°»Yß~.?L.üòØ6Óe3ã’0ý½‰l&æ]+cB¯«¡cg8á‚0ð@ÇŠ:ðª$xÀÔÜl(*"ĉlèdxýº÷r³ÛkÂ,o»[×ñ«wÓROp’ë…idmŠœ“.1ɈÐ_¯Ø¥—ˆÜ1Ö@ük ~cEk*É05—5^èë‰âÎÉxÖ˜cís³Ôk`»ÑÑîëÍ7¾¸Ûn›Õa½ÛúÆó’.\ïy§sa ì—"k“WµùÐT^–„R•E®NGïdàxxUè¤ãùcQ#¨€Œ™ð<‰ + +ÖLT˜ ’ŸHKNÆ£âžoÛvg`ù9±!V^”Y¤=±!fe ~C,váuCl€qÀ„x¬¨Ã&ñ¦†åXñärŒ2"K‰Ë1'cñ“®ûÜloš¶/Ç@FÍ"SSô‡idQ
ü9·Í‹c‚ØAlÇŠ:“»²ÈÔܘçäTïÍŠ8ûÂ컶6åÏà vº€ý'ÓÔYä@Ÿ +VüF¢TÊ1W¸Šÿýãve{ ãoŸ6»îXH¢ÿZéRQõêÒýW+s í¿Æ~_ÿ…1PÂ8V¨¦ææ:‘“J³s“qÜ…2´áyÛ“8ÙQb„₱Ė’•ùS±GçÐwEŒÀÆ€©¹Œ±ŠT•ÂŒ9Ϙ¯è};E˜¨l‰L%ü•+Ñ?¾ÁûsF
~¿ +iNÆòUº"íŸõæÚ°B»¬ºd6И"eγÈÞ%'ò'Ób§ÎödŠf`Ds¬¨û§ÀÔÌÜÆ'9ùÍË8öŽw¹m +'L–Yd(•Þ0žƒØ™³Y AÅ´GÅt¬è8zÈÔÌC‘]¶,*Œž“ñè±éÓ}ûǶÝ=noNãXrRò 8ýP‚•ú‡b_ØC (F/£±"#™ÜkG¦fΪ¼P„RgU/cñªÜ¬zU/Y¾ø)œ¸õ3ëçæqýtrR’šN›œ”|ßýù©;ù÷îõåôq]²Œ»Ï}Z¯m3½•"œÓ,×”\'ïÛÁñàŸo?…#@ +Â1VÔAšÜ‘G¦æB*õt*qÎËXH•ƒÔabY|ßÖ÷©Íø¼":qg‘•ÄÁ+]ñû¢±+¯£Aˆ† ÄcE†É25C=ݲüD®t2Cšë€hòÞÞš3I]Ãαx½ärÑÖÛýí®½O-Bh—ì"“‰zÐÊ@¿|=¹uöõ ˆi€Ät¬@LÍ]Šp½ +'êA'ã!4k‘2A7ØuÌѹ.îج§F±ªHÅŠþ!Ã]«‹Ïúà¾û¯ûCs?=†™[öÃHÇ0sÇ>/e9ÇŸH +¾½ùÉT~õvÕ¸Õñ¿ö)JMC¹<‹Ì&›ÎFúæ›Î±ogÛtFÑìDÑ+2Ñ,’djæÄË*IÃ÷Ex ¯ô®6ëm“|"/ÃÇŽ=ad }¿Ôí¿.uìö@ˆÇŠ +UÀ„j¬¨Ã5¹DF¦æâ*‘'žÖñ2=®ÂâzÙ6õÁj^(QÅ)╺}“ám§˜W[Ž¶ëúÇÔ)·1çøæ ´ß<‰ý|7OP8œ cE +B5VÔ1šìP!S]1¬—0éçTÍ»yüÆÿ +endstream endobj -412 0 obj << +454 0 obj << /Type /Page -/Contents 413 0 R -/Resources 411 0 R +/Contents 455 0 R +/Resources 453 0 R /MediaBox [0 0 612 792] -/Parent 410 0 R -/Annots [ 415 0 R 416 0 R 417 0 R 418 0 R 419 0 R 420 0 R 421 0 R 422 0 R 423 0 R 424 0 R 425 0 R 426 0 R 427 0 R 428 0 R 429 0 R 430 0 R 431 0 R 432 0 R 433 0 R 434 0 R 435 0 R 436 0 R 437 0 R 438 0 R 439 0 R 440 0 R 441 0 R 442 0 R 443 0 R 444 0 R 445 0 R 446 0 R 447 0 R 448 0 R 449 0 R 450 0 R 451 0 R 452 0 R 453 0 R 454 0 R 455 0 R 456 0 R 457 0 R ] +/Parent 452 0 R +/Annots [ 457 0 R 458 0 R 459 0 R 460 0 R 461 0 R 462 0 R 463 0 R 464 0 R 465 0 R 466 0 R 467 0 R 468 0 R 469 0 R 470 0 R 471 0 R 472 0 R 473 0 R 474 0 R 475 0 R 476 0 R 477 0 R 478 0 R 479 0 R 480 0 R 481 0 R 482 0 R 483 0 R 484 0 R 485 0 R 486 0 R 487 0 R 488 0 R 489 0 R 490 0 R 491 0 R 492 0 R 493 0 R 494 0 R 495 0 R 496 0 R 497 0 R 498 0 R 499 0 R 500 0 R ] >> endobj -415 0 obj << +457 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 649.882 288.452 660.825] +/Rect [144.862 654.942 206.809 663.788] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.3.1) >> +/A << /S /GoTo /D (subsubsection.4.2.5) >> >> endobj -416 0 obj << +458 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 639.944 260.318 648.87] +/Rect [144.862 640.929 277.224 651.833] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.3.2) >> +/A << /S /GoTo /D (subsubsection.4.2.6) >> >> endobj -417 0 obj << +459 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 627.989 239.297 636.915] +/Rect [121.948 631.031 175.915 639.878] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.3.3) >> +/A << /S /GoTo /D (subsection.4.3) >> >> endobj -418 0 obj << +460 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 614.016 277.474 624.96] +/Rect [144.862 617.019 278.529 627.923] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.3.4) >> +/A << /S /GoTo /D (subsubsection.4.3.1) >> >> endobj -419 0 obj << +461 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 604.078 263.745 613.005] +/Rect [144.862 607.121 252.607 615.968] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.3.5) >> +/A << /S /GoTo /D (subsubsection.4.3.2) >> >> endobj -420 0 obj << +462 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 590.106 247.247 601.05] +/Rect [144.862 595.166 232.702 604.012] /Subtype /Link -/A << /S /GoTo /D (subsection.3.4) >> +/A << /S /GoTo /D (subsubsection.4.3.3) >> >> endobj -421 0 obj << +463 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 580.168 249.937 589.094] +/Rect [144.862 581.153 267.551 592.057] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.4.1) >> +/A << /S /GoTo /D (subsubsection.4.3.4) >> >> endobj -422 0 obj << +464 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 566.196 325.503 577.139] +/Rect [144.862 571.255 260.746 580.102] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.4.2) >> +/A << /S /GoTo /D (subsubsection.4.3.5) >> >> endobj -423 0 obj << +465 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 556.258 213.853 565.184] +/Rect [121.948 557.243 236.238 568.147] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.4.3) >> +/A << /S /GoTo /D (subsection.4.4) >> >> endobj -424 0 obj << +466 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 542.285 222.619 553.229] +/Rect [144.862 545.288 244.039 556.192] /Subtype /Link -/A << /S /GoTo /D (subsection.3.5) >> +/A << /S /GoTo /D (subsubsection.4.4.1) >> >> endobj -425 0 obj << +467 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 530.33 218.934 541.274] +/Rect [144.862 533.333 378.115 544.237] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.5.1) >> +/A << /S /GoTo /D (subsubsection.4.4.2) >> >> endobj -426 0 obj << +468 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 518.375 365.224 529.319] +/Rect [144.862 523.435 208.363 532.281] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.5.2) >> +/A << /S /GoTo /D (subsubsection.4.4.3) >> >> endobj -427 0 obj << +469 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 506.42 313.897 517.363] +/Rect [121.948 509.422 220.458 520.326] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.5.3) >> +/A << /S /GoTo /D (subsection.4.5) >> >> endobj -428 0 obj << +470 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 494.465 223.516 505.408] +/Rect [144.862 497.467 213.444 508.371] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.5.4) >> +/A << /S /GoTo /D (subsubsection.4.5.1) >> >> endobj -429 0 obj << +471 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 482.509 242.574 493.453] +/Rect [144.862 485.512 350.868 496.416] /Subtype /Link -/A << /S /GoTo /D (subsection.3.6) >> +/A << /S /GoTo /D (subsubsection.4.5.2) >> >> endobj -430 0 obj << +472 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 470.554 258.395 481.498] +/Rect [144.862 473.557 302.868 484.461] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.6.1) >> +/A << /S /GoTo /D (subsubsection.4.5.3) >> >> endobj -431 0 obj << +473 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 458.599 255.087 469.543] +/Rect [144.862 461.602 218.027 472.506] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.6.2) >> +/A << /S /GoTo /D (subsubsection.4.5.4) >> >> endobj -432 0 obj << +474 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 446.644 285.911 457.588] +/Rect [121.948 449.646 239.576 460.55] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.6.3) >> +/A << /S /GoTo /D (subsection.4.6) >> >> endobj -433 0 obj << +475 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 434.689 233.698 445.632] +/Rect [144.862 437.691 253.175 448.595] /Subtype /Link -/A << /S /GoTo /D (subsection.3.7) >> +/A << /S /GoTo /D (subsubsection.4.6.1) >> >> endobj -434 0 obj << +476 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 422.734 232.363 433.677] +/Rect [144.862 425.736 249.867 436.64] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.7.1) >> +/A << /S /GoTo /D (subsubsection.4.6.2) >> >> endobj -435 0 obj << +477 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 410.778 277.733 421.722] +/Rect [144.862 413.781 282.913 424.685] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.7.2) >> +/A << /S /GoTo /D (subsubsection.4.6.3) >> >> endobj -436 0 obj << +478 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 398.823 303.326 409.767] +/Rect [121.948 401.826 230.699 412.73] /Subtype /Link -/A << /S /GoTo /D (subsection.3.8) >> +/A << /S /GoTo /D (subsection.4.7) >> >> endobj -437 0 obj << +479 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 388.806 210.166 397.812] +/Rect [144.862 389.871 224.253 400.775] /Subtype /Link -/A << /S /GoTo /D (subsection.3.9) >> +/A << /S /GoTo /D (subsubsection.4.7.1) >> >> endobj -438 0 obj << +480 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 376.851 225.618 385.857] +/Rect [144.862 377.915 274.734 388.819] /Subtype /Link -/A << /S /GoTo /D (subsection.3.10) >> +/A << /S /GoTo /D (subsubsection.4.7.2) >> >> endobj -439 0 obj << +481 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 362.958 410.623 373.901] +/Rect [121.948 365.96 300.327 376.864] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.10.1) >> +/A << /S /GoTo /D (subsection.4.8) >> >> endobj -440 0 obj << +482 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 353.02 280.572 361.946] +/Rect [121.948 355.943 209.389 364.909] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.10.2) >> +/A << /S /GoTo /D (subsection.4.9) >> >> endobj -441 0 obj << +483 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 341.065 196.458 349.991] +/Rect [121.948 344.107 222.619 352.954] /Subtype /Link -/A << /S /GoTo /D (subsection.3.11) >> +/A << /S /GoTo /D (subsection.4.10) >> >> endobj -442 0 obj << +484 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 329.11 233.838 338.036] +/Rect [144.862 330.095 371.619 340.999] /Subtype /Link -/A << /S /GoTo /D (subsection.3.12) >> +/A << /S /GoTo /D (subsubsection.4.10.1) >> >> endobj -443 0 obj << +485 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 317.154 234.605 326.081] +/Rect [144.862 318.14 256.692 329.043] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.12.1) >> +/A << /S /GoTo /D (subsubsection.4.10.2) >> >> endobj -444 0 obj << +486 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 305.199 216.762 314.126] +/Rect [121.948 308.242 193.459 317.088] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.12.2) >> +/A << /S /GoTo /D (subsection.4.11) >> >> endobj -445 0 obj << +487 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [110.002 281.394 175.954 292.278] +/Rect [121.948 296.287 230.839 305.133] /Subtype /Link -/A << /S /GoTo /D (section.4) >> +/A << /S /GoTo /D (subsection.4.12) >> >> endobj -446 0 obj << +488 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 269.309 231.227 280.253] +/Rect [144.862 282.274 208.074 293.178] /Subtype /Link -/A << /S /GoTo /D (subsection.4.1) >> +/A << /S /GoTo /D (subsubsection.4.12.1) >> >> endobj -447 0 obj << +489 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 257.354 218.385 268.297] +/Rect [144.862 272.376 208.612 281.223] /Subtype /Link -/A << /S /GoTo /D (subsection.4.2) >> +/A << /S /GoTo /D (subsubsection.4.12.2) >> >> endobj -448 0 obj << +490 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 245.399 233.429 256.342] +/Rect [144.862 260.421 267.222 269.268] /Subtype /Link -/A << /S /GoTo /D (subsection.4.3) >> +/A << /S /GoTo /D (subsubsection.4.12.3) >> >> endobj -449 0 obj << +491 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 233.443 268.925 244.387] +/Rect [144.862 246.409 300.327 257.312] /Subtype /Link -/A << /S /GoTo /D (subsection.4.4) >> +/A << /S /GoTo /D (subsubsection.4.12.4) >> >> endobj -450 0 obj << +492 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 221.488 336.451 232.432] +/Rect [144.862 234.453 300.327 245.357] /Subtype /Link -/A << /S /GoTo /D (subsection.4.5) >> +/A << /S /GoTo /D (subsubsection.4.12.5) >> >> endobj -451 0 obj << +493 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 209.533 335.126 220.477] +/Rect [144.862 222.498 349.861 233.402] /Subtype /Link -/A << /S /GoTo /D (subsection.4.6) >> +/A << /S /GoTo /D (subsubsection.4.12.6) >> >> endobj -452 0 obj << +494 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 197.578 250.634 208.522] +/Rect [144.862 210.543 251.172 221.447] /Subtype /Link -/A << /S /GoTo /D (subsubsection.4.6.1) >> +/A << /S /GoTo /D (subsubsection.4.12.7) >> >> endobj -453 0 obj << +495 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 187.64 302.2 196.566] +/Rect [144.862 200.526 236.288 209.492] /Subtype /Link -/A << /S /GoTo /D (subsubsection.4.6.2) >> +/A << /S /GoTo /D (subsubsection.4.12.8) >> >> endobj -454 0 obj << +496 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 173.668 252.846 184.611] +/Rect [107.004 176.805 172.956 187.684] /Subtype /Link -/A << /S /GoTo /D (subsubsection.4.6.3) >> +/A << /S /GoTo /D (section.5) >> >> endobj -455 0 obj << +497 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 163.65 277.513 172.656] +/Rect [121.948 164.715 228.228 175.619] /Subtype /Link -/A << /S /GoTo /D (subsection.4.7) >> +/A << /S /GoTo /D (subsection.5.1) >> >> endobj -456 0 obj << +498 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 151.695 235.68 160.701] +/Rect [121.948 152.76 215.387 163.664] /Subtype /Link -/A << /S /GoTo /D (subsubsection.4.7.1) >> +/A << /S /GoTo /D (subsection.5.2) >> >> endobj -457 0 obj << +499 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 137.802 244.537 148.746] +/Rect [121.948 140.805 232.921 151.708] /Subtype /Link -/A << /S /GoTo /D (subsubsection.4.7.2) >> +/A << /S /GoTo /D (subsection.5.3) >> >> endobj -414 0 obj << -/D [412 0 R /XYZ 110.999 687.904 null] +500 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [121.948 128.849 270.082 139.753] +/Subtype /Link +/A << /S /GoTo /D (subsection.5.4) >> >> endobj -411 0 obj << -/Font << /F78 368 0 R /F85 373 0 R /F88 386 0 R >> +456 0 obj << +/D [454 0 R /XYZ 108 690.907 null] +>> endobj +453 0 obj << +/Font << /F94 409 0 R /F105 415 0 R /F107 429 0 R >> /ProcSet [ /PDF /Text ] >> endobj -460 0 obj << -/Length 864 +503 0 obj << +/Length 2120 /Filter /FlateDecode >> stream -xÚí™MOÛ@†ïù>ÆR3Ýý>¶P+J¥’[ÛƒI–`ÛÈ1üû®cÇ4þhI -ËIÂ0̇ǕiLPî -Òf÷(¿œí´4ù˜¢/yEãëqµ$ãnÊþ\’»ÆQ"Èðc<µ>Ã[„îgrQ'Iñtþ¦<}…>&ñ¼øíºŠÆu‘ÍlZvœß-ÏÏl}AÈÎÛ¤Ap¹ -¢a5ø#AÈ“¸1“5Ó)2D®šÞi§ÄúõùüIJÁ±6IS’< çY;ÄU4Ù#ym›K”‹¹[DGÇlÞ
4¨ÈµÜ@ P…ÈõÝ -šˆ®Ôª"wêú#Ü€ +xÚí›]sÛD†ïû+tiÏe¿µ{ ¡a`hË´a¸ +ÿXƨɴ¥ÄÒ<»Ú<£Ù
¼üõ3æß>kß?‹_^>ûüÂÊÌ«uvù®
@8—}ËëŸVçë_.¿íd9a¹hešHn!dûö«õ™æ«—ð•.»ëçÝõËîÚ½ò¦Ñg†£CªªZɳç—}±ŠJt,m +,¬°¨Ê"柯AÍTÂ"ÀŽÌzŸ‚cP#vP#vL!P#©–BÝ.›Ù#½ÓkÔÂ÷ί›bw[]9ðªíÕÝýfñyó4…eQ¦Dót´œ¾yFåœRóDü8Cü›ê83IÎT׋ÊB3Ôøz1hgy»^L®ü µ+f|?»ˆúå7Ý×óy§äP³dþ'ŠŸí·¥»x]îîª~7yëǵW›»ëÙï… +ÌfÑÀæX; :xn,1LÿQ`û'á>‚,æM,fÎ4P‡¬M!‹¥·Fý¾QIÕhkl¿¬¼üÜU‡vwsß”3~#ºhH3ÈkÐZ8ìbã£ZžAÿrˆ›rˆ›Ó@rHª…³±Ê90¢ÈyM@Ž{ä^AÏjt»¦¾iŠÍ~>S¢ ª(Mb*v´›8«×¸–d
±q`
±q¨µÑÐ$kHª¥3²¦DXÏÈ^ãX3þç›íu¹fjõçxμª7˜[÷Ÿù—wí™ÎšüΤŸvw°YB[ÜÏO\`«’sEµÍ‡ë5è +¹ïÞ>øÙÃX*çË0Øk²¨‚yOó´L®Úí´•y +û +̸<ĸi ¼äþKµtÆšHóÈ"Ík<xý"í¢ºi×e^›âª©ç¦P„2‘EYk4§AKé×hQ)§»FC܈CÜœBˆCR-%æ%Y£yM .¬Ñ^8Êü³ð¯)aBmRͶûƒ!_²±Ùn€Õ7¶¨¨“hlˆqfˆqÓ@fHª¥»OƉʎ™×ÌŠY±Û•a
ö3L½EjS¯¹Zý±‡ØüÀ—n‡4é_§Aëå¶)&Õûô7W¼W¦¼TK»¥Dã÷2¼$À%Q¸6õuõîaÞÃ4\dC¶Ds¬¢¾ƒ
D;îÚ +· +7Ä‹Ãæ5ý1,]ŸåSØ~o#Š»ûTs°T¤ys´žp×s²g±˜›vˆ›Ó@vHª¥Ø1M¬x¤ÇyMsØßÛ›ž»«ú®n7ÌœgQžÄ
s§A‹ Ï®ÅŜгk˜eˆÓ@eHª¥”Q˜ òGš›×ô”qGÙWåÏ”òmÏYÑ4ÅC¢·Y"Ûá
™½ÍiÐrú¹4*ç›bã€bã4‚’j!n +B9ÞÔ‚¦ÇM¤šÚÛò¶Xs˜T«:q{ ¦J!²([âlÖiÐ’Âál\Ò)ô4̸2̸i Ö8›|úKµðöR÷œ‡Æ÷¡AÓC&dÕ]9}¨§Ü®eZSo7åö0ïp9…Y2‹ÒÎis´4ž·2ÉF¥=ñµÛ1¼§¼«¦¼TK{˜nZÇËkz¼”ÃërOÝf³¿ÄbVNdQüùŸ +{
ZìrG>ñ‰òïãˆ>àˆ>
„àˆ¤ZŠ£Êá·ýH·óšGíp|Qí¯ææ°ÏY7¡Ó É9W£äÿó—âqzàqzáIÕ>6yÆuûç$ɇŠÚ÷iüÆ_¢Ãê° +endstream endobj -459 0 obj << +502 0 obj << /Type /Page -/Contents 460 0 R -/Resources 458 0 R +/Contents 503 0 R +/Resources 501 0 R /MediaBox [0 0 612 792] -/Parent 410 0 R -/Annots [ 462 0 R 463 0 R 464 0 R 465 0 R 466 0 R 467 0 R 468 0 R 469 0 R 470 0 R 471 0 R 472 0 R 473 0 R 474 0 R 475 0 R 476 0 R 477 0 R ] +/Parent 452 0 R +/Annots [ 505 0 R 506 0 R 507 0 R 508 0 R 509 0 R 510 0 R 511 0 R 512 0 R 513 0 R 514 0 R 515 0 R 516 0 R 517 0 R 518 0 R 519 0 R 520 0 R 521 0 R 522 0 R 523 0 R 524 0 R 525 0 R 526 0 R 527 0 R 528 0 R 529 0 R 530 0 R ] >> endobj -462 0 obj << +505 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 649.882 359.983 660.825] +/Rect [121.948 652.884 344.361 663.788] /Subtype /Link -/A << /S /GoTo /D (subsection.4.8) >> +/A << /S /GoTo /D (subsection.5.5) >> >> endobj -463 0 obj << +506 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.946 637.927 253.902 648.87] +/Rect [121.948 640.929 343.036 651.833] /Subtype /Link -/A << /S /GoTo /D (subsection.4.9) >> +/A << /S /GoTo /D (subsection.5.6) >> >> endobj -464 0 obj << +507 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 625.971 211.621 636.915] +/Rect [144.862 628.974 247.636 639.878] /Subtype /Link -/A << /S /GoTo /D (subsubsection.4.9.1) >> +/A << /S /GoTo /D (subsubsection.5.6.1) >> >> endobj -465 0 obj << +508 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 614.016 247.875 624.96] +/Rect [144.862 619.076 299.201 627.923] /Subtype /Link -/A << /S /GoTo /D (subsubsection.4.9.2) >> +/A << /S /GoTo /D (subsubsection.5.6.2) >> >> endobj -466 0 obj << +509 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 602.061 247.297 613.005] +/Rect [144.862 605.064 249.847 615.968] /Subtype /Link -/A << /S /GoTo /D (subsubsection.4.9.3) >> +/A << /S /GoTo /D (subsubsection.5.6.3) >> >> endobj -467 0 obj << +510 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 590.106 213.833 601.05] +/Rect [121.948 595.046 281.847 604.012] /Subtype /Link -/A << /S /GoTo /D (subsubsection.4.9.4) >> +/A << /S /GoTo /D (subsection.5.7) >> >> endobj -468 0 obj << +511 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 580.088 287.157 589.094] +/Rect [144.862 583.091 232.682 592.057] /Subtype /Link -/A << /S /GoTo /D (subsubsection.4.9.5) >> +/A << /S /GoTo /D (subsubsection.5.7.1) >> >> endobj -469 0 obj << +512 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 566.196 273.17 577.139] +/Rect [144.862 569.198 241.539 580.102] /Subtype /Link -/A << /S /GoTo /D (subsubsection.4.9.6) >> +/A << /S /GoTo /D (subsubsection.5.7.2) >> >> endobj -470 0 obj << +513 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 554.24 241.797 565.184] +/Rect [121.948 557.243 325.722 568.147] /Subtype /Link -/A << /S /GoTo /D (subsubsection.4.9.7) >> +/A << /S /GoTo /D (subsection.5.8) >> >> endobj -471 0 obj << +514 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 542.285 248.174 553.229] +/Rect [121.948 545.288 253.394 556.192] /Subtype /Link -/A << /S /GoTo /D (subsubsection.4.9.8) >> +/A << /S /GoTo /D (subsection.5.9) >> >> endobj -472 0 obj << +515 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 530.33 247.317 541.274] +/Rect [144.862 533.333 236.009 544.237] /Subtype /Link -/A << /S /GoTo /D (subsubsection.4.9.9) >> +/A << /S /GoTo /D (subsubsection.5.9.1) >> >> endobj -473 0 obj << +516 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 518.375 243.432 529.319] +/Rect [144.862 523.315 253.982 532.281] /Subtype /Link -/A << /S /GoTo /D (subsubsection.4.9.10) >> +/A << /S /GoTo /D (subsubsection.5.9.2) >> >> endobj -474 0 obj << +517 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 506.42 257.628 517.363] +/Rect [144.862 509.422 293.294 520.326] /Subtype /Link -/A << /S /GoTo /D (subsubsection.4.9.11) >> +/A << /S /GoTo /D (subsubsection.5.9.3) >> >> endobj -475 0 obj << +518 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 496.402 274.315 505.408] +/Rect [144.862 497.467 257.319 508.371] /Subtype /Link -/A << /S /GoTo /D (subsubsection.4.9.12) >> +/A << /S /GoTo /D (subsubsection.5.9.4) >> >> endobj -476 0 obj << +519 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 484.447 199.148 493.453] +/Rect [144.862 485.512 210.834 496.416] /Subtype /Link -/A << /S /GoTo /D (subsubsection.4.9.13) >> +/A << /S /GoTo /D (subsubsection.5.9.5) >> >> endobj -477 0 obj << +520 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [147.861 472.492 201.658 481.498] +/Rect [144.862 475.494 284.158 484.461] /Subtype /Link -/A << /S /GoTo /D (subsubsection.4.9.14) >> +/A << /S /GoTo /D (subsubsection.5.9.6) >> >> endobj -461 0 obj << -/D [459 0 R /XYZ 110.999 687.904 null] +521 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.862 461.602 290.385 472.506] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.5.9.7) >> >> endobj -458 0 obj << -/Font << /F78 368 0 R >> +522 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.862 449.646 237.683 460.55] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.5.9.8) >> +>> endobj +523 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.862 437.691 238.799 448.595] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.5.9.9) >> +>> endobj +524 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.862 425.736 234.664 436.64] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.5.9.10) >> +>> endobj +525 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.862 413.781 244.318 424.685] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.5.9.11) >> +>> endobj +526 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.862 401.826 240.433 412.73] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.5.9.12) >> +>> endobj +527 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.862 389.871 254.63 400.775] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.5.9.13) >> +>> endobj +528 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.862 379.853 271.317 388.819] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.5.9.14) >> +>> endobj +529 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.862 367.898 196.149 376.864] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.5.9.15) >> +>> endobj +530 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.862 355.943 198.66 364.909] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.5.9.16) >> +>> endobj +504 0 obj << +/D [502 0 R /XYZ 108 690.907 null] +>> endobj +501 0 obj << +/Font << /F94 409 0 R >> /ProcSet [ /PDF /Text ] >> endobj -480 0 obj << -/Length 3820 +533 0 obj << +/Length 3721 /Filter /FlateDecode >> stream -xÚÅkoÜ6ò»…¿eðòDê}_iÒ&\ãk4ª•¸»ªµ’¢GS߯¿ÎPKqÝև€—RäpÞ3¤¼tàO^Jéˆ8Ž/ƒ(±ã]¦ççòC¯.$OqcG8Ž‚öÊàÎŽî\ODAŒs>»¹øÛ‘k‹Ø÷/ofîMöÃFnwÒqœÍuÙ5[mª¬O»¼*·?Þ|i>‰E¸ôÅNÂscúNØ/¿;m¥¿¹û}Fó/|áÊÐ|q³œMuÞîToŽU·Ý¹ðuwÒÔÈ3½•›„:‡ª–*„¸ZÀR>£ýÕv¨Íæÿ[ø/7צý?»øüf †”Jx^Ä"ô$
5ÇKj|3’ιtE ƒbfw7Ts‚ÝÛÁ2ò`}ûå}~(G>±Ê.:¡-z®Ú®¸#ÒT=“¦:ÐoBðƒÖE^Ç1lú¶kä˜ ÈËü°U>Ìntiê»Åá³NOI™·çÏ’±A|gE°Aê½âMÝäeG{BÏ@•³ù%׸ÃG`ìƬò ¼ -º‘†'d -fÂkb•‘bfƒÌZº>ZÙæsA>ËüC¯i Õú¬3jî4hJ°Å¢"pùÈrUôú=¡Jß‚Ñ£™¦Ñ6@ #ó”1ÈËL×þ•²×iÒ·Üɬº6#Š¤ðBw&C7ŒŽ§‚u,ÕKdçDsq§&Ÿ¯%`£ÓêXæÿÕ<± ¬ò/x+=_Hß[r÷Y»ä¯Ltbž{Eë'eF
Ї¬àMAÎÔÊË £
B)'éÎJ‰7¥¢pF£7«ÏvW p[h‰ãÏ—hº"R1,b§,Èü ü³0,)ÎÆ•|x¶+{G x˜mcS•çáÔ§„ù”zžÀ<lj
f®5æ@E~Î;€êŒúm_×4ÆVÞ|mL 4É‹do ?1dïðû¬IPBÐ:¿W*NjGžˆQ=&ľ«ú)o,δ3.4À!£u9óSÆUqWVg´”ö
I+KlôF¡¤{¾Tѧ·$Ðõ¼¹þ°½
¬¥oqÙ ¢¯šV}Óš½ óÖ,ƒó‰ÁµƒL…SwôbAK07ô!9¼ÏG0á'ÂMØ€]£9ô…ae`¼›«‘¿æûÙM`R(hu©›¤à#í‘á†:0”w¼0F ÔB1Ú“§©zëÉÁè«xÎâƒNŒäîTXªQ‡…X -ë'„x«ï!wNÒ¦jip8/ ?XñðqáµÙ Ì'ع/"ˆð¦Ä_å·ä“ü–«üÁQ–"ÖšX šºk¢H„¨;ÑSºi»ùÎÊG!6Ø·øXÇƋ͉+bõ8ŠÂ7us -ùÅ"yõ#æ -Çž&•þpèM“Â
ü§1ÜÑàÅÏÉÏøÊHq¸€ŠóŽ @e˜B÷kD<sj‰ãÏ]éÇܸ6ø¨Õ…Æl^EÒÖqÔx‚4 X3îúÃ~Cƒß¾w|§ÔISÜAKÒ“˜M’3Oc‡$~cJõØÿÛÒŒž!¶òˆ×0¡2=ΙÔÕñˆÎìlÓ";¢Ê‰¢Bç—ŒØS&â±@ï#•CÉ‘4ÚŠ†Î07†8³T7äÌ`Ç¡äZ¶»ä0Æ·OT*%]ÈH\ËT{Ù*s[÷Ÿj$Ĥª:¿Î2#TìîUØçÙk†%Ã6mò½ÎæµvbV§ˆa8¹J{¬A²P5f©žÓ -žmÈ¢
<MjJîrÄ!˜ÞyîZè+ñzuH`ÿšØ7o¯6@²µ8Š+>IUT
É8žÓÐxrrœÐPœA×sJöx¿yïô‹8CÆÐTª¦ü¡äÃ
‡{FwZÁxB°LŸIf -ö|Åìod«+jB²eêûÐ4ðû2iº3HÙ‰º/ª¢0†ùˆØL˜Ü®RiÛõ†ÙôöÀ,oL¶öšÞj ÐÑìj -€ÐètÛQù}Ö`Rr‡…BNé’‹î`€³µäÐižŽn•Ã‘è“ôfäbxÌ0ÀýL}T¬2oO”yºŽ9ÀóœÄK1‹¡Œ®C¨sËÐàÏÕžû>ÓMs·¢‹ò"²ŽKŽÕñ6߀¹`Ыç‚`Ÿéî#™Ç^«˜ Ìa›Pd.AÁ‡&ºW:S@ôØ« ›\DUÍWË0cÔ˜•&
¤—ÙÊù†;Ö½½SFÁ65!¬ŸªÖŸ“PtQc|Åq_:Î"Žœ£ÎÀ9r±×ºùey÷É8åyz[R°Zèì¨Q…áPŸ¾U{‡f§³tBfQh©nÎyF
ª3äëãŒè>QÔ˜”ѦNÚÖžºÆwÀ·¯tEŠÖh|”DuoQ ²Aƒ -Äug÷ÅÛ(j+.Q`5|q<~ä¬_9ÕzèJ¥;BÏ—ÓýöV• -D„Ó·XÝŒ,çuˆ?ÍgÓŸëÃúƒ’ñå?ˆsðűØ$ìV ¢–òg?
;Bˆ+ƒœÇ–‡š0D +xÚÅZm“Û6þ¾¿Âß"Ϭy¢¨×~¹I“4I/¹î%;íÍ4©,Ó¶YRô’tï×@€²d)›í5›Y“àPråŸ\I7^…‰+7Ze§+wu +oFâ³½7£îF„†yÈÈyÊHÄ Ëb¶®÷ÕxÝÙaÙ>K«
ô M%Ã<¸Ø©j»âŽ$Uõ ¯ÚÓ¯• ÖE^Æm@lú¶kR<]A-OóýÚÃÞ.×Ò±sõ]mç=éN×I˼=µDâÓ£m +ÑhªTûN—v…”KeÕ]“hbP?˜ˆ1ƒ#ÏIm¡n*dõcÞ™´DÛ©Ax!™AõФõ1ϨRmÓY×ÚŽ†}œ~’$†éü¸<@Ã@É‹zõí0)„ˆ»ÞCN‚Q!ZÅÂcÔPPU@²ËwRùm³<-æ`à»"ôcîùhŽ‘,pñ‚NÆ( ]ƒgͲT~($@ÞT˜9l^©ÄétÇr,ó½&J«õI屮_KPÞ†+
‚–hÛÀ,`Jò€m·4` +
¢ Úþîˆù<3LÄp&;]køWfÌÖVgi#[®ïF¶×Ùò +?¦{îñœQ%b/F1Û>·,fßIúþ¢ôý‰R,H+±²`YX=•(@ èûǼ©Êiƒ‹²Bs%Zµ©WµÈkû±^䧼3Š}ZTº¦6Ij }A¨i^¤[=’øÀ¾HÜ5)êȧwžÁAŽ"QVÖ¡áõ®êÇçbOÉ@Ppž…ž~vQÑ\Fç–º*€ñ»²:!fRÖ7¤¬¬<° ˆÚ%èÅún:UÑgïI9¤7ª?Q[†]_2Ãí5ÕèV”NVõM«™xc¦I<8ʱý½$Ã`•gâ“uèZ$q…ù°X^æ +ÞVH +7³ù6*ñ„ŒýnîðÌç•ÂD¾M¿«Á<[¢§ô³Ó'òNe`ƒ¢Ï¸?.½ ÿ”I„c¯ƒgÍV´|še,¶-U1M*¨Ç“ªlõ‡”ºÜjdŒ9;jî']Õ&àOÝ|ià“f6 ”¦ÌØøsdjlÅHÍ0Ce# S¢\\d¹ÅâOGš(DbËýèé#0¸µ»æ±ö½)ˆFï:"ÝMPòÚxób’‰øœ FÈ)˜S
±ÏÖæ˜oÐ0žŒ¾vD(^L5s8Ï5N3=œzÃÃiõåGS*¹¡S5ù!/éÝAÛ³]¡©Ø]=L!¥Gð@úï†A@À.¾¿lÂ,eªÃ!dÕ"ÍBâÙÊ°ÒÀe‰ê€•ºÉOiƒ?JW‡:ºæ±$å±€ø +¢ØcÓŸ8àn¿xÙèJµÄ\*Jœs +º‚²+ +endstream endobj -479 0 obj << +532 0 obj << /Type /Page -/Contents 480 0 R -/Resources 478 0 R +/Contents 533 0 R +/Resources 531 0 R /MediaBox [0 0 612 792] -/Parent 410 0 R -/Annots [ 482 0 R ] +/Parent 452 0 R +/Annots [ 535 0 R ] >> endobj -482 0 obj << +535 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [222.45 618.126 228.626 630.919] +/Rect [216.762 621.128 222.939 633.892] /Subtype /Link /A << /S /GoTo /D (Hfootnote.1) >> >> endobj -481 0 obj << -/D [479 0 R /XYZ 110.999 687.904 null] +534 0 obj << +/D [532 0 R /XYZ 108 690.907 null] >> endobj 6 0 obj << -/D [479 0 R /XYZ 110.999 662.997 null] +/D [532 0 R /XYZ 108 666 null] >> endobj 10 0 obj << -/D [479 0 R /XYZ 110.999 648.384 null] +/D [532 0 R /XYZ 108 651.411 null] >> endobj 14 0 obj << -/D [479 0 R /XYZ 110.999 288.263 null] +/D [532 0 R /XYZ 108 339.086 null] >> endobj -485 0 obj << -/D [479 0 R /XYZ 125.345 146.922 null] +18 0 obj << +/D [532 0 R /XYZ 108 184.192 null] >> endobj -478 0 obj << -/Font << /F85 373 0 R /F78 368 0 R /F88 386 0 R /F101 484 0 R >> +539 0 obj << +/D [532 0 R /XYZ 122.346 138.516 null] +>> endobj +531 0 obj << +/Font << /F105 415 0 R /F94 409 0 R /F107 429 0 R /F120 538 0 R >> /ProcSet [ /PDF /Text ] >> endobj -488 0 obj << -/Length 3749 +542 0 obj << +/Length 4159 /Filter /FlateDecode >> stream -xÚZëÛ6ÿž¿Â÷©6°føõÈáP¤mÒ×5í5‹km“mÚVcK®$w»ÿýÍpHš²´Ûm.0`>D‘œg~3”˜qø‰™œE1KóŒ<™Ïøl>&ÜΤL >¹}öüu–ÏrV¤éìvkGÜn~š‹ÅRó9³ÿj±Ê¿Ü~e‡gLd -‡+Î%Ý;_,–©œ¿\ÀÐÛ04Ì,4“iá†~ŒÏgJL‰ë“Ø÷ìÕmاʖÁ|Šˆ¥*8ã\B%a9Lì©Éõ¬€5Õ€fià@þì?›‹.aJävø[chH
9K¸v~ÿêågß¼býýx.
û‘žÐmÓ.– Wó‹d~¨ºÞuÔê*©½j+³¥ªY=ÿãt(벯šš†5þa¹ÞSz’y¿7Ôñ3ðã`:FÝßÖ1?ÜS-¤žÿŽS»áekÜÖý¹<ÀPÊ2SLª"X¡µ¥¢6fc`»2M‰"™fóíùp ®r½6]Gõ¾‰´¤È,ç8g*÷¬ûÆjÉkûÿü‹ù—¶þ阓2e"h×Gçn‘uy*WÕ¡ê+Ó½‹*åLpÿÞq{ªÖ¬7ŒçO4Ë‚¤nÆóh&=˜¦ëï'¦É<åÆý'Å -÷y(ûÞ8vÅ<lj”‹ç¦åºÌ5˳tÀöF¬T™´,az&>xþr¼euo†Øƒ8KX"ajÉd"m÷+×CûÒû£ãñX÷S˜ÀŸÓŸ…JÎ9•ëwåÎLè?R\¸!&Ç~×–ÛUÙvÜṄ˜ramà¢.ù¼ÚŽ”.UL%•{eÿoJ -}R–½‡±‚-q¯÷»êbl;Z´kü¦vçjcêµÛÚwÚžë -Ôk==öªw(CƒØ½C¹/’;}½¡¡¥c·Ððöæ@‘¨LXÞÃŽ‰ -+Uà þžûÓ¹§ÎMĶ£N$Kè„‚ ™€·i™i˜œ4q)S*½Æ/°r¼E‹Ì -Ô× -ì̶øüõ%WëÇXêˣ{³š1믯Š ÒȾ4å|·ÌAå!iÈhÞ۽߮½–q†ˆâjП+º\à„±²rïnª-œ-B5 ¡0€_ÒÔ.YeêŽÒ…—¹Ä|gz7¼Ðºì{Ù¤Œæ5»û®7GX´»Ðã^p˜fÚ«qÚ0cñydˆoË$qæ˜`ëק'e’'FRÏ‘´c\çRAP:Ås×YT|÷µ¿¢©ûøMæÁϤ鴟‘¶ò‘#ÿ”œà]ìõ•§‘²i<ÝàT¬ÅvxQ²T
5è/Xq'±I“%€ìÔÿmbvÛ¾9½‹ìøgfÊ„ø¨p`/Ç÷y¶¡_nÐ-žL· €f‚ ÊŸºÐä6Í¢B2€¡†ñ¯ªÈ]Ê*ÃX -}*u‡¼Èå8uô¤RL=ù’ÜNthvä ò€Ì¬.BD–5Ñf׋ÄyL¨`ø0 -71uû~7Ê<•Ã³Z$—ä -˜›ðup; Lm ^p"œVñ‡lEsrwÄE⬰Åáвy.wN¡ÙšßΕMÈǤZÀ¥ÙTýT^$ïœ>Õ(8S0®‚eWè÷/eUQõR5‹XØP}½/Oxœ¯@à;\Š[À=u? OäÔû™ÅÄlvËáWx£ùèVvžU±‡:7kƒÜè+ÛÝ#Þ˃k&³Á¡=Mê‡È¼ÖÛì.LhÁ1Æt69‰=dÒ B·ÀT·É«kŒˆ¹çL#®‡HG©ÉÏñ£¦Bà£ßžýôŸm`ÈWÏÀµùì꜉¢˜ ´¶Ÿ6Rûðìí³Erc9.“²4Ü{À+ð-£ÁùTsÛ|^ÐGSÖ{†,zÝ -·'û;m¶S™Î,| +xÚµisã¶õ»…š/‘gl,qñÈ—Ì6›M6m’í®§i'íLi‰²ØH¤Âcÿû¾ A‰öjŽgLð| +ôxÓWUYÝñË_âèDá7ÆïR˜4¥ïžŸâÕ@¿ÎesCô1¨ÁI¦ ü§F-Fè?xٜRBê`såJ”U{º.37nÕyW´Œ¶Ûÿî[Mñ{_6ÅšßþEj£åò«ã†6ʱ‰<fQ +`Ñ<Ÿ*+Œ¶pÈÃ÷tÆÓãÓ‘02ösŒûœ=ÁÉ>Ïã@Õv3¨¬H”GuuD¬]ÞuE3G®‘Œ›ºy”k¤´W…,‘œÁ6ÉG°˜ÙüµÒ™ˆ«™µ4ò®É7·y[ˆýætÖŠ4“S2<¶ãrì4KH¤2jáÇËëXÁrñÿÍ¥–°éëX._àgúÿAnfO6%NBD÷ånÇSÞº94õªhÛAR‘kïú¦hg© ¢´Ž +ñ3TH…Nåù|µ~WÚ*ßÏ#›!iUëójD"“§ ú: èÛG š€ìÊG :°º£,0³µËyž2Zè8™ðÔ{&UÈs—¤‰ô²oP2k~éj~®Ë¶k +ª8B%…_°RoØ +"Õ 6ÈŒÀy’$[q4Ƚ¼+Éd1ßîŠg‡¦åw»sýußúNðË?/¥DÐÑLÎθ¹N4:š®§ öbP¸è”9¤ÐÚ†J×vëµ4P +ôVbåÄ%|ýðé(q›¸Â—”HÀb4‰÷ V£.TŒ×@[æ:c›GØNNÙ¿F#Xäk7Û†Œ +"jÍYŒyéGD´¦x>†â€7üÞ6a“³×3»³™‡l\tôÿ +ªQ-ñüÈ
¸ž»¢c€;öÔ»ã0„61IZC´êÀYgÂ
ÞÕtÐ÷¬,¬têüÌŠßä?rïÉJöuàéˆò¾÷WvåІ%ÝàGm¸’HíxâÝŽâ¢Ç3 *M$!nÚŽgae`¥§¶†xûL…Š¬»Èr´NÐLŸÖleS—cÎtQøòÿ´\°®L?šwÉ2ï«ìò§‰šH!õè¼Y)s
3;¸Ñx¢™!O;€ò»‚_6M½?5)àf©ý(·2²ž3Ø}ÅI¼ƒ&ñ,<ɾeúq.K >&k…œ9Ž"Ø+; +«4 ‰¬ý4·Ç¤>2 ¹âeÕ?`,d + +_µ Kö£JOï¸4”61'Ç´±\ã +Ä“c‘xÍí²k¹á=DKäµyy +^rqÕGÂ?$ób¥ÎscãñÞe–é–Ì´ÔJ<{ +`ÿ6pg¹‹E!Ã_IPdot³Å—ôë‘!¢´ËçÍj{„)^þTtä©ÔÍonKA± u×g±á°é÷%^èãvU€3Èѵ¿Ê +Co\Z'ŽÅ*ÀH÷C]VÝpA{ôôn®T¶>—w3TNA¶]wøêÙ³ûû{±êòJ niîž½ïçÄ,‰Œå¼øƒå‘™ý)ÎŽ~Çó?ýpè +endstream endobj -487 0 obj << +541 0 obj << /Type /Page -/Contents 488 0 R -/Resources 486 0 R +/Contents 542 0 R +/Resources 540 0 R /MediaBox [0 0 612 792] -/Parent 410 0 R -/Annots [ 490 0 R 491 0 R 492 0 R ] +/Parent 452 0 R +/Annots [ 544 0 R ] >> endobj -490 0 obj << +544 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [413.901 467.696 420.078 480.574] +/Rect [495.502 418.323 501.679 431.087] /Subtype /Link /A << /S /GoTo /D (Hfootnote.2) >> >> endobj -491 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [322.364 408.004 328.541 420.798] -/Subtype /Link -/A << /S /GoTo /D (Hfootnote.3) >> ->> endobj -492 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [238.168 172.39 245.142 183.333] -/Subtype /Link -/A << /S /GoTo /D (section.2) >> ->> endobj -489 0 obj << -/D [487 0 R /XYZ 110.999 687.904 null] ->> endobj -18 0 obj << -/D [487 0 R /XYZ 110.999 662.997 null] +543 0 obj << +/D [541 0 R /XYZ 108 690.907 null] >> endobj 22 0 obj << -/D [487 0 R /XYZ 110.999 569.823 null] +/D [541 0 R /XYZ 108 566.144 null] >> endobj -493 0 obj << -/D [487 0 R /XYZ 125.345 167.205 null] ->> endobj -494 0 obj << -/D [487 0 R /XYZ 125.345 157.396 null] +545 0 obj << +/D [541 0 R /XYZ 122.346 154.394 null] >> endobj -486 0 obj << -/Font << /F78 368 0 R /F85 373 0 R /F88 386 0 R /F87 383 0 R /F101 484 0 R >> +540 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F105 415 0 R /F90 426 0 R /F120 538 0 R >> /ProcSet [ /PDF /Text ] >> endobj -497 0 obj << -/Length 3657 +548 0 obj << +/Length 4029 /Filter /FlateDecode >> stream -xÚÍZK“Û6¾Ï¯˜ÛJU#˜ -C-cþµ\™tñ¶ïÕOªŠ²Tz}Fí×6•‰bY‚]}uÛ£hÓL%IÊHNñ_Ù,PA`PUgÃdXÓ7ÒÕË•
ÂES÷ùºàJ·+{É¥*0Éï—«Ø,¾rÿ·K«Ÿ»âKükÚ'Ê?H£Ÿ§_9Œ•µ~g/.Ö±*Ð~™¯³Þ.Wa(s¿vÿÿ¼œÛÆ*J#Ývűå
=”Ýî¼5WhËj»wåhÑ.õ¹RßENU…>ê(P¡y?!^ñFп$D„zæP¼è/`¤‹|õÇúÔ\¬¿²6S:Ì®WZ«,ŠžÆC¡>„G¢¢À㱩קCQuyWÖ|í¿»zi¢ÅWˆo軑/è«e«¦œªÓ@¥g\ÁŠÜÒl¯¹ðã@ðpø±Ž‡üš(›˜!¿†ÓB¥ÓDñ#½4<Éñ ±fœo—i°x<–ë|¿dÐOm7]a¥Iž Œ(¨ÌŒV™Êž‰xh <ÒÇ«¬",°x«ÇËCY™@YceM>äºa$1¼-5\!„NIã~™¬Ye -=’ÞYA-ÚPxëóû®ÀÊÖhÒM½.Ú¶ŒáêI"J‰FaÕîÔêŠw—KÇ8¶ÄªH§îtDq¦FõøÊÁ¡Í€Úú
2$%<ºÝÕ§ý†ØqWT\¹+ø›x·—ŠÓ|ø6 -l"_¸™~t3½¨Ù™YMÆñÔ§îxêãýª“
n EÃ@4‚A$¦š;P3>P·ù–'9µÅF ”y.Ä#M@ž;Tdí³çöÊLLG©8kÓ¶X×þ¨`n¸äøŒ -žÏ¨|Wð7w|e¬׌Ãåõx¾bÄ+¯¿|É…3Ÿ"£a^œ¸VVëýiS€s7,·:T‰ŒÛDì6áŽ8jâ[Õ.rpy+øîðÅ·)œDÉÑßüÔÕ¬[°fÈ}]ɬۢ*o$³¬›"ï -^¨w#†JÂÄÄ’½Ùëî3ü‡(¥ ÍÅ,àëØxÎUÇßf8?Qaj{OÄmãHFöËòžNçšÍ‘lkS¥í˜ -·ã§þ<1! ÎìÅt>Ž¼1‰´ô÷#–ÐÂùc{#ÕÜs‡.yÅ€2¡û=WºæQ–îÛ’æýc©£…ËùãŽÂzÔþ¾\åG‰µC·Ûà µuõw·å`´×}î4½Y,6¥0)*5»çbÎ"èöäðO‰_Ö)Íýû©ô઀$óGÀ-nO©H}éNå¾»‘UœôaÔÁYJ"fNL‡§á×w áȼA¸Ðóñÿ%—DÊsQ¯ßm’„‰)sÈ£CtŒmE*M8Ø uµ0>Žá‘Ờv×Úâ6—âÚ-sz”2g/´Ži -Ò÷o|è
•²r~ײcbfJB‡$÷¾vlx%Ø9ôrù0SQ˜=Ÿð+0‹&&{bì7Ÿd~£±6¡`’²háJn·À×ñêß°? -&2k-2O‘7ëÃxQuꈡŽO¸)öEWH‡ú õlÂQ5Š1-fÎ_õí¼¡K•é8ïEЬdæΚˆ–^ç7Á•¨„™0<˜ÈãéH†"“–À;>‚à€ˆÓ -q˜QÂÞÏ[Æ‘£ -á{x‹N'²í'~hêj{ó>ôIQ¥þh¼÷'ˆqŽ§;6DñL——ÕÙ€ÄQ|q -.´ƒ±þ¸d³1þGØ}x±1c)}ÔäD ’r"AÕpvÎA}(Æ8†ÙÐû¸:îŠÆF.q2ó.B)?šxT²”Ò‹F– -—´ÌÝÇ‚Nfo,QÆDOsôœ«žö™óÕL†<•ž85Ï C)y/õeîó6ý¹ÿaÎÝ)ÑDqªÒ±f¾eªÛ -˜xˆ˜÷·ò8º1±}VŒ€·rKeæ³ronò'˜&v¼ÏœÓÌÆÚAò•œ?¤µÉ/¸*ðºå¶®úƦ>mw¾"Ðü®&¹èqk¼²QÜá;õ~Ù~Ûû|-ˤ=E9@°”/œxœÖÈñds»R< ¢Þ3I+¶’/,Åìúì'¬`}€à4Ÿ·ay7IF^(47T$nhöD
YÊÝêç©!ÂŽ}ÀH||Ï -%šÆIœ-Ä»Ôá¦P>ÜJ “ãÜÚ[aڤϯ\úµ£KŠ?ãpdJûaŽ:uóÛg¼Ø[¾Ï÷‰gQˆ…JÈ&Ï¢
®e6‘”Ä{ž\b/Ñó.Hì_h0¯<
i¤¿FC¾nêÖ¦F49¶3e۞܈§N’î«Ÿ!ö—~=-ëþEÛPb7º§"v‡Ð^b› :ÑCo¨ÐÀ¹ëY‹x¶ïû—Ü£LE½×M¾ðœ=ˆ”ÖŸü.˜ƒ'ÚdOW#\s1çÏSŒ–ÂÁ7á™ÑZu¸ŸËÅ!Éît‘é M9s¥hßÅñ`J”wÝOwÕ‡·(Óà¥f\¬4ç› †[z·kêæïgé@¥6úqì0Uº))&Ù?’O9û8"RVt2TORÍNy3ç´3iÞ¼™Ä4e7sýÓ»
’ɯ`W`¦lûŒ¾CH’&ɨ£ß¡¬|Jþ‘ÁbþÐО×CØÕÄ5zn`˜õqF[Ÿšu1¹èüNÎWgÓÕ3xM&þ³äsÈøO8(cF‰è+‰é¾PV0ÁÇ-0^úÚ-å9È-ÛäU»wWr:ƒ=Þó -5y¦æZY‘|Q©-%Å9G¤pÚÞ§ì´`&’~2ðŒÞxfï_æYïZVôˆ*ËÆÙ&¯QÉŠ„LO‡TQÈbCãÒvž¤+Üó—M{hûŸKý¥°ïm“ßßåm1«Z¢LÁœO¢ŒÑ\zÍ9O5÷„#¢×5ç'D¡eÁ§Â>¿+ö-oŒco -.ÅB"Ç|c‹* -@ú¸ã¢S$øJN&LÓswШ“è,š¨~Ç«¹•r½ŠE‹õ®*?9ŸuÏ¿ÜX{Ìê¶ðSz´}BLG± -ãhD…ï|)oŒ‹Ù4 {3c4 †àõ]nek!”Ӈݥ¿-#z‹6wÙ$ÙØmœY;Qi¯K -Ž7ʦ®„PrïÍê|]öÀ¾ µcY=¼N„M×ý#ÆÃQØjÎ`êžiý£ƒRžr)¾v7¼ƒºóæ8Ô½ -/kV#ðUÆÄyàMöÂÑs0ÿ2+L"•ÙìRâ×òûÕÏ¿×ôøö -ãà6? ÀûήWòK¯Q¹¾¿zsõïóË9¸)˜c«8N†oâ0ÿÓ7q¦.~I3{ö¬ÉFi%¾.÷cà¡oøºÊý‡öîX4eQ9:YÈ㨬#é*ß]ÎÙcª±ÆA_¿¦—vu{i +xÚ½[YãÆ~Ÿ_¡·h€Q›}ðJNìu6†M<ˆxý@I”ĬD*$åÍüûÔÕ-R¢vfíE0€Ø÷Q]õÕÑ=zÁŸžé(›%y¤ò(wÑlÅ_ßi©^`ýbÐàOwŸ½ÊÝ,Sy’Ì78€2Æ…A×?Íõ=ô‹£ù_î~ü+5O•N-67‘ÊÍþv¿0Ùü‡Ðè<¦QqžI«Ï±~fãTei,eËî¾zëŒ#÷Ám`ýÔ6r˜ÒÊ6fIœ¨ÈòÞWû=,/Oçusoâù{Ìdó]qo¢ù/÷:ž—\]pÅÛ(2{)Zû}¹æmi˜/S.Éx’|°±cµêÔa¶Öbc!¸•âñïõ|Wuœáo:ïwå€ÂyŠc´ñS|{¿HÌü+ú}¼·zþ$õüü~¿£’ÇëU¸\™<—FÛk꾨êªÞòjpT±.»U[ûª©eÍæÜOqaì-G¾Ò*cO‡þÔ–Ø%³óMÓNPÎe*ƒ#ŒFT_þ÷zÝ rjÔƒAÿu¯u4oN˜sóº„Ó¡ò¾áo{ª¯™•Æɧ!¤Ž=!›zŠ/`ª,~[¤Òêþ¾êwšXe±–¦‡f]þþûØrGw=pšÛ{–éÊžÊfNåÖŒŽêtD‚‚d¿ñþGY¬9÷ÔœÚ+ú%páƒô3D?= Ÿ™¤œ}èPÔ§bÏÓÒéÁ·+KN삨j×òíA|Ô%nX ªâYb
ˆ
AWµÛ'þ1@ßz1hî‘$U¸)«ÔÙi¼²6W.N{YÒdj®3KŒ‡aI5oøñ>ƒ£v8zºObâ>-NüûÔõB›§cy¹DYi\' +Ð|¸Æ -ÁmƒÆ´Ø1›ÛH9„é<!’(ºÍõc¨Ó:EÆ°µ÷.òÛñç|ê„ +þ‹¶¯V§}ÑJ¾ê¾ÄŒËI&„yN«ôë¦D3Õ*É=òìÿ½²úù`cY2Mœ¯éºj ”çišC H˜ Ù}õîé&Ñc¾(Ñ/#ú ñm¢ûFC¢ÿî¶Nàvö.¯êã©Ç¤öçò»ç†~*êØ6ëÓŠ@=ÏáH®)›¤Ðmzýæ0!ýV%Æ\©¡l^Ôk?8å¿~ÅÙa‚Ça£º8”\0<¨È%³ +DÚNðjÆM”w$ñë¥ÈÅØ +˜fÒL°5¡öõé°$ö„¶‡â‰Ké¼õ_mÝ6e[ÖýˆAg°~°LþÛ—uJøb¬mÙ‹Ù +7wÐŒ¶*M<ü¦
-ÈŸ”WØLÆÊ‹,=P^ílFe <±Qø#à^Žlx›a/žsã +Û°ìI»‘8âf£Ñ.—%)\òr½ODZá»ôv/m~XƒçP‹Öc +i7V79Iý† çmr˸4ÐI?cƹ½Œz€„øðeíkcî"=
åÌ òü/‘ ì+‹®öÑOdÛ”2îû¶©·\<œ
@“_=˜é7hqv9‰½Ï‹Nü"O.ΕÑ㧳‹‚òp“3 +÷Ñ*™sTYˆwE@Çð"¡-W=ˆ»w®ŠàQywJblrbAåÆÛݲB’¸Ñfb +ðíJ“\Ï%X
š¤/Ý[cÒûë:1ւá{=pîÝ…ËofçÒ¦';ß9%ƒušO1ùìÚ¦£Èã¯ÁºsPù:ÂÄvîèxÍFVe^WÃ-l왹‘Ö~ˆ çßߺò4 O6ÆÐé‘"ñ~ü%‡
!‰˜ºé˜ŽÆtcèz€¢Æ;3{D€NáتKœºh V—½®ù;¸p[
W‰kÆ
ÆzHuŠ§å%_ƒ<¦É»ËšI^°iP«Ó-aÌڜ$UHŸÕ:dD—K
ùØœ$P0lËÑ—C_:„ÛByRméçöÝ—RRË0òú`00)¸ZL‰œ"Í—NÝ£:•k÷)¤mx·>-‘}&úf0Ñ÷7'…¼;‚+:€oøäéÈM³©àD*š‹HãQMªëºÓ²ßK‡UÕt€Ø+)9Õk +¶AÃ÷»Šìb—CºTìM÷]uä":i**AS¹ùÑ‚á›1$
+ŠUÛx6HRðŠÇ`^uÝ ÷–z +â‹^D ©×„°`©ø’ƒ]Ëk«Ž>¼œDé[u.» d_#3*J>Å+Â8Þ^òî•’‰1•/ÅÞ^ŠÝV21X‡zt߇›ô{æIRM ›~€Å²\e6}î®N9RÎÚ÷ü¼Ï‹øhÁñC¿ã‹îOÀðŽüSzêÔrªÃ[ïGWAJ(º|±* “£_SH·FÚb$UÌ3jèç»I#cbò%ž»‚±ßöºB‡jÿ„ÆçäVð|¢üEmE\}øœr«¢½pǪ~ao +endstream endobj -496 0 obj << +547 0 obj << /Type /Page -/Contents 497 0 R -/Resources 495 0 R +/Contents 548 0 R +/Resources 546 0 R /MediaBox [0 0 612 792] -/Parent 410 0 R -/Annots [ 499 0 R ] +/Parent 452 0 R +/Annots [ 550 0 R ] >> endobj -499 0 obj << +550 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [290.892 637.927 297.069 650.72] +/Rect [334.309 628.974 340.486 641.738] /Subtype /Link -/A << /S /GoTo /D (Hfootnote.4) >> +/A << /S /GoTo /D (Hfootnote.3) >> >> endobj -498 0 obj << -/D [496 0 R /XYZ 110.999 687.904 null] +549 0 obj << +/D [547 0 R /XYZ 108 690.907 null] >> endobj -500 0 obj << -/D [496 0 R /XYZ 125.345 147.939 null] +551 0 obj << +/D [547 0 R /XYZ 122.346 144.929 null] >> endobj -495 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F101 484 0 R /F87 383 0 R >> +546 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F120 538 0 R >> /ProcSet [ /PDF /Text ] >> endobj -503 0 obj << -/Length 3815 +554 0 obj << +/Length 1719 /Filter /FlateDecode >> stream -xÚµZYãÆ~÷¯˜·h€Q›ÝÍæñè5ví
ì8°ˆƒ8ES¤ÂóóïSW󹇽ö}T×ñU•ô] -¬üv¯Ý®h³{½«¸½á
¸Ò7ò=ã†pÛ÷ÓÎ*Ëñ¾¿ßGf÷†þÿþëÝ[*½>§I•R™wÍò_³§Bñ6pèNΚg5Ô쪲ë‹#·•õt,¾LŸÕǬ•îïfgµ±¡Ã&‘Jmx§Ul5íüÕúdV%&*ŽcqÌ]¨BÝí2!7¿–æ$4wSëϼ`2[po£¸ìÞ?(ŒûEÛpè -¹ùú.ch¡¿FocÒ^ò^'»§áRÔý75-‰^X@z™Ôíú¡xÖ#Wé~.û³Ì(Ú>+¥ùÚ6È ¿•Çâ(ÝÍåDí¸öKà¢6íYW/D‚½œu~½kÓu塬Êþ^Xà„G´‘Ý]+Ú‹LØ$Q(ýqÊÂîZñÌŸš\ªàÊÄ«PaŽ
ÒÛÁ]ó3ñ´6'ä÷wÁÅd™ÓŸÛfx:7CÏíÌYÐqlr"·â§VéØ..ü- š±Ïôµ»KÑâHTEÎå°ê…Kt -*DzÊm]|+2Ââs, äÁ¥¸2²õðÄØŸ_ï׿ªñX/2Å_ÊuÓË/
,9¿\D—ëÏMG/.èUsÓœ¢P}.+ä¨8`--׬ëHâ¡ÜÈ$Tú8JÚJïÇFE:õ
©ùIå5ª³ûvaðÿOkU:Õ…%xs-õQ43AI|—À. -¤{àÕËž¿ò”P:Ⱦe}¤ó?C×ûÎk(g~ƨ6©ÕwÉó¢ëXH¡þÏ{@8»fàÛ,´ Ý,fˆHTÅztCÆê5~„TΛmI
©×tÒQn$ZË×ïŠ|è>kŠÅ©²¡• £Lâú„_àËd$ÉÀ•ÆÍYè°2™¨¼à±ð|O$¨d¹ªüŠqq¦B¢U/¹â,êC”
XíécÐÇ'\#ª^qÏWy?¦×ó§Þà†:Öª0™Sç#X"ðŒ/ë²h1òkË#ÛSÚñgÇ$Öó¸+o†–
žÔôv
7Ð6L—T+.ÑÁHs”+ZÐ":P˜aÌ”WävòMò—€~€kÐ:P~Ÿ†ÒQ´Á¡k7D0QQ`7E0IX“Q›BËAöõ"M™â»ACA„‚ºu’øžtW5d¹zo® -—ŒßªãIÝ)/qrÎMs™Î£1Åío{þæç¬~ò« RLEz÷Ìà1¨Cg—ø©¨É‚ã80²‚…ìx'hz–m;ª°©£Á Þ„«ËuM@«hi\èÅ–OìêÑÆ™ìVÊ—-0»ñô -ÚeÚÁné-´ƒõÑaõP`õ@q¨¬%ì´¹E -fn
T.Œ%áD¹w½±2K¶
À¸xÔHäæZÔOmv=w§²Ú -¢,x8éZ˜øŽy8iŠ—H›nO’ñg#Êj´ -á
²¦ŸdœìŒ€¯xntUDØ\}'À}µyP Ïç‡x©yà+•=YçaiÔyÔ-€µ-²#¬¾*òlè¤ñîlp_âRŽ§þ,÷Ž'T/Ó¤[s±w‘2f{|…^LÅ+2lA¾Û { ¢$\[8B8Æ"°lª#IE´:ŽVucôqó„àµûõ»ázÝ_'Õï6xÏ‚ÍžÔÀûM|†uä$UÁèŽÁª°¨B¶vwÁ76
”+Ý¢¥q -6wÏgÔJX‚óÃZ›â“€ÁÆDÑø„ÅðÄŸ$<x’ö ¥}A™EXÿ¡¬ŽŽü‘};ò.‡/z¹…´m‚²^9t¿CM<A<tšn%ŠjÇ"¯²vÔj —oÂ|dV’(=ŠËï37úv¥D2øîN%&Pb›Þ¸–æ£®å ¢ê6\ËD%Qòa×ÒÜÐø½‹-€ï'ø©u³\k!'ÚÂÅt"~jB“¾Fu‰4B=X‰çC+p$ΰ”ˆPK6üE3[H“$DÐ_0ªýfìÚ¡A*Š+oÅß:g2µ–©Å˜Èà:†,êiÕy‚Uگϳ«Ç®«ˆSpÁT´ßÖüå¨áð¬.Ħ2Çq¡ -â=þqæ_àõ´_é™ôÕw0¢™ÞˆHJµ¿;T¯Y+×àó8kÖcJè +xÚXKÛ6¾ï¯ð-2°fIŠÔ#—"
’v‹4 )Ðô ÛôJˆ,¹’'ÿ¾3œ¡-ÇêfXÔœùæ=Z5“ð§fJf³$—"—él½»‘³{ ÿz£x{û‹Ñ_–7?½ÌÍ,y’Ì–[d ´6'&ËÍ_‘šÃ=+£ßæ/÷ÇS¡Òk)2
¬ñØ›ùBgÑûÓ¡3O-lžñ©ŸqÛTd©ešAÚÍ‹å §•æA5pJDƬÆ,±‰1©°nw»¢Ùô·óEœåÑÆ}R7nC¯UC϶q¼ØÂ3—Ñ0WQéh7jדz +äfÂ$™–(› à}WlWEïÄn{2Å —ÍEš„“m7ÅLƒmÓ+^û ^Vd9„{Y²u±ruOkЛ4X{Ðg¨Úì€^ +©C¶í«õp +âwàÿ$|AU„.é'°äÂØ„¯T=‰ªXÛbˆmÝz¸½Ü8–Õº$Òºð"Å8´)~
äSœ]øÌG¨†ruìªa@ð£À?K7aÙT +œ“ɶOã˜OP) †>»pQªvüQŽœ<õ22‘ņ9ü1_$ + ü‹Àtb00I—’/´°bÚ¾ka¾ØM”q-0yÈÆ©ù"˜š¾êÓs˜öTwû¶&*U*Ôõ¡¤=¼µë{z!üZû–qýº´q·¥§7<9J5‡$ÜØTXZwUS|f冣ó–sNQyÞvX.‘€½~ë©1V°éл9_ ¥+h×U*´J8ÿ%´7S +4¢l*nàŸ,|Ûs|¬‚li;ìNÜ‹CO¦¸…Õ®øˆ¸ÝYÖÓ5Óö¾®ÖÕ hŒ¤¦6Æ
QªU +£HæéÏ¿—m7”Ô¤Uâg$Óø‡Öh¾,t‹°áý +‚€‰«b¨Œ'–É#ñÜ—+øl¸ùÏ> Ýú¯žŽ^%Æ߸àê,/X©è~1á“‘i¬D23‰Ì„1oU~|ôKö¬¼@Ö9¡2‘Ú·‡ÎH–ó<ö”³™Î`ÒX$±y˜[º61õ+hfÉOýé´l5!{¿CÂÈN—c)’ä;S%'§[_8ÙsNä¤vP¶ÓìÛêå~Ô<»¬£guß2o;â
hUø*ö²g‰Ðpucš±Ü–¼/¥H¡*ŸÉﮑâW˜Ô„†wcå„ëÞß«ÌìÅhz}å×ÏF“ìë ››0Ñg8Ø owŽVÜÔpù S¬è*zH6×{aUý@«¡«ÜfhŠ£ù¡qÛÄ¡ÑmªMód®²ˆ…Qoé>rX™L$yv9‘TCIeú9Ô•œB7I°ùƒµiW¨¬ÿ„ÿÀOœÿ +endstream endobj -502 0 obj << +553 0 obj << /Type /Page -/Contents 503 0 R -/Resources 501 0 R +/Contents 554 0 R +/Resources 552 0 R /MediaBox [0 0 612 792] -/Parent 511 0 R -/Annots [ 507 0 R 510 0 R ] +/Parent 556 0 R >> endobj -507 0 obj << +555 0 obj << +/D [553 0 R /XYZ 108 690.907 null] +>> endobj +552 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F90 426 0 R /F120 538 0 R /F95 412 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +559 0 obj << +/Length 4010 +/Filter /FlateDecode +>> +stream +xÚZY“ÛÆ~ׯط`«vá9p>J.ÉVÊGÊÞT’Šó +~>÷eSwáíþúÍ»<ºÉÃ<±ø…º¹×IÙŒÆ?]ënïJ‚Â:wkâàÃŽ×76L+iÐßê ‘âÑ
s¤ažSVC¦Â)~¼½OLðŽþÿ
þëà=•¿]òfòPgþ»s±ý½8¸çF;·`% ¶EÍŒl¤·¿´µÛÉÈšËþ(Ã]Û¥4ŸÛæ™ÀQ¡Ñ°Û~gaþåéÛæt*ê]wÇÕÍQÁ¥çÊ¥Þ¹‹QðÃd'ljh+´
X’£ŒOèõrÙ6ÌLscˆ«(ŒLŠÍin©ù4gôÿd>ð àÄž„cÜ,U××N†ÃëüÊÊzüš +]-Zé^[H›ýâõ$Ÿ³"¨Aæ³0J2¤˜‡ÆÆ"¿i]:'ⱜ=1´V³¬€Ó1ÛĆ6²³c.Ú[‡ËÉÕ=ÈšIãà×æä¸4ˆšIEÔ°u#½ÈÕöH[ ÝÍÕfÏ]°‰B¡æÞþØ6—ñÍ'É¡&¡³k¶Óé¿'•Ä2à-Õ—«²ëi5j¶ v©½¢©a¥(Þ((ÇÒÃ?W‹^à ë¶m ËD•®¹
VBfÙ +K{nHpBnø±i…êÎFUWNÅ÷o¤wß\<?|_ôN(’ò$³å$´œ]Ùm/]WÒöűdâTöö® +Þ{·íÝ.䦙GWìÊú #7®jpì#Wåh븥÷ßñÙsc]œÜݬæ¬`-u‹êDNÅ6yJp6HÆdA¹çßmÉü6±ØTNúy(ˆíáʾi¥¬,Š+£äM?dþC®¼®½qz„zül©w&ÏÂ8Š>Wó²P'~°ç›ŒFª²Ù^Ô
êA2qjh%Pì
Zy“«ÙÉÔÜ;=;¨>–Uå;ø÷\tœidÎòLTO}é«ŒË/,G~éòQ¯e‚ïg^ÿÿº\|‡9yò‰ïº¶FEÜñâFNÔH!ס¶ïä`w`oΨõAÃ:?Ÿv5…ƒšmê(´*86ÎIœÞŽ0ÁŽÂ<š;¼÷(A‘ Šlð›R¦Z›µöŒîÏå6Üî+[òy³MÞé#/ò¢0MÙó,rŒÐ²‘yËúL6šþ{édØÆíÉä`ká¿í3Œ(|7ì÷Öu›èø×Ö*h.ÜËfš·-Ê +X$Á +™²d2‡ß^¿#s¥Û³v‰kP^ôêçÍVŸÔ¾b¦{Ô„Þg·²{ +ð;ÕÖh¦V´_k«Zª)HàLMòǦî] 0@&È( +ƒUQ¬–Ó„†gýA +>4ŽFA<€‹ÃÞ}\ž pMeÑ*–2˜jEœ¾ç¶G„¦$ŽV<=vŠ8BSW•‡cOð˜(‰›°^a(´4²$„¢"š×"y¯A]ŒNgù5¢ îþ}Ï¿túð{.Zi!†f€`ä$s—f_E+ã9 +€ƒÀ'i3âRɇ¿×lÌeÔ#+îd¼§»k@¼B¯-ñ·( +ca(`OexkL¨ý +íä(Méd„„A|D¹ý +éÈ„qêñÎŒGM½,ân‰ì +¨ãÐjöuˆD·gkBˆ÷fâü–þ?ÜZÆÛZðöÏ‚±±åaÕyĀΊú@AÓa.š¢ž1Diµ^è±p*ؘvüQwvÛ¿Ür÷[ÒW×ZÈí¨ÔøõöX€Ñ5ÐÞgˆçÍÌÈ2të]-‘Ñ^ÝŒ„+ 5i»ôlèŒÕègДÍG\žÎ+ê +Åçç6ŒU>³6>·‰‹Á³Åp6[Šeü®I[}íÁó¯° Â$‹f9&&û›Šø~8@ü^»ÊJÑR×ç!ôUÅúŽ§2¸¨²Ÿ.RƒÁÚ] +a{•|.êÕW;|†XÎUÝsQ¯ùäêæjqfù‹1tñl’ÌbèoѾ"œ×š/;,&ìq +nÃÜ¥ZO’V® °]´ã¢¿È¥±5%=ë^ÈûáBë1äDZŒuBî €~ÝpÙ*$š$O\7âêJ—¸Í$9l³1V¿ãv‚‹X(øg[ø¸ +Æ;Ò"lGÛíé¬Øg°âA‚ðtzOh=p±×ˆiˆß +â_ƒû&õ‰oŒDùp_FßO†/á÷I†ûé +à‡8#7!¶ü2æ寀Ÿöá½l?gËøT:Ÿf›Iô'F@ŸîÏ%½—²w®tð{3€.RùŸ‘4(®àÈT˜_áoÛô…'rn6Î jþß3͘÷YÄÊF*VöžâS,ÆpÀz°-¼QžSÉÅNXÝÈ{‚òP7ó—é +¸IæÖ3.
kå„€f)^¬8H3óòRÞM–ò“t®iOë1“ÏúÓóy3,^¢ óïCì¡‚Æ!ƒ¢ít%fýžÜ +!›_žðË©˜Þ‰í.[çO‹]ÛRŠ'×uŒ1¡ß•ØBǾmN\bÀ‚W©J'Ÿ÷¦¾jÚ% SaÿùI4fÒ?}™Þ_&ˆIñJ—`kªbëåÒ€þ©ë×U|QöÈ©8ù—QÑìÁZ”О„œ +׻˦tu¿fä£,̲iسs\"Çl¢o~Y!3ð†§Ä +ßËÅŒb`úRzF_w7rM…ÁÔEø Œâ'¾÷ÈpøsQ’ûr@¤ý+hÖX“÷AP"¦'I3n 5e’&Û©3~‡…Íù|[•ç3ãA~0” +I1Ž˜&(xd\Î<h#ä*~ÀEµŽ}”K´+oïøƈö:‚7œ†ÁÔ…¼i“dOÔ’÷ý[É6@Åÿ®š$€ÿ=pn>¸¶*nÂ>U¡0à±Yäª6$yÇ'R0Éþ@¡,pƒøl¤‰Îå¶çã‚ +^—krþ|>i˜e>›«¼ñ’ü Ö>rÁÍŸ<Åt»\8QöIüßsºÍ†ÍnÀÇU5ȇòHós±äßpúAØ%ߧm8?Zäû +|Æ¿œâÿ/Dº +endstream +endobj +558 0 obj << +/Type /Page +/Contents 559 0 R +/Resources 557 0 R +/MediaBox [0 0 612 792] +/Parent 556 0 R +/Annots [ 567 0 R 571 0 R 572 0 R ] +>> endobj +567 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [481.743 395.252 496.189 405.807] +/Rect [484.742 362.374 499.188 372.904] /Subtype /Link -/A << /S /GoTo /D (subsection.3.1) >> +/A << /S /GoTo /D (subsection.4.1) >> >> endobj -510 0 obj << +571 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [420.877 168.238 435.323 179.182] +/Rect [426.019 231.016 447.937 241.92] /Subtype /Link -/A << /S /GoTo /D (subsection.3.7) >> +/A << /S /GoTo /D (subsubsection.4.7.1) >> >> endobj -504 0 obj << -/D [502 0 R /XYZ 110.999 687.904 null] +572 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [422.276 123.42 436.722 134.324] +/Subtype /Link +/A << /S /GoTo /D (subsection.4.7) >> +>> endobj +560 0 obj << +/D [558 0 R /XYZ 108 690.907 null] >> endobj 26 0 obj << -/D [502 0 R /XYZ 110.999 662.997 null] +/D [558 0 R /XYZ 108 666 null] >> endobj 30 0 obj << -/D [502 0 R /XYZ 110.999 461.04 null] +/D [558 0 R /XYZ 108 426.135 null] >> endobj 34 0 obj << -/D [502 0 R /XYZ 110.999 306.146 null] +/D [558 0 R /XYZ 108 273.298 null] >> endobj -501 0 obj << -/Font << /F85 373 0 R /F78 368 0 R /F88 386 0 R /F87 383 0 R /F105 506 0 R /F17 509 0 R >> +557 0 obj << +/Font << /F105 415 0 R /F94 409 0 R /F107 429 0 R /F90 426 0 R /F120 538 0 R /F123 563 0 R /F125 566 0 R /F126 570 0 R >> /ProcSet [ /PDF /Text ] >> endobj -514 0 obj << -/Length 3568 +575 0 obj << +/Length 4032 /Filter /FlateDecode >> stream -xÚZYsã6~÷¯ð>Te!¸xå-ÉN6“Ê&Ù«’ª™<P<fB‘ -Iã¿Ýè Jô1»)WYht}€êZŸºVJŠ¢(®Ó<…´×»Ã•¼þ --PÐôåíÕg_gùu.Š4½¾½ó=n÷ïVz½IäJøÿfýëí·Ÿ}gÐMfØK+¡‹„»¶k•¬>®u²rÝzt]®\=ÖåÖÕ=—°©È¢Á7<wÜ.2™só{elûÑuuùät©ÚÚç§Ë¢éšö… µ5Âfát v¸zs;rÏä…ȲœøwÎÚ)¤Raá”EÌã01Û0L‡Û£ëÊ¡j>P±ìwïe¢(‰‡o4,¢º(Á×£dA«Òñ‚´\ù3#1;w<o’ -{y-c³E®ž¿–x¶L eÌë§{êZÆ Y@g - aTîG¾m€cE²îvu,ûá†êNÍr]fM·k5¯|8>µœÉŸ¿²®y‡²þç@kñPß²ë\9¸=5l/Ï«¤VÚèă¿¸r"ÃËfOTCO“w®QAuûˆ›q¼×1ÊýÞñ ¡Øë€à$Z¨$*Q$$AÇj7œüà$·üðÊn5t
ÿ×z“êÕÿÿvmÔê ÕêG_ñƒÿÿ“¯¹
R©¢;ÏDb‹p²žVĽ!\`É®ÚÝîÔuk“à¬I‘ë€
‚ÆßÞW==”{7Îy ª?ms»:xv$PƒëˆÜw%rñuÏ®víá -söTU5܇{¬ÕÊK@DJºcò®kDùƒ"ѹž×kïfó°`*ý|ïš‹fXé6VñNqÇÚ
xExN9? M)•å@µA‹ócbcÚ@Cñˆ{*ù…æ¡=rÅUTƒ -q¬Wäm<¬•\•T;í «±…›¹nëî£]ÑBIÚ -îñö€¤g Ð…03Á - {JgÌ4ñ7-^þC$^ñ
µ> ‚^¬[¤¢PöeÖƒøŒÝªp&²x|&BÜtlÝÌ3òÌ=™©h®XE˜T -±ŠúŠ’W ‚Qº¡"á^0à÷¾ä!˜ u,)8_]>×À¦\èVñPflO&›Ú‹ÒWÀËGd„™™ÌÛdD
‹ˆ™¼2{ÞgòÎ6¾¸Ó©kؤ¡*ñÀr˜–òôôbÃY£#Q6|oÀÍ•
ùØgv‚¤^ft:/ÎP@õ22õrÃí-ý¾¥º)ˆ†ªƒk¼?µp#„>XÀ[Ãßq‰Î¡‡úŽÍ=URqò×zª^yÄ,4¤ThY”x׬>›×^¸ÈQÁ "ÄôRõ!Ò#È» -æ@æùóÁhì\ñ„“¥Ò‡¡ŸÙÎçšµÂB“sP›ùAß·ÝBÎ…HÐ11ÿc$6s`Æ1Ž‚û<ž(º4(Ùþ÷Í õ?ý^J];¢Y$ -\P^¶GáB¯¶-X/òl ì òhÇ1ÚOù|s¬ÿò‘~gZz~úM–Åè™Î½ (³è\6°µSÒÊçD:0þbj¥°6dX{=wöD€|ôgl8?:ðOOQxÔuè†fçð†Yâxúíã4âB¾t -AhgÈwË,蚉2ÕlØȦ…Ht1÷ëédfŒe€:víþ´ó[B,CD£_Ã1 ôCÛÎc[úõq0ôkœƒˆ\x -2ÜÐNn¿–©È´}ߣÂzä¤!À5ûz?IæÃÒW$Z@²’‰=>ì§%v-ØÓÝ -;…“<p]?;%j vߺ^ùöŽ›^Ñc !·‘š*Mœ™Çj -Æ$â€kYÎ ØQª8¶)›¥<¤C3jËÈ¡Oyèã(²º¶A§ŒÃ5/è°z9ó»-¦3Л¥8±äNËS´ -<T½{zFâ„‘ ÌóˆÔ§d!\À_ïþ8Á¬TfË‚ù•^PARáZö>s3ëÍA -ÏT -Ó3÷lOî‡0ˆ»éPªà(b”ÒPØrkKÁ -°&}<§È@$ã÷$¬B7ü q}W9C-Tº£¦½Ù]+4‚eUaf5[ÖT›˜E|åCgŸþ:•&hendstream +xÚZmoã6þ¾¿"÷é aER¢Ä~k{Ýë½mï Ú~m%Qk[®$o6ÿþæ”d)Ù¤(ÄIñe8óÌ3Cé‹þô…NŠçå“üb³“\ÜAõ¿ßhi¾ÆöëQ‡/oÞ|öÖ§…òÎ]ÜÜâ +ö”$._9ì÷æë›(Þ,IŸ•>¶/IßÃ4V¤á2§Ë’ß4‡¾¬Ìh“UsØ=réÃ¥ÉVå®Þâ£^Q¾ÐŸnpY0Tª´±pä*÷–FûšRU¤æb¨ý™‡Ü—›¶é®ø¡¿¯ÚŠ‹uÇ£ÞU‡ª-wa‡F~«jË¥Û¦åžå t8[WÐÆ\®²x, ïuÙ×û¾úEeJ¡ç±Êýz'k){ùÝííåÚÚT9ŸÁ.µòYFï¼»E¥ElN\(·[),¬,3Êä/\WáÌ|]0n#3~ßÊ•Í
½eU¡Á.UZð‘~1º˜*ô¹‘ƒJae‹ç§ÏÎæÞ4[YM_þq©“•<mÊ6Ô7ü»µûUwå.ÃÊ}N'f2h!ûýÏåµ3° +¿ŒÀ‹ƒ¨qÞûj'Ó‘¹Â/ +ñ
úˆñwŸ«ƒöG–žgžæSÀÛ4§b…óŒUð»ið>¶’ÆÓñŠ@‡ºj‹9 â7»úx¬¶Š{ý„\÷÷ü$È
¥æ(Àeô<„ÝP.oyOÎÑ:ÈæÊh^å?I—ÑMü¡7p"f"‘‘¤##IA1IC¡²ÆŸˆ€¶\…(L}¤Gu,W¥?˜ì¦âöÛ¶Ùs%ÛŠÑõ܈5%?Šf+®üé¾:,5Ëüÿ‚ÌÀw÷x@¸Ãdº5š´5îŠH/òK,‰ Bé|ƒHo[v¤,Jä\F§Í·ü[÷Š¬àV85¾—ñ€Î=åùšÀCêØ,uëê~´*®c¼”mTsàÛw„˜}yáÅ"dѺYMQÉSœySž:"㤮fŒÊØôeñ¼´?u=Äô<
Ž; žÓ#ûðt–xKR‰CàXPW¯ë]Ý?r&KÐÒ«MMLª[ÄÛ[Dq°`k@2S0¨™9¡˜›Ý‡È +È´ãS#ì V¢-ÃØe?‘µN3ebÌûµ~;¢ÖÖàaLpˆ@æ¢/ÙEâÛ&•n²¿*ånYel®´ü?hÌ‘î"ËM~¦60üÅxêùáfmNý‚o÷èÐ^éÛ“à^kþžÜNZ‘zBi‹öº©ÉRi·
ÿ2㮎ƒ¨Ð•û*q'I¶V78^¢³z9°·&µ•° +c3ÂZz*;þ6k—@#ÐY<žØâ²Í¦‰*&¢W<Ç7
êÄÃH3Z<ù+n}@žÍÁ@j^ϲŠàUê°?öŽ²¿ˆš6vˆdÆjà&²™±A#X’AcfÇσM¬>bÀŠ»¸>†×=ÿÞ—Oâ¬
á´ ·‹YW°.i@"ÐÕ¼š¨\ÆhüPWƒ|)@2Á7šÌ†ÆDW€•¤Ø™˜Õ2Ïb¶ïzáÔ¤s +u÷J<• +)aèÈÍžå„¿üCÖK{ÚõBÝD‚‡ÛˆÐ2Q¦viЂ#ëÈÞÔ‘Ž5‹‘:…˜ŒˆçÎÀéøišåí(·òŽÊ_-„¾˜Œáq8ºd5%XSîöMןǀNl‘œõkâÆ5‹ÀmtªÒ̾0œ2¹™ŒÓ +Ðá¼}mrÿ…ûB«"q/¼ÿÈVa2ž"=lwK2ÉrЙâ%韜îy&2‘I6
ølŠAÀh]¶’m¿O5W²ª^XgaTr–¡åLB¶ú#)çDPµ.70™i·\ƒápÙ—B¨døg:zwÚ“ªÈg&–òFacÁÅ)kƒÅüó2ËV²³‰[‚jÅ$—KDÇeQmUvÍáZ¤åœý4;Vòm“†!vU?Lð%^ÿ=€é²`g.—MF
‹‘ÿìD²`%q“Ð9Ö„<R6Ê#A¤Ó +… bÒ´«ÞVg}Б”‡»<N<T¬‡–<¼UIôÜÏyx£ríç—˜)ã)N´åÍ·*`2ÛdêÁn˜©Ø±wô)¨Ý!VK¨Á˜÷€Š{ñ5?fº ¿²°]„Æ +˜ +eM±L<ö(‡Y˱ ûQãúÙöÃM +ÄÐ,B2ZÇßwHòÕ÷„Y€a[PÃ:=GèDÏŠ¤_qXg ê}ÓWŸsQœHÂIsêÏ?mI jjOD#û²}”U†ü>¼ëB`Æ8íä:½î)U§Có%r×xeÐW-DŒ™ÚÅÀ!_…@Iq§þ±aÝ ºK/Þ¯æËì7€êRh€éPû÷|Ø ]Г‡š—öLk…æšlš1Ä›ÌCD&o]ÁLÞÒÅÝD8NsÛp„}HV]%²œ±à.D%îAï¿Fx’(÷A^0_@oékŒ°+úéUÉ~Ãöî¯ôÀoŽ_à|›][Z@E—èI40JªƒšÀ™¦H V•º +_>È'LjÌyP-¤æ©ˆF˜j,^„w.Fí‚OœT§YˆÍ–cÂýCXõm¸4zXrŒ}i[bø’Söê,¥ÜË÷Uª~µ?mÃPŸ¬Ó¦ ⥌•Š ðÐð%ã(,¯Uûcÿø¸1XLüò+!P€ÕŽUÛçbWåï7,h^üÕ›æñq‰™˜CEYð´6Ï”ËÝÙeîèÓXx2óÇò}(Sr¡—üu +Ã$•¯–1`sƒäŒ¹OR Ìw¶ÕvƒYm€WäCµ/|»áTïæ^˜ºŠ£—„ÜKÃêD+§ý«rX/°ÌÏ$à´Jët’ÌŠ$ ‚ðýi×CJ¶Žas˜Šã§”XüTÔ§0“O5dˆÅ«´ÄÅ,¢ä†ûŸ»ÙL¼0, +9¼ðá_=´uÏwŽÅê—}óÝo\}[ÉB=âY;•ç5Øg‘?gHqv¯LDŠ0oß4<é®Þ×üy•
ô +`ðmÇšÓÝ}^’nGº#ÃV¹ˆó øa-
³V¬ÚWå¡»ârG®;”áÆ? +síA—Y/«ŠÒFý×ÖÔ emðÌb¶'+U§6ÙX_n/†ÚŸ%Í5—´¶”è{ڬ⠜ˆŸs‰UI@?Šã/&Ó丫_Œƒ"Q6€Én9š™/ê®ÆŒ'[ÁÜ>®S
˜²ø]¼õ8˨áÿñW« +endstream endobj -513 0 obj << +574 0 obj << /Type /Page -/Contents 514 0 R -/Resources 512 0 R +/Contents 575 0 R +/Resources 573 0 R /MediaBox [0 0 612 792] -/Parent 511 0 R -/Annots [ 516 0 R ] +/Parent 556 0 R +/Annots [ 580 0 R ] >> endobj -516 0 obj << +580 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [252.508 185.638 258.685 198.516] +/Rect [247.921 165.178 254.097 177.579] /Subtype /Link -/A << /S /GoTo /D (Hfootnote.5) >> +/A << /S /GoTo /D (Hfootnote.4) >> >> endobj -515 0 obj << -/D [513 0 R /XYZ 110.999 687.904 null] +576 0 obj << +/D [574 0 R /XYZ 108 690.907 null] >> endobj 38 0 obj << -/D [513 0 R /XYZ 110.999 642.808 null] +/D [574 0 R /XYZ 108 609.945 null] >> endobj 42 0 obj << -/D [513 0 R /XYZ 110.999 464.004 null] +/D [574 0 R /XYZ 108 431.141 null] >> endobj 46 0 obj << -/D [513 0 R /XYZ 110.999 347.018 null] +/D [574 0 R /XYZ 108 324.067 null] >> endobj 50 0 obj << -/D [513 0 R /XYZ 110.999 225.947 null] +/D [574 0 R /XYZ 108 205.039 null] >> endobj -517 0 obj << -/D [513 0 R /XYZ 125.345 156.337 null] +581 0 obj << +/D [574 0 R /XYZ 122.346 159.727 null] >> endobj -512 0 obj << -/Font << /F78 368 0 R /F87 383 0 R /F88 386 0 R /F85 373 0 R /F105 506 0 R /F101 484 0 R >> +573 0 obj << +/Font << /F94 409 0 R /F127 579 0 R /F107 429 0 R /F105 415 0 R /F123 563 0 R /F125 566 0 R /F90 426 0 R /F120 538 0 R >> /ProcSet [ /PDF /Text ] >> endobj -520 0 obj << -/Length 3930 +584 0 obj << +/Length 3763 /Filter /FlateDecode >> stream -xÚZ[ã¶~ß_1o•1#’ºP}K·»éÍY
ÐôA#˶º²dHr&ƒ¢ÿ½çFY²5³“m`À")^Ïõ£ô]?}§u¨²,»K\ª²0º+Žo»=4}óFK—PA šþ´yóÕûÔÝ9•%ÉÝfG=6ÛfµŽÃ@Ѻú×æ¯_½w)tSìe´2Y,]·åÃÊ„ÁyÏݦ££¢,‘~÷2̤=Riè¤ùgm£ãîT0Þy?tçòv¼Ä)§¿h¼]^÷šÄ*“y%ÁoÞmFNY—©4uÌ«k6®mª04Pˆ”K²‘Ÿ.¾Ë`;ã§.ê0žógÜϧ£˜D¥:»Ù÷Ø©Ì™Ïðq:^š(£í—Œ7çãøÂZÛXY
¼ÐøtôæÛüÜ—ýØä‘„Çjf~3߮։ ÞÓÿð¯ƒT~{;‡q*SyohWk“DÁcW
+”\ËùÑåájÇÕ:ïVÚ{ßéMí¹¸ÚîøY5@ÞµÝ1ª¶aÏbî†I&LU虨êv¿°d£F5ùD¥×©ƒfËå¾=–CuFñT²1™ònm@M€³‹y÷ew¬š¼ý´:þ<JÎÚ†ìd²
lß—M <)·\}xºÝŒNXŸÎ[
å¯^fõD6¦:øx¨pO8jÝæÛªY`Bì” ýyW=÷>uíCþP?q
Ï€W;+ûA¨Mýäy -‹Ô´·ãÍ
R+°CS{ôí)Ê”½~¾'ëóYŸçmP¨ÒÈóé£Î¯†ÇŠ+V´~a Å6îâÔ‚ÄßÎbJÆÝ.Š“NT<ãÇ©nfÆ¢8…n4œ‡|àUŸê¼(yÍ9Súc^×LéÁBñpÜAÞ)óâÀ2›@‘WëªÆÖYÑ‚ )í·«Á†”Fgd;z]{Eª_ÐÊ -¬crÎ$¿T(’aI—¡}[õŸ˜Þú7©ŸÊæÒ瞉ƒ_Dqh+Øs!Õ‡’µºl«b`ãI
O—qŸálƒ}9ò"[5£µŸC-zÛfA6@ÒôZ6vU]ÏB¡‹{m½~ÁVoE„-[ðNA÷ -é òO¼ýXΗšeÕPñ£¾üÌ·[ï1&£o»ë#vdþ¢êŠóq~°)JÅH#ûžîŸ•'L@⊖B‰ðïãœJ^m-À8F^nXa¯!{C ü‚>2ïªrxb:±WtÈO%9a¬@t#Í ~WÄ$hÚAqóÚ?Ê5oZ'ZÅZ˶1¹ 4i -¨ €ðñáÜÛ]D$ŽI‰ m³r2½LÔŠ93tdë;Bùa¼Á-ŸÁ–Ëà’€BMÜà‚ËÑíÄÕÑ7í¶\ð™1ÄÆ}ÆíD£ÂøѼd<évÏK<ä[¿¿èœ¥ÀÌ-‹ð
:üc¡^ü{¤¡@oO¨O÷âfL -É—›‡†žÙÍþŽŸ0o_.pâ„D¿V72ˆR²9”‚¦F¯äw¨\xÉêh•º5,‰ý±ÞIaáb¬N§;“’‡Ã’‹¨òPB> ¶T;IË<t¼²ExT\ÜÎý‚=ã-òì?ÛºÚ¾V—ÿ½Ý²6`ÉŒ úv‹óð‰uŸz®þûLñ@‚Å'lZÈ¿Ðz?ï1_p=ÎÀ‘ÏÒip2NNÏ““a¥žÛI2$’ƉH.¹$[ÒeV=Ë¥S,ygÔ
Jpú™mr^‡ ”/“ÅÏ:ÄY”¨tžeÐf)/ÈnbÓ#z;bCÞs±+Oxnòò}W~Å!‡_èGÁú|GæþB곎bå`Òy”}‰éòÝp;š†’¹BMfƒÌRLóza§"¿r<ÔÌ®PÇýfThyo`]öúdŽ†ÚU‹|ÅP7«jÚÉgyœ1„¥³<îïÍ–³)0“N¨•m̱òSÛ/E `ÌG/å}Ê8*¢1ÆiÏ=·ó¢k{nÇÔª)êó¶ôd,X¼#ðôúÿˆ¤L0 «<Vò>áU¿>« )?"RÕ³ -bþhõuLêAàîŒD$è?:Ž’\€à4å{o?” -¡%A=rYT¶mó\ˆvP•$»ÆaÙŸÊ¢B(«æHÊqÌÏ¿M2mÌxIÝ!º - û.?ª‚©²S¥{" ¡ÞlIÄ—Äš³yÚ^an!ûûÁ âÖaŒvÏ7“Ã{*=Á*ní¹Nãù¡Æ[‹$¿ÂÂõÖ"#ÂðѴͤÓÀDZP1ÊXø È:ŸdEµ¸òï§-°F½óñ<`’ª“2Ëc -2²‚¢§’©?ñK}™wš@ù”Râ8„¦dhAò-%<‰[ül•, -RFsARœP,æ5 ˜ö8yu䚀œFöJN®Ó Úq¾Ûñ¼¨Ðó1¢.;ÃTHÜ:£‡’¥™˜q#zyJã‰<¥Qp¬ö‡éÒÎÒƒÕîžI䥱Àf4?žêòžû°úCÓÅDKeOñöáK ’˜Æc\ -m¬¹@«¤OÓÊ„j"\ÒÁ_YNÞZG*É殇ÝÞ;ú߬¬† ór©ó=ý$Êæ–Ë*†zÆs¹AÄÊS{æC,âÆ5^L1ŠÉ1¬ÔéøäLÙÈL®ºqÞ½<óC™o¥ØHaÌ@°ÂŠ -KëÊcŽ«k8äŠ?›žý,’6”à{ç~!™Zë$„¼ßÍB¥Yr›^„ÑäÁÆ.ø€ŒS‰Ì€ÀÖKd´àyÆõÝŠ%,…ç‚Ý—y°…Cà ¦©¦C¿"ÅÐË9ÆgB:\þnÆÌwÂ+È(Í n;œwÏ(ô6xð‚Fþ¾ãíUñ äÕ&Šwÿá‰Ué˜[¢ýtž£ÂÄåf‡e€“W¨ãEÑh]°À4˜^L!›!&JY!±0QH¬Žˆ!;MVr™¢Hïc$æÆúÔð¸Qò‚E\0~TBvn6ßBÜ|çE*ËÌLû¿Ì4ýPSþ±aà\{:‘ÙŽ@púþÌ -Â6,Û6Á¾y']k s‰¿\1äÝ°ò_:!ƒ?ø^K…r%Œ”‰`u.ú´Ø²”¡Ù'nn‹$K/Ÿíš ’$ãP’BI?„ÔO&–Á0œf¬krs4ÆXŽÑÉËGcÓÉw»0ì)?ñz¹Kսβ—'~RŒÌØõÙôòA$ï* ç÷Šíy8QÖ_к¼Ý¯ r©3â‹àævÕ¯¼£+Ävµ†Çb`i›½„syã£9½{Ìöo‘lŸž+Pv$P¶až0ƒïO—;æE{ï•<×tSx»Žpª~d9‰Lâ[ º€J&iҌ҇[1~5‘7{y=)$¯*Îô+ð:~kv÷'X.¥çÙ9À&òüÓ6\d;.V^”“Ä/NØRŽ9®µó28ÅQb÷’Ñ6ò©íï¤qév/Ñ„¥‰€™þ¼Ã4pE{“&Á[:d×
ù| š3¡{Ýñ¤ÉÕG8\ûP -¾ƒíÌ÷4!¹àhêédxÝ—hýêÙö]{fÑÅ™:ÝÞ_ÏŸ‰²y^Ãsgñ•TdüUè@vZIDðé»"=Gè0»ììö“Uâ—[ö÷‘Šñ:p²ÛLv«xU+Æ?L0ôíÄaÙøé%¢Kž0‰@ç™1pAѪk›#¨ÆIþχ–ðI(åüàcÌ`ŒÞ^qŠøíK†¡`ÍÅäLŠ¶Gwj9px2l¼yÂ[ÉT˜|&~z?ÑïžÕ‚ÞdÊõ{Y -gendstream +xÚí[K㸾ϯè[Ô@›+’%å6ÙÌ$d±ƒ¬ƒÈæ –i[Yr$y{‹ü÷Ôƒ”%›ý —`1@›¤¨b±X¯ŠyÃ?y#ãüƱ(âì¦:¼‹ov0ü‡wÒ=^áóÕlÂïÖï¾ùX$7¹(Œ¹Yo‘€P*™ˆ¬7ÿˆÔí?×úæ£TÙlž&K€(NèËÝîVFvSÁßò8Ö];ð;sÒi&RS¸WîMX"FIœˆºüüG©“Ó`‘2Eš·+éæJ¤Ú¼nÛ½†l–AK»×L3I‘FN|÷a=‰4“g%ŽÏC/ˆ:JR)Q$@$5"Ö,ñõÞ‚…‰ªîp(ÛÍàze‹,ºwëa8Ù
·á™L£Ç‡½íà¡O[ž^·C½±Ó´IB¹HLŽ<¨8:ögsØëjÈĨʄ6ÒͱímG?Õ}×l;2íØF¸7ì»S³a`ný{»íz‹ÔoV*3’ )E‘¦Di\3(êw>ñb=»fiæþÜœüüÖ}c{«Òhk+Çw×6Žçz¼sCÀGÿP6´³Ë÷˦q[>ÜöߧI&?ƱÚz;¸3Y‡dDÒ0Rär!‹¶"*é¼ñ,búå_dŒe+óhwâÓÀ‘N_%ET†ä©c‘¨×É‚,–òždzž·’Y.Œ.àXc+Þ™wz¦IJ$ÒÌœÇÙs°9Bg,arÙ…¥ÃJÓ¶QäêI2™ù‚h!E’¾…èÂ}„iæFèÌL¾ãJ¦+²ÒxØ`w’mþÛ¸CW2‹§f¬›ºÅ³…SÅ•@$´ô¶I`òýcÐ`Œ(^m0y‘º©cÇD÷åûFUuL’ã#äËñ‚ +*ÂSÁY ±{Än=?û9“œÒô~=°Åè¼l…mÆг®½CõO¢{0aléßÀƒ5í[~Èg)xpÍÖ”L~# جæép2%gu€ OÁÒ#x@dz_mìöV‚ÃÉÿ–•žU/p˜E¾ãç•sŸ`©\ºŒÊÑü“ÜQNà¼ÊÁ
ýë4Œ5:$Þ0Œð†¡Ñ”(w7¯ø×Öè¹]_ÁÃbšbú4ì
»uXUuý¦nwŽ›Ž!<Í+
ÑʈLÉ€†`«gxñ +EYyBs©Ð†Ð%:¯I쳋DGNŠ1ãðü½_ãð¯qøÿ$ç/Åá½?íôPÝtú†øHjKÔÆþd3;I¾Šâ¶l†É\ +5Å°`À•å5qóyÄõ“3˜è‰øå¿»]}¤¿Ÿá¯Œ>QûÛ€]BÊy-Šè¡¯Ña³äŸ¾t>ÚS?ãÐÚžHo Kz¿u–z(I+hÀ›¨’±HÓÜË¢évV5¸™IÂ`gM8Š±>Pܹ^äY$ ¸jé2l¨Û²Ó&Ž~oïC€RQw±
ØÙÐÁì†aL–‚3×s‡(Fû³×™YüH +Lºü°¯qGH¶éJŠBW2H¡&W‹gûî¾¼G/„=<fCFGE/ÅBÈAm)”¯~þ2€jº£í‡;~ÀBAZ*áHB£–ÇSß’D Ýùgü»«‰$ÅTì—LccñÛÚI‰8È)aãi8£c"[PfRyÕ:ö5ÆQ· 2“ +“¤¸ìß·ÎëbgÉ9Žx|[ ™@ÿÅ;Þ +õÊVe™…‚‹œÔŠÃ.SímõÅaTØÍ;_$ÃiíN¸ÈEë'\¼ä„«Æ–·:Žúè?îA¼ …&”c¤™ˆyƒEÚý +MãÓ¦¾,Á¸§ βe4GFwÜ› VµïêÊzÇÀ)Q¬F—§N&`†[{ì8º3'¥Ì/ +Ù4 Ä×)ø9ënb‚d¢Ð©Ì¼ÍÁ…a·Yñ–Íæ"‹gi?iÇ¿€{¿)T׳üÎ=FͼT<ÝËÍf‚<õM_b¨z˜ô«ÝúUÝW§Ã A[YÎWY K.*t(ÍÕVâ*½p<é îL¿ÖYࣦ|™p¬åR³ÑãÈOʾ¶ã#ªA×±/–P òH‰!=ó»s3ºË
; žñitõi2pXKü³Ô@†6 +Òìõá4Nò—Ä•&ú•ÒÅ„ó®çÞ1ó<6óEÒ¸½y÷‰ç¤â®ö;/Ì ŠDÀ=—ÝÂ/iM}@Ö ÀûÓŠZ‰Èu”Ú/?tM½ù<–N"ûŸë}*óBFÚ3.Ì'×#`ÆűºÈšú>²ad•eéSô™P$c0¹¸>„¸3…$n.Naóz¾î<°–æÇ +%ÐéfÅ–‹@¥…Raàö‰+$ª|²W‘ÉdÈß
Ì>4œiA«|âÄät½z(Ÿ•˜Ûs_JéœBéöEÎð„÷ÀsYÚ›çG§ö\›»FdÞMØæPI*r +"+ä[+kÛ:¼U¢öVbmÇ5¯ÌP:¨ã"EºHÿÚnøBË]ókƒDήV¨¶å^€`2T7‰Á¼ª°òÝÉCCO€©;
üäPV}7ðCëa´n«æ´±~&‹>Ü®@«?Óßp(wõ5G˨”àÅÓ-å4=wçµ@˜WºSëqV®Dn®Ð5d¹=1ºÁåmßS¼';åŽÖ…øêhOñÆx/´`
:¬>¶¿A.FáÛ&NivÛáh«rºG^°v$ÿ<KÛu¦Ø*3ÈTn •Îù†ó} Á€t +Ó4gM;ÆÚ¢Áá’'þà†s€JçÑ¿GR0‘WÞ;ÆØÚmª·åÀGlòåG
¾o.TNœ5äš Èã©'䫸8ˆƒ„î®ÉWŒöïùÒ.´%èœ:Ä‘é$0åàg㥟£¢]_÷uÅ£n«L¥d°€³;·'Ð^,6oüG,¤Âk°%äø#GÒYE³Gà‡RÕîR
~9… Ö#0z¸Cc…m
¬ƒš¶ff[#Š[~Tr·íÚÙþGœªÖÚ—#´»ŸÑ>æöŽfBzQJœP½™®¼V:Ó,R÷®í‚ª,^¡‘üÒ`ËžT ÚÇrt-F‹Øj-Õx¡Eç¿÷n9’'¼¢%ð"óZñ0ŸM.õmš—'Þµo:;LfOÛ?ŸsË#åçytݧ7#-¤YÈ3ºüNªÈÿ²x¡1•’´7ˆWuàÎ:0EÁG~7vt¸{T—úLôeui0RM‰b~ æù ¶Ü+€‡šª¬N箨H5Cku¨ÊD¦’6¢:çÈ.] 8†0•/0œ~Ãs~ðÛóìÇéÌbtµg±å.)&íÑ#ð7|_U( +™ç°©ò&7ܹ3¬C™KŸ)ô»Ï»¸ËUÊ‹H‹ÿù¡0BJŠ²š*Z³ÿ‹Ê›É +endstream endobj -519 0 obj << +583 0 obj << /Type /Page -/Contents 520 0 R -/Resources 518 0 R +/Contents 584 0 R +/Resources 582 0 R /MediaBox [0 0 612 792] -/Parent 511 0 R -/Annots [ 522 0 R ] +/Parent 556 0 R +/Annots [ 586 0 R ] >> endobj -522 0 obj << +586 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [407.911 336.731 422.357 347.675] +/Rect [407.71 188.725 422.156 199.629] /Subtype /Link -/A << /S /GoTo /D (subsection.3.1) >> +/A << /S /GoTo /D (subsection.4.1) >> >> endobj -521 0 obj << -/D [519 0 R /XYZ 110.999 687.904 null] +585 0 obj << +/D [583 0 R /XYZ 108 690.907 null] >> endobj 54 0 obj << -/D [519 0 R /XYZ 110.999 662.997 null] +/D [583 0 R /XYZ 108 621.9 null] >> endobj 58 0 obj << -/D [519 0 R /XYZ 110.999 591.625 null] +/D [583 0 R /XYZ 108 514.827 null] >> endobj 62 0 obj << -/D [519 0 R /XYZ 110.999 436.731 null] +/D [583 0 R /XYZ 108 443.619 null] >> endobj 66 0 obj << -/D [519 0 R /XYZ 110.999 210.106 null] +/D [583 0 R /XYZ 108 288.725 null] >> endobj -518 0 obj << -/Font << /F78 368 0 R /F87 383 0 R /F88 386 0 R /F85 373 0 R /F105 506 0 R /F101 484 0 R /F80 371 0 R >> +582 0 obj << +/Font << /F94 409 0 R /F127 579 0 R /F107 429 0 R /F105 415 0 R /F123 563 0 R /F125 566 0 R /F90 426 0 R /F120 538 0 R /F95 412 0 R >> /ProcSet [ /PDF /Text ] >> endobj -525 0 obj << -/Length 1307 +589 0 obj << +/Length 3182 /Filter /FlateDecode >> stream -xÚVKã6¾Ï¯È6¨–äçöÔ.f§S´³ÅnŠèô 8J"¬m~ÌtúëK‘²ãL2‹Š -–~Xß|û!Ë9+Òt±ÞáŽõöÏ@„«$ -~9~£pÅ#øÿþµþ •2Æ3锤d(Òü5\¥<XÃW÷øýˆß‡Ior&–dÜë}¾´›°XÆ~ùýdŠ£‹Ñø~ï.KÎ’"óÚŸ.§ŒG©_þ
üŒÆo‘þ|%Ú\2ÁÇx2·áæv=eUæË`t-å+YD,Š1ËÓbžûÈyî{®dº?¨ž(Ý„q<™Ö6µnzæ|/xÌŠ8^¬8gE’ æ÷M¸’‚zŠ$ØÙ¶w¼ª£…Ö
‰jµÕ${„ªŽëvG«O!OÝvÆz‹Ë`§U ÖêKÈ!:âúƒéh}hŒó?Q£k<Ûaº%‰Tã6½œ{ïÞdiëžuuvØ[«fëÊ4¨L×ë-ÑjcIrN"HýÐ6¦Ùc=Ï[Às:íÆ›±”BbžMUµñ&÷•Ý„¾?´7`ºnC±Cß™-¤òYÅeHs_÷zw4å„»iÓjÜ5¯ô"'k—8Glõ&Q0쉅<Ö.ZL˜¨ÖoÔ.M—šrñÝ<í«â8»™sÊe}aaDš°4‡Â&bŽ¡ÝâÀ<‹“ôÒêJ{Ä -8¦*ݘ‡f‹³CþæÑXÃr:U5ƒH:ëËÚJyFÐÑš¸Õ×ÉÂÑÚY/€æ‰`I<6¢_°|À/53ê4ï/K# -ç‰×sI>AÒc.ʃjöèÚ ~rðR±ƒW8ªVÕº‡ûâ_¤.¼y>v¶ª¬Ó{•\Œ7(—ÉwŽ”AeKD%HMƒð»€K¥ü:ìàl§n÷ -nK²ï.ÁèËcQ?ú0¡Í:³±¤
ÊŽW~v<·¦7 ˆþ~l -)¼æÓ¹¼4—°hîÌØÎ6ÿƒ1DƶU»+¶àºæÅ×M½¶´3
庥ST”KhÃ6W2‹``HÏ^Ézcrô•S§,J„·ïðéÆ“ƒ6-‘þÔeß‘ -2ºô¢V«/Óãß³Ê)3èà”\¶ÔŒç X‰,cy9ŽS&…¼6q÷tþÔüPVendstream +xÚZYã¸~Ÿ_á·Ø@›ËCÔ±yÚ,f‚
M°Ó@dó Ëj[Yôê˜ÙίO«(K–º·÷À +l?ñAšcɇ…Óœ)–¨°Ñ¥Äóôù“kVÎI¡Ó`ïîÚW®á‹ÐƆžhÁkT4`_!km5[‚aÄÈ+Z^Z™Fî)¼L¿¨^„24ü.¬ªëqŽhp§6¹s Ê’¹£ÍNÏ{,é–§SyôÁ +©é0àÃ*äs[ªa²d’WŒœç•cÈ&Õw©6HE§”Z²q~-µÌ¹Y‘fc¬XÜ}¯@w±Å,jÁÙS¿îCë.…byîL)ÒyBgDb‰«~®º¾£çœVtŽêRòŽgëÚažø²ˆåZZ8Köz,ÿ0‰åß¿ËA†rŒ¦£…ßvRZ€1½¶‘öICýbÒH!ž1ŸpÁkÞutåªyríc9D*fߌø“#{‘´·€Œ bÔ<\+µ!׉¾üyy ÛÑÑ—±~<W1§ßx{tMI”Ã3QF÷DbáŽåòTžÀAsòT3§¶üi(;Ïd¡ÞXƒWf¯KýÃDêßóäšzM’ÜÄN‚Måû©`¯u^ ùù—÷4"J˜–¬ ]i%Òx”úÁM¥®”šIYóž×Ö‡¢ì=’.pD¹2œ£ëÛ¡ +¿—MG¸þ"˜ºòiñ½Ëç±=xw_šGy½¸YwÆtN†iˆím +;týx>
Fá)JΘ)––E‡Œ¹få„39¡»‚ÈÚüzz%k&)$–ôYùbÀ̬Q²ýÄ©¿R¾ös¼h´(œ®<B‹¹L€)»ä0±£ ©oú; Ì©€±1dF$çï +”¦ÚÓ†?L‹v^½Ÿ,_¬w,qkˆ´Z,jce²ffºù²OÀk^ßòŽQ€´‚ÊA_GøÀYqXqáÊêÝsy+f!òä.OÕ@nÆ¢xŵéDÿo†×ÝPsMͨ›±ìô`Ýx¤PwsT€‘$p;S·OÁ€;#f +a˜±™w|þµK½™™$»käc¿ƒ>…à\ßVeh‚0éf£´´&²E+©É‚à³ßØ‘1󺹣¼âÞàù+›€Ú‘üm-o+7ð×¼ ß#f’êy©v‹¨ðŽ +`G(ʯiÈ!Å(…qåÇÕ& ý’Âò—2ßmÜÂøï‰Þú=ùöÊä”jN;ý¶H”¡éÛ¡d–Ô‚AôstÍŸv +|9D+¬™[þÑ_+'õ9×î=× ×ºÌ;¶þÝ–—]˜ö©añÆ–:ì›Yè¹ó²û7õîZU^½(n%^f`:۵⿠úOÈ«…¯¶"2€¶'|á;W®‘-ãq—PzB~˯«_~b þ —ßÁg+Ô¤enë¦~57o‚Ç6_ûLê¿|¨_Ëì©jòúbÖ8ª¢–…x>vÛ‡L$rþuzÅ
c‘&É[»‰÷€6ûÌB€Å`i°Ïª%ôψ Ä>´'}âà‰a!Qc
¼™kI}ýê™"'tÆEÅ”ÛøI±(ÞûÚré“0r‹‘S…^Nÿ5~[ŠiÞ~kO3š6ÅŽeW´Õ¡dðì«;€œg¥¦í{GÊ›%¿Ð«÷“å‹vÔ=Kî€-vN#CbŸ°ZD°æõýîMÛ_ €ï]Ï@݇Ë7HTvK!zà&Ù¬›£ñÅ-¡AP¾Ùz=RþÁ»¥€OÑ^ÕõÀ°41À¾hïÙiþŸ(†ûbøQ +SAcßáóß7©Ãg&.e"Öø?
¹a—Сs«oðS(õy€z,ñ2hÊ*ý»ôë¿íû$”ŒŸÁ—_2íªDË©ê +yƒ´¸w“ŒGz˜~9'Ýd±PJ¯“ÉîrÍÿ"ò~’ +endstream endobj -524 0 obj << +588 0 obj << /Type /Page -/Contents 525 0 R -/Resources 523 0 R +/Contents 589 0 R +/Resources 587 0 R /MediaBox [0 0 612 792] -/Parent 511 0 R -/Annots [ 527 0 R ] +/Parent 556 0 R +/Annots [ 591 0 R 592 0 R ] >> endobj -527 0 obj << +591 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [375.423 542.674 389.869 553.229] +/Rect [125.29 486.035 152.189 496.939] /Subtype /Link -/A << /S /GoTo /D (subsection.3.1) >> +/A << /S /GoTo /D (subsubsection.4.12.8) >> >> endobj -526 0 obj << -/D [524 0 R /XYZ 110.999 687.904 null] +592 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [271.197 250.444 285.643 261.347] +/Subtype /Link +/A << /S /GoTo /D (subsection.4.1) >> >> endobj -523 0 obj << -/Font << /F78 368 0 R /F88 386 0 R >> +590 0 obj << +/D [588 0 R /XYZ 108 690.907 null] +>> endobj +70 0 obj << +/D [588 0 R /XYZ 108 600.047 null] +>> endobj +74 0 obj << +/D [588 0 R /XYZ 108 467.006 null] +>> endobj +587 0 obj << +/Font << /F94 409 0 R /F127 579 0 R /F107 429 0 R /F90 426 0 R /F105 415 0 R /F123 563 0 R /F125 566 0 R >> /ProcSet [ /PDF /Text ] >> endobj -530 0 obj << -/Length 3350 +595 0 obj << +/Length 3786 /Filter /FlateDecode >> stream -xÚ½Zëã¶ÿ~Å~‹¬QO*ý”¶wÅÍí-¨V¦×jlÉ‘ä8× ÿ{çEJ²t·{i,°"‡¯áp8ó›¡õ]úNëPEq—™\arW^…wOÐô—WZºÄE¨Â0‚òJãÖµnãD™¬À>|xõé“ÂܪHÓ»‡=õ}Ø}Ä›Ã0x8ØÍ6JÃà‹²ê6Úm¯6ß=üõÓ7¹¹+T‘Å<j«3•Ä}Ûl¶qZÃÁö–‹;ÛW]}êÚ¦gâU¯õñÈ¥v?XÜÙ½ídž–¿ÿöƒr\W›XEq*<±ÙfQðšþ?lb|E¼!ÂWôÿK¢<,wd*ö}"|3ŽÓΖÇã;,›àdËæ½|…‘Š¢èC|EÄ—~–/(i-µÝb¥ml´JÒ@Îðý‚øz"ˆ¼wÁT…n½OÔf›„” î¹ÄG•„E`û³…ìj–’-wR¨Ê^J(J»‰ÒàÇN<X¢Jkc펧À£FŠœ>Í&¤ª=Êf'ŒÔ͸ìán|Gi1ÃpÝè0@åÉup,›§Kùd{®^uuàbÙY.ô—Ç~(›A¶„$Ú -µ•'ؽÇZ<n¢0¸ --%Ѩ H~Ú®¿g·aîq'X±xj?•§óQƲPÜtÐøŽk‡uƒ™{î@7ê==è´m¦>ZéY·¬¤yôUø%YªÀ©ü9“<8Û¼›L_ >ë -mî@FûN'ªHœÈhJÐ8ŒƒÄu,ñˆÂ$èm7à²q^~$_z¼ñ;®ˆR@3ÝÕŽ• -à«o/iC¬éZíg\ùÛÄ|€õ"‡•$*l UkÑ‹…m!Ž}„ã$Ê^$[fv·GÓ-ƒcÀ$Æ|äè,\ÛCdTœ½`æÿÞ‚*%Š’˜Ú̽/(¡Øƒ8—c7îXò‰Crç¹_Á¹ÒznÏÆ|MFü-•ÿ´ÜÈ )ŒŒ»1EÈ 0tQ¼vI€îér£„ö{<0fÃ"ùEì·³pYçòà?—~á=SꆿkG¨0¨‰ò~VŸH´z"ѳöZ¶…ýÞ”»²bãÁ{Nã^Øæ£I•Sâ -{4´]‰Ò¼’±CB)½ë®:º‘hƒh%!<ÕS·Oû7Ó#+”Á@ -²j2;¥ìß8ƒ*Œ3‡xÑh3«ëåxà/wÓ‹Ù€t宾 hÅ4:4øÊ¡Z‚¤x+àGJ_¾sݽX&Ëê<†…`àö,9ÓF餼dä‚Q8‘Ä -çW뫌Ɍ3i¿’ï+2@ÀæW… -3·»IËœØI%@núšî
T(n¯=iŸBg¦ …ƒÉÀUö:Má†c®‡ei -Èt8vñFœ—V\ú¼Ê¨‡Èã_/wåÒ2h?À œîäY\R£¡$€:ÆÂPáƒV\yí¡Xsé4° gÉç`)2yϵSÛy[^ÊxñRIp®m%l;n¶P)·G}EÞ¤ê6 ¨—·…D{.;N(Žˆ€@Ùq eFôFWn×@E[) -U%ìÁ•–פ7õÑŠ™÷Áõëck~]jè¨uà^™ÌÍ+S¡ò,óæ¾=ƒçîÊó¡ßÃÌ?Ëpâ ´ƒäò!+FŠÆ8I¶œDGJç‰ó+a2Ç/KD·Åóõg 8ÿYB
,E³ã¥8ûØövÜñŠïqÞ”5%T$¥ƒyû²êZ2/hºèÆQ ½ãÍÎ>Ęf¥âHE¡ù-^ -¾àÅ -Ñ+7ß §”ž† --~îa_ÌHP +òï éÜIi-Ö³D¥þ-è´7¶’w½¦‚°‘1£íá£ëA^_A!²:\õrƒ²dÂØ?Õv¶bÍ”Ô<Ƈå=+¿=¨Ì#.žÊ=5ãŽGn„ø®½ÈâB…-ÞÊz?:Á½w–2€‚KÇç#‘@™ß)®.CáßxWÞ×yå·.Öó÷Üö}ýx”Ì:F§6Kû“ëI¶æPÊ«N'ƒ›:‹û(?uÈàvv5¨ªKÒ
¶‡cp?7ÈX˜ôÂà±ß˜çËFaA¹ôYÀ³›¼”´±<L;Íé"Kq" +xÚ½ÙrãÆñ]_Á·PUÒdŽ¼moj]ådë!Uv@r$"K4 +[¤—Üg9¬:Mª—ÓÊ«z`©5ë~O
».Û[“¯ŸÎÇP÷5<tlº~Ø8SEÆô$ÊS™`Äœ©xOø¿£ö7s„l®àÁëvmyküú¹ªŸøÌms<–õ®‹H š`Å ¾™£b*ŒŸ òåã–äÊ'ñá$:qskÖ¤ªîC{jCvwŒXÕÿáÖûu‡{î0ÅÈl¹2ØæÜ…ÇóáöÞiC[â¹µ@6÷ºæú=± +•aßDzÊÍ!̹ì¼ÊlœV‘úðá·—ã¦9T[Öå1ü¼ÝËÄ.F&Ù*W LÑ€VyLÞÌ„{-¢ÏoÚ¥
`ýàÂ1<AO» ¬dÜH1BojÔ·Á3ürÝxÇ@¡‡í"¥,0`Òë +z“ÿ…ãåHõ=yƒ×3°¬qñŠ=i\¡ÇB^SŒÁ§ú‚e;]E„Qûú’a¶06UÍÝ«Ð nA`ÊÜ;«Î°–m‹›•/ÝyÌ}att‚º\'Y¦lê®ý6ÌÌÒKx +m O ŠZœeë§Ð3ä‘9h–üÃ2
’a˜Ëp¾ŒÌü<$ɉõ¿)åËï€AÊpÊ8^ô/÷ˆX´¿T.¤FÈòô+ä÷²„4õ~%àÿgZåóè§Ù3¸<aMÀÆ8o„nùí7¶z™ùx®‡°ûo‘ÑÈRì°¨—¨KöÕŒ¢ö£Ôå3’Ô¥ìÊû¨«b\ñ”6@ºLÙ;Ë3d±‰Î'&#aÈG"²ÜC÷¹[@+èË_°Z0ü¹Ê†¾
ÛP‘Œ1›¼¸,lœÊáäºB”1c鼎‚û§ÁVY;Ÿñ6t9]ç …œ@×C£
¶Ö‚ æ™\YÀvy÷~!ë/0¼ÃY¤îÞjп«êÂÛxÅÈnQ~—ûu_~Àô*0¸Œ!v ÖßÑ0Rt€
¼èâ‚O`”v‰+™0SrQ"/£å¼”•ìwÒ×Kn›$QÖ'«Ä¥Ê¥æ3Y@œ}?š>Ë.[NWÓù¹9•ÞFͲ€8gv +8TˆTª©Â˜»_Ç.MЀØ&Q-$u쮲1Œ…–ë‘Niƒ7æ•3Ù»!Içà!uYîür.ë¾ê«€Õ+Å°LŠ¹ YÈἓÎ!ÔOýž,èI6”ºuܘ2 Ò–»ê,@ò®)' ð³Ú-ÛÉÂç@ñd+,H“(MŠdÕ1ÔG° çš+ÐdL°µœ—¡ÉÐÅW-˜Kì% +Ñ@6ð€ãÚ·^²ÃòQEàÔÁ¾§¦ª{ÚWñÆï„šGªm{îU}¤“³ž#=ƒj!Ð`‹ƒ´SÎá,D?5V$™'£ƒG̦8É +¤ ")‹`)cp¾ãý'ƺÙz×*¹|”Ì|$A4ȱpN‘aièeùÀ~÷9vÕó$6ÈÂrp ŸÏ3’Œvåè0‰rtHÀ„³zWKMbÇ|"H‘×Kß“|áJÁ°ø¨RËb¶)ϲO‰îa‡èXj8㪃&ŠÄœ<ÆÂ).^²Ì¹p^œc'ãKÎï_û3C%C²õÄ“™sÃs0q2%‡KÆ:K£~J1óŽ÷ŒÉ'4%&_IÊr€±\%ÓáïD`/yO HÕ..¼Êè?*Ö#jnåÂu—bE¸TmFº¾y¥‡Xö×Å|>dëî3ë_–×ÛdœLÍXƒ¿‰—ÿYoX8Åfáº)šÓ:Všg3
ï``ŠâyµÏÇↄûë-U‚Ñ$Rný¤Ãð)–ò®|¦ŒÛY}§—é‡|3ÑþR;Ãý£påL.ÉãÀ}t<X (ÅþŽŒ‡¥ xt{ýæµ»Rà!àD ¡’ÚFp +aßðéؼZ5
£L!Uwz-dÒ9~É—ÇLíbÌc‡þZÌ$ÃO‹Ë‹Ü~aȵye½ùdÈ•)ÓÏ…\(Pɔʉœ +¸HšNÏ…ÐzjCO†3QçÀK*êãQñßñÇ +ÂG±JÊ—KOÍ)}D¼»…$Ó+J?ùx˜›(ÄE1|-„ÜØ4ýžqƒ8o~ÖÚÖñenó2³“¹Vö3/ïGÎ׿ˆ +Kü¸œëL‘‚Û0qô!ÊðQÇ´~Hïñ{<'¯™ñ]rq¬à¬Î-†—w¸•rhÈTnRU~ƒ¼ à¨TÓÖJ°²ú±¹XKð¥Yʯ¹2iþۿňLÁv“+£S"y
GlL[®ië Ú«Ÿ"ñmYwä y½.@ãj5§kX +ÒQ,`%©ÿ‘Æ@I® +;}FÃgûáÃ-”y)ÊA×E›jã÷¤òÍîL• +òŽJéCæ?|8åÂøЙmH +¥½_¶
÷Xƒ¿ø°‚:b +endstream endobj -529 0 obj << +594 0 obj << /Type /Page -/Contents 530 0 R -/Resources 528 0 R +/Contents 595 0 R +/Resources 593 0 R /MediaBox [0 0 612 792] -/Parent 511 0 R +/Parent 556 0 R +/Annots [ 597 0 R 601 0 R ] >> endobj -531 0 obj << -/D [529 0 R /XYZ 110.999 687.904 null] +597 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.686 564.715 399.863 577.479] +/Subtype /Link +/A << /S /GoTo /D (Hfootnote.5) >> >> endobj -70 0 obj << -/D [529 0 R /XYZ 110.999 662.997 null] +601 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.257 433.208 149.434 445.972] +/Subtype /Link +/A << /S /GoTo /D (Hfootnote.6) >> >> endobj -74 0 obj << -/D [529 0 R /XYZ 110.999 309.558 null] +596 0 obj << +/D [594 0 R /XYZ 108 690.907 null] >> endobj -528 0 obj << -/Font << /F85 373 0 R /F78 368 0 R /F88 386 0 R /F8 534 0 R /F11 537 0 R /F101 484 0 R /F80 371 0 R /F87 383 0 R >> +78 0 obj << +/D [594 0 R /XYZ 108 666 null] +>> endobj +82 0 obj << +/D [594 0 R /XYZ 108 426.135 null] +>> endobj +86 0 obj << +/D [594 0 R /XYZ 108 271.241 null] +>> endobj +602 0 obj << +/D [594 0 R /XYZ 122.346 190.073 null] +>> endobj +603 0 obj << +/D [594 0 R /XYZ 122.346 161.359 null] +>> endobj +593 0 obj << +/Font << /F105 415 0 R /F94 409 0 R /F120 538 0 R /F107 429 0 R /F11 600 0 R /F95 412 0 R >> /ProcSet [ /PDF /Text ] >> endobj -540 0 obj << -/Length 3912 +606 0 obj << +/Length 1692 /Filter /FlateDecode >> stream -xÚ½[Ýã¶Ï_±oõ¢kF$õ™>¥í¥H‘^ŠvQHò ÛôZ¨-¹’œÛM‘ÿ½óEZ²ä[ß]R9S$E‡óñ›¾‹à?}§u¤Š¢¸KóLQ|·>|Ý=ÁÐ_>Ó2%RÆÄЂ¡?>~öùWY~—«"Mï·4ãqóýÂÞ/“h¡è_}¿Ôü~uÿãã_iz¦tfqºIU‘XyçëûejßÀ¿zñ†Úÿ¼_Ú,^|IoiàÏa‘°§Í•I -YäÍt“D&•á·´Ô¿è_Þï÷K£ß†-Ìâoôï›Á¦BÍdë$UYËÚpZ“ÇI²(pâgoÇl^¨Þ‹æع´E¤¢È@#VyZùZÀFvÈ×CYÕ=üïZØxZÖnT=ÿª§4W~ãbñ,þ|¯“…óskþ횃ãÖ¾ìýŠ?Ñ̶«šZñóK«Øh¢æmãÃöX¿—™Ñy¦MT’z¶ïx\Gz0ëÇŸ»u¹wÓEp¤ð“ª)9¸F"Ã?άSó -~—÷‘ÝHÄ?‘ˆçÜÎt‰BÙô<›~ùtÊç.h%ú6.|2 /×¹ÿßHød.ȃ
@Ã,hO -Z¤Áò%4ï°::ÿL]bËŒÞAÍsõ†”/˜¥óAcUÄ1¼(«száqç:TöÜ‚
Y·MÇíæèjn±%ÉãÅz¯
OŽýÎM Ò Üyáíö"˜eãev‰Á¶TmS\Ýó–•lýnWwB[ÓÉ`³=@ÙóœH€3g…ŠÒxÄCùï{`-ÌŽu¼è\Ý9ÅíǹãexGÞª7=!ØëT.
¼h¹ï¿Ußa+YœŽÜC4cc߀µáæºiÚMUƒ
æ¹\ÀK×»?n›öâ] ¦?µÓ3\n®"›øðªæ€2"#1ãa”£©æe*·ùo`‡/©ðÃDz-œ°ßÆéd§\í«n‡sû÷®~êwÜF±ÂÁ’‡·‚Ý\ ŽêªàfÙÞ:œö}udòï–à÷‹b¬í$¼±á
€œj -–ƒg÷ŸS¹WÜwEïUi˜Þß:ÆúfrýšÖß - -Žoè Í•ã6iõóðJ‡jŒS™ë`Ýñ²Æ>Yp -"q6zÑL|7¸ÒOÐîpã -¨Rð>Ù{=n -~ökTï¡b¨Ëˆ9“lñåV…8®r8DùVy¤]+k½†p.õ+ú÷ï”Kå¬ëŸfòh M¸ßi\30¯‰ŠU604¤—.hü„RQîO3‘n?˜}œYpƒ‰í˜)¨-sl<¹³•„Q åÌM.-:ãÌŽôØV5ÜÄï0«ÒqâöØ@×/20žñ@m`ªO¸@“ -YAžA ™ù$ñzçU;AèÁ¿ÚÉ8õÉæý¾bÔæ(JFd¿mz7à -îBÄú,]èÅŸv°÷5³C¨Å7ËBæÒ) -®a»9öG“…(¢Q£“pÄ›˜ÂÇîÐ7Ìà€D¢š
Ï«{-N½bc•ezĺhÕF¹€4héìø™Pü®]‹‰~E;ôv)ëP‰Ã°³& -þÍrÕ5ûS/“q*n¿y.Çý嶽àÝáÒ©©p>ÊÆm£–§=à¦ðP›ÍöòRǦ-%¿Ã륎£«.ç\.ÈÉšn¼dÙ¶Ïí\I误ÑU?»N"÷Ì)»“UÅØ^éiem®_+nQ -Sàó[Sò9¾5yâÓÜÉÜVknS|ëG/]p©PñV3ï¦jª—üí¨È9
‚¥3" -Ž¤ïi†øR²v)çŒåÝNÞyxæÄž‡Áœ”ݦ:8
ÞZõÛÃN2ÀÂtpཬ؆|†˜9ÑïgóW6_— -ôRXÓå*Ft¬ýiãBÑI€F’ƒƒ¹ˆ%C5Ù -+ÅlìéÛ²îUßÓÖ…€×Â_<ÌmNýñ$ïÏmÀæ4 wÂT^Þøƒ@«ì.VÃœz¾x:Ƀ
Ë¥±€UÂ' +ãÞ/ýÔ!ÖÍá -ö'a*pÈÖëbÏ—œ.Ú+äK=; ÷Øt‚cñ‰‡EaÂ3™¡¥†Máy -J212åËA$O&8Ū¼?ÑQ¬â‹t`5åØ{S¤¿|ƒ˜Ò[ËÚ-“n#©©ôRóÆ‹ÐñÔ–ÇácÅf”ýX}XPƒ¦ùÊ+"“äìÙaLäBÖqû}7á„R@ÛÙ‡'¼ÀuƒUÊÆ®›¢ƒ"]€ém(v(0sUq":÷Ÿ“«×Ž§qÐ
/?<_ŠQЮ…s3† -?JFèš¡*†y耮qG -ЦÕÈи½±@pÝ=&ï«æ:Ô(8€ƒ3“é&î0âÁ²Ÿ©–ƒCLPµüv§>L^ÆÚ¿ÿûé™ -P&Ÿu¤ÔQB‰ÿ¹<²YNÄnò÷DøË&щ8Бþq:ý„O‚M¡UËx0=ƒå¯ºRÐ0<–Ýø•õÎÿ
V”nüÞxïë -m]|éö–v‹÷Ôº2Ø*¸±V€…¹ëP¾pϺ<ubä\Û6-¥b ¿ÉZ +xÚXKsÛ6¾çWèHÎØ(ðyŒ›¤q§M3rjz€(Hb+‘*IÕñ¿ï¾@S–Ò´Ï‹Åb±ØLJ¥õ"?½ÐI¹È«DUI±¨/’ÅØ?¼Ð²|‹ë·3»å‹ïÞTé¢TUž/–T ŒI'%Ëõo‘a_–D?Ç¿/$ñB颸1Êêt£Üëø67Ñ2¶:z ¤ŽÞãú}Gœe|k‹4z› +d@ç’ßÒâ‡IÿdNž¨R—¢ÿæòüTUÖÈò{RrO +¿Sð÷#ñ%šMüÀV°‘ïˆõŠYw3‹ù÷'â}ó
WŒÕI¢²,sT|kt™¥‘NPôÅëå†,Iÿ5J¸~%Á¢‚£¬„i‘g¹J¬„HÙÉžI‚“癘3^Uàr¥l–ÍB§ŸBgf¡^²‚33RLšŠŽ£wÃ
ÜÂzlêñÔǺŒüÀ×®™XuÝÞ»vP—ßV™î®3J+²»FØX”Q·Á±ŠÆgƸkÚ혱ŽÜxyÉTÙ¢œ|ðtµól¹ôD5 ¡l>pí‡fÛúµÙ ·w±Î¢æº^¬#w(¦_v‡ãÞ‹|‘`RvUQÝô5Þ0»÷õèÚ[4œbÀ;%zG« +"‡–mE6-¢üÒ#™GÇnÿ¸íÚ°²íÝ‘B©
›S[ƒÇÆĘÃb8î›Ö“é0»óµ;
êyþ ãèƒ<ùWb
aÉv<_˜9¹;?x¶ó J×3ûS’˜ýžnšÈsº"Èè"YIJ¸¥]{¡q™©¦©àˆLLzà -Ïcíà° à"k4Ô^9%öÿK›¬ûêîp +šÐ9[¨'[D²íàê>ÆË—Fd©ÒU1Á%¬Ê’ê,y^îÇ]wÚî +߯Ÿ,»„‡™Ï/øÔõ[ÑÛŒ¬®¥:ªiy„,D^ +3ê˜ÄwzPcžuã„zF‡F
°Úý‰pìyæyhŒáÇ%a$Èïxòä=ÅŒOÎÙ.éFµ$,êEGÓB¢Ú“ok?mcbåw“ÿï†["=Ù3àszù6LðNŸ©<~¹IÀXz¿—ö +endstream endobj -539 0 obj << +605 0 obj << /Type /Page -/Contents 540 0 R -/Resources 538 0 R +/Contents 606 0 R +/Resources 604 0 R /MediaBox [0 0 612 792] -/Parent 511 0 R +/Parent 608 0 R >> endobj -541 0 obj << -/D [539 0 R /XYZ 110.999 687.904 null] +607 0 obj << +/D [605 0 R /XYZ 108 690.907 null] >> endobj -538 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R /F11 537 0 R /F8 534 0 R /F87 383 0 R >> +90 0 obj << +/D [605 0 R /XYZ 108 666 null] +>> endobj +604 0 obj << +/Font << /F94 409 0 R /F105 415 0 R /F120 538 0 R /F107 429 0 R >> /ProcSet [ /PDF /Text ] >> endobj -544 0 obj << -/Length 4039 +611 0 obj << +/Length 3467 /Filter /FlateDecode >> stream -xÚÅZY“ã¶~÷¯˜·H•„ -ݘ×Ë»Ø,¾âÿýxËí/øÿ»~t¿˜IU%n´¢÷7¡‰Tקêüä‹ûžö0ÍT‚9‚¹Ý…I¤‚(Eê4Ά;Ì°h8Üáý®XÞ™,Y´ùá¸wí‚À Í”¦ƒA1¨ -#7rŸËuwjŠVuÅ/ý¶ú«‚,v›z©£ÅÏå¦ØÈe·p2KhL”)ù¾a†}Éÿß0#…µŸM×2Ö²n\¹ßŸÚ®É»¢•¥º]éZ§–w˜.êtäÕt—$zÂ[ìrfÁT…qê¾)ª¥
°·;–Ý]ã3ök
µˆø“¦®EÕaQhPYÉï׃ý‡‰¡ymªl˜ÞhEŠ…q¯¦K‡*åÉý'÷¼ªUÖÄ7wFk¸û×âùÜûOѯ;«(Ã$`|ž!´Éí¨%L¢ßn©»b"¬kFúw +ê…uÈ×MÝÊÊ›ZÖ«jG@Ž…·K-¶ÅÚuužÌm]¹®CÑ5÷:Íåþ`NºÁyuho¬Nu GŽ½Ž,a8‹í÷ -7Õ¡áªÛf¸€Û/é[·çj#[i7Ê<cçmá4ƒ#;R°u}8`(q2Õ‹¼!¤f±ÞåÕ™õÖtæ›ï"U¤®§úÔHϦ^ŸHUoå/ä‹G˜•t‰xе˗zO†]È«®–7Mq,òÎõí-0ÃÆ-ÛvÅ‘·Œ6! -·Xm[VòL’Ä”£^-„ß‹ h—ž¾ÀˆÛ2éÅTàœ_WH¯cF?q¦U¾Ä¸dç ’¹ïÅz¸
'ëÖ([GAsrïwE%â5V;¶Ä–cWÖÞQ%£Àhï„`ù±†éNFŸâc {Â(^´Å6ÅÎ8rÎ -rêä¹óæ>\lˆoï8¹ŸŠÕR‹U½ƒÅLe´m²[! µùe]Ý’§jƒ®E#OÇ
Tá,Ù -}ž.†O)»VÞ
€CvC÷5/K[_×u³)«¼s¬hŸ²®
ź$©^ÊndB -˜!ä4ëTí±3i× ºy,ÛÂÃÇ
øC ÌÉËFçÙ ›^&„a*0²µPqúÀ6KhâR§àö))°K– õ™Iú¶véÐ7¥µd§`IÖs¿5›”U âwÜþÖ½œ)lßLÓ¤nîå«5¼½j°|ŒeX >…Wa=Йlõ]Y™ÇêY‘~=Égøå é¾È™‰éÛËϦ`Y[«ÂÈü´œª8öã6MNd=2¢¥Î°i¢ -´[ŽÑõݦ„Çi£9Tá‹ÂA’ǪÅ_Ò^×P·‚¬£Ì+IwèÍO'ð¸ìÊ‚…‰r”orÛ¯´Þy³Q¤FÁ—5zh•[AÚ‰árzC\Õ”!š,Žué\d Ù-5Dë®n|sE‘*Ç}^Êev“XýMÝRR≜Uñz…ü"h\jA»ÞvE5$•¹¯ÇùÚ“*‰ÖêI~s·›†xYlå©$q‹µ'?Ö›ÚHCLq‘ÐÛŒ¹ª¬×€9Ãû¾Îðót8FЧWÍÌx -@CãÔžò=ԈꕔÿêS+ŒÕŒqX
¸€N0]ç†l/¾`Ȩ¤}ï;Áÿ5ÂvW1Z+]OUw9gÐBà¾gj»bìãÎ8æPxy/͇¢vå&àbÞ«TNÍœW^£ýûz{‰*]È€+ÖÙؼ¦x*pˆpJc›œzw5&¬„„;Ã嘂%šR– –h·ò¸"ŸËE4äT«RôÐO³®÷ìR3i¯Ô”@‘:ÞËÌ燞?¶P×t\ý "šFêûL§&ODRa_C=å)WÖàÆ|ÄЩ†±¦/ÍœÏ×}aÈx˜þ¼;_Í7ÏF ÉÐ;ŒGòsN+XŠÆ{L.ö=Cd¬›Œ÷xÝå±<(,ÌЪ,ov¼•(ô¯Q‰œºq°*ºÇ‚ü>=¤eVÅé8?wQISRC?J8eå‚™öA‰Ðõ®„4±G"è=6õ±nÈÅ´Ò!OŸo ’nÍâbH!aHŸ×\íOnš²ºXÍÛš\åŒc%‡zSìIÆJž_
‡LÝÛÐzÀm¤‰ßœ~BÓ¨g_¾'¬1SÊö²;ä¡ùL>%ëͨž1Ðe{hö¶~Ê÷ŸfÁö D po -J»«bã¶NôÞ³Ëf¤:OC]Ž‰ÔÜž)DJÏïóNg12àq…ýðôþŠO0@Ô½Õ_Á‘r -ÏÃÈ—º”_g"’è…ÃgÎüTl£g]J¢¢Äô.¥¯1•.ŠöUøk>5øæ…U°ÙCDRY(Fëës™l€=HœÞ§w.‚N•
Œè•r˜†V‹GÄ?›b ¦èsÀ$å0Ôœw5Wýƒ€ÓuŽQ|PsŽøgQGÏ -³J\W‡“DÊe¿¾Ì;ÔŽç®4›ðŒçJ³þ¦Ê´pŠÈlû“‹ï[ÿÖéÒµj¤²¾äz+®äë
VAêýzP¦úâÚ1…΀âqpÕym’ -½2ß糂êóØ·“‰¥í¸"ýÙe"õíàÚÎ×üò*ÕQ€4AËÉ—èA)¤3 Ž¸Ãaªÿs%dSlÿ=½P€9Ó {áÂjÓ)ÏfÏßIð¼þí -’oÓ}µùÿQ»K3ˆîŽ R9÷r6fÉïÈOûtXÕ{ºøAOÌ´ -îš3°r» -^þó’jçŸóÂJž¯¿Í`gH¤ùîÙ +xÚ½ÛŽÛÆõ}¿Boå« g†×öÉmíÖA’¶É `(Wš•ØJ¤BRYoƒü{Ïmx¹öÖNšûÌ™s?‡£W!üôJ‡Ù*ÉC•‡éjs¼ +W;èþË•–a›'P.¬ã0ZG+ÿx{õÅ+Æ+UÇ«Û{Þ;NThÓÕíöM]¯u†ÁíÞ]¯M_›æZgAݪëw·_~ñ*V¹Ê‹«ÃÕZ'*²ýº¨®u<ÂÂÈõ=—í™`SEµmûa¿]ªò”aI•ÍzÚíz˜àýÿþuðšêšƒa2ÇFÖí‹k?!$NŽ:ue]np<Ø®êàNÔ·m–ÊÖUuç¶Üø×¹íø…À_V\~5º†M
£S¥c»Ò*Ê«/æ0[•™Ð×ϹÅ9«HE&Áî4·ÔýRº³È¬†Þnøô‡²ÛÓ„µM¥3K…¶0«ýñÌ×:Þ5Åæß×:ß:FŸÛ®vžÜ@¤k ¸}_7\Ù6¢ô¡¬vÜQÈ‚²Ùü⢒äcW^›XhQ!œW/o{öÔ¡U¡ÎW‰6*N̘ƒgœìç®G“…›ÓU¦¢$#²¡ŠtÒïˆ8x«mÄ0þü6ŒÃð&„Bßè_æ$YCË×:VafÆÜÔߺ®(Cd]ÝHAâ²;#ÅÁ€Æ'®gFÙ<{ÞõG“Ÿ¾¾Ÿ4½þ›Ó»OÂÀ÷{W¹ŒÈ&
ˆÒPŽdËdýÝn_uÜY¶2õXv P7ÜbôAåÎy«¸ÏÂ?ðWoKk.ÛúèxÅf_—pâFš¤zÆgôP¢¨„"# ]o +fè,¸ØÖ´¥dáƹ$ûÕœÛu+®EøLn×ÿn7äöñé#ŒP¥u›š¬0\±®¤“Yát(7%ê²ü&KTœë ЮíP‘‡2Ò€s¤¼p’ g[‚í±$<ÈÜS(½ €éÈöˆ’Seë·ahšVNfy4#¥ZVîb¨úsBï5.•æÊ\2b[þÇ-h•PõzçFàØ—›‘ëdâ)–,C&/‹Å»®Í¾¨vh°q‡ˆ<wÜ ôÂT²`خʮ, +vÌÛþp*ë¨5ï]ÑÀÈUá”,Š¨h>¹¦XsÇS'Õ±Ûï×Ä! +ýS
G§‹›6öù¢ƒkѵ¡™p6‡‰–²"ÆÚ« âibÿD pd$?8N¦Š«²&ô#öÊ ©?37»*0Óý³éþ)†¥óû±0[+6EqãEÅåÈ…·—LF‹öõù€úËF +ßÔÝ’îÈ >ðÝduä]B¨
ž44ŽÚX‹y™“Mµù-Uï2fʦ3M3TýÖ²rzL¿y +š +–5²…$ˆLèV<PÞ3
È€vqh\±}ä3SÙvø½;ÚZ4˜…À11$Ý…)Ñs#5Òj” +UAéxÅoÝɳY:hÎUÕ÷’âËE“¯l˜«4|ΗIÒz†±>ÙAþ""0heÉYV³Õl +áðε@}p˜®¥wú²Pâ8MÐu¦ŽžüÎ…¤Ê9"™Lrã¯þ’8
Þ{b“ipBÄÇ•K@ýç|"h„°š:ò©)újtÅ ÷ œ[ðû@«‡^m÷©ÌñŽà˜Þñð;Þ×ÕÒf¡²ýòçZUsj0£<–‡ƒ¿GZ
âÑ]Í‘iÖ`Ð)ì•eäÞpP”€Mç‡D[iüÒO™ë®*º«®¹ˆ©(#Š1\¹ÛwSGºÂï‰>Û§"»CÑùM/¹|!&Ë”Iò>@!Eófn#m¬â$}¦?ð¾í²èÚª¬ÿ¸ð1Cûn +*<×+yüÉ3½’w?&ïeµ°E®l’>7(ý|Š÷xÐà»ëgRã“að—xüt<Ä¿?J˜ØªÈ¤Ÿ“!HztÕö cߨD›OR&R`âDÓc–“” +tm0¹Ì†Â$£ï¯ÓÇFEƒš^†Â@XØ+ÞWãò½†…
ó<‡x +*cñ 5»W¾½Øð³×£éôbcüPhØSŒ…t~nJ{FÍÞ‡ø9K§
Ìcs/ü”Þ€ +a¶Ä€eŒ¬c`:¥-錖ޥM?åû댉
†¸OâöÞ(Øè#×þy«ß‰¯W>-@=Ñ;{˜<-näÏë†$໡@(m“‹çuøƒÊ~†qeizsgãQ*âÝ¡÷ÿÔ«àõxqoÿΉ=hŸD¥)=«Ì€6Æ,*ŸÑÅÁQ¾@š è;'犻ä¦(qFåa’è"?s-S=ÄŒw¢wvv>.Iú³fúÇ?yÂh=Á^
TKô²h€wÂ(_<X>§T›eÅjz='SèŠú|+;ìáÏø/I6×t +endstream endobj -543 0 obj << +610 0 obj << /Type /Page -/Contents 544 0 R -/Resources 542 0 R +/Contents 611 0 R +/Resources 609 0 R /MediaBox [0 0 612 792] -/Parent 547 0 R -/Annots [ 546 0 R ] +/Parent 608 0 R +/Annots [ 618 0 R 620 0 R ] >> endobj -546 0 obj << +618 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [315.255 186.993 329.701 197.936] +/Rect [332.003 152.17 338.179 164.735] /Subtype /Link -/A << /S /GoTo /D (subsection.3.7) >> +/A << /S /GoTo /D (Hfootnote.7) >> >> endobj -545 0 obj << -/D [543 0 R /XYZ 110.999 687.904 null] +620 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [478.503 122.164 488.465 133.781] +/Subtype /Link +/A << /S /GoTo /D (section*.6) >> >> endobj -78 0 obj << -/D [543 0 R /XYZ 110.999 523.257 null] +612 0 obj << +/D [610 0 R /XYZ 108 690.907 null] >> endobj -82 0 obj << -/D [543 0 R /XYZ 110.999 508.069 null] +94 0 obj << +/D [610 0 R /XYZ 108 666 null] >> endobj -86 0 obj << -/D [543 0 R /XYZ 110.999 273.169 null] +98 0 obj << +/D [610 0 R /XYZ 108 401.793 null] >> endobj -542 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R /F87 383 0 R /F85 373 0 R /F11 537 0 R >> +616 0 obj << +/D [610 0 R /XYZ 108 379.793 null] +>> endobj +617 0 obj << +/D [610 0 R /XYZ 108 202.865 null] +>> endobj +619 0 obj << +/D [610 0 R /XYZ 122.346 135.465 null] +>> endobj +609 0 obj << +/Font << /F105 415 0 R /F94 409 0 R /F107 429 0 R /F8 615 0 R /F11 600 0 R /F120 538 0 R /F95 412 0 R /F90 426 0 R >> /ProcSet [ /PDF /Text ] >> endobj -550 0 obj << -/Length 3253 +624 0 obj << +/Length 4227 /Filter /FlateDecode >> stream -xÚå[Yã6~Ÿ_ÑoëÆ\‘I)oÙd&ÈbIX °²,·…‘%G’Óéùï©*’:,ÚÝ=Û9€Å -BP~Bž:ÒÜÈë%|sä57¶uãÈ+Ú¬ót#ó¨1«mCsê+8vÿ"¶=S¨m›¡Ðj®ŽpµYT$'h¿ýÐW¶y…dbkÙõ,º0Îí¶@½¨I- ËÎhËlSK– -“€ð½V;-qO«?¬M,ÁϺïÁpඎ%R -õŒDàÄ6àiÀ0ûí}Ú¡Ûí>,™GLÇÉ™ ¦†›Å±Õgä2Œ„cèëkxûB×&ä!¤bJ?s‘¯!nmÿGBîÀG×÷¡íKÌ3)é³€ó“"¾¼Äˆ)>ß¾nªr{‰ÅJ±$½¼ f‰ô§Ö¹Èæ™Ë¼°’ž®t‰×/¥è2¿µf‘/X*ÌôXADüLŠ>k›®È
òºØ/ŽÞf¤gß¿«S÷„ð™‹Ífò¶&ÀZ”4%@G9YuûæTmmóÆuwEµ[hP~:V`²:ë›öñâ@fG|SoÇ°üCfËÍxä…y(úìØtÄHgL21„øÑÑÀ$d`¨uˆ°mµ¤z)dYê¥ñÛrdaÈ×R§,‚Œiʻ׋õfŠé®?÷ÛbwN?;U=rÁLV»c²ìѳZÉÔpò2·hˆ…‚Ã@u¾h@n’â}·à¦AÑXÇ°!Ä4±zÚH6˜û¼ì¢óÛ§T~»ò',$+ÔEÌǨґ‚ÞŠÚØ—¡s f¢¹8/XQÁÔàÁ(CÒ9G(t=ЬÝÚZ^59¾ucŠzy‘ë;6Õã½uäP»óà±³¥ÿ†d - H)gµý>äÝc&SsF^€ƒ4zÈÇ-"áxä@!*5ŽÚ‡¶ì{Ê¡‚™mÛõnÊ©/+ÐìQÅÀIg6ÎY}‘\€¾ñÉF.ñx-U©óœ7#å fU[dÛG—Èf°Ï'»‚L&NWÿZ†•œ£Q4"®ˆÇ$3 -Œäü;‡ˆÅB?(C ÅyÎa)cf -[˜øGÛ€»Û°„‚ìáÄó†-`ŽY_nÀ„ôp´#1Ç9õZ—;Ë3wŒ7‹Ê÷J’n¦ßŸ¡Wð1`'šœÎO¬dõƒšª‹ß3Œ«wmÈZ-IÂ!us>h¡¬nLsÿOwÙ‹È#ÅQâ¬bÚÞÎõ÷ÄÈÆVœ%Eh«ÝiÓ?œ -ºç@sÆÊ<ׇ*Í\Eg?âΔ¼Ší€@EëÀZÆxƪI({a¥„¡–ÈŠTA(ÆWîl‹‚™é™–zà -ö ½µª¹RbϦph¾ê¡Õt[ty[nH i:¡jzR«j&y²#À¯áät†["¡zçÅ ÷½¸N@«‚¿pΑ§8 -ù0âó‘΢޿?Ô©ž¦ñUAo1½>Œ$ÕÂC¢àº€äfXß_ZrütþÑDþa÷¢qíC–dy]Wcú¯ãiúoœŸ‡RQoÝ]Tå*브NXd’W¼zþýÕÿÁÎógv¹Â¢áºó½Âº|·âÅRÏ$WÕˤã®* Tsœ2(1ðjÉŸcÖfï
X¬ùCŽ¿Þ¯p‘ ¾ÝÉ™-Ù¬ -œØlJ»|Ksûøï¡èÞ^ÒÅ¡Yôˆ«ŠKý¾mN÷{;¿÷‹vÇ"/1Å wÃÅ¡£¢¬ý\÷ˆ -qê1œ¾Ì}ÜJñ3å:?ƒ·S„¹>úÚaZ(å ’-Äý¡˜ -@õûÇT/4ÿÚ1UH…”b)d—T(õï0R4Úyoï5©}._è·ýÃqõábÿ~dŒx§Šô5}|4}½ayÜ9±l -0ô¶µ(ñÑ«c>·¥«Ö†¿ÇcÓ•½YÃþÄüž!oÚºh»á!ÜüLOU`ræñS5êÌcè¤èàø™/{û ƒîºR³jò<Cø˜^¼RϾ¨Ž»Se» ¾€ÆµÃ6m+á½Øž7u
¤YM4)¸#UioGÜ tßt®vl›í)/Ü[”Mè©-ÇpÝ<×ÉëÄ+ƒ¿>{ -Á™‰âEîˆ\
â$f|ñ7‡Ö$¾˜Yª#^‚q¯)]Q‡® - ÂPÌ+³ëmËÖ¢,Ò¿†N»ƒ#!'æsè盢!õ ñK9!“‘ -G”¾µu21Òã±HMëÞ`@/™JùÁ¤ÇâÜx,ß8“Älå=²3$)#'/…®H(¡2/_pUÇ+,²G[ظðÃù÷(#õö7«Áí분Á[:Ù4²>Ûˆ?§“`Îs™8üOÜ1í‡;LŽÊú’ƒñyø!0zGtþÌõ[ -÷æµoÚòç¦îÝy†w7l?×Ú{û˜7€hB¥ä|ÿãÀÿ‡ƒ@÷Ë&`$endstream +xÚµ[_s㸑÷§ð[ä:! +“Kó÷4ÔÑ/Ï÷×»£WŽS˜ÕŸè÷ÛɤBÍÅÔ.S¹·2¶‚‘ŠèÕ{Þ|ûç’ô³|Åö%¾0‘¾Þf0[b™§Ç®Ýž6Ìh³ÕǺ¯×{yiOÃñ4p¹ì¤²«~>Õ]µå·¡åçšZóUÝôwzUo+Åﻊ—ª¯ÒÌ# &)”+ŸÔ6=<ëMdJ¤Õåm!ý妓éÊ}/¥¾z.ŽBÒN(Ý·›rÏdlÚÈê¶uSDÐíƒIJZ«Â9š¡í‡ê +œÛY0 ðH3hëT‚û¯òÂŽþ–šÛ±öø£m}¨š¾n›yv©J´>g$ñ’m.Q^OŽ9ýAlªhìø¥î™úþXmê“ÄÀ‘Ó«{®\·ÈEZt'‹ÊŸî4p¾ âªÜÚÿð°ÚÔÒaµ©Yi~E¢BUnvÜ2Ùj‰ÚhYT‹$âS/°D{§ò(ƒWð$)F¦à Èœ®mö¯\Ó6Õt^3eÍ=· +që Ì['—imhŸ@ÒâÖ;Ý:ÅÃÁë¦c+Ñ1]Õ÷ÕVTf–(ÎUfZ6ÉÄÂ"jöþGcòÐÖ²-âè³mÏ«@¡PÆx©·„6Ú³~‚¾Bǽ|²öøÉ^x@>ì×à/\î×tG¿®:ßÚ0W’piiLÐkïÐ[~™(X–¾ÀÁŽý6-àçD‰ÿôN +<þŠ™2ù*6â2¢5uÛÓ¶ +l\\y'S›¨˜/ß<
Ɔs֖ۑC#
5´÷¢ñû¥X<8׊ +X´ˆvœFHBš Y}D¹(÷§j9âïb¢pY%œgOÌ¢¿„ZBKC•G(\÷²€VrnÜË…-ÆØV8ÑÇ®n`g~s—¢ç@êâØBÕkÐ ¥sÇLÜŠëbüZFпÍ1%>[³ÙÑYO‹‡°’Ut0à—¨±š!µ@íCZ¨TσÄv¿dŠ‡sêï0̯W˜Ç“S¯lrm:6$q£6§±%‡•¬ÚãP·
…¬ zæÛ¥AMc‹(›Ù·ó¼Š–¼Ê=7®ïL²:
bÆPçsÞ´èP:R’nÑžß9§æÎòqNòX¢H¶fN4øJHÛÑ6€.>
ÒO¬ +?¿Ñ¤”À|+‡´9ùå³1g1y|"zÁ)M!»4ÍmL¦Æ„ûê8F4γ&ÌÔé:X?2QÀX/bÌzïÌ\(ÄhûÄRå +¼‹óܘ2à#f¤ä¯|´h]3•ùP†§èm,ùÆã¢÷2Ç$’<avkÍ¿†@d¿B³Yð~d EÈ·Y§¬?so0þh±ß',Ëd[(øükˆfüfTãœ/xï‡l¼Ð
¨”2¦¬ï¹ /î`Û(¼Ä¯`C
Â.ùž4éd¼ž3@P3È0]uìÚ
kT+<Ãv¾ãa2P¬©¾ê’‡åh>í=ŽPˆe¦œOæL—Yë c—…Ï*ÁñáéW{Žêpü¼„û`,е!†Š. 4b1$KG=›}pÄlå¶ +ðîÌŽ
¡³–©ÄòÉ=ˆÌÌts´åÿ"tð‘»öòŒ²˜½×îÌc™Q6áÿ[¹SEÐΚ΄vði§iì9¾Ä€×57Ú¬Jìêéëç†8,& æWjik¹IúdÄ÷®–ÄÅ*‹Zå
*è‚Èã3ý|Ï3€øƒ:"öÏF÷zµ‡L„ÒéÜ!áKLºŽV²Ý†v¡¾Ôc2/ö
jøV5$¾/K‹6ºLa‘^^¤âwÂÈt¨
u‚2°Ý¦†öŸZh?¨~³?ÑáÈ¢a€s›eÌ'—M¶ú€ÀÖFÔ„ûŒXº²éõ007&°áV¦Èº—ú8ÈR¬Ï†ç…ÐD}
·Cê`küêùt k>Ô*s–KgÔô»Ö¸[o°ÿAzN¹ W¢èrhŠ°òÜHëUöë€,é·¦ŒÛåuäTÒ ·FSpˆé«À\¨àTפǺÙT²E“ö§–®KÙt¢‹áŽÐ¾ŠŸœ/œ|€TϾ_ äbhåa¼S8¹ ÉÎÄ@LqmÛœu{îÊãŽÀr–øˆz”gC“t¢? wÃåºÅÉ‚uÇ*‘ªÚïûKÐÜp1ðKâD¬f8üâurš'‹$(à–΃œÀiè«ŸOU³‘z& +Q|t€gX)\\ÒSx½É~Q»IJ*"n¿‘k„ceüµwŒß6îsÅÄšIò6®_ÖìEm#k$Ô‡Á«ƒåp9r½Ð_ۢϒ½E¼tý/—Ë¿Ë“«ïGQpfŽéªa£Ð¢’ÆKý?I‹Â/˜ãS\N*’RƶžÒJ™¤•2¼'ø&ÀJ´£(‰Nx¶*-ÃkÙÏ¿ÚìªÍOøãGzµ…í¢¿“Xg×CŸ;÷Ê ¢ +š +BI*=»wŸ!Ú×E›èßé½iŒ? +endstream endobj -549 0 obj << +623 0 obj << /Type /Page -/Contents 550 0 R -/Resources 548 0 R +/Contents 624 0 R +/Resources 622 0 R /MediaBox [0 0 612 792] -/Parent 547 0 R -/Annots [ 552 0 R 553 0 R ] +/Parent 608 0 R +/Annots [ 626 0 R ] >> endobj -552 0 obj << +626 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [457.861 367.491 479.779 378.046] +/Rect [138.276 509.088 144.453 522.186] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.5.1) >> +/A << /S /GoTo /D (Hfootnote.8) >> >> endobj -553 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [476.762 355.147 498.68 366.091] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.3.5.1) >> +625 0 obj << +/D [623 0 R /XYZ 108 690.907 null] >> endobj -551 0 obj << -/D [549 0 R /XYZ 110.999 687.904 null] +627 0 obj << +/D [623 0 R /XYZ 108 333.771 null] >> endobj -548 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R /F11 537 0 R /F87 383 0 R >> +628 0 obj << +/D [623 0 R /XYZ 122.346 181.929 null] +>> endobj +622 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R /F8 615 0 R /F11 600 0 R /F90 426 0 R >> /ProcSet [ /PDF /Text ] >> endobj -556 0 obj << -/Length 3568 +631 0 obj << +/Length 3475 /Filter /FlateDecode >> stream -xÚ½ZÝã¶Ï_±6°fERÔG‹>\ۻõMS$ ɃÖæÚÂÉ’#ÉÙ5‚üï’–,mn·w9°(~‡ÃáÌo†’7ü䔑Èóü&ÉR‘GñÍæðEt³ƒ¦·_H×%JÅP‚¦¿¿øÓ›4»ÉDž$7ë{ê±Þþ°ÐË•‰‚þÕr%#x¾Yþ´þ'uO…L5vW‰ÈvcÞ-W‰Z¼¥ÿoá_.¾¦òkúÿ&Œ“©L“ºÑÛo´2BGÊÕI…•_¼^Þu–‹hDs[é<Œ^éXdIV˜e79Lª‡+üQ긵»cSwMý+s—E—Ž 2•®÷žÛe$/4Ìa\{}:L)H“I\Òµgó~›á -BT*ɇ@!˜^¤Ó»¥ä˜ƒ#
X9ž—å•q”r£òÌøËï–“ùq°ºÌ.玒L“í/ïGˆZò§zÆMͯ9S"‰ó.ٌ֗œŽ–Íž_òµòÂ2¾ª.l$€"#¶+ -Àl<2+Û¶@1<ŒlJ×î -ªôQæ6‡€eÖÚǪ̀÷Èâ¦h]•Ç†X{gYTš‹H_!’â=‚?\YꆟW}e¿YXÚ–pª -\¸T‘ØÁG]ëmÑ7cjq
£¨(D|Ç°f0¾Bõõ
t8dQˆ><›¦i·e
võÐcQ¶øÂŽ«.¸"W(Ã3WÀnÝºä˜ ‡×ôÄ-ëúÁYKا0õáP¬:{+½hG - Š…àŽ.»ƒ¬¸'ÄÚ]yW‘*@V¨çèG7W{–¸¸àÊøÞ7UÕ E|à°=2*NqþsðÙˆm…ƒÝÍýÔKJÌãÆjÊÚv3Y60s&y.§ó4ä…Nô3S’óÁŸD¸$ï28ƒ"hA©g º4©Hód„$Âr±€›v_Vvfé™*Ÿ™`dÕ˜µ©ÑÏLÏnpRI2^ÄžiÈ™Š8~nÔúRžÇ€;O²AfMK—ãÑÎƉ`T9Ü$¥3½Êw’á0ar_”µ³ÓƒNîLaqí©·ŒÕJÊÑtM{`?á§A^˜+åç!óž*©tdC5Åž{(l-ð3T¿É8„Ò©+v®3i Ž9ÜÆŠ{Î7`±¬ùÙî:»¡LÛÕí†Ò\²APͼÀà¶vwÃ…¯ß†K›É•†‰Ð×4%t£´ÂàÂäI -‚9\‡¥l¿o¶¼$_çp¢°²rx“VÚºvçï^X’Ù0òbœKÎãuüZðãâò¼¿ƒJvÔX"wOT7Îçh;C
쾤rœ“<ôèH¨,YH»è˜8µ\°¸þÇ=ºdé€
Vçqµ#3vP´rJff~éP*¶¡Ž‰S}î2œ™Ï–f‹c¹éiétaç€#„½*Ä€0â5ç+yÎã悺$kF^zêÀ\Ë–¢®j`Ìc?›þIÆ Ï+Zø˜l@ªx,;Ð [u3fNkÀ¥RMÒ^OŸ•Šà€ÈÁK¡)~ééI…ü¨Óƒ9G$«s¤É³b’8Ä$× -ÅÀB”]ÝÕZºNÈSäA¡u ³ÛPÁñ -{¨ Fs<Rrv»U› ¯$_:GÛº(ç>¸Ð?ÎÿCئÒè’
œ ->ÆãêÏàãŒ+€}öÍ+¦\ÂØÛjÀó> 8Ï -gsU<†5¥‘qêƒ!(ŒBsxïÎû¿¬/½LýSÁf§#eg\“ÊD”'Ã{ä”îXØé6ƒƒÏ”Ò[“‰
ÒÎC§tΚ\9F¨—ˆ -p²q¸M|Ø—›=ÓÄ»„Õx€ï‡¡ÐÜQÖµlN”3Èf£•:ÿ‘=[Eö*bD\ÛóU ú˜ÿíÕB\Tx(·ý~ÄâÖ\dWµ{ëR±vQ -Žp`Ž†fQÍ}4‰,N?¹ßc«pw–’AÀ\;’^JhÔ·[ÖÖ½-¶®[ÍO[löNÚ`L®Gaê+]ÉúïIb±Ø=™ÒSÕs>xö¾Çð2ê ðÛ)áz#c„Ê°»J(ˆqº×Ô - šJç×™Ú©l#‘f0#yž~jHCPx{•=¹wEïFº‰Dû±€~oŽlô!çJÒ'Tc@úm]•!“¤Öç/é¡Ž+\t¥Áµ6†þµu=?ôÔ:¬ƒËÓ”|î\÷mÃO¾m‚Bk»#’†s4~.ë§Â1¦ˆ¹ÂÝ><…—hŸóhát´›‰H!†7Ç!©ùc´4¤D–_}Ø;!é܈$Zxö"ÞÌG Á’ ζ¿Bíp ìŽ{‡xS•[®AàJÿQ¿Q.G\5h:Õ•ífô]ΦÁÞ~И¯´Â»Ó±ŽÏ# +xÚ½]ã¶ñý~Å>z]V$õÙ>]‚Kš iƒÞ ÐôA¶¹k5²äJòímùï/J”-û6W 0`RCj8Î7¥o"øéå7i©"Ên6û7ÑÍ€¿}£eøÇïƒ _=¼ùÃ7E|“«"Mo2&‘<lÿ±Šoá½$Z}}ûχïiz¦tfqº‰”5àÆy»½OÍê‡àŸ!½½·Y,_Ñÿ÷ôÿþ5 Åþý¿—)JS¥ãX–P8~c#XÖÓoÞ=ŒÛL¢ø*püŒú¹ŠÓ\Øp“&¹J¡Å5~Ñ6v\÷²<T›OBerS +Éw¥˜0 šÉú%ŠL×-»®lž\ÏCmÇàÁï0šhà–¡kÙÕ÷G·#æcÏH\"Çž%îjž@Ùx¯áÖÝšdõáV'+†…ã¹Ï•óÍÐÅÈÊ×ÜÆÑêCÕµÍÞ5¯ôs„:½Û´8ñ +^æ€óØÜLПqm½ziLľ|áθ‡à:~ÄsÃöØ»Ö ¯ÖÞHræœä,RQâ)jìÆ\Ù<0 +cñ%…Êïò~ +‚ïîoÊ£Ÿ€&\Š +&¶«C]n˜FC^=ÆeàNé[®«^ +:ƒ˜¸#mÁy-·õ–…68»_8hÊŒuINnm¶Ìtq2žäÌÄÊi``>‡„ÐËõëœü’›µF’0¶UÜý “2´ +<°s{± I’ÎÞƅÞTŠ
RÌwK¾®BÛÂ-~ä—®î
eË°÷Áû2qÕ>Õlr®%Z!<丘3Ò!)ƒˆQÛqb*ŽÞW2úyA.ž§àuÅI¨îÎí!‘.Ø;i¨»ÈsïƒÉWdb©ü¤Síø„%A}g°Ðv‡}{cé²5DE’³¤ûz6J [ù3~ìÚ=cʃŠ„¥6J’×on´‡dCc\û§å·½ä˜³å×q«çïƒSo[¸ 0C #ebýjúíÿDüô‡«K8¿Æ„ð8\88“Ì$¯¸iò“I^à ôŒáªèáÅÀï?ÈQ·Ç›K¯äjF=w“_bBœªÔ¯dÂ4ù +d’gBÙuíóuõC&¼’æLm̶Úg6ÇÖ®ÈÌ'£µ£ò?d2[:ì`"{PüÀwB*-—Ö shû¾ZSñV˜jÜ'.¿Rø²ÐÖkØ8´˜@÷¶?Ë 3Àa¿ êƒQhL>«C±¥RI+¸_n 8Èm¢Ôif$Ð× +éµ²šš¦²š¾PV³¹c¸Í¯åÓylÁŒ1Ï·„ðï„ðm°ù¯€ô\–~//—©(σˆ¶»9bˆõ:JÛ + +…þüKœÞ*äÏy +©:ÍźÕÇÉê ox€ãè'sØe'ÚNäµKŸÀň÷kJ—ÊÇÓý¹\ªàÊÒ—Žè8›û;@Šw,Á…ÜÅMµç +endstream endobj -555 0 obj << +630 0 obj << /Type /Page -/Contents 556 0 R -/Resources 554 0 R +/Contents 631 0 R +/Resources 629 0 R /MediaBox [0 0 612 792] -/Parent 547 0 R -/Annots [ 558 0 R 559 0 R 560 0 R 561 0 R 562 0 R 563 0 R ] +/Parent 608 0 R >> endobj -558 0 obj << +632 0 obj << +/D [630 0 R /XYZ 108 690.907 null] +>> endobj +633 0 obj << +/D [630 0 R /XYZ 108 666 null] +>> endobj +621 0 obj << +/D [630 0 R /XYZ 108 572.751 null] +>> endobj +102 0 obj << +/D [630 0 R /XYZ 108 422.931 null] +>> endobj +634 0 obj << +/D [630 0 R /XYZ 108 394.521 null] +>> endobj +635 0 obj << +/D [630 0 R /XYZ 108 358.655 null] +>> endobj +629 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R /F105 415 0 R /F8 615 0 R /F11 600 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +638 0 obj << +/Length 3623 +/Filter /FlateDecode +>> +stream +xÚÍ[mã¶þ¾¿ÂßâÖ,I‘””oykÐàÒ¤9mq ²-¯…“-G’³Ùùïáz±h{7 â +yŸÏ¸]j–Jé¾{˜°ÕL%®óeÔ3%•^bÊ#ý¦Ÿdü—NÏ¿³/ÄÛ/W$,¥pißtŠ0 ªâL'r¶’q%í€ïE¤ŽUqhß9±t/v¤™6ÞÀvŽ£ä–?¦øo>e!K;*B
Y|ÿK€gÂÈ+2(fDäúÕF±¤î4Á½Ç4×–†OÇPL$jÖ“\’Óœà€,p"nH)¯K)‡RŠß.å™ –òcØ:‚÷¦Ì@õ*õªýujÕ`O)Sµ«Y$K÷yÝ=jÀxÓxÞì³²ÄÇd¾)š®uÚ¼Î7Ô‘µÔÚîrz°öØPgsÌ×Å{Î%QÇóâ@uY4-5U[j©êç̲¢n,ý7Õ±-ªCVZ¶pF +Š`©&åfõ½Hæ§=HX +~:ýÃ7ÆP¹13}7ê"NçN=áólÕTå©Í©uS€
L‡^ÛÕ'vä ä}qÈß“Ó÷›"ÛCß½˜×Ô`×QXž°VŒ:—]c¾½SÉNeKz3 ¤5Û^oVT%'…Ž–‚8À
<‹BÂ/l»b ø¡¾õßôQ?¥©Ujð–©w—÷(y DÍYgïĺ8m6ù`8“‰÷wòØN‚¡Kuñfè§ê
\ñù.»—|þîיѴ䲴¶i…*ªÚ½mGºãóuµßg‡MЕ§†Å"é¾Sƶ(˶>ƒÂ½îv™µ3_åùžŠ¦9YÙàù=ÄUgÆkÍÓ»éä@%5²…ÉÐc÷ÝåH%!@ëóuDÑ·YÙ„d7L +uæÜFJ‰Ò¼cVÊ”a$A^')¨DÂ<èµ$¬Á±®6§uNÍÕ©-a?mèm]Ôë6QÞ}ÔîèÉÎ_¸!fy5ù†QßÒ«M +aÃØáࢴÄ6ƒ„œHVçŸ{fÁµ)*‰˜ŠtÈ5P„Äù«Hà¶ñ»Å€AÀoâÆú‡'²µ…ÁHóaªo +˜ñLÓfÏvhJ¦hý‹ÑÖù 1fÞìªfz]9Š&/·‹ÙÏÇ2;dmU?ßCûu“§úBCóx¨Á`ÍRq¿‡>"®ÕÁK…F`›ú„ߊÃõ·~&<ÙôÇèþ#—Ga…‰ÿyØä~ý±f!9@(1.0ìäGÙ>çUÊë¦Õ0í±ÁÖQj_Ñp!ß•NŠP½!M!å_™û0bˆë9–àá"ušÛ9º^<òÛzPµñu *´‹;Ð}«¬¢˜î<}Ö\QžŒ˜áâœk +W‡"6qOX¢¼‰^‰n°]ž)gƒªILI!ümŠŸñ!™£Yº&»¹± +n¬#¿RuA6€\ñíTÙ„QÙ/T÷øu*L@w÷^'EÑø(µ}< ̦JÄc
÷§QÆFyÈÝi½ºBx:T-}²r]tÊGmÅaÄÒù|]щXìÐ}Ý®·rÜAà¼O +šÕ6L%@’CuNtfŸ@ôîà\j¦©µC« cKïtz©:¤Š ¨ßOîú¬‡ýñÔ]^§Í\BBœ¼49‚ïdà”Fq{ +Ù¾6·+£¢|ÈÆaY¸:3…Cº–}„ìÓv—~¢Ì—º2‚EûKžœ¹Ï=ñ¢§ž×3†sO• +gik +endstream +endobj +637 0 obj << +/Type /Page +/Contents 638 0 R +/Resources 636 0 R +/MediaBox [0 0 612 792] +/Parent 608 0 R +/Annots [ 641 0 R 643 0 R 644 0 R 646 0 R 647 0 R 648 0 R 649 0 R ] +>> endobj +641 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [341.598 372.896 363.516 383.839] +/Rect [220.089 544.235 226.266 556.557] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.6.3) >> +/A << /S /GoTo /D (Hfootnote.9) >> >> endobj -559 0 obj << +643 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [157.872 337.419 179.79 347.974] +/Rect [269.332 404.067 291.25 414.971] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.7.1) >> +/A << /S /GoTo /D (subsubsection.4.5.1) >> >> endobj -560 0 obj << +644 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [343.788 201.165 358.234 211.72] +/Rect [354.663 323.37 376.58 334.274] /Subtype /Link -/A << /S /GoTo /D (subsection.3.4) >> +/A << /S /GoTo /D (subsubsection.4.4.3) >> >> endobj -561 0 obj << +646 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [156.189 164.911 170.635 175.854] +/Rect [460.399 207.111 482.316 217.641] /Subtype /Link -/A << /S /GoTo /D (subsection.3.4) >> +/A << /S /GoTo /D (subsubsection.4.5.1) >> >> endobj -562 0 obj << +647 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [188.817 164.911 203.263 175.854] +/Rect [479.761 194.782 501.679 205.686] /Subtype /Link -/A << /S /GoTo /D (subsection.3.5) >> +/A << /S /GoTo /D (subsubsection.4.5.1) >> >> endobj -563 0 obj << +648 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [436.486 152.956 455.913 163.924] +/Rect [463.417 170.872 485.334 181.776] /Subtype /Link -/A << /S /GoTo /D (subsection.3.11) >> +/A << /S /GoTo /D (subsubsection.4.4.3) >> >> endobj -557 0 obj << -/D [555 0 R /XYZ 110.999 687.904 null] +649 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [226.275 158.916 253.174 169.82] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.4.10.2) >> >> endobj -90 0 obj << -/D [555 0 R /XYZ 110.999 494.714 null] +639 0 obj << +/D [637 0 R /XYZ 108 690.907 null] >> endobj -94 0 obj << -/D [555 0 R /XYZ 110.999 333.035 null] +106 0 obj << +/D [637 0 R /XYZ 108 666 null] >> endobj -554 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R /F8 534 0 R /F11 537 0 R >> +640 0 obj << +/D [637 0 R /XYZ 108 642.364 null] +>> endobj +642 0 obj << +/D [637 0 R /XYZ 108 535.514 null] +>> endobj +645 0 obj << +/D [637 0 R /XYZ 108 267.704 null] +>> endobj +650 0 obj << +/D [637 0 R /XYZ 122.346 153.465 null] +>> endobj +636 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R /F11 600 0 R /F90 426 0 R >> /ProcSet [ /PDF /Text ] >> endobj -566 0 obj << -/Length 3527 +653 0 obj << +/Length 3529 /Filter /FlateDecode >> stream -xÚí[_㶿O±o•5+’úÛ>]‹\iŠdû”äA¶i[8Yr%¹»›C¿{g8$%YôÚ»×AqXÀ¢HjH‡3¿™áò»þøç!Ëóü.ÉR–‡ÑÝúð.¼ÛAÓ×ï¸é2!"(AÓ_ÞýñCšÝe,O’»‡îñ°ù1‹eLÿŠÅ’‡ðü°øùáoº{Êx*±»HXKóÍ7‹e"‚¯õï?á—ßëòWú÷÷µLd,ŽSó5Ãö;)b&Caê¸ÄÊw_=¸¹Ë,g)Ð}[Ê<d!|½”‚I‘»fÙ]ƒÊñ -â2*žÊîGšW]dÈ¢,6ýöÔÎC>êÀ2Xi¯T='ÁE±%QšölJÁ6ÿüÉó}Èx"nœBS«%.ųÉR·?W¦ñ½°Õ)y -{;^mšâIù¸…,‰Ò+S¯s+ù¸…œZVe×{ØÅYúniqvÍÀ:8Ză±ßÃ^uj±”qÛfsZ›—¢^ð8xÆ—8h¶T™ÐcSn"¶ªUuoº?awÕ1zª†fѵàA¯Úùzàœ³Td¿ŠWž²ˆsÓ¼†•é©”‡ƒ!œK˧9¡Œ%ŠRÓο™Ì¢Ètxž³0³¹§iôÍ”ûZÈ%mœæFÈrÐqEuhºJ>Šâ ×|†‚úשÄ=ù7þíK¤wn>É0c‘LGzæi`ëx¶ÀÖ\ØÕõÆC*e™ãRz¾@i¬±þl¦ÖÒ³4S¥‚ocb8ôÒîpu±óÏa!¹i^}Ö×íõM¥µùx•$–ë½O¶bnGÑBt†# /–?šÅ4LmÄ%D£Ê':‘DCˆ`Õ´…¼’2Ô¹Æc¹îO¢V”° -붿§šUÓ÷Íážú¶ånßS±1ôúæhUwTëÞ!ê‚êå”Í!’”É(I
énØdƘê<C4(iNfmƒæ·–C ãbj5ŠªZ,E’ë/ñ©¹"Ò0èÊ'ª©TŠ«£dÏcÙïéMA ÙŠåîX¬q^ømcêê¦ß—õŽ^Êšž+Õ?*UÓÆ -<Uú3³ÓÝx&Ø~„†c[½pŠ×NôÕSq8VêOs–£
Ì¢Ç?U«¶÷XŠ$aa,ðYŠ˜“J -CñDo‡bÝ6-?Sa¥è h¢*Õ†^|êŸg¸Ò³Óçµ+ÜÙ#„DÍ©'¢ -ŒyKEÇ|é¢PœÇKàp’âx-s£kX鼦Íò(¢4£hN˘"³˜%| -V ÀjjªÑ¢:7”’åa~̤,sþ£7pOÏÃU^,³ØE«ï3ëF¨¢ŒÔ§Ù?8«ÓØ]ÝàÉLËš9¯ÒžC(ž#=ɨÁºâºß—öÆž¨øšö#µcdIµ` -à„ÝS -‰Y‡5Û¦2‘‚YÐv01ÔÂÙ¨¾‡ÆŽZ÷šR¡ÓÑWfÎpžÔ$zEV`¥@ÈÕ™s> -çà›mwvÀsÜjÂ"ð«çºÈ“›™Da®¥‡üéŽöÆ´Ì[³C–@}:|^~ʦÑÀIó|–FƒÍØÕyf›q°@Ñ)›Ë³½Â¯ä÷ï/3°2#@V0=æ“™ªzYlò„Å2ýÍÄÆ›ý™ägæ€ç|pnå+rµ~}àòžt$°bÐÆ•AHŒˆl - v9ˆyˆ ü -¦ƒË„5°Ê ×1™Ât2NÔ_u.8¢;VÚ”ÂRArr…€ÏGU//ûüåúT:j`p–eϨb -§PnªoŽÞ%ñ|4Ö½ÛI_V—§çnê2´ò^‰ˆ"î‰å‚€4LUÖîØ–3™túÇc>$]šñÍ‚ÐTÀ‡^»ÁRâ!«Ë¾£"åÒ°d.£8Í%spÑo¨¬êâ<£ôì[%“b´k/OÖ݆¡Ù2*~·¥çº9µÐˆ(d™óë9"OaQ}©ÝÚ<¡ÓµVNcñ™ô|æyãNB:Ú³Nv’¦9¹‰Ò] 3iZ1¶?Øö©zÊmÈ-O¬J…*sKHùä3={ØdoÐI¤1‹\:ö† ë=ØK™äLFÓ˜ã…àÓ,¡ñHg#ð -Y(=Rxg’0
Þ°fÙõ˜,;ŒÆpFÆÜ›o½À³ôóóÍ`Ä2ñÚ{o$¤×Í —sçíêqè`ï$ä(âÓóó¢Ó 5ÁˆrŠÚ†‘
”YëÀ·P¾3›¬ž)¾5Â6ä’Mpœ+ù4æØ&y–!€|Ø)øìã›o.ÛMð_\Œ;ñk]\y+Õúo.GBG›^¡h¼ä,ÚÐa×kصú,vÅWÙÿ?°+ôÝv½Fºª/ìz
»Ú/ìz
»L(ç£/ Ç +xÚí]ã¶ñý~Å>ÚÀ.Ë‘”ô!I/Å¥HS ûP éƒÖ–×ÊÉ’#ÉÙÛòß;Ã!eÊæ~änïò,`Q$5盳â‚߸<¿0g·«Ý+~qÝ%üðŽ_E¾¾~õ—o‹ì"g…1×À¤Ì& ×ëÿ,²%|§ùâ›å¯¿sÓ-VátÉ™’`ã¼–WF.¾~©çŸË+e3ÿòµûýÎý¾†_`±}í~œ–˜02†‰,óK0¿P–U…ï;_½¾ž¶©yö(püŒ +Ú9ËLîÉpa´a\ ~*Ûwu;®«Í{£¾( +½¸§—¦Â—Û¥Y”º+”…J +Vhí>½vCˤ~fåº_ûî<“ÇÞä\ÃÎw;"¼±ŸmÐ6à®·Ýa<߃’¬aQ Þ”«·CSÛ/ŒY0õ¤„˜”9y-hƽžËª5›"y“ÞÓèxÒx‡ÝMÕ#›Y|‹#ŽãaÈñÀ»r·oªKbi3™™1A¹+ü Sp + #µÃ9Ÿ‹-œnŒÆL³~å4›¸TiaÎ
SöDïÌ +»Ã0R+M+ ³¹Ž‹Äà’Ø8-b Œv:hFàß´~Á.,Ø9詹*‡j¸<ANñQ̤°Oj’lRáÄ +\ læ‘'4Ú©àìûn}Xa0Ð!ˆhÁDa ‚¯î{×È{ßUíè§nún—pC
hy•}—‰g(‰„øÍÝ 5qIðGfxbè‘z-‘=Žæ<îutunTL`”$Ì3=?zû urÊXm^pò%ö‡ØVã +¬6ÄáØîÙ¡©“Œ–‹(ܳÛW- Cßv-Dn`_Bl@ûßöÝávK³Æ +ØA±1^±¹K5l!{ÞÀÛ0T=8õ&ÌŒívÔ-=7ÝÁ§Ór:o~äëÚ§mû*dÕœ)ï‡/赪}fÚ>Cnƒ©ð"Úöâ>`>;מˆlb”àA´f*ƒ¯] +Ú5»Õªê#õ€©«f¿944Œù^ì|Ûv¸•;ß»ESLÄB~ÜJÙÖÞŒ¢›:nAý4ص'ò}JWHªZ?;%1±^ÒB\)8ËÅ™_ëôÂùÅ ˜#;]Ì‘“.p‡^&¸_ÀþA<†±ìS`˧9¤eZ›ºo:…~Õ$q¾7g\ŠI¸«šÆCR" +X]2Tí ¦D¶‰³àxûFR†ÄVÁL8£>/JÖÇÓØŸmž>[¡%è<ù¬³½RGK;OT:úâ–!ôvœBwlx__ÐBV'þD‡ÉùKî3G~hTî¶-†„þÕ%5g +þ¸ˆuÄ@„ôð=ÕXõè>“k…]7÷'¨‘„RssCiå cDG6Ü&®Å€òXF`gLÙåñÍ4‚¥ó‡fæôžúnü˜ÎÕÛ»:Œ;@¼C°mL± ˆ£ô8‚Øâ¸Ð¤¸ÔLò¤1-èr3w̱A~<`#ˆŠÐ·ëþ, ÿh¶?Ãå¼\‹Ö6"bÃKìÎ…õÿX¯özª/𶫰d¢ÁÁœdj‰¾u¿ÿr%Co\û›$áò¶£¸Êˆr5V[Â¥ÖÝàÅ5Ó'ÚÛk]®åzí}Ozy[•ëÁ]Q¹þ±¯hnæI}7”„Û–HˆŸ·Î4© +=Ž?q +=¼|CkfÔè"ôÒÒì~^â…ä8Á®û€B( 5çúrµrå)·dÏÜ]£æÇ(Äsìd"§1°•«COøÐ=úó&”Û‡SR†ÃÁ?·r©=ì’Î’ÐO• +M®ðû,ž2_ÃõÑ8 +ð?n:®OF\»ö‹8šR-¤
—['f&ø¤3¡Ì²O_3@ðD9YT€åƒƒàDeü„œqØ4ËÂs`ZñùÌFBÇÛøÅÇòÉ.¤^^!o;rÔ¹;‹]}w8£ýµ¨s˜Ï•r°º˜/m[ -{ùJì“‚Ê<x˜õ8T
Êa¡œ‡JU]áUIýT^Iíáà\9´9ï{Ƀı»#IüÐi…B…¨7ò‹…Å +"=ó‹_ûòy%_MŽ²8–Þ»ÁT/§ÀôWDªìëò¦ KC}Kk¬4ÛúnšØük·IÙ‹Ušú÷Ù‹±r1 +lã‡ÖóÁÊù®ÜrE0A¡òyî´/‘wþ +È€cÙ‡ü'z’¾r«ÞÁMJ––°DñLÉ:N~D²ü¤Ó +œKøQø£/Q² !ñ-{¦}ßõ%;ˆ%–`ƒ’õåÓý +ž[¼G}GÕ^:i€4ÓõZÒŸ89Úñ€=°“Õ›Ûƒ¨Ê ÔC*Û¼këzo|Eæx}’D))'ÝÎs»2¤ªgÿo7ÐZ×ȹÄvVîÙÒ ·”m7Ρƒ?êÿÇ'|ÀÖ¨Þ|UŸí”³2ˆ¡q™îÄ‘)W|
üC¼³Í +endstream endobj -565 0 obj << +652 0 obj << /Type /Page -/Contents 566 0 R -/Resources 564 0 R +/Contents 653 0 R +/Resources 651 0 R /MediaBox [0 0 612 792] -/Parent 547 0 R -/Annots [ 568 0 R 569 0 R 570 0 R ] +/Parent 608 0 R >> endobj -568 0 obj << +654 0 obj << +/D [652 0 R /XYZ 108 690.907 null] +>> endobj +655 0 obj << +/D [652 0 R /XYZ 108 664.406 null] +>> endobj +656 0 obj << +/D [652 0 R /XYZ 108 570.376 null] +>> endobj +657 0 obj << +/D [652 0 R /XYZ 108 501.755 null] +>> endobj +658 0 obj << +/D [652 0 R /XYZ 108 432.178 null] +>> endobj +659 0 obj << +/D [652 0 R /XYZ 108 289.894 null] +>> endobj +651 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R /F90 426 0 R /F11 600 0 R /F8 615 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +662 0 obj << +/Length 3846 +/Filter /FlateDecode +>> +stream +xÚÕ[[ë¶~ϯØG/°VEJ¢¤ô)—“ m“É
äA¶éµYr%9»îAÿ{çBJ”D¯÷´h‘â +‡³Ã.×°À,ÌA*â@äʬ3Wú~-aG‡â^†«ßîEbk:k,‰UQµ÷b¥‹Ý…¿÷͹]0@„iÉÌ°€Wöýý+‰·õÙre2”L̸c±m›ŽÐŠÞ”Š_ïÅ°Ô‚Wq,ê]Ñ7íÅÔ³ÕÓù¨k3jÛÔ]ÙõeýÄßÍÞô¬íˆMÙ·@9[‹HqAAyªÏÇnárAÃñwÛ4í®¬‹^ó÷©(ÛîË>-´ìøss±CŽÇ¢øãñ [3´°ØrÞt?66a†rs4}™-TØB]i¡YB막×Ϊd”*` +—ˆ#ð[öúعUùªéáȸwüê/'ëÇ_™AýAôÌhÚÕ5õÓÕÝIoXYTÕ…«J‡o{2øI×ÚYïæâÙ +LV§¶yj‹#N%cØ×˧ƒ)n47!O¹Äâ>¶¢^—,.8xÏíM=t<W;nëÊã‰ÕÞ[ Ø7ÜL%Qs€æK¯Ûº¨¸æç0”•Y¾±Ãfß"àÆÇCÙy¶Y]85]Wn*á‘éÚ(ŮѦki•†Ëû¦ªš{˜ñyІgâò±Tw=(ø (¤¥ Ò`šc•‘šJtÒèéÏ"ŠOMu©ÊZ¿7:Œ:„A&L׃!&ñ= +2eUžÄqAAÈ ‚w)=ëqIüsiU’ Vð0ãÕÖZ€ç$ßC{-3¤h,Á$DÙbÇXƳۗ•o÷¹ +’ÁcÝÚ>KH]õ’Pir‹ ê:`ý!lÀn$§~ÏdsÉvÿ—í.*aOÅ;ŠSÖ,ìAhÏUÅDŸJd{Ç~jÐ+¬…&Éž3ê…ým]«ÿ~.[2Ð8]ÓÉšB—q»*3 y‡TiMMÙæT™ ¡°Ó° +G§fÍÔJô tîŠ'Ó“DͽÁ§Zr¥iêΛNoûìÕóDqÄ©ºKâ<Y†°†›Ú§;.|ç Û{ít_ 9IBA +¢ÅÜ +:†Â{¹lŸ×gœbÈG;XvÔý¡Ù1‹lA*`Í€ÙŦ2,%óJíÆ—Ò¹É$á¥Ì½"q[DÖbɸSœFÄèa°váB±’](–è”áeÇý +À¹—>‘Porö÷ +ÁVÓ™^†=m %pbµ3µLÊ´¤¾†Ä©Üö€£t¥=€/ʃ,N”O#Þ½àbÙ‡¹«2«¢ïÉëâ:ZŸÍLT®ªôÒ{ìbJ¦b¡Î²*ÈÒÔ¡Z¼”H®:ÓÉ‚hð:(×UXF" +Û>¯Ï8#d¶-ƒ¨)æ€ðK +(زQu÷“ǃ"dêžü +Ö.: `“9”¡ÕU ‘ùÓ‹&”#jz<ßÒÚ&A*svÃöÀo&ƒ¦ºA/ÞcŠ½I‰Zï3™ªÄBu€Ïo™Ø@˜ìl<E“?ÔU9¤åì4=eѱ8Öøe*~`~Ñô |¡Ôj{nÍÅðöëzƒ +MŸ×'œ²‡Ïâ#æ7¥ÅðL¿AÁúþÂuÇ3X©ìI¥ +¸AÉÈæ÷Õ¦í=~B)ºr|÷N +É—ì6‘„FjöfÛM~'NÆ«þ!¿•|Goo܉‚E˜ù¾ªg¶E§§ãD.ÖÖæn€ï¿:ݘÝJî0"sB*d8èvr£_uåqÀ|vâ8]¹Ó¯çp¤c,€.'Nç·P€àå``?ìQ^*GäOé¡òºî{=öMjp׃*9½÷ý¢iGžyü¸M{®Ÿ®ˆ½‰\Jƒ¤áÔ1ÞÎù—Ã{DûÖj’¼–WÀ¹Dò1k<¼w*ìS._ºOÌ ÜkîW‚Üp¿óËíË[HmÊÀ“™‚„‰H)»VøøÏf><7(óìåûm!<ž¾êaÓlÎð÷—Û”h•~I<–xáeÞ¿øÈ&øÅ.`ºH?\íÛæÈ3±]‚ª¦òM ®$’ÉÎ×ÅD×Øß>\ïÏUyÉcyûz +¬r³‰ó¦6s…•µæ;Aªgj1ÉÝqó˜#A
wóXXkóXÔôè¿åÄ"}Cú7 +ÂØ*Ötø"P‚·NÆÃlà´Öo‡MÑz9¾Š•æ‘›$à…¿|)d^á|Ìu6Eûš†ìvÓ±óû¬:¼*úrK |º^¥úÁ²Žs’›fäBè_×[ýFïXf÷ªš¦à:â|̧R–Ð܇|ËÅT<[òZ51õ¸‚sÿhR3ž ,‡ÒDí®¨•Ê‚d¸v +Š†¸bÈ’ÛÚÆMÕf6^xÚ·cÂŒ^ßV—åÃd\vÛ™.£«-ë™Ë5ßì–|sòÓnfí6˜ç1㚀җŒÈN9
ÿ·=¾! +endstream +endobj +661 0 obj << +/Type /Page +/Contents 662 0 R +/Resources 660 0 R +/MediaBox [0 0 612 792] +/Parent 670 0 R +/Annots [ 664 0 R 665 0 R 667 0 R 668 0 R ] +>> endobj +664 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [128.294 517.553 150.212 528.497] +/Rect [342.48 546.035 364.398 556.939] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.5.3) >> +/A << /S /GoTo /D (subsubsection.4.6.3) >> >> endobj -569 0 obj << +665 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [470.376 517.553 484.821 528.497] +/Rect [230.132 510.543 252.05 521.073] /Subtype /Link -/A << /S /GoTo /D (subsection.3.4) >> +/A << /S /GoTo /D (subsubsection.4.7.1) >> >> endobj -570 0 obj << +667 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [110.002 505.598 124.448 516.542] +/Rect [291.044 373.059 305.49 383.589] /Subtype /Link -/A << /S /GoTo /D (subsection.3.5) >> +/A << /S /GoTo /D (subsection.4.4) >> >> endobj -567 0 obj << -/D [565 0 R /XYZ 110.999 687.904 null] +668 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [313.29 324.865 332.717 335.768] +/Subtype /Link +/A << /S /GoTo /D (subsection.4.11) >> >> endobj -564 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R >> +663 0 obj << +/D [661 0 R /XYZ 108 690.907 null] +>> endobj +110 0 obj << +/D [661 0 R /XYZ 108 666 null] +>> endobj +114 0 obj << +/D [661 0 R /XYZ 108 504.815 null] +>> endobj +666 0 obj << +/D [661 0 R /XYZ 108 482.234 null] +>> endobj +669 0 obj << +/D [661 0 R /XYZ 108 307.121 null] +>> endobj +660 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R >> /ProcSet [ /PDF /Text ] >> endobj -573 0 obj << -/Length 3194 +673 0 obj << +/Length 3070 /Filter /FlateDecode >> stream -xÚÍ]ã¶ñ}…ßjk–¢$¦O
p .@4q€Id›^‘%G’s» î¿w†Cʲ$¯ÛôP,°¦†äh†œï‘˜qø3!83ÆÌâ4a†G³ÍáÏž`êëá—p&e#˜úrõð÷¯’t–2dzÕÎXmš«ÅRó9sÿåb)8ü~µøeõ[ž0‘(\.cf´ò{Þ/–±œíþÿÿÅü{7~çþÿÐíî^&S¦uâw3œŸ)©™âÒÃD„À‡w«Žv•– -G÷èØŽq -
ä«Î£ù©±[F 's÷I0`ÆðÖÇ×&DÄt§UÏÜ°H‡[[ƬÜN`’ÜoÊ—ID2p°ÌžƒÀ:„µ'{cËÖÖv;I9Ülš2¡ýÅSmQ4Úž€H€}Éžóæ4$q‡?"ꋹuUomövÚÖ)«áÚ,·u†SÂîj€%áÙZF_VNñh¾ ï±ûl!ùü÷¼ª=-›¬sŽM~!’›}V>á‰HÍcÛXD¥,/*dû@£dž`°©¸§†žÙKØC€ÚmÖ´™_VíZ[Ò -i"YC>ι¥ rè°2ó{Ai €â2ïÀa•>¦tbY[6VÜ’B* :cÐØöãŒ]O"˜P÷ú0D4ácÆéôEúÕCðq‚Á™èÒ³[«)`…J_§ ¸Ï^€diä¥÷§E¹ÊµóJÁ -}o¦>M.¼º3x·È}ë§I€¸V˜ÏDB=MB¡ÞH‚¸AB@оý"¼p©‰¸ˆo‚–Åë¢cb¦Ur'ÅŸ,èz èpÕ‚ÇS‚þ|PHPRó™2Ià\Í™/ÿ?d"¨X2í -&š)‘„<&aÒyƒñwKcç9pàìƒê .rŽ¯7Ÿøš!‚|9‡5b*²Ë2ŒÛV
¶£f[æÛBœ2: -¤Q½ôÛ¯Ô/âû.¥:µW@X'÷!骵Ó%ðô:–¥J°L—¹JUv×Þ¬ËL¤u8›ª¬]€;ÍWü:’´CÒVSi „I¸æIy…ܨ;»ª\Wm[nô°ÌŽ-ÄAc7•»a¼ÁXœÊ„î¹=ŒðqWja‰:?ÐlûI¿)„ÔÙ0¸AëËÐä>džʢñ’šI5çÒy:k¨˜‡#_;×zÎhÉ*lk÷y½%X(x:8E+¼.(½>ˆÙÞÛhÚüA"âêòihàÁ ÿ‚#yN‡Í¬ÂʘÜ.ÒDz蕬SI‰‚³õ†èìò©n¼›©±1©zÈ‹Œçy*vLcÈ“õgÄ.…4·k^+y@¨]Š>™{¹Ê\ü¿Ž‹^anè8 ]÷‘Š—E¬}ïyiR·¥Ïë·Ô›Ô^Fa -¶ëÕ›èÓx5ª€l^‡W•I-+¢Ô+‚|¿È\iY¬ -_)ÄëU¹‘«Ž/G1!äËáð6+§s{ÔM«°†Ì’¸öÁ -8óÛÃO¿ðÙV|óÀ™‚ø +xÚÅÙŽã6ò}¾ÂoëÚ\Þ’g“Edlú-“Ù¦míÈR¯$§»äßSÅK‡ÙGv’Y4ТÈRU±X7ÍVþØŠÑ|¥J +švçwtu„é¾c~yƒë› À‡»wÿ¦«œZ¯îˆ€p.#’»ýOkyß)ºþÇÍÏwßYðŒ°L 8§Dðp#Ü7Í×ßOþ»™ÝlD&ýËûÿ;ûÿ#üg€Çwöÿ‘DäHk¤ô$®¯²¢ðs,ÃÉwïâ6•/Jׯ¤À`œ©s/†•V9ÑðDŸ˜åcÕ×Uc~õ<ªU<Z1(JræÙ9¹eÆé¸.H®•_o³AT×X„ ™¬òh¦\!í׳’ØœpÖ†1R(yݶÝÞtQ˜‘“¤®ˆ`nkw'Ó8!%×egjý‰R~¼t~ú\wãáTfß•7L¼ÿ%ä¦Ú.ÎÜ°µéÝ[@ +ÅH¼OEÌÚïN¦ônäDÜÞx·Ñ_¶½Ù
UÛ,}GOj©4'ªhân©;®Üàß 7ðŒ®mÒ¦ +´È‡À¢ö—éÞ¼ƒ3)›cm§jwºõQààž!ü4·ÓèÀÀ8ûj[?-öåÙã*'´œ„&9l~*„C{AËãùzº‹Ù~%xZùFÇ’‘Ñô/j!jy{Ü*hïÎƾkç·/x/ÝcW·½u>0¾/ÑJìbã§v.>㇦ì+ˆ‰Vðº5"Êͽ:KsIC¦ UÓ]âÉ\ïÒP + +„¨§N +T–r¹ð O K)+AÞ9O¿ëªñÑé5Ýq¦õ>* +×ÄH÷tÞNçöðüšU"Lí^“PW5„¯àɃ·ÍßÐ(ü"Ö)½G^¢qÜK_u7ʳºôª 2ÓéìÛòÑô¿ÖÛnH$zM°ÿ[GØ%NH6¤@èÓÌS7¨—1è$¤äÒºMxܛ^ԺêÉ⦾=8¸Ñ1Mó\&9„ÏØcÂÁܧõeŠˆH +˜À”:á~rn¯œž?¹•àA\€Bm‚`èîêÃrXÅŽ@·)ã·eëKtd1%´m„ðŠê‹éØýÈÂI½Kn§Èåj„IW¶à#E¬ +Éæ\÷É…xûÑ$mŒG“£ »¢åÖ݆š_¿À5X(÷Ówa}D¨ñEp¢0ê&ƒë +›ä ºt‹ +GX쾡G…¤Ò=*Ú(ÿ@*ôâ2ÈWå¼7†¼‡oµ̃k
©YkÛ.¤ZX¶d¢x½£îŽªxU<çmJ‰DNXžM0?¦QÏÚÊ©¤T5ŸæØOÏàᤈ-ÑgšÊšäY6Û¬yí‡Õ±™v‘Îþ‚kü¥Í<ßû3Ô²ö—D³¬@P×÷E0QîN•“{¹d•Vë'—KÁp +Ò7,uãfã}Ž]ó&ÎÛ4«w/6þN +endstream endobj -572 0 obj << +672 0 obj << /Type /Page -/Contents 573 0 R -/Resources 571 0 R +/Contents 673 0 R +/Resources 671 0 R /MediaBox [0 0 612 792] -/Parent 547 0 R -/Annots [ 575 0 R 576 0 R ] +/Parent 670 0 R +/Annots [ 676 0 R 678 0 R ] >> endobj -575 0 obj << +676 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [343.185 602.061 357.63 613.005] +/Rect [214.37 559.813 236.288 570.344] /Subtype /Link -/A << /S /GoTo /D (subsection.4.6) >> +/A << /S /GoTo /D (subsubsection.4.4.3) >> >> endobj -576 0 obj << +678 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [254.306 476.532 260.483 489.325] +/Rect [270.919 228.909 282.874 239.813] /Subtype /Link -/A << /S /GoTo /D (Hfootnote.6) >> +/A << /S /GoTo /D (section*.21) >> >> endobj -574 0 obj << -/D [572 0 R /XYZ 110.999 687.904 null] +674 0 obj << +/D [672 0 R /XYZ 108 690.907 null] >> endobj -577 0 obj << -/D [572 0 R /XYZ 125.345 234.08 null] +675 0 obj << +/D [672 0 R /XYZ 108 666 null] >> endobj -571 0 obj << -/Font << /F78 368 0 R /F80 371 0 R /F101 484 0 R /F88 386 0 R >> +677 0 obj << +/D [672 0 R /XYZ 108 422.145 null] +>> endobj +671 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R >> /ProcSet [ /PDF /Text ] >> endobj -580 0 obj << -/Length 3202 +682 0 obj << +/Length 3298 /Filter /FlateDecode >> stream -xÚíÛŽã¶õ}¿bÞ*k–W]Ú§4Ù
¶H›¢™>%yÐÊòX¨-’¼“IÐï9<¤,YôŒgdzEÑbõE‘ç~#GÜpø'n„à,˲›8MXÆõM±{ÃoîàÕ·o„›Â™” xõ§Û7¿Ÿ¤7)ËâøævmgÜ®~ŒÔbixÄìÿr±~ß/~¾ý³ž0‘(œ.c–å¾ù°XÆ2úÖþÿø_D·ð;ûÿÃ×Ãf2eÆ$îk†ïo”4LqéÆ„ÁÁ7ïnÜUš±Öà!–*ãŒÃ×K%™’Ù@ašÞd°©Sø“Pú®V?^)?NQœéÔ¸yz/¸M`)P@ï÷}WýZΑ’Å™v“*÷>®á÷øù·ù÷ GË‘ø¥+÷%–pu -oçŸÆSq!/Fà_VþK!Æ%ÈRP-3Õ¾©ê¾,OžBÕ\"0óÊ3OL¿ªÀÌÓÓϘI˜áÉL`ۼ﫢HK–ÈôÿÒúHKK&c=“Öík[Õe÷ÛÍëó=A<E5™æf†é§«aúË«`O\Ö9Daiö?§}YT#£ È‹d¨!;8Zx:r«6_Ýw‹¥R:ÊñGE«¦wÏ=
”i¢O8³lè•
ôvÝ´4v¿©Š
õ›’Æ~‚Ä¡íÜzEÓ´«ª^XÙ½¯üÖ5}«–¸Ñ]éݶ}µß–ôºYÓ(®?cÝR+'r¢Û×ÓÖ1c¦”׳¼^-–R§D3]Y44˜y’“"*iIÆiH2þNHÆ#É8½/×OÍXy}]KÎè#Ün7 U廲'¬3+š ¬Y;÷I‰„FíBòhIª+
¤ºñTd;0nË=}|¤‘ªê׈sRn<åÈX/rXž™iŒôø@ÈÌÇ}À%Kb5Õ"ã˜e¢MÞ®hù¢Yy~T5ýêo«†,Áå²”Ò§ý•·%¢¯låðÞ|oÿÿ«¹ã¥ÁC$žø]^´MçwÍ{‚[c_íÀŒ·$IÅÅÄU¯°T!œ' -÷ -Š5y[KªqT{]† ›f²p\ló‡ãú2ÆžÔª™çÝÐÃ}Þ›órâ -sèžVe—^û<O;bgÐÈ$ã™yuu¸ó祂Zܨç¶_„ÑR@®µ*G(
®‰\âÊç1J¡ÔÆ -”`È6ðšÁ&ßïKw#3üýè® ¸K³{ s4ëCøzÑï$8®_(Š%·Cèœv§ -Sýªª5æ9eæjpÖµ?õl&›jUN'—”>,b¹¤ñÖg–öà -Xwdз7Ò¬}Îè®` --F*!‰°é„‡UtXfïÜèôõY1d)4÷Ž 3ŽG&éc»#J©8ÂCúÈVtðàdnÆr6CÇà] -Û‚©ÝÌ‘œísH¦ï°'ñ«tÞO$;pTþPjKurP27?#n¨ÌDvMï´î9i«³aF÷¼®S9M -g×l›÷XÔÜõØи½¨ÝahÀ¤3á8
ôê$?^~¡3T¤{{ -OpŠ¯·”U,žqÂ>åñRÈ”i{$w<[úfÜ®²÷ƒ%Wq•ÑØT0Cغ£cÁ7î‡ -ì‹I?ôýH>8
]W.ß¹Îe‡äÛ8KÞJxé§tH "MÏ«jmí5L°íCx3Ê`‚mUÂ/Þ•A&¯FÔjG-¼{ë¦5!o›ùeu÷ñ\£aºðÒ(ìM`î¢87Ñ]5iÄã+šbÜåFÛÎÀQŠœ‡#m¸£ ïð¶-Æ,ÛÙ€7÷Ç7yŸT¹wƒrÙk?ø¢öË•4€mç¼oZۓ🶈¸°Ó?0ã7Kcb<—ü™ÿû²É_Ÿýê#·ÿendstream +xÚíÛ®ã¶ñý|…ßjG¬xÑ-}j‚¤Ø +1ÿðËPÈX½…òrÚØúX4íŒ,J$Yö'žÐ¯ÎTR(0Q ¥È¢¨SØÃg…½Daq§°ãg…½ßÛ|VØû)¬þ¬°÷SXûYa藺ü¾hœÎfŽ"‘fò…#¡™cF/åôÍêìq³½”…?˜Ù\dÕÍ$ĤBKŠtÖÛXØL¼<åÛºjŽ–çc¾åîCÞ<ؙƫ’ºÚcåçs]ë"o-aä÷+-mÃÃíXÉn¼(wÅæy GËŸW +H/¶áíhD6Ú²ž +èçNE¾my׈ñj?dk +e~½RPßúÀƒÛ +öÂé†j¨ã”?øiôíÙ’‡ÄVÎhÕ¾µå°kg›¢v{̳À«€]ŠSQÞù™ŒÎ:¾8d¬må™ÒÊèœòW2DËa+ÇO§qòía?”[?Ä3«K{,J·O U0¸5,xþûqF.2~³ˆ€“$Õ˜´ÓP}· à_½üÞc=t_é¸:»I.ñdå(᤿ò¤žàqž^oDÈ•3Ðò$9ÝH¨RRðŒ›IB¡Ò¨çÀ®±ÖýÌõg€®¯Þ˜f&t
LjºðÙsw*`,Øh<S&¢XÈ4é1Ae‘éòº¿< +äh6}c€ï¾ªPK›o<´çåFpìøC-¨‰;ùïpóU—㎈ñe_‚èdÇdUÝÚše~²3ÒDHÉ$È}Lä©øêåU.7ÈÉ¥¥F{Èrë9ȱîŽ*4òcmóÝcƒàcU21±+‡|kⵞ¦/¹6i·Q¸”À…·ÁÚß.ƒËú7 +V‡¡C”ŽÐA%:@¾ŠW®kåôqç#hì9¯Ùû%Úä¼Îu¼àVÁÖ«’¾ÆöÛCÑÜrWÉcäÑè‡e¤9RŒîˆœŒÒ´yÝ’7E»õW&ô!g嶶`|¹,[?²¢ Ñ¡ñÆ“ðÛ‰÷о:òUÒͳÈó}~:ícŸ&C
‘V¶0\|{>m¦bL¸Ay¦^Š[_ÆÅ¡sø%P« QEöL¤Ï¥l‹#‚r©æ2¥Ù +YmJ|e—œbíõ\C0Ea§ØSZ»sGå,¶ñ˜„G…rsdI½›†f"vÚëe|.yìœ=@.®0êš¾òõ‚ßrÔÁ¹%ܽÐ{P»Ú°Ñ\6
«”b"
W™…NêgcÆzèÓ˜aDÒåì3
S2‘hÙ_|&L!œ§—r;šâS}Uù%Ô®×`ÃÆvšç/¥8XÜl: æøè™®t™!øÝVLN-¤W:IOëÕc=t/d#ÊíæŽd*⌎ž§Ãå¹JÒÔM0ÎÜr½ìOŠH^ árÿnh©”Ô_¼‰jÊ6¿gøÀqÊ\è} »À¡¶~²+© +D*Õ _Þضõ¨oê ›¨›/Á÷µ†Ë,‹_Óô¿Û=ÒènÇ!P“˜FŠð×™ôÞT$Ý»p(ûÊQcÛ§Êî ÐæÓ•Ý?´æ}®æ8 +ÌG¿ÆG/ˆÝË×@2Î{ (Â7‘ÒÃ{ã·›NØ@˜dàè“%Dx½Ü“ϳÅܧmS]ÚG¨Dpô^J¥{;{îEr¦P3ÈÅÂᙪʣݷÿ‡h±Y´²v™Ö¼hÉÓTTG¤æ +O©Èº³=¿s%„0iGeSµmuzF?Xªˆü‹ + +endstream endobj -579 0 obj << +681 0 obj << /Type /Page -/Contents 580 0 R -/Resources 578 0 R +/Contents 682 0 R +/Resources 680 0 R /MediaBox [0 0 612 792] -/Parent 547 0 R +/Parent 670 0 R +/Annots [ 685 0 R 686 0 R 687 0 R 690 0 R ] >> endobj -581 0 obj << -/D [579 0 R /XYZ 110.999 687.904 null] +685 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [344.337 508.63 358.783 519.534] +/Subtype /Link +/A << /S /GoTo /D (subsection.5.6) >> >> endobj -98 0 obj << -/D [579 0 R /XYZ 110.999 219.058 null] +686 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [333.828 383.88 360.727 394.784] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.4.12.4) >> >> endobj -578 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R /F87 383 0 R /F8 534 0 R /F11 537 0 R >> +687 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.382 371.925 149.245 384.689] +/Subtype /Link +/A << /S /GoTo /D (Hfootnote.10) >> +>> endobj +690 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [156.147 129.064 178.065 139.299] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.4.12.7) >> +>> endobj +683 0 obj << +/D [681 0 R /XYZ 108 690.907 null] +>> endobj +684 0 obj << +/D [681 0 R /XYZ 108 666 null] +>> endobj +688 0 obj << +/D [681 0 R /XYZ 108 300.538 null] +>> endobj +689 0 obj << +/D [681 0 R /XYZ 122.346 161.293 null] +>> endobj +680 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R /F11 600 0 R >> /ProcSet [ /PDF /Text ] >> endobj -584 0 obj << -/Length 3038 +693 0 obj << +/Length 3556 /Filter /FlateDecode >> stream -xÚÕ]“Û¶ñÝ¿âÞ"ÍœP| Ù·Æ=îL›Œ«ôÅÎL(Šwâ„"’òùÚéï. -®¤ÎàæÝþœ‘9p/ªB"&ŽZ°f[Þ,õXŒ†Ö~(rU
Ah -ƒi3¡Ñ6vt‚`Ûœ®Þ÷«ÑUb&97eW6Åó1oøí˜7:fë]·TÉ¢,=ïŒòñNãºx¼˜ÚØ2ÈhâÒ }WÚ¦ÙÛjÞØ·ËíI[«w›ÖêÊ.1Ú·£Ÿ~èòêvçg5ðAà«ÿr%ÜÿV|Hœ6Zõwey(_P×Q6¥¼v”O<åµ£|²îP·iŸÌlp‹I]t´yå–†7÷'óóæ¶. Fº
@]A€M9 -îç–¦ yChÞUQ·Å/w•Û¥D¼>åa >Êð|W4‰çÑ)Ó^œ™Së.rïÍfw»²+-Nî@‹›=P-¶U7Š6P!W}þœ·%ØÙ=(â--E]¡21âþ5â‘J“1k‘Œ~º¦ Ä«‘‹7À‘ˆ£¹ÊþŒ›‹³›Ï¯#ð:gÑŒ -ußÈyÓ °æì,Ы©zÒÄú%MεC½[ÔÃèà’ŽWÓzžö$ß—>«1;<ØX•
ºŒ¸fÜ[(ð^ð©}¨¶&i&•‰ÅÀ 6ÑE~O0Ào×`wL®Ì:ß<>Lèmªæ¦ŠôtÆâÒ}¶d Áñp×™;bÔµGçëWƒgS -q¼pá‹’Àÿ8Ö9ÎBµ<ßÖ¶®÷r’ÀÍs1S¥{x?šòÝÛ¥Èÿ -ÖóƧë£hZÏ›+ÕÄé †^\™ sñ݇±V1;ú‘O{ -"eIú‰L¯þ«ýˆŒý¬F¯Éçr¾¼ÚtbÜ…˜#é½HP*|ü9‡9¤2ÁNI•Z,Îlp"ŒV€Ÿ~߶Æî&àÓçÔB^Ôï”vî¡,ª÷œK£¶àƒ -L±Þ(e6® -Ô&·oAêˆ77vfåGÊWÆd ®+ª²Iœ9E +xÚí[_o붿Ÿ"oS€˜IQ»§vh‡è +léSÛÅVb²dHrsÓ‹~÷ÃCÑ”MǾMn¶C€ˆ")òððüý‘æW)üñ+žW¹I™IõÕró.½z€ê¿½ã®yí‹ Ã·ïþü•É® +fòüêö`Bd~ÛÕIv
ß©4ùëõO·ßØîšq-±»H™ÆÆ~ß]/r‘|ü§š¿_/¤ÎÜËöÿ7öÿ—ðŸÃ°X¾µÿÿé§ðå9ãYæ¦`Ø~%S˜VWÇ
V¾ûòÖ/S¥Ù³\ÀöÌi—Å…`&ÍUÎRI\ø{7^/Ï’²i¨°ì6wu[Žu×T³)¾æiRÑÛPµƒ+þü»ïzz©®¹JÞ—›mSÝÐz9ÐQ°,/ìä…fy:îG.³¡Ë÷õ°)ûŸ‡ýoºv춿yVíÉæ9+r1}™*ÎhƯ[zŽëj¢hYÕpC嶳l]HnXƈ gF);JÕ÷–îL'›jÊkž<Tô^ôÜöÝj·¬VŸÅ“Â^B,áÇt
dKקlW±q`e^ +º¶©îÇãq$îÚ4ÎC}-TòòÚÑ«ÇBžåÆUõÕ°kF˨/Ý‚V]ŒòÂsOÂ]7ŽÝ昈L2žæç#ýH}ý°ŽF1•ë™à/¤‘Ll„;tk—¥L²-{XØXõCdÎ<cRMsÖíP¯ªÈ”’¥yvŽvã»t»ñÄ@(r½ +% Ýmª¾^¢è¤`¹À|•}]Þ5Õ@UÈ][ Kæ;µS¿ˆÂ‚AJ8o:k´´>gS–Ó¾ÜN»Ó¹ß³5ëµÊÛèpeÎFÓÁ47»ŠE5‰`Ø€ð0ܻ̇¾^ýàèS'è[GK‚'šø0Ô¿VÇCð̆ÎƤ=⧑Rƽ“>EƒW½¡ÚF†Ð`å…4ܯXZð)xz9¿‘óâ^Íg"?íÕ¶«ÛqˆìX^W‹?ÀŽ©ó;–ýávŒ”VÚíXîw¬)DZ^V‘íÊÓÂü»þ3Û%3¦xv¤`kÔ°¦n«áÃì´æsZ‹œe&’úË«‘úþS“ú¥J?åÿõ"xÁ¶f'‚¢ƒ¼R6Öy:2ŸK¬úã€GŒuR
A
<rHÅF÷îžÕ>«ëŸ¨õÔJ±×5DEË5½QT…ÓTôÃHß-;ÿ0wõ4uKí0ª
Y*7èrÅ¢jîî÷ƒ2 U¼ºÌcH#—ó|bDHf]¶«!ÑZvSålÉð>¥ðvÉÙá’¡"Xrf—|D¥H!&V¯o@fae ”ŒH¹–·ª)éõÎWOä— +…7 ·+êp÷tLÏBÀöÅ\ç_Ï›.MK3ÓÒŒRï1I)a¨Å®huPAñ?ÄÆT?íÏp‘A²Ä< µøœY„ð8o[õ,)šÛÃd11ejÉ„#z°ÐïA,yb·ÎäÎ0¬Ï}ò)Z2–[ø@'Ý™&ãàOÓt[Äænö<#E fÄ|o—]ƒ–Cf™• |ZËL‘aMK¯4fÓ„ÖÑXG”©”y{ÌhÀÛiŠ%°¡Ûl@w£SÀš²Ãý£€ÒËÔå…Xb³:[ µGwúŠˆžÚ®µ(Æf šû‰üy¦%áûxð~v·#£A–åü(²Ü‡*QÉLuÄ]dÂåXXw}ý+²³Ë†ªN䳩fRŠ€¿\:·ŸÌù!à÷4WSÛU}·{X{÷Mn0ŠLXÐ)d+mmŒk°B’p‚b%™6Å1·$ÈÉ]7®©4T£«³rO;£ò-¬ÆÊhŠä×ËŸ¡é û8µ¶X~p7_Ìjˆ,c„8÷¶jWg@GÙç»vz˜4sÙ$ù–iÒƒûÛlªv…+ÆžÂ$U
´÷S'D°]ûÚ€*<Ö+Ë/‰€}¼\—íCujU"ÒÇö +ÍÊsÎ2÷ø^F¯œ>&=yúËÒù#˜Û/©ðÐM ì}ßm\#f5±ü,Œ!Ïæ´çõs.+Ÿt]4GÌ +q1 —&öÏ9C¾vÀsÙóƒ×)@0zÆ…oNß&®NPö^á°%¦pFÙçaöQ"|(5ä±H-±<‹ª`ŽÝG
gá–‹ÁŽÙyÌ`fê‡?iWž®º™ /^zîöÐâôŒÓ!•œ¢q¯hœÄf7D¦ä‚q¡_Ë<ÅИ¦A”^\ªë¯a´è—8‘4ëË‹…ë"Jð÷Z—¤Næ˜!ãu›åwy8H¯äDÅ +ÄaBè"Y—[{¢ŠåÑZMtð^Ò#¸mo±ÛF<KYÙ'w†‡¾ZÓa\1¹› %Îú'E½àå'uŽÈv|DÎd¿ÃKºâA¡óÓu®Èòë ÉÁ_þÉ9ä´OÍë)5ïw®Æâaï,æñ.h,m`õ´B!ßÌl9ÌÁ:7KóD¢§Þ„S€KÉE³ÓÒÁýó]çò„0ÈÂþ¨0dbLå1«Ó/v'ê9‘Ðþ·ctkŒ'øéÂæ|e½ºªò×ܘW’Œ‘-ÅƳ¢|Üõ®ÞÏš#ÈÁ+ôâ.Ïñp›
Ÿ`<ƒ0²ý…'ö¨è“`›m}ÔŠ~9ã^¥Ï6öð@=-®LÎÀ½ÆÎÒé&]Ððo©óö +endstream endobj -583 0 obj << +692 0 obj << /Type /Page -/Contents 584 0 R -/Resources 582 0 R +/Contents 693 0 R +/Resources 691 0 R /MediaBox [0 0 612 792] -/Parent 587 0 R -/Annots [ 586 0 R ] +/Parent 670 0 R +/Annots [ 695 0 R ] >> endobj -586 0 obj << +695 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [418.739 464.542 440.657 475.486] +/Rect [169.26 380.072 181.215 390.976] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.2.7) >> +/A << /S /GoTo /D (section*.18) >> >> endobj -585 0 obj << -/D [583 0 R /XYZ 110.999 687.904 null] +694 0 obj << +/D [692 0 R /XYZ 108 690.907 null] >> endobj -102 0 obj << -/D [583 0 R /XYZ 110.999 365.159 null] +679 0 obj << +/D [692 0 R /XYZ 108 597.218 null] >> endobj -582 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R /F17 509 0 R /F11 537 0 R >> +696 0 obj << +/D [692 0 R /XYZ 108 372.227 null] +>> endobj +691 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F120 538 0 R /F95 412 0 R /F90 426 0 R /F8 615 0 R /F11 600 0 R >> /ProcSet [ /PDF /Text ] >> endobj -590 0 obj << -/Length 3407 +699 0 obj << +/Length 3498 /Filter /FlateDecode >> stream -xÚíÛnãÆõ}¿Âo•kʹðÖ·Mš
¶h»Eã<%JS”E,E*$¯[äß{.3GÛò®³Û -kD!Ä–:D³—Úˆ,Éçæ°©žcX—KÇ‹z´…]_]ÊŪ*«aèzn+ÚÆMÅ…¦F,™Å®«Û‘7n±iØ -3ŒhON©¸¸ÙgÃWĵx Š0Rd2³qS–§'—oA‚+Rñ‚é-”û¾ej‚JSG¬_V’¹ºà¸dìÌõ†y5Z”EÛv#—o*þÞhǪZqý®”ð"±dfiàðeü47k%ò4™0$.æu÷my؃V,Q@>ÝX¸u=ñغnëñþt_‰Äx*Ã_$?¨ -Xóq»®¹oê¶rÍŽçý1ÈÄ‚W¸v«jMfv„bä‘ÒA'' -|Çû]]ZsªËË(Ϻ:Åk 3å¸tÕ%ªytÙ8÷×ëmå ¦«†Â/HE³·Õ¡¹p°ì}Ánb¦gÖLð8ȳèc19l–ÑÒoð‰¸h»å¦ãÂûÖ’([q98°&ñnbè¶Õ¸a™*AXÝt{4Ôf*ŒI"hÚ8&ýÛÌ·¾¾Ôrñš\î7ÔðŽþÿZ®VT"´v"ãŠwÉ”ÄÒ¿ps>…?p‹ë!“#‰m
Ŷ²P‡®cÀ‘ás™¼ä gµSò -sܡꩨo«<â·M}]Z] [Uy‡“2q$熔ñ"K¡{7"‘ÎVÜ…Ây&CQ“èáðÂòç* ½f1Ž‡€T©B1ç<ž¼¾«ª]€ÌŒŸ€àWkÍÀEËÔºÿã_ôÆŸ{’ê“Oò׃‰;Ùÿ‰G»¢‰ùeJ2F/xŒixïŸOO1ÄÑ<}ÓæÉ1
#ø -lþ}é;}i{Š²¤÷…[êŽÞb×]cÍûi̪ʾ¦-qœr³´&„Î -˜({?Iž}´ý<†ígý°ý,?Ö~žR-®7œë\-m¶;>µ?`CKÀÎY³±C¶€œY”1@Æ0¹¥3×vÅ0TÓL—í‚ãQæØÖÊ®8e¯AyNüÍj¨Û‰{ã£TªÉ!r²3fçKn{‹ÖM;KòÝk—Üaf>®Xûpti·“Æ9Ù–w»¦æ7Êa¾£ÆÎË`òÜúíÃ䥥ÈÒ'¯Ýç#/.vÈ?.3@œ}£Dc’Ã"H\T… PN²É?ÊÊ4h¡“L8
ªö‘š8™‘ZÙj=)°W&å™:ü¼°ÉÑ-¦<¼aœü?wôÒ”¬±¸mo¿™¤ÌÀÏ)~klhôü¬cdßÑS§gEŒÞeŒu–NA˜ÿ<è“qÏ}TxÄDÀ-ä}±ª÷}&
c}&ûÛ¡¯:¦ûOoxòöìÏšœ„w5Øß,ÙøÃüfN²N1YJz-‘Þ'8”Šu Τø‡iËXƒ?dî÷]žHú/B‚æendstream +xÚí[ëoÜ6ÿÞ¿Â×W›å[Òw@¯—ZôhüíeWö +WIŽmýßo†CJÔ.÷‘¤iZ ²â›Ãápæ7CZ\pø'.Ï/lÁYÁ³‹åýgüâŠÿõ™ðÕ×X5øÇÍg_|Sè‹œÖ^ÜÜâ +Á +cÜœ7n`^,–mÓv”|è«¥nCQW>ãD<_”_çç†TÝ{ÞÀ†æLÛÜ-\èŒKJi†=ÀÆe²ˆX€cov XµCj£˜;oÛz3˜Åp–óbd7æ¸örõ¦^†4pxˆYâ8§¸`<Ëf¬#"ÍÀ/¿_· 5¨Â)ýI(}×Õ«¦ÞT}‚JÅ‚ +äV3îöWŠ¹êú7' @ÙX-#ê#õ¶?ŸxžÉiª€MÛøoà4f-í`“²ýPvƒc2æn»öžšWårMe®ÑÔy˜–O„‚`0ÉñŸéb|y¢ûóÐ[êi~±Ï,Âô o]•˜C‚oPÈ9ñ°1|ÔyýœÃȱ¨èõÕš9G džzÛ ðj5¢Ï™±LMVè'ÏD3AUŠZ&œ$Ü’snÏGÈu1—‚ŒZ##F.¸ŠxÅ:¹â"c’g®øù=V+qFT‘#ÝØzrGêãwam¿ÎWÏ)«ŽQö1ŒÚ¡Õ\}ëz¹öBh=SsÓ¯Ûg9šJÎ^@v[ÖÝ¥ä‹ë7¸Â²y¨VTï6ñiÛU½S®®qí¿ äQÖ]º©‡ªsF24HW—¯š*åûIð0åxR“GL;=Éæ®RÌÄaÙŒ¡
#ªn.s¾xÞÖKÐå@øsXD9Pê
ç¬ü•_YÌ!ÒÞ6cJËkqØ€a\@™9ïz_¸Y6sÓ•;&ôÝ–T4ñ¾™sö0ÑWPW¡Ã«g_O¥ÉbC¢)ûÁ·š[ke\ŸûÃiʯڶ©œ&ƒÌD<ðÊï=×þKÖÓÆgùɹbÖŠcŸëγ9±ñ‘õ¢((âˆnéK‹r +³— "‚KKÂ¥"Bg§#0ÇBòJœ&‰P¢ÅBÔ8Âëý +Àdê7^ö;-ŽÁD ä[Oï°+X–}uEI¯Zæ“d‚e#ý0(“êeSïøhþe&é6!Shß1›yX?,T£ÞfAq½¡~¤Á `´õXzäIÅ +.‡¬8 òÂ⇓ ¼Áˆ€Û"ȸsUŒSÌÈŽ®]=,+wê÷ØäýtØ¥¬ØEz O‰G»ý”<Eã8âkÙ£¾ÖhÆQ£’B½"'„¡¦ šÚWGÚ×WáâŒ!ÿG“mÕÁ¶BÁºD !‡J¼pö)OYs¦xâÊ•çÙùèå€rÏO(÷ì¨r·G•;:Ás‹
+‚S"YÞGweÎö‘‹RÁÕ<–5s#ñ*&¹ÙZ3!¬ºILýT6ñÛ”±N¹¹kª½+ѱú¶mÛB0ïq¼]‚þÑA;öT·‡Žî¢¤¿gt3 +^ÿ×ÝKwÁ㢸Т`üýèâ=ñÚ^GÝ%üÎý-gtIh„s¿õ*Árî8õþtWR}ueð2$-ݘ׀L‘Gа7äoÒvìoºàéÎdÐrà¤ÈÞ7ĉ㒠[VÛ0¯ÿŽFÀÅ’·U¸CmgR©‹È¶™Óf£+GlÛä·°mpÊ3{®u#…“Á¬|nŽ2É,®Ö¼v8*›àIf‚õžc~('3i½ñÈæàÊÑÕõ¼(¦°«ˆ'XÓÔÕXŽ4Õ~@?YÜ{1©7ž„¾ò$8"uaßLW}åSÝÃ`n })QÐ]žwsðó/-”Ô±æráq99³îDÑõ‹^tíPN·&:D¯(×Þ×Ã0Ž0„Ñ6ìë•ÏÒÕIT¿¬»e³SÙ•«ú¡§´¸"(®=ö=yí‚‘Ùl!ë|ÃÁ\81Ë=nÁ«žvswEIâ°Ì.¶²–teâŠ<¦bÑÖ+\øž¨`³L¾§Ê½·á)M^Œçå˳zçóÎò„"r~qàVM2
‰™á‡ü?öWdȇÜáU…u›jÅ™¥-8eæ<S5>l +B£ÔCPèÛáç·LØI±€ï/o™qb#è1œÌ]´c翸rÒMS)nØõóÕ²îÌ8KÞÅÝ©¿¿nÊ%Y¦Ïéãí…4LssVog´Þ>½k·›”ºýýoôMM¥E‘°šjO™HåU² + +Ã9'P~çŽ,μ-—4¸!?P·b?|ExË4/˜Îõ™2=5>"Ó¾ÑwA¬Q¦A´%ÿ…0Š'3_ +©¾¾ƒv=eÇâU9”¾Ì¹é˜r÷£Øwæ,ÔŠÊêMØ7Â÷J%èægñ {'jS•z´Êîå{*f›:ßÆ°¼8÷eÛ2¡¥"Çþ#¿«ëR³þŽ!sPVì9HžGË? 4³c˜›š}BìçòÈ2“x/êy4¼RT¢nW}¢Ð¤á4¡Hî6 ˜©ÉGâ¥:N¥ˆ©”i*Íǧò]x©>œ—^2h–½·LŠFÿ§h| +Ñ°iUô:ñ— QÀú¬÷¶¸ÓÆ=ã;°åÝŸ[þ‰µÁ¯o#ñ5ÈÌWF[þú#o¹>½åúÓo¹>½åú²å;^Vó'vÕûë€!ï^cøp1ùZôÞÑ]R9¡ —Ë¥‹€ÜwUo¼B›UÕ/»ÚÍš +šä…eBÈÔßa*wkUü›l« +endstream endobj -589 0 obj << +698 0 obj << /Type /Page -/Contents 590 0 R -/Resources 588 0 R +/Contents 699 0 R +/Resources 697 0 R /MediaBox [0 0 612 792] -/Parent 587 0 R +/Parent 670 0 R >> endobj -591 0 obj << -/D [589 0 R /XYZ 110.999 687.904 null] +700 0 obj << +/D [698 0 R /XYZ 108 690.907 null] >> endobj -106 0 obj << -/D [589 0 R /XYZ 110.999 451.032 null] +701 0 obj << +/D [698 0 R /XYZ 108 621.951 null] >> endobj -588 0 obj << -/Font << /F78 368 0 R /F80 371 0 R /F101 484 0 R /F88 386 0 R /F11 537 0 R /F17 509 0 R >> +118 0 obj << +/D [698 0 R /XYZ 108 301.506 null] +>> endobj +702 0 obj << +/D [698 0 R /XYZ 108 277.893 null] +>> endobj +697 0 obj << +/Font << /F94 409 0 R /F95 412 0 R /F120 538 0 R /F107 429 0 R /F8 615 0 R /F11 600 0 R /F126 570 0 R >> /ProcSet [ /PDF /Text ] >> endobj -594 0 obj << -/Length 3242 +705 0 obj << +/Length 3298 /Filter /FlateDecode >> stream -xÚÍZKsÛ8¾ûWèºÊÂâÅ×Þ&;™læ0»›xOIª†’h‰‰ÔTœÔTþûv£ŠÈ’d3å*F7ÐÏ3b&gišÎ¢$f)׳åîŠÏÖðêå•°C8“RC^=¿½úÛ/q2KXE³Û;3âvõ6P×óÌü—×sÁá÷—ë÷·¿šá1±Âá2bi¨ìœW×óH/Íÿÿ¼6íæÿ›nv·˜LXÆv6Ã÷3%C¦¸´}"ÁΫ·ï*IY4¸O°¹J5K
Í’(õÁ²'|’ÌRàGõ…›½¯+B&µô/;&{HÞnr’_pq|+bÆNØŸ¶m^—Y›_Ï%Oƒ}µÍjl&Á]UïºÝë&'ŠÅnëWuv-Âྡ¹íÆÞ ^R»ºs}ægYÔËv_´Zj™—À-–ð§Z°Ðh
.·ñÈ¢`Ç#û~9% ™–ŽÛb*LÈRífgåŠØª³Uqh<´$KÒðB^j/‚ëÓ¼ôgß'M›ÕmQ®i“²ö¸Í¨´sÅÁ"@ÿ„ -pâŒV&ýÍþƒ¼\±*Ôè‘éðK“Æ,Ž&|XÑ—F>Išþ*ŒØ}^¡>£†ñÆ -Q[ivyÖê|ådk‹å¶Z~¸/;à®®vÇ0G,”E±¶g™ÕöUS´Åµƒh}>WŠé8µÜ}òEܽÎ>
•wQ )+Я -öu…k|,VÈ7ö,òev@ŽÍ°–:›<ßÙ™õìª:§V
bWe¶ØÚ9U½ÊÑ?ا;NG$Áú°OÐÜXR $f4ÄŽ0(ú.k—Úbî†ÚÎòzâÆà—…S½wBé&_¶Uí9T
n`ÿq(j·Æ;ˆE &=4‡’(ªrì±%8WŒss›ïL¯êõŒ¯_žö׊™&CuÏE¾P[îAÁH€.0ô· ÞªÄy˽Çõ3Þ…jo¤7Ä -»EuÞfE™ÛC“…œ„8Zê‹ÿZp8÷õ,«Ý>k‹E±-ÚÏ×QH‘¹¿sA”Ö1ì`À÷SÃìòÿfA™:ûE8Ƀù¾*JãéÔ‰‡,L§!Vqí4]™8z0¡»3Œ¶Ø€=
-òBútT5„ünQµïoˆ•c$CæÉÑwÒ耶d²$“ª3GŸÖÄTa;Wg'¾>p"³Ùpçš”Æx2Ôòæ>Ï÷¶#ÐðÒý®„&8=Ÿ¬2ŽÕúÓ)ªñÓ±Ww)oVW“ëDÖsbÃêŠiS¢×&逖9!Fmt…6T¹Æ´¬‚cÓl…¥ju¶ŠK§Ã¼ÅD‹DY"‰ÑKêÛåí¦Z5Ôotn`Ý-mr‚ácÙ¼“2î¦ï FÈ¢:4ŽrÛ—ÈJÖ6nª[M-(›-$Ã+ÛUÑoUæÝê(dXÔDðbqj•urùEAh;;Žúaë#Aá\æÖÅ{J ®Ørè_=5Oc£P›wö·¦úg¯z=Õ¨vd§L¿LFŒ«ø‘ÕÕQOű>`ÓccÖ\JÆÁéºÜêv›ÿé1P¹kü
-ùU,ì€è Ügf+H1ôiˆN1®ôxy9ƒÐbˆŸÞXIˆgï8—Æ”»‡Æ1³H-^‹tÚð -Cãä6p0ýîÐdeaÒ“†>@áLj<Qp×êa8µ8ðs,;,é§SØ/x`LíÔ„\GƒPdGi.¸Œ ï\ÅÚöÿf0áŸ=Ö#X"Ý:ÿ¾ -(Šˆä…Ëoæ]Ä~ô(“Æ—1òå#—-ˆbyHH¦¢‘ž/L¡ìÐjà(Æôj -²CJw§}eŸÛácúk¨‘Ú)qÅ™N‹‰ÛácâØ -Øßy®úæv~;|¼€1fØ¢?¿ÒžËÃÎsŠàœ:,â²S„* JÃA®d6Oð¯Êæè¸þ2lŽ³ˆ³8“²c.…vÙ²®<©"Þ̤½4͹ÿ)yëërµý¡5eÏèga¾©a -¦ÏÔénˆ -^b®ætÇhÀ+;aU9ªåÒ0—CSwëD‚åLʃM[Ášá¦B°·1Ó<œâ*7)Y$1ÈSQS!Ž¬\Ó÷&Øé–v¿)–›n5Mnb®c -z]R«Ç6<Uv,®n§^¡9DÓ^öGGìd p`2îçöξ=úà÷mÍèÉnÅñc/©øäû)ð¦(—95(bMm³¤¥1B! ÇlF—µBG 9nã)ðFí˜L=ù@ùÆeü ˆ±¨sÇÏ:ÈÚTŒ +xÚí]sܶñÝ¿B§Ž„$Á¾Å´ãÌôc¦zsò@ñ(‰“»ã™¤"»ü÷îb$ÁÓÙ±â¤õhF.–ØÅ~a± +‹‹xS™¶ÒºpÈÊÛãs^¸L(yŒ³$fqÄ@ÈÁˆš«™€ÞÍCMã" 05KSi¥óÏKlÚ]Ù’|s×v{/cÿ†Ê˜öòlzB`pÓØÖw—<Ù”»ä†ºôf[%šÃì}y€Þ¶û@À +CLZotêÖ +#$ ’Ÿ@ÃFHh‘“@ƒlZ¨M_î-¨)Œ8Ä2ì™FAª„©Ô‘²fÆ
"»u¦+ÐXÀûª>&䦅VG¾$tÊr]LÌŽÜæ„ÉÀkâfEå>™T-Í7íqhÚC¹Ã'=Ùvô„`—zhìú–°ûzK0ZÃõš<´bYᲉï¹Tv5˜ÊÔÚ²ªÝï×äà–iÒS~¡aµ°A œÂMœ.¨¼(d@׊iAZjÆ¥˜‘6RƒÝËqû{Û•¨¦'“ïºØ’'›§‡Öè +“ÕÞ?ׇ§}Yu¸€ÚÅi‹VÒ)¥˜Ê§‚¾LÃO„x¹´¯MB<ãž +\%(Ø"S† + ¸mÀ[hŸ)6·¸ +ÿ ©–»Çº§n·³œlþ(º¯[x±kÐeRp U£%e¾xÀò-CÁ¾WT—&KLïe.£À@σlܯWɉ“fãvÇï$)á¬}"ºØ×úŠ¡Û_”윾+{jmÕ¶B¬PÓ}?)M&F¦îl6l°Ë)‚€„ƒÃ„”ö¸«q3Ršƒadèó†4(‘±+Û8ôC]n ÓT ÂÑŒX±±ûªkn‘ÁãÜÈÜ`ƒ5àåT‚øÊlÏÉ!zâ`³,êP "Ä°K©¶¿áv4Å\Ð$32õ4šòù)N[ÿ`‡›ùÍt,4ÁŽÏïÚÁ ¨Ìu¡Xš(“èÉŽV#ÊsãÕǧ +È¥<Í%¹äq.Óà2‹‡ùóÒêõl–%˜¿¨XvööøIúþø×–P Ç”ñâ=žcmÙ‹r2)~=c[QäÊqkú‘[ˆœIÁ£ÆVþ^Œíe$ô‰F”oD¿YKçg˜úÇDÿ¨±ec«~‡Æö™V¨/ ï\¡fz,`ây|¾&$_"!ù\Š_n”>q‘°¯%ÝW»øÂvñùs‡"g…Qu¿ûªîÿ1uÏŠšZÀ4õ¬¦i÷´áqe²<®t‡ŸãN,Æ•-ªªíÆ=öbc=Þrð8T(0$ûÕx!8ØÞ3wS¤ø¼Cxæ6ÒIbî +Ï!ñù…øž JÔ6õ
%Ù©LûKó)xÖÉ3›—‹k`î +çÎNËÔ®B$¥ØPéË/¡q1Æg©aË_¤_$ÕœOrÌ4i‡-5ªÕMgpÝ8G<‹¶M*Ý Ãšt:=;žxÛûóf¬ûf<wöàníÔuo糯Ëþ±«·ŽÕKèãÑ#+NN:¹Õ>šŠ¬S(6ÌX £GSÝ›ôÛ;ÌæáÍÝ5Lµ[HnOØK¬Ÿ^ÍÞ´¿–î +endstream endobj -593 0 obj << +704 0 obj << /Type /Page -/Contents 594 0 R -/Resources 592 0 R +/Contents 705 0 R +/Resources 703 0 R /MediaBox [0 0 612 792] -/Parent 587 0 R -/Annots [ 596 0 R 597 0 R ] +/Parent 670 0 R >> endobj -596 0 obj << +706 0 obj << +/D [704 0 R /XYZ 108 690.907 null] +>> endobj +707 0 obj << +/D [704 0 R /XYZ 108 449.567 null] +>> endobj +703 0 obj << +/Font << /F94 409 0 R /F125 566 0 R /F120 538 0 R /F95 412 0 R /F107 429 0 R /F126 570 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +710 0 obj << +/Length 3918 +/Filter /FlateDecode +>> +stream +xÚÕÛnãÆõÝ_¡G°¦œoykŠ¤H€$hc »û@I´E„"µ$ï"è¿÷œ9g¨!5’]»haÀÎÎåÜ/#¹ˆàO.d”-’<y”.6û›hñÝ¿‘<¼Âñ•ðíýÍ_¾ÏÍ"y’,îp¡”'¹ß¾[š[ø.Ž–»ýpÿ£O…L5‚«Hh•ÂÜ÷Ëí*QËŸ¼ÿÔóóíJ§†_¾µÿ´ÿ¿ƒÿ¦Åö½ýÿë¸Ä¸£$Ò^BàøBG°¬Î¹O)ì¼ùî~<f™«X0ð}žAC‘]B”‘ÌYq""}B–T1ìÍ$cká +)‡†fK›éŠmuìsÅ +[öir°¥Í‰øÛŽØÛ +´æ<‹ÇŸÔ Di;ç—ͳ2ÖŽ]gÅÐVd +!zœ³qjÔø¼ˆÝd˜¡á@옿J/@™Æ"ÓÏ@}Ý +x>MÕää÷·Ù¨ Ëa¦ûj_‘ÙBýMHŠ˜Š¬ +Xo‘æ¨cÈy ÉŸÙæçà6Sù‚m&Wü+*φ,™û–Ìcç`áÀÉÁÂ7Œ`ñ Lºù–ÞɇÂÖp!{¥€—³kŠÝŒÊòJ[åùWrDB¨Ž¯q„^œ@V7ÙÄ'EÏ)²Ï¡ÓêôUNûBÆŠ¯1–º~ÚYiL~2šQdô”å‰ež2¸®JÈ™ÕyÛ»¶¡Ø=€¥‘ŠšÞF;¾3KõªºwÎ +zp2€·þ@Ï®8½oƒ;Y‰òX“@âû:@lPæ"‰òÿÊ¡f5s'É dÔ4x&YV6÷aÆF[‚ÂÈwd3yxoqÝEÝ·Ôµ.©gÓ•|;ÌÏ$
•-aÛñ~Sðeœ‹—æ@Ñv5<Ñ¡ìvÅ¡§Þ‘ çiž1ßB¹ ®œÿZº,Ìqݳ£<÷8`짺ƒ÷Œ«ÃÐ+ü¬Ð0ŸÒÞEƒ Î.|+€˜fþâçîÃ\_r6ÑéÎù +«2¦¨ÿEyKôKGx!ÓÂIê~–ãBoß«žÒiî±/ŽõôÒջ߲q)´1¾iÛn[a}¥9öôˆÜæק9²CÝý÷ŠBIaÎÝgÒT&`¸ž©‚ÿ™ÌÛ§³¢¯OgáE£»0N'ù/Äiüeõùÿï¡Å)ÃÈøü,9Éø]ѧA]ó7µÆŠ¸ïoÚJŠÌóY!äI¢ÔtA¦ÎçVJäcpn/W÷æòÔÂ@tîNüÓøüiŒ–Ë¿Úæ÷ö3ãÏjìàÙZ&YýìP‚uƒC]lø,ƒ;TÀ$˦B_šîß)0É6EŸ°OÔ¨g yÒ3<TTß`H™+žŸ”f*|ZëÁËÖTÂÀªh]ÒE·ì©.¡—˜’)šG¾Ø(U›¢W½Ðg»ý=ÙúìÉÞv×èGѽ³sº©T|,Ÿ%þÂÉø¿ÜP®žÄ¥ðªGº¸µ½¸M…Þ\ƒDÄÓ‹.þ‰P·ècÍÍ}öj4¬G +endstream +endobj +709 0 obj << +/Type /Page +/Contents 710 0 R +/Resources 708 0 R +/MediaBox [0 0 612 792] +/Parent 718 0 R +/Annots [ 713 0 R 715 0 R ] +>> endobj +713 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [347.451 614.016 369.368 624.96] +/Rect [271.355 330.842 281.218 343.606] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.2.8) >> +/A << /S /GoTo /D (Hfootnote.11) >> >> endobj -597 0 obj << +715 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [251.391 382.136 257.567 394.826] +/Rect [210.215 261.915 237.114 270.762] /Subtype /Link -/A << /S /GoTo /D (Hfootnote.7) >> +/A << /S /GoTo /D (subsubsection.4.10.2) >> >> endobj -595 0 obj << -/D [593 0 R /XYZ 110.999 687.904 null] +711 0 obj << +/D [709 0 R /XYZ 108 690.907 null] >> endobj -110 0 obj << -/D [593 0 R /XYZ 110.999 539.296 null] +712 0 obj << +/D [709 0 R /XYZ 108 393.547 null] >> endobj -114 0 obj << -/D [593 0 R /XYZ 110.999 294.813 null] +714 0 obj << +/D [709 0 R /XYZ 108 322.563 null] >> endobj -598 0 obj << -/D [593 0 R /XYZ 125.345 146.787 null] +716 0 obj << +/D [709 0 R /XYZ 108 239.624 null] >> endobj -592 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F101 484 0 R /F80 371 0 R /F17 509 0 R /F11 537 0 R >> +717 0 obj << +/D [709 0 R /XYZ 122.346 159.513 null] +>> endobj +708 0 obj << +/Font << /F94 409 0 R /F125 566 0 R /F120 538 0 R /F95 412 0 R /F126 570 0 R /F107 429 0 R /F11 600 0 R >> /ProcSet [ /PDF /Text ] >> endobj -601 0 obj << -/Length 3960 +721 0 obj << +/Length 3245 /Filter /FlateDecode >> stream -xÚÍKã¶ùž_1·z1#’%5è!’Ezè!™Š$@4²ÆVÖ–\IÞÙIÿÞïAR”%ϸ»›¢À¢HŠü^üžyÁŸ¼‘2yžß˜,yß”‡Ï¢›-½ùLÚ)‘P*†}}ÿÙߦÙM&rcnîiÆýæÇ•¾]'ÑJЯº]ËžßÞþ|ÿwšž -™jœ®ŒÈm¿ùîvmÔê
ýþ~åê{jC¿?ø¯ýf*I’Ú¯Žßh•)Û'sìüì›{»Îr‘ÂÑbkG"‚¯×:™ÉCsØT‡ýíZ¥éªnÚæV&«çC/¸ë~WaìEÙµw,!#%âÔù“Ôñ¶h†Á#è'j-TœØyµÝ°Ø÷mCp+W‡/¹óiW
»ª›L|C»P³Üm¶vÒCÑ1ÔÁ˜Û³ìªb¨6DâµÔ‰He -
ÜK¸Mu¬š
ÎF4ôˆÐØC!,¢€±ÈãØ®chÏ’‘¨ -¥NjÊ%¡ÊT*FX°n†ª;v•WTZ§"[RÕ¶Žc†_Ç Ra"”P‰ã-b¸ žîÛa)C Ë3i‡¿¼ <éÅòI´]Ü>ñëV…ÇiŽV@Òt†ÐEU[,c¤^ÁÈäa£‘Ë¥Bå&à*¢r•qìÉ¢ &¼»Uгç”æÄJ3΀ÁŽÝ¬…qŠéDÈ -7Iêè\}õå‹Á ‰üäw¯¯ÅKÕ΢)öí¶=±î¼ÁS(b#'úíTb -غcê>Õ›Á’l…Õ£J‚‰Ï&ŽÚ¾-+¼ib—ÆÀe8Œ‡º!žùÉ̆»‚4÷Þõµtðô⚸.óʶéÁÎõvê£[¯«ì×`Gª®.y¶ÿ¸'У‰(æSË”`Ó2cÛºdþÁ…ð -ó5ëßè4ÏÍ&F~éxyωô@sÁ‹K@v²+½™Ñh3¢¤éìÒÔxh‡Ý'¬6[ÛËÓÒqH±êP…µ@;‚“y·€#ºZÞT¾J¨ê¸°:Ù‡‰ÝÔHægJØÑ”ˆ†ÎÁ•žªŠ¬…õ¹©×Ñ -[r»íg ¬îxª=çAMž]IŒn¾ -tÉG±JÅîÌ´ey:ÖÞKb`ã4l$õ`rç*¦Qè*B?«“ŸYƒLݾ«9~àw`pÁÔ[Ž´ÒÈ«×I¼’§´?Ãøct'ïäÏÞU"Ï'Îw
/»šª+öw -œ¡Ážö’FÍïãÅf‰hÆý©ÞÛs†‡ØBMºh-t:µÐâUy¸ZÇMpwìèç·èì’ó ¡Rž¿h_=$í«J¼}½ÎýwA…4B›/Rc^-?☠-;N¶…Ãj%hI;©åæ•ÊAUGrêSÉI‚Iš—iílR,x³êC½/:ªY”ˆ¬~oó«:s—MëDþdäaOñÐâç><œU¦9ûµöÓ¢G*Á4¿”`ËÏÅ!Í–=5uÇûVC)xã{Jñb8³Vö•ò—9ƺý3÷óÏMW -Or±§ŽŸã¤W«
ñå‘KsXÍDOÍwÙŽEW÷mÃ6~âL^Gñ¥šuØÇ#¨QI¢ ÎsQœƒ8(4„%òÅ•OïP1³¾Ë+'"õÞÛÝ|)Ùez^V¿¼RîW"ÌÇ|N(̽ø‰¸&°wh_‡ŽËa¸ìŠ¦
ôŽ¹Ì¯*¡S=á‡s·5žW|°§Åé¡qÎÞéUµ¯ z~c_^Éÿл4h㮎>¬¾‰Õ_§
èp"4Nàû8j U4ÛÓ¾°H‹a'W{® Ó§~èÜÛÎ_O®*³\˜xšÜ×Ì8AYŠ•#.>«,[9úQÇnOEáŽ'¸+Ò,™Í¢â„cWáïƒé=O±ÊzûÊ»Ëá5•¤"‹d=“âMë¶7ÜøþÍå»'Z$ç+¸Œ¿p¯EõôÂÎlÉCñÌ“C
8œzrö ‡<·S?ÉâÌWR
†A.¨oòÛÕ~ðŽjÙî[v‹l<êl£í …:;˜Ïщ;ŽÇºbÇn!"‰ÀŒ]›ëÜÔ1 ’ùø -ËÄK«¤"Õ^À·û…sÇ[곋)Ù…:òÏ¿/€]¯K)—K¡ÕX¸°}r¦T')Œ(“Ÿ4Ÿ} ÷?>÷ëUÔ%üÿ°:Ääç¹+lO_}¬°õÇjMàA§©^•¶¡Ã£X4ý‚ÄEBëø:”/Jܵ_À --"#“äJ¾/„a˜…ˆ%ú‚ ÄYà£ä—}”,È™†ÊaÁVƒðàñ:\xÓ’=øV¶Ë;gøfMÇ°5vÇ]h‹Nv6zZ§Á-²Xr—y&´J§`’X½fÇ)0'½+}Ð)uvï<ð¡4pƒ
Udn˜Œ8èc -|9RÄö‘ç
nÞXŸµm}v¹¨”ÚËñ§Ð»/Þ|¹c¨Ð9ÀgÁ°÷5©bêÚWU“±
áVšp -Y<¦?«š\ÃÖXÓ˦E¹TÄ‘¾$pážœö¹àbù{wä,˜*2˜$Ï#JœFM£ƒkå¾-Qß>Õý’<E"ñîØâjS(›¡~eE*ꙑrW¡‚Ójø±ü!ß
<2KðÄú;%Ï"Î'㜠$‚^wŽí.óÁ½š²ÆgÍЋ”Ùjkoá@ =&D)ßj]¹*l®K*~oÿ‚X¿u®I±a§±<²wZù4vU宾%rÌT-•)ieKÍ8™ö ªÒKßøKÆ¡ÓU‚c[*.ýFÎu†FX •+;?ÈÅÃçâ±±#v[1·°8ã€
F …Øã ±À=;À´¶ÌÍ•:à¿p›Îî -~j¼0PVû}ÑTíÉN-ñæî¶{æEXÏoÑ14`þû_MÖI@Óc³QØ8À.hn°MÙ+¨§Ž?vt>a¤ov§øo8ᑉ¨–…*Ïôµ®–ʇ}cróq-oU€Å<-Ž™:2BåSfö-z
Z)«E”v7¼°ï>ìã.¢ôTxŒ¨â…í´sèB7Ç+[ê!*MþÔÛÙx;ÒCJ° -^øU_ÿF"ñ
»àãO&v²@g|áon«ØiŽ²Õ±Ã[¹87òé–'oÈ2—m\Pì
¨€kŒ÷ -"r”qB-
ï<‡B’'@ìO:Ÿe·¼ÏÇ7†#wÍ@*IÈ-”ÍÆˇ ©mšËzá¢IE¬ˆÉÿ´kfaaùÑU½g…ÿä25ÁJª!>ÛZËòà?%øß„՘.Rx¹1ÑK™+÷Y“´Ö +xÚí[[ë¶~?¿bßj6+ÞtIŸš ) MÑlI€hmy-T+9’|6Û ÿ½3œ!MYÚ=›6
ú°8ÀšRäp83üfÈ#oø'od’ߤE"Š$»Ù=¼Knîü§w’›·Ø¾:||ûî÷Ÿæ&EšÞÜp +í7:iuÁ4¥‘øîÓÛ°L›˜¥€íKR(`N·,©”(`ÒÔ¦"Ñ$…ÛcµÞ*)WÕaìêPíF¬«Uw ¦%–“æ8‚UÂê”9üVjsjú°¶0Lc´ä^õ@ã[žNÍ‘ÊHòE†_šB¤Zñ—_i¢µ\ýÑ ö³é +÷WEe»p¦’ÑéBØ`:sö×µ,VÌùë
Æ*²LºÙ
üú5íÎýûêžÆF;gAùüÑ}äU²¬cÕèƒf£¨\dA?ê¶âQ¾ûi>€L@fê6ŒH¥·‘S$-©‹‘m¥° iy2ŸÃ8'véòŸi8ºfCX‘[~ŽKõ2—*æRþç\Ú)—±±Æ\~&“ËÏ|0½ GáÏtÌJzê7P‹žvM½[P#“ˆÔäojô¦F5¸ˆGïLšàÏs. ~bõ›.½éÒE—®ŽXiµÈ”Å‚‹S92 +'¸[I?ÃC×!°Â¾§’J +2œª]Ã#(Ýó˜ˆÐ†
U½Ï¾€¾ôW%„´ÑH6Šmd_õkkW.€ÉWŸôëP3ü~OÿŽ©-ýŽkfG(Cdð4|Ä}x +‘Þ#²®z"íŽe{_ñÈ{ +ñìO‚Z]hè¨M9Ž(,ƒŽœª~|¢õ0+\«ú"¾=µÞq/§Û…už0vÝjø˘!½\¤Jþ¡(@hmcí¦e©HÃ:‰$ÜóväJçûUÔ-l
ÑKîG¡;vÀàÚ +‚-â1ïxŒp›¦jâ#~l“1ä`L$Øw IiÎ+Á’›õwh#¨¹)ÚuµwvV
ƒÓF ¹P*Eí¨0œw;jgãÚ-iç•R‰‚MQQâ†ÏBäÁ¥lÞ£z”}]¶ÌfÙ÷Þº vŒ¹Ø(M9ÄâU2Ûw,Ø*O§1Ç¿^Q³È)4O¼ñh76tA½Ë¬DÖ¦½OôzND:¢ç¹
Ç€Ì^ÒVå´UFÚªžIœXë“«üWí-0h`°ÓŠ8Á²÷¨\Š$óª“.a… SÃ÷*μA0V¶üÛÔ%“pë²{V„\Ø‹:ÇXÂ#lhÎìdWi™xñ:á²Y8í(ԇµôUØHN±QÌp&2ëIÝ‚ÚèsÕî|‚a +/ŒPy`¨{\Háaî{„³¶à¼
b‡S`vH=ÈÃyײ¡f²²æ¼d·25àóÀú¡nkpäså3Âê,J Õ-m‹F¤§ÆvÀӦܹŒ$Øåy8ƒ/{b§$Ýxt^û¾¯Jô€U0v§OØ÷®;³Ë„=ìiÕƒˆ$ƒUwšaá}=ÔwÄC§6§¢û +¸YD½¸ÍÒ»Êjˆ…SŠ²Ú…^ëû#AÅ\ +ªÝúÑö)湉o‚ÌO4ŸqêÀn!”œK’Ë{<Ví«H‘S¬BÒù‹“Îç®üÉ‚È£ãÔûÙ¦+÷Õ~C•;DÄÎ<lâz(í¼3&1%¯‚4î]öÙ¤œ¨
ëDgÝ4» £Ä¯èÜKGŠI@Lu"ã«.tæC5²ÀbCø¦ÈÔ+CÔöü°]fB†|燪¥(¤áH³{ÑóÕT®Ô%auà; +>ãøÜk&R®7e +’¦ÑÍSHñ. 'š‡¨‹8ÂíÌd¿È8îþ±–nƒ<×-‘9ȬO~]NFÆz‹½¬5Y¬±ñõφÅÀw^±0ñ"µÂ\]º]·|…⵸/w•zôƒ1/Àô¦úè¹+
ÂëÂW]9DŸ¿rð¦wɆÀ•e(ËÄ‹‡PWQ›š|“¼p3“£ÏІ}Æ:§¬Ê)˜ÁE8‹f`#ÌÆþû<ðwd¸¦Ò_öËKiŸÄÝZ¨"ï]û¾úñ-Qø–(üIçÀFZ̓ΤKÏÝ`dRÈà&ß”éM™H™2-B”>K*¼èŠbÌâM¡~3…’¯P(ûÿu‘ˆ¾äˆ§k3ºÆ€Z¸ÆaáŽé9‘vÈ8䨹O} _N·Òã(*uÜä’ëο”:—K`C
”AŒG†˜×ÅX&,ÌL>{Ÿƒì9ô6`²Ãmâ_œ´îéæ;lò¡,Þ´°ÉP'—¡(@ üfÂJºdúj¸Ü…9˜}ÑRÓ]…ä{©Vm…9æ²çfÊuóÁ‰%Óª\^>¤½ÐÑ^èúÇÆ RPÄðž¦nwýZg« +8£»
b\|©žAmãgCÄ¥U¿*èhÕÄçíû7ç3p”".ì4mGiÿpgV¸û„A|ÕrŸ(˜Cúxt:ZØ(¬c:‘IŸhU…¹žñŽS‰œê.ø¾êœf\ð¹i!dxœRÉ“WŸEôÒ”îk0/ˆyþ)¨è«ðçîQTNi6ø9œ[…–Ó¥Î9&]6D&½Ë§ >c,:ÚÑ©/~
û\á£ÂŸC^k…IamÞIþ¸”ÖÕʆ§Š~ÿ™¥ë»AäòÜ·A¥©tÅXö{Œ/„©…QÙU6Ñ!ø) +„£Îý¹ìËv¬.LDIœGjøIûºX7Ëf¯11>i0Ë+«¿$)ŒÏˆ]ϬŒ3†&”ã÷/‹i&
]÷óL(qصÏ!›ˆÏÄÿ€¸¼œL…”Ñ3ÕŠÎ_£ÌJ˜>¾‚ ›…‰âöiyýšyâƒ>„ÆÏ-Lý‚…Éßhaòµ›£” ä{%LQ/Áˆ¨d€)&²qmõä±…&”BÅè^ÑÒ™gõÄ…[¿²ð•6:Ž^\à3a¤|~x¡{é —ÔörŒ.Br«|tå\6âm +endstream endobj -600 0 obj << +720 0 obj << /Type /Page -/Contents 601 0 R -/Resources 599 0 R +/Contents 721 0 R +/Resources 719 0 R /MediaBox [0 0 612 792] -/Parent 587 0 R -/Annots [ 603 0 R ] +/Parent 718 0 R >> endobj -603 0 obj << +722 0 obj << +/D [720 0 R /XYZ 108 690.907 null] +>> endobj +122 0 obj << +/D [720 0 R /XYZ 108 596.564 null] +>> endobj +723 0 obj << +/D [720 0 R /XYZ 108 575.164 null] +>> endobj +724 0 obj << +/D [720 0 R /XYZ 108 385.794 null] +>> endobj +725 0 obj << +/D [720 0 R /XYZ 108 284.746 null] +>> endobj +726 0 obj << +/D [720 0 R /XYZ 108 161.547 null] +>> endobj +719 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F8 615 0 R /F11 600 0 R /F95 412 0 R /F120 538 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +729 0 obj << +/Length 3794 +/Filter /FlateDecode +>> +stream +xÚÍÙŽ#·ñ}¿bÞV‚GLóê#‹<x{³| ž—À6àžVÔX©)÷±ãIàO‹ìC¢4Z¯íŒÈ"»X,ÖM.¿‰à¿áQzgË¢ä¦Ø¿ˆn6 +!¨ïðpBSƒ1ûõTÔ!¢ä,A›¯™ä$qw¤ø©\üEbÓ7%õöyÑj‚دû¢´ÓÈ® +ƒ‹w0”nm +ûrGU2ž]°ô]eó;œ»ØÈ®çlsd¿/M"d?”:°Wc© +˜x؉1‹#9¿s¶¾J½’¹<â8±KWñÛ%Ó&™öÂœ7åÃ!åï«uéóP4JgºjKn\,Ú§ÚÐN÷¶Ê©ô
yVßxŽ%îøœqú²tZJôù®5„??!áA·%HMãæÓä7˜FY½ÃžSN7nž=Ø£1¿faËHŽ\&p +üH§&´¾uTZç]Nö‰CZ9xOú”d+ ši^g• ÐÖ^ŽjLRÉA q7j¨ÂÙÚï-Í@v•Ô¬Ü¬ÚPÿ€ xáôf*WöX]–ëÖa24tïÑAvº.‡…ž ÍX¬å\9UqºO‘°Tz¹£@çªÆÔ˜‰X#*ß
õ>VhP°åøA…XœþFÌÃiÍüR7S‰ø[ÍSÜÿY€@ˆäµ×Oª“âô+-K±é#ÕÿÐàþÜW
Z‡õ-A&¦\y[¯šG[àõW1ˆÍ
»µ2AÂJÇôºár0¢Xy£°ï[[ØÕCŒýš ¦ïÜÉ-(U“õPÖ¶~cö®cœJBóïò¯ “>xtL!m +˜`z¸µu'6¼Ûõçú’> +vp?NXˆC¿“8bÜ‹5}¾*‚=·m•3kmWÙr +®æ‰…iB2Âá4òÛééDø+{G±»_ñp*8bÍÀìæíκ5MõoSwî¢ + ®Àì®ïûŽ@?¼cx +n[̶Tpìüêšàõ™û\žø O!6äÔµ6bÕ–àâÇðF$âÑyeÔRúÌIДpr-ÉÎ(K+I´ È+?gC×|Î5{㣰½¶ñ7Õª§k”y±%ÆfZÛÒ¥²Õ5º;ÁÀ!eròB£én:ø‡ÊÑWÕ]Ùš²ó´çnÀŠ›¡<É¢K§éE‡çÊ°£ËeØèôgú†ãÕ3øâ„*Nïòò¯P»)#M´=§„ßßècôŒ¨æ·£ûÀŽÆëÖðŽ0sŠ§ {™$îÑ
ƒwÜE1Af²™øÞÀjg`q/P¨íRAm™ãjæzÈ®rL¼Ú!“ÔÃ+“U31hÅ"MÙvóûbBb +Q¶ESèѹà{¯ÝÎ}p8[æà€dšž·¦ $‚þ 0~{u ä?C„øþy\.(p„æu¾3Ó·ÌߤþÏŸ½F/”&óÇ7"MÝÁ¤‰wo +p}äFL‘ûg3œNkÐÕf_Õä–ÁÚ?ѯ«0q—?Û懫ùŽzèÁö%½¥ƒna mí5²àî}âkJ÷5øŽ²¨sþqx +¼£Ô/›m«À…P–¸£Ì“ +endstream +endobj +728 0 obj << +/Type /Page +/Contents 729 0 R +/Resources 727 0 R +/MediaBox [0 0 612 792] +/Parent 718 0 R +>> endobj +730 0 obj << +/D [728 0 R /XYZ 108 690.907 null] +>> endobj +731 0 obj << +/D [728 0 R /XYZ 108 584.829 null] +>> endobj +126 0 obj << +/D [728 0 R /XYZ 108 516.396 null] +>> endobj +732 0 obj << +/D [728 0 R /XYZ 108 495.425 null] +>> endobj +727 0 obj << +/Font << /F94 409 0 R /F95 412 0 R /F120 538 0 R /F11 600 0 R /F107 429 0 R /F8 615 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +735 0 obj << +/Length 3463 +/Filter /FlateDecode +>> +stream +xÚÍ[ëoã¸ÿ¾E¾ƒÆ¬(R¯ú¡w¸+z@èæÛu£m%Ñ,¹’¼IºØÿ½3œ!MÙŒãí.‡bjÄÇp8ßµò*òJ&åU^%¢JŠ«õöMru俼‘üz‰ï—A‡ïnßüñÇJ_•¢Êó«Û;œ@¤©ö“Ün~^èk—%‹ï¯ßÝþd»B +»§‰Pisc¿\/ótñ·à/Qþ~½T…æ‡ïìߟìß௄i±}kÿ¾õKxŽò\Hy ï¯T˪Šii†Ä7?Üúmf‰>+|“BkÚmÉ4,šg¹HIáö¡¾^¦e¹¸ÌzjúŽYÍòT¤²d¶è½L“C%JؽNÇk!·ÓÆK¿ÎE¡œ¬Ç‡~ßnˆ¡Uí~§ÇºŽðU¢(3ùï$INç†ZrIÓ™Žç—«ÅŸé±«¯e¶¸¿Îfj®ÓlñŸ™‡H0힇úÐa둨“å¦j’%K¶ßÒRÓµ\@'<ì¥Ì¡`;K)E•e–Å_ÚÚlšîzƒbÖ›ûújöwôKK@ce¦ôî
ÌÍ/™Ó´óyµDž{kwüd¶»¶¾!JÃëôÝñ:ë3LÜidÒP›©FiêjñØLN5@ûJ¡óÒZR*´Ìq·B«’NJ*
ÓÚ –7òf)ô»Ÿ>òp(,Ȧ(S>ÀoÁ`erø9]M&BW®û§SuX‚ɉ¼bv*Ûô¶cºÄËÛý‚í¼¼›T=‘_q7ªyRÍØYÁ&`I¶x0×i²ø@jä¬;ðb4[nuûíÊî^[ìe¼¡&ŒèŽÆ‚™¥Ã8õ±k[zàåœÑ@ßféU0(c‚†5‹ˆ3I”ȵs7ÏÔ£ÝEê]óŸN…R‰L«Àâq}dY™ægWÉϯ¢ý*§,ZŸ8¦PJQHå5ádþTnuá(õœ·pêPç§ÎoÈ©²YZÎ\ÑãCÓâ9Jɇ±^÷ÖZ ýØ؃Õ=:xxGÃÁÃ<4¬_ÄyûîÜBfr]¬G‚;OhIî:×;ʱhÒ¼2u1áQ¹çÙYád. +¥³3ª›«³‚G̃Ý~=9>Ü>8ï¾5ï¯átk~lØù×f|æˆÃÍÍ`p>fð @DA¨òÁeæqï\TZ÷Ûš±ïDÄ).«BT°¿¥,{pôÀÖýÂÂ#ƘˆR¾‚^œ@À!žN fùÀÌx +gøDç^dgòÙ±#›÷ƒÙ=ü^ÙÌ<› SÿûgóÞtÓïçЂsž€/IçL(YX›£(XÏý~`ÂÖ¬‡>²H^€u\„z~º ¬›>èdÉøܧû{ÞŽ‘©5ÈTê`j§›‘©3Q¤Î-ÞÄæ‚ðQ…SñÁ¼:•Ý<:½Ô‚<&SÁ¤N)_™¶îâ>{0ö˸’‡=KŽ|NIÏ‹ +8WY &‡E#b*E’9`^vKÑâ +Ê•Êå¢ß¡£7-‘¡£ÙÖDÄ"™{ÏðšI\â[N„37IË•Íá€WCcc½m·õ4f)Ð@wàk3Õ³A¾ˆù-;jUˆTÏ•ü—¨}(Y9÷ßPé3¿HZ^“×m¿F{ÿØŒ1ý`)ÜÕ¦‘0kŒ7‰Æ»à¯Å€Ýæ3-¯À‚f¾}ˆ€*»Ôƒ}F™Ü=`´Š¢«C]Ù°¦èŠ°+ünÈÞ†ºæÎób4Æ Ì…Â5<YvUkRYØ4&Tœ'ÝÁƒµAí[×cSß!Â3ûvb(Ÿ3ü´Ø“ž§˜7”…u÷çu•¼‹Ô|2¡“Ѐ‡fý@Ímm:^ó%ž+Ú3<YYpÃ=dJ¿ý7¨&ï9hT%xuX¹ü˜{]×WhÇQ¨X@‹ñ'¬-p\PÎða¨ÿ³+fl†ªrÎ-£0e‘–iºqyê˜#ª”Eu¡r^.æzY•›b >˜M³#sŠYyid—±‚ê>—ÆSAm]m”äÎ)-ɆgìŽÄZÛìH»oœ0¢5š±åaÎø-kJ?6G÷UXx³™)Ï5Ö¥&·èêÙ×Ù¶fŒ¨ñù¶éÖ¸7U +@íì•’›XIªD$³bÓyh¬ +šG½-Z…Nu‹³ºÚ,,¾
Gq¨
ÆpmÖS‚ζ6ûRÄy¹\›·o¯ú‘Ã-ß¡Z›s‘2ÍUP™E2£S@c +<ðÎêýr|0»ÚµuY|w¨Ë"Ý¢;›™üå‹:*ÐùB-ÄÞï\°? ô›Y/\
ã7lB-}W3”0LG^à”¸L„Õ³›ËDåY€”Õel±s&PæôáàáÖ‡E𺘧-‡ì_)©‘cFÕ*g"eqy±øôæ¿Ÿig
®Š‡‚ŸÅ"v9°*AM£JU‰SËVîø‹/ðug€<~G$˜VRĘ«D ‰+¶nb è51ï"é'X̙ߜ[i¤¥ÆèQ@;¥ƒ
Oç³ûØ-z*§JclWURŠ‘X,…ôlϯ/h¾0߈¹ÿðé<'ov6O„Ùâµ +Âq8±Ô¨éO»¶ßÔ›H) $è(§ %ï˄KwŸ´GÎöKMp»ªº¡îTK²_P@‡~ϺãôŠJð6UuE)µÀß&c®‡
°#Î.èyÓ DÖu¬Ž¦EZå†Å×â³:_ËÃ/;käe®/´¿ÏD s%IUyôY%I}GG+–¢!îèR.‚RÞÆC]Øày솚½tÅ’b%ò|~ˆþ\fµ%{çLÍ}×LãqiìȾRHgÔ9Í|éÞÛÅ‹5<-….ž6wSÌ$ÒJ¨TÎL"àŸ2cla¾tzHÉäIñ•ûléDéãÃF®V,oC?;ÓA
ÏþHFÛ’NKp‹Å¼„qÈE>÷îÇ_¢=Ž‡`«²ßæêió]þâ»'›#ÅܲöqJêÀ߇YF>v.Žô0ô^Y(âW’ïñgØ>gè‡æ¿XlÉg—‡o4fÚ]Š4¿´ø’Ì/d‰¡ÏRõL¡ZKÁ‘'9ºÇÿPåGìþ[Ù`¼øŠe +endstream +endobj +734 0 obj << +/Type /Page +/Contents 735 0 R +/Resources 733 0 R +/MediaBox [0 0 612 792] +/Parent 718 0 R +/Annots [ 738 0 R ] +>> endobj +738 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [367.848 321.115 382.293 332.058] +/Rect [349.638 445.826 364.084 456.73] /Subtype /Link -/A << /S /GoTo /D (subsection.3.5) >> +/A << /S /GoTo /D (subsection.4.5) >> >> endobj -602 0 obj << -/D [600 0 R /XYZ 110.999 687.904 null] +736 0 obj << +/D [734 0 R /XYZ 108 690.907 null] >> endobj -599 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R /F8 534 0 R /F11 537 0 R >> +737 0 obj << +/D [734 0 R /XYZ 108 543.42 null] +>> endobj +739 0 obj << +/D [734 0 R /XYZ 108 426.025 null] +>> endobj +740 0 obj << +/D [734 0 R /XYZ 108 248.421 null] +>> endobj +733 0 obj << +/Font << /F94 409 0 R /F95 412 0 R /F120 538 0 R /F107 429 0 R /F11 600 0 R /F8 615 0 R >> /ProcSet [ /PDF /Text ] >> endobj -606 0 obj << -/Length 3441 +743 0 obj << +/Length 3304 /Filter /FlateDecode >> stream -xڽ˒Û6ò£T5ÂâEÜ[â8YoåUñlåç@I‰JTH*ã‰+ÿžn4@"¤™]·ìxt7ýÄ
‡âFÎò<¿IMÆr®oV»WüfCß¼n -gRjhÁЗw¯þñufnËÓôæîÞθ[ÿ2SóEÂgÌþ…¶àðûzþëÝ¿íôŒ‰Lát H´qk~˜/R9ûþ -×þÉþ}7¬Ð¨D2“j·PrœñêÍÝ@¢29Ë2CDžÓ¿PYÂxb ¡Jn$*ÜÈ÷}ÙÎRÈYAt˜`–ÌYšJ7õ½PúP•«mÑöÉÃT1£üVWÍnWì×W̶EG–e¹§VÕuÇr}Kãý¶t½ûu5—Éìj},j|(×›Òß
®Ûb.’ÙÃþ–úßs.ëz -ú9i†ýq·´œÇA{ú™têªÀc©ڲ/@ëj3éÁ'áfÓà¦-[ê:î«žì’ŒK¿’@»È®©a–›±ø[/¢RP°<q8®B3ˆwîT÷}L
I2=Rƒ,q[ÒÖ¼RϪè"‚—j6Ä1OYÓO;0©\LÎ9™-QK©YÐÏ¡¨Z"ݪô:Api3gÌyF¿‡xsJ]hÑžæõ‡éúœés!6têö±?F±óä:öä´}5ă b( !
,V>û—ÊA´e(¡Ã¡™„TÒè±H†gŽ;ùD†'פ)ãƒÐ6mõg³ï‹Úšk“X˜Ê¹aò…áœ"/þ.ÄéÏM(—V%mÞÊ@·µ2xhŒ¾£–F€¥AƒqÑaCä'òsGÐâVEK&r/èûøì’øøoä0˜¹P¸Ï}D:žX ¥Äù´«N$3y¯åƒÉ½„CW±ìšúØ—Ô½jlÜöü.ÆuÈ$O±÷'Û•ˆ”k¦õ1+Qäò™ÈãVÅ0~ÒˆýÀuâ®—qè{Ø–myv‡¦²94•ÇCY -KTÜA–¶tiÞ¡.VåÚF3X£€Øv’§’IEBmaÿrW£ø1¨Q€v ƒ€y)Q|áJSO™Òà¯_O -b#œ%dò”DÖíǸR)iEò̤
v©2é†3ô]LçÚÎá1áFßœ¦¼Œöeqåû}Jcb¹ö"4†®òÐÌyœ¯hE¥~¦Á¸À×4¤Y|2Íÿ_Óë|}Ó[‰Ž04ÇÜ+Ó?Á† -Q®LelI£ÂzžÍl°D©µ¬)…)‡¦.Zêr^®è]=£ëŽf-GóYùû‘ªŒø§¨©*Ïä3LŽ‹ýæèÐ+q«¢íË…«”i–ŸU»ªØ[GbÓ«]`Ó,]ŒÆî¶msÜlc.Ù0=*ÖmÄ -ó “¾%ðXCOïjz¶.»j³÷É!J¶{¼±n¡+ì(——êYqöl Î{«C]Y¹«š|¶.ú‚zÚÔëk"/ʇó3áùuï¥Ì(½‹B[a\í)°‡ïeÓoiÎxS0DP`„Y·9.Ù…§ƒ–N‡$ kåà6—ÎÑ2[ðç|öº©›6’{ç|ò³ë‚Ð9[·ünâÅÈ€H7&œ¼³í·c?æü%|üË9Ò©S,M}œ÷UÄk¦ƒêº¯çÂzÄ̺HŒ -úéi䬙Âßç„×n@Nâm‚’IÌãŠÚ~
ç*ë¶xXá±ü±¹ âç§Ã®Y—uĹ`©"^’úëÇH¦À™x²‘ÕmØæ-ñò®Â?3aþË뮆Œw\“A®ÝWuMØ& áÌðü¹`ᦟ#Øýj{ Cp,Ï@`gŸÃ·ög„¿-‹õgeP_ËòҌFᦇi+¢X«ß6àrö—vb“C&E3ræi -º œ™Ëì"Èë;°¥ÊˆÙ®XµMGí®ì©a}06Ö%¸©{”íâX»A¢Ê6ï}ƒ|t[5GÊßøYûe]Ú'FŸ_ìqøÑA<¶T¤ÀOŠ*t8Øì-%NùpÙ£¯J{.ViLý»Eh·ø©mï1‰àƒÜyÓ[‡6½ÜJ ÏÇ‘.b‚ÜX×Òd÷Õú–p®‹°nËá»é{÷¡f[€ø¬óÅÊQÛ=ÂÂݲ©;·ôl€çAʆë?âFUÓjéj•Øá
štÊ0¸Œp!Ǿ$`Â`¨#ž*Ô(FÀßyà1ÌÇÎîîê$H´õæÞmõÌ)– _`µr2½ -ÍÒ!¨3ÃùÔ.¾Fy!ª1ô¬©·ßú‚¤Žçc͵–Ó•1]xÂÁ¹ -¶aTö¤ã¹ÄYP2‘SÍš,œíiÛܺ˜.£!wtæ‹®É"ø+„5˜` âòÝÁzŸH$«°¦®ƒš#BD#€{(ï‘ð{»Ýî¬nbÃé&61—ÂÉ
{WøJrvæ©èî|†45M\äi`*ãć^}[a„O$ùì¡´ç„Þ¿p€9nOØGö[1{#´d2 _lVuY´Ñ›]•=ep‚Š:ññÛnXÆÍXRÁóÑFØébçZ~KдõdåM©íÙÓï°ÎÞ5V~Í‘qÁÞ?º¡o«Xà ñóÂ!ŽÐYòLCÖ+½óÏ>¦·"pøÉs¯ÿ®…þærub‰”‰3A/–ŒK£á×IšO”2µe`W™Ú,§8„´~alK -Ä‚ÃäyXõÁÒ[Š¯.^v]|ÙzÚwÓk.Á25¾¤TX)•OJ)ÆLùg)t©ñ–lÕd™MGñ‡ÞÞcºj|m®¹;äþçõv¾a;=>´•z|o&
‰«:G$Ö£+Ÿ”†ä龉C°®S™ŒrOè(N©½qI;–;\Ao|!˜ãܽ-WÍf_ýIÑ '£ªè¡š: 24—“…4*ÉäK˜·Ÿ¾·û >‘€Ozq|·—v\yÑ·ÕÁšXå^øÁ/½=sóêê7ô±—x“†o“Ä-KàüFÝV9̵·É)$¯çdªÏî)RŒ«úzU£œú(¬‡o,Ÿ`ÇpA,ŵ۴Ãr·€ÖG‡"S÷ÒÅVJh1 -lï.‘ìУw¸°úçmÕ—çö‡ÂR’(áNäÙ¾Ê9xA9~Óÿ7ò\endstream +xÚµZYÛÈ~÷¯˜·HÀ¨Ó¯¼Ûq°Þ]x&H€õ>P"GbL‘IyVYìOU_jŠ-¼¶acÔ$»«ª«ëøªHvCá»a4½‰3J2šÜ¬¶/èÍn¿}ÁÌã>_x^>¼øë›LÞ¤$‹ã›‡G$@8—ŽÈCñËLÎa]Dg¯æ¿>üSMOKN甞 +%[ÿ=Ð÷ÖÔ°ë°bÁ©žîúÍš¸"2YxìD¸à)MÔƒAÞu-¾'L;}Hkª< ."0øIÅ>¬òF´'KëúøKmE2n£`´cˆ|¯ê2È" +öp%€¤ üRVšt¿éÁšËÕ€™GFž‘-L)~êOÌS,tfz.>§œð”{Úš «Qýí#+ãV¶V‚<PD`ÅòÛ×c“Î8a"AmŽÀ†Æ&_'ÃPe…“S)ebÅìÖpnË)ñÈÛ)(\Àûðöe€@æ5tž!°Ú¢>M©p@K”_GeÝ!´œƒAâÀ¦ÓÈkñ€–ÀˆØ¬˜9œ~f™6Š(ˆ·-‹€|@–¥ž¡€Î]ƒkt®œPà¾C™7 +ì$s¢Ü•:y¡54zãÆÅÚ6ì¤ýPWÞ,‚N¢d\‚ßè44#µi~¾Bü,˜öW¡ºT +ÃÐK¡0|µ×÷sû¸ëÊ~×6‚œÓÆgœ¤ÎußÛv‚ê< +¾ÔÃÜõq`‚¶Cpž¾w‹ºrµÐ‡
n?íº©þ‡8\`-Õ›_ýcd^!ã9`.êº6_•‚"@Ð^Ñ…üÞ5~€VÒì"¿°¡…ùQOxÃÕXCWí0 +¾ñ·ÙcÓaYvfj]}B|l2@šMŽ-.ð!vK"ø~é2êr«áøX.5— +>¥úžª¢ñÛgx£+Ñ`ÊfP|Ò)ÓÄgëÎ-7àP—õ¾Ôj§UóPõËôz4ß¡ò4Â5ÿ¶ñ _Üxæ¨ÔNélí-TÌY¸–VðEŽô +ÿÂZˆx|jT@Ml?Ï!’$s!9Ð[øw†CD¢8ñ,ö0•_ê%_+§õ+·‘L丅"p'Ö)!9£\·÷Þ;¹â¥Z»rš›&C¨8by‚wÕ¹¤ótQb˜|j±'ŒðÈÊÚ… +lŠKq¡ï Í<ÚÙM^ICÙî”õlé 8e]·O¢‡çYòæOÊá:ùÜ6ÆŸä¸p«;'!-J×7>—ÆàCQ»C +£ª|OÕwlœ€!ĉøXñáuDï«fURrL"~!'Om@˪ńžnä¤ãHó³§Í{C<D7v@¾®Åû“Æ™8AGª”³z=C,×FPº+ŽÝçí¾ +®\.A }!bó¦YǶWPH{ªöJDµq sÛµá~,olð +È׃ŽÓ-"”_Ôè%š°{χ:Œä[¨ nÍfU>Ê2ýÆõ\×eÁ!bŠxüÍ„5hv{ZÆ(·5½CUÖE(CðÀêy8<ºy³©VÛN:éâ÷¯L-ª?à +¸?MuPà +„CÂ~¦®êùý‡·/Ϲ½OîCê÷sn÷ö+Ýþå3üϸÀ2#{ÆmQéyà”Ì «ŠKo8'œŠiøŸöðÈÛ)‹öà<÷Z¿AbïÌ×~q±¾4
8¸ñß}oÚc«¢T9Ü+·V¸j·»¶)í'ƒK³–Cæ™
1#k³I2›×ä‹uø…û¨8880)ù5§DH“à(K3þS&^𧆠îOF…¸y«©ó´+ìÞ-À9ªo(à®Á4å%ßF+Åve|!§ŸTãÑYLã¡/ª…ú´Ê{ðaècÇ +endstream endobj -605 0 obj << +742 0 obj << /Type /Page -/Contents 606 0 R -/Resources 604 0 R +/Contents 743 0 R +/Resources 741 0 R /MediaBox [0 0 612 792] -/Parent 587 0 R +/Parent 718 0 R >> endobj -607 0 obj << -/D [605 0 R /XYZ 110.999 687.904 null] +744 0 obj << +/D [742 0 R /XYZ 108 690.907 null] >> endobj -118 0 obj << -/D [605 0 R /XYZ 110.999 537.902 null] +130 0 obj << +/D [742 0 R /XYZ 108 633.877 null] >> endobj -122 0 obj << -/D [605 0 R /XYZ 110.999 444.651 null] +134 0 obj << +/D [742 0 R /XYZ 108 620.596 null] >> endobj -126 0 obj << -/D [605 0 R /XYZ 110.999 431.306 null] +745 0 obj << +/D [742 0 R /XYZ 108 597.609 null] >> endobj -130 0 obj << -/D [605 0 R /XYZ 110.999 186.769 null] +138 0 obj << +/D [742 0 R /XYZ 108 352.896 null] >> endobj -604 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R /F17 509 0 R /F11 537 0 R /F85 373 0 R /F87 383 0 R >> +741 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F120 538 0 R /F95 412 0 R /F105 415 0 R /F11 600 0 R /F90 426 0 R >> /ProcSet [ /PDF /Text ] >> endobj -610 0 obj << -/Length 2529 +748 0 obj << +/Length 2943 /Filter /FlateDecode >> stream -xÚµZmÛ¸þž_áoµ[›IQ/é§$½¤wè^ÙZàrd‰k«‘%W’³5‚ûïá‹,Z´×iR,`Ñ9gžy†^:àÎ(
Hš¦³(‰I„³|÷"˜màÕ»Ô c!´àÕë‡~'³„¤Q4{xT#Š_ç|±Áœ¨OhÓ -ÁžŒÙT]£õßfÆxyS5n~F3fm™+©ÞÒÓÖ;y²q›UVÈ‚¦WžK‹ÄlE)I…P‹®¥:Ï÷:oe!? ײx95a”8´gC§û¡‚°›KÏ! ´Û´¸ôD$Äm"ÖÕAz$„®ôŒ„£¬ªæÉã “è6ù1«¿M‹]¶‘uŸ]pÄgÔ°(ð´-{yÁž'=ÔQ£ãLd1pŠt0,ÆÒõ³!ZÖ« -ýMDó~+uO픇B_YkÏã4ä -çEj¾OC -ù8qB«NÖSíGª{,BPî „~©N‚èö}YçrŠaQJ¢Á…îÔ&¯@SPF}P9!bºd]¨ÕøO¹Õ›é?°¡®+›º[Ž¨Á!DÅQw®¥~fEÛVͺ0ƒU_î+À®Rš®µ™Vv²-s4 -‘©C(ß?a"ÕÃ)ôúA'÷é6:ó×k¡Ýt:Ð ”ß8ýè_ýÖéŸ|ÓÅ°ºŸ?¬ÀðœG`-A85¤45zœq²}œÄ`>Ј¢{‘Ù|‡ã>, Oϼ%v{™—èy†Î¤;ûfâÓ@ô"}‡ÀÁ\V|jÍÖ?…ÕtŸ<&ƒ•ÛÍÚC&˜ÊC¶A¡oQ˜Ýª†l·¯äÒìs -6òf·óf¹‹)I¸SÖ“éò -)ö#BËÕŽ¥¬ -³ˆ°áT4˼LcÇ,s©Ã’x¾5mpÀäÕ!èK}¬ØÓ<z‚> -VStŠÁH7gè]SH,&Er
á†Ê§4W{{ÕÐk§=i¨nŒ,àk}©IOlË3ïѼìõ³½lwe¹hlPB·›v—™qš%¡À¬Ý›™ÝºÄ´
XP:Ú¡nŒQîMõÝ*æ÷^ c’îÆ„7aòñýùö•r€éµl»á"ÇÅN•
(Ã#LŒ¦»÷Y›
)ÆòteãŽL5]=Æúzë–ï/ ì÷Óøò͈£¶¾08´ÿƒæ6¾£¥7ÝÂïìõÔEýß׎ѿNså#t¸[(ûã8%T"è϶Q¿ ,1ŠŽÜ¸3UE<³W4Å€þo·ªg·âhILcš¸€E”MáˆÏ®ÖÅéWD纜C^uߪÏ_”^?ªö/øGC²ªYÿÓ¤oÐLv` X]TºšŽÞŽìuY - µT®ÓUàÓ¯¦‡¼P‡Ü …z®¯,ü+’¤ß¾Ð%áÀ‘¸{–#i&VÖ“òXþû0¢wÕ@Q}%±G¢£Ø—{Óª1Ðí…£<†+Îs“ æÎÖnTQ#a&â‚CÈ`²Æ–ÍUØ6ùºÒ£uÎU/0yb×(y.Íô‘m¯r¡oz•‹ÒÔí
¾®›^wͲ²Î«¦S?ƒ@¯ùíÍÍK€_`XdÞªL¸Ý´µÄŸ ñ‹Ù"´ô…¶ìF ©c[jK‰Ý@ÂF¯ì+ÁúawMKøõ·Bvy‹ëZéŽBë“PÏ&Z]¼–ÍÁ–/‡u'•Dsùõ°ÍÆÄ÷VWFgN§¶dË™Öt–XÉ`túqxIêéÈDçøŸ&@;!8ÞñyþiÂþÏ„óÿÒk×endstream +xÚ½ZÝ“Û¶÷_¡·J„ øå>9NìºÇ™X3ÉLœJ‚$Ž%R%©\¯žüïÝ€"EÞœ:™›A +Ý8Ò’ÐJ„±ßNîHtÙA~ àBµRjI„B&Ê͘P0"mÇ«Ý겕«tF^ÖÕ(%ÍÕ2]]6v°¡oü~õÄ6ƱHS˜ƒþ†BÇ!Í\îmmg‹ §YEhjëÚM>SÓìp¸ç¾¢\”§ZðÌ–3Nï,þþ:SáÔVÿáHE,m.¢²¤'~Æ]~8ðMu.ÖYãøiö-‡3•Lwç#°W»™¥ŸìºùòƒÖ‘âñ*+vvÎýYA&²Pi,¢TCC‰4d9œ‹ïªÑãÎ>øâzÜD$€C?{Óà)Öe13ÒK¸±î†-eII¯>«C¶þ8\Ü…‘a«bD,+6¾ÁÏ® ¨£ +ÇFyn\_éI»wR6`¼F+fúõˆ¹ÉžóØUÙ=®²÷¼uÚqÎÎ0 ß$(\‰G Ž‚~ƒ~{€ÒØ9§PëÇÀC›é[zᮯé÷šôí¶¸œ8ÐcÔll)ëÊ{’~ê\²NA’'´¹ì0ôxq{otšÇrcGhhn1yÌk¶!“œpVŸì:ÿ ¥&ýHŽuYöZ†“mÓäÅÎ÷Ñ>‘ÁOž¶±ŽyAZœz-mY³ÆIbëœÒp ‰S\ëÃüÚè-=£è@„Ï„À¶Úíqƒ½&kÚ[”ÓsÔ)§ïG)¤ËÕ¶7„ÂÆáå¾²¶õü+[9?Wî˜"«óónÈ;ϯ|D8eUÖF®Õ½—Âñ˜ÕbÈï±Ò5.ðq +ËàD¿Óë#œÑô¨|‚ùWèµÊsõ;ùGæMú%彫Ðf:ögý]Ñ“úç1J2gæïòfßS›¼Øä¨Ód™÷ç=qnÜQA‚ó€Då‰-½¸W˜xè÷¶uœzºœ +¦£ý¾ã[ßSÏr$Ä‚¬#ÔqDªü‚E +=ˆ‰@0$WÒ žEc/:§{Í,"îžfv_Ñï÷Ä×j¿†Ú âYóêÓE`Õ@µ‹^: À=›¬{;"@Àá²_äõ0/JHã%Õ€úÔPéú!pfà¤CÞ†Î:“†g~’Çg[ÈKèÄ~F°ôË'5`%Ô(¡ÇÀ’ÖD§‹•òÂk}+MûïsŠZ8Ídl«AœÁ›¶Ú™üðVý¤ÁV?]p!mVàn5¡CñÔŽ‘û®¤ü-U°cŒ‘AªÁ@pŸå®@P7ã +ù®øÙÝÐ +õåÝÀCEP,ëMÂrßh·¸ðFf|ÀÊ|[•˜·qmËW9SEi¿Ê Óµœ’K Ô +TâŒ*:ç!V\íJ5O¡ +§–®b݇øŒ7~Ä¿\2!C»så–æíÁº5œ<é¦v‰œcph0©íi‹ãiAÅÂÞ¦Ëss¢’›“ÅÜ‹V®xwaA£¡Ê(“åT#†ý› §ªœûvg(CÙp‹ì žÝ¤É¸œÆx±,€]$Œ DŒø0œ(a’ø*-ìjyÚ9”óM 2h¬’Š&3Úàn„Å—ÞŸFÒ¤¤ÕÆèð::†l()¯
'ȉ³¼Å7?Á6ùú|ÈœD²ŽØFeT‡û¾´Æ„”€; +ŽaWäÿµí=–çeЫ¢èÞLùi¾Âq…,BôBuFe +#ï:iÈr¼$ëuKò×[F×ñžåÁuŒ‘ñÎo`\.^t¯|±R;›ËËK~"Ä)6 À
t±vùû +¯‹Î
Ÿ»×¶jÀò辺 7Ñd_DÈλ½ûÆ +¡\鱧 +¨xÓø<.r/ +endstream endobj -609 0 obj << +747 0 obj << /Type /Page -/Contents 610 0 R -/Resources 608 0 R +/Contents 748 0 R +/Resources 746 0 R /MediaBox [0 0 612 792] -/Parent 587 0 R +/Parent 718 0 R >> endobj -611 0 obj << -/D [609 0 R /XYZ 110.999 687.904 null] +749 0 obj << +/D [747 0 R /XYZ 108 690.907 null] >> endobj -134 0 obj << -/D [609 0 R /XYZ 110.999 370.918 null] +142 0 obj << +/D [747 0 R /XYZ 108 558.957 null] >> endobj -608 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F101 484 0 R /F87 383 0 R /F80 371 0 R /F118 614 0 R >> +146 0 obj << +/D [747 0 R /XYZ 108 331.251 null] +>> endobj +753 0 obj << +/D [747 0 R /XYZ 108 307.821 null] +>> endobj +150 0 obj << +/D [747 0 R /XYZ 108 197.816 null] +>> endobj +746 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R /F142 752 0 R /F90 426 0 R >> /ProcSet [ /PDF /Text ] >> endobj -617 0 obj << -/Length 4106 +756 0 obj << +/Length 3903 /Filter /FlateDecode >> stream -xÚ½ZYãÈ‘~Ÿ_Ñof—™Éäá}{Ƴ˜Ãpà<Ì’X%Â’¨%)W—ýïûÅ‘Yd÷´{ÇFÅÌÈ+2y“àϼ1&‰Ë²|“y\&é›Ýé‹ä͆¾ùÂè”$¶6EC¿¹ÿâ?¾Î‹7E\fÙ›ûGžq¿ÿSäî¶>‰bþŸÞmM‚ï»»?ßÿOÏc“;šn³¸ôN×üîn›ÙèKü7Ñï¹ýv\1`“8-s]±åý¿_îkL\ŒûþÈ{ý–÷ý–Û_Ë·ÜùÃòçbS¤º|eû"NM©ÃÀ×Úè+Ýjkž÷nw{¶mlaLYK3¿x{?Øeœca²Fý-âr[—ÆEVNÙPâ$÷!6¬±ä·“»ªX™&q’…»½Rë‡ àÿßÜm]ž‚a“ñü4‹“4pé«Å! d:çÎw¼ù¯2î91ÞêŠVös…½ñ{|ÿJ~ÆL Ö#x¼˜Œo
p· ®µ¸‚åi?—ž/ûú±9×»öØvÿÐ…Émaab[ædÜ$æ6Á[™ŽŸ«S½ÜšØçöÍ7ÚÁëðÿ® -³ŒIãĘO¼é§3|zH½zòÐ:Þ™¨jí]ûz#ðf8„æ,ßá -×ëuf»‚¬ÉâQÆ®+FÃÇiâ'hb;BSºç3k´«½€¸{TÇö¬@æ@rÎæ7SorgéTÝ÷+¢e³©>Np¦iìaã¦4$VCÛ½,å)õ±ùDô1õ/>&‘·-€ÇŠZdq‘çÿ:ýÿ 2³'‰ª^¿íñPbü«c!§qˆàݶžš¥þÂa:ÛBçM´#»’Xn@<æiŒq/íöQ!5¯’q¨gcÁn”ÿÿ~âE¿Z‰ÌŽ¢
œž®]IÃD=˜OrI@BúÞ„p²Y ?ëÆxãtYñ†´>Ìh¯Ãå:ÜÈq¬7á‚û -Itn¡¨-áéçòÙÕG˜'Ò›2%õÅ×t£¶jFY• -G|'0ÇK<¹Ö«ëÓA׈Ëpß<6uWŸw×xäçL¡‰Íª‡çº&{X@¢Ž0“hæ¥8‚=š¡–&`eÿBù›S#¾šîÿ~Àžpà…˜¾½öxꪗ>–ö»ös›ó“‰x:¬-GH €$Î7KAƒS*róÏÛ—mX¹ÔT²&0lüEúD¥öÅû纫ˆ(¨ÔÖ]×êœçCÀJ>¢zàìvw¨ÎO|щÙI” ±Ee?-¶uŽ]vU6’õ!|¯ïYˆaÅÊeñX‘Ð_uÝe–‹S¡øöÜuµç8ÄëuœO£KÛ÷̓(>„g~–²õa¬dQW_ºº¯Y
¼Ÿ„ržÂ¨×¼´QŸÌyùVUQõ4”©BÁG”x©§°„iPua*ùP<¦~„äO‚;/Šê)% ”Ít¾žê®Ù‘ÑÊôöÇk-ÝQ£¨“Ð'×P}#Ÿ•‹d¯|äâÞ_OîýÃïø|Œc9P`¡ô~‚åæ—Å°šHxà󸲒OÇÓžX#ù*êô ÏqRÎÉÄáì±Þãº8§Åµ4nDG¹cÕ¤q\r#L¡:A¯_ùýÖqbtu¡6ý¡ÚSzNúF}ºn_ëýõ¡¯w¤ ‹B Òˆ$C0fÐLÙt¬{z#?|ó‘ê_ìãEqÑPÒéçµÅîp£×Œ2šÞ{Ž>¦t“áŒ:»\ºö}sb3ÅLxŒ0å1ŧP˜À”0´«zÖb#C–OÄ}nÈð= ¼Õ©ûª?ui‹G]í„ìÔ0p[iÆ¥:ë҂ǽ®”ÒE2³ÃýËé¡=Ò¶,T”ÄE”Ep¥ð¹T$æ,:ƒ¾°A;†¥u/t¥®æ8,‡\»)±©õ £31äÓz ž²,4›*ÄQþ: 5½0ij&¹íéö e¹ìÐ3òQ¦chWµ¢A” -ÎÙÉSõ@šˆk¸ÀÜPRØÃÒèªDáÉgVÊãÄøÏ*ûñÍe×îõIÁ§¡>ˆí¯;P7ò -:Òê¥"IùúF ‚LJE^–CjR -èòñ¢¡Zn×kŽÂ¤YÅø»ÉvX-9æãï}«ëО ’HgÃObèÙäu0&WüOz5%jUò‘R‹5 -_¢ÓFçð4Â#j±‰ÈÃóåØì.°LNÒµ’eŒ3Ùaé+?š°e£=,Ž²ÛJ„ -é–iã¦F‘ìR¼HÅ\žÀùÈÉK–ÅZúäJD#‰ëÌÿ¶3²endstream +xÚZëã¶ÿ~Å~‹
ج(ê™~JÓ»ä +\䶊$@µ’vž,9zÜžSôï¼(S–Ö‡Å+r8Éáo²¾óàOßi/¹‹RO¥^|—_ywO@þæ•–á=Žï†¿Ü¿úÓ›4¸KTEw÷(@ù~0 ¹/~Þ[x/ô6ﶿÞÿØc¥cƒì¾¯ŒŽA6ò}¿ÝGþæ¯ôÿ-ýÿõæå;úÿÍvoâ`sOÃßé5“Þ¼%Ú7Dû;ýÿ‘(¯©ý~RaÒ
ÒHTP Å3^ºñä|õú~Z{è7·Ç׶&…‰ŒlÍ]FÊ3¼-á„ÙŒÞ4ã±ìªœ;ÏU]sëA†«f(»SWeÁ„¬—'?žºì̺ÜúáæãV‡›R„d¼Ô²¢jž¸óG_Šü~|èË|¨ÚæzÉŽT“Ö°*êžî¸ñ£³–{ï°/6áZ$Ù‡ +•¿˜ÛD*ŒRwîÅ–[žÛ3^ Âaýú¥í{»ÏC‹JÝíŸð4Z«4IBv:uí§ê˜
øšä4¡AÇ…dJÐ}Û𳆎›yÖ—=7ñ Š.Ã{æÓAVá+²þp!>ÊËcÇÜï˜pª³|ÁujÁjú¹¸þ||hkx
åÍVó‹çùu-R|Pe8`‹M§l +6Cœž^Ù+¹R#
8dlT¶ó’éeŶ92E–>Ïê5…S¥}sks]|¿µ¹‰sßNaf/Šv‹yƒ@éðö¬?8³¾qÖXyÁ´mlß^0›ßˆƒd4Bu¸(‰‰ŠâdæWÉ{Š—æé\‡ã +ãð3yŒåÞ;심âZäËyŒöÀH|wîe#<7g`¬ÅðÑ"*˜KEÍ +ÚE‰ +‹¤ý¡ë‚g»ŽÈÄŽbNâ¦áþj0 X™)1 •òºÌºXUÅS#¢ÂÃÞ€¾9àé”ç[T¤úŸçmÞµ€ +qƒõ&Ç,ïZ,A@zÝžÀܨ¶ƒ¹ÿy%¡‚›ö$ÓÒ–Ñ(/™Phso¬fÀ UL>·#7ž·N«xͪ•æHUŸ0«hÃcY—3©j†V˜x$¯[,jqÄC/ª?\ 0`¶XLôtQ–ñÒѬz:ÜâώyYq Qxˆ
Ì`y+æ–*òŒcn5«‡MX¿ѧ{œWí8ËÂ@‡ûAøŸåëÀW~”8\˜ÿžciZˆ]YVK2 +q¸Jây`Ë[~îÙ™ +ôfu<$H$µãç^Ø8‰kÓ΄ó¥€dh ì“øÃÇÖ¦ö“ôùäd»+`6%W5ô²[<;µ¤8‰ØiWN½)¤ìsPCÅd.ƒ<3~À
šäÖ-Ÿƒi;îM±vGÒ0åˆÀ½\Þ7T3Ï(Þc +l˜øQYÃw”˜8EÞ¼êËúü%÷)¶‘{ãôâ = +#V1¸œQäP\øˆl>%3S Ù˜ªÏеhÁÅ[<5Ñ”nPšÅ$Gyþ2 ò°‚öºUy1ãG8Ž¾v¬¥ZÃßÉ_ +ëѼ°¾‚ö S‡3¸ÿM¹Z„‹§D~bC¶{=”ù¡©r†ÔÀ†²ô#-`Èlî(ßÌ=£ +ä®×Š§(©„#)}zºNÕ°µ@ãÔ¹“ñC¾ó«T…Km +þdŒLͳÛcxóS'Y
1M +endstream endobj -616 0 obj << +755 0 obj << /Type /Page -/Contents 617 0 R -/Resources 615 0 R +/Contents 756 0 R +/Resources 754 0 R /MediaBox [0 0 612 792] -/Parent 622 0 R -/Annots [ 619 0 R 620 0 R 621 0 R ] +/Parent 762 0 R +/Annots [ 758 0 R 759 0 R 760 0 R 761 0 R ] >> endobj -619 0 obj << +758 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [445.319 443.506 467.237 454.449] +/Rect [415.648 652.884 437.565 663.788] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.5.2) >> +/A << /S /GoTo /D (subsubsection.4.5.2) >> >> endobj -620 0 obj << +759 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [388.302 300.044 410.22 310.987] +/Rect [389.12 509.422 411.038 520.326] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.5.2) >> +/A << /S /GoTo /D (subsubsection.4.5.2) >> >> endobj -621 0 obj << +760 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [455.404 169.06 482.303 180.004] +/Rect [314.384 378.438 341.283 389.342] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.10.2) >> +/A << /S /GoTo /D (subsubsection.4.10.2) >> >> endobj -618 0 obj << -/D [616 0 R /XYZ 110.999 687.904 null] +761 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.094 192.635 292.012 203.539] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.4.4.3) >> >> endobj -138 0 obj << -/D [616 0 R /XYZ 110.999 662.997 null] +757 0 obj << +/D [755 0 R /XYZ 108 690.907 null] >> endobj -142 0 obj << -/D [616 0 R /XYZ 110.999 530.43 null] +154 0 obj << +/D [755 0 R /XYZ 108 454.528 null] >> endobj -146 0 obj << -/D [616 0 R /XYZ 110.999 245.15 null] +754 0 obj << +/Font << /F94 409 0 R /F120 538 0 R /F107 429 0 R /F90 426 0 R /F105 415 0 R >> +/ProcSet [ /PDF /Text ] >> endobj -615 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R /F87 383 0 R /F85 373 0 R >> +765 0 obj << +/Length 3334 +/Filter /FlateDecode +>> +stream +xÚÕZKs䶾ï¯ÐÍ3•B€ïÜâd×V*›MÙò!åõ"9ÖrÈ ++©ü÷ô$8¤´ëÜRªF³Ñ + +¤x¾—îLŠœoÞÞOk½àÕ <K á*yi÷|åév0Œ”çÏ;Ûs“‚B¾láe@Þgy·×É®í÷·¶q8e·ÎmQŸ¯Õ©V©Þ8“¬5ž•&°3³"i¤R-”¹?•} ›äƒ>{½‡Ë8pw8 ½+û†j¡·G~f—Ký\5Ø‹‘»êx j†²)Jx¥`.ë£ç™<ª¶þöj–ªÁ™aé°†HÁJ4¬(IÉK6œà$uîÞþš/uÙc/Úe]Éä3ìiÛs›÷‡óºíKK”ÊâÑêÈ”jàçÓ^{»L$·—²9¼&›–ÏÄŒ)¬¸ËšþØvg^)®Æ[¬¤óžuHÑ“];Ð;¡67ìäض†Üå0v
·ÛõpD]20¯qFt¨GnNÃ8Šû‰½»£•
îDÒ)Ûo÷)%SšVÞîJ<Ê_i¨mÛN€ãX¯^ÉË¢Dcб¨‹yÂN‚½°%A×®Û!Ìôe)|-ÎÊZÁˆ>0}V¸êÖ‡Ö.VA³Ù¸XOû OØJãGQéØG2o th»Ý¤
Y»L²^Z+þ‚Έ…-ÔzìǬæƒñxç½]Ñe¨è 7A*60÷m]ÒºI[ì·G+Ê9TàA”Å<;î‰ì¯Øûª¬×„»c™£¹*v8ˆÚ:Šae‰ŠâWÑ·%ôÿÉ ýiŒÁÅOUhŒ„Ý¿Rˆþ !Ú†nM¡{ +íì•€¿ï}o÷Ç=lŠ{ Ìá} +b·0QcÈ”N9ˆÝáÙþ®?µcv˜ÝCÉ´K‹ñ¨àNKÁ
FÙ•Ä,Æ®äñÉa੪k¦ÖåÂ/p0«»2+žg¥Ì"Æ&?eÍcYDM1PhVÆUUxz 8lÀaé™há®ÏŽ%b%®¢à¡¶‘‘§SÙpf.»!«Å,ïÛ®tœ¨C×80+FCK&“Ø@IC¢OÓÜÀuÂÈö û€›2‹÷£øî=»žÍð +e®ð~-Bp°ÕÖq9~Y/1T^¢¿~…q ÂtµÀþÿy‹H¦p‚,0Ðœ,à˜6å"r"’Æ S3‘Q +ɦçÞJ/.5€xO& +.Ìè€ +ž}u®ê¬PÒnÌ•@˜÷â¯ÚV¼,çEòçåe…{*¡4ц‚<%ˆS@MÏ-x.Ù ¢«gqû4U:ŒeÏ">ÑÌ5ì1ðøö£êUeÇÝ|ì… 61 €¿-®ª_!M
öã{S¾·þßï}r +&ëb”f, +úÈ8ùdR&)L¢•ö–Am²z;Jv˜øÂ~œJ€›LÁÒF=(îüØžKLŠª3'¶@:µ8ßS9Ï:AfeÀAÊZ=ž¦=UýÉÎFcŽÑº€f¦%@£”~G‰Mí¡Eǽ”pb”G×FÀMñÞh òFS®Aát' +wîUUÑò¼>ã• Y¿¤Ky&îƒìÆØÛ’ÅtoÝíÓ!Råq3¿Ò–¦“—„M¼˜LxÑÞ{F[Œ¦@Í]‚X’‚[:ÿ„¡Â½ûFAå°¦âʦ‘Š‘™+FWZµ©cT8g¹VÖ7N°U,ùžƒê;Û.ž–Q~°¸Š!ƒ¥»Ý÷¥àêïŽ%º¼êIÎÊ]îK†ØŠ8uíøxšß\;½ŽcHzÚn+±ÈiQtwbS&eü(ªN<G´K¹.kæµ:Nk`HN‹ìÚ33±lR#qR/ɹYšøìrÆ0AÊ™L^ïyë§*HìWšôÁ›½f# +úpª²c“Vå‡ôÆûËI–«±ºþîYŠyu)îäŠWBI
<Û® èM^djK7HÊøái°±à'†ÓÉÕ¢°ý¾ +3Kr2Rk?¸3, +ÛÖÓ`¶bܸ3ŸÞfR—NJQ*ƒ¢éӢǿ€¨¨ŽDº¼ØØÑ@D>0}úH†t*¾Ñ™ÚCÈÑò•YL¡ +ŠNÃ_ÿB¯(þX‡ORÖÇoò¹b +}%õ#ùÞ.l3GW _µ(:²à +ŒNƒ6ÿÄÌ(³°u4b¯º¼–Q¾ÝöY –:’ºü°ùK¼Ÿ+û±.ã¯èSé^꾊›wò…n*`ƒø}%öUR/ní·<¬BOø¹?5Œ;®¢c7`ª:ï”´¢ëOS>êwå?G€ž³bs.QÂÆ Ž[˜ÆƒœU/jÛ¦ +à?Œb~Ó6hÙÍиí>õÜ¥Ôž}YOeÌPÛ¥hb†˜DQîK·ahøç +²â¢¨… ÇÛòÛG˜ SËÇM®Ù;\Ƕ®yÓQ2u,ÐFÉâ~—’«®±U†ïס¼þÝbþʼn-ÆÅ@™(éíÕít[Êa„¥V¿Ðò
‚kD›{È'Pìü*ú +S +endstream +endobj +764 0 obj << +/Type /Page +/Contents 765 0 R +/Resources 763 0 R +/MediaBox [0 0 612 792] +/Parent 762 0 R +/Annots [ 768 0 R 769 0 R ] +>> endobj +768 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.251 371.868 292.169 382.772] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.4.2.5) >> +>> endobj +769 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [420.235 264.271 447.134 275.175] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.4.12.1) >> +>> endobj +766 0 obj << +/D [764 0 R /XYZ 108 690.907 null] +>> endobj +158 0 obj << +/D [764 0 R /XYZ 108 599.335 null] +>> endobj +767 0 obj << +/D [764 0 R /XYZ 108 540.431 null] +>> endobj +770 0 obj << +/D [764 0 R /XYZ 108 255.992 null] +>> endobj +763 0 obj << +/Font << /F94 409 0 R /F105 415 0 R /F107 429 0 R /F11 600 0 R /F95 412 0 R /F120 538 0 R /F8 615 0 R >> /ProcSet [ /PDF /Text ] >> endobj -625 0 obj << -/Length 3235 +773 0 obj << +/Length 3354 /Filter /FlateDecode >> stream -xÚå]ã¶ñý~žEF׬H‘"•·\r—\qIƒ;§(¨lkm!²dHòm·Aÿ{g8¤LYòÞî]òT,°¦†Ãáp8ß¿‰áßp³,ËnR£YË›ÍáE|³ƒ©o_p‡3!$Œ`êåêÅ__kscX–¦7«;‹±Úþ%‹¥Š#fÿËÅ’Çðû~ñëêo]3®D)ËTâÖ|·X¦"ú -þóèG;~5¬61“™v+––þ÷Sºœ33Ðý»¥õ¥ûÆŽ_¿±¯ìûé&I¸‘nùyÃ$ÏÜ4ð+Dôµ#µÜí÷~†wÅ”òdA6Âpn"‘ æ‹W«AÀ‰É˜†…ñœô—I³80̤Yx
씄װÚX £_àòª-òí9M´©šºbKǼßw„ž·n]¿oº‚¦û}ÞpŸ/D}Xp9´ÑaMÀÏ2¦„¿Ø -÷ñ"°¸N“:¤/ˆXYû
‹²%PÜNÇêÔ}9Ý
eb„£óOd[lúévp2ö7p;%“2©"›²ÝTÅ×p‘©¾Nf™€õ(wŠ˜)5,ªª<v3eÌRùEÅ„NÎ:8^Ó^á,}:Íæ*7ŸF'”Ô±©vM}å`愪¶-vå)3ßNi³ÏÛ~ÏI*¦…yºŽeq_lwÅçSê«|]Tóº©3Ù“u*½ Ù|È«gÓ”,$z&uUI5g<IžK†)é©åõvÆ…¤Ìh\÷÷õÝfNËÀa'þÐסDBE÷èí.¸YŠ®#“ @Í’DÍÅ©aÌ]Ìú:pþvÐ2ÐyOóÖÆïðñÿOòÎ…¯e¢¥›~=«Ðqæöãd'àVAFfÑÊ’þî"ºœ}Ä<c†è2U òÊ®X,Å Ô*ôÍœ_ñI_‚@x|þ™l¿ßªã¶Q,ášBgþÛ°Œ*ø›oö0Š³¨95Á0èШ¬{ˆF
=äôãXs˜0í‘×o»-ëukª².h:!jw(êž0ÖE_øû½C+êí±Ý;ÇÛ©u–rdnv‰PÄõŒˆcÀΘ9ë+ñÿ³ÃŒ¯8Ž½“}?Øî½Y_ÔÝ”Üfì1Ê)/!_§—« ^ò'ßÊ@”»[ãR‹&EtÈ7-^›ä‘u塬ò–úfÆ´cÚºÆêZŠpA,I{±ÿÞÇžöu¹ Ì”î×RsÜ âÔ4tŠ#§xÈì¡iú}õ@¤¬ftÛæ¸É=ªéƒÒà>Ì(¦ƒÊIH…^ZŽˆñZì©D*iiy_‚?n¦øOY´´tsj)‘¿I%¦“gŠ:fZeϤXvSŸ%YÊÕÏ:ßÿW‹„»Œûµ¯úÁBV3w‘ZÏéÓ5¥¢Ž6óþÔB²g¸G£Ïh̉ÚÔ5ĽïbG ou–ëÔÄ®Î/sKϳbÉSHÙ@.õUmJ êøÕUdÜÙu£Þ«¢ë Œ[ÚÁ¡!øŠ;Œ*¿@þ½)[ÁiÜëÔôP“n:üYÝÏ4ÓÙÓu_lð}Ó
îAâii£ÒñrêNy…ºŒ»¹%¼ÎA‚2úR‹…‰#¨º¦Î×v5<ç ˆ}ÑCz覻SÕSÙ½op‘0y(º[í)àç-£]È8r
úe¤t(wûž†÷e·w»Rsèçí¹àÙ«MS3Â{sG¿dò8"…·Î÷|&ò6y‡*”Ädã`ÃdsDʨ·8ê±ÝÉ´~ë$`”Ê<]^üú»Ai]õ¼†ÞZ¨òýÙ_fc—?ʨ b÷ÃnÓ -‘ØËkâß^H`Öj¯ÖiH™ŒßʾMs8ÌZ"DªQ…Ò„1J|KΙ"äY]áèw§uG×}YsP\!2`Ë@·u/͵»¼ûöz%œ0ÁÒ M@j\g_¥@u³JkÇõÉ&)8B'fQ@â;7;d
VÖü,ë_& &r%/rˆîÿ ‡0A¸ÖN7èC -þ¨Î^Á†.û0¡y!édìjû¶´ÇŒ¹Uü½kÚMá@{7O óÎ/Þ·Íig}$XÈB1£ -ßöÉŸÓZ)
sšÙœkÐU€XáhÅÖ¶aäÓÁTÙô{äP£h?š‡]Û²Ó¨•½Kf2Å8—#µiîzÌð…”æyGcë—á×zl™8ÿ¼½%(%z -ºÂ†,Ý-ž¹O%™4IN¨kñ)6g®]ž}XoG¤/Šêó›qˆO’?”mS/ÏW€}Ôð -\ ç3ÿÎd¶»
óñc†‘ããǪ>õ˜K U²Ösud,á¦Ë6lÍHêNw®”ƒ1Óëec¦…¹ÖH 2”Ëïû€1o;zð%¼Hæâ‹œ°Ôæeåö“ƒB]u6Vó´q}2yGªËÃ2Ÿ™¨*rzñe‹ãɸAGÒ½¥ ›-„T/mœe(e»€»ò¸.í"BMæôèîÓë©-Ût¶?û*K™ÀxÙ¡eʲ‹äÿ‡¦ŸÉ(¹afø\ãK̬¹s\÷Û P'Z8ô$7œá·öÝÛ\ád;QÅvÊ¡à’P..ú¾r`l1œ¡ÿ¼%z¬O¨ÜàNoq„ùÞ
Iu‰Q -4ø~¢ €ë9IªÒ-AjØ1¸«á5ŽXN?31œ'6≗]ÿP9¾/ÌŒ¸Ú`#a®¿/Œ`\Œ{(W]¤Hñ¹à†¨fÓb…/fz[øSètÖÅ®¬wÄÿ;õiB—Ÿãº/ˆZ·Øˆewh1eÜ:;·yÛ£…ü>í…à÷qöÄþà]‹VŸoøLëè„t ogغ„׸H/¸W¸àOãbFÀ!àÊ8•'ô3÷ª²íLM*íî´¾"ìg5cëÓaNÎ"Èð¯œ0ý<9ˆOcàÓEÂŒ!û”ð—
½Ò¾Ö§‡ÜÁ@»idÃ9O|kH€‡«\ºB–)ìðÍŒÅs<|!ÏLé1#ɆÎh1°e~úLç„÷çØÚÅ+žáƒ¢ó{˜°£¯Áï¤ÏdD<Ÿ‘eÒäÝínßœ*÷¹ÆÚ}]ª¶F9`ðFì>á¨Ý -nï*ð=5wp|þ<Ä©‡Ã…Ôêü
bÕ]|ÑAÍûIsj;7Î/ÑÎÄíËÄ‹—Cç÷1I -©uªæ¾ÆôcŽ^!ýX´®endstream +xÚ½Zm“Û¶þî_¡o•fN(ð5ßœØN®'Gí´Sw¦”Il(R%)_\Oþ{w±”x>7q:7s +þËùßÊwöÿ׋¥ÎâùÊ6cI/‰ôêÞÒ¾¶´?Ûÿo,å¥ÿèYð£q‘2f‰tTÌu„=Ÿ½\ù½'QüQÑ`û”h +XH{ÑÄÅ,MRi/Œ°ÿúb‘½ DVd8‹.D¢³ûÒní/N +*CûsÇ_ÇôëŽê'Ó«a 3ÃI\ò=7: +‘«&ô}Vv¡XÄ*ErVhŽˆœÇjv¡þõŽ¯š~0å–>,âYmDOŠ”SYua[Â[æÑh˜¼‹[´bS +ÔVA„Qøèîq8íŽË÷4)B–ç!Í2ü +O@™€ª{ÒšòxªÍu¼+#-"YÌbˆ’4°Ä¼×ê»:ÛøwŒ|œ«LýŒÎ6ëMݲW²¸{a[×f_5X¿ÒDB¦á„>wï̇·7«; …¼Ãº¼S¾ÀyþË#ËÚú}
VÿúG~¬¢ú/’fF¬^G„Ê + +ªÂ±ÂÅ`E~Å´8 .8P†>—i¤‰À-ÂÁÓaGâW¿2df†ÊYÊ\M\C”NÀô2vq%•ð2½,¹ÇRf"Žâ‹ Ën@¯óçL'‰ÜAÊa"¨XMÜu¸År#o§Q0Mî +D*>¼ˆ šcOgu†wä̶]±<.Ùi'Ÿã#3Àwâ4 ˆQÙïcÁ!Ï©ÈüõÑïfÀ
˜óylX~œ·LhÏõ–îk¾qàuä|\£°˜><ÓÐGD÷žK<ÒB¹Ë•vŠ‚5òÐÜqèÊ…Š8õR÷4Êßrzìœî*rtr›öÜYåUšoå†*¿ %•Ñ. +Œ‘%RÖ¸øy ŽxK°<Î7\χsªº Õ¼êÅaו”î¹æËÿ‡BEþ‰…üµ]áŸM'¹6Ížì,/ÒÙõ=¿E;Ö +SawT±GŒˆÍz&
TRš* +ŒØ‡ eV‰5ìOÃÉß Í™JR =0Ã)àIAÐÇýîv¢‘Ê?ÓÉ=Á³;¹ŠYÝw¦lªÈ +¸œÐ¬T +õ¤ïû"‡þÄ9Å–‹(ËFw›4]`8Fz¨Ý…\û»:Ô¬ AÓ8k¯\Ø<é¤J…NÂ|GOÄvw4'sì<`¯%jãÁ
>< +05GTÊŸð´
wd“ÌoâVíãV]PniKõÎç®ááå¸gîÜþhBî»6=è5Õ§Ä +1cNœR½zä¡Ã))a@¹>„>k-ÒJ¹ƒ8,‰¿j?…öŸ~Xã"õàjÓyäPH‚·ÜÙxhS¾ãë'£ÕO`/þ8{Eà&‘Ê×îàÚ†êâHîˆg›‡^îDxí
Ó +ìPmOáÈiýÀÇKumÚ¶ÛBÈ6˜Þ>%äóïÚÁ|A pÊ##Ñ»m›'Ú¦=ü¦ÒÓ€‡˜ò˜»ëúnOþÁºá³A>ߟ9ý„í»©›y¤E–ÄA@²mÏëÚl»òaÊ[AT"£bœßˆ’¨· Ä(E—Б¥‘3„²@¿%13LMÝ~F•7a"™{/ƒî·?¤¸šÒþB$BÞ¬
Wq©e¸ömêšû||Å«‰xÿòŽvÿp¨6ªvæß窳ˆ_öµËußÖg4[–׶‚êé™>ëŠ,}ÊófàT}¶T&Ò”èub„Œ0£™RPµ=siñKæ³Â +X*‡Ž~0€UØKKÕ"sÓÁ
k(&Ð|ÿÁò¶EXEÓïÊmuæïÚôn=}ÝøH
7Š<O?{Ìv}ßóºÖÉ +£Ñx‹q¢àùf8“Ê"Þv
„ÿö•³°{söGv ãs’³!
ôaõ+q塀“’¨)Ÿ;I!-¢ç'$Óó1ÐÎ=°bU¨[3¸·vìcµúlMYóŠü™[×µTij´q¨ìÁ+X¥Q)>O6°IŒòuø†t ¼ÄâûƵV;*ùwA©ÿ ßr,·Üf_•¡lyÐÕÕ0M|Ë%s¥2
žàíHE"}š©süôýÛiÕû
’ÞÄR¨l4çfdËÁó6ÝÌ»ŸvøK(שd_ç,nßYóY¡ƒTSþIÛŸ&
ÿ¡¹jô +endstream endobj -624 0 obj << +772 0 obj << /Type /Page -/Contents 625 0 R -/Resources 623 0 R +/Contents 773 0 R +/Resources 771 0 R /MediaBox [0 0 612 792] -/Parent 622 0 R -/Annots [ 627 0 R ] +/Parent 762 0 R +/Annots [ 779 0 R ] >> endobj -627 0 obj << +779 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [291.231 464.427 313.149 475.371] +/Rect [169.209 194.578 191.127 205.482] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.2.6) >> +/A << /S /GoTo /D (subsubsection.4.5.1) >> >> endobj -626 0 obj << -/D [624 0 R /XYZ 110.999 687.904 null] +774 0 obj << +/D [772 0 R /XYZ 108 690.907 null] >> endobj -150 0 obj << -/D [624 0 R /XYZ 110.999 621.976 null] +162 0 obj << +/D [772 0 R /XYZ 108 666 null] >> endobj -154 0 obj << -/D [624 0 R /XYZ 110.999 354.554 null] +775 0 obj << +/D [772 0 R /XYZ 108 642.418 null] >> endobj -623 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F11 537 0 R /F80 371 0 R /F101 484 0 R /F8 534 0 R >> +776 0 obj << +/D [772 0 R /XYZ 108 571.543 null] +>> endobj +777 0 obj << +/D [772 0 R /XYZ 108 386.903 null] +>> endobj +778 0 obj << +/D [772 0 R /XYZ 108 269.183 null] +>> endobj +771 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F11 600 0 R /F120 538 0 R /F95 412 0 R >> /ProcSet [ /PDF /Text ] >> endobj -630 0 obj << -/Length 3336 +782 0 obj << +/Length 3541 /Filter /FlateDecode >> stream -xÚ½ZmoÜ6þî_áoÕ^_D‰ê·ô-H^ïÒz@ òJ¶…h¥¤/Wô¿ß‡”¨•ìlÛ´0`QCŠgžyáŠkâZβ,»NLÊ2_ïWüúº^^ 7„3)chA×»«|“škò$¹ÞÝÙ»âM¤6[Í#fÿëÍVpx¾Þ¼Û}k‡§L¤ -‡KX$67ÛDDÿ„ÿ2úÊþ'ÊkÛ~eÿSïËÍV¥qô}y±ÙJ}iÛ¯mû{ûÙãr#wJKf’Ø'cqõõnÜ™2KSC{;ßöVeœq.¡Ã,Y¸ÿVPáþïÚºn7RGý
ð”Éèv#ytðEDýwCOù@Ïa#¢‡’ÚǶj<ù!wU=íÈði=¡9SF¹Uh€àb¡€Wí¹ê6BGù^,'’œ#ܸjÝØŸ€`¤ënï<k%qÖvÕ}Õä5‘ë²¹Üæê¶}ÝÓ[58aäMA Ž3Ib€^Ä‚Ý0ôNEÀSëßµ}ùÄöåsÛŸ¤l·¯ìùÖ2Ü>iûŒº^Ý-×Ê4S2ýÈ‘%ŸâÈ&ž«ž˜»ïÊ|(;bT«YN«3ÆÅïT¨? ÑpšbŽÎë˦/‰æ…=ös«[(·§®DCû9);øND£žW~{Áº[k&yæ4'±¼*îO·vî§1gIœ¬¦žÀ áq#xÔµ9nzéÚS]Шےh·åðX–
½pê#[˜æôÓP¯Ý?о@¾®e¬˜Ðp¨Œ“Ê¿•‰E±ë-g:¶cOù¿Šæ -fFq¢-Á=>aŒš¥2Œ–k7÷ž6ÑÑ:Ú€“8è:òÈe^õ-„%}YÒІ¸u‚dúr»…A‚h•›Œ¬‡ª(jצ}8”dúÌ|r ‡.=V¾Õ·‡rx¨š{z«÷¨H8gìòNÀH¶ è£÷H@ɲQŒ9lù1”ç¯ü†éßR -s&Ôgãb˜¸jª¡Êkˆ—†fX<â’:+®'´væ¶ç÷ *rðZ„ç´†cV¬ÿ"0=˱bï+óQÝ]<–ÄÂ…Ù ;› -”Å*!@†q£}Ú|A˜¨³l¹Î¼*0ÅýûǪwýyמ×Mé(GSÎØØ'$áµ[»]IJeš@‘ý-"ã£È -ÊLº²´Ìï¼€£8x)–#âˆÛ¯µÿ:ÞžS!Y:ÆžÛ÷ǽ]úìÆÇÄ:ÐË¡Ó½ªÚé…Ë#áù2`{€£÷Ÿñ®kÔrª ©2©IB“nÜ8Ò’Å™9ÓÏfK™™8´±)RJ¡'´àlÚÓ-*“¢^ψèòÅ,ÄvûJä̆Òøn÷
È!ÔB„Ã!¹›Ê2«À± -nàä*ÀIpøÕpo¥LQ¤B°fz¶áPÍ ÔŽäÞÂëXtxQÞTøEH3½º£§µI½zÒZ»¢œtKB`€öÅhà@P€ú¾6u€¶ý -ž>»Ã•î ¡qÓ»Ì"Au”æ„RÀ)gÝUÃWûljwjX»˜1H²'c,ƒH@5wôö扎mržñBƒ¼<æ'e:Ó# -З>y7ó¤;Ñ*3‚…é©™~m×µSF…L9ÓÆÑZ€‘ÅÑ!ÿ€
P–ã±Ì;"âXZãâ7$¶]6stÄØ9–›±ÓžR«¦¨ö¤MHŸEØ¿ -ì;§ÞÛ‚Él5,ÿ@öÆçI0mtÓgm:¬›C”ĸtÉ$³wœG¯!.»1=>ä{È[#ú¥è!/Œ³Yä}v 1¶…ËI¿º '}±‘™KF_u™—+‰)Ä™ S0'bãd‘S?>”Ë:”Wé¨C–ÍJ¼,ªÍ‹²@H0ÜÙ9P]`F/î”|
uö¤·œËûSWºóÎMR¸TÆ}áWtÕI¾«‚Æ´§¡†XšQÇŽ’\µ¿YÉÝ5˜O2‰1Åú_1µ7³j‹±Í‰þÛ -cn´öǪ¶á£÷BoS^<ûЬ] - ˜»±d0Øœìß¾ÙØ ”¾ÃÀ‰cU¸.?w‹¶ô¤ ÇNÖ,³?ut¤ŽÚ+Uw˜{Wau×tœêôUë¼ä2ªÃj$¾xæ6¶s-k*yÑ“ÄUn%¡2jî|÷,Øä¼FíjV‚Š*?yáë,uÕÉä;ò -àÒÒ@,üB¿Y¹q0üc,ôG¼d\r Ybâ¿©ÊAÔ)Ì“^„'‘;>h§g·ÏØ‹? -¹§&Ù/ŒrîHý±ÜWú l:M‚›:ìvfΨoç'ÄÒRÀ-Ò|Ž÷uKçá‚昶aƒ\÷kOa¡À¸‹ú©_¹Â…€hI§ée•Y\ò™ÊlÌT"Ï°å²Ê¬‰ŸÌ¢³q£ã'Ë2(g—ÕZŽgN
6N*jûüïè¾8M™‘+’–É$ihWî9v†’†–•tØï$
&EþKJDvÉgkàRœ :0¼gQ7ðŒ¨!ãË’Ê:,I§Ôçb¢RP(‡ïÙËÞÿC€Ì½ðô麀
³`B×ì»2§»ôÖ=‹rF¾u_å½›æDy£¥L™J%!“d)(£²±>ò Îó€-¤–O
+‰1ÿÏWoÞñëÒ‚o¯8SW?B›C]®€]âÞê«®þ=ý6rHø¼täÅ'ÍZI(I0«tú‘%Еè†7>a.»r®!”0ã¯V—JÓyÒ>æé|úíÊßA”ÿÂÓdvVOeæ*+÷HW[UnN$ŒqóÍ| +xÚíkã¶ñûýŠývÚÂføÐ3ß®è%¹iŠd‹¶¸;àdI¶…•%C’³Ùùïáe½voƒ$ß&9¤fÈáp^¤º‘ðS7JÆ7a"E"£›ìôJÞ +NcNUàÌJqó¾\›™¾ +¸ëðªò6}x¿«.Åǹ–€ÓïYMÁÓÓ¾l‹Ü~xNÛþœöÇŸåFcðÛ_V6‡’Ôýü4µÜH(ÔFý²dÑրʎPã„Â7ÉHãhPJ$ˆXƒiਥ¾0TAí€%q1 ý +©…hÒû¢ŠeA9HÀp +_WX=*½î²ëHMÍM±6JĘd84 °¶ÔÕn¨òýÈ0»ÑÛÑpç·\Oþ¥õ[„/n€”ˆ¢pL{á +¸1ÏSœ!âõ«
¯¾¨`ñ5zªcëÃ[§ë‘ +ý}ÿq)`&™4#&ÖK‘†å A›³9Þ;‰ùq¡ˆä¯3&¸³ì±ðU¢'<½;^¬ë⻽IœM÷‡]â™hy%'BÆŠItÍ©X™…>¹óE ܷ͉ÈЦ¨¨s‚Xηž‹˜?8€¡sjpZ¬ÎØ·„/K+„¾uáSðjvËyëX f*:ë6-G'mJ‹ÄÄÎTemímbµ)–½Õ±®N[ÕìØtEMuw tƒÿ€îo¨¬J‡³¦A)5»ž§Ã£ê‚öÍ6¿aÿÙéßÂB6n2ŒÎÏ¥b$uQä#&Þ rÇ.Çà¥cØ•‡ºü ¥ÛÒ;«W¥,˜q|bttÉë" +ÞSž3Ð&`m
ŠwõÔE6 +
¶žšNbÏŒÈïeÇÓ“®t” 3ÒIˆ”˯ȗœ¶…vkéç<Þ¥ó8ÓýiÛ\jî&ç€ÃÉåä.Ž«â¢±éi„Òú2?O1&w™b¡£iØp€¸ +ˆzzb šN3àÐWˆëì¼¹ +6Á¯dt ‚á^G¾LsÅÞ»=áÄc‰íùNˆô}âí´,t€ýÂfS¡Ÿ +ƒÊŽÉ·Å¹JéN¡«t#t»—ÒíÊÿ¯yµoj¼ÇZ“ç/´¨›Ëá¸yÂìIð„Ö.ñý„šÆ9D:N¼O¨ŒAi¿¦&9NhÍqâÖ–%çŽÕeãæmÙ¯ÅnÃs+i¨‘
is&ß5Tò]v<2Ü‘bJ¶ê¨5\mÑŒÙ?¢0w²šä´p¨¹b¯P{kä4]œà…*]œ’g÷¤y¾ÿþ‘dÝO®ic'ëëw³×SÊ·«Ë' ï-_ ”œüO+dñÕ5Ï'|Þ-:i_ìÝÚ¥Ž•„ñäb…³t³;Ѓä:º¸6ÖÁ9¬y] ¬a*8»ªœ%ù†¯Õp½ ¨Bº1±žkOÜ…ÊpÕÒ—g³èÙ7•‹÷‰º}r2ò©uzÙ¥žEã +¨UeÑQ¹ô]™¸2÷s +º±¾à¨ãÿH@Pï +endstream endobj -629 0 obj << +781 0 obj << /Type /Page -/Contents 630 0 R -/Resources 628 0 R +/Contents 782 0 R +/Resources 780 0 R /MediaBox [0 0 612 792] -/Parent 622 0 R -/Annots [ 632 0 R ] +/Parent 762 0 R +/Annots [ 785 0 R 787 0 R 788 0 R 789 0 R ] >> endobj -632 0 obj << +785 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [406.738 325.972 428.656 336.915] +/Rect [230.854 511.22 252.772 522.124] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.5.3) >> +/A << /S /GoTo /D (subsubsection.4.4.1) >> >> endobj -631 0 obj << -/D [629 0 R /XYZ 110.999 687.904 null] +787 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.251 270.03 196.15 281.905] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.4.12.8) >> >> endobj -158 0 obj << -/D [629 0 R /XYZ 110.999 557.951 null] +788 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [403.552 162.767 425.47 173.671] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.4.5.2) >> >> endobj -162 0 obj << -/D [629 0 R /XYZ 110.999 392.348 null] +789 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [232.701 138.857 252.128 149.761] +/Subtype /Link +/A << /S /GoTo /D (subsection.4.11) >> +>> endobj +783 0 obj << +/D [781 0 R /XYZ 108 690.907 null] +>> endobj +784 0 obj << +/D [781 0 R /XYZ 108 664.406 null] >> endobj 166 0 obj << -/D [629 0 R /XYZ 110.999 377.16 null] +/D [781 0 R /XYZ 108 457.671 null] >> endobj -628 0 obj << -/Font << /F78 368 0 R /F80 371 0 R /F101 484 0 R /F88 386 0 R /F11 537 0 R /F85 373 0 R >> +786 0 obj << +/D [781 0 R /XYZ 108 436.7 null] +>> endobj +780 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F120 538 0 R /F95 412 0 R /F11 600 0 R >> /ProcSet [ /PDF /Text ] >> endobj -635 0 obj << -/Length 3307 +792 0 obj << +/Length 3896 /Filter /FlateDecode >> stream -xÚÝZYÛ8~ϯð£hsE‰”¨yËÎ…,0“AÒ,0“Ùb·µ‘%¯$'Óä¿o¤Kî8™ /‘Åb_%WüäJÊ@¤iºŠM"Ò@v‡gÁêº~~&Ý@„¡‚týýîÙß~JÌʈ4ŽWw÷4â.ÿ}Ýlt°ô¯o62€ç«›7wÿ á‰I„ÃCXD÷Î7›X®…ÿpýýsË+*¿ îýùf%jýUžßlÂpý=•_Qù%½öº_®§.Ò¡0±rë…G<ûñ®ßYdR‘$†÷v¾íM”"B((˜%í÷oÌ*…¢ñþÿ‘Ê뮳ùïL† †A*±JÜÈ=÷Ë@"˜_»þ¶ø¯O!0Îo¤pýfy†ÛùëZF~‚€ØpÌv„¡ˆÍ'(ðS¼qKÈe -¾‘ÁððçÖÞ8BW©E$
½ôC“ÝH½~ß‚,Dr
̦R¸ÎʺzàÆno¹Ðí®øÏæ<è˜u{Á}w<(\çöþÖÏN7r]vÜFܧaõ=·ôs+ðB{Öûî&Ô@ÊÉÍÍo÷…ë;Üå*RFÄ:ZmB*é´ -Ì„:c÷ D~k‘„#~‡`&Ÿàw‡žx^FKÜ U4p'$nc…KÈ|v}Ò×rù=ra‹*]gù¿Om‡ªƒYëéœ(M$d,Ç{ÏÚ=¼9#4ÒBÇIOèl&𼄦§À|ÙOx,ënÁ¦FPF_kÒ.ÛÔè:‹vÁ¦~“ª¯3êo>,l -c¡ûLMî<[ÅUçψ`-÷n”ó`XünÛb[º¦Åí'%Rr¡hÃbZ±Û×-F -Z·>U¹mælOb!e8b;jâxããéT¨Ô.*ž¸=m[ØÝuÎnŽ±—LAúC@W& ,@WÜÕ<¬¸ðêçoÎðV$Àjϧi¨§hîâ‚id×éÑ@Ù-è:Шã¯nmÆt%BÅ^ÈÁÏÍM-Àp5Ö‚c]TܺVBI¯•YåÎ?û78-s&žÜ>Û@_
`¯7vSÕ8¼´ÿTÈH¶ïÄ~ÙÏÆÔ$òËü¬¾ÂÏÎÝ—1NLÂîk¢2UÛvÁƒi-LúÍ‚‚ÿÿ[6a2 îöC° ÇÒ(güpTSùJÛì`Ý`2¢E BÑ¿CÏøÒA‘ÒךÃÑÙÞ:J¬[â“„0è¥ -<O˜ý}+¸ñ9¢é©0>´Ô•u…{îpsãÉ¡áóMñÛÞëï÷Ån?Ê;¤ §@9¥Ò_ú\†ee=§âO”Ex9J;Ü- -Ù˜c/‘' o“ -®!zb -Ǻa'€Âeq<ôù\,ª¶ÈíÙÛ“ÙQNIH±ò²rC -´»Zˆ»b´ó×:² -#–yÔ%…îq觢®/
ý¼¯+m%¦H„Ôú[¤Oaýð«¬ÿYçEdü…÷kz´›·‹'š¨ô³âè©©JTS«?¡ÔRÇõºF7•[–X‘k”Vnv2Ûr;„nK‘°†HS_“òOEÔ§´.Aé«2»ã©ŽMûzæÖjýÆ -G{6Ù'`…ÜùØÜ‹4¼Š`·–ªõÙD -bˆŒÿ±»Ul -8V»p -ŸW>›¤D(§Ù¤¬$ùízp¯mجc-ÐíBÖfãK×Á£ï%°ÌÒ<•(Ç íŒéc„%´cõã‡àˆ!þ:v·Ñ‘ž^KB80$³Ä‚C4R™eþkÝÙENÂúç-^l–0Ûc‰µÐ¸wV™h!³àò"Åî-Šò-7±Tq¹¬ë·\Ê|Ò¨ë|ú/î€Íع7ûô
L¸ó³¸¼ÌøÝvØzô²é½/Þ-ÐÆfzIé4®å -R}zx +xÚí]ä¶íý~żu¶ØQ-ËŸy»$wéi$[Åå€xg4;îyìíÉæä¿—)Yöس›Þ)Šà€Y¢DŠ")’âÊU +òµ +òÅ«;·÷8ˆ®²ÇçX“"³W ›Í#X$ND ˆ5¯od¼nZÀªÂuÐØPë®/Ú›0Xoö0$×Gêí{¼‘Ìy;™uÐÅŽºEÇc
Ýkú.v;Í0ž×-/|àáSѨUò»¶@ +kA ÿ8½EkaŽº¨;äˆGdv¸‘RäqlvXÖ +ˆñùsjõ÷Aþ„+ëØ‚¦ÜæbËþÞëmqî4}¸9æëXlÛ†Áà€©T”-5u¥ºîE‚¨Ñêî\õÔBiÊM¯4$µà¤qÃ4©`È}SU
B=ZšßÐ&ƒÑî>4ç™#•©ˆ€
Ñv=rüâè(LjCAh¶ç–cþÔ¼q挑`lýˆÄmYÜWú=Ø NóGw¾ï4dSOõ\…‘¤Z%a +ÇrV‘ý®¿±"ì?Rö-šËÂݡ㥔Qð1ÉGkBü¿¥ ‘H¡/Êê÷;áÿUšö"6!ÂŒ&„àûýׯ„O ÉG(‚ï^mÂ4‘Ä0æEÒ̺;hŒ^T’¸xE%)Å+ØÙQøeZmOƒ˜’{Ó.xlWîÑIÜëBªšmƨcȪ1q6i:µ‚zîL}GµD¥½#ÈίcÚ‘Ìžì=zç~â+SLn¼É¢¶‘œu¬9´4§SÛœ ZéuÅ];Ý•@Xybƒ¶“ õiY];º¨ôn²6sÑ‘fˆ +0¶Ž¾Ï‡QÐ.ëùÉr‘ĹѪ¦Ù+O@‴
QâŨ0ÏfVˆòU¦ ò©ÀŒ¡7øe”4Y’³PÈÜ +<»4òq_Æesãd!—ÑþIHÒ”„Ä0^ï>£.¥} lÑŽÔçm^é"è/ËâØÔ»™8;†`ÆBmhqkEÆWœÊ¤Hd6’š—DYe÷þr]ˆ +“ȺÛ¾<LöIfƒaö +°NOµ÷ݘ +17Æϸb#8Oqå+Ÿàä +sýÁ¸@ÈVþÌ$í#¸4ÃrrãÊÌåe.ÒŃ»…·!g³e5›Â +Àv{;fCÀ%á2â)brém[˜dCmUa3>!?)xF +Ó^aNö(eAÇ›“HÐmjß ûA3É@fe€:½€ÇÈG0ÓQÖ] 2½ãOÝ”“ÅQù"¯Œóàͳ‡ì¡>6ß1ÉÑÒû‚÷ˆ3¾áÀdÁõ35SàbŠÓÉu6Ü¢^ +Žðí‘(¨‡ªÐ°eRÎØàô)}˜g¸I*]PăTNÆ+|~îmïÖ¤šˆzÄ lštµgaRA0SâFÍZÃýÚM“.ûpnÙöŒgØ™Æ
RÝöÜ[±£ žój®s˜PaƒŸ-¹]a*Ä!þå±ì~yÀä~T-¼LÜŠu__ö—¡MPÉF‰ßnX¼3O0Mõ÷g¼‹ƒÛÀX}lË[‰íãµIE„‰ð|âÜK¿¨ 2. +“.+>˜>e#Xž×P';Nå_ô„0Æ+™Ê€]eœáy1Øož[®DÖÛ€îŠÓÄÊV¦"À¹£@YeerKgsÞ¡'ìÀA£¬KˆPD +Rq¨ëÎG#:XéÙЯõè ÙõmÁN%|OÄX¡Ýñ+O”¸Óp±æ5Lд[MŸ}*„ŒëÂýT>yöE&±»í°Ðï¨M]±aŸåçéTaè4Xó<…EÇù{3St›‘ª47ö>ýjèãÜÛc"T —Rüœ=75ÂÉrp„e5ÃÛŸ2¬u쨳ZRÒPdiüdµòUJ"”ìG2ÞÀ{Å¡, ¢…ô3#'“üuÁb1¯Ñøa +8)áJ<{Á.\as·ímFÆ^Ù³/¾$0™¯Ë¾’¯¶îEisá΂ÓùßÀ5ÒÙbã–rgî¹Â‹6l!ãd*T‡¹€mCÁZdŸÔæ^xò¤9|ޟ𼥕ÐQ»w¨9t2íæh®(ªhÂEãy ö=5KºÔ5WÞbœ=õ
sr6”aÚÂìÃDì"#‰=Û¢Ó¶OSWcåˆg[ž‘p–ÝáÎÖÑü;õ)KÊæ,UîþÎã¡*Ü» ·l ób?aŽ;Oè,xnaË 3Á±]Û·…Ä^ÍÞaØàbª¹A¼àðz4G_wvŽ§ ÔQÎQìbgˆøÝ3´–bË$9‰F,ŒÍÔªüTm +Õ“mÊì*›P e"rÎh¦Ê(˜Äfê‹Ê.Lt_•qJo—aó-üs¼mLr×áÉûy—Záe¿þXЪ/;"dáùVW—OþË«¾EQÙà!«”þ`É7æƒeœ\çzù!ÕÆCáôT9¼/æ‹ö‹à|—8Xô]@O]!Àoï»ÄW}—ÔMï\%Vå{*1 ÈçD…¯l‘ÓjøK ï®Ég?ôÃ…ídÑ©b‚3³XÝ©CÛd{”Íâà _ÐgqP*ƒu}}ã%qà³äYäïÎ4²Ãœ‰4Wý ZÉœ£]l°"›>z=§ï/>𓼌>õÓù§ÁìO*FüÉ.™OV¬9'PÃciÉÂÐÙü›sm7ͼéå~Ê{¾ØFZ©oíÚ¨T¤éô†iŽÓòŽj½ŒóÌÃA¶ÊÁe’³1Ê\•ÞÀ¿
‡bê +endstream endobj -634 0 obj << +791 0 obj << /Type /Page -/Contents 635 0 R -/Resources 633 0 R +/Contents 792 0 R +/Resources 790 0 R /MediaBox [0 0 612 792] -/Parent 622 0 R -/Annots [ 637 0 R 638 0 R ] +/Parent 762 0 R +/Annots [ 794 0 R 796 0 R 797 0 R ] >> endobj -637 0 obj << +794 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [302.625 563.247 324.542 575.152] +/Rect [323.017 617.019 349.916 627.923] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.2.2) >> +/A << /S /GoTo /D (subsubsection.4.10.2) >> >> endobj -638 0 obj << +796 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [425.518 516.507 447.436 527.451] +/Rect [318.953 524.088 340.87 534.992] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.2.2) >> +/A << /S /GoTo /D (subsubsection.4.2.1) >> >> endobj -636 0 obj << -/D [634 0 R /XYZ 110.999 687.904 null] +797 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [313.969 353.281 335.887 364.185] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.4.4.1) >> >> endobj -633 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R /F11 537 0 R >> +793 0 obj << +/D [791 0 R /XYZ 108 690.907 null] +>> endobj +795 0 obj << +/D [791 0 R /XYZ 108 597.495 null] +>> endobj +790 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F120 538 0 R /F95 412 0 R /F11 600 0 R /F125 566 0 R >> /ProcSet [ /PDF /Text ] >> endobj -641 0 obj << -/Length 3619 +800 0 obj << +/Length 3309 /Filter /FlateDecode >> stream -xÚ½ZYoäÆ~ׯЋ uØ$›MȃoÇðÚ›]`ûâPÂrLr¬U‚ü÷ÔÕ=äZiu @Sì£úªúêèÖ—!üéKC•çùešY•‡Ée¹¿/ï¡êë-MBE PPõÙÍÅŸ¿²Ùe¦ò4½¼¹£7ÛƒxsmÂ@ѳ¹Ö!ü¾Ùü|ó-5·JÛ›G0H’IŸ/7ש¾‡ÿQðýç’7Dÿþsí×›ëØ&Á+úøtsEÁçD¿!úêöÖçg›Hei"ãE)¶¸øòƯ,ÎremÆk;_öuœ‡*# à’OןÃñtýLf8tM½E2šº®¸´h·LÜWmÕotPŒ•ÔL¶(·ÈÏ#ÎݽòÛ7›XãâüŠüÃd‡n<#?µ$W!PÌèa£Ã èÛº½—IÝn¢08Ž<Yê~i¬J,<RQÉa9,¾O¥ÿduÓp÷¶¹¨ìö‡¦¨[ÅŸ»ãú‚&Á¸“…oë=ìCÕu×4¤VÖ$—×Z«Ü©ná䣷7Ž²`[;.8ãXõ¾V}ÅtxÅ;‘Mv"·*ÎRÙ‰ŸtœÀ9 «j»Ü5“¨0sÓWák·³¾}”Yô0 å·÷“ÙåÁ -Æí}ÆA“qˆ&ÆA?a²Ô MÙmeÂÀÃÙ<²(Ä:SZOQh‚ -2êwdšÓ¡Þ›bd@†o·ž÷àŠ=á --w©Õ3\y^£¼$VköJ¿ì‹¡"Mmyÿ8îpªKm°âSÌQl«Ç¼ÞÐ5b˜ -ÙB¨¸]AÞ(LT”Ͳ[Pþû¾;¶kAm¨2¡í‹Óàm
·bµ5h¢kú^žgCÈѦm×ïÅË
ƒÏ×"!ÞPÄöÝ0JmÓ§¡á@–¤ŽS؉x¦KÇÁ:Mí¶äŽ5`øm#>ã]ßí¹yž/q§Ê¦>¬ ^²n^Œz€v&Ñ3gÆ¡^2ø2Ô‹T¦]þé:ìÁi†Y4…=` -{øíC©8tÞ;”ÊÅúÔñPà õòq‹Øû‹ØÂÁ"ÒG§ŒxT™ÊæyFJ:BÊ ¢¥ªäÔž€C`JpmCPñôÃ$׿3k?ƆKüÐ`35Iàܪ“—ó{£'ÿÄd8¬pKò -R˜pÏüŠ·4-@DÒqb&©,FG -KAt -f.´ñ.Ô‰‹$‚íHm»‘rPÍ?,«ÇGò - ˜Gñ“à.2ÉüÎíæaÒ|î7þÞq: -"B©sЀV&›K)»ÅäqXëcmËìÓt¯¿”¼u–{„·—ñôf+@-æìÓ¹‡XŸ–g$ÀQøx‰§XÁÚI¬`FXÎSÿicLà¶Ã,¹2á,—àL_KŸºˆ%SÏB}*fC5oŠºs6”8—Òßqd˜ƒ›.s`2tEÂ"P!¿\ŒcÍý¨³·tû!«x~3Ü4±íÚ,‡&±ElŽä2„|í3VÑŽ„x6=ÛuiRv½äÏ¥iÇ¿ÿЦÕL<üfÎÞšOæC©…˜€H`ž%xr«~¥¿ÀK–êtê´ZÚ牫˜á:é¾ç¹'«0}ƾYqcÐ÷õGÈîøÁÜÒù1JÔDÀÛ,À<Ùþ@þ••R4“{t è‹‘ÌfΛ4ôU>yÆŸ÷=]óÚé¡óµvZtîIm…74‹cÎn!ÈØ’êÁÜñ2è7ü×ÑhPD$g‡ß[PvÎ6eôà`ô~V•k¯ñ®Pu‹ÉH`‹—Õr¹Å5mój8ò/ßw µ+rÓ…©ŸiŠA—`=’>ç @êµWÂT,e,Þï`Þr¢C\Ž–H<w+·ODH9ÜÝÀcQí(²bR¸â˜FQªL˜>‹;€_Þ¶ún{,…)Æ -“l5\“Ç̳‹ƒÿŪnöendstream +xÚµkã6îûþŠù¶è,Éò£÷©wí¶{À=°CqhT“h£ŽÚN§ƒbÿû‘"åرç±w-ˆ)Š&M‰âK#obø“72ÎoÒ"EœÝloâ›= ¿z#yzƒó›Á_nßüé]‘Üä¢HÓ›Û{d ”J&·»ï¢dï™8ú°úáöož<2ÓH®b¡U¼‘îËÕ&•Ñ?àWE_ø_Â|ðð{ÿK³_6:K¢wïýüW÷oÿûÁc¾ôð7ƒ¼áó²D™ay¸(•êHk¤|óåí ¨‰“g×ç—Ö¡ +ðJÃòß7üM`³àýGøŒf–}fQÀªe£îú¦usaZÁYf s²èI*y¹,Í_&~ÁU³m¹aÌ0Fñ.¤tî*<y™Š¾‡ðØ9? +£0ôÐL»¿!àÃ8ZñfD=TS†>^ æZ²’FdI6=‹æY‰×Œü–ÄF +Z‹[ÚZ\ ¿µ°tÂa»î|ä5#oIÓW®ÞûȲ£§\ÓÜŒ\‹ôÓ?‚?EI}÷–Mœ‘*£
;ŸØQÖ;ö¥ÄÔCìD½C'wõ‚îÞg?ÒØÕ»·¨5ü×"çžl2mP¦E6Äeä¹`¶pÎBVÃÓRŽ|xWÉÓ^~;›¾/¿ì?x!š'éøûÎuåºîj]N¶l +'ÛÿÌ€·’ú—b^ãR’©K™¸ƒ1q¦¦oj`ÁÊìÜ÷q¬j·[“hˆ
»Vt*Í1œlÑSô¯Þ ì¥`–€±?a¾ájBû¸hŸâ¬æàòŽ P|Óv×ZÌ*K^ñƒqÖÛ]YïiDV\„t0eß
"³`‡ÚdBgÅÿk‡êy;LŸµCõ‚šdšfÀåR¤òj‹¼º™ñþý솜‰"è÷*ICÔvßÚÓ°çºìe¢w¸>S…9‡ƒ_íñD¾Ýwc xù,“Â)í`Om³;o}ª +3—aPÄçƳºl UP¸¡ˆ÷÷”V=b¦„@ëN•Ýº;.e°Éƹ,k¿ÉiðtÒÞ5h8¡Bð )î÷\@’ +™gWª²^Èf´*œØ'í!É!ÒÁ¢¾ÊFÄOÛC zÆðƒiŸp›Ä§Äšl)L¾r?é(š˜Ó4Zd¬û8K'àŽ‰¶UÓù* +`ÈÁýs’Ý\öŸ&ÇuÓ‹l1„TU`\Ö”¦ËÄ·Æ~»ÊãÈ{ù,:r˜aÄz’ïsÜÊW$¸øøîLá^rÕýfeŒóÑ—B@ÛÔÌÿxîzUGÅ9ÂËDd 9, üúÎMw³ %Z…ØVYªõB*À‘Vl_^jïîj'Zï}÷˜7ÓD3]{×ZüFq=ö¾¾ÞÊù19ô§–âã+Ð…ø™#ÄDó#D‹uq¬x~ç:9-8¼¥ëÁ“~¿È,$‹X®öôâ8ú +æ+†| +)÷šT?,ô@ý;é¥ ]×ØžÙÔÔÕ#÷FÀÄý7J퇃/‰rM½-x’>Uå¶ì ÓŽ|OK¿ÒÈ$l"hD§æ×\$‘Ýp´Û¶á÷Ëa2pÛîÞ €Š1GLLô¸³ÂÇøE+›sW=r| æR‚aíÐAqÐ+9Ò¢SÛ–»«Å‚u£ÐBäƒm×ÍØ´'Ù4CÜ`[pxÌs*NYn؇î¢Ç +èTšïg£Æ¶¦ç´{ã„kÙ(+€¯¬÷9§º€Ùq U®%W—pj¨Ú€}õs¹HópEÞEø_3‚%_Ý~1;4 dƒ¡ +¥ÚÏWªˆ¾Pîjñvv!©·5æÂ[Ɖ¤ß-\'‚*yúʦඩšv¡'(!=|¡%æ˜;J#â¡ú²ŸL +n:]rÝ/8«BG®CÅ€Ï#~>S£‡Ò sGÞ@Ë´œ~é8ä‘‚F—”f[ÒW… mèy×£\ï"f{n‡±5˄ع=„4mVÈQWÍ—´=8¶†ïEFärÜÀÀ]ÇçÀÿ*ýÊ…:\‘Žj:tø\Î݆2nš~ +ÁÛãvعjÄÁ&ÙÖR……c,âw%Iõ–Þ¹þÁ¹úÉH´uü•VÂÿå’„ži2jhÀàäê®oj®vá>6áë9$.}»?5'º¬K¢]i$aâ/EëˆÔ\G(XiT¹‘/_V3Cßâ,·?Õ|yê¿}^C>ÊÞ÷ŸTÔüe„–2¬‰ ‰Ëÿwàˆj$ Úl½çw©žE(´«Ô7JŽÿßláŒÍï?‚s‹ÎG"Ö÷÷ç#Õü¨Õ{Ö¾i±&Ez^ÚêA}OIëJ16I„Éäd‚ý¿*Bë8bˆkm
<°3µ¦IîÀÇJBd‰I~²ã‰»G¦¶þÏ÷Ö]Œ!W¢¹OŽÿŠÒ‚ý¹jÞ³Îo +(\åâ¿pèz4ñ_Ëål( +endstream endobj -640 0 obj << +799 0 obj << /Type /Page -/Contents 641 0 R -/Resources 639 0 R +/Contents 800 0 R +/Resources 798 0 R /MediaBox [0 0 612 792] -/Parent 622 0 R -/Annots [ 643 0 R 644 0 R 645 0 R 646 0 R 647 0 R ] +/Parent 762 0 R +/Annots [ 802 0 R 803 0 R 805 0 R 806 0 R ] >> endobj -643 0 obj << +802 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [189.844 593.108 216.743 604.012] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.4.10.2) >> +>> endobj +803 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [343.954 368.952 365.871 379.855] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.4.5.3) >> +>> endobj +805 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [262.93 297.968 289.829 308.872] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.4.10.2) >> +>> endobj +806 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [314.733 297.968 326.688 308.872] +/Subtype /Link +/A << /S /GoTo /D (section*.106) >> +>> endobj +801 0 obj << +/D [799 0 R /XYZ 108 690.907 null] +>> endobj +170 0 obj << +/D [799 0 R /XYZ 108 421.573 null] +>> endobj +804 0 obj << +/D [799 0 R /XYZ 108 336.762 null] +>> endobj +174 0 obj << +/D [799 0 R /XYZ 108 282.341 null] +>> endobj +807 0 obj << +/D [799 0 R /XYZ 108 256.812 null] +>> endobj +808 0 obj << +/D [799 0 R /XYZ 108 185.828 null] +>> endobj +798 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R /F8 615 0 R /F11 600 0 R /F105 415 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +812 0 obj << +/Length 3545 +/Filter /FlateDecode +>> +stream +xÚå[Ý㶿¿b½Àš?%èC’æ‚+Ð&¸lI´¶vV–\I¾Ë5ÈÿÞIS2×ëë]Û‡â€5?FCr8œßÌÇo2øÇoxVܘ2ce–ßlö¯²›'hþöwÝkì_G_Ý¿úÝëRݬ4ææþ0!T`r¿ýq¥ná;ÞÞþ|ÿGKž3žK$“"ÞH÷ÍíÚðÕŸá¯XýÁþ¥–·¶üÆþ¥Þoo×2W«×olÿ·¶í/öï[Ûò-ÿÆÓË+síÆcÀE#WR!å«oîÃBu¦.ÊûSr(a éäpc´a™$L»FËŠÕSs+ôêÝ-׫º£¦Íq :U«nK…íPaóû¦{†r5ÝòÕ®kFÕ×ØÛD<Õ›]×lª–ªC]}7Þ¹Î]5¹±ªvsl«©éÝàÍè>¨`ŠŽW[wOÓîV¯>P}ì= IÖœ³Rk»6ËBd@¶¯qqïi4ÁWMW?bËOY&6
̾î\->:Žõ0R[ÿèø´½eCµ}µÙG³&ÍÓÎqyË3`5åÔ;Þ·Py‡zsëæ21"û¡®]kM›~¿‡©¹uÀìâpØÛ‚)Sà†Î—ü—êP
UÛÖí$4-(€)˜VÒiZÂpÆãÃXo¬ð +'$gtÅHÁ¸°:E]ÃÓ
ÞFêç©×ù™ +.YÚ£ÈgckÎàÄcŸ)¼§¹<₲sY®¹’Ä—,ÏEé¶wõöG'M}â¬2fTá¤é¤ÍEv"¬0þ\;õ=c"”=®nKóŠ™Ü¯YVð+ç0ªM˜‚`¦ÐWNág×ÏÓSøÌ*¨ø9SÁu vƒÁ暉¢´ÝïìiÕh!ºm=m*³¡§¢·;Ž6…Êc=Oþ°@KÕöÄ¢t6Úì‰ úC½iðô×[F-÷žh¦OﱨÁm›-ƒ)@;ŠÂJ¥fGFŠæ5R¹q¿¡óZª=¢Í¡².ɽ‚Ãdn`–ƒð‡°C±B‰›Së_ݨ
,~t'x±yZ3nüöx}†eoÍLŸïܺfjÀ¢|H©|©JG¯Ó9GÜã`o˜[aÕLÖÐ@êi‹°¥«é}MÓ„“^&xédnN2eÄ$v¬6î×õË vGŽ2Çæð½—9ØPs+s™”¹ô2·£6{‹Ï‰]ÂDË…Øã‰Ig, ;·;¢Ês¢/X®ÌLjÞ.ÔKÄk)6VÁQ$2¿ U/~Ír+›“Ê?Ô´?@¯á ~ ÂCM¿M·A´¯·Tí×@Åm=ëypV£ãtÜìæ-üÜâ6GøÕý>aöàˆÂõ'T=gFx‰“>h\|ãæ4æŽêïÁ©£€XD^^7L3†a¨Ð÷µÐ›)3¦…™ Úî~¬òUu8ÔÙG¬Z‡_â©"¯ínNÐ[;Òöô»s ùxø1Ø9îˇ¡?ø/‚¶à¦Ùˆ9€íÈè›ûèû¿I¸lÕP“G²«ÚG*‘\Ê8‚~Ù¢IÆ¥·hˆ Ià/ÓV¹¸ßOÓ§ãþØü3¹Bþ£¨o®@ý—¦`>ê…µÛ)ÔsÔ—'ÔsÔ»ÕOî“€ðÒ#¼ˆqòÝ{¢ÂKÚ ÛeÁ8f臓+?SìzΈ`"8íž4Ì +ûMä;É“À…à +@S”®÷Ñö‚KÇ$ó‡R^…ëÀôÞ/˜t›HÜËzI$P%À‚×_mÿv'‹ÊÐZaº ƒ)8ØÕ‚ŸŸÎ)?›³Ô``ó0çGG±4Á‡¶Ÿ@RæÿË +Œ€T/e›<õ:"?Ëý,YR¶ â¼³±
šU}–mò4—G\0 +Ñ—ôÑ×Ï
‹d²üüÎå,Ö3ŠJÎwºdbvÞ}Ó=ãZØ}°ì ÓÙż$÷üÅ‹ ì8E6?‹B5(\¥ÉÁ?É?nl.K©ÍeYr©#Yº£˜öÀ°(ûz1ê«Ä˜Ä^‘ç,³[ˆà+g§»ë·õ˜@`ôbKþßCàÿ-ü™Ëðw=úÁš‘Ì}fz†O™ ø=‡–2 +k:›§±þ.O1–§bøêµmø.Ü£º¨mIAXTøŒ¼5aS®r_Œêoé×Ì,WæŽXÊhsU²,›éWß~h›®þ5a¢ìmÒÌYCìRʹA™û}¹qH3(uŒÎ¸îÔ¼fÞð•—'æçû;¥µ=^Ê.•) +g.àz¦®õÓö>Ûó1ÁÄ‹y’«ƒ™}õK*ÖfFÏ¿–¥°öÌ©°'š}†˜Ì?RÅj(×Q*ÖÁ‚õyQK¹¿¬Ä-T¼*åA‘*ùgð…/&Nh…<#Í-4ÑP2×qˆ`Y%r)¢§eNPÁT¦²w¶¹Ìg¹Y‹Lm]
‘¸vJ¦Bì´ÃŒ£Tbõ€ù»' +³ÀãÑBƒ²VµҔ¾ä™Àaî÷©µYÊÛl8Ð'ü” +endstream +endobj +811 0 obj << +/Type /Page +/Contents 812 0 R +/Resources 810 0 R +/MediaBox [0 0 612 792] +/Parent 824 0 R +/Annots [ 814 0 R 818 0 R 820 0 R 821 0 R 822 0 R ] +>> endobj +814 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [230.341 629.496 252.259 639.878] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.4.4.2) >> +>> endobj +818 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [344.32 415.86 366.238 427.735] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.4.2.1) >> +>> endobj +820 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [308.834 357.222 330.752 368.126] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.4.2.1) >> +>> endobj +821 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [382.382 333.312 404.3 344.216] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.4.6.3) >> +>> endobj +822 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [308.025 321.023 329.943 332.898] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.4.6.2) >> +>> endobj +813 0 obj << +/D [811 0 R /XYZ 108 690.907 null] +>> endobj +815 0 obj << +/D [811 0 R /XYZ 108 620.723 null] +>> endobj +816 0 obj << +/D [811 0 R /XYZ 108 525.886 null] +>> endobj +817 0 obj << +/D [811 0 R /XYZ 108 454.96 null] +>> endobj +819 0 obj << +/D [811 0 R /XYZ 108 395.988 null] +>> endobj +823 0 obj << +/D [811 0 R /XYZ 108 209.433 null] +>> endobj +810 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R /F11 600 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +827 0 obj << +/Length 6115 +/Filter /FlateDecode +>> +stream +xÚí\[ëÆ‘~Ÿ_¡·h€nß›4°»X;ë +ä.Î¥õ×÷6ºågŸsû¯ö'þûC>åò—e½‚^tU}Z¯Â,Æ»´žzÞ}úTõÊ}”N¡FÁºª¾è2Ã2[)Ý€m>TÊŽlÓ˜»®\¨™oVUN‡EîDø}[·Ãë¡=ºãþïëþDÕü]ÀÑåéÁNöÀ¿ÿZµQ‹Ä2sá9µ¯œ“9ןºÂ–ÒS×U
…-ŸÜc`X~¹Ù¯:)ºý ¥×öÞ¨åw÷Ú/¹Í/‡~—z^7«o÷Ý0<HpíÒ¸mß+¥66§Ó6M±í÷/ÝñÞ©eÙî×Rí*Oq3ͯýñ4éC»ÏØ0 ^h{Ôºj|` +÷çÝ»îˆyrËáüòÒ
'e—Ÿ?´ßwRx¯:¥Þ ê^/™.ª2¦<K”‡lN¯2!!Íí.•¶ÝþåôúWÁd©aßuë4Á©O¿í·´zw=Ùæ¡M%ª<Sµî†Í±#ÎÙ˜XˆvñصC'5žƒ +…³(¿ûž~ëå‰)Kå´™ +œõß#ýÈH﫺ÊëŒùÁù€ïé„ÝLÝò1›Íœ–ÀYº²…Ó*UëÑjiW~n6þ1úÊÚš¡IÇí÷lâX‘‹Ž%jYŸ¬ìµì‹m½ëº}² +íȾ[?HËæ$ðU›:¼K:\ŽA6û¬Õ7IëÓ/çcZe9iWÇþÒ"d;Z±qŽöTJWçc1ÓuC†‘¤ QËç~»íïa+ßÒ´!ÛG-6d^¤ÖJ«ÐM€}Ð8büw›þ<l¿—Æ5$m™˜ ÷›íVú¯ÚóæÉ$Øz½´¿KõLç>ÏÅz
íŒáúí†uÞÁ¾{¢X W/!Ąܱ=uh'~hÅkÅl6IÒo‹ëi–O÷V/ÿƒ‹Ÿ±gùû‰út+d®®b“%Z\‡ã•pO3*<|¯aƒ.¹Á‡_éÌb„þJ\EI¶ä¬úÝaKÒ²ÙW!'†Yû +ÛQXovðå6=ûs.ŠÆÈ,!Ñð›pá,%õÒ˜‰fB¥=vRP37ÂÃ/|¸Ð$·<ó:'÷=váߓ#Ds³¥Æ參A«ËOÞùFUIÓÓkÂ/w”6iÖÓñœ!Ï ’;O˜ +Þ¿Q· +0[@Èg`r’ +dêúS}è-ÅDkéøî{·y¶Ý®¤œ°àÐ~ÝÉ ÿPÔ™€xjqß]&ŠÂF±¨h”ÛÕéLW„RãÒ2HŽ@R¨An„ðS®€Q–+MÁÚ{Z'¯gi)´]K¹Û'YyOÐZ•Ë%Ð¥HfiIJ`›ååæR1ñûž¬Æœ÷db¥Œy£‹û1÷çÒø^ÜÎU¶ØævÖ{ Uã?Ûÿ¹8“ &]i3#çlF7G’HXÇ"°3~K«`Ý?7>øÚ‚_ÓdC/øaWä©8 T’GèðÍ¡k¿ýUÕ_¯æL7æ§ÌƒoD¨Ç'-rßù+º¯dôS¹ù¡;{i†Â¹žáš5•-wîÿ4wï#|3Ʀ;Öì °kÿ¶Ùw™HM¬tí6ì)1,¹Z(Éõïd¦È“u`…“Tù¦¥k´ÆyÝeþQÃ];ÀÕÈVçÑÇÊ}!’SÛÇ7×Ï3…ÆöñçÃPig~ä +MøyU†²~R•C?l¦çôAн¡äˆøfÄžûlr=M%–óåÚy:c%½?£ +Å%Ô•ÅrÊù‚xxHç7jæÄÔt¦ƒîÉí§E6û½H Ù‚œ• î#AŽ©7ùÞ0F«S—ZDŸøå®ëN)WrÁÑÖDC…åç'é'F’ì
Ésrj3ìxÄ/3Ë…d8äõ"ò˜DþžõŒˆ—§®“'IxD2‡+©Ïûá û ˆéPý(Ó36ÉUÍO½Óz£W»¹¹oPõp0ÙÌߔ֮ò>ðm|€ÙÊ!äª?~;¬ŽÝû¯~â£Î_.K¹,ý×x(`”ªbð +ND}³‘rÊ@«Ã/Rþ‹”ÿ«?ªä5ŽÏäénsá7¢º“$ +*æÜQÜE@é4H‰½†ˆ)È—Q͘>!ÝÓJí±?³lš<ÙËÄ!Ù(Ý«ÒŠ”+yz-¨ïõC·i”òÉuB˜65bÕfa”¢ùÕînñ×En¥¿%5þÂZÆ@ IŸJñÿ‹~¥ãmZØÝÔÚ-LÕÔu¬»±dƒL#B@í£t°èêÁF#.GÝÂÆ®ÐßøºFÕYGád¥ÑÔ§¡ŸK«»ÇëÆÇ«Áד?^¯þxÞã52(jp Ê,¦ŠØz\ÇTÁ„ù<ˆQ1•wVûEÁ•Ò&u.ÍWm—cog¿FàÃ["^ïžïˆMQiЪT +L´qæItű.DÐ`èb³È3`-Wû¼~½‹<@@Ç€3²ÈH¢®è’3“‘ëD6‘™ë™ y|âR™?s1#¹œ¼ÞÙ@g´¦VŸv7©kµYPz¡µT7µé´bë £¡IT\ðÄK„#TZ5²Æ‚·¾jb”½àúêÎj:
¹GÔuã˾ +Ø$;YÃW’j2› Žch îRå©ã"§¼Ò ›² +Y<ÃF,á:˜’ ÐD »ÌÁžr3.Cþ€vµŒaLÀðºVaQP%UG·µ™š\gÁ¥KfI™$³m²NælFed}ÂõjwÒžEPYij>À»)âF€óJ|ÖñÛ¯è-¶á‹Æg˜R@`‹hƒk +á\½(“°wÇuÀ:C#¸ãàL\l)šÒ1Že +ÑL´W–#°@±†ÌL‡\“ŽŽ²ºjÄ¥†‹Ûì˜PdæàKkA8vËC TSLÌo`SÂÜäÐ)’õÓµÌʱ$Ü&§eFv1¥‘îgæ2çŸÞD¬t“F[B + +endstream +endobj +826 0 obj << +/Type /Page +/Contents 827 0 R +/Resources 825 0 R +/MediaBox [0 0 612 792] +/Parent 824 0 R +/Annots [ 829 0 R ] +>> endobj +829 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [188.517 452.492 202.963 463.436] +/Rect [233.179 601.571 243.042 614.335] +/Subtype /Link +/A << /S /GoTo /D (Hfootnote.12) >> +>> endobj +828 0 obj << +/D [826 0 R /XYZ 108 690.907 null] +>> endobj +830 0 obj << +/D [826 0 R /XYZ 108 569.465 null] +>> endobj +831 0 obj << +/D [826 0 R /XYZ 108 487.126 null] +>> endobj +832 0 obj << +/D [826 0 R /XYZ 108 250.012 null] +>> endobj +833 0 obj << +/D [826 0 R /XYZ 122.346 135.465 null] +>> endobj +825 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F120 538 0 R /F95 412 0 R /F11 600 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +836 0 obj << +/Length 3234 +/Filter /FlateDecode +>> +stream +xÚZÝ“Û¶÷_qo–fN(ñÁ¯tú6q’N›fìËS’S$qB‘* ú|ñøï. H‘’îǺ°\ +ÇW†¿?¼úË›TÝ%,¢»‡- +`B¨^ÈÃæ—…ZÂsa°x»üí៖=f<–È.&E²‘ïÛå*â‹áW,¾±¿ÔóÖÒ?Ø_ýn¹’±Z¼ùÁŽgû~¶¿omÏ·–~×Ï×//V,C7)BDr!#ä|õíC¿Ñ0PWõ K€Š%#–•IðÔF,'µq0%Vo2`ŠGwž ×÷+—ê°=ù§àó')?㟈©Ï¸X½âœ¥aسnjÓè¿ñ£¹ÄÑdy]ÖͧFoHÄœ,£7Hëò©,*ýéW8Âà^2‡]Üc”¾‹ä. ì§^—YþûÌäQÏ›×EùgáoŸäÑÜãP2l +ç„ÉŽæóå…½hQºÚXýöv’‚X»\ OÄðDÂð€ÈŠÁ†™ý
´pÖýn`ÝiŒBdb”Œí{k’_[óüfÆ 'K +¢Å“Пú_~s#)Kžµ
¯}8§KÒ´ß?g’•"Åh>Šñ”ìôÍ’‡‹º"ÕÂì5áâØ5ǺÕ-u×[ê5ûÂõ´:7E]ÝS+£áMÑš¢²ÔèZCÔÚÉ=dM=EåeºŽ_ƒ@캦gÌ›%_Ô-5×Ú<jíľ¯ºz=r
´—¬Ú,W"–‹÷y «ß¼¦Ö13û–!ðè}QfŸ¢ºÑåÑ6]SµôŒ©©³0-ÉØéÎɪ‹Ê'¨Çj‹à¤v +Orí󧼜sõsBñ–ÑNtáäWÙÁÿXvíWç€B ++÷ª²W£röN½,2pïhÌ̵ î‚Î9ÐÈ‹&‡ý番˲8¶ú(µÔt™wÍý*u(ìý®1¶ÕÍ8¡c¡õf§/sòQeÓèÖé²–\[ÕJ)Sj +wîê/a×
hl*A¾HÌîâš^¬üK§h-5z Sfà•.~YN(^,î¢ùÇœñ Ì'¸ß²ºódƒ×²ò¦öÈT›¹ˆÌY&“õΟðH,sŠ‚p´6Èð$e§Ó ÄѼAT‡MÄ•ø—p¥Hc+©;Ï*ê D=‡@GG©Ñ£çB—g£)Ð]eG`Ú’Ò=šÏ€›nŠF›ñŠz +2ºáG—«BŒ=SûˆAr_˜E;®ïR>ÃhŠùóŠ…ýVþ¤;Ž“Áià”ÙñØÔ‹Cf´ß•Z0D·¤=&;šQG»§B¶8#»&{ZÂ}wÚdg> +¹>:NC®e¡eëíì_ʦ³÷.fä"!RˆÄ»Ck²*×Ëd +ÒnÐãdz¢† +¥m‰+«æ0#ä‰ð°ð›:8 +2&ÓU€ÙJ¹<\ò/1 +iÊÂ,~L^hPm1’ÚÔ•£²uÝÏ_´ÏF?ÅqüßIÜ? +¿T£±TÎ/ÆÃ:Q<ò‹Øôu" iíDS˜Š 7æ9XÕ\l‰ì9†Þ
Û}õ(ú'ú<ÆÐaèóŠÀUú±¯ +endstream +endobj +835 0 obj << +/Type /Page +/Contents 836 0 R +/Resources 834 0 R +/MediaBox [0 0 612 792] +/Parent 824 0 R +/Annots [ 840 0 R 841 0 R 842 0 R 844 0 R 845 0 R ] +>> endobj +840 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.319 289.746 284.765 300.65] /Subtype /Link /A << /S /GoTo /D (subsection.2.2) >> >> endobj -644 0 obj << +841 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.56 452.492 234.006 463.436] +/Rect [305.049 289.746 319.495 300.65] /Subtype /Link /A << /S /GoTo /D (subsection.2.3) >> >> endobj -645 0 obj << +842 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [262.967 253.881 284.884 264.785] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.4.7.1) >> +>> endobj +844 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [240.87 381.905 255.316 392.461] +/Rect [333.6 194.852 348.046 205.756] /Subtype /Link /A << /S /GoTo /D (subsection.2.2) >> >> endobj -646 0 obj << +845 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [272.69 381.905 287.136 392.461] +/Rect [364.389 194.852 378.835 205.756] /Subtype /Link /A << /S /GoTo /D (subsection.2.3) >> >> endobj -647 0 obj << +837 0 obj << +/D [835 0 R /XYZ 108 690.907 null] +>> endobj +178 0 obj << +/D [835 0 R /XYZ 108 575.947 null] +>> endobj +838 0 obj << +/D [835 0 R /XYZ 108 387.569 null] +>> endobj +839 0 obj << +/D [835 0 R /XYZ 108 328.541 null] +>> endobj +843 0 obj << +/D [835 0 R /XYZ 108 233.646 null] +>> endobj +846 0 obj << +/D [835 0 R /XYZ 108 174.618 null] +>> endobj +834 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F120 538 0 R /F95 412 0 R /F11 600 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +849 0 obj << +/Length 3730 +/Filter /FlateDecode +>> +stream +xÚí]ã¶ñ}…_Šz5KR¢> +ô¡iséÈG/ @’µÕ“¥$ǹýïáiJ–wÝô®½Á+rH‡Ãá|‘V j¡d¶Hr)r™.Öû¹Øø³ÅÍ+l_>¹¿ùÍ«<^d"O’Åý#"ZÇÉýæ»e|ãŒ\¾¹ýáþsÛ=*°»–"Ò)àÆ~ŸÞ®µüþëå킼±å×ö?µ~v»ŠÒxùêµmÿ̾µÿßXȧ¶üŸÏ“—Æ"O
Ï' +üÄ´¯ié»íŠw·‰AN`õÞaºâ1Äï¡g@ųÛýÓaÀíÃÚCíjɵÙã‹©—Í+9s§£h63øVQ¦D¢âs®^\¯Jy½P´~¼ÕÀ·úPöT·ƒ/ð¾ç1OEWìKà8wY·]‹&´Í†{·ôÅ
PÙrmÈp«KœâÇ[e–e=ž¤xhLGšýjÜvÜUC)¦ê8Ρt¾HÀ^¨T£Æ¥¦n» ›@9»Þ« »SЩˆ +Ø"ÙOO% +ÈÚBØZO›q:old;gc)R©®Õ9húÜ«Ýb ÄEWR¡+k`HpßÜÚ,î‹çØx06N>ƒ*W +ÂNœS^Ÿ0Ƽhds¡×ë©k7Z¨»$¹‰A‰¤ÿöƒŒ‡t¦W: +±„3 *Ñö•ÚÇÉ +õ^¦k¯Ë¢˜;À‰ÞwÀ-Q{ÆË¢ŽSÏQ>¡/›@O¨º¦‡å ‚‘€™i*?”;:fU‹J€mçtCµ>Ô×',CÕçðvgN÷a³ç +-j„<ÂY»O•“^è °.š¦¨üPºå¦Zƒé¾£º•s,m‡ÄJ'¼ó
AöÅ[4Œ ié»= +ð–’Ìõ©æü© +&Ô{¯Ptþ*TV' +¢/Ÿ ‹r¿Ú#±R›œb‚ú +ª5•ós»–Ž\í;Û¶±ÞL‘OÛ‚rÄU»5PpV¿§ª5û¹”¨28 ž×ÎM>QÁg(¬ 2Š~u?…~¡Ì0GhÞ¿)
7Ä wšq"2\!/'v‰Hpç³øšD$ù§Y&29Ðç’“1¬Kç3²yÁ®¢è”ŸÔ‘~>? AµOù)9—¡´Éç8H™ +úÜ"p×ò€@9g€Á.Åæ}ý;š¯i›Tªà `”G‰.äQ2 <ºb’{ÂÙ@é#hœÏº¨Ç ‚&κîç$ȳ` +ƒþõn&”Š%00»R¸ •]ÿtŽ)‚3ú¢Œ'áýÆ$¨dü%B Üç-²èÊ n†Šªä¥£îÖnlH„^§}ðÀR!£¸aYbòÓF–Vbê“ÃJlña%V +N r܈ Š±ÄÞ%”Ê¿Ð(Ù«¬[SéûC0VSRü›b-úS±”ŒÁåºB +JNÝÚít®æy(iõÊ1\¨Öo{݆U4læv›l¥bÅ_k +°€ÉQçKn«J0qè·Ú³3g–F‡GZPRãyб$gkì¼À5îæMâ;c›’šÜ{vnGœžO8usyÄ~ ->”ñ´Ùçœrݘ?¸£ª³ÐPœÜ?ÄÆÍytBJnŸ–NO6ï÷©É4"~î:&J¦ûxít=kQcxoÑÅhX0\䜎 „’zÄì÷¨G~¬ˆ½qšl +XG»)ð•‚¾³ä‚Çhü=ãKd^¯#§Tê稜
6c™çbwÁ$/sþ] +¸ÄànOB Î^¥lýC·|˜òÈÖ·¯ñ…ĆÁžóéýÃ|¹n:Ú=Q¨Ùmá]µÝ
îâ=Kî^1æÑ» mü5¦{¤ãÞÉc>íñ-¯JSr1óžOǬ ξ}×FÄb?Þ>÷;“X%nŽ6û·ŠÍÜa¹õÿª„D”[ß$Ÿx
³GAw6]ü<öØ]ë@¦°ò˨Y¤ý?fŠÞ. 3(hþuê•Ò|BðŒ8s§VžçÅ×(ÍÇ,Îã-Í€áZäq2·er¡…ɱåo7ßý èñùQž-ŽPÔç‹ý2™…Q½¾ùææÏ“ð(tæ¢$|°lDžÒŽƒÕÌÒ…Ò™ýñÈéYôèÖ'q +¾£ö}ÂN"Rðul):Ϥqƒß"uÊÝømríˆÇ%‚Žg£±5›{IïéPøŽ~aâ°á› /2—ˆqÓõçKJIL>ÎÍä`OÇÓ#@ûå$~P^&ýë@cŸ¬{s.©GÒxz=#½Pžˆ”¹ö29]‚Ú/0Ëæ§ãÍP£ËåNËïÎÇF"÷ú)ÕÀ»àͧˋ&’-N2§g¸ƒìbÉ[àß_É¥¤Ï¦lÚÁ)õº`¤|ÄÆqGÎýÁžT T¢æOêJ§BÆù\c”OTò¿ +endstream +endobj +848 0 obj << +/Type /Page +/Contents 849 0 R +/Resources 847 0 R +/MediaBox [0 0 612 792] +/Parent 824 0 R +/Annots [ 851 0 R ] +>> endobj +851 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [427.625 274.676 433.802 287.469] +/Rect [495.133 617.019 504.996 629.783] /Subtype /Link -/A << /S /GoTo /D (Hfootnote.8) >> +/A << /S /GoTo /D (Hfootnote.13) >> >> endobj -642 0 obj << -/D [640 0 R /XYZ 110.999 687.904 null] +850 0 obj << +/D [848 0 R /XYZ 108 690.907 null] >> endobj -170 0 obj << -/D [640 0 R /XYZ 110.999 621.592 null] +852 0 obj << +/D [848 0 R /XYZ 108 525.06 null] >> endobj -648 0 obj << -/D [640 0 R /XYZ 125.345 138.467 null] +853 0 obj << +/D [848 0 R /XYZ 108 382.36 null] >> endobj -639 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R /F11 537 0 R /F8 534 0 R >> +854 0 obj << +/D [848 0 R /XYZ 108 264.002 null] +>> endobj +855 0 obj << +/D [848 0 R /XYZ 122.346 135.465 null] +>> endobj +847 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R /F11 600 0 R /F8 615 0 R >> /ProcSet [ /PDF /Text ] >> endobj -651 0 obj << -/Length 3399 +858 0 obj << +/Length 3416 /Filter /FlateDecode >> stream -xÚí[[ã¶~ß_160fDR©¾µÙlv‹¦ v§@€$[c+KŽ$w2-òß{.$-YòÄIgƒ<XE’çúñ#o"ø“7RF"˲›Ô‘EñÍzÿ*ºÙ§/_I×$JÅP‚O»{õÙco¬ÈÒôæîZÜm¾[èå*‰‚~“åJFð|¿üáîïÔÜi46W0Hl]Ÿ/–«T.þ ¿jñš~¹æ=•ßÑ/ýr¹Ò&^|E/]®”Z|Nå÷Tþšº}Ã…ÙéD ›Æn<e°Å«/îÂÊ´Í„1–×v¾ì•Î"E - -1PɆëÏ`=\ÿº©š&£ãEÙñó¾Ê×—?4î[?nÓúr_þ§Øð냧Ñíóªââ¦é]ã¼*·µoÚ;Šý®à¡üi)“EáºmÛÒµüdQÖYd†D‘¡`U<ÿ¯ÿÕân©%rŠoˆ³_QHøè Ä©Ð:u„`4éýn:¨Ì0ôâÒJ+¥ë°š[i› -iÍÍJJ‘% 5ûf0çŽúá$v¼VN< -x^t®†ž–)ßê±ìw\Ú¶ù—òz3ì -ò‘“递%i:£›ÿNU=db®6p"3&ÞˆÇÖ2âÏ€ÂÏ3\‘•¦¤Þ»¤.„CÅ3j™B㗛̩¥LÀ°ô@- «eôm.k-ÜæyŒ€N¯geU±?žªQ"ŒÊÂØín.Œƒ*hûª<„Èa€uStâ·`a¿ƒ‰M–l• ò¹[¡¤_ðcIá(Úfs¤ð/Ý.çe俘Ž¶’"*à -ÐŒdPæ~—÷ëÝwS-Œ#‘ÆæÙs‰`,Ùu‡)%
fz>ßN»õù—*¯·Õ|ü‘Ú<?¿”fxÚ™Ê+y1ähëuLøÁ ç™ðت@„‰Î¬dA½^"´´Ôé
¨ÅS½Èù±®šŽ´Ê€çv\r8JÅGòôBa04náavx«Êºð„{~:ܽr¬K¢¾7‰HpùÎ7ìÁe:Ž…$GˆLܹġ…ûq£ˆ¼šÌ2çÈ¡âþ‰Ÿ4ür‘f‰H¢xàÚÉæBÍÈSCÄy¹P¸Ð!<xsð󘣿Ó)\~*û›œ -G3 -*\á³–Ð(‚{ºi¾äØ9€L;>xbÖ䉋AcŸŸwœ3‡'f½*ØpWOCZ°½ ; -›¥Ñ>eÎ&ƒ¤õŸâWpZ"§Íx_ŒœþéO_ü{C5+T³Ñ -ý™L×iº7Ñs±Ä{Ã/˜$ŒúP´l¢™; è¸\R: -»ËÙ…LÁ -÷MçÉ“ŽBÁ¥ Dæî¥w#‡[0ã7¤3šZKV½-›º›I• ž™Q+iD¬½âæǾÙßק<ò(ah„ -ۑΰ;³´a¤Ê‡`‹§é9å3±ˆñŒZ'sÙBY»KmŸOCu&å=Ä[E-ÜlûòÒm¶;jôÖžNÍU‰Äx®¼žŒj -Zììµ:98ÜVŸ3)ã®1@¹cLh=pƒuS£Ö;uèI°>çfÛ¢Ù}[®¹vSt붤W”5eO6.ª!ÁÞÍ]®KD¦ÕËŸ_<¥ïw|!ïšám¬…{ãÓm¶ -u†ðƒº!ZÃœr£žO6VƒûF¿0À%‰òjðaB -|H8Ê·‚ƒËýæU…‘ätÆ70{wÍ„AꈻEHîP™ÙÏ‹oNÙp¼0Ýe -¢œd¦:p?äôf®@Ñ)땈ŒÏƒ¡ÆÐi°w¨ãÓ`_û-O–ÎRêM73²¤‹µWí^~¾´!±É(9ô.œ›R”óØå¼ÈåùùŒ$3…Ô*à@ÂAÑéÞhÚ‰Ñ΃y?ÎÄ$¢P—˜ÄTÑ%tx}’}‡Ëe´1 à -ÌÎN[2<)ÚÜ©|ܵëêIGj{l]wS/ X;FŽ|Þ“¹S¥lÁúSlèXÉ>{¬”ùH%¾¾7 ³Þ$í¦vºÛ‹-šý}YûU@…¿5tD&)ÿAB¨—²Û -qpòXœU.Ôù,jW°í$«HÖ
(˜øK(FÁn0D¢f íÓãŒ÷ÐаjÖ|Òf!~vxàwö€¿(Ssÿààÿ¿aôßÿ²åzendstream +xÚZYoÜ8~ϯð£tsEQçìS6‰'^ÌΉ`2²Zí¢–’zc#Øÿ¾ulÊ¢ÛÎn`À’x‹Å:¾*¶¼áO^È0¿H‹PavQí_…wÐüó+©»×Ø¿vüãæÕß®Šø"Eš^Ül‘€ˆ¢Ø¹ÙüÄ—0/ ƒ«Ë¿nþIÃ3!3EáT´qÜï—ë4 +~…ÿ2xCï7ôÿšþÿFí¿Òû§ËµÊâàµo-qËK*…ŒMüÃrñDÄ*ÖÝ¿uX#2«ÞP˵³ÄÏË%”y®4
³‹D…Êqä«w7VpIŸ•+ö/ä*á=qš“¤¢H1PIR*ìg©â]9U;ËXŒÑÞŒŽ2ÍØg>™‘TBI;HÝ?E+!œ;lFØeœ%?Ƈ®ï.e<ìaÉ›¡Ä¦¯zhÛt5½ÆAÓÍfWC?ŽkZ¶ÞpÓ¡œ¦zè]Oü4«ÖH÷¾¬¦ö¦])÷5¯QŽž½®óBÈ"
–¢H»çáÌž³çm߶ýe;".A•o<k$¡R:m_Bü86ÝSåÍÀm†§%§i Ï™=MVF¡CWäibúaiÖn<,)©Pä±QýfÉ`*T’êî²Û, ÈTäYöBVª¾í‡%HŠ(}š¤ZË‚î
ô‚sqñ=Š˜$¨¢"wý±Ýð{×û²EEÁ¯ÛšŸÇ±ÖýÿFñÔöƒÍŽ‡r@22€i¬¸gb5ž¿žÂMÍ–Ÿe‹ +[NÍiĨ{½hy…ÐýeÓ–·nF»dáÄ!,H{”1™¹»ÅqWn€5´/4ðJïµ6º< èèèY$8w€‡¾ýflúiÒQÐw<hêºaË
e׃6ê©ŸÃ0j[Kq_‚Ýò+Ù%Œ(Û}?Nši1'+…¦¯—2J²8QwoÊx >’Ÿ€çD3iLdýwMߺw‡š<ê'C)bë˜ËãÔïá€*R‡…¦%™ˆ®‚‘hG^Rï%¤u[¸Î·ÜÿÞ‘yªÅ’åÄßm]²t2x5í»KP‡¡wv3Vâ‹RZN)ñE§G7²)„"‚ȶ–¹H³ÂYp‚þ'λÒÁ÷ÿŠŒ¬Idbï{Šp¯û³{mF]Œ<á7½5Ðqu)‰P¦ãù/—`F7<î£3΄íSËGÏŠË£]ßY&ÉRdÁðcÝmj2ßÅáƱPÖSѹä¹>Ö¼C^2à3oRPaÄ¡9pm/Ð^ò°»ºßã´ih*nÙÔc54‡©!‹‚‘MGªmæä6(-Ás®»Å™Dy‡b|ü¿¬pŽ(©Ï•Á*VN7ž}ƒWƮ̶›‘ULe)hœ™â¾.É°€IËæXñ®%Gk™·Í„»&í‡Ïªp6 e(Ââì$m r6 ½€¸jèŒS?Ôš78»±æצóEa`%4QøÐTÓq¨=Ñ%™4ÊÏžyhÐ3èfWL¿n´„÷ÛÞõ8
ƒþ‹‹ÁœíÚÄ)TM93`íÀ"¦$Ђ°ÎŽ(XØÐáÖ±-=¶îgÐKNžÄôºúD¿j{ŠvLoÚ ~½†
xT/<XDçUzŸž<¹ŒvMnâEvsí"fY%AXaQÌTòÂK¿Lú6 +ò_†ÊQÀ*To~ž8˜b½Ue7§S²¹cÔéE`RÖ¨GôûÛ¦3»ˆ†.Cc$lvõ}©”ú`‚Yת*{ 8ž{ Âÿ1È
æÑàýÄz¬´…€ïÌI&kÏM$º8µþÁ̺+þ¼}ৎH¼àªI©D%Ž®Yc÷ ÛXDNðZ7|^1ó¦F%A;"ùǤ&ÄBò`35 p`U1xÏY–Òlð¼Ã$(}aYI‘Äï·˜½öÛ‚Mͬún_wÓŠi¨>aJa¿YÙ áV/^w&êÑ°Ž[o‡²"†6Ò@hDøm2GÝŒÊ*¸ñ·ãôì¶B‘†ÏìàV(ð„. x´?öyÚ˜A»¶¿ÅCÀwÌ‚÷Ä8#ðäW¨¦„âÜTNÀÚzÅåv2j3ÛU†¥±Ô§cßÈ»•ã®ÞP;¤¦µÇSKtŸ6Êè"MÎ*ÈaÐÜ@§B·|R5CÕÖßÐ7†«Ðô¬•ƒí¥æ[ÔÆ¢S@£*™IE‹”8×јâ÷S Öi³(ráÖ³½6® +Ã¥Ê7™_§ç»:tàqt˜õèÉ.À)ÈÄI¾ð\{:ô)ƒnµ«@åtüÉ[Äaãé£÷Íg`ŸwÛ¦mÿwþ”4èз¨¸B$=kAô2ôÌ +eIý_…|€úö`懾b>}o¤Ð‡óú…»ìí²¾—ƒ·c÷¥cÓhëT Ç»8[¹jC‚±9á¶MS•S½9Õ0}¨0Rfošï—»ËD’™#mºGŒž‚cZ/ó$ÂË¥SøŸ¾s)öÀ¶ÊŠÅ T$ñS™Vê¼Ki½]è +Ô"Ìå÷òý>ÜÔÀåã{ƒÿU¾©aØ<¿ÙPàa¤zfcÉÙ%båtBß[Íôlé³£<-~Ä"V-ÌF·:l{v™‚ü¸IÌãLf/²Î¥t9”û’Ï +¤êù³”äü¯o’s†¢2ùB…ú^Cy†¹œØðÚɬ&é–-V,jº?Õ²_ÔÉ”Hä™›ìeÎÜnÖrkª/óÇ%Ú €(qËâ3°”(${*O^¨!ÏÛúyÎ7ž1þÐ'Ј¾X£e4m‡Z·9ZN=2 +eA¼v0‚rè¿1Ćz:z½éá`–Ø>þÍ%þVµ +endstream endobj -650 0 obj << +857 0 obj << /Type /Page -/Contents 651 0 R -/Resources 649 0 R +/Contents 858 0 R +/Resources 856 0 R /MediaBox [0 0 612 792] -/Parent 622 0 R +/Parent 824 0 R >> endobj -652 0 obj << -/D [650 0 R /XYZ 110.999 687.904 null] +859 0 obj << +/D [857 0 R /XYZ 108 690.907 null] >> endobj -174 0 obj << -/D [650 0 R /XYZ 110.999 266.968 null] +182 0 obj << +/D [857 0 R /XYZ 108 587.38 null] >> endobj -649 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R /F11 537 0 R >> +860 0 obj << +/D [857 0 R /XYZ 108 516.087 null] +>> endobj +186 0 obj << +/D [857 0 R /XYZ 108 411.788 null] +>> endobj +190 0 obj << +/D [857 0 R /XYZ 108 242.14 null] +>> endobj +194 0 obj << +/D [857 0 R /XYZ 108 194.13 null] +>> endobj +864 0 obj << +/D [857 0 R /XYZ 108 170.658 null] +>> endobj +856 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R /F11 600 0 R /F105 415 0 R /F8 615 0 R /F147 863 0 R >> /ProcSet [ /PDF /Text ] >> endobj -655 0 obj << -/Length 3676 +867 0 obj << +/Length 4443 /Filter /FlateDecode >> stream -xÚ½ksã¶ñûý -÷S%WBˆ—ɇk’Ë\&¯iœi;M?ÐeqB‘ -IÅVoòß»‹A²œ“ñŒ °»Ø÷Âô*‚?zEiD²,»ŠÓ„d‘¸*ö¯¢«;úâ5S"˜€ýýæÕGo“ô*%Y_ÝlÕŒ›Í|¹–Ñ‚¨ßx¹¦<ß.ÿ{󥚞špœÎb’In¾ùa¹ŽÙâø¥‹OUûFý¾S¿ßªþoTûûåš'bñÆ}ÀŸ¹Å,1%Tdfñïæ›K"¸0Ã_©Õafw½Q=ï¼-¾˜oÁ9IS?`ËÒˆÒ„)Î~õù#O3’ÀÇQˆ¦kžE$Š4IãÌ'n»qŸ¸y£!I½1Ê ‹3a¿=T…ƒÖÍaÌIÍœ²YŠhñKյ;l†4Mý’.Zݬý,`;Õ¸-ñ™À—EÝöåÆL³£ðe—e¯_³JWöCWƒþ´Ìp—7w%ÑíoC_mÌâ!Ü8c$ŠùãÈy,ˆÌÒ«5¥ÀT2„$ðaeŸ½~æúqW··yÛ SnÊáDšj¨Ú†à†WTL³C¬vx»¤rÑv˵à٢ė‡|¨K §¸6]l‡²›#•wiœ~¤\ôåЕͦìÞãÛ&ïwåFõïòMùëaÊ)5+»RÃP´û}ÞlæÆ(·ÔÛ°¨º¢.ßÿ²"xÐ
ì“J'–ø‡®]+R€ -{ŠšfUs§_:µ³NÿÊ®3À
» -ÎżlÊí’ÀÇzЧtµ±¦ ‰@¶Ïµ™ôÚÂh¶Ï=å’%ŠeQEXåò/¥>Þ(…ò5ürÐFØþJõ®ÚßÏ /"óÄ)Eõ$#)Ò\ŠÁÀ;¤OûIÄc%¦ØQ5 yÇb¨–ÌÒ`¥gl‘_qŠbì9»ˆ´îm·ºóˆ„í`&M]ÿƒþÔùƒ›¯`§ÀŒ£®I(‰¥¥ -$WÊ…2œÙâfwìWº©¬pì …„W¿yoºÝø!GŒŸT½î1æNÛu\@F!ÌKˆŒRs dXEêXAc R[9À›3Áu -àóØ ÿBð(™Qîðe){>|Ão‡/&<rVzÐ' 4Õ.Jî¼/¤´V”K -{æò$1‰¤EõkçÚ`$Å©ñ~ÞºPÎz7…™*–³zÝ?tà Ucô¤ -–¦zÒ3¤ŽùÛ¦6þã±ù©Ñ<få|É»*Çø¥vÞkWÚ%´[¤Lñ¦*òÁ:©ãqL´#Ê‹S~ñ‘~L¬Íªš38ÒVR êfõˆÍ† -›vkß¾óÂöp0=rr¼heáílq`/'É?x+}jøhš*°üõ}À¡KA“̬%IFÛB$ðÞLÎ옕°]@„}ßÍ|Êu]â[O„
@@#Ù3! -ºß=掜^ÆŸ"îs±Úo×ÚÑ<t´(‰(æ1<fš10Ž©2’Q¬½ðÏŒ3¡L‡`hÂ÷âQ˔֥ÏѺ҂·5>€¤$±3™—È%Ÿ”9%ÓÔ"±Ôn BQÀÛøÙ -S*ûœá~¾6‚Ǥ$Ï—°Ûô™4zRPäo‚‚Ò A9IÎå„y±3ûö4RÆwpŠ\^æ»yÀZhÖ³åÀá×q¢oÊÏù–…ø–°È ³8ô§Ä%ëgnU6±½|tL„5ÃÜ9&|±íÊR"‹ï1ÿ¨X\uw„î_4ùÞÄ -AÓٕñ3û
§ƒYQ'h´”H9u—Œd%£È«7VØ„ˆ=l§»òéPb7&säù‚™å†èþêøÅÛ(·¾¿ò¯í&ac…à\pA²ä¥õ4ÑŒ¬Ê§¬ªBNŠ©Å£â"r‰o/ý¦§;›ãöø?KˆK–=S‹¥A - qOCÛJ¹µ©á‘4_{0®²þÝ«sŽ…¢";†bœ¨&–ºÖ’*'\Å‘04”a‚æ¢4q’ƒ¥‰šA¿Øp@Ï2qµšT™-÷eÞôÓp=öD'š¡%A°va‘;ymZ=Ò·¸§ÎSãpOt~'Á‰ËEwÒ3óÅ>7!®š2Ù¸×} pÕœ±Û¸´††©¤ø¢ÚèÞÎU9TÈ
óUž© Äw6->êy)³Œjj½EÈl¥5\’<©âcNDBÿ3g›{
Ý!ïU> -Û›ª+‹Aé÷³ñê «Ï’°î -òøýÅ:ì7ÆT >©+ê -|z%¬’(I¥3=åÃá hLQø›vp…)Wžg€é“ø…œ‡Ô9c9m´IóOI,ÓË -߯]6ÊO(ëXºjÈ4Èž”¸tT-ÐcP>²x1иSk«’úY‘qSØ -œ
u|HøŽ9“pº¾þ_@˜§
T&an8àÔ\’×+ò^J?@p±˜ÛŸÔóeF-=±0z•Ñz„à%‚gaãýл{øỲ·¥Òººn¨ëÓ_Lö|}—ÇGj4©ÈØýëàÕé®îÜòÐÔ²ã·Ôï©c«¡«îڦݗ˜Âzc‚ö²ÊÏRâRáT^<ÊõxÛš?®¼5—Bа‚.îŽ*BÒ]ê"<7ºbß•eÿq@¹²4"éYÀšMùÁ#]2ŸÌ¡ôËQLâ…ŒJ›Ð
AP§îQÀCÖþWÈ.«Rž>®JI½µ7fôý8¡îN «Cº¾´¹8ù÷«%*Üæ"´£î[sëÆ”çô›ÉTg”Ïhš’(É>¸~&-=¸Ð}¬7D<öîJgè¬d³‚ÀLÈ°’$^ÊžŒY¿f£.WÛ[×ÁÜÞÄàJFý;…ÕvN!°œ”=·ÌsÛ¶õÅEÕeÙãåÜØ•×æÇщsžârCÂ)*SXÆ)ȲîËA&Bû‡DN âW#AÄsëöp†Â•£¯×A´xœü¹$ÞVÁÚéx?ƒœÿßGtµ–’£«ø¿ûo“ -ù?¾¼èendstream +xÚµkã¶ñ{~ÅöS½ÍŠQRš¦¹àŠ6 š
Š¢W ZY^‘%G’oo[ô¿w†/Qý¸Ý-XQ=‡óæÑ›þÑ¥72‹H%7Åî³è溿ýŒšÏ+ü¾òüáî³ß½ÍÄMJ2)oî6€0&»õ?â~G‹··ÿ¼û“žšp5<#œ3€ã~º]I¶øþÒÅת}§þ¾S¿Wýß©ö·+žˆÅWîlñGÜá")¡"3À˜OÁ…ùügæ`vÖ;ÕóΛâÛùœ“4å_g1<ÑŸ}sçGâ,]ñ{ˆ®LÄ
]od,IÄ5M‡m ³Á\›CSUÛà]T½î5Ÿé¢Ïwf`Þë÷Ëáioµ›É¯¢EyKãÅÇ}Wö=€&zÔ߶ù ?WT^×í-‹åÚ ÓvG“øèE‹±ÑDŒÇµq [ÛØê”EÞ’ÊØ|ßÍe°©BåöÉ}—„JËf€=|¿Yñ˜/Ž©)Éà‰ßvm‡ˆgÉÖ>tàŽü€ô0†mÞx¼”%?•„Ev‚¿(nùÆpPCóé[ËbŽ¡îæˆ + B@¿¾ãEoð9ÔMdh|@Ôò®Êïõ§é{KeOôë_ÛÃö~Ò£û}™ÿ\5KýZ
¦{ÛêµnmÓW½ù +09,cß6k¤ÿ1Å©L ¥é+PègnÉyÑDÔ™Ó¸Œ4ã¡œN¶¨=¨UIŽØwåR·ûv†u’ÄÉÐW—a8)Ê0ÓTgyýPÞwyUè×)˜Áù~ï$—bñnc˜”eJ„LÑI³2ø=åb³.7sìXF"fUv[‡ÎÌRð[—fÆ&0¶ãXclö€û| *µ³”
JµU×6»²P$ÅTKà˜im +Ϻ-àôªOêàC—‘vÐ +ƒhqK+%Ò` ˆVn€–¨j£%j«‡úÖýá¾/9 +<ˆðbüE>ipix
oü™ôG¡L "bøHšøàýEq0 +C¬ÇjØêÖ¿Bˆt¨¤8µ¿7à$Hæ{u'Žç¤ö* ñе‡=˜oD¿¾OÕÊL8=RÈ©-eÌ‘Œ¯º+s…ë'ó>?PØm¼ÿ{ûÖ”wë¹2HaàÝ¿\Ĭڲ”uÀû +;g¥‚ö¶aÆvVÑÂêÁ +ð¤éĵÒÁ×XgNfqWü•4Zʤcûf]!±r#ëCQÕ)ëÆ’Ä# +º;c÷ó +µ¥¶Òˆ·½c_v÷mÁoüæ88HvËզîWˆpGG1¹}–2àÜ““/”~9ÃKA€¨Ü^‘Õ4ÛÌjŽ)(•—€ý~ÂÜUs_lÑ4{/¨ù¹-«ÎF{&Ò0È31ÖZK¢n.D=0
ц*ä¨ð2ÀÁð„ót=G ÐŽ0ÖÍO°ß¥,¿ÆÉOð߆Ž÷…·’4N=ù·
:ÈiæRJñ¼ŒN–3ð;Æ|DgÕËê‡il `CCÀjîGT‰î.Úɶj×úÏ‹)½ƒm$.îæp²àLº€°Qp½žÇ”–Ç‹æ€,y¯üPxUHxàú%ìÍ +ç
¡d‰3+Ö¥Wa +vÂëJ‹b¨#>±}Ô‡ÈëR?¿ê(´jfWÍ®Z/™™%ÃÓÓézPxÙ<õÅZ0GĦ;D4|u Lañ¼‚y‚d¿/‹Jé߬ÌgÓLðäRG°† c®‚RaLZ8J™Šô4",ÙÛïC–Hï +0í°X:WÕÂTCoç.™ÀK¬¿a‘;8%D÷ªì6œ¸@¤ƒ +þ'?Žt|Z~Œ:Kûs$$ººøÁ]üxrž„77úƒ*·Ôq™B:ãuyá⑾ +£ã@í<h>yÆG‰ÉGºœ&s + +5âPŠN‰A¬¤‚mƪ6õ–Ô–qu/G !%›2q6‘¦$u§á¡XãÉÙ-›°Pܳ\NÖ"%Çu±CxÍrw¼ÑwÊl%à’€¾"ÆÇèZ†—˜TŒ®êõí4n$øR—y?‡·C%›Ý²Y°Ý¡ª½Íè¹Ä™S²ÊtBrJ$g0œÀcE玮H5çÓ]ÖpÀ +÷A^†®—¦Àñ•ÙTÐádwt&à'—F ‚x6âË%¨È¡ìvU£xÜ–x™G¿äúá_ž•æÖtÑQÓÝïÚv0@ñxç½…1Ë* ΕKªÈåVVþá=é¿+‹:˜zme8ôµæÛ¾ŸÚÆ™?)VJ¦³B¸\E±tNU +A«×T±Â}ÏXªØÀü$ûÿî´TÅä&ñq¥›wÅdñ–®N‡b¨Yß+LpbëÞ|wô#úýûñú—…¨ b$»¶¢æIÄu$±÷h
Ú¡àv㹜8YýtGybNM2 +sqL(9a„¼íÛ¾š^ªÅßX7Gà¥^|ö`¬Öº“ëÞª;Û„èæ;Ó¥oã0¬³}¦áïwû'!üÿ +endstream endobj -654 0 obj << +866 0 obj << /Type /Page -/Contents 655 0 R -/Resources 653 0 R +/Contents 867 0 R +/Resources 865 0 R /MediaBox [0 0 612 792] -/Parent 660 0 R +/Parent 824 0 R >> endobj -656 0 obj << -/D [654 0 R /XYZ 110.999 687.904 null] +868 0 obj << +/D [866 0 R /XYZ 108 690.907 null] >> endobj -178 0 obj << -/D [654 0 R /XYZ 110.999 609.884 null] +198 0 obj << +/D [866 0 R /XYZ 108 195.848 null] >> endobj -182 0 obj << -/D [654 0 R /XYZ 110.999 463.348 null] +865 0 obj << +/Font << /F94 409 0 R /F95 412 0 R /F120 538 0 R /F107 429 0 R /F8 615 0 R /F11 600 0 R /F126 570 0 R >> +/ProcSet [ /PDF /Text ] >> endobj -186 0 obj << -/D [654 0 R /XYZ 110.999 418.992 null] +871 0 obj << +/Length 4005 +/Filter /FlateDecode +>> +stream +xÚí[K“㶾ϯÐ-šdãEŒ+ǯZWüHvr²}àHœ–)RKRžÝlíO7^IH£Ù*—]; +ºÏ$7Rk$á$™};åzÒÁ`³}r}Nq2–M˜ÀmÛÙÍÒ«_¬„2ÂZ1ÂMt÷ò’%Ë×»ºh +-¦‡óÓÞš¿v{‰yºÆÍÄÂ^ZÞ^2º,öõ`÷$ TH2"Yf7åÞn/§Á®‘ÔÚ´÷»r#%)uû_Í÷]‘¸6å®l6½»]Ãàf»Ûw»¶/'+s[XJ±îZbDÄIDžDô}£û*T¯Ý¾îÛî
>§Ë¢»dÙòn¿-›Áõh†¢jzÓ>Üw¥}õ×Kž,‹z_ö‘¥æ’¤ ?S\Ûª‰IœäR—Øæ«ùë ¡2}äûîõmñ:ò}EÏNí–äîâ
ËsEÐå.:õFøÈÜúrWtÅPnÌîÜØ
Õö£·ª hJÔä´è# +ö»·/÷¾ùkÓº,7sµT9PÖô9ô€º_üŸ +÷e½3¥_Ø”ånBB!â‡3Z]5å•©:l<Ãä}gºš^[H¸FÇKºr³_XJZ7°,IW™ +çLŽ]ßèg-sàŠýº«nœˆ‹›Ç9X¨ûL*è{ ‰È¢1C+`~·ïF]®AÆFzãÕ¯°jZh;…ŠÑšaœdµë÷^{ãàø©ÕÑ›˜æ»]]¡3Q°cNÒ4óA'Ê#ø×Ùâ8eŸ€žÑ|Â!~~€¦ø™sx¨ŸH¹AE’ãþJx›ìT¾8ôzlªqÂü¨°Ôé‰ +œ¨Ì“ÀT–‹Å¡×±‰ª§M4ô‹È:À¯åéd#*ñȆ»É½{CÒ°>Œs;ƒ¡RGx`FéI•ÈÂåsO }l§ßÍ-ÑŠ¥ «CC„çÊZݪŸxÒFÀÁ¡%ïC/ +cm>øÜ6‡TàËYÆcÁÔˆîŸÚˆ£ÊW†ŠÃØ)=x_äÎÍpejO€âvßf€ûþ¦îý<èȕʵ{Ǻ$i¸Ø4 žcpšÏlRÔR3š ø*tš'¢½‰Ða²ìMv¦¬.¼Üé[›Ù¾\ +Ê?ÏI¶r½WAw—ú低RKMꓳg)F5ƒæÍt‰},ÈСp8ãøTì=AŽ% ñü@äX&ÔrÌü
Lÿ8ñ×ù“O#‚šq:'®ÓêfW„ˆÍ1\‚xøâÁÜ‘ð|Ÿ‰gÆuüY7˜ej0§Þ3‘$ÑWØÈž…q×u;ŒuÝ_9j½ïŠ›¶¶-·]»'4°œp‚L†#¡3:Gïáÿ§ñ·ÓñÛYüåcú5Úù(—óçÏ?hþü=æ?ÎÀ‰E +Ò„0&ìH Zuw„DP¢dö{$*>‡WspKÎÙó±ˆ'‚ó'Nô<!Ï Éó’¿y5o»ŸJ">Âȇ’ðÓ" ÿ”ÇØ`—€](áÙ4ìB ¯ ÚƱNÃy¨²mb¹›Ú™ºuÛv› +ðšm”#—Ö=M0ÉwfºÈJ.Ù©;NhÊŸºSUWcÉÆ*¢žr‡‚ë=z‡’Dž¸DAX=à€ + +ÇÀÐjL³
…•UÑÜÕömYôû/mßèË‘2ñ?›¸”xt)ÒeYF˜`qÎÔx½/3OÝ…4Nøœàù<d8ÿ•“;uKÞˆí›_—c6÷ŽI¦¡ÒQÚœõ7‘Cá–rÛv5‘p=>|åB¹Ùy¼3²ÅŸ!G| ïT•wrN%ÊóxgÐù8ïtÆä +ò=µÝmúpÿ×cf„%œä +ö‘“ÌJÊ%3K—Ì,]h^ÿâžnK— .틤ý!‚MYúÖÜSª9g€Oœ«ûÒ†ÖGfü“ïëÙD׺hoî:“1\mÊàL(’¦‰~Ü»µ
ÞTéå<Wš¡ü+³—ö…W.½ù +8MUÔõ›ÈÇØ_&ôÛÞú'=x¬atxü&À.Ž F\ˆ–ðXÝÈì‡àgëŸÇòòRÿ+b³‰É +ú$>¸µÆ%Ÿ•C:hB%¨_ºXåpöŒ2©«iš“9<¦Ú¸ù¤2€=>ÓÊt&ÒSM”þm}‰œOvS9 +`Ë<Ö(rܨ á¿ÞÊm +endstream +endobj +870 0 obj << +/Type /Page +/Contents 871 0 R +/Resources 869 0 R +/MediaBox [0 0 612 792] +/Parent 882 0 R +/Annots [ 873 0 R 879 0 R ] >> endobj -653 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F101 484 0 R /F85 373 0 R /F8 534 0 R /F122 659 0 R /F80 371 0 R /F11 537 0 R >> +873 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [451.289 652.884 473.207 663.788] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.4.2.5) >> +>> endobj +879 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.943 336.474 188.806 349.572] +/Subtype /Link +/A << /S /GoTo /D (Hfootnote.14) >> +>> endobj +872 0 obj << +/D [870 0 R /XYZ 108 690.907 null] +>> endobj +874 0 obj << +/D [870 0 R /XYZ 108 501.165 null] +>> endobj +878 0 obj << +/D [870 0 R /XYZ 108 410.549 null] +>> endobj +880 0 obj << +/D [870 0 R /XYZ 108 296.486 null] +>> endobj +881 0 obj << +/D [870 0 R /XYZ 122.346 144.929 null] +>> endobj +869 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R /F8 615 0 R /F11 600 0 R /F17 877 0 R /F147 863 0 R /F126 570 0 R >> /ProcSet [ /PDF /Text ] >> endobj -663 0 obj << -/Length 4042 +885 0 obj << +/Length 3771 /Filter /FlateDecode >> stream -xÚÕ[Y“Û6~ϯ˜·ÕìÎ 8›£js8åMœŠgŸâ<P5bDjI*cÇåÿ¾Ýh -»Ë˜eZÙoþ}}ËÅOðW,¾5å;ó÷¹ùûÂÔÿdÊ/¯oU-þá?‹ï<q?—X0e–øÏÓÁ5‹Td›ÿe¨ÃÒzgjž†øa:„R,MÝüaµ2åB,$,x‘aïϾ¿ólSiÆø˜‡xz«2Î8—PˆXgCæf0š2÷—b—we]µ0 ð5¿–|ñûµÔ‹¼ÜåË]AÕ›º¡B·-hæ)ïi ¬ç‰¥¸¥‚‹¾,
Ií˺Þy5%£$ã™ãqéäÛc¦´#rÈ›ŽfToú™™Bq-ôâõ¡)ÚÖEueµÚ×nêšB‚òÔRýj:¨f<¶ùfú}IJTÚæ/?èk×üõG}ýe`ê }"–~^H{…Ê«u€{1K·%_?6†í ”*cZ¨«[!@aµiú¶Þvå*üÅæXœXÂë*¯¨°,è¹.^„W®ûò
=sÛÈÕÇÊ6Žâ†*¶åjKŲ}ÜMYØ*®^Õ³ÄHi”°ØóíG£Íß[-WìÈ„ ¤_¸n'oU3‘&–!±éöÌÙo1î„cgNvÛ¸·/ª®…F"ÝíjÔääR$RÃ%lAfâsÂÓ¸ÛÙVЙºuß–ö£fX -„¤ª;ªêÞ -ª{ª+7¾†*@XÊ&dÏGûò˜=ßonô H›.jÞ¦',ŠÝ~¡âüêÊί=¢ŠbÕª¾§ÓX1]ØiP"PÆSÝZ±Ì-d¤¥¨^Ï<pP! d·J&£tÄû¡yÒÎ<™hÏé$<Ðóãâ©D)K¥c»ŸÂs{ ê¿#[ -;™¦X›¶ìëARcíÌ0:í4KFËúÖA À£@by°`Å“ÅÖâ¤J–Ea»Â¦¬3Ö”U@9h 7£÷M¾Yæm1£Ñi¯ÑH4º-h"èØA4з›wc½° 9Ží1ßQc×”÷´x©3Æ5³§“É‚ÇêçÚyC52œ)s¶i&¼%é>‚å¶XÍQP—QXµP¸•‘ðžŠ]þŸk¢fÞòê~gÌ”Ñ=àsmó¾)à¹h-…Ãîh»²lÊÜT -jÆ
>4‹)@† -UmÐùXù
±)x}xs€ËŠz“¸}¡R -x»bŒ -¶ê¶&vƒŒ5TÇýe?©jz¶{µ©“‚Ž"æ1*>¯\£I°BÍ*'Ö§n³Ñ.¦¸‹;*-²7ËÝê;Z¾‡’JÆb\T”ôÇ—â¿ùCsgÍr猺]’ÖkŠ_bÀZô½žVÁ¢AÎÕ7±PÃt¯O’ÕÖ¼=.!–ëP%ëjr¬£2X/ìµb
'7ÔÖÜ_Qá—æÏrtJS@7©Ç'E³ÐbÐ\7äÁÔ‚`4ÊafRy£D,!æ]^å?kñ2´ŒÞîÜñÌù¼AW™w]@y"À!½0ùø¡f©?IZ‡ÓØ4÷êä0épl@-Š™£¦=¬ñ€N‡*@‡C½0†™²i‡#`®u3UðíÀqS媮º¼4iE“ÃÂ<Š)Rô»;zt<\m&@ë¢MÖ¾¬BLï÷杻–Ž.=þÛç¯ãÇ îÉüødxzN0&E—f¬Û®8Ið(»lmqÈ{Z…ÉÏ7nûöF$ZwÔÅA!½ÎÄ=®Dk_V$z´ùqÖ'ÇèØ5±—ÐÉÔÄåµhDò¦³ ïN¤™éR%ÄÁ:ù”3tqöЄ¾ÛÙÇ&4µdêR)þ°-Îê¾ÅM‘¯¶ˆð'Ѳ${ G6+áée†&öîy -Çs¦hÜ+öù*œDÑPcÀ<-Z)š’.ÖY‰½¶¶{[þaKu@¥NX¤Ò§fß¼³µsªVÅ4Å2à>&žÕ¢W/“Eƒ'…vGÀ&«qº0J¶¥3WË6
ÑCY¹ÊUÝ4E{¨«5åM°_MÝ:{vU~kc¿
hò.ÀT‰!·¿§SŽU2¦ãþÜ çºhÚñØK;pnÇw‘4ùPœ¹BTÓѺ_Úˆgš`‰˜L?-öH˜ðŽë~Ÿ™DŽ]g.@9_ÁZòå•bm$» V;zéêš -&Š£")Â3ì£Ù!Å]¸Ä{ö¸ïñ‰ñ’ˆ¯Wxý`’lÁ{‰xŠSo@ëÊéÃ_0dk]†IŽß›Yå‡|UvˆÇ2n’)2̓©vM/½•@AáÐ`Šm…7 -ª{FuÏ«€ƒ–F2®€¢4±Ö°Ûbw %‹ƒím>ËF|4c[˜»(+<ÖÂ7·U¸H>Á¼ßuƒÉœ„(MG]kzAÇCn[ÁâHÀ`ÚØ3s²´ -„‡úÞ.ÇÙUßkf¦ñ| -0rÀsgOs7¬‡¥@Ê]Ñ ƒ¬¼—(Äô–4¶mìÓä¬ 0¢3>f2Uîj÷ÇsÇ6ûÅãœõÒåÿ -ˆüœÁ4‰M Ç -òÂI6pÃì$.FJ“ŸÎ÷EG>«ònK½üùÿšÞC aÃT¤¾žYl|q²§ò`¡ÐÏ“úÃìO3™x`KJËÎ -*P„¡ˆÀ-³ØÇ|ÝãÇÜ@±)ºcSQˆŽLø…Ù-¼/¿F;Œ +é‚V6;d° -LéE㦈>qkÄ¡12k'ȼøÆXL.ƒ\Ÿ¥á€á>±É' øÑL´ûü‹GŒÕ›Ðüä“ÎOÌ@u0ªÜßí÷$•¶Wa5þà$“—-Ý‘µiõè,^
¤U´Ù*¶¿\ÙçŒ^ •BóYT*–&Ù§>—â,MYæõðX -+êa)¬ÓÁRg6¢pè8ŸD¬œ9@_ +xÚíksÛ6ò»…>Ê G<Iö®éµ—^;7¹GÝOI>Ðmó"“ +IÅñxòßoH„d¹é+½L;^\,°Oì®é"‚ÿè‚FÉB¥I£x‘ßžE‹kþöŒÚ鵞_{þzqö§g©X$$Ujqq¥ÆDäbób)Îá;-Ÿ¿ºøÞ, ¹YžÎÀÖë~<_+¶|ÿÒåצ}aþýÎüûO3þÜ´8_óX,¿ê?`Ëozà=.Š*Rü_óÍ%\Øéè°s»^˜‘ï¼-¾oÁ9Inaø:•<Z +ªWžýí¢¿8‰£÷ªçg÷J¡¡{±%"Yb6{I¹¸ì¼zañ’‹ð2G’ÄÌýç)‹†€·’v¾ÝùI¹ë)-#Ä«‡ +$>|pö%(AÄGY"ñÏ8 +¿¿,º»¢¨†UFyQ¸P1Ö]×M¶»Ñ{Kµ¬¯ð¡êÆÝ9–5v®öUÞÁí95þ]¸…m‘×ÕÆB©ìà¦.Ú À6»µ«º 챫·Y3Þvkûí²[¥¬™¢¬°}YwF +˜þó¬-ZMüx¢”!.º×Ê)\¶[ئ>gry×âX¿¬'šîôHÙ)Ü]·ëfS4øiÝàPYåM‘µšXsÎgŠoÎ]•~AL¤rò çúÎ(èL
õÇøøUn–mkÍH£ã¶]“•×7µv !ÔèB·¥!p +°jû‹ü59¡àD¦ƒ¸c†"ñj +õĤh®ü Púe£¹òÑPOüû‰æZí©m ’3ÆmŠ·EÓð0x¹B&&>%wòÏÄÇÙ‡2ñcú±«ƒïkç5cÆsÔn“àéT™‡Jâncö™®VÞ”—î9¬
H…Ív >{ÜúŽ0S‚ÄL.D6%ÕÎ-Î4×lüÇs…Ýâõ°Ú冽èÔ I
AfÉR–Ð<Þ¾3ÇÛ®8ºYë½·—ui¤çNŽèòÊ}Ûí‘brÍ +LFGüTZçñ0}A.H{ó$!1—Ø^{Ëg—>éHÌf{'°È㛿®ìšã;N +Axz<¯‘ʦÁŽC¹
™‚wå®îîÆ„Ùb›ÃÕ¸»@-ú3<%lì{‘%1r¿ÿÝcNI.#‚¿:PGåò{Yc"ÂкÁ`o1úšs-íìíÞĨu«6auhaÀGã•—pÍ|Ó"ËÐ11e<˶X…¸"J íóD¾ã¸y¿vÏ"اóñ~$¼[¢qÌÊFcð1:d:£Ü>Ô°Ì8ê ´,68yy?¬Y +ª]°'^W“ÍM} +$¡K{þ>ª;–;ý(Ó²Œ$õ mß4GÞ†²þ”Hv[P7}…êárÔ';ŸæCú~8<ÈüÇ 2F{Å`>ÔQTÅÏêÜŠ#fP‹vL
/ xCg‡¾Ñ8ð[Õ6²¼Û›tyˆÿ8H°;¦tüfÎÉœ&áe©ÔoËËûj«³wõÖ'==4G®M‡’&t÷¹'BŠt7 ¯oê½³<`ödÊš•r“hmÞj«m‰Á·\¸ù>7í¡þÊ+â^yÓÌ ôå¤^†•3ôµrÖ–¿°Ð~ö?°%N£j¢ù‹$NÊÆL™qHžŸNåãnlr¼le–ÀéÝ»>EÕçh¼ª¯hÙd÷mÈ¡%¢¹8ªpBêiï…±®*¬+ýE’Xý‚ˆ†ŸÛSE)¼ç¶M™Ñ„ÃÐHFŒÀ~\¼ƒCÚ9½¼´uz(¯oo
ùð;Ú!aúÌ\;™ªêJG?1øeF¬ùl± !׳2xíÇ«y %â£^ïš'@9*Boᓪz¸¶b!/vºP99† ¿xŘ: +Ý°Kà:wwãóÃpfKzL'XmBSðÓ#‡À‹Ý« +Û®Ø0P¤/¤y4͆åg¡«`Dõ^ÚcˆÀ[æ
8Ðew?ÏÿDž +ÅXR/6‰± ðå~
šëꅪævÛôVÎÃ@†?[O%–KÍ”¦+Œ|Àp[ßÚ‘#Ž<nMÑId‹ÙÜŸà/Sv˜ÿ|àóøàÃñÇ1ŸÏ>@ƒO\sqîvÁÅ. +¼›H^6ú¶JQ§6ÇÙ|óäb®ºë¶ + ‡b
”ë•»²Ê=+÷©=spõ@€’ŽÑ‚i*Þœ½x-6°âû³ˆð4YÜA¼†4]À¥wè1ìoÏ~8û÷ä¯í)Éøíá<qâª+“N{j/>Q4M .ÄKÿÊ:Äuµn»¦tžäØÊ—¦ò g=xLÅÒ¼0S@܉ü—_̶Վsü•gÕ¸ªQ— [oñòœA¿›Ö”šd†+xÜnÎÝN[^Wæ/=`ûÇàl–¶X³1û᨜T†)·fð¸Nxh’›“7ñ?ZÛ1 +endstream endobj -662 0 obj << +884 0 obj << /Type /Page -/Contents 663 0 R -/Resources 661 0 R +/Contents 885 0 R +/Resources 883 0 R /MediaBox [0 0 612 792] -/Parent 660 0 R -/Annots [ 665 0 R ] +/Parent 882 0 R +/Annots [ 888 0 R 889 0 R 892 0 R ] >> endobj -665 0 obj << +888 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [449.09 439.261 471.008 450.205] +/Rect [263.729 397.537 285.647 408.441] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.2.6) >> +/A << /S /GoTo /D (subsubsection.4.4.1) >> >> endobj -664 0 obj << -/D [662 0 R /XYZ 110.999 687.904 null] +889 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [161.798 387.64 183.715 396.486] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.4.4.2) >> >> endobj -190 0 obj << -/D [662 0 R /XYZ 110.999 514.618 null] +892 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.442 142.45 388.305 155.548] +/Subtype /Link +/A << /S /GoTo /D (Hfootnote.15) >> >> endobj -661 0 obj << -/Font << /F78 368 0 R /F80 371 0 R /F101 484 0 R /F88 386 0 R /F8 534 0 R /F11 537 0 R /F17 509 0 R /F122 659 0 R >> +886 0 obj << +/D [884 0 R /XYZ 108 690.907 null] +>> endobj +887 0 obj << +/D [884 0 R /XYZ 108 666 null] +>> endobj +890 0 obj << +/D [884 0 R /XYZ 108 379.794 null] +>> endobj +891 0 obj << +/D [884 0 R /XYZ 108 193.533 null] +>> endobj +893 0 obj << +/D [884 0 R /XYZ 122.346 136.999 null] +>> endobj +883 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R /F17 877 0 R /F8 615 0 R /F147 863 0 R /F126 570 0 R /F11 600 0 R >> /ProcSet [ /PDF /Text ] >> endobj -668 0 obj << -/Length 3236 +896 0 obj << +/Length 4113 /Filter /FlateDecode >> stream -xÚÝ[[Û6~ϯ˜Gy1fÅ;¹À>t7M‘E›-Ú)°@Ó-µõH®$g&úß÷ð"J²èËÄ“4»`DRyxxxø‹ñU -ø -ãi¯„’H§ìjqÿ"½ºƒWß¾À¾KŠaP‚W¿yñÕ+©®ÒB\ݬl›å/ Íyš û_Ìæ8…ç«Ù¯7ÿ´Ý%Â’šîD Í©ÿæçÙ\ä
üÇÉ?lùÆþmÿÿ˶¿±åŸfs*Yòuø€$/ÃàfÚþÃtrŽeþõwvt˜ƒt³Þؖ׃)¾NA)Rª£VKTŠ±Y<NRÓûÅ77mTi$áã4ÆÓ9Õ)JS†”йJ]i˜™ûS¶ÝÔ«Eù‹#I¥}'–"Á¤ï¹vïqŠû@²àþ}³ÍÓ!°D2í8Sø÷*>¯"ߧ²G‚Œÿû`_¨$n_°Ž`Ä·}î‹22 †’¾ê{ Tø‰®§Cp”*|™†J¦=•Ùc„J -½ØUßë;/£òåïQ>¥ÎÛÌ?>Dä¼ãâÊ07ÐÝ÷oá˜û‰OÑNàˆÐþ{||ÿû^ϱL% -Q¬ÜqßTmç‘“¤]ç®°6YmŠ4YíÊE[T¥{±ÌÛ¼!Ë—®~û>ÆÎÝ2êÉ2¢´“ù¿ÅÙÈ¡ˆ³‘MÙx\G\4‡fŸò ˜Ù…>¬ó:©Š(ߣUŽÖ*i)ÏælpB´´+–°nÆï -ýÆ«VŠ½ò~ÕéÝ eo¦Ó1…T7N¹»Ïëbáæoce74(è257*‚»c—Ï0O·uÞ4®¿IµòÏ2w…~l¨€¨`•Üíf8¹ÏËöÚ·–ËéÎ`¡ÁSU:(”Òî"z7#/òƸª«ûˆWH¤ê9T(;K…²¡zØÛê°²¶Šêzq9™L³:”^õ½NYøýmÚ|Û„ž²˜!4Ï3)ÖCç
92¾É‘‰ˆB€KÏœ*À˜ŒÚ‰ÑfgD—Jw -©‚µƒ*1o.ƒ™‘•¾^Þmü7÷yÖìj×Ñ|SZ´s&–ùŒ¥É]=ƒosßéŠb1X2ûÎOéŠN›Ç‡q:Í`ÕÙºòiWÎÓ”%PíÉWÉ®ü¬ûÊéeÅâzoæáÀ±€ÎšÔIã•–€{^‹Ñ¯ª:¢lH‹<,-–ô[ -Pðs\2‚EZ^# 1ØA4`åt¨cYg††sæ0ñ¦É¦ª¶¾iåž™{ÁæÛ¼Í6®®š¼msäj¯W®‹„$ež/ýÀu¶,ì†÷þ7×îÕ®ñÝ›ê>o×EyçI(~3{ï_:Y†ÂªÚlœ,CO4e[d‘#®m‹¿8bl ¸e+_aeY9ääW®_àæ€ðAëƾmʦ
G’¨/Ï´9DÂãôÆcˆêúØ‹ùB«aŸNqœNúÑ7ó§±Á^F–!@iÊñ2FƒXp/œ ícmŸ'\Dg^DO3φy!Q+üIŒ)ÊÕ#ûìe¯)iš:}d -µUâw£›úmÞ>äy¹×«}0º¬r•ÎhbÌQp«±'oà‰ƒ¢âGl—Ž;½õ0YpêøSwð9iÜC;ž×MÞí½EL1XHcÆÛªÃØ°Ý´Q#$c/1Êñ` -`?àò®¨vfgèÐ`Þßg@T×{_ÅÀ$kVÉœ# -v¼ð-‹E»V4@N|·‡¢]Gì9œctERõ¦Éf±;jiŠ‹ÊN‘ó¶“×Êç)X$úYPþ3D0>Êçg)óK"-ÇA¾ø¤ ÿt€C~Zÿ´ -Ñ„‰0&Xp= -ѧ}ˆ -ÑÓà<ý!ú4y]:rœ-¬Ò3‚Õ -ÐÝ'V?Eë¢ÛuÌó’´s44$‡¦í`Ñ04#㳣Ъ‹B«±sÖ¼(ü4Þ nZÓì.*À‰‚ -¦0Ó)†ÍOgÜ»úîÊ~ü6üRiòcŠ¢ûcbèfÕù©t—büó§É CNµÈÂv»š`;T˜Õ¬?iÔYÀ.w§þ>{¥IRQ*äfG! -áësN°J¶uµÜ-lb¡v ŽÊx¤ÞßU¥Kq„jÖ®¯]‡Î¨Ë
Ù€ŒšãÓö©‹öœÂè æîԗ󥡋9065÷™Ï#J(Øm‚
$Ø(‘<êN`jèNðsWnžOTG—ÓxL\9N–1L² +xÚÍÛnä¶õ=_á—¢cÀV)R× +þÅW±*®²RE¥Ê¯ªý'êêÀ_Ëð-Žß>¿ûä_•ÉU•Yvu÷€"änûn“\Ãw©Ú|uýãÝŸhzŹ¡éedŒÜ8ï¯×·™Þ|ãÍ©}GßÒß?ü[j}kòdóÆ 7_xä~/YÅI)Èÿ²\<“Èð7„ÖÐnÕ;‚¼
–øz¹„1QQÁÁ×ejÔ&Ñ8ó“/ï<áR•<KW_£k ¡ëU–f‘2LÓñ8ý±Ûâ’z3íjl˜Í¡oº‰›ÍµN7?]Çé¦îxÚýát>J¬ Ë(IÜ]ìxB¬ÕiœNÍãc]oWpäQ™;'—Ï¢¼ˆeø`»Ÿêá:Q›ÞŸåóà›a{sÚ,6]ý£m›IN±?Ž×ñFN{/˜†£L·“Ç52ÄíØ8-"•!?ÇQ™¦¼$]Dãq•I2½Ã]m6U¿ßÓ>±óá:V›~x?réktÙ¡Ú5Ý#ƒ‡æq7ÑT;ȇC¿_’O«<Êãò…+H_¾sù +òHîÝÔ´¼¡fâߺ«€àZäHŸ;Ùü ”F™%l†Í¾c’ê4ŽÒ"Ÿ¯.M6m}âÅ–AÕqà>JMj6o'†Ã7´†¦¥Ùó/n‚xÚ–¿ë€ÖÄ× +Ì;®xwXÁ§‘Nœ{Ã蚎Eât‚háP³`‡õ%L¨l[[ÑÛÉIÓ`›4
6ÐËsÄ€Ö8
Ýuîµ0e¼aìýÚA4ˆáÉò¿[q/bÅÙk£*0´cÓ¯ˆ».‚ÈéÒ5e—¯)¯íèɹÄqu¥éÜGû +3Ô
Ýtaƒr‘Ø!UDñ™CöVÂéǺ£×RœJ6¡Ù
Àèsy‡¥&ýU!„×>ú³1ñVª~ +P¼¯<›{7ìOÚý¡ÅˆÉÕ£¯Xˆð"àq@
LMÔ´<J† qµçz°uÖk´ª€xENUeÊœ{Œ¸Àgˆs)0à˜ÜIy»°P×óvFÐ0Þã doDZvÎ¥hÍnë<‹Ò9?ýj¼P̬bé¶ÿÙòx%pŠ£†’åã@¤£²Ð^Ø–Ö0ʽÑLáæ¾a¥ MJÅr
±ë8†â1£‚È: 4ME) +Ézwsž«L@“ÌS‡œÛ#‹’§Ä÷ðAôD<ŸgâßÓ`èßgäþ!쥛A·ß84FՃúo¦O¹=>rN'~Øõ²‘{<>ñ-Â$
Wª”â*˜QVï<îµDV˜´Ó[BMþ-þ 9´êÅêöþ (‰ZÇ&9Ð7³/Ï%@¡ +c–ÉRæQÞAÈs3V?ãså|mÒŸÈÓ>Q£“,v[WÓ +#@ïßÎ>†ƒyùœ„§ãáxÅ âÆÅÏÑGŠýçj±:8'«taùäWqÁb‰U´h‘.ßб2ØÛ‹î;ßÀNŠ :MGqC5q—³œ@ ÏŽŸ@^í0Ih@üP:÷Œgœà."á@Û]YÂK/†!µ½½˜ƒ{ùš;‹{—Ò¨kyœ¸HÃäß,jaL]š •Ìåà‚ȵT\¬L¤Œù¸ñá±³LÞYÄ –舎4Ó,/0mtƒ’2™{ƒG“D³ mäm>|‡À7
{¥õºçqz”ÿ’:£ažú%µ¿sSÁúòÃý7üÁ„õÍ5¦
®Á}Ãà¯ÞÒgß(¾_MXQ–¥tX£cßmídš¶^Ëš©èÿš5û×™rÈ7]}±â<yeRèß.ŸÅx‘Þᘠ‰¶B°LÏú/íöù–þ%©F2E‰Ï¾d~·Çî´ßgß©Œô Ô »ÐEÏØVC¿²“\ÀåA¶ÀqÓŠ@yñ5
¬AGÆnùgæȦøÜá{']º(*=e)5ºù#g/µ¸äáÄKü !Êѯæì_ÂUçYí£
¥êο`æ:JÀð?€ËS¢#ü{tŠ¥è‰[g lù1#ž]MÉc9:9G0co„îéZgþÍaž6/À-Š×ߟ/òëÙÉã'Èx¼w¯Ôg¥= Ø•d`Zò(å꯸ñ]PèãfßÓÅ>ç(IG:Z”%IBÜ [”¹9ϯdÐñ|ÅF.K¦HL#änzèÖ˜’0ü¢ÄÖ«•ë¥ +–½}’Ò›5×Ü€aVNã–˜Àbøatò©´Å9Aر\ûrèۧǾ³R+s°zÐTý²ö(€žñ^Æøüº}ëBümXEäwú”`Á‹vËD<kéü8‰£Ô;Á( ¨VÄÀ¨àN<±üGžc
DŽù™Ù8¹‹šCb¬<q©7 +ó§ËëÆÔ¾Î^”^fóœÿ¤Òð÷2o +}þ*€E8òUÓ5SCÁÍ +±5Ü{ù¿…Ïu7Œïþþ§5le”¨°Æá9“‡õlþšI(¹û³Ï÷˜dQ¼7ËZRx[l*ðnkn£Â¥XK†Ž”¬¨}˜8U¥ð+©‡[{¼L€Éê ~CNƹr)<§ø3†Ü°Ä˜ +EøŒï +ü_Îþÿ¼–¬LRwå’XO%Ê +=/±ëÖòjqÏ0O«ÈµG^õý°m:®#a¢ ++œ,w]¹*¶ß²3%µRXR@œ„=ª¼áYÈø;¹²3ÇG´ƒ4šÇÄÿÓ +endstream endobj -667 0 obj << +895 0 obj << /Type /Page -/Contents 668 0 R -/Resources 666 0 R +/Contents 896 0 R +/Resources 894 0 R /MediaBox [0 0 612 792] -/Parent 660 0 R -/Annots [ 670 0 R ] +/Parent 882 0 R +/Annots [ 899 0 R ] >> endobj -670 0 obj << +899 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [361.54 156.707 383.458 168.612] +/Rect [424.05 254.354 445.967 265.258] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.2.3) >> +/A << /S /GoTo /D (subsubsection.4.2.2) >> >> endobj -669 0 obj << -/D [667 0 R /XYZ 110.999 687.904 null] +897 0 obj << +/D [895 0 R /XYZ 108 690.907 null] >> endobj -194 0 obj << -/D [667 0 R /XYZ 110.999 239.805 null] +202 0 obj << +/D [895 0 R /XYZ 108 336.232 null] >> endobj -666 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R /F17 509 0 R /F8 534 0 R /F122 659 0 R >> +898 0 obj << +/D [895 0 R /XYZ 108 315.838 null] +>> endobj +894 0 obj << +/Font << /F94 409 0 R /F95 412 0 R /F120 538 0 R /F107 429 0 R /F8 615 0 R /F11 600 0 R >> /ProcSet [ /PDF /Text ] >> endobj -673 0 obj << -/Length 3575 +902 0 obj << +/Length 3652 /Filter /FlateDecode >> stream -xÚÍkã¶ñûýŠA¼ÀšII”ò-IïÒ+Ú$h]$@ ²-¯…Ø’+ɹÛùïII½»—&@±Àš/‘3ÃyåMòFÊHäy~“fFäQ|³9¾Šn`êËWÒ.‰„R1´`êóÕ«OÞ˜ì&yšÞ¬v´bµý~¡ï–I´ô?½[Ê~ßÜý¸ú-7BËU*òDÛoþy·LÕâ+ø/_P{EÿßÒÿ¯iü+jÿãn©M¼øÌ ò›{XR)dœÛÍ¿™žˆXÇvú¯´;œ¡Ü©+y;:âËùZ‹,sð¶*‹¤DäåBâêW¯Wžl:Ë…£M—:D)hÄ"Kó1qs8M‰»ÚŸ»{ A"Å®/[nöûÑbÓE½eh³Ñ÷2J…”ÆîòƒÔqwlš~¿-úâ{»<–§À FÚÕ{ž—‘ -iŸ;ÚKÍq™ˆýŠ@³4í´?ß©dQζە=C¸~ÎNÎÈT:Ž²ŸÐyÃRƒœJOµ”>r‚·T …ÕŽ›ºäƾ踱.Ëš[çîN.Ê-à ù2d,ò8ž\Åjo¿¿*Ö è/Bø¹äzz -";òµe×7ðèÝYO -˜É„Ì“?TÀR¡ÏëMH“ ; <Í¿Ë’es™9¡íçÀJ"kÂ=xŒïy°,6{nÕÀr±\Šú'9Tt«Ðªð*ebI?€?”<ˆ’cE×(´²áÁMS÷…û¼èíÆeÑõvÝ;È.®ÏÇuÙv÷<Õ•(‚}¹eÔ\ƒœŽùn_õew*6Qœ“¸öÆQtèæ‹5ò"s"x¾C„Z -×y `3”ãsþµdƒiK$+Z× BÀAVHˆðÛ–'`²v§ìQ.Bœ•)¡¼r?¿øXÄÞŸX:ý–Š4K&äñr4Ù]‚7’:cóÜ\ùÍ7MÓn«n/šÿüsjªºÜ~[W}U¸ãØ(a -Ù¯‰à׊`>ðnÙÚFõPáθ·3ÝÅ -Ô@ÇΞ¼Úã–J -O¨qdÂÕk‹
ivìP± -¤Q,#YðpYÇ¿›ã7ÓvñÍ2‘J'à=-¿÷¼ßúN´pVÞÂB¸.#uÈ^½Ó¯UýÒR$i>Ò˜ÇÝ Q³Ä|€77#“³.wM‹ÆvàÐ ýyç„ Ä÷3P É‚´Yõ¨k¢:Ì÷{ -õ†Õ -V¹˜E×#v£Õ3ź¥8wÄYã›sû3‚a»¬‡`¾lÄÇÖUÈ8ê8ÊÄ#’!½vÕ¡ÙF»xÌcÞ6ê(]‹Gnàµé(Y€ôoÊmi§×v¶pTÃâ‹¿lä¡ß Êï¹·[ç#È5†‘®q½Ú‘§ -\ =‘g›"cbÈh<£!*(”ºDÈÄ]öß(}Cÿ¿§_Ìo¢€Ü{hƒW -'‘»lUMæUM–Y7•‡,T§,XÇÓ=KŒU0p(Öå¡CwùY_ü„>Bi¿$ÃUßYoEK"ÎøÞìõD@ -0oÙâálmŽðÏ¡â%k>!ÛqÛ…Ø·¤l«
Ù[èú`ÀAcƒE]ò–`g `x,ÈÏÂ>Qì´>^{Fß`½˜xZÛ‰¾`“@ -a©rIèäh¨ve[Öä—å’•1ÎÖ<ÍäÕ\0cMo.¢¼ð
.$Ìsy¡Öp„¢X6ù4u%ÄŽcN=âDJhn™5xî©g-ra;‹ƒ÷
óȃt„èÂZÊü§|ꀯ*_ö³Å‰ø47ÎNÂÞÜ‘»<¡Ëƒ5ƒ«{ÏÀæ5O5îk¾PÙ¶N£`¯àÙ-°ÔïyÀú²¸ÃÎïÉ–ùB–¡'äÔÔ[ô=&^nt© ŸÊúáŸr¡5¸Ö–±Æ»ïšƒõ@ -©õÐý÷…kó[á‚€9i$gyÜËÿTà_ÿï,F^ßœ€ø®”7ê~/È®ïw™wE)‘%ëUTí3‘TåãÍL´À[ÆJ/ìšËìJGæu“L -õléÅþ¨¢Á2Ê/™ÐñUÂe–‰$AÏ4WAü‚꛺¥N…1<L©Ðþî) Š9n‹}Øn³ØÙ4‹m¬‘†ÆÆ¢@›Ó6àÆ)ò€W\„ƒX"Œ–J(€|Mà/ÄêfýÎnk³Æî{öÜfBzÝöQ¨ªœÄÉ%†µK3GBgÓ¤ ×Z[é¹8xr&J»“!N>¸lù6U‘j1ó¡þqÞ”&Ú;LK¿óiõInÓ¾Þ^†X_2ŠÓ„\œ,’CÁóô¿XAúÂJcU/OE)“ÀFp^ò²7¿àÜœz!‹7çþ: @¢L¿ð5D(â–`¹så$Óð»ÎX'Š¸fx‹`Çö¶AÕJ³vvlÝ`Ie´NR»°ƒ”¼Or -‡| -;>…k.’ë0]
Û´v£Â¥…ÅË]sF~Óé(
¢
§A´/Ìj_>ÑÓ„žæ -OzÐ'±‚ytíûëX&¨Zû5„u¦Wuw¹¦+7
{üœqÄÄMíÖP¼‹@,Ë–RóäÐcsÆü¶âD”Žô¢ÃìÏc `’"šL,#·òþVÝßêûÛø×_l*:-\/€`[^|Ðá+ -añôc‰©ç…íÙÒŠšf>å±×ìñ·@(T8ÖX$ -î:å[Ä“èùô16f\„oÆÙ°”ë—Süd¨h\=Ôtµ£Ï‡G(dqâŒÅe,Ð÷¼a‰_ ‰ã»˜ˆ`sY,¼ŠŒgc_l8‚‘ª©V¹JŠÇê$
W9?L/„QŒÀÍðܪçQĽË~cë+³Û”Ñ¡VC
-lÚ‹ƒè—•®:äŠ=,˜TêlÕÇ!Éä -*zp|`Éuî|¬Óꀳ¡Dfdàè»e"Z…ˆSs(Z‚á²/…B`$à²ùð§Ú]è÷"
é“Q¤;¶üˆÅàÛ8^Ó.Ü3¬<–?±µ¯ZL>y§Fää8—RAÅäá'J¦Bª—Ä¿t(©~RU‰RÜóX¶ï°7}©¥ÒX¤Z]ÖÀÜÓ®«5¢¡´FóðÉùÞqJC\ÆáJ'½tå¨+µ(|å|%s¥LtG<{xÞ¦7‘QdB¹H÷z’¨ü/«‹Â$endstream +xÚµkoä¶ñûý +F‘5`3"%RRú)M/ím´R PYKÛB´Òž¤=Ÿä¿w¤+®Á¼3Ãá¼IyÁŸ<“QvfòHäQzVîÞDgwÐý—7Ò
_áøÕlŸ®ß|þužœe"7æìú¥’ÈõöÇMrët´ùúâçë¿ÑôTÈ4¦é¹ˆc°qÞ÷WFm¾ÿróµ¯éÿ;úÿ-õCí]\Åi²ùr\ 6´)d’;àß‘k‘ĉþ;AÊc½¦žw3Y£ˆc‘e±ƒ!`u®ãh“Ä8óÍÛë‘q:Jžä+Ž‡øš¢ØñõÌh#¢˜yº+&ßÜXþÝw¶´[»u½n´h.¤Þ¸ö–‡ûiÍOQ¤>òWÙîvE³í/ù³oýìbp]·mÇ
‹P?»}mÝPá`Ômïi(Ýœg=øC½iþÀί¤¹Ö´# +$å¡î™Ùø‘‰Ädt`ZÆqû''5ãÃ涊۪¶¿BämShü6žØÄÈÎ?KÇ#CB®@ Dåz®ïm€Ø(Ö3<Þ5¦$*õ²í˜û×fs_\ÈMÏí¢iá<:þ8ôÄO7U³µ{ÿš‡èð`€Þ´ÈÝ‘Åе°¶/»j?Tm#¸ó‡‹,òúg?x¼ù,JËÅÞûÃMoKr,ÈRÇ">3*%R(©<ÐÝqãŸscAs¯f“×b½ +÷[–y°])X“ù¹×E«UÓ»™mî;@•$¨á8PW~ +J$þî[&Û´¯ŽÛÀÌ
¬ïª²¨¹çÃR¬#ûz»/ºb ͇O4\ˆ¸…¦;Kä6€'*E{x¿Ž0f~tv_`v†l°ÂÍ‚ŸÎÞÚÎ6¥åÏ¡u£
ÿ:vÛ®Ám`ª<·ÐzÖM¥ 0‘,ä¸j´ÐSÝ.°òÒ€…QZ‹8•Njö2mÙZ¼t""3JW3UÓ»=<àÑ»x’vmÇv÷*Žrp}^å
h¦£ŠãxvTü½'Q°™$ºf'‡Ÿärà÷á¾l¿î_rˆyÃk[¿”Ûn´HðU¸Îvpßî×å=·ÀämnG°Ž4–¿õI—m×%m³š;v,x¸ô‹‹±ÇБDÃǾ¨HvÙUbpåÆv=´
ÿ29ØbfŒk ú¶ëÙø +âÁ)ð +£šlc·g +2ì'ú©—#phúU?`Â5ɳ̕HSÄ©æ€ØÞÒ + 춶£"غÚýØð^/uÅuhôÞ3-+*`‚T2óe¬çòò\]žÇ—çÉo¿"vl*¬#¾ÐEj¢„2ÓE*¡¼¦Ê¶v¶h\Ó]Y¦ËŠøÜ÷–Sðî8„¦ûZ·‚|0ƒz
g™/MÕa³"Í¢‡-ÒSi?蜸IÂDÕê ËÍÖlyôΆ
Ì!†ÓÐsÊùgº|É-núx£ÐÛµ»‘êÎÑ}rC^>¦ýpŒEà7–?í¯ñx¸(IbòÌ!€P©Ï<ÏÕ6íP +Ʊ:ÏdÜ&R@{¡{;Òlú£™è¦%Û¸Id'è–¯qC«-²„HÅÅ¡Yµ ö)aã6“g¶I›S›ø*+ñ·OÉx]Lh×–x÷±ånºK” +6¡³¯ƒ‹"´.üd@Î] k‹¢î”ßÑfë’ãϽŀÅÌ#$tP‹{$º¬4é†Ðq³l9Úl/¸çš<²1›åÛÎC=ðÈ"¾Áº(6ìãBÙ¯2~ÙÕf¡Ùñ[L™Â蘇"@äÍ£¿7‹…>ª,Ð=|yòŽzqý=¾ pÜ”ƒîªfº=÷›ÌfÇaˆîxÆx€O‡¯Ý¸œíîxø'–û\Q +>øŸ($k +endstream endobj -672 0 obj << +901 0 obj << /Type /Page -/Contents 673 0 R -/Resources 671 0 R +/Contents 902 0 R +/Resources 900 0 R /MediaBox [0 0 612 792] -/Parent 660 0 R -/Annots [ 675 0 R ] +/Parent 882 0 R +/Annots [ 904 0 R ] >> endobj -675 0 obj << +904 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [154.927 506.42 176.845 517.363] +/Rect [152.303 617.019 174.221 627.923] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.2.3) >> +/A << /S /GoTo /D (subsubsection.4.2.2) >> >> endobj -674 0 obj << -/D [672 0 R /XYZ 110.999 687.904 null] +903 0 obj << +/D [901 0 R /XYZ 108 690.907 null] >> endobj -671 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R >> +905 0 obj << +/D [901 0 R /XYZ 108 412.321 null] +>> endobj +906 0 obj << +/D [901 0 R /XYZ 108 365.866 null] +>> endobj +907 0 obj << +/D [901 0 R /XYZ 108 173.287 null] +>> endobj +900 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F105 415 0 R /F95 412 0 R /F120 538 0 R /F8 615 0 R /F11 600 0 R >> /ProcSet [ /PDF /Text ] >> endobj -678 0 obj << -/Length 3259 +910 0 obj << +/Length 2983 /Filter /FlateDecode >> stream -xÚ¥kã¶ñûýŠAmÀfDJÔ#ß.éåQ¤wº -$ùÀ•éµp¶åJòmAþ{çEZ²u¹k‹,rø˜ápÞ\}—ÀŸ¾Ó:QUUÝåe¡ª$»«¯’»'úî•–)‰2&ƒ}ýðêËo‹ò®TUžß=liÆÃæçEº\Ûd¡è7_®ußo—¿>ü¦J)N7¹ªl*kþ¹\çfñ~õâj?ÐïôûŽào©ýå:-²Åë¸À,þ7´äZ鬒ͺEnU–f2ü#í8LÀú@F(¾»E‘¦ª,ýpZS&ZãáõÂàìWo"ÛÒ²R,NæxºN«D%‰F¦Ê¼3·l阹;Ϥ”£A]ª´ÊeÆ/:ÍÎ}s|Š$Çy@2P"óêöppÇ
^éEíŽÇvÀ¶YÛîàöûyôü=÷~ÃãÍ‘!ÃÎ3 󧽫ýÁ— -F`°þCÓµG¸bä$(t¾=÷míöÜ$vàwâàdÞÕ&Š¡ïðbŸ›ÞO7uÛ¥±‹¯ÙÄ‘ýù±÷ÿ>G2ڣ;.Ÿa+UFóâÚßYgªÊ2˜nUªyÁkÄ^Àðcý 0ùº¡sB¿v½_ñŒ—öÌ
–Hhœö¤NÊ<jƒçÃ#É?nû´´×ûû
‘€¬ö8µ}ƒ.Øž`-µúöà‡ -
u÷Íû¥^Ïp#ï¢VQâ~¿×`¬aá½ùã÷_À\O8¥«{
PýÇÓ -•F…ÀK…{ûÞwÄh²‰0ùâàjبko)+°Iv¤¿"@VF¦>7$ˆÄÉ©©GjIúû'·?ƒ¬Üê`¢l®eS}‹Ôª¤Ã«Ûå™*Ò@½ùÔj"еbS—ॠ-N»óýÐvÈ"D3|î±Emû€?‚ýP<hOlÛŽˆMæ¸Á)n~šôµÎs•ÛêäV’)kÌg¼Fþ¥UDöbè¶3ªÞ¨¼qûm¾ŸÓÚ2WiqQZ’EcÁ9˜br¦·í€¼H2 íxšˆF#hÊÖÄ^”ŒÇçÖFb¦?÷xV¹ÓÉ;ôpDIËØ:¿3ƒfBì¼ç×-u¹x:“¯©Œn˜gú.δ!Ú!6h4G`ÐÆlžñ ˆ7³bÀ{î Á¯ãê,·zBv_øû¼kߟ VZ1 -Þ
=CEÿ«Å›w? -¤e€ãnd:€bD(+;χ/À~MOjÁÁlíOè…'ÜKߎҊª …4ª*EjÿNy÷ôûÓ(Ÿøf&Úª”ÑÁ‰4ÇÁwG90 v› t £d`(%Љñ<Žx -ÀÐ&<ùÙø4³çI©Š¸;™4Ø -e7o;0:®{‰ðxh:ÞG'z,ZÀ‰ÌDÊ‹ØyÁ^|ÙB¿ŸI,óHÑÓ€8-ˆAÍ„Íß·¨ÅÏc]ŽU©P|)±ÐÍ0ÜT‘}^±Çf·5º2V½8*<ïÑôIÙ‹CÆK
ª¹"´œÔ†œÔÌä¶õBêS;Y²m÷{> X§R¤ÞNûèþ!w0åÔfïx•èô¦µ QVÖ>d=MÿÕut
éd‰ÅЫÑz\1½®œBÆ©³q9ºœ©˜’¤»÷^”›’îBÎôEH ä›rYä^©`\²º7± ·Éç°}T·2§*#ÂÅyIZr -¸/âFq–4Ig„_ÛK k™#ÚŠ» -ó‰øb®uðƒŸÑ:“X•ÄW†Ù8íÊ/¥zÞYÉTvAC9¢B‚eHcéûölÁAn1àŸÖ}âÉ -=ëb³êbMgãT•6D¤d4h'¢ªH¨` ‘Ë©A‘„8•r8¸n<Ê8„ÃJž
”ÀB$•ùÜH@ñN ÒÔž‡ÓYÆüBŽ¦1+‹JÙiº~U2ÖŽU`Å©·Ø‘Ëç>G9D"‹FBœäçè$‘]Zþ^%¥²Ó0ž”“ýµ(Càɤ–k-_²o‡ÁKgRromM–!½è€µñU‹·-Æq¨õ&æÑ<[ÌRÏ=0àçý&ÌHŽ¾òîƒy³ž½ŸyY0e®ò<ÿ„½½rþ¥ŠóU¶òñ\ç7Fús¬k•C”\LƒM*û‘/z$ùhÚsëª=¤õs²Ñô¯ -ƒŠŸeA2ª÷&ªŒÅ½ÝL¬Jš‡s÷'_ßn¡!’Ž‰csKÓx‡_ŸY?V¯O‘0Žˆ&›@–_ØÏ#b¦Â¸® Îó«š0éVY‘¨K³›Z’Î -ÂÝsÇ™$Õî’ª9´J2^œÌ'P<pyŸ¥”ÿÿ¥¤S~L"HUdåØö"5’ÓqüŽoasr^@B—Œ£òþЂÎPÐzûœ -k*ôŠ˜$SIZ]ÕèäyÁåøÛããÞßs/¼Á@sTÐÅ®Hd^^ž™ -äâ8‘›Â}Üùò½1íÐ%Ç’D;ìҦä(n¾žâÜ(w„£ô¶qëz!†ˆY:WÝ0ÓÑdq&®Øç!$¹h'f©Y$§°‘;…8MÀ’2 -ËBSW£\Œ)¸v=‘焽mù{ê¼ÔˆcÀÁÕ]+[ò‹,?ph†ˆ’óxŠÓ¨XQÌ?CÜþÁ¢Ïˆ©UE”èBºXNÃÚ7$–º2È9z¹½bn]ËÿQèð`ùA˜ežÖËhçpñ3ë AQäœà^j"4òõï3ª½®xDéKØ~Á¡#AàµPÕ·ûfóÑÈž£H£ƒÝÛ4zÚÜïøß2Æs ¼î62" ™€Ï¤+™‚µ®=?í¸ïd‹v M’(ƒ¥Ðßd«1k$ôá~/'zÃ@èëß–VJWãÊóˆ.“«Š³“c ‘«æþ½'üwÏäþ$—endstream +xÚ¥ZmÛ6þž_±@Pœ
ì²"©×|k{I›C›8p@Û´,ÛBmÉ'ÉÝ,Šü÷›7ʔ͊,j8$‡ÃáÌ3£Õwüé;åwi©"ÊîÊã‹ènäï_hé~Àþ‡€áÛÕ‹¯ßñ]®Š4½[mqeL<N²Úüºˆ—0.‰o–¿¯þEì™Ò™%öBYk`näûÏò!5‹wð«ßQ{E¿oé÷g¢¿£ö¿—6‹ßŒÌâŸãä£,©V:.dò_nOTlcéþ‘f‡5Œ_uE”·Áßß.aÊs+s(]$6ZÄ1r¾x½—DñGõŠý7zÕÐÎUœæ¢Ø»4u¥-ö›¶ñ¹¯›ÝÉÕݦںóaÀUa¾U‘$S¶æ|¬ºº8i'ì„O"VEBèDYÍç¶ÚW°#me{<ºfÃ&R@}T¤éB9Îý®ê‡~xÁ/èÖíR'‹?ñGH›ª/»z]-õbã)Û¥Ž´ +¶mÇ
\_xÜà7ÃÝ<¦tjíõ•’@ÏìÓ$`ÕÅõ>?©Ó(V™öæQÃ.-L»´Z/ªÿë¥ÁmÂ;T
ìmà®v;#D©¸°×BüõRƒuFÑâ¥ù +ÙUØ4ÅÂuK/vpØÍÐ+î~»wÐÉçmsx’ÞGÜUë-!*,h]±$)ŒÃg†gƒ¯‡º©¸ÕW'×¹¡Úpÿú‰Éûz¨ú“+«{&ûºg–Çúp±ÃØdaº?d–ªtpü²ô–Ÿ+Õ¹Š2”Te`p(èkêˆU›»õ¿ÿX&ÉBÄÕÄKÝPîå8îldTaôdÿÝùP‘J“̯Ãù—,
C‹"sÀ$9œ£ÛÔx•vü~¬Ê½kêþȬMÛÝÞJÐy‰£é™ŽÍƾþùG¡´ütL•¤õÒD‹ó0Žìd¬|»Âùß—Õi¨Û¦uX•N¡oƒUddßà +¢(ô†~ ¢Ów·æn +•hoîu3T]Û¶°[·Ù +²y Ðv¤oà';)hTà‰M„®Üs‹
[¨sæÍóø–Ÿkáh›p^`ìÝVºúzS)n‚øHM±SL|ôÔQÅ9Ð +çÉúø–lS`Ä€.ÈÍâÛÀÏ‘®
@oYèKÞ„{nžªnïN=î„ õìiဿð§mæ°ƒxr Ú"I#¢\éD”ILí•ØìÄž•®¯ÅKû IOµâHc½ÛâÑâTe&Ÿ(Úõ}½k8yVÇÓð$¤iÌHÈqÌ…y¸™þ\!ïyªÀ3G‹Ú?{Á*u_ºŽ›ee>QˆtOË4Y(±pÁQ>uÔüIÅòà$ºÓÑŒ +ñØäàÈ-#XG [u;„¼ØûX{îâq:Ôe=Ì!P€ àOd‡_Í <³H7꼿çyå"¡$û¶íEb×´«¼ˆG: +ñu‹™¨ÀÝ}>Ù~n®djÏà ”xøÓ+Y3àdmæ +üθêÈ3•fÓÏ=MÛ¬®Á’¸á2NÏÍ°ä¯Þ½3ÆKh¼wûÊüŠ¯T¾7f!£/Ö]SY7¿™³YƒE-éƒ×-Z(T4~ÿ$߇ˉv.Ïoà\¹R/Nª Rš|ÿ0ÖOú1F\H±,pº£_ößä ù®åç©£ +î{~;º²k}Þä)[Çz׫%Ÿ‚ƒ½;xñ¹²/î¬Ðaô.|Æ4ª`y€ÅšÉ@ÕÑ´ òšmt8£O¢O=ayMâM$Í'¹|¼0ŒŸ¨·s8øQFmj¹µÄ²ƒ”§¨çÛ'á¸ÔÄï¯V“,à„,"õí¡Þ<›È‡©Ä¯‘Ä¡Á'¸·~_mî'<ب»
³o¯ C5”jäíÚónÏLNhí@‘šlJ ^ý^æ õÂ}pO'ù¶”ŒWhj‰Ò¡óÝÍ’äs ‹™¯ªè\0¤„õªD}þu!Å=ì—•À•˜ëäü>Ó3½O=ûcõGãþ¢ÎT1B¯Ð™Ý[5Þ ?[òÌ…(‚²ˆ(¡D_W‡| +ŽMCOí+¥¯¬åJsMO.4êj¦ä‘#ÕÚÌýׄ¥zZÐñçº +endstream endobj -677 0 obj << +909 0 obj << /Type /Page -/Contents 678 0 R -/Resources 676 0 R +/Contents 910 0 R +/Resources 908 0 R /MediaBox [0 0 612 792] -/Parent 660 0 R +/Parent 882 0 R >> endobj -679 0 obj << -/D [677 0 R /XYZ 110.999 687.904 null] +911 0 obj << +/D [909 0 R /XYZ 108 690.907 null] >> endobj -676 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F101 484 0 R /F80 371 0 R >> +912 0 obj << +/D [909 0 R /XYZ 108 666 null] +>> endobj +913 0 obj << +/D [909 0 R /XYZ 108 455.783 null] +>> endobj +914 0 obj << +/D [909 0 R /XYZ 108 282.319 null] +>> endobj +908 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F120 538 0 R /F95 412 0 R >> /ProcSet [ /PDF /Text ] >> endobj -682 0 obj << -/Length 2981 +917 0 obj << +/Length 3422 /Filter /FlateDecode >> stream -xÚÍÛŽë¶ñý|Å>Ú€Íò&Jê[Ú椧h“ Ù¢Md›^‘¥%g³Î¿g.¤¬ÛžÝ4h±Àj4¤†Ã¹iu'áOÝ)%Ežçw.KE.íÝþüNÞ=ÀÐWïT˜"…Ö úÃý»ß½O³»LäÎÝÝiÆýá_+³Þ&r%è¿[o•„çûõ¿ïÿBÓS¡RƒÓµybÂ7ÿXo^}
ÿÕêßÓÿôÿÂMðwëIíê‹þ½úSO¼çÅ)¡lˆ;_<ÖØ0üW¢kè¸ê=a>–øj¾„1"Ë"ÿ°[I¥póøf¿ûò¾›Ér‘ÂÇrI¦[“K!¥ÀŠÌåCáæ°š -wßœÏE}ÀåÒUÙòóÚúµZäSÙz¼øƒÿ(×>ŒŠ6Ž]ç/5p«º8ÃÚb6XTk#T÷ˆwÏ^ö²è'ÚL$™óºÓ¥¹>œæäPb‰žPK¨%"ÕÙP²éêþ7»ó[ü¤•(a’ün«XRB³OÅZËÕesÉ`wû¢f`çâTÔ$xAQý~Χ’©°Qü^»oªdY•µoim9Z§<6eÝ}zÊ¡è -šÖ6uõüâ¤ö4 3Œ²"·¾I„QÌÞý‰6–õ†1ÛMŽºYÚÍx
— §£ÊYZ-¯Ð5a¥µJVÏ{øþ!…Ó‹/Nƒ‡ò¸ÖÉêè/¾î"—°v ×vÅ¥ë‰Ù’^•5‚Õ
E³«Šýëýâ lyX»dµA¬N@CÁgÁ#´$cº¦¯•à76)œr*â'5?}`|ßñRÖ-šä)¹ ˆ8í£Íß(`|‰Q!T}£Ç0€ï-‚ÈÍò™MÏL´Må{¸ûŸöþ±+›:8ƒ´"u#™¡¾,Lìˆ -£îUF“1£cAg2**OЮñQ7õ¶¦zìa
È®DsãÚ)L¸žw`ëV¢ŠQù6`Ógh<›`°mzNÊhB…2ŒÌš€‰‚Wa·â&h*«bWyÁAâ”LÇ•GCéÀW®† m¤M”̓˜L†ÑÆ!¶ùŽÁ.~ù&dÃO¹á¯ÛðÛ 'û5 -v›-dÒ̲j *Êbhº¬I>å‹#$ôÍü…TùHˆ#-xÖûêzðË -ÙBÔíÚ±ƒÛ=¼ºXç–º¬@cáœT íòÉAWXå•ÒM0}®OœìïvIG6ýàAörFʡò“£a®¦Œ¦ms/‹oEuñÅá™_~¨¹æAâF¡±Oïb”v™Ï~³áõ™E5< _¼ñ̬€ñqaE”Æ/܉¤N€÷l®:p„;Ðù…Hey¸íÌò^ê„$ÓÎÑ2j¼s¶ûxuœËxj—ËåkeãéÙÿðtyth’‰4Mg×Ö@œÎ}`±½îÀUãEÖèÒ\‚0$D|[TÐïÏaìòpÇÀß¿zù¦Ü0²)M…—¡ÉøþE -ñ,2ŽžK¨‹½YãÔ -·ïsÒq7½hŒjõ¾ÿ‰CüÄýâµ–ëC¸':¹±xƃ—s%Ÿñ*XKrsG@²;PTxƒÃ;P»Ÿ»O4M>‡û`š‰¦Ï–е èÀÅ4xR—xc9•·õ!L‰ÇÚ:ÑÐjŽóGt‹FäƱ˜d¾4"É`/”©`ðŸÈxB(Kwœšh÷Ê™F*Ò¾/ŸŸiàRávÀÅvŒ¢¾Ÿ‹C`Œ^U5û¢ -RÐÐWÙt~µDÍ\Ñ14YR0ö›k×–TþæÖý… oÅàæ›ÞñJ˜ú<ôÓÿ\ÃMþŒúK
ž¬Þr‹?bo9ìý^úÄ`fèKÞ0³¯™ßþË óé_N$fx';XkñÈX7¿2YTsN§¡/«nN9èºÃüp!4ø°¬å¾è¨‹|_ñ™,ØrŠB\ œè)“Šl’fû{Å›{¨Ò}Û!âø':“(áÏ ¥±²ZdPï-üì)þêi‹4ãZendstream +xÚÍZYë¶~¿¿Â}ó +•j"Ï…ÖðFºïïvI´ýþ«í_¨ý@ÿ?Òÿo¨ÿkjw·Ó©ÙþÉ¿mÿê™ûµ$J(“[æß.'…ÑÆÿƒ¸Ã‘›õz>S|¹œBk‘eÚòðvk¹51R~øüÁ.–æU¹âøB® +Ú™0If»IbW’Ód?(mmÝvå±®š²Ç×N)‘DZ'yj«fxäX‘õmS¿Ü$êÏ’BR`-‘Ø€Š…V½óp.A±ÞÚË¥hŽüÒdG°/ºµÝLçH2§±%?cïˆ&<# Šâ€éSݸÁ%C†+K:´¼Z`Ë×o¶]y§¶Í±ìªæ‘{`GÐucS*Ò"ʲ`Ç®x^Î¥"Ùs5œyZZçŒ[ mÔD$ 2é¶}ª¶Áv-î=Ü©xûr¨A0ô<œ»v|<3YY=ž-ݱ:ÝEñöTveã^EÞöµ67ÝÀû…»:híëâð#7 +È…ÊÒP°`V +V áh^ŸÂ4Éd¾ÅçX†²ŠªîùŽ›p´8cQ[J´ÍþÌ`KCÙ5ý=?ú£ß![‚†µq~ +…Ûë +©ã±lÊMº±.Ý8"ì+@³lVq$²™YÆî'œÑæªtª·€×°ÿ¹á~8V—¢Ïðv„ +v_–6VT}?:×ö)ÂõúxB£ŠC–˜ +ûÓÔx[4ýla6ÇEõ«xüÂèôÖqru¼›x
Ø0£3¥CGÕêñXÚ^ÆCŠâdSÕ¾ª+TêË]d‡!JS‰×4U`Ãê·Žs©öiª£Þä‹´qÎòFšªáðJàÔ
X-ÒTGóú|™)h œÀ—B &#'Åv¸ó™¡?ta +Ä}6½gËŽÒ„X®¡2™r‘™ÍO¹ïÐvñŸZ¶X™r|"ëtÐã£?ô"ÊǾYeAÚÚ’ +MŲkJEÙ¨ŒN“®ð!¼w]ã…Ð-„YN˜ka" ™¶—kÀª‘_#ýÈ{à5äÁuõ_ÊáÜy?öí-) +è™Ù6 +‘¤ÓêÌ
;ÿ"°ó¯oÙy,…Ì”ŠF¦¶(ÖU\£.¾òO3ïçØÉ6¢Æò¶öåÒ-cü–Êün ¹yâË tùóYWdWDv¿”e_×kk‹´T¾óH¥ƒ +cp¼lêM׫ÇÔ…³4áØœÆË©q+±{P ‚;ÿ…+ +ñ†¯Ã¨ƒ]TP»jžˆ,Ò¯yjDE%ºXLd¼<¹ˆÓZ «|ÁN.^`uÖv&a@ëß‘ +endstream endobj -681 0 obj << +916 0 obj << /Type /Page -/Contents 682 0 R -/Resources 680 0 R +/Contents 917 0 R +/Resources 915 0 R /MediaBox [0 0 612 792] -/Parent 660 0 R -/Annots [ 684 0 R ] +/Parent 882 0 R +/Annots [ 920 0 R 922 0 R 924 0 R 925 0 R ] >> endobj -684 0 obj << +920 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [416.206 238.774 438.124 249.718] +/Rect [210.106 533.302 224.552 544.206] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.2.2) >> +/A << /S /GoTo /D (subsection.5.4) >> >> endobj -683 0 obj << -/D [681 0 R /XYZ 110.999 687.904 null] +922 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.153 356.132 382.599 367.036] +/Subtype /Link +/A << /S /GoTo /D (subsection.5.4) >> >> endobj -680 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R >> +924 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [418.005 226.782 439.923 237.686] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.4.2.1) >> +>> endobj +925 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [124.996 155.425 146.914 165.955] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.4.3.5) >> +>> endobj +918 0 obj << +/D [916 0 R /XYZ 108 690.907 null] +>> endobj +919 0 obj << +/D [916 0 R /XYZ 108 666 null] +>> endobj +921 0 obj << +/D [916 0 R /XYZ 108 453.726 null] +>> endobj +923 0 obj << +/D [916 0 R /XYZ 108 324.376 null] +>> endobj +915 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F90 426 0 R /F95 412 0 R /F120 538 0 R >> /ProcSet [ /PDF /Text ] >> endobj -687 0 obj << -/Length 4177 +928 0 obj << +/Length 3831 /Filter /FlateDecode >> stream -xÚÕ[Ý“ã8¿¿bÞÈ3Â’%ÀuÜ]qSÅUí݃'q&æ;ØÎíÿ;Ýê–,ÇÊL`¹*¨Ë’Ü’Zýñë–"oø'o¤LDY–7Y‘‹2Ñ7ëÃgÉÍ34ýþ3É]¡”†4½{üì¿Ë‹›B”Yvó¸µ=7ïWéí½IVÂþÍoïeÏ/n¿ü£íž™§Ø]åB댿ùõí}¦Vïà¯\}nË_Øò7·÷i®¹ùKû÷·ž”YgBå†Iýf9T&´*g#}m©?Úòƒýû•¡!¾Y‘¦"-$Ó€µ©ÒdÉ*ÕØó³Ï=ƒÒ¢9|˜Ä¸k1"1´(²2dc #¥!w5“'«uw8Tíf IA×L‹Ds÷ïdªOCÓ>û¹ûni"tá8}·$c„ôKC2‡íqSŽ[·ã’^\I»afKŠ2Iž$‡úo§º]×KbºZºÍÙU·*Yýx+ÍŠ?:.ÕK‡ºjqöeW÷\ýÈٶ뗓¹W¦®û¥¥1~RÇ}7âB#“2"W…›?|bhÒU5Ð'%³Õ½m:zFÏr‡8à¶ÙÇ8Q -¥ÓiФzêÄœ… ¬d¤F<Wmu{:<Õ½åÌÅéH“‰r¶Ù¯ìÎlj×0VýhE„7Èó3³íÁL{ØPù͸£R]¹Ôַʬ>ÐËúÔÓ‚çiB%¸W‰HÀÖX‹"¬IÀŽTOõ~ ïQòlá7ÕqlºvË5€½Ò%LÔˆT1ëäË’-Õ7ù(s«>(¡n?Ç£-?¶é÷åÓBIÇðÇñL˜ÂÌhË´”d&Ò¤ô&ÈnE ‚šÃú´H¶hœÔª³<aÎæ!ƒ‘¥ÛÕC
Âx›&«.¦çÐÕ(·ðf ºMKÏz‹[¹×·r5RÕ¡Z÷]ÄLå9x4¹qÛГ½j¨Ò²\Ð"¢›ˆLç¯*BÕÇf¸DË"÷/Y;UÎÖ·®îŸY»,u+DÃ|k»Ñ)–zf¦*ÇedqQXËs.B°XãÙò'+=Ÿ³¥’ýÝï¬h}ˆêc\Ὠ~—$j¦µ(1âe'Á²A¦”“ݵËDÛ >ÎÌÉ-‰(pÒN›%o‘†ã—8l#ZaæVSÒ”+fXµßßQͺ–“«îyiÕfSo˜·U‘ËŠc³O®ãÓUZ¾.¼Ø+£+Ö^l -“†jôš–E&W"O羄&UÚ¯|1-Á²9Ñ>/i -¦ô\†ûÐúñ‡šŠëj¨^E³=k6«˜6oÒ`«5øò"Ÿë§“±Ð–tÿBUë]Õ>×½t=5ƒ¼5ÖYñg=_ºwØtë®;O×
a·z´üM[[ÉõT̪¯µüiBÙêØwëz1A'ë—Ï7ÀùÉieÑMÖ¨À\Ú“(ÞCÂíNDî}Ð…¾º¼Ûño-eÎK—ò#\<41(ëq’‰L^¡Æô‘u~@¸ë7µ¬£*@ËG—}=ò༥ÓP`©J¥¯Ë ‚ˆ Ú0 ú{‰ŒÎÎüáû¥•ùÃK¦Ú™Ù¿žœšj-Œ±.j×üý‡‘°›W:Œ‘U=ÙÁ×]ÅÝòkˆ¼<ð}kð—èàêÊÁÑýãÂòå•›`wD ,÷ÇÈn ª,åu»ñO2_Òhк|ýÏÍ?>QbŽUÓ#¿î÷Ml.)xÛ¢¼’eÿé\fÛGÑÉ+›˜?ù77âÉ,).lâ™ö,”}›…=ºòê06 †E+ -h]é@¸5Q&À…ãþÔW{ŽBtº`¼pâ0 ¡,%‡ÌðRû¦Ž1ÂÎ4¿&f΃„Ž#0θhLñHÝ–§XõÄuïPm)½éŒmh@-¶”%CxŽPS‹Õ3c[õ¸C¤<rGDÔX°“XšQˆ&2þþ]ƒ„# s(Øý‡ˆ‘E™ÝL]š%3‘xÃиUÒãGŒ]ª}ÃÌ nBÁržž›¸ÑTµ%Š$–»ª`òòº]Íuy&ô,çâ¨Ù~=rÌ’–Ò´Tx⊡Æ9Úí´Õ/\}DSuG/œ–Û7¯ÂE¤:Á07—²ŠðŽ»Œí Ï‚JSø‡twÝi¿‰íj‚ÅÂcõ1šàš@Íåù³¶Cg3YžöUû9]»b`RëY²’RëZƒ½¬z`èô·SÓ[¡‡úi[mcûE@þM[õ/ÔÏ%À4–æ -SH_–aö -íý†tSñ^"DÂ-÷GÃͬºˆ¦k(úóþ8÷ý©Îñ4gCÚí bÝò¼ˆ!A'‰i‘©¹\Û¯ï”Ê?ì‡1ðÊÃ%>×JBt
x„Ñ5Â'nGÙ
0Kø©å„ ò£«ÜÔ—O{þìÜMÛÊ&’«I%Ǹ÷ïöÌ -ªyàŒç¼PZbW=
|z/äú:7£|Ì9¡˜‚B1õ/9ŸŒô+6¹JêsûˆW@”ÿßÀ°V?à|mr£Pä¨Å¬p‰ê}‡½ÛÀá‚íes -bu¬ñÞ×Dm$…XaCxB‰ùÿ‹•™M!à)Ãéì¶Md™*I+æ¢ÿÉHÃZ‰â®ó4µ)ܵÉÔÚÜQåf à"\(Ú-¶© -´¹8[Oü®Câï‡óÝO¤l3kœ©€+ŒÎ¸Lgybo·\s¹ÐδoM˜BüïK²ÕŸœÄ×’äÁaÄÕšO~”DÄZf-ßm•ÁE"—Trco(¼yG¥ŒßQÉ®¿£Â‰ +xÚÕ]ã¶ñý~Å>zÑ]V¤(JjŸzi’^‘¦²@\îA–åµYr$9{› ÿ½3œ¡DÙô/@Š,’¢fÈùž!WÞDð'od”ݘ<y”Þ”ûWÑÍ#þJòë{|ïMxýðêÏŸåú&¹17[ ”Ò‡ÍÛ•¾…ï’hõÅí»‡Úé©il§ç"S ÀÆy»½7jõ~åêSÛþ¶¿¾½Sͯ¿´¿Ÿ@M˜µ*u >9Ge„VÙÓWúƒm¿±¿ÿžP Ö3q,âL1«’Qš¯´Á™¯>}˜È”DúƒTÄ÷gTX€I›ŒÉxc’\Ä&·È¾•±ÞTÛâØŒ‡¦Úî~FÄ +ó\¦Â(ŸçCõý±jË*@T+ÍSw²ö‡[™¬xÿ#B¯†bÏCûªhq£¶³«zžð-Øäúùjî•Q"Vñ™Ø_É&€,A@âlU tÅ©]¬ñ™F7†±î(öÉ‹·u¦E”›kT¬;ÄCÁeÂDj¨'ºÚáö¸_“üÚ—áõH€²”Ö2g^Ð0ýÈð–Õ“Ç ˆcž-hüT;˜6¿*JnµÕ-°í‰:å±' Â-4™‘ƒ™RhÁÒ"Eÿÿ(ÖU3 +‘ÑLöøB1ÐxV¨À—A롪–sµ5÷>aiHÃehaWw<Ö:SªàS›˜f<nR5ˆá3¦<É‘1dߌàœgë ¨ó°«–{>¡o;?&´¯ÓÈž¾ŒÔ\‡ä‹òêPô£ãùÅY¡çV¬Ì¦®: +t‰däG‘Žd“$¦‘•$juN¸U +qáÒO’Úz¬ÂPñËfÊî±tþ«p‡5ô@S‚»p¾í¬~ñ§–ò·( ªÊåY«Lxš[5Ù!ìÅs°9„4Ò‰ñÛ°·¸’£¿"±vïßo=³em>¸Ãô +óSÊrd'·Mh‡±/ÖQSmÇpÔL´|–ÏQZkˆöïhÜ¿´¯w£ÓÒI5Ñ:»®¯ì ¢i¨?Q_PŸ2f¦¿:[ªNSœ¿g©:OTÜ€x@n¹X4ì9¤Ã9É=©†úÉ.Ó5¿šqÛÍÁ“BØ”Sj»…°@ÃO|Zžq+t¸•.$"š©úr§"‡ã8œ`µü fÕn|ŠLGž˜TåBÙëqžÏiQ&é´ï[¥Ò'¶u0†áô0½æÆâ+N¦ µæ÷(¿ØR¼ïSëõµÜ w;ŽN»¬C.1ÖRdSœóº D*ÝÖsÍu±»TŠ
ÝðÝyånïØ}øg{k6B^{Òl&0°t’ãÕl¦O<×O¡àt›qf×vUà Yì¡z4Ý'¡¬€‹ivš89ÃùLêL¶?§\¾_dË)+NŠ×Ïš¦³U.K|Ã_ÔåäRG+Fl՞˵¸‰xÜoŸ©†NÝ:jLV›…ï6 ]ȋǾª8 +À•àº|8Õ]#ºñë\âñ +ÌwST³9ßš½Ò…y}Å*Ž={
žÚëZØ™Ï=°g/*˜â³ Ç|àuV2àv¦Âû¯ªFeÞµ?ØdÕSê„ø—u4Ãb÷5_u7ÆòË.J†ÅeÆööQÎŒ‡¿.‹pñܱ4Õ,wY@ Åyb·wÇQ, NF+ñ(ĬÀñCÕã\tƒÿ2G"M*ª ZþD8zárñ$öþ¿Ûà?ËäFH©BÿmÛ{ìÞ‹ÿQ@‚ +endstream endobj -686 0 obj << +927 0 obj << /Type /Page -/Contents 687 0 R -/Resources 685 0 R +/Contents 928 0 R +/Resources 926 0 R /MediaBox [0 0 612 792] -/Parent 689 0 R +/Parent 932 0 R >> endobj -688 0 obj << -/D [686 0 R /XYZ 110.999 687.904 null] +929 0 obj << +/D [927 0 R /XYZ 108 690.907 null] >> endobj -198 0 obj << -/D [686 0 R /XYZ 110.999 620.915 null] +930 0 obj << +/D [927 0 R /XYZ 108 666 null] >> endobj -202 0 obj << -/D [686 0 R /XYZ 110.999 603.71 null] +206 0 obj << +/D [927 0 R /XYZ 108 564.152 null] >> endobj -685 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F85 373 0 R /F87 383 0 R /F80 371 0 R /F101 484 0 R /F11 537 0 R >> +210 0 obj << +/D [927 0 R /XYZ 108 546.911 null] +>> endobj +931 0 obj << +/D [927 0 R /XYZ 108 463.962 null] +>> endobj +926 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F105 415 0 R /F90 426 0 R /F95 412 0 R /F120 538 0 R /F11 600 0 R >> /ProcSet [ /PDF /Text ] >> endobj -692 0 obj << -/Length 3642 +935 0 obj << +/Length 3713 /Filter /FlateDecode >> stream -xÚ¥ZÛŽãÆ}߯˜·PÀ¨Ãn’M2oÞÄN6pì -nM}¸ë°k õ>tüÚÌLƒç¶¸œø[YsUQÓXür([·Çu>Þ
Ü]p){yk]çÚØÏÉ -Ž|z܃$1ÛBf7p’eÇOÚȯ—¢>àHXÓ7ü<¿àQ:~k›æÌ%š‰†èP?¿iz÷àäß¹S±1¨6CùÂkoo2Õu/Ë:”G<Í£kIÉh¾ÖÏÜŸ -©C¹r
o6œms -1QjHÕTò b -¡§r`Î&\¬*F«²~ž(ižÒFaƒïú¹v€O›Hϼշâ›Øs-V§¨'sÆ©Û¶¨Ÿ¿°
C¡¿] -Ð@eÃt¦} ®gT…pb£B;NóѵUñâªRt¤M“•d´§rÑ’ÅäAÇžÑûpúVûÂáàëØ|soiÙàM¸a/N2êįBµ«ŠKOì“¡t.nbˆÀ«t>7ÄK;9MrÀI$|J·6Ç/âÀ!t\³Ã]¥W)OO#:~å•bã97€rêðÄ…½‘N9À—¦•Îû¦îÊ®–ØŸ -)‰Ã@~^\{.»®ØUòÁã :®à…cWÖ´n©ÌÚBãõñìúâÒtýŠY•¥Þ•=.‡Æ6D¯xíF‰ß6ʺ5ÃÉÇÉ0 -€FPdoô68õ)‰žÄÊŠc•oåS_Br´ Çßm’$ ·é)Ò·šŸì>©miËϯ-7@â¤1Q5hFFCU¥¶ë®Ä†)DË– C ¨vÓ|V¥í±,UÐæ>¢rUt=… ”(-wîÈŽÃzG‰½Á‹’'Ã^%nÏ7ìø±–Œ»° -P°¯_xˆ/Ø.™”oÍ•;r¤öidÂË¥ºÍ«¦ÌIœ²lt*1ÏDh+vÞc]aÐÒ‘“‡×¯6’ÅÁ¯¸žT+&b@å3TMK¶ŠÂd7Ç©õ oDÚ&°E^ú5à›œOb=“äÓ¬¼Í%@U²]§?rq!©{l„@6µoÅFßÐ[NëO™ßöByr -ðh »¦:p•à5”tÈÏKSÖÒsÀÅïO'¿Õ.Mw·bÀmSà÷¦ñ: -ÙáÓ(%6!-ŸDP€d+d;d–}'ù^Äo+,;µÎû9–Ã,‡ -Öõ¾“ië0-ö@DÄE€S\;IŠðÌ(¼~Åu™,Ti˜¿Õe`ïC¤:@ld0ÿ³ÿE’klýX9žF4³~ºŽ‚ïÀÎêYÒ4“ƒtèøY¥ùÉŒ´B”2ŠWP’+p¢7‹Ÿ\ëóMi¨l<¿Ž©¢„uÎ - -í”ÀpuÓó4•¾£!˜Ô+0>Ímú’ؤP©æä”cz¼ëÒ6}!Y8x“¬/4º‰±Šò^’!Of¾„Ök#PBÒA;p¨~VXÔõ׶&±Zd\Wý˜’´Óü4*¸ŽÉz[K´`‚³ëº‚ð¿òò¡z'5ÌfWþcC×`„‹S‹0Û3dißœÎáÝùJpëçMõg"ëDnÔðù\7”º&ï°B’ñ*?ÏßvI3^Kep4yt䙊¾°9;ׯ9—izôsÎå{Ź -:Q•;öcê™ -ù%‡¤¤[‡Œi:mu¾±M"e“læ4žÖsï93»•{%LŒGsCDNF¶ÉHm"¹+þ!™ì^(ˆ‚cŠÊÏ“ýÔܬ87WN%â÷vOvü=ˆÌ毷 CIdî~ærql¡eúH$œ…Nðvi:ú9»=¬(Úâì0J$˜€êtBA¡PP4÷_i‡Ì¦fà -v ŒDÔâÃZ>(É'Tc¿zýp3,ìýëýËa7¸¿Yo†(´nROˆÙNBÔƒyÒ¨&@K}¶µ/9‰ˆÉnqð±Ÿ\êZ ¹ù“ f†:¼ÜT».ZV¥’ƳƦcΞàq¨õI}ß°–¼ú©iËßšºç…§¼pÅe¹Ÿô*ñj„ïÛ97÷;Î\
ø…ܬýŽÓÿŒsö#Ïÿ‚…qendstream +xÚZY“ã¶~ß_1o‘ªf +3§™²¹gõçÛ©2•Úâb¦÷GjM¿Sà¬7S$‰J ++<¬Êè¼\¥9Ž|óåc“Ó饈ý1)–0‹ÅZU¦ÀÄeJ'¹_s’æ«ãÔŽMÛœj^¬ +²§
Ú2]=7 +ØHZx¨½•Í*Œy¤6cɤW’±w3õÇ?¬[
¼/€±éNŠ—÷Ê 1 +û7õHÊÛî4ö]ë÷ÄÄÈx¿Òšï¡ˆï!ïÁ,÷À“OpnC¬3•Ø¥ó]?cµ}w»W¨ÂxÓjNC³«yd!8O€´(X‹¾5ÔXuW +<–¢þzåhgåhˆöÔ‘kq¨µ¨Ã/¡™³~4ttÓi'ƒºýUçS_Ü$Œ„>°`dÄÄ]Ó×[\áýÕ†sµ=àVÏH³cÊžmá#Û’©mž×¶aJ|ˆŒœ°ö«wx†5Sû®;2f"£b +*æ·ÝXÿI<óM}¨ÖõeÍñ}',?ã@f›¶²²]³ÇsD C£){žyWBC¹2…÷«/vÁ«œþýh‘Å}½ð·ª
QVáƒÎs³ÅÐ'Wh—ÇmR¡žò¦…JʈžæzŽñJ½ðå™2!t?žA…Qbx fÕ"¤EÑ¡t>béΨ…<yø”÷ZÎh;ÞGv—ÊÙäÓ‚rë’`ÑmËÜŸûf¬¹:0ÜÔù€m3ÖïeŒYìÝ©T{°½4 ÉáqÀN¹
×ãEd”*mŒyê»é,¢ïæ# F7¶ðº¸‚qm[Š„L`Ù2j…(‡T¢LÜ'ü8`õ?(Oãñq
ñ2¡ã$î{IînÖšc³\q꾯NO5¿0|@c|9¶pÔÅÚ—Aï:§¨øõÛ®?"Ô¯Ú—uæV÷L•ÑI +ÉçUpºt£äC-$kÓ“HÖ¾oNÛšiu_
ä8‘ÞÓúžÈd©—½XÈ–©â¢ò¯Ž¦¼ý„šH€æ…yo×$ä°ÊÁ/’Ÿã¡ê-‹[XË…€õž_g'Ò(ÒöÒ]ù²XÁ®å1†É1òÉœ†ã¹œq¯<ªãçáBç‘rîúѯX“˜ëŠÈ¶„ÜYÖà0_8jÿŸHÔÍÍ2HX|¸|ˆ(?$R™—8çP@É©˜”»<VqêÛnWßÎh±Æë
¿‰lgô–ô[¤r‘稟N%†çâ+HëÜwdÙð/-@oðp_¹|0ï*ÊOIt ÁÈ<üÌœÑ2•œ)uÅHJ»X"ۇȺ附2p¡òsô©c3Nc-|+¦5ÄÚxùÀš˜aÅïªÐ‰5ff`káôñµù)Y9F¹[ªÒ#‘5/[mœI-zÝ`ò’Ñ¥¤6 ŒT¦ókY¡2½ˆÈ4W€?›D¶¦Ô˜WéËiЮøAv'}à‹ÌSK‰ûÒ“½UBæ—[³XúÂ8"+O@Îá¤&I-A ¡0 + +endstream endobj -691 0 obj << +934 0 obj << /Type /Page -/Contents 692 0 R -/Resources 690 0 R +/Contents 935 0 R +/Resources 933 0 R /MediaBox [0 0 612 792] -/Parent 689 0 R +/Parent 932 0 R >> endobj -693 0 obj << -/D [691 0 R /XYZ 110.999 687.904 null] +936 0 obj << +/D [934 0 R /XYZ 108 690.907 null] >> endobj -690 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F87 383 0 R /F11 537 0 R /F80 371 0 R /F101 484 0 R >> +937 0 obj << +/D [934 0 R /XYZ 108 405.502 null] +>> endobj +938 0 obj << +/D [934 0 R /XYZ 108 230.3 null] +>> endobj +933 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F90 426 0 R /F11 600 0 R /F120 538 0 R /F95 412 0 R >> /ProcSet [ /PDF /Text ] >> endobj -696 0 obj << -/Length 4310 +941 0 obj << +/Length 4023 /Filter /FlateDecode >> stream -xÚ½;]o丑ïû+ü¶mÀfÄ}åž²¹M0‡Ùdp㇠-þuì‡ -#âôœžûåK€2ʼFƒÃ -&ò`×e4>¸€ÿ&WóÏ£Ò¹0Ht,´$uq÷€ª\í´vÌêP›’_X%Žû -À¯h/¬yƒqwÖþH
l‰±‚C%-Þí°¸pÈFè?£·JˆUó’wZ iòo&¦8£]ø˜Ldyr5©–Ì›J)l\IÁkx‰G‡¶¯Ðè0;ÃË•Q$2ÿ6yœ-Ôä+ëL¿emóâ:q¯Áì*3óEÐ~Ü,éPR¤:¿Pûž·A^>^YºSJ‚ãVm¨¹G«b[ÖåƒgA¡šAu MǯíÉ€FÛðÛv8)º¬<k½$jzœo–ŸÇ"q+Z¿åãî-oùø鵉u]ˆupNëž_F#ÍÝoÅDŸ@Ï*4xZÆ»V0¬j>”‚ø|Æ™àŽNf¿¤Å€NIÌxH¢ªÙÔÇ-űӘØ(>{ L-É}‡N±Ù´Çf NP’bðE—/¸ýÖ¡•?- ¨!ææÑ)¶ºlw»¾ìw‚þš("”ؼ)ƒ[g1¸³Ÿ˜@’êÕ¶Ü]ƒÅ*Žõ@ -YîÁ°‚˜ÜS/ÄK4{Q/˜iÉØd
Nq{†v<Quß´]¹E~¢ãÝ„DbƒT°|9‹<0rĈ:AÚà³x -3cžD,¶ò‹n'íyGæn‹–?e8F/jt€Õ:2øêŸHU×ß3šöå¦m¶ßÓ[Š -_¨œ¾Ìøeï¿,0!ÄÍƺêÉTAÛ -KÏ^þ;þ¶¯Àð?»(¢?ºuïÁë¯À%ÄHbž-âÀ€‚lÜ@W~ávuS¶£ ¡¡³ckn¶Ýƒ÷Âб -§5{ -5ÆCÁ4€D^éLu6Ʀ#ià9f«ûãÞžº|D»ÇòµM{@Ïgœdc{_<» ¾ý©Š€´íÙ¡¨8Í@þ -¥q†’Ò—™0y,h´Sü|Z–S0—ã¯.OvÆw9°`&a¥ä]ë(b'-TjT"MóËR££EÎ$b®\Z -z¢W.B;ÝT ö#“Ùïጀtxåÿ -Õö á“ÎÐ&›£"kLè>¨ -ÞUî>èÉ$“ëîÔíä‰)Ä;„É¥7¸G[˜½Ñ§Ë^¾r{Û¿É4œ˜Ü&1æ!Ù°)¬ÃýÖŠä¾xzÙp0œÞ{%ĺyÛ=é]ü9IØ•HòË*’o.Œ2C9v>[²0ÉÄú†àS¢ -T)GŸ$<ÜÍi{ÅÊ>HøÈk~æLÈù™°±Ü,¢áäò–»T5^+ó/±J[okÝç|elÍX@ì8†ƒeî±õ~Y§Ti!^fÇŸwÙßt…ä_¡t»!¼naÔ%ªà{¼æÁŒë¹Î8C]`½Èó8v-•2ú“Âeè8Z´}±é8œz¬ÐÙ°a׸úyÃÉN¼ì‚><ßòiç»0þj±Cµ¡e|û£{÷ˆw‰ì…% -Û - -™g4’\-T'LºñÀ† nƒìÇÀwò–17Ëɲ…YÔ"‡®åª¸Z¢ÚJ†ñÄžª1 +xÚÍ[[Û6~ﯘ·Ú€‡Ë‹®}kwÛEÝn±™‡i€Ê¶<Vc[®$gf6Èßs!)ÉâÌ8™t±0¦x=<<<—'êJÂ?u¥dv•äRä2½Zí¿’W·Pý÷¯”m¾ÆöëA‡ïn¾úËyt•‰<I®n68Ð:ò“ܬßÌ¢9Œ‹åìÇùÛ›P÷T¨ÔP÷\d:†¹±ß·óëDϾƒ¿jö=•¤òëùµI#Ûüýý›ŸÊ¯%B§nª¿N—JD¤³ÑJ?Óì7T~Eÿå—ÀU'K#L¦í¨R2ÍgQ†=¿úþƳ)–Ñ“\Äö a.X)J2ËÆ«$ÎD¿¸Ø¯ÊDÝ®X–»z³iËîƒ%.¾Ê8Ú_ªt²Äm¹]iÙw0"K¶»ò0B³âÄv©ìC²†S|Ð ¤P‰¾†÷açÙ¥4`;H¥‘"FéT"ãÃŽuuèÚò 5’¦TƒhEÏPšŒ)ͤÈÒÔRš)-ºm˜Ð8Y®þׄ¦±Hó$ÀR”ÁÿBé~úñ×p¨Y¬êXÅÊçf[ίuÏ~•R7mÇ«z®fû}qXÛïâÔ–-—‹ÝŽíiÙ–œÊC E%™P‘Ôž7SªL&béö½ªiU»TWão4k·ÕÆRÖ9zy6*6Õí¶ãžË‡ +.¿²ìd-=W_œi4c6<¡3þ]kÐIR
dqW<LI†ƒµ—MSïšÙZ½C·š‹õÆVíŠU¹/]5ª´ÓaW¶íÙÐuÚ +mî*‰Epñ0·ò?у¬Žh†W›À)èDƒWîDx<ï:ÁU#x¶ÃwáñÎ"Tç›êí4rÂßðHÎöª€lê,±þ€ÇnR»Á¦«V¤4 Æ™V(vÅ»¹’3:mø$./¸Ì"…*Ä&\çæ)†DÑhC¸m) °ðµwíÛº©þSºå‚Ë7[×ÛÿºÏ}]ZÊ;;Ͳ´Nq.œIF¦l©øÔªìÄK?TÝYÒ ¶é[ֳв-l—eYÚqë¦@V“r‚†¢ãjÒõT'§pÚý®Q6Ýb¸~ +â³&€ck®§Þ•üem4³2gS"G§¸UŽ>Ø[^‰<ÍÏM…†BåÌ<0·N~Z2^Ø +Óª„ŠÆ> +$Ã×ÙŒQm6LÀŸ®mʶŸŽ†k¹#Úxl(ø'—\½æ—¨¦,m3ºÑ.“ËŒHfhÖीȣ°î?¾Y5¹|ûÅùæ‚ãú¨Q3çQÅ>ÂHH@~ ³ûh¡°’ §ûœ¯À]µ=_“ÊSwÜ5+ï» +ŠÆc¨gXh<¼`!Xc]^£G¶7RÑl/ + +LFšÔ£©áôDhøËÅX£÷Œ0Ó/£|žÌQ‰}ÇÏÒfVó0aôk˜ÍlWµ6ÊpRú”øñÛgô>ŒRä.ÝmËb e.L~až öÈ›UËØò +EpI>up2Ê]ôÞFv°%¶Ñv1 +!0ŒîÖ\G©GúÙÀD—c +zq +'Hj“ˆ$½pã‘¿5=¶<Œ5]ðYv–Nå8v}`igT‚cïoüZ<¶¯…Õ÷í7½êøw]YEÓ´\AI!ø%‡ÀÅ\¸MÕHZh^e§côùn>ÏU6»=ÙL Ì&`˲…ºoøtü8Eå)oÙÓpŠ…¦;ÃôsŸÅóf5¨*·¥¦Ï6jÖ}¶’Kj<ã[CÖtaf>‚æ¾4H‘(5ñÒö›ãû²Y‚Æ{é;(¿o@
eñ‰4NÏ^7ÔU_ûËõj¿ +Ü…Ë@µ%bY‚ËdËàÖ¶J|M¯mÏ87¹OwO=œIMO>µ½.@e®Æ a¼1á#;Vš$]ÔRu‚ßZJ©uð–s~½Å©½ïœãzàQƒ¸XZ2z5>ô¹ý€‰äì}ÕÔÔ6]‚¹ÝšWr{¨,!ÓªÈõˆ=Îaf"þÿ?|S:””h([mÐð_E¼gå +endstream endobj -695 0 obj << +940 0 obj << /Type /Page -/Contents 696 0 R -/Resources 694 0 R +/Contents 941 0 R +/Resources 939 0 R /MediaBox [0 0 612 792] -/Parent 689 0 R -/Annots [ 698 0 R ] +/Parent 932 0 R +/Annots [ 944 0 R ] >> endobj -698 0 obj << +944 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [157.872 626.36 179.79 636.915] +/Rect [359.372 484.72 381.29 495.624] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.7.2) >> +/A << /S /GoTo /D (subsubsection.4.7.2) >> >> endobj -697 0 obj << -/D [695 0 R /XYZ 110.999 687.904 null] +942 0 obj << +/D [940 0 R /XYZ 108 690.907 null] >> endobj -694 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R /F11 537 0 R /F87 383 0 R >> +943 0 obj << +/D [940 0 R /XYZ 108 666 null] +>> endobj +945 0 obj << +/D [940 0 R /XYZ 108 440.575 null] +>> endobj +946 0 obj << +/D [940 0 R /XYZ 108 285.905 null] +>> endobj +947 0 obj << +/D [940 0 R /XYZ 108 202.966 null] +>> endobj +939 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R /F11 600 0 R /F90 426 0 R >> /ProcSet [ /PDF /Text ] >> endobj -701 0 obj << -/Length 3816 +950 0 obj << +/Length 3556 /Filter /FlateDecode >> stream -xÚkã¶ñ{~Å~‹xY‘z÷Û%½W$m‘l‹I€he®D–\IÎÞ¶èï¼HI–öâ4ÁáÖä‡ó¦ô] -3-8àl&“`¦8ó£·žAa–«kÜ»ó@F¤²$÷lÌ‚»v -§l<2:ÐãX«Ü9OÅûç=Ï™.7™ŠòPæTþ ~<UF;®Í -ª4L~7^WÝêx³JI¢’,¿‘’ÎÂM‡ÉF+Ã
¤
)@‚ƒ:ÛŸm9T[o~Æ]mý²Mb¸Þ{‚[Ô̱á;FCYœ‡ªm–tD¹ -RGçðr¶½zÞ±r¢Ûêls¸œl30dx®JË~^ôˆøîÞ$ˆuxw¯µÊã˜pî[ÛóÌ©„©!.EJÐ=…¢Jò¹ n2Àè¦<ÐV°I`Ce"Cà·Î ?Bÿùñ6Ž7ý -‹@=òt¡ר$ò3ƒXïø4ÃÑ3 0]?´: xhå׺1ág¶y®¶z³Ž;îzL½-[wñ#¢§¶ãFg‹Zqóáh;vBÝ@« Ñr Ñ|é- 0`‡ªž‹ýÏUo÷+Òh¥Š5í°ä†ŽU*,âÒ -Þ¦¬/{+ÈÎîêö±¨e ï«nPŒz·’‰Øp×ÀPÒ®÷ƒâ³qIÍ„ëÝÌLcwþùƒpݬ`7¼m!åC¬‡®8±mŽÅÖ¢w<¸¯žPŸà"P+pÒs—ÚïF’¸ñ¼ÕÁ¦å)¤ê-a,•:[À™©vËâ–mQ -%- îPª…+à®’Ü,¸jý -W@B´¹•+žCñƒtPŸ.õPkË=4„xîPÜ´·‡¹É¦¦=Â9dÔ>
÷2JÒ®:‡û/ýP¡zY£a™(íy`D¨Äˆ4$åŸ2‚ï -ƒTY4cQûô!
|®jÑÞG7Œ”òŒXu¤òhŽóÑ~cÅîf }ÙmÒ«Ô¸©;Æøöý¹®ÊŠØû›I6`ê¹}*^xøQÑoz1¢Ù/ü{é+´GîkK€qÔ„^ü¿bòñQÙžN ÈŠ±>° €²ç¢+îÅQæ™JÒ™™¦G vx¶V:|/Qˆ -3´'Ò¥MÏU9\È´ -sËÂï#£Ç¢9op›‚Mžƒ²eÇ¿{ëáx’`Eß@JúŸªó’™F¦ÉÔ Ÿž€p'ó~É”±Y6‰·(Ôà
~è.¶û˜{µmhN¦.åËâtn»A -A\÷R‡ -‡âxí«½´PšgCȔÂÎå{"è»Ñúz8â5và¬`oO;ùKjžìpl÷n8è/èT±WΕ5LB©²ÿ3FM×cT}KŒ -É_¢t2·ŽUŠóìZtžVè<^3É1Õ›¸§ê€vdyB£"ŸmŠ ªº¶ÁXNî·!k‡ûì!|múÑ•ÍÓ 3XØ£E§¿Ü:1*7f‘´M&*ôÄy|-ÑA¼I‡ž -$
õ Ó†;öN“[È”²—JFÀ0H_y¨;Üqãë/|]`‘І°ç5FHB¢0žg˯"@.3}'â4Å„¨à.¤t3@6•mJgm†ç-Cd#¡÷ <&aüålŠ‘9óž-Ã(Æ-!kh×Rø‘mäG¨h1^ynxÒDšàI˜Ï˜SQvmÏÖÛ(G»7¯\|ÛHñå³…
s{ú;Y쯷:ßüƒšo¥B¥—oȪ»9ò×hª—»ÂÌhÿò£xðX520®_«:NðØà'ÂÑØ×Å£;Ço—†$€óèë%ŠD±VðÏÙ¼N‘eëH¾_¡B`¢ÌT`@¿‚"R±/`½B‚Óîï—Ë!ŸÉneù¨ºÈsÒÛxðŸßF --˜—À©Q6WÂÑ+gq R=»Ñy
@xF¶A±UàO´ÁL…ËñæÜVÌ£ A˜¿ï¸O©½_Ž)&p±÷0Lø¦])öõYœÿîFh^0|Ì䨷•·Z¢hí¢h89ÜÌiy#8uoïñ<¿Íž½_.‡°7o³æ»õÍo,¿¿¬îmnܛ⩕è„áæ¬FBaK"ê–A°^ª -
_.©l -Gù¥žkIúa-qHþ(Ç{º¢Z -µh¢¹¬ÝíyÆŠßL
tû±€`\õáW>ftÌWz?ÛÎ=½R -ˆÿ[PÉ#•*yÆÕpÔhþ|ÎitêJÀ0•%œRÈ(%* +xÚZ[ã¶~ß_á—66`³"uïÛ¦MÚ
’4ÀN‘ +VGhþ×+-Ý;ìß|úðêoŸçÑ*Sy’¬‘€2&ˆ<¾_G˜ë/7?>|AÃS¥Ó†ç*31ÐÆq¯7»Ä¬?…ÿzý•¿¤òÛÍ.L#éþšþÿs 5¬%ʤžÔ?æK%*2Ùd¥oˆú•ßÐÿÿKળ%ÂP…™ +v¥ƒ4_G9Ž|õÙÃÀ¦8ˆ>ÊEì_âb…ÂÅU'*™ƒEs>Ûú°Ù™(\_Ú²Øèuypõ‘[lUq¡»',™uYo¢`ýÞµM}.ë¾S<àMÏß³}æqû’\×]KYÀöÜgëŽ×ϲjãj™lû²18O‰9Ú¨8Ô¯ˆ“Ÿø̾]ÌpX“©8öó\ÇkT=”‡ßȧva¤U +gBúŸQG¤²È¬nß-Cw
Õ!úäú“«…EñÈ4šì¼ç¹pÛ·¡Ê/A¼3h¡ƒ«4Îîö¥W·ÖïvÅùÐÍW4à£R/.n~i¸`2v +áúß
^ÑS‰ÿY‡[4ÇÛ™(¢…æ÷ÛÌ]V(ñâëLxo}WV !Hñp?PqjÀià3*–tƒ]o¸D"†…æÚ_®=—SI»íÁ鎮®úd¦°PúBëɶJ‹Š6èŠþJk]CWLÄóPâÚµë3Œ3úfúBcX|¡Ñ.è\ÎÂx³<çǪ޲Úå*“ F²USØŠW"áJƒ¢@£œ€{œìééäè„ØÔs™QtÀØøMëšvJT¤ƒS²ªjðüñTS•Í…G§*LÓÿËá‚1•y‡Ö^çk2!X@—\Dç¤sïN DG*e¢hª)T6ƒk Ùo×ÙŒu6]²%ÒúGt6¾é,nýkÖÙÛ9UÐ `i6¯3`°íb+z+F6ÄŽñ Á*fšŒ¹Ì<—t¡(à—´VšN2ê§%¢Án¤Þnü寕]”ë<fâä¦[¹Z÷èí=Öëš³,ÌüO +Ññ—8' ½±†œ¹DŒ‰Š[H¢æ "P:Ì?iæW£#ˆëƒq\k"«*ÂV* +ÆXsšK/8ˆãŒœ?ñÔHA¥S”$¤3w}sÅáT(½ÁÀµ:{9 ãÞÔ
°«ÎÄßgÙ"]’l¼ƒž“+l @Ç +?wûÌg€_Ô*˜4%
p7ì_yKdÖž\WÞ6"ˆ:9 +Ûèûa(lÁ‰Y0uúÎ'¼+¿L-ùȳÌP§·ì•»\Ú°Ý~ +6Õéo|È$ÉFtdžªxàKÜãµIÀDšE_ûnH"Õ“ÔY ûĦaŸØ¼Ÿ? i„ÛQòg¼ Å éz”Z„Õ¿Elí³¤QàS`Gw{žþùB65ÂTy[9R´(ŒœAk%U7b‹”(jžHïŸkžûrxÕ+}*Õ œÌøjƤdÒc§ÏGÞòåD³ª^Sê¦=ÛŠž“!4=y²K‚†ÚžY; ÜàßKî'“îí%úáqŽ¿86aF©Òߘ©‰§˜h‘n˜)£Gy2Þzß:0²= ¢ÇÖÖÇRú—,ÜXyï´¸œNGY„À಩¡§lJ”IzA(ÅÐBàêw?PÜûºã^ˆ[h%üÍòä²åNA®™€€¾Ü;zcÂ…¿¶W¶»Q£Ì8¿´/®þ +ßOæf5¥Ç½àîwO@øД]ý æùå´”ý >×µáyz»Ä‘²§ÛÀ·µâ4ñÏ:Ô^Ip¡Éï¼&¡7!†ñ%”núÔÉ(ûðqääzJCõõpCøËŒ±q€N4 £,œÉOŒ¹¼ÃbÓ^Ö~ïP¥ÒŸ€ÄQ–“Ÿ{AóO§bÐO×øG0,ÎÅtL•§r€”-¥[}ìtïñÞþóÍB©l•'Jk³ôs¹ÂQÇÿ +endstream endobj -700 0 obj << +949 0 obj << /Type /Page -/Contents 701 0 R -/Resources 699 0 R +/Contents 950 0 R +/Resources 948 0 R /MediaBox [0 0 612 792] -/Parent 689 0 R -/Annots [ 703 0 R 704 0 R 705 0 R ] +/Parent 932 0 R >> endobj -703 0 obj << +951 0 obj << +/D [949 0 R /XYZ 108 690.907 null] +>> endobj +952 0 obj << +/D [949 0 R /XYZ 108 513.098 null] +>> endobj +948 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R /F90 426 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +955 0 obj << +/Length 3995 +/Filter /FlateDecode +>> +stream +xÚ½k“ãÄñûýŠý†7µV4½>„£HBÁ’JP…l˶‚,¹$™½
ÅO¿FYÚ=BêêÖ™QOOO¿[ê.„êN…é]œ…A&wÛÓ›ðî +qå›O6E¡}•‹8?ã"à‚lœ +ïâ(BÃ,ü^Ûoós_6õwBXt—at¶(R%tyZépœ7A;Öœò÷O»9 +
{gFÖ”‚Ã'ÉÇñ°@B~„X櫲.îU´Z¤#â4û +WÈ:Nù¶m|*« +! á¼ÎûÈÙæUõÌ£›¶Èâ¥(ü¼u,·GóVöMïœ.nî©ÜÌs"øn-Dú‡¢;Õ`ºèN¿y+÷<€3sÎ$`5•÷-ÌKRØMûêKxI‹ßo‹b×-XDFÿï’OõØ‹¾<!cÝy +ãcÚyÓ6?Ý«pE8tDªNpµoÚÈ¥ã j(šnÁÒ(e‚(Œþ C:e +íëvbÐéXcÄ:œÞðt4Ø
„Ý;»b|È/•²+ú¾¬ÝÀ:¡±Ò7žø7ÊÉÚd:Pfj@. ¯lþük™º}Xû#³Rf +Þ¥——Š|+”4€¸E½¾¤@z¦'ÞØ¢³—Ùbb{«¡ C§<}Î.³cä'på™tžÈ]>Û¢€ëTx +†ÈªìÌ“€“TÓà³ùÝöìì‡@Â}ZkjŒŒi/ùî˜Îk˜R÷Òfº´€áweMá68D!€‚_ù‹¼•h—¼¢7– a!¨ÅD +x…ðG‡ZuKA† òùBÆ2µlRsÅ'˜`]DHâjXDWêH +“XZ—´‘WFõÇQ”ÐKiÃì´|X:¤ê¾$¼p¬©‚ìcáL²G†2¼ûJé¾X\Â(¸Ò VF´Ëx£•ƒ
‚ÌÑÚ©YÆ3›|ç‚çNk¢Û¬1ãQ²Ÿ«r[bÀjw0G)[Ç£Ñ`Á‰y†‚Æ6²æ‚Þ‡^0™¡¬o2ñÿ‚{„ˆHeWi(oÁ7ÒQœó6w†X+3àu“ivRôO‡Ê*Ï +„\$YˆÀɪ0›E]A‘8îc²ß9PQDIzg±B²=ÉT{¸càk¿#«×Þrבñ²¬)JêÈÀ•Ì¶••ñ·ž·dÍë^!r©2œn„˜«ÌtÔeQoežCk +¹ðã¢É‚„b;²8I•oŠª!_èVÅ!œèÖÂp‹â/êp:½±'óÃw¿³QD™á… nmVý¶¦™CÎË…ê)–®†^ҸðËï£àåþðÁçü~u.UÅÎÜÏ(:´.Š‚4Câ”ý‰Ç‰ðq4‚;lÁQÉpl»=)%‹“!à'éæ È~-N\¯ +C/“û¼Üi +¹@\NA}©ÍÆ3›²–uââ&+}_ìø˳Ãë˜ö€bÔòM³Ôq±T¿QòŠñŠ_m‘DƯA!J ºñØ{Ç9*5Ü–¼äÒijfáØﳇï>ldn´ƒ¿o÷çÅÝõ_)PD6ÏŠƒ¡âÀA—v•g½êò“@šUMÇ¥f½âL¯6-~ÏðÀîí±åç÷"üVÇÉd€ùt•l¨»P…‚@üÉ9ISÄ…œ¶è:Îgt¹>ˆö†¶YKgÒÀØiľEtd½CáZ.0ëž]‡™Áº<ðób¡JC€”Ùì€I ¦H<©'”çsU²%VÜ*!ŠàdþÊbÁªK]ù¯Pd3H)çžõZÃÌw³Ž d5ì%Jt!Þº”±ªƒÄNUŽm¥uFÛRÔ³…AôX”bÓf#.G•wSߟÀÔPBÞJ}Ä„
£@™ì–kJ!cµÓd˜E·éáæ̉¹ªÇIËÎ~¨Ë“iÔIŸ…ˆ9Ø^{àç¡ÿ1vŒïV©¡1mÐRgÅÌ«Nú#Ùa¼E}[óoq:÷ϼ`Ü Æ›ó’³v¿CiJv<3ñ8!~´tqµ>=vO§˜ùc®¼ºL:¤ZêŒó9,‰âÐã‹88}›´z&+óC] Nªñ sqJÔPÛ.Ôpýã1± +Y&Ô…y𔻚ÿ–Û¯Ôuoc,iÏâGI~´ášÐÉ9ÚE*4ï&ë†çú
ƒXü†Ð›b¹ás$ˆ]H*pÄûÚ¤™Ç8¦Œ%ä)Næ¢5;Ä¥ky_4ŠÇñ¤QÁ݉êýó‚]5A¬í¼–-’ißvPŸÞØèºOë+Š ˆISÎ>z÷,KÛfw¡oñ)çŸ}›Ÿäê&àwt=ñ€&±A€Pïöó²•HzrˆŒ„q`?‡Ajˆø¯æ'¸ôþÅÜeWPÉšû)áÀÿëz¢ò87rhŸsÙÿ.6`¬o‰P´›G"èŶŽ…YüÀG@›|‚“Ò÷øäR$ú‚Füd͸&šº‡‹êÜ8Ûü¢ZCÔ?Mƒ‡{|±'ö(Ê_9ÅÜ©Š¤!Gw^l‹£p¸ƒÈî÷î=,VñÌP¨ô.ϸŠew]7´x€bº„*A¯W,eñÚ[=«^!äz¥mK\1þ¾³r¥[óúvØCŒ§ûI x²Ÿ±€ÞxNYýúÎW(ù¤Ñlg‹i’}ý¤²æõý®9Ÿ„ßum”ZÝ¡ànÉʸfD3ô¤W²JŠolxýM‹•\4\ýØõ`U`néÙG8HŸ°¬äëWxrº†‘?
°«¶}ÂÇ
â¹ôüÐœøû( +endstream +endobj +954 0 obj << +/Type /Page +/Contents 955 0 R +/Resources 953 0 R +/MediaBox [0 0 612 792] +/Parent 932 0 R +/Annots [ 958 0 R 960 0 R 961 0 R ] +>> endobj +958 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [159.875 494.38 179.302 505.408] +/Rect [157.582 410.419 177.009 421.322] /Subtype /Link -/A << /S /GoTo /D (subsection.3.11) >> +/A << /S /GoTo /D (subsection.4.11) >> >> endobj -704 0 obj << +960 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [417.733 251.899 432.179 262.843] +/Rect [401.494 154.618 415.939 165.522] /Subtype /Link -/A << /S /GoTo /D (subsection.3.4) >> +/A << /S /GoTo /D (subsection.4.4) >> >> endobj -705 0 obj << +961 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [452.031 251.899 466.477 262.843] +/Rect [433.384 154.618 447.83 165.522] /Subtype /Link -/A << /S /GoTo /D (subsection.3.5) >> +/A << /S /GoTo /D (subsection.4.5) >> >> endobj -702 0 obj << -/D [700 0 R /XYZ 110.999 687.904 null] +956 0 obj << +/D [954 0 R /XYZ 108 690.907 null] >> endobj -206 0 obj << -/D [700 0 R /XYZ 110.999 480.168 null] +957 0 obj << +/D [954 0 R /XYZ 108 664.406 null] >> endobj -699 0 obj << -/Font << /F78 368 0 R /F80 371 0 R /F101 484 0 R /F88 386 0 R /F87 383 0 R >> +214 0 obj << +/D [954 0 R /XYZ 108 394.792 null] +>> endobj +959 0 obj << +/D [954 0 R /XYZ 108 371.764 null] +>> endobj +953 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R /F90 426 0 R >> /ProcSet [ /PDF /Text ] >> endobj -708 0 obj << -/Length 3148 +964 0 obj << +/Length 3278 /Filter /FlateDecode >> stream -xÚÝ]“Û¶ñÝ¿âÞ*eîP H°oic{Üi£¤±óÀ“¨ŠTH*gדÿÞý -qJh°x?¤]ÜG¤jrzb?ì*^p š×›)˜Jj¡¬:#$NcÎB&æW2xÆVžÝIwwê;æÊøB‚µ(št
æTËÀ1±ÿëfäÂkô +’\¶ÿoÊŠd -.yÀŠ8Ññ†„D,·.Ûu”0)¤ÖÿqΚ§9ÿ§¬5/$ñ'Yv‹`iâW#»œx«•nŸWUÑõÜròÂ5X¸¢%¼?›yhÊzèó£E½nöØjѱIÏ[PhnŠwàK×ÃczíHàr¢ -y= -d«¥C•¯‹ÎŸºpöÀÀЙW¾Sl—,šGêQL3Û'ˆc=Æt•àØé([ÜïÊ5R*²‹CÛlŽ¼3ä\°Ü †øûÒFè‰ÑxÕ5\ƒyÄÉrS0#“›ý8¥ÙòEA)Øq4äêä’žaÞç? Ü®M]}àšó§{ÃHäÐr¼}š"ølªp|hÃÞÊ
.å8OæˆN©à®Wxy -¯–Êœdêhª}æ`Ô3”ƒÚ×Ä"|Ðõ±å5»ë³G„îæØìvͱÚ0àmá@š®ìË¥E8üjËÃÄ[h£ÿímsíWUNŸ*%¬™û¥ZɦÜîÊ -¤‰nŽR »O·=C„âJ ®of²_X -^”Ã%¶K‡NMúînIªõ„˵ƒêݬ -þf™)•Æà^©\ãv¢·(Z|“ÓÝ,ë;G<J©@åMqìF½£÷€,%J‚-‹†üù#ïc„”šzñy]®û#yOEÀ”S–dzJLrN(õþ,%µ,ˆ"¦ÖÆ Jè¼-ŠÚÓmÛpcÛ6{ðj ØÙñØ¡-9»–rf€"¡…Œ¹Ä -8ªÐlx-ú -î£Ø‘V9MYçμ‚Zm¼å|M_ç¬5jÊ -mÎ`ç½?vÏR¥[Ú³#ÊuH)Å ùÌÔ»/½½<ã»a=OvÖàMÉ)õÑX¾Ù„¼8v†GDª.îĹ"£Ñ• ãœ÷ƒY'ê68,&¸_bì‚â@®jÀ’ߨ\P¸«˜M5Q8ÂÇ'>ÆÁ5>-ÌÓù A¾,Õä³<‘M=Oà=Œ*>Ø*ûYPQBʦàñ¨¦ Ö :¾’ÿMD0cô²vRÚÊpÁ¤_ÆË*å\$§•Xè¨ý.2ÑI‹bO@_Z+â$#•)/Й2¬4eð.ÈG•¦š(Mwð Þ‡`p0É*k.1§ºlÇ-NAt5Ñ4‰äâ -½ªÈ(F›GUE$“°ªàµé~ByÛâØ578G€• -ñ¢MSÁ©HãôAº""GˆŠSj@¯¹Ï½§Q}]L"85ƒOˆ1°WO4Y}¬ªqËgjFñe‰š3k$µ¿ÎÙûDrÓöÔa\0£ïŠQ8^T%‰ÀÜpp&->Ûsß–=>¬.ê麃„O…R™É±ž»Rµt_Á¾ ~=úHv¸ƒà
±gsìœ9•Ày©qFn”Q³RDáoý§ª“¼Ý¿&á-sendstream +xÚíkoä¶ñûýŠýmáeEQ¢¤|KÛKpES.NZ PY+{Õj¥¤½GùïõXÉ>Ÿ/ Z 0à%‡äp†œ7¥7>üéö“M}•úñ&?>ó7w +mºKøA›°¯²›¢B&‡3Ž"ŠT’j™|%ãÑd\ùÚÊðAv +üqܨÄF2Þ"óÙ~‰Dà+‘Yå’ˆ)’+f´ì˜½Œ»ûöJ`ºƒ³ûâv«á²ÎU/ço¼¾Y;ŒÀW±uråŸVNAG*Íœ‚þ +nÝ6-7˜†d¦xÉ…â-< ”$ü>=±Ò“øa=qH>gºÊ[¦VȽ¡Rн{ƒÍ¦ÝóÀ?VT̹¶Žl‘zß-7Fï38˜Ïdg9Ùs·XÈ&eÝõE&6M .àGûfYÀ`Jx{TjXïô:u²™:1ǶKrЛ‚!ù¡éH!pIðc&ÜÏÕ(º Ñ]Ï}§|ÔÉKt +ýžÝ´cëz!‹¤|Ī½:k[6ÿ+b‡zÅfžzê.œ
:Ÿ
ï@à´'kØ2¨•‹ÃÝeÀrÏ|ó:«¾_ +–_4ãGPÞÙŒÁQ˜¹lÎHš¢øq…²öXè–(BÅÑhp +òãª3Kô#)8ee»BU‰‰y +ï?&À=¼]?3ðù!*~f%Ô1xú$™Ié\nhžÄ;l“~Çp"|„*¥–fbBLà‘2:–@†$<Œ½|?¸;“c ÐÕ¼mx€'$ 4DzÊZÞãÊ0DÛLœ:lÁî,/N½lÝ3|ðïÍj™]Uå‰Ì›b +°k·zpˆy4àGLÿâöe&[&
”6ÑÒ»›€Œ§1„¹<U%Ùvƒ¶šâ7)ë¼-2 4 Êj¼/ +VA¨!ÕÄ$nk&W3À1í8+ÌRCòÄôIÏC?—ýÐáðò©ÿb û§ÄjT¬ø„ت@G•^ ,-…¬<ù¿súŸqNöÂ9n‡¢;'‘š +ðGû§ÍNDl3Xk‚ÉÛüêò}š<ØËÃcoâ¿+X‰|؇ofZ8"óÔp%sšJ´’L£_O£è¡«”€z“hzl¡Ñ³ªâ,Ã÷='µ4”ƒŸ-¸ôãKUa\é{§¦¬˜¥yH§ÓÙ»cY<bï[0áÈ»wèÎÜû•Àjt[G:ãy@“"øu‘®“¡!ò€v)V5/=eºáÇ¿ŽÝ¨°DlRÖ-ªéuTRÁSܽ>')Ç$w.šC! +¥pŒÔ$I†_}Å¿oeN[„B„‘#d‘§¸¤:Û&œÏB;«:ÁJKá9ÉÔ®h‹›ãot©eAœ‰õïU¦‹Hƒ5k<»)õ°£¤Ú®"³Cij,Ÿ#µT:ÜÝ÷Ÿf}~A<9‚DißQ0Vƒ£i5H1è*8L +Ø‚«ƒ'•&D5UjÖîË·Tj'ÓfGÓ¶Fâ8…´ç@I·Ærs—R0q±—aw’—˜¦0oJR~¬‹g-$(\L®¾·žý¢Æ· #½H5V°òl„®r0'á5çç–‘vW¼o {Oî0&ÒѨõé͹ÚsûFÈ<5]ÙOJ°Š‡±êŠÃtÁ1Wq°ÿï¢m® N0œ&)Š'ÄbßB +\H‘âÀ(xŸaã¶gØz^¬±@gž+ÆJüÀþ¥ìBüÀoMæðnKx$æJfa}l¾`Ê +‘ºœŒÔÛpHòÑÇ(xQ[‘¼3[ê0útdÝÕ“µeĺáß×eWÞ`-BÆ‹[¼½[81Y{ƒLŸ/^ª2ª²º].¿®¨»ûŠšƒÏ©™ 0׉ïKS•øÓÄñ§ˆf³¼}÷þÇ_À;ü¼bìJ±ËDhkn!_¾=·Pzh +ÈÆŒŠF˜é«è0ŠË1ª¤øZ±â2‚DÅ‘}¬HUè;ÿË~1·%>(î];Ï=;{_E‰}dfòø³ Øc%É™ù'c¬LYÎïQ(ÄÝ Ôk/£F-OHmIH³ƒPÑ’î|ÓÁ‘âm\¼L›Ð¯•l‚ÔW!ØØü(Cí݆¯&ïÔnön2}ñV}‰’¾8P±Z¼Š›ˆ_Y&È/ãnÎÃ;^ b7!G9¹D8-Ø€Ä Òü’”o2Òýám|¨+½*ÎÝ:ùˆ ]‘×]àõfüÛÁ¾,óþLqZ±–ûaŠiÓð"û+ÈÂA +~D÷Üq/¼£Ñ+1ʯϩ-©ôMò!ðë+£tÈíRP6í¾¸˜vS,i86´ªrxø²ÑàIæOR™´‰:/ÈÂ0z“X¾PYË ¨ ?̹&ÔÑhúTquÂà$6#ôïŸm£È[‹C5ðdªˆ]öº¸iÞ®¼=Â=…É´Œï’Ö0r9Q(i(¹2x‚|I,H4É{áâz\’KUÀ@…â—”yRB=4 ÞLÀçn-|
,œÅðäæ<•ù +ƒFù©³1ôÐÉ)Uê—Îl.d +>R'æÉ64f}/ôAoFè64VÖK
^5£³½€5Í,¡ËA®¥´ƒ ŠOá·››É ȳR*À/ºÓš¢BŒ0|)e?žÒÕOÒÂAR>MÞ‡ڒ±°HŸ†ÄüÍ +er}ÛT늟ÎES½ºÏßfÇSU|¾v[F«
W
î{ìÞ6ÍJš‘ØÉÓªìB)#P’qwͳ[eŵ'‰eÊb™<ÁµóÞûfxì6"™¹ÃúØÕšwUêÛ§øžásA*¶ÉSåXçž;ÅU¿§ƒð)Z³î‰ b¾Ï´¯º{3Tà¦:†œÅѤZ:êD%‰£ºž=¶Ì¥,%[8rw¼]¥ä?&ZÒóSG,Ahì"'h í¹ g„X<–‚èÊfؾPâ!PŽ1øåj@Ùœ»ê{¼ +Î|^ñzP„æ×HxѼ»|},œÓÐP„ºé§‰|ȉüò‚4!Í`2júlAH +endstream endobj -707 0 obj << +963 0 obj << /Type /Page -/Contents 708 0 R -/Resources 706 0 R +/Contents 964 0 R +/Resources 962 0 R /MediaBox [0 0 612 792] -/Parent 689 0 R -/Annots [ 710 0 R ] +/Parent 932 0 R +/Annots [ 969 0 R ] >> endobj -710 0 obj << +969 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [342.02 376.965 363.938 387.909] +/Rect [339.022 287.335 360.94 298.239] /Subtype /Link -/A << /S /GoTo /D (subsubsection.3.7.1) >> +/A << /S /GoTo /D (subsubsection.4.7.1) >> >> endobj -709 0 obj << -/D [707 0 R /XYZ 110.999 687.904 null] +965 0 obj << +/D [963 0 R /XYZ 108 690.907 null] >> endobj -210 0 obj << -/D [707 0 R /XYZ 110.999 369.892 null] +966 0 obj << +/D [963 0 R /XYZ 108 573.308 null] >> endobj -706 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R /F85 373 0 R >> +967 0 obj << +/D [963 0 R /XYZ 108 491.779 null] +>> endobj +968 0 obj << +/D [963 0 R /XYZ 108 326.13 null] +>> endobj +218 0 obj << +/D [963 0 R /XYZ 108 280.262 null] +>> endobj +970 0 obj << +/D [963 0 R /XYZ 108 220.601 null] +>> endobj +962 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R /F105 415 0 R >> /ProcSet [ /PDF /Text ] >> endobj -713 0 obj << -/Length 3386 +973 0 obj << +/Length 3645 /Filter /FlateDecode >> stream -xÚÕZ[ã¶~ß_1oµ1#’"%åm›î´S4›`wŠ¶ÈæA¶å±Yr$9›IÿÞsxH],ú2;»ŠFI‘‡çòÍoøã7œ,I’G, ›ÕîUpóC}Å픀 B†þüðê«»(¾‰Y¢õÍÃÆÌxXÿ0“ó… -fÌüOæÀóûù7Ó#Æ#‰Ó…f‰’ö›ûùB‹Ù7æÿü糚ö;óÿÍ|!£pvg¨ëµùÿ†þ÷ÝEZ0®B»$…ˆÕL&8óÕ›‡îT2NX¾#/d° ÐY¬“áÙØIÏ~¿]âdöTæøá¬ÎöYÚiñà1¥”ýê—a“þ’íóUwˆnf2%";ócÞni‡v›ÑMºËìúAÿ•æ ÊØ~µ¥qð~‚„³h;û–ÞU¤dQ'£|J.âq{DWU¬©gU•mV¶
½¥uÖq¦Hç|¶ÊÖÔq|6h”Ùœ«Ù¯†7(¦tx³àp8`ž%½=Ô›r˜‡, ÝdÝñùÐøÙ,Ak‚ÄžeUíó –Ê#µÛÊõ‚TM÷6]S×2ËJêjÒ¹f¿ í™Ìí]MÍákê[V¿2ê|Øæ
õí5OvÜPC—Q'÷aÚcÈÄ4äKµi‘¶³Ì³ÈšóÀP„¯mEÏU+R{w€-Š6߶Ã1ÛÕÆ>K;xÄ{54Ñ"™ -°~ÌÕøô“EPÍ¢pŒåqìwŒOéæ’ÉÎŒ¹Êèí¾$8$ƒ0!ÉÜ ÍÇÑl•6YsKíSòîÝm¼h-b&ºƒ~‡ -ƒÏHc‡3 -oÆk›VZ®m×a·Ìj7YÝ@Z"?žèÅÂ(Ä`
“{q”w8 -_é2+X•3»Œ;»DøتÝvG"Ì7„øàÊ!,¨;yº¡OZÛgkü¡qbµsQéÚ¶¬“j–æ@™sYm÷mÖíXÏ•šybô21ïÂÐ7£?L
H,î"„KV¸0Ãcƒšê¼ ºá=° >‡šIå,x>½ÎÓbÑV‹e¶ØÔ(|rL–M8຾EY¹v\"áó˜3)â‘ð‡¼\û˜©Xü¿ãåïžÏƵ¸’‚gpR Á¯¤ë³{d±”£ðçÀ3” -GŸOž€Óp¨OkçÆ%ÂÁêjG/69†yE”Ì–OýðTØaÄÄ•ÉÐim“Ó™PÄt?¼!Rš}¶Ê°³õ-YuõǼ±'04GIïBD„©æ8Ã!„+ˆfIDQxYxKb碀EU9p•ëp`½NÝ)‡§Ð„;¼O˜q£‡Ýym0HEK;Ÿ§,²N† SÀ¯“ác'c¶é]î4k†7Ðמòý„rx¢?œæŠ >ïºçô5d:ryyZ{â´àØٺطž˜ -œvAÕiÊÜ.}«Å ¤áB‚±£öµ9ŠˆQˆ´¢*ˆtŽ{¼WF"b¬ÅðQ›„nê×Ýbté! væò´¹Blt†õƒMeCPÈÊël“Õµ -eBÇ) þªNµOG•ª³â£¨²¡õ)uÐŽžeÚæ;q>‚Æ!,^e–Ò–º\¼t¾¶ËAi‰îa€‡œq1:V®ŠŠB'ö:Áú -*Æ/ -“4èc5×z ævV]ì2m
% šSÛëLläe™Õ»ªié•ÒoÜ#Œµ
ãž“œA$¼ž3Áð -è<g”d¡rBܧ¹Òï7ΩJðò8ruè¼ñÕ‘8³;ZYy,@ÀÆN|Íaµ¥Åˆ]t`Ñ°<ÂE+”ÉÎbæÇܳÃGùE7¾Àõæ6x£øB@±89uí2e‡±.Æ<|[µ™·w— _÷–¾bgu1ƒL^”Aš+†©šAþÜ]FžÒ/ Vé“×SæÃÊkÙ×kç^ÁÌu>@•tÔK5Ú'^¿÷NÔÞ¨,§>2‰Y§oÏðÚx1$ù”ã2aÚÜvõD¢Ñ™¸2óÔÛà -òÙDø~Ðï~Ï?úµÿ¼O-&endstream +xÚ½Z[ã¶~ß_1oµ1+ñ¢K߶i¶Ý¢IÉm‘äAcËc!²äJrv§Aþ{Ï…¤)›žqš 0`‰‘‡‡çòC¦w üÒ»4)î²2e’ß÷o’»'¨þó›Ô6¯°}tøãÛ߿+õ]!Ê,»{Øâ +x@{”Êäı"9s{¿îíÆo¤ï#µ(J·‘@¸ö :+°Ëª"OJ (a)¨çw©Òcõc
|øÉjNƒj#r?ñ.B™Efl;lXWíëËQ”¹q²ÙDÃQé?GÈH‘fòF2ênj†¥Ê1H#T¦mÏýHŽŒ&ó€•5o©Í¢ïö0|„O¥H•¹u…—›gDR¤¶ùžäf%•eYØÍ*©ÉI÷åø©F»u¹=õ«§ÒJdÆm©Uøë›
¶JäbÇ•M÷Äå©ç'é¾*Òž
`çBÀÜ™˜B÷ô‚·–¯4ª(>˜o¼çBÕmìËÅ +v¥æFk?†Š‹m½”ÆjYË\MËL¤FÏ”²ß‚îåÌ0vNê,‡`nµ“1¾õÒà3|í?ù£§¡?€W‚‹ï'~VíØÛ·3‚±n¨«
ñlŠòlJ3Dy& ÉóWy›ê«¼%bFG=Õ +‹æºÞsÝÇ]³ÞÙ×e +T[k)qÓïºcÛ6ÛçÀ•9‘ +¡Æ²zGÿÈ9ïw¹Øï{~·4f+µ¨·¸—`¤'[b‰ÏÃPõÀ›Ì5mÓÑ›‰XT?Œ\$㟸eÛ¡>ͦ{>®—ñpUvÁ;á“gE®Rr¸©]çWôÿ%Õ<D´° +æâûÎoãh—´®FŒÙ=—J”¤Ã'ëtÅF‘zZ®Rª|!HMˆ1ÁÛ}¹hý¼Qè‰Øj=UÝÓ‘àçÀu[´NÜ‹q(
ÔÀ cÓwv¤úßǪåW¼Z8ï]¿o:×alþc=% +ÙSj€>nÛ@0ªÁÉ™êû=¿YoB@õãó©ùR 4bMýŠDd¯ +¥.¯gL2¡}ŽªÙ21ã¡^7hÚíI‰Yô´Sõð±í2Λ +˜)çJÇæ°=¢?Ò9‡‚Úž§`…÷g‘(sÐÙŠÓ2Ãe$€¤?™¢Ñxš€ß“Õ±¸å5ºlr†¾)¸ž¯&&Y¦&Ñ·.(°®ï¹”nMö +™d¿Pd>?\
WOY8£ S†•"ñæêÚ¡cÃHvÅ>g§ +V +ÈI– Ì¢‡
Ì3Ü”¾•´ª: +.(SA9hy‡+$ÑP:zÌ« +|Ta{Gô>+Ïôþêy&ËÏÏåa`ds[Ó,°#tn9‰Æ{ri8ͺ:L>H˜q,¼qÄáÖ.Žã“ íøËRÈ*wä +û*{?ñõ¢þŸ
ᜠ+ö>¤K{·ÒÎÅôþk–D?ÝŽü"µ€Y‰P’—G¦¨Ëñ³®Äg²»)3™1È?X€umèÆ Y9s/oñV¤Â\ËL*”¥Âöl i +E¬Æ +endstream endobj -712 0 obj << +972 0 obj << /Type /Page -/Contents 713 0 R -/Resources 711 0 R +/Contents 973 0 R +/Resources 971 0 R /MediaBox [0 0 612 792] -/Parent 689 0 R +/Parent 977 0 R >> endobj -714 0 obj << -/D [712 0 R /XYZ 110.999 687.904 null] +974 0 obj << +/D [972 0 R /XYZ 108 690.907 null] >> endobj -214 0 obj << -/D [712 0 R /XYZ 110.999 606.943 null] +222 0 obj << +/D [972 0 R /XYZ 108 505.558 null] >> endobj -218 0 obj << -/D [712 0 R /XYZ 110.999 370.49 null] +975 0 obj << +/D [972 0 R /XYZ 108 421.402 null] >> endobj -222 0 obj << -/D [712 0 R /XYZ 110.999 301.972 null] +226 0 obj << +/D [972 0 R /XYZ 108 268.914 null] >> endobj -711 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R /F85 373 0 R /F11 537 0 R /F17 509 0 R >> +230 0 obj << +/D [972 0 R /XYZ 108 199.051 null] +>> endobj +976 0 obj << +/D [972 0 R /XYZ 108 175.579 null] +>> endobj +971 0 obj << +/Font << /F94 409 0 R /F120 538 0 R /F107 429 0 R /F95 412 0 R /F90 426 0 R /F105 415 0 R /F11 600 0 R >> /ProcSet [ /PDF /Text ] >> endobj -717 0 obj << -/Length 3411 +980 0 obj << +/Length 3516 /Filter /FlateDecode >> stream -xÚÝkoãÆñ{~…|¨XÛ}‘\¶Ÿ®í]{-’=IÐ뚢-6©òa[ òß;³³K‘âÊñ]}ARоwgç=³´¸âð'®„à,MÓ«Ø$,åú*ßƯî`èÏŸ 7…3)5Ô`èëÏ~û&1W†¥q|µ¾µ3Ö›.Ôrñ³¿ÂþòåJp(_-ÿµþ«]”0‘(\¤SP£•oÞ¼]®b¾ø~åâõ0{8B*¦t³×óÝ"–ÊÄ
ÿÃnòÊþâ†bñÎÖßØúßmæ|aßÍÓ ÓÊ’iªøBsœùÙëõ€eR–ÀBBÙJ¥œq.¡¢™‰ÓwÆ\¥p’ãî½PºÍ³]ñAcøiŽŠXpÑÄ-.F`{?ÞÖ3“Dn¸tÃfºÚÿ8àb†Khã†ß!„-àhÚWåmÝìwGjÞ¸2£âv) žwuCíz) oš1ãŸðn+™¦£ôj%K£hÀõã%dkÎbü@ÑÓ -׈€Ï¤ßΪZôò“òÌ3¯E*Ë=hÎ=zdVHmßCÙmºJ”ÔU)3%³Ãaw\_ÒT晚ªk–HJð¥a<8….€+#À°ƒ±ýz[ÿh-¨Ôà –6ˆÀ> -A* -«ZïTÛý·Y“åTa3àÐmÑÜ#™ï¸ÔÓ@lWVÅMSdßµC$;õCsrüˆˆÖ“Õ_oœ/%p’-l€¯jKؤ-¨š×û=x -µÊ¡l{‹q7›*ÉOgãÍlé>wônG•¶¿i‹ÿôäèQ -í]ßoF=?ròá*ó+Y(´H`|W·eu7×ã‘aqâùÕf^Û€þÑàzqôŽÖ$ª€ sàúýí¡„92…0ÈkÀ5¨çû²©+´/È׌`}[ai@…£íʼße^—cŒ]‘‡ŒÓ÷Ù‘*UögXïznÜíÁœFW\*=ÍÍ |aJ95µÓôÜ-·~öïkäÇ“vRä¡8áx}k…ÕoGž†Ô]÷][nŠ³9í!Ë]°CÝ‘Ÿ-›IAˆ¶àPE˜nKF®Ç2¬ü̱}p,MbwÈöEgýÛÂzLŵ[µõª¾±¨(ë8J‡º´ŽL±Z%æÞaÏ-•Í:« -bºéÀç6ïl[¸³Æ’ǽq»WnwXÝçyѶ°âú)A©O¼È& ÿ(š‡.Pz$}‰\ÃN$gÓv×ÔjkšBWõã^d¡i!¶3ü}üF™Ûq3FÎoŽ³ÐYÃñÉ]N Åš”_¬ÝNPiÆèv¸Å~xËõX½Ö”¾+'7>/uPfO°¥Z´å¾D¥¥õÙ±¨Ü‡´£C@§ˆ¡Gê -¼në³%)ºßL§¤ì¢™0úê4ç9ûÈûD£}¾ù0§p»o{PGwQÄrV9dYò8¤CIÔ‹æï}æN¥b?s,‚t¼€Œô»î‰ôD‹!ˆ|A¾ºÚCn¬’…Yc^¶O¬c{ñ¡GºÏ5Ö3¼s=ØÒÓÂy‚O`ñji÷ÄêÛ©#®ío‚Hê}5wûÙ§½ZêÔî/9û¢ã$‚c¦y4Þ(O…U±˜&À¡·Và½.‹G‰Sk'p¨ -bÔjÔ¹)Û¼o[Rd" ƱóÊp0àKÂ¥y™ì\ªåØ5rÙ:ˆ•O``{½[ï›|^œò·Sn0‘ÊØ'4£$Ñ„W@ópÙPˆó0¸p– lKNïvÓ(8ž5ìP©ƒcâ‘e6ç]7KɽƒiSS ž*”Ù=L;ç]o3ã°DïˆQóë¥á7í¡¥M|ÂføÔS¶ç°Ëfþ:pBWV£·¤ì¶+Ü£?fܪ®©7}ŽH¡…˜—«ýëµÃ8~1à?h»º¦Ÿž‹¾zÌ°¹“…vÉ@´.NÁ†?4zþ» Ž2åYSf7¡·±H1ÍÓ§ª^oýøCèm‰øùOÞCFyòMK„z&Þц(UÌÁ™h½"}ȧ
ÏEÚÄÇt°¶Úâ<Õ
NˆeØÂÕI.l®âûd{ -é&¤~õSùyBiu›
ìm~i3ÓÌ`$bù‰oAkú‰Ù$¹À&Œ.:$à°á^¸Êùu<Ê
î<7¯p–§ßj¶ÝJ™œ˜iÞç„3q9Ÿ$#&„7‹íqSƒÛŒ¶ôfM5º¶µM}M•Ò
ax;‰È±ó”/ó1k.g•;«O¦š/vEGlX}ã—G|´ymÕíùv)P‡÷Ôj·u¿ÛPýÆ›W“øì©"«ÛNù›Pî3÷mõn]¥‚ØkšÌ‹Õ½èúX>ÑÃ&Å{ü©Ë
uâþó`d9ÆGl -€ªt†×ÜRÙÖ{7䢩23ñq'„@k¯„ô¢Œglå’ ØµËÈ@*Ê~`Ù·~¾˜lÞ6G¹»˜KèÑ)&‹¤â€{5I2Ô7ÿÈ‹dæôŽðMá4–Ëôà‘Cúô\uúIU.è¯á‹d‡9.30óJ׉ž¤Jl†B)ÿN¢FxÄ–w;”Ò”L¶yˆ-u„Þr„”à®êN!â¾/~ÀÅüš#¾®±.&uacç(ø²#ˆU& -2›Tîc.„Ìßj_oÊÛ£eil–£ŠŸ^ÍO^œ}³8N2µ1Ä öc”©pè¶?bk‡IÊbƒÕ¦¸wIŠg#ä6d¬Á\™³çüš9e"’¤ô±H3|`zðÐË^!( -f•€§O=u«@4)(šµ7¬ãá"0b¿HOzkRü"ÌìºkêjÝ*ºTÆW€féŽð ¹£:=R`í¾lË›kôÕ®hÝtí +xÚåYsã¶ù}…ß*ÍX($ò¶mwÓm'i¦öLÚÉæ¢ ‹Dª<Öv2ùïý>)B¶ÖG’IÇ3"€Àw_€Ù…?vÁhz!%Š&ùî
½¸î/ß07¼ÀñÅ`Ÿ®ßüñ½Š.R¢¤¼¸^ã„ó¨_äzõÝ,šÃw1½ý73=!,8S’rX§½ÿa¾tö5üòÙ»~r¿6$J…›}=],&ŠK7üO³È[ó‹²Ù•i¿7혶ó•ù½šn%$82_¦”šÅg¾ywÝ%¦Ñƒ4ÃñÍl$Í.d, ‰CMij:+›uUïšù‚íöu5gñìS±Ò+Û³¼P@%¸JIìéóU.Ÿ}cþ`Úî¿ê÷ç’°Ñ/ì8XSÉ',ˆ”ŠÐH˜‰™ˆêªÍZý“[2>,Q"£Ô-¹qKsú ‚¤2vãÿ~/‰ž•E +6Z>@¸!ÏŸ)sßÿödN‚)Uü•dn¸÷ódî#¸ã¡ù+œ—Yéõœ°Ý¶…)ì´mL#'üÕlãÓ T +Ž¾°R)Q¯·:o³eÕµ/eÑ¿ +@¶—Î#1µšÀBl`itq˜òr–óós'{!8v–@ÌÒG\ú#¥ˆïDʉV»q°-Jí»@n6^æ&·M€ +B‘¦¯O†xJ†Sš“O•$MäÂÉÏf×gj
saÜؖ®ê³Ã¸ÿ}ágÊi8§Â(Ž{0¯²÷
Mh©˜DÌG/Ǧ-èxh1„9¬HS5a~³)Ö![ Óc™œéÉ?…èñèÜèqŠP“TyÑ»BƒQûØÆ|ÂXˆTÕ!á$fñóÏðY<‚Ô8FñMžmõs0Ÿb`”žÂ +ÔZûiu´§/Ïœ6Ù×xÏïìÛ.ËëÊ-ˆz•¹ö9E-ó5¼Ñꃢdn7’´Ñ(NyóE(ÔWŠô±üÕ|‘‚ŸÃ‘Ì~¤()Lõ¶°k:Ð`ç&w:óûz_fÎpvBÓ¤ßpzSıßïջ:°nÛ>û@^&øáFêIL ÝHQsîS$à?ûk}Ö`¾/Jƒ§ŒÑT + +Wá9± Âð +N;5•>w_&óËÌ/ôpw›ûzŸG¨G≰?Ò¸/AÔ’höÍ3´y¤Pµà£¿ÝÔîk;KÅbÊ^¢ÆðG0î¤{´ÒÒ{Sìi|Í_nÝ´UÑä]Ó ‡cS‰sŒ"ºµ'‰k„E«ô%²ää“S<û}ÓêH±ï×›ªÑ.ÏP‚ðqšá½€ +endstream endobj -716 0 obj << +979 0 obj << /Type /Page -/Contents 717 0 R -/Resources 715 0 R +/Contents 980 0 R +/Resources 978 0 R /MediaBox [0 0 612 792] -/Parent 719 0 R +/Parent 977 0 R >> endobj -718 0 obj << -/D [716 0 R /XYZ 110.999 687.904 null] +981 0 obj << +/D [979 0 R /XYZ 108 690.907 null] >> endobj -226 0 obj << -/D [716 0 R /XYZ 110.999 335.8 null] +982 0 obj << +/D [979 0 R /XYZ 108 645.362 null] >> endobj -715 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R /F17 509 0 R /F8 534 0 R /F11 537 0 R >> +234 0 obj << +/D [979 0 R /XYZ 108 278.697 null] +>> endobj +983 0 obj << +/D [979 0 R /XYZ 108 220.117 null] +>> endobj +978 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F126 570 0 R /F120 538 0 R >> /ProcSet [ /PDF /Text ] >> endobj -722 0 obj << -/Length 2292 +986 0 obj << +/Length 2682 /Filter /FlateDecode >> stream -xÚÍ]oã¸ñ}E^•‹'RŸÜ·k»¹n½.y»- -Y¦-5¶äJr²AÿÞù eɲws÷PÌ!9ÎçS‘7üÉ)¡µ¾I²Tè º)öï‚›-lýôNZ”@([¾÷ÃmšÝdB'ÉÍý†0î׿yáÂOЯ¤ß`áË -€Hd‰ëNÃMáXwû¼h›ná‡ÀP~8˜…ôò–§+³iZÃpCk°·éÝ®zÁÀ§ž÷*K¦;˜¢Êw«æ;Ì{wÎŽÛqwÔ»g†ù|eb‘7NTòÝ®Y¨Ø{Q%T¾”BÇ1I·iZUoAIìò¾D(ñú†Ç•á¼æ9È/3o{Ü›º_ZTº‘ªÎ.™ºØ5YÛe{vÕæ…éOîK”‘OñJ×ì -‰kîúîx84mÏ“CÞõ#+Ó)™lŠ,•öÅ>F¥¼_È´>ü—áÜðȾ;É:IèüãBÆži»ª©‘+ðbƧ²*J¦’¨¤J$ƒ‘‘aÔõh³ÛBü&ïi!/ïKò„&S‘eÎ릟’±ˆçk2…šIy8Y -ÎÈRÄ\_†\š‰H
‚ì7Íêß/?I‹8q’”d -©<ÌBxTˆWð¨öAihö«ª¦˜ŽÓîX”µÞñR^¯ ÍÓ¹ºësx®ÓHyÌw}‰÷9bÓ©q~9g) -rmÚ}Õ÷6¿Œ8ŠˆxÙÁ´yÄ—¼`úB>ò7Óš?-âسvÍÞ^Ö k6O Kù“ÔÊi¤«ö‡]…W¹Ðš±ÁTs)‹¤Yò;³¼Ýœ’L §ó…ñ”¨Ý\4úp^Bù‘ÐPÙùR¥"cRçcžjÐìB5Hô²þ×æõçEÕ;ó"@áÒ{}]ø©Œï=T¨ïH|s]\(cغé{³>e-ºËÜ4ÐŽæÏÍë6·V[´BÇ—IByS”sÚRÉ6>„ëˆw¨¡,¬8¶œñ>·j¬ÀÇöÑt®<Ó&b£2_Q›ß;´}ã¡o±GA†½» -M.O(¥Ù¸¢Êƒ’98i8ð}dÍ÷‹gxi´¤ö~bŸoyäL‚9¿ïýðúòžp ¯’‰š!î¸d%Å4umŠþü‘g’Ÿ3S´&ï5…MÛì¯ð42¤ÉtKnÒ2†,¸ßªb¸vfÖ]sS¯-ÛCetQÌ·¸Ê_¡ÈNÒTm÷&o¹@{N¨Ögô;ܯ¯ ו9”ºcšå¹îM¸6µ™½Ùµ+æ^þð/h -
ú@a
NA«ÆÍbû«4dѲ9îÖSK #´7Æ.Ù .")»BHhŸç–¿qøûû=¥E0ô‰£úAÛGÌÚEÕ“¨È5´¡À„ã’ZAâÖž-b˜˜+<†6.toaÖ•Agú÷"‚IÞ5<>7GÖjC½˜L§‚ºñXS½5ï3 ˆOõ¹á¼X6.t)hTë‘í¡¶Ûš8®¸¯Á´ïÔÞêùsßtöpk -cKJœv`=¦.,¦\7ªÚ}ua›©ƒ4›Ho9†Gdû“P‰DÑó'c‹ÀP%Þ*/Â!˜YÑ4í±ëm^wäŒK^¨6<RA (AóTÓÙ¥Û8#Õ=w½Ù3Lü6¥ÈG˜—œ”cÖ“©P 7<M[{LÝä$Kžw¹õÎÕóµZNeÜòÍZŽšè
ʼn۲©œ…Ó¶éA/Qls†Ù~»*ùú•+°—þ{±``›³DX.%µ<T(^© -’µzCó-ó8]ÅÏÔ!9¬¨:¬’’Ø[ÎÊ–ëøT-PS)Wµy’+ƒ$P®ßÀýÃB¥ ©(º³x\¡ª!MQ›Ò;R`Æ™f؆lwìíf2Úddö]\0´™
„Á\ÛPÕÃq*¬àXïöÆ´)ûÃøTbÚT§*´zúïD7ËhC€Ž ‚‚'¹ð÷ožÉ?þ¡endstream +xÚÕÛŽÛºñ=_±/Å‘›I]Ó§4HNS 9Íž§¦he‰^«‘%W’ã5ûï)K¶œnƒ¾AVCr8çnyçÃ?y'ýä.J}‘úñ]¾{åß=Àôϯ¤]^áúj„ðÇûW¿Ÿw‰H£èî~ƒ„RÁ@ä¾ø«,`_è{o»ÿ3¡ÇBÆÑ•/¤íýû‹Uä{Ÿà¯òÞ
Èm¥Eh‹}M,©Šìò_ˆÈú‹¥÷™à÷ÿB0ã|¤¿Ÿ¯bhÇœX¬´LÓÔÄ|õî~Jèß•YàÃZ€D2A™¯¾LAÄa$|}±Ú‰¢„d¬}ÈèÎ!!_¤º¾iÍÓ¾ß>ã¨Ê«¦3‚ùfà
¼¶38Ìí7óôžÄ_úð‘K„å–?BIA($ã%VÀi$T éèõb¥@¨›…ô½,ï—¼kÂ2pœhie9ðzM^Ãý“Ôâ•Îð£¼}k¾ø¾ZHï‘'vYÞ6ŒÒo³ž¡¢1v[ÝôÛ²~`Ü~@4–Û¦ªš… +½£Å‘Êe!CÏðƒðcoßósMÈe/ø`×àæ€Ùá@J‰H¢ +9øGVƒ¶+›Úòì®vÜ–ùvÆFã@h?}‘†àuïHFßYrÊ?£I
ðÚ—èD‡ #¯áqV*ôÙjðËëyD:(èe Ò`jp¿Ô¨Ýaì:4›™k!˜jü2×L\P$·&^Þ¢›ÈzÃÃŒW»-èÃ6«Ò³#1«3‘a÷Æa²Âcé8¯rHÚQëMQ6‡ ð=í
d•j¸×D ojkÛÉX“•o-ɇÀÝ +Ù˜/¬…Øßÿ°áC ñB-…– '†ì¬ÁÐS<(áØ‹û¶)9yçÐEœæðS¤àk:#è‰pn}ºæ^Á¹¡RÿA2ÑÿL24’ù’Ygì‘s§‘ƒ)Õ³cnÊ:Éi +(B +>,O™e€|
€fk)}á‡ÑÔ$¯™lSc‚C £¢)v#vÖNðôm†Ìë%OqÆ0Þ‰.ne³(LC?™˜9y¿•RœÜáB1_`º4ó<zù82ÐóxšØkñ†˜xÖ3^Ü3:PãZ¬í‘ÌC6&§˜²ª¯¸ê…Ï :CÇfÌðÒdÏß©ÆXÌ兀‚& 6“ýßRz²áÅXg¡4VÓ”·¤¶¶ýÍ
3íã†'Ã…ÁÒp +R§T“f“ÚiåÔN£%Þ¨cxº*Á¤±úꇒÁPÂŽªqÍi<u¦ÌËžŠDÎf¡5WÚv·q +DvB·Ê›6ý³qEf ¼u–EHsfò¦i!Íáf*Œû6«;²ø%#–^ ´'ò-¤~6÷[È0ˆx»¯qäeìÚ.£æuçek_WÜ;×6mL?¼Ø‚¸ËNƒˆnŒ2 |á‚#äÛE£CrjHàÂÒ©«š¡mzÏSÚúÍ<<·öy|ä’”¬¿úso÷Ëá-2EÖmÇ&t=Ƀg|ÈxÏ·˜J1¹K#z;÷£«NÑÌGÿX2ñ˜ +endstream endobj -721 0 obj << +985 0 obj << /Type /Page -/Contents 722 0 R -/Resources 720 0 R +/Contents 986 0 R +/Resources 984 0 R /MediaBox [0 0 612 792] -/Parent 719 0 R +/Parent 977 0 R >> endobj -723 0 obj << -/D [721 0 R /XYZ 110.999 687.904 null] +987 0 obj << +/D [985 0 R /XYZ 108 690.907 null] >> endobj -720 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F101 484 0 R /F80 371 0 R >> +988 0 obj << +/D [985 0 R /XYZ 108 547.166 null] +>> endobj +984 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F120 538 0 R /F95 412 0 R /F90 426 0 R >> /ProcSet [ /PDF /Text ] >> endobj -726 0 obj << -/Length 2875 +991 0 obj << +/Length 3315 /Filter /FlateDecode >> stream -xÚí]ã¶ñý~žUlF”DIЇ++R ),úÒëW’×ÊÉ’O’sëî¿w8CÊú wÝ;7Eƒƒ‹CÎp¾8’ßùðãwœûLJy§ “~t—í_ùwÐõ×WÜ€ø,"(A×_î_}ó&IïR&ãøî~‹÷ù?½pµ¾ÇðŸã¿¿Úp¾¯WÿºÿJOB=(Y%ùæÍ÷«Mì{?Âà}7@(‚Ei` ï—³ &ƒÄtÿ„“¼Æ=!÷~Æò,ÿËóþÿ¼D%, --:XP eè{Q !_}w?p%L%K` ïbÙ&”>óý -Kc9æLá˜we¿4Iäõ»‚ -ͱ?{*gª¦ÂC1ƒêÔÞ”T7ë*ëaü[ÂО©Î”¶MK…¶¨ó¢-ëGªÚâ-þ´âÂ+:Ì
I|ßä¥(rªÿŠ€mW6†Ìf«9KÛpΤ¸Ä~§49<‘•¬jºck*KÌŒ:î-xWæ¦TlWð¶Eff-5xâ
3çÒó| u¼¹êvа¶-~PUP7‹„& ¿Ã4Õï¸:€SÃ|³eƸLU⩶m4v…Ê×ÔVôcT„‘»$Ý?,©£†Z¾á/µô
}ßÕ4;Õ -¹1þ±Áÿh:íDƒF1ÃØL4¦iª=SÊh¥Ôœö¥,~&kùüZ6G=!8Á¾Uu&·'cÛpxYÛš¡MûŽj'æ¶=zTL(TÖ߃áQ¸šS©¬-hiú´p•‘/C²yÄdM¨&3_·mªŠŒðrI?€Mí•à ÷\¯<7s)úìO hcº'몪NTËÚ¦¶èTSs×7Æ5™¹,-b¾cšJäEì£ùjy*|_SqúxÒî;ªýrìzÈË.;vÀε0cCP³Ž -Lò–‡QÛ€Öš¯õªÍÿ<$Ž™/ìv¿£~îó3@û·0ýOËñ‹„
eÊ%Ez´õ0ëåhÁü”_‰üäD\‰\sÌA -‘Ä,àÑ•ß·ú,j ‹¦ü·½8Kâ€ò!±ãð»Ì}‰”E‘e)bvÀæPE¼ÈAÎ…¥‡7×q%^8MŠçO“3–IŽG›EŽyǶ°T«‡ó,@÷¡)ë~É¥Î5IpŽâýÏóyñ9Ü/ÜÍâ/:ÂŒŠágÄÔ×Ûž’D#Èš½I¾…Agždâw÷ªÎ;‡Š\@}ÃcÄ2Äm}ÓŸž>}t%k¸ç¯}:om¨~$>‘_Ïz°½ºÌ×Ï¿Ÿ–Û8ãrBP¡æá}‹° 8 -X"¶i¬û-€jRœ™Œ¬h²¦îU©³!zýL¶“Úh™¹©PfNÕU±6cÌØIZORöÔñ¡¬ÌT6'†)@Fm÷´´H›Ä¹“D&c–LÓ¥{•µÉ[Ršqœ¡ÔÉ:LÄÙ#vb²J[˜ß³>Â$C[…öù¤—ÖûsxÐzìŠí±²sÀøPô¤j˜>UµCƒØ¨7mÞ-† `kâ%3˶©÷EÝÛ»,ˆÝšälmØúà¸Òiì[En³÷
}@¨¦è£Yôxlµðö±À,ך¼~I.S'üë!yë{]U>îz›ÜÌK“§mTjݬ:0u®Sü½#÷9I…ÇËô˜SmS>„pN+ž˜”7•g›€n¢M ô9ÞRà -Ñèö걦;\l4w»ÐÙíÚ²~g
EÚûd虇ÐgBèÄ»ª 4æõ3ðíÉG)2ºrŸ»î`‘\Üd‘.¼ÓË;f;jQÔ@÷'»›¥0s꺶ž\¼¹ƒ9ýáIÃçâ\$£ØËÞKÒò¡?ûQºK̵ÜÜ/;‡QÄ ƒxdRLòÔ6DΑ8·KÁÃK±C0¡¿è:pÖ¥¹Ä+‰y™!ìíÖÌSû`σ;¸ÑëàQk")¹ÞfveU¸ŽqÈbÜóŸc“aÀØÄÏlŠ[ˆ‡÷*±pr$|б S6|½áW -
§a9 -a)Ýû -OÇBz,¨èg0sê4:ŒÂ¨JÔCÖt”CW´‚œ‰^Lù[1A1L%P•Û®7WÔBBÌ5-Ì3‘žïV{¥p;|[sÇš5mm[»^ºÉ¥lŠ\]›ûTÔl-ë9XiNe‹~Ô=Ðq<,¶V(—ˆXÞÙN´ÿ¥ -9˜@çds"\Q-Ç©]·kÕäADbtâÅÀ±ù“m__
„L®'ÛöÅöä=÷¿<ã¿
endstream +xÚí]ã¶ñý~Å>ʀ͊¤DIò¹â +¤ ’E_š>ȶl+gKŽ$çÖ òß3Ã!©/Ú·×Û» h±Àš"‡Ãá|q8þÂàaú ²eaò°9½ +öÐý·Wܯp|5 +¢Ì‹ÃàËÅ¿ÿ®ÁƉà"d© +iš *úÐ;}êšâ¤³|zi‹Ý_%p<§Y2X~!Â6ˆ¶ò=…¡¡¸×‚;/Bq˜ùŸSZÂÿîPT´üê@™,D2ßïtšXÅîq¿(¢b—qZÒgWï“xUø"£_È ¿¼¨4:׌Çrèt&Ñ;E ‡˜ïÞTêª% G‚ßR?YÈ›SYȸsA÷ž1à6ëÎ^³„É;+—‚¾u±3óñ!C2)ø(Ó/£Ã¤aGÆŒÍqÒÌ$KóÕÚ¬q”õRNã“ +!e¾€‰À8Oª†‚Ïb×QkS7•íÕïéùµÌE®.©I:¥›Ú©ÀŠMMYÂGk\ÎçÂÔr5‰zèÐD̯#sú€`ëéÞA•ŽÇÏ&¹Ä"µRœI™«×T•Àࢡ*Ý["dε. ç (HB«/)¸Ô <Î;NX&“lVäÏf¶ecJ +4zÚTD§ðvIt‚^ºÆB>W¨¾A˜´”…É$M`ô¥p•¾‹ŸLQKϸá1“)ˆ$žÊ</m7>¦¸½„ÁåOW"Q£³É#̈ÅéP˜×{ÒL ª
ê®}KÚ<]AAœ:!e4¨Ön8Åà.›$‚#ð6-.K˃a÷öìß#¾y³$T³,¶K²Þ(ì´Â Ë;ª;ÕsMç4iQ¥“þµÅŸ“(ç™×|¥x¢8›1Ñ«¤.~ÕÞ52~6lîÎ +bÓñÍy¤’B8•Â«’ h¸+~™LýX%C{0OB$!lˆ$ð@@ÅR‡†Bü±º@$–Íò™ýfÀ +endstream endobj -725 0 obj << +990 0 obj << /Type /Page -/Contents 726 0 R -/Resources 724 0 R +/Contents 991 0 R +/Resources 989 0 R /MediaBox [0 0 612 792] -/Parent 719 0 R +/Parent 977 0 R +/Annots [ 993 0 R ] >> endobj -727 0 obj << -/D [725 0 R /XYZ 110.999 687.904 null] +993 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.718 557.243 152.164 568.147] +/Subtype /Link +/A << /S /GoTo /D (subsection.4.4) >> >> endobj -724 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R /F17 509 0 R /F11 537 0 R /F8 534 0 R >> +992 0 obj << +/D [990 0 R /XYZ 108 690.907 null] +>> endobj +994 0 obj << +/D [990 0 R /XYZ 108 513.805 null] +>> endobj +989 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R /F126 570 0 R /F11 600 0 R /F8 615 0 R >> /ProcSet [ /PDF /Text ] >> endobj -730 0 obj << -/Length 3331 +997 0 obj << +/Length 3423 /Filter /FlateDecode >> stream -xÚ]ã¶ñý~žÅì²")êãú”wM\$~(Шlk×jeÉäìnŠü÷Î%Ê–÷6ÉaÕpH‡ä|Óú&‚?}£u¤ò<¿I²TåQ|³=¼‹n¡ë/ï´‰”11@Ðõ§õ»?|L³›LåIr³~ ëÝ?WööÞE+Eÿµÿ¯#ø~wû¯õßhRªtjq’ÕJǹÌüúö>1«ïé?Âzõ þÛÕ‚×ôÿC0懑ÞÈDœªØ¡§°ÿÆFF™X.¶ˆ|÷a=îÉf¹JF´´á{›:¹€XeI>î<ËnrXÔ†;ÿQÛø¹¯‹f8Ã~dnç2e3[õ·÷Τhä[W… ÚŽç†k8§²<Xg¶Ìͽֱ2)~UîÜ8êåWrÓW‡ª.:ní%q®\¿u¿ÏwLssk¢ÕiàFy«Ýêy»/šÇRö%][{\ûÀ¤u¤'Úvª¿éçËÅ•ŒÍn‰D¢²4•!/‹´§°mÛnW5ÅPöêòTîmäT -´ùü“ñtºò¡.·WŽ'‰U¤Y +‡S×ÀŽm”ð) -!³Ž¢ˆ( -VÉkŽô…»þ=Daè¾b¬X1°L|67<ã„{k|ddPÁç±@â ÇDdƒbÔ7pïwŒ+–LfCPä•jègY¸ì4Ò0A.!;ö‘×>ì£Ã™ó-“æ¼'ÁaX§b›ÏNcÛ•`ãD²ùÓ”BB> #Šôá¹8Y
@úQ
.Ž”ï´fw¹Wgnô{—.Â,/3ý¾3À -ÀyýÀ6ئ]ÙIv`%‰ˆAŠ_!«¸/°\°·KËÆaÉÄû…S†˜ƒ%!™óúÿøPÕ5¹b:ø‹¨)þ£_pÀ®è÷厽öv¸Z-ÄU÷³¥3Zú©Â1Y&N
-Bƒ„ùLÅÃ#bv^ÐÁKCG?´-ÈÌ^ó"2ph÷XN4´ÈêˆUí ûžUé]u€ì¡j”êh„>ÅÑi2-.—Fž[¯ eÝÔÒd9
cªiK~zÕ‹0¦)UÂóhÚ}S‰û"ag&T²ìhp(,yÓœª|Ð@…£ï¾<0$‘´›@ÚüTíb§þDÆ@¾£,V½åv`Vwª=7$¸â¶= -ùýEnÙ½—À)K”IòYš2I±Î9" n·x5·pøev“L%VdI/r«=·8é±kOÇžaŽ
tž‘ ¦/ C¬v²zÑ,ÄdàÍxå‡È·¬)ˆùh…AÚ ¡þ©êÚæ@¦‹8@™{B íe±+'ðX·›¢V²ñ½—O£A>ç% -@Ûö -w¤ÇÍóK3¦Æ¯‹wˆ7°^¼ÊßhÍqÒ˜¬qeÛ¿xfþ%Š†±àUÒÂîmÕmé¥TFwúƒ'!Ši¥~y’NÒ…þ˜ö¿pù1„/ó»G¢üh8Qçšdæ楉‰ÿ¹\ø7Ž—æõO+ž{^Lá_–~¦BOq¬ÛÉ\ùå‰ì*U“O›ôTÔß©xŒF¿„8g 4£4›«Òl^‘fëŒrÖ-K3>‡îT.>z$æâg+³ƒ¸0£øPÔýÉûÔ)ç’%'`ãÉ Ä©~›€I›¶Kz‘FÿT
XqCxü!‰PÚûzÅl‡UaÒõ âKr€ ñ[´Â¨LûqR
Eš²¥*5e‡Ðj…1LVDW¢Î__ÄYíi_ËÄ“B4wÜö16ÂeWôåNž±ÞûY"‡püV/˞ΕŽOEK2b"eGyÏ”üÆÆUù§3i—é+a3‚TýŒ£é-H]-¦Ã7YO˜E±°Ï˜þ|žäÉH´Xž +xÚZ[ã¶~ϯ˜·xP+J¢.éC‘›&6 ’Z [ ²%ÙÊ’+Éùï=7Ò”-Ïn.X`MÞÉs>~çpô]ÿôŽŠ»¬ŒTåwÛÃ'Ñ݈ÿü‰–ê¬|ñøÉï¿,Ó»B•Yv÷¸ÃT§~Çúï«ôú™hõÝý?ÿBÍs¥ó„šÊ”Œí>¿ÈâÕ÷ô?–õê-üŸ¬ÞPù‘ä\æ6?øñüôi®Ò8‘ñÖß%q¤òR‹Ìd(üäÍ£_“‰ÒW—ŒõWKÖP.Tš´ˆ8Ve +£˜LE ¯ùNÒ÷c[uÓ±šö^Ñ¥…›B%…SÊŽ÷1lPÕÉok+íú;Ïf4F¥tÆ™fÁ)éTÅ9—V¥1¾ÙËÏUh´ÛVLý‚&i©,=ú¸Ej¯yÐÍ}N4÷Ú¬Þo÷U÷ÔˆÓ¾áÂзNÖïD‘8:aÚ¸£=yFgÄÕUW/
‘©"wÆø²8‚v#lû~¨mWMͨ¶å!‰ŒÊ£øê†f×6Ûû“%*1…Ì04ÓièpÉI)ÛF«ƒ†~`¡=TO"†-™·ÛõmÛßÇfõl»'®Ã9×\û¼o†æ¢Gk;ÕÍÔø¬ù{óÂ-°)ÙW¶r±¶co»i”%™ó’bØÓÔù~aÓS•iwjÇ +á¹–@PcûÓÒÆÓfçƒ-×âCvR·ŒùKÜ
gmÄ怬 Væ*ö¤õ;cˆA-¡é—$ø–þÿFÔ+3„è(K{YšH«Â|`¢ï‚‰~¸90©ØÙûQ€™à7^Æf—®Bw[rËN•§*MÝ
²Å`‡Ÿª£;Ðm” ÞÁž¾pÕ?ý€Íð)‹„F€_å‘Ê`ÂóP0Éì‚ÏÁ!û+H…šBC¡¦ ³t9è+°Õ5«EZ Ì]V2
¨²WtL4Ì8`å3åØÓi"©"R™i×$š[.IÄR•ìER(“Ϫ7ï«Ãч¼xÙ,`¦RÏßÈ#ëkí“H¥Eæ¡pºRˆ%ƒì-`T-$Õ]”²ßŽõùNYÀl4oÏ\×Õ¦?MLˆoŒ_@äÃp·C@u–ÏPøói@Jû<6\¼€9’¹»Ë}×¾øNÒ…Í(K&$Ÿøãls#×,ìú‰;Í> +pU€³o9L(VßW|]bY8Ü3ƒ}‚{©½èÂCà°x)‡S¬E‡®>x}+yÝ(‡u?yyÄóD‚¶Û”-Ư7.oéŠÝØ-p7¹ò@Bøå+3JštuË Óz®6«ºÙ“áxÞ’û¹Ø9^ðó¼â¼_pø÷¸Þ]C@Xt ‡K¯‡ +õx²Oü¦¡$*pò-Ì6”‹r¦jj~¢èüç/#Ž fñ "ñ àµÖyØE¸»¢TÚÌ°çõ©Ò„ÂfgíìuS\÷ÈÈC–±æB%½üMXæè»YýŽÐŸ8ò«â>¸Cœ—êwò+s=7®§L6Zq¨(õC‹†_Àz®æ™ô&AûìO8Pï⥳= +Éë.reHWÃèo¡g’²³BÏ ñmôt>lf˜hl¿!hþ•ðŠ#*D1aOÔqÔ[:,g0X(Z:„Ú€;›….Ò°!Œ€¡žÁU Ÿ¸ºéåˆhû²`Îu(Kçg(#Œå +È_µ†L%ž¸~ŠÝ!º'ʹeì$/b8?‹(ÐëßÅqNçEç÷þ@cS +endstream endobj -729 0 obj << +996 0 obj << /Type /Page -/Contents 730 0 R -/Resources 728 0 R +/Contents 997 0 R +/Resources 995 0 R /MediaBox [0 0 612 792] -/Parent 719 0 R +/Parent 977 0 R >> endobj -731 0 obj << -/D [729 0 R /XYZ 110.999 687.904 null] +998 0 obj << +/D [996 0 R /XYZ 108 690.907 null] >> endobj -230 0 obj << -/D [729 0 R /XYZ 110.999 442.559 null] +809 0 obj << +/D [996 0 R /XYZ 318.135 296.066 null] >> endobj -728 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F101 484 0 R /F80 371 0 R /F85 373 0 R /F11 537 0 R >> +238 0 obj << +/D [996 0 R /XYZ 108 247.28 null] +>> endobj +995 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F120 538 0 R /F95 412 0 R /F105 415 0 R /F11 600 0 R >> /ProcSet [ /PDF /Text ] >> endobj -734 0 obj << -/Length 2591 +1001 0 obj << +/Length 2656 /Filter /FlateDecode >> stream -xÚíZÝ£Èß¿ÂoÁÒ¸Ó44º§œ´)Ò%§¬"å"…1=c²,`Î;wÊÿžª®n†ñxg÷ö)iú£¨_UWˆ‡?±‚³,ËV‰IYÆãÕîðŽ¯aèÏ™”1´`èûí»?þš•aY’¬¶nƶøg¤ÖÍ#æ~Eø®?ÿµý‹[”2‘*\¤qæWþi½Idôw÷‹mý¿*zïÚ[÷û~4çÃ@o`"NY,¥§Çp|¥¸d2¾/Ž±óÝûí “2K_x£2Î8—ÐLÉlܘUUcÉ*>Úú7bËðó©YÌc?mOã‚‹óÅ@ãE»:ÊO@ª+µsjqÆhÑìÒ›)1í‡ÿët°1’¥™Ym„`™Ö·Eë³Àq¬Y*Í+ëÏâ8þ,ŽWL€)/Y†gœŠ†•fzPá·W±ƒá0¼I
ã"æ5S¸iï»>¿¯Êno»õFÆ<ê÷":ETýžîš‡‹áºi9L©èl†ÌŸÊú‘&‚Œ†¶´„G…}XåOUOe7—AjB!9ÓÇ~.ɹŒˆm÷eç9l»'¸k×7-høþyäñYê4#3Ų»þèÜ™\{»VÂ{ÿ®ãoî÷¯>ÌŒ¦”1(S¯htû¼ =ÁMÑôµò”&Úçýn_Ö ÜGê -j!„'d¿ÆÞC¾kFííð q”ÄçóØð>ï»Ñá -~Nkýæ³,žºä,€
]Ð|ˆšûУG!#·GÊRJ1iÌ
Q8hÿŽˆQÓÁ]¡ñò—WOvx!0Ddâø2"ž1R¦ÅH,]$£H,_ŒÄÉ8÷šJ -*Ž‡lÏA{ -±’‡Œ6!;܆R,IÓk(}[<Gi¦á@"/C¯Í‹ -ÂÈ\!RœC%ý"‹éñ+ ¨oèpí8®?fîϽÿ E”÷¹¤OdŠôâé9½bXyĬÛ0œ8æmÛ ÞOÈ´§éCbM··Â’ùaGe£Ê -OsÑ!Š‡]"`͉Mœ¨ Ö -ÀJ´O}—¶_0r<í$”a ™kRU:*še½‚‰° kÏ:Xõx¬J—ú çͅǼ¥}e1‰£âçù3!zêø3l@±ùyN‚£WüŒÆ§Á³+ûùTeâìdBö-^†‹Foƒ‹a›” àbØvg«ñ Ð$ø—£yö/¼uðòKüK -;8Õ7¡{9ì þ‘Ü·Ñë‚ë[—ñë ‚ãœœìÃŒÜî1Ï¡öØ‘Hì™
6Šk–r3Ù|¾"¶ÓIÖ"ã¡x‡æQ~ÅF‹UFjN_.¨l(t†±ñºKÓ)Ú¿ñZöþ!´å|·À1 'Óêë»Ó¥ØÙKb÷a¿œøÞm¶&…@€Ô‹`€¤¤žÃ¡XáÅØ_Këö*å,‰§ùþî©ýAm»ï°–˜ 8}¤’[UòŠw'/«€>¼ðtIò3/‘¤,I²¯qø̘ÃþØ4•ÍkzèÈK¨Ž[¸’7_3½À›¡<]ྵ~VC“îCMKK–\¾&Š‹§p§yù°cÈ>ûöÉ.„ÎÔ9bp-ˆ¢+áãÕ¿ySá4¦;®2¨‚Ä© £{z±3ÅÝp‡*
û€Aè!¯:ûÊ«9Or£Ýõ%êðX=¯!>Øœ¡)Eh}ëžs%>©—9öÝ‚_0£ãß=TÈùI‡¿r^ûR'Õ×<xßà'îÝ oõ¹~í…ú‘áîK¯^åtÏû`{çªK¯Ú¥¿·¹ÎÚq›0ôï¥#"¤'ÁOÊú¡¬ñUæ\<ØÁú j§²ª¨uÈ?¢Ïz•Óº‡ž³GB»‡RÈpb –¿FX¹Œ[Tÿkóòqï³o|70”Ô!—€Lê²Èí× -–Ñk§Æsiæý†Ò¤¯G:MßQû¥xz÷jéèæ”*»êe]Ü°Â íWÜÛþdI›«
ì°ÙÅI˜¨ßчôV9–€0€UM_˜ÈI¢MŸc¸ër=6;üDhj†Ø&±<½»ªñþó“¹q!Ë0o#KTù3I9¨ˆþóä^ÛÇòü}LÐ3¶©XïÆzñÕFëŽ5Kz…ï¼&_ýLËÂendstream +xÚÕZYÛÈ~÷¯˜G ˜é°O’yKÞ`lÖÈ +H€8”ĦH¤<ž,òßSG7©Ç–ìaõU]]ýu]²¼KàŸ¼“IvçòDäIz·;¾Iîž ûOo¤~Àñ‡Ù„?nÞüîûÜÜe"wînóˆ„Rfd²ÙÿceÖ°Î&«wënþLÓS!SMÓ3as¼qÞÖNþJ‘–«á¯^½%zCýLóœŸG~ãö&FiÏOàøV‰HséûlŠoÞnÆ3ÙÄ|öÈ8;r{jä;gH4·èÊõƒVjU·»¢frhý÷PHéUÙ¬M²úXums\Kh÷<°]«dux~;ÊŽÉ
F:'l¦á&àPšö{KFdFÝM½çUO]{>UÍSÏÍCÜ?®¥]y!›ÖËó¸VvõXî@/bÛð”~מJÁôÏíÑ/ܵÇcÑì{ÚýA¦4o"·–Dx—Þ´C±_Ö*7pú¶/‘´^ØÙ—Cè*¹§øTõÇ¢[ËlõT5=ÂV|Ý®!Æe¤ûÔ +Âå¾—Úu±-ëã-i@Z¢üÄSÑÇr(»d”¼ëîP4O^º-è{½Ö'd&oÒ:®? Å°Å…üÿ<E™@ðŸ.´öãˆs¼s-ýSøž:~¢¿ñâê&™rW‡d)x(Õ࿽ÿOm7€ÈEãG¯øý°–ɪ,O¾÷P™ÚµM_õ –Ùƒ6Bj¹8È ‹X1Æ? $ðƒ0C°=sß$'·ýjßò·Ý–ˆØnù+IaÇ<»í!Àªðî¹9½2äßÔ/,ÀÚ—1 I'2,ËññTí®Õ¯@ýÚú9ózꃢt.\ª.5Eïï¨ó<œÒ_×3+Òß +!™Ã3á3¤‹&3Ž"¢Ï×Aarf*Ÿ€W6¿xì+vñ µÈ\Ÿù5{å×|"ŠſYÁ#'£»u£Œ€Ð縜ƊT忹œ.#·¸xV¬Ëç}DJ
«Kc)/l&ØnEÕŒ¹Íä$JåSÁˆZe…¡ª?„XúØÖñ\í)•’ùXÓvGz‚@³y=w U"-¯1)DîýѱÒõŒn¿ÜVïc³yòÌw0çlR[W{&[ßµ/úÃdÍò`Íò¹5Ë—æ%Í¢eôž»=}!º·¤§ +TPdî-ÊŒ¥zûr&&àÅÕ2M¼(FqÞ(gÅ(-F9¡µ{M²Cá+‡Ú:áÒtñ ©(iÓEÔmÆI›ò5b +”$¦7#›¹ÏÄŽQ¤ðŠ_õ}à]û‹2õ¹)F›êÕ”ïS±ºêCR Pøæ¼Rf™Pão7·øÁË<Æÿz;ŽuƒOœ¥úŸ˜‹qÿ]¢¼Á%Æò_—ÑäKØÓÝü÷°ÿ•?I»Í£É²õHW©¹¬]…ÄÐQAÀ£÷“Ü8‹ì÷|ÙPêF›‡ +jçÿYÿ¯Gî„”*öE4ÕWfÿ>9ù€ +endstream endobj -733 0 obj << +1000 0 obj << /Type /Page -/Contents 734 0 R -/Resources 732 0 R +/Contents 1001 0 R +/Resources 999 0 R /MediaBox [0 0 612 792] -/Parent 719 0 R +/Parent 977 0 R >> endobj -735 0 obj << -/D [733 0 R /XYZ 110.999 687.904 null] +1002 0 obj << +/D [1000 0 R /XYZ 108 690.907 null] >> endobj -732 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R >> +1003 0 obj << +/D [1000 0 R /XYZ 108 572.874 null] +>> endobj +1004 0 obj << +/D [1000 0 R /XYZ 108 501.89 null] +>> endobj +1005 0 obj << +/D [1000 0 R /XYZ 108 454.817 null] +>> endobj +1006 0 obj << +/D [1000 0 R /XYZ 108 396.222 null] +>> endobj +1007 0 obj << +/D [1000 0 R /XYZ 108 266.439 null] +>> endobj +1008 0 obj << +/D [1000 0 R /XYZ 108 219.365 null] +>> endobj +1009 0 obj << +/D [1000 0 R /XYZ 108 172.292 null] +>> endobj +999 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F120 538 0 R /F95 412 0 R >> /ProcSet [ /PDF /Text ] >> endobj -738 0 obj << -/Length 2414 +1012 0 obj << +/Length 2749 /Filter /FlateDecode >> stream -xÚYK㸾÷¯ðÑÚ"%&Èa̳Àæ5}°³µn#KŽ¤žžÞ ÿ=U,R¢,Ùãl7`‘Y,V}õ¢ÄŠÃ¿X Á™µve²”Yž¬vÇ;¾z†W½~ -gR&ЂWy¸ûÃi¶Ê˜5fõðäf<ìY«ÍVó5s¿"ü -Ïl~}øÉ-J™H.R‚‰Äú•?l¶F®ÿå~±-Ö?ïZ¿sí÷û.šóa 70‘¤,‘ÒÓcø~¥¸d2~,Ñ8x÷îa8“Ê,K_:ðVYÎ8—ÐHXfl|r›ªøäÝ)ßÝf+3µ~,ú×¢¨}çž¹y|ÙmÄú0ŽbQ©DŠBØÕ¬³R;Úâœí0g²õŸ»_~å«=á§;ΔÍV¯ÐæL€JwŠ™Ìø^u÷áNW[ÍR™
G\Œœ„³Õ“ñS–ÂLÅ•º)ͨ?eKÍÏ©×yõRÜSÿõP´QÂ]R™ä™k[e<h°ì†m¨Q¿¿aà!VE²>Š¼-ëg)ë‘Bd+eÊ4@~+³š$¾{i?o„^;Þ¡EðlÚ½Ûͤëºéi¬oèyÈ7’¯iœò¶/óŠæïóîขyXzð3‹zß1š÷ÆöÅÓFðuþRùÙƒ@•¶ %
œ²?è²HtJ&Ìè?õsá -
ö¡›qt=Ä2P.:”J -ý_.lîOدÚhõŸ<1:Nvé8µ±7ÂKg,1“ÓÌuônR7˜–e -+¢_àŽ12‹ÅsCQÉדš›‘ps‘pByƒ«œQØ -‰FaÈI -
äÈ%OØ2[G¢éýänFX•^€…I˜11,ÜÁT¨ ,èX…ÌŸ7dnÅ8ÓÌí{´ -ÞœuÕ}M©iƤž›>ØOE{á€ßš!Tåó¡¿Hmš#¤“!KÇ!Ã|ÑÅ(1•§êz‹úŠO]ÿ5œB$Iu anS¿ ä#˜zôÔ#eíÀOu÷4¢}‰ ¦,/ÿç…#’“ñˆË‡dºtB2Ú@ùsÊ’
Ñ%Sør
X&ô$v‰-ÌÌw‘‚e:»í -vrz8aøŒ¶¸®ì=¥º9–uî_Ÿš®DZŒºï{¿ê •ùɵ¿P#ònî†ú‹[!ׯm AÓ±¡Ö¯¥»µá¼ö×Ø8ì®pT¸ÂÆ®9Á¥ÛåÙäV4¼€^
ÁàJ‚d žÓé¾=Ó‚h‘ÁÛ§K”°æ²a2
óÓIfxvæøûâË
i+Ší}ïÍ2…‚ëì¦)¯º7õw½J„74b_Dn&gyÅâ-;
ЗqŠ?:Ñø¾øȹ¬?ÜR´ïe=+%ÀÑË™~Z€ÞBÍYòýÒÕ[™˜WD³ùœ/àG§€luMYÓk1ã°¨ªòÔ-ÄL\Åß©xøNÅÏ¿”ÁÀ¢›„xσCæ7}‹÷ˆ1íàžî†uOmwÃOº^ááfÐÄRÈ)£›8ËÿaÕ—º¯Â6uqG3;Ü…ÿì¾€Ó×ð‡
¸¡2]pšA¾Û9Pª5(õGGðïîSûß<ñ9]É´Ôq,‰?Lo×éÆB!SKßÕÃgõÉG÷ÿQ®+€endstream +xÚµZYã¸~Ÿ_ÑoqÝñÂ"»Àn ›»~ˈlËcedËäíî
òßSÅC¦lªíI2h M‰T©XçWE± +ìQó ,%–ê‡õþ}ø·ÿ…égœN|·üðÛlñ`ˆUêa¹E„ób$²ÜümQ<Âs’.þúø÷åÝrM˜n¹!Ò* ë¾}|V|ñ“ûc¶øþ‹Å÷n¼t÷ýدùy¤7¾¾Ð¤à"Ð#8ÿ 8%Ú²pO¼ùáûå¸'I‹w·ŒóW[f06¤P&ìùAIE¨ðûýÈD±«ÊMSF-pèw\[ +SîÂ[4Õ#[>
;Ùn'ótQv]ûÈåâYd»ò‘Á@võæ€<åXœlˆKA¬ˆbÄí Ñ—ëÍN´ Ëöåºk‰Ã22Sê¡.ñ²U6'÷ʇgAQRƒ(±R:" ˆkv,a"Úˆ8™Jžjý‚Â3/ˆ +7¼ÃÀ/˽œZð~;‘Gîå\«íûûPdKHhÓæE+aEÔ +ÐýP®ÄM¦X8=û¡‡;ÅL + YT±KK¹ñ’Ù8k¿
´ Ó(K<“B¸›g\NÂmÙôè¡æB´ÜÑâL-A´!çK%ú§jQ£;¶m&IJ0S~k·œEú©þ´›'¦ ,Ò< Àà22Ä„ñI +É~ýtþÎúÔýâ³Â7A‡Mng,©ÃoéúËÂÛ´´°×ºs:Wú’„Õ,+åýãØcàç¡Dö-‰\Óá/nüç0™#”F¾VmÛTåÁ¿4õ¥4lê5˜àL7
¦Âíü…7JXu•¤‘û® +«Z¿h®Gi…+Ië\”àšNcå3t§*Ã(¼8ãæi¶c{¬$Æ2
š˜ ïúV&ÀȪ¸0˜“lV…ÀBö”þª¹ˆÄ¡c½°…ˆYÝ,sYÀ÷Çj=ÔÈ·ÑæíQIªàm?£NWvf°í ¿¾#¡‹Ó*0ýœŠÀׇ- +8SÚ”¨"Òû'÷R7Aûò3ÂÅ ú8A‘¢€ðh'ƒuVT¾˜&:¸þµuöCWb²ðO5õ¡Âì‡3ËhÔ1¸»ã£úlØ`õåá“7dÌÜ3×À8hðµ\Í[ Q6Û,“z±=5¾Š¥Ód›2N<¦]F‘*NDKýuÀé¤2KÈ<]?á_ßÅX&ÍÄn(“ÔWÝ)cÐìCáÑ…Žƒ«Ú7~¼z»Šç†AQÁß‹çÌÅsžÄs–çÀ“V2:ázšZ¾ÝU®´ä‚H•vÕÆR(ƒÉì\§øDªÅ©¯6®à“±àS‹þm¿j›™ÊÒjy¤– +uy/Xf 0æ¿¢ëÉîË7?(7ÿ<õƒ{?ÀMb’…$®qÝtmÏIŸcƒUO{»QÌ>çz1{œòm&÷§õ.½£,l‘%Iû—c³ëw™¬‘Zë!ß½‹Í»sz¯ÄÓ£»*óæ=&„÷ß«„éN Åý*‚óÈE*§òx¬Ê.€yí£Š2‰œ\I9WcÁ„¬sé‚ßØgãEhàÁ=‡àwW>r\Íß9–]ÀØp} +Ÿ-㣻°²rñÇ
—ñÞ¡óbšlqØ…U«vØå:HL¸ìÅVÜÑ៾<åÖÁSØ9`¥‹Â
ÀÞ©lÞÃ|BuÓHI¬vÂa=çþˆÝùuDý®í M‡zF†3ÐôaW¯?CŒè“dΫÃe‰}r¿ +ó–B•"‰4ïtJ/Ã>Æ©j¸Ñi¹+ô·Ã,±gÉ Xµ'%.ösÀDá€Ào`¿@=ào8Qî0¥ùkba°®º¡ôö«*(«ÜAuXæ}gö(S@µ%ÕE8Ìç@A¸¼}zgõ}i ×xtìrÞóù`Dk5)o]:t¶¬£-ë’¯™Ð4·£Yõ®ÆjVôž¸ó?7šº¨ÉŸÆh(äôýnùäI¿ìê&«Ô‰¾Ó¤$¤“±‹ê6o,R{—’yÒpÍn•Q(ˆ£xYn«€¨«á&ñdÎ`Œ¾ß`Ä
ÆÎ#ð»Bc¨A/#<þ=þjîC¡w;Œd˜éן_ÜAPB Î#Ô£«ºÁ6kxd৕D©kø¹›ÓÊüùª(&_DÀåx¸*B"›#¶áˆ t‡ n„øÉ=Fñîs “ž +endstream endobj -737 0 obj << +1011 0 obj << /Type /Page -/Contents 738 0 R -/Resources 736 0 R +/Contents 1012 0 R +/Resources 1010 0 R /MediaBox [0 0 612 792] -/Parent 719 0 R +/Parent 1022 0 R >> endobj -739 0 obj << -/D [737 0 R /XYZ 110.999 687.904 null] +1013 0 obj << +/D [1011 0 R /XYZ 108 690.907 null] >> endobj -736 0 obj << -/Font << /F78 368 0 R /F101 484 0 R /F88 386 0 R /F11 537 0 R /F8 534 0 R /F80 371 0 R >> +1014 0 obj << +/D [1011 0 R /XYZ 108 664.406 null] +>> endobj +1015 0 obj << +/D [1011 0 R /XYZ 108 617.333 null] +>> endobj +1016 0 obj << +/D [1011 0 R /XYZ 108 558.304 null] +>> endobj +1017 0 obj << +/D [1011 0 R /XYZ 108 499.275 null] +>> endobj +1018 0 obj << +/D [1011 0 R /XYZ 108 368.516 null] +>> endobj +1019 0 obj << +/D [1011 0 R /XYZ 108 285.577 null] +>> endobj +1020 0 obj << +/D [1011 0 R /XYZ 108 226.548 null] +>> endobj +1021 0 obj << +/D [1011 0 R /XYZ 108 179.475 null] +>> endobj +1010 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R /F11 600 0 R >> /ProcSet [ /PDF /Text ] >> endobj -742 0 obj << -/Length 2794 +1025 0 obj << +/Length 2653 /Filter /FlateDecode >> stream -xÚÍZYä¶~ß_1oQÓ)êô›¯ƒ
àÞÙ8@6šnδbµÔ+©w<1üßó‹TS#ÍqŒZÅ«X,ÖÍQWêJ))ʲ¼ÊŠ\”2¹Ú_È«{ýõ…rS¤ˆã†¾ºyñçoòâªe–]ÝÜÙ7ûFz³Me$쯲¿ñf«$¾ßlþuó7»(*×´H+Q‰[ùýf›ÅÑÓ¬ µÒB–ÊÍúr‰%e»á¯7Û8Žþ¾É5fn3}g±þÅþ¾´=_/wÐ¥PIîP¼ùð¯-’—ŽXú}½B2 Yº`F\ª"p"Êhö‹—7WuQŠ‹åË·º”BÊ@"Š¬œx_W%vÓ!ïß*ŒMukšîîn0ã¯LX!/Ss%”ÖnþÇ•T— »¤~¼1í…[ÒÌM©Ýx±Žá· g*‹?‘„÷ë$d"-‹O$aºix«T*RÌØâ«UaçÝꄧˆŽÕ®ï4ÃXÝ6õp0n¬âϹïºþÈîn§1œÛã¡rPu:5µÙ¨È®.£`Ç`Õ -ºë»#Aiô¤1n'ê%ûQ·nY=r'mæCuçñtC<×~“zƒIV\7¡°B§ËÔÉxf©?Bqg"OçQ{>Þšžà‚úN]Ý’DÌ•Fê¦á¾[ÃßÉÚÅ-wVüpºÆð½1Û[·«šNˆN>¡àW#›n‚çZNh¬ÅÁe„ª»7„
4b!]I"â< Ì0/…ë×tÅo)ì”\øe!Ó„7Ûzw0õýaEí3D}“‰_1¸é"4¸ÙC½+~5UˆUŠ'nÕ–ÏÚ™²DŸh hѾ>šv¨»và¶0:rg³0K7 -EA¯(YÀñwP¼{Žïò„©ì…Â晓+ÓòR¸£”7}cðÕP -æ…ÂlW„"…P™x–¶\‹,Nf2áòFWjž6žË[/89¿;W¼NàÞ¬46—Ôä¤z*¬\ó¨«Î³
FάvYf•Ç%óqñªkxd·VŽ¤5b=Ïîõ{ÌD©fºý¸kÖªÐ09e£u‹3ŒLâÐ1[¨TMÕ8vûšÜ†-ðPœ¼`ì =óÊó9†Óª¸!}aìšûÕ#ó÷š¸7»šÃzärÏ_ÖÏônFí^ÀÚnYÀJäiú¿0Ô¢pc7î¸7þ5èDXå/Ó½.(GÕG^¶: gù“ºpX=.àºÇG[™Hü¾fÐFð;_u!uþ˜ƒXú¢Yp1êZY"¨!ç
É
È=8®½ZèÆ8 ^· -Y-#íà¨õÜA¯[Ã…xRËÎÖãYÎ2äBÉ<K…<¯èTœ@ûóY¡¹»ý÷ŠH‘Y`sCáû–ŠØ "•™€¡ßÙŸ¾·# SIø?Ͻ³[ò~ýóÁòÿóÛ‚2÷¾MrQÀ!®ü€ÿ€Ù¿ü¨m‡$endstream +xÚÍZÝÛ¸Ï_áGX³")RÒ}¸¹b\{¸¸h¦²-¯‰È’!É›l÷¿ß‡Ô‡%;Φ¸öX“Crø13¿ùPø"„ÿù‚‡ÉB§!KÃx±=¾ O@þËî†W8¾LøÓúÍ~H£EÂRë=2`BD“õîßA´„u*~ZþgýW;=f<–vzÂTª7Îû~¹Ò"øÙþÅ6~„¿2xkÛkK§6Íy×ñë¶b éø1_H²8厦R$¾y»îî¤Âèæ•q|reí„E:qw^h¥Y(é¾ï¹ŒvYý!¯›C¶Ë»S¦pJ{k
ÌbáNô@ã#ŽKbäV˜§C{•ÝJq†)HG1ÉéëCÞäË•Œxp̶uÕP{SµG=9/ÔkùÌ1¸”Lðtp{‚æ”mgŽ¡R&üÜ9æecªÒmë¶ÙVeÓfeK½ý’‡A¶m«ºy Šr‡à=W.‹•çûÇé¶Ã·Ò4œô£1‹ÇKG¼C¸©þnÊy¸q"ñ?«P+©5ã\À{s–*edzr‡WHü†ÛÁ™Üw5wƒèúZ¼Bêɧ{yÏ_Ñ?€ ó× Þ|Ûš¥PÁó’« Ñ*x á¶Âß48Õ>›]N Úeº%¥ÉIÈI€òcp¯Óämkʧ†zûª&n ªÝvuVÐh1 nEµw|@YøJI°ðÔÉCÛÛü£Üåõ +EçÂßy\Ð)‹Ô¦¯¦›vúeaˆ¸·KsÞ4¨k°ë(‹T0Í5 eÄ!îÒPý´ Æψö³WƒéÞ3õª~ÁÒz&¦˜¸Ü[rÁhÉ€ÙÄ)ø97w¼dÔù¤‹ç\ ˜`¹ñ”%Ý£žªâC¶«Ú+pËÁ´£È~â@u0âé±›ƒn +Ó€4yঠhmù[ÍÄÎ&o?æyy1eæî‡:¨£Q<#µÎM¾Ã–3íÑ,’ÿÌí»‹ôê8¼þŒñ)wž†‘*qÒ-Ó„ì<£-dÅÙ53û'œií1O3B!E4Œ*¦w +÷ ì¤rþ0â¦D +‡þíTÔÈìT™²mæ,P€A2Ä°mu<ûæn€‚8h 82——j{ýrš—ã¦*îqïÌÑÈBHÞÍ@ï÷¿
E#d~p,Ò`‹H@¢¤ä}H$“¡¦a×:°!I’€Ç5{ØÁ °ÈÏé‘G:äÁ…ôfî]!ë‘i2æ© +p÷°ÿ™ªø̱ÿ}l›Wúß’©.–V¯„7…;u¿{o_?MðMNâ§lÉÞÝa§Ó;ì¦Ì=Ã:ÃÈý£± ñu(‹QÑ@sìEfü–d:T~ù®ýá¼8(q0_Ê‘fß#"ŒãÕ7z R/›£ÃÓ½jÕü4c£:É
#?ŠÁg>¡3‹„Íz¾Â@ð¸T
C
wê¬=ÌZ)ðèüyè6“€º-²
$Òÿ‡¾p§)¼z”\´˜ùÇÁû0uãŠG0ªÀ¦•Ø©8·õ‹ì‰é´¶ß[),ˈf_‡š®˜Cjïêeu4eæ†!Á7È‹Q÷±u«ºÌÛ;’ibÓæønŸZr÷kñhé:KsØ‚Œ&½PǺ¨ÈåQØðqÅ\¤ +@{U²$R¥%VqˆÔk“Æ`FÜÜ^ÚØ#òڞ뮞ô]ŽÊ]ænsë#FÓ¯K^ʘéQ¥–Vƒ6Î<3Zû
‘d*m<!ÕsVÌÊN‡·e9(Ÿ*U^æÔÌxè`@F ÆÂIVbQ›$%lQy[Ä2¨–X_¶MW[£™Ü,g7?#;ºVçÝÎhæøk:ëUŒâÑÙœF¤Q°É¶>Ú|Ç( <ðfc +Ó¾|G4[K]’„S†ÈæHµ%BÌ°äÜæSØ©J,Ùã[CÄÆ0B†.å`ØêOCÏ‚œk@¯Ü&%Ð]»’`8ºÅÎól{¸1¤!ë>Äwãi.¿¦‚a[Õ—a¸»®·wá"…½J0äl‚!»™—»iRî.ü¦:±fRª[q uOBWgjû=h÷ŒÃÙÆ—ö¡ÈgÜ4Db¼‹ê¾è¦gÎ +Mî(>"÷ëxà—ÔÂͳҳ-Sz®Ž +r‡›…¼43šÇ1“Ý' +tgÓ3J +ĵ3òHèû +¸°ÿS]OøÍŸ]~hÅ7“Ò?¥˜ùÆJF5ø
=Ñ<¹ +endstream endobj -741 0 obj << +1024 0 obj << /Type /Page -/Contents 742 0 R -/Resources 740 0 R +/Contents 1025 0 R +/Resources 1023 0 R /MediaBox [0 0 612 792] -/Parent 744 0 R +/Parent 1022 0 R +/Annots [ 1028 0 R ] >> endobj -743 0 obj << -/D [741 0 R /XYZ 110.999 687.904 null] +1028 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [291.62 602.634 313.538 612.605] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.4.5.2) >> >> endobj -234 0 obj << -/D [741 0 R /XYZ 110.999 463.655 null] +1026 0 obj << +/D [1024 0 R /XYZ 108 690.907 null] >> endobj -238 0 obj << -/D [741 0 R /XYZ 110.999 448.268 null] +1027 0 obj << +/D [1024 0 R /XYZ 108 664.406 null] >> endobj -740 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R /F85 373 0 R /F11 537 0 R >> +1029 0 obj << +/D [1024 0 R /XYZ 108 593.422 null] +>> endobj +1030 0 obj << +/D [1024 0 R /XYZ 108 546.349 null] +>> endobj +1031 0 obj << +/D [1024 0 R /XYZ 108 499.275 null] +>> endobj +1032 0 obj << +/D [1024 0 R /XYZ 108 452.202 null] +>> endobj +1033 0 obj << +/D [1024 0 R /XYZ 108 405.128 null] +>> endobj +1034 0 obj << +/D [1024 0 R /XYZ 108 182.154 null] +>> endobj +1023 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F11 600 0 R /F8 615 0 R /F95 412 0 R /F120 538 0 R >> /ProcSet [ /PDF /Text ] >> endobj -747 0 obj << -/Length 3173 +1037 0 obj << +/Length 2889 /Filter /FlateDecode >> stream -xÚíZëã¶ÿ¾…¿‘Ñ5+’%%è‡<.Íy4‰S¸P,¯ÕÓçG6»ÁýïáeÉVn7M› @±€Å7g†Ã™ßW®|ø“+)}‘$ÉÊÄ‘Hü`•UWþêºþv%yˆ/” - ]l¯þòq¯b‘³ÚîíˆíכÐ÷„ý•öW7Ò‡ïÇë—ÛOí¤HÈHã$-E<óËõÆ(ïëqÔ¸´ÔÂO$zÿr#¥¸û£õF)ïëHÃÈ‘ÞvÕíï3ÛòÑå:2ˆx‰oß¾Ã7v‘gL,þ~³@2”ü„g€0T"ãÈ@^„£¯žmG©ê8Lö—D¾Ñ‰/|_A!±I¦²O`7=•ý]Q–ë–¡wl›Ýå×X3^QSkȉÔx29V"ŒFR«ýÈÌ8˜Ñ±áß1%-zù~~L³¾¼§úCÑ1iàíoÖÊ÷†žÚ»¡m›¡ÞQèiÈ]ÑN4Ú¦-²’‰ ·QBÊRðÌv€4 ~jýŽ¦ßµéñXÔ·´F络·ê;ŽÄ
ìl¤IÚÉUúj-}/Ÿœ|!ë*¡Ó¼Ïíalÿn•à9ëÖ…Ä”R»yï¬C`t Jà\ràT«Ò¬m¨ØÝw}^QùiiÚW¨7±ï}Ò¬H(_«Ðûž·ëÀ÷®©×Ê‹V¨û”nö¼AÓroÖTDzÈÒÅa)óa¢²´¦ÂMN" -}aÉ2– :é¾Í«ÏZÁ}.óúN-ôî×&´ä@c×Ð÷.§/Pdïaº×R©–ŠºÏÛ=2›fù»—šé±àóý^ê ÚßäEÞ¾à±þi,î@ýÒ—§nOÈý}^w—KH#|7¢¸¤fºÀËŸ¦ûBõD -Ê¢ë–PB›ài$¼¡£’>^„p¦Í(ª¬lº|÷ÅR¨$x„\ó¨À‚äíäšß@búHl~O7RùÖ¶md(´Œí¸-Ù0ð YS×yÖs,Ž
h.7ZÓzêˆNÛÄ6m63uMÿjÜÌ昷iß´—Ä+#Á4;3"žBÑÔ¿·ò±à"¦G)ˆ±çû÷VW5ð£ÌÜò:ž6*0 ŠþÄßdõݳÛ~éò?–¿ÙÝ¿ä>ᨃ³R=ØÚkª‘‘Ð~ƒ5LË!§ö.ï©ps¹©ôcK·0^j>Ó)
!8é`ôÑ¡_ÔE_¤¥5Ö°„6I480‚Š_ÖL¹(Üæ=»K£„‰“Ù¡¥è.”—¡O¸ÏÀ`]²vcÏÍ=}ÁÝóz‡þø’=€ua0eÖ%o:'ÌÑÕª´ÏÖß#'m‚.Ò&äûš©r8‡=5fÂRÝpƒ'jµW†FÄI<óŠ]ZY?§½6§rÚ-¨082M˜è2BÉ`‚ aáí!ïx¿´åB6ÜXù‡ÊûÀEB^ôQ¡ífÊÄ/BÐÓÍØcwÑ ¬…¢= î› - -äÇ>Õ'ÐÄÏI.øjHw`‰-ß±…w0z2[1£t„ôýl‚òt¤ìé V+)"@mó(cj^ƒqÌ–qh ÁS¹O©õ»“œ}ïXdýÐ2BÊkDs?mSWyÝó=…¾‹––ºéÓ¢¶ -‹g™€ÀQ´dTÙ¥}J%dtßðX~q«Žh/sj!œ©™æÔý]š3_ã“ÞÂBà¯ôtiù£ËXrл¤lOÙ+´ð±Æã†É¡“3KB¸ÜQ¨$¾Dþ«ÂñJLFÙç¦6¯3n¶yvÃ7‰›:úV8th!U‚™’è”PuØnAàyçJóèh¿¢ç]¦÷„ºÐ4öAº³CZß.&HW…3 -ÎÙ‚Z‡¤â$EwñXd/”ÿò'LŠ½ùIâÿȲÅ/wŠ†ä_Ѹø×>Ú‡÷è’P‚r:áAm´)¯Õi¤6èÏjµ±oZï½Y£™ó½?á?%0„»%;¡ô…çø<Çex/ˆ@ªÓ6{Ñ¿²¯Ôõƒ~³²Àapm¬TÞBùö(˜ÀA߇‡<{Ň;ôgé†Îä‚EÛ;F³ -t½¾zñÒ_í`ȧW¾Ðà…î ‚¼qAÚ)£zyõÍÕWã" ý8PŒ¡f4…ò0~ÏãƒÙÝÖ€:"Dµq¢É‚
kljŠ6ª®OĤÑéuk’`*.3@UE˜ßŽåà^‘zw['nýôhãþ·<L?O/¥°Ýa¤ÒÂèó«ëdñ ¯EÉoðv‡j©Óý§ØìÿÈþ
9Ðüfendstream +xÚÕZmÛ¸þž_áo‘5+Rïý–\’"ÅõzhöŠMj%®Æ–IÞ½mÑÿÞy£,ÉònZ ‡Öä‡óò½òáŸ^i?]Å™¯2?Y‡Wþjäß¼Ò2¼ÁñÍhÂÛÛW¿ú…«Teq¼º½Gʘp`r[þÙ×°.ò½ë¿Üþ–¦'J'MÏTàó~¿ÞÄÆûÃ0ëÌ4P~&“Þ\2‰Ufwë1Þ×I +0KÜYnx|Â1TYêD¸=Ve¿»d¶‰´òáj6:Rf nw¶³p~ì•ÕÁÖ]ÕÔö#¯ë›V†ú4DNjçuÉy;¢5÷³Ÿ}ßlOŽOÑÚ¼·kí•Ü¿{šM?4pomaë~ÿÄ[Íḷ½-T°Ñ „T¯µÊ¢ˆŽEj¸Ô€IÁrD[¶^‡¾÷PµM
çîáÞM‚>*<~y9)¶ÝåÇŽ;w–Çé¨Ð¯êÞ¶–Äjß0u—_ÖÚ÷l+Ëšv:!¯J&Tµl'®è.°ÓtUWQÕÛa78ÍjÃ'à£ÆtÖ]”zÛ6?SÜ…›]ëÈ{â^NWeÞÁæuÏ4~ï„\N¹iêýÓ¯e8\ª[g©ŠÓxds¶.¯è;LUà;ó…;<°Í °ûæ.ßïEºÎöÝ°ç[öë)ß³Ì (>×NÓÉMóñá ƒiB›·Ññ`šZî~‡ q–©xæÛS?Š$YBGW2wÔßQøø@¤°òQ¢Õ’™ÄE¨²±ïX7"_B´|Û°÷![ÑžôòÚÝüœ:;]ÜÇDê7ÝùPçExÙ¤0†*… 8V1Xb4t±Ëë-o¸·m›Óq0¿ +6¿¨ÚÖîíÚDÞn ®#+îÖÆ÷NÂüqþ5קñ¦ÿ‘:ÓÄE9±•„}½+ÙVt
NNG†Ò£Å‘§˜êÂ^2R– bDz¢,Øò~<:0R´WÝóÙÄž˜ŠQ»µÂKž÷X¹à<õ+0n?ÌF~ÕåvÙ|zT¼ÑÇ{æ~¶¤æW[[² +WÍ‘å•Ú啼Ÿ$Žýëuy’_ªp"]S÷”²‰O·¤¾rŶDŸÌÍ©^(@ êë!¸>ÌÙD/Hã8“\K\£ºOq}ñ‚JƒôRÂÓ ðŠFŽðwðoã+ß°¤¡ÒK\K\¸ÞFâî›ò{^“£!å§Ð»ºÜׇD˜MâÔÌ0_Ñ_MÍ”Bõ§@£ˆý#ÁŸïGPè‡Qüi)F‡p +µ)¤ÜhÐØ×jûÙ/ºâù.Š&c'Ðbó%mT;‹¨¤BÎ þÉG}§1
å,öMgËëÒR„‰~qi3À3ó&iÿ¯´Züoiuö‘j`Í0CòÔ?¤ª£¢m:árˆù`C D$×}êxj% –9I
t +¥nìÞH êªnóžªf!¨ÅðÛ–¶uÃǼ°¹&ÒçšH6;ÆaØ])µ„u\ÚT5—a#"«7òÜœ¼ëì0²?lµÝÝ0aT,Ž³éDqêH†Y÷í:„x½—ÃËð$±X—€ „ÊnR0%ô>B
´‘¶ë¹Ó“%5ÜÜů§¼ÝÞ îÛ
;XÇ]I߉+oŸ¿Ì³8Ý]ðñ¸žK¼'Л<~ÐÆÇ-›úõZCé‚02ó¾Ô
&´Gî=2Ö‡ÖHT“ÑSÐ
PêƒßoäCWÐì¹3X +ÆÇ8º"öœ½qï¾mȉŸrZ ¸¯a)˜V6üËhÆNuõõdé[¨¨ìï™›@¡¾5‹a³–°$eüÜ·9¯ÅÚˇdåS@£… +ÊÅÓF m8Éø£^±9vøªZÌy7L‘yñD +ü¿€spÉ…ÿLPÄ
üþJÿÌ +endstream endobj -746 0 obj << +1036 0 obj << /Type /Page -/Contents 747 0 R -/Resources 745 0 R +/Contents 1037 0 R +/Resources 1035 0 R /MediaBox [0 0 612 792] -/Parent 744 0 R -/Annots [ 749 0 R ] +/Parent 1022 0 R >> endobj -749 0 obj << +1038 0 obj << +/D [1036 0 R /XYZ 108 690.907 null] +>> endobj +1039 0 obj << +/D [1036 0 R /XYZ 108 664.406 null] +>> endobj +1040 0 obj << +/D [1036 0 R /XYZ 108 545.602 null] +>> endobj +242 0 obj << +/D [1036 0 R /XYZ 108 475.823 null] +>> endobj +246 0 obj << +/D [1036 0 R /XYZ 108 462.543 null] +>> endobj +1041 0 obj << +/D [1036 0 R /XYZ 108 439.534 null] +>> endobj +1042 0 obj << +/D [1036 0 R /XYZ 108 250.409 null] +>> endobj +1035 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F105 415 0 R /F95 412 0 R /F120 538 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1045 0 obj << +/Length 3383 +/Filter /FlateDecode +>> +stream +xÚíkã¶ñûýŠýVØeERÏ|Ë%—öŠ6i·(šPL¯•ØÒž$ßÝ&èï¼(Q¶v7AÒ(‚ÖCrH‡ó¦ôUúJGùUZDªˆ²«êø"ººƒîß½Ð2|ƒã7ÂËÍ‹ß~VÄW¹*Òôj³Ã”1ñ¸Èfûõ*^ü$Z}¶þfóBÏ”Î,¡ÊZk#Þë›Ô¬¾±¦EŠ +Aúør‘TƯñéúƘÕß̛֙T¯>§E?¡ÿ¯¨çÓË
l¡tœÉ}z‡¯h‘WB+þÿjb€´LPë«M’®Rˆ/^mF~&Qü$»qü‚Ýà\Åi.ü¾J“\¥ð‹›½Ñ6ÞUM¨÷ƒ–\@$IT>R¶çqm¢ Áª<MdüP÷ÃåÚ(£Ô²DH.‘Êø¿püê&KT‘' ?ZI2RzﺺÝÖÕS©Jlñ_¦˜nsœâ«Uš +Ê°¯ñvL^¬>îùùŠ¿¸0U{¼?
mÔbﯹUÞ¶k¬Þá?‡}E4MÕàPpÞp¶IÓnŒm[ß%H 3´I½õŸv([¨œUí²ÀÒð`uL:–¢0ÀR@ø•Óp£< +æåLº…/âDjD½æå.ÿaèJi\D*ŘÐõš"S1ÊoÀÔÿÂz£‚ h:@ß»®eµtu K‡]x?øKGFÀ5[æ 7߀חÅ;w(?¶ÜAǾ:@Òײí¾>¸³%½‹àVÀHî +Çs?Ú—GÒïÌa:—ýR¼“«$)B‰ÂG©Ë,xXðEЯ +‚;t' b\°!ÚebûŒ™Å1gFÄdÙªä·ç_!É]g£!XòO¨ZY(F„³(ã:U–åÏßrñö ¹Ð6;“Üe +â‘ÒI.0B‹å" +ä"zT.l~!oŸ‹1öbø¨iç¹X°]³ZeÈß (ëÂçò€¬è¿¦ÿ&è1’é¿Rè"“‹¢Ñ~X)sþåÒ¯ƒäü<£ž¬ +¬`2¶ºýÆ’98H2ô®Ãf1A·Ž#ŠŽ`t_¢±{Çâ\PÄXW¨9;‘Yˆ3H gŒ^N6¬…)‚öˆX¡‡z¨ –—+ÆÇfL[à“Ø·tG@ù¶îܘÝåäÑA<Äã&´þX>Þ³™2s
D7Æ*]‡$Bökn)%H3Ï0²«<´u„Õ[n°ßeÈQ(˜²rbWÓ^\½. +•¤^©ÿDüýÿspýŸ\rÄ€ÅÍ=G¼oâÛð +)M€ƒ6éL¤Æ|î\á
壧ü)F'wîÎoÖI²BΗ㉸E‰ƒýCáÃTZi»ï7/ŽiŠÇ½c²Æ縴B3”²0ÕÞpƒ¶“Q¬E€Ç(©¸B”À QUÙ0p+ö„¤„9”r*,ňàðº)3uÍ\æiBnC–ß‹ÒµT=Ù‘S¥Ô´–D¼ŒëØÜUî£GÒÒ\iSús뾯]÷õBA:(g<WÝ«Ó/TwSÈ Ÿ)îúño +Ì:R:5?¿ÀÿH¤$®#Ô…ôÂ@rD÷ÇrL‘þ_°ìgÕäÑ£ç¹TÒ°‚ +&Ø1„” 6ý¶åšt²jï¤(\¥Wÿ\àA–+3ÆJáeÖ\Áþ_*‘RÎ&”ˆß{[>gÕ6
ÄbÄ1²ÎÍÌD‘!ÔÈsñaä’–P– +^îŽÞ2É´225ØìÏ5~3?¸`/l©,ýÏÚ‹¥Š +pPåcr—œk좟?j’ +?ãÛÕç-=nçÖ¿Ç«ûé+å¡šø0Îï÷–Ëìð»ñ +Ù~QœÙΖÃjˆ4*ª.òY¼–MÏrl¦Ø"óØíÑßÂw1&Qfz)p]íú…úC¢ãí}ܳðP8::y*|ÝL´-X€B¥Æ>cÒŸlÎ.i4"×g¯ŠòÄ:v×ÝözÙIq´X¹¡RbÀÎ- Éò禧laº5]ø\ãš{åƒBð³øEVví©côD +lœÛö~˜§´[AkNÇ[~ Iåã°dâôÕ²Ÿ%¯Â>yQI1_qôLÍùyp×¾?驼HÆdžù'Á'fü"¶’ò9øµÄ tZ@£r…ÁÂ9æQ7ᆑñØ +endstream +endobj +1044 0 obj << +/Type /Page +/Contents 1045 0 R +/Resources 1043 0 R +/MediaBox [0 0 612 792] +/Parent 1022 0 R +/Annots [ 1048 0 R ] +>> endobj +1048 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [339.091 368.921 345.268 382.048] +/Rect [392.394 616.488 414.312 627.392] /Subtype /Link -/A << /S /GoTo /D (Hfootnote.9) >> +/A << /S /GoTo /D (subsubsection.4.2.5) >> >> endobj -748 0 obj << -/D [746 0 R /XYZ 110.999 687.904 null] +1046 0 obj << +/D [1044 0 R /XYZ 108 690.907 null] >> endobj -750 0 obj << -/D [746 0 R /XYZ 125.345 152.571 null] +1047 0 obj << +/D [1044 0 R /XYZ 108 666 null] >> endobj -745 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R >> +1049 0 obj << +/D [1044 0 R /XYZ 108 561.083 null] +>> endobj +250 0 obj << +/D [1044 0 R /XYZ 108 459.045 null] +>> endobj +1050 0 obj << +/D [1044 0 R /XYZ 108 337.051 null] +>> endobj +1051 0 obj << +/D [1044 0 R /XYZ 108 232.135 null] +>> endobj +1043 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R /F11 600 0 R >> /ProcSet [ /PDF /Text ] >> endobj -753 0 obj << -/Length 2922 +1054 0 obj << +/Length 3115 /Filter /FlateDecode >> stream -xÚíZ_۸ϧØGµY‘Iéú”ö²×¸\иE‹$(dY^ë*K>IÞ=#ØïÞ)K½·Mö¡ÅERÃ!çßo†Ëoøã7œ,I’k–ÑM¶ÜÜÁЯ¸0!"hÁÐW¯~«ã›˜%Jݬ¶fÆjóqΗ2˜1óËͯ˜/y -1ûû\‡0s©øì¡ú'óûÆô|?]!L´%ñ·§Wø`ˆ¼±ÌâïËÐ -û†Hx¬gœÄ,ÆÙ¯Þ¬úS
ã„iø8ðù2L‚…"éÏ>ŽoX-žý'FmÞí·÷iS¤ë2ÿBœÅÁy®VLpwä;ç?OY¬¤ïN‡|J‚+&wZ…Ç”~ô° -ÍØu?¼ä*b2»ä’…\›y«]Þæ`ÚI2ÛÖÍ>oʽU—7UZ -ˆ -™RÚZƒ2aùËa”‡O.èÎí'뎯,i¦§?÷s!gÖâà„T`ì†Q$J»7oicgyf»´ºËñ³?Pï©>RÃæð±‘Ý.o¨]W¶ó:mWsî©ecçÔVŸãÉRÆLµ;;Ž}Þ¥‡ºí¦…pÇ¡Ýh}芺‚…˜½nñÉQºæÝló×tÀCÀzKÀEÑPv³ Á¶¨²œ:7Å>¯Z ì6v :‚ baï&íRK·¥fQMD -Û×e<µ0Tî0ÁrBpÆŠAÈØí@IÞYêS‚Iá¼ì[H‰idõ~ŸV›©Û -0¶ôCïaÎAaŽå8‰ÔHcCžÕe°{)™Šä˜hZ×㳑ÅLgÄ„3RÚG/KBGÎ8&Ø .4ˆ>ÎÙqY9/Û”:xd…Ì4_o;cæ Òná¥+ñÆÝ’™ñµeü<·¹LaGþs¥–!ˆU‹1 -Ø48=}(ª;Ïò’I颒ÓA£à^¬n¦ôè
“^äšMþ˱hòÍwÓCX‚¨x¢¿‡²î(R|¤“ùüeò’Õ]™?â”&Ϻ/Ÿ -¡] Ä!ËŠÅÚÉg—Ú˜‚ÎÎÚF!ò%e±™øFiT¿„oLX؇,”œAHìšcÖ4QóTué¯ÏipP©³C¬j¿SKz´ÕÖówè"ÌReñoÔ"³ÄMj1Ðc¦–ƒ¡8“ŽÐ¼ï -uÎdCŒõ²ßßi®¤›Ü9àJ.8Õ<>E/ð‘këRº0VTSAÈ„‰@±ßÖëŸ=‚@MRcáë@ÝØk¼Æd$ºßÐ3Ü%¼’£ÄVï(ñ…:嬬³´´3k÷…Ǹ÷8•Ýo -ù -L\`%÷ -±€‘° /3uǦ²RcðZ6?ÎviÛ¹§fÞsOžÀ0•¨—ÂrHÙ”«Û©aÒlüpëC™´»!˼‡Õ¥ -‡ èl1“úçN= -È79Ñ%9Ó¼ˆxŒzW”©@Ë=§í±´}x*ÐQi;úÝs¦&ÃQD{(ÚËÌLtÃ4µ¾âAàì¼ô *ÔÁ¯Çò8‘Wc9.xÁÈ>‚è<O 8;-0·œ¢spg˜ -Vßæ¹CW%¡:“…yœ Lb:ÀdÄçŒPaÚ4žâw$™ñ3‹ß‡û)°‰ ú¯ -ßÃL±ýWå 6šÙyâ8œMõØÔ”””\˜il -“ØCUï½€M§kÚ-M¤"¬¾”~ÿEvÜKãqÌ»© Àgy••uÛS3I»ýÆè(²ÐlÎÈÜô%B*Vùm¸X>%†¦ Ô4ÆFÚÔÛ7ž[È|#õÌìùšˆåõÌyø¹«C^.°‹^³º,4aAÉ— ËÈfØ -vÙâöð³ý¾v³´µ%3sAD«T*B›ÄÇÑÖ6‰¢Æãª7Öàqê]Þà’BͶM½§Ç‡´¹›«,B£:î×”3)âYXž}ðºrÕ~;@-#÷!w8ð ¥QÂq,Ëò–R)a6`žû<ZúžÔ,êëÒ+_n}‹1× -2÷m!;5åЋûç%hmd"ðDý—З—Ñ41øÍ;hçÅ)Ý{Ú‹»)`{ªv¸”à]L"P4V…s3—É“¶P…3˜tw«þEžò=ñ¾‰è+Z•¯dȸœH¶ö‘~ôƒGé|_“o–bÈU¨,JãÃÊ&ÝÈø² †üUøV߶:*¢sóòÖÞeÆ>±‡TgiRL«¿VYa ObÍ«¥{dn 7‹)€âòe0pÔÃpãn[!{ê¸'ŒÇ,ìÿ¿#u©ìs½n¨48Õõèžt²RÂY_«3 -â(r†Ñº^ÿÁQƒµwØV*!‡Àé‹+Asõ†¦~Qb‘Aï°Š8t,}ï:ß´—•!4¼œÝ1Ïý ‡M÷%LØtõ;߶ñCéA™ùõµ¿Sw‘±¨L˜¬³ŒôCðä3ºÅpUyܽãM4Ü•à‹qÙšS´ŒóÖýN¡§°sR+à`¿‹k@z/à)¶FÚ+³khØ¢WÑÑ=*rbJM0ä`©ÝœÀ‚Z;R«<‰YÀÇWI¾:"¦æe½NKvéýц - ˜ï¿Ü?þ5é?WïXendstream +xÚíkoä¶ñ»Å~)¢E½,z&臼sAš¤wNàî€ÊZÚN7’Ö>ûpÿ½3R+t¶“\›¬ù‘Ãys†bÅáO¬OWqÆYÆ“UQŸðÕ%y"Üôç7#€OÎNþöE®R–Åñêì`R†Ã"gÛçA¸†ï"|±~yöµO˜H”ϘRÖF¸ïÖ›XO¨Ã¢ŠñÌ}<_$f™ôk|¶ÞHü¸N@nb|kýÔþ~nG>›o 2&ÂÄ-ñÃý;<³‹|îpÅßgCK¸Øz£„Œâ –xòùÙ@ψ‡÷’ç—ÈÁ>j w˜â(f\
äb3û+ì¯(ÇŒ§£Sf ®FŒs1Y¦Á¿ +þ1"ÞÙZ KY ìÄßïFT>CøЛ¸ù™£–ÝLÀ)RÆ)n·ýd"•²(Žì¦/„ +ë‹®-Þ8ä¢ÃIU`žEWn=ÉG +nÚ²wcýÕ Ø.ÿË#ž€Õòú´-[]ôÕÃÏÊ<js&ÓØ}vP=y¬zÂiØ·N/gÛ‡HŸßÿç²Ò§´ý¾+›K §ûù*+0ð‚%™²ŸYÅ]…,
åê0úÓg¡ð²ŽFì˜a¥K„çBaê
I)ØÉd"¦uÞlñƒoÊY+TpÞêüUG£7eU6sÆ+ŬŽ)«Ów³Dæ•·šÐÛµ ¤íõZD†ƒÙ~ 4˜îp¥10<CóNSíåŠOGžÀCoFàÞ$L%’hë—Ä8QijC8Œ˜l<s<fi»AÂd(†…¬ß¨jÓõt~ÒLñ1L€w‹99”ï<?qn{Fi {F^é¶mŽÔ½!q†-ë¼hMçDJ °áD¤@ZB\¯%Ì«µà&®/p¤¹
£ö'ºÈ÷Ý€7¸L~KÒ#Ç,J£Gö#èmG«ƒÄÓØ®5…î:ÝQמ˴k‘—ûZ7}wJÓqÒkIŽPcÊXjˆD€‚Ê#³ÔÚHM„G ²:‡s^ç°ý‚‡Æ´²54ˆÄ€o©GHÀt£õÖøN0ê|eÖPÓøK¶È•Súˆ`À“Î/Ÿ÷4ivºÍû€þWÙo[åZ]ï>VáÑùäÌ»¼Dä“40eAýmÞçÔ³^x0{Â×y½C3º`ÿÐoB´x0€;S‚Q™@0”ƒ}_Z) 8®SìÛkýà:„c_0$´ëZö$É1oaÆñZo¡]6ïèíhÁ¨yFJ¼ÚH°®Ù W±soÈÍÝê¦@óǹ]
ÿ÷ÎWs qGCu "ôáhŽŸÞƃ‹n$L¼A¶®Æ-]ö®1ÖÚÝ…Ù÷4]\åÍå;8 Uª ß=€C¾Ûéfë÷¦
;]£\yKñþ4’ÆÂTVŠ#i…íßKÑ‘ +A¯3Õ5qÊÏ˪ì}Èpes¤SB~kXhã$—£YW‚Ñ/1‚ÖÎ;{_ +Ö• +¶¯ÕínësSÙ<,ô]Ýp +¼xôËj÷rÑ(¤#ÜoÊÊí[vÝ^S3wˆé¶5CVWÆÁ9æ°1“…“ûnŸWÖîËÈÉœÍ/FÜ‘˜8 碪’ ++Ÿ%V)è7Ù[Fóš)/×0ê†@At¦ªx:@·žvKƒÆPÿ…”ªÞÁoHãC*Ö árßΪ’I
27tKÃÖõ(kå¶4b¥sž:ôÖÏwç™±Œ¥á/3bʽÁðIÜ0°Ø¯gß!Ì%ï.ÙÄv.ó…³8‹'ÞêléõÄ™HÞp7}1”îê}ד‹'ßÚôt±^Ò綃¶š*_|PXïiÍd³wŸÙ»°¢@Q hªw)á~½{l¡!eÉp×"ç€ÅÓΕÈq¿oßA쨼æÊ™}2ªéqP²Ècó‰qâkye‹E˜àôE;nË‚¦õ™Ò¢Ú£þQ•¼þAdÇJÝù7Né̾«Ü…‘öΊ)øieËOBøJ‚+Ä™ŸOž¿ä«-@|}™ÊÒÕ
´!βU}"ðò‡i +Û¯Nžüóèù¨€ˆ‡óxü¤Ó·®þ‹o…7«Ñ–éÛbíO²Ô=¤ø¡Ùz:ÐóKײ-ö5 +›+ÍYÂz‹1~5Q¿éÀŠÜð9°«öŽ¨®¸9/8RzÚç[|ö`ä¸*z +endstream endobj -752 0 obj << +1053 0 obj << /Type /Page -/Contents 753 0 R -/Resources 751 0 R +/Contents 1054 0 R +/Resources 1052 0 R /MediaBox [0 0 612 792] -/Parent 744 0 R +/Parent 1022 0 R +/Annots [ 1057 0 R ] >> endobj -754 0 obj << -/D [752 0 R /XYZ 110.999 687.904 null] +1057 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [337.248 582.802 347.111 595.9] +/Subtype /Link +/A << /S /GoTo /D (Hfootnote.16) >> >> endobj -751 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R /F87 383 0 R /F11 537 0 R >> +1055 0 obj << +/D [1053 0 R /XYZ 108 690.907 null] +>> endobj +254 0 obj << +/D [1053 0 R /XYZ 108 666 null] +>> endobj +1056 0 obj << +/D [1053 0 R /XYZ 108 644.864 null] +>> endobj +258 0 obj << +/D [1053 0 R /XYZ 108 365.593 null] +>> endobj +1058 0 obj << +/D [1053 0 R /XYZ 108 344.622 null] +>> endobj +1059 0 obj << +/D [1053 0 R /XYZ 122.346 145.935 null] +>> endobj +1052 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R /F90 426 0 R >> /ProcSet [ /PDF /Text ] >> endobj -757 0 obj << -/Length 3016 +1062 0 obj << +/Length 3546 /Filter /FlateDecode >> stream -xÚÝZmÛ¸þž_±eœÍòE¢¤äSÚKŠ½\Ñì$ù ËòZ=Yr%9›mÿÞ©‹›] ½6(¬(Š’ÙgžG\qø'®„à,MÓ+Ä,åáU~|ƯnáÓŸ ;„3)ChÁ§ß_?ûÝë8¹JXªõÕõÞŒ¸Þ½Ôjñ€™¿Âü•«àð|½úxý'3)f"V8I –$¡ùój£eð×aÔ Z(ÆSaG½\JÑ,•Ò~þqµ‘2øÛ*V0r£EðÖHýƒùûÊôü¸\A¥L„±ñË·Wxg„¼²›Å¿ï<[†OíP†LE!h"Hqô³W׃VU’²&sŸÊ7*Žh„,Ñé {ÁÅU -Ë©©òß6}1lfø -›I„ÛÌsØL(‚75>yðçÉaU,íp¥å•`xö™Æ‰Š%2½ÚC®qÈUÈB©¯6’ÉPšîW¶;÷±÷fM[è+”½œ²²¥5{ê9fyÛtÔ—g5unê8wÅŽzJ{þPPǾisI=<G•N“ß𬛮¿¯ì¦‹z?•mS‹º§]åYUÁY̲ÉdÙL$2†•K£Èˆ;eý!k[Ï&#åÑ2ÎPsàt ž…h…Žî¼îƒPᶸ-ë/VøWš &æk&E8@ÅøXˆ S9_Ô»áÓk
ö-Wñ(B¤L ð -Ï£(ÍY<h½\ZÚ0ž PÐFD`Q1¹ó¡è -ò•¢Î¶•mœ@£+çªüAÑœW튜˺ì˦¦ƒ5ð´8¬ÞQÃ^½|ZÉ(ÈÚWêõ½^‰(hì´_>gÇìDk+kßíeÜØ€_¤Bàži$¦Ñã2ŠÀyE8ÜÓ[âW}êæë—µùZÀC¬±-Ö¶4¼ò5Ÿ|2í¯>¥s& œ¸ÝâJƒrgÚXÚO$Y»½žÈF²iÀz) dé`7òßœ¯?ÜûB¢9c¿ =’$Ó -f³Èœ³Êdsa˜·%*ïšKaÐ"ˆ~WvÈzk¥íì(Šky/‚Ôzi_d5`GÉʾšê¾*ëâËXßÈõZß„
ž»²BUpìÚO}Go¤h \<<—AÞÔu‘ÃÉû²¾¥®Þú9G†pn©E -côrí•õŽ¼^Ù=‰hN} 2›B¶íÚÚ)§sïæÒ³ƒ›kíÇm›å¿"fï iP7@¡dJ)ÅT|v:§¬Ízd;سo›#
6ÇÆ®:;ÔµµÓ¬¢àž:-bšRØ×²Ü v¾±™çÐ -ûH
§¶è:ƒt8 -uéf“Y&,ÖîfJè;JØzÅkÓAµ·¦çzi!Ø@ä ªi+F/ñ,´t Ûæmò6*ÑL$ódô/fw?ÛI÷ïŒi£V2@|³TGçúWäØd³µÚГRîT±ÓÀGsnF³ÞX)@û2?WÙc€ -˜YY+YÂ[i[Ú -b{`Ǭ´Å¥†øcÈU.€9ŽX(§e“SYä0.¯Ša¨?6ëI®jj0Yû0 8rZK„
º¬«[.ÖÚ}S£B¿Ã?ö£°ÑÌ -ø¥Cf¼ÜV”0)ô“¹QaÈd<WkžÁÅtÈ=#¢ãÌÍÆÒ!>l¸·b–a»çË´Äå± -À*‹A2|3áz:yØ•n˜Àt@¾[´ãWÓí†Yi,s¸ESâÀ÷7û¥‡hNÌÏ\¸§ÌÅ”¶…29>¤?¸=ãata±žÌ2½X¥‚S+™jP·mQ`‰_æ=ù.¤»QzîÙs– TOC¦ ŒæšEõþ26èsü©N„Ñò÷#p -ºs¾ðr¤·Cû˜ -šB-¤õ逴ˆæ^QÑ×ÀR¦y4+@?À~¤B>”Olb$=ÚÁ‰^’žýnx¼ºôfä=zä=6‰!š -ƒ‡ðDýG0*+' -äíæ¸IÊðçâi™ù4¹-Qd ‰ü#cÐÑñFrhÚòŸMÝ›ð ïm3È£ˆAJK.°qyP9°—Š'©°œl–ï^Ðà½Ô\ßZ¨Âe™´m*G,›½/f‚q¿áö œ…Ý%Ÿ5Kbg^÷^ CÁ¨ÜÑÃå‘|,ÜOõõüÁ ‘ÄLÇßUxÅkéýï ¯C蜦¿<h&•›¥–üŒ¹«GËø˺#¤›ìsÙÍ#ð°fUd»!0¤Û38é‘8¿³+0¿Ç?ý -<–œÂHý°/€ŽÒ¿É›¦Mf}ñ ¦÷ýŒ'îg£ÅÐ'(;úΔ]8,X”÷õ_Õmy{øÕµ‰¤Û¬}Ü°C[2§t€Tbƒ©ß™/”/cU‚CìØUòÂWQWŒGÑÅ6|<ÿ#ÁÐ1Ï>*»æœÔÊ›¶.,ÝÅ÷¬÷ý'¥XœÈ«rÞ.Öz…ŸØàÏ‹ÃoÿÞÄMÉ‘q²îQôиÛ= _ÂÆÂI6äÚV×ü®[ŠÑ…îvޢ߰[¢¶îžPn¹ëîw•ˆ…é"¥ïeþk]tݘ´û€~Ë~È´f\¨Ç^U -Wm~E™|üÊšçendstream +xÚZ_“Û¶÷§¸·H3J€$H¦Onc7îLRO|mÓI2
%ñî؈¤JR¶/7þîÝÅ. P„Îg×s3G +ÚP—›=/9Ù{BO¬öÓçãX¨Ü»ÓLƒVØCä02ú0;ŒsÒ +•Ä'ëC‚Ïoƪ·‹”ã*L7N?‰í-š’Ü0Û`F|*µQh„`}÷¼œŠ¼£•ñ™rîzœ^¾«ÛÛÀÚ¨vç äF“× +<ë»» +m›%=œíÒk
F©’bÑWÿ=Ö}µûú’¤y*’4{šx“/[€d-à°ïÆá¾ÙtûŸHÈ¿<\ƒ*¡´·ûêÎé«íøð3ÄŒhÁC®°-WÛµ2¶wõ~O{Ç©Eê
¤_âj,¾z¼#ùMi?)œ2Ðëp(·Õ. 6*ŠÀ=®™Èâ„g”‡²ù'’”JOTàÚ¸1°ÈßÚàݾÚÝV%øØÍžG@Ízj5å=6pGå¾þÇQÃœÊL‰XÛ0w(aÓ3VUËê7{ÊQ؇z;û* «à/´5¦²Ÿ{& +ʾŒg*¬±C,*YˆV$ÞXx¦%qkF‚ŠÜjÙŽô"¦èLC-Ð&Â(@¹¥Ý§sðo'ÎÑç6“àG=ß„„_ñšh¤ø,÷CÇ‹÷GÇFɳìs +6ÖtÃ8“:¸¦Âù‹OºRÅ\è("§€°è 4‘¨sPìd{MOãES•mm<ÿ@€Nfì&Â%ÿ—óÒ^ì´Ü¿–ÒðJo„1 1Œ]Ïr³ödZ=*îwG›{zžŒÖìŒÖ´MÔÄ3ATO\šYyîâ!¾çú„Á‘æÉÕfšå$`·ƒÈÚ&ÇÖšQŠ+yÎmæSªD¤‰|ª³pÇÕõDÙó!ÇK¡ŸúX‡L„•8ga£ºL ˆN÷þOt632Ínƒ¼»ã@”¬m«ÃHØ
çÜwûžø»Ýwˆ[¸Œ fSsY9žæêdGø¶«P‡ÚêÄ:í2˜ªI0$ åb±ï¶€¨î—:5ê
ÑøÚ8lÕÊ&‘8tøžaœA8žëùÃŽÆ,Ê6/ž B娓7Q³X¡!%éB¦¿5¡ûÝðá&M <r›ùf•(P 50³Æ§KÅ&gɘÎ]‚ʺ
èS&ri´æmÝw- ù‘h×ö9ÐÓqËÝ Æ«³yÆÈàycpΖGÍù0Ó=')‹Ÿ½G™Hó/‘¼cè¶{¼í»ãÁ²</ Žœã¹Z+‘º4w=#²Ž%džLNïµ!öÊ0,2ÚÔÓ$‡`»¿yÌTÈ4õLqÛµ-d#Ü÷П?ä#ODû>í"í4¹sXÁüÖ§žê.=§ö$6§\^¦#85•kBzœ«s00™Ø‡Ÿ'Ô”×q •MÙRqžÏ(-ÒOD—Œ#WÚ7Ž³ é’ØÛ¾<ÜQ=À¾âðN¢)´õU‘rŠÓ#º¡ŽrÓGjž¹ÞB/Ú\"8P‚J¦æYE +-‹?Ó`˜Õçù¦¿8,{Üë¼öVzsq% èNbå´ùæ¸ë5&æaa¤Fœì(П†÷}ýÊÖœL¶ø5X&™Ã eßwïîª|¶Ž"ÈÞÚÛP2žK¡œp¾"Ú².®¥ö<~ýGJcLñúŽÙæýC«äj4G;Š:ÖcÒÉsLAäŒ'±Ì"KÖÄxbü'P +tCö˜'BkËÓp¼¹©ßl +¢Rƒ+..kK¨ÞáBòGœ'{IùjuB7X.§Zt`ÁMÎRp‰º ÍQç±¥\û öõ¶÷÷4Þ”;þ +”Z¢À½rîVØ4º¨ö_\@(ŸBwž0 +!‚~ +1®C’¶âžAö ²YÅÝ°Ÿ/v]Åñ®&Ï’Bjq>‰¿PÑH;À0Ü·cùžx¹éúM½óx¤–IõïæªÃ HìæVI©ÛÀãCMë®d÷!µÑŠ`Í6P÷‘ +Öêð´?<<ï{¼'¥ÜáÞî¯C¯«hj@Ù‡¡¾Åmbq‰ûhLÛº6àpÌôpánñô›Þ\R=Øjâ."½`FbeŽÃVàõžÊâÈ‹»Qô„sŽà<¥ùÍÄ$ >á$ižy?Lˆë8@Tm6"rÿñÍk¡¤ýG¢Ï·#‰fà„}tkVôn~ÏÏ +èiòMß5sDg"wiàû• ÕÝ10ÜoSèI$o«Êyg-í¢)ˆ©z¢&?bF<ésÌè}…!ÁωÖDŠÛOû1Ï ªù¿
46u‰ÿ¦Õ$´”‹ Æ’ÙŒÑ3üVüÓÅÀLPûz Ⱥ£öÔ{›µÌw3’$‰½øPʆ,éVìäd…~¢¸öÌäC5¹ulªgkØTPÓýTNÜûï>õ435i÷w B«æÚbJBwÈ,‰:dÕ@žŸ¦”^ø‘«|
ú +$Ѿ[›ruàÆ5GX¦1¿Ú‹rJ棌oõVÔYnG×p ¸¯¥÷³…ÏÚnÍqUMšm<™¾Ýwƒ£†üÚUj¦Øõ;—•R¿q™×z`s¸Ë·–R!ÜŸ_`i7?¥,©Ô9hýÉ=A +žªbæ9=‚Œšº–4¿2ÀÇÃión®€ø[žÉÙ ÿMÓØù›Ò˜K€—€ˆ¸”zA‰ÐŽ'Þ“@‹Âˆ}‚Ð
ö¿¥äp¬ ÐÊ’“„Ž^]²Ð›
ÕøH¨ +endstream endobj -756 0 obj << +1061 0 obj << /Type /Page -/Contents 757 0 R -/Resources 755 0 R +/Contents 1062 0 R +/Resources 1060 0 R /MediaBox [0 0 612 792] -/Parent 744 0 R +/Parent 1022 0 R +/Annots [ 1064 0 R ] >> endobj -758 0 obj << -/D [756 0 R /XYZ 110.999 687.904 null] +1064 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [372.043 315.689 393.961 326.593] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.4.4.3) >> >> endobj -755 0 obj << -/Font << /F78 368 0 R /F101 484 0 R /F88 386 0 R /F11 537 0 R /F80 371 0 R /F87 383 0 R /F8 534 0 R >> +1063 0 obj << +/D [1061 0 R /XYZ 108 690.907 null] +>> endobj +1065 0 obj << +/D [1061 0 R /XYZ 108 185.48 null] +>> endobj +1060 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F120 538 0 R /F95 412 0 R /F11 600 0 R >> /ProcSet [ /PDF /Text ] >> endobj -761 0 obj << -/Length 3554 +1068 0 obj << +/Length 3442 /Filter /FlateDecode >> stream -xÚÕZYä¶~Ÿ_1y²˜aDÝŠ‘ŸÁðï$/^V«ÕÓŒÕR[Rïx俧.JTK³žµwLSÅ«X,V}U¤¾öáO_kí«<ϯ“,U¹]—Ç+ÿúªþv¥¥‰¯‚ ‚T}|wõçÏÓì:Sy’\ßí©ÅÝî;/ÜÜƾ§è¿¦ÿÁæVûðûùæû»/¨Sªtb§P«,‹¤ç×›Û$ð¾[CëPù¹–V-GITRýéæ6¼nÒZÞ&ÚûŠFý„þF”O—3„¹ÒQ*CüãÍ3¼¤A>fñÿË–¡äçÒ„ä:K½$áùØúê³»Qªa–«:ûk"¿
s_ù~ -µÕ³dG‰G½[t•Ÿé_`Âv?7fXŽ c•dï—+…‡ÝÊô`1óøw™þ°²zp
áï"ü²6§•Õ[K÷þ+38€ªF*HôìÔþŒ2ƒñg©éX -f}PÏÁ.¡š.O0yš¢a.lÿm–é§c%0‘ï½6]Û«f¸a*›(ìºb£Á™æž `¯ŽE³ëíW3tf» |ï<T2v‹nÏR²88?ÍÓµÂ6‹À1©0æG+cÁ²¢(~óPpFô¨'ÂsÁ?]UEs®‹Ž 'Sç®b³ä©Êt(ÂNøLyØ€½ ¼cñÈ…m…¿¡wî7Ú«vüÀÊWà/QX&;‹ÓUgÐ!àW»ç.e
&}Ç4ð‡^qùÎvC#ÐÏûؽ™i{nŠÝ›M{¯±Ú|âõqÅŒ"¾{;”fë'ù†…²‹õ\“áö‡ö\‹(·²œ‚vàÊšÞ´
עϩÍè%«åyÑQ¨’ÜÎOÊ‚d*ŠmØ“å8µ«L³ªcAÎ|”»s!©æ›àWÚÎüÎMQ_¬©¿ØB_4§]zš*?yæ¾=Ã|ƒAŠQ]µÝ
°)™mÐûÑXFní(˜\q䉦G¢¾Ý`JVt!¬ˆeË@½?¢åßìd&A)YâƒÌ~ói™<_ݘ)~ÇîûMû²ÆÂÎçiàó<øSóOö {y§s'¥æ|ÜVÛËÈ{±_ΘÊiðVêü|¿ï²¨p4'f%¦€ð.]Vw^qY -Á[6½Œ}ZM_ÙÉ«£ÌØWp‰KL¢°EU߯ì@ðЪ&-HŒb8ÊŸÅmU3ûhøoÄe1âS]½u…x*úêÛ£”J±ø!m“´µÞãU%=|
ìÿĤ»ÃJ<„™ÊÒè½Ä5sL”ñX÷u»}XRá&6míŠø@ÀqÌ":.¶X¹ßùÐ.W œ:wÛþ?»hïÆ«ˆÞæm¨$™Cô»M{ˆfá 'rX¡0ÁÆ J "µà‹±Œè‘K¬MØ\š¡àªº.PÔ±=ž:3öµÃ–íÉT½KK§35—) õÑå= Âõ¸/ý©*
ê‡r
”Þ†hw’üö¯WiwŒ7"G¬#Ál_Ô´ü»«ö”•9×+N
pS®³gzÅwÃñ‡Ì[[à÷H¡È £ÉÁ6ìD¸qÇ¥ÉøBkd¨·`5d}épª¤uyîŸI"*™›F’[zS•‡Ú‡ Ïx$¨¨ºÔ‚Ϧv“z*'û™§†0ºÍŽ~9fRdVKšõs"p -÷+¢Üdse
|ÙRj¦ìªþÔrd‹Ü<2uîoóLN$ÔÈA£í˜Ô´Sv´Oq¹ÐÿQ„”†*€%¸¦o )³ÃCöIŽóˆ<ŒWuæÝÓžÆÀ5ψëí©½ô -2Ñs›v7uÆÐÄÞØpäÎÓ—ÕS/SA2A¾ò<´û}±%[A~I¢ü8x¦×m·ÿZ‰ëÜœã /™ƒ>w3]ЇTóÅ#ÿ¬¤qµŠód‘Çå5n«=Hee‘ e=Þ¡ü™¨$M‹:ƒ÷]‡•Æ¾ÊÆ«Ê_ZàγBpï&¼U”ó”z9MDhtjò~¯žÉg°ÎgôË|¾³
ÓÀU’åü{{I@Æù´Û UZ§Ö„õÕÌC4ß‘éû¿"Î
^Î9(§6èúAŒ(Ýà¶Ü~ŠÿiP±³?ÀY§ôíû7ö¹èL±¥‹±všsålÑ©Å¢¡seÌü’‘7·?—>®=÷ÌuêõÚc,g’ÝYÈ9”?ºÔêóĵxâ$ÅyvÅ4<98 ™)”×oT7¦ðí3*Û«e·/
Ià@Ý·µ$a#k†æ+:ø -ˆ‡dˆí°øÞˆ‹üÎJè33ih–F @Df0¼áS+š -õxIcÊÃÇΕ1›§••çH¼ÄLÇkp(>õleRAÃd6mB>2¤±ëÓD‚KÎ'¯€])h‘w¤…ËmuéÂë'ÊOW_a_*Î5VýtõÝ÷þõš|qå«0Ï® ì+ç×€/â˜^tów}õòêïX!û‘º(:ÀÿÊ ºH·íIŠA¼ð×f6Ç5>¨±H×½?Vàþvò±·¹CÊ€íÆKøþ ’ÿàYxAÒ™íÅâe?nGr½;áÅlE9œmRtÚr,j±¥,ꘞâ®n'†¿~”UÚ×ß³7ÚÿÂúé@endstream +xÚíZÝã¶Ï_±6j³"©Ï¼¥Í¥½¢Mƒf,äA–å]¥²äHòm‡ûß;ÃR’Eïm’k‘ŠVüòÎç”7üɤ7qˆ,HnŠã'ÁÍ=4ÿåÉÝ[ìßNüéö“?~‘…7©Èâøæö€„R¡#r»ÿn®áwQ°úbýÃíßÌðDÈD›á™ÐZm÷Ïõ6V«¹Q#Q-‚Œ}¶$‹LYŸ¯·J¾]'Fnc¹úÒý³ùÿÊ´|¾œ@gB† “øæù¾6D^ñZñÿמCIòÄz«¥ŠâUâÀO^Ý:~FAø,»Ã +7ˆ,%»†¿»lH¿©ò¡j¹õÐvž‰²PÈ@º™@4–s©H„n2AÔþJk§iãe·ƒÕ†z«¯„>À첫 +>ÌJÏNã
’É»*ß¡[ ‹5ß¾=rŸkWö½Ù¶Uk¹ê©ˆGG%T¹RÜ‹O*ã&Æý6ðíXG"Š-ÿQs‰2‰ ®ê§³‘,ﺼø÷ZÂ^ŠëêʟθĮÜÖø4IšÎ6ûPáFéªhGÔ&¨$ Ñ
µ¶MýD¥]I]´Wl©xLî5 +ø&Eç3÷´£\ˆT‹Ç%¿ E¨P awÚ4¿âæ4T7cë݆&'bé”W•Ú}yѵ¦7" ÀF<wü²ŒC©j,)îí>Î)åWwª FÑÐðßÜ궞j^Û…TQcöT£ôùŽJðrÙLR®ºÄ¹²*•ä,L•O) +O§rIBÆ"ÊlôPù9!ñγn^¶†7yç¡ !‚ø_ ®úÁCB ë÷¬ÁF-6ª!\ŽÒEX‡'vúÿ‰}D'FNèYMËÀ@º û£>7—a¾—i¿£ƒKÀO¸` š¤sUwíÄ¢¢yùqqkÛ¶§¶j†Þ³°êÅâc>~Éß8P¿ÆºD +ôñ±Ž’=Œ3{¯åMRùùœÂdÁ¿¢Ûøß÷̦®0/’TÆ¿Di/à©ÁúéÄà2³ QÙÛ¤¯SÂ1ûªŽçzÈÈW홃½iÞÁ)ä¾Óä²ÔæRš1³Ì§ºÜprÊS¨ÁèÀ¦^„FM_G£ì ¥ùº{Çp“œÂMˆ-¹úŠ +Šzn[ÜÈÃ!Ï!FJ¤‰U‘;1•+_Þ ¨_IÀößé÷ SôS +’bç±ïB)%b’»„Rù¼fAl/ò¾a>¶Ö6Ùª0ƒñù`Ñ=ÈWX?köŽdsUîÈà´~¡ÜƒŸ‘;ä䮟êª)ßÞÉÍÚÜéÍ]øîeäcU#wÒdµïrdÄ#ÕˆGi¼Bº=µmÓ”ÅP5÷nŒÑw(Ú3â%T! +ªÜ>ðªÙ“ÂRõ˜?Ñí U²Ê'êØñøÓy°?¤oÿLÁø
ŽCüfkìz03è„ç¤ÚÈ‘)ð\šiëU_B@Ÿ%÷píí‘*¼s½jò#—vO– n€+ìœLÙ˜,¤{ʲUPy͹oÀ4¨¨%(*^¶A–Ûªš~(sÄ2²‘:Í:Ì‚9xjzxyŒíe#ö…å öe8Z“… uÖgÏ.ò›BP`^œuèÏ]מ^_5ørlð:¡á~d<Ÿ1)1¸.íˆ(ð@æ¾”„Ϭ…&8˜Ö“§BÅÎÑòâ½RÅ£dâ‚Õs,q•-h5CrPèA!WGḎ6¢yP™îÍpDÃ;”sle@²ß\PÆo9|VV+H3·¯Å†‚²ûÙñtÕЗõVî¬iê8´,7À§Öî'N•ð7ûê¾â_Ø
¦*„¨KF3M[wu¦@§a·h¢tft
Ûœ®aeRã(ô È +ýa<!vªÊâì•ç\ƒiø|\šˆ$TÓ{²¼»F-‰C íüÖÆ“‰‹iz®v¶½Æìÿ¹Nã9¤‚ª¹Ê¯Ì)ìéP$Á¨‡¸-?÷#FTuîA +jÌ}F¸‡@HŒ§&lyÂ!qš|h•»x_Fà”Ng~ðª‰Eœè—9*P g…Q½ 0¯0ÍfO
O×iš{9Ü•¦Î`™±»l<0Z™Ž!ŽkéKGåižxѦ«+÷åÖšð˜.„!»üéŽÌÝ×
öÔÿ6™†lÇ1ýÎBd9"méð“™x1¾ùƒÈï¹éxÈr:Ò<™æ±Üß{l…`LÃtLð´$ >ø€†Ø*˼'ä$}ÑãÄÃÁ^R ÏLÑS£Á^ÆN½2‚!¨|»NÁM3í¢p‰Ô,öËr»ïcÉ‹(ÍÐ5ö”ÊY ÷Ï}®½„ÒA°2fE{®÷TÄ ÆcnÒ‰[›<µ×éñ…^¼e“¨-°VKö›×ÇS,ó=Y1˜÷ˆ›Q,ôâ6ãû±k#ÄŸÉð—üÀª¤vþRÚ>–ôÜAúž^Ø—GàÃ[ßÅX” +íÀ +ŒºÚ³ÝNγE¯¥«û³q‰b©ž)2TJåÓB:'ÿ)÷ +endstream endobj -760 0 obj << +1067 0 obj << /Type /Page -/Contents 761 0 R -/Resources 759 0 R +/Contents 1068 0 R +/Resources 1066 0 R /MediaBox [0 0 612 792] -/Parent 744 0 R -/Annots [ 763 0 R ] +/Parent 1071 0 R >> endobj -763 0 obj << +1069 0 obj << +/D [1067 0 R /XYZ 108 690.907 null] +>> endobj +1070 0 obj << +/D [1067 0 R /XYZ 108 534.896 null] +>> endobj +1066 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F120 538 0 R /F11 600 0 R /F95 412 0 R /F90 426 0 R /F105 415 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1074 0 obj << +/Length 4101 +/Filter /FlateDecode +>> +stream +xÚÍ]Û6ò=¿bßêEmV%JjЇÞ59äpý@w[ШVæ®uµ%Ÿ$w³-úßo†3”(K¶“&Ö9ç{†Œ¼ +àŸ¼’Az¥³@dArUìžW0üg’§W8¿ò +"évE
ûR.¢˜é’`‰Õóy<ŽÑmYñx…¡Ð™G’œG¥Çªw¤æø4¨9»•MÝÏýÀc”‘d`(±¿ždIFj%€…ð†žQ\jÑZ¦’_&‰§ywyÓÆD=ÒÀç<9#jÌPÂÝýþ4N 4è]7YM +{Å
=áKÆÖ–.Ê®åÙm™·¦µ|¶E~h
O²M¦‹ûz»Ñµ<’ÇÑõ´ôMWÓØ)êq\‹…ûú¼6¯ƒ ¬ÌÀ³Ôíž³EcúI¤EÄ% +Íì‚»ö€N»ºdìgWtÆ>]qÆØýa£[S=¶L,’0ó<6Ø4ñ[G‹6ßÊç4?V"K“Aà—C‚ l·+.X~c–<ÜåÅ/×sº5 æz®§¼+·e÷ô|Dd¼¨˜ÈhAß1Æ‹ÝŠ©ç¾ò\ k¸&³c+w®ù¶1œæÛíLh`]Ê×” Ô•kñ•k3Î(s÷Y!—ÒPÛK[¦B'™ëHŒ°¥ýz#1÷«¿öÁYÂõs(gxÅÍ_lýåpñ/;ò¥}þÆë;S{û÷•J¢Åw×*`ÈW®¡ŒãôÁ¿íÐw}§ÙuiÉï³oûŤ×îõ´ôe ™%ÜG§ÎEkîÛÉF¡ÞKúFà×Þæn¯•äÎúËÉÒ·³Á!
*Ö{Óä}k¤Ûäì-öM½>.7±ÁvÜ(鵡ĞàάËÜ«&Ú(p ×viŸÀû¼í=ÖÔ¤V)x•kÄL¤<îJyž%Aêâf&ò»Vàŧ –C{n®Ïça@7ùÓŽ +j§³=xRŠ7rº¨ ¥ä©Ë÷çRž§2ô©ç©ŒÞƒÊ73–¡Aö+V¦)I–qKz™Æ .KzÈédzgÛ;)÷‡iŒ£5¼PJµo œ’v"þÝ£³=¦FW{ÍÛ›‚‘»'ú—½åÁÜ3zYÓñ‡¨œ¹sKäœ&êT¨ÐõSªz¦Ð_©T‰P§cÏ\áaU&…æe3Hxƒ@¦‹Øi…É<õíp¢ÀÈ^RWß;jzqvlñ5<F§R±ŠÁZ\‚ŠbM¯È»¾[m·Ë}þª£±Æt‡¦jgze6hˆvNÃÐ ¥UÍp}pÛ–•qCt€0µA!EL>¢zËwVïQïªÃð8—=r8 +?ŒNùfŸ§Ó·BA¼½uì†4dwØæ4Úç$,
Í6œ˜P:¼=ðä¬îƒ‡Ñû³>õ}—ý}:Ý4XT q6R¹ÒùôAF†ZZz;~s+AìQúÃx{¬Õ§[<…QiD +>OòØ|ñÍœ0]ß¡'²ž#ÊÌ#V+,ÆÃ\_”V|RZZ¤Òeö_LO«€ÃÉÊç3¥šHÜê± ¼º§ýõŸ•ˆ¤?hûhÚ7nËëÔ?ODRr¢lhX")ýòˆ+ cŽÆDz£@¨T¸(lÔQjqgèÛÅ»²ƒ8°ä‰ëRÕŽ^Ð÷8`ð¡1ÿ=@|o¿¦<H°¿dw€_Týçᢦ3ïƒ9Ž#” ˆ¯ñ=ïÎK|¦W{~ºôjËñÙ¦&†-û¢k°N^·Tæ{ zñ›ijšå,œ†‡$\S„ +žPõq*ßï“kÿˆ3cûâsO‡ƒ×Íw•[h¡•<WºQMé +Ò›“¥¤ðRúgâQ¸‰z[£Ù[ð~ÃÄZ•˜iÙ)‘ô}7¤=üLÙ +G-õv°¢GÔ/€¸ +®2ö.Pµ]ݘ}úç„´5†nwUV.4bß|e.à€s‘RW!ï$»pôÊŸ€c”p q +'‹ÇR¨È_{zžB ç£qnÂ^Œ"kÃ_×ø±/|‘)îû:0F—²ú9w’JC9Ù
¾Ëñ>)$ÀoË]Þ™íÓ.ÛËo_=FýÉu/˜žáäçj’Ã{M6ºëŠh{tÇŽòØÛ çÍ7S³ØWHþ¢&¨u“ãÔ#o~8g·{q™·r8zç;™Á´¶¥Tùnb3]áãù˜ +üš{DƒQ°(©\‡AHðÚB½¦WbnY°Š/Ù%Î#&Q-•ái.‰”¶ž9n„$YãýK¯R}Åÿ‰g&ïç/}žØ»ÄÓºx}¬ÌßíϦ[sO?BE¥`\Œg—MÝÒÁÅ$|¢¶<ÜÓ|7´à`ph™Á5~ìGEqhì1#«ÜSßQƒ·¢>l׌Çð‰ËMWn·K>ç¡ðKÌvÆÇH¶¶}”‹vCØÂDÚÈÂ÷;£y{@sûœTl[?ðÍ^,¼‹â +endstream +endobj +1073 0 obj << +/Type /Page +/Contents 1074 0 R +/Resources 1072 0 R +/MediaBox [0 0 612 792] +/Parent 1071 0 R +/Annots [ 1076 0 R 1077 0 R ] +>> endobj +1076 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [428.595 238.889 438.458 251.682] +/Rect [326.647 312.909 341.093 323.813] /Subtype /Link -/A << /S /GoTo /D (Hfootnote.10) >> +/A << /S /GoTo /D (subsection.4.3) >> >> endobj -762 0 obj << -/D [760 0 R /XYZ 110.999 687.904 null] +1077 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [125.437 241.926 152.336 252.829] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.4.10.2) >> >> endobj -764 0 obj << -/D [760 0 R /XYZ 125.345 138.467 null] +1075 0 obj << +/D [1073 0 R /XYZ 108 690.907 null] >> endobj -759 0 obj << -/Font << /F78 368 0 R /F80 371 0 R /F88 386 0 R /F101 484 0 R /F11 537 0 R >> +262 0 obj << +/D [1073 0 R /XYZ 108 460.919 null] +>> endobj +1072 0 obj << +/Font << /F94 409 0 R /F105 415 0 R /F107 429 0 R /F8 615 0 R /F11 600 0 R /F120 538 0 R /F95 412 0 R >> /ProcSet [ /PDF /Text ] >> endobj -767 0 obj << -/Length 3471 +1080 0 obj << +/Length 3337 /Filter /FlateDecode >> stream -xÚÕÙŽãÆñ}¿bò´0êôÁæá<mâµc#>àÄâ -žUj¢` š$¤§4kêA®OŒMéQÖYZx@¯[÷gnÐí ýQç5k¯ŽQ´¶ -D°2h»1VzNÕå$"8ðÅ“PW'¯¥gYœ@òvô⎞چì - ¢-ЛãkãÄñP´è9ï Gg@{¡hÆ‹¤
7´¼ -â[ÇW•ˆ¤¢ _ÿ2r&Òδ{§Dd®ê6cÕÒx8¾ËŸe ÃŽøådáÁ%ÚNŽq×Õe^ºãBH(Á‰©!§²êoÉÕ‘Ü„‹X ¾YCBOH4eây¦äÄfA©à·Ü3«ÏÄ^.å×5bÒ8À°Æ -B¼5¦»@ -`¡e<ñÍã˜ÇïÇElÔn]6ËЖ#PâÜ—)EXã°eØö£DŠMß^Rô±ã·Vñ8z…xè¹c²<ËÙ3Q"§´ˆ¬qR§Þ'v1‰º’»ˆMØ|P¶çX*oA•vd~™é ÿÁÔê¼Je&¸6}Ægú°‰«q -8Q‚`"²©út.˜FŽÆ–¢é8ðj©d˜Üv61Æ•{dÞÞtbÒ Ä“9 êO[ßH+
ail§â;-¥Ãp¦:œi,ÔéÏ nû¾gZ.Œëƒq,´M~Ã!Änë|®äÄÇÎòFBšifæmOÎI:ŠÍ,§g©ÇÑæ‹Èž˜fÁô›
aBp3M‘^¹¬TdíŒVX~°räÇ
´ÀÛ´-2ݹ1§wÞ0ç´œó~z§¤ -¶%^–PéÆø¼¡|`ŒMÂiX -’ä†Gζú‰ -8 yËIШÝ/aÂN› -½PÉ2JFkºÈž[îâå‚šæn\ÚǧýX¾$©j°¹À -l¥@DRpÌCç4'kk3"4¹rœl‘ö…óØ}X$Çu8f”•óOøDöOJwkHµy Î%YŠ=wñíYß`ycå"8x‡£í@˜Àâ¨$Y}]7§´ôe¸É^âÄ]DÝz -ï<§>ÙeÐF.»aGŸž}Ôca†«iïÐpÕ¾Úå¤5yÀ¥õ/©ÕWu–·-}?(g@¿¬æÈËÕ&}ñGr‘HŽ¾Ï2t‰Kµ%Å… É%ǘȓè‰çæ±ÁB—¬’kRîf°¯*¤à‰š–ÝpÍꓽi]̇Œ…ÍS¡ï}¢O¤`æ™ã©ÛŽ®'ÇKE ®É¯4TÁ €[ƒk !ÖñUÖFÚ$‡KŽ.
yFK åZÒ +xÚÅZÝ“£¸ß¿bÞ‚«Æ + o»¹½«Måö¶nçò’ËÆxLƒðM&©üïéI€-Ï:»{IMÕXH¢Õjõǯ[È»þä³;‡"Ó»òð*¼{„îï^I3¼Æñõl›‡W¿ÿ6ï2‘k}÷°CB©ØyØþ5ˆWð^ß®þöð'šž +™F4=Q¤€6ÎûaµÖ*øÑÍšˆF"ÌͤחD´È•¥ñÍjTð—UÁ̵–Á{"úGúÿ–z¾¹\ Ê…ŒSC⧗WøHDÞ^ñÿGÇÐ’æ±ZGR%:Ð'¾zûà䙄ñ‹âÆqŸ¸sX'2â¾Ó‰aÄ¢Þu=¬–äAÑ®d<óC7î+Ó_v‡CÑnùág8•áTîÍ+ïCÂZ™ˆuÆ¢‡½k»÷Ÿe‹~<ãÞmÚ1Ãa†VŠuËT‡Óf¨Ê±îÚóÍG‰*ÒŽØõwÜøq& +;{=›~!Žs’¤}"êbíT + Ûš»¾óòŠg„HJa"yóã¾M«øe%à ²ý¦±ë–
ŸÓÎœÿX)ß•Ž˜)Ež$´JSµ0¾V`YptüË?pDÅ¡áÌ“ÔIÈXäq¼ ð +þÙC]Îl+O‘NžÀ‰YSùÞ™© +V‘$Và8ÐäØ=¼7ƒ>†´Ì—Ý›•W*Nã’½mõsª¶2\oÀVTÒÑœó(•Qj5û»™é³ù–Úo€@f8¶Nâ‚K8X°æ$_œÄ¡(ûÎ!«f »8ZC¾›:Irc6>ÐÒïŒÛ»` +C0‚<~Õ®büZ÷]{¨Úñž{‹¦á‰Û¾À-ð°ÃíÀ<µc_›SÚ¡á“N¬„N³™•{ØV"u¨X0Í×Zàv”S„+¤ô,L׆ç‚Ùë—ax OMÑsß±.ÇS_q\ˆBàU.õäi_3`T¶_FÁ¦âŽÓPm¹‡$ +±’üŠÔ%α¿¯Ë_€B4‚ÆÊ@VNòY.’Ôú?@Àøç~¼ké|Ž³¯*uæí’ܱ’îØèáו“ëëbÓø^‰DÙ÷q3â8ÃeþeXsdPöU1Ò)ÁCa:Ÿ*¶•©§=à„K^Ñ°ól!ïO°ˆ!ÎbÑÅ9öê ÂOTµÈÒÅ^÷,%"qžG°Ÿt<Tˆõ¦ÑVÕ–ð"´ /&3¼¸\7Õ‰çšS
ƒŒ¥³H6ìH¿j:Òê½Ái*–pt—(,WQ¬¸I&¿K×´l<ÖHûWZîÚ<û"ši姢Õíha!üE¸$V¬æ°ïNÍÖph˜/DzÿcS—õh6\ƒ8ŸŠå·Mm/Ï!e ˜¡Ý<z4 +k¦ì=²Ë±sž¢8îër¸ši½k/Òx½8>ÌÇÇ«#™Òy*ØÙÒ~¤¬bŸ©5Fì>M -{Ÿö`ÙS²çñ²kè^ÀÐ4Ÿ°LÔ<•K$e[ówÔÄCü¦Ž +ÉX&Ó‹2ª Fè{挧f¬‰9KÄ—Þ7EÒ9W‹M¾÷à•4.ŽÏð“7›n"84µ^#zÈ—ÛÆì›ÇŸ¹›ï¢”ÁrÜWp×ti-/
îmukhØã½¾†ùŽ p’.b€E0SÛ$[Ç,îÏÓ¦thÕD_-¯ã£LoI\óü"qEºïMq>´y2<,ñ±]ž»®1Ù:—. «Ä"…ýšJs0¥!Ž0IR¡Ã¥¦‘*p-¶˜yû9é½/2™èôYÖi<ìŽõ¡xôÁoEøÉ*°…D~è
Á'qQð3no¹÷¶£©_A¢“Ž®§CkJ‘ªÌ—À†Éì,zÚ›í–Z$ø-øgÂsa²¼°âYäœÃ<œS]¼L_ôÀoU൶š®´i-<ÕíôöeÊ):Áÿ6’[fMÄßÁpXÔ)¤ÈK-ž +©)´rv¯S6´õPáWhC§ÌµAã´®ßÖ-9%|>u?p“ÁsÊanš]Òl®Ý¦&ÓÅ'Üš*gꂶ¹*~~ã˟橘î<B‡íŠ^ý*Jƒ +¢6ýRäÆ7¯|§c†rqs³WØrÛ®Ìú€-‚j*6þVAèžì@_9ð0±° Q˜‘éJxÊäé<!gŸÂŸv5^_`SxCtš_cÖ.Ç0
ã7mªÒT»Ñú¾¾}£8ÿ>¿kÍ5hò}šÑb³ÿ +endstream endobj -766 0 obj << +1079 0 obj << /Type /Page -/Contents 767 0 R -/Resources 765 0 R +/Contents 1080 0 R +/Resources 1078 0 R /MediaBox [0 0 612 792] -/Parent 744 0 R -/Annots [ 769 0 R ] +/Parent 1071 0 R +/Annots [ 1082 0 R ] >> endobj -769 0 obj << +1082 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [456.878 264.328 478.796 275.271] +/Rect [350.24 652.884 372.158 663.788] /Subtype /Link -/A << /S /GoTo /D (subsubsection.4.6.3) >> +/A << /S /GoTo /D (subsubsection.4.4.2) >> >> endobj -768 0 obj << -/D [766 0 R /XYZ 110.999 687.904 null] +1081 0 obj << +/D [1079 0 R /XYZ 108 690.907 null] >> endobj -765 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R >> +266 0 obj << +/D [1079 0 R /XYZ 108 611.29 null] +>> endobj +1083 0 obj << +/D [1079 0 R /XYZ 108 592.561 null] +>> endobj +1084 0 obj << +/D [1079 0 R /XYZ 108 414.957 null] +>> endobj +1085 0 obj << +/D [1079 0 R /XYZ 108 236.376 null] +>> endobj +1078 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R /F11 600 0 R >> /ProcSet [ /PDF /Text ] >> endobj -772 0 obj << -/Length 3221 +1088 0 obj << +/Length 3313 /Filter /FlateDecode >> stream -xÚ¥ZYãÆ~Ÿ_1oÑ36oú!ˆïúÈaÇ; ¬
„#µFÌR¤LRžY,üßóÕÑ%rí]ˆÅ>ª«ë®âØë -®1õÅ•Õ% æþtõû—Y~›"M¯ï·¼â~ózÝÜ%ÁÊð¯åßðæÎx¾¼ùáþkÞ”›E´)²&ÏcÝùÍÍ]®¾W¨md‚ÂêªÏæXRS„¡N~s†«ÝdVÞ¥võwÆúgþ}Á#ŸÏOˆ -cãLQüó—OxÅH^(±ôûjd@A¡;ÀŒ°°y¶JÀ °«¯^Ü\òÂdØ,±ü.*!€Øäi1å}Ó¢)ï÷Ç~ÀYY±zpxæÁª”×}¹îZŸªa'sÃÓ
V:\v76_=÷®zv¥b[w®\¯ÛvN·¬‡cYü=H¬]SîõÜm×î=¿ü¡½±Éê'úqÊnèÀ_
Ä$ÜêÎZS$ ߮ߵÇzƒÐ¥²î[ø¦x®Ûý¡vƒ«ßÊ»»±éêùP6›ò¡vF_9]-T¢ÃÁ5›jíú[è½[UÛ\Ê)Ì¡#EƒLt×|÷Åû%›ÔD—-–…é²ÜCç–6ùm;!y{ìp}Á]Ž}òhe>Ùy± mŠK&,£ùÞFñ¡s`¿ÛoÕú±+»jýN·§í6HMZxÞÉ4ãŠ*šèüD%f˜¢Èd‰·ûjNèÏÏ£uîa Œ - -É™)4Îm܆”:·¸¸`㶄¶<Öƒ !4ÕpcW¤Ð<ÈÁ“‰¡EúlÚaW5ò∤çµ;(¦§Óíd9'ÿXdtÉ0ÉLl½‡þbâÅËð—üûÕèíÄqŽüŠ“ž_‡rý¦|tçtûÉÍKqPìÈDA~ƤÉî|ïSmÄe¸¯<×µ+Ù•$‰<Wþd`âàº}Õ("ñ -@ù[¥PÃY±Ú)±$åšâ¢L}ñ#åÓ|𛜶àöñ÷ãõFív‹Ë-8zº°ˆÅϧêç£ÿÃÏô;^ðóQšŸô‰^üà…Ÿç©%?ÏkÙç: -ØóaÐĦÐ(Z¹óÓ‰©!™7²øžÂ‹X*¢ÍÏLOMDîÝP.!…óX(¡§@ º£·h)U¿Åü¬mÛ¼ï¬hé,QæÉyt®Ì’Ö=<0™"»’´ -²^žÚ]%héyã-kä)®ÔhtòÙUFÄlâ +xÚ¥ÙŽã6ò}¾Â2`+⡃٧ìÎÌ"A2d¼‹,’<È6»-Ä–¼:ºÓÌ¿o‹¤)KîîÁ¢6Å£Xź‹d‹þØ‚%Å"SI¬’|±;½I÷ÐýÏ7̯q|LøûæÍ7ï•\±Ê²ÅæÄœKd³ÿ-’KX—&Ñûå›Ìô<f¹0ÓU,Ø8ïãrñè?ëTĉ²“¾›ÉbÅŒ·Ë5çÑ¿—¹€™ëŒEИÿïLÏÛéBÅLæÄ¿žßá“òÎâŠÿ?Í`-fÄ˵`<Í¢,ljoÞmüy¦‰|ö¸q|rÜÚE,³Âž÷"K‹8ƒ_Üìw&äéî\Ê{ý›Å+](ÀË’&qáð:Ð0ãÉe\ÄE–Úñv)òHßû) 4²`B¬B0|žYŸÄ,ã/à‘Ùñsµ«Ë“žB"ÎÓ×¢ñeº~Í€Ž @#Vibc¸¯rœ&cƤ…ò“aø{óÿg#ß[ùšÒÀá¼ÔìÛ%K£ò±ªïABAvÍéTÖûnŠV^Àáäϵ†mÌùÞ™g¼®÷Ž÷žŠË™ËXI'–Æ‚‘bnU™ýæQY7ýA·Ôù¸dIT>ÑGßÐŒ]«Ë^S_I?À ~h5?,9ÐÙVåö¨cßìü}[â)Ð!`îh¿ª?TµÝî ç*“X‚¤ÓÙܦu-R 2å#Îêz)“è¡j›ú¤ëØ!꾶KžD’Å¥õ’EMOm$ç!>¦c7´-®¾––e K¯“U’œçQÇ“\Ñž+Ú·-‰1™k¤<°7ä +,I.;úê8£LœƒÏpvlr^æD„q*Çôx¨vÄ–‰¿' ¯
5’GUßQƒ”>ÖÔKGˆˆÓ)BWgŽb1-ØìÈEà¡·²àÈ4íi;ÜÛ}[}§AwwvÙ¹©Œ€fÙÓË76‘íä«Täëhxä/çþî+<¥n]/«:”&”s_5uy´R¾¦ˆîcåXdåbs¸%pU7#¬ +u¡P%«Y1# )åP¥M¬ø6NRÚÓù¨¿½XÁS‹DHda4|ÒÔõeîL@$ÀE°ÌÁ›ÄDH [1¤äÏ?”µ‰\@rWÝUÇ#þ¶z×Î`@! +(çh¥ã\‘€¿32.$_\zµ€êýô4¸‰9C¦6#Ài¬|8WÕ»ã°w•k{O££Ž:(O˜d69[ŒR*l–‚Ù2å:TÁù`z63"‚gîD¤ùz'àJË«´íƆ?~º¹!¤ÒRŽ“+¬ÆÈIš +Ê÷3ò¹xòõâ&y7³-ŒŠjêCfO6ÌŠÀÙ4º=‚òÑí\D(|“-Ñ°‰«Ëc×Ð~—½%ì½²H´ÔQÝÙIdBgŠ
pjÄ“g@.oÁ‹$·ºÔzÎÞ('yX²®‘Ý–»?{ý׌ÌçtÌɼ?Ô±é±Ê‹Èæ|"¤ò‰·+Âך +‹KÕ˜)h Ö^©¯Po{8 üf.>‰¯¬Å«UÛ‹ø¥|\Nµ•1Q…a;GèKê3û0ñ¼áœT`¶à6»òhj[ðáê&û˜vÜJ+•Ó…Êvlõ²d¨ýJ긪oT{jP,‰!¨Œ³t¬r4[‰qÍsÌLˆÜ½ë¹m„¿Q?Šiƒï1TV$ßîXkmEe)TVëaÎÖN¹?6Ûò¸¢¿²-˜6tsV“3"“ Ÿ§»W4ÉT”ŒE1ζ!·é´KÙ†m9{ÕÔ“,
ä7)$±i,Ž‰
µ÷jüæivö:˜îîØ‚,eÒܱŒ©Éæ +âÁB…›OSC;çù-¯ +ŽÜÚ€€{ÇAßÈto'áƵ³üÙ$<5Õ€‘‰ÆPÊÆæÿ,™94t®‰UüœÝP|<6+qUÓ˜ñ"Î.Wpµuk9V#f}eÆ^å+…·Êèú¹mPæ*H!1t¢y¸!èÝj*å>d$?–dqÁ¯®3MÚ—£Ù4ñ$´Î +ù2Õ2(e»“4@ýM#|x,1¼Bt,@¯ª½6UKqŽéFè¸)˜.ì•&üÈ"Zt‘pÚ{¢†LFxp +é¡È?Y*lO¥qØì/^WÂ’ ǤÉÏÙØÄ_òìuõ +^Y¼®Àž%±Êù•é2ü†ø¾pa€ˆØügæ?zrûTæ§é+„ì¦Cä-xØjÊ/îÅ˵E‚ø^>úûèðÍÊÅ/ÁÒ\)@0¡H›¾3)`—$4@I€¼z‹ö5WÞ +”À1ëØ@Ð`¶@í!·ï»<5FL°ë2Ã/óX@$³È±ímþ\ÕŠÐeAՊߨZùˆþXÖ÷°žbÜ›p°–
^¾ög¼·'<N%&A÷—“¢SZ¨qúñUÙ +p•Â±ÝÎ +R:†^ÝdÐCŠ}¦š‰]w™äv7P¶Ã>›ÜÌp–šx
¦¾o›“ƒhW»Û¦(,€®‡Ê8œÇq/ÙC®ÀgìqEËtilêþ^´µª–‚(Òñ«o¡Efäó~rðÝì ¦él»6îŸ +Ô;Ã-èü„‰)yÁÌ]`¿Ý³«L%†@ëW4Ç`<tâÉZèä^2f-óy¤0O2¬WÄÝÛ™ÁKbç7ªA‡É"{1c™òï‘‚§8w&1ËJÌ`Ô¢°¢ÞàŒÙº´Œ«Å øª¦4–ç¾`F&û:µ/ rLCǼ<ƒI]˜—&Áác*†bÇ.èt?Í8Ü«‰³nïšöä€Ö–˜Ä^UL’ŒbBËØl:%r!øž„d@ +endstream endobj -771 0 obj << +1087 0 obj << /Type /Page -/Contents 772 0 R -/Resources 770 0 R +/Contents 1088 0 R +/Resources 1086 0 R /MediaBox [0 0 612 792] -/Parent 777 0 R -/Annots [ 774 0 R 775 0 R ] +/Parent 1071 0 R +/Annots [ 1091 0 R ] >> endobj -774 0 obj << +1091 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [391.803 637.927 413.721 648.87] +/Rect [170.086 312.149 196.985 323.053] /Subtype /Link -/A << /S /GoTo /D (subsubsection.4.6.3) >> +/A << /S /GoTo /D (subsubsection.4.12.4) >> >> endobj -775 0 obj << +1089 0 obj << +/D [1087 0 R /XYZ 108 690.907 null] +>> endobj +1090 0 obj << +/D [1087 0 R /XYZ 108 666 null] +>> endobj +270 0 obj << +/D [1087 0 R /XYZ 108 226.555 null] +>> endobj +1086 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R /F8 615 0 R /F11 600 0 R /F90 426 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1094 0 obj << +/Length 3125 +/Filter /FlateDecode +>> +stream +xÚÕ]ã¶ñ}…mÔfER¢¤yH›K‘ +‘%G’o³(úß;ÃÊ”%ï:¹Ý +–_¯~¸ýÖN…Œµž +ÀÆyß6F-ÿ9Ì:Õ"HyÒ—S F¤ÊÁøjµQjùïU¬aæÆÈå{ô/öÿùjº€N…cñ¯çWø`¼c\ñÿÃÆÐ’üXm´T‘Yš'Þ¼»èá³äÆ÷rKh'"4 Ó{a¢Dxâb¥÷w‡»¦ý/c-RÀÊn#„ FëÞKœ&h‘˜ˆßˆ• +–›ªi@TàßC‘íŠv +Ö(‘„!V2XIìÿ¦ßƒtH¡¢R¤Qä£g¹Æ{!¥[åo–ð_Ûÿ¿[†|Ã|žnJuîåÍ~ŸÕ»n†8JùÌ&6I$tà4µ‹zG@ÊP¤@˜
>5}qûPv@Í@-ó¶ÈúÂvô2£±3šÃ‹²¦7ýC1!CDjL’ËÛ•–,ÿD#R÷vävŠh˜9@ͱ?{Zöc¨ª„ËÃaDà¾Òš¿=‰ßt‹(qbðØ–¼yÚ›] ë³–nîhhxW5+¹tTÎqHÅ1øHŒ^àP–EÅç8)‡“ÒKøXPëK@ ^ÉhùDý¼ÙñøÞõ}QS¿ägÿ +^nÍm.|õŒ¾ƒêØÍl¤Qê›d¤OUx„å©e
!·û‡¶à „n +¢g8„dCŒ÷ÅŒÕ!aºÎèTe×Ï€PB}ÙÀlÒP$J[é3Š6üh-Ì”»¡å•Øü2¢ø¡\@Ø=4Ç +mP6¨ 'Æ%‰\v%é}B±tÚ‘:Û»éÎ/¨…„óM)ëïÃúÍî9Æ
ôñNŠCæl-̱«Ù–
8à !À¾†ÈˆCx3RªA²Ã¡m@ŽžvYŸ±Ž^ +j~Só 3|¹mP¹IÃ×3+#gb·-6µS¯¥À·;·UÅŽ5<o¬3ð:deÛ±Ï٢ǴÑ: šÜŒg|sÁ¹„1<Ãë¼Ëiîe÷ÂsÎü‹3¥ž‘k½g¼Æ)"ß5Ší<·á»$€ÇÑ%@ýNäÌoÐ,Æmž!ñ”!õq_´e~’Á€ti=BàÖ±¢¦´'iâÁ»QœcÛÇÎF®ÀF¾®/Rø:û§‹E’+oò3<åIgLŠOE5⩦âL-E‘ñîKž™>(Ì0ºû©í±Ï«Ù0ä-ð\ (ÎWÔÉ3`5çNm1DÎ2yC(s¾Už9kXÝÅýD‘ <p9QèàaðŽ; –(bhÒïN³£´nu,˜zMãÑšú1uÑ1Ø~Jî‡P4DR¬H¤±NP…Ò<R<ÿƒÑ°i•Pâé0u£…E¥H ¼éýéæû‚ÅDýÛ›@è$Y<BäH³¿ƒ{"¹WÝ|¸ù‡§ +kãsé°“ßrÂ3RÊb¥×SÔ±¡x +70O¤0&ÌÁ'|ækã›bîô0Ø}}Î~dëRœûk3th5Ï`%0ЖöKƒS"I“_œz +Ví§A)ÐmØÅKXìŠ +¡)È™—ÐpáÙÿ)55ÉKù3l¥™ÙŠ„ˆ1ˆŸ Õ¦p£øªX=2Òo«C0臸:ÑËŒŸÛ4 +:³æC9>CV¬_A„äó”SRhš€ú-Äç‘æ#ày5~èø(Øœ0hˆý°C>#†caOó0öÍÝŒSEø›Q«d׫“¼Ð$cUö^:PŽØucƒ2oزr ÏîÇ’‚OìÀ¹¥l‹ê‰§ÜÍ¡¨ÏçJòÜVuúꃈ]çö’Í$"C …J¯¶3×ZÝK#—ï0æ,»—È2à N69ÌiG°%ñ¸ Òóöë±Y¢ŒKNa‹/4\8 PùœƒÅOǬâ‰ÍêõÔ¥ízÀy†u*ôf¾¢µK¼ÚP©³§˜é¤IßV}
+jFÃ(J½ +½_I¤±O"A†ø•›™3{¨§ãGÕØt{[?‹OÒhxÇ-.ñÀ`ɳꦧƽ-ñµîÛ9ƒ9ž ß4–9«k 2·n#Ûâ!ÃdЧ²iý]Ìù•Uæç¬6¦mƒ7æž± +G‰= ¯µ{÷+à€ï•Öô–Œb^zæ,œÜ¥×mɦšÔÙThY› +OWW£^S[¿¬s_Øú–72 +†[¾©'<w9€Ì\ô`^¼+`>7üˆB5Š?&·À»ÁLùtGzEHâF}âËyòܦQ<Îå~f&QŽí±>?ßuÑ9ØŒßmêœS€:´Ù~©÷
~¤C¬ Ù2QèÊDÐ(ëû~èªsÁ©ä6GOÀa&})£¬ +õó¥v‹x8]L„"7 ³Ì£=ŒÒß´¬¬J[Y
ըĉ©;ÞyÇ_3´bhÚ¬Vº7 +öš$òõ8éâ™t›-' +F©È6’mýh¡6ûƒß˜£Y*¢S¡£#Ðý±EŒ›z̓îõûµ[âñ‚;¶\ÝþH“ÕÒ®Öy€Ç2ïpË$œTg|‘FïšHÕäXʯgÎÎÖ™†cgŠe—}a½¡_+Íæo”€[ôn”ô@¹¹Œ¥N ºIÆ7{Öw¨p`§¼£*léú\8=vvãø¦>b§Ç zЈÈ(
:ì¤vÛ3&´¨òjÉ[®Ö–¨~‡¶ ò#1:šzK©n€a®]Š8¥$ú;ûB[0›§Ñÿ¸“Ø¢`|„ï¨Dg\±ÔâºÜq·’nœn,|%… +FC@PßWÜf™ÚQï£Rz†1q²|<gŸhhàD˜ +CÛf÷´2‘=S¢×º0öJ^nî2£²áêÌmE·‡šÄ«]W´Ñ$ÕÔ!‚KäÓ¿ç$‡²ÔI4Ùyòû“pîÊÇ;Š]gÊíÉ"5 åj®8¥Ó³ªÕÿO +¤ì +endstream +endobj +1093 0 obj << +/Type /Page +/Contents 1094 0 R +/Resources 1092 0 R +/MediaBox [0 0 612 792] +/Parent 1071 0 R +>> endobj +1095 0 obj << +/D [1093 0 R /XYZ 108 690.907 null] +>> endobj +1096 0 obj << +/D [1093 0 R /XYZ 108 666 null] +>> endobj +1097 0 obj << +/D [1093 0 R /XYZ 108 196.149 null] +>> endobj +1092 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R /F8 615 0 R /F90 426 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1100 0 obj << +/Length 2825 +/Filter /FlateDecode +>> +stream +xÚÕY[Û6~Ÿ_áG3$Eê´tÛL‘"i²“éb¶²-µµ%W’3;ä¿ï¹²dÉ“Ùž,X¼òÜ>©™„Ÿš)™Ì¢TŠTƳÕþJÎîaøÇ+å¦8¿èüõîêÕMjf‰H£hv·ABkÓ1¹[ÿ˜9¼gep3ÿýî'"…ŠC"OEjàtæ‹H·Õ‰i(dꈾ3‰Dª=惿Ïã(‘ +~&¦ßÓÿùa¼@˜ +ebÇâ—çWøDLÞ8YñÿÓ„ÄÐRî1_„JÛ(ˆR$¼zsק•æÙã6æh„F$’ ÍÀ!©´c#!ÓvðN„‰>I)ŒŠfžåûM…¦ÉÛýæsVÙr—?•Ç}^«/O ¸àöË“–_PrXh¡”HíÞÛoÛ^Á“2ø?Ó+)T¤G/Õùª}ú
,B^Kx¨k~ Gn¯Ã[º¼Þj¿~º}ýíí+Í4‹‹äåÚש'õ>ÁFèJ›hzén›×9¨*µAÆ((«ž-¤1¾jca:‹}Oú¿¡ÿdo¹–„ƒ—`LüÞªÚï³rÍ«µn¥å‰Ü09ëțǦÍ÷Y[¬²ÝîqÌ;’"L¼ƒ¬¶Yyï7ÂÛø<׸)Rî5Ï4O¥b[4<’Ï•
þ•í;ÇäÁÆ6›k ¼`:ç£×R‹m®wöuÞTu›ãޤƽÑs] ÒAvè…ÁC]´°° +NYÅÝ–ÞwÞ«ƒ»y¨ÈµùÜ•‹?»ÉÑÙˆ0&qŒ²¦)îË}^¶,ÖIÐù\89†#-„(¯¸Î' +“ú…Ж›<gÆÍqÙÀ<÷§Ù™MBËËòL}?ãÆm?8âʼnڇßÓn‡)ú +0òp*òœøŒ¢ N?·æ+C¨§ƒ]VhlèÀ°ó0«ÊZnÕùú¸çÍÄ'dôGw;>ÚD€ý¹éå#3Üf»à&x.6t°«ª=»·–9?Ù¬I¾Õ‘í“èÚí”Ò#+L—r.Häó…ó‹¢¼÷›vK6´ãUF‡è<‡¦Ø#wǼᾖ×Î¥"æ6ð(s0.KOh'±Fz=–W‹ØúíXÇŽù© ~ZH?ËÏ+D[ÁüH
È¢§‚ÍïZ:9«öXçL·ªŽ»57!…F–y^ò;Ùj[ä§sso\P˜)R«^zØTõ„›&.<á±q"J +"XO2OÈžâFŸõvÁ‡•yYÎdˆ¨..Ø5cŒÝ‘»Y$e:•ýe[ìžÆ,„ÌàdB²P$‘í+×…C6a,¢0}F´>Ÿ/ã÷I$4%z”<úÿ:^†0=«é`Àb4>Cë˜-àÌeµ~Ä–E¦gÜÐâ‰-‘HµtïÕù!Ï(4b4ËÑF»R€[¿¢ãè…:N†ç3@7 +!¹M·Â×Ë‹kX!B7X7‚"–ŽÕðÀØ¥1_Æ&hñ¤(;aÇ»Ä`E@_z°às.l!z¨äüF c^p™û¼ÌkðIîenš¬ª.Ù`<¢ÉîÉ`šâD¤Æ}P0€‰â~áîP T
7_V€Ùð¶ UÐadÆ60rlÐêqh›5<DšÁF….ñP4þfuV¼æILÊ4‡zp|óz_”Úçõ9T
†Æ:„0 + Ĥ_AÉžzÑ#÷ð5a¬x–VD‘ƒYñháT ›eO3µÜɾSDqÇ—›6
±· ±ßLþDhuשwN#òÒÆy«Îa
QU\”È ,Ⱦ¬¤ä ¸y7mß +B¾~‘CS¥#붲K< +D jgÐZ×jù{(ÄŽ]ÞѵS@Ci¼{?w[³‘ŸÎÿ„¬ÆÜ°8O¾`AúçÄ®e¸å—\ˆ<6xä?q¿R"‘ú?¸_›¥›\%çû–{Ã.c&Øëä`.nÂPXžå¾`X¼ýëùVMl +ˆüqv7\â톟Ց|_§oT&þ9ÇÛ¶ëTe>M i=5ÑÔ
UBð´t-ýóê×ßål
?]IÂÁ?@bAšÎàJmãþîêÓÕßÎ>û«Ð +Fý®UòqÀÅ’Ò‰H\áûô@ã‘0 +`¨ZWý´Ç¿Ðàzð3¯kpk1©i¸êà÷‹IM/t|©PÁÐzÿbndœ +endstream +endobj +1099 0 obj << +/Type /Page +/Contents 1100 0 R +/Resources 1098 0 R +/MediaBox [0 0 612 792] +/Parent 1071 0 R +/Annots [ 1102 0 R 1104 0 R ] +>> endobj +1102 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.031 180.323 228.894 193.116] +/Rect [478.097 580.527 504.996 591.43] /Subtype /Link -/A << /S /GoTo /D (Hfootnote.11) >> +/A << /S /GoTo /D (subsubsection.4.12.3) >> >> endobj -773 0 obj << -/D [771 0 R /XYZ 110.999 687.904 null] +1104 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [382.726 418.896 392.589 431.66] +/Subtype /Link +/A << /S /GoTo /D (Hfootnote.17) >> >> endobj -242 0 obj << -/D [771 0 R /XYZ 110.999 298.425 null] +1101 0 obj << +/D [1099 0 R /XYZ 108 690.907 null] >> endobj -776 0 obj << -/D [771 0 R /XYZ 125.345 138.982 null] +1103 0 obj << +/D [1099 0 R /XYZ 108 539.256 null] >> endobj -770 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R >> +274 0 obj << +/D [1099 0 R /XYZ 108 220.91 null] +>> endobj +1105 0 obj << +/D [1099 0 R /XYZ 108 199.799 null] +>> endobj +1106 0 obj << +/D [1099 0 R /XYZ 122.346 135.465 null] +>> endobj +1098 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F120 538 0 R /F11 600 0 R /F95 412 0 R >> /ProcSet [ /PDF /Text ] >> endobj -780 0 obj << -/Length 1913 +1109 0 obj << +/Length 3877 /Filter /FlateDecode >> stream -xÚXQÛ6~ϯX ‘›IQ”ú–^7‡Ð&¸¸Å—*ÛôZY4$¹›Å"ÿýf8#´Ò%AQ0É!9œÎ|3”¼‰á'o¤ŒEžç7ifE'7ûó‹øæ¦þþBò’X(•@¦~ܾøþµÍn2‘§éÍöVlÿŽôjcâH„þÕj#ch_¯þ³ýGØd…´7i)²,áoW›TEÿV
¬¥q.yÕ«9—TäJñôO«RÑo+«aå&•Ñ/ëßÂÿm ü4?AçB&–YüúåÞ&·,,þ¿_zqÎ;À*—™X«_Ün«ê,6ÇK&ßè<q¬ “ˆ,ÍǶÏá4=¶}åýG<ËFÅÉì¦ÑÑ7DûÄÌFÓDXÛ?HŠ®8–•V&FX•ñÒ—b#qݞʖ¢ÖFµïXjZ×”þÊ‹.ßU©Û×ÖÑ ;¹ÆMYùºzè{<µ÷çsQP›
úlbBGäÆàksMµÐÒŽ4mÏÞw'Ôw®«1"ëï5…ƒ
â¨W¢¢®ø¸’qäZš(j"ûKWúº¨˜Ú¬dÝ]Ï®îZZ°[©8ºv4ð®_âæz*pú•4‘£%¨gÑùæ9®dôœ)Pkz aEÑ ²É…Š-›&
ʼ9ÂÂT‡‹fÁ!d.R™ìÔ¸ªø47‘»giïÌõrqEã<b¹Ò` Pê¯ya¹
çÆF˜!Æaõ:ü¿áö†£x&ˆÊÀƒ{aßXÓIeGí=^–¿V,ØÎQÛßbÍB¶ƒ°Ð&ýýEƒµ™X†Uä€Y"3ñ?×4!â -YFhóy= -fâ|Y`gÀ’zZi[Sw e2ô)«ZLŒôP@Ú,Ô2
9èË¡öm°™‹Øf#ýæŠ0©ý+‚ÚˆXÎ4§Úј€M0E"(Oñ®°K…tŽ¾ª(ÑQ9¤>æ7Eã¯Ãk)O…yöZêAoTÉ]<`Ô?<¨n †Éà%*S÷;~>µÂÅÊdü¥ [x†§;bS &Êîá;ùøü¤§º¬?¾úŒW3Þ÷ˆo£ú®Šã´\+´ëçµæ]fÙ¸}÷ˆ«ãuÒ_}^¸.aQsÛe¶oÑúÚ¤€XëÑp+@$XÉ<VÕ7 -}‹[ŸÊT‘ùa]Bèƒcã±Ä-=æð@D¼oZÞ`™·4Ïþ -$˜ê!ˆ¼žhÊL½çzñÁC±쀄4¡]B›Ã£É~hÆÈ°þ+#vä‹y4ÑÏžŠ!”$ x§W˜ ¥¾U= +xÚåZëä¶
ÿž¿b?È0£êaKvŠ Hš»"ò@rm4-âõxwÝÎØS?î²8ä/)R~÷v¹ +hQôqÝPóhRWÜ&Öõ
W^nu¼Éš2»FÎ^LÊa´Yˆ©»[Y³–"ÑSMÁeŸ²ÛâråQ"“pWœŒÍ9¶¾”5MvßRùÁðŠâÉ`ø5|·2–6JfgpóÃÈn…+,VÆÉÓ—ŒQ)ÏÙ+ˆ_R.VŽujx¿µñfG”Q*V3)窘ËÛc}í?ôµ¼>£pìè×küfpÒapµi¨>ÝQ¢< OåaÒt²t¶-ºÓÍËÀáB +JFB©`áF5„Úþº-ò®¬«¥µ‹b#âT_YÐå44jjn¯¨ðÝÄö…ÞûI÷û·déÝPZDƒ;4hétðsú¼yÈ#€+ÒÝ'‰#8¥¢AÈYÛ–·JøدY¾ñ8ˆ³Î.‹7ì›–«+Ú_xeŠç¬„MFò3OŽDé«‘úãþ”åÍ6Ãp9¬‰D4ìj¹vP&Ãþº2o2±ú‘ygñÕó}±Õró˹Y™J,"ãž:6Z H[Z>Nv)íóï#m·*m÷ÞIûÛßUÚñ€<¦áJZá¤ú_ú£*n™Š]Ãð ZÅ7 ýü.ôoß©Ðçæ¯R +aH +AdH°Ðmì@e°ê£‹=ªúpNúÝ©¨4È“ë¡yõ¬KœÇúv%ü‚Èf!Hzž%žb×‰È lÕ‰{"ÛšµÑl“š¾òªë6ßø=·a¯ÝbÐó_:ª‘M†°!v©7Êi´f”™ú#}ÜwĵægªÏ"=5Ú§=éNa›2,c ¼*Gˆ„l_„ +Á3‘ÎÇâãåF+ ѼJA?SáÌ,Ò[ÉgRßý¤³ßðy>!Rvà@×,H~]jÊàœšö×ך ›¼ÀjshŒ(ýúºøå6Câ·|سëâˆGMí4ªÜ닶ø‘Ü|B?Ì
§ðázÑÚ¯d¯0n&µøìó…K{VÒš7Ú;åížØ;µê"€œÁŸúÓa’M[ÝWT&÷l¶øÚ+gca¬"+gVœ¬òì½Å!žô†¨&îpîÊS±[qI$¬Ô“ŠïÒiha‡Œ®×Ï4ËÿÓ—>Fó'*k~é“ ¾ég°±I*ãv!™ŠÄÌc'Êi5j>U뛕YÇJ)DÒ¹iW¦
¦J†Ž¯P¾+>3nÀ!í'zNBßHO,}) +±[1M`ŠU:2˜(] Ð,ÅvzE]€C†eè³#)äuÓ€¥Šð›qýXdmh +R¼©ûÆ'¡|(òò„§+çc–”±ñõ/W|¢+<x{°2Ù5ÚlÌÀÂ` fíj<rjÔs¶âÙ>£gÀ|õÌ3 ¦nãÉZêÏ<C¦{DÐÙËbü:òæ–²\;2_ÂïH=ô
á/ÿaàŽ– 3àWY e³^Kƒ!ÁmÍaüVãÛ‰ÕøþA«á&(¼!S
/"'¿MáàAPõKîx£¨åa~CóWlgðÊ€Ü
Ï@>‘dÓƒa¶‹Ÿ‚°vô9…,P˜x&n +-ã°l(ÂÞ’E°F¨tÝ󻬺-Ú ´“ýÅÚÌZåƒ:TiÆYø¤lT¤eAPÀß=8Z<XðÀúšÇ
‚ç‘ê€i†›Š‡¦ìFõöœI*ˆ˜:Î+Y'œNg˜Âû
Ì{Wù±?HQV1†~µêsœýyU\è.øw-“w©ÁnøI'AŠ K ~—R‚aá2iÑPn-Ðw¡OA,<ú"*ìçO?ýô#Aåw}»£¢¿0€ß<«ðRÐ:„1ó#KØ-Æ»4/cƱ@ñV³%Ú+˜ÄãÕ2ê +½õÜ ´Sßò}Xˆ=‚e'Å‚ýY
ÞVv”IΔéñ±Ãuõ¨ +Q1ZioÛ}‘ÂŽ*}»LMù,/2äüåË°_žç„ÁDH¯ò»¦®ê¾¥¦*ã2—ÝcXÌ}¶ ŒD+æàbÅž;À]ñÛ¹—Ô¹7jÃ\ØÑLg‹m³ÎTêA夂
ĺáœËŠJ>a›3¹¬B3<Ã_™(oÚ{ð„çä¡O_û Ÿ?R…´©è¬êæß‚ªtËë–¤C†Ãm-S¡Ó¹$JÄ&R¬¸Èàè€ØŸCÉáì@." +‰„È'¿ùÃ#S†èyìR’^ó~`5{£cØR9Uú\T·Mv¾koʵ7³' +;bMyD¯@QšŸLÅ·klœn„môgèäø‰”‚;Ò‘ò(n† (†Ä¢Êë¾ê + +¸¿}Š%y,h&¥C²Ï(à•7KØæd$Ñý’Àªùׂkp2ç}$¨Òªöã°üT˜ETÍ¢8¨5‚š{°8 Ôöù•¦fLPÞÉ_Á‰šX¡LÙ-pP¼œpü¶ó’¼%Ö)Áåc+¬ŽïÉ BQÄÂsô{G‚×h?Ü•~ÆÒlNEæaƒa–ül7Í¡h†‹8š'–Âä뱆Z}Vbù‘áôë{ú1ãL.gÏéªSóÏù`çc¼ÇóÁûËOJ缃 +†R䲦"S2X?%yƒ]lÛž°·dc©‚ÁVrÔÖ?nŠ=§I@É<#0“ŽÁ9ú½R~j€\
½EF"Å¢Á•BÝ04åwu[ø›_ ¯æ¡]"Þ>0vé4=€C,{‡„!15<p%à +ó†PŠÕë&"NÔ{‡Z/ʼn,`-œŸ±¬
ð»–ÅŠ +endstream endobj -779 0 obj << +1108 0 obj << /Type /Page -/Contents 780 0 R -/Resources 778 0 R +/Contents 1109 0 R +/Resources 1107 0 R /MediaBox [0 0 612 792] -/Parent 777 0 R +/Parent 1114 0 R +/Annots [ 1111 0 R 1113 0 R ] >> endobj -781 0 obj << -/D [779 0 R /XYZ 110.999 687.904 null] +1111 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [452.596 617.019 479.495 627.923] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.4.12.4) >> >> endobj -778 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F87 383 0 R >> +1113 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [320.208 511.799 339.635 523.674] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.11) >> +>> endobj +1110 0 obj << +/D [1108 0 R /XYZ 108 690.907 null] +>> endobj +1112 0 obj << +/D [1108 0 R /XYZ 108 609.45 null] +>> endobj +1107 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R /F90 426 0 R >> /ProcSet [ /PDF /Text ] >> endobj -784 0 obj << -/Length 2556 +1117 0 obj << +/Length 3492 /Filter /FlateDecode >> stream -xÚÕYYsã¸~÷¯Ð[¨* !ž»O¶çÎnf3ö¦RÙÙˆ„$–yhy¬Çÿ>Ýh€‡DÇ®ÉSÊUfãj4úøºñ•|Ź˒$Y…qÄ×_¥å•»:ÀÐû+n¦ˆÄe®ë½0¸µ£[á³8LpÎÍýÕ_ßÅðfI¬î÷zî}ö›ã¯·Üu]çzíÎ餪,OU»þýþ“^°$4ËCæ‹„V1n×¥U½æ®óX¨ì JUu-£åQ<_0Á#½ü~»N]®·ÂóG\]÷EFÍ"ÀE®6ߣ¬YÔWï혙|Rõ©0´ìèûF6]Y÷ÝÑt·fSe¹PO -œ’|\8YAÒÚÃAÇWÖoÃ0¹÷¬î:•Qg‘WŠ(0è©ïd7Y¯ P’Ê#Ÿô02„á£Ì†mP 0m<÷«¸Ý&tÐÄÀAÛÉKœSS:è¡ÁØ0‡ÄáI”'hayPf„¢:‘©ÙÃR‰SƒÀ
uNÜöVEm¿ë -Õ媥˜pnp—y~2;ݢѹ‰ÁÑè|Ñè!"0V5ñ
ÅŽÚ³‘ ÐQ§!6»fˆÉ1¹²0üNPð̺aóJQ,éó]&îyabz06Ð!’ª¼=ªÌâIkƒ^µyû#¹8C–xž ûPo}Ó<©¶ž8ï¥Iù¾a=£A±5sÝS—Š(46.qÑ1°ý2¯Ò¢7ˆç#cð@pÄÇ&!þã‰Â¯Eѯ\ø]*O(Á¥n!}úÌ‹|ã=tÐR¦M–'ÅôE——²SfZÕ
p *=u§}Ó -“¶q¦¶à -EŠH¾ ™ïi‰Þ긕@{ìýW•CmgxcÝŽ<nTÓ<Q×m]ºÀ8(³)% Žª8á õhàgáiÒ[õc¦–ŒLi»”S»úÉ¥]çKt"hŸÍÿV0‚ƒ¼3(`.Ïò†(r~êUú@¢pf*œ˜ -ZÚTðUéÑPdf@™Îô<4e;_£ïRHèóÁNt>ÙÕx|rüÙaR…c›ê¿pRÿ»c±Oå‚=å¤.Nò‹ïT¼>½àâ!½0j_Wã»Ð!3³
-ˆJ–˜Tp’–R¦fê‡Z=h%KÄ@—
õ“=À{†>wÚåþ'Ü”
m4«hèŽä²8ög>9xË¿e^æDÞIK]“¯;s¨³ÆÀüÌFÞ7¶T(ë¶c_{$8ÄÁ—;,Êß”„;A_ž‹Õá½Ñ:zn6a—O£+$€ -ïæéóD/8†5Ív…)c%½¨t„ã’Ê6¬çâd3×v¨ „ Ë~¾
8Tbõ‹©1>Î*JÒX´ŠA¡VFÀÂÈúçÞ -™Çý Œ÷>Ê.n‡ºÀ¼ðôY<ݸ_㥺Z8&Üœø +xÚÕkã¶ñûþŠýv6àeE=(écšäÚÚ´ÍmÓI€È6×V#KQÎfSô¿w^¤dK÷@r9 X`=‡äp8/JßFð§ouTÜš2Re”ßîN7ÑíкÑÒ}‡ýw‚?Þßüáe™Þª4æöþ¨8N“ûý7«t
ã²hõrýÝýDž+'D^ª$‰7Òým}gâÕWjdš¨¨¢OæLŒ*cÏã³õ]¯¾^ç PÞ½ú’˜~Jÿ?'Ìgó ’Ré4ÿ|û¯‰Éç²VüÿzaÅ +‡V2ë{Þõ¶nêáym2PÒùqG0¦P (²?îÝy誇Áöÿ‘dãVè`–ÈVŽÂ0ŽF‚DÆkO·ý÷œ1æ ^Xr0Òÿß¹03“k§Áè„Ÿ9³»R«Žo*™q—[n¶™k¥ÃIÿ_lÓ(“³m}}z¬†ã³H… ÞµÃ}}šÜ†n'î0%³tŽxF=Ÿ%UºHoG’wIb³°Ð‰$>ÐBãß¾Ðß~dÖeÊßÿȦJÉ’x»Rf¿z‡àÇebŒ!2•è»*‡æ*Ñ«ÇÞ~EñÏÜ:U»¾swûúá™avU +–$\$;.ùT“ºÀ<¼òĬX7Œkì‚ì +ÜK39ûÉ%¸_ +xÇ
³Êô9n.“ª,“o˜&Ö*ü¢Ã¦B‰àS‰(î|5ŸÞdß‘ÆBgÛ
¢ŠI®²ÔÇ +Øqr¹s¶Óirª1¹ÃFB)ÔjÏ0ˆïT·Ü£/r‘3Â~Ï=Ÿ40ª†zL@Ê¥62Ù cGñËVXÑpSR¼Ä±ß<ÇjXºÇ$‚žºZ³b +6z™igÑkX!ª†‹J4ä}OÈ…ûçû³§ùêSX +¤†„50ÂÖè+öè¹üûT7
CÙÑ°iàø)>
†QJóýŒÑ]™zæ +š‡šÂGÚíf1ÊÓ&~Ïe<ÙšÊB{8@·°ˆÁƒè>¼äAÄ&}*— +³qR„òkœøà +Ä+aÝe¤è Õ½r×j9‰[5KÀ]Q€G¬½¢\Ú(Ê©v^‰½Z/êú"Oyïê]Õ(F½Z(`DÁÚ栗F%Y>͹Áº6¢¤”tpÔÐ^¹ÿI„ +
YÀ?œ2:aÖtcàᣊ¦æž‹ˆ‘”Š'Óq¸#V?.U|ùóeú†ï>À1ä“á…^¸©‰Êƒû–l`£é ßz8ié ¬<ž,'™&
æŽî,"Ž!’5>ÁšA#™ZEîåÀH<%^»žµT¶1•òWÝùp¤¯K`GîÑV?ÈeΙex4Äи˜ü‘ +¦žØãåUÜþz5¨[s¶.$ws™Y\fË&¡ê| +ÃÌ+é+w‰ðV^±ÒR +P(XÛ·éÓ~ªóH™¢Xz–‹àŽd%öüxóÍwÑí(¾¸‰ í(nŸ +Âq»¹y}ó«oO5ø°ZÓg½L•9»)H` +endstream endobj -783 0 obj << +1116 0 obj << /Type /Page -/Contents 784 0 R -/Resources 782 0 R +/Contents 1117 0 R +/Resources 1115 0 R /MediaBox [0 0 612 792] -/Parent 777 0 R +/Parent 1114 0 R +/Annots [ 1120 0 R ] >> endobj -785 0 obj << -/D [783 0 R /XYZ 110.999 687.904 null] +1120 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [205.972 499.624 215.835 512.388] +/Subtype /Link +/A << /S /GoTo /D (Hfootnote.18) >> >> endobj -246 0 obj << -/D [783 0 R /XYZ 110.999 662.997 null] +1118 0 obj << +/D [1116 0 R /XYZ 108 690.907 null] >> endobj -250 0 obj << -/D [783 0 R /XYZ 110.999 646.119 null] +1119 0 obj << +/D [1116 0 R /XYZ 108 621.128 null] >> endobj -254 0 obj << -/D [783 0 R /XYZ 110.999 376.844 null] +1121 0 obj << +/D [1116 0 R /XYZ 108 336.361 null] >> endobj -258 0 obj << -/D [783 0 R /XYZ 110.999 329.724 null] +1122 0 obj << +/D [1116 0 R /XYZ 122.346 173.206 null] >> endobj -782 0 obj << -/Font << /F85 373 0 R /F78 368 0 R /F88 386 0 R /F87 383 0 R >> +1115 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R >> /ProcSet [ /PDF /Text ] >> endobj -788 0 obj << -/Length 1876 +1125 0 obj << +/Length 3668 /Filter /FlateDecode >> stream -xÚÍXKÛ6¾ûWø(k–={KÓm@ƒ´qÑC’-ѶYT$j7‹¢ÿ½Ã‡dÉ’½C±Àš"‡óâð›’%†?²$£$I–a¡ûËô¸ÀË=,½ZG‚¥>Œ`é—Íâ§ß¢x£$—›¡Ød=µ&8ÀÞ‹ÕçÍ[C!1MB1Š©#{¿Z‡Äü§Þ½¿3ã_Íÿ7æÿËÁꇞ]/‘ (Ü1M±¸ßôÚ²8AlÀs¦¬Y‚Æ>ŠÃ¤·)Ž¦6É ¼‡
<QƒyWðÃÞSÁ·¢h¬fq¼uBc(f,p›?æËQ|D
è#‚cŽþnÊoíÖ„ $z¶¥|†1¡"a´ì{͛՚•ÒþŠ6l'Re¿surZ¼ÇˆÆ±Óò(¯d£¦2Yˆâ¨#CS6kƆ1 bßÐ)ë×VlW{[©ÝûíǶP5ìÚÊoSMBèˆ\q«#°n
n½ÌsäÑðéQ{Îi‘W78P“wUžNÅÀ'WÜç¦Qy…éLD¾sn«E£ê<U¹,›9+)ñQ`nì)nÒBðºy:nåM÷pJ>Š—á€^‹K0gð5¾?ÚfQ*Q‹,å•ÙwÛ5™ß5R’kÞQÌ8àyî?Ö Å^»¿ÁzŠ°¡Ýë{=¿!×àל›}â»ãE#n²y³Š±çìVm]Ú‘t¿½Uû¼Ü;ð8ä…˜êDE‹:ìК %f -“äŠE1òcÌÑÄsóßT„½#¨†ô]òb´bM)MÂ~´9%WâbŒP†Bδ¾ ®#ØåóR{‚R>Ö½Ô¹xˆý -›/¡À¦ãt9Ú¤÷`ïØêðVöÀ¹l…ýµ`Îh—ßÎШÎdé9d¼ØÛ·ì*(=E3 -•Xìà¬Ö<vù¾…F¶©Sc¸cÉ©Ê1¬Ò8äVm]Ù¦³¿ÓPZû¦Ð)Å£3ˆ(}Ö¡zxæPÍrDâë*B £†Á_e&fПFˆõ·Ç”puEVä¥hžíñlÉäÔ8p]Làùà§êS“C-UÎÑ -i3ËS®D†ìüæ7vÔýòÒRêªóh¼“¦†ß#ÿ¢{IáfM~·cëHG¥»"3_[hóœd;õ7ù6/rõääíWçò²QN®†–ÝvgMÙ|¾‡Ú¨Ì\÷ xÓ¥¤¦MSѸ~@*&ai5ó®IèÍäØ®›Úׂ«âéôâx–ñd«ªÖí•®ÃÈò¦*øS÷ö 9Bðyy*¨FÎ3ÀºOâ }ÀæÞÕ»gõÑ£ûû‘@Ÿendstream +xÚÕZëã¶ÿ~ÅöÓÙÀ™II”ÒO×æ’^— ·mZ4*ËÚµz¶äêq›EÑÿ½3œ!MYÚ='iQ¬ø¾†óøÍÐò&‚?y#£ì&Í#‘Gæ¦<¾ˆnî¡ùË’»7Ø¿ ~yûâç_äñM&ò4½¹½Ã „R±Ÿäv÷—U¼†qI´úbý×ÛßXr#¤Ñ–<Z+˜é¾ZoRµúÆS'Õ"Ê™èõ|’TäÊÍñùz£Ôêk£r“ÊÕ;;é¯ìÿ7¶åóù:26<Åž_á½ä
ïÿ¿_Ø1”$ë–*IWF!á‹7·žŸI?Ën쟱[B9qš1¿oÒ$‘&^'u|¼êáPý“·•Üä°-{Ž8F9Nî©_ªèL E–&Üo'™Ï!‘DŽ5Ïn)œã_ž5~ü&‰E$
ÈR"”Œ-Ù·]=TÀ¦$[
{[ÈWýÐÕÍý|ý˜üüÒ+Î §g÷hD¬ýíycgÁÈ
Ò)#´t„¿÷2¦V·k- +R¹/NCÕQE)n=Á!©$3Ãmw-S
k@$Tl¯¤§æöŽ»÷u/€5rA/6i§Upê\¤yæÕu8þŸª+تµLVßó$`FuüßUX¸ÿ$6ØKÌBW“Ã9„ɵ%|cÛc‘ÅêæÜú'½kËñX5€UCœìböhuhï©àÕɘ>"µÅªýO‡º„c>r½Y¸¥@CŒcJ`Ôt4iœy_ƒGÚè\¿ò‰‚Ý‚hÒŠÇ¢ìZ/×Gn-ÜqÊâ@Å{ ’«ñÄý];ºCÕƒÔe¶º·œ¢µe,ò¼–jH\Þ×M‰LHƒ«pãö*âÅ«ˆýUÀ »oøê#ÈÝŽ*öÀ(€c¥†]
›è붡jgåñ¾îAÁûWÔF—…þ¼#?Œ):îèy¸¯¶Ö8z Z¶ðxª6Äð8cÕ>󻯆ØFe9¯œe«]WྠçuY¹ÀoOe{<ÚC@›] ¾#,oåË'žòp q +Â_Ð@þ¹“!5'*¡ÔŒ½à§à6É…9sî°ÒS7”háÅ»æM-HœÔBf?^äÌ`”ùUßÑwWõ L;2ÃÄt#Ô yþÔq¦M¼´€ \ÖB[@hà¶Bd‡eˆOÚ,Iël•DO³Â:œÁ$ˆšÈy\»TCm=\˜
â¡üúÐó¬[vÔ2:¶›Z†-g$À–C§…Ïî9ì—yì—]€oèéÚ#• +ú ªó°WTô¹˜›‰¶Ð·ÇÇE8g‚)@ñhÝ$–H@èRd®sò¸çGа#Ÿ¨ï÷‹àI%³)žDöG`oŠµŠØÒjB
úóZb¶a|‰÷b¥:>4-ƒ*¬¡8â÷±»žŠ»¶ê›—˜áá°e[•¢—ÀQ•IóI¦è:P\æ8ýP»ÝYù©¹6ž¬@B ã¸ÉŸÙ̈mAÉãÍa@\a +ém£»Æ¶èë’öðʨåTtg #”D¯Î¿3Oan@Í·ëÍ8ÓwhݘŽsûêè³–ÿy*Œ6›¹f¹¢¾§ ¹‹iŽw'8ÏüüFdž¼68öu×6¨P|»[Î4õdd(.¦Xµæ´&ÄÓ)ÅÓÞY®~(ºa’ +‹ +)/‡qå|"
è"ÑŸˆ‰Ógbb)•È/Ò£ëœ2ø%ë’™jµN? «éþðšZ +ÐiKßÓ¡(«‹9‰M¨¡XÏàƒÙ/Dj‚0Mo +ÀMÔß_>CÅ +6Ù“2*ÂnøÅÈãr( +‘Èà±\ˆâBÒ +¾²Ò#œØæó
þðkoŒR%@ÅÉr¥cN +ÙG;h}Ýà©âY^óÔŽ}¨5õã÷ôjÍÓBK'ùG«y¸‘ŠÙ…ÀÂÇ2û!V +½3 AÚT
ô?N/Ÿãˆyð¤gð·½EhÐN™qZÈ1a”^ã˜ÔCOù]ÏS;(¨ïõÝÀù¬žÿ&"ÿ^ÁÒ3ƈ!ý!¼OòÞ#ÙTééÓPE{D˜F{ -dmÊßÿ~Åæ ϯ÷=
:IñTJFð; +¶;øA)ø‹ÏúI¬œß:¨N¿M±Ã–\}*…‡V_úŸÖ†HF~=INxþPåÎ\ò¯^¦ÛÆ7qjzà5P›§BJµ¤l:G™ +:þ
¾hk* +endstream endobj -787 0 obj << +1124 0 obj << /Type /Page -/Contents 788 0 R -/Resources 786 0 R +/Contents 1125 0 R +/Resources 1123 0 R /MediaBox [0 0 612 792] -/Parent 777 0 R +/Parent 1114 0 R +/Annots [ 1131 0 R 1133 0 R ] >> endobj -789 0 obj << -/D [787 0 R /XYZ 110.999 687.904 null] +1131 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [459.127 324.177 481.045 335.081] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.5.6.3) >> >> endobj -262 0 obj << -/D [787 0 R /XYZ 110.999 426.185 null] +1133 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [359.743 169.714 381.661 180.618] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.5.6.3) >> >> endobj -786 0 obj << -/Font << /F78 368 0 R /F87 383 0 R /F88 386 0 R /F85 373 0 R >> +1126 0 obj << +/D [1124 0 R /XYZ 108 690.907 null] +>> endobj +1127 0 obj << +/D [1124 0 R /XYZ 108 664.406 null] +>> endobj +1128 0 obj << +/D [1124 0 R /XYZ 108 617.539 null] +>> endobj +1129 0 obj << +/D [1124 0 R /XYZ 108 517.332 null] +>> endobj +1130 0 obj << +/D [1124 0 R /XYZ 108 350.914 null] +>> endobj +1132 0 obj << +/D [1124 0 R /XYZ 108 292.091 null] +>> endobj +1134 0 obj << +/D [1124 0 R /XYZ 108 161.538 null] +>> endobj +1123 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R >> /ProcSet [ /PDF /Text ] >> endobj -792 0 obj << -/Length 2415 +1137 0 obj << +/Length 3247 /Filter /FlateDecode >> stream -xÚÕ]sܶñ]¿âOŠo€Î´3ŽgìI·Vžl?Pw”Ä–g’Yñè¿wx¤Hß©Ž<mÇ3âXì.û‰3[PøÇŒQ’$ÉB[C*ëò„.®`é§P(á\K?œŸüå…±Kç—ã|ón)OWŒ*º|zúáü•G1„áP8%–´7§+Íü_¾üÑï=üÜÿ}éÿ>¬¾íÉõ…J@àHPi‡qòãy/° 1°Îe%Œ$–& -L•h ç
ðãÉ»t±Û{uB‰Hìâ`JØiyÂ4ÌÉ0,NÞžü}o©‹c wÓß«¹×u]ÔMw»ÍèTVC‰qÄ=âE‘®ÿ…8)ˆé=º‰ýe«UÀËŒ
(€¾¢i|?¿[ÞÍï6ãÝv~s¼‹±–VLRï`N•‰Òc•±#*k²ÍŸUûÿV˜+Œµ±]öP
5ÔØ“)NLÜÏiä¦s44ÑüÁDª•}Z!äÃYµŠ#j›´ºúÆŠÕzºÛü?Ò¬óTÄ·´X¥‰„X;«ZyDµWM–Uß<*>Duö«ŒRÔ?f”pNõ_WG4W¦WYÕ¥ßÖ*:f•±§?-¢vÞ¤¿Æ*õÝ®O™ZÞ¦ÿ#†©#2<†ï¥osD‹·YQÔ§\-oþÛFzHAæQMýhè4óê…f€¡z«6Y3½ -n‰±.~Ï„ÜÖyÕe›"¯²væd®¯‰êK«Í” ³Dð!ÁMÚ¥žh[WÅíÌÝBÝÎD_·¯D¢—Ýuæ -ý€þZqcõÁÔl@½Ëb -DéòYÞ¬‹lÆòzL1›ºm!ò€ø¶.òÍó<-ë -|osh‹ˆ[>î‚! SÌ7Ån,„ã©€wæY]>™ -|\&¢wisÏÉ¢ ‡"¶jTÓ‘D:óNˆµxI”{Ðrû·Ù:wA…+ -y´j!Î4i—{µ¶8}síÜÉA»ÖÅÒûË\hgìP,`>ðA,`s±`IA‚ôc=AïñœIqm‡P^n!á§U6YÛA\õRãz5Rp¢|!¥…è¸àFÆʪ–mþGº¾ÄoŠŸ-ȹk ûѳÂX^¥]Ö~YrÍ¡Q¡^UŽ†ahR»¢ËK p‡3ŸÎ}’Ô´Í?ù8Zàô®Ê»Á¼ -˜>*pY»KÁ©4@>Q™z×mwÁI¸Õ6ìÁçYÜå˜F{î:~! M굤‰>›q•Öo‡Z…ïÌ -÷ · ,²êÊ'´ýî&ÔŸ~W¤ìΉU·‘>AÔ—AD§àÙÙdÛÔëŽ+w
zlŠãŸÓ6k^eÄ¡K¤šR<g}é²ÝNt×Þ¬*³´ -`zQ» -ÅÑÔÄâ\^¯}rvƒNndË-]2¾gòmS»"ëTÒeÏøgãLO—‡P4B‰@”§êëöQüƒK7ZæEÚà -|š}¯…–Þóá*Y^zZw˜£í<?Ãï_Æ5íÜ¡µ1ŠærÁlŒ0&J%Ì„2 Ù®»ñ'87w'Œƒchû0ÛâjjÛ®_5ÉÞ¸g~°JS‘£_MâȮ-‹ŠD˜©àÄ‚‹‹ éœ*
á}ÿÛ¬PyHc Õ‚6DÙq–ÞL™˜ -¸É7Tu‡×^¯×»°˜vøíâFßÉ"è«%@_7ÎM ùD‹µ{dWôž!Ø¿•¹A™5¾o™á`§ŒOÇúP÷è4Ss†¦7b‰ƒ8–v8Ó×Ü%#òí®HCKê©lØ4©‹îU’LsbLœBÿËæþ‡HÜ=ññ +xÚ¥Zێܸ}÷W°«¦‘ÔuØY;pïñl š{F±.
Im{`øßS7ª¥nÍì¬Ó%²ÄK±êÔ)Êú*„úJ‡ÙU’‡*Ó«]ó"¼ºƒæ?¿ÐÒ½ÅþíLáÕÍ‹?¼É£«LåIru³Ç”1Ñ4ÈMù¯ ÚÀ{q¼Ùüûæ/¤ž*ZRÏ•µÆF½Ÿ7ÛÄŸ´NƒZæ¢ôòrDåÆñãfkLðMjAs›èà'ôOô÷5µüx9Í•ŽRâ—§gxOƒ¼–µâß÷++IËj³µÚÄIZT|ñúf²gFOšû×ÌÃ<VÌ}•Ä‰ +-›úPì>wf4qp軎ƒUél‰‚¶ãž]튖ÅOÅ?ŒÒ_ºÑõÍFU+c÷"ÜvǶ¬Ú;ÿô™…nÏ3Lzw}q¸¯vüPìa<«‘«AžÛ]},]©Ð6°ëÖ*c65tºÙiä)îÙÄÊä™÷Àúû7:™·ràþµÉV&WaÉ{s%¬Àä–\‰Tµû®oŠ±êÚëeŸ
v]ÓmÉͽ+ݯahZ'o¢5yØh[Ôü´x-„‘…°A,4ÐÆ·q¤ldÛŸÓä9MMña£uàøI˃²–Š ƒ´zU·µS¬úvÏ&ÑàJ™Š’Œü|G'b“_µ76ûCµóÇwaÅ,R&õÖgãä3{”§ué õ^¯AG£EÖƒìç^ÖŽzÚ)YÄD¡Šl¶0É-ê +¸?¸$zfX´×©;ÔùÄkH3•X+еÛã +†è[À‰Ô‡CFtwì7:†ª=ÓhŠ]ß
«!©,ŠgF ÔõçËÝG°ÀÜŸ5žÊÊp)Äu~9ÚÃÊh±JM~ʸÞG¢V…“‹=;jã|µ)Ñ–Mm“RÜ2Ö¦€Æ€»µ^¢÷ãP¢Žf”΢Õá¤ó›ƒ·ÚÃîšC7Œ—;Ó‘ÊÕçÁòËàzÌ.I|ª†{NVð@š€ƒõÕè¸iו"÷ÅÈRQþ÷8Œ2@Åd:'{«pC=7òˆ>ë@À"cëA&Þ¹aà×`VJ¾ ‡iöJòÀ´ŸÓApVßuÃÈÒ'8ä{!ÅÌXüÈi5%Ç_Çaçv£â†NÐ)À# éhæ]°ÊÆźýð¬ÉiÁýü²Ò±?Ê|ëá‘Xe³ür²}×>6Y¶6{qj”I¶Û½©Ì‚H!lŸ ÄÂÈŠðW u¬Óœ…1y$mðr¡™JS¡m· +¶ÉÊh{\êåp©V $ú×¼Úȉj €ñzé½ïŽué÷7²pë<°æÊØd¬»û¢½ãP‰¼Cƒ0`Ç©££IQ¢Ž„È‘æøKþXˆWˆNéÑûûK>ùÎ$é7º8ž¨Èļp‰kšÄá±Ê¦6ײ^L§ÒÇö±‰ÊL¼p$N î@–DlXÚuíP
£kG~þTQR›ÔÖXÂií謑ÐcØWõš€G…>+Mž*xZ”Ó²(ò¼ƒàí-bD‡”XÃ[H½6–aw™§>’Vl–'`7›qätñÿóWH°›ÑUvǾw³÷¾ ¡Ô‹§tùû|AO%ç^9“æc=V‡ºòôôöu +;~9ι*J˜%Àª×üTI? yyÜ9ÑùÏŠ9¡ú…rÍŸT®Ø.Îí×ú½@WnT’™3²»+Žþ9Æãp¹9lðéªDÅÒ[qÄœ{Ñ.“/èSº¤eN+ÍñÃyͪC¨Æu~9BeÙ¢n]¹.`ÝíL™jس`ÀŒ“L#žÒþçsG¤Ñ–n_m¶P_àV8l†Æsí/áWlÚW+µ%OЛó—þ˜†<¨Â)”:Íà›¹kÞ,Ão¡]lu¢LdŸG(âÈ' +®Åå8‹²ô'Uµ}¨R%å#ÄMž/ý]GçšÛ5е`ê4ú†8ƒzÑêÉwã8XÖÇòt^Õa¶Ýè,¸;6ö¢8‰ ™GPéö¾±tuÕ +ˆ˜+Ìwl)¥äà[Ýéí•šPg*L¦£f¿‚¹ +m>«5üpýùºPlªô²RƒfxY&@ªË3r„ÃÌï»F”ý¹~Ï‹c¼æ¶{)Ûð¯¸(ž¾wá +ئ0IËõðyS_‡¾Ò
í”4E|TiÎÁõš:°X3W§ÖÊ:=Ûœù<ðÃPÁ@«¼›nq*«åÚƒo$¢–›•‚-QÖÆók¾,xý¹h5ù<¡ÍWIo›YòëâÖÕ—XHúöt釜ËX5ŽLã# +¹Ìgwiª¢È³XNq‹í¯ƒœtX™ +P+5§©´Ì°NÛè¡þüÛE-Žù3Ý*‚ÐTw÷#‹ž›Z@¦tyD£k¹nÇ¿ÇáòfʃØ.Aíì`=¾ý,·l6[´°™ +8 +qñÝ4B Ç"ñÃÀZ¢-ÔQêYËWàRöIäÝRuÒŽE%yS¶ƒˆ´{TiÂï!©…à08R -‡×,ÏÖ@=^¹ÃË`ö<n¡Ø×îꎣ7âD…¿·}Á)î! Î +u¬¢MÐǬ‘L`Œ¸5>õHv!—AÂÍÒ§Bî¹X +ÅÜ|—ŒEÅÓµéÿÛ1PR}±{‡—…=X(â& +ø•P1'æ`ŒÿСƒ}W˽¥|1Ìã üaÄmÑã‰Ú<W6Zú8Ðœ¢:@ Ro“ŒìyÔ{¦ü8õöJÏ…LW%N5>|§¿|§¿>¢=öyùnþÞ—‚hú]-¼ûõµA«½¶düõ1{·¿ vxR2ÂÆ—k·åéˆ éŽ¤E;Ú|ŠSc³KôAFŸ¦N³g€ÏDwáÕ9’€ÅpÝû¾kXò¸„*£_&„~Un³BáGçŸ £„N¡ÊS¨p<ø+ÂB“eðK+7Œ|ëo+/ñ#† +endstream endobj -791 0 obj << +1136 0 obj << /Type /Page -/Contents 792 0 R -/Resources 790 0 R +/Contents 1137 0 R +/Resources 1135 0 R /MediaBox [0 0 612 792] -/Parent 777 0 R +/Parent 1114 0 R >> endobj -793 0 obj << -/D [791 0 R /XYZ 110.999 687.904 null] +1138 0 obj << +/D [1136 0 R /XYZ 108 690.907 null] >> endobj -266 0 obj << -/D [791 0 R /XYZ 110.999 357.445 null] +1139 0 obj << +/D [1136 0 R /XYZ 108 608.74 null] >> endobj -790 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F8 534 0 R /F11 537 0 R /F85 373 0 R /F80 371 0 R >> +1140 0 obj << +/D [1136 0 R /XYZ 108 549.711 null] +>> endobj +1141 0 obj << +/D [1136 0 R /XYZ 108 466.772 null] +>> endobj +1135 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R /F90 426 0 R >> /ProcSet [ /PDF /Text ] >> endobj -796 0 obj << -/Length 3715 +1144 0 obj << +/Length 2753 /Filter /FlateDecode >> stream -xÚÕ[ßsã¶~¿¿Âo•gl” -“¾{Dµ¤Ô,ÑšÄ ÈXH" -²ˆˆ‚L¯ø$ݦàƺÞnëKe÷PR 7Úöûºé¸S¶ü·*ŠU±¢v²øâº-HÅüÃœÿ`p«ù8§\J¦Â:#ýÝÊ¥ãØÙ×µ”"3Æ-XVm—o·¤ñÈ“¢÷°ÙµÍù¡‚M°ì·yY¹µ/Œ‰N/®•P±òšFã°>ô£?áÍ4Ñ‹bñ3¬tëU"ÐÕTàx±o×¢+>ÍÙˆ2ÂFÒÃ>&ñëu¢¼Ö¤Ø‰–núgÓe5\NsœsãO+ˇ”³‡äÑŸT”a{0ç„N<sÔT +“gk!uê§ÕÍtxø$͆ë´ÝÃËòéHòÿs–Á}aoÅë‚ÇSiøÀŒ6–i-f67"‰õÅqN¯_û|ù1¿›ú£"ŒgÖW8´¡¿< -WÃ@5t
¦g{Ë0 Hõr;§Ÿf$§"%tªNIn¿ZãÕY By°†¤ó” ->ˆB×5vœ÷CV‹Ø†hW«GdEšŒÛ•í ÿ
W)R9fÁ;h„"Åò–‚dœ"Æ=I¸ ±~ÿ»&_ßâ}±ÛO·7)ìIž}–Õ¯å¾òÝ鵂Է‡öÊkÉ:ÀÉCÓW3‘ž¨ççn½/—'ü*”jEàa–^˜!äŸe£€È«ÎFƒÑªëút -íâöaêÇŒ¦WçYÌò9 6h»`NkäƒFª‘º0§áÄ›bÄv`qîYR´ÝI1ÁýpIJŸ|<$¦Ý>ð(#h2ôý¾©÷@JM™w~ŒUGGÚ)À9 -ùDV0M4 Ø=ã®'ë‰VH„€¡{,‘Ùl [4v™WUÝQøÔŽÕPK´cfSœ‰ué½7¢™W¼hÇù,ö!±ÐȪXS -’¶ž˜²ã ÷¥sÈôRóài«ý”jèf¬Ù Ž§&¹>‹´ûM¹Üð>eëÕ‰†µcìzWTÈÒ·Ûö]ëCWnûa¢àÓøPÈoÈÍ°ö#GÍâx{ 8 -9Üz -U%HR²ÿ,ª”=*(С¥dbuÅ=V<[÷àTëÉõÀkôæ]Ivñë¥4‹Â^Ÿ@™$BÆêì¢ -¸Ê£§$%iòL€œ?$ÙÌ:úmGîÍ˜Ü ‰ðèC&?öԆ˜è -QâÛRYÃùn0ü¥V¯@Ct¯fÄÌ=ŒRŒ¹å¨øasKxíuš<zd}x5Hh<1÷—Rº:yã'ÚûzÍer‹°ÌƒhOÇ…„1ê–Àõ‘9+Ø#¶]SÞ^ªh×ÖÕ?ÉgÏ<¡*&(œÃ/»Â©&ísªQËHÌaÅÀ°)i{ª²TX8—3ÈÂ;Ý”6¬O¾Ýrú&»‹¦ÅÖIØäžð¶ÞÞ’áb;NIyÝ;z)fP@—uU°G@ß'RhÍi’” -!5Xñç¤ë^‰>wêÃûë‡!¥²Å¡}¾ -¿µ/±åM}à(ëÇrO3‡µh±óÕ4Ú!Œü}ênDœ‰ÑÆŽó£ÞŸiãVö5T*(7t[ ˜žsdŸE¨=»vÔ{77#3V 4 (éá ‡Ö™5ZŽÿrÑr¯®ü„úñùmMÊÊËC>ସw„®TŠö«{FûÕýáû…§UjhV$_T¦ÎzÑìòeSûó&âW‰q…Ž^8sc ,Õ„¤˜®ì‹(’ѱpîP¶aô™¥àW|Þ{'xøÝz@ŽY<po““¹ÖÓ<¿åm`ÈEÚ«©fE°r›¾ðéä[º© ”»Ð_Oã™-£A‚ÌÌvš¥TÂPú½*–\˜wƒ-•<ì ¢J¼cÆó¹¬YSìVÏBÄt"&ç•xž/œÚS…ÓÄÕ”SöΈ R2êEÎEg¤†yåR鬜§ÉkUfÉuNBÉn}$À
8ŸãõCyÆÀ}Ùn$ò%©I³ÿŸ+1’¸Õ ý1QÈÌ\+ïÆål×ÙZ?|ëGÀY -Ù;¶ijXÚŽGwå»é¸wë§x/üÀ£lµ—”!/T½”ˆ6gî{¸ã‹ÑÍŠŽ#‚–ßéf‹]±ãÛÞØ}ÒP/ó.<rTsy±lxŒxí‹Ý®ôœ†z%?æÕs¢»õkºªÕ°F9òóÒY=ôóûzû1_ÕÝŒF +xÚÍZY“Û¸~Ÿ_¡·PUðæîÓø¶×Ž7žÙ$•õ>PFb
¯åáñüût£ðåuòrÕ°
¯Y¬8ü+ÁãU˜p–ðhµ/®øê﯄þì%!<>l£•Ïn¯þúJð`%K‚`u{G¼ƒq/ZÝ~u‚õVpÎëµ8u-ËC¶—íú·Ûw´2aIèáB¾ÚŠù^L˘0÷÷eµÜyÈåá(Yv-£õ‰?]0OÐòÛu̪Xo½ tpuÕçzͳ{ø8]E£Ý)-ï‰LóœˆêÎ|Ó“kYÕ¹Ô³:z¾H›®¨ú[½©$.9Ddå„m蔲£36÷´D¿™ßU
^XÝQîØɶËÊ£EÄ’%á& ˜‹s>¬·¡ë¼R†¿Ây«èççtcº®^—–°µp§E…Á&êå”DìÒý=Qûª(äZ8J)jä¤çHêøZƒ˜²}Ÿ§MþH#ƒð
õ ž¨‡Ôu·¾Ë’8ž\úµ¥€%Ý5°kà<’€HÝ;l ä¥ÆO™–}‘–vzà´ýñˆÂ«ÊvCße[Ë}Š×3ÒÕÖ>—i©D€úzÐÝ\ðOX…Ñ¿Toמ +bΑÈæpjÕuò@ƒyVêQPgÝw©
)SÀY "y°[)AŒ¶§tøÚ€ø€i»`¶ŸyÀ»L8¢Ç„ pPZ +c§n*ÀÚ8YR5ÌÑÇIF./ ßôH׉ɥ‘±L÷'2TâTpàÆ.1VήŽ#‰hû]—Ë.“0×8g®ŸLn·¨u¡=pкXÔzÈ<ϘˆIlÈ%¬3*»F‚GÖÖ3»ÆzäÂ1Y$ÿ%&ØÝK98qJGÒnÊríÒVCø‚–Xf`ˆíIœ´Æçe›µ?’‘‹0d lJR
ÕÖÏšGÐÕÖM„óº‘R“t ˆQâ:ð·JÅíé0¬-Z
V…¤…¨s|¡Ñ>DóÌÊ}ÞkØØìñ¡É:ûÍ ˆ3?ŒxŠÜȨRx~·Okôªsœ€EbbFEºo*4PŸwY‘vÒB§á€špE-ö}ß4$éå +C6ˆ Y#ôiµí²<ë§Lê^/:6i}Ò3³rKð lK+¹Ír»{Ü¢:üq°ST¡ðYâû“ûüò€N…γª,•CE‘ve|—6Uñൡ?á¡û,7ôýáTiÂDI4ÿM& †ƒvÌ®àáw¸®3®p肺ÈÄžÂH÷5ÇÔÑT̸…;É)K»¾y¸º)XaË®ÉvkÌ +ßÛ‹ñÝœ0!ë4èŒæÍ®¯Nü%á‰ÈyßËý=!”ˆ&õ¼ŽêxCH©ˆ”û“¦æ˜†óP›†ÖÓ¨PåNj’æ +ù3^Ÿl£Ù›v|¤¡…ÏîŽÙ<%ç°¥%–L"‡ÄCä`ôýÚL¤ès0¤ŠØ)ÓB¶4¦6N÷zê›JÞ+Ñ¥ +Š»¼iÉÖ¹Mµ$e˜YS•…æ‰y%¶C§}¬L¬oM>Ÿ•XJé&ÚÇ‘LŠþé‹!žQÜ”ûß4†¦ &³Ãh„Ö=p5!H§Ï?bab®ô³N¼‡79÷¹(FË~Xoý`†{ +}ÛÙ³vƒ'_ÄuH‚ãhÜo©jYRã.Ë—¡¹ÖLê’øPmM«ô·%¶DÓ.³µJljßHVd
68AÝUåRxʘi¥ð’óƒDØGj&þ¶Oýò)¦¢¿µe«¼S)oŸwŠ–´â'OÑʬïûçµ¢Ø?U1[<ÓÀÌT'}7Næ‡Óšï²>ZH‚v¨ót§¸«°¨iŸª\*óvÂ8`‹ Í»ž1lY]fj4=ZòIþÞgùn|O/R¿í=YŠ+¾˜iìnømÈZŽéõÎYSZ.]ÌÁ÷§qóRÿOÂå ¼™VíiøQ +N8ôM/ÚñVsŸ½S_” âi‘ÕNkšœ‡qyX²:ׯ +T_d“§k7vÉcǪýÛ¦G+/ÙI•¤çËøôŒsãûÎø&Õ)MÃs–Ð “ck÷ÜÏcæÆñŸ´Ð1ÐÏÖõYìÆVËê§Õ¦G»Ø‘ƒW(ì¯OtnX +몯ÿSç¾ÌôÿK´ó$% !Étÿ+Ê>†ï”|ŒysÁ8Taz +nùó=ðÿ#œïñádÿ +endstream endobj -795 0 obj << +1143 0 obj << /Type /Page -/Contents 796 0 R -/Resources 794 0 R +/Contents 1144 0 R +/Resources 1142 0 R /MediaBox [0 0 612 792] -/Parent 777 0 R +/Parent 1114 0 R >> endobj -797 0 obj << -/D [795 0 R /XYZ 110.999 687.904 null] +1145 0 obj << +/D [1143 0 R /XYZ 108 690.907 null] >> endobj -270 0 obj << -/D [795 0 R /XYZ 110.999 662.997 null] +278 0 obj << +/D [1143 0 R /XYZ 108 666 null] >> endobj -274 0 obj << -/D [795 0 R /XYZ 110.999 647.645 null] +282 0 obj << +/D [1143 0 R /XYZ 108 649.127 null] >> endobj -278 0 obj << -/D [795 0 R /XYZ 110.999 341.593 null] +286 0 obj << +/D [1143 0 R /XYZ 108 405.83 null] >> endobj -794 0 obj << -/Font << /F78 368 0 R /F85 373 0 R /F88 386 0 R /F17 509 0 R /F87 383 0 R >> +290 0 obj << +/D [1143 0 R /XYZ 108 346.759 null] +>> endobj +1142 0 obj << +/Font << /F105 415 0 R /F94 409 0 R /F107 429 0 R /F90 426 0 R >> /ProcSet [ /PDF /Text ] >> endobj -800 0 obj << -/Length 2947 +1148 0 obj << +/Length 2008 /Filter /FlateDecode >> stream -xÚÅ]oܸñ=¿ÂÅ=TlV$õA]ŸÒËGs¸ä‚ÄEhú KÜ]!Zi+iã¸Fþ{g8C´«:vz×CŒÕ’3Ãù$#ÏBø'ϤE–eg‰IEFgÅöIx¶†¡—O$£„B© úËÕ“?½HÍ™Y’œ]ÆUù :¿”aOÏÿyõ£CI…L5¢¨PÅhoÏ/é~UðÜÁoüÌý¾r¿?LFßË;ê8‚ý‚±AŒ'ϯFjµÉD -Â%V.u‹06 -”!tIÒô•d -‚d¬<îû“µHµ¼nPnùn¢oÿÛª*z¤à Tâö$ˆ¤€š±1è÷vØ®vUágžªHC3“>ø.Š·ìŒSŒA¤S.Çaþbµ¯Agdð—T¸¡ÎúÀë—¡x’r"ý¾âðÞïlQQHƒ¢êŠý¶/[¸0‰}O‹ƒˆjvðÇ’Õ¦(%gùð‹‰T½ÅÊ8Sønßô¦]¢©cÈ!©šŠæ’C?àsÎ…ì•ÚÅf‰™'8$;=”;žNt)LD呶!ʆ†º!ñþÐ6ùÖž®¤µHã1Å?¥×‰yø±-¡,fÎö‚.-m OLã߉j°g'T¯™êvµ–ˆ–p@_#:þ-ˆ>²D: O®9ÝæPµ w«§ñ¬´”ÆìkNŸ]Ÿ³Äj`÷ëÖêN©“)ø:=ÆwÌ$÷=ƒJµP±vqT§™¯`)×yÅ ótg:‰†rXA襘ûÜõCQ©³Cï/¦%Rñ„\`~êïäöÚ]"Y]·Ÿï¾“_–¤Ÿ(¡³¹ôtÿ4q9:Unwà2;“"ÕDáÓÓḮ7â\1o‘JÀ² -³®5„)®Àô2Ïj‘gêý+ØX±
¦“ÃÖ"IܺqBTÚ…Ûa€ÌÊ’Ò¤"J,>H0ì@¦Àýý7ˆqWBF”,Š<–®~;y.Ý(!Ç+Ÿ‡H -W‰Õ=áI‰4R_õ§Ù¢?M“ïOÙâ“œÄ'qr -$¢eÀ’üÃö[Žá¾ð5Ìÿx÷Á§X§«´Œ4´×Š//Öu
¥Ìf¬õÑ»m·XåžfÒ‹ñqip4Úðq@ˆE"ão(N3à*§§áŸ†òy©sºd -K_TÒ¥^Ç‚OäÛ¡lRûF ‡¹¯gBaPÛÕÀ/'m×ø^÷”ã={-Á»ÊñÁRÑ)Þä±äàao)°ÝïQÃ]ú,É!Db’‰$œêúó‚â]c.+ -ÃØ,`Ú˜h&fõçqìž#3~B´»KWå<Jþ–à¶qW8 -éŒ ÖPô6ÃwÕ`Žûõf‚ºp1b ;’ÔùÐGÿccðTù¹ÍŒ··>âãP¦Yÿx§{¨,«ážú 1BÅéR 3ʆg +xÚYã4ø½¿¢©45>â¼-°À"í +Ø"XÜÄM#Ò8ä˜Ùâ¿óùHš´ngVB#ÕŽýù»/{ÈÃYœ¬££Çëì´Âë–X·½ÕûÛÀ7»ÕWߧá:Aiw +ø™“nñaf%˪²±\8‘ 0J4XBOBÇÆ'ÂB
w:4e6±<¡ä â@<¸¶`KJ9Ÿ0ÖêNB"’h=;óAm¶lÐÊ®oˬ/UÝ!wr&à–¤``£$åNB)64Úîù´q ªîu"KaMðs#Ð!g÷Äv>¹ï!þ?E—à·A½!A/[™gB6ú0À`¨ƒ–ÅÈœiEQhÐfãWÕì”lèd&kGÉ÷I‡ Šè=µ9ˆívP›ùÄ<Ÿ³±ÁÃDJPÈ“{L8ˆkÛ½„z´ã(‰,÷ï`=F‚LN¢ÎíGÙéÀí¸Rwe.í\Ԧˆ£înX?ÆÜÁÈzâà±lU}åIA¦#Æ
—½õ°î¨†*·sàWÚÙ^TëæýQúxÃÅÑ,xúу®8!½’1Ã9øœ™…0S˜¤(±&Èå<r(^½F?p`(úv×lÄ°Áïù€ƒ¸ô3⃨:ùª +Ðä¬óû¡s†QY6´/(tŸ Âã+×ð*òVBB#f¾Ðtè2RŠ8q) +uoŠqðs¥ú~J ûçJvN5ʃI=”ÏÓ6˜{®žä¢òP5bš^Äq8ï>Bˆtžš8f$1p¿¥¯”ÑEÑmº‰,šÒGæ3R%IphÕÉÎT½:I°Îã†ð@Úõ^¹ñè +Ll¼1ï-ïÝ«‹Ï>¿ß\b‚D~F¦ÐÈëw›Ýì
çW3ÿàiU ËãéxË|…:EŒ9É¢zãP‹ìü‡ËW B©± ƒè Õ=¯þø¯ó^ÿ´‘€îÌ1"iº>(¤j¥î»Z}\ý2{sض3tæÝh™DGš€øEi€˜$4ÀûÆ£†$B|Òp§ªÒ5lÚ‡¼ý“;à«ÄQbûæ!|™šqÖîe"Ñ‚=‹ó*"ªï¾T¶$ñÀ^Mjk"ãÉ…~røËÈnó1—½ž4¿Aš})i'öœ„9á/¥¯ù£„)Õ·³×òEÚmb³dä‹ì;6{Áä2{´¡£+—Þû9“M?Âú¸$1>¿ùî+‘ýåyפ‡G݉úÐ ¤ô¨²YH—ÚB<1mÇ÷•Óå3˜¨Ì#Ô$-qgDzÎËLô2Gö{w,Ç3¦úEËž€T~Òêк)ÖãIüµ!XkÖ¬ÝĪј(Iþ=ÀõÛ‘µãcÙ•û²*ûgG¤Ø@Í+ëÎÑvx:º[ùÅy/ AÒïP&5}ÂïÆêÔ
Y&;w•ÒÝŠ]÷†“Lóz;^¾ +¸ËöÕ³+†e¼(~jè›a¼_ºËe^vM%žÇ×!ñQ_V2‰€5rUp²N#(ŠÔ÷?fÙÆa•rƒ +endstream endobj -799 0 obj << +1147 0 obj << /Type /Page -/Contents 800 0 R -/Resources 798 0 R +/Contents 1148 0 R +/Resources 1146 0 R /MediaBox [0 0 612 792] -/Parent 802 0 R +/Parent 1114 0 R >> endobj -801 0 obj << -/D [799 0 R /XYZ 110.999 687.904 null] +1149 0 obj << +/D [1147 0 R /XYZ 108 690.907 null] >> endobj -282 0 obj << -/D [799 0 R /XYZ 110.999 529.309 null] +294 0 obj << +/D [1147 0 R /XYZ 108 457.083 null] >> endobj -798 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R /F17 509 0 R >> +1146 0 obj << +/Font << /F94 409 0 R /F90 426 0 R /F107 429 0 R /F105 415 0 R /F125 566 0 R >> /ProcSet [ /PDF /Text ] >> endobj -805 0 obj << -/Length 3915 +1152 0 obj << +/Length 2873 /Filter /FlateDecode >> stream -xÚ½Zmã6’þ>¿¢¿ÅÚ\‘E)ßær™l7·»I/’E²@d[mcK^INO'ÈߧX$-ÙJÒ38XTñÈ*V=U”¼Kð“wR&¢(Š»,·¢HÒ»ÍñUr·CÕ—¯¤o’¥R”Põ_¯þôÆæw¹(²ìîáѵxØ~¿H—+™˜dñzù¯‡¿¸&VH«©‰JD®|³¿-W™tÿjñ…+ÿ¯+ÿ·ûÿÊý>ªý&gÔ¦ -kζ>VMϪ\/võR™ÅOKiUäõ3?Ý4*Ç*º¥Ì»óúU5CÏTRßÐìö¸X£,wVf$…Nl”Âñˆ-<ð·Ë4Y@½nÕ(ƒršôµ(YÔŒÓáÜÏ(d!RÎè -•ËyQ¨ÑŒëéµ(Ü|ŸØ‹‚&öŠ -¸¢"A¾?a›P½™¨BÅ3qïá#Qt?Veã[aŸPrê=úÒ!À üÇ/MËÏ‘¥ýrj6ª.{ -Z!ŸT,ú³ãÀUÝ -3Jö€ÒÌnŽÝ’˜k8;L„#ãÄr˜ÀÓü€GìÛîٷ㬂à7ÅÑéØK*ÙU˜>†vµåd‰Îœ•ÔÚº ðÚã$pÎ -´º™K„# -K_{„®×ß( -âQ~Th(m€‹#±ö<%É•„Êû®=ïöáÚ²€£.fdwmAÚ¦úl©Î§ÉŸªí®š½^WÊŽcXk(â["zé\”0—"ÏDb§¹ÀÍÐv³×ì:¦«œ'°(Gm½el€¬®7ñ~—ÏEPHØŠÉR)ò—ÝÛ¹©åg•Çcö|BëFÉgTÄP˜™û2òÏ0bï§ þ@ðDçÎØ’îž‚À»ö0léi×ßWð5ÎL\—¨‘FýžD“Ñ×3ú±¢‘¬‹U/áÜE|¿Pžß÷J&ד6~—³Ÿ…DyŒÞÏô© )…z&õ‹ÞYŒÇoz‘ÄKÖ?šüyvrõÂÉéÚa†„*Õ/ä€Ý¶Žß“$“üµ–æ÷y1¿½°2æñþˆ²Ù*9ìµ,þyP¿ÁCþ2™üzíÜM¡`#ñ´ìxn¾u„0…«ú÷«ïÿ•ÜmÑä/¯g8žPÆ*ŠâË÷Ý$¿^}óêïïƒIôNü:àÿÆoME[Y¨0’Ú|»¯Ýo -ýÉ‘.¬K)öÙ8áL*tš_Á7JV#ð°&™=BuúîBýŽG¿†o£âTü¦©ÝlJrL|Kݺ -Ð çrȲ£7Âë>‰² -qÏËÁØå{ÄuA-Î=߉§ÒãÐîÚÕ¡~GÀ©â]áëì!¶t÷âxú\¤ãoïÛþøöÍ'¾U?m]zƒ.a?SH¤pß:º8àTmjÊ%c2²ÒZjñ!ÃÕ,(?~õ SÜØxzàEá¯à&þ#KÔýH+ù„©Çò™‰ýy·s‰7ÓºÊ'÷õ‰)„Ýl¹²R$¡í¹.Ì8¿BÓü¨…†¦N™¼†~åè@T4.ÔÏ]îŠõãærÜåJÿ<õ;Á…LÖv‡’«ôî’¹1wì>Â!Á¤l@G;s
<æØõ6mL)ãra,V¢]©•Üê]S†ÈsäoÇ[.5Ï?|Ëê’lü!ÏÄr±EQ|3k¶Vi*T6W§‹D$îä*ÿì±£@endstream +xÚÕkoÜÆñ»~Å}Uè¶û^ÒE8vœØH\·RжR<Þ‰-g’Y5üß;»³Ë㉔N±´…qw8œ÷Ì™-(ücFã…N(I¨YdÕ ]l +ŒÓ9"šh®ï'ò@Á²/¬¤D 5oŠâˆ`›67¿µhµž~Ž‹_#[!ç©®¹×jÙ1á*J$öYáÊ#ÂÝ´y^ÿæ±ñ!²‹¿(\|¥è„!ÆÜa—êˆèªt“×}úf¬Žæ×…Ñ©FM.9¶ê/2L}DºÙ)SÑMú?b›ê1¢Ã£ˆñVV2GÄx“—esÊUtý_·ÓÇô¤ýi?’¯†’=v¨?׫¼Q7„³påwLÈmSÔ}¾*‹:ïf®asi½š¡‡:¦¸JûÔQ횺¼™Ò4PÛ35ÔöK.DÔ_å¸X7AÝE½APwS]6e‡›´õˆ»._\¾„´uZÂanŸ§Ù•=v±äT +µ/ãѳ¢ÍÊüÀÔô!&˜mÓu369 rxÞ”Åêy‘V
Æ•»ðEÀÿ°óæ|¦ô˜oÊݽ(wFZoÊ{iê1·Ç¥`zŸ¶÷‘ÇdÇ|Xå¨qp—¨B–!Q9Š¸1…`°Í³"õ¾þÜÂM›öà0àTÞgþvüéçÎÆÔ‰•3c£r·ÍVjdæl(ø(P„ÛÅÌ-˜Ÿ +'™Æ¹‚¤`5¸ÃYŸbdgƒ¬RQQm¡jHárµ‡´y×ClvWvÈE=¹€õ=øñlÄË°QÄãwE¼9]ñ`åC: +,RŸ1ò +ªH©ÂWnú€2ø)nmx\ãrfB̸Ոós–íÂPRç'¶« #:7NaÈûça:}4_1ìÑ¿ýãLqL jcNïîÜ6WOP‚éºÇþ7‰*[‚mËv +ßÍÀLwµË0ß²Y…°XB‘.øƒÔŒ9ÂMåh¦Ig~7ƒ¬l‚ѯ¥pdÂ}äT$ÂLY +k~
¼¶6â€Kc¡lA¾Ý™6£ŒA£¬,¶Û0¾sÕ‰Ïá£Úe~&ØUv$É¢0÷=2õ…Åäéu;4X Àâ*/·wVú/g*N¸Nߌjìó;klû›ú~\-ŒÑÙ}C!Œp½¤
c<¨xa_tˆä†ã{¢EpRsUlìIOp'@-1AŒ°<h=1˜;RNÅþ4熤Áo
ÂëU¾… +"w¶m´m“ &°•¥¶&µ³·¾$X_‚ý˜}Z\hI{g1Z† „;é{¸$Rʃÿ…t§ØíCx9ŸÐÒИ˜á;Ý5p†NCT Š?Rà-Ü€{H±WÄ$½,ÀÒÖfú÷oN•Šüçÿ¸,6x{O”Eß„Æ€O}; ÀtÅlj¸·ÿÀÍÈú02·éó,ÀB'Œ.…†Ð…9;åðÚ[t.=™ô²Ùyw÷З7i»êöszfûDßÖOÊs¨œp$5óŸÞDbÎèÅ +endstream endobj -804 0 obj << +1151 0 obj << /Type /Page -/Contents 805 0 R -/Resources 803 0 R +/Contents 1152 0 R +/Resources 1150 0 R /MediaBox [0 0 612 792] -/Parent 802 0 R -/Annots [ 807 0 R ] +/Parent 1154 0 R >> endobj -807 0 obj << +1153 0 obj << +/D [1151 0 R /XYZ 108 690.907 null] +>> endobj +298 0 obj << +/D [1151 0 R /XYZ 108 381.689 null] +>> endobj +1150 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F8 615 0 R /F11 600 0 R /F105 415 0 R /F95 412 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1157 0 obj << +/Length 3859 +/Filter /FlateDecode +>> +stream +xÚÍ[ÝsÛ6÷_áGyÆB € Á{K{M›Î5ýˆ;íLÛZ¢,6É’Tô¯¿ý +B+ÄW· +õýë“ÈƤЈÍà
êvº•Õ³Ÿ¼Ó/3Ú)S¬JºYo`~4'q™@Ë>-òìQ‘dz"]I3s4ÀDÿ€È:3ÿ‡—uÌH<ND&ã0—uCqŸ§GÁt+¤ñ7(›ÅzÓƒhäbÎÙ¨‚h26œÀlédco¾qWΉ‰T€WN|b7ãç¨* 3Y–óŽ1Ñð’7—¼ZϬÚf‡0B«íËî7+-p¬ãÞ8®!Xpc•wÅøís˜‘à…Læƒé]›ona±o¦ÛÐÄ•žÁÌú¯²éª|ÿôbÍîÐ9g\oõ¡íŠë¹˜¤…Nü›ûMS®æ¥Z¥¤?&ó$/•UBGr¤N¼l×|bÙMíbʼI"ûlÏÎ{nzîc0‘ +ðkFð@Kæ_'¾†ã:÷èUœ>uôi,Ï<z¿»5zK§²dèçÜ]—-F¦U_·y¤+òvµ-ük§®|]2Þ‹aMÁ¢dIê:ÅmÔHuÚb®ˆ°§2ñ |êÌB›˜…_v[1rI,–Ãä#“8Y7†q.äMÓÖM[æ½pbµçâ•xñBå–©zÁ#o6qðƒ±þ'P7N…‰ýB«¼Zz9ZaM<’cU#rJÙwU(…$sܧ!V0©L¥ÓFÑðšWí9…‰6\nùaç¨)Ýï}Ii"Ä·k7¥j +OÕ“”Aõ-ÈÆçh„|>TXUàÚŽ<I!Øé<Šàm¾« +nø$³¹¶>`Ô†óÎÑTóï®Î×S‰)«L'¹Ø¸¦ùõ¨"Çw.“Cþ8xBÜw0¾0ÒcÂ’>«ú§¼×»- +ʃŒˆt&ºéLàœ–g¤å{¥¦t¦€/£œ³Èë +%b3ÙÚï§8¼Çßò:x|^ö<°.V®î*á|₇ápï?š§Ñv„•Ý=
W»“ +F>Ë)$C¨wgd¬?#cgm /êìËx¾cxlØ„'€ì$°ÎÔ`ëaΨ>¤ésŠŸcÒæ +dx¾:¸Á`Z*ßÊ{gÁ&*µãR×€f±Â|è\ù¶ð•nr +&]¨ +̇xè¶èA8÷ÅLÜ”i"”´3þ:`ü탌g@ø¤P<ÚJı~a_3‡tàØÀGé0:Bñä×apÖa,cÙC¾š ++Ç…›OäC²FÈî*VØèrÆö1„×î°ë;rÆÑ,È„yÆþˆÏ¼XWç` £œ$øãcMùÓ"âOᘛ¬ +rQx|XŠ®sjŸdæ´®Ck+“-š¶dkVÆÎß¼§J¤±zÜL½®ºÙ[pd2} °á•åQ®Tš¹Ð–-þ8t(Cîäÿ:Q=$y²eªéÂú¥={¡LîÃî·!‹€“ÆLÈJµØ èãYp!‡VÛú=ŠÂ%lX3ÂᣪPöH}~œ¬èÛ~ks’fŽkG€0’È;–ߤŽ÷›®]Í +èëä;&u P +ú0èR¢½ƒo ¶ÀúèÑkÒñÂxW¢ör›ª‚I¼ n7m
6¶ç îlÞºwœv«±-b —ÔÎÈ Qôõ__9cÐd°H4ºG \oUpJ{¤nÏ·—ÐÍw»z…×vrá&¸kdÂJ¥k¢È9aÅ}µÇa1Ü#Gê;áyÈ‹ê(Z†Ž¾©wïóuÝÏ›_úäM6|«Á ®¶s·%œÂØ‘¸ðº Ré¿ÿL¥¿ßS¢
Ä·€`Âö<‰%®üÛµî½Ûš>6Á¥êÚÍÚƒÀ¯Ý¼¹è(JIOƈtàzY8:Z:Œ;¾Óþ–° Rã’¾šKÓñåÚûŠ¿SÄ·Pã^Pà@{&8¼üI!æ™·Ú©HÓ_å Û²ÿx•Ê€–û-_&xOÍŽ|ç© eÎø©ÐQòBppŽ>ÁûÏøExÃêô¿ô9&ëeÅÛq†¾£ê{Rèù¯N¾®I©÷¤™ +×üÀ©æo8æêgXÌzÈ……E/-ÂÏ°#K
‰B©9¨ßà÷#GIá!N_öÇt6m‘sA…7æ/¶qfù7DqȈOnÐð;xi +o߈Ùz9Û +endstream +endobj +1156 0 obj << +/Type /Page +/Contents 1157 0 R +/Resources 1155 0 R +/MediaBox [0 0 612 792] +/Parent 1154 0 R +/Annots [ 1159 0 R ] +>> endobj +1159 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [264.014 232.721 273.877 245.515] +/Rect [311.012 433.512 320.875 446.276] /Subtype /Link -/A << /S /GoTo /D (Hfootnote.12) >> +/A << /S /GoTo /D (Hfootnote.19) >> >> endobj -806 0 obj << -/D [804 0 R /XYZ 110.999 687.904 null] +1158 0 obj << +/D [1156 0 R /XYZ 108 690.907 null] >> endobj -286 0 obj << -/D [804 0 R /XYZ 110.999 346.918 null] +302 0 obj << +/D [1156 0 R /XYZ 108 666 null] >> endobj -290 0 obj << -/D [804 0 R /XYZ 110.999 333.618 null] +306 0 obj << +/D [1156 0 R /XYZ 108 650.653 null] >> endobj -808 0 obj << -/D [804 0 R /XYZ 125.345 174.608 null] +310 0 obj << +/D [1156 0 R /XYZ 108 356.053 null] >> endobj -803 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F101 484 0 R /F87 383 0 R /F85 373 0 R /F80 371 0 R >> +1160 0 obj << +/D [1156 0 R /XYZ 122.346 156.081 null] +>> endobj +1155 0 obj << +/Font << /F94 409 0 R /F105 415 0 R /F107 429 0 R /F90 426 0 R /F126 570 0 R >> /ProcSet [ /PDF /Text ] >> endobj -811 0 obj << -/Length 2478 +1163 0 obj << +/Length 3196 /Filter /FlateDecode >> stream -xÚíZÝÛ¸Ï_áGØeER”ȼ¥m’^Ñ抻-P éW–×Âé«’|çpÿ{gHJ¦,Ú»›¤-PX9$‡óùqé*‚?º¢4"J©U"S¢¢x•U¯¢Õ½EID‹¡C¿½{õ›w©\I¢’du·3wÛ¿¯ãÍ-D´~³ùÇÝ
IJhÊ‘„ED2Gö—ÍmBÍ/[¿5í¦ý{óûùý7úã´Ü´# -L"¤xõönâ–KER˜…ŽrËSA"!¡™(ÿL°lÂý3ÝíóÍ-éºÒY×XN¤G§DPîˆ?R·e÷ËG‚#N¤<"±ŽtoÇiD=àfï<ò”¹á4YÝR+ah{Ä„Êxu")–ã.‰Ûåf¹ˆFžñ˜†'ÿsÉ¢ T=ƒCñ4‡£@”ô&,O*‹ù×ÉSøÜÒ¯æö‚<éuŠë¥Ïàñ:7uŒx‚@“‘Ñ×àÉ4:=u¬FÙÿ:ñ=K’Lª)zô ¹>ôºÎ·öehì3k ³ÞÄÑúç
ë¼lÛ”º³ž—5M·-j=änH]o‡ã‘«[F9‰9:%JX1ty6èúá`Öa’zëô7¶§oìs@'·$U¥ëm8p -æbîèÙ¡û9_>$eòÌ$¤olŠ]ãJǬ,²åRâ&}ÑJeQç}€'ISŽŽ:!Ø‘œ/Ö6E=,ƒÀ–ÆNÞ‰™ò˜w(EˆÿÛ®i[T4¾ìº¦òìZ¥¸@ªH4™ÏŸM¬g~mnsÀbc–ÊGy»Á‡fÃÄúѾú|y²[ˆ÷ÜXG:”Óú~¹´“Rû&A&~:$Æÿí ?XâÿDØN^ QúÅÜ&ÿN‰>ƒEñB^ˆÚìEQ{¤þ5¶oY”’TÍ<¥¨û!×Λ›ÝrU¦ˆ„w;G-âãÇ‚Hõ¿z¡¥>åWì߯è·áñÛ;Ö8tKUJ6w,Ì·qÄÖ}Q€RÊ£}Ý5Ýr‡ -G_;·):›×ñÒ’Ð’Ie¼XqW”e -êòZWù6(SÎbOá-8 6Bu\Uo¢tøi -—²¦þE¼@=â»U/¶,¤†ÆŸ–^L#@T‚âÇØáM€"攑äÎ -}`'rý¸/²=6ÓµÖÛ~mûvMYZÅõƒy2(‰ˆ¦
é}s,¹¶=ÆÊܦ¸‚¡IÿØiõ«L€¥B°òlÀ2Öêap,E’ þŽÕ— êI0ý‡cw苦>·
í -”¢àà¾*Þµ.ËÉÆR¾6f•ÆN
Ðø-¬žHúu®Kƒ®K'×Eòª-1
Ž•ÆñÖê‡Ür•úëÅ…(‘é\H"Ũ½„‡
ûCÛ‚['ýI:Ë MIÄüë]€pÎ~Bn—Å’4ß,q•ûfë¹sŽ+S{ùê*½°kŠ¶¦Lbã\Œwê`=Äü¦^›¹»öï¢âŠ¤t4Á;#ž?L·élý–ˆ±“Û§`
x?CÿÓ¶rþ1tÿƒMã[7=ù„síÂÀC|×öÑvÍC§«›Ã -t4yØ»ïï—›R?‹³Å*‚Ä©úQ„N r¯‡‰×í!ó¾M»@hn¿p›¬Ù:Ii'!À¾íâ–yqÅðè€,æ£íÀd¡{ -ÒbÓµÍû¬+,¸q³Î‚~Ð% €¿wh>M7ð¦öÇ$µ B2¼á]g†—º0UÜg÷¹SI×@d7wÇ8âeÖÞ’ dw¶‰9¯Ì—¿,ÁËŠQÕ®-22äŸÂ·¬œ?uË:}5ØÝë>'Õ.M¼2~xÁÿ6™ëú¯õn!,Î\°ç Y2½í›Á<SeÕAËQÉ¡ìãÆ@¼¬IÀÞœ»€D®×%<iêÒõÞ;Flõ‹c6súÿ°3ÕÔýÛW~æÿÓó/» +endstream -endobj -810 0 obj << +xÚÅZÝÛ¸Ï_áâ*kV¤DJº>¥—äšâ.\¶h^´m'K®$g³]äï|²´V’݇Ã.lrø¡™ápæ7#ËUr%Ãte²Pda²*ÏÂÕÈß?“nxƒã›É„¿\?ûÓ«,^¥"3fu½Å
„Rñ¸Éuù¯@¯aƒçë_ÿ¦'B&NW¡HlÓÞ®7Fѧ^Ò碼 Ï×ôù}òè»q»ñé‘Ñ"ËÜ~IŠž½¼Ù×aüYép|Iºöœt+£#–lŸÅ¾jv¿„Z^7QySrcØÛ[[LêìZéàýZêÀv½#yÃ}~<ÚÆms[
û‰º²„µ¥Eš:ñ~U¡‚ëu$A½¨•WDø‰>ßåzÜg”#6"ŠŒÛèkƒÞ3sÌ‹j¸ãžEN?»¶´N®íZ†AÞ±h}Û6¶óçÃË¥%<5Óo?ÇúÛ ëï>ɺ¡œq.pÒj…"’zöœ×Í?0éäó*|‰H¥7µjXoTª‚ªw߇cÛ
yãÈÃZ-7›v°Žˆê¢–Í‹=·Žý%Õîڲ®íý +ØÇîlªÝúvëÇÝ m†ªsím[×-šÝ-Ø)k*‰…T3Eõö?'ÛVÀIÂé¾nøÎ?è{àþÈZDÏ46_hܸIï+²ò[äµdRÞû)È“ŽÇºòãnfî¢ +2ŒÀ¤²•Î`¸¥‰gXð<w3™L^B‚ÇHElR22°ÅXšqGääÅeÞïm‰Ý¶ªklt¶îÁ}„áUˆ^\ep…}y%±ÿñÒò6JÑîi„Šy÷ë=š^¤M—%µ²:R(´ùÉ<£=
uÕXîBLÆ3®k?9Ì›]MÆýk²[lUýÕyA×;*ât¡ŸíX!jly5ÎoÜŒav‚†¯fF¦®°«Ý*`«Ò(Rý²²ËÑZožS¹E^Ø®AtX×î²*±uÈE_G×ÖæniµEûÞÚŽ/ÝŽÜmÝvn}¬užÝ¼Y0Ï›:/~E‹VàQQOaœz[ +¦½pÌó1Ò!”-´(NÐëH\º/@D×€´qð}Õ
§¼æÑ#i¨ýе,kÉ#%»ŒæÁêCU–µ½ÜzA²öÔ”yw·6:Àƒc1ä±¹Ïë-·xlè™p[•^"Ž4uíFª¦¯JËmï +±=3PèÿÔÌûs@CéØaƒz ÚxT-ì[íöƒ;“よxu”qá]3“YðzRžCF“8¦æàœÑÝúl—ÐFcv‹È8h|bÎÐm·¾=:–¿y7ð§Œ`¹žùs£!Ê¥ØìãÝ*/…oÌí[<ºöT—Ü-ZÜÐíÊ$Ç!´`,Ø>ØkÔŽó½æ0‚Ë÷+S®–Á%Ìôi&íÈÎï/ @ŠÐ#€Ÿ)ÈOÃþ_çh3Jb×y3Pü@í¿OÂëìºôÙ1¢dboÆàñ5È/³ÜÌ64EP$ zèûꦶLGCCzÑbülíæ9zmTètVŽg€„é&ð;ì[
8„FÄ]—÷UÁĪ)êFüªmÜ<ö.´ëihù +uÒÒì6ˆ¥Ð±Oyôv8lUá—^< Dj·‚үƽƈ,š„¼e±bÛR±RàF¶§º¾û#
œÐYyžsT±; + ô'B·@鶨0v`§¨ºâ„^¬ç[pôòóÃKíüþE“Åç|Ñ÷«‰vý»Ôq*täÁvwj<‹{ÇõÈTH?›a s¿]8—TA~¡Òñt +€W¿×¼:}¸ŒÅc0P†â.†Í’HÇgÎ2Êád.Î<<®ö¼Q·À›LHEâ'y’©â¾åSPI"Ä B"âŒE8Ö9ex69¼•2"QL‘dœp¼$zLä3õŸK|ftÂ&ˆ¼Àí7òs±Ç~{Ó~¸ÿF~\RºEÍó×&ž&JÝg9°§mŸ_î§7}sžsí„Š•y„¬*Ì€ãHjr®oZVXp¦Ùy˜ÓŸŽX +à¼ú7óNùÔ?è3«¸<€[?êœYÈ!²Êc³÷ÞÖ€œ1Ç/¶…v õ.]G-T¤cJHEsr8Â
ôO0©c É„K²Kôšé—…Ï>+|¼(|üIáÕ´rõ› oÎÂÇÞø +£ýâ‹¥±À¥žlðéB¦Ÿä/ñ[Ô`ß;»øùTÛ{!?âõ½‡èý;÷V¦+ï|ˆ[r±J$ä[~CP?”‡fÂe$Œ¡Èe"{ùt- ¥óñÉÒ +ÌæspÞ\l›*ÔÄà=æï;ó› "Á8WX9Ë‹bª„_r˜h!ÇõqFCMy…=KˆZMŒ÷€¿p ¸Ž„òøw%Üã*JU5½báóÊ1âxXÕ›sš¤æÎjûgN‰'Éò˜Õ`’5ÆÍK¹R¼”æ)&%ζ㜌<ȱ².¯\Ž^5\Ë<H¢¸í-élÁ‚;ÿXz1.S%â8ùªZ˜‘~]ÙÚÞÙ]’ÀÁÏë]•{5;¾W-r†tÙ²Ö4l!“'YC,¢t¬ ô“—´ðﯱ¶Ç]4ƺ-°:èìfÊÚ<cu,ò«âÆ¿%gßл+Åyö‰4X Sbsíè †…Póâ×|çÁÃ_œåKÕ†Ï(çó÷oIp¬†Ü›TžÔöî™lW<î*·îÕåÂU4ÌR¥/ÙìÆ/™ +LÈ:ÅŸàoSNGÄ\ðŒ²©*a¢ÿAá¯)Ð*·I^Ð[‡Ê½>†µ˜ÚàŸ\ä¼õ’³Î¤H§v¡–º°Sɳ§eãÎ"ÂRSA¿ÛçÍŽ_ITþB©=ÊdO,µ>€ßþáæÂx~é)>–zp?måÞñÂHë¾oZÊ6²]: +¡–({!üŒ +endstream +endobj +1162 0 obj << /Type /Page -/Contents 811 0 R -/Resources 809 0 R +/Contents 1163 0 R +/Resources 1161 0 R /MediaBox [0 0 612 792] -/Parent 802 0 R +/Parent 1154 0 R >> endobj -812 0 obj << -/D [810 0 R /XYZ 110.999 687.904 null] +1164 0 obj << +/D [1162 0 R /XYZ 108 690.907 null] >> endobj -294 0 obj << -/D [810 0 R /XYZ 110.999 193.21 null] +314 0 obj << +/D [1162 0 R /XYZ 108 507.072 null] >> endobj -809 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F80 371 0 R /F101 484 0 R /F17 509 0 R /F11 537 0 R >> +1161 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R /F126 570 0 R >> /ProcSet [ /PDF /Text ] >> endobj -815 0 obj << -/Length 883 +1167 0 obj << +/Length 4262 /Filter /FlateDecode >> stream -xÚUYÓ0~ß_Ñ7ik<vû‘c¹$A -ówaþ<Œ¯Ãøl±ûi67ß(s€'ƒx‹«jF+•f%àQYKÍç'S…^rB³…\rjÚ¾÷ƒ«»ÆéZ”<9ÞšÞд³þÉB2n׺ѵ¶#á±ÝíHÍ6ÍاO.i=ÔhÒFÕš–;ÛÔñȶíMãl»%UüCbhnB‰&íØϯmï=‚Ö +xÚµZk“Û¶Õþî_¡o–2+” +ÖÏ7ÿ¸ÿšš'J'››@¥†ÆfÞlcCÿõúKúÿDùýEÿ_Ю};7ÎnãHe™Œ—dØàÉ—÷ãò£ üäî°~iwŒOËÕƨ,„A¢X–w÷Mí6[ØòúÜt]¹«èË®[—wMÍ5MË…÷¬óº/ëúÆ·Þ»ïƒÀÀX´)
HU§4k*k¬lë{mÃÎõ§‡sYÚü|,‹ñ Æ…¦VE&’§òpìy¾»ž·+òJˆyUÉNÊ¢ JáÀ«IŒJ2Ü×*‹"óþXvÐ8K×ðËK6Áe~(“zFÈÖÊÞU°O²®›þvÍQ¤lJŸœ?4Íž»”{—+&>gŠ¯Ka‚¼bZó0‘±,¡ÓÓ± +£TÆ}Môr"j^°nÖcb¥–~O7Q´–ãnp><å¹Êw¦reÑì¥"ïºáä¤OÌ{&÷G'Çj@UÂù±våÏÐÛ†îdkAi°9.³"O©ESwe×;œéïËþÈ5ÜHEÓ´û²Î{¨û +C¿Ás5GÜß;°2
Ñíú}[ŠâÈÊ©R0‰y„R¤*ŽõÈÙ½»ca¶`£’çèü$ ü¾/ÉÌ$¨´ y#E6B ë ÜFGëŸzî”w2Œó
=E:xý·îN:Õ{nËúäªp-(ÒÓÏR•µ_XÜwµëº;é +ß$Îp*| +LmO0š¿(c+Ôœö®+5WÁHzÝ”…ãϲ޻³ƒd^ -šüåÍB¶Óªœ+Ĉ+&ÞoRU._Œ>4ã
Õý;]Ѹ'fjíXÔ`¬šwöå˜×‡%knÃÙµµÀ,«¼ƒcfÁÀk‡š‹÷´–0T©Ž`AàŽ,µý’é*;z¡~Çp kÁ£žŽkz=¢ 3XžeTo¨ü–Ê÷·#h¯ÞQZ£‚+‹Cê, +Áoe£Ùb½„‰\3bC„QÕ°õcË™y‹Íòó¹mÎmI> ¸¸K?¦Ik0HgäÒö«#3·ÓÑ!Ë«ã + b4#^|®ïxøžý9Lϸ{&
üB„P"”&U7>‚›&ÿ•CD†qÍT:š¡?ØÈÌD
y8BuøÁ¢i>‚æÒD£IÀSkÀÕ +uxx·ëH +±H’±fŒ=ÈL"Ňóàaª³ +Á’çN¸l©S
¢š<Š;Q_sçkebÏTlb
Є5ƒÀI&s'™Ë-°pÏhw>~4™ÛiÆõF©D©„¥œM J× …D®SvcÞx¦ ÈJ}¦d%A|/àÊpÓñSw·Î6„ðþq +–ÀŽ!µëbh[0¿dÕSCÑ4x²»% +AG’|†ßHƬ˜ÈiŠn)ƒªPOxx®œäÏ ‡C&þt†SÊw QKG +J”ŒÊzÇÝ8R¥=\^ËnKñ-Ö€Ó ðj’’Ĉ +ù£n>ŠÕFÔŒ.¥É\aB[òeLè\W-%˜ŒQöú@¯×¨¿KÃ4Ó—=Ò°õ^–€4!Ú-†*§*næãa‚²(õ’é{ÏÝÃû£ã†BJþApßt>¾ÆÙ¨O3¾Á7£"æ[åD#ÑB\%ªu +8„Âձǖá.ÔäKNÅR4"p¤wù>LîGvÙV2›n(üX:‰È'+±cè„Ħ¾Z&,üTÖ” ÆjÙE9i¶`@aµÁ˜TUsøM«U<æeá—¨0«8x†4ËwçÜuF‡2SuEï…}F¿’CðÀÖç«IU:ØyÙ½ã[Ü`tY<f•ÀÚÎ×€Ø-î/Ž/ýÚàg ¾öå$”šYúÙœ"ðÜŽI¦q½oFßlj´IÕ·›bâ¶Ú«qàH5æ|@jõxá½ýO&e-a÷7»¡T³—Î?úPÑ&áúOÿu?¹ýzCåç‹¥ÿoäúl!†Ì”Ñ–Âr%³K͈Ý$ +;æB<»¶kXráë]ÍÙ¨Êín¯‰äPIªN9œü+ß?oáÃG©ÞAñúvȬ‡ÎÝ:xC„?âgë{ÎbG‰¶ŠÖqNcÇ2Œr" tÁk±¿º¥GG_âs/‡ Í?›²ÄwÎÏuòµÖ-1݆ºÈëÙTÉú…T¾VüýºøŠq>há¡iŸ-áØÎ<vú¦ž¡\Þ<VOæy5¸¹¨ŸKþå›J(`ÂZœ˜ª[eTfÏ7nÙÄ¢ƒYíʪXTÂ, !'€6.mÊkò¢©*Þ»^RE÷@DûŒ©8Ó5•â/y›sÈÅ4üÞ˜83‚/3pIöúnÓ¾M +S4ià!Ô©¤ÖÔ°"߆/¬JÂ5‰à‰«{¡~Ç“Õ¢ÌQ¨Ù1å฼ÆÜâlpÚc*„2¥Ðþ5X7WÉhMÓuŽ‘1|¾uþ°ýi:Ï€ï@¸ÊœÎ+]¿ÉýÏXLÔíe›×ï¸øƒ’j—SH˜öªç߽늶ÜQ.$H™ÉüÆ +lY Îiƒa
û‰ÑÓA¦l–ð»’pñ]I8âC˜1}ÑñeÌŽ/‡qãPòf:Ni”©¸÷|è>€Íûiž‰ï*|â2•D ãYöÐ6'1åB;”Øe¤¾Ät™ÖÀ(=}Cñ1–|ûì6Q™®ðiC +‘Ü‚¢+.kþÿÉßÿ¬öÐâë'œvºzå +*³¥JKI·IÅ¿×ÌnÛ +endstream +endobj +1166 0 obj << +/Type /Page +/Contents 1167 0 R +/Resources 1165 0 R +/MediaBox [0 0 612 792] +/Parent 1154 0 R +/Annots [ 1169 0 R ] +>> endobj +1169 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [262.861 194.369 272.724 207.133] +/Subtype /Link +/A << /S /GoTo /D (Hfootnote.20) >> +>> endobj +1168 0 obj << +/D [1166 0 R /XYZ 108 690.907 null] +>> endobj +318 0 obj << +/D [1166 0 R /XYZ 108 368.341 null] +>> endobj +322 0 obj << +/D [1166 0 R /XYZ 108 355.061 null] +>> endobj +1170 0 obj << +/D [1166 0 R /XYZ 122.346 154.394 null] +>> endobj +1165 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F120 538 0 R /F90 426 0 R /F105 415 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1173 0 obj << +/Length 2542 +/Filter /FlateDecode +>> +stream +xÚíZ[ã¶~ß_áG³âURÞ¶íÎ6E»)š ÛŽL…èV]2ã
òß{x‘Lhg›’ À¢ÉÃÃÃsù5xÁ^á(Y‰4Bi¯²òM´z +„ +ñóä)Óü-×K)x´@Œ&fØÝAm¶Óu)³¶ðd 0úh2û¦8góÚOqõ‘Ÿ‰ëŽH‡xÄ͘_!œ°ÕiÈgœEÐ7DØþ³”’#8ƒ_FÈ™…uúJ7zY§ø· SüéÔÁgñ+HR8:=–a8KÉy—Š‰ÆóÎzÒЩmõµ}fuµaÑúGåTÛk"[7u!Û±¿nwy%{ç‹ÌÛn΢…d³ÕëƒG)ÂnAh”r>†ŒÁ²©Ç®»Ñ”dÝÕ¶§7Þn†”¥¬v]hËœ£$yæñÙÐþ¨–Û7Y.™›ÅŒìsNǬȳ%+¨ J_ŪÈ+Õ„‚)Q<ÅÒ]h1Š›skê¼êÏp·ø¨ZeÆ Fg‡°kë¦1gÀgßÖ¥gèilö +×vZgéÒ>öuQØÓË«;tJ†V¹q÷õÐ{Sâµ±4Ç=wÜN ×9k2}?°25²?| +<Aøf`dðÍÀdˆ‘™–À4öC—C5ôÌ2äÌÿ'ýoðZB?²oeÕ±”ýÄNg„N¹ ÷Ê)PǵÐ1bð}Ƈ<C0=Æ<£ ÑI½ô¢z ÿIcÆÁ²BÉ6°D62†ý{•É0ª§`ØIêñ{Ì}]ÛF‘ÿ° ®t°µöy¯ì3;Ôªl[kê×û¦ÂŒ0§©ÜyÂŒ/[… +[.ÁßÌÎ-«‹ñ$š³9†}N7S”ÇÏr°·½~×.Q¹A“AØS}k:MÙféYU=è*M¿›*ÍŒ‘–Ðòvg)j;m[šœW»<[ÓËÚ2~”-íþCö9:ºÙðPìFëœbåÞ]œü¥£¶šbhe1Fó¡Ò¶ì쌿Îöó¤}&Ÿó›Òäi£F|3Š£-’:ÃL¬?(/kØŽ¥ F¿¹¯ë®usɉ`V^nÕ¾PYß¹(†™›ãè–|fª–²uìü©†îȧ‚ŒÑlÒ™á]&åïÈfƒÅið!ß϶og8?M¬GAž–¼ýá…¬úùpM97üØ=Êf6ÜPÎ?.„9^æ¸æ¸æ¤—OîŸ.qÿ´àþéÄ}#f×ߦ»Ù˜°ÄX +5Bê¥i-²—¦!jÀ¦©>`Ó{±aH÷hTdƒ{J‰âÙñ@j—\á’gN„!9Ạ<‹àKÜ\î³rÌ‘só£NˆÒ gqáD9y|À\î»6{·0bÀÉûãÔ{c)Œ +“/òʶÝ]q§Ï©v´Åc6EˆuåÂuèׯÅ>K;eSìÎIj“™…wŒ•&3=…GÓª¾w5\9d‡³[éM>eðX7®ZÈÝS62ùÛ‡‡ªÌ5€¨æ90ïÇaí'뇡TU V´nù|ξ̻¦JxI„óýN>åÝAÉ”‹K + +óFÍw‡YÞ¡‘ñ© +š\ñ5‡ž‚ƧŒxý$ìnȼ+ŸiHµ)þÌuFù²zçt%Ž +Ù``?è—§À•›ôS³KéZf –βʣíþhÇX± ¤!žÛ„1£‚œ¥ÍÁ\ä +}×Ð/G("ñèëå¾É3Ô«§à
¡`ø¥ÏŽd2
p‘ý½ì*÷/Æ#îwÕvüöÈŽÄLm€/žiŽRjµA)1…\gi3¸ïîù£³¡øãúv”ÇÀ˜Šntµ®çnŽêòn×Uá¨öZaü8®gå•“'?kÙPv½¬2s;–@4v¹;Á}R7Üw}Þ£ùaØOQؾ:ƒ¸‹ÝÓ™HŸ¸LiEI7e—·æ¿ºŽ#/kîcÒR
Ö]“
;€çF>û4ýt©€"‚„þšLâuütËI +endstream endobj -814 0 obj << +1172 0 obj << /Type /Page -/Contents 815 0 R -/Resources 813 0 R +/Contents 1173 0 R +/Resources 1171 0 R /MediaBox [0 0 612 792] -/Parent 802 0 R +/Parent 1154 0 R >> endobj -816 0 obj << -/D [814 0 R /XYZ 110.999 687.904 null] +1174 0 obj << +/D [1172 0 R /XYZ 108 690.907 null] >> endobj -813 0 obj << -/Font << /F78 368 0 R /F101 484 0 R /F88 386 0 R >> +326 0 obj << +/D [1172 0 R /XYZ 108 204.372 null] +>> endobj +1171 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F95 412 0 R /F120 538 0 R /F126 570 0 R /F11 600 0 R >> /ProcSet [ /PDF /Text ] >> endobj -819 0 obj << -/Length 1806 +1177 0 obj << +/Length 792 /Filter /FlateDecode >> stream -xÚÝ\KsÛ6¾ûWè(ÏD(@Ó$ͤ‡N§õé¢H™cŠdI:‰Úéï’tTÛl¬bpÇ->€ûøv+³…¶`ŒcÌBÅš-ÒÝ]láÔû3vs %œGp§~¼8ûá'/bb”Z\äã›?–ÑùŠQI—¯Ïÿ¼øy¼D¦Åp §$æ7—ýz¾Rl|åËwãñ/ãñÛñõÃøúæÖÙß;Œ(¤ } âÃgï.³±!n 6(+a(¡”/V<¸Ú -w±bpRDÀ±\À˜JÜLâ2¥ËÕ&ûr¾â€¾Î§÷´Þí’jÓ½ºù¸9g˾¨«núNMMÒ&»¬ÏÚ›ëý×Ï·Ù}\ðS— -KÃ7$ŽãÿçÏû#QÒ4åþâ°´‡k„$yºðÕý D”Èèf]§ÏÚíb:øíýA3ŽŠÞÐp wÈG ðÆ1R>¤MQ€¾‰Q_(¸$‚J4 -¦1(`!¹ÒmýÙ"J¢Xº€ÀŒÂ#¹ -ƒŸ,Ål8D`—Y²)³êÈÖhæ‚£$ŒÀñ^+¨—†A˜DÁ)“uVZ„#%‰PéF(Èf—´Û¢šŒ]ѼÀ(_0W6ÁÀ“¨ Õ&0Pe
ü¿â€…éG±¬“ôjÛÖ×Õ&˺=F3“_bE¸ÆûN1"Œ·xÖ@ø—IÛ[8Öfd»t(9EÓbŒKCR@Ù¶Isù ¤eÝe›“ˆo3E4`—Òø”ëüØ?»¼)Ò-L£ -Ëcøˆ(Ýí¯>RI'Œ²{µé¯8nüßíGDmݑܽû§°éüîøv
ºê{ûþÛF¿²Ý.£~fqï·`‹]D„Å8C*æPþ÷¶´¡´˜m;›+¨¢i<locðTU–ö/¡–•Öu»qôgÂ*š¼iëε‡%Ÿze)DLç"£ Šõ
Õ(×í§l¦bSErÝ×yžä½-Œ²«(iÀ]Å Î:ËÁ!ÏäŠQx3Ànƒ+&ÔÜi4:ºRN-"cçÁѦt®òŠ:¡N4VTïËÙ$íDà—É&›k›[TÈMÒ]ÚÊÃAä‚ëkÁÕï& ®'„\p1ι(/8ÖNŠ0T¤¢Ê —¬)Ó$=Ò\}.<,œ>±§«Aö!ø3(|{í¸Ÿj/À/T(™6uQõ]]•û™ŠEÈ”ÏQгŒ7ÙúœÓåõÖ’aDD»!77 -ü…oæìUzŠ¼½z–'×eß”uÿ<IÊ¿ìm‘ìêj®È¹ó‡$¨ÚÞKúÝu`lêÞI´!Úü<‹ëY0]ñ÷lɸª`}×$éL‹ƒr§Lù@éçËäÉ«G(¥=gt™ä;ašÄîœsÐa˜R`ƒàÚäóLµ7Žj¸ûÇ
-‡£ 6Ȇ*§Èö‡±¯¦yæé›gÁ#+Ë¢éæòÃ,dQ4Ú¬{!ø‘‹€ü8‚±ï±ÜîÁ{Q>`vy“ß´›+06“ê ŽÞ‚ð
†]@ú -g2MÒ_&m;SH‡5™Þ^êáÊ$
éÊ>eí¾¿ 4—ÁœT…ò$™<;VAªP:à7-rHòçŠÇâ€ñX^”å3ŽÇüÓ–€„P.®žAu‘£4ŒU1å•9}¤”W‰Åç0E¢Èýn¹™Ûƒ*`ŒØ¿ÿ,¿®ÒáË3i…9E»=½çvìž+)Wá -X[{sp®°ka‘†cc5Œï”sÙmÖÁlçÖÊbÝÉ=¤º›_¢øU=ìRÃŒ¦¬ÿ¶dúÏ&÷ðµþendstream +xÚUÛnœ0}߯à e]ÛàÛcšK/Ršª!R¥¶ªXÖ›EÙÅ+.Ió÷_ lˆª*B2f<>žsf<ÃC"‚eÄF +‹¨Ü/ptæ÷–—v}9qx—/Þ^ª,’Hqå€(ÍF|ý=f ìc8>M~柜»@D¤Öb$)@[·/É’S7’øŸåÜÝxæF¿z3§§œ!¥ž$Öaq‘á3œý“]‰ü4°‹8㧞ÙÚ”ý^×]²¤RÅ+]Õw~zh̺/õùÏ«„ĦÑ&!,~°ƒn’Ç'~µÛj?àŠ®2µ7UõàSµ~¶/ê¾Ø
ó'?©‹AÆÅá°¶Î<ƒ/ÍZ[I€ì’¤s$¦±B–>˜„²øQÛqˆÕ-x˜TõÆ4û8…8ÍgƒP<‘‹eHf2ä#wg§H +ç#Á¼†Îl¡üFë7{[¯L_¯ÇLЙD2íe +VŸ¯Mý&!2î‚c{ïwïƒÏ£WÎFÞù•ÒÔ-K@6@!a3”¨s,¸ÁîÂh]ê¶õÑ`‹ä¤â¢âX¨ªÛÎôî(š !»g–,S<D"¸½õ0cˆò¡øÎÿKkŠ8rä: +`O*ˆ‡¶ +endstream endobj -818 0 obj << +1176 0 obj << /Type /Page -/Contents 819 0 R -/Resources 817 0 R +/Contents 1177 0 R +/Resources 1175 0 R /MediaBox [0 0 612 792] -/Parent 802 0 R -/Annots [ 821 0 R 822 0 R 823 0 R 824 0 R 825 0 R 826 0 R 827 0 R 828 0 R 829 0 R 830 0 R 831 0 R 832 0 R 833 0 R 834 0 R 835 0 R 836 0 R 837 0 R 838 0 R 839 0 R 840 0 R 841 0 R 842 0 R 843 0 R 844 0 R 845 0 R 846 0 R 847 0 R 848 0 R 849 0 R 850 0 R 851 0 R 852 0 R 853 0 R 854 0 R 855 0 R 856 0 R 857 0 R 858 0 R 859 0 R 860 0 R 861 0 R 862 0 R 863 0 R 864 0 R 865 0 R 866 0 R 867 0 R 868 0 R 869 0 R 870 0 R 871 0 R 872 0 R 873 0 R 874 0 R 875 0 R 876 0 R 877 0 R 878 0 R 879 0 R 880 0 R 881 0 R 882 0 R 883 0 R 884 0 R 885 0 R 886 0 R 887 0 R 888 0 R 889 0 R 890 0 R 891 0 R 892 0 R 893 0 R 894 0 R 895 0 R 896 0 R 897 0 R 898 0 R 899 0 R 900 0 R 901 0 R 902 0 R 903 0 R 904 0 R 905 0 R 906 0 R ] +/Parent 1154 0 R >> endobj -821 0 obj << +1178 0 obj << +/D [1176 0 R /XYZ 108 690.907 null] +>> endobj +1175 0 obj << +/Font << /F94 409 0 R /F120 538 0 R /F107 429 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1181 0 obj << +/Length 4017 +/Filter /FlateDecode +>> +stream +xÚ¥\Ms#·½ï¯ÐQª2‘0_8:¶“r©T²·8Ší²–"’òZI忧1`z€nK—«døôóØ@7€Gɇ +þ“²êZS Su›×ÕÃ'øñŸ?H÷òʾ¾B€?~üð‡?™ú¡¦m>¾X¡TH>nÿùØ<Áï5Õã÷Oÿúø—Þ ÙiW•èP[ØßžV¿ÊǟƯòãøõçñëã×éÕº]·0ÆñõÊ>üô1¿©êìÓiÓ>¬T}ãé!”rx¬Áµ{ô‡¶‘¢²c±-zûàUõøóa;üö´R Áñeúÿæøúº>l/ß¹Ÿ®Oòqw<\¦ÃKÓ7§õyý:\‡óEÄO3Æk¥JçF +ÁSQ"JW§ªô°<˜Neq˜$©Kc¡;$Ëùø•˜,•¨û–•Þ
/;®j8ðjF§b, -j +¡S–„6¨¬“¨m/Z(@ˆ(ÕÁaòÑ""&óµh›ºô!:7¢ßm•f> d—L‡IÂÑ™s¼n—™O¿í
vyë]ŸØ +ßô +4™w|ŠV¢1¶)^wwL +ž1]Ö„IÂÑrôèì†9ȱ»_ÇU*Ççå@ÃËÈ13eäˆÂÑrt°µ–ýBÛ…ì‡CªJÛýN±ªÀŠÞÃËžò†*½Bp²'Ĕ㞵O×-@ÁF1¥ª8LŽVfXß.“d¿~öDª4ÀgøL¼ìo‰2¡WNˆ²¤´qëžê”;hk!Ê„IÂÑ¢4R˜j™*ûÝa¸·Mó|…k+‚³k+¢ì¸µ1ñkkŽ–DÚež¼®ÏŸv‡»óÄ1–æÉçó
’ÅçÉ̔ɓ(-Šê R÷±(_.÷õ®ž®¬wEh®wÅã“=×»""¾w£ÑzT@Óæy½ùòé||;l7ÇýñœŠÒK¡ØÑ!áeÇzC^ÍèT•%áx–(²1(j*ŠƒÄ±HM´©…DÇaÏëóæóú|½w-ñ|…k ‚³k ¢bû4Äį%q8Z’^ Ù,ɧóúôùnI_©$3œ—
1#ÉÌ”‘$ +GKÒUBÉy×÷¼Ù/Ãö››ùº‡fèn¦O肇éKÊQC`УãÀÄiú„IÂÑŠ +ï¡œ½‡Â$ÊðtÉ„ˆØ{¨8-‡RB£¤çãñr½÷¢Á“Þ4 8{Õ€ÇGÜʹ‹ÄÄ_6Äáh=$<©F]Éñ¼Îw§‡c+MΧ ѵºô˜‰øôˆ‚‘r(?êçFþùúõ@¯E•ÆÓVg+
!±~¸*‚˜øJ‡£é[Ñ ›[«Èi&E)ÛÚxÆÂ
‚³[<HB·mALüÖ&G‹ÒÖ¢•A“
ß•GWXef4[dÐøZ¶ÆÌ<|‰‰cUKk†j”h›©7ÞO+ùxx’×á<l7kûÏ“ýçîhJÔœÖÕñê@k¨ÚãÖg¯šØá,GuÒ PµÄQ‰ždÂ$Áè\¥b¾Øw7ÐÒß*#[i¦x0Ÿ(apªaóijdÒd(9‰W +6Üõ¤ø»óf?|sÅuÕÀ3gq?UDĘ8
²…kNN¢rëÈJÅh^‹ytªâ¤4¼ËH´U=Ä%öÃú|y}>R‡«e;ÏY¸ƒApvƒ‡ÙQÎF×8.yàl17¢-‰˜õpÚ +>¥ß8eãF”Ì0Zô]ŸL‡IÃE%CÀ)Çì{þ¤ºÇñ}ZÁw䛫lÅÏ…¶Ô÷VW1¡WNtKJ潯D¥ŽK¼÷&‹ÒW¨ډ²;¥HØÛhþÊEuBKxn™ã&ô +Á wÜ’’®–**ü""ìq&‰F.öHÕ Ó/«Æx¬qß¡±§+;4FhîЯ¥*fkQÉši1I0ZŽ¦:ùšúLë|»Ûˉ¾w‘¬¿«‚dj+Èóâxô +ÁubÊQž¤‚(UCY«qàDIÂÑúÔvªšDŸÃ¯Ão›·ó¯„8FŠºáwnÆ
/{â‰ãÐ+O3'¢«k²µW ”ÄSm& Gk£µ•Žµá’¦ÌâI=!ÎzBð8[Ö‚˜b]¤„L—V]ŒHÝèUk×?ƈ¦eïTx·rt>—áì\Ó=,ÜU©Û£³î˜’Î'{× Z“up{LÞÂTYZ¸'Q^_ž‡ÿ쨣®±9]`RÀΩÈÌí°9/÷’ŽÞ÷Ö0{©rVnÉZ¹ƒ‘•{ätÜ¿3¬H"+wP$ãäŽÇÖ®a5ɹgQrFn¯JdäžDù÷”$—;E)2t{M2~î%]>K2vî HÎÎô@vb$HvÖ¼5ð›BÛ³GgmÏ1%½ +×ÐÕ×ZfmÏ“·=]–¶çQ–ñžóò²£vÄãm8ëIJ±[]höàœÿ9"gOš+Ðõ4&k€ö¬Z+»onîâÍëû—_ª¦š”ªbLi®1^ðÁû 9@ó:çWâ÷¡ŽšÒßÿñ¿¿ß„ø $zÄ@Î’®ë +ýßõÇ”´;Â&MWgíß’w‡9¹¿7GÊø÷(êºÇTäüvà¬ó;"ßI]±·µ]¥²ÎoÉ;¿ƒ‘ó{4ͬÏçõ;sÁ +m§‚°ÌõíÑY×wL9®¡uÚ +ÝlÖõí1y×wÐ$r}š[[Y¸34Å7ª°·°£+2}{tÖôSŽ·3
UãíÚ—ñ|;HÞòDA¾êI”üf¹¬)ò‡$cÿŽ¹r뚌û{îBrîo¯Jìþ†-òaØ\™‹Mö´M·Z˜^À=:k +ÜÙ8cýö˜¼õ;h¬Õ£ô÷RcDe³¶È÷íÑYãwLÉÈaÏ%¡›Ë9¿=&."bkG¹Uø˜QÒÎÔªe—Ê ’··‡5AB1¨Õ¼&p
Wa‡áèJ;ŒÎwh„-ßaÌL™# +G+{½ªGgato‘w>„)ìÈJW…ί +h|Dõ«ÂÌ”Y¢p¤Ú(!5Ê·ëñåeýr¥ŽË:.OYØq!8ÛqáQv’ë¸ßqÅáhUúJÈ®‹Ty^`+woÇå9;.g;.<LJ–±BDlÇ£EiíßfA©Â4 e—g+츜í¸ð +¡;OÜ>ÉÇñ£ÏðÍÛ'âT«}=ÕR”·÷¯½BprÿŠ)IîøyQØ¡#"òÒb’ht¦h{_9oÔ¶ÃËúm=í÷×LGYZf8_Ð(ë–3S¦:DáÈ£>¥ZÑ5ÓFèÇÝúõxàúïöV_å© +û*gû*<:ê¤oê™ßWÅá葵èÊ‘#ýg–Ê6$žpC‚à솨”n³˜ø
IŽ¤R°:($È•í3‹®í=aáµ=‚³×öxŒD›é®äm‡#5‘¦}“äzÙýçî“ROW8mœ6x„Ä>ÞM ÄÄO›8Èøù—E–\NëÍÝ-¦ç+l1œm1ñ)I¦Î1ñ-fŽ–¤m¡‚´X’ëýGžp%Apv%Áä6¿’ÄáhA`y¨”D‚¼=ï‡íyýõΕĮ$ή$xŒZs+ bâW’$ѦÙíù¿ŒnÛ´óúÅ6jÄÒ*á».ëÓF¾Û&1‹^!8éÔL¦,8.Ñ£M˜$$Z +)Q’éQä˜óTeŽ9„æsxlDr87"J?ÿmêè˜Óµ0†</Ôã_ŒB/ü +e‰ +endstream +endobj +1180 0 obj << +/Type /Page +/Contents 1181 0 R +/Resources 1179 0 R +/MediaBox [0 0 612 792] +/Parent 1271 0 R +/Annots [ 1183 0 R 1184 0 R 1185 0 R 1186 0 R 1187 0 R 1188 0 R 1189 0 R 1190 0 R 1191 0 R 1192 0 R 1193 0 R 1194 0 R 1195 0 R 1196 0 R 1197 0 R 1198 0 R 1199 0 R 1200 0 R 1201 0 R 1202 0 R 1203 0 R 1204 0 R 1205 0 R 1206 0 R 1207 0 R 1208 0 R 1209 0 R 1210 0 R 1211 0 R 1212 0 R 1213 0 R 1214 0 R 1215 0 R 1216 0 R 1217 0 R 1218 0 R 1219 0 R 1220 0 R 1221 0 R 1222 0 R 1223 0 R 1224 0 R 1225 0 R 1226 0 R 1227 0 R 1228 0 R 1229 0 R 1230 0 R 1231 0 R 1232 0 R 1233 0 R 1234 0 R 1235 0 R 1236 0 R 1237 0 R 1238 0 R 1239 0 R 1240 0 R 1241 0 R 1242 0 R 1243 0 R 1244 0 R 1245 0 R 1246 0 R 1247 0 R 1248 0 R 1249 0 R 1250 0 R 1251 0 R 1252 0 R 1253 0 R 1254 0 R 1255 0 R 1256 0 R 1257 0 R 1258 0 R 1259 0 R 1260 0 R 1261 0 R 1262 0 R 1263 0 R 1264 0 R 1265 0 R 1266 0 R 1267 0 R 1268 0 R 1269 0 R 1270 0 R ] +>> endobj +1183 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [145.469 625.698 157.424 636.019] +/Rect [142.471 628.605 154.426 638.986] /Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (page.53) >> >> endobj -822 0 obj << +1184 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [127.228 616.845 139.183 627.031] +/Subtype /Link +/A << /S /GoTo /D (page.21) >> +>> endobj +1185 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.038 604.695 189.993 615.076] +/Subtype /Link +/A << /S /GoTo /D (page.31) >> +>> endobj +1186 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.39 592.934 149.345 603.121] +/Subtype /Link +/A << /S /GoTo /D (page.31) >> +>> endobj +1187 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.714 580.979 169.669 591.166] +/Subtype /Link +/A << /S /GoTo /D (page.14) >> +>> endobj +1188 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.658 580.979 184.613 591.166] +/Subtype /Link +/A << /S /GoTo /D (page.32) >> +>> endobj +1189 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.714 569.024 169.669 579.21] +/Subtype /Link +/A << /S /GoTo /D (page.32) >> +>> endobj +1190 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.633 557.069 164.588 567.255] +/Subtype /Link +/A << /S /GoTo /D (page.32) >> +>> endobj +1191 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.714 545.114 169.669 555.3] +/Subtype /Link +/A << /S /GoTo /D (page.32) >> +>> endobj +1192 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.038 532.883 189.993 543.345] +/Subtype /Link +/A << /S /GoTo /D (page.70) >> +>> endobj +1193 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [130.227 613.872 142.182 624.064] +/Rect [178.038 520.928 189.993 531.39] +/Subtype /Link +/A << /S /GoTo /D (page.70) >> +>> endobj +1194 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.633 509.248 164.588 519.435] +/Subtype /Link +/A << /S /GoTo /D (page.14) >> +>> endobj +1195 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [132.309 497.293 144.264 507.479] +/Subtype /Link +/A << /S /GoTo /D (page.16) >> +>> endobj +1196 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [132.309 485.338 144.264 495.524] +/Subtype /Link +/A << /S /GoTo /D (page.16) >> +>> endobj +1197 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 473.382 179.831 483.569] +/Subtype /Link +/A << /S /GoTo /D (page.58) >> +>> endobj +1198 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.795 461.427 174.75 471.614] +/Subtype /Link +/A << /S /GoTo /D (page.48) >> +>> endobj +1199 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.633 449.472 164.588 459.659] /Subtype /Link /A << /S /GoTo /D (page.17) >> >> endobj -823 0 obj << +1200 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.795 437.242 174.75 447.704] +/Subtype /Link +/A << /S /GoTo /D (page.17) >> +>> endobj +1201 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.714 425.562 169.669 435.748] +/Subtype /Link +/A << /S /GoTo /D (page.18) >> +>> endobj +1202 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.388 601.917 152.344 612.108] +/Rect [188.2 403.369 200.155 413.831] +/Subtype /Link +/A << /S /GoTo /D (page.26) >> +>> endobj +1203 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.633 391.689 164.588 401.876] /Subtype /Link /A << /S /GoTo /D (page.24) >> >> endobj -824 0 obj << +1204 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [155.631 589.962 167.586 600.153] +/Rect [152.633 379.458 164.588 389.92] /Subtype /Link -/A << /S /GoTo /D (page.11) >> +/A << /S /GoTo /D (page.24) >> >> endobj -825 0 obj << +1205 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [135.307 578.006 147.263 588.198] +/Rect [147.552 367.779 159.507 377.965] /Subtype /Link -/A << /S /GoTo /D (page.12) >> +/A << /S /GoTo /D (page.29) >> >> endobj -826 0 obj << +1206 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [135.307 566.051 147.263 576.243] +/Rect [172.957 355.548 184.912 366.01] /Subtype /Link /A << /S /GoTo /D (page.13) >> >> endobj -827 0 obj << +1207 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [170.874 554.096 182.829 564.288] +/Rect [152.633 343.868 164.588 354.055] /Subtype /Link -/A << /S /GoTo /D (page.44) >> +/A << /S /GoTo /D (page.41) >> >> endobj -828 0 obj << +1208 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.793 542.141 177.748 552.333] +/Rect [142.471 331.913 154.426 342.1] /Subtype /Link -/A << /S /GoTo /D (page.36) >> +/A << /S /GoTo /D (page.18) >> >> endobj -829 0 obj << +1209 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.793 530.056 177.748 540.377] +/Rect [137.39 319.958 149.345 330.144] /Subtype /Link -/A << /S /GoTo /D (page.13) >> +/A << /S /GoTo /D (page.53) >> >> endobj -830 0 obj << +1210 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [160.712 518.231 172.667 528.422] +/Rect [142.471 308.003 154.426 318.189] /Subtype /Link -/A << /S /GoTo /D (page.13) >> +/A << /S /GoTo /D (page.17) >> >> endobj -831 0 obj << +1211 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [191.198 496.183 203.153 506.504] +/Rect [147.552 296.048 159.507 306.234] /Subtype /Link -/A << /S /GoTo /D (page.20) >> +/A << /S /GoTo /D (page.41) >> >> endobj -832 0 obj << +1212 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [155.631 484.358 167.586 494.549] +/Rect [162.795 283.898 174.75 294.279] /Subtype /Link -/A << /S /GoTo /D (page.18) >> +/A << /S /GoTo /D (page.41) >> >> endobj -833 0 obj << +1213 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [155.631 472.273 167.586 482.594] +/Rect [152.633 262.175 164.588 272.361] /Subtype /Link -/A << /S /GoTo /D (page.18) >> +/A << /S /GoTo /D (page.61) >> >> endobj -834 0 obj << +1214 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [150.55 460.447 162.505 470.639] +/Rect [181.264 249.722 188.238 260.845] /Subtype /Link -/A << /S /GoTo /D (page.23) >> +/A << /S /GoTo /D (page.6) >> >> endobj -835 0 obj << +1215 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [175.955 448.363 182.929 458.684] +/Rect [152.633 238.264 164.588 248.451] /Subtype /Link -/A << /S /GoTo /D (page.9) >> +/A << /S /GoTo /D (page.25) >> >> endobj -836 0 obj << +1216 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [145.469 436.537 157.424 446.729] +/Rect [142.471 226.309 154.426 236.496] /Subtype /Link -/A << /S /GoTo /D (page.13) >> +/A << /S /GoTo /D (page.14) >> >> endobj -837 0 obj << +1217 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.388 424.582 152.344 434.773] +/Rect [142.471 214.354 154.426 224.541] /Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (page.20) >> >> endobj -838 0 obj << +1218 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [150.55 412.627 162.505 422.818] +/Rect [172.957 202.204 179.931 212.585] /Subtype /Link -/A << /S /GoTo /D (page.30) >> +/A << /S /GoTo /D (page.7) >> >> endobj -839 0 obj << +1219 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [155.631 390.709 167.586 400.9] +/Rect [182.919 202.204 194.875 212.585] /Subtype /Link -/A << /S /GoTo /D (page.46) >> +/A << /S /GoTo /D (page.14) >> >> endobj -840 0 obj << +1220 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [183.261 378.289 190.235 388.945] +/Rect [164.055 189.946 171.029 201.069] /Subtype /Link -/A << /S /GoTo /D (page.5) >> +/A << /S /GoTo /D (page.7) >> >> endobj -841 0 obj << +1221 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [155.631 366.798 167.586 376.99] +/Rect [126.317 177.991 133.291 189.114] /Subtype /Link -/A << /S /GoTo /D (page.18) >> +/A << /S /GoTo /D (page.6) >> >> endobj -842 0 obj << +1222 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [145.469 354.843 157.424 365.035] +/Rect [157.714 166.338 164.688 176.72] /Subtype /Link -/A << /S /GoTo /D (page.11) >> +/A << /S /GoTo /D (page.6) >> >> endobj -843 0 obj << +1223 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [213.605 154.383 225.56 164.765] +/Subtype /Link +/A << /S /GoTo /D (page.60) >> +>> endobj +1224 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.362 142.623 210.317 152.81] +/Subtype /Link +/A << /S /GoTo /D (page.23) >> +>> endobj +1225 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.038 130.473 189.993 140.854] +/Subtype /Link +/A << /S /GoTo /D (page.60) >> +>> endobj +1226 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [145.469 342.888 157.424 353.08] +/Rect [383.31 628.8 395.266 638.986] +/Subtype /Link +/A << /S /GoTo /D (page.23) >> +>> endobj +1227 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [398.553 616.845 410.509 627.031] +/Subtype /Link +/A << /S /GoTo /D (page.61) >> +>> endobj +1228 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [398.553 604.695 410.509 615.076] /Subtype /Link /A << /S /GoTo /D (page.15) >> >> endobj -844 0 obj << +1229 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [160.413 342.888 172.368 353.08] +/Rect [398.553 592.739 410.509 603.121] /Subtype /Link -/A << /S /GoTo /D (page.16) >> +/A << /S /GoTo /D (page.61) >> >> endobj -845 0 obj << +1230 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [175.955 330.803 182.929 341.125] +/Rect [393.472 580.784 405.428 591.166] /Subtype /Link -/A << /S /GoTo /D (page.6) >> +/A << /S /GoTo /D (page.60) >> >> endobj -846 0 obj << +1231 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [185.917 330.803 197.873 341.125] +/Rect [403.634 568.749 415.59 579.21] /Subtype /Link /A << /S /GoTo /D (page.11) >> >> endobj -847 0 obj << +1232 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [167.293 318.464 174.267 329.169] +/Rect [393.781 556.476 405.736 567.36] /Subtype /Link -/A << /S /GoTo /D (page.6) >> +/A << /S /GoTo /D (page.26) >> >> endobj -848 0 obj << +1233 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [128.433 306.558 135.407 317.214] +/Rect [347.744 545.114 359.699 555.3] /Subtype /Link -/A << /S /GoTo /D (page.5) >> +/A << /S /GoTo /D (page.35) >> >> endobj -849 0 obj << +1234 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [160.712 294.938 167.686 305.259] +/Rect [378.229 532.964 390.185 543.345] /Subtype /Link -/A << /S /GoTo /D (page.5) >> +/A << /S /GoTo /D (page.64) >> >> endobj -850 0 obj << +1235 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.036 282.983 192.991 293.304] +/Rect [388.391 521.203 400.347 531.39] /Subtype /Link -/A << /S /GoTo /D (page.46) >> +/A << /S /GoTo /D (page.45) >> >> endobj -851 0 obj << +1236 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [186.117 271.157 198.072 281.349] +/Rect [398.553 509.053 410.509 519.435] /Subtype /Link -/A << /S /GoTo /D (page.47) >> +/A << /S /GoTo /D (page.60) >> >> endobj -852 0 obj << +1237 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [186.117 259.072 198.072 269.394] +/Rect [362.987 497.293 374.942 507.479] /Subtype /Link -/A << /S /GoTo /D (page.47) >> +/A << /S /GoTo /D (page.30) >> >> endobj -853 0 obj << +1238 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.036 247.117 192.991 257.438] +/Rect [383.31 485.338 395.266 495.524] /Subtype /Link -/A << /S /GoTo /D (page.46) >> +/A << /S /GoTo /D (page.23) >> >> endobj -854 0 obj << +1239 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [191.198 235.162 198.171 245.483] +/Rect [388.391 473.188 400.347 483.569] /Subtype /Link -/A << /S /GoTo /D (page.8) >> +/A << /S /GoTo /D (page.23) >> >> endobj -855 0 obj << +1240 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.344 222.709 193.3 233.593] +/Rect [357.906 461.427 369.861 471.614] /Subtype /Link -/A << /S /GoTo /D (page.21) >> +/A << /S /GoTo /D (page.52) >> >> endobj -856 0 obj << +1241 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [175.955 211.381 187.91 221.573] +/Rect [373.148 449.472 385.104 459.659] /Subtype /Link -/A << /S /GoTo /D (page.33) >> +/A << /S /GoTo /D (page.35) >> >> endobj -857 0 obj << +1242 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.825 437.517 364.78 447.704] +/Subtype /Link +/A << /S /GoTo /D (page.14) >> +>> endobj +1243 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [150.55 199.426 162.505 209.618] +/Rect [368.068 425.562 380.023 435.748] +/Subtype /Link +/A << /S /GoTo /D (page.14) >> +>> endobj +1244 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.011 425.562 394.967 435.748] +/Subtype /Link +/A << /S /GoTo /D (page.32) >> +>> endobj +1245 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 413.412 374.942 423.793] +/Subtype /Link +/A << /S /GoTo /D (page.60) >> +>> endobj +1246 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.825 401.651 364.78 411.838] /Subtype /Link /A << /S /GoTo /D (page.23) >> >> endobj -858 0 obj << +1247 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [145.469 187.471 157.424 197.663] +/Rect [383.31 389.696 395.266 399.883] /Subtype /Link -/A << /S /GoTo /D (page.39) >> +/A << /S /GoTo /D (page.71) >> >> endobj -859 0 obj << +1248 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.388 175.516 152.344 185.707] +/Rect [388.391 377.741 400.347 387.928] /Subtype /Link -/A << /S /GoTo /D (page.11) >> +/A << /S /GoTo /D (page.71) >> >> endobj -860 0 obj << +1249 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [150.55 163.431 162.505 173.752] +/Rect [357.906 365.591 369.861 375.973] /Subtype /Link -/A << /S /GoTo /D (page.46) >> +/A << /S /GoTo /D (page.23) >> >> endobj -861 0 obj << +1250 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.388 151.605 152.344 161.797] +/Rect [383.31 343.868 395.266 354.055] /Subtype /Link -/A << /S /GoTo /D (page.16) >> +/A << /S /GoTo /D (page.59) >> >> endobj -862 0 obj << +1251 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [170.874 139.65 182.829 149.842] +/Rect [357.906 331.913 369.861 342.1] /Subtype /Link -/A << /S /GoTo /D (page.50) >> +/A << /S /GoTo /D (page.34) >> >> endobj -863 0 obj << +1252 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [175.955 127.695 187.91 137.887] +/Rect [383.31 319.958 395.266 330.144] /Subtype /Link -/A << /S /GoTo /D (page.50) >> +/A << /S /GoTo /D (page.45) >> >> endobj -864 0 obj << +1253 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 308.003 374.942 318.189] +/Subtype /Link +/A << /S /GoTo /D (page.58) >> +>> endobj +1254 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.31 296.048 395.266 306.234] +/Subtype /Link +/A << /S /GoTo /D (page.58) >> +>> endobj +1255 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [357.905 625.698 369.86 636.019] +/Rect [383.31 283.898 395.266 294.279] +/Subtype /Link +/A << /S /GoTo /D (page.34) >> +>> endobj +1256 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.068 272.137 380.023 282.324] /Subtype /Link /A << /S /GoTo /D (page.16) >> >> endobj -865 0 obj << +1257 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.011 272.137 394.967 282.324] +/Subtype /Link +/A << /S /GoTo /D (page.42) >> +>> endobj +1258 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [397.955 272.137 409.911 282.324] +/Subtype /Link +/A << /S /GoTo /D (page.43) >> +>> endobj +1259 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [383.31 603.909 395.265 614.101] +/Rect [398.553 259.987 410.509 270.369] /Subtype /Link /A << /S /GoTo /D (page.45) >> >> endobj -866 0 obj << +1260 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [357.905 591.954 369.86 602.146] +/Rect [352.265 247.73 359.239 258.852] /Subtype /Link -/A << /S /GoTo /D (page.24) >> +/A << /S /GoTo /D (page.7) >> >> endobj -867 0 obj << +1261 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [383.31 579.999 395.265 590.191] +/Rect [383.31 236.077 395.266 246.458] /Subtype /Link -/A << /S /GoTo /D (page.33) >> +/A << /S /GoTo /D (page.46) >> >> endobj -868 0 obj << +1262 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [362.986 568.044 374.941 578.235] +/Rect [362.987 224.316 374.942 234.503] /Subtype /Link -/A << /S /GoTo /D (page.44) >> +/A << /S /GoTo /D (page.14) >> >> endobj -869 0 obj << +1263 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [383.31 556.089 395.265 566.28] +/Rect [357.906 212.361 369.861 222.548] /Subtype /Link -/A << /S /GoTo /D (page.45) >> +/A << /S /GoTo /D (page.16) >> >> endobj -870 0 obj << +1264 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [383.31 544.004 395.265 554.325] +/Rect [378.229 200.406 390.185 210.593] /Subtype /Link -/A << /S /GoTo /D (page.25) >> +/A << /S /GoTo /D (page.58) >> >> endobj -871 0 obj << +1265 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [368.067 532.178 380.022 542.37] +/Rect [362.987 188.451 374.942 198.638] /Subtype /Link -/A << /S /GoTo /D (page.12) >> +/A << /S /GoTo /D (page.59) >> >> endobj -872 0 obj << +1266 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [383.011 532.178 394.966 542.37] +/Rect [368.068 176.301 380.023 186.682] /Subtype /Link -/A << /S /GoTo /D (page.30) >> +/A << /S /GoTo /D (page.59) >> >> endobj -873 0 obj << +1267 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [397.955 532.178 409.91 542.37] +/Rect [357.906 164.541 369.861 174.727] /Subtype /Link -/A << /S /GoTo /D (page.31) >> +/A << /S /GoTo /D (page.34) >> >> endobj -874 0 obj << +1268 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [398.553 520.094 410.508 530.415] +/Rect [378.229 152.585 390.185 162.772] /Subtype /Link /A << /S /GoTo /D (page.33) >> >> endobj -875 0 obj << +1269 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [352.166 507.678 359.14 518.46] +/Rect [347.395 140.63 354.369 151.256] /Subtype /Link -/A << /S /GoTo /D (page.6) >> +/A << /S /GoTo /D (page.7) >> >> endobj -876 0 obj << +1270 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [383.31 496.183 395.265 506.504] +/Rect [347.744 128.675 359.699 138.862] /Subtype /Link /A << /S /GoTo /D (page.33) >> >> endobj -877 0 obj << +1182 0 obj << +/D [1180 0 R /XYZ 108 690.907 null] +>> endobj +330 0 obj << +/D [1180 0 R /XYZ 108 657.93 null] +>> endobj +1179 0 obj << +/Font << /F94 409 0 R /F105 415 0 R /F107 429 0 R /F90 426 0 R /F120 538 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1274 0 obj << +/Length 4003 +/Filter /FlateDecode +>> +stream +xÚ¥]ÛŽã¸}Ÿ¯èÇn fDR×Ç\6A‚ ²ó–̓ږ»±Û†í™Åîׇ’x)‘Ue®ôÚgNQGÅb‘ÒñʧÂü'ŸdÑ>Õ]!º¢yÚž>Ooæ×ý$íÇ›ñó
+Ñ*C=Âþõ²©ÕôS>ÿ0ýüçô›?O?ÿ6ýüÓôsþôGOç£ëº]gùZ=>ýðÙ¿*JöêÆÏ“«“æï(ëv¾<%:Ù=ÕU- +=_ÞOR—»kÿóö|<_ý˜:3¦é+s‰ÒéwñˆdÕŠFz:sþäúö4ÿåßPü¼h§¿ŽAUD[Q› +QN Ù`÷¡’N±˜$®ˆR2‡ËmX-ÈÌ–«‡GÓr„á)Eªáy1–±p-¤™uÄøØmÏÃöŽL—J´=_j-ó±c| ˆEo +¶Hé¬D£::´¨Uà{”3zàH>,)ǸRb5ªêŒ$ÄŒIÂá’TÒ,8],É©[Ÿ–271œN0ʺ!$01I…ÃUÑ0bDªÏçËÚUÅ1f®* +ŽÇö‡ãñ;ÎO-[Þ”`jF€Áч§†žQ¨H‰öI·µÐö̉‘àQ©œm¹2EhR08Mˈ¸hÑL™45KsæEZ47¢œ.3]!Ûq~4üeZL®XÎwݔ¦ûx‘ÏýËF>#
ƒlÌàè†A›–\kGø¨úÍàM@#ÅoA8M¥Ð•¹ÌM•°8^j%Jpì·ÿú±½Îk[Ç—Ù* +ƒRŠ½L‡IÂá÷¿î̯À|ÛìµõÁ‘eÖ +—æò]ÒXæLiš”•‘&1ÒDÑpiôØ¢ÄYski½ö¿¤ºŒ;¡†n?LRæcÇû¨ÀÌè
€£…
RN§YezCª„q‘ú2A’`¸0ÊÜ~pÜ „ùÖ_ýëquÎXæÌœ h2gÀPkEæL br&Š†KcÂÖàØóíÚ_Þ¿£ww|™½;€“½;"Ý»&ºwÃ%G=²kDc¿üTTÅ,…Tqìùf«ïÚ‡Dú:Q0}Y-J³Z¸á<~Z7¢7 +…+¡›Å‹‡£—óáã~[û\Û1f>×pò¹6¤$ß Lôsí8.ŠZN³V¯!*{½¶Pºv¨úQÝPèì¥2+Àøú +ø0ÑHõrm´4{¬ñíßèµÿ÷þö~$_s'Û_mFܵ:óµ‡fßû)§b’쯵Ʉ®¬Øÿ†ñß+½øÿÞß·ï¿u«¹˜ç½öïÐìkÿ1%þtgTUc^ûwþµ¯‡VBªf©õds,)¤&M'”ÉGGø@‹Þ +àd}…c”d}Lt}ÃášL‡ O·û™>}jé©Ó‰¢|¦ÎŒÞ +˜©3c’p¸$ºžš°…$o×þ´zêXÂÜ©àôÔcL_0ðS'01S' +‡kûÓþrºœo÷µS'˦ãˆ)ñ'ƒ~ê0¾€0u8_€Ó¤ìLAñ±¿ßÛaí¢ãè2 +»ÄýcØãïäL¯ ÔÕ°T¹j8,I5£."" +C+:³CʼL‹~wI9ímUZZѶ™“„ÃozՊ®áãMﯗ3ö¾_)§6¯ñl±è
€§‚D”Ä}ŸÖœ +b1|¸ˆ¿ÌÎTo£hæeZôƒ¸KJü¾—…AIÍ^¦Ã$áðûÓ}?Ÿ¿üöÚ77=y~ßGq~Ž˜’šísÄù9|ņ‹ˆÈä.Æ7ûó.Ó¢ù¸%1ÛÇu¬á¯r†ð¦¿äE¦•ãðm8Nž¬Æ(϶â#ηSNoçJª1âŒ+¾1b+^“ȸr¤;ÙW/µ™r]¡2+ÍzIbJê°Óûºd+“„Ãþ•QÃÛû}¸šýø{ÀV›%FÑËB'tÛfz[šõ¶Ä”ÄÙ^7šýXk‹…ðÎ'Jäl!öáyâY¾Î["©TVÔi8ãlñ‡áœ³Å+œ“§þúå¶v¾äY?ü|á¬1å$GKÍÎúáçK¤®ÌÞ4¼»}ê¿—áº>îÛóédþHÅéjQiòx¢”h›ÀÌ‹ãÐ +c™ªp– ¯Jd™UöFâÁ}ž*Yn ¯ +ã–ˆ§Ö¤!UaÜAÎ-áU‰ÜÔ—f–Ø,D(±ŒG"¦Ä¿~Ë—XÆ$J,ç’ð‚D. ú
óÚ’<o„oK8sDL‰»¡k98w„oKXw„—$rG8IvkÆæÙ#üÃXÎSšØœ=Â?ŒeíNh °š`ß0•·çüJÌbJükÝ*ËüJ̼‘ÁaÒcÛ_Æ/I¸}ÁlÎy;â<³ƒßsf‡˜rJ•‚Úsf¿#fÃEDøeªRÔfï•y™ÍÇ(§Â™^¦6(É{:†÷tøˆ<Sì†×¯oûÑe†$€ª«è0ÁµÌ´v84kíˆ)Ño³¤–¼³Ãaxg‡&rvaîׯkÛ±<o‡k<8kGDHˆRŠjTŽ1v8oìð¢,³&×~¿ö]–,k‡?$b¼!*ǸT(sUŒ·ÃAØPKòQÃxДw}îTŠ
º œþçØÓgÉ_ÞŒ`+þVGΕé^›Æ»?®½×YÆ•p³ãJLÉßnÆ·î7-"âïxÞUú[ÎÆ]R²7»Hw×9oŽ¿í**yïÃøÈ0³ÉG¯`<¶çø×/({¤ÂWE÷¶aÏÙ¨¶ž_¹Ÿ´è×ø¶ç¾ónH:p +endstream +endobj +1273 0 obj << +/Type /Page +/Contents 1274 0 R +/Resources 1272 0 R +/MediaBox [0 0 612 792] +/Parent 1271 0 R +/Annots [ 1276 0 R 1277 0 R 1278 0 R 1279 0 R 1280 0 R 1281 0 R 1282 0 R 1283 0 R 1284 0 R 1285 0 R 1286 0 R 1287 0 R 1288 0 R 1289 0 R 1290 0 R 1291 0 R 1292 0 R 1293 0 R 1294 0 R 1295 0 R 1296 0 R 1297 0 R 1298 0 R 1299 0 R 1300 0 R 1301 0 R 1302 0 R 1303 0 R 1304 0 R 1305 0 R 1306 0 R 1307 0 R 1308 0 R 1309 0 R 1310 0 R 1311 0 R 1312 0 R 1313 0 R 1314 0 R 1315 0 R 1316 0 R 1317 0 R 1318 0 R 1319 0 R 1320 0 R 1321 0 R 1322 0 R 1323 0 R 1324 0 R 1325 0 R 1326 0 R 1327 0 R 1328 0 R 1329 0 R 1330 0 R 1331 0 R 1332 0 R 1333 0 R 1334 0 R 1335 0 R 1336 0 R 1337 0 R 1338 0 R 1339 0 R 1340 0 R 1341 0 R 1342 0 R 1343 0 R 1344 0 R 1345 0 R 1346 0 R 1347 0 R 1348 0 R 1349 0 R 1350 0 R 1351 0 R 1352 0 R 1353 0 R 1354 0 R 1355 0 R 1356 0 R 1357 0 R 1358 0 R 1359 0 R 1360 0 R 1361 0 R 1362 0 R 1363 0 R 1364 0 R 1365 0 R 1366 0 R 1367 0 R 1368 0 R 1369 0 R ] +>> endobj +1276 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.714 653.602 169.669 663.788] +/Subtype /Link +/A << /S /GoTo /D (page.26) >> +>> endobj +1277 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.552 641.452 159.507 651.833] +/Subtype /Link +/A << /S /GoTo /D (page.57) >> +>> endobj +1278 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.552 620.19 159.507 630.571] +/Subtype /Link +/A << /S /GoTo /D (page.22) >> +>> endobj +1279 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.795 608.429 174.75 618.616] +/Subtype /Link +/A << /S /GoTo /D (page.30) >> +>> endobj +1280 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.714 596.474 169.669 606.661] +/Subtype /Link +/A << /S /GoTo /D (page.52) >> +>> endobj +1281 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [362.986 484.358 374.941 494.549] +/Rect [157.714 584.324 169.669 594.706] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +1282 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 572.369 179.831 582.75] +/Subtype /Link +/A << /S /GoTo /D (page.52) >> +>> endobj +1283 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.633 560.414 164.588 570.795] /Subtype /Link /A << /S /GoTo /D (page.11) >> >> endobj -878 0 obj << +1284 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 548.378 179.831 558.84] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +1285 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.795 536.503 174.75 546.885] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +1286 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 524.548 179.831 534.93] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +1287 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.795 512.593 174.75 522.975] +/Subtype /Link +/A << /S /GoTo /D (page.63) >> +>> endobj +1288 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.552 500.833 159.507 511.019] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +1289 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [357.905 472.402 369.86 482.594] +/Rect [178.038 488.683 189.993 499.064] /Subtype /Link /A << /S /GoTo /D (page.13) >> >> endobj -879 0 obj << +1290 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [378.229 460.447 390.184 470.639] +/Rect [162.795 476.728 174.75 487.109] /Subtype /Link -/A << /S /GoTo /D (page.45) >> +/A << /S /GoTo /D (page.13) >> >> endobj -880 0 obj << +1291 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [362.986 448.492 374.941 458.684] +/Rect [167.876 464.772 179.831 475.154] /Subtype /Link -/A << /S /GoTo /D (page.45) >> +/A << /S /GoTo /D (page.47) >> >> endobj -881 0 obj << +1292 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [368.067 436.407 380.022 446.729] +/Rect [152.633 443.705 164.588 453.892] /Subtype /Link -/A << /S /GoTo /D (page.45) >> +/A << /S /GoTo /D (page.23) >> >> endobj -882 0 obj << +1293 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [357.905 424.582 369.86 434.773] +/Rect [157.714 431.555 169.669 441.937] /Subtype /Link -/A << /S /GoTo /D (page.25) >> +/A << /S /GoTo /D (page.61) >> >> endobj -883 0 obj << +1294 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [345.271 412.627 352.245 422.818] +/Rect [132.309 419.795 144.264 429.982] /Subtype /Link -/A << /S /GoTo /D (page.6) >> +/A << /S /GoTo /D (page.38) >> >> endobj -884 0 obj << +1295 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [347.743 400.671 359.699 410.863] +/Rect [162.615 407.123 174.57 418.026] /Subtype /Link -/A << /S /GoTo /D (page.24) >> +/A << /S /GoTo /D (page.28) >> >> endobj -885 0 obj << +1296 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [373.148 388.716 385.103 398.908] +/Rect [157.714 395.885 169.669 406.071] /Subtype /Link -/A << /S /GoTo /D (page.20) >> +/A << /S /GoTo /D (page.26) >> >> endobj -886 0 obj << +1297 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [362.986 376.632 374.941 386.953] +/Rect [157.714 383.929 169.669 394.116] /Subtype /Link -/A << /S /GoTo /D (page.44) >> +/A << /S /GoTo /D (page.36) >> >> endobj -887 0 obj << +1298 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [362.986 354.714 374.941 365.035] +/Rect [172.658 383.929 184.613 394.116] /Subtype /Link -/A << /S /GoTo /D (page.16) >> +/A << /S /GoTo /D (page.37) >> >> endobj -888 0 obj << +1299 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [378.229 342.888 390.184 353.08] +/Rect [129.637 371.974 136.611 382.6] /Subtype /Link -/A << /S /GoTo /D (page.23) >> +/A << /S /GoTo /D (page.7) >> >> endobj -889 0 obj << +1300 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [373.148 330.933 385.103 341.125] +/Rect [152.633 360.019 164.588 370.206] /Subtype /Link -/A << /S /GoTo /D (page.39) >> +/A << /S /GoTo /D (page.40) >> >> endobj -890 0 obj << +1301 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [383.31 318.848 395.265 329.169] +/Rect [137.39 338.482 149.345 348.944] /Subtype /Link -/A << /S /GoTo /D (page.39) >> +/A << /S /GoTo /D (page.24) >> >> endobj -891 0 obj << +1302 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [368.067 306.893 375.041 317.214] +/Rect [152.633 326.527 164.588 336.989] /Subtype /Link -/A << /S /GoTo /D (page.9) >> +/A << /S /GoTo /D (page.25) >> >> endobj -892 0 obj << +1303 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [378.229 294.938 390.184 305.259] +/Rect [142.471 314.572 154.426 325.034] /Subtype /Link -/A << /S /GoTo /D (page.48) >> +/A << /S /GoTo /D (page.36) >> >> endobj -893 0 obj << +1304 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [362.986 283.112 374.941 293.304] +/Rect [137.39 302.616 149.345 313.078] /Subtype /Link -/A << /S /GoTo /D (page.50) >> +/A << /S /GoTo /D (page.36) >> >> endobj -894 0 obj << +1305 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [383.31 271.028 395.265 281.349] +/Rect [157.714 290.661 169.669 301.123] /Subtype /Link /A << /S /GoTo /D (page.35) >> >> endobj -895 0 obj << +1306 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [368.067 249.239 380.022 259.431] +/Rect [183.119 278.706 195.074 289.168] /Subtype /Link -/A << /S /GoTo /D (page.17) >> +/A << /S /GoTo /D (page.73) >> >> endobj -896 0 obj << +1307 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [347.743 237.284 359.699 247.476] +/Rect [198.063 278.706 210.018 289.168] /Subtype /Link -/A << /S /GoTo /D (page.28) >> +/A << /S /GoTo /D (page.78) >> >> endobj -897 0 obj << +1308 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [373.148 225.329 385.103 235.521] +/Rect [137.39 266.751 149.345 277.213] /Subtype /Link -/A << /S /GoTo /D (page.20) >> +/A << /S /GoTo /D (page.36) >> >> endobj -898 0 obj << +1309 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [373.148 213.374 385.103 223.565] +/Rect [208.524 254.796 220.479 265.258] /Subtype /Link -/A << /S /GoTo /D (page.26) >> +/A << /S /GoTo /D (page.70) >> >> endobj -899 0 obj << +1310 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [388.092 213.374 400.047 223.565] +/Rect [208.524 242.841 220.479 253.303] /Subtype /Link -/A << /S /GoTo /D (page.27) >> +/A << /S /GoTo /D (page.70) >> >> endobj -900 0 obj << +1311 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [343.864 201.419 350.838 211.61] +/Rect [193.281 230.885 205.236 241.347] /Subtype /Link -/A << /S /GoTo /D (page.6) >> +/A << /S /GoTo /D (page.64) >> >> endobj -901 0 obj << +1312 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [368.067 189.463 380.022 199.655] +/Rect [208.524 218.93 220.479 229.392] /Subtype /Link -/A << /S /GoTo /D (page.29) >> +/A << /S /GoTo /D (page.62) >> >> endobj -902 0 obj << +1313 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [357.905 167.416 369.86 177.737] +/Rect [152.633 206.975 164.588 217.437] /Subtype /Link -/A << /S /GoTo /D (page.26) >> +/A << /S /GoTo /D (page.25) >> >> endobj -903 0 obj << +1314 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [352.824 155.461 364.779 165.782] +/Rect [147.452 194.702 159.407 205.482] /Subtype /Link /A << /S /GoTo /D (page.26) >> >> endobj -904 0 obj << +1315 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [373.148 143.506 385.103 153.827] +/Rect [132.309 183.065 144.264 193.527] /Subtype /Link -/A << /S /GoTo /D (page.25) >> +/A << /S /GoTo /D (page.19) >> >> endobj -905 0 obj << +1316 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [398.553 131.551 410.508 141.872] +/Rect [152.633 171.11 164.588 181.572] /Subtype /Link -/A << /S /GoTo /D (page.52) >> +/A << /S /GoTo /D (page.19) >> >> endobj -906 0 obj << +1317 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [413.497 131.551 425.452 141.872] +/Rect [167.876 159.154 179.831 169.616] +/Subtype /Link +/A << /S /GoTo /D (page.59) >> +>> endobj +1318 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.714 147.199 169.669 157.661] +/Subtype /Link +/A << /S /GoTo /D (page.19) >> +>> endobj +1319 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.795 135.244 174.75 145.706] +/Subtype /Link +/A << /S /GoTo /D (page.19) >> +>> endobj +1320 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.633 123.289 164.588 133.751] +/Subtype /Link +/A << /S /GoTo /D (page.19) >> +>> endobj +1321 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 653.602 374.942 663.788] /Subtype /Link /A << /S /GoTo /D (page.58) >> >> endobj -820 0 obj << -/D [818 0 R /XYZ 110.999 687.904 null] +1322 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.825 641.646 364.78 651.833] +/Subtype /Link +/A << /S /GoTo /D (page.37) >> >> endobj -298 0 obj << -/D [818 0 R /XYZ 110.999 654.928 null] +1323 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.229 629.691 390.185 639.878] +/Subtype /Link +/A << /S /GoTo /D (page.26) >> >> endobj -817 0 obj << -/Font << /F78 368 0 R /F85 373 0 R /F88 386 0 R /F87 383 0 R /F101 484 0 R >> -/ProcSet [ /PDF /Text ] +1324 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.229 617.541 390.185 627.923] +/Subtype /Link +/A << /S /GoTo /D (page.59) >> >> endobj -909 0 obj << -/Length 1742 -/Filter /FlateDecode ->> -stream -xÚíœKoÜ6€ïù{´˜åûqì#
ÚCQ´¾5=hµ”W^ä¸î¯ïH¶7¶—tDaÉ&AÀ^Ä4Åof83œ¡L6þ‘
!c6R+d0ßäõ+¼¹‚½}Eî‡`D)‡Oð£ï._}ó£ÒŒ”›Ëbq¹û㌟_,ðÙ·ç^þ<Qˆ(6
¡iz?ì×óIæ¯ôìÍüù—ùóóןæ¯ß?úéï‡éOdÂÀ‚&”lñêÍåaµL¤à°å‚°fð#-ÍIë
L+Ùc¦w„ñ«¢¬ªÃ"CF\‹ûq¯– —ênwÿ×_mî>üöö ãçQù|¢iõpx5›BâÓ }Öí·YÌ)ª},#…M0Ñ.æa CîYä‹,Àqû,펃`òq‰`þ0înÀã)82C„)ȱ(&Û >IpÐ9×áZ%’à`Ü˵ZîŽ1žâØ:1bZ†kTY'<„‘õùÊ:EˆN$FR…é¤*ë€åêy¹n@ÎÏ,ˆ¥kËftÁ¤½, 3Hda<¼ÇçmdXˆþ$Ë>ö•m(0W^&¤á(<hï?ñæbʘïS…Xµ:ÄÊe y[µ}šÍBqÄÍ2Ã]–Û40\Ć¹Ù¥Ú-<æn±ÙÎgc¢K˜F—‰%¡‹–aŸu6ZÜ,‹Ô²À½”Á|iA_c»òÜCNt졧I,g8ÿÔ‰K½ÆÆæ/eQ]ݵØÆÆ]ccaªlKW ŒâÇHÌd¬Ê«v°©"%e1Q|‰%L#å§|±æ””XÂv åÕ~´=„—ÃƤDXPŽ"39ÓS Qð8CËœðË'ü$¨ú2%üËÓ—ªÎú÷C"#l…-ô_uöÞv¶Ïm3æm]÷c(#‘`ÞhI0†; -DÇèâälbl>¦:d®Ëž+Hwj;fîøÏ$¬Ôkjœ -VdÌGóÜWƒÛ–Oì¬ØÚJ›(Çä*bŽYy½Kä›Ý §ñÍuQ•NÛŠá›yÄà_íö¯T -Y,ø¢Ûecæ/J"J¼=M1"Ü»'Bhf&‚ -endobj -908 0 obj << -/Type /Page -/Contents 909 0 R -/Resources 907 0 R -/MediaBox [0 0 612 792] -/Parent 802 0 R -/Annots [ 911 0 R 912 0 R 913 0 R 914 0 R 915 0 R 916 0 R 917 0 R 918 0 R 919 0 R 920 0 R 921 0 R 922 0 R 923 0 R 924 0 R 925 0 R 926 0 R 927 0 R 928 0 R 929 0 R 930 0 R 931 0 R 932 0 R 933 0 R 934 0 R 935 0 R 936 0 R 937 0 R 938 0 R 939 0 R 940 0 R 941 0 R 942 0 R 943 0 R 944 0 R 945 0 R 946 0 R 947 0 R 948 0 R 949 0 R 950 0 R 951 0 R 952 0 R 953 0 R 954 0 R 955 0 R 956 0 R 957 0 R 958 0 R 959 0 R 960 0 R 961 0 R 962 0 R 963 0 R 964 0 R 965 0 R 966 0 R 967 0 R 968 0 R 969 0 R 970 0 R 971 0 R 972 0 R 973 0 R 974 0 R 975 0 R 976 0 R 977 0 R 978 0 R 979 0 R 980 0 R 981 0 R 982 0 R 983 0 R 984 0 R 985 0 R 986 0 R 987 0 R 988 0 R 989 0 R 990 0 R 991 0 R 992 0 R 993 0 R 994 0 R 995 0 R 996 0 R 997 0 R ] +1325 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 605.781 374.942 615.968] +/Subtype /Link +/A << /S /GoTo /D (page.57) >> >> endobj -911 0 obj << +1326 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.388 650.504 152.344 660.825] +/Rect [373.148 593.826 385.104 604.012] /Subtype /Link /A << /S /GoTo /D (page.26) >> >> endobj -912 0 obj << +1327 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [155.631 638.549 167.586 648.87] +/Rect [362.987 581.871 374.942 592.057] /Subtype /Link -/A << /S /GoTo /D (page.18) >> +/A << /S /GoTo /D (page.58) >> >> endobj -913 0 obj << +1328 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [150.451 626.096 162.406 636.915] +/Rect [373.148 569.721 385.104 580.102] /Subtype /Link -/A << /S /GoTo /D (page.21) >> +/A << /S /GoTo /D (page.58) >> >> endobj -914 0 obj << +1329 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [135.307 614.639 147.263 624.96] +/Rect [378.229 557.685 390.185 568.147] /Subtype /Link -/A << /S /GoTo /D (page.15) >> +/A << /S /GoTo /D (page.19) >> >> endobj -915 0 obj << +1330 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [155.631 602.684 167.586 613.005] +/Rect [368.068 546.005 380.023 556.192] /Subtype /Link -/A << /S /GoTo /D (page.15) >> +/A << /S /GoTo /D (page.25) >> >> endobj -916 0 obj << +1331 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [160.712 590.729 172.667 601.05] +/Rect [373.148 533.775 385.104 544.237] /Subtype /Link -/A << /S /GoTo /D (page.15) >> +/A << /S /GoTo /D (page.24) >> >> endobj -917 0 obj << +1332 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.793 578.773 177.748 589.094] +/Rect [378.229 512.593 390.185 522.975] /Subtype /Link -/A << /S /GoTo /D (page.15) >> +/A << /S /GoTo /D (page.73) >> >> endobj -918 0 obj << +1333 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [155.631 566.818 167.586 577.139] +/Rect [362.987 491.526 374.942 501.713] /Subtype /Link -/A << /S /GoTo /D (page.15) >> +/A << /S /GoTo /D (page.19) >> >> endobj -919 0 obj << +1334 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [150.55 545.03 162.505 555.221] +/Rect [362.987 479.571 374.942 489.757] /Subtype /Link -/A << /S /GoTo /D (page.45) >> +/A << /S /GoTo /D (page.29) >> >> endobj -920 0 obj << +1335 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.388 533.075 152.344 543.266] +/Rect [362.987 467.616 374.942 477.802] /Subtype /Link -/A << /S /GoTo /D (page.27) >> +/A << /S /GoTo /D (page.14) >> >> endobj -921 0 obj << +1336 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.793 521.12 177.748 531.311] +/Rect [377.93 467.616 389.886 477.802] /Subtype /Link -/A << /S /GoTo /D (page.20) >> +/A << /S /GoTo /D (page.32) >> >> endobj -922 0 obj << +1337 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.793 509.035 177.748 519.356] +/Rect [383.31 455.466 395.266 465.847] /Subtype /Link -/A << /S /GoTo /D (page.45) >> +/A << /S /GoTo /D (page.14) >> >> endobj -923 0 obj << +1338 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [150.55 497.209 162.505 507.401] +/Rect [398.254 455.466 410.21 465.847] /Subtype /Link -/A << /S /GoTo /D (page.44) >> +/A << /S /GoTo /D (page.32) >> >> endobj -924 0 obj << +1339 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [160.712 485.254 172.667 495.446] +/Rect [368.068 443.705 380.023 453.892] /Subtype /Link -/A << /S /GoTo /D (page.20) >> +/A << /S /GoTo /D (page.14) >> >> endobj -925 0 obj << +1340 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [150.55 473.299 162.505 483.49] +/Rect [383.011 443.705 394.967 453.892] /Subtype /Link -/A << /S /GoTo /D (page.44) >> +/A << /S /GoTo /D (page.32) >> >> endobj -926 0 obj << +1341 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [160.712 461.214 172.667 471.535] +/Rect [378.229 431.75 390.185 441.937] /Subtype /Link -/A << /S /GoTo /D (page.44) >> +/A << /S /GoTo /D (page.41) >> >> endobj -927 0 obj << +1342 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.906 419.795 369.861 429.982] +/Subtype /Link +/A << /S /GoTo /D (page.37) >> +>> endobj +1343 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [388.391 407.565 400.347 418.026] +/Subtype /Link +/A << /S /GoTo /D (page.59) >> +>> endobj +1344 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.793 449.259 177.748 459.58] +/Rect [352.825 395.885 364.78 406.071] /Subtype /Link /A << /S /GoTo /D (page.15) >> >> endobj -928 0 obj << +1345 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [155.631 437.433 167.586 447.625] +/Rect [357.906 383.929 369.861 394.116] /Subtype /Link /A << /S /GoTo /D (page.18) >> >> endobj -929 0 obj << +1346 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [160.712 425.349 172.667 435.67] +/Rect [418.877 362.473 430.833 372.854] /Subtype /Link -/A << /S /GoTo /D (page.18) >> +/A << /S /GoTo /D (page.44) >> >> endobj -930 0 obj << +1347 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.793 403.431 177.748 413.752] +/Rect [408.715 350.518 420.671 360.899] /Subtype /Link -/A << /S /GoTo /D (page.52) >> +/A << /S /GoTo /D (page.44) >> >> endobj -931 0 obj << +1348 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [150.55 381.643 162.505 391.834] +/Rect [378.229 338.757 390.185 348.944] /Subtype /Link -/A << /S /GoTo /D (page.15) >> +/A << /S /GoTo /D (page.29) >> >> endobj -932 0 obj << +1349 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [150.55 369.687 162.505 379.879] +/Rect [365.96 326.305 372.934 336.989] /Subtype /Link -/A << /S /GoTo /D (page.23) >> +/A << /S /GoTo /D (page.5) >> >> endobj -933 0 obj << +1350 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.068 314.847 380.023 325.034] +/Subtype /Link +/A << /S /GoTo /D (page.61) >> +>> endobj +1351 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.825 302.892 364.78 313.078] +/Subtype /Link +/A << /S /GoTo /D (page.62) >> +>> endobj +1352 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.906 290.937 369.861 301.123] +/Subtype /Link +/A << /S /GoTo /D (page.62) >> +>> endobj +1353 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.825 278.655 364.78 289.168] +/Subtype /Link +/A << /S /GoTo /D (page.54) >> +>> endobj +1354 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [398.553 266.831 410.509 277.213] +/Subtype /Link +/A << /S /GoTo /D (page.43) >> +>> endobj +1355 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [398.553 254.876 410.509 265.258] +/Subtype /Link +/A << /S /GoTo /D (page.59) >> +>> endobj +1356 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [145.469 357.732 157.424 367.924] +/Rect [398.553 242.921 410.509 253.303] /Subtype /Link /A << /S /GoTo /D (page.27) >> >> endobj -934 0 obj << +1357 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [175.955 345.648 187.91 355.969] +/Rect [357.906 230.966 369.861 241.347] /Subtype /Link -/A << /S /GoTo /D (page.45) >> +/A << /S /GoTo /D (page.68) >> >> endobj -935 0 obj << +1358 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.068 219.011 380.023 229.392] +/Subtype /Link +/A << /S /GoTo /D (page.52) >> +>> endobj +1359 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.388 333.822 152.344 344.014] +/Rect [373.148 207.056 385.104 217.437] +/Subtype /Link +/A << /S /GoTo /D (page.52) >> +>> endobj +1360 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.825 195.1 364.78 205.482] /Subtype /Link /A << /S /GoTo /D (page.11) >> >> endobj -936 0 obj << +1361 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [145.469 321.867 157.424 332.058] +/Rect [408.715 183.145 420.671 193.527] /Subtype /Link -/A << /S /GoTo /D (page.13) >> +/A << /S /GoTo /D (page.50) >> >> endobj -937 0 obj << +1362 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [206.44 299.819 218.396 310.141] +/Rect [423.659 183.145 435.615 193.527] /Subtype /Link -/A << /S /GoTo /D (page.32) >> +/A << /S /GoTo /D (page.60) >> >> endobj -938 0 obj << +1363 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [196.279 287.864 208.234 298.185] +/Rect [403.634 171.11 410.608 181.448] /Subtype /Link -/A << /S /GoTo /D (page.32) >> +/A << /S /GoTo /D (page.7) >> >> endobj -939 0 obj << +1364 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.793 276.039 177.748 286.23] +/Rect [398.553 159.154 405.527 169.492] /Subtype /Link -/A << /S /GoTo /D (page.18) >> +/A << /S /GoTo /D (page.7) >> >> endobj -940 0 obj << +1365 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [151.862 263.619 158.836 274.275] +/Rect [378.229 147.28 385.203 157.661] /Subtype /Link -/A << /S /GoTo /D (page.4) >> +/A << /S /GoTo /D (page.7) >> >> endobj -941 0 obj << +1366 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [155.631 252.128 167.586 262.32] +/Rect [388.192 147.28 395.166 157.661] /Subtype /Link -/A << /S /GoTo /D (page.47) >> +/A << /S /GoTo /D (page.8) >> >> endobj -942 0 obj << +1367 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.388 240.173 152.344 250.365] +/Rect [378.229 135.325 385.203 145.706] /Subtype /Link -/A << /S /GoTo /D (page.47) >> +/A << /S /GoTo /D (page.7) >> >> endobj -943 0 obj << +1368 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [145.469 228.218 157.424 238.41] +/Rect [388.192 135.325 395.166 145.706] /Subtype /Link -/A << /S /GoTo /D (page.47) >> +/A << /S /GoTo /D (page.8) >> >> endobj -944 0 obj << +1369 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.388 216.133 152.344 226.454] +/Rect [383.31 123.289 395.266 133.751] /Subtype /Link -/A << /S /GoTo /D (page.41) >> +/A << /S /GoTo /D (page.60) >> >> endobj -945 0 obj << +1275 0 obj << +/D [1273 0 R /XYZ 108 690.907 null] +>> endobj +1272 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F90 426 0 R /F120 538 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1372 0 obj << +/Length 4155 +/Filter /FlateDecode +>> +stream +xÚ\Ks㸾ϯðÑ®ŠâÁ×1M*9¤¶’¹es%Ú£D–´”<^ï¯OƒÈ&Ð
aY[åõŒ¾ùøØèn +&–ψ‰ÌÑ’4Fè¢Â’§îzû<®N°ž3sù 8»|ð0MÉ-ÄÄ/ŸÐ-K„.e(ËíóÒÍ=ž23÷ 8›{ð( U\^AL|î ÍѪÀLu»t–óùB,ŸBT¦a1(ácOwG‡Þ x¬H@9,Ÿ–Êy¥”Øp¬ˆÃDæhEÀ®1?é»íþx~]f=cf˜Ep6ÌâA6”{ÖÖ—f"2#׃S†Ö +d
¶,¥®„iFùß^`;òxyRí#Hbß?ÉGRˆ¶jR•J[´ùýRÅ¢7NÖ*˜’QFÃÃfÉXÛ¶h_QF”zá+ï§Ûá¸:û8¾Üì3Ãù샆H,Ÿ}f¦Dö ÌÑ’H%ʺĒ@éö|ë~Y½|cîò™áüòAƒ4
W¥ &¾J ÍÑ¢=EÊÇ·Ãq}‘2ÒåzÉ„æd_Õ°>2ñ$\di‹ÃÀ–±ª°‡\û],….†õÇI¡¡ácOvG‡Þ x,F@9¨¡¨L§M‹
Çr8LdŽÖ£®ì.k–ãv¸‘¾‘•[fžÑlþEë—~g>û¶h-*Ë +ùÆ¡ïÏÄÙ€.EYÕ¼ˆë‰íž#zƒà„KÊa/¬©j4¶KÈ1@bcAÞ5¥‚PÕŽy÷rÜ>?mTýØÙ¤{„¤{%4½A¢f5PPv{Þ{šŒè
‚š,)ÇËH#”6Ø.¡Éˆ‰¬Ñ>¡1fö‘Ëùù¿«ã‡#Ë3œh|¥aãÇÌ”ˆ¹@ðÙŠÒU¶oÝþ§¢,œ%£…;. +yÔ<¦Š‰'¦PÒœÏLG‡c)¼ …$Ò½(‡Wu-šržÑ½æˆÞ 8±Ó\RZ»*Þ€7€R&vš#&2G;hQCœjNÝÇËþð¶:¢;ºÜ>Ãù˜ŽF˜ê3S"ªæHEt[Š +è"×í÷îrØ- +=cfQˆàlQˆ9º/U"&¾(ÍÑ¢4€Fçy§ó®;ݺ¾ÛﶗÛá|"b|[AÎÖ‡ª0[fæ´8½AðHœr(Šb»0 +›¤qÈL-EêePæØmûëçÛóùH¨……’%ë2>ö¬÷®OFôÁ‰ë“%%}IÔ´¢h+l—,#掵%=ËÖˆ¢nrgéÐi»åpb(§+Lr–£~ÙŠ¦X,‹ãá2v¯=§ó”™çtΞÓáQVT¬h 0BDd¬°˜È-Š±©L"Q†š°£VCf +Õò!¬2iW™£½&FôÁÉ…‹)igU• +¶ã0‘5Z¥Ek°³ôÛ××TZi*¡k~;Ö•¡ã½ZÔ0ÖN†LIÐÖî/l—PfÄDÖhe¤mƒ]¦ïN{êò9ï ÆóežÄ 8{ƒ‡¨5wƒ˜øØÐ-IQˆBcg¹~;\Öî¸=[æŽÁÙ7 uþ?l§»ã‘r¨¦œ‡=äÖ¿wÏÏçÕÇ—ž13Ð"8hñ +.Ð"">ÐFÖ‚S¥•tÛËó“j?ú'ùHvêØ=f¥’OÁfø‡}d3šv™ önCd”Üj[HhŠvŽ +Â0:¹<½¿uýa·íûíçÚ›UÏ™y³ŠàìÍ*fe¸›UÄÄ߬†æhYü¿Ð“,çKwzí·—o×ò;¯\÷¬™å:‚³å:¨”\˜ÈD<ÔÍ¡9ZX-l·'aÒõ TÇ +S²u‰‘öj¹¯&xt²i?¤PTÆÂnf¸XNuí{LºkÒ&èÚ¿º”aÙ€¢+(7+“Ù²ïÑÉ–ýr¸â‹ÎµsÁR-û“nÙŸ$ ZöA’n϶ߗ$«g–$Ñ´RÞ‘$ѵ?K’êÚŸ$ ºö/Ç3á!ª¦`÷~|m2›õ8Ù« 8*^µp•lÕ÷˜t«þ¤EЪoµØooÛÕî‘Õ¨?»G¢Q?¤ªWúG¢QvT£¾—$lÔ·’œÎûîJïo +¶NÓ5læM™Ù©ïÑÉNý’q{Š +û0´}`ŽóŽ,½AðX–€’~çØ]g¢X•£E‘Õð•'Q^ÇãËöxíÖæGš™cf4›cÐ(ãƒé)ÇÌD‰X£UB®ÛXÛ~´¶dõ¤™%+‚³%+'¥ËXŽ"&¾d
Í‘ºèV¼åzøµ[[ yÂÌ +
ÁÙ
1ÖÄ`ˆ‰/ÒBs´&„pÖ MŽÿÛîÏ«H<_f¤Ep6Òâ!êš‹´ˆ‰´¡9Z°+¥Ž$¹^¶»ÕËÇ“f.g—gÉîø¿|Bs´.e-d» +uñ—U¨xÂÌBÁÙB‘Z>c‚˜øB%4Gk«B_ù|=ŸÖž—xºÌógÏKð©:e<ALüyIhŽVDk¡ÌÂK>é;ÏÌ€âørÊç +"_º!¦D@I™s[>ì»ã¸ôÝOE¡~yÚ¨²x|Ûîú3¹< +SMÿîþò°è
‚“ËS3×Ôò(Š&—‡Å¤ÍDLdÔöK3g9‚ÓV—„Ã^¥‰Ã¢í,RÉ9zLÒZHD_ÜãWòåMÒ£ïØ]RÓŒ£¿l†w;’Ót˜È½®¡Õ¸©¡ï.Û¾Þ¥t©Wªd!E%ÙD`[l›‰ç¾#Co<–' ¤ßJ5P²Æ†cy&m. ¢§©[ºÍ¦Cß±»¤¦;»T%ÓÓt˜Èéªa›‡Î8ßoü·¤
/ÔI~joðê‰òÞ&tDoœˆ;KÊ¡©¥¢J2õb"v¡#&2G«R—ðWó‘ÖÏÏ»ãùÚí×æ<Ï—™óœÍyxˆqŸÏgˆ‰Ïy¡9ZÛdX´H’î×C×_WKâør%™á¼$hˆ If¦„$9Z’RŠ²œ·Ÿ?sÍ`yµ¢§Ë¬œñã/\ôu bâkÅÈ\FJµ¢ÒãU~«ðI>R/V +Š +þL«-d´‰ô^=1¢7NKJò½ ûz¾ÁV‰Xb‘%ÚGd-ªf¾mì·§ýùíðkGw!çí==iæÞÁÙ½'g-¹½'bâ÷ž¡9Z—ÂF‰*Ð…;üÌË;Ž27ïÌp>ï QƪLygfJäÀ©Š„Š·F_÷Ôw»óéåðúµÙ17¼µÌvÌÙGRi9ÑÞ«VGôÁ‰juIIÛfÔ²ÕØ0QŽ˜ÈÌ´‘Vfm¡§Ê»lChî¶
Ø~º»4DÄß·…Öh-ª±Â›µx9‚ÛçóûmíÍç̼9@pöæ +bâJhŽVÅ~Õ&å•=ÐÊ:ás|™|3š=ßC$–Ž;º›yøÓ½À†¶ +XŽëû[g_i¿N¯+o—<iÞíBs·Kx”UËÝ.!"â9Þ.éZ4
yX ‡ïº@üà. +endstream +endobj +1371 0 obj << +/Type /Page +/Contents 1372 0 R +/Resources 1370 0 R +/MediaBox [0 0 612 792] +/Parent 1271 0 R +/Annots [ 1374 0 R 1375 0 R 1376 0 R 1377 0 R 1378 0 R 1379 0 R 1380 0 R 1381 0 R 1382 0 R 1383 0 R 1384 0 R 1385 0 R 1386 0 R 1387 0 R 1388 0 R 1389 0 R 1390 0 R 1391 0 R 1392 0 R 1393 0 R 1394 0 R 1395 0 R 1396 0 R 1397 0 R 1398 0 R 1399 0 R 1400 0 R 1401 0 R 1402 0 R 1403 0 R 1404 0 R 1405 0 R 1406 0 R 1407 0 R 1408 0 R 1409 0 R 1410 0 R 1411 0 R 1412 0 R 1413 0 R 1414 0 R 1415 0 R 1416 0 R 1417 0 R 1418 0 R 1419 0 R 1420 0 R 1421 0 R 1422 0 R 1423 0 R 1424 0 R 1425 0 R 1426 0 R 1427 0 R 1428 0 R 1429 0 R 1430 0 R 1431 0 R 1432 0 R 1433 0 R 1434 0 R 1435 0 R 1436 0 R 1437 0 R 1438 0 R 1439 0 R 1440 0 R 1441 0 R 1442 0 R 1443 0 R 1444 0 R 1445 0 R 1446 0 R 1447 0 R 1448 0 R 1449 0 R 1450 0 R 1451 0 R 1452 0 R 1453 0 R 1454 0 R 1455 0 R 1456 0 R 1457 0 R 1458 0 R 1459 0 R 1460 0 R 1461 0 R 1462 0 R 1463 0 R 1464 0 R ] +>> endobj +1374 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [186.117 204.178 198.072 214.499] +/Rect [172.957 653.407 179.931 663.788] /Subtype /Link -/A << /S /GoTo /D (page.31) >> +/A << /S /GoTo /D (page.7) >> >> endobj -946 0 obj << +1375 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [186.117 192.223 198.072 202.544] +/Rect [182.919 653.407 189.893 663.788] /Subtype /Link -/A << /S /GoTo /D (page.46) >> +/A << /S /GoTo /D (page.8) >> >> endobj -947 0 obj << +1376 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [186.117 180.268 198.072 190.589] +/Rect [167.876 641.452 179.831 651.833] /Subtype /Link -/A << /S /GoTo /D (page.22) >> +/A << /S /GoTo /D (page.12) >> >> endobj -948 0 obj << +1377 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [155.631 168.313 167.586 178.634] +/Rect [157.714 629.496 169.669 639.878] /Subtype /Link -/A << /S /GoTo /D (page.39) >> +/A << /S /GoTo /D (page.57) >> >> endobj -949 0 obj << +1378 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [160.712 156.357 172.667 166.679] +/Rect [172.957 617.541 184.912 627.923] /Subtype /Link -/A << /S /GoTo /D (page.39) >> +/A << /S /GoTo /D (page.73) >> >> endobj -950 0 obj << +1379 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.388 144.402 147.362 154.723] +/Rect [162.795 605.586 174.75 615.968] /Subtype /Link -/A << /S /GoTo /D (page.9) >> +/A << /S /GoTo /D (page.60) >> >> endobj -951 0 obj << +1380 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [196.279 132.447 208.234 142.768] +/Rect [152.633 593.55 164.588 604.012] /Subtype /Link -/A << /S /GoTo /D (page.37) >> +/A << /S /GoTo /D (page.67) >> >> endobj -952 0 obj << +1381 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.957 581.676 184.912 592.057] +/Subtype /Link +/A << /S /GoTo /D (page.45) >> +>> endobj +1382 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 569.721 179.831 580.102] +/Subtype /Link +/A << /S /GoTo /D (page.45) >> +>> endobj +1383 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.552 557.765 159.507 568.147] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +1384 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.795 545.73 169.769 556.192] +/Subtype /Link +/A << /S /GoTo /D (page.8) >> +>> endobj +1385 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.913 533.553 164.887 544.675] +/Subtype /Link +/A << /S /GoTo /D (page.8) >> +>> endobj +1386 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.633 521.9 164.588 532.281] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +1387 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.795 509.945 174.75 520.326] +/Subtype /Link +/A << /S /GoTo /D (page.48) >> +>> endobj +1388 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.633 497.99 164.588 508.371] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +1389 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [403.634 650.504 410.607 660.825] +/Rect [137.39 486.229 149.345 496.416] +/Subtype /Link +/A << /S /GoTo /D (page.62) >> +>> endobj +1390 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.552 474.274 159.507 484.461] +/Subtype /Link +/A << /S /GoTo /D (page.72) >> +>> endobj +1391 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.471 462.319 154.426 472.506] +/Subtype /Link +/A << /S /GoTo /D (page.53) >> +>> endobj +1392 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.257 449.867 155.231 460.989] +/Subtype /Link +/A << /S /GoTo /D (page.5) >> +>> endobj +1393 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.39 438.082 149.345 448.595] +/Subtype /Link +/A << /S /GoTo /D (page.54) >> +>> endobj +1394 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [176.862 416.095 188.817 427.971] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +1395 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.552 405.191 159.507 415.378] +/Subtype /Link +/A << /S /GoTo /D (page.72) >> +>> endobj +1396 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.795 393.041 174.75 403.423] +/Subtype /Link +/A << /S /GoTo /D (page.51) >> +>> endobj +1397 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.443 381.086 210.417 391.468] /Subtype /Link /A << /S /GoTo /D (page.6) >> >> endobj -953 0 obj << +1398 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.119 369.131 190.093 379.513] +/Subtype /Link +/A << /S /GoTo /D (page.7) >> +>> endobj +1399 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.081 369.131 205.037 379.513] +/Subtype /Link +/A << /S /GoTo /D (page.14) >> +>> endobj +1400 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [398.553 638.549 405.526 648.87] +/Rect [167.876 357.176 174.85 367.557] /Subtype /Link /A << /S /GoTo /D (page.6) >> >> endobj -954 0 obj << +1401 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.795 345.221 169.769 355.602] +/Subtype /Link +/A << /S /GoTo /D (page.5) >> +>> endobj +1402 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [378.229 626.594 385.203 636.915] +/Rect [188.2 333.266 195.174 343.647] /Subtype /Link /A << /S /GoTo /D (page.6) >> >> endobj -955 0 obj << +1403 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [388.192 626.594 395.165 636.915] +/Rect [193.281 321.23 200.255 331.568] /Subtype /Link /A << /S /GoTo /D (page.7) >> >> endobj -956 0 obj << +1404 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.633 309.55 164.588 319.737] +/Subtype /Link +/A << /S /GoTo /D (page.33) >> +>> endobj +1405 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [378.229 614.639 385.203 624.96] +/Rect [142.471 297.4 154.426 307.782] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +1406 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.795 285.64 169.769 295.826] /Subtype /Link /A << /S /GoTo /D (page.6) >> >> endobj -957 0 obj << +1407 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [388.192 614.639 395.165 624.96] +/Rect [142.447 273.685 149.421 283.869] /Subtype /Link /A << /S /GoTo /D (page.7) >> >> endobj -958 0 obj << +1408 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [383.31 602.684 395.265 613.005] +/Rect [172.957 261.535 184.912 271.916] /Subtype /Link -/A << /S /GoTo /D (page.46) >> +/A << /S /GoTo /D (page.64) >> >> endobj -959 0 obj << +1409 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.119 240.192 195.074 250.654] +/Subtype /Link +/A << /S /GoTo /D (page.11) >> +>> endobj +1410 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [388.391 590.729 395.365 601.05] +/Rect [178.038 228.317 185.012 238.699] /Subtype /Link /A << /S /GoTo /D (page.6) >> >> endobj -960 0 obj << +1411 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [398.353 590.729 405.327 601.05] +/Rect [164.082 216.06 171.056 227.183] /Subtype /Link -/A << /S /GoTo /D (page.7) >> +/A << /S /GoTo /D (page.6) >> >> endobj -961 0 obj << +1412 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [383.31 578.773 390.284 589.094] +/Rect [157.714 195.1 169.669 205.482] /Subtype /Link -/A << /S /GoTo /D (page.9) >> +/A << /S /GoTo /D (page.64) >> >> endobj -962 0 obj << +1413 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [373.148 566.818 385.103 577.139] +/Rect [147.552 183.145 159.507 193.527] /Subtype /Link -/A << /S /GoTo /D (page.43) >> +/A << /S /GoTo /D (page.40) >> >> endobj -963 0 obj << +1414 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [388.391 554.863 400.346 565.184] +/Rect [172.957 171.19 184.912 181.572] /Subtype /Link -/A << /S /GoTo /D (page.52) >> +/A << /S /GoTo /D (page.30) >> >> endobj -964 0 obj << +1415 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [378.229 542.908 390.184 553.229] +/Rect [152.633 159.235 164.588 169.616] /Subtype /Link -/A << /S /GoTo /D (page.46) >> +/A << /S /GoTo /D (page.30) >> >> endobj -965 0 obj << +1416 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [388.391 530.953 400.346 541.274] +/Rect [147.552 147.28 159.507 157.661] /Subtype /Link -/A << /S /GoTo /D (page.33) >> +/A << /S /GoTo /D (page.63) >> >> endobj -966 0 obj << +1417 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [383.31 518.998 395.265 529.319] +/Rect [127.228 135.325 139.183 145.706] /Subtype /Link -/A << /S /GoTo /D (page.33) >> +/A << /S /GoTo /D (page.57) >> >> endobj -967 0 obj << +1418 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [378.229 507.042 390.184 517.363] +/Rect [137.39 123.369 149.345 133.751] /Subtype /Link -/A << /S /GoTo /D (page.36) >> +/A << /S /GoTo /D (page.57) >> >> endobj -968 0 obj << +1419 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [352.824 495.217 364.779 505.408] +/Rect [413.796 653.407 425.752 663.788] /Subtype /Link -/A << /S /GoTo /D (page.47) >> +/A << /S /GoTo /D (page.61) >> >> endobj -969 0 obj << +1420 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [362.986 483.262 374.941 493.453] +/Rect [368.068 641.452 380.023 651.833] /Subtype /Link -/A << /S /GoTo /D (page.51) >> +/A << /S /GoTo /D (page.25) >> >> endobj -970 0 obj << +1421 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [357.905 471.306 369.86 481.498] +/Rect [368.068 629.416 380.023 639.878] /Subtype /Link -/A << /S /GoTo /D (page.39) >> +/A << /S /GoTo /D (page.25) >> >> endobj -971 0 obj << +1422 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [363.294 458.886 370.267 469.543] +/Rect [347.744 617.541 359.699 627.923] /Subtype /Link -/A << /S /GoTo /D (page.4) >> +/A << /S /GoTo /D (page.34) >> >> endobj -972 0 obj << +1423 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [352.824 447.267 364.779 457.588] +/Rect [368.068 605.586 380.023 615.968] /Subtype /Link -/A << /S /GoTo /D (page.41) >> +/A << /S /GoTo /D (page.44) >> >> endobj -973 0 obj << +1424 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [392.296 424.392 404.251 436.298] +/Rect [373.148 593.631 385.104 604.012] /Subtype /Link -/A << /S /GoTo /D (page.21) >> +/A << /S /GoTo /D (page.34) >> >> endobj -974 0 obj << +1425 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [362.986 413.523 374.941 423.715] +/Rect [378.229 581.676 390.185 592.057] /Subtype /Link -/A << /S /GoTo /D (page.51) >> +/A << /S /GoTo /D (page.14) >> >> endobj -975 0 obj << +1426 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [378.229 401.438 390.184 411.759] +/Rect [368.068 569.721 380.023 580.102] /Subtype /Link -/A << /S /GoTo /D (page.38) >> +/A << /S /GoTo /D (page.48) >> >> endobj -976 0 obj << +1427 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [418.876 389.483 425.85 399.804] +/Rect [342.663 557.765 354.618 568.147] /Subtype /Link -/A << /S /GoTo /D (page.5) >> +/A << /S /GoTo /D (page.22) >> >> endobj -977 0 obj << +1428 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [398.553 377.528 405.526 387.849] +/Rect [357.906 545.81 369.861 556.192] /Subtype /Link -/A << /S /GoTo /D (page.6) >> +/A << /S /GoTo /D (page.40) >> >> endobj -978 0 obj << +1429 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [408.515 377.528 420.47 387.849] +/Rect [362.987 533.775 374.942 544.237] /Subtype /Link -/A << /S /GoTo /D (page.11) >> +/A << /S /GoTo /D (page.19) >> >> endobj -979 0 obj << +1430 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [383.31 365.573 390.284 375.894] +/Rect [393.472 521.819 405.428 532.281] /Subtype /Link -/A << /S /GoTo /D (page.5) >> +/A << /S /GoTo /D (page.19) >> >> endobj -980 0 obj << +1431 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [378.229 353.618 385.203 363.939] +/Rect [368.068 509.945 380.023 520.326] /Subtype /Link -/A << /S /GoTo /D (page.4) >> +/A << /S /GoTo /D (page.19) >> >> endobj -981 0 obj << +1432 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [403.634 341.663 410.607 351.984] +/Rect [373.148 497.909 385.104 508.371] /Subtype /Link -/A << /S /GoTo /D (page.5) >> +/A << /S /GoTo /D (page.41) >> >> endobj -982 0 obj << +1433 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [357.905 329.707 369.86 340.028] +/Rect [398.553 486.034 410.509 496.416] /Subtype /Link -/A << /S /GoTo /D (page.48) >> +/A << /S /GoTo /D (page.20) >> >> endobj -983 0 obj << +1434 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [378.229 317.882 385.203 328.073] +/Rect [347.744 474.274 359.699 484.461] /Subtype /Link -/A << /S /GoTo /D (page.5) >> +/A << /S /GoTo /D (page.14) >> >> endobj -984 0 obj << +1435 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [356.318 305.927 363.292 316.118] +/Rect [352.825 462.124 364.78 472.506] /Subtype /Link -/A << /S /GoTo /D (page.6) >> +/A << /S /GoTo /D (page.14) >> >> endobj -985 0 obj << +1436 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [388.391 293.842 400.346 304.163] +/Rect [378.229 450.169 390.185 460.55] /Subtype /Link -/A << /S /GoTo /D (page.49) >> +/A << /S /GoTo /D (page.26) >> >> endobj -986 0 obj << +1437 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [398.553 271.924 405.526 282.245] +/Rect [368.068 438.214 380.023 448.595] /Subtype /Link -/A << /S /GoTo /D (page.8) >> +/A << /S /GoTo /D (page.15) >> >> endobj -987 0 obj << +1438 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [393.472 259.969 400.446 270.29] +/Rect [388.391 426.259 400.347 436.64] /Subtype /Link -/A << /S /GoTo /D (page.5) >> +/A << /S /GoTo /D (page.45) >> >> endobj -988 0 obj << +1439 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [379.245 247.629 386.218 258.335] +/Rect [398.553 414.303 410.509 424.685] /Subtype /Link -/A << /S /GoTo /D (page.5) >> +/A << /S /GoTo /D (page.57) >> >> endobj -989 0 obj << +1440 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [373.148 226.096 385.103 236.417] +/Rect [393.472 402.348 405.428 412.73] /Subtype /Link -/A << /S /GoTo /D (page.49) >> +/A << /S /GoTo /D (page.57) >> >> endobj -990 0 obj << +1441 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.148 390.393 385.104 400.775] +/Subtype /Link +/A << /S /GoTo /D (page.57) >> +>> endobj +1442 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.068 378.438 380.023 388.819] +/Subtype /Link +/A << /S /GoTo /D (page.37) >> +>> endobj +1443 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.472 366.483 405.428 376.864] +/Subtype /Link +/A << /S /GoTo /D (page.59) >> +>> endobj +1444 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.229 354.528 390.185 364.909] +/Subtype /Link +/A << /S /GoTo /D (page.57) >> +>> endobj +1445 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 342.492 374.942 352.954] +/Subtype /Link +/A << /S /GoTo /D (page.15) >> +>> endobj +1446 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [362.986 214.141 374.941 224.462] +/Rect [368.068 330.617 380.023 340.999] +/Subtype /Link +/A << /S /GoTo /D (page.15) >> +>> endobj +1447 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.049 318.14 390.005 329.043] +/Subtype /Link +/A << /S /GoTo /D (page.13) >> +>> endobj +1448 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [392.993 318.14 404.948 329.043] +/Subtype /Link +/A << /S /GoTo /D (page.28) >> +>> endobj +1449 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [407.937 318.14 419.892 329.043] /Subtype /Link /A << /S /GoTo /D (page.29) >> >> endobj -991 0 obj << +1450 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [368.067 202.186 380.022 212.507] +/Rect [423.958 306.626 435.913 317.088] /Subtype /Link -/A << /S /GoTo /D (page.23) >> +/A << /S /GoTo /D (page.72) >> >> endobj -992 0 obj << +1451 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [362.986 190.23 374.941 200.551] +/Rect [438.902 306.626 450.857 317.088] /Subtype /Link -/A << /S /GoTo /D (page.48) >> +/A << /S /GoTo /D (page.78) >> >> endobj -993 0 obj << +1452 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [342.662 178.275 354.618 188.596] +/Rect [383.31 294.671 395.266 305.133] /Subtype /Link -/A << /S /GoTo /D (page.44) >> +/A << /S /GoTo /D (page.66) >> >> endobj -994 0 obj << +1453 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [352.824 166.32 364.779 176.641] +/Rect [368.068 272.834 380.023 283.215] /Subtype /Link -/A << /S /GoTo /D (page.44) >> +/A << /S /GoTo /D (page.61) >> >> endobj -995 0 obj << +1454 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [368.067 154.365 380.022 164.686] +/Rect [368.068 260.879 380.023 271.26] /Subtype /Link -/A << /S /GoTo /D (page.19) >> +/A << /S /GoTo /D (page.61) >> >> endobj -996 0 obj << +1455 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [368.067 142.41 380.022 152.731] +/Rect [362.987 248.924 374.942 259.305] /Subtype /Link -/A << /S /GoTo /D (page.19) >> +/A << /S /GoTo /D (page.60) >> >> endobj -997 0 obj << +1456 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [347.743 130.455 359.699 140.776] +/Rect [389.422 226.703 396.396 237.826] /Subtype /Link -/A << /S /GoTo /D (page.25) >> +/A << /S /GoTo /D (page.7) >> >> endobj -910 0 obj << -/D [908 0 R /XYZ 110.999 687.904 null] +1457 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.472 215.051 405.428 225.432] +/Subtype /Link +/A << /S /GoTo /D (page.71) >> >> endobj -907 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F101 484 0 R /F87 383 0 R /F80 371 0 R >> +1458 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.31 203.29 395.266 213.477] +/Subtype /Link +/A << /S /GoTo /D (page.71) >> +>> endobj +1459 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [403.634 191.06 415.59 201.522] +/Subtype /Link +/A << /S /GoTo /D (page.45) >> +>> endobj +1460 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [347.744 179.38 359.699 189.567] +/Subtype /Link +/A << /S /GoTo /D (page.15) >> +>> endobj +1461 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [388.391 167.425 400.347 177.611] +/Subtype /Link +/A << /S /GoTo /D (page.53) >> +>> endobj +1462 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.31 155.275 395.266 165.656] +/Subtype /Link +/A << /S /GoTo /D (page.55) >> +>> endobj +1463 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.229 143.239 390.185 153.701] +/Subtype /Link +/A << /S /GoTo /D (page.15) >> +>> endobj +1464 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [398.553 131.284 410.509 141.746] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +1373 0 obj << +/D [1371 0 R /XYZ 108 690.907 null] +>> endobj +1370 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F90 426 0 R /F95 412 0 R /F120 538 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1000 0 obj << -/Length 1693 +1467 0 obj << +/Length 4117 /Filter /FlateDecode >> stream -xÚÝ›IoÛF€ïþ:Ú@=Ãc³ÔhEøÖô@‰#‰EÒ$•¥¿¾”ÚÖŒÍôv@¬áòÍÛß#ÙŒÂ?6cŒ’4MgÚ$$¥r¶ØœÑÙ -~º:c·K(á\Â7øéÍõÙ¯¿'ffHªõìz9®¸Îÿ>——Œ*zþÛÅ?׎KÂ1,á”~»ìÃÅ¥fã'??~ÿküþnüücü|{ï×OûÓí¯(T -7|wB-‡gï¯÷w+LJ8€ºP.Eª5¾Hbtºg2f§Õâ>Óg&dSÖ}žõÙþ>ö«¤" 7·Ky|Š’„¦»›Øý]Ív_>^í·ñà’‚?>Ñn‰FS¢>»dŒ¤JMb©êÜv‡0p»f¼]7 †³pÄ×Pâ–EObé~læué€QÄxY`ÏL‚aIà"B ¦·ßûXJ¦Q•¬=Ä -˜),å—,¯û8ž€kTO°CéšlMϪží€¾åqBŽ”¨!§ü±r¥e8 -®î›eÐ"‹0 ž•7!AéÛsÄÔªµÝvc»uÑ4EµŠU2Ä’±µ_!ØÄòÑ\àô½?^½ùLÝQ@åD|Ü-¸pæå£ã‡áá½]ž€DÅÄÃß<}u -dYxJœg¤0Ãã-ûÅk_öæ57‚ðþO‰1ƵD¤”Púèøÿ -endobj -999 0 obj << +xÚ¥\Ms㸽ϯðÑ®Š‚àç1û‘äJÍÎ-›-Ó¶²²¤•èÙ™Àf³»‰áÔVy§¬§×àCh +’[”q‰¹h€,‚-§¢~ýÑ£ô/¯ÝcsýæYÙ+Ò:peƈÞ8‘sÊ>®Î–™aT^§00‘#F‡ˆ˜ùÊÎïvŽ|L‡^‰;§ú;]ÎWe +ù1fnÑãy]¨´H§m®—óù´ìõÂ.ìeÊöziT›À·"‡Cï +GËbl‘^á,¹4Qæ¹Å…ÝQ¥ýØ3®U#zàd•)Qrª7Ê~¾™˜ˆjaÄ,ÂÑ¢èÌŽ‰*ˆrk>·—Ã~ëæÝÓEnޜݼÎûPjó˜øÍ;G+bÿ_h3)²oŽÔ\’ârz˜J™~…wd+z8ôÀ—z JfØXÕLVÃÀK=fŽÔ#«mÏçÕ\fÔ$J8+OWb +ô8žoíÓÖãé"G€³#¶0¹˜øƒÃÑŠØ%¤Ì¦À[»ïÎ×˯g‹\~œ]~aÓ”Y~»üâ`´yf§r íïíiß~{M>î“=_äÖÀÙ7lbf¸7`â·Þ8-I–ªÊÀéšã±ùr¸ÙÂõåp"J×Z«,çGO]Û²° +Ä+Ú8ôÀ—Ú Ê¡t]œÏ¤‰E¥^hã1‹p´6v%©ªióx¾>µ\Y©#ŽÕf‚óÚ€¶.Ëú ÍÄ$hƒÂÑÚèJÕé<o¤¤)í^Yç¬0vk¥íÇžum»?¢w +ÓäðÜm6ž,rØ +tAVˆQ—ÿ½ßºÃó×ͺD¹&]— +²µtï×ÓÆ‘8?‹¿‘ì,ˆ¹nw—’›%\ˆˆn¯v³X-Èõ&nŽ3³„X2³`Êá”›}³K2³„X4³AúT§¹ï'éê¸SKÏyj àì©%l&ñRõx܈ØSKŒ%/mgLuÚûÝ·§®½¶Oîò(Út¢U¡Ùú<K3Uçyà^9îtè€/;%9Ÿd©Å›Æ].ųˆF«c—”z&Î[Û5ÏçS·õ¶È1F^Mhö®4‘ܲ¤}JrË’©9EËal}·Ôãr¾m×ÃQÆ +2ÁyE@+sV’‰HÐDŒ6'b«Òþ.ò)ý¥QÒo§ +endstream +endobj +1466 0 obj << /Type /Page -/Contents 1000 0 R -/Resources 998 0 R +/Contents 1467 0 R +/Resources 1465 0 R /MediaBox [0 0 612 792] -/Parent 1091 0 R -/Annots [ 1002 0 R 1003 0 R 1004 0 R 1005 0 R 1006 0 R 1007 0 R 1008 0 R 1009 0 R 1010 0 R 1011 0 R 1012 0 R 1013 0 R 1014 0 R 1015 0 R 1016 0 R 1017 0 R 1018 0 R 1019 0 R 1020 0 R 1021 0 R 1022 0 R 1023 0 R 1024 0 R 1025 0 R 1026 0 R 1027 0 R 1028 0 R 1029 0 R 1030 0 R 1031 0 R 1032 0 R 1033 0 R 1034 0 R 1035 0 R 1036 0 R 1037 0 R 1038 0 R 1039 0 R 1040 0 R 1041 0 R 1042 0 R 1043 0 R 1044 0 R 1045 0 R 1046 0 R 1047 0 R 1048 0 R 1049 0 R 1050 0 R 1051 0 R 1052 0 R 1053 0 R 1054 0 R 1055 0 R 1056 0 R 1057 0 R 1058 0 R 1059 0 R 1060 0 R 1061 0 R 1062 0 R 1063 0 R 1064 0 R 1065 0 R 1066 0 R 1067 0 R 1068 0 R 1069 0 R 1070 0 R 1071 0 R 1072 0 R 1073 0 R 1074 0 R 1075 0 R 1076 0 R 1077 0 R 1078 0 R 1079 0 R 1080 0 R 1081 0 R 1082 0 R 1083 0 R 1084 0 R 1085 0 R 1086 0 R 1087 0 R 1088 0 R 1089 0 R 1090 0 R ] +/Parent 1271 0 R +/Annots [ 1469 0 R 1470 0 R 1471 0 R 1472 0 R 1473 0 R 1474 0 R 1475 0 R 1476 0 R 1477 0 R 1478 0 R 1479 0 R 1480 0 R 1481 0 R 1482 0 R 1483 0 R 1484 0 R 1485 0 R 1486 0 R 1487 0 R 1488 0 R 1489 0 R 1490 0 R 1491 0 R 1492 0 R 1493 0 R 1494 0 R 1495 0 R 1496 0 R 1497 0 R 1498 0 R 1499 0 R 1500 0 R 1501 0 R 1502 0 R 1503 0 R 1504 0 R 1505 0 R 1506 0 R 1507 0 R 1508 0 R 1509 0 R 1510 0 R 1511 0 R 1512 0 R 1513 0 R 1514 0 R 1515 0 R 1516 0 R 1517 0 R 1518 0 R 1519 0 R 1520 0 R 1521 0 R 1522 0 R 1523 0 R 1524 0 R 1525 0 R 1526 0 R 1527 0 R 1528 0 R 1529 0 R 1530 0 R 1531 0 R 1532 0 R 1533 0 R 1534 0 R 1535 0 R 1536 0 R 1537 0 R 1538 0 R 1539 0 R 1540 0 R 1541 0 R 1542 0 R 1543 0 R 1544 0 R 1545 0 R 1546 0 R 1547 0 R 1548 0 R 1549 0 R 1550 0 R 1551 0 R 1552 0 R 1553 0 R 1554 0 R 1555 0 R 1556 0 R 1557 0 R 1558 0 R 1559 0 R 1560 0 R 1561 0 R 1562 0 R 1563 0 R 1564 0 R 1565 0 R ] >> endobj -1002 0 obj << +1469 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [155.631 650.504 167.586 660.825] +/Rect [147.552 653.602 159.507 663.788] /Subtype /Link -/A << /S /GoTo /D (page.32) >> +/A << /S /GoTo /D (page.30) >> >> endobj -1003 0 obj << +1470 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [160.712 638.549 172.667 648.87] +/Rect [166.919 641.646 178.874 651.833] /Subtype /Link -/A << /S /GoTo /D (page.25) >> +/A << /S /GoTo /D (page.26) >> >> endobj -1004 0 obj << +1471 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.793 626.594 177.748 636.915] +/Rect [150.769 628.974 162.725 639.982] /Subtype /Link -/A << /S /GoTo /D (page.11) >> +/A << /S /GoTo /D (page.27) >> >> endobj -1005 0 obj << +1472 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [155.631 614.639 167.586 624.96] +/Rect [142.471 617.736 154.426 627.923] /Subtype /Link -/A << /S /GoTo /D (page.36) >> +/A << /S /GoTo /D (page.37) >> >> endobj -1006 0 obj << +1473 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [130.227 602.684 142.182 613.005] +/Rect [152.633 605.506 164.588 615.968] /Subtype /Link -/A << /S /GoTo /D (page.20) >> +/A << /S /GoTo /D (page.14) >> >> endobj -1007 0 obj << +1474 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [145.469 590.729 157.424 601.05] +/Rect [167.577 605.506 179.532 615.968] /Subtype /Link -/A << /S /GoTo /D (page.30) >> +/A << /S /GoTo /D (page.32) >> >> endobj -1008 0 obj << +1475 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [150.55 578.773 162.505 589.094] +/Rect [172.957 593.55 184.912 604.012] /Subtype /Link -/A << /S /GoTo /D (page.15) >> +/A << /S /GoTo /D (page.14) >> >> endobj -1009 0 obj << +1476 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.036 566.818 192.991 577.139] +/Rect [187.901 593.55 199.856 604.012] /Subtype /Link -/A << /S /GoTo /D (page.15) >> +/A << /S /GoTo /D (page.32) >> >> endobj -1010 0 obj << +1477 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [155.631 554.863 167.586 565.184] +/Rect [157.714 581.595 169.669 592.057] /Subtype /Link -/A << /S /GoTo /D (page.15) >> +/A << /S /GoTo /D (page.14) >> >> endobj -1011 0 obj << +1478 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [160.712 542.908 172.667 553.229] +/Rect [172.658 581.595 184.613 592.057] /Subtype /Link -/A << /S /GoTo /D (page.30) >> +/A << /S /GoTo /D (page.32) >> >> endobj -1012 0 obj << +1479 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [135.307 531.082 147.263 541.274] +/Rect [142.471 569.915 154.426 580.102] /Subtype /Link -/A << /S /GoTo /D (page.11) >> +/A << /S /GoTo /D (page.18) >> >> endobj -1013 0 obj << +1480 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.388 518.998 152.344 529.319] +/Rect [142.471 557.96 154.426 568.147] /Subtype /Link -/A << /S /GoTo /D (page.10) >> +/A << /S /GoTo /D (page.53) >> >> endobj -1014 0 obj << +1481 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.793 507.042 177.748 517.363] +/Rect [172.957 546.005 184.912 556.192] /Subtype /Link -/A << /S /GoTo /D (page.20) >> +/A << /S /GoTo /D (page.53) >> >> endobj -1015 0 obj << +1482 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [155.631 495.087 167.586 505.408] +/Rect [162.795 533.855 174.75 544.237] /Subtype /Link -/A << /S /GoTo /D (page.10) >> +/A << /S /GoTo /D (page.55) >> >> endobj -1016 0 obj << +1483 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [175.955 483.132 187.91 493.453] +/Rect [147.552 511.937 159.507 522.319] /Subtype /Link -/A << /S /GoTo /D (page.33) >> +/A << /S /GoTo /D (page.51) >> >> endobj -1017 0 obj << +1484 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [186.117 471.177 198.072 481.498] +/Rect [137.39 500.177 149.345 510.364] /Subtype /Link -/A << /S /GoTo /D (page.43) >> +/A << /S /GoTo /D (page.53) >> >> endobj -1018 0 obj << +1485 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.036 459.222 192.991 469.543] +/Rect [157.714 488.027 169.669 498.408] /Subtype /Link -/A << /S /GoTo /D (page.43) >> +/A << /S /GoTo /D (page.55) >> >> endobj -1019 0 obj << +1486 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.552 476.267 159.507 486.453] +/Subtype /Link +/A << /S /GoTo /D (page.29) >> +>> endobj +1487 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.471 464.311 154.426 474.498] +/Subtype /Link +/A << /S /GoTo /D (page.22) >> +>> endobj +1488 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [160.712 447.267 172.667 457.588] +/Rect [152.633 452.161 164.588 462.543] /Subtype /Link /A << /S /GoTo /D (page.43) >> >> endobj -1020 0 obj << +1489 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [155.631 435.311 167.586 445.632] +/Rect [198.362 440.126 210.317 450.588] /Subtype /Link -/A << /S /GoTo /D (page.26) >> +/A << /S /GoTo /D (page.17) >> >> endobj -1021 0 obj << +1490 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.036 423.356 192.991 433.677] +/Rect [198.362 428.446 210.317 438.633] /Subtype /Link -/A << /S /GoTo /D (page.45) >> +/A << /S /GoTo /D (page.18) >> >> endobj -1022 0 obj << +1491 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.793 411.401 177.748 421.722] +/Rect [183.119 416.215 195.074 426.677] /Subtype /Link -/A << /S /GoTo /D (page.44) >> +/A << /S /GoTo /D (page.17) >> >> endobj -1023 0 obj << +1492 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [150.55 399.446 162.505 409.767] +/Rect [172.957 404.536 184.912 414.722] /Subtype /Link -/A << /S /GoTo /D (page.11) >> +/A << /S /GoTo /D (page.18) >> >> endobj -1024 0 obj << +1493 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [155.631 387.491 167.586 397.812] +/Rect [183.119 392.58 195.074 402.767] /Subtype /Link -/A << /S /GoTo /D (page.11) >> +/A << /S /GoTo /D (page.18) >> >> endobj -1025 0 obj << +1494 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [211.521 375.535 223.476 385.857] +/Rect [167.876 380.625 179.831 390.812] /Subtype /Link -/A << /S /GoTo /D (page.52) >> +/A << /S /GoTo /D (page.72) >> >> endobj -1026 0 obj << +1495 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [226.465 375.535 238.42 385.857] +/Rect [182.82 380.625 194.775 390.812] /Subtype /Link -/A << /S /GoTo /D (page.58) >> +/A << /S /GoTo /D (page.79) >> >> endobj -1027 0 obj << +1496 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [155.631 353.618 167.586 363.939] +/Rect [162.795 368.475 174.75 378.857] /Subtype /Link -/A << /S /GoTo /D (page.46) >> +/A << /S /GoTo /D (page.64) >> >> endobj -1028 0 obj << +1497 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [155.631 341.663 167.586 351.984] +/Rect [172.957 356.715 184.912 366.902] /Subtype /Link -/A << /S /GoTo /D (page.47) >> +/A << /S /GoTo /D (page.62) >> >> endobj -1029 0 obj << +1498 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [150.55 329.707 162.505 340.028] +/Rect [162.795 344.76 174.75 354.946] /Subtype /Link -/A << /S /GoTo /D (page.46) >> +/A << /S /GoTo /D (page.62) >> >> endobj -1030 0 obj << +1499 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [191.198 307.79 203.153 318.111] +/Rect [172.957 332.805 184.912 342.991] /Subtype /Link -/A << /S /GoTo /D (page.33) >> +/A << /S /GoTo /D (page.62) >> >> endobj -1031 0 obj << +1500 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [135.307 295.964 147.263 306.155] +/Rect [157.714 320.655 169.669 331.036] /Subtype /Link -/A << /S /GoTo /D (page.11) >> +/A << /S /GoTo /D (page.62) >> >> endobj -1032 0 obj << +1501 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [175.955 284.009 187.91 294.2] +/Rect [188.2 308.619 200.155 319.081] /Subtype /Link -/A << /S /GoTo /D (page.39) >> +/A << /S /GoTo /D (page.72) >> >> endobj -1033 0 obj << +1502 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [170.874 271.924 182.829 282.245] +/Rect [203.144 308.619 215.099 319.081] /Subtype /Link -/A << /S /GoTo /D (page.42) >> +/A << /S /GoTo /D (page.78) >> >> endobj -1034 0 obj << +1503 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.793 259.969 177.748 270.29] +/Rect [178.038 296.939 189.993 307.126] /Subtype /Link -/A << /S /GoTo /D (page.12) >> +/A << /S /GoTo /D (page.62) >> >> endobj -1035 0 obj << +1504 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [186.117 248.014 198.072 258.335] +/Rect [162.795 284.789 174.75 295.171] /Subtype /Link -/A << /S /GoTo /D (page.48) >> +/A << /S /GoTo /D (page.64) >> >> endobj -1036 0 obj << +1505 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [150.55 236.188 162.505 246.38] +/Rect [178.038 272.834 189.993 283.215] +/Subtype /Link +/A << /S /GoTo /D (page.62) >> +>> endobj +1506 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.714 261.074 169.669 271.26] +/Subtype /Link +/A << /S /GoTo /D (page.38) >> +>> endobj +1507 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.795 249.118 174.75 259.305] /Subtype /Link /A << /S /GoTo /D (page.23) >> >> endobj -1037 0 obj << +1508 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [169.918 224.233 181.873 234.424] +/Rect [157.714 237.163 169.669 247.35] /Subtype /Link -/A << /S /GoTo /D (page.21) >> +/A << /S /GoTo /D (page.18) >> >> endobj -1038 0 obj << +1509 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [153.768 211.526 165.723 222.534] +/Rect [157.714 225.013 169.669 235.395] /Subtype /Link -/A << /S /GoTo /D (page.21) >> +/A << /S /GoTo /D (page.18) >> >> endobj -1039 0 obj << +1510 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [145.469 200.323 157.424 210.514] +/Rect [137.39 213.253 149.345 223.44] /Subtype /Link -/A << /S /GoTo /D (page.27) >> +/A << /S /GoTo /D (page.36) >> >> endobj -1040 0 obj << +1511 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [145.469 188.367 157.424 198.559] +/Rect [162.795 201.103 174.75 211.484] /Subtype /Link -/A << /S /GoTo /D (page.13) >> +/A << /S /GoTo /D (page.58) >> >> endobj -1041 0 obj << +1512 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [145.469 176.412 157.424 186.604] +/Rect [147.552 189.343 159.507 199.529] /Subtype /Link -/A << /S /GoTo /D (page.39) >> +/A << /S /GoTo /D (page.57) >> >> endobj -1042 0 obj << +1513 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [175.955 164.457 187.91 174.649] +/Rect [137.39 177.387 149.345 187.574] /Subtype /Link -/A << /S /GoTo /D (page.39) >> +/A << /S /GoTo /D (page.53) >> >> endobj -1043 0 obj << +1514 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.793 152.372 177.748 162.693] +/Rect [157.714 165.237 169.669 175.619] /Subtype /Link -/A << /S /GoTo /D (page.42) >> +/A << /S /GoTo /D (page.55) >> >> endobj -1044 0 obj << +1515 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [150.55 130.455 162.505 140.776] +/Rect [167.876 153.477 179.831 163.664] /Subtype /Link -/A << /S /GoTo /D (page.38) >> +/A << /S /GoTo /D (page.58) >> >> endobj -1045 0 obj << +1516 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [352.824 650.634 364.779 660.825] +/Rect [152.633 141.522 164.588 151.708] /Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (page.35) >> >> endobj -1046 0 obj << +1517 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [373.148 638.549 385.103 648.87] +/Rect [157.714 129.372 169.669 139.753] /Subtype /Link -/A << /S /GoTo /D (page.42) >> +/A << /S /GoTo /D (page.55) >> >> endobj -1047 0 obj << +1518 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [362.986 626.724 374.941 636.915] +/Rect [378.229 653.602 390.185 663.788] /Subtype /Link -/A << /S /GoTo /D (page.23) >> +/A << /S /GoTo /D (page.42) >> >> endobj -1048 0 obj << +1519 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [357.905 614.768 369.86 624.96] +/Rect [383.31 641.646 395.266 651.833] /Subtype /Link -/A << /S /GoTo /D (page.18) >> +/A << /S /GoTo /D (page.14) >> >> endobj -1049 0 obj << +1520 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [368.067 602.684 380.022 613.005] +/Rect [388.391 629.691 400.347 639.878] /Subtype /Link -/A << /S /GoTo /D (page.32) >> +/A << /S /GoTo /D (page.14) >> >> endobj -1050 0 obj << +1521 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [413.795 590.729 425.751 601.05] +/Rect [383.31 617.541 395.266 627.923] /Subtype /Link -/A << /S /GoTo /D (page.13) >> +/A << /S /GoTo /D (page.14) >> >> endobj -1051 0 obj << +1522 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [413.795 578.903 425.751 589.094] +/Rect [373.148 605.781 385.104 615.968] /Subtype /Link /A << /S /GoTo /D (page.14) >> >> endobj -1052 0 obj << +1523 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [398.553 566.818 410.508 577.139] +/Rect [393.472 593.55 405.428 604.012] /Subtype /Link -/A << /S /GoTo /D (page.13) >> +/A << /S /GoTo /D (page.14) >> >> endobj -1053 0 obj << +1524 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [388.391 554.993 400.346 565.184] +/Rect [357.906 581.676 369.861 592.057] /Subtype /Link /A << /S /GoTo /D (page.14) >> >> endobj -1054 0 obj << +1525 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [398.553 543.037 410.508 553.229] +/Rect [347.744 569.915 359.699 580.102] /Subtype /Link /A << /S /GoTo /D (page.14) >> >> endobj -1055 0 obj << +1526 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.472 557.96 405.428 568.147] +/Subtype /Link +/A << /S /GoTo /D (page.49) >> +>> endobj +1527 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [388.391 545.81 400.347 556.192] +/Subtype /Link +/A << /S /GoTo /D (page.49) >> +>> endobj +1528 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [388.391 533.775 400.347 544.237] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +1529 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.825 522.095 364.78 532.281] +/Subtype /Link +/A << /S /GoTo /D (page.53) >> +>> endobj +1530 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 509.945 374.942 520.326] +/Subtype /Link +/A << /S /GoTo /D (page.30) >> +>> endobj +1531 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.31 497.99 395.266 508.371] +/Subtype /Link +/A << /S /GoTo /D (page.59) >> +>> endobj +1532 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [383.31 531.082 395.265 541.274] +/Rect [368.068 476.072 380.023 486.453] +/Subtype /Link +/A << /S /GoTo /D (page.50) >> +>> endobj +1533 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [347.744 464.311 359.699 474.498] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +1534 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.906 452.356 369.861 462.543] +/Subtype /Link +/A << /S /GoTo /D (page.37) >> +>> endobj +1535 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [347.744 440.401 359.699 450.588] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +1536 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.906 428.446 369.861 438.633] +/Subtype /Link +/A << /S /GoTo /D (page.46) >> +>> endobj +1537 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [388.391 416.491 400.347 426.677] /Subtype /Link /A << /S /GoTo /D (page.51) >> >> endobj -1056 0 obj << +1538 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.31 404.536 395.266 414.722] +/Subtype /Link +/A << /S /GoTo /D (page.26) >> +>> endobj +1539 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.472 392.386 405.428 402.767] +/Subtype /Link +/A << /S /GoTo /D (page.51) >> +>> endobj +1540 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.472 380.299 405.428 390.812] +/Subtype /Link +/A << /S /GoTo /D (page.47) >> +>> endobj +1541 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [388.391 368.67 400.347 378.857] +/Subtype /Link +/A << /S /GoTo /D (page.48) >> +>> endobj +1542 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [398.254 531.082 410.209 541.274] +/Rect [403.335 368.67 415.291 378.857] /Subtype /Link /A << /S /GoTo /D (page.59) >> >> endobj -1057 0 obj << +1543 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [403.634 518.998 415.589 529.319] +/Rect [378.229 356.715 390.185 366.902] /Subtype /Link /A << /S /GoTo /D (page.51) >> >> endobj -1058 0 obj << +1544 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [418.577 518.998 430.533 529.319] +/Rect [378.229 344.76 390.185 354.946] /Subtype /Link -/A << /S /GoTo /D (page.58) >> +/A << /S /GoTo /D (page.50) >> >> endobj -1059 0 obj << +1545 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 332.805 374.942 342.991] +/Subtype /Link +/A << /S /GoTo /D (page.46) >> +>> endobj +1546 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [393.472 507.172 405.427 517.363] +/Rect [373.148 320.655 385.104 331.036] /Subtype /Link /A << /S /GoTo /D (page.48) >> >> endobj -1060 0 obj << +1547 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [388.092 320.655 400.048 331.036] +/Subtype /Link +/A << /S /GoTo /D (page.59) >> +>> endobj +1548 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [393.472 495.087 405.427 505.408] +/Rect [393.472 308.568 405.428 319.081] +/Subtype /Link +/A << /S /GoTo /D (page.51) >> +>> endobj +1549 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.148 296.744 385.104 307.126] /Subtype /Link /A << /S /GoTo /D (page.48) >> >> endobj -1061 0 obj << +1550 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [373.148 483.262 385.103 493.453] +/Rect [388.092 296.744 400.048 307.126] /Subtype /Link -/A << /S /GoTo /D (page.27) >> +/A << /S /GoTo /D (page.59) >> >> endobj -1062 0 obj << +1551 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [378.229 471.306 390.184 481.498] +/Rect [378.229 284.789 390.185 295.171] /Subtype /Link -/A << /S /GoTo /D (page.16) >> +/A << /S /GoTo /D (page.48) >> >> endobj -1063 0 obj << +1552 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [373.148 459.351 385.103 469.543] +/Rect [393.173 284.789 405.129 295.171] /Subtype /Link -/A << /S /GoTo /D (page.14) >> +/A << /S /GoTo /D (page.59) >> >> endobj -1064 0 obj << +1553 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.906 273.029 369.861 283.215] +/Subtype /Link +/A << /S /GoTo /D (page.18) >> +>> endobj +1554 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [373.148 447.267 385.103 457.588] +/Rect [362.987 261.074 374.942 271.26] +/Subtype /Link +/A << /S /GoTo /D (page.72) >> +>> endobj +1555 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.472 248.924 405.428 259.305] +/Subtype /Link +/A << /S /GoTo /D (page.55) >> +>> endobj +1556 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.068 236.888 380.023 247.35] /Subtype /Link /A << /S /GoTo /D (page.14) >> >> endobj -1065 0 obj << +1557 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [352.824 435.441 364.779 445.632] +/Rect [368.068 225.013 380.023 235.395] /Subtype /Link -/A << /S /GoTo /D (page.26) >> +/A << /S /GoTo /D (page.71) >> >> endobj -1066 0 obj << +1558 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [378.229 423.356 390.184 433.677] +/Rect [363.857 213.253 370.831 223.878] /Subtype /Link -/A << /S /GoTo /D (page.45) >> +/A << /S /GoTo /D (page.6) >> >> endobj -1067 0 obj << +1559 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [362.986 411.531 374.941 421.722] +/Rect [347.744 201.298 359.699 211.484] /Subtype /Link -/A << /S /GoTo /D (page.44) >> +/A << /S /GoTo /D (page.53) >> >> endobj -1068 0 obj << +1560 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [352.824 399.575 364.779 409.767] +/Rect [357.906 189.343 369.861 199.529] /Subtype /Link -/A << /S /GoTo /D (page.39) >> +/A << /S /GoTo /D (page.24) >> >> endobj -1069 0 obj << +1561 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [373.148 387.491 385.103 397.812] +/Rect [388.391 167.425 400.347 177.611] /Subtype /Link /A << /S /GoTo /D (page.42) >> >> endobj -1070 0 obj << +1562 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [423.958 155.275 430.932 165.656] +/Subtype /Link +/A << /S /GoTo /D (page.6) >> +>> endobj +1563 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.31 143.514 390.284 153.701] +/Subtype /Link +/A << /S /GoTo /D (page.8) >> +>> endobj +1564 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.31 131.364 390.284 141.746] +/Subtype /Link +/A << /S /GoTo /D (page.5) >> +>> endobj +1565 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.273 131.364 400.247 141.746] +/Subtype /Link +/A << /S /GoTo /D (page.8) >> +>> endobj +1468 0 obj << +/D [1466 0 R /XYZ 108 690.907 null] +>> endobj +1465 0 obj << +/Font << /F94 409 0 R /F107 429 0 R /F120 538 0 R /F90 426 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1568 0 obj << +/Length 1261 +/Filter /FlateDecode +>> +stream +xÚ¥˜Moã6†ïù:&@ÅòC¤Èc?¶E{(ŠÖ·mŠ8BÄ°6»¿¾”D‰c’c0‚ðÝ÷=N&aµÿXÁ¨.”¡ÄкX¿ÜÑbk¿ýósÇe^Á÷«»o2U¡‰QªX=õ„ój6Ym>ßËûÿ$½ÿîáïÕ¯ƒ¼&¬½œS¢¹µîe¿?”ŠŸìþÓðùÛð‡Ï_†Ï†ÏñôÏÙnNJcœŸV½àîÓj._ÒêâÓõçÑÓ1ûµ&•Òããqb˜)”T„Šññþb¢z?¶/û]óØîŽsUÆV5<¤²†õô”ß„E1¥‰¶Ç“¥ÍÛbüâøœºòé%Ì¡åøÂÜZ-Ì_·ÓDii(UE¨} +§.<&Xö¹u˜ËiE„007"3i¢´4{ïY}Ö)§Ã{ûøøöqóõq–¹×ÇËñëªTèõñF®O–†ÒNû¥{Ý&n%•V(¡‰°Ç“ÙN]yŒ#°ìs+_[«ªŽy8M—ä!"\ñs¯ï/í¡[oÚ§æ}wŠé0ʈB›…SC$Ÿ/Ãqâ¨#6ဦŠR™±¯LÀØøþ8M”–F£ím£ê;é(ˆ¨ñ™k*Âíñä{m²ŒêÈ“åÜAcdž݀Qr²XI–£¸íU3ƒù·]ŸÞO]»ÛÜ:X&ËÌÁäè`UrO«'&˨‰âÒT¤Bx*ÛC·Ùu¯mâG”D†C¤¶Ç“ã5(£ºò”sË>—™Ô¸eƒ“ã¶×Dqi(\Éüúh>ºããv2Ë·@ŽŽ[XSظNø¸
ãÒ<˜²k™ÇñÜœÖÏ·.oÎ,swójtuÕ‰Ùܼ
º¸Iivà(*=‰—æðÏñfÎ-…—ã,@Lc0¼N#Kâ¨' +Ð8®›]{+
g– ëQ :)Þ%$¥AhJ” Iì›ÓóStrÌœ¢@ŽNQX¤”ØNø
ãÒPì´ºLvÍëéæîÍr»cVãÝá«Ã»c¶Á»ã<)
Âþ†\kXÔÎ1·;¼ïPä…îðNº#ˆKC±¿'kî×±/ÇÿšýÍíáÜrûÃËñââð ÂÒ8ìïÆÞ–Ç¢qŽ¹=âåx€"/ôˆwºÐ#A\ +³k8X<¾,ÙÃ&³Ì=ÈÑ=Ö‡ïaÀ ßø$a¡”y‹ÖÉ-óÎ +´Ç¢ýcrËÅáå8P :B€Ž#Kã¨%¡†8–ŒÉ1s„ +q0ɉ¬ûKcBILÎ袴M¤u’¬0ýþ×`N +endstream +endobj +1567 0 obj << +/Type /Page +/Contents 1568 0 R +/Resources 1566 0 R +/MediaBox [0 0 612 792] +/Parent 1271 0 R +/Annots [ 1570 0 R 1571 0 R 1572 0 R 1573 0 R 1574 0 R 1575 0 R 1576 0 R 1577 0 R 1578 0 R 1579 0 R 1580 0 R 1581 0 R 1582 0 R 1583 0 R 1584 0 R 1585 0 R 1586 0 R 1587 0 R 1588 0 R 1589 0 R 1590 0 R 1591 0 R 1592 0 R 1593 0 R 1594 0 R 1595 0 R 1596 0 R ] +>> endobj +1570 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 653.407 174.85 663.788] +/Subtype /Link +/A << /S /GoTo /D (page.5) >> +>> endobj +1571 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.471 641.452 154.426 651.833] +/Subtype /Link +/A << /S /GoTo /D (page.51) >> +>> endobj +1572 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.362 629.416 205.336 639.754] +/Subtype /Link +/A << /S /GoTo /D (page.7) >> +>> endobj +1573 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 617.736 174.85 627.923] +/Subtype /Link +/A << /S /GoTo /D (page.6) >> +>> endobj +1574 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.39 605.506 149.345 615.968] +/Subtype /Link +/A << /S /GoTo /D (page.43) >> +>> endobj +1575 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [383.31 375.665 395.265 385.857] +/Rect [208.524 593.55 220.479 604.012] /Subtype /Link /A << /S /GoTo /D (page.44) >> >> endobj -1071 0 obj << +1576 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [373.148 363.58 385.103 373.901] +/Rect [193.281 581.595 205.236 592.057] /Subtype /Link -/A << /S /GoTo /D (page.42) >> +/A << /S /GoTo /D (page.44) >> >> endobj -1072 0 obj << +1577 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [378.229 351.755 390.184 361.946] +/Rect [167.876 559.953 179.831 570.139] /Subtype /Link -/A << /S /GoTo /D (page.30) >> +/A << /S /GoTo /D (page.20) >> >> endobj -1073 0 obj << +1578 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [383.31 339.8 395.265 349.991] +/Rect [162.795 547.722 174.75 558.184] /Subtype /Link -/A << /S /GoTo /D (page.11) >> +/A << /S /GoTo /D (page.19) >> >> endobj -1074 0 obj << +1579 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [388.391 327.844 400.346 338.036] +/Rect [137.39 526.08 149.345 536.266] /Subtype /Link -/A << /S /GoTo /D (page.11) >> +/A << /S /GoTo /D (page.16) >> >> endobj -1075 0 obj << +1580 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [383.31 315.76 395.265 326.081] +/Rect [142.471 514.125 154.426 524.311] /Subtype /Link -/A << /S /GoTo /D (page.11) >> +/A << /S /GoTo /D (page.37) >> >> endobj -1076 0 obj << +1581 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [373.148 303.934 385.103 314.126] +/Rect [142.471 502.169 154.426 512.356] /Subtype /Link -/A << /S /GoTo /D (page.11) >> +/A << /S /GoTo /D (page.18) >> >> endobj -1077 0 obj << +1582 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [393.472 291.849 405.427 302.17] +/Rect [142.471 490.214 154.426 500.401] /Subtype /Link -/A << /S /GoTo /D (page.11) >> +/A << /S /GoTo /D (page.53) >> >> endobj -1078 0 obj << +1583 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [357.905 279.894 369.86 290.215] +/Rect [162.795 478.064 174.75 488.446] /Subtype /Link -/A << /S /GoTo /D (page.11) >> +/A << /S /GoTo /D (page.55) >> >> endobj -1079 0 obj << +1584 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [347.743 268.069 359.699 278.26] +/Rect [142.471 466.304 154.426 476.491] /Subtype /Link -/A << /S /GoTo /D (page.11) >> +/A << /S /GoTo /D (page.53) >> >> endobj -1080 0 obj << +1585 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [388.391 255.984 400.346 266.305] +/Rect [162.795 454.154 174.75 464.535] /Subtype /Link -/A << /S /GoTo /D (page.48) >> +/A << /S /GoTo /D (page.55) >> >> endobj -1081 0 obj << +1586 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [352.824 244.158 364.779 254.35] +/Rect [142.471 442.199 154.426 452.58] /Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (page.53) >> >> endobj -1082 0 obj << +1587 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [362.986 232.073 374.941 242.395] +/Rect [162.795 430.244 174.75 440.625] /Subtype /Link -/A << /S /GoTo /D (page.23) >> +/A << /S /GoTo /D (page.55) >> >> endobj -1083 0 obj << +1588 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [383.31 220.118 395.265 230.439] +/Rect [137.39 408.326 149.345 418.707] /Subtype /Link -/A << /S /GoTo /D (page.45) >> +/A << /S /GoTo /D (page.16) >> >> endobj -1084 0 obj << +1589 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [368.067 198.203 380.022 208.524] +/Rect [142.471 396.371 154.426 406.752] /Subtype /Link -/A << /S /GoTo /D (page.36) >> +/A << /S /GoTo /D (page.18) >> >> endobj -1085 0 obj << +1590 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [347.743 186.378 359.699 196.569] +/Rect [142.471 384.415 154.426 394.797] /Subtype /Link -/A << /S /GoTo /D (page.50) >> +/A << /S /GoTo /D (page.53) >> >> endobj -1086 0 obj << +1591 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [357.905 174.422 369.86 184.614] +/Rect [162.795 372.46 174.75 382.842] /Subtype /Link -/A << /S /GoTo /D (page.27) >> +/A << /S /GoTo /D (page.55) >> >> endobj -1087 0 obj << +1592 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [347.743 162.467 359.699 172.659] +/Rect [142.471 360.505 154.426 370.887] /Subtype /Link -/A << /S /GoTo /D (page.50) >> +/A << /S /GoTo /D (page.53) >> >> endobj -1088 0 obj << +1593 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [357.905 150.512 369.86 160.704] +/Rect [162.795 348.55 174.75 358.931] /Subtype /Link -/A << /S /GoTo /D (page.34) >> +/A << /S /GoTo /D (page.55) >> >> endobj -1089 0 obj << +1594 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [388.391 138.557 400.346 148.748] +/Rect [142.471 326.552 154.426 337.014] /Subtype /Link -/A << /S /GoTo /D (page.38) >> +/A << /S /GoTo /D (page.35) >> >> endobj -1090 0 obj << +1595 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [383.31 126.602 395.265 136.793] +/Rect [142.471 314.872 154.426 325.058] /Subtype /Link -/A << /S /GoTo /D (page.20) >> +/A << /S /GoTo /D (page.53) >> >> endobj -1001 0 obj << -/D [999 0 R /XYZ 110.999 687.904 null] +1596 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.471 302.917 154.426 313.103] +/Subtype /Link +/A << /S /GoTo /D (page.53) >> >> endobj -998 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F101 484 0 R >> +1569 0 obj << +/D [1567 0 R /XYZ 108 690.907 null] +>> endobj +1566 0 obj << +/Font << /F94 409 0 R /F107 429 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1094 0 obj << -/Length 966 +1599 0 obj << +/Length 3816 /Filter /FlateDecode >> stream -xÚݘ[oÓ0Çß÷)òØJÌøøîG.c‚„ oÀƒ×¦] M¢$…–OÏiVªi‰!®HÕ¤(ZNmÿü?CDñ" -š'›\5ïo›÷—Íóuó|qïë‡ãpǹ´¸à_*¹·¸¸šWË%@»P.¹•„Ž/‚eLÆD8¬â÷™>uênâ4NÓ¤¨âãbŽ¦p~°òp)Z€ÃÎÝý¯\Ew/ï¯{Ùš—›‡Ý™tE¨ÖÑ% -Uoœ„‡qd›u\&óE¼t›´©Fpâk -ý…q.)½PØyrí•ÊáRÿ%(ŸTû}å¬÷ùäÛªLi’ÅÕ8×V O¹¶ê ³uÛ¤)€€
@Û[WÏoGÊÏL—Ÿ·çrµ²æn´~DÐSATOî~ˆx»T ¼¦ÞV©ë:°?2Uú‚œ‹*»ê»+ÎA•ä±«Ò³6îΤ6îÎ¥¤ìÎ¥¤ìΩ¤ìmIa‰ÜßÔcãªå}‹–%Ã>CD’‰æþ°ò™¤¹ÿGTÉ ölä&FI$b”PaºŒ¸ÅOô¨?766endstream -endobj -1093 0 obj << +xÚµ\msã¶þ~¿B}3%J¼ð¯m’¶Ó4™Ëu:¦d‰¶ÕÈ–#éιüú,I€Xa±$"'“Ù'?yvùp±Ø@ÊU ÿÉ•,ÛUmKaËfµy|S®îáë¯ÞH÷ç¢ÿ{ +˜Ã§E¿Kw·¾DwË6ƒº0²vêŽ÷ã«áó_ÃýxïïnÌÍ×Ã?ÞÁuù›ö~øý|ë$¸œuÛ³@× +Q2‚4€Ò6LqbŽ +¢@†ðØ<¬çÛõñÚ¼áè2óF@³yù§*6o¢™¼Y£ZÀ¬Ù¶!86»ãfß]7[nÞp>o UÉæÀ4“7"sT©…UUãðøüñÜmOÏé)¶©…’G\ÊÕ€¨`H)l…ˆ÷‡S·]¢—e-XÉ•²»`H”²¯Jç÷à" ‰àao´&z+m‡Ú:ð¹=$¶EÔ6Ѐ”«ýô©ûióñø)¡E
ÍJ£f¤†f¥õ‰K<Ãi¥0›ýU¥5$Xïæ‚Â] 8•8¢bZÃ- XÙaˆ9ª2¤Å²ŽEþ¼ÙïÝ„kYiv”7V”ÚxÊ…AîÀE@Ó1~I˜–C¶ÐÕB:Â$¶EÅ€ì[ÕI
nèÑ /ÜØL!€æÆrcÌäÞò`îÑ‚'G3¦ä‡s—…˜’ã¹ÇsTÝ +V$nzÔéR˜¶þõÒææ…‹ëƒvÊ(ïØ‚¬#¶`*ê3z¥…¦P#›TQ‰MQA˜”`†mÞäìÙ2'gg'gì`b争1ñ“slŽŠ±8‰±]Ÿ×w»ýµ¯§Ë«Úš«Ú°FqU"⫶ØÕB¶Bµ!0ºý~÷|ê®mp<]fƒƒàlƒƒ=TŠkpßàÄæ¨P'i":&[äE†£ËŒŒ€f#ù—%>2ÑLdDÖˆÚ¡ƒµà椪íL«§‡&Êó-µz#º@ðD«wI9LI‰VP•Á†Þˆ!æ¨F¢Ðøø´9ï×.yº¼Ð@h.4°¦äBñ¡[£Z@õizëN‹ûõÓùm¯§ËÔ" Y-|Û‹ˆf´ˆ¬Q-úi~NZ×ϯÐÂÑejЬȿ-ÑŒ‘5ª…©EU…¸xØ·Wháè2µhVäߌhF‹ÈÕB˜tB\ì»OÝž™LòÖÊ<cæZ‚³keØI~1ñke±9*ˆRPA„à角SNQï(P=ÙR:¢OT —”òr•*pàˆ(Q€bŒ*!¡–jCh<ÞÝv?ﺬa’Õáð„t)nâ,t½ÞÁ…6Ç¡§ND™žª•±¢-6L{‡!戾ÊÂh× +é{¸ýÿoÐ>>>gòăÈBÃîZZëÑ‚';.)‡g“Zíhmƒ
'—;z1G5mkÑ4aãôy}\¿b#ÄÓeö Îö ØÃT4ö +h¶BÞ%6\xøR(²Ee0Zh´·yÞ¯o»=wX&oÝsfî£#8»‘ŽÝ¬$·“Ž˜øôØ•DKRò¨»5ŸHek„cŽsA.š +rIÈèa(›Yåý¹Õa‹ +¦‚8̼9Уnͪ²ZHÕÎ>®¡Üã_“Ç5Œöé8~COb¨›ïÆÇ5>ÿøëðpÆ»·Æö_ôß¿GÏÛ„§qÆçsz¢ÄÙ?0k[åãÀ'°Ž?œ6Çî%ÝD—||C’ïçêjXH\ZTðèÁ©¾eoWWt`õUS‹
ÓÛé0Ä\2¾!háÞÔè,Çé¡Û^ßž-3¾œoì fã1ññ›K™T¡ßÎçWâØr p^äàŒ iFÈ\Z(?üóc£ o÷Ýö¸~¹rVð„™³‚³³öQknV@Lü¬›Kku +T$A“¤ó}š®´h•œ¸äpèÁ©%#G¿`×R`¢r81—–CBÊAÿÜC-¾>^=f[î˜ p~Ì uÍŽ™À43f"siAJhæÐú$²{þµ;_ýq[ª‰l)@Ftà‰ +ÁÙ +ûÇ×cˆ‰¯@bsi=úY =ásîN§k§]Ï•9í"8;íb÷êš›v?íÆæÒrTr@Or¼.…8¶Üà| +AΤÀ4“B"siA´…JÔŸ^'ˆcË$ÀyAƒ3‚¦A"siAT#Ú&DÈÏ»ûŸ×÷WâØr p^ä`"£zAÓŒ sæÜ6.¡j±zv›@ÿ®ÛïЫ»¾E~Ë€0UBNF¿/Çͥ˗M‰vz×Ô;ïÏø–©ñ5Rª½ù7|£Ñ{ÀОƒ™èej£BÂü§I¼pêxx¹v>RÖkëÜùÁÙùÈc†h’Ü|„˜øù(6—^ªÕ¢4òR‡n}õú‘'Ì,õœ-õ±Zq¥>bâKýØ\Z“FŠ²/5yÜm¯-ã<_f‡àl‡]LI2–hˆ‰/ãbsiI*PGar^ïöW‡‰#Ì
“ +˜åÖmDž˜U/)‡Íw›Š¢²¿å)1«Žb.à ˆ²¡.ßð’äyÇ—;æœóÈEzuóifÌGæÒ’”JhcðkUž’'Vh$¤*t µ{Ú²dó' ®'ßæåõèÁ‰¼1å>ÈùÓתÖbÃD^!æ’òJ[ +H8èU"çÃÝÝúîœz:nxˆä÷ûõÞv¢\ÚÿÑ‚'ö/){»M⤠*l7±ý;@ˆ±´&
|¥M¤Émww8rGÙ÷¢ôûΦ¶ç‚(] 8%¢L‹b†Ç›$6LCÅaˆ¹´,p¥¦Aû¯Kמ.3]#8›®±‡|ºFL|ºŽÍ¥©Œ¨Tè +×?tܹݬ£ž0ó肳G'° MܱÄĈͥ51 +ZàöâAÈý¾Û?¯ÏWÇ™;xœ<ÈÍDžõƒ'0ÍžÈ\Zèåj©±,ç´$y3»ç˜ٜٱ‹T?k#&ú DS»EY”ôÁ‚þ}×%þÃ/²«ˆ +endstream +endobj +1598 0 obj << /Type /Page -/Contents 1094 0 R -/Resources 1092 0 R +/Contents 1599 0 R +/Resources 1597 0 R /MediaBox [0 0 612 792] -/Parent 1091 0 R -/Annots [ 1096 0 R 1097 0 R 1098 0 R 1099 0 R 1100 0 R 1101 0 R 1102 0 R 1103 0 R 1104 0 R 1105 0 R 1106 0 R 1107 0 R 1108 0 R 1109 0 R 1110 0 R 1111 0 R 1112 0 R 1113 0 R 1114 0 R 1115 0 R 1116 0 R 1117 0 R 1118 0 R 1119 0 R 1120 0 R 1121 0 R 1122 0 R 1123 0 R 1124 0 R 1125 0 R 1126 0 R 1127 0 R 1128 0 R 1129 0 R 1130 0 R 1131 0 R 1132 0 R 1133 0 R 1134 0 R 1135 0 R 1136 0 R 1137 0 R 1138 0 R 1139 0 R 1140 0 R 1141 0 R 1142 0 R ] +/Parent 1271 0 R +/Annots [ 1601 0 R 1602 0 R 1603 0 R 1604 0 R 1605 0 R 1606 0 R 1607 0 R 1608 0 R 1609 0 R 1610 0 R 1611 0 R 1612 0 R 1613 0 R 1614 0 R 1615 0 R 1616 0 R 1617 0 R 1618 0 R 1619 0 R 1620 0 R 1621 0 R 1622 0 R 1623 0 R 1624 0 R 1625 0 R 1626 0 R 1627 0 R 1628 0 R 1629 0 R 1630 0 R 1631 0 R 1632 0 R 1633 0 R 1634 0 R 1635 0 R 1636 0 R 1637 0 R 1638 0 R 1639 0 R 1640 0 R 1641 0 R 1642 0 R 1643 0 R 1644 0 R 1645 0 R 1646 0 R 1647 0 R 1648 0 R 1649 0 R 1650 0 R 1651 0 R 1652 0 R 1653 0 R 1654 0 R 1655 0 R 1656 0 R 1657 0 R 1658 0 R 1659 0 R 1660 0 R 1661 0 R 1662 0 R 1663 0 R 1664 0 R 1665 0 R 1666 0 R 1667 0 R 1668 0 R 1669 0 R 1670 0 R 1671 0 R 1672 0 R 1673 0 R 1674 0 R 1675 0 R 1676 0 R 1677 0 R 1678 0 R 1679 0 R ] >> endobj -1096 0 obj << +1601 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.036 650.504 192.991 660.825] +/Rect [132.309 619.086 144.264 629.273] /Subtype /Link -/A << /S /GoTo /D (page.38) >> +/A << /S /GoTo /D (section*.25) >> >> endobj -1097 0 obj << +1602 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.036 638.549 192.991 648.87] +/Rect [137.39 607.131 149.345 617.318] /Subtype /Link -/A << /S /GoTo /D (page.35) >> +/A << /S /GoTo /D (section*.16) >> >> endobj -1098 0 obj << +1603 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [175.955 626.724 187.91 636.915] +/Rect [157.714 595.176 169.669 605.362] /Subtype /Link -/A << /S /GoTo /D (page.35) >> +/A << /S /GoTo /D (section*.17) >> >> endobj -1099 0 obj << +1604 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [190.899 626.724 202.854 636.915] +/Rect [157.714 583.221 169.669 593.407] /Subtype /Link -/A << /S /GoTo /D (page.46) >> +/A << /S /GoTo /D (section*.73) >> >> endobj -1100 0 obj << +1605 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.793 614.768 177.748 624.96] +/Rect [147.552 571.265 159.507 581.452] /Subtype /Link -/A << /S /GoTo /D (page.38) >> +/A << /S /GoTo /D (section*.17) >> >> endobj -1101 0 obj << +1606 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.793 602.813 177.748 613.005] +/Rect [152.633 559.31 164.588 569.497] /Subtype /Link -/A << /S /GoTo /D (page.37) >> +/A << /S /GoTo /D (section*.72) >> >> endobj -1102 0 obj << +1607 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [150.55 590.858 162.505 601.05] +/Rect [167.876 547.16 179.831 557.542] /Subtype /Link -/A << /S /GoTo /D (page.34) >> +/A << /S /GoTo /D (section*.72) >> >> endobj -1103 0 obj << +1608 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [160.712 578.773 172.667 589.094] +/Rect [157.714 535.4 169.669 545.587] /Subtype /Link -/A << /S /GoTo /D (page.35) >> +/A << /S /GoTo /D (section*.35) >> >> endobj -1104 0 obj << +1609 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [175.656 578.773 187.611 589.094] +/Rect [147.552 523.445 159.507 533.631] /Subtype /Link -/A << /S /GoTo /D (page.45) >> +/A << /S /GoTo /D (section*.24) >> >> endobj -1105 0 obj << +1610 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.036 566.818 192.991 577.139] +/Rect [228.648 499.34 240.603 509.721] /Subtype /Link -/A << /S /GoTo /D (page.38) >> +/A << /S /GoTo /D (section*.132) >> >> endobj -1106 0 obj << +1611 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [145.469 554.993 157.424 565.184] +/Rect [269.396 487.579 281.351 497.766] /Subtype /Link -/A << /S /GoTo /D (page.13) >> +/A << /S /GoTo /D (section*.31) >> >> endobj -1107 0 obj << +1612 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [150.55 543.037 162.505 553.229] +/Rect [178.038 475.429 189.993 485.811] /Subtype /Link -/A << /S /GoTo /D (page.51) >> +/A << /S /GoTo /D (section*.31) >> >> endobj -1108 0 obj << +1613 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.036 530.953 192.991 541.274] +/Rect [228.748 463.474 240.703 473.856] /Subtype /Link -/A << /S /GoTo /D (page.42) >> +/A << /S /GoTo /D (section*.131) >> >> endobj -1109 0 obj << +1614 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [155.631 518.998 167.586 529.319] +/Rect [208.424 451.714 220.379 461.9] /Subtype /Link -/A << /S /GoTo /D (page.11) >> +/A << /S /GoTo /D (section*.29) >> >> endobj -1110 0 obj << +1615 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [155.631 507.042 167.586 517.363] +/Rect [147.552 439.564 159.507 449.945] /Subtype /Link -/A << /S /GoTo /D (page.50) >> +/A << /S /GoTo /D (section*.29) >> >> endobj -1111 0 obj << +1616 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [149.647 495.217 156.621 505.408] +/Rect [157.714 427.803 169.669 437.99] /Subtype /Link -/A << /S /GoTo /D (page.5) >> +/A << /S /GoTo /D (section*.75) >> >> endobj -1112 0 obj << +1617 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [135.307 483.262 147.263 493.453] +/Rect [152.633 415.653 164.588 426.035] /Subtype /Link -/A << /S /GoTo /D (page.39) >> +/A << /S /GoTo /D (section*.27) >> >> endobj -1113 0 obj << +1618 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [145.469 471.306 157.424 481.498] +/Rect [157.714 403.893 169.669 414.08] /Subtype /Link -/A << /S /GoTo /D (page.18) >> +/A << /S /GoTo /D (section*.32) >> >> endobj -1114 0 obj << +1619 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [175.955 449.389 187.91 459.58] +/Rect [162.795 391.743 174.75 402.125] /Subtype /Link -/A << /S /GoTo /D (page.30) >> +/A << /S /GoTo /D (section*.133) >> >> endobj -1115 0 obj << +1620 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [211.521 437.304 218.495 447.625] +/Rect [157.714 379.983 169.669 390.169] /Subtype /Link -/A << /S /GoTo /D (page.5) >> +/A << /S /GoTo /D (section*.69) >> >> endobj -1116 0 obj << +1621 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [170.874 425.478 177.848 435.53] +/Rect [157.714 367.752 169.669 378.214] /Subtype /Link -/A << /S /GoTo /D (page.7) >> +/A << /S /GoTo /D (section*.35) >> >> endobj -1117 0 obj << +1622 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [170.874 413.394 177.848 423.715] +/Rect [157.714 355.797 169.669 366.259] /Subtype /Link -/A << /S /GoTo /D (page.4) >> +/A << /S /GoTo /D (section*.35) >> >> endobj -1118 0 obj << +1623 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [180.837 413.394 187.81 423.715] +/Rect [157.714 344.117 169.669 354.304] /Subtype /Link -/A << /S /GoTo /D (page.7) >> +/A << /S /GoTo /D (section*.35) >> >> endobj -1119 0 obj << +1624 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [170.874 401.438 177.848 411.759] +/Rect [167.876 332.162 179.831 342.349] /Subtype /Link -/A << /S /GoTo /D (page.4) >> +/A << /S /GoTo /D (section*.74) >> >> endobj -1120 0 obj << +1625 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [145.469 389.483 157.424 399.804] +/Rect [142.471 320.207 154.426 330.394] /Subtype /Link -/A << /S /GoTo /D (page.38) >> +/A << /S /GoTo /D (section*.11) >> >> endobj -1121 0 obj << +1626 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [170.874 377.658 177.848 387.849] +/Rect [238.91 308.252 250.865 318.438] /Subtype /Link -/A << /S /GoTo /D (page.5) >> +/A << /S /GoTo /D (section*.135) >> >> endobj -1122 0 obj << +1627 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.388 365.573 152.344 375.894] +/Rect [177.938 295.97 189.893 306.483] /Subtype /Link -/A << /S /GoTo /D (page.31) >> +/A << /S /GoTo /D (section*.104) >> >> endobj -1123 0 obj << +1628 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [211.521 353.618 223.476 363.939] +/Rect [152.633 284.147 164.588 294.528] /Subtype /Link -/A << /S /GoTo /D (page.32) >> +/A << /S /GoTo /D (section*.70) >> >> endobj -1124 0 obj << +1629 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [196.279 341.663 208.234 351.984] +/Rect [203.443 272.191 215.398 282.573] /Subtype /Link -/A << /S /GoTo /D (page.32) >> +/A << /S /GoTo /D (section*.133) >> >> endobj -1125 0 obj << +1630 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.793 319.745 177.748 330.066] +/Rect [157.714 260.156 169.669 270.618] /Subtype /Link -/A << /S /GoTo /D (page.15) >> +/A << /S /GoTo /D (section*.37) >> >> endobj -1126 0 obj << +1631 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.388 297.956 152.344 308.148] +/Rect [147.552 248.281 159.507 258.663] /Subtype /Link -/A << /S /GoTo /D (page.12) >> +/A << /S /GoTo /D (section*.71) >> >> endobj -1127 0 obj << +1632 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [145.469 286.001 157.424 296.193] +/Rect [162.795 236.245 174.75 246.707] /Subtype /Link -/A << /S /GoTo /D (page.27) >> +/A << /S /GoTo /D (section*.73) >> >> endobj -1128 0 obj << +1633 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [145.469 274.046 157.424 284.238] +/Rect [152.633 224.29 164.588 234.752] /Subtype /Link -/A << /S /GoTo /D (page.13) >> +/A << /S /GoTo /D (section*.12) >> >> endobj -1129 0 obj << +1634 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [145.469 262.091 157.424 272.282] +/Rect [157.714 212.416 169.669 222.797] /Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (section*.11) >> >> endobj -1130 0 obj << +1635 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.793 250.006 177.748 260.327] +/Rect [238.91 200.46 250.865 210.842] /Subtype /Link -/A << /S /GoTo /D (page.42) >> +/A << /S /GoTo /D (section*.136) >> >> endobj -1131 0 obj << +1636 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [145.469 238.181 157.424 248.372] +/Rect [228.748 188.505 240.703 198.887] /Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (section*.131) >> >> endobj -1132 0 obj << +1637 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.793 226.096 177.748 236.417] +/Rect [137.39 176.745 149.345 186.932] /Subtype /Link -/A << /S /GoTo /D (page.42) >> +/A << /S /GoTo /D (section*.13) >> >> endobj -1133 0 obj << +1638 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [145.469 214.141 157.424 224.462] +/Rect [167.876 164.514 179.831 174.976] /Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (section*.14) >> >> endobj -1134 0 obj << +1639 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.793 202.186 177.748 212.507] +/Rect [147.552 152.835 159.507 163.021] /Subtype /Link -/A << /S /GoTo /D (page.42) >> +/A << /S /GoTo /D (section*.26) >> >> endobj -1135 0 obj << +1640 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.388 180.268 152.344 190.589] +/Rect [178.038 140.879 189.993 151.066] /Subtype /Link -/A << /S /GoTo /D (page.12) >> +/A << /S /GoTo /D (section*.97) >> >> endobj -1136 0 obj << +1641 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [145.469 168.313 157.424 178.634] +/Rect [183.119 128.729 195.074 139.111] /Subtype /Link -/A << /S /GoTo /D (page.13) >> +/A << /S /GoTo /D (section*.97) >> >> endobj -1137 0 obj << +1642 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [145.469 156.357 157.424 166.679] +/Rect [383.31 633.283 395.266 643.47] /Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (section*.96) >> >> endobj -1138 0 obj << +1643 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.793 144.402 177.748 154.723] +/Rect [383.31 621.328 395.266 631.514] /Subtype /Link -/A << /S /GoTo /D (page.42) >> +/A << /S /GoTo /D (section*.95) >> >> endobj -1139 0 obj << +1644 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [145.469 132.447 157.424 142.768] +/Rect [362.987 609.373 374.942 619.559] /Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (section*.33) >> >> endobj -1140 0 obj << +1645 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [378.229 650.504 390.184 660.825] +/Rect [378.229 576.496 390.185 586.683] /Subtype /Link -/A << /S /GoTo /D (page.42) >> +/A << /S /GoTo /D (section*.59) >> >> endobj -1141 0 obj << +1646 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [357.905 628.716 369.86 638.908] +/Rect [362.987 564.541 374.942 574.727] /Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (section*.52) >> >> endobj -1142 0 obj << +1647 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [357.905 616.761 369.86 626.952] +/Rect [362.987 552.586 374.942 562.772] /Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (section*.53) >> >> endobj -1095 0 obj << -/D [1093 0 R /XYZ 110.999 687.904 null] +1648 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.31 540.63 395.266 550.817] +/Subtype /Link +/A << /S /GoTo /D (section*.51) >> >> endobj -1092 0 obj << -/Font << /F78 368 0 R /F88 386 0 R /F87 383 0 R >> +1649 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.825 528.675 364.78 538.862] +/Subtype /Link +/A << /S /GoTo /D (section*.50) >> +>> endobj +1650 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 516.445 374.942 526.907] +/Subtype /Link +/A << /S /GoTo /D (section*.61) >> +>> endobj +1651 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.906 504.49 369.861 514.952] +/Subtype /Link +/A << /S /GoTo /D (section*.62) >> +>> endobj +1652 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.229 492.534 390.185 502.996] +/Subtype /Link +/A << /S /GoTo /D (section*.57) >> +>> endobj +1653 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.906 480.579 369.861 491.041] +/Subtype /Link +/A << /S /GoTo /D (section*.60) >> +>> endobj +1654 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.906 468.899 369.861 479.086] +/Subtype /Link +/A << /S /GoTo /D (section*.66) >> +>> endobj +1655 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 456.944 374.942 467.131] +/Subtype /Link +/A << /S /GoTo /D (section*.66) >> +>> endobj +1656 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.825 444.794 364.78 455.176] +/Subtype /Link +/A << /S /GoTo /D (section*.54) >> +>> endobj +1657 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.148 432.839 385.104 443.22] +/Subtype /Link +/A << /S /GoTo /D (section*.81) >> +>> endobj +1658 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.229 420.884 390.185 431.265] +/Subtype /Link +/A << /S /GoTo /D (section*.55) >> +>> endobj +1659 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.148 408.929 385.104 419.31] +/Subtype /Link +/A << /S /GoTo /D (section*.64) >> +>> endobj +1660 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 397.168 374.942 407.355] +/Subtype /Link +/A << /S /GoTo /D (section*.66) >> +>> endobj +1661 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.148 385.213 385.104 395.4] +/Subtype /Link +/A << /S /GoTo /D (section*.58) >> +>> endobj +1662 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.906 373.258 369.861 383.445] +/Subtype /Link +/A << /S /GoTo /D (section*.63) >> +>> endobj +1663 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.825 361.303 364.78 371.489] +/Subtype /Link +/A << /S /GoTo /D (section*.142) >> +>> endobj +1664 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 349.348 374.942 359.534] +/Subtype /Link +/A << /S /GoTo /D (section*.65) >> +>> endobj +1665 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 337.392 374.942 347.579] +/Subtype /Link +/A << /S /GoTo /D (section*.66) >> +>> endobj +1666 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 325.162 374.942 335.624] +/Subtype /Link +/A << /S /GoTo /D (section*.58) >> +>> endobj +1667 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.906 292.561 369.861 302.747] +/Subtype /Link +/A << /S /GoTo /D (section*.47) >> +>> endobj +1668 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.229 280.605 390.185 290.792] +/Subtype /Link +/A << /S /GoTo /D (section*.48) >> +>> endobj +1669 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.148 268.65 385.104 278.837] +/Subtype /Link +/A << /S /GoTo /D (section*.48) >> +>> endobj +1670 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.229 256.695 390.185 266.882] +/Subtype /Link +/A << /S /GoTo /D (section*.48) >> +>> endobj +1671 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.068 223.818 380.023 234.005] +/Subtype /Link +/A << /S /GoTo /D (section*.40) >> +>> endobj +1672 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.148 211.863 385.104 222.05] +/Subtype /Link +/A << /S /GoTo /D (section*.134) >> +>> endobj +1673 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [428.94 199.908 440.895 210.095] +/Subtype /Link +/A << /S /GoTo /D (section*.43) >> +>> endobj +1674 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [388.391 187.953 400.347 198.14] +/Subtype /Link +/A << /S /GoTo /D (section*.150) >> +>> endobj +1675 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.472 175.998 405.428 186.184] +/Subtype /Link +/A << /S /GoTo /D (section*.150) >> +>> endobj +1676 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.068 164.043 380.023 174.229] +/Subtype /Link +/A << /S /GoTo /D (section*.40) >> +>> endobj +1677 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.31 152.087 395.266 162.274] +/Subtype /Link +/A << /S /GoTo /D (section*.41) >> +>> endobj +1678 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.472 139.937 405.428 150.319] +/Subtype /Link +/A << /S /GoTo /D (section*.45) >> +>> endobj +1679 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.148 127.982 385.104 138.364] +/Subtype /Link +/A << /S /GoTo /D (section*.44) >> +>> endobj +1600 0 obj << +/D [1598 0 R /XYZ 108 690.907 null] +>> endobj +334 0 obj << +/D [1598 0 R /XYZ 108 657.93 null] +>> endobj +338 0 obj << +/D [1598 0 R /XYZ 108 645.681 null] +>> endobj +342 0 obj << +/D [1598 0 R /XYZ 323.435 603.644 null] +>> endobj +346 0 obj << +/D [1598 0 R /XYZ 323.435 319.434 null] +>> endobj +350 0 obj << +/D [1598 0 R /XYZ 323.435 250.967 null] +>> endobj +1597 0 obj << +/Font << /F94 409 0 R /F105 415 0 R /F107 429 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1145 0 obj << -/Length 892 +1682 0 obj << +/Length 3559 /Filter /FlateDecode >> stream -xÚWKsÛ6¾ûWð(Í”(À7}Ø™dÚ¤ã*§´ˆ%ÆÁ -/ß>X>¯ÔdÓ¨ågë¹æø–ê[ñ,ê–é^j¬ÔZ¬ðtôJîV^ÔSÿ+ì‹w#kQYD<öûe@Va‰¶’/…ô´2µÍ²3ŽzâҫĆ}Ôvpá¬}’å$ŽSo?Œ¾¹Æy2ûݽ|¸]wo÷v$ñŸz§VÏX‹zÖ6Fðx¶°2!y -Ó.¥1Éi1ž1ç³’—@òFÌaöMgRuÝ¡P§µH(É’üÀüá2zœ)]=Ò„IJ²¨˜èŒV5
o,Þ¢c)¥±]*'²øº?7üAxÏ4Ûs»F¯·HZ4´{hñgs^+˸õßT\ -zãuϬÛÆ眑¼óâKj5ïTfãñßêvãQ±½ßöš‹Ûy潇°»fbwbâÿ6¡ø»4¡{ä}{q»ß¥ÿM'ª¹Y£¥VÖ¢g¨Öka+˜è5 -Ûoòye=Ðþ¾5Ñû -±ò¥¹A‰ÒÇoxg%8ÈLéTÞ`œ?ðõQû7k^£ƒ\̤õåk{Ç(ŒXc%ƒ Ç$-'¿r^¾ÉN¾ØþÅظøendstream -endobj -1144 0 obj << +xÚ¥œÛr¹†ïýº´«Bd0Àp©Ýõn6ÙCÊ«‹¤’\P$e±L‰IÙ–Ÿ>˜š
t!k«T^©õ7ø±Ñ8ÌOÉ›Êþ'odÕß´¦¦ênOoª›öÛ?½‘îdzáç3ðÝÝ›?ÿhôM/LÛÞÜ=¢®u¹[þëmóÎþ^S½½}÷Ÿ»¿ŽáÂëJôµ•ÂþþnÖÖãWùöýøõ·ñ;?Œ_¿~?~~úGÙUÛcœ^ßoÞß…á7•f_ÝðóäÕIûï^è¶w/ï¦mZQ©é¥ý[*ýßûÅf{X-ÃpŒÎøêt#ºÚçOx4²éE'ƒœÍ7ýdÿñfúÇ~ +žhÏ>¤C‚CÒV&YÛ^´>Jße“dKYh-*ûzûùórû´þ¶ÚÍ)N +Déµ² ¢gˆ¸èO‘ É!o—21ö§]§L\L’.e¢j!ë1Ù¬ŸW‡”Hk‹«I"¦QAò=á)$Iém”la┈‹IÒ¥Dì4—¨’ÕÃfµ8æk¤ˆ“,%Ãi"`”MC‰J”.%2´I jdõyµ?¬2-¤îé¢Dk;Œ—;×C¦èÏ4‘SÉ!¯ªÒ.¢Dcj˜8ÓE¦˜$]B£1¨[PÛãüH´¦½‘$Û¹zÞ+žâ¢g <‚$‰òèl”j`∋IÒ¥@lÛRU€ó
Åî %:KËëÃ1EÏ@xÇ©$…ÃF5&Îà˜b’t)Ž®ª‘ +$†Ó@À Q‰Â¥ŽwÚÜheײÚßø5Õ[1~5àßþ&ðphºñæn¸Ãó+/¼ýûiüz7~ç/ã¿Ý½ßÉ{2SÆ1mÇ—v&ž«ç_ׇÇÕ|¹Y=_zÓ ¥ý…Z•Þ4€pò¦ÁÇŒ¨zê¦(Ñ7
8]Z©•E<ü¯#²œ³4Êöƒ^®p?ÂÉý a††Ûë%z?ˆÓ%4ìIBT2.øËíñ°þvñ½‹—+¤ÂIp„
y’J4
œ.¥awŸUÓÐØÍ«w‚^®l'¢© _ŽÅ´ËBôNgKYØc·¬be|ܯ—du”u/YØ9@8Ù9à(3D\W +!Ý9€3WPº”†=xKSÇÅ#1[ÊV|¯X¸âƒprŇƒÌ”‡[ͽâãt){ö®Ác0r™-,'WZ1œ.0B¦<¢S(]JÞºë>žžvëÅb¾;®·Ï‡Oë]Š¥o…ê:‹1B5Q÷=á)$9>Lî_êÊFÕ&N°ø˜$]ŠÅÀUÝžby\?>/îªN²´«Æpº«‚Q¦DBWJLWEéR"ö®:T(/Ïëã…ו^¯ðº„“וpˆMG]W%úº§KpÔö®%*/ëåå)¯XØVA8ÙVá 3õáZ&P¢Û*N—±GqÝÆúØm×ÏÄ.¤¨>¼^a}€p²>àéú +LŠ¥<B4#‘>ÃD“Ë]J
[ÿ ’¸”jÝ¥Ô÷饔Míùü>^>ý>^D}HŒi¿½³ýíí;«sç=jªÓîâjŠ¿õ‘ã%ÖðýÍ_]¤6îW!ïæo¾ºá<o¾v»Íë]úž«F4-½í´»þÆnÖ¥±þö쥗‹žðô@’ã[¡rW”0qú¾»˜$]2 † +é«xéu¿Ý2,UOIÊjvAì‹)zÂ3,N%)6JÁ¼cH’,%aWľQÄb»Ý/%eÄ´0a³1ž—”»/©+-”2a`<U=á U,9R“Ärp™Ô0qz°q1Iº”kcìÊ+ìi½ßo÷O7§V:Ýb8=ÝÀ +‡]¯XWµá]ÕrV¥æËÐxéú°9Í0®"cµfÕX’ +¤ÌX€pÆj,ÉáŒÕk¬@¹z2ö\¤ÈZ0Öj,ycŽ@8ku +)rXG ŒÃKžÂ8¬#Îa€ —õ·ë*¤Èd0&k,yc²Ž@¸t–GÛë›Fv¢¯ø{¶Îݳý‘3
ÏD&Jÿ÷`ßû±_ ùëô%ÙªÓ« n7>þáót÷ð Ó¬\]‹®Ó%r“5í¸¦ûö–hþ +n +§Á¿Á»ž^ýIm7¹²Î¸Þr5,Û6•}G+SºáäÐÇyeKm½Ä鲓S)ÚFŸ˜ +q€p(Ñ8pº<ŽÎˆxUOóý'âæ®"m^Ê +ÕöïÏ0qÑ3ž2A’#“ä ‰ê}§L\L’.ϤíD§c‰Ü@Êú·W+ìß œìßp€ ®7%ºãty McK +ØD·ù&RÄ©•‰á40À̬ñ@¢¥ËÑv¶*u⼸‰8Ò&Ãé&†'
ÙD¢ÓDPº<%Eßõ'8æûÅ°Šöt±K•ŽzçzÈ=á™r*I ÔÛW”2=dŠIÒå‘ +·ÂD%f…Aéò<ìJßÅ›´¯×5I¬´y„hºyÄÑ1Í#è0Íã4W…=ðˆüu¦×kJË–'KŽ.
D—N—çÑnrð—V®ª
¯VX œ¬8@º<€]l:÷¤]¶µ=-°Úû«´Ÿ\ñŸh‰Aï™?¿2ý-%ø úv¿ß~>‹ué«ÌŽXœKŽz®¦ŽXœ<±Xx(^`²¾=WûõáÓ¥‡ð2x8„sp,I$Ü›ñ€Û½²t‡p#ú.»ÌEüÁÿ +endstream +endobj +1681 0 obj << /Type /Page -/Contents 1145 0 R -/Resources 1143 0 R +/Contents 1682 0 R +/Resources 1680 0 R /MediaBox [0 0 612 792] -/Parent 1091 0 R +/Parent 1766 0 R +/Annots [ 1684 0 R 1685 0 R 1686 0 R 1687 0 R 1688 0 R 1689 0 R 1690 0 R 1691 0 R 1692 0 R 1693 0 R 1694 0 R 1695 0 R 1696 0 R 1697 0 R 1698 0 R 1699 0 R 1700 0 R 1701 0 R 1702 0 R 1703 0 R 1704 0 R 1705 0 R 1706 0 R 1707 0 R 1708 0 R 1709 0 R 1710 0 R 1711 0 R 1712 0 R 1713 0 R 1714 0 R 1715 0 R 1716 0 R 1717 0 R 1718 0 R 1719 0 R 1720 0 R 1721 0 R 1722 0 R 1723 0 R 1724 0 R 1725 0 R 1726 0 R 1727 0 R 1728 0 R 1729 0 R 1730 0 R 1731 0 R 1732 0 R 1733 0 R 1734 0 R 1735 0 R 1736 0 R 1737 0 R 1738 0 R 1739 0 R 1740 0 R 1741 0 R 1742 0 R 1743 0 R 1744 0 R 1745 0 R 1746 0 R 1747 0 R 1748 0 R 1749 0 R 1750 0 R 1751 0 R 1752 0 R 1753 0 R 1754 0 R 1755 0 R 1756 0 R 1757 0 R 1758 0 R 1759 0 R 1760 0 R 1761 0 R 1762 0 R 1763 0 R 1764 0 R 1765 0 R ] >> endobj -1146 0 obj << -/D [1144 0 R /XYZ 110.999 687.904 null] +1684 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.714 653.407 169.669 663.788] +/Subtype /Link +/A << /S /GoTo /D (section*.134) >> >> endobj -302 0 obj << -/D [1144 0 R /XYZ 110.999 654.928 null] +1685 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.119 641.452 195.074 651.833] +/Subtype /Link +/A << /S /GoTo /D (section*.151) >> >> endobj -306 0 obj << -/D [1144 0 R /XYZ 110.999 642.674 null] +1686 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.957 629.691 184.912 639.878] +/Subtype /Link +/A << /S /GoTo /D (section*.151) >> >> endobj -310 0 obj << -/D [1144 0 R /XYZ 110.999 181.952 null] +1687 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.957 617.541 184.912 627.923] +/Subtype /Link +/A << /S /GoTo /D (section*.105) >> >> endobj -314 0 obj << -/D [1144 0 R /XYZ 323.435 374.739 null] +1688 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.633 605.781 164.588 615.968] +/Subtype /Link +/A << /S /GoTo /D (section*.42) >> >> endobj -1143 0 obj << -/Font << /F78 368 0 R /F85 373 0 R /F88 386 0 R >> +1689 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 593.631 179.831 604.012] +/Subtype /Link +/A << /S /GoTo /D (section*.105) >> +>> endobj +1690 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.795 581.676 174.75 592.057] +/Subtype /Link +/A << /S /GoTo /D (section*.105) >> +>> endobj +1691 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.633 569.915 164.588 580.102] +/Subtype /Link +/A << /S /GoTo /D (section*.40) >> +>> endobj +1692 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.795 557.765 174.75 568.147] +/Subtype /Link +/A << /S /GoTo /D (section*.105) >> +>> endobj +1693 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.795 545.81 174.75 556.192] +/Subtype /Link +/A << /S /GoTo /D (section*.105) >> +>> endobj +1694 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.633 533.855 164.588 544.237] +/Subtype /Link +/A << /S /GoTo /D (section*.44) >> +>> endobj +1695 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.119 521.9 195.074 532.281] +/Subtype /Link +/A << /S /GoTo /D (section*.105) >> +>> endobj +1696 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.714 509.945 169.669 520.326] +/Subtype /Link +/A << /S /GoTo /D (section*.150) >> +>> endobj +1697 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 497.99 179.831 508.371] +/Subtype /Link +/A << /S /GoTo /D (section*.105) >> +>> endobj +1698 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 486.034 179.831 496.416] +/Subtype /Link +/A << /S /GoTo /D (section*.105) >> +>> endobj +1699 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 474.079 179.831 484.461] +/Subtype /Link +/A << /S /GoTo /D (section*.105) >> +>> endobj +1700 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 462.124 179.831 472.506] +/Subtype /Link +/A << /S /GoTo /D (section*.105) >> +>> endobj +1701 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 450.169 179.831 460.55] +/Subtype /Link +/A << /S /GoTo /D (section*.105) >> +>> endobj +1702 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.957 417.487 184.912 427.674] +/Subtype /Link +/A << /S /GoTo /D (section*.115) >> +>> endobj +1703 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.633 405.532 164.588 415.719] +/Subtype /Link +/A << /S /GoTo /D (section*.118) >> +>> endobj +1704 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.633 393.577 164.588 403.763] +/Subtype /Link +/A << /S /GoTo /D (section*.124) >> +>> endobj +1705 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.714 381.427 169.669 391.808] +/Subtype /Link +/A << /S /GoTo /D (section*.124) >> +>> endobj +1706 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.957 369.391 184.912 379.853] +/Subtype /Link +/A << /S /GoTo /D (section*.125) >> +>> endobj +1707 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.633 357.711 164.588 367.898] +/Subtype /Link +/A << /S /GoTo /D (section*.120) >> +>> endobj +1708 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 345.561 179.831 355.943] +/Subtype /Link +/A << /S /GoTo /D (section*.127) >> +>> endobj +1709 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.633 333.801 164.588 343.987] +/Subtype /Link +/A << /S /GoTo /D (section*.114) >> +>> endobj +1710 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.362 321.651 210.317 332.032] +/Subtype /Link +/A << /S /GoTo /D (section*.130) >> +>> endobj +1711 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.957 309.615 184.912 320.077] +/Subtype /Link +/A << /S /GoTo /D (section*.129) >> +>> endobj +1712 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.795 297.741 174.75 308.122] +/Subtype /Link +/A << /S /GoTo /D (section*.107) >> +>> endobj +1713 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 285.785 179.831 296.167] +/Subtype /Link +/A << /S /GoTo /D (section*.129) >> +>> endobj +1714 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.795 273.83 174.75 284.212] +/Subtype /Link +/A << /S /GoTo /D (section*.108) >> +>> endobj +1715 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.119 261.875 195.074 272.256] +/Subtype /Link +/A << /S /GoTo /D (section*.123) >> +>> endobj +1716 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 249.92 179.831 260.301] +/Subtype /Link +/A << /S /GoTo /D (section*.121) >> +>> endobj +1717 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.957 238.159 184.912 248.346] +/Subtype /Link +/A << /S /GoTo /D (section*.116) >> +>> endobj +1718 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.957 226.01 184.912 236.391] +/Subtype /Link +/A << /S /GoTo /D (section*.126) >> +>> endobj +1719 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.552 193.133 159.507 203.514] +/Subtype /Link +/A << /S /GoTo /D (section*.102) >> +>> endobj +1720 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.471 181.372 154.426 191.559] +/Subtype /Link +/A << /S /GoTo /D (section*.102) >> +>> endobj +1721 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.343 169.417 215.298 179.604] +/Subtype /Link +/A << /S /GoTo /D (section*.101) >> +>> endobj +1722 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.552 157.462 159.507 167.649] +/Subtype /Link +/A << /S /GoTo /D (section*.102) >> +>> endobj +1723 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.038 145.507 189.993 155.694] +/Subtype /Link +/A << /S /GoTo /D (section*.102) >> +>> endobj +1724 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.552 133.552 159.507 143.738] +/Subtype /Link +/A << /S /GoTo /D (section*.102) >> +>> endobj +1725 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.472 653.602 405.428 663.788] +/Subtype /Link +/A << /S /GoTo /D (section*.102) >> +>> endobj +1726 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.906 641.646 369.861 651.833] +/Subtype /Link +/A << /S /GoTo /D (section*.102) >> +>> endobj +1727 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.906 629.691 369.861 639.878] +/Subtype /Link +/A << /S /GoTo /D (section*.102) >> +>> endobj +1728 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.825 617.736 364.78 627.923] +/Subtype /Link +/A << /S /GoTo /D (section*.102) >> +>> endobj +1729 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 605.781 374.942 615.968] +/Subtype /Link +/A << /S /GoTo /D (section*.102) >> +>> endobj +1730 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 593.826 374.942 604.012] +/Subtype /Link +/A << /S /GoTo /D (section*.102) >> +>> endobj +1731 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 581.676 374.942 592.057] +/Subtype /Link +/A << /S /GoTo /D (section*.102) >> +>> endobj +1732 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 569.721 374.942 580.102] +/Subtype /Link +/A << /S /GoTo /D (section*.102) >> +>> endobj +1733 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 557.765 374.942 568.147] +/Subtype /Link +/A << /S /GoTo /D (section*.102) >> +>> endobj +1734 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 546.005 374.942 556.192] +/Subtype /Link +/A << /S /GoTo /D (section*.102) >> +>> endobj +1735 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 534.05 374.942 544.237] +/Subtype /Link +/A << /S /GoTo /D (section*.102) >> +>> endobj +1736 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.825 501.173 364.78 511.36] +/Subtype /Link +/A << /S /GoTo /D (section*.15) >> +>> endobj +1737 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.825 489.218 364.78 499.405] +/Subtype /Link +/A << /S /GoTo /D (section*.16) >> +>> endobj +1738 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.229 477.263 390.185 487.45] +/Subtype /Link +/A << /S /GoTo /D (section*.19) >> +>> endobj +1739 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 465.308 374.942 475.494] +/Subtype /Link +/A << /S /GoTo /D (section*.19) >> +>> endobj +1740 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 453.353 374.942 463.539] +/Subtype /Link +/A << /S /GoTo /D (section*.16) >> +>> endobj +1741 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.825 441.122 364.78 451.584] +/Subtype /Link +/A << /S /GoTo /D (section*.21) >> +>> endobj +1742 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.148 429.167 385.104 439.629] +/Subtype /Link +/A << /S /GoTo /D (section*.22) >> +>> endobj +1743 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.229 417.212 390.185 427.674] +/Subtype /Link +/A << /S /GoTo /D (section*.21) >> +>> endobj +1744 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.31 405.257 395.266 415.719] +/Subtype /Link +/A << /S /GoTo /D (section*.21) >> +>> endobj +1745 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.148 393.301 385.104 403.763] +/Subtype /Link +/A << /S /GoTo /D (section*.22) >> +>> endobj +1746 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.31 381.346 395.266 391.808] +/Subtype /Link +/A << /S /GoTo /D (section*.21) >> +>> endobj +1747 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.068 369.666 380.023 379.853] +/Subtype /Link +/A << /S /GoTo /D (section*.21) >> +>> endobj +1748 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 357.711 374.942 367.898] +/Subtype /Link +/A << /S /GoTo /D (section*.19) >> +>> endobj +1749 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.31 345.561 395.266 355.943] +/Subtype /Link +/A << /S /GoTo /D (section*.8) >> +>> endobj +1750 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [398.553 333.526 410.509 343.987] +/Subtype /Link +/A << /S /GoTo /D (section*.22) >> +>> endobj +1751 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.068 321.57 380.023 332.032] +/Subtype /Link +/A << /S /GoTo /D (section*.22) >> +>> endobj +1752 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.148 309.696 385.104 320.077] +/Subtype /Link +/A << /S /GoTo /D (section*.22) >> +>> endobj +1753 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [403.634 297.741 415.59 308.122] +/Subtype /Link +/A << /S /GoTo /D (section*.23) >> +>> endobj +1754 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.906 285.785 369.861 296.167] +/Subtype /Link +/A << /S /GoTo /D (section*.7) >> +>> endobj +1755 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [388.391 273.75 400.347 284.212] +/Subtype /Link +/A << /S /GoTo /D (section*.143) >> +>> endobj +1756 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 262.07 374.942 272.256] +/Subtype /Link +/A << /S /GoTo /D (section*.19) >> +>> endobj +1757 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 250.115 374.942 260.301] +/Subtype /Link +/A << /S /GoTo /D (section*.19) >> +>> endobj +1758 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [388.391 238.159 400.347 248.346] +/Subtype /Link +/A << /S /GoTo /D (section*.23) >> +>> endobj +1759 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.31 225.929 395.266 236.391] +/Subtype /Link +/A << /S /GoTo /D (section*.21) >> +>> endobj +1760 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.906 214.249 369.861 224.436] +/Subtype /Link +/A << /S /GoTo /D (section*.15) >> +>> endobj +1761 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 202.294 374.942 212.481] +/Subtype /Link +/A << /S /GoTo /D (section*.19) >> +>> endobj +1762 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.906 190.144 369.861 200.525] +/Subtype /Link +/A << /S /GoTo /D (section*.15) >> +>> endobj +1763 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 178.189 374.942 188.57] +/Subtype /Link +/A << /S /GoTo /D (section*.19) >> +>> endobj +1764 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.148 145.507 385.104 155.694] +/Subtype /Link +/A << /S /GoTo /D (section*.48) >> +>> endobj +1765 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.068 133.552 380.023 143.738] +/Subtype /Link +/A << /S /GoTo /D (section*.8) >> +>> endobj +1683 0 obj << +/D [1681 0 R /XYZ 108 690.907 null] +>> endobj +354 0 obj << +/D [1681 0 R /XYZ 108 444.44 null] +>> endobj +358 0 obj << +/D [1681 0 R /XYZ 108 220.281 null] +>> endobj +362 0 obj << +/D [1681 0 R /XYZ 323.435 528.321 null] +>> endobj +366 0 obj << +/D [1681 0 R /XYZ 323.435 172.46 null] +>> endobj +1680 0 obj << +/Font << /F94 409 0 R /F107 429 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1149 0 obj << -/Length 1021 +1769 0 obj << +/Length 3793 /Filter /FlateDecode >> stream -xÚWßoœ8~Ï_Ác"u}ŒÁ½þHÓë]ª–«*]ûàïb…ÅÈ°Í’¿þŒ—Š„ÐÎ7Ÿg&3þèùêzú€âá$ÄG^¶»ò½2Ý^Á⃠@êM™þL¯þx'^Æ^ºÑˆ4ÿïݬ ùׯo~¦5$0{Hàƒ$`ŸoVêgpýN¿ÿ£ßßêç~¾1¬_GºñÄ0"*à!Ž{ÄÕ»tŒ6Lˆ•ƒ¿”ÊJ[£P½ `bæ¤hqx‘“Êè'1ÞO¹~2r%±Ž
îf~·ú™ê_>è÷!³Ä8w@D -NÃs¯;ñ^wå—ÙªÎ
5Њ'=d£¡‹ø×'¤îèþ÷÷3ο$"ƒëÝé]Ç Žá0Smh]—]j)íZˆÆÖ™2oæõ#©;åX‹Wó@ ãÅÕó°*Ÿ¨¼òA„’y«q)…´„)Ù¦dYK×bokU)ZÚ2§‘J±¯r[“e´´
sSðíÜv/mcz˜sšÆ’V6ÒC×<ÒÚMç¢í\´O.ϧÑówÇ/ˆÙq|Ôÿ܇–ø¾¨Sãq«I‹Ï»Ë`Š -úº´c"ˆÏvÌÔØ.ïE¾= -öQi?Ï@÷gâ½ Ã À8š]Y©hXT,ùg%¯õÊåZÇr¶Þo7´lس¨Vî™kóSS³q®~^ÑҨģäVÙDƪ–I–Ÿ–U;ðùêô ¥ú`±«Kºf -ñ‹É’vÏ ”à×Vc_ÕõZ,€—œ Y³ß±þ”šW[ÛÖÑŠz2ñìö -+䎵t#¬—Å€¨/ÂsÄR}±‰0«cŸbäœâĽ‡ÃaŠ?\ìÒpX fùÛMÈOùï|™/Ó‹Ÿ”êŽÚòêRW”ê)í¢`é+:$j
òƒóOìÿ§×'@endstream -endobj -1148 0 obj << +xÚ¥œÛn¹†ïýº”4Ó<õáÒñ²Á"¬• +~ÊvDþëþñéü†etòÊ͈ ç3
o%#‚ÓJFDá( +(OÆÈ€‚àÔÖŠÅQkÑZ=ûmàðêÉ)ŽÈ’ÁÑ€JV80Åá5$Å¡«¡‰8ÒÅŠZµ|j4¢–³×Vf⩉±0äò¢tøÈ(‘£†D£ ”VÐ?û{®ëÎ\B¼]îäü‚F˜(ÓœV–(¥!•°µ
4ØN+s–x¿ÜYäü,ACLà˜fIpZ™%Q8Š£„Ò¨OÿýÒõ—çÆè–›³šÏŒ0¼•Ä˜}Vòb‹p0
L§ +¥Å§sr!É©“W^µ@j®ZàÁ%0øJ€ŒøjG£ êÊ…œ9Üôûîø˜*ìp![ÙùÑÂØL~[ÓcA˜Cnr4¢mk517FI‹’¨Œ¨O fZäTLN™HÎTàÁ±Èˆ=¨ˆƒQV‰ºmGÉI‘×hN>™&’³&ßh"'¾ÑŒÃQÐC6Ʊø9‘×hN^™&’³&^ªDŒM$râÍÕpn¿j œRBVf:Ÿ´åµ¾¶Ë?疟й%Ì;7k€¬œfÍxy3œLÞÏ*ÇÓËߺ6׿̇›KÑ/Hêã,>¹Bå>h!}þo©
ô?]ÿúíùötx½¸²•ðó@˜ÜÒä|móšâœVª[Ž$4ì%D)B²y~xÙß%Hˆ•µ_ÃÌ‘³ßÖâ?ª$O¬þKK·J-{5´È(¹ì9
‰FiÀ~»´õLc q¿»ýòøÐ^3½‘Bµ|åoPu=Ûn@ñêÉ)”ÈÒÅiÜV(Ûช×h +ì¾e©PÎý—XP•äOi›v˜ƒ“ë¯.œ2‰,&0÷¸`”`2jH4ʶÒĉÒwçK›æÉ1³kFr¶mƃ¬S;—Ê2JôÍ£†D£<`.Û(GöÇîp1ï˜Ë#Èyh<`´Â#ŠFyÀv\é(?Ž§ßûýùâzòÌ\iœ]ið0)W`"#£ÄB3jH4J¶äª‘˜H¿ëî§Ç‹3Ä;æfHó‚Ù°ŒV2$ŠFyÀž\«Ð‹Ow»ãy×ïîﺗóþtLt$°|YÍî;UÙ +«fãu,^\ 5¡&×_-•-%ŽJ LŒBý¹®%†²Ú¢e.5Þ5w© r~©AM´h°¶JÛâÀÉõ×iH8E5c£Œ¡°MZÞqÕd™y\…äìqe•:£i¡Þ £ä!Óh|ì¦ÂYòürènw©É+%“cf)Ar¶”àAZ®” #¾”ÄÑ(ÊÍ/œ §ßvý¡ûÆAÉëZ'ÛÌ®ÉÙ®´âºVdÄwq4 +¶òþdddÒwkŵ©`òÉXÛÙv‹É(.‚:da˜\Ui„†‚lhmõ’8åûyÛb ®{¿½=}½xÒxÇÜIäü¤Aƒ¬ØIŒV&MòPðGÇÆŒ©¥ +ÇM4$£†D£``z¹GvËóîÜ=œŽç‹—ÞÑ1wåÕü†hÙuw¶YYv—¡ +Ø¶1‹—ÓëÅ,&ËLHÎÒÀ£dq #žGiÜX» +(âª8ª© +4ËM3[nQÕ’'¨,-‡Dk)ץ㸠(ƒ„K3‘œ!y}:ì;¨ #s‰ÌjH¢m8³
c)M£´ð#ÚŽ—î}çñbÞ2—Gó@Ð(µáˆ#I,ÉÄÂC—-÷§3› Y…ÄûeÖ‘ fË`*?Æ +|ø"ÅJÓh¬+(Cúî÷—Ý‘¹rgwﺂ¬Ò“Ý
¯.œâˆ,´ªºƒvXêâ5$\šH]ÂÖpòx8ݺ«ÉóóÃo]¿ïnSdSÅÀ¢]êj²^‡3‰‹ &l"á©P4*èÛE%d&I+
Æ6BÚÐ}>u继ßï/No—›*AΧ +áJª§•T‰Â¥‰˜ +š’Ðz>íº{X~_vé»ý’¯%V¹¡yÃ
&^] 9eY2åÄ·7
L™x
—f¢¡ú˜%÷&˜ïJÜÅÛ»Jf\±óžX¼º@rŠ%²Lw%fØÄH˜Î¯!áÒX”ªi£ûÊ/Ï·»þÒ•x²Ì\‰‘œ]‰ñ(¥bVbdÄ®Äq°4Y +
f2,Åço‡ËSÅ{æ¦J󩂆i,›*Ái%U¢pI,¦mÌÞËùÛËÅmýd™™*HΦ +%¥âó +ìw}òùY^ªxÏÜT r>UÐ0WR%8¤J.ÅÑÊ(U^º}éÙÊd˜y¶‚äìÙ +c"Uü¹ râÏVâpi&FÁä’ *9¼©Ñ|®´î=Ó乕*ƒ¸@êD¦,¹D‘T8l"QF
‰–†¢¥(Ñã<ååP¼g&” f¡ A®@ F+P¢hi(Ð@–v‘)çÝñuºôºt2Ì-´AÎZ4F¥ÙBœV +m.ͤ¬‡ÇZˆÉW¦Oɬ(Þ0·¢9_QÐ%{Z‹œV*J.ÉDµVH³È“oob2f2Ar– #Ï9ñLâpi&5Êwt}ù=Çd—yÏäì=!Ïœø{ŽÕpþ©~T¼þTDú§"éSEk:§üóðÜãúíy?¢ßž·x0òqþ÷§rx12ý[Ô_ñ/׋^ŒX¡¦Šú‡Ûîîócúr¼gúÍáͶå÷&¨¡ü*˜zóiФ.<±7YZu°J.TµÁ{“QCÂ¥óÛýÎ5tç®|¹<oÎ{ÃÜ9äüœGc¤Læ9œVæ|.ÍDUB£›¼‡ýáð6&Þ0—IóLÐW˜§&Q¸4˜AÆèå}ï[6k“afälǘ`âûäÄ÷q¸4Øü›¦YÜø¾-O¼anž9Ÿ'hŒ+yœVò$ +—d"açoµÆ÷U÷»‡ýqÇ€É;š\3œ=ÂUì¡!rââpi0°ý·5º©9íç·L É0s!9;ðù „œø ‡K3½….òÎÃ{nJÞåæd™y¹‰äìå&eŠÊps‰ŒØËÍÕ`¾½’š$£3Ú+åÛ«ïRí•5íâ%î?¡þ*ÑY}˜û¨©›úðÞèë®<ŵ¢v…HgÕß=uý™ù5N
_ÝÓ^;üš™Úlo£Fu䉸´>?“šNî'CNôù9T)9BíH¶zø~èÿ2®@õ +endstream +endobj +1768 0 obj << /Type /Page -/Contents 1149 0 R -/Resources 1147 0 R +/Contents 1769 0 R +/Resources 1767 0 R /MediaBox [0 0 612 792] -/Parent 1091 0 R +/Parent 1766 0 R +/Annots [ 1771 0 R 1772 0 R 1773 0 R 1774 0 R 1775 0 R 1776 0 R 1777 0 R 1778 0 R 1779 0 R 1780 0 R 1781 0 R 1782 0 R 1783 0 R 1784 0 R 1785 0 R 1786 0 R 1787 0 R 1788 0 R 1789 0 R 1790 0 R 1791 0 R 1792 0 R 1793 0 R 1794 0 R 1795 0 R 1796 0 R 1797 0 R 1798 0 R 1799 0 R 1800 0 R 1801 0 R 1802 0 R 1803 0 R 1804 0 R 1805 0 R 1806 0 R 1807 0 R 1808 0 R 1809 0 R 1810 0 R 1811 0 R 1812 0 R 1813 0 R 1814 0 R 1815 0 R 1816 0 R 1817 0 R 1818 0 R 1819 0 R 1820 0 R 1821 0 R 1822 0 R 1823 0 R 1824 0 R 1825 0 R 1826 0 R 1827 0 R 1828 0 R 1829 0 R 1830 0 R 1831 0 R 1832 0 R 1833 0 R 1834 0 R 1835 0 R 1836 0 R 1837 0 R 1838 0 R 1839 0 R 1840 0 R 1841 0 R 1842 0 R 1843 0 R 1844 0 R 1845 0 R 1846 0 R 1847 0 R 1848 0 R 1849 0 R 1850 0 R 1851 0 R ] >> endobj -1150 0 obj << -/D [1148 0 R /XYZ 110.999 687.904 null] +1771 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.471 653.602 154.426 663.788] +/Subtype /Link +/A << /S /GoTo /D (section*.8) >> >> endobj -318 0 obj << -/D [1148 0 R /XYZ 110.999 662.997 null] +1772 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.633 641.646 164.588 651.833] +/Subtype /Link +/A << /S /GoTo /D (section*.48) >> >> endobj -322 0 obj << -/D [1148 0 R /XYZ 110.999 452.597 null] +1773 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.39 629.691 149.345 639.878] +/Subtype /Link +/A << /S /GoTo /D (section*.8) >> >> endobj -326 0 obj << -/D [1148 0 R /XYZ 110.999 230.519 null] +1774 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.552 617.736 159.507 627.923] +/Subtype /Link +/A << /S /GoTo /D (section*.8) >> >> endobj -330 0 obj << -/D [1148 0 R /XYZ 323.435 442.883 null] +1775 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.552 605.781 159.507 615.968] +/Subtype /Link +/A << /S /GoTo /D (section*.48) >> >> endobj -334 0 obj << -/D [1148 0 R /XYZ 323.435 161.03 null] +1776 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 593.631 179.831 604.012] +/Subtype /Link +/A << /S /GoTo /D (section*.48) >> >> endobj -1147 0 obj << -/Font << /F78 368 0 R /F88 386 0 R >> +1777 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.633 581.871 164.588 592.057] +/Subtype /Link +/A << /S /GoTo /D (section*.48) >> +>> endobj +1778 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [132.309 569.915 144.264 580.102] +/Subtype /Link +/A << /S /GoTo /D (section*.8) >> +>> endobj +1779 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.633 557.685 164.588 568.147] +/Subtype /Link +/A << /S /GoTo /D (section*.48) >> +>> endobj +1780 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.957 545.73 184.912 556.192] +/Subtype /Link +/A << /S /GoTo /D (section*.48) >> +>> endobj +1781 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.714 533.775 169.669 544.237] +/Subtype /Link +/A << /S /GoTo /D (section*.48) >> +>> endobj +1782 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 522.095 179.831 532.281] +/Subtype /Link +/A << /S /GoTo /D (section*.8) >> +>> endobj +1783 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.957 510.14 184.912 520.326] +/Subtype /Link +/A << /S /GoTo /D (section*.8) >> +>> endobj +1784 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 497.99 179.831 508.371] +/Subtype /Link +/A << /S /GoTo /D (section*.8) >> +>> endobj +1785 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.714 486.229 169.669 496.416] +/Subtype /Link +/A << /S /GoTo /D (section*.8) >> +>> endobj +1786 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.038 473.999 189.993 484.461] +/Subtype /Link +/A << /S /GoTo /D (section*.8) >> +>> endobj +1787 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.471 462.124 154.426 472.506] +/Subtype /Link +/A << /S /GoTo /D (section*.8) >> +>> endobj +1788 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [132.309 450.364 144.264 460.55] +/Subtype /Link +/A << /S /GoTo /D (section*.8) >> +>> endobj +1789 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.633 438.133 164.588 448.595] +/Subtype /Link +/A << /S /GoTo /D (section*.8) >> +>> endobj +1790 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.038 405.337 189.993 415.719] +/Subtype /Link +/A << /S /GoTo /D (section*.9) >> +>> endobj +1791 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.795 393.382 169.769 403.763] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.5) >> +>> endobj +1792 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.281 381.346 200.255 391.684] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.8) >> +>> endobj +1793 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.2 369.391 195.174 379.729] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.8) >> +>> endobj +1794 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 357.516 174.85 367.774] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.10) >> +>> endobj +1795 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 345.561 174.85 355.819] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.10) >> +>> endobj +1796 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.038 333.606 185.012 343.864] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.10) >> +>> endobj +1797 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 321.57 174.85 332.032] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.11) >> +>> endobj +1798 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.524 309.696 215.498 320.077] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.6) >> +>> endobj +1799 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.2 297.741 200.155 308.122] +/Subtype /Link +/A << /S /GoTo /D (section*.9) >> +>> endobj +1800 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.957 285.785 179.931 296.167] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.5) >> +>> endobj +1801 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 273.83 174.85 284.212] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.2) >> +>> endobj +1802 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.281 261.875 200.255 272.256] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.3) >> +>> endobj +1803 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.362 249.839 205.336 260.177] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.7) >> +>> endobj +1804 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 238.159 174.85 248.346] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.4) >> +>> endobj +1805 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.119 226.01 190.093 236.391] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.3) >> +>> endobj +1806 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [213.605 214.054 220.579 224.436] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.6) >> +>> endobj +1807 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.957 202.294 179.931 212.481] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.1) >> +>> endobj +1808 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.957 190.144 179.931 200.525] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.1) >> +>> endobj +1809 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.957 178.189 179.931 188.57] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.2) >> +>> endobj +1810 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.443 166.153 210.417 176.491] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.7) >> +>> endobj +1811 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.957 154.473 179.931 164.66] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.4) >> +>> endobj +1812 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.31 639.13 395.266 649.591] +/Subtype /Link +/A << /S /GoTo /D (section*.18) >> +>> endobj +1813 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [388.391 627.45 400.347 637.636] +/Subtype /Link +/A << /S /GoTo /D (section*.122) >> +>> endobj +1814 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [388.391 615.494 400.347 625.681] +/Subtype /Link +/A << /S /GoTo /D (section*.119) >> +>> endobj +1815 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [388.391 603.344 400.347 613.726] +/Subtype /Link +/A << /S /GoTo /D (section*.56) >> +>> endobj +1816 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.31 591.584 395.266 601.771] +/Subtype /Link +/A << /S /GoTo /D (section*.119) >> +>> endobj +1817 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.068 579.434 380.023 589.816] +/Subtype /Link +/A << /S /GoTo /D (section*.110) >> +>> endobj +1818 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [429.039 567.399 440.994 577.86] +/Subtype /Link +/A << /S /GoTo /D (section*.138) >> +>> endobj +1819 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.068 555.719 380.023 565.905] +/Subtype /Link +/A << /S /GoTo /D (section*.112) >> +>> endobj +1820 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.229 543.569 390.185 553.95] +/Subtype /Link +/A << /S /GoTo /D (section*.117) >> +>> endobj +1821 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.472 531.533 405.428 541.995] +/Subtype /Link +/A << /S /GoTo /D (section*.122) >> +>> endobj +1822 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [388.391 519.658 400.347 530.04] +/Subtype /Link +/A << /S /GoTo /D (section*.4) >> +>> endobj +1823 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.472 507.703 405.428 518.085] +/Subtype /Link +/A << /S /GoTo /D (section*.83) >> +>> endobj +1824 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [388.391 495.748 400.347 506.129] +/Subtype /Link +/A << /S /GoTo /D (section*.83) >> +>> endobj +1825 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [347.744 483.793 359.699 494.174] +/Subtype /Link +/A << /S /GoTo /D (section*.110) >> +>> endobj +1826 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.906 471.838 369.861 482.219] +/Subtype /Link +/A << /S /GoTo /D (section*.110) >> +>> endobj +1827 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.31 459.882 395.266 470.264] +/Subtype /Link +/A << /S /GoTo /D (section*.113) >> +>> endobj +1828 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [418.877 447.847 430.833 458.309] +/Subtype /Link +/A << /S /GoTo /D (section*.18) >> +>> endobj +1829 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [418.877 436.167 430.833 446.354] +/Subtype /Link +/A << /S /GoTo /D (section*.20) >> +>> endobj +1830 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [403.634 423.936 415.59 434.398] +/Subtype /Link +/A << /S /GoTo /D (section*.18) >> +>> endobj +1831 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.472 412.257 405.428 422.443] +/Subtype /Link +/A << /S /GoTo /D (section*.20) >> +>> endobj +1832 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [403.634 400.301 415.59 410.488] +/Subtype /Link +/A << /S /GoTo /D (section*.20) >> +>> endobj +1833 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.472 388.346 405.428 398.533] +/Subtype /Link +/A << /S /GoTo /D (section*.138) >> +>> endobj +1834 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.31 376.391 395.266 386.578] +/Subtype /Link +/A << /S /GoTo /D (section*.138) >> +>> endobj +1835 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.472 364.436 405.428 374.623] +/Subtype /Link +/A << /S /GoTo /D (section*.138) >> +>> endobj +1836 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.229 352.286 390.185 362.667] +/Subtype /Link +/A << /S /GoTo /D (section*.138) >> +>> endobj +1837 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [398.553 340.526 410.509 350.712] +/Subtype /Link +/A << /S /GoTo /D (section*.138) >> +>> endobj +1838 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [398.553 328.376 410.509 338.757] +/Subtype /Link +/A << /S /GoTo /D (section*.138) >> +>> endobj +1839 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.31 316.615 395.266 326.802] +/Subtype /Link +/A << /S /GoTo /D (section*.30) >> +>> endobj +1840 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.229 304.66 390.185 314.847] +/Subtype /Link +/A << /S /GoTo /D (section*.20) >> +>> endobj +1841 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.229 292.51 390.185 302.892] +/Subtype /Link +/A << /S /GoTo /D (section*.20) >> +>> endobj +1842 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.068 280.75 380.023 290.936] +/Subtype /Link +/A << /S /GoTo /D (section*.111) >> +>> endobj +1843 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [408.715 247.598 420.671 258.06] +/Subtype /Link +/A << /S /GoTo /D (section*.38) >> +>> endobj +1844 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.229 235.918 390.185 246.105] +/Subtype /Link +/A << /S /GoTo /D (section*.38) >> +>> endobj +1845 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.229 223.963 390.185 234.149] +/Subtype /Link +/A << /S /GoTo /D (section*.38) >> +>> endobj +1846 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.31 212.008 395.266 222.194] +/Subtype /Link +/A << /S /GoTo /D (section*.38) >> +>> endobj +1847 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.229 200.052 390.185 210.239] +/Subtype /Link +/A << /S /GoTo /D (section*.38) >> +>> endobj +1848 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [403.634 187.902 415.59 198.284] +/Subtype /Link +/A << /S /GoTo /D (section*.39) >> +>> endobj +1849 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.31 175.947 395.266 186.329] +/Subtype /Link +/A << /S /GoTo /D (section*.38) >> +>> endobj +1850 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [388.391 164.187 400.347 174.374] +/Subtype /Link +/A << /S /GoTo /D (section*.38) >> +>> endobj +1851 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.148 131.31 385.104 141.497] +/Subtype /Link +/A << /S /GoTo /D (section*.34) >> +>> endobj +1770 0 obj << +/D [1768 0 R /XYZ 108 690.907 null] +>> endobj +370 0 obj << +/D [1768 0 R /XYZ 108 432.405 null] +>> endobj +374 0 obj << +/D [1768 0 R /XYZ 323.435 666 null] +>> endobj +378 0 obj << +/D [1768 0 R /XYZ 323.435 275.021 null] +>> endobj +382 0 obj << +/D [1768 0 R /XYZ 323.435 158.458 null] +>> endobj +1767 0 obj << +/Font << /F94 409 0 R /F107 429 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1153 0 obj << -/Length 1107 +1854 0 obj << +/Length 3985 /Filter /FlateDecode >> stream -xÚ¥XYÛ6~ß_áG/ÐeEŠ:ø¸Ù#Ý"GÑA‚¶´DÙªu¢“õ¿ïˆ’mj%ÒIh ͧáœo†Æþðc1Æa!æÑER^y‹
ˆÞ^áâ!B(¬@ôfuõëc/bÄÂp±Ê4b•þµ¤×7ؼåíõ?«ß5$B8ò;ñPLØ×7!ÖO²|Ðëz}¯ŸOúygH?Ôvô†q‡¸zX¬õc†"øÀ›såÆgò<Šâ|Šã¨
}Ó§¿±OS.wB¶[žŠn#Ü`ŒXˆv[ä•h…!¢áJ YÙtÔjN…ü{#lŸo¹J¶ßS›Tðhlùf«æ|<{PfMžTûr-¤E ´êP7D¬–Ø=‰Õ¿¦.v"øp¶ÂÊ‹‚?çmÉå&¯Z‹¢·®e*$ w.Ü)ëA.=¶ÍFÆ—Ù7.s¾¶F¶Ã4—1JTm^WvÀókNyw~úè‚=—"”<B¾É¨é'¯5‰Ü$Â"]ôäXó¿i‚¸5èãA§7~D.ù¨¡ïNk²üÓd³ö €=€(0E¸Û{ðnÍ“ÝFÖû*MꢖŽ2uɳ¼(¦òp\È.]-»äPc©È Ê\ ¦Î+娂¯ÅÙÐÿ›N¬ŸÞÔûIRi€PÕ'µçûÇ'#«3ù¼=eï˜ÃÛkê/¿êsé„="ϤS&[.mtâäÍÖ–…¼U5 -G"ŒéÂ@Ç…IkulåÚ[óÓ<ðƘ)ŽŸEþò³~ñ4"†Ù3D‚ÉJ -Áe{(×ua£D]A"ÕÑ1=\B(®+¶«â`1DÆ÷…jŠÚv¤Å7!}aÛ¸ƒïD#d":r(KøwX«k$èl¿ «º.öñ¬_+ñlÑRÕ?
Dw¬5¤#錸Rro³XWY¾ÙKáÈ ´T õi`[Öà.>N¢þwߪ<;81u–Ù§ËÒŠÆâ*: -qo³¯.Z»oójã’
¼9f²£OöºEºyœÒbtÓÓÄ;MCÃ1šÒ-¸ï^£»Ígƒ” g<PM/}b¦£Š•½™Q:ÃDu+t¿jáX:ÆïZ–˜i)Ð#IüS-ÅT½ÁC‘ÇævÌ“év¾‡h¸·#“ízM0Ÿˆ†Ñd¯nã¼îLøÙXMÏE”úÆÔB–_†¼Íf,„»êËŒu7ƒ¾æl¤tg»Qª„7Ê>Ê+§îsx]ˆŽWþ÷ÓEˆ`T6ŸtˆîæBAB§!Ê ¼-lº+'§å`ʦn'#
T A:zøˆ‘¹ß Ž?Œ~Dø†rÀendstream -endobj -1152 0 obj << +xÚ\Û’ã¶}߯˜Çݪ!@\ÈGß“Tì¤ì)Wª’<hg¨YźEҬןIM4š„µ)WÉ»£³§¡£Fß +â +2`ˆ9*H¥„T“s¼lŽ·Õ¢*…®-«…®€Ód+ZèÁ©%ãP¶K¥è!ÄUö¶t“k¼ìOï7ûk{;l©¨œcEiQ™‰wE”] 8%¢L;ˆ*¥$6LT bŽÊ⤜äÃîz;Aü8$6Ç…ýR Û)ðí—] xb¿Ì)q€2Nì—CÌ9Lc…²“—¶gˆ§O6—Ä®±™b£©FÊEtàT‘ˆ’Q¤”´Ø0UdÀsT‘Z‹ª´‘"L†ÉTd ÌUd‚óŠ U.(21-(™£Š8ÛTbE˜°š•p]^ÂEh.áâõñ ñ 7¶Fµ€o¼jfÞ±A,¤oø²X÷h »ë‘sÍ=ztà ÷˜Srî[ã°á„{ôbŽJ¢á¯zæç]ûy!d ÌÝ0œß0h•Ê°fbZØ0‘9ªHe»ò"(r|=´—Ý“v3dàÌu’ Î; Z¦ådbZp’È•DiaªÉIΛ[§æ¤ÝÀ—™vœM»x‰–M»ˆ‰O»±9*‡TÂ8ƒä¸Á~¹$"j)¬®±›Í¨–gjÏ,Ùr $,º”ãÚ–¥
èÁ‰´1e'mEƒZÚjl˜x†˜£Ò– ÙTÐð¡(/Yõl™¹j³©jZ\"…L5Ò,$ª¹)¢‚†iíä`Ku^c3CgC¼H¾1DL|c›£‚8ë¿ +Äy´X°åûÝ€ï×ÂtÈ”oE÷Ú ?ËîµfG_¡Ùü~û”ePéOÝ\è‹îõ‡n:ôšõs$øIåôÛ/Ñ)ü3W½ý¹ûAÿ[÷úc"Ú`UßsÙ¸ùØ£}ÞïŽíõÞ«¡C¯«*7Á"8›`ÆÛÕ†K°ˆ‰O°±9êß•/ªGIž7×¼"YUX ̬œÂð*5[…!&¾ +‹ÍQE$˜WRä¶9ŸvÇÛõtÜ'¶=ì%
+JÝ€ËÙ‘uE”] 8%¢dDi +Z¨iXQ&¦Q"sTèU=ÃA¨}k?ÝÛáÆÌÁÙ/R×\“ƒ˜ø.'6G‘ +6šÂ®vçÄY ÆòqœÑè‰mí,°Gž8œSv_“@)±áÄa`!æ¨e ÑÍß|!ü™SàÌ옜í˜ð2ùŽ 1ñSlŽH¢ + +—@»V™ôèÁ•Éœ2½}T (í& +“BŒQMŒÆ I®¯‡ÖÇ×óîør÷ÞéIs·ÎˆæwδJ˦߉gaßÌmQ9t)L3·^ ÉI•YÇ/óxÁÙã
¼ÄªæŽ7¼›£r¨ZX=©q8A
ïK´{K‘0³™Ðl!‚V¨W‡L<|Ù¢RH+l<ãv:óû$/ñÎÌÄ‹àlâÅËLl•!©"&>ñÆæ¨$dÜ4—ëg-ÿy½ÞvÛßîN1=gn†Ñ|‚™©ùü2ò,¤—¹-¢t:¡£À^ŽÓv1ä^ œ™‚ଃàe&*÷áËGL¼ƒÄæ¨$µ‘M$ɵ=ßM_f4Ep6šâ%j6š"&>šÆæ¨>f¡pzÛûÞÏÜ04sÇ 8»eð:äöbâ7MlŽjb¬hÊ&Òä3\dàËu‘ λZâ‚‹LL.™£rø)¦™¹HwÒ‘Ô#+ãÆÌ”‹àlÎÅ‹ä›ÄÄgÝؤRl&ÿx=.!™Quà̪œªh™‰:$DÕ‰)–DJ'ÊÒߎD<Ç¯Ü Rþ^±!·ë_¯ÉBeùue`á¥Ê¼[Ћ—ëcÊôœ±âÆÒíú€Y¾]?êÝ°ïô.t
‡gTYJa%;¯× ^YÙÌ»ö½x×>¦LϦuÿ ©ïÚÌò]ûQžè¾}'¿ÜÅjÓíYÏѪ¥¦Ê¼zЋWïcJF(cïÞÌ¢9¯ŒÁ%(¤]Æ=ܱø–Þ±¨ T‡¶¹¿ñ×ñùõö§þF¾vñµÿ‘™=¿ó3º‰ñã;(χûý»ß×1ÅãÀº}‰^kzýbº¶Ý
éëv·o™Ûþë²NªÝ¶Z+Z¸˜ÐôŸvGz’zZ#¬ÓÈ*ý¾Hl+¹Líº‰æïÛËæÐ2ÏÖîô©ù>žmùHZC«^6õ¸ºqtàT݈²sp’»4”]¥•Ø0ÕwÀsi•Æú¦ibZ¿0ÉP-_ôNf½“õËZ÷ZÛyíˆNz-"ä½Ö_œx’^ë!±´¨P¬Vh<q:·Ç¥Ü
ò4¯‰¶’#ëš(=º@ð„*sJN-ÄxĔХÇ,šÑÛ@¨s¥ÉˆÞáéÊG½5$€PUöù]l}db«m‰›O»kßþ2•<[ƒuuøûÛ¥0åÚõœ€.œŠQ¦ùÊ£mƒ
ÓlÀsi'•µ0fšù©ûýtË ³•9Ÿ¿&¾ItàT’ˆ’‘ÄwÈ^¸‰‰J2`ˆ¹´$¥g®ÑXqs¹½ß<ý’Ö¥› °
NéÍLœ+²ôà¡©*sÂN”&@wݳ†XKŠ¢Á«¬®f³V^“®éS¼&þÂy3r®‰Ò£O¨2§äd<Ä”¥ÇsiYj1mò•ÛÓæ|ÛŽ÷nŸÀ—¹}œÝ>x‰¦ä¶bâ·Ol.-‰+…«T4adîðm.$’¦®F¶AtàTˆ2}²ò·µÁ†© †˜KâŸOp.¹2¤8^‘*:=Ò)Ò£O(2§ä”²ØpB‘³ln( +ãf÷ë‡äñÔ[šaËÜÒÃêr·ôç·4úÀ‰ô¶ôÄ´°¥#si+èO%ö¹ëåéÞÚ6eÖ¶ÎÖ¶x}|m‹˜øÚ66—ÖC)a-v¸Ûî–ô·¬ih Ëœ†"8;
Å+tŠ›†"&~›K+"KáÊi*ylÝ>ïw+2Ðå*2ÁyEÐ +™˜‰Ì%‘M-œQX‘ëæcË?%¿Ö#ÂÌÁÙ¯‘ÞÈ
ý/bâ{äØ\Z“Ú +‡f×ç}¢gQ¥¨;}óÿ:=2ˆÑƒ„¦ZÌ »_½¤R±ËA ADTŠC¬¥¥€\Yk5.9¡ÍKã/3#8›Æñ¥áÒ8bâÓxl.-‰U¢®‘w\ÚóæÒv}Kwç$µu2‡n;sè†àìÐ
/—”0PCLüÐ-6—–RvƒÎ$Ùh’b]fˆEp6Äâ&ÂÉ>bcsiE*Hÿ΢§êþûÚŸÚ»÷ÐÀ—»‡&8¿‡ÐבÚ˜öPd.-‰r àì÷˜ù‹ZGþj äóN#ªº)×òN.<‘wæ”L.î~¶KŸCm¤èò/¹‡#ªî[ôÆÿ +endstream +endobj +1853 0 obj << /Type /Page -/Contents 1153 0 R -/Resources 1151 0 R +/Contents 1854 0 R +/Resources 1852 0 R /MediaBox [0 0 612 792] -/Parent 1091 0 R +/Parent 1766 0 R +/Annots [ 1856 0 R 1857 0 R 1858 0 R 1859 0 R 1860 0 R 1861 0 R 1862 0 R 1863 0 R 1864 0 R 1865 0 R 1866 0 R 1867 0 R 1868 0 R 1869 0 R 1870 0 R 1871 0 R 1872 0 R 1873 0 R 1874 0 R 1875 0 R 1876 0 R 1877 0 R 1878 0 R 1879 0 R 1880 0 R 1881 0 R 1882 0 R 1883 0 R 1884 0 R 1885 0 R 1886 0 R 1887 0 R 1888 0 R 1889 0 R 1890 0 R 1891 0 R 1892 0 R 1893 0 R 1894 0 R 1895 0 R 1896 0 R 1897 0 R 1898 0 R 1899 0 R 1900 0 R 1901 0 R 1902 0 R 1903 0 R 1904 0 R 1905 0 R 1906 0 R 1907 0 R 1908 0 R 1909 0 R 1910 0 R 1911 0 R 1912 0 R 1913 0 R 1914 0 R 1915 0 R 1916 0 R 1917 0 R 1918 0 R 1919 0 R 1920 0 R 1921 0 R 1922 0 R 1923 0 R 1924 0 R 1925 0 R 1926 0 R 1927 0 R 1928 0 R 1929 0 R 1930 0 R 1931 0 R 1932 0 R 1933 0 R 1934 0 R 1935 0 R 1936 0 R 1937 0 R 1938 0 R ] >> endobj -1154 0 obj << -/D [1152 0 R /XYZ 110.999 687.904 null] +1856 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.714 653.326 169.669 663.788] +/Subtype /Link +/A << /S /GoTo /D (section*.34) >> >> endobj -338 0 obj << -/D [1152 0 R /XYZ 110.999 359.934 null] +1857 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 641.452 179.831 651.833] +/Subtype /Link +/A << /S /GoTo /D (section*.140) >> >> endobj -342 0 obj << -/D [1152 0 R /XYZ 110.999 244.716 null] +1858 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.471 629.416 154.426 639.878] +/Subtype /Link +/A << /S /GoTo /D (section*.34) >> >> endobj -346 0 obj << -/D [1152 0 R /XYZ 323.435 662.997 null] +1859 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.362 617.461 210.317 627.923] +/Subtype /Link +/A << /S /GoTo /D (section*.140) >> >> endobj -350 0 obj << -/D [1152 0 R /XYZ 323.435 333.045 null] +1860 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.795 605.506 174.75 615.968] +/Subtype /Link +/A << /S /GoTo /D (section*.34) >> >> endobj -354 0 obj << -/D [1152 0 R /XYZ 323.435 265.648 null] +1861 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.957 593.631 184.912 604.012] +/Subtype /Link +/A << /S /GoTo /D (section*.34) >> >> endobj -358 0 obj << -/D [1152 0 R /XYZ 323.435 187.033 null] +1862 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.957 581.595 184.912 592.057] +/Subtype /Link +/A << /S /GoTo /D (section*.34) >> >> endobj -1151 0 obj << -/Font << /F78 368 0 R /F88 386 0 R >> +1863 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.714 569.64 169.669 580.102] +/Subtype /Link +/A << /S /GoTo /D (section*.34) >> +>> endobj +1864 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.038 557.685 189.993 568.147] +/Subtype /Link +/A << /S /GoTo /D (section*.34) >> +>> endobj +1865 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.957 545.81 184.912 556.192] +/Subtype /Link +/A << /S /GoTo /D (section*.36) >> +>> endobj +1866 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.038 533.855 189.993 544.237] +/Subtype /Link +/A << /S /GoTo /D (section*.140) >> +>> endobj +1867 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.795 521.9 174.75 532.281] +/Subtype /Link +/A << /S /GoTo /D (section*.140) >> +>> endobj +1868 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [213.505 509.945 225.46 520.326] +/Subtype /Link +/A << /S /GoTo /D (section*.139) >> +>> endobj +1869 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.714 497.99 169.669 508.371] +/Subtype /Link +/A << /S /GoTo /D (section*.36) >> +>> endobj +1870 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 486.034 179.831 496.416] +/Subtype /Link +/A << /S /GoTo /D (section*.140) >> +>> endobj +1871 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 474.079 179.831 484.461] +/Subtype /Link +/A << /S /GoTo /D (section*.140) >> +>> endobj +1872 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.038 441.397 189.993 451.584] +/Subtype /Link +/A << /S /GoTo /D (section*.82) >> +>> endobj +1873 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.957 429.442 184.912 439.629] +/Subtype /Link +/A << /S /GoTo /D (section*.82) >> +>> endobj +1874 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.2 417.292 200.155 427.674] +/Subtype /Link +/A << /S /GoTo /D (section*.82) >> +>> endobj +1875 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.957 405.337 184.912 415.719] +/Subtype /Link +/A << /S /GoTo /D (section*.85) >> +>> endobj +1876 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.957 393.382 184.912 403.763] +/Subtype /Link +/A << /S /GoTo /D (section*.87) >> +>> endobj +1877 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.991 381.427 255.946 391.808] +/Subtype /Link +/A << /S /GoTo /D (section*.5) >> +>> endobj +1878 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.524 369.472 220.479 379.853] +/Subtype /Link +/A << /S /GoTo /D (section*.80) >> +>> endobj +1879 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.362 357.516 210.317 367.898] +/Subtype /Link +/A << /S /GoTo /D (section*.80) >> +>> endobj +1880 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.2 345.561 200.155 355.943] +/Subtype /Link +/A << /S /GoTo /D (section*.76) >> +>> endobj +1881 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.2 333.606 200.155 343.987] +/Subtype /Link +/A << /S /GoTo /D (section*.128) >> +>> endobj +1882 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 321.651 179.831 332.032] +/Subtype /Link +/A << /S /GoTo /D (section*.92) >> +>> endobj +1883 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.552 309.696 159.507 320.077] +/Subtype /Link +/A << /S /GoTo /D (section*.148) >> +>> endobj +1884 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.038 297.741 189.993 308.122] +/Subtype /Link +/A << /S /GoTo /D (section*.82) >> +>> endobj +1885 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.2 285.785 200.155 296.167] +/Subtype /Link +/A << /S /GoTo /D (section*.109) >> +>> endobj +1886 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.119 273.83 195.074 284.212] +/Subtype /Link +/A << /S /GoTo /D (section*.109) >> +>> endobj +1887 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.281 261.795 205.236 272.256] +/Subtype /Link +/A << /S /GoTo /D (section*.84) >> +>> endobj +1888 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.2 249.839 200.155 260.301] +/Subtype /Link +/A << /S /GoTo /D (section*.148) >> +>> endobj +1889 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.795 238.159 174.75 248.346] +/Subtype /Link +/A << /S /GoTo /D (section*.67) >> +>> endobj +1890 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 226.204 179.831 236.391] +/Subtype /Link +/A << /S /GoTo /D (section*.75) >> +>> endobj +1891 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.038 213.974 189.993 224.436] +/Subtype /Link +/A << /S /GoTo /D (section*.148) >> +>> endobj +1892 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.119 201.968 195.074 212.481] +/Subtype /Link +/A << /S /GoTo /D (section*.88) >> +>> endobj +1893 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.038 190.339 189.993 200.525] +/Subtype /Link +/A << /S /GoTo /D (section*.89) >> +>> endobj +1894 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.795 178.189 174.75 188.57] +/Subtype /Link +/A << /S /GoTo /D (section*.89) >> +>> endobj +1895 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.119 166.102 195.074 176.615] +/Subtype /Link +/A << /S /GoTo /D (section*.98) >> +>> endobj +1896 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.795 154.278 174.75 164.66] +/Subtype /Link +/A << /S /GoTo /D (section*.89) >> +>> endobj +1897 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.876 142.323 179.831 152.705] +/Subtype /Link +/A << /S /GoTo /D (section*.89) >> +>> endobj +1898 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.038 130.563 189.993 140.75] +/Subtype /Link +/A << /S /GoTo /D (section*.75) >> +>> endobj +1899 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.906 653.326 369.861 663.788] +/Subtype /Link +/A << /S /GoTo /D (section*.77) >> +>> endobj +1900 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [429.039 641.371 440.994 651.833] +/Subtype /Link +/A << /S /GoTo /D (section*.79) >> +>> endobj +1901 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.796 629.416 425.752 639.878] +/Subtype /Link +/A << /S /GoTo /D (section*.79) >> +>> endobj +1902 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [408.715 596.539 420.671 607.001] +/Subtype /Link +/A << /S /GoTo /D (section*.2) >> +>> endobj +1903 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [439.102 584.665 451.057 595.046] +/Subtype /Link +/A << /S /GoTo /D (section*.100) >> +>> endobj +1904 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [408.616 572.709 420.571 583.091] +/Subtype /Link +/A << /S /GoTo /D (section*.3) >> +>> endobj +1905 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [403.634 560.674 415.59 571.136] +/Subtype /Link +/A << /S /GoTo /D (section*.2) >> +>> endobj +1906 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.31 528.072 395.266 538.259] +/Subtype /Link +/A << /S /GoTo /D (section*.90) >> +>> endobj +1907 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.148 515.922 385.104 526.304] +/Subtype /Link +/A << /S /GoTo /D (section*.91) >> +>> endobj +1908 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [398.553 504.162 410.509 514.349] +/Subtype /Link +/A << /S /GoTo /D (section*.93) >> +>> endobj +1909 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.472 492.012 405.428 502.394] +/Subtype /Link +/A << /S /GoTo /D (section*.93) >> +>> endobj +1910 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.148 480.057 385.104 490.438] +/Subtype /Link +/A << /S /GoTo /D (section*.94) >> +>> endobj +1911 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 468.297 374.942 478.483] +/Subtype /Link +/A << /S /GoTo /D (section*.86) >> +>> endobj +1912 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.068 456.341 380.023 466.528] +/Subtype /Link +/A << /S /GoTo /D (section*.86) >> +>> endobj +1913 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [398.553 423.189 410.509 433.651] +/Subtype /Link +/A << /S /GoTo /D (section*.149) >> +>> endobj +1914 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [398.553 411.234 410.509 421.696] +/Subtype /Link +/A << /S /GoTo /D (section*.149) >> +>> endobj +1915 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.825 399.554 364.78 409.741] +/Subtype /Link +/A << /S /GoTo /D (section*.68) >> +>> endobj +1916 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [403.634 387.324 415.59 397.786] +/Subtype /Link +/A << /S /GoTo /D (section*.158) >> +>> endobj +1917 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [429.039 375.369 440.994 385.831] +/Subtype /Link +/A << /S /GoTo /D (section*.149) >> +>> endobj +1918 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [429.039 363.414 440.994 373.876] +/Subtype /Link +/A << /S /GoTo /D (section*.149) >> +>> endobj +1919 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.31 351.539 395.266 361.92] +/Subtype /Link +/A << /S /GoTo /D (section*.159) >> +>> endobj +1920 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.906 339.779 369.861 349.965] +/Subtype /Link +/A << /S /GoTo /D (section*.137) >> +>> endobj +1921 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [362.987 327.823 374.942 338.01] +/Subtype /Link +/A << /S /GoTo /D (section*.137) >> +>> endobj +1922 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [418.778 315.673 430.733 326.055] +/Subtype /Link +/A << /S /GoTo /D (section*.145) >> +>> endobj +1923 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.229 303.718 390.185 314.1] +/Subtype /Link +/A << /S /GoTo /D (section*.100) >> +>> endobj +1924 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.472 291.763 405.428 302.145] +/Subtype /Link +/A << /S /GoTo /D (section*.160) >> +>> endobj +1925 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [439.102 279.727 451.057 290.189] +/Subtype /Link +/A << /S /GoTo /D (section*.144) >> +>> endobj +1926 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [428.94 267.853 440.895 278.234] +/Subtype /Link +/A << /S /GoTo /D (section*.147) >> +>> endobj +1927 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.148 255.898 385.104 266.279] +/Subtype /Link +/A << /S /GoTo /D (section*.147) >> +>> endobj +1928 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [439.102 243.942 451.057 254.324] +/Subtype /Link +/A << /S /GoTo /D (section*.146) >> +>> endobj +1929 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.906 232.182 369.861 242.369] +/Subtype /Link +/A << /S /GoTo /D (section*.137) >> +>> endobj +1930 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.068 220.227 380.023 230.413] +/Subtype /Link +/A << /S /GoTo /D (section*.152) >> +>> endobj +1931 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.068 208.272 380.023 218.458] +/Subtype /Link +/A << /S /GoTo /D (section*.154) >> +>> endobj +1932 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.31 196.122 395.266 206.503] +/Subtype /Link +/A << /S /GoTo /D (section*.99) >> +>> endobj +1933 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [347.744 184.167 359.699 194.548] +/Subtype /Link +/A << /S /GoTo /D (section*.28) >> +>> endobj +1934 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.148 172.211 385.104 182.593] +/Subtype /Link +/A << /S /GoTo /D (section*.10) >> +>> endobj +1935 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [429.039 160.176 440.994 170.638] +/Subtype /Link +/A << /S /GoTo /D (section*.157) >> +>> endobj +1936 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.068 148.301 380.023 158.682] +/Subtype /Link +/A << /S /GoTo /D (section*.99) >> +>> endobj +1937 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.148 136.346 385.104 146.727] +/Subtype /Link +/A << /S /GoTo /D (section*.78) >> +>> endobj +1938 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [388.391 124.585 400.347 134.772] +/Subtype /Link +/A << /S /GoTo /D (section*.156) >> +>> endobj +1855 0 obj << +/D [1853 0 R /XYZ 108 690.907 null] +>> endobj +386 0 obj << +/D [1853 0 R /XYZ 108 468.351 null] +>> endobj +390 0 obj << +/D [1853 0 R /XYZ 323.435 623.687 null] +>> endobj +394 0 obj << +/D [1853 0 R /XYZ 323.435 554.945 null] +>> endobj +398 0 obj << +/D [1853 0 R /XYZ 323.435 450.613 null] +>> endobj +1852 0 obj << +/Font << /F94 409 0 R /F107 429 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1157 0 obj << -/Length 383 +1941 0 obj << +/Length 489 /Filter /FlateDecode >> stream -xÚ}SMO„0½ó+zÜM¤¶¥”öèÇjô`Lä¦ÊÚX„îêÏwè.Èf·†d2á½¾™içQDࣈR‚•RHÈ+ÂQ^ºèB0c2€®Óàò.‘Hb%JKÇH‹×_†”Ädqµ|O%Á4‰ -#X²íy -ê"[¬\þäò[\¼™¡/“ÜT1Š4< - -50‚U:uI…8@ÎFŠ`B$K¡¦™¤D +¢ùLo4âu™×ÅPþ…”bÇ3¬2½=ÅlË.«µÿpkòîz³iü |Xýã%ô]îŬ±•ö þ.S{z´Ïvôo«Î‡lLc]úàN·Y§Ýðë.k?½%þo ×Ö«!æ¬ÒTºgðê|mu“{a»é|˜5ûÛuÛ9í‹1'ü°@{|¾[«ÉƒŠnŠQv’àHŠÓJõéSþ
¹íÇ{š»€ªö>f“ˆÍÍpbŠ‰Ì–Ðí㌾9rÕ/ÙÆßendstream +xڔˎ1E÷ù +/‰.\~{Éc@°@z,P&"ˆ2ÍÿSvǸ:DB‘¬(uroùºl’>(Pᢄ(½ØWRìéç×+,å!Õ‡x>®ž¾ŠFˆÎ‰ñ! €R¦ŠŒ÷ŸÖvCÿ³rýlóe|›qèu•„ H:aï7ƒSyÅõ]^ßå_^æõM^_äu®~¬rÕ];1½ˆ Xݵ}+Í?w—êlwHßÊö„³¤ž·öµyÜMLJÓa»?=};lkW‘ºÊ›*ºÒÕ“¾)Œ”÷U–|çÒy/æ/Ú(ôÐà¡ö’É׫ÞXI¢LëË)3ã™’N²f2ý<ïxZ‚ ד0š4}»‘D¡‡çIt’y53¶DéÖ—þŒ03ž„V€ê2ÓáûBÊ‚‘¶
¢“2–z’Ùý¸_V2œ W#
Ô.ÚÚÕH=48´“L¾Îñ©Ö}hy¦…av<Tz'Ð_Æk:N‡é?Ò Ct*V¹izhpžF'¹|ÕÐi°QµÆ<Â0;žFzcñ2b¿w§¥wG[°4ûWo[ +endstream endobj -1156 0 obj << +1940 0 obj << /Type /Page -/Contents 1157 0 R -/Resources 1155 0 R +/Contents 1941 0 R +/Resources 1939 0 R /MediaBox [0 0 612 792] -/Parent 1091 0 R +/Parent 1766 0 R +/Annots [ 1943 0 R 1944 0 R 1945 0 R 1946 0 R 1947 0 R ] >> endobj -1158 0 obj << -/D [1156 0 R /XYZ 110.999 687.904 null] +1943 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.281 653.326 205.236 663.788] +/Subtype /Link +/A << /S /GoTo /D (section*.155) >> >> endobj -1155 0 obj << -/Font << /F78 368 0 R /F88 386 0 R >> +1944 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.471 641.646 154.426 651.833] +/Subtype /Link +/A << /S /GoTo /D (section*.103) >> +>> endobj +1945 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.019 629.691 194.974 639.878] +/Subtype /Link +/A << /S /GoTo /D (section*.141) >> +>> endobj +1946 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.633 617.736 164.588 627.923] +/Subtype /Link +/A << /S /GoTo /D (section*.153) >> +>> endobj +1947 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.552 605.586 159.507 615.968] +/Subtype /Link +/A << /S /GoTo /D (section*.99) >> +>> endobj +1942 0 obj << +/D [1940 0 R /XYZ 108 690.907 null] +>> endobj +1939 0 obj << +/Font << /F94 409 0 R /F107 429 0 R >> /ProcSet [ /PDF /Text ] >> endobj -658 0 obj << -/Length1 778 +876 0 obj << +/Length1 1601 +/Length2 958 +/Length3 532 +/Length 1781 +/Filter /FlateDecode +>> +stream +xÚíTkTSWž¶Xh4*"VSIä‘#pDžDšB)\’“äêͽ—{o4Ñ*PÀGUP†N¡Pd–¸Ä¢-b+èBgDP[j¡Rp|tF‹ +tN‚––ö‡³ê¯YÍZÉÊ~œo{g÷×±ÞAj*†S$ç-ñûƒX#Õ£Ž5飀XŒ|âù<w÷bN‘¡ýRg +WA’…B ¡@Œ@E‘jÜLšõAXA,À +Òæ !£ÇYý8´FrP
8 +ऊ0¨Í_ƒ„@h†BzC` +ŠåXƒÓ@U¡á£<9Æ™k³8 +Jƒ2Õ”Ê ‡$g‰!å0œdœ¹V*jœ¥ Ì„j#0šÁ-4,NjÇxj‘8dYƒ°ÍÓëü¨{Œ¦ “å4eÉúαÐøð$¾¨&1jq’'2_RC‰xÔ¯6ÐOcë càÉ…"˜š" PC
OMq¨*<ƒª>ÏOÔç ésô¹ÈùëÄ/ÈØèÿÓfŽÇ 7D4¦GÒ>} + 3»y?VÝ1Ëc€†õÔ¶ì„F¨âu^¦TÙk +‹‹¸Ã¯–5·†&ž9-y©9‡®:¢¬(Ï8D5¦në–U§Õäømó9nºÔO÷DÎí=wzáÑø'x{¯Ó¦Ù¦rÛësxö¾-z³Š_4¿s㎨/¬üÄ+z¿l}#æÍýC/ÿ¾acsç;aÆìuåÓÝГ7«Þ«Í³?9õèï¦Þ×?0ç}ß=ðøô|KóÙÆ{šz=Kó^qXgÅŸ³##Ô10!î€üåN‡‡EçÝ–U´Ð#‰Òœ»Yu+6Gwýí¨±7Ù¹‹êX÷ï̲ü|ë¹]ÿÞ[}\<«dæ¿£^þ ÙyÇ1ªÒy"oÚVù–Ö +ÒjØůG¦è’Ãf45žÙ#ÈÊJŠH5:uuþýÐpÐîKâ3!}ž6ÔÙ%”;|"<å^3“ýÙHÕëxZ¾Þµ°úÊfÇÓü«¯MÜ9»ôÑ?«²öΙä•9ýö{GúoG²Ðí×óñ¾eåZñ5ÏÝ×+uŸ]šça›Ë+i§§ñ®´½oÜ6R<¯Ô;Z˜•·«S(g‰–eǬ²<Qé:ùF^°kÓ£„÷®´—\ªYêUuËTqж(×Ú%&å<ך?¹>R*Ø-L\±¤}Q蹯ºÝ¿»gËÔ--.¦ØXÿ³zôbN®V6Ü´nòþ¥¶&š +°ª\wqé +ï7ÜWÔ¼+\´É6ù¯9_ezǧ\´ºV÷ý‘¤O3S”[—º8/é +ùÜ!MºoŸ¹ý…Œ)‘õ/N™¹„ñÜàq);,Ã.ë馽"¬Kþ1cÿÙÜŽUEçV¸>‰µ¸~´_*N¶©–Ê6ƾvÍê˜Û¾Šà–^¾4ô¾þ{i +uñ‹âÜ‚aQ˜_‡~‹áøÞˆÛIßöQⲿþv7uëÎvMÂÕ¢mSßrQätOÌ¿B9î|õ–ņÔo=wüòT» åáµäêŒýQ¹—sÖœÊz¼fçY¯
¹rÖáHû÷‹¢ª>r|q_ÅêÀe¿¼OŸË˜w¯ùfýRÒ#F°Üߪ®Î!=ȶ|s}[ÞíIB‡šÎ‚Ss;ÓÿÐÕx¬!óÂc®ÐuñW©v»&¥Z×Noöõ8Õ>ßÃcÙ>¿<?ûpiË‘RþêˆC×—ÊÝÚä•3«zí¦(]ëD߬=Ÿh'þ•Þo +endstream +endobj +877 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 1948 0 R +/FirstChar 68 +/LastChar 68 +/Widths 1949 0 R +/BaseFont /GZTPEX+StandardSymL +/FontDescriptor 875 0 R +>> endobj +875 0 obj << +/Ascent 504 +/CapHeight 687 +/Descent -228 +/FontName /GZTPEX+StandardSymL +/ItalicAngle 0 +/StemV 0 +/XHeight 400 +/FontBBox [-180 -293 1090 1010] +/Flags 4 +/CharSet (/Delta) +/FontFile 876 0 R +>> endobj +1949 0 obj +[612 ] +endobj +1948 0 obj << +/Type /Encoding +/Differences [ 0 /.notdef 68/Delta 69/.notdef] +>> endobj +862 0 obj << +/Length1 756 /Length2 1218 /Length3 532 -/Length 1789 +/Length 1774 /Filter /FlateDecode >> stream -xÚíRi<œ×&%˜D‚„DbBf1–Qi-£1b×KˆÖ,/^fæïÌÈŒTDD´Qj i"*v¡b»Ûà†„–Új‰HBKª
i…H‡4÷þ®~¼ýÔß}Ïûá<ÿÿsžóœç¬¶›§‘
¡C‡o„7Æ“³—ðÆ8œ-‹µC!F8ö4>DxKK°á¢€`ð8²)Aòc°ÀáŠP8(˜ôí¯“Ì
Baœiü`ˆ-Ñ`ÐXÀaÀ_dlX,à±¾‚< „†CLc˜0ƒèPÌÁ˜¬{rä"ÀüM™)à¾m…C(Ob -èoØ<$&™‡%L(câ‚Hvƒ$^þ -[›Å,–½.¿‘ÔŸú46ÌýÁ@Ø\B3„PÎfª7ôÆœ3Ä„ìÍ]G>3l8A,àÞ”`ž,„˜n0Ÿø¨ -àúœ#‰wÂÍÕžNúòxÏòÏÎ_<Ø\¢÷Һꖡ¹¦ÙXój'ò>kZTQu&Ù K¥ìÑWš'l)!~üûg-åÎéÄNÇÍ}TRÈ_Óíw–Õ;/æ¤ìVð,%l‰÷ô—éOh|aîÎl›8ЗÐÀºú›ÞY÷Ö:ßSù”üCQ]13½—~ø<¢F»TÎ » %Bä²ãó#ZLËt«‹ÍyƒìñÐT»x9\E‚S²gO?îü0ÿø[0X
å#lŠù@w¼Àendstream +xÚíR{<”é§%L)¥ÂC¦™s1d¬v]Æ®ÑË.‘]syñ23ïxghF+I²›ec]¢-Y¹‹•ÛY¹
N»·ã’T„\Z»Ñ®Èž¡íœÏ±žó×ùœ÷yÿx¾¿ß÷ù>ßçû<Xý&¶„9"|‘ Ñ”HöOO"M ;kBLŒð˜"ˆ +ˆVV$`+@É Ts’ìÇ`=" p`àí¯“,-Ba6“LQÄ“i°™\à°aH$1¶\.p__!îBÃ!Ž)†H˜-,(æcÌÖ=9ñ`ù¦Ì ¼m…C¨Pf +à7l2“„Ï• +endstream endobj -659 0 obj << +863 0 obj << /Type /Font /Subtype /Type1 -/Encoding 1159 0 R +/Encoding 1950 0 R /FirstChar 116 /LastChar 120 -/Widths 1160 0 R -/BaseFont /PHZTNN+CMTT10 -/FontDescriptor 657 0 R +/Widths 1951 0 R +/BaseFont /DJEKSX+CMTT10 +/FontDescriptor 861 0 R >> endobj -657 0 obj << +861 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 -/FontName /PHZTNN+CMTT10 +/FontName /DJEKSX+CMTT10 /ItalicAngle 0 /StemV 69 /XHeight 431 /FontBBox [-4 -235 731 800] /Flags 4 /CharSet (/t/x) -/FontFile 658 0 R +/FontFile 862 0 R >> endobj -1160 0 obj +1951 0 obj [525 0 0 0 525 ] endobj -1159 0 obj << +1950 0 obj << /Type /Encoding /Differences [ 0 /.notdef 116/t 117/.notdef 120/x 121/.notdef] >> endobj -1161 0 obj << +1952 0 obj << /Type /Encoding -/Differences [ 0 /.notdef 1/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash/ogonek/ring 10/.notdef 11/breve/minus 13/.notdef 14/Zcaron/zcaron/caron/dotlessi/dotlessj/ff/ffi/ffl 22/.notdef 30/grave/quotesingle/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/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/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/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/braceleft/bar/braceright/asciitilde 127/.notdef 130/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE 141/.notdef 147/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe 157/.notdef 159/Ydieresis 160/.notdef 161/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] +/Differences [ 0 /.notdef 1/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash/ogonek/ring 10/.notdef 11/breve/minus 13/.notdef 14/Zcaron/zcaron/caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity/lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/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/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/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/braceleft/bar/braceright/asciitilde 127/.notdef 128/Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal 144/.notdef 147/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis 160/.notdef 161/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] >> endobj -613 0 obj << -/Length1 1663 +751 0 obj << +/Length1 1644 /Length2 7937 /Length3 532 -/Length 8827 +/Length 8813 /Filter /FlateDecode >> stream -xÚíveXܲ.îîî”à´ÅÝ× H$P ¸SÜ¥Hq§§¸»C[¤PŠ(R \Úïì½Ïó{þœ³ÝçæO²fÖ¼ï̼³æ +£¶¯Œ
̬ƒ"x|üO - -xØ3 -ˆžâCjâB¾ÿò?@À5¬nO€ ???ðô÷7ÿoî -'öÎTðQ/3gw>ñ¶VQî Çæ%øûѯŽçÔWÑŒEø_léèšßbÐM´ -ºa_r0{ä±\¸øÒjãÈÛˆê‘Hj -¾í³%í^^°÷
ôw~GïÞ¤áΉÃf}ê†ÏàšC#e¬_ñ*–œKz+^&Qåt³×ÊèjKMÅ~.Sô|TÓtQ°«sG4R˜¹Ú½¥øxæÀJ{J˯}A¬\dUÃÇÎx|Uä2*¨ˆƒ0ItŠHBëJÓëùW3’²ì¼ÕÜÏâÎlIï—_µÅ@œ~Bá\Öyúø[»8•ÖÐ&KÂßC²õ1ëW8þšá½"‚P|Þ³`5QxWóÔ«¢ÅlQ'J¦0Ù˜Ž‹L°KÎÚïZ_@ëS’…–siTTBuJ&–ôk¡ƒØJ)pcµ¤$+K˜ßÞL¼ý½œÛ¹îQýÇŽ#ëcxMþ!ñį˜jo܇ÅqÌ1mbµQY7ßçùCÏ%ÎD”éGpò篆¤ºÖæ–§š\üŽý’K®C‰xÙ?ïÖ`_;·Ð$ìDýÜi·%ª[ÎôYÙU*×:ðd¡7’`;ð¶„XéäWë±~ÙËAn]ä&0©Ù-Û”<×oµ5;ç"Pßiys¶ówMzý)ïÞ;Ûâ²RNÜÎë;í¤hÁ|4 åFšˆ Ú{Yl;ý¬B~$ú]|nxV×s§Ãu}$ŸÑXI%qó×Æ™¬žÜAöÄ»¢ùϱ×qÙRñRõÔųž‡™W„æý8ا¦/YIŽ˜7÷rAh(%Þß,oßÈÛÛ8Á|9‹_÷OK2ÆAi?ªƒ‰äl
v4ØvÅ
"ƒåDQÝ‘Ä•."p]¶žH«[Ï¿ -ÉæPï 4‘3& Yþ £Ú -義fvAþa°R´çöK¬`pxß½\ÿmgû}g<q¯åio”îËwŽaÇsëݬöN™æÄš)ƒC™f{ý‘[•h“—Bºà9óÅmŸ[ed“®XoåÁ•K _-³ð"©?=1ÃÌ{ß ð°ÇÅF)Ä‘$N°Jo‡|χFjCxñ(÷r¼‘ëØe$YÊ÷bC6
Ó¶«5 i»´É{óÐQî™´ÝÊ[è$/S`UÄÑÇ©!¤=tð¬j¶M’u)Dg’iåÙ͉zþ0ƒ>Þ}†«áˆ ä’övå€MIД¾Êß·ïIﻹ…{ê.Š+†¦"™ÇóÏläy¬A ÂÇ ç˜ãò8öÄ”Bo§ãj -IX£D:j…çžÚ?>¾Öä¤(O§Äˆ¬y0™|wDF¦˜lŸHhñ 0™ nkñYÊŸÓ㈦Оxæluå!¸’W|*ÞÓ´™½šR?]m£2ý–%lë*Zbg5šs?ñnc/F?~Ek‘´…Wxt±5*ršCv‘ŠÚèLÚò\ï¥Øû·aZÁ³[¡…¡U -~µôyê Y{ߟqÿš³$M‡À
‹C¡°§ÄÝgrßÕm¥®ã[ã…²u¬²}wí?Ârü4.àSK*Mh)nüÑH4€…ßÿÚ(Ù¸«ŽŽq˜¿¿x,¶Í½}Eß©p7GLVc"Ý=ýâÍžÎj¢öKüº¾{‘}‘±ÒlÑì¦ð”1`
mø›zEÏן©æ$ѸÍTÊ\¿³2ǬiiÅØÎ;ƒZâè<X$#ãXdß…¦VMUøõgrø;ß@‘Ø–3aC[M-ä®|,«ìÇþYÙšŠ(‡Ç6‰¥â$¢¤¯Œ-B°X’G‡l7‰À+H:G<jû̇D -™˜ÔUà;Í3 îþTéöéËÏ{n@zû_ºØgMfy#3 žÈõ¥T&çV±ëõQ› |ö9˜ÕÐ3y_t»+ç¯4“wF 5‘?AºOzð Ÿ$še -uѨBBâ¥Øzç@—®”·=îu²®^’ ͧ˜øUÅ1óœ›,ñÚ;Z -´sþ†ñŽ1ºè*¯ü u?‡|c–{ј“úŒæºyÉÑ…6…¹¡å½BÛU› Þ–+FÛ
Ãdí(ÝgѾæ¦cfKûýAª -•RYêO®xíÅH3sè%E–Ð~.ÈÚ¤ØäÖ¼sxÜNÕÊz ‡Šëù›¸E‹)ŽãŸš_Ä–ˆö!ybKúâ1Ká³w¤ÉÇŸöä~wm(º<d©“à‘Š¨’+>µ&ãùö4ÄV;£<Ò) -1õHÔ¸-׈՛×ï'3먇ÏÚÞª7½û@p’o€µñ´Ñ¼eÜG¹ìnq[ç“HØ -WqîêR%Ýಊ&¦(ºÆéû -£J6ý˜Þ»iCÇ;ɆW¤Âtò7䤣µ\C§|Ç…Ç)¥(€_n,qÉ÷Y=U2G›…c÷»
q9×r}]çí~¼xøÇ3 -AXwŸFñjp -c¥ÑŸ_aãð´öÙš±ï¯aW^¶¤c†7Í/µ·M—¨z{| -Âc¢‹6“âpï]f˜–0Ûk–¾[ -ÎëŽÒ þÁöÓºíâÉÊM©€óNhèOYù[pµq5{§µÑ©4$Z9òÈÚ·ƒ©AÔÍ6ŒëϞŖ½;çGkÊò“£B3jFÕÖL?ÕáY´R~a¦øìGÄüÔË2ôTjоДޜCŸKŠË2kʽôGäQZ«Õ«‰GÚX¹üg}U›³˜üº®é€ÈÙ̓BɉoÞüÆ¥Q¸è?"±«‘ßÀG~VEŸk›*ÄÍDŽëßnrÎ×Ò›_¦µN|µ\#Hü3Ó©aiÛyINÿ5›è¨<Übîåºys2±L‚ £·8 †…‡|áÈ™$`~u÷áõD…Ýÿk`O¶•Ûdõ4ÞóÞ¸Øþ>–Ê-‡Øt™ªPð⪼C+-ûS¯›9”ÉJÉë2Ô~=)O¹m;\–ÔH#¶ŸHy‡ê§¨ ƒ¡ýdsT›¥¹ŸdãÕ›u‰VC:2?5ûuK\6‚{7BANãÅîâ·Ñ¬ð‹í¸Ø;_ÝžfIon¥n¼”û{˜¾®z¤Ími þ0ç8%òÇÚϱ(…¾ÕgƒŒk8>NænŒLg«f#µû;¶JÒ>¢·íF8%†ÔPÓÄö©W~áíÙÒõ \ØýÚÙÌSÒª°‘l‰ùL‡h•äVw–Q‚j7ÿfŠ¬sS¶øOÞ‚zP'ï—AÄl´‡6{'lÌ_3^©))ЪÎùõÐ^ -²tèb¾å¢Ëª¢+”iYÃOmÇ›7ˆÁÂl“°zÍ\Œ™Z]Îä…v©*»\} Hñ!çðÄ Ì¬+……”rÌQë`”’bþ\pàÊ?Ìô½}£÷¶ÙiQSÊÐÚè„ŒñH+õ"Â}ì;õàwOç‚e°Zu¹>Þ®Êuè¯!±ˆ&'¿n{•«5|„ŒX`º:ç½â%¶5LwL6Iô’Z'Ýæ—Ú§ÜÈ„Ò/NM#3ÝÙ—©&ÑšàË"M²oô&{†Ò1û‡Uk5ÄTõõÖ«³äÕ²)ŸßêØί¦0®‹_*š&ˆçľó÷е¥5Ö+a”¢¥Ÿz’‡º”öEwGRŒÐ?bGœÚÝT¹þ’X”k£©•(~ïbÒgDMÄ,êÍÿƒ`}a¨aÒ^/ºÜ.Gt5ú¸&Ï
Ý0±Ïƒ¬ÕÜ«±«Yªz§9í;¦-_ˆÝÏ¡…õrÂx§„២ùa]gGÉåýq1þOÍØcýñü)J¦=h>c§ê93¦tŸÇôò¥#â¼çeš&³æJÅ›(‘P$"+(æ˜E¼’am¸ŸeøòAÞ ›’€±!Ý–ÞÆ9^ÔáºßVülœ÷ú¤#›ýãú)×Y ÀW‚£‹Ûî¹g1¸~²•Wj&åšúOosP¨£¢.¦›J¤5‚…]Bœñã´ð‚¤vó÷¢zï4ãP½cq“D™ÐÅtŠƒb$EÇlù/S¯&ŒÇ´T^@WEÄ"?SzfÑ*EK{ÕÇt¤<Æ´š&m3£±ö<ÆIˆTŽKfŠBfwG ì -.rYœê˜â«q.ô¢ù™-G£ŽÔf1
=Ëh -à–±üJ‚c3ĉûEè¶UÅ‹Þf&Pûr®Ê,×.ΤdGYËý¼ç4²¼ë¨ä -©-l$ÆͶy¼’ôc¿/w8zËs<)³Ð””×JVKõS¦¬×Ôyªå©òãt¡X¬y'ȳ{ñQFKO…£ÉÁö¸e½Ñk’Þ°ÄEy6È®®š4ùÕŽŒÉh"Ñ_u¹¦¯…p/AM*®)o§’ïz8µ2"²©B›v¥h%
Ê’Êal®d;A0é"
óìx{¾±EÕüÉ 7ß<·÷½:~ “áÿà‘Ó
œò*À¯55Uð¸8–½Ñzöë<£ãð¾Óu@*1äÂðÇð³qxãxT5žñSvëSûXH.DbÀ«G<Äb -÷-1ÊþúÐãLJ0h1&Ÿm¾T£"DWM•.Ì}¶·õ„©e?ÅPÁ'Éê©":{þkn”Ì®æ?δ¸[$>ï䎂T ˆ6µep„jË=ûè=¼ÐxGv·wøÇ×|FÿÛ82øxëñ{’âoáœ=æŒÙœs‘ÑÂØ÷Å[rž¼÷¡Êï&hÁ×;anéJ‡YçÐíe³µ‰3TþšJè“w%½Üuz±ä-=aÓ.€ûÖŸ¼ª‹”Š -J›ÊM¨eÎì#Ó{‰=BSú$Ç3>”³òM†·Ù^c_œÙdHÝÓ®!¯„nξ´„3–÷œàŸ§rÄ)ž2tëDz6¢2àgy`Œ¦<Å®´Ý%ÜЯÔ9ðÆBöÃÊ ÁÃÞÁÞÂ]5 -´IPæáxƒ„|d w:ОÀóa¨6,ˆ¥}ÆÖÓÜœ_vcÞþÚ¹…†¥¹œËƒhʯõ<ÑB¿Ýï"¡¶ÞKI÷ÓQU
ñà,=0Ú?Ç\!vÑPã‹¥òÊ«·ao&ùŠÏlˆ:U"®«L -®ç«½×N‚5"«v˜)¾S;x$} ¤ãr¬d±™Q$Ì ”Žû.B©? ¹!ˆ9hd:kot`^é}鯻xÆ˹Iùui¾áí†]¢i™ÓŽ‹™œâ€4äHV»ô“8Ø/sü¬ž¾0Z”
ÅÔDöÝXpæ@!½.¨‰ƒ"(g²ÞÄÍYT›¹Ë¸bÑR\…‡³òZ.‹—Dè'Ô¯Ì ³5¥XJš=!ŽïÚÔÄB‚yY‘br@hm?•4ó*”¡w¡&µWKF~=à¯ãftO÷D˜˜á8©Ú~J -gñðMùzè¦wÊíùqV`sëL xxPúXŠj¦ßo5Õ;ª`HRqýt¾Ð^¿¤(ŽZ[,Þ?§Aj+ÓÛ °ûéÀÄÌUE"o”àK`’Ø#¼ä¾ -k…é=i·íVõ°} -ñMçœ Ë7ú³Gm1~m®l -»;O“´Ê4tß×)o•8¿Ô·‘ñìé,Ì2D²O¤´Ç— —Je÷‘™Èü¶¤lÕA–l;. -RÄüE–Œ ‚éë–â&áÒî°Š“Fbãž'«5 #¥“mï‘N‘Á.b{?‘ÍØtâ@:hMŠêï±¼fÈ[¹œ„ú -[!!q.í*4UËIþÕ¾ý]¢j´#êeÅ\e¢UtX±CuUòµ,Œ–œº=¨)mÈ´ZÒ!˜Ç†y¯ “•V*ÅwÃlСœN[‰0YKL4:+*‹VºŠk…¯ñ«êB3™9jö’$iOßôÿº†/}\׺:N³O=5ªKij~~ü#p|>ö'‰MÂ[¤x©(#˯~Ãëi¾¶b5ÙüTbüÿËÎÿø +xÚíveXì¶6ÝÝH
ÝÈШtw‰t1Ì€€t#Ý!!݈4ÒÝ
*!Hƒ¤€„€ôýöÞçzÏwþœ³}×7fžu?ë^q¯g]ÃʨÇ+c³+ ^ ÿ€&ÄÙÚ®sÖ„‰«óê‚íÜvaVV97°ƒÊ[!ÀO +÷Ô"\WME2?ŽçŸÙÈóXƒ@…Î…1ÇåÝ#;pì‰)…ÞNÇÕZ)’°F‰tÔ( +Ï=µ||ÉIPžN‰Yó`2ù:M1Ù>
>ÐâAa2AÝÖâ³”?§ÇM¡=ñÌÙêÊCp9$®øT¼!¦i3{5¥~ºÚF3dú-KØÖU´ÄÎj4ÿæ~âÝÆ^Œ~üŠÖ"i®Þ9
!ðèbkTä4[‡ì"µÑ™´å¹ÞK±÷oô‚g·BC«üjéóÔ²ö¾?ãþ5
fIš‡B%`O‰»Ïä¾=ªÛJ]Ç·ÆeëXeûîÚ>„åZùi\À§–TšÐRÜø£‘h +sCË{…¶«6A½-WŒ¶†ÉÚQºÏ¢|ÍMÇÌ–ö5"úƒT:+¥²ÔŸ\ñ6Ú‹‘fæÐKŠ,¡ý +\µI±Éxç𸪕õ[ÿÖó7q‹?RÆ?5¿ˆ-íÿBòÄ–,ôÅ/bZ—ÂgïH“?íÉ;üîÚPtyÈR'Á#Q%W|j'LÆóíiˆvFy¤S +cõm¼0Áì¢ü)P|DÁÚ|hÃÕgÙ]“æÈ)vSî#×vþpaìmÓ£ú¸KÁâdýQC(Ïë:´s>“÷½9ÌÅA]ÖËñapP²?pS=«Ž¯ŒØc¾—S“ßú¼¥6ÒuSn-ë3®4äæ¸ò‡Åõ9VÿM*åúøÆNßaȳV¾îiq®2ô8¶¸ž +/+‚$þfóò½üU*Ê»GÔI² Oþ-±o<2HZ¦[‹h±äW¡öxEUNjߢj`…WMQû$”qÊ$X7ÑjSÒ"ž§öÝnߥÄcÒ(›wŠžìæœE–—'É~ºNöµ’pÇÒÙã·ES~ìóÑîJÂèsL±ET„Iú•ýh]Œz¤®ð‹kGÊ¥tô +º#Æ^Š…—’{wM¶ý/²Ów’ÏÌ3ÞŸŽáA©½”*Ò™åéø Hf"dݪKäÀwcJòþ¨Ø³ï˜q#™+˜¶7l¯µ³/¾)S¸9¿'lñí8Ë•¾î ÁÕa'ã5(˜?ë²:^—˜°G- kì¢å[šá¶ô†¦(PdGÈ 1•—Ž]CçÞË;šœÖëÁÜ•dúOd.âOºkïò}ÞQˆ™¯xåÐe¡ÝykbìGufSb둨q[® «7¯ßOfÖQŸµ½U!nzö!€.à$ß +÷I?½^ãS¸H¢U9ȘŸ‹#(Ü“"@†í|+)lùñúÉ¥g›}‘~AÁ.ìÌÆÿçžAð†4LPfš}¢ôö1WÜ*ÅÒÍX"™ŸØ8;%ÕK¹æzšÁõÁçõ7jO5ÁñI.Ë«ç—oÀ2Úht¢)hŸ\Écè‚t"T‘|ƒMɲl"®âÜÕ¥JºÁeMLQtÓ÷F•lú1½wÓ†Žw’1¯H…éäoÈIGk¹†NùŽSJQ +Ú'›¸†¦‚NÅ|*¥ë›7§š[ø‰¼´%j‚q?®‚K¢D+½GØàÈW&+‰zq«ì§«UX˜íªçøà?¦ºŠDÇ9öí–|A1<¾I±šZ±®ÊQõ×5½ám5Ï;|‚ ÔyÞÇ»}UüÅúÐÍ•íTd0ÞPŒ l5;@ùÍ“ p2©Ï)lPKJ†J/)×—íx|}Ëò‚°:î>âÕàÆJ£?¿ÂÆái!í³5cß_î¼lI!Çoš_jo›.Qõö<ø +»#þ×Àžl+·Èêi¼)æ½q±ý;|,•[±é2U¡àÅUy‡WZö§^7s(“•’×e¨!ýzRžrÛv¸,©‘Fl?‘òÕOQA…/CûÉæ¨6Ks?ÉÆ«7=ê‡td~jöë–¸l÷n„‚œ"Æ‹ÝÅo£X
àÛq±w¾º=Í’ÞÜJÝx)÷÷0}]õH› ÚÒüaÎqJäµ;ŸcQ +}«Ï
,Öp|œÌÝ™ÎV'ÌGj÷wl•¤}DoÛpZK©¡¦‰íR¯üÂÛ³¥-êA¸°ûµ³™§¤Ua#Ù2 ò™Ñ*Éî,£ÕnþÍYç¦lñŸ¼õ NÞ/ƒˆÙhmöNؘ¿f¼RSR¡U/ò롽déÐÅ|ËE—UEW(Ó²†ŸÚŽ7oƒ1„Ù8&aõš¸3µº*œÉ +íRTv¹ú@‘âCÎá‰A™1XW +)嘣þÖÁ(%Åü¹àÀ•˜)"è{ûFïm³Ó¢¦”¡µÑ ã‘VêE„ûØwë!ÁïžÎË`µêr}¼]ÿ”-êÐ_)BbMN2~Ýö*Wkø°ÀtuÎzÅKlk˜î˜l’è%µN*ºÍ/µO¹‘ ¥_œšFfº³/SM¢94Á—Ešdß$èMö9¤cö«Öjˆ¨êëWgÉ«eS>¾Õ±7œ_Ma\¿T4Mω}çï¡k;Kk¬WÂ(E!K?õ$u)í‹(¡Ä8µ»©rý%±(×FS+QüÞÄ":¥ÏˆšˆYÔ›ÿÁúÂPä½^t¹]ŽèjôqMžºabŸYª¹WcW³TõNsÚwL[¾»ŸCëå„ñN Ã?EóÃ2ºÎŽ’Ë6úãbüžš±ÇúãøS”L{Ð|ÆNÔ3rfþL?è>!éåKGÄyÏË4MfÍ•Š…7Q"¡HDVPÌ1‹y%ÃÚp?3Ê>ð僼A6%cCº-½s ¼¨Ãu¿øÙ8?îõIG6û+†GõS®³@¯G·'<ÜsÏbpýd+3 ¯ÔLÊ5õŸÞ0æ PGE]L7•Hk»„8ãÇiáIíæïEõÞiÆ¡:zÇâ&‰23:¡‹éÅHŠŽÙò_¦^Mi©¼€®Š‰E~¦ôÌ¢UŠ–öªéHyi5MÚ>fF)b ìyŒ“©—Ì…ÌîŽ@Ù\ä ³8Õ1ÅWã:]èEó3[ŽF©Íbz–Ñ +6{§ªEœÙÄ¿VÏé@® K +G“ƒíqËz£×$½a‰‹òl]]5iò«
Z'“ÑD¢¿:êrM_á^‚šT\SÞN%ßZõpjeDdS…6=ìJÑJ2”-$•ÃØ\Év‚`ÒE2æÙñö|c‹ªù“Ao$¾ynï{uü@!'ÃÿÁ#§8å%T€_kjªàqq,?z£õ†m×y*FÇá}§ë€TbÈ…á%àgãðÆñ¨j<ã§$ìÖ¦ö±\ˆÄ€WxˆÅ +¬ +ƒ²’†@±jÚHÚ°å%»øwMáB$¾ÕÄoÇWl³•&kBêM~ìáëñJȶáPÈ
‘ͳŤaIE-‰]Ç? +²¼]o†Š?R±\ÝÃîR.bô©{§áç5¼ŒÖh‚‚ÍÔcÔSöѽ„f +W+~9èÀWŠm> +Ñ[ø6Q"rµ¢‡()}¾*Ñn
Q5›joÁ³,ú&´R¦-Ìö8<¯žæYẃ\ìbЇà +:ƒ +{7\P;EPÎd½‰›³¨6;r—qÅ¢¥¸ +gåµ\/‰ÐO¨_™@fkJ±”4{Bßµ¨‰…ó²"Åä€ÐÚ~*i:ÿæU(CïBM"j¯þ–ŒüzÀ_ÆÍèžî‰01ÃqRµý”Î6âá›òõÐMï”Ûóã¬À*æ Ö™@ðð ô±ÕL¿ßkª=vTÁ¤âúé|¡½~IQµ¶X¼NƒÔV¦·Aa÷Ó‰™«ŠDÞ(Á—4À$±GxÉ9|°Gœ›4ìì-u)Ü +Ó{ÒnÛêaû[â›Î9–oôgÚb.üÚ\
ØZwwž&i•i辯-RÞ*76p~©9n#ãÙ# +Ò
*X˜e&ˆdŸHiŽ/.•Êî#þ2‘ùmIÙªƒ,Øv\ +endstream endobj -614 0 obj << +752 0 obj << /Type /Font /Subtype /Type1 -/Encoding 1161 0 R +/Encoding 1952 0 R /FirstChar 2 /LastChar 116 -/Widths 1162 0 R -/BaseFont /ZKUUJH+NimbusRomNo9L-Regu-Slant_167 -/FontDescriptor 612 0 R +/Widths 1953 0 R +/BaseFont /UONNBI+NimbusRomNo9L-Regu-Slant_167 +/FontDescriptor 750 0 R >> endobj -612 0 obj << +750 0 obj << /Ascent 678 /CapHeight 651 /Descent -216 -/FontName /ZKUUJH+NimbusRomNo9L-Regu-Slant_167 +/FontName /UONNBI+NimbusRomNo9L-Regu-Slant_167 /ItalicAngle -9 /StemV 85 /XHeight 450 /FontBBox [-168 -281 1000 924] /Flags 4 /CharSet (/fi/colon/M/S/a/c/d/e/i/l/n/o/p/t) -/FontFile 613 0 R +/FontFile 751 0 R >> endobj -1162 0 obj +1953 0 obj [556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 889 0 0 0 0 0 556 0 0 0 0 0 0 0 0 0 0 0 0 0 444 0 444 500 444 0 0 0 278 0 0 278 0 500 500 500 0 0 0 278 ] endobj -536 0 obj << -/Length1 831 +614 0 obj << +/Length1 807 +/Length2 1423 +/Length3 532 +/Length 2003 +/Filter /FlateDecode +>> +stream +xÚíR{8Tëfi*wM©Íš\Ba3B¥!Óã2ˆ!1—…Ř5ÆÌ4ˆ»¢\2‘KDd$‘ÒîØQ‘.¨N›£bæPBÛ.j¶ö®óœöŸçüuž³ÖzÖóýÞßû½ßû¼¿ÏãåcNdÂt³yæ8œ=àL¦à° +o>áqéo}×W¤<ÉVdUv¹Å˜
6|¨k©J•¤úûåëb´ð¾GšHŽ9QðxN*•Šã[Ö¼“ãF8Þ§¼R»Öôhú5^ѳwðnuõlGÑäW¥^&;}eË~Á(´ Û +S ¶$1Ë/ýûckE½ ¦:Ã&}`¿z^ÎÒ)I‘é*W6=›‚[ùšÊUJrçö¾×9®ÁhÕ·¦¼0Ó¦È_WMWW»ø©ýŽdG!îäJW¡t¹¦k¥IŠâu]Bz&Ñ÷]2È‚‰Í-˜ßÁƒ•Ã!Ö›B"Îî~RÌ)‡k37ΪÄÏù3ven¹
‡MPËå•fîÙk¨„YÕi€ì>ÔŽÇ©NŸöÓ%&¡6pó>%ðwˆƒ‰‰•±(è¥ú‡H'Sy’'}…Zû^£ÅèâËzîní4×R/kÇÔs§¬8ÉÐÞ@¯¾c
²¼—ìûÍFšðRÆàʹ>MIJ¤äáä<aê}|Ø:WÇÒb”YÚÊš_Zv›´N¹JÕÃE,H¯5š‰
k[·×w%Ä;ÌUyŽÛuŒö
jhm/Þ·ZÄ\VS”çÇz4©b8á_¡Ðô‹½$u…ãÃ&\B–ƒo@¹‹ 9Î µs¾Íí6´tÀlvëWÌŒ)=ç.ÎWÈøúOñÕwIú‚×åŠWê"4Ô +lóG’§”µ]½ÿÄ_jU†ý½ü2?pËe™È¬¦Í@¹D÷”|fMQÌ•gÓ'½®Žžj9pãvw¾kVwîQ]´zL5¨¤>K÷×NÐF}§k"{9{3qMFCê gE—•C:oƆÝcdü*ßú½pB”±=ã$ª‰zkÌ5‚¦.ä®ÝoØ—-³Ø¤Õžekܦ~ê…‚²Áš#ç;}aýÊÈaà(jµ2Rc»2}K½Jd[“MàYU·}} ŸŒˆë6ÉEêuï.£Ž^¶ÁÝnì;Ôa+G‘2Þ¬¾1ê,ëùÔ‘±}ãúz“¼ã9˜§š–¶^=¥u!¿‘|ö}ûê]¡Kætqyrb¾æHgIse,ÄnòÔUµ£©§Ð³ýÁN¾Gó¡«;Ïcœïﱉ):Ž'@ž:Ã3#ÍO<Š8÷Øq:!Çuéžç\ÛÕsK¢¨ŒÃÅå]yF·Ä&Íô"äq©Ç~–4 +endstream +endobj +615 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 1954 0 R +/FirstChar 40 +/LastChar 61 +/Widths 1955 0 R +/BaseFont /UMCBLM+CMR10 +/FontDescriptor 613 0 R +>> endobj +613 0 obj << +/Ascent 694 +/CapHeight 683 +/Descent -194 +/FontName /UMCBLM+CMR10 +/ItalicAngle 0 +/StemV 69 +/XHeight 431 +/FontBBox [-251 -250 1009 969] +/Flags 4 +/CharSet (/parenleft/parenright/plus/equal) +/FontFile 614 0 R +>> endobj +1955 0 obj +[389 389 0 778 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 778 ] +endobj +1954 0 obj << +/Type /Encoding +/Differences [ 0 /.notdef 40/parenleft/parenright 42/.notdef 43/plus 44/.notdef 61/equal 62/.notdef] +>> endobj +599 0 obj << +/Length1 809 /Length2 1292 /Length3 532 -/Length 1890 +/Length 1873 /Filter /FlateDecode >> stream -xÚíR{8”i–×F»›C›¶GLæÄÃ"älZÇ"Ç·™wx3ó¾ã5ìLÄ&Ôr‘hqÉyÃÕÁ¡-J‡a7«(š6$T[I9…Rßж]Ÿýóûþú®}ßžßý»Ÿû¹¯û÷#j»{Ùp°=°† -¨$ª9°c±œ© ;S("ч!!‚¡Û!!l¨L&¸Dñ -…*#Êþ§À%Ù£lŒƒ ¡€Fg -vÞè3Sc3ú"ÊŽÂq.®ž,Ü5‘͆E0› íÁ؉{OÔ'WÄÙ߬TÒÔÊ.K¼Ñœt6Û‚ô¬ßBí6ÞÐé
5®š¤º©Z•5êzŠÌáÒhÖÛÄJb¼ÈIwU%Ÿièæx-c?’oË¿Þú?ïûÇÒƒ±{:SÑÍJµnPM‹4GS+z{æ'âÂã;HU~äèŒdóvË„w>Èøuî¹#VŒIKÛÖäL©¿“j¶öu…ßÿ,›™šÏR¸“mùvE_Äì PsÃ7J}O2]¼Ì•µ·wd¹/-µ³}š]Y/”‡né3‡´³Wv9'ìÏrÚåì3½¾²P]±žgéXª¹®kÝÝ·B/®óHP¯»I³<N4d=Cfç‰ãºiŠ“oÞô¿~ŸªÙ2ÆŽÑ–[W#¿ËÀ,×:ZÏà™þ
Š¦R÷a‰¶vì±ÐÆÚ©_e[êuþoÖƒ±M3,à˼óFOùa)ð‡ù,ÿD!k·ÁéFÉÑ -±'m¯qóñP«ç?µUÿ:1ø—êWÂUîoŠBH¸Ÿõ…–VG‡kfc¢i¾ ¦[„¾ë²*ó,)9?öª×dÃ÷Ás•Á»CLMý¾¬¸÷‰Ów£TTíoøKÑÇ•Ù}íæÐÁ‹%ªQ:–¾§6[µhÖ^z8³ÍȦÊõŽ¡ðüR–
Î9MEüj
"Gc¸Í -Õ“®“°Ô¯8O®C%M‚Ôd!ñ§ù3ÅY;ÉqÃw·ehÝfŠÌQ¯ÍÎõ¼rò}Š3Y놧ðyÝN¦ç -Ò9Ö÷ÝwOÎYÜš‹úNý—Ñ”Žß6fqYïý½2CÖr#Š¯ymëPlíw˜?@nø2鑆mÕ±'«÷…Xþ OõØ&šxïþ©®ø:Ãô;v•ÖÜ;2]ûmb’εäR¹ãä@¿ïM%†S‡öÐhŸ“µ¼Ç½ú¡7º\)¶‘Hu>*z/ÿ…ÈÒDÃÉîÉh¹½ÓÑWŽI±Wh„ÛRžòJ·ô¢ø×…/ÔÆŽ)Ô§¤Eü ³}¶¨=ºèšŸYfÖ”óVO;ˆ.°.Î&%NFºÆ%x^Û”Õ-†úЄr!gärtµ±rÜ
Õ§r=~-öX#Mì͹$¾µ +xÚíR{8”i–×F»›CɦíS„91ð9Å´S‘ãÛÌ;LfÞw¼†‰Ø„Z.²-.9¯c¸:8´E)
»YEaZ‡„j+)§PêÚ¶ë³~ß_ßµïûÏó»÷s?÷uÿ~xw/c[6ºvD¡1™@¶ +´Æ’Ëzº&cBcÛHU~dëŽfàüsvK‡÷<Lûuþ¹ZˆJ‹[5ý²¦ÕßIµšû;Cû>ˤ'ç2îeZ½]E2q†ÚqäìÐMRï3ô^ÊÚ´»{ò2Ü—V:™ÞÖ
õ®ŒÊÃwèÃ:™«;]âe8ïuÙ=³¡<_U¶gåT¬µ®iÞ×Ä·F®©ñˆS¹M±:EÔ¥ã=ƒæðz)ŠSþoÞ¼~Ÿ¬Õ4Ίґ[_%¿×Ð<Û&Rßð™Á-’–R×1‰Žrò±ÐÖÆy@e{òMþo6CÑ
³àM¿÷Fwé1])÷‡ÅÿtžcŸá¹zÉ ?‘ÝçòõPÁ˧7š’³)Žö¾A—™=†•¯îP¯<ªè/©wt,Ô«WF{‡í4u¬Õµ-×®±õa‚TéµNQÚó+ÑjÔù¹´œÎ·–£»%uc%´1J£G6„¦ž3·E™¿Phtß6¯</i[·õ4›mìq:´¢Ìµ,‘/~E_•^N¯yIVÈ‹¾2e[ßÂÉÅÒ@µ¾kìô6ƒ›øÀ_*_ פ¹¿)"`>6—›š©š‹Š¤\þ&jéü®ÓºÄ³¨8êxìø«Óßâ,T†z‡éZ‡ƒ1ïãgz"TTêoùJ‘Çå™ým¸ôá#WŠT#t¼Ïn±nÒª¾úpv»‡1E•ÃŒ"ñ|“VÍãÙ
üJ
<[c¤Õ +Ö—®—0Ô¯»LG$
‚äDG!þ§…ó…{ˆ1#½Û/Ðt„n³ˆ×—ZÞ69ù~ÅÙÉŒõ#ÓØáœ.g³‹y©l›¾|÷}3ùóVƒwæ#¾Sÿe,©ý÷ŸMÆ{_¯ô MNX¡M‹×övÅæÇ…ÃÄæ°/iØUœ|²ö`Õòd-±ç#9þ÷ûÎvÆÖ¥Þ³¨´îþñ™êoãt[‹åNý}ꘛ‹Œ¦î§P>'j3'¼ 7z)º Ov9!z/ÿ…ÈÊTÃÙþÉX©ƒó‰WN Ñþi×)¸»4BŽòj·Ô‚Ø×ù/ÔÆO*Ô&¥„ý »c® -²è™_š]aÞõV_'€*°)Ì$ÄO…»ÆÄy¶lÎèCýH\©î°÷Zd¥‰rÌ-Õ§rÝ-ôX'ïɺ*—Ÿ“ŸQO
9÷õèDg%¶µGkR»_§†pisgŒƒ«ñsªÜÅžß2¢ã¯ùŒ·{
oKL¸¹°sN¡•V|Í*<“?ܲµÈzõxîV…i_@‹!Î…¯ìxÔ5Øàày[™§m™ö”‹ŒkŸÊôYÕx~aœ¬“ú»Ì4ë¬Ñ™”©Zy¡š_€³Wýý]Çì•*Cmÿ +‹¯Þ—mjuçÙŸl»Fãóó5|ûO})3~–kI×CŸÔn)IùÊ6ðHé†ê©¢SšUW¼‡V¨n«|›ÒP<9¸[4•wW}3qáé +endstream endobj -537 0 obj << +600 0 obj << /Type /Font /Subtype /Type1 -/Encoding 1163 0 R +/Encoding 1956 0 R /FirstChar 58 /LastChar 62 -/Widths 1164 0 R -/BaseFont /JUPEJX+CMMI10 -/FontDescriptor 535 0 R +/Widths 1957 0 R +/BaseFont /CRXXPT+CMMI10 +/FontDescriptor 598 0 R >> endobj -535 0 obj << +598 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 -/FontName /JUPEJX+CMMI10 -/ItalicAngle -14 +/FontName /CRXXPT+CMMI10 +/ItalicAngle -14.04 /StemV 72 /XHeight 431 /FontBBox [-32 -250 1048 750] /Flags 4 /CharSet (/period/comma/slash/greater) -/FontFile 536 0 R +/FontFile 599 0 R >> endobj -1164 0 obj +1957 0 obj [278 278 0 500 778 ] endobj -1163 0 obj << +1956 0 obj << /Type /Encoding /Differences [ 0 /.notdef 58/period/comma 60/.notdef 61/slash/greater 63/.notdef] >> endobj -533 0 obj << -/Length1 829 -/Length2 1423 +1958 0 obj << +/Type /Encoding +/Differences [ 0 /grave/acute/circumflex/tilde/dieresis/hungarumlaut/ring/caron/breve/macron/dotaccent/cedilla/ogonek/quotesinglbase/guilsinglleft/guilsinglright/quotedblleft/quotedblright/quotedblbase/guillemotleft/guillemotright/endash/emdash/afii61664/perthousandzero/dotlessi/dotlessj/ff/fi/fl/ffi/ffl/uni2423/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/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/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/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/braceleft/bar/braceright/asciitilde/hyphen.alt/Abreve/Aogonek/Cacute/Ccaron/Dcaron/Ecaron/Eogonek/Gbreve/Lacute/Lcaron/Lslash/Nacute/Ncaron/Eng/Ohungarumlaut/Racute/Rcaron/Sacute/Scaron/Scedilla/Tcaron/Tcommaaccent/Uhungarumlaut/Uring/Ydieresis/Zacute/Zcaron/Zdotaccent/IJ/Idotaccent/dcroat/section/abreve/aogonek/cacute/ccaron/dcaron/ecaron/eogonek/gbreve/lacute/lcaron/lslash/nacute/ncaron/eng/ohungarumlaut/racute/rcaron/sacute/scaron/scedilla/tcaron/tcommaaccent/uhungarumlaut/uring/ydieresis/zacute/zcaron/zdotaccent/ij/exclamdown/questiondown/sterling/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/OE/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/SS/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/oe/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/germandbls] +>> endobj +578 0 obj << +/Length1 726 +/Length2 8463 /Length3 532 -/Length 2020 +/Length 9083 /Filter /FlateDecode >> stream -xÚíR{8Tëfiʦhë›B"Ì`h¨ä2Óã2®CÒ\cÖ3Ó JlìŠ5)I¤´;vt‘.R»:mŽŠq(¡m5[{a×yNûÏsþ:ÏYk=ëù~ïïýÞï}Þßg‚óõ·ta#Lˆ‚p–+‚#p£Òx@°Âã]1&&n|ˆ!€®;C -æb¬g,yp#à0³…¼Ï-ÄO@M³Y›k -,†Ø¾°€
"œh‡¸ì¯M ÉÍZ°¦‘ý,æf:ÛóeÀ\A@"ï‹êy¶&ü«FÓáÃb†Gã% Dôý¼ -ÿê,2—…°an°!ÚŸÏHÄ ·ˆ ™ -fZs(áOtn|_`[æ¾ -?v¨©ÉY=¥–4=ŽL’N´xæï2îÛ=ºS3_P–´uM¨ -N½9f6´]Zt_/‰ 1q,ÐÀ%³’ç\ð)Y¸Iî’R‘€_j}ˆq]£Hõa.Òl»¾Þw¨[rÁÈ˳†å[ånîš›h%ëÛêÛ½Ÿ¦MU< |³óª‰N62ŸÕ»‰vú¬£Ë‰Ô´þ´qÆ]b¤¡‡¾sY Æ<sq2#03¿A^«Z©áMÖÀªŠDòË
æRãš–uÉINÓ•>#¤Îqaõ-m%Û–Hت‹9ÇÔŒGƒ‹¢•q”e,r¾¾ÇŒoŸëä*èQí°—`QZ
Ýnð;pk=+çÄ—ö’Œ(åŸúOô µ6˃Â×åÊk£µ5Ž¤«êyøý#L8ßæþ÷òÂÐu%æÕ«TK
Ž*&—Ç_|6qØ÷Òð±ñæWotñÈíÌßg€ÕjäA)C«*èϲ‚õ’õ0ß©&˜
¾œº–²4»>ã ›2yq_‹þ›a¥þýwXÙ¿*Ö/•‚Ò>®ORL#Åh©¥vØøÙüe;lB»ó,t;µrL[µŽ¾PR]µtï™[¿¾°}eâÔ³³™^£½Q•¹®N-¦µÑ.ôꔆç¶îðO&.…† -‰Ví»˜}ì7ºw?ƱJ”Âc)Ùo–\Èp¼5ð1¬={ãêåuvfážêXY;øv•ÕFüFñßöí«wE䜉’ò´”#:·J›* -#‚‘Fÿ^Ie–~;õ8Üu•w@ù¡#ð¥ÐM
gpnwƒìâ‹íaýþɦ§÷ž‡EŸ~ä<‘|ÈsþŽÏtë¥Óóbéö8§s; -L®KÍšVE+3öÿ,«¡¥ŒZ¿Q¯*\bœë1mJ2[*
œ?ï'Ò7}Â=k2¢¹Q~ÓIåü>§Ó“XQÝà5Ï’’œ'J:›vUsùê%?OÓngñ°›9s6œqç…¿mJÿ!ºaxW óÇ”²³9iÝÛsÿÉ¢ýXžs1I=øTÙžâ,³©[aýyÈ”þVE×Ý…é‡÷Ä¥¬iç¾H~¯móN>ºÂùVÇôQ—ŽðSGžÏÍÈË·‡†Äà[GqUóè_xKýöš¡&¶².¯-Ço„{B‚?¾þî”+O÷'y¿<,½y¦æ¨Æ1¸n˵¾vÏí¸®+´…—û†È=uË>º´Ð‰ø•ÖöLj\±QHÈâkc·»–
ŘPÃT¶OèÛ:ï¬kðÚ@g
¾\HÖúN=¢N„µ–
›?ÊÓp'è›ö†ŸŠa×îÒ`Jº†Ž£AP}DÚŽtcUù`lµ,‘<Ë%KDÝߘ.ý'K#ïf;Äz9oùóO :*¦»m5¶ìê£Ã, ‘Úõ‹•j*Éã]±ž7ìL‡÷êöÕdª«é9W,›|<å>fÄôZ1b~¿Ò¨ßk a -4jÉoZ‹ätÉ‚£kÏËy6èI×ñ©º«l÷¬ÞI•ù<¸ïÙ\óþb`iÒý¼)þ?|0ÿøŸ`q _€Ä1ø±˜? +xÚíuePJ·-îNpÜÝÝÝ:ÀÀ`ƒ»,X‚Cpww
Ü‚K‚ëÍwÎ=çÖzÿÞ¿W¯ûÏ–µ»×^½«šžZÁÅÙCÏ×ÄÍÎÍÁ%ÐUÐÕåæâpqð¢ÑÓËBA–`g9KÀdй¸y +€üí +Pw±Aº–Îî‚mÿZ:!¾ÿGð#”=,ÿˆ!íl÷G>®¿C`w°ÈFìñGo[KÈþŠ‚þ~u
ØÓéïzÐQþ<«‹3Ä÷¿¯üÓË_rªHë«éh²þ;¥å]lÀÎv +|}Y²Ý[—ªC•UàYCOºÎ³r*„>ÞðÇÓiN)(]ü°Ø¦<\@Îuؤ»]é*ö’~ýzÿèï-T¾Ïh(¢»'•@þ’úñýOzÂVšŸVCi%ŽráÈÑrv5'‘ ·Šx[H?aB©²ûòúXF¬àC¡1¯-=SòÌ¡u.ú)ñøÑÀYÔm2óúA.A¬‡8‹O +.0·öç%,ÝOûÚjØ[û”¤K(¶5kBŽy§!Õ$yGr¾Lý#…‘ážç+5¢bY)N_;G0#ìÂ+Ó'¢î\É®%Ô‰;èŸ-4-hñ~|Õ¬q¿œã'ÞM"ÏG›ÙxƒpœŸÊs)Õ‰Ñ pºI\ðd*îëáØƼ6ø¥ñ…ÞBZΓŸ±AèõˆW£´'‹º>1gaÚj˜1É8¯<y©ê¥<¸V‰ÊOÖò&ýè\Û0ó+T#–ÔæGí±•ðg~çF–åx‚¸¥CŽGM4CRƒ@Xm
ÃÆ~ò·bΣÍ,uKOtZì¨Øß9ƒED*n9¥'Íó‡Šk€{
¸ÖW#ÐLâEý~6Wâr&F^XOIû¯D¸¯úåÔÛLåÉZÙ›£ñ«¸Û©Â@£A/Å0î¼ØÇe§qÆ33ä¸ý6ÅÅIápê¾T(çh©ãÕ°×'SŠö½W4/—&ùX¤´xŽZÁÙ7˜pK$°¯×uät@É–äÕw©gÑ«ÄÍ>¿êôššüéz™ìÞ…z²F“r¹³ÔrKrM³¯Þe°áNÅ7-±{!ߣ«½ +ëûë¥÷*6 +|Í +5⿉Ââ+±&ß1?ÌrˆŸ¸RKÛ¯A‹$âKIkÓÙëŒÐJ/ ªî_欴JhëÏ A-Kå£xËB1ÞF„ÔÁÅëÎGHJqÛ,ëÄ'qÙxЀŠ8?l[E__ñ[?ªz²qP+±”&»®Ûwø ÄŸÁ;2a©"Yä´¶ýF½¦«»™’/Ú¾1;"Ë*Xu#9&z‡¼ +ónm·”þ<™®Úà¬2¶ÝN9 «’DUëÅmæKäÀ +̺ÄÞûl/T§¡K÷Œœ1 ¶ +§P„M›OOœÝHë‘O2!îpyÎ(b6«BÏOÙ>0O x“‚i“üÄYídD¬ZmN0æìÎ|ÖÙID* g¬›Ÿidw¨˜À‡©µïb8Ýu ÏË{S[.^aÙ>áî¼TeKÆ>Àðk^¬Jüû4H?g yçtZ½
Låp³c|˦÷hü†ªºÀ(ç½Ð󉹤>Å=iq‡š+"@ÏÙËõÛzQ›9üšê| T‚¼BÝàz{Ñ3ÄèÝ4b–½nXB7î(€{Û󦟾g|Ñ1±¬ +Ö—•Æ‘+e´˜|–ê,,zcÑmHR„·SkZÄÒvÅŒdžÔ1ùš¥L'š(MÝ0?ç¹›ßö·Ë$D@H¨Nƒ/‹`–1íÊÉ'—Èuè¤+íZFX)•Ì£¸ˆK‹yàkyÐü8º3-ïi^ëúÜz§‹ÕPÓÊ2Â>§:PÔHÁ4[”Ì
gÉÃ0ýTWÕì´ºÎfɘLeuëòø^·€¿_OgÓ%ñÇJ¨ðFOÌ”D`Ï7ñ?)mj "÷á_‚ª,Ä=¯Ð¡„„1×K\ð ÃaElµ»Kwy‡´oRÁ¶*÷Fj1xå U-G(Îmz$YW
V½´7Ô¨¬›ZqÁ•ùV¢ÍªFþÊÃÑqfïÄŠ—÷SuRiquwÿ…Rôãû÷ÝÕIb *€w´QÅ¡z(L2˜¦”1Á=“šŠ«'ñ5ÒD¡»üMè÷ØÜÐõ=u%¿#dóÚœÃrÃêzΦ
UÉMè3²B´pnUd5¢®1µ„óGíH~ˆ–d*ž-ñ;Ë3ȳ.aö×åQ˜
öÛ>ûÍ¥†3Û"™$ÚïÓ4þM‹Öbc§‡Ë1õE³:õÉHQgùw,¡ÓŸÕ³¯` ºˆ³†B¡¶±=žß-Ûõ/fIHoý,]÷ì/Û*2Ôrwã¢õéRàyò:š1ûµ¸Ÿg!¼ùõz¯™ +NÂ%¨÷®’hKY0%,qJ¿%_Q¢ï
5¬¬Ãƒ 1#
Škžý"'S_
éèµH"ß[30xÆýª_MY¼(¨Ü§àâ \ñâ¶éâÎ +}áu7 +ø:Å=€ÓÓ6ÚÉcäº0FË-ßòçì*2ÎY:™îaûß2ŒZ¥þi iC쌾@Ã×Ø ê³‹(âÄ6]–Kaûpfn“=÷ƒUEÓËP§G8„¹€Í˜>,ÈK¹Íƒ_Jà”ÉÍ¡´@Îäϸùbk>ª0Š—æÝAB ²Ëï[°˜LKPÕ¢ôeeÒîãò&nvÀmò³L’ €5>‹ÅºÇœÁ“µ(’Wìû›¤¼°þ„¨ÝîUÎôL(Tš½QmÀ!!ùcZ§iÝÑhÕÛÏëÚ¨DÌéK»¦‚ã&rˆH
Ÿ4oe3 Ðßòd2Ê9Æ&À7ðGvõªU1{¥u4mš^4ÿhcx*~~é:€`#Ä:bV(¥º´8ÓKá¢Ð½!ÄH\¤ ·!tº|Eç‡ÿ…OQYúò£ì—v’é—ò®aì½\ùj¸í„MNìP…öóûŠòWêßVÚ]‹w]-ZÓÃv©FN´¶«¯VàŽaõl†Ë +kRo˨MZk¥ú,G§ZÊ#Í×wfUÏAã .‘f:Ö‚ßÏæÖØR$ó{t¡l•ðÅŠç!DZù²BHVúþ¢5ïÔÐUÄ8^¨N8nžáÈÄ5(¢¾€z¥"‹ú<UdÅYÎ~iùVw!V°®™ÈËj¯ò<(JŽ¥¬gטÁ°3Æ÷GÛKµ¬'‘gÉë1eTnSE{ŠÑ–ÌrËÑj´ÄB9ŽÛ ?¸õ4ùFRèÌ®)3!#Ža¿ž`WÕÑ$UBŸX;Ø2¬ KhÜêaš1N¢†qÔ?³>¿ë€÷ן8¸ÜˆZÞQüÜŒ\ZWTýdH¶ +‰&*'ÑUtÛ®–’¹‡kïq¢=Ç+Q¡‰éãí„bq9˜™Œ~-ÿf|ë˜ô[å¹m~Ù•)¶ËÛ
«Ù óQ–eÂ×ý„º÷®%Öx¥”=c`Ü*¥&8="È;ƒóÁžB²gl†4‘ƒSkäÍ‹¤iô–‡al:³ØݽÈe”/qA^hâË&E~Ÿ€[´oÛÕPM푲S:‡ûR)¦¦VÊô¢Òš+nâæîFÖ7F +›TéBYˆ¥KÖ +ÏO$¨*PæmjÙøðŽ†ïx×Ó$ñ”fCpN(„c©À&¹ì +õAxeè|^^&¦Š×âæHv©*ø¦3òUM©|+ZÔJún¾‹²09‹|…>ÕÎpy"ß™î¬bú†ÃÓâ¿óîú[¶! rCrLaJèeÌßs8µ>e;6‰1SH *ó->¾ÒÊ„°ž¥yDÏeüÌH4×5“†µ™Õ•J`Ïâ\ÒåÏ Ç˜C÷ÂÔ,TÞê†ÊßÖ*»7GzkØnŒK˜÷ïôU[ÂWÝdêuÅ}Ï×s[šp`Ҳǽtyì9S9^éFgQ+A¤ä)ÇÐ)¦¼Ï¢4®NfbLâîßÈ“FË×úö1‰{_ÃM¼ä'¸*.—¼øŸÔw_ù4Ìg¸®¥
ÚâCÔó¨ä¹CÛo¦¯f ) +n§\Y»(Ÿ’ðƒÂ5`d$W2Ù¤^ùñg>áwŠFG`þïÆëâh†tü¥Ê$häºûs‡á}]t+ò*ièðB:üÛ^0S*§î}gw‘bŸ_‚%…L"&ä!æì3D +ê²{¥´¶&ÂuôgGãk„u¨¢9O¶Z¥¡ój}&þã0øïÏÔ6Zu^c©>Y÷·bÕx³ÓÓWöm4ý “OÑZµˆf:OÈǬŠÊ„LßÖ.ƒmƒ +ž†‰ì{G×Åc”Æ*¹;¿ù¤%p·èÆM¢]KßvˆPjͺº +Zà#¼hÒÊbÇÉÁ¯˜¸ l¾è:êxØq…‡—Jj6ÅÄw4[¤ì
2¦ðUä£¼Ê ³j×r¼^FéÂöÁi•GPtå
b3Ú~mþ—×lF-¾1$ã1)ÙÝi§ÙXö˜éçÇPf£‰ ÏŸµOzø3HjyÝULå‡7‹ëdnÓ[â=ô—©›Ñø +Ë]S\KÝDî]yÞ‹D°¨„Î
ÈC9®í—¼)0gãoB&¹'cƒ§: çAÿŽ7eú]䧤‹÷&ü.„ž½ð%Ëïþ…˜ÈØvuMÌÈD»EÔ8,(ß +D?jˆ—èæœ{Ozró‡’Õ]§Š·!~'˜ÏCð´RÆ(Xh¢©8‹¼ËÇëõòŽù´KX×ØdW7¢[&†Ÿ§l¥åB=o›8µM¦ÚËkeeÐà0³núsü{^G,V£Ã10œ!mM¨Ìx)}7§HÏ„DY{ØÖz)ï…\oö‘ÏaË⦙
ù†uWß_åôªùMäME·ú5g.Åq‡ê&¶CƇTÌü”l/ƒ~÷ç¹:^N k°ŒÍâ$³éÉ’¡®{ÖEÀ ¾ÊãMIû•„Ãwge +Úç[Êý²<kóy:¬G~¨W”ˆÄ•ê +íð‹f,q†áq—ݼîT2²î!æ;Áœ;ïwÞVZö¨¤>KX¬Ù>Ã+§ÆëÜø>l0žÅ/sÅïå‹™ÙÌú÷åv77íô£·¹Òà<Ù?zU”%óŠXÔðׇƨyI-¬;±¢Þ’„1ÔIvw±ó÷¶4óÓºžZ>OS
ÀI=7¼‘$&8ùêVÌ;è»|ÌG£Ù;n£{ Ü,?ˆsäŒæÎßn÷JÏš©M“Ý=Ò&Û ”}£øñÒÑÇRõ¬“páþ-Üe‡¡¸e%-TI;„í'Ë£Ã+/WƒöpÏ{Nš@ÁÇÀö…X>4øô[®7`¾³;3ÃÁ¤ÌÛ¹1´CŸè›Ê/â?Õ‡õɲ9P°Iµ‡íp¸<?„ž‹êIª7(òyã"ÓQtÃKwúJŒ™Å»3›–jª•F~ôãd*ïè}¿òLóÌ—Òûˆéë׶ÿṡMNaj÷Õ¡“Öôø+õ¢îÚ1ÅëtÛç<׈F‘—Tšç^6ô®Ûj’[K FÆK“ÊSLŒeû™eðÍ}%”¯Ñ:]†G’Û+ç‹k‘ÙÝ£ÿx +–9¥9Üwy󔽪gŸ?µ|êð 4)çIνkQ(‘)¼O‚Ø4Cü8±ô&ž‚Bõ)ÜSvÊFáp¹…Npѹ[´73#€Ä#2§¬Æ¼f4:šÒ«óœ`Ëç²oäÙf‚œlÕk"ଂ|Á+P Ny×Õ}ðeºBÞÓ0z_¨ P†Ï·<Æ•*m1¿G–ztÿéèI¾Kß^¿½äœþôFO×ÿ•µˆ;V¨å>W¥)€›é&þmÔ QÅCÔ„¿'¤‡—/Ûå +gºI.Eä„k2¼fëBn„ÔîÖ·‘`*ëìjŒ•yý¶1;-eÎÄHÝc´oo~o',ýu‚
A¼‰›ÖÌe¼DÑ(Æóì$âàÂ;ŠqÊDŠöƒ¨þ»ù´.ŒJz¿8h)ú)Xa{.M·â¸t†Ã8‘lNrz_7²ñ~5f®;^_·Àû™ßµú }Ž£=N‰p0°)aåÞ’À:º„óæ7èSO0¾CÞ£J›×œç}ã÷"×[|8G“yWÈ…æ•_yÌaÊ‘«w±ª}ê
gb@dŠƒU6ÒÐE+„³?µ„8øžj†ü6,æ=ê;"¹ˆóYí/=Ý¿YÉv›4hF2)ȉ¬77éûãØÌŒÎj5Ð74ûô3½µÑLŒ™Úå¿Š¡~<‹¸X®åÈ*ÎÀUdÏÒ"¦çiË>>ÖIøZVZÒQÚ ¥yQ:CÊeL.^%@SC +è1"bîçÞå3TìaRÏwGŒï©`´ÎZýT¾=›*÷øši|ÉÒÑk)°2@œÅGqñ‚†Á«4 +7nå/ŒtÃb}§”fã¤%ökáS“`ÃñŒšÖáÃÊuï%Vaþ1VᮠݹûæôÉoBœdêK²—d•â8ûgeÓ=ñDO·jZZ²ö¤H*ß}¨ì¼¿¿Ê/pî?#¡al¸s`"¡Ní¼u#^R’Fã(ìrÓôê)QñðNî:HTv#ÂGºpŽwˆórðŠ#z†ã†L%kw+«r,öíôë:}´ÿ6ù@øÕw!¯…#×ô~G8[¶»w_A=CýÇpÜ÷ÏAÝç>¥þðO)ñ½?%ÆçL5D +´>Q"Y<Lç~˜ØÂç´øI‰†-â°°@4üêç*PÎÊÛì)®¼öœ¿*R¨QŠ ¼•®Ä{Â<f3@²Ã¯•šÈp† +qÅ^uîÙ),t$’FMàv øQ*JiWÎ)”ª£M…ìÚ€$¹^}úݲÌhøK³f Î8íîÈ&T¹–¦ôvÂôðLTÅ66£Nàâ1‡ ¶ë–s„ƒ&¬kž0ô¿ù®šlW‡,MÔÔ|¬Ì÷ÊÛX爰ÁIÕQóÙoµ +¹dÏ~ñAâüu™[u>”þ
ø9Èto¶÷ö3ã‡WI \Å=D½É°ç½ m©ýáxÔCàR03¡Eïç6tc7%½Š¾Œ7™â?˜ÎÝsÚ~8d®£#T?6àÄìÏ‹´ôlu˜æבŽñŠ4‹]’‹Õ¾!üRûÃZþ•O¿)uåÞ|;¹WQƒÙn3²¾Þ~F];½àá´¼ûãÙÑÇÑúÔѪ?Y©#;‰ˆÖŠÐ „éMbYé€d£D“¨ÈGdW´·‘vƉ»ØœóؘÕC©%ê{±ŸFãö…¦Ú3DŸÐyõäÚ8Ç>ÅŽG&ŒÈªSqÐLj22 ˆáû„ì4è/’þÞØ[ÖøFÌ!I¾¸âUX8‹Ï@SD!êp€†¬”‹G·'5?IáÞv°r÷àÀ}N!Wa]xêìjñ
Áf…]h«šÇ†VÁs"Ÿ·Íb$¶+í‘é·½b}Œ%Aƒ¶eÚ£Q-z›Ýû²ýkKWÂW¶žðÜ]–° p–"•¾ÔîåVxqcÉ—OiéÐm8ö¶³Öˆ8Ø¢UéÂÎm£ÈrÏg 1!hAùÒ•_Ÿ,i4óiеÆÝæÇî2²Ù-ìƒ!–ƒ.Oh7.ÀœõM4½Ã—ƪm;A–z‘mn_¥†Þ>Íâê¯oæïýFäuéã·öÐôÓ¨äÒœ£Ä+ýi6á¤å?¨"ß HzQ{9–ûºÙc&÷{`máËL%OØCÂü~ûiE‹•„Ÿçd|pvµÛ_És\}¯·;¹'R?OPúúѵa•¦¦èË:ý~Bg–J›1°kb‹¬ÿVñë`„<dýâ¥Õ“ŠxšÀÜÈõ¹ÐþÿÿO`
YB=\œ,¡Žhÿ)…1 +endstream endobj -534 0 obj << +579 0 obj << /Type /Font /Subtype /Type1 -/Encoding 1165 0 R -/FirstChar 40 -/LastChar 61 -/Widths 1166 0 R -/BaseFont /RVVEQT+CMR10 -/FontDescriptor 532 0 R +/Encoding 1958 0 R +/FirstChar 97 +/LastChar 121 +/Widths 1959 0 R +/BaseFont /JAULRO+SFSS0900 +/FontDescriptor 577 0 R >> endobj -532 0 obj << -/Ascent 694 -/CapHeight 683 +577 0 obj << +/Ascent 725 +/CapHeight 694 /Descent -194 -/FontName /RVVEQT+CMR10 +/FontName /JAULRO+SFSS0900 /ItalicAngle 0 -/StemV 69 -/XHeight 431 -/FontBBox [-251 -250 1009 969] +/StemV 50 +/XHeight 444 +/FontBBox [-209 -321 1528 907] /Flags 4 -/CharSet (/parenleft/parenright/plus/equal) -/FontFile 533 0 R +/CharSet (/a/b/c/d/e/f/g/i/l/m/n/o/p/r/s/t/v/y) +/FontFile 578 0 R >> endobj -1166 0 obj -[389 389 0 778 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 778 ] +1959 0 obj +[494 531 457 531 457 314 514 0 245 0 0 245 816 531 514 531 0 351 394 371 0 474 0 0 474 ] endobj -1165 0 obj << +569 0 obj << +/Length1 1669 +/Length2 2390 +/Length3 532 +/Length 3281 +/Filter /FlateDecode +>> +stream +xÚíUy<T‹WÙK‘%Ëåز3cÙ®ìdIvÊrÌœY2æL3g4SÏv…H˵o-DR¢´Ü ]!\…p»hÓ¥’¦wèn¯÷þ¸ïsï_ïóæ™ù-çû[¾¿ßïh¨xùèÛáÈ ¦#ú8¬àƒ€t"È$úp£Ü,ÕaM1öLD¨0ÝD À—ÂvÀàÌÍÍ1€=Ìà2©d +øy +rõt´œ=ý +µ¡`^0a˜T Q½œ>ç‰P@d%6‹Šš˜„za; +¢#«6µ" •Îˆƒ¬ÄŠ€ +Æ`RWÓ`³¨tòïèLˆŒ’CƒX,Å^éÎïu¨d0hÜÕ§áU¯ßr ",ˆF2ÀàŒÐ˜(‰™JÇ®Œ€+8ìg=‘ÍøÕ
1W¤õË@h£y€D˜NãDˆ„1ô„4* õ'X5øûHý(ý[ý[èükd~IÈï×ú¯6óK'6æ F¡Ôþz +ÃáÍ>;{¡¬#¾\`©Ê&þ&¬@ÙÙÁà€>n+ÍÇÜ].s,ú…ÃÆü‡¸«H¸ßeaR9À.,ºs8uå»ü7òŒ# +‚834 +_®I6¨ë¶à]ãöÏ0>Nn×™ºÛ$CÓl< ½(UŒQÓn.“ÝrÃLwêÃÐr±ÜÙ€ô/º?áÆcý§Æ»vz‡ž]üªû†1Søå[íxµè²x)õE†x,áÛÚLé›ëø$/žš™ÝrìÙÛEÍ;ím¯š't‹2×kXFó‹mI‹ß[¤`ìWé,8$ÿ>·CÝít;ƒ·Ë$ùUâÕÀ㱞Ã÷ê8SaJÃðC3¿7 ÅÙÙB:ÃÏ?–V]Ó²“+x‡|;LÔ(SJ«‡Ï(‰`$SœvY*ªw´ ÿ,º9õc߬æƵ:Êø‰œ!—ë–mâig{iM?¾>©(r³qºø}¶˜/«Æ<¬Ph"Ž³÷„eO¢ØŽÂf›ó¸á’¤Ô.BIZWíÇ™ü׊ˇƦ†$ïa}½Þn{8%ÌQ¦¹ñöQÄÄ×àűå1›>ÚfõcoÛ?Ó=ÿþÆÕMÁeò-ÚßiÔÌz'õòÊ70œ÷©æT
Æ*4‰UîþA$]héQybéQ½©Kݯ?ðf~Ì÷lÙª~™¼uÊŒŒýA7kôL¥·ßXS⦠·Wlv°;“ÊË7.’ël33 +@/_9C·$ï áw×ϨŠOdÚ©6/;’cÙSèBrÑ+Ÿãž>/‘{DHÙ;|Ñùˆ˜xÃv,-›]þÛz¬*udÕ^=¸ñ`»2×ÇÇ¢5 +½ºâU¾7^ñÞI{6iWÔÖx®üg¢û\üõwjøלжŠ‘ë|˜l3é/ozÿi¥=\»¿dÿ½µbôC)@Mv¹•?µ›+¬&H+½P +Ïë¨bÊÔ9çU‘U¥úû³D|§Y±à÷ßmâÓh¶½yÅ+3ôpÙ²‚îekÓ¬c³^ç$.á‚rƒN#Wç¹ë´
¢^Îß–?æ„MÞ’%üìïéús÷:ÒC\¯âÅ›¾¯ŠÔŽ8êî?cå#À¾uü˜Ö‚v¬´M8sÑ–Ê/n;ÖÆýž)Z%#zâBýQÍœ¸wÖ8ö=¸Uã™øÔwôÀæCåyÖÊlÊž”ù%F„Ö:Iç늮…M©‡'¶GÔÛFÅ6Æiå_áS¬ÚAÓº? Ã+”Ò/mÑ©ønPåMA«4sÑXG÷–²Î’™H·àÆ2¸NíÑ
á=£OM¬OŸ4¬`8”¨ÉËçO(t/›ÛEgßïÿô¾!‹eë]_8—lø4ñ®üfuÈ*ÑsÑ¿Œ©Öq؀᷒ב+/éë?•Ç·óªËY·ÎµüÅ(åè!¿Œµp‚ªŸwÏK¹¯I£¦ÿ°VÛ©1VÓÒèlÛ’ +ëTBœ2.TßÔü"3‚ôˆöʨcÜTUfxbƒøˆä• +rŽÏ8w_¤)“¥£,ø“ÆÅe8î·|žpä]ÝܧW´¤ÛÚ9†žŠÞï/x2…ç
\ñ«èl\›'0õãù‡»/—ÊÉ6x,È2ˆOFm;ÙÑ–O)xâ,1e‘T¿ç¹øÝ«s
j—¬Ç©üç$U[ÌézŽSÀµK¾õN|×nœ;”.‡ßû|C컙朷Ë+˜¿µTIC¹Þ’Ï*¦=‰.U¶[S§qw÷r\HñBþÝGöU1-y%dîÖ/š54Øú³xñg>Üí™ +¹&i]2,aß)د¥Õ…½gïƒA’Ñ–®_ó@C +endstream +endobj +570 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 1960 0 R +/FirstChar 99 +/LastChar 113 +/Widths 1961 0 R +/BaseFont /GIPYNT+StandardSymL-Slant_167 +/FontDescriptor 568 0 R +>> endobj +568 0 obj << +/Ascent 504 +/CapHeight 687 +/Descent -237 +/FontName /GIPYNT+StandardSymL-Slant_167 +/ItalicAngle -9 +/StemV 0 +/XHeight 0 +/FontBBox [-180 -293 1090 1010] +/Flags 4 +/CharSet (/chi/epsilon/pi/theta) +/FontFile 569 0 R +>> endobj +1961 0 obj +[549 0 439 0 0 0 0 0 0 0 0 0 0 549 521 ] +endobj +1960 0 obj << /Type /Encoding -/Differences [ 0 /.notdef 40/parenleft/parenright 42/.notdef 43/plus 44/.notdef 61/equal 62/.notdef] +/Differences [ 0 /.notdef 99/chi 100/.notdef 101/epsilon 102/.notdef 112/pi/theta 114/.notdef] >> endobj -509 0 obj << +565 0 obj << +/Length1 1552 +/Length2 5631 +/Length3 532 +/Length 6438 +/Filter /FlateDecode +>> +stream +xÚí”wTSû²Çé‚R¥©„Þ[èC¯R¤×@„–Ð š€ˆ(J•^•*ƒ€ô +H“.H/Ò ÅϹ÷îy÷¿÷î?o½½VöÊgföÌwfÏo³1éð=€Àm¡*p7/>!~A)€–·LîçÁ] +Ì +Ñ…yÙ90
@ÿ0ºA .07¨.Üö«' +ÿýÇ–ýéÀÿE˜°¿H `÷'a@ +:\C€€ã5Ä4
»†Î×£Âåbd¸þ…˜Ï‚€Û5ÄÈ€_CŒÄ5ÄÈp¿†×#ÃóbÆíu
1ª¼¯!F•Ï5ĨòýU~×£ +ù;þ˲Øy{x@ݼ~ÿ¬avÿŸlÃ0(ÔjG<5·“wJNKñª ÉìP2oû(t£+QXõ(/'¤Þœµ YlsQÁ_=$uÕ€ü²¸\Öà^éùxÇ…£%º“}ÅÂÕšC>ËÞ(γ&`UHš²i°;¦5k&&h´²8 §oUpo¨Q؃p÷„+„Å''„Šõq+È.©2ŽúY5EEîÆ&{ÂÚÉ1GGowWg˼ÖežŒ8"6i\Rög!îòfºïÔS;‡¼Yr +øsštÙ
ˆ²šJȺ´Mt·Tt²•Qn›«´ Ùýþ‰@Ã,NœxR‹»Ö®®³Tþ‰š»ªaíö4@Tí«€Í„$Þèq†ö®á¹Á'îÛB#N§“üÇ
y’ÎÁ¤>K
ɯ˗±¦ôвêkŒ»vÌÏ8n„ÈuFzç(=äðÛµ\pOÙPÚÍzÓõQ‰Ìõ5-ŸÜo%ohEÆUÏÐ&Êhí´ïµ„T,h ïœU2:»š8zmì~¥¤‹}ßlm/n–_’»¢÷Œoúþ=¦0¡|—•!|N3—ävЪYT~yÚ©pDq\)¡îþ‘rÒ= +3ó6£3L‰¡ ئ4׶Ò9ÒŠÊJKÐ{zïÉäô¦jóŒŠËf¸^ÄÒg”< (š¸Ð}Ú2-ö”¾˜;]À?gñ
™¹yœóâû¶¼ç¬ëÈ— a*<&c”käCEÉM¸n¤ÚøZr:ÕöJM»TXE—œòÁññÕ«Ê3¥%ô‚4’eo™¦¡"ŸÓžÉ)£›bV¤7J&hCi—ëÍ„îLâ!š3oü àÚý4…9“L2$²#í&>ãäæôà©…ÞiÖÄ~}ÏE0á‘C¼©©VÒŒ}¸Ï +yS(½†cÒh·ÂÓ(Ò9xøzåöäU ³ÕdÀii¢nÕ§
g±S¥†¤ŸGµ–¨ý;¿¢šCšûÃ|ÏK›C–È(èî¦gLó¦&;ò<nPÛ ùqòpa~b+RPîýù“‡tq™¸OŸ$ˆo݉#C6FÅÎõÜZ!©ÝŽëà0ªÊj"Å˾gd!SqýêW sû +¼òàs>¨ï–?ÜŠÝèL^šä9Ïþ’_dõ Œôz¥Ò%À,ýe…Ú+¦•Ò?aa9vœh×?ø4v¢¬cAçXaŒs/(¶#Ê(‘ZèískI³¦µæ'KÌÊ"%©fÏÆ÷êóS×σ™ÜmÆ™5›/RャÖúÐ tVÚÀO +>yžV؛ڮ'ÒÇ;[ÖVüÚeñÕã&^o +“ê”T•7Š3gcVüfæplÂyuÔ’£e©T9£³eËMå3Ô¦šª/ÀöìÈ:'·Óú¡x×^Ó¹Ô9‹1Jm´Jv€B‡‰¾¼q Y9õCί¡2dǃÙ_©îEoÈ +?\'~L…^>ÿ¶•Â©€2Y6/Ù3&fN±æ%µnÏ»6Þи•UkÔæ!ÿÑÇÍj£ÇÒ¶-5ð±½Òݾ“»´5ñ{_ûù›U +:bÄЄPTÃþðû›á’³ÖÔöO¢D²—‹ÕëIù)C@ù¹LAÓ“é²| 'Šq¹ÅëÒàwç®ß’3åz–í¶±ùŸoüÌ \Ç/"=¦Ú×I—¼uéô£G¢s|Á;!œŠ“TÄöŸ·1•st¸ +âîõØüØâ¿—^˜(ò%RÏ0Í”¡Þv8Ò³2µøälÑ„í(@³rl—ïí'š—_ÎAÚÃåÑЦ°ÈA}¹í©ñmÙ3Dˆ|¡Ø1|-‡Íùúû—ÁEI ‹—î¡ZŒm§ú«mîþÇw(/ ¾
ºœh(¯ÝÐzî‡CåÜ°ðYûD<æ qe·ËmIŒûFR)?m óLfI‰/a¿–NjŒËM± +áõ~¢€üƶO¸›¥
ÓD@r‚£.NÈÃݹÞ;®´›¶É8Ý[3–v ¤E?›}óÔo•— ×”õD´ºŸÐfP¶*·dþ!*“ÊRR˶q}Qqòç5¿A +‘Œ‡ƒqBOUÍ:ù'oóß.šÀéd’ØG$iêG›…
7Ó0‡âæÝctîÇwä.܇nó\Qß{Þ~vþú¾–SÔ=Q«Á 8“Ã(5ǧÒ3N@I÷ÍûŠM!ÝJh©4gFççouÊà”ë€&KôÊ‚`ß
Ç-QøhFÅè;2”HøĽCN½·ÕBbL(¤ÛçI +ö$H<=ÅtíAÌ}_('Û5ÉÞ¥¡n&/ve +E½VzI<aÊ…S÷a´òKR†bÎkÑÌ"Ž6•Ùd¾È¾ÓY·•™+¨”(xK?¦4Tu*~™&o¯¡+*ñŽ <5ù|{Uä0j±Nr‘„ä$æÝa¶ŸâI0ÅupÎ<Ç%¢¡ö±½¡%®™j„” ÍgÉ•!6u7ö—œ_ª¾IAÂ;GÄî\ ºslJ`wkÚ&º!räãŽÕœ²lmìE¼eäÊëóÐL&ÂåY¯ÜÞsѾÃõÜƒÍ +öˆHm£Ú¯µøÚ; +6WÕñ¹3?¦ägÖ
•âí—⢰»eñ(S•ŠÜ“Ø›ýÂDVÜ;!·¤™±Df*÷ ôpŽj1þˆ”Ã{R<Ä04Å¡{¨ 5à7³l7‚Kp¼þ¯¢KÉgFßφʛðñú3— +/¶™¾¨•ßê-ˆ$ퟦú8¯aý2UÜ[öÞá8„±FöÛ}–Ÿ§a¯‘Êw‡JŒ®¶v=ES{ðfë•ÌÇ©ë† +„A±4eô—6þÖt”é¯ôn +ÖOÑ1%ö…ôNçé—2ÿ|ÜùØ¡¯Yé{E+ +z™²Ç;Üë›±¦€+¢§ÜårYÐkI§ŒE¯Ùø«(ÉÏh’ í-£€û˜/.²ô-IVó}Ž~ãú×"ÏD>.NšõrѱAm¥Æ"Ñ5oçãŒ^6c§‚Ž^Ë„†]Îâµï£b™Äwrsyßج×uÌ”Yö2þ¦0ë»2“èZzõ¹ÈaøeàZÛÁbŽ2Eþ{›±/]Ï86Vâëíc´ré“݆Æq•2wœÄÑŽ³3¢w¥›5BYÅ>o‰L¯NÑì”q¦/-H¹88˜ô<.¥ +qó,ºŸÃÃ@’7ËÜJW"F–„v>bx§PQŸmr³}œW·CxéQ]Ý–ÑûüÑìH¡r %ýf/q1Ôç(……ju+4¤]]
Ä,ß(eµÔû%Ô’ *ÌÂÐ×Wml2¾Xn±Qƒ‘żú”ŽQ+ÁÊ3Ü–G!ëre˜‹\ÐUI/Ýyª±àóðìC9Öìv™ÄaTHEc•ìNnÑž%iMÄq–O˺3£;Ôe©Ê8GUD¡b;';jYTP¥pÔ¨Ç×.|JVÁ1¡ŸÔcxø [}ÚJ9ª:1Ÿýü´ã=©£ïg´G÷Æšõ2@§Ñ§vcU½oÜÛ¾3´[øûßlB±9€®Vž}¯&œ\Dkc!ü}qÏ +‡›é!T*««Þ2Ò‰†¦ØWËü´‡!ÁÏXk^D<Ïô÷æ +zœu[ÀbåT†oêh·s_B*½Xƒþ^kŠiàc@"Á”Á|-¥+m³0AßfùÛÓG¼É_aŒïv&á“y+Þ,þ¥ô]Ûæàyš#öÐVíïOåªYŽ¤Z™ £iöL\W‚|\°‡w —{§AæÏX*ì‡Ã¥óòF¥oèŸî ŽëÉ5:?‹ßð™#s²kDi;G
zÕÊç’•?è~oøÌ€ÚË}ý +U*GÉRÄûfM0G%/ƒImj°6i|„Ú/H´±Uj²<%Ø}U åbÍja +®ó² 1¤4¤ô<"áô4‘oúmM’öòÛžÑi~8fZñ†8œàÍ_íxU£RÏTÒ£Ò$|ðóÖ¢û^¹âqàè ’Ð½~&²E2™é,A§•ù ¶0Û²æSü›:Ñ@½'ÌòR³ûê8ƒ¥li³Ñ|QšH×·éD³Š=¥ä¬›¢Ó|²cñýÇ4¾x{ :¶`ÌÜ×jªmïN·°o2©(5zds¨ÙØæ¨}4ñ«™—³È +v2WÇ!óu¼-Öæ&)IrPy ¨^˜þógp]³*αªu1Vý‹§æó2ÒߌR½ç_Œï¾V½ÝS|)Â+Ö1ѵòóPúêcŸw¸ŠÊÚ¨5ó9¿X¸÷À‚רcß‘ÖuÁA¢DœTM™z–¾iûÚ›(J'¡SSÙoÊzB +öp&þ/käXÄ +endstream +endobj +566 0 obj << /Type /Font /Subtype /Type1 -/BaseFont /Symbol +/Encoding 1952 0 R +/FirstChar 65 +/LastChar 121 +/Widths 1962 0 R +/BaseFont /RZMYCH+LuxiMono-Bold +/FontDescriptor 564 0 R >> endobj -506 0 obj << +564 0 obj << +/Ascent 757 +/CapHeight 726 +/Descent -186 +/FontName /RZMYCH+LuxiMono-Bold +/ItalicAngle 0 +/StemV 146 +/XHeight 530 +/FontBBox [0 -211 714 1012] +/Flags 4 +/CharSet (/A/C/L/R/bracketleft/backslash/bracketright/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y) +/FontFile 565 0 R +>> endobj +1962 0 obj +[600 0 600 0 0 0 0 0 0 0 0 600 0 0 0 0 0 600 0 0 0 0 0 0 0 0 600 600 600 0 0 0 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ] +endobj +562 0 obj << +/Length1 738 +/Length2 18090 +/Length3 532 +/Length 18730 +/Filter /FlateDecode +>> +stream +xÚlyc.ÝÒeÛ¶ûiÛ¶mÛ¶Ó§Ó¶mÛ¶mÛ8mÎ{ïûM|‘Œ\¹vþ¨ÜEF$î`ïªêåhÆDÇDÏÈ
PWÑdbdd0Ò³À‘‰8›¹Z9Ø‹¹šq4ÌL*fŽ +•ü'ÝÞÕ…ûŸh3ÏuGpýÉÖè$ãÿ‘þÇëìù‰†‰ `jeâ +06³°²‡aøoRöæ +ý'ûŸR€ŽØÔÁÞÖëÿü§¯—c•ÖRÖÔ¢ùŸ‰ø·[ÌÞÄÁÔÊÞ âú¹FΦÿcø·[ÑÈê?ãô_(ÿ/ +Û7÷TÔ‹²o¤ $Èí.µšç˜7#Án·c>Ø"¨"u2ôÌ÷IÀW«ìËPÁýrW¡Úåaž
k?/fÆÌÔÃÉþ³,›ÐmüùBIøê¯öæ¹47j혉ɳp½9N•½u´CŸÂ' ÙÍ-´ˆ`==¨StUáÉòûygï.÷LÏ°1u!Ø¡ +ïeÂ]¹=˜>ÿh»íÎó‹Dìv¨«ÈûŠIC” ñøûu8Z$I RÛý +±Æ·ß³˜‡ÕÄ®§¿jý¸zs{Ò›AJË(ôM’ŽÐðK'¸(S9/ž°†+¢Çz’v½c8å[—òa{ZA,’ÔàºÊ"©%
R˜4ãEà +¥P¢œ=Tnó_M•¥œxŒªmE›—lДPšs‡Înç™/UÑà º-çAÁòøØ)î ¬rŽL¿X<íClG
rŠgn"7—ëÚ¸¢]¬Êž±çÊ&`hsh@05XÓº26²7¸OÒj>7œ&ýŸC“ŠŸ¿$ÿ©«‰kMúý16
”Ò +{<›53û*ò›£ú-[€ˆéÁ3f?ë—=¤/ô¥m
j¢µ»-cN +pYžÆåØ>¡-æ«’¯eqíLHH.âëÔ‘[ZJ•‡¡ª`GÁ†p,p¤æÊŠ÷uø"˜º]úû¤LUAr6È^{¿ðt_€E–{~š¿{l•K ;‹Ïã;qµñ²õ\®`2ÚðzY9Ó&í/ª¢2˜@Mîhü_1G3,¡öþ„æÝòþV
ï=/í(n5š‰ +‰!GÖÇåK„#
ìt(½d܈ïïÈå™iäMMì\?“ÇÇç‘ŒU?xBˆŒ]‰ðãQ=¿šÑ]KÖ™û,fÓ•ŸP¸2^™öÀS±‰=e—›]M=ÕÎWE _yO=z[┾YH곩iF¦{6 +;îþˆ ¶î‡0ë3tZliel¨2&$r?¤½?&žKjü#Í(ÚÌÌ`À \ÓæõjØëÒ¿.‚¹Ø›±ÛNÐ + ò„9 ÞEÙéå_¯8 éçʹÎÒ\Éà½æ±_|¦ä`’á´£LtMGXfî3%[R°BH +W_2Ûm;d™}`Í
Žsâšn߃ó“®
-Ýl|€ +•½;£è’…q&EwyIrÇz<¯Þ`vÞe~}VN/ôÝY´ŒW«(bÛÛöIß|ŸÝAƒŠ²OŸ”¼CaÍ «š7Õ>8ëâh¼K‡Lê/3’Û†¼„ê{¼÷dá +•BêóÃó•7(µbýGJ%?Í6Êë +e¢»5Ç+Y[¢ýøI‹Ž½×t-jAYú±<r•ÍÒñ²œ¯ð]÷r²úñÒsûÕùj»ÀcGšæä"褲-žÓ2Àí·m^=8½OÃNíhRX¯¢C*RôÚ{ ëökãÈÒg0fäùéÈ9ö›«2®RuÑdçè%Öƒ+Ëa3qÖèmÚ …$°#\|õÖ o¤¤a"†Í4ÎÀ§E߉Ÿ +šªc÷X3»KD™L4ÎÁ‚%Ïmr½w©V£6Œžvȩ勳
€1üA¡¢þ¼¤’—zlOÓU¤÷]Ò–ÍïsÒ Š¨t(8Ú”£ôøž>”çŸ6ÂÚ›¨†‘xƒË¸Æ/¸IûPúhºCC¨YÍœ^Ñâ8TÇHÿVCkàb‡„Y™B>åç{ëÛ~afNÇíE©[Ûh’‚Ö¬rñÃC5žÏ÷¼B9«Û"Ô$mgçOMC>hüà‰VVÖ{]@!!Í&H|Fœ
äõ.óPÎñºÿ•FÝk/Ê;HVÐÙñç‹0úP{d{Æ•dÖ_‚Êû€n~WlKìØ+¬Ì#odÓaßÈæhÝÓ!A›‚Æ_ +Ý™{Ìe>Ú2wµ¼ší µ]Õk†W12fTlWȉC>`ßmDî8)N…´ ?
äNo+\›pùÈágEìì2ܼ'eÓŸˆôHíšùþNÑ7R ÿï~Á
¡Ã}Ó›\‹Pv%a’ D"¯êîéº +·»-É"M° .ßæqM÷Qö]Âz¸}7Ôv«^H
îE*¶RÞ'ñ¨ÄÂoL|Lì}|Â1hÔþ=?wF?ñﶆ9}˜ÜG~F˜£¦ÅŽ +fkŸôøÇaÔÖìUá æ)Ñ6ò<ÒéÍ$¨ô7š;¯hÎüV½e§ç™úù¥Õ*²è¡[¦qW¢ÔTÌ0fº^nG¦å÷£L¾¨À™Ê¤ØT5mjÙ¡âQ#¹7XÆú‰S}Ñ"6/äά¶lqF¼Yüˆ,X™œÄiZ¼¹Å¼N0²#2”#$¶7\’óoK×ùLF“>£†çÑs7n•ÚL”&ícKjx"ØâˆÓØOLÝË‹u50“®?å™oébé_÷;¤*Š•Ò6eÇõyÕ•Eh½,Qvë¬|^wúIÙÎÛñ½°Þ²8}N8j#}ký0*Â:!-4}/¿äqÌÏŽ_f¼ô‹^0è@Ñ÷Ú‹Aã§
ä%±\áügúõÅóÀÙláG©©µ%Äê¿r<F€¥q²Ô0BÑútW’ž]‹3裡ÂWë@Ž%ÔM¦íVª'`È,ŽŒ`ö‘m™ßKî5Dwœ>¿^ýØü#Ÿ›!É‘YQÔÄ-íUÊ’¶Ö˜§â¢ºbDÏ×ìx•òŸ•´lÇâãvý4ÄHoÙà‚Z)edð˜Pm$\YЩ|‡Z +Aà}åùàŠ2¹½'hi$–›"…)è1°´Kíé~j$6‰Ñ»˜ôòÇïV¢%Â…\TÑYÊÀY$œ®DQþJ%¬¡¾(Ùú;8Ót(ÃÃç˜m²íu>šð?êjå{RO|Fà䣬*PÓ¥åÃ~ó¢¢ìC-ìý=²Î¹ßË@'ú½ÖN™k[s÷©¸¹v³Hë-Ô©ÍMTWZdo~€#òŸ)O8PR6}ÆTŒðù…¤A2Šmò×&ý“'\BFć°‘ý‹k±»Ž‚Ö(Çš–èïߥ-ÞÉ¥‚}*L +ûeÊ<†qmTE°Šì-€ø5yÈ’pìRÇ{ºH¤À½Òà +8ÖŪ͢ø½ºƒ–>Ï•ƒI5Ít¡‚h ¹nì¨Fþ¥LétqI?éôgÅzxOì%_É31¡&£K¼on†x %M¨TûÉÙäÄÀ2tžGPnéw +°W¬×—‹‹Éæ±q©;ƒ•t—‰+ûÃbÍ‚=-~ ý}âÃ$:ëWÔÓ3‡m&àöPò¬¿µ™¾/ÀÖ/}'Y•ºšò¶Xãe›—a’’{ß\òjjLýÓKY°¿Ch‹ôƒB¹˜4fñ7VVð+T@¹NŸ-;÷ù +¤‡¹Ö‘nÁ-•ëÌV‚;">„H:µÕF«t¢Í)‘–Ȭ«ßÔÃcIÔs±LþRm«ÐõÖ‰Xëúî:(›–©Õ·<cìûOëè6@\ó ô£€ +šÑˆ“Ì\(ñ~~JY>ÅÙ˜°›±÷^¥a=êQ•4ÊâAårX6ßu]E©nŒ·¹i&h²Ž¡e‹_HÉRŽâ{eÔjÐJ¥ÕT?˜fw÷lty[ÞjîãŸxéýœd(¶¹öûˆGS¬ïŽüªÒkUÇ<Ò©-qÝ÷Ûýª¯hHͲurJŒ ÖÒ¾£Û/§¹IW>¬Ê{e×´Üç‰=Š˜j`Â
D2„í-&NZ %| GAnTÁÿÈY«5×æ:‘w¨c¼È[usfŽ6m×·©? ú€Ç¦?¦-¯›©Û•ûªìÕwˆÛÒœÅs£®S þÁ«¼Ï–ßOmé»\?ŒT˜±¢¡tj4”îi칊t2ƒ´B|i{†Ôí*Œ5~ÁÈ[›s̲ïnTfü¤sa†4ÞŠixÓN3Åd÷Ñ\XõîMYqLKX£¼ÕÿÎOW3iÌûNí'Õqt²ØoP
úD®®¹½jí³–ßÁMD§Ê¼AÌëܧԯµ¾‘¿-[‹<Â!»×¥lç줚ᢠÍydv±%š{ŒÐaI^&XšL bò>³0{÷úóaê¥6>ÎêZ»û7µÄ)cdÉ’Kû͈ô¸.®„Þ5Уkß÷æü§x"qs/™ÂwæÒì%¥k;$UßͬÔ`oín[ Ž¼ÁÝÔ\§;£S—½êÖ·àoÆÃ
\Ô^BC +7åÓÕ â¨BöÕ‚XH§¿)¼&l3—šù> -écÏœetihÞÂr¶~]§ÅfPŽ(>þ0§ß¼3Åsç0D?V¿Œ^˜º/S0%&Û¥c
°¯£‹ñ‚ÂQË-ç#¡‡Í™9¨q‹ÉÙVË—¹ƒwKé„øP³/ñ¡–@ݵ¸Ž4Gj–Ðk=ZìïX@:èdI…¸n/Ù‚‘?À;›YÖEáÛ¶¨W¾+ÓŽ(ÏF¥ +W,o˜ˆ@i½õ䧨ÄEÂ;ÒDzì;¿0‰ E+Óß«ß70ÃR÷Cd ¬ +w/EèÍ7 +O»SÀcïŒñoGörÁ¦Ôl¶˜àÙ}ÝjUìó…Ô}¤pÏ$u~Wíúñ`2Tëb{ãá·Íë²àôé¿Âv5J‚€ã’ËøÎ~/sÁ5“°®& Vâ2ÌQ,/ÞHßu +7Ô…ÊDÍÑrîÐké<gïˆ/*Aš§! 0Ìt0íNG7„xÔ·Iøµò‰<ç°Â-¿‘ÎúOïSH\÷‰€öï#Þògù/Ô++RZÓõƒ¼SNUUëy³Y“>Eس÷œrä.3{‹|È"ž,Õ¶c+ïdû–™w¼ß…mŒeqëNõÓShþÄ„"§:ßÌ®¹ +‘¡:ú!B(Dh"wûGÐ…Š+UŽ¡?rF/5<ÿ½Ï£q26ÀcÉá¢5‚q»þöÁÎóY8C›²«–³Úm˜„ϲá£C9Ûþ&¹DËø™(Q¶>^ÏM +óÃj¡"káOPF~[¢‘'Ëôoš^io4eã(Èü—
)gúx¢(®VrÌìÙŒÕ%Á@1è¤é°]beç~f.ùá)ÃÊ:yÏê¬ðûŠ9e+œû¥cW« —¡™¾@>?í#\SÈ +ßK:½ŒðÑæ«÷]-gÖæÙ¤Rú0 +YxÄÙ÷×v³°qq)Lù¿è!Ë&ûÞ;Y‘zë7ö{5g-í7jûÓÄHöQx2ÿb7ðnNPœd¦¡¿‘ªÐ(:óýÒRå2§Y@«Ï„œ0LE¯]B°ë@çôüVB?6¶õ•FÐqJÎú€{]í“U±!|‹m´ +Ü”ÜÍDºPm¯»<,7è ü„Ö"zá`DðÉx”ÁþF'ªÿÃ"žýnÅŽ?2ÚÀªuÎbðl
4¶¢þðÀ)@ç@¥;Õ)|Ò5ø”Pá—3
õ$œÕXM7Lâ2"¿`P‚³$ƒôQf +ÌÚÄûÕJq[J™ +Š‰>:Îu‹½à‹MµzN’õø%»KÈá윜n†器 +¶pŸ˜¥E?Jì¹:°½8ODµ0TAµ–„öá~tÑꔥU”ÿf™Ä°¢&A¨~¸žßµÍ¦VÈ…Ñá=LØ„mlV±Á™Å^nñÐk»Ò†¾Ø‰pƒ¬ÀM©ØÁ~Ý3vÞå–#½ Xè3’ð¿Î‘[?²ííj4jÚF7b‰lÂVu‹·E‚ÓÉœ]Ü +WôœJ°³;plÚ$«äBï/ùë4gí¬*ÒÇ¹í© ø‹9vÄÓ íöÛ§ÿÌ9™ŠÐM=
“éwlxñ›Áº×Ç>N}}îs¥ˆBî²ÅÈ$CÄùÕV4¼ÐØ¡#÷1~liYBCÇ&N‡Œ°'ÃìÜÊÎùá[}²1דØ7ƒ¤1ÀÕ¼MoÏÄeÖTkfÜ[cÙ*Äcak¤!rW³ó¡ +Çù›•=Á½1œ2•;ø.ùµéP©æÔÛ5Š’ÿR|ìàÌÐëW+³ +ãhŸmTÜߺõTº‹Ž–±æ¡f}"‚ +›REx×á +ó¢’`ÆþÉrè‚‚úÝ' +eß«$»³2õöëðÃ+ÂÉJ KnÓê7Û CbƒµZlñÅò‘²T8ì3nþS4¼¼‘Da^¤`8¥ŸŽPúTvÀÉÄì˜ãϦBªˆahKé„ IÒ'.ª¢§W|®ñnuÿÏÉ!…ëµ]3 ÞjݲQ¡øÏÞEÕQ\>#Ët™º\¯“XU›@Þ–?}¢ +T&§ã~^p*ì‚@H/%¹ÈÌzûKËm´Ð׊„³•„BÌÚŒ#J Ü8V¾Ã¯ªí’È%1ìwbµæ§üH5Ñ+v_wéiõ–UÖŒ8£áåÈ ih]Ž¾¬Ž¬Ï4ÆërQ‡ÍG`äËÞØQ3Òã,„„é3èå*=[T)g´¯µ0G¿z²Ø¢\Cß…%zC¾§rËÛÓ#»„ãÀ<Mƒ…õݳO¼ÔÝg¬£Â\O•dó@ËìàúÅâG„5Óïââ³ýT¤>õAšw!)c¶HGwÔ¾ê¡ M)‰àÿZö…´îMÐœÏOL¼ª<©4,9Ü=Ø€÷1Ó}I<Ìàçô¾
«Š³çh•ÉˆCß‚ÁÇU¯ËcA*™OS>…pPX‚CŸ3®/'CgŽ’4OÝòi‚Öu¿KzOCú¼_-û)àšEÆÅäN§‰œ4¸tFn\¹Y±êå¹}’‰ÚËå]Ü÷5ÞÍŠ¦——¿òóçjN'–¨ ÕþùèóòNê«•,H +Ï¿>'ØRîLX}TÙVЙӫžŽP›?Ž’IFªC 6«0W«L…£7†µErHª ¸ÅwÝÎK•É‰žkB¡câÃÏ[r´ß<¬ÝÝÍMtX"§óÃt©¢‰åF3'!á¯ÀE‘KÐÄŒGáÓª
Pó?`Æ®ù¥çsw2´þ4¬·räƒX?¢Ç]¡Éu™"U6d>y´™V¸øƒuXu”EÐÑ#»Oó•‹Ë´¢âújý"Ÿ?¥Ÿ¨JEÂáËXèÛD”3Æþ‹5F +;šK°-9‘…óޑ‡µzÝžÊ.´!4›RŸoÏY$šcnW
©Æã,Yô2M$¸„tm¹x ¼Â'^’`4¢Ã^xxçûèCu&šG!ž@e5s’ +¶sAyBiµçJ¶™‘·œ¨^u +lZ%òµd•¦t9ºéHBÏÃ~´(BOÛí¸5CÂ=Mß'¬ã¾ røÛpòt +8ÌúÅ•Æ$œßWœìª^%™¡(a#›ââL!$²y¤•òkûÒ¶á›!ëR–t!ðÍ]Ò¸Ï5æsèî6Y¼%8·ðéßAˆ
bñ ÂPª°£Ç_´[,ÛªB2K½‰4eabI]«ò½ï¬ú5Ǽu}îÑ™lÔÆ–Õ£ù¿ÿœ%Ç´vÜufÿE,ú…>g뇤`m^Ï,ت2GÇ¡–u¿ë•Ë"æ +‘gÏÖÖňrΟùCñCyïœêIÂ3‚—
ݱ’-^W Ô`üe’(‰Û±juJegb¹Î©˜?³€Ef:92Çü%µ\‰ê‹Bºãö«a1šðá8iû\î +!TþÛM1‡ÒÙ*!`ú¸m±µ˜¥v%®9^!3·f€RÇæ“ì<[°´â*Ý©Ïà^ÿÇْ׈Ïe(¥}H&b.N0k±X7ýëÁnÄd:Çž@XÀd7?vQÝyÍT»¸™c¡G«|qýÑ•§áœÊâwo‡®`ò«ÒxõËÜ4ÎG}Û-Ò6(CëË–Z_Þ›óY}Š·u¸òrëbžøÐ<Oªq™VÁø÷Ž +}÷ôÑ÷Å–Û?o¦ï]x>°òB¨òƒ_ÑÅÂòÝÁ¡êϲ¢eüý…EÍPôkT¹{önË$*ó9ö
b¿¤I$´'R¼v”’䞺£:6n™i¿š5&‰Ök¢‘~å‚ÙuÝr›±Fœùwê $¼§-þ(Ä…>pMÿ´ >À…Qú¤ßŽØi¢l)NAå 2tšÞd'ªMÆÛÁ
—>µQyÃ#˜úÔ÷S?ÄÆdâ¨Ê*@«sHZ¿8nU›I½Ëtºö9’–Ðjø’€ÎŽdºÀCdŸ‚Ü sžÀÄHË•»—ýdõˆ_õnD5É©Q„«¥œd¤*ú|ÿ å½ +x,[‡ß6r£ÓðïÅîª_ì5’R‹@Bw½÷E¤–uŽ“Ô[·éŸÏÒÃ>ÂxifÐÂ`fÙŸöZMȪ5ë…S±èžt»bJBÅU=ZLLdrpK«;³²s¿û…: 0#·Áª ¡\Ý( x N“Mr³Mâ"zœXĺ…%³ƒÄ›2Øü—ce¬få…ªS:5Ép2乬J{¿GL`ÐŒB$ø3J~rPl„û¸R=8lNýúýwm„î‚•{»áÄ¢„Dè…óh(&
©"-¯£säÏr=V;éOÉ ^Ãæv4d›]$„è@0ÙOò,NƈéÞ =ÇWÅŠ)cdÐ&?m@%EÇéÝ|ƒ›‚+'ï …¸pjZ>&îB¿n¼eZcJd·GûÌŽ9'EñAÓŸXNùýÂçéÔŧCéCsx]Y¢ØLOw+T^¬‹Û}cE@³]~Oõ/8`·ØìïϨqËdØ3uµÑûOËY‹S
K¸…ät3X¼b)‘ +ZîSŽŒIs9ñÏÊ*|`//C†
Êù M;®D…Œg{kn•9Î6•È¤›Íq!¶àiç§Ý:HbW=Ü ÇftLØ+J.XÅ}a‹œ¶ÇfìöïX÷'àã°øÊê‹‚š›B6C..Ë^!»C±¹¢¢úvÖâ߆@’áå‡óû}Á…hRÙ^vè;ÉLþE§ž~x*u)Ó¾Œ$ç“Ú\‡»Ž€òÜYBÂyƒ1ë-ؼØHØp±¼´ÂõÕ!ñ$¥\£Eü0J÷•’ÀädÈdµöX[ñkLhù>o ¹°sMS3˜ +jošÉvR5}I[hÛ²‚ň'¦ÉÑ^6VŒ·8/ÏH Õeü”=Wi<ûq”ÐñnãO˜xãö2;¹¡¶í~îÐ[¾U¢éÌIŸîaŽû‘–Ö'¼ôUÀ»;[Sú*ˆ’‹ÊGæßGXÜq Dè4×&ª×O;U-Šñ64÷/ƒ°œ¬umÒæ–,Ô·ÀS% Ïð×yCÿû_j[òuﯜ…>Æå÷JÈP`$–dŽž¨Ì›•|J:„\HW`Ó©p€É÷ëj:s˜î…*…€ðTòzÞóTº|]/h(¬Ô¼…]ô˜ýÊ#Ï'±œÛã10 j\—€8HŒ%ËMÔr,ÔW)Ôx +&E-¨}D¤Œµ59VþÍ–õS¥ôIÙ¬^§z]sÓb‘@o–OžÑÅWØ^¢éʳÙE™ÜÍ-ÏVgÌŠÐÈ›çŠÅ‹»¨Ú˜fïb´’°¥"Ò #ÃÃè²6k8] ï¯Z˜nÌ;wíT]׶ óZΛ£½ÐäA‰²¬á ]QCøCfhoᣜ±û +ÖXg; +þ</so,7Óè8'_<Ð\ +ל»Ð¨šF³ ¸¶€a ™tŸŠT»oW¶,¯:¶e;2‹/ªÙýÜK /ЄŠyê‘Ž¸{PXòUÝŒ6f³á¤‰xî<ß·€±22ÒQæÇŽ»ÁÜGÒ;ûiÖRÒ*·Çƒ·‹Ü[¹û~݉vY +O.ôF-)YºÝ+µ]Ãë™4Ùuƒ„E¹,W€yÍ
â¶æëùò¸úQS
S½…‚Àd¹ÅŽ*À¼F^ò|ûŸÝ¹Ã"Çß‚_Ü<ÃeºX-’m\P󵟉¶P:4¶W™ ,”5 æ'4"Ö¨Ú¤Â*P,½a<?2ûLèiªm×µ·Ý\ãWîùGr{þM¸ÍÛImkšG&aLųàX/sØ1'™¼†÷%+lÝ: KMòO³ò)ŒvÚ‘¬EJÑÖÅÓ’ã[ ͽÜÊÎ$µ²ðXÌ—yeÙ”áÍ´$Ã-#ê¯(ëA*ªÐ€«wº±_,úˆÚÛÒ´ôÀ˜ü‰y +ÏŽv§qÁ`$ÚªÂ_ó,Á¨?/÷?åfI¬í[éŒ}rì0áª,½O˜{ˆ«-¯ÍŠ3ÃôÉšv$æ;ñPXrÀzÑ/ûœJ\V7ãC¤Wæ²9uð«¬cîÙ}=%üž
þÉðž¡"Ýå=£ÅËìÆ#®-iVóFtº~t«0aó÷š[‡ÈÔgq9orc2ãúB^3»Hª¬˜åmG
Ï1EO9 ¾o[Ø\sÓ°”m^§rHᙩÁïžM$8˜ô"Oa•HX·dNÅ‘·a
Sϲ5:(ˆÜ•`¾d'nHé·Ä"nî)ƒ÷PäúÍÅJ_OÅ>ÓpÖU]ÛÙ|Ý„sòÕÏS2ÙÀt¹îZÉòšÝ ±VE4!2%ð¿Û½½h"áÙdîõh¨³Š!,*²s[ÿÊÀússOdæ +ÌûŠï¼ŠðEÓŒ¬ìjØzît7ÉYðùÍï‘×®7¯ÛVp \=:Mˆ"ÂO^jãÛYê©%=1%í{C¥Büv¶>PdÜ#ZÚ¹–ÌÑædœžÕ£õéNïm\¶Õ†ë6»CB¯Ì]À¥ì¾Wïl)õ£HºPăà’Úwy¤üò€H¨ž,–8ØèFŠIy ^Íb€•©ED’Éå©Ô³ÖPV÷ËãÒNS«HC·¨(BmR
RÙ]VÓ¬þÄ¡§i2NgŽx@2L,<n)^NgÝäú9]
ïn´l†;äkJÍ|:è@FšÇ7óe2uÇ* Íx4mÒ
ƒ÷ó,÷Ãûr‰Xðˆ›‹I÷&NXœbM&ýjQ™ÿ.Là:•üÀ»a
O_5£¬@´¿òçõ^øÜñWx!äWŒB`Y0´–q9
ç•‚“÷:ƒ»-·WËvQî¹NêHå¹A¢Ó¹æ/ÂâaÑg{ºmX³Ôkw+Ä空:„ã²L¹ì盕#ìO…eŸ|:U„ró*ØŠ3€¬úò“¾RzKýaõýA€Tž{GסääoAÁä׃+bH!†Æ +H'dm°,¢_ÞÀ;YIÛªnŸÐ·3xA„} +;[àób‹=Œ@ä,òŠ#bÖìÛ ¡²‚µ·kÞ锻Öà±_4 „¼“ìÔጫrÿ >¹—p€ŠAÌâB'.%¥WcIí}Luz/_UÞ°hx²âAúÄ{¥‰«kq¦ÙÃOë馬;e~ؤª6Q8ÜÓ=Ê@·`”š-k‘'vn®î°\¾wõa%
ŠöÇmŽÃ³@½úëK£d'N²PèoŸÝù†¥»Ït4Ù^XxW'®m
¬@¹ Ip°ßí=¾À‘”Wï)=j
ÇÕã°~à`ÂTÎ!ÝÃLªƒ?ƒÎ]´Â~Ù´ƒ#xô®Ch/PUuuX#ðÙã0”9õÕ[rnÈ©TwnbU¢pº~¯ž³G‚ +ù +BÐ@=‹'ÅU@©® T,ŒÎH8ì ÖkXÆ×æ´ÆŒ‘ÐþtzšñkoÐö³Ž¬ðFf)é™îÀ„ZlÄ$ò°µö…i”;ÕŠW=f® +;ø·0rºä‚yÄðü}à¯ÒÚ’§=Š—ý2êÿØÞU,
zÏlS‰VÖ,¿RàG8÷èŸß5 +.6¹d +a¤“ë¥SÿÆ!´ëEN c +ÇÁæàwÖ°ÿÂìtHzHˆH +ÙEèÎ(ƒñçy Æ!ÙÈ¢¥.m¯x¿- œ¬øwÛÝNÅMæJ†óìX`œž¤¹`‚mºIî¡Òö©çœ×æ¼´úÞÕÉm@e{b(Ü:tW»zDlùx8á7¦…˜°SÂf¶,NðÁš¥NP™.ŸE{)îuÒ˜¸r÷⣺{,”[TùïÎb5©Nª‡#kžN,Ü^ÃÓ@iHsÿuéØ +/¦ZM_b”´XDR°«ñÓ1aDA¯È‹Z¤aÆKLÁ}ב³ŸÈ>æ¤çÜ9Z—¦MCþì«nü>`DüÚÇKç¤#@$šxf—£ »ÓÑ–h:l±À—ú€£àƒÿVÐ åmÀ¸n6Ãá¸ÞŠ'ÉͲµ*%îu†é"ô·/Ð>Ni $L‹ˆÖªŽ€¨ÇÚ÷êÒ|‰ð§„6ôÇÇjXVPØQ–,AðJ2\Åì ·K‰&yÞÚPÛ☣˜ˆ,1k¤Ú¤uµþÜØX”‰©ùú¸S@Çh‹ƒ’ú¾þ 'þ7ò†a›¤ŸÂ ª"¶¦Åa¦ +⫈!ò|¼¬r¾Ø¡j3TùZ»a`!ñ<&•±2½âKšTúRþ†ÊÛaÒ1òíVÏÒ†ÑÇm¥ßWÉ?¾§E¨ +pòÞ¼*ÛȃŒM +_Ý +>Ý8²œJ!
j¿Í+,Æ]К¾ºó.píàVŒ ›!Èf%v®¡j€÷ã6¨±âÿEK7“qfÂC +£öꌢ¢„t×J€Ü$Ǩ»æB~³™š5VÔö”ìf0òp±èduä ÷dÛ7ºåÀ©CD¡æ©.ɽ›åŠm‹M‘ãƶS4¿ÍÁ.ñì(5*ÑJî!.-"]½&"ÁÈ.ïÍTdõ£"M×xtR¡²Ï·„X&@‹¬!ÓMnð³Í aó÷‡uárR›š~´p5È8šî ”=µèO £µ×ÿ‘#3m᥌aÔQÙ…&¯¡öý>þ†ûf_y·~ùô(ëç·ñg;§°›¯ÀÜ +¼Æ»7)L¢5÷òøŽ’ºlߪæ}-²@1ÃP%æJlRjU +W]²¼Ö°¿#Ú8¬.®ˆ3eZ¬vÄÇÊвh$ögœþµÜsº‘ë¤ù[õ²aí"#ð—_\ÕR€Icyñt&Æ3 š®XÿãíCaå]´n£Ž +øÕ¯òš{*9p“G¶ÿµŠb¡sÞþ`„O?’ÂPŸíR¢ýxŽ‚/@0š¡¤O–km4ÊQzí0£¸©iV*ÈS¬_˜h=hýj‰ñÒ4È 9Û%¬z]y>^ñxð©ù|ŠVAÉQbà$Hqç*o´-1»INý–+Îè`‘â
Ò«ÝÆ/Z~ã¦Nw ¢,Š’Ë»°0¯ÜˆÙ›¸‚Sœx)dîߟH›tg—ÄÔ,Ó·`ŒÊw˜nÑ[àŸg +h³õªªØ0dn3h\/-eñöÚŒÇ\°7TÅenv”6Û† »Iƒk®,Jð¹yzU'ºõ¾U‰âýÃÛœâý9iŒ¥˜-<P´›qS`͆y‡3Ýþ3Nt†~u‹ÌSêsxg¸o[ølËc„¼ªž÷DúDœVt:ùÓêXÒ¿|íå™ó53ô¦?ÚÚ¨óbg¥ßØi¢å: ÇQ}줗såÈÐK¡‰ñY“™ŒÇ¹f¶ÝGïË#LûžhëQ®ŒÅëTÖs¥×¡cŽ¥X}€ºAPŵãŽé¼‹äËr(W·)¡-lçˆ-\*J~<[ ”dë…ëÀGÊéèG–šÞ{T.ý÷Ih§÷]®ŽÖí–à›Í-è<×ï!,·¨F`í@/r-ýlÔðP(Eûu +û#5uåþÛ›Á5{¯úRwF´=ÅÍf{ZSßEÆ×#C Ç ¥SP¨Iy·s%r ÁÎySSž>ÂìV81a)¢Ï¡<Á†¯§™ À•k‚ÎØP.F +endstream +endobj +563 0 obj << /Type /Font /Subtype /Type1 -/Encoding 1161 0 R -/BaseFont /Helvetica-Bold +/Encoding 1958 0 R +/FirstChar 28 +/LastChar 121 +/Widths 1963 0 R +/BaseFont /DJYRXY+SFSX1000 +/FontDescriptor 561 0 R >> endobj -484 0 obj << +561 0 obj << +/Ascent 721 +/CapHeight 694 +/Descent -194 +/FontName /DJYRXY+SFSX1000 +/ItalicAngle 0 +/StemV 50 +/XHeight 458 +/FontBBox [-235 -336 1930 930] +/Flags 4 +/CharSet (/fi/a/b/c/d/e/f/g/i/l/m/n/o/p/r/s/t/u/v/w/x/y) +/FontFile 562 0 R +>> endobj +1963 0 obj +[586 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 525 561 489 561 511 336 550 0 255 0 0 255 866 561 550 561 0 372 422 404 561 500 744 500 500 ] +endobj +537 0 obj << +/Length1 1647 +/Length2 13357 +/Length3 532 +/Length 14219 +/Filter /FlateDecode +>> +stream +xÚíxep›Û²¥™cˆ™ef昙™efËìÄ3ÅÌÌÌCÌÌÌ13S<>ç¾ûîÔ™?óÞ¯©Q•TßÞ«{u÷^½»$Q(©2›9˜ +Vv&®.*v +<r*@Wi±-àã@ uƒ¬ìÅŒAÀ/ +`e°ððð P +’ +Â{yüŒ¥õôy\€Š‘ÝÓ"ÄÖ²JNö"|úÊ1ÖRÎœG&3ßòåe×·Ûã$¹».çÎ¥ry±«3AHã"ÿX|¡&¥›Ï¥×‹œÅ&êÂ÷‹ƒ®[fH÷E&)U$v¹*ðŸ|ê³áÏn;#
ÂÇ6¯âõ?‰ÒÕÍHDa""FÙÂiÔq»(®Š3ìõýi´P]6å^{È?6ú¡µ²»ò¸Â‡ø1¨©ôù!’2åœWŸã.&½sé]VáôݽVm‡ŸjéãeúÝâ8^Uô‡±à¤xŸÈg±ëQ
+gÿ6Rm€æZ"ÝU¼ÚúE;Ct›òYû0U(onQ‚[«LÕß5/óv}£>ÏãÑ/ +¸Šœ[kò4è&•½ÁN|+Ññ>Óvi4-³ÆÆ"í)ÍIÚÈ7j:ÏvÁ\æpcIëweü7ÓéÖvV[Åæp‘8É@ŠCH¬µ…@˜µ& ?\‘¨î/_ttÜžš›ø^3aÞ{]» µ´ÛîåˆÚR,£º*ÍÖe³ûªôiþaA±5èΘ‡í.½D™‘>Úøµr
×ÚÁ0ÚOβFö™%—X‰,PäÞæÅmÐ2‹¦v‰èÜ¿¸R5¨áq·ïǪ,Ø;Ê=ÒÈQ6r¸RŠîô#&J§Õ¼<Áš>Ïј#(|bÝ®´’зçE”Ñdd»½œ™É¼¬½|£Ù<‡Ô?²|SPzRø³Â,q¥ô‰¹ýÎZ:/–rä×I²0Bgwëòbäȼyœ¤¦¯ÅýÛ ¡%|~å)7˜ÿåë·?møÏXÖp?È +3übWsX¶´òÕÀe.‰wbïhŒyÓŒ~ª2ò§¶t¢RBãê7LT+ë?®¨ ‚«Få Ž2Úcj{=‹®ÚÜ#ŸVášX%ÁdCWϪÛ4~EÒõjíð„÷9õ·s¬.Šö›ù‚¤²©ï"ÄÎH$ö$|jó„uR¨&ïßè5Ÿ“1÷¶XFæÎzjØàûà™¸ZfßžÊ9Nt‘Oó¶.‡Æ¿±Êy@ÒÅýì¦ñ¢\Ê;Y8^ +ëyºCî(™Éà¿+RÚ9’)²‚dî}ªÔˆáŠIOòŒÖ5òâlzËÑÂu2+šñÙ7O+ì^@ß4Óð + +%P«Ê`—@€¡]¸Ãä?yÖþ{'ò,ˆÓ×èOùœÒ/ádîWzÉbŽMbPGI£;¢Ð7ÙÓFMcj¦9Èto¨óËÕ5ׇŸ‹¿Mr¯+Ñ-Ñ·Á$S‰ö{-1^nëÿ™äî Œ±5Žì¦ZíGt_,'( +åjöR`T/±¡Âq·úúÜé\îòa«Ø>jÃЯƒâŠ?rð‚Šk&Ú5 +:ÉQPé«Ó®âf&÷/7î· +8r~Äß—[ÔÖKï”öþbÒ„d^ʽ֯ÞW¾ÌúllÂÿ.Ä’´9ôÉ߆ny’°•s¿FÊŽHm¬‰Ž®Ð¹¥Nã²â.HI—\•ŒgM9Õ¬µø +üÏðs¦#ƒBöšs&Ž|7‡ +Þ,… UL!U:‚’êº<Q#¼àRY.äH¡´¿Ï›f`ª&?†¦;ôÅÅu¤¨Ñ²yáåvyݹ‡-õ¸hØ»›±ÉÄ\ØR;½j§%SæÆ™8²ÿnòTù”NFývîqùϾCX}A¡·Òj—5%Ù‡·k¹Š4)VªPdÂâ=]±$—25ä;Ò…`Œ‹àbGwxlÒ'CÛc hhÁ°ÄÕ¨ +JÁÌÇ“lGÈ¡Óñoo`äŒÅ…î8V/ØñÇ7[ë/¡xu¸Ç…–¶Véa}FYú O‘YýX1èÄݨrÞ§.ÛñÚK–œ©¾„_Rä_yO4U +«:sÛPqÉ@¯*Ö‹.cŠûa¦Ì^pƒpÓÚw0&ŠxW9ô2O›ë:+GÖܤì森B£r/ T}Eô‰ÄÆLI%˜Ý_ƒ£²ÛjÎ0`*>K'Æè<-Lå=œOIÖÛ‘>Ê)Alú>èúöÖ¢¡æÀ!@çÉÀ2s‚‚ÉNgÊtÀ!i×yV_WúJb?å]£a&Ù×éLˆ™/ÓH÷‡|»U¤–
éåìm—ˆX[XÈäCÍY‹~ÅZµÇv½ÝIË(Ï +ÀǸÒ5Àøm®bÄ2ÙÍ ÆòC|t»
Ïi’`16`¶Ž£AÉN¹©¥©´“œ¦çeœ'OÌtv«zè>ã¯Î¸Xï+R‰Ç{ÜJûV¾šêy?t‘‚ÌpÍt:O'8’±èÞ&™SW¬˜a͆¡øH„"2,·‰²_€a†[ÆÚè`üÆÆ®º`éëtetåäù·8Ó¯`ð.îÑþCD46?Só-hñThˆÉL.¥–$©BúždO”Há!µšaóüNTÈØÕÓ'‰UÉø챩ïß¼¢ûºàæΛßëŒì!›˜$Rg%fžiœëY¾_Á#^4ÙyÑŸ†O`hhk“¬AIÌ[³ÈÚ½½ {²Zò™ÃÝç”C6'Ň›BGC&¿õhxfEú¦óˆ˜dsÁ„+"ÍåÎÄ$©uÒ|êËFeà3óòÉŠÌ]él(ð´6U‰øílìVÉãŒ^‰b\’Ø”žVÓú]rw\úI$ª‘ÞâVˇ¼KýTÃwy1aèÇجªK©‡–ÇÏ®;´&Iæë{à×ÂÓ…UåSÈ_LFf»¨âFÅò)¢œÊV¾¢R5¤Aç23þðŒC˜4ƒ\5áK¹ù32H¬sc|D-Ržrµ® +XéÏU1"-½
·_…[@/,,Ô’9|Ká•\MKa,N눃A„³ Ðù~NÑ÷¯v0æÁ!Ú’´
bdÉH¼¿Y{ÁV|Øß/@4U1¢Œ…iÃCº¯(Sgj‡ÌW¾æη/äU÷ZÕ}lEûsôåô3åp2;ŠtƒuÓ6¨äÖ†š˜¹0·ž —CËtûOçp2hËó˜çmNqòm‚å‘f(R4µmfìo«Úé`" +‘õO´%Ù-𡈩˙ž…D²ý©dîìun‹›š±÷ÊBŽ1qsg½æÓ!"+-2]ÍÉΫ¹ÌoO¯?¸bªVà~Ä¢~ guië·ãÁ&Š\À·tI“¹V2eÌ‚Wü1ÉwÅ‚u¸þ©g¶ñ…AŸ"3ð.¹ÀœŽt.7* s!£‘ÈâR´UnË×’?&2ð7 Èb-ˆ´G³Áf1Â!%M.:ÞªRºÔj/§_"o
¥XY¹]}çÊ.j¿Àß¡W:ÏVçË°Yš«ØµÎï7íÈë8`Ê~⼞ü'Æ×JŒ"ô1ô\, CÎzóȳ÷`¢T² +1tø¼‹v0»Rß60~0\O3L˺°¼½Ó1ÊGíöƒOâÞªäp‘§.Zuh½g_ °.¢¨~7º`‰/º[Xv‹ƒÊ3´ÐcìºjKé¥kxF‹ÐÑj›°ŸÐú…:
7ÊLi£$KrøÕ\:IÚ™“ú5:‚]k©úö(í#' z¤ø™,Ž ‡$•ã¤Àäz¶ò¸¼G`ØÉ:‚”6&jûØëùΫŸ$#F0g1Þ‘Tœ>Kæé¿Lµ™0ݯÁ¹ÖCeå.|c$CJMÂ|å|߬1k3pÀÊë— +½‰I̳ST+Øà2
ðn>?LA]ŽzSTíÀÆVŠ¸R;L@bJÇ°è2âÒ±OÎìO “üž‰ú‰+ÈÃ@s‰×$ÛðíZ+ú÷/"Žù° õTäIɸVŠ<5`±çÏ£r¾MWá3|W˜,r)ËFCê ^bFµ¹®ìÂK¶%ÊÞÔh¼}k©UÔü+¤Æ”ÈËø®Ã¯ý ÂÜa[tÈW² ùî몱Eke5åþzQîGYµ<îcòØN;0ç‘Ý1&ƒ#_Ç[ÛW¥HŠ :ŸLS2{Â蟺ža²‡™™üi/ܧ£î©Ë4’S¡²xÕ“…tE~Y¸Õ’;â–Ñ;ÇH<ë¦òÄ×T€ë÷Ælçù³ÊMPµB@‡Ô½«„û£¶DíYë_ïyìªÂ]H¢qy‡?IU/×#•ûÖòÛw,ª˜[`íT6Œ>cR0-üà'‘ygA+¾š@&ã¯íý±g“tž©ëÛ×92—îU»N§fxÛÅx‘¾ +Öƒ‹øV÷8¡,‰ã}2“Q€Õšt|%ú¶™HÖsùäé´¸x¬ ?µŸ˜é™“Ùæ¼lÆ#ÇÄPo6-}‡ EïÁÜ9E¬øH?&¾±›w‹w@¿ïÈhà ÎaFó¥ +W±Äˆ3KÀ{Ùi÷1Eœ.;‚†*ÚoöEÀŽxui³x¤Çp¤f*ºÓ8»î ‘ƒ”‡6g)ëž<Ê´Ji©¼8ÀUÐæÃGŽÈΰ?à"ÎÔ²GéøfÌ—&•ê—Uå=‘æÕ8v=ÐV'[2h^‹•ŒÒb®“ÙÀšÇÙŽ›þÃW©$–xXáp}c½ÓþÅÎÏ‘Í/bŸ4öGÞ˜"V%ø1…&žÝ¹m4Ô©êÒ|¾*”ÿ¹NÔÈ[Emèüé JQòV'º*yÊ~÷/Ï‚ISO¥%Q]Oò¬Â25â&›òÊVî'‚[ˆ§=˜ÛOÜX¼ŸïÅ)ÞtK§ÃÚ£Ocj„5‚VÇÉ‘Ðà¼"›[m*.Àþ¦1!›ÑPóªq›-ëaú9ŽV+yxñGl'kc¶cDôŽ}t—’¾ÈäypÇ/‹§vOúG.x¡d¯>ØÎu¨f‡Ë
Ô˜¶±g9’se;™¼¨˜6Ú¶SñŒ5I&̈;Ù.6§ti nçô¸Ê¬0
£‚„ÅG0ïËà-¶EO®AQïÖ
ýÕ9=‹â +ƒo<øôº¡aV׌äë‰UÞS6$$TJG¿v(êØ@«Hæß•€€¢¬†kœöé4“~ÑÆ2Â_S†¿Jd.Þ³Løa¥•Q.W¹;Œle]C·‡Á›ÙA5Í«Gùa²N`Ž,|+KÒíù¿‡˜=]Š„³ûO:ž¤Ë¶ËoÆ:]lo7b)•àkeÝX%üfëTG‚ÍöUçôÐpP{î‹ÛŸw†ÚíҎǬ|7NR[ÁÙò‹ÊFˆÎ‘íïȉmA +ü ùƒÎ¬WÜG‡¶½?±®¤[?ï<¨öð˵x÷ËD[qzZ˵Cnúá +6#Í›¶çË—%£p‚
*вJýŽ$1V©¤sP1T^{$=í±Fæ§î¦™ñ“„ÅПÐZ[ã`/Âg6+eî»Sæ-^7¡k1ÓœÜ+Û/Ï·´NuO‘OáúíX‡"äŒ?å^25žoZ(Ewƒ2~‹Gð–‡Ê6Áp2 HKÍé^0+ê…„Ø6¹,»Ï.7_¦æ$ì»6dK¼:†œV¯ƒGN¡Á ¼Ÿ±õlÓ¤l¿ßËáGîøýjÈÚ!nCÛóFåÒc} +ì&ââž}©O%[¨hÏçGÅ]µNwYÄëIF²m +Æ}íB +›dá›Ö^íªl$„0ÄLšív +‡VˆìKÈ¥‹!¼<†uG7ʘª$°¶Mâ¡Q¹YD4€
.ûZm¥Üy5&qÑ€ÛIÃxÍ,>3n¶Õ +õø(ˆ*·ûy0Òˆ¦ã(w%U¿¦±küŽ„Ýçß”0éÕNkx!¨àgqmâÂQ<ÏÇûc ÑLd89é©áƒp>¾÷5Å;r…§S–V£ç +§[fˆLVļšñ`•S;ÿ)³i= kUå
kh6$d€ªáÙYô.÷›Þ +,\˜ÃQ$Ü+_,½ª–(Î~CT´'ž‹
öÌg¹ÎÆBÂOK:0(7j*'w0—ó±>Ù½v.dµ”˜îK‘e^¯ë´ØÍ¥"µ¥H÷y Ó5—ÚDóò^‘ËŸÙÈíFºžŠcªagƒHMIe²×QËr©è;Î÷2ä¹~UôhcêJX\¶¬8Dd1À]:ìªzJ5ؽB:W]/Æz`"i'©òwnr-˜´{Ž_þ8Æ¿órw+E ²ÿ°,ve§;)Ыµ8‚ŠYý¿H¸ñðð,f¤ÈÀaØΈ6ê~YJöÒõå"³½ã÷fsݽ¬:ø¨—{‡Tòü\CÞ +]cšk[øtZž×º1J;3àM(„8Y“r:º +®y@GÄ5£¶»n¡:&ü7è
°ËM°|$B$¯“ +‘qæ'¨@¶[Âœ Ê®©‹\+žÐ¡J¤fÁè¬2m1ß;4í¤„²ÕÿGÓB‘*ܺN]ñ¶î«pÇûvá +~®]p&e§£{O2> ³S¾µop”2ºÕ¿TbËr<OË +) ŸKH¢kÎ㽂â¸álÃoaAšÚ–ƒ†k-”õŸ|Ï%‡¡–]™`^+É>%Š¦“ æHÉ5(£§išËZz‹d¹VÊá#ê*UŽÓL¬þBë¾æžV]†6\˵ fgð:qlàòZ+²s>ªün¶=-÷…–žL}pß2 +¹£â]š|g£åát•²¬èï[ÿrHiÙÇuê©X2!Ü™rú2جê'ÒQŸuCÌ"ÑhÊ.)Äoå²Óè"Ì@„™*eÏä÷o /öo®2k
õ‰ßðÃ=õ˜›7¤þ“j¾CírܬIì=ƨ(Ò¯D¨T^\îñÄÏÖ0Ö؆1sÔuµ;Ò0Ð_Tì_)^†U$;%DXÛæ£vôºnjoºAÜ–3ªñ_¬qâ€ÉQP6*tgÇ!„mô;p¢¶[a$ú*¼b²™Š%¼Lóædð騡ÎÝO¹˜VÿßüYòÉ–qÈbËÄ„ã×ëé§ncŠj uŠ{ÅLQ‚5VëNé2BÌ4™þ~À^dç<ÐB¶óÛ–óÝzɆ’Á<s$Qµf«Ø#ƒçp:ßÅÉD™ <u÷~ÅJž!Ë‘å|K÷M®pr®¿xåÅ&ë"ºEï*Ù'MÇx4:võŸ‹uq2—ò!õ7n·2 &…+˜vEŸ÷…C+‡¢50ø,žÐ²ßÙˆ¸;J,E7òåXHL[pQݘK¦¯x#)…ã!Úk"€œ'ŸD"¶|èÓŠÌ°TOÌê#À…a¼ÊÕ(Tì0…ÐOO"‰®.Öû¦t€êåv)Š§Ì¿µëwzÀ±h©xÑ! —¬Ì´E¿ù—/’C^ +!AêQúU…Fžª }Ù;Ù3¡)„»BtH?uœ<ylqdÀh´ç)JßGÊ «IôÈMËØ-!½@E5qÊM1î¾Ú{ ‹×,c ]œ´ºÁóE
%'`oVUÝzüs®ße‚â +Ôͦ3ç7¨òp|ƒœ¦ïÆäƒáNdÍÍ‘©À&(×|¢0ØÞðƒ, {ƒ••ö‘—}Ę2ÿºó¨ã˜¼§±
¶1
¯a'×w.A½t¶‡Ðu|7Ü×à…;ѧVWÓÙBØ]&I¶•XÈpÑÖtë«j·f*‘˜G#_nYT–¼ðç^Æ) Š%ùo;<Z•NS—ó€Y}¸?¹Å`[“'Èçʆ#øÑ…Žv\ùƒÌÉ¢¡–xj>IakÁ¹3`9Šv¨ÂÇóí}”ÁÕÑ?D›+u™{>[Jx Œ¥tˆ1šÈ•§„OaYQM¶’U¸eÞŠ*¯Û<[šÑAîå˶zÇ߸Hí]tVáð\77÷Æ"t¦¼ãü¦eå•ñSZ LjÄX¹E01‰“îSS¢dqg]¶þÀw[D7s©Ü<Íwj®cCo~uô2j©ñ<+V!©¤Bôb£ú“f=YUrAí_ø£h}uNv.}™ý=‹ÙF2®ŠOz8‹¢E-ä½ +¡a#ö¸ëTf"K‡én›û¬FņX¦´Êk ØÎñsNl¥×/Üwn¤c,ô —ìÛ#Í#<ûçðÕ +²ãôFøâë³±êùc[{
¬øiÃïò;$±œGØtwK
®u?²]n§ù˜²Da.òx£e©˜uæ:ä·åBçñü3Œ™€–N¹Kh•sXäJ•U8X²hÚNw£&4êónrÊIyh@ů.i¿í¯ì<S–Èq—Ó(lßOÕÛÊžU5.à^û +Cuû9•
±lm—ÅSÇ“’L^Žã<ØÛ¨¸ÛÑàð4í(æm\¤¸ÌÚÿ1kh9~qˆùãö^, m¤8kS_ĵÂW;D“bÈDÓ–]O6v!ß^Ý ßÜüÙÇ(yÁ sÀ:êwî˜[pïë$³öÄm£›ruUZöiÛŠHšž÷÷Íc²#¥ç;ì`²šös—$‰òíümäõø–Ñi9`p4†Â*Ù€aÐnvA»Ã? +gûûÙ‘öc:AžéçìKÿ”ŒÂ,ÂJÜ5†ï|.¼N²t›|¦.Ès9 +ÃFÈÂ2°ÖÞÝd
Žî:ŒqÊð¿ôÚþ46F·tŒ°¯¾â]]\ôúmصÓÅßÝ$Ý{‡ÛiáÐ>q¬˜èÕ˜
-gŸpâÌ#ž*3ñ$¢¤•#øXCÄØݵ©Oúåì-p$r¿
Ìx›¢9¤¸2âÜ̆a ~Ä'¥;¨9¢¹¡ìGž‘4qç–cÚ.çÁàê½dJ»PŸ&\þäã¶GvçAgj¾NçóLö½HHùÃÚ&¦Y†z;¦¤JWyý.¢ÀÎy´?ûäÍÜ
ÔpO@œ +Å %:L +÷²”³Ë–&0>[î%á9ê4FÙÇtº/XfÝrÍÓ_ºU¬õŠ +•¾éšN5¾ÌÛBgÊX·X}÷\"ÊÛ+7̘?ÅÄ~>Ö2à"‘.ceÅL"*±Ë¿pÚPÏx7“ÿCËîÙR‰Þ»Ç^.P}¢»'“ãy¶Sî˜x¯œÜ&œ +«”{2ÞYŽ1¼·ãZ x3L D+ºqî~ûÉfY™ô ,é}”ßß¾°Ÿ¦Àû!MJa·]]rWd²‡8ðQ8+ÿ[;ç—±ù‹6ÖÒžð2máf“ÁJ/Ú qI€ù¹NîT8øîÈ2Üö¼í¨#`¹|`[ä6âŠõJÉ€‰×ÇL¸dÑa,*‚‘²Jÿš´[²é£U[E1ìâÌÊûyr\u™õˆvÊ:2£òPt·Ð¿ fÎÂÅ8)%Z§š +¤¦P~Ót;{û¾âò¢Wî„#NˆmYÖu +9dyñ¹ÆáV' +fD„¯Î¿ùEÑÀå’™ØQ(n9íëø¶‡ê…hE¯ÑNIªýøÚ2ùÊ©Í’On^ôcZª(l™ƒ»ÑOf3ôÃJí5ßÑ€8.@r$¼wñ’r¥6‰ÛÉZO)xˆ%ä]ÊKr³sî>±o9áÍå$§ß–¦ï\†ÉôÒ¢5KAË€°\ŠS›pVbƒCˆMØÓ¬ö6m ¢ú.ÿ8ÂY½Ð=90QŸUä§ö´S]Ç´,œd‹cD%ÕKBie1Òw&`ûËÿ÷@ÄR燪PãªÄ÷ÁøŠºï³ƒØKù‚Ã^Ξ{ $LJQñÓ´ÜU™TÙªï +À.ƒ[ß–Db|òÖŽhÅÔ‡ +iFb$Ä›%Q×ÞÆBÛ¼²äÆAÉ}-|EÂ] wcY¢o«™\åíu5\b™às#IùÖsê8G¬Ú·÷C.Ü•Á•/¢ä6r·+Ž8Ówú'tø¸_dGWÐ.Ÿx´zŒ6*ùø¬ -±“»D%xåL«V7. +Ò,ŒÎ'Ræm' øä‹`«Õ·0\š‹)¤m-i±U`œ1Mo¶i±„ÔùÍ}æ_ôïääWœ=™ôïDƒQT~F^p-*º•óÔ,WP2€#˜»(RäŠ_54t1ûr]7×ÕsÚª‰Lˆzø'ûŒÐ²q-uÛã©´_!9—C¯«E‚5&)âÕ×®ó±sÞ½€ê7Æ"-èapí£áÿ¸x1‰…ÏOœÆÎë¾…ü!¼íìðMèÚʲËFCˆ›Ö,Á·ûE¸AtCh2Mucúé–bNÙÔÄ_™¢¼ê+P-„¾ËÉ|œÖ¤ô&åÇl%¤cå¸u¢jÄ®/'÷Äøç©ÜŒ§½ŒŸ,¡î´¯óp¥{àì*ÐYÆx!pAlïrX¿{›ÀÚ#—à<¡¨SÛeË#lfÂÔ¿z^¿`P?ÓS è3š"?ÕÏÝUFVnR€ïazbSxù;à'ê>)®ýʈ HBÖèí÷¨íSã7í?š%ç!–²”®[‘›\]¥28='¯K}ÀN–h•ý†¯ÁÝë +m6¿ak´³`Ô[ÄJ6…$ŒëæÞ’‡¸0‹bñ†‡yE_õÌÓ³gz!@û¾™Œ€d¸ÚÒ³w.æ"|:ŠT…Äy¾Î·ðwmŸ€o¤eÞfbTV=Èl‡ëµjpÉKS¼Èà—ïÚ€N¢OÛøâŽ7ëËzd†·z+ö0ªjÖ¶VgªÇ4jŸçŽË˜<¢¼öÅ V¤–‘ÊrZća—÷ÅøJ딋Œ“=09ò*ÐqÑœb€_£0¸š¶ƒû1JûÌZõqµGshíy?±ð)¢þA¹7Ðÿ•žf|þ°N9ÕJÁäó~'1z24ľçfõÓÅñ+€Œ<㉡†BéÅžwY×Þýë8¼þ8&W• A,«Fï|˜—}N0ìz²D¹…ã7lU"á¨(|ª€˜°”@_eV˜¥¯Bi…´î[Ÿ\ì'Þ)í¶öûôG&ßëï%¾:<!Ȉ`·œ?s¨˜I¨)¹^˜J~ +G¸Fb)øÖ è™½¦ÅR™ø‡{}'pë.åØ’|¼K’A“ƒøm)쬊ïw+–q‡ætïVQ¥k¤_(fwÚ¯ƒ@67ª˜±J’{¢ÎDÍJ¤$D~ì0ÖGÜ›/eV“Ò«Í;òPrRÃt»¯=uÖÙ÷9ÖÁLïñ&«p2Jù’<7Šà†<öðâ +‹ÝðŠnUG¹‘Ó¾R'ПOÐ}ù,A$—[R¬is†Dº“l6t‘µ»ñLÒÝ3fÈI\¡ƒ‡ÃVðC&CŒ³á;ὺáSbg™§dàÅ„ˆæ˜2 Là÷B·—?oÿÍ]OT.9¾^I£î5 +‹À¯p’šD¼nBS×ã,M·Ó©hjõÒm…Y±ÑŸev„ô䦆—…½¶».ÇüÅ/~!]';ãeü¢¦w$z}·Ô¨UE¥TÖ¼ÒöMc/P‹O5ûrM´æ}¨ QFÈìSÛÌÀÍZ%ø¼ºL@¸hÃñ°Á,wr?“ÁX¼&BoòRÛG¨å8÷]yÛGǘ¬bzÖ€þÅ|•^Ä3تGÏ4wð®_þºI¥Y0‚ò}`YÙsë,¾üòæÜ£6®Äü¤V9ªd* ìA¹\tVä]3¼/º~ëÈ€ÁØw¾¾Ÿ;©±°Ø¡1½ÌP%mM¶âhæCR§0éB££$’vž@OÃLõtŠOÄîi¶| ÞËv
|R¾¯µ +yQÄ£|^rU°vBÖ_Ô†¤1¯qù +§eCS™¦B=(,<
ÓIµöã×".ý‹¤ƒ+¨ãNQiÝ 9>øSº–!I1·ú3q¥Ô°½H„µœ³“B7†E,$½Ð¼C›ëóá=Ó qôÂ&”KQø”®ÐŽc]W{í0Ư'ÂæðA3ëû®Š_¾pZ9)—[¦>>
ý ¯ñ\–*ÿ%$ÖušH=(Œs˜‘|.ÙC¼©µÝɨ§Qfw1ª<CSß¡ó6-(E¹í‰C7Æyj7Q¯§+H³å9CR×mN¯3†âÅæµ[èÜ&;uËŸ@ÞP›Á£”DÑÀb˜ÌkÒT—µñæµ;‘4ãz5i§;NJxHÌMô{M5ë §Ô‡p¢Ýo\Æ:£˜»RÀ<2kºr+NgƒûÛ#ES=ÿÕ¶˜œÈq›ya¶xVnl<úf°>µý™3õë§×; +æÿâáÿü?A`j4v9Ø;Û ü&k~ +endstream +endobj +538 0 obj << /Type /Font /Subtype /Type1 -/Encoding 1161 0 R -/BaseFont /Times-Italic +/Encoding 1952 0 R +/FirstChar 2 +/LastChar 122 +/Widths 1964 0 R +/BaseFont /PEEUGU+NimbusRomNo9L-ReguItal +/FontDescriptor 536 0 R >> endobj -385 0 obj << -/Length1 1640 -/Length2 16564 +536 0 obj << +/Ascent 668 +/CapHeight 668 +/Descent -193 +/FontName /PEEUGU+NimbusRomNo9L-ReguItal +/ItalicAngle -15.5 +/StemV 78 +/XHeight 441 +/FontBBox [-169 -270 1010 924] +/Flags 4 +/CharSet (/fi/quoteright/hyphen/one/two/colon/A/B/C/E/F/G/L/M/N/O/P/R/S/T/U/X/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) +/FontFile 537 0 R +>> endobj +1964 0 obj +[500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 0 333 0 0 0 500 500 0 0 0 0 0 0 0 333 0 0 0 0 0 0 611 611 667 0 611 611 722 0 0 0 0 556 833 667 722 611 0 611 500 556 722 0 0 611 0 0 0 0 0 0 0 0 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389 ] +endobj +428 0 obj << +/Length1 2433 +/Length2 11403 /Length3 532 -/Length 17486 +/Length 12610 /Filter /FlateDecode >> stream -xÚ¬¹cxåO·&œŽ“ŽÙéhǶձm;;¶mÛIǶíŽ:¶mÛÆäÿ<sæÌuÞy¿ÌœoU÷½ªvý®MB §HÃodc -4
ŒŒ -ÈßpØ×m—øª]:9$Ä?‰Ã¤^äLrW¬Û¤Þ!~·ñr'HÛ‹µìU¨a\ÍLDpó'LpLg®:‘;`r7âŒôÞLYL¦CÕá
܃^‘÷:„zÔXUQ¾ô dÏNÊw×¹4Cî‘ÐÓ†9U ¶Ø:¸k- -HšßJ2Cc’úæT
xÚ»§-ªO¥Œ²µíkÒÈÑž4…£7²æë7\õK
4^iÈŒŠžÊ»µ{_D8÷bÇ•ºB?0D¨i~¯L½£k(Vîh–šUzLê*lEl5ÅžÌ&öæH€%Ž%BÀ0˜Í Ñü<é;LsÝ°FI-?ös?vêÇ „šÍú^ÐQb–å[ò[©ü¥k'-»mzTcªŽæ,M&ˆª.´{YF˜Èåöã‰ÁˆÔ nA„Õª·f¡ÙÉyš%ô±ÿañª9bñ<€ -f:£Xo7(]ù嫤 ®iÀÝ|í”$ßüÙX{´ÆóÓ°Jô‡‡«·>²Ø’ÛeÃƨjºlÝU΢µÌ+NPJ=2³X¤!}5ü;<aÆ"w²mNÞ€^ò(ñ{ ? -bHwX¬aD 6&þ,0Å-<ÙM°ÕaЬžc+OÛõw\é•°ŽÔMÁ´#l0Y!‹‘mç Ž(Œf;³¯ã„>FÅ¥!èì,–DÊI»ÓÝz(I[lc]É;|׉¤'ëšza”Г 1J¡ÐðÕQº›TnÞ„XárÐ_àÞå‚@RÁÇ:hùßnçDdØæ7äô¿µT‡¥ -TŵÖêFûWŠ<Ä‹Á6„û¿£©T\®hÜJ:kšË¼ÀEeœ‰1æ$þ¶uØ“ay¶ -|š›Zy5ŠÿX†!?Æ#õA° Òñ
Õ~Ç7O Ïöd×n×eÎÏ‘àosU“éÓrPO"ަǮNqR”«<ëùºðË€‘ÜÌ“G’»å+åñ©‚r'Cs¤Ö[Ò•6üjÚAôˆ¶‚Š¡ÆŸ=Üß ¨Ý"»GZø?-¾ =Œ²L¬TèFÂ1ó´Œr ”7Ûé8)î«<ûÑñàÛ†žFµžXÚZ23¥x3ýí=1µðmíDá -Õô*³ÜhÁ½Gaý.ýk1èÌYD×?ÒäÇ÷%ÁÝ^ÊÑ$(tWìfú´d4«ŠÓe]0ãYz?®-Ä“î€)æV(ÑQölÏéŸ`‰s[÷WOóôŠ$u‚ ×y?Õ õ¦Ã„ïnÉ~‚ -«ýr‹MñêãèŒPdºªØöN—C±õ6“I7cÈ ±O®©”Œ‚QÒ|¬OK/ºÒãëR»Ïç˱`b§ -¢JÇ8ªWAr´÷˜ÊY€Èë),yf ¤ñõk1kñuù=] »5Ÿøü>{‡0¾:CXvÓƒÍèâ§^e-ÝÁñ¶R÷Ô»)at Üå9í©‚!þ,èGƒšÆh‘¼¨²¦“–ý®(5³ -Ó]òhcæê|/™÷´<Ö*·7%o‹K]bxÀŒ"¢l%ááŸÙÂMq/Ÿ2Ðoø;Ò{ÆUárãzÊP z–§Ä…~ä‘Åí!”Bry.6¥‘/Î.4 -Ά^8±Q½äÂÐt
Â`éåƒSþ>³,CCåS¹Ì„%r1ur¹2Ä‘ÖÇžê¢uvC%Y ßYCÌ/9¯á ¿/^,„·‘›ƒH›Ù«|l¾~ê}Éüð"A_±®zña%÷büõtm¸Æ"66¡¸0^[°·¡Ç°Úk)wŠ@ÓÞ§Iø’ - -áGSyÓ_K9\¯lŹi¬ºrXyäO)\s …Žýêg³SÏŽ‘/ÃÛ4Š#Ù¯=K<®[ŽàMr™b¨®´+Œ6s\»4vT,C8úbþ[7AVõÜ—XPõ•îbªÂ¶n!¤áÛtì.Î_`¤iÚÉà䇱<N*²ðP‹à÷ˆžWËä0w<÷G0ÍÏ’`…ÿó€Í#ù‰Ÿƒ~5Y/« -OرNÈ
ò?gp=]´ÊYrû,ñsˆù.àûX!8â"V_é‚ihµa1†%³+ƒ±ZEÞ’Áq"D˜zˆ±‚8„¸wÏá+W†å -_!Ç#©w&’pÔ9_^ò´VAupfHñû<—÷¦mÇ(ñÑàZx€ÝSÒª
I0á]eÿÀ{7NÀe$sGïä–á¯ùeS‹ÁTPq£¡³ÙÈkZòDnž¨›’Ú*]@Œ¢É2ÎýW?k›U#ùc9qòQ2~¾ÉlKË%>Ū:ìµØC¦o}-È'IÆ#ê=^. ëùœ3udöC³Û–ä͉‘ßÝE©ÝB*v0…àD}Á>Dëø7ýÞN¯HÂÓ9œˆH¸±û˃å=ÅÒ3¡ÛÌ·‡ƒ5°9¢ú>Ùïh„7ËË¿HÚOx“¦¾ÃXõX¤?ž(`@
ûºwFèRò// D‹E~¾M¦|7ÃôC‡
aóäEÛÚ -E÷ΦwxÍ»áFÔÂ6¬ÛÝÔ¼º¢Èð*sŒ5*»¢íV‹M¿+2s! .m@r2‹‡1ËÌá®ê÷É÷S‰e¸e»ª_œHnâ[¨¬vÇ¥U÷•3lËÈO"…!pZ.MN×·ü¦ -ʵY£a+i Sä3ÑoÍ, ›=vTÇ/U!÷EȵŠEÐ죡‰¿š'ïÍÁ|'5BeÚºkn+Ž³-ê`ö¯Äu•ðM‹¹!A+'»Z¤,R]ÁUÇ]˜‚w
ÎÜ—È–þhAìcÊyÛ¿»ni>ÿMº<sÚ-'–&÷¸N‡zªÐåèX£4<hª P~8qèE¸e‡2Œb$wÅJß·à3F%À#÷\Uùì5c–m“¹Ã<½ÞÃmöþ$Æ”-K7\Btª0Q(}IqƱsð^g<h±ôÖdéf¨•…çãQšßVr>×`G°¡Ñæ¬v^"ç4ÿ1PO”ÆêL}ñ‹úL¬÷·Ü'Žð^sh ³5û§7Ðñ·ù¹›³TÕÞÖ,…JøR -Ù2)Uº^É|„çU(q`'á·¬G{2ó*XI2„€ åݵ‘[øäÒA½í› -âß{kUŸÌb—Ñ1>A=ù¶ž7‚3ÕÃRß*Ás¼Ýgÿú‚ûêÐé¹d?šTS–ß<þÞ`¡Ci±¬v€Êé"„Æ'®HÚú•Ü>Û•G‹rÜå…ÈÎÒH¹ 棕èÌt«žmÙz̃†a:«*Ä\67/ØÊ?;RÐc}tó\<¿©öNã±òúž+ð—vç²—VÈ7\ˆ5BÛ(ô¶—ò‰ÁŽ©Lñh?ØÖ?æj y†É¿•KôÚ¨ -…§ºµwµX*C;~Ó‹ƒ?î÷µ ¸1jª‹-UX±å´Ô†*õsØ2Qæk #³9ŸEÓܰ唣¦Ê¯Ü<FÇcc´"QÒÖ‡|GT¥×¿^¯+lo0x~ÒœT3ß`|ä+7½†»«yÓ#¸6 -¼žW÷ãÄ„ Ev,–#ƒÏÆû(¨í°@º„iìfA0£^U¤lîп':Œ{goìü¨X¬¹$2ˆ¹™*ÝþzÛ·à.5¸DJç앵×ÌËè{!Â]áÉì ‚wÈ[³W<%’žz³ac•ÁíN´ -ÙQPꢤ¤ôÊ»Vc\:A«îÚÐs[,¾\<Yå«°fS/WK§ùç Nef¢‡àÅ·j„ægNaÐЉtPÝZ[ÄÒOÝûç:X=ÇÓƒ®æ
Þ]¼“p¬.«}Hr5U“P+þFeóè™dËëènRÞ@úÉì‹uejBöŽêðùFÞ:½?5ˆbò‹ðF™ó*F¤"¦H¦+h¸ÞÜi2tB^&,µ™–gÞ5?–Îç¦Û¢4È"Z-ùJú^L¹ŒÁÃÉ2N™dCn?N98ë3ׇO1¡ï&Ík¬´Úõa\v9ÞWƒýµù“àÒ§yYÿ¹!V¬”âáçEß+Ž¾s¡S£H6HóÈ55D3/ûlǤ F‘-Îq„ØãÞ4šÖ+ÆC ˆþÅwöõqï*?tÖÚáu›uFiõ }C³×6Šq®„b°žëš°o§h'0|´¦¡ð„Â}<qb!¤…Ð6 ²Š zÒˆoSsîèvŽ„”Ú÷w?FÝÅtdž
¢&B ÍBj<y'Ç+÷R“ßl°Ôî¨Ü*¹ThLŸíŸ`‹?1ôPýÈ´”LLvv~]2Ð¥rR¢á*»¶E„;³Gè,wýäÔãì+Ôùá—©x0‰Û -™ÿòÑ*¢Aö——¹dÝ7! …üŽÉ-…\þÙŽEñǰbdvqšfuØ 2y’uꮬE¸™8°âŸN¯ä©ŠtßVOSÚœd`3âES5ý†_à=9 FÜP
Äÿk… -\ñCÑл -ÔiÀùÑI¤3<ãÕhZa³Åð+âô¨Ðt…š¢VZû.š{/ÐR~I‹Ó>òì%¿N#¡^nÓ¨xÑ/(¢¡Ó‹åµ…ätðÛx¢xùÏwÂ-Ý_ÑîÓ‰2-¼`˜ãŒóŒÐàõËmêÂã<ÒÅÙŒxeÔñIDt)çŸF„‰˜¤ˆgxÉ,Hp©¶Þßovèåü?`Ú
éç¤XHÀ(æÛòѳ_éÕ8oêA‰;Œž#kâšåß‘‚è0éá›tÿ΂ë1iÃÁ\c eÂ\3(,ÂG:ãp„º¢7å†s\ðœî.ÿÕ
ááÙ*'WPlÙ–'ò¨Ú‰ozS¶ÅAðªL¬NÃB|õòè“n6ìé >,sØÅPMîÇ¡æ„ÕXÙØÃTY&îBú~`nnj0ŠO¥Ö âf‡ò[ÖÔk¼Æûþˆxtë¨ä»šÍ=—mL«Ÿ -‚Sa2±ßñÉ-†©‹z¥^c§4·‡„÷SÛ9ÍßX±9K¨CáúFÐ5Å;ʵµt#µg¡I喻ѧLüŽ$”¹Š]§\1¿ƒîÍûµo-›cüBÛÇW0pyAv‚ïĹVÊ~ÛlÕ£ËoµÈ\ùslèt‚CJÇ#/0»çúü&1 ¹£fÇ44!cåÇáÛL6ÃwÕPHàD…—Íñ‹ -\¡a×Z™AÀ¿é÷|?€®½W;W|v8ù…;·‹µ&®xêJMR—”×^;Žl‰!
ç»°¤ÀäÔðÑüÌLáó(6!‰1[ôØûì<‘u©›·:«¶B¡.w¶Ð«Áæ}oÃÍA˜G•Â`®yÓxðÏÂ'èïŠYœ×úº;aÀ-Ô Kô¹hãäûX¡ºÓ©Ä„똷ôõ€pÄÂ|æjZ*ƒ [âE1¤ààE‰Áò&}OìmëØÑKB12y‹}ÂAl¯ÀÙ<PÖOÖ÷ìöU3¼Ú¦Œ¾Ãkó˜èÒtc:’àtxªx€Æï³›cy±‚: -4ÆA34«D $^¦sʬ¬=íTÂÚÝø»‡MËÌ›Œy
»‹gq\`‰‡fû¶^À¢!†7û„X5àg|)sN¿¾Ü+8Æ=׀΃Y¾¤ÿÜ[ç -h¡ÎªŸ|éi¼ô²†Ê¨w}Ê(àW½$¸$¯ýz YÖ"twÎHßNþÚÍM‡þ>úiÜà'&ãñÚ_§óDªØAÇâ+snÖ‚ÁøiÓ5ýš-¸¸#ÕüŸoⱓÍLÕµuêŵ™Ý©°K¤QÏ[Ïäq Õ#fNñª -@®t–L{/1Î$dÛ>bù¹Ú ¼ñIÐýŒ ç€n -iÒr+üþ÷lO±NMÜ
O;CK¯x$1w/͹ì@C£ˆí¥ö²u³ü-ã_Ÿ¬±‡¥Ô9¿Á_¢‘ˆ‚Ã¥ïgRCaL˜åþLHÝ|8›Á¶Y¤f$qÞfh‡e®”•šÉÊ…î_”5'Ø«ií¯%Š¸P¶”ÛEÕÆ¿5f8ävò÷/&þ -ÿÔ¸}ÌTЋ͞Í߬Òê0¾ßp%¢
mš`ž®EMuZÌJãä†þÕ³x! -éx¬ßÓäaæL‰Ó$.¦Oe§Ü½U¯ðŽªÂÕ^§Ñ¼§hTmlQ÷/º?À€ëE½†ÚND/©™DÛ‹(ÚJ.1žIøy]wc?“±Þx;ÿ㣳H!ĉ[›AØ --[vƒµõ½œ²©ri!î8ßôaSQc²u¬Âq^vÑÝ”T\À¦Säµy™~šrñ|‰ý£ÀÂ,¾¡PÈçÌ^?sG¡iøؼ(£•:™È´—µþõ»nÈëÏECºë옛3~&“8 -6Sò)×ÃǘM%0ÑXX”ã3nÃùI„+9è—<îLMéÂV´-!E‘YM!¥m¼3ÌKð -#áE§ïG“ôû« -¨À””à [ï×U¿ÂÉÝ{«52V‡Âi¬¼´vfi8¯“›ò]ð¢QMQÎöàâÚõµº_‰èñïHžM?i/î$˜ïù¤|ܲ{©–°<·kʦÁ g eÆQ2„¤¢_õÁ5+“Éá -, gJ´ÌߎÊVŒ5»W¨ˆž“¶"oŸ[ýèM$X•½œ«ŒæòUè}’´Å¹Eb±L@.ú]ñõô”ÂzLòp·ŽÍWwS4™»šø„€¥)Òq×'¯Œ=bºM!Æ’oÚåèLþì1"øÞc²Ç¼P]Më¹ôó,n «æ¼”öæBÆÃa]'¨ÃfÙTbîcõD¨´
¹ÙŠ@DcIõâ¢MwØ2 -¸_*W©¶/2‘‚{Íåðwsü)*gmÁ&-V–8ñ˜C‚FtsY¤ö}65ª¥”#hlõå*™3¡ÃÌ–]1ƹ¢2„v¬MÚ|–αÅðȸ/ÞIyv$é™ßà¨F›zH= -·Ÿ}&çß%k:99ÖQm[4„ tò—†u³SÒ.åWÃÊ£V&üò3F”Œ¸:¶A6«‚uòß„,-d¯Œù—¤MSgêšèžÂnX¨*f- prÙ=OìÚ~7ñŠ:Œ>ÿy“p½–Föíx2æ8:¤¡èåM:È#ƒg¼e£·™ì
€ÖœkLQ"`°š:*¯V¨q„0*¦ˆbõåszûw,F©·U3g…ÂN°WÉ—Øqòüð§ý«jÍhbWǶÿâò÷g‹†ÿc¸i¸Çñ3£mȶŸ2ß#Hzõ©5á¹-#÷ }ÐuZ‚:y”=܇ÅsèÔzwúÄ—7®96\{p( àÅDΨµ¸„à°‘Öì@2\¥ÿ3Ó` “>ý«aríÛ¸çÖ:ÀÀ[]SúúõÕ_‰-S'7§–Ùgô Ó¸Ý+_²æ¯ÒSá¿´:UL¢C$ÁSÑ©ýÀÉÀ -ÿ$ut—.\O -å:-^Ñno.jiÔbê~Ñ»¥7QÿåÇ¥öŽõoߣèU¯ßAVP>ÊRqQì‘ -Lz WÌ„1>‘oÁ©ð@ŠÁ»:cyñdž`Ýr¯ÚG+_ö‹«B'‚»vßeTl?=;2Q2!¸d÷ÅvóxÍ©Ð4›ª9´ [äï8ß -‘ß©i'õJæÅ^è?•qõ_` -¥ð©êó%F
¤’‰AeXTl4ªh–S=e^ó)mþºn™ØäÔcexFÁR…á"|ž„l]Œ².ÖÍ«HMƒ¼½¤¥¡XDÍ5¤ÿ6Pà95ªH p˜ÿêÝ„äWtÈžæåï{|¸…—^ìÛÜDœBg—ñÏïæœB·PžÁ:Öcßþ»’[BÀ‹§pW½“‰Ænmë7[£„õdÓ4Yn<š·,/½ýaÐÿþG IŠ•°˜\ÞÓ³{é’Ó„*ñ©íÈd—6³u¦œ²£}Ùé¤' §[ᆴ#ëýp€â‡ËÌ$2¿R¼dâé“ÌäæTà<ˆXM¸WÿQý}”3ópnŸøÂ@eåer•p™HØ‘°Ž• -ýcÖë}V]|žÅÕꔺDiÁjÔi%á. ¶™aÔ²UtÙ]:·½ùÇêÀ‰o•žáúwáSŸyLÇ™YêCÜ4î·_ÄEA•l„ŸáPÞŸaãnv3¦½mP¸o— \ÇW34Í~.ëiàÑ÷®âÌíñt§¿Æã)F®©ÑL#×ðq]ë´‡0×-«hqaë㊠-…#ÒMÃéõ˜¦”¢jd$V;&jdŸ>mðµ
N -˜ŽžL‚Ð~Òrs¨;X9¯ì+%J¡ ‡;ÿž :í[^ë `g¬b‰ˆËâˆ*~”}'m¶z‚σçvôŒFÒSô YÑ~‹ -¼SáŸÒ‰åu£OÁ¢“óC1ŒY-g€<J„¹Üþdpú*s%‘Œ²ºÍîÕÑ®0¥iÞ@3® -ìï&Äø`újvKdWDw]Ö¦Nߟ@JâÉË>»\87òBÄéôMQŠ¯ýj—ÞF˜oŸÈX˜KZ:w„u®ø|a„²—÷ï™›&óZ|½:l!Šuàòq\§0‘ÒŒ9úyjÎÐÊŠ$ ¼¡y Z»€œ¾K“02ÛyKØJ‡”p`"š†f¿=8K¨î¾*–§nrºŸó›®0P£ÞÁdzÏ.ç~KÇÉxDû\\3ÓÁ}š¼îñÁ‰+2—ñxœÑýÏäC4Ç5‰a½šfW™¦-ëH]}¹L¡f<›*ôò²"©7XZø Ð𣱛²îGx¨Ãè gÂtÈ^^œv5O€[ûŲN‹éãŽ] -u‡ùÙg¹ìG>xzóÕ¤t:#ŒÃ+ÛFRë¦Ëx¬Ë½a³™&¹Æii›þª|`5Tì -4œ±¼¢Ë”a8º(IM\™ˆ@MRU¼ÍàˆsLþÕû¦ÄÜ5>“0ˆÒÉQ;fQªúÒ¤ÛR}Ús“b“U¶ì”é0£‘0»ÈY3-„¢4W&¾Í¨¬†Ç,°µ7¦âG=ª¡|wǹ -EüÏÚ\wF'ºÇb¥£8zP<¬œÚgðÙÈLÏ‹£4G9ÃâK+¢3멇^åÔ'4¯Æ×€Ôq<)ú ¢!~§l‚zeZ?„påag™Hóï!BX𖋉lèµ\\ WVã*¸P8¬ÆÉ3¿w²ã|Í–6í2Œõ¦Vüæ%‹Îq†T¡‰(®[³Py¯lÈcž®‹¶;K¸Ÿžæ@žbk$5ðè
Wô³V"Ò5Ù÷Å0Bª’È ñ×vy ý´¨žçpI½I óþÂÄ ¿í&קûU]{mŒšƒ£ƒ¨Õ?é í· äÛÄ}‚¸»h7«´NBµoüÉ^Û}uƒ–:(z¯Ú6Ÿßвýc“H¹¹~˜Ò΢<÷×”Šß6È*%¨/ɱò¹¨[sW<i!‡’À²~gë/ÄnÁÀHÚ&SÓ©ŽãÝͮϺêòr‰Ï4Þ[#ŠÕÓï³;î Tþ3U¸q¡ÒNñÂÚUŽ%· ü%ú'ˆÛø¬½ÖQFñ hö)²3^z|Ÿ¿¹‡•QŽU9ˆsêÂÜ;¬âQß’TmNO}šÕ -[Á!¸ÿ`/¢•Ø8™ÕÂà[TèßeR\z'ÑoÊòT^n -Õ…ö_#ÛI¾ fŽf=h(O‘1Ücxk‘²'õjä¾ñÆ̓¢€ë3Êc‰5Q!ª¶XùYÍ\ƒ‹šÖéYf~l&²(ôÊÎ’sz- -ZW˜XŠb×E,9†‡SÔ €»ðZ¦Á|Ó¤
²,ZCx¾Öd°›œÜý
Wt˜6Æ®®¸„ÜÏ2çŠ3"œü0cæÿI#ëã·Nà7.OÁI;í~ܻ󢽷ª`ª§SÌ„,Ô4õ@Âl+ZE´RrTU¡»‘Ÿã×#ï@öÓTè¼=D™&:E‹¿òç[ØB hÔž¥„{ßOÿíÚOÏÚW¡ng‚=Rób‹iqœXdf͈ÓãN~¤ZowïZ]OAŒÆ m~[muRrbkÖãÙN³D3!´|q›µ8œ_É
*UÞk‰z¶Sv‰à×Ûawc„A¨@'QŸnýz5ÃïöÅtž¶>öàOtÂãhE·ÈsÇë…ÍçJ§
™D
É󃡄ma•é1{X/½‚Š8‡tŒ¡r‡á5aÙ\yÚ&Š(ÔÖ÷¸œkèìïŽÉÝJæcB¢Ó…VüZ£¾¨ˆ†3ÈQoýW)ü='z<ÄF±„Ò•?£Ku2¬yˆ~õg±ç]<Õ¨%{ž/¦Ê"W’°Bã=Þ—wž#ÑEF¹ŠÕÀ -òÉy'ðÛ7xOLçe/Þ°Ñï^¢Ü¢Q}ôì'`ÁÄØK²b2wv[•×¤qÑÝ{ñGŸ{) ÔT³Œ|gu0fÆ>ö”ô|ø•F_ì†ç=Æ©EbÇ -é®XEP×B#xg åj§ƒ†¤>ßþðû•ØÀ6×¼s"º*-ÃEsÛdBЫRùûú´>wüvÕm2ΉOxÖžÔÆc àk1~¼Ü†Ï²QtÚ¡>úAÔ’“ÈVݬÖ{&¾i²àV/Ö&OTin«ï~ƒjÞ.§ÄÜJ7µ:1ZF^Zc#ªeéWÃƶfðH®'Øag™|ƒö!žÍw?Nð3\2Ô…¼Jà–Û2|ÒÑÒ:ó!Úo§Ë.˜*)Ñf†Ú[I8ù eR‡þÜ)W€> Âw™öxs²øje>·"ÌMì®UÿÜçþÔØí›Mó‚ûñ²líß“.±ðŠö›ã,´wr—/#D°W -Í%õIâ>w:=w ¶Ê%Å5íšSâ¢.ha¾üµ;^¶ãakR¾VC—aÎ+Ÿ¾7,Š¬:Œèø ‰ë‹þÞkïÔ›EÑväàÛFÚì!óxsr:• -ŸÑ¸33Ƭì˜mgN¹_ß2už:w\%ì×çB_¨³Ð -æaŠZe8Ó0à€úq‹a.E'æå2);E J…´ =pú"»)x?5X‡W86iUBŸCˆøØ-(\Hø\XúJ*²¦F±¶Ÿ¨+hXƒP+ãèEï2^÷ÉÈ:Í:pž‡ÄïÌz`°úDöLOŒì3ðýñ•h¶ú,9z„÷ÄÉð]â9Kj7$Çÿ]€û.vï¦XfŽ^}dàìÔ߸S–V`Rgã÷g0WàÚ -¢Ä -2v9Ø°D8s¯O(œØ/Ÿ¼Pg¿‘ÍÜ!,UÂÆÙŸ°Yë—¥'„6Ç•ý=I©Ù‘´†-5]ÀùdM¡Á1ðÇâýË}R6H”Y܈ÃT3Ö!WÌ´TÂ8h-½õ,„Óíßú®á^™öD©†™<VPz.B_ÀƒÇ|*õaˆ¹´è0VNdTC󩜹<ôL(â눢 -ÿþ"ßxÆ…î“iÓj¬eÑækÛ(Í3Ìm¡?°ï4i±´”¨ÉÜ÷Ûc¥iÒï0}ZÔuðªFÔÒR˜Ë2\8nϦI"ÜÆÑ·ÒÃÁn9º&ð1>mÜÏá·ÕÒ—?_)E¼‰‚“•F…ªWÞéz£aC+%|fšŽô8³NOy1¦F3ˆa;pcØ’™/(˜4RÌÓŒPÏì²};±D (é½½Þ@²¯":FU÷ÿà*ð–쬴^•p™KÛÖ+ËVÛM€ë”dÄ ™Î2`ÜÒ9aè¡oöÆ)^æwñ鶬èidøø/}*òÁÔôV’ZiÊz®¡â´šc4ö;êEçLKßË`‘¶¢óó[kòûïƒçy:¬h³~¿%£H¤¤…9Ù
A—Ü›¨ë“”žéYWýtó.Q$3oYm®±Í,™ ™çóžg -ÛPhJübNõãwé‚“„9°¯Ë?¼”k¨µ=ÅhP‚Yâèú”üwZôm“ŽP15· -{ÑÏÀ
‡nÝC»• ùR}yÒÏ]
*S˜|`žVÉ*ßðaÍJòÈõÂmÞi -2ßòžØªœ{+ëM[Ä·¸¢SÏ”òW=T1nYÅijÏ¥Ït2Â+,'de™\Ç£±«”>OØð§âQô×Úz×ÂMäY®t×-Ó8*«ÛÏ´mÇ*6µ>߷γ>Êq˜þˆßvµþ„õDé*ÙÓõß8_üUp⎩oä~ݹmzî}Íܺdiß±’Ì»§=g1ÙÍ+bsz߬×Ya)ŸLä9+)K&ÚÈn¸eŸÐÏÊ”ºCbJîOÇHŸEÔ&<r8ý«4 à`ÍÍó÷J²–©\þsþþáÀr§•KìŠßüxÛ©õ³ÂißRÏÉß’Eä,3U—ÝZ»m³üm‘™=§ -_›s4H²RÊ©O7œ`SÁç6mϳۆ¯¯¬øê|QaCOUñÚ‹Û^§—NxrñjØ"yæŽ)ÑoK˜ÿRWH¹}¡_äø÷§7C'éÛ}À¦çýÃÚîeN=;§jM¼´—øh>çõå×þ—Û¯4_äqmgÞ¢9ÕŽU뵪'0—ö-±5[Ðn4Sišwm|G£Ã±œI9I"ö;ÊBß´ÅX‹IŽ/´ßþJ)Î[sy˜©ÉË)O–"¾Ô¢O–Õ)<.ÿ¼ßkòƒÔžGþµ_„lÚãj¼ªïì–ß[P2_„ss:Ï©¿¹-›>±Zêf¬Í»ÅyšažÝ4§Ÿ¹¬7Êþä{#µÉØAs‹…€kÔ€aa@rNjbQI~nbQ6 +xÚí–eT\ÍÖ Ü]Ó¸»»»;ÁÆw'!¸$¸»»{ð Á‚'h H Xé÷Þû½äÞùæ×Ìü™5½½xvÕÙûÙUÕçZJ
mVIk°%PììÎÊÉÆ!Pñð©‚Á + +dt{è +`G' @ÑÙŠ
úåæñ°ú+±À꿽PWKŸ™™íß*üŸÌíÀdå°Ú‚œQØÿê_ÑÙÚ5Ç?ãÖ.ÿ5æ „¸A +€®‡5ØÙÑ`
´AaW»ƒ¬€ +4%//À +eyl%nŸ–™î^G˜;<!cô±n8Â¥´Q§¨ ¸Ü”övS°Òü¾6‚iJè±ÝçËw—‡%¦ÝÑ>GúÞÀ“|² +‚ÛUU¾¼¦O÷’OöŸ¿>Ì:mþºŸ•Tr.Ì¢›`µi@šCqÁ+×W7°¦^¹.c®Óš‹ü’Ýhßm|;óÂù>5|u$©hŽ= ¼#ý·åG•OR}à]ÒÚüH¾p÷–ë~€'Å‹V–‰>µÝK1#‚éi„c¬}®=HµGR^@Zâ(öël}çÂñÉñ“ÕÓVüÍÖ¸4þëZ–•àCg“ÞU«‡È½]õký c‡H%3îÝÛ¤¡¢Ÿ?øW°¡Ãfv|˜ÀÇuÑo#6ûùð´ox5fWæ#6ÉIWNBÂãe³Ñvt@ðöhâÀÿ†Mràb©þ[>_ÊÞ×ÁṲ…É8¼©å3@0å‰ãÔé4 àxñÝÞ³f†1âÔÄÞU‹êaºv$‚ú>xÒGÞúþöÁP9HCá,"—)r-«TÐð;C˜ts†M-ð¨<Xo®ÎIE‰ÙlÉ~®iÅýñµ§©›‡c• š½IíB^œŠUn£ð£.yB"D¦Þ1™]fî=Wnàt×° Áž×¤Á5®Ë]F}ÙKöaõá7Äè蜿=c¡9¹íãUÆ;‰M”L"Åö#ª/Ri·Apøˆ¢R‚õÞù]B¤6Ì'äù𪗅?n +jL2›È¼îÐÇ?pZpX+?„sôcÑÝøö¤î 3Ô +×yMæRÞ+ÏJ°©ílœ–ƒÒ tµX—Ú;CÆñ¹íÝš“ÙŒ-B¯ä˜ŽÇé¨×"a4ùo0'xªŒ”åÉ.GY6—oM +ßq9ÃØ®÷Ý(V™ór\G¸TqÄX Ó.جF+ú¶YÉ¡ÙlVý˜@4üæbÃ,Ê=廜kDLƒ[3C;ÿ*k&É4ÞªG˜Fy‚KkpòvâtXÏï> Jf<á%Ó»ß|
ø¼Vzã'D\}H×®ºÉÎÊšë·!H~²h9íOø„É«dÞ¨ +æct¬?œÅ•2©Enœ,šmÐb/i[¹^/±mmÄÄt»‘J´—Ró:ˆ5±ìR£3ºcô|G°\1Ò‹ôT6Yæé-=¬ÂÔÝ.NÒÔ?Ò†W¼«W4E“‡ÿ$n¸œOÁDïÐ÷m‹Y5ðõEšwoë½›mF›Üž +²§Ý"Øþ1×
OCñ…rL¦Ø6, ë‹ +«\ÖÞôYº_¡Ù·“Ëš +ÑÕ"ßµrœÍütêÆê/ÕZSßË4•Èá}õ–ùƒ1È?ÿ’žŽ=>@¨4i‹Nº3XJ½b1!Èfô‘Š¦˜õñ1ßÂQSàh ^Ž$¿_•Ú²ÅÐÉIâ}E\ÑõÌÑtŽîèÁš‚Z ußÝšw_¹Ù&†±V ½´I¡-çê~Ýx!ëÂj<-}.y qÓO›[•‘§}î%2VBÅU+Y÷Pg³r@±ÙÏkéEÅR+íµ»¬78¦«G7ÔbDV£%™óÙ%rÙ÷ê<ZJ‚ß`¯Ó-?®5åœÕ£˜9Â:ýj¯å¯zýP‡ò*W>,Ü1ýÇÎO7Íx”ªj[‚߼8ð<s?:ÍðC¥öÎfñ%ù2JÒ¦\“kDÓ
.ewmŒ§ŠÂ×+;têÝ5¡Ó±—LøR_\=¿LÏ€0‹FmiÌãóWÂÈuH‰:¬[·ˆ§¹½ +•¬$Vy‹†ä‘ýnk¸6e±îðîtŸôGà~“Lû!"¼ïejú»¨üa`éË×_´ÜˆÞ[ÎíÊÚ¼]–˜$¥lEwgBShnlàâ÷Ùf!¿\ômÀSÛóF‹H6›»Ë>â7ûX'/Ì>üI1qç%¥ÿžØ9kÍ'š!ŽÑ/àaEûßSÊîø/ý¦ÖðÑhÓ«>ê³ Á +c|©óYˆû’KW<“Žs¯é"å¼Î®iÖׂX^œÀ,”J$•b•—UÜ
½QsÄm"kÉH¸gK‹öæß@µZ¢®PêlÉ8Å|DY¦dpîþVSòi"¾‘QörtðÄÈ®V6{åT·RvÙô~eŸû"'[„àuõ—˜«óyzï¦í’«ÃÏN˜ÓÂNѺžG¢m¶ªTæ ÒQÜM\—±?Œjª]«QoÈeË«!ljñË‹u(Ì9ßj3XP\ú{š©Z´½Å߸Æ-[¯”{Åp2…öüt["F†›Ù?CLb]èÿ +´< +Çþ9÷¥ê3gá¬Ãé9_›Ù00[<ä;0y˜üw-|M´g1B²Y[å•P`Ð!OÇ·³
.Mõëbßä…߯6&"5<*M†Œú6Œê˃ÝÖ}6¯˜wÌQ¸x…1ȵ×ø>£Çá•ÜϺÄSYƒvcÌ°À¾¬¼¨º›œ(ý¼§û]ÙèCi¿b¦k›„Yd[{ƒªÁ2ýMî4bcJÎåŒßÜ%ïZ`6hÆKóýß?±^ŒËCHÈ +f{uœ÷˜ñ¸y©
fAn±ç“¼Ò²@J*üD,½Óïì`´“)Ž¾îåØ.¼nï†<FËZËû©„‹¥µ‹lÍo™Ñ‰Ui¦õ¤·co§¿]dò\°VŽ2|_ºLÞÍ1ýú=ª<¶Ãõ*§æ½Ã(ü^Ÿ4SºÖüQŠ`Êþ÷2]õm!#ØÒÏÓs_ýbäNRÞòaT Ÿmžpõ×/rðcƒÌQ¼é$P?‹@ȪÎRB‰Ë5,·M'5¨ÞÇEi¥W¸~L‹9.7cVÁ{;8çw{uÌ3Á=ôKÇJªÙÄØ]{š×5G¸ïëпÝxOAY¼ÑZS,Z£¸açOJeR†&ÍÙÌåM=âVI|óö¬;°Y<‡ûÄæ½äÜË'çø8]å·5%Å|§¼¤Ü9Tj¼Öò€]•Þùˆr×ì8†"ü‚0¥àœ'͉-‰áü,®ûD€ÓÄW)?µBÁ)¾â==¾ò©XÙ3µsvéw§ßtÒÐE* +ÀÅdô9Sȶ#E™ôBn6ÛWe‚2dµS+WÂUgIŠ^˜òTQ:ˆ‚öÞa²iõ•Üþ|«g‡èZBý¹õŠs³lZð{Á¼¹WÊ»>¤Ý[å¸K˜¨*ûS,úÈ1‰Oé'ð+íSeLçbzR³ä“&ðfyU¼í¨Vì X3îW]ƒj>&¥ëÂS´ÄY=s,)\ã5d¥?ÑÝít®¬“üqsCÑ£©[›CÂ˱à}I^ÍåGN,{Dþn1Rˆ¯–7%ý˜=×ô-W¬Ï 0*4¾F‚dí«&7èÛé°ù
¬l®ö¼ ýðÊãP2-Î\¸Vp +¤Yùv#ø‡íõXú’"9-BÉQ?ÝÔ¹Ìl¯aЪÏÀT'šEÉÉ®×B^]}!p™•ç9žŽ +É·» uÚQgæ]ó1¤öfþ„Nxc˜Ñ¬ú>ŒâU‹·Üê˼ϪÇRGñ>Þ‘s窌*¯ôªOh²7‘‹N~½=cpµ TõÖì}g†V`qz÷Â;õí9G¾ +ÌsxÄcekçAé¤lŬ1ÑÉ#ÑbNž"{þLR¸øy¯¿˜zk§Æ¹µ›?R#Ž8¯{ÁL5©ÁDcY†Ö¤u½$ÄO@{±±®_Ý—“n¨óa¶[À‹Ú>/(.ddPú3NÊÈÕSÃz~DX§qóù Ð/’ +Fˆ$ê²ws[›Æ_ÇÄì½Êyàa.æýò>cr¼¥ g-eavµ¥Ð/©Í'éhG‰Ùãâ£yóãªºå™ ¡Pš†]Þáýãpå¨ÊPxµ«ßL¯I›3}[?ðžÇQäMŽÉ›/§{"_qˆX¥ö!QBÃ4‡Ê%T0öR¿.'À\µ"ÛŸEäaIq®y<¹èXbèï‹UsσOªªJ~Ÿ–¢£_* +7 "Rˆå晀k_”ñà»T.Ïó¤ÅÔu.”Q®àvº°kû?±3e×7~eqÔôÞFB‹Z#kpZüÀv‰Ìö‚´¡(mÃ"Ä<T™(LýŽH¨Ñæ°kkôè>]e(*Àc]®¿Žü¥Æ'x\ÎÚ„³Ø…H£ß{ù_‰sV¸ª-:2L¯é‘¿®¤\Ê/h¬Â ÖÔ-ƒIú»Zº˜íqÉͽc`õPz,s*¸‡tój¸*÷³^„''/ òÛÜÏ¤Ï +•í%_“.1Fnòÿ~}Õ ÂЋ·]ãNáøzHc»¾°H´«ó§ƒÔÙ#š=÷½èªÞ×úò’½¶rdɽÁšŸS|~'QÂ,ð/•DÅ%“J ByQòÞ!Ò£lK5®&1öMeŽY!'8lØÏR%:§Û¿lk§;$ØÜ"—;·ñû” bâíÄ„7ž[÷z ³õÕvÝÊd[ãñ—yðëସUºTæ¬t¸SöØæox@DО[ýr¦ÙæÜ/˜‘†+Ow‚oï³—õ<îWC|íËFS.’‹¤qº{vå!ÑXÕîV¬˜ß“3öO’Å96VÔƒ~¬¼ÉHys%‰0x‡_’?OÄ_ÛôEt¥•=?Åî–„HÇ$‚Ô,ʉ™y‰¹×:K`Å3óÓ²°Æ“>MùÛuª¸g¦½Ã·ÜìoÄBÚì à~à÷†UéC€©¡ ³bœbž[7{1[0÷.öEcÑŠ3˜øL‹†›aÈÆòQ¯•ˆæ~׳/Êsž?Ãåi(ášsŒS’¯ÎóIÅ4Ì“Èé|á°’eé«ŠpM/vEÍÖáýŸL›m|£‰‡j&56Üf¼5ý)ùªB9ÎEMH¼UµTÆUj™œk' ‹õ\A@åU¦ýeÎòrÙÇ°V·(ådmÇ2MØ·|ï +A_íäOÙÒ¾‡³~½Ž—ØdyK1uPª R€r³‡¬»¸Šz0kZ˜öšÚ7x«½ìƒÓŠi)#˜ËlÙ˜Á¾™;äz†^x»µ®E»ˆÒ±2¦iŸ2ØÁŸåb/ßÝ>åÞ5 +Ò‹²Ïµ}vÞ_¢–š•÷õêË]nØLßëb9ü«Ãž.ÌäýÙКŒé˶IL‡ø½Ü:ôDÍeµ.©³J†ëåúÛMÄÑJ½Ž!uৠ+û]¯h¦ŠKóÁ8yM¿Ä}”!#ŠïXß>žàšòæ½ö¸š#j5^&4Öf ·Ž¢ž.l|ÿ6àEw{"B%Áe,üð]V¡GdCpf¾s~Hwj|y."Jâ¸û¼\ jcœèÿîhù©¢@b—ºÈ×h|}œ€·¡u-¡œ,X¥Úo•¢¯kã$ï&àÕÓˆçšÄÜ䃀‚Û#£AF>Ç븣žähêænærÅêSlt§µ6G…b½GšÎ6ê'µ âð–Tý<¢vÁ䔯¤×°ùxXJŽ»¹
߆u’ý`'ßßä:°Ã6Ä…lд˜1© _6¯mÿòª\’q-a +1½ŸÒ³ €O:^ú×]B +EÉ~üwö +P½¦ð}sh*öS´iümÐdãºhèúØ<é\,9t<·f8w7yQp7xzí*¦â2<óü~lðëÌ +à”ßî}€hwj:02©šâÙ)iþ$`èè»Ö@PpœiÔRîD®ãÈÀä÷Úxµ•h0p§
ŒØÁlùâ*çD6–7R3y¦ê!:šžZ– +œ<«l~´éŒû€úð[QæñŽÁ}œ&ìʵ”kßBè +íÐ,ÎIû[²mø¤ð*st®îaAº!Ù\•ìÈä÷ÒS»ò +i¥¤ñÁ?dQÁ¿ŒÔYà_ˆâÁ’آ˼T\=˜-J`4¢±Û2Ž‹(÷}Ë«Õ÷ÒøP¥nWÄ53z/ÿòØ6ËDuý!¯ˆ’ÉÄYk½µÉãŸåšfw<„v€Ým)6v™˜"Ö{3–ìýŠ^ö!¤²ö¸¹brî°ü`à“±ÔAoýNþ^É‹xÿæ怶ÍêŒf<_oŸã¶À¤GR¯¦àð~°såF\”q_˜ˆÖ ô%*‡G—,½×–îpI*-%»|íLÄakŸy€Wv!Îݵ>'»I²gã<ñjSªâmNŽ»Ñјn(½”í4Z:·µzÐàMƒk!RVƒPÑu°8Ü¡Žb{Ü€ò)†Bª9þË~?¹\‘ÝîAÜùbäŠH%·ï꿘²Ž¦³â¢0î<Öü]Íh’¶³B—E2y½Ó2†>=\Óa.â’™_T$¨«cwËh‘U¿u¥[D ¯…èÇl^t˜æ²’jÐ.wUƒMë«“:Œ3ètÓ½ +!û¦ª,‡…~•|oóßG(¬ú$%´:±Ÿyh ¢J¶wc^VÛ¹# ®Ñ„iˆµ¬ÄÞ©ñàxŽ};i8sêLÆEd#<?¦&-ƒ!¢ϧ=Q|±—o@–g£Ð¨n›clÅ«? º/õ”ùÒ€×JÙ´íÅôF>×”nš7ŠWÓÈa6AYÀ;„Û[Y*ŸÏŒM9éu]K¡òí/¿jFÂ1`³].²ÉDšÌäOîØG.¸‘ÜJ;ÊPØxÞtª†¾<§U +§$XrPPpíãkNËkt-“܈Àõ%íkFPùù–¦±™:$MDβ̘ÈÛG[vŠOb}Q›DL.¿±æÂJ£»à8S4`BLç¯Öú* +BéÛûÖ°ÐúGºUWÎÇa©B³ðFÄpÃœgk/Mç×ÉwÜÙlè››8À.ŒïHRfóüðZ‰w;J?¢ý©îì>¡|ÿI”ZEÈ!òÅEãŽQBR Z½lê¥~/5Í£]ç½;"ñéÙL°Y¨’nÅÐd^ÆÒV•n,RÝû_Y¥îsžæ¾*¿õ‘È?ÔMl^ +¡I'T·#Ý“ +endstream endobj -386 0 obj << +429 0 obj << /Type /Font /Subtype /Type1 -/Encoding 1161 0 R +/Encoding 1952 0 R /FirstChar 35 /LastChar 125 -/Widths 1167 0 R -/BaseFont /TIJINK+NimbusMonL-Regu-Extend_850 -/FontDescriptor 384 0 R ->> endobj -384 0 obj << -/Ascent 625 -/CapHeight 557 -/Descent -150 -/FontName /TIJINK+NimbusMonL-Regu-Extend_850 +/Widths 1965 0 R +/BaseFont /RBBIJD+LuxiMono +/FontDescriptor 427 0 R +>> endobj +427 0 obj << +/Ascent 780 +/CapHeight 733 +/Descent -187 +/FontName /RBBIJD+LuxiMono /ItalicAngle 0 -/StemV 41 -/XHeight 0 -/FontBBox [-12 -237 650 811] +/StemV 98 +/XHeight 530 +/FontBBox [0 -211 600 993] /Flags 4 -/CharSet (/numbersign/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/at/A/B/C/D/E/F/G/M/N/O/P/R/S/T/X/bracketleft/backslash/bracketright/underscore/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/braceleft/braceright) -/FontFile 385 0 R +/CharSet (/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/at/A/B/C/D/E/F/G/H/J/K/L/M/N/O/P/R/S/T/U/X/bracketleft/backslash/bracketright/asciicircum/underscore/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/braceleft/braceright) +/FontFile 428 0 R >> endobj -1167 0 obj -[510 0 510 0 510 510 510 510 510 510 510 510 510 510 510 510 510 510 510 510 510 510 510 510 510 510 510 510 0 510 510 510 510 510 510 510 510 0 0 0 0 0 510 510 510 510 0 510 510 510 0 0 0 510 0 0 510 510 510 0 510 0 510 510 510 510 510 510 510 510 510 510 510 510 510 510 510 510 510 510 510 510 510 510 510 510 510 510 510 0 510 ] +1965 0 obj +[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 0 600 600 600 600 0 0 600 0 0 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 ] endobj -383 0 obj << +425 0 obj << +/Length1 726 +/Length2 9515 +/Length3 532 +/Length 10132 +/Filter /FlateDecode +>> +stream +xÚívUTœÝ%îA4îи»»wh qw·à<hp‚»»»4!¸{`rÿ;÷ΚµæmÞfÍ÷½”ì:g×®z842NŽîZ>Î vvV +¶¶qÐ[0ühÛ›Y‚À® +°ÿ·°pr´ÿ‹“ë?=A®î‰Y¹:9 +Pv²¹:4ÍÝþ*â +¶úÔÌlïóÿO„¼»Ù_1ÄÿÊüwì&öYªÝÿêmefÿW§â: Gd öpøw=è¯(Çjéähïó?¯üÛË?²ÉëK)ÉK3ýwþIK;Z8Y‚šî5sµüoàŸ´šøß+ô2ÿY) +¾Ô{î8jÕI™^¹«ÓM +ÞÃyÄ\ÛmA^ê‡åöb¿ñ¾ ÷§?/¾ò•8:Í])WÄÑ´Ôø3ü&8•š3óô»^©°yÄ()ëšß }YÂTy6|w~7ã9lˆkô{cç$œ4HÓ§”8\Ö(ãäM“º> /FãÛXÓ<'¨›ËÆŽ—×=u%LÈ™)ñ"U
íê:Ÿ]þip5‘þ/)úž¡oa—…Ë5‚BÙ)[mCèáÖa•ã‘pÎ$w¢þÊ„4LUM©p>œl©Ö¸]Ïrî$}.@™Yz°_ËsÉ”I«-ð$à(;7gÃj ¹Ïñ'Çïl®DS«Åuïó²5#J»,NÙg=Æq.>
¦U:³¶sPÅ?k´CB-aëø½øÏV.¦÷…GÛ³g—Ê?áŒðÈ+·‹’<y‰…4Vf5éY25Û~¨DþìúM½ó»À~»Ds¹ô~¯Ú½Hþø¦IÓÏŸ<X9¢“v$ï„®r¡Å:Œ±H_ëûˆ—M~±?!ïñ©N×pmÈ»’L(Þ- š*öB ®ç˜Baæ§ÔMTì~Û,³ÞNÅ›FÀÇö_VÇÄúÑç!žãdR‹º“7÷rµt¯ø0—fRí±PRÑØßnHeœiå¼U´g7M)DbR5æ‘»(O”!Z£ýQgùaºèè+P-™;«¢†;çÂ16¥œ4-°£´[+¾FSXŠºnëDxGT™ðžÍØ›–~žëä¹$ï«žLYe– ‹6ÇþeüwÐ0Ëé\Å…(Òq¡Ïõ&ÖJ‚ê‡ØÏ؉zz“m¿F˜«4ù;ÇôØRÞq¾3ÿg,Ègšê!yŽÖê¯ÙÁ¯g
aÚÇðP«',þXöQ«Ë7š,Š€º›~4nyo.-P ÍÑim¼›ãc^Á=½êQo?N!™Iø£As+Æjïú……˜A58èã°¤.@˜Ôঢ÷ÀÏÍïŽg*0ª¥@q»êlëP€]`‰ü‹ +´ðËU¢¿Ð{\Ã9œp\к÷™žaèÙ÷ +‡ÖJoŒcd5ã÷öÛÍ?é'*d»¿›RY‰ùÕ?¯D6¡š„Uï›Ù§J>n½X9w6K¹ÃÄÆÏæmdÜaÀÊö~“©ÇüšH +6÷‡¾ù|¨˜FˆÓ—Fÿ ɸ¨èÚ-I<6µ4ñh/‰X^BîÖ”¥ô`滤¬-×…À…×Ó/¨¿{ÅéjþJfÁ^Æ`3ƒVTû)iû;¶ðÄ©âœþdÔbåT—cý9ë’ýÂþ¥é²pÜHìgF¤ýœ˜oÉmQUÐÅÎÆ”Ã8®ÞÉ\Ú}Z£Ñ´X¡g?»Ü ±È꜑4ø‡.øiÔ Z¦×`f)±™¼ýov>å#vÜasÜÄrké@}Àûjºëôiì.Ž©CráÙ°”}2 +Rîåé¦êÆÊH +mΫC0OŠ²ÿADiÚO-&¹%l‹Éý9+Ëû)¥›G:
ú!æÝ>ZÀÐÖ_'Tâ©Çmq‹xDz3üÉ¿– +[çrŽÔéÈÆ¿Ô³]ît¶zaòã!0Ž6oØš@ÎÔvvŠÒ2ç‚¿T|qd<1ÎÞ›øÆTDMHvØûácàÛ}e…ì€"ºi žÿHMeÊ;"à‘S +.lˆPBè…)2“-»b–ÝÉ81•Ñ“x*ŠÈ¡Ez¶Çý†*n¶®Åc²Z0`–1{ò‰:xþthèJ}3ë>4`@z46ò«u ˜Óù¾‚MÇ9=$]JÔ!!êõ»Ç—Õ\f£ÞDô3†»Ø7
äg$•¥›UúaÑgJÍP‚óî)²§ÇÏú4_âùU6W‹ï>úÙ$|¸¨Jª
Áý4žYÐìð[Ä(jì9ÎbpiÐ<¬ºéËRÚ²â$¬þ + Ù†Tçájƒí(ã#2ôCBÃ9»Œ¢d0 +NxŽ\˜1î‹$³øgI±øÔ+Ë-[§8˜íWÕ”é¤v!ÈåÎfJïpè¾#®”eEeY¶Ïv«pÿ£¨ +’óåÉ]g)\m)ñå$aJ‹7a…|vFò—@pK›+ Æ«GåUò-î(t¬×ݶRZ4—ó$(äKþoÑc¾Æß™%¥ÂoíQÓ0Ç¡š“ÆÒFŒÞa?§MÉêàÖýGæ˜mßá•~xŒê!síK±æÚRì50—ÁÅ…¥öhÖË1[5 +Û9žä–âôú:Êò Ñj»4nôÃС¥ªQßÔ{«<F©¯,i@TO +Uµ†h¯k E +t¦3RŦ–î÷'šFTMã¼·‚çé><†£á¯6ŸnÚ¼çöo>YdžîÅ3Yl‹Ë´ãÂwÐ2Ò¦k°í+8ß4y#ÚÉTiôz~±ZFœA9úÂh©A1œ#ÄìßÂ݃_L¡„|"tŠíeóÌàþvv$Í”ÁËnž¯¼WŒ=4Ò [ŒJ#מ—0§"¼§2XÛëþ0_ŠµåØ¡VmA—²§h¸Þ +&,Ä›ÝëQMÐÉÅÙûƒr×`(4GÍóá}N”ª¸%…¯¤nËUhð0©Q™·…]ì?ך€3h¥~ +D®žo_+oس¾÷N"ÏÓ¤E°Ø˜Á(|¢†á¤uld}Ú5&Ì„bøÝXM+X»û¨XŸ×ØÒ¦¹Y ÷†>¤×1Cß¡/{gâ +æyd,‚x¤ïl[A±˜½t
éì8Ñ¡9^>$øºµòØà‡©Ž›Ç´ÂÔè/½ â‡T—Í¡›†½¯Z®Ÿa‰ŽPÑO•\ÞxÚÙN°cÊ1€ÎôÈê×ë}@ñÑÊ1ABx”¢ˆ«µc£ð3LÑöIã{Î Jaž)âpKíW´ëXT*]o¶ÌõÛþ* +ª®wœŽ~É^QÊÓ¡®Î—“xtr”+Ørd:¦
̸ïÜz¡pÔ ”2Ž‰Ÿ:·¶%öŠ¸+çc@ñÇ[jÆû~”*:5~5=±²øªº•š[K°ú
•úÀ¡ÝƒÑ$ù{áJi‰*†‡÷w*öŒ_‚¼Ëì¿ã9±7<çrÛ \ü³¸ÂŠˆçŸs#¶ÑÍ–b^G¼ŸòúLP£¾ç¸ïÄ4ÄñÛ•æ±5û´bÑ[zͨtéä=n’61Àó°³Tº>üÙžp6¨]M—~ú×ê;ŒÚÀ‡ÁGûcàHl˜~þ’-þ÷õqõøín=ÈkýycBBvs´}¥?'äú£v½¹.¯ÄÁa%JMd Ûo‰¥¨Ó0 +ûcÑ7‰ÆáåÜØÑV‰èÝb/èY‘–[s oãÖµ°_6ß¡Fé$tú;ý©ŽÛÿã‰õq
?Túµ.?~"Ý#gñˆ’Ú.‰›è9*ù ãB“¤ÚTo6@®%s÷Å*:«¿êWù¼˜°:N8A›Èçm䧨À +õ[àsêïJˆ8ä7ÓaKƒR8ç¼NPp…ƒ +Ø<ü¼= Ï16awëO¢ LÀrõŠGÝz‚öͪ¸(F@Ñh`‡ë“À׃ûÈv¢T9œµÈ;_Dás6ësm'L»|oKÆ×Á:» N£¬¬®Æ»Ç7œÑªîøSBgß¼½”Þ(¼œœQ?mäf»à¢I÷`–¶X7‹`ÝÆTŠè0™ª8 yg<ZÅêlÑÅ÷Ð×a“½Ü$Û˜<k|?uô“
d¯ûEœ +á2å-üb‚õʇÇr£œ4+Öùlp4^KŒÐP;G¹”u3xª««áî«/‡¨#ó›¦\õ“8+Ф·ï䧵twf¯‹ P§5,ŠÎ8z‡šë1Y?ñè|Ûþq®]v[µ‹ô ÕrâÂÐ{+5¥*ÑMâZŽ«¬Èš;¹q>bwKªjþÍæ•]è’¨²ˆ7ÊßI‹xÞ†Lyá7Þ0̦Zá‰bÙdIi/õòkÝÃÓ{ç;Óªi‹›x¡Ql׈wÙkL‹úwú1†ƒßuŒÞAI
Þ¼9Åýzâ!$!ñ%a7½Ë”êâr%=ìýN„=ÝñD>ž÷WÓÌt„{Æ+7îž0PÖ«¿/×û)ú¥‰ÄtÁ +4s½4D[IÌcO‘2OQKPÀG—‹Ì7|¨±û¬.¿¹ñ;OÒJnmãþóŠL-o%²¦_Å%Ü],јÐÆ™ØO&ôdžR©Öo„²µ-ô/^"AÜS‚¸œ‚Ìõ¢ÞϺ
íBÇÝ%Å|^Fßöÿ˜çx´_
Ãp|D± +r«v†ÿ:ä¯eçL8.MÓ"ÍbG2Gd2[w6Ð{äç£åÏKÎɨÉóvYüê±Fëf&ožÄ>|i´3‚hñjH&÷öÚD!+¸á ¶g™›Çd|³Òf)ñ1—‰ø·)wUº”¤ã|ögàżdåCáúàj~O î89楿£axª9ÑW_‹,¾—ä’݉/=w„±aµsÌùd1«¥0£·™–œ›Æ¿›C!’"‚jKõÓMê^ŸÄ#ðuƒÖoš@º>q5)Õç +ã=Ñ_ïkFl[Ž†òÎ/0¥%_)Ú
® L~„ð;™Ó$Ênûf˜÷óÊ’¿Pxzô}2ý:ŒÿP37¯7Ë1!|D>… ÷“‚¹J÷béíÂZ\^¦Æ[µõ½qq&ƒñ‰?†…ù$§ïQ¾š¼™6ô£ìö½µéQIÞ¯ñ9ˆ‰¶$™|Èì鉵zPsUÿ·§’7=“ ¢JRZÃoYá7¾á +âRù!›yÙVüÞh¸ùÙÚ‰ö{_HïEZéÞšT0ÎÀâ¹úò¦úœ\ñòÉ—mcù[”T”Ž(*mNµÄ4OÙů˜zýèõáVwí‰+Éî©)é¦mLÉÚÃ#Wݧjº‘™?FÍÎdî§x +Ò¸3}…Q©EªÎ®=!…N÷µLõitOñ¥•õA}¿w™âBþjbªÌc#M!ª2%Vwz èP£‡3矅ç2!ﶵÌw¿¸zOÛMŒ‰î¡Dó/œVíÁËôxƒ +ÂÖU’¹)–ƒ;ìJ°›„ÔP·«?ÿ‘ʾú·#ß ]eƒ=€ìƒÈ¢[7)0êï&L‹GTAZèwç®@6²~_y]–ÁUVúͺç.á|mÀ'6©Ê…-ªJ(|ƒ¨ +¹[<äx@–1¬ÀB»_îû¸÷á }'|N iÆÙ^ŸµL®)ôõgûë`È…ië+tià:{ËB+ÊlOI¶ÑªÔV9ZF‚Y$³€e{Bq ŸìÞ‘ÆO’T½\xM#-éì¡Š\W
!7ÿÙÉZC'³Ï‹§ƒ’:Ã>m|mfÀ7ylÄÐs9”“„vo@]a®;‹ð5_AÓMÞ²ÃoÍYÈš¶?¡ä8Ì‘“á,˜A1ŠìK*¤1}‚‚»aƒ¿¦14ê‹—QÏ´Py×pÄ}¦i†5L÷)OeEåV¬Ž&xÑ%Žt±Pàˆlm˜™qF°Çžð㹟ð ²%ꊦ— ¼9gúú‹Œ-D‰oÍ,Ž@ ÊÐ+D3N‰ŒOTÔ¤T:Föi^½-håôÁíÞ9 1Ž¨<³…‹ÉoóŸéó?¬áí›r +ÅŽ9´.F§!YkeI;-Ò@¢žfÛ匥ÕàxÛ:gÅÌÑßXö[²årèÇ+UÊq零<"¹{âx€ôV{Þß²pf+åÊ“wÎmµ*† ëõx‡Ì¼Yæ'²¤_¦,'”‘g£Ê.Äap•E=Î +endstream +endobj +426 0 obj << /Type /Font /Subtype /Type1 -/Encoding 1161 0 R -/BaseFont /Helvetica +/Encoding 1958 0 R +/FirstChar 28 +/LastChar 121 +/Widths 1966 0 R +/BaseFont /IZDLIE+SFSS1000 +/FontDescriptor 424 0 R >> endobj -373 0 obj << +424 0 obj << +/Ascent 722 +/CapHeight 694 +/Descent -194 +/FontName /IZDLIE+SFSS1000 +/ItalicAngle 0 +/StemV 50 +/XHeight 444 +/FontBBox [-201 -321 1483 901] +/Flags 4 +/CharSet (/fi/B/G/R/a/b/c/d/e/f/g/i/k/l/m/n/o/p/r/s/t/u/v/w/x/y) +/FontFile 425 0 R +>> endobj +1966 0 obj +[536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 666 0 0 0 0 666 0 0 0 0 0 0 0 0 0 0 646 0 0 0 0 0 0 0 0 0 0 0 0 0 0 480 517 444 517 444 305 500 0 239 0 489 239 794 517 500 517 0 342 383 361 517 461 683 461 461 ] +endobj +414 0 obj << +/Length1 1626 +/Length2 14192 +/Length3 532 +/Length 15062 +/Filter /FlateDecode +>> +stream +xÚíwePeÝ’%îNávÑÂpwww¿8ww)¤pww‡Â)ÜÐ*܆ï{Ýý:Þôü™î_s#nÄÙ™;W®Ì•{Ç9”¤JªÂfö&@ {#3@ÁÊÎÄÕYÅÞNÁž[ŽAhfø°³#PRŠ:]¬ìAbÆ.@€&Ð 4°²X¸¹¹(¢öžNV–. +³2‚œ4 +jì{üÓ"6¹+^jC›¦xÞÚ<Ž^weh÷Fz±m?÷¤ +]öæóÏ +°‰ZÀn$ +K›vïøm&Ƶ1˜¢ó±ý§Ÿ`‰rßñzèqõF§·„¸õV¥~×ó»¥åîQ¨Ab$£Pó´ÆÂ÷0
ÿÊÛì…|åAªêÿ)ì$Ê7¤œSoÓ†ˆÕ#]¾žá©0øÊ$FÕ¼bf•Ž•qúÈÿ´[…J“ÝyÑÕkÚÓª‹eXþ3w.&ÓÁÞ¼dy +K]OSÛšÆ{͆pi»:õ | +ÎJ<èw/éô©Ï•“Ë׶IßÌ Êº«4‡àî!ÌÎq7rÊl"S½Óïb¤î_e¬¶¤H„f ü¤ÈúP–“·e’lÂâ2ê¹ +Wí2ný +‚Ïá;IjEŒ¢Aàû\³˜‡IHL™»]¿EÉzUBÑJ¦[‚‘¸LDxɈ¯äǤ—^@*a›Â%ë+¤]‹Ûd,âšêðd|ïÝ"àÕ.&nPB,~\ÍLYQqåÈŸwbJÛw¸Ák5‡'r¦ˆŽ-%n‡÷ðUûE×g6ß~F?¬X *'×s{aF{£›=¤Q›0HÔ×é&•W½®ÀÉ^Ø ƒ +›!™nÔ”ÜKbF¾F–W “&á%lWQy(~›[bhNç'£ù"3š†ænm|Kp×qñÎŽBÙ'X‹ƒÉbñæ!:ˆÑ|Úáyáââ–ËŸ0qNtXÏ£¬"¥®±ñxÝIJ„âxi:ÐtÄÙA[À([š@ÞÓmL89o]~ ö2•ãâW<Ž?$ML°o9²Û05‡Ù2U#¶<É‚¢1ѶÅAß4kK„RÔ¿°;Å"¨%åšc×èìòOèàëKz„Tăqmz‘Òhµ—$ï€ ’›ò4ætÂÊ{Hy¥–Z»¼On†½Ù›„û´¸…øÜu¥|ÕÆ(òÒ(a©5ÏñËã– +,JË‘±OšA»T‡uâr€ ‚É!aÝé@iõsQÑåîtYv“–&ê®Á±s÷¶\þ@ÄWÒ+lªÖæôàÊw$¾P%䤘(ðZ仑CïÆœ9–à…\È“y½${hJ³~î-J»´39=„Ï&ìÉäÕ£æA‰.»cêŽ Ó•Ã¥ì`©)>’¯¦\’ëFбfJ†â`PÖ]L O>–“Û‘tàÍ‚8#¼o 92j”…MBTD^Ê[yÍ…B1² i”#O¼ˆÉÖ¡cD¦ÁFÙ;C:êU§ˆ/Û$±8‡‚&‹ã†~»ÜÔ;çTÞM”z¬[¿…kznC•0å×J’F=8èîY¤ª{Ãâ7ñÂ*›Ïîøæà³N¶‹äí¿î«;#Û=ã-ͳ±p)ÚY¸Í—’³ì¤Ñ¾%‹‘uÍ7C•(”éšt‘ ›²‰)x¹Ñ.àˆ¹H¯¨´h$Jáùu롦®’REžtf:Ó˜»!뾿Æ\9²òò.NÜVVJ®ééì¿PÏvFû®€!úæ,V«DÓüØz ‚»Í ̢ͷqƒè&¨áñ€…®eðܶߛ¡>ÇNÁQ'=¨…½-·gwõ»ð-¸1G_ýJêg¦]’²æDšÀ„oB0HÍQÔà}€ª*Õç|4Í×%D 2ÛÉÈV¼`Œv1Œ Ñ™‡õ´¼ À´ç¡‡òŒ…"’9RÓÜ!“Ëøò{L)|eSìéܼBB#2uÉúèZA¾ñ`ÅÑ%Aç[,qŽàõØi6=QÈÊ0Ï&Jj6BÒ©š•gõ”¡†AÌå{ۂʾ:ìyY +ÑçO'J0QDkÓt!U‡0RùsÅ9¶jÙÐÁ´VÂÚ†pOg¾D׊°êýŽÏÐÄ” ’Ä\ 4IƒÏô‡JRá¡1.·c¶R´î(’3ÛŽ$»à‚'I¹U–dDZ*™BwâQšŸ³@YeÚ©”½z£o1³v!yô=“*΂¶•WåN=Ü}s³C“Èó ß1stôW^X1¡œ¼2ìw»ËbJ[ŵCÂK1&zÏ3`e½°mI)3[ qV»·¹É¡¬Öòi`5L°Û '§¬½öï”Ìñ]ªá÷ðŠ¼ +°aRlW[¯Ð⨠Á£%ƒ!-fÜ7æîo®ÅY—EÝ“@ºž»ú³ªóÞ„ÓW¥#w¶@“UÓH°_xbf®qƒ-¸„A€[ŸóëUÌûÚñØM6çš4Pd…ñQ~mƒ >€sSXËÌ¿›“4g îGD)~‚¶:"?HûÂýG¦äÐCû!§{Ñã}+°Mz£ÌBÀ™*
ž‰Ç©Çð —9DuÚäq8²ú½î@äÒóAÿªPÈ +ñK,‡…•CC¿èX˜Ã†bà%Û»--‹ ½ê¯ðˆì©Þ‡ë׋ +8øìa•2Ah:þjïÏH¥‹’}b{)ì¢M(åšIÊ)Ôtä/_)Œ–ó7˜ûÒbÑwex?cw“žn¬M8 +áL`ã±ÑhEò&ƒ.¯†Xž½ú‘H«µk8Ÿ¬ß}Ø’ûÁˆDBN¯ôº?‚,
,4‹Ô~vÁìd𺈴0¾ [³’
¼LxÉVñ³íR-¬À‘qŽð8jdLŸ¡aàòI¬® +Š?J)áuu¡ðÛAðÚ(7¹?)ì›ÆCqòà"À¾€q„=a£¹VU«áwmíÂÖe«7ôÇ!($¾$Úe‰+ÃÌJ8§œÊët« ²Ë3ðÎÁÛù¯šoõ{’iÒ¶[š˜»e¶=âÕL‡s2qãFƒ;˜`Õ—
5ýœ‚0q\Z2–‰¹edp—I;#‚,e¦Oc'I›>RtW¥¶é¦¹Õ‘=‹XsÂmð\•£ü£èÉ„PgLw`?=5±ÁŽËÈÑô1—{yÆíâñÉO¡ÎMf¹&ÖÑŸ#99±UŸ—á„qYê´W@ñþM¤ü™fì˜Á6Šrz¨žäG¸úk€$¯;lhý«Ò\•¸è»Ü—ûDKpø›štA
È×yL¼¶Ð}a·äkQuþŸ?øUºTWìàQªOþ°z„ü–ðÂJ+s;Ãm1Xž¦´p¯h—š4ÂÔêR»V¶ï¶B°ˆÕ™6A_|ÈÌöØ,x,%¤>{Árchâ”à¸Úûý€ÜÅêš—e ½Ànó¢ñ.UE£3 »âó¹ßµ\kŸïÎO&>G™6@Üsí3q8á«ŽûÍ«åÉ ˜1™p¦ãYcìí¾Ö´;
fÏ b*´‡=©¡äžK•)ÿ"zï".Íêúl84«–ç«ÏžI„ÝóÞ"€em¸].>»”Â9ÙDxWŒÏƒ¢üT‚t•Ô…P…)bŠR`J¬ÇA°Ç¡,ÑßìajÇNŽ²'håt¼V{Î)ÖÁdÊÄ"Ø-\jî´hñxÍøÄC䀦JÜR:ÃïQjÚrö*'6Ú[<Ú‘ýyàEv(ÐëÀÌO;°£ü˜`Øf*\IõYòÑÒUŒäèÓg×ëÄhÀñIO@m1s¹><Ƭ\ìȯªz~¢‚ÏG*®³¹¡~k=–“®°'É•¢Üy/!‡ ~~±Iá +¡Ê¯É +²‰Á,Ï<Á%,™ÖŒlàí…6HÞ:ÂQ¡Á0öW,n€Õ™tø´"2ÀÚé_¦á€i‹N‰e`ñ¤.e ¢ÍPÓÇÞÆÑ$po¤|{¶ <†¬™‘§¾= +V¾ƒê¾j™zTl¾sßÕùD¸ýѬ•úéX¡o_¦<ÙiüO²j¥'Ÿ¸Ä`£NŒ7ÑJi¾Ö¢ÊƒxmEÈtaæÉ°îû}=èdâ"cõºêÛYS²æ—𕱷u§!IÇê
+J¹Qˆï +p¾j‘&Žo +`ò‹>K"÷ +‹™:V£‹°úD$lKa×´–ÀóÖ;—Ó‘®-ÔŸŸÌ™Bþ—ûP…œýXH>^AúpÝñŒó:wìñd×G÷ð l¯ >Ýs¯V:¼`Wl¹b”SSc7e›ìMœ´Æ`îå +ŒÝÀZ +˜³ËeT×Õó¢’CÂfIªø¬-tqéúRRN&¢sŽ8«ô®ÿ«Ç:ÄAÖ陃Uw±*?z&pnãè{±Ï=$mB˜±î/û™˜'Ógü £L‡z9êeD|!²dòÊ@Ë´\›6 ëõªœJ· 2Ý5-žÅ71Ps†~ëjýÍåÝæû†A¯ —Ð÷Ì_7ökï‹;>*í‘JçtHOm©NS +e/,]É᫹EQAž¸#KNvd2éj÷ ÆK¤°I¡YºiôÂû(Bc*„qI¬ò
‹_°Ùm )/2£ðýÙytS×@| +Èz×2-’LØŸ/¿iÒXq…s!Ìiݵ‡K)N›w§™Cž+öŸ[ôº›V›¾¹´Œ¦(82©µ…˹u?›&
㜫0•2í!›å”ù˜·ævÈõ®M‰€D{c/M(º*“Å®·±K®Ü{˜Û4¡ÙkÞFP„"N?«@S ÑÍݸXÅ÷`%xÖ)ÒÉòÆ]t[™QÍp‘³ÕU¬ +ó§b“!]Žcè÷C¡±ìÒ¶~›j_Óú%Ý
ïÂ"ñ92†‰Îo3,NŠ)OË·Ä»ÌPsØì
B¦ö5Žµž¬±;sK%éOرÆZc£]ZX8kõÁÒsYãcüë¤Y¨üÍ7ÕUtáb–íôå%‚J%Îbõä&,¦µJ`"ÖöŸG§¦êëãUÍ÷cAvÙùöÔ‘çÝ~9k¦gEäQ=ø9ïõ"\5Úª +«)]Hš10#°
‰éˆPý”¾ïÛñ¿êá®#, +ò¿·™RAŠ»‚<y,EÅÚáFÿ¤T;”šÖÁàÂÕWDåþªüAýô¸§ñsŠ>I(«ÑËê=ˆ[½¿¦÷(όږq†ŠÜŒrfSÝpxõ–Q +ç%€†ŸDø¸¾ž?jæYsÀy_½þ +Æê— xAººBPé'¢…>‰×:V¶¤…˳»S=H¦’(á¤×2„êb=;¤)a²—™üýæRU(©—–þ¯€Y,â°Ä_b 4sÕ9§M¯ãú«™Ñž#ÔQ¿wWnÇu‰÷éÜ«Qf +B¨ŸOç&<Ái—wà?1nˆ%/Õ1G +æ‰íHšÓ¢¢¬Ð +Q:ÀÀžå½ËÏH¼ä¸0Ï%5.9v¹)Ùþ¸×æ0JèÍM“Óüò1#ÆM[øê`¬—Úq±ÌNú%ƒBã%!y…êqÔ“ù~²¹8T`;éªc µˆù'd:ÄÀ¼IY¢XMÓ´‰}c4¼‰nQĬ¹Ø+Þé•Ä¦Ëg\í N¿ùùØö8,Oš–Ùeár·ò |ƒ7É)ÎýKlP6·µuDåÚR¬ÜåKX¼]VÆ.A~EŠäax ÛTç,Êvd¬»î¥PÈÔÍ[r§þ´ŽM韄¥ª?‹ß…]k–•°j±ªø0:dœ2šœæ~!SÍ
Ed³‹cg4ºzÃ6 tçÑ+Â-úÆ)Ò¯ZÜWb!TѿƪtÃ1©Îû5éÿ¯Âtî“Ãúx0Åu„+ +iåô„ÚL³ê=”"ÉŸe§¬<»o<‹-ÚÝD‚~y4FÌyÙ¢íàÖuÅìÝÐá>°ÍhååÄ#_²È"íõä¡Ì®¦KEÌ. »¯C ÙHúÇ@›7ÁZW@¹ ¶ÙRSxLù9ÁCÇ,sPm.Ïü€·¼C#÷nÚ95h¦Ø”ò`ÖÏ;ãÔžÑعAêâôuuµÖ1¿`~N6€bócëMF¡„Fï ²a\ý“ˆŒé áå™RÙž…Tþ#!¯øJ,ÖÚÿ›-…J…Lk‡BÛûc‰!·ò÷ÚoE%ØXÿß6ÉÊ<Å°Ž +•ŽëÈ×C,»§jåǹ'Ê?7ñ]’„xÉZ#|SÌ6ºz*íók0h™¡$6åÌtðy¨"G.ôøÙÏ›‘;/²S0!gõ2œÝŽ¦ú¡8ŒÖró"~?û˱H¬ç_ð8#`?¸Ä"(€ùdÑB‡ÕßpÒ}‚Dÿ¦€#W.|ïU½7o<¤Ÿsh|Gö®—J€ŠmµQZ›c¹ø•láž.ëc./™ÄçV72lÈÆ–õ–¯úAyókÙ—£XKþ2}ʇôö1e‰³ÚI:“1¥ÈªÜ£x+ÉŠGÄ°ÙÓàÌ·î ¿®æùÓNLBìòêNRå?*Ž:¨0ê_Éø‡FŠ¾r|Ç|CrŽl¯vàûbnøm[ž]‹¨Ô×ÝŽÒ¶97£ +H¡à‰Zšý…µžŸ!Gä©Áü+p4B¯¬ G(IJzÎ
ü´oãD'‘½äiüÇôì;×x±cN‘b¦¡÷"X·;òÁÞcT—dÿ|¢@\õà {u°$õ{ˆ‡-Í·+¶Œá·DÕ\ï¬Wá«mhÍ‚öû.ëßð†<}‹¿)êýŬýñeâö'”ί^èË^ü\Jíj|˜¸r° +°Ž7‡?^r@ \Ìz¶7÷¾çìóIiØzáì$Çï=t"Ž¾Giî&‡~/ço’JÏÅ$ÜL“íðX£Ÿ§«fåú¢}E-RäÓÛ,GÛqøÐáá @êÅs®Ý§—4ô9ÿxŽµÉ‰†+ä¡¢€Éô'ÊÜÀ@AĸIÆI1Œoí#[‡?¡ÏcBB]qŠo‰Énbn™ZÅãzshâ 6e¶Ÿ6&ÙBÆ +‚Å¢ýo…Ÿ\ôBãúLØŒ*˦԰~4"²DZ¸_¤U“ß ï0to,ò…:?¼k3œ NÆÄß#¸àtýx1ýÖJÊ
£'u0ÈBÅfÿb-ɹE—Þ,³àÜËzäóIˆí››M¸i2í +-
LÒþY°Ók\A8Ì‘1^d?i +ø•œsKñ½[òÒ¯rª´¸šeç¼AœÉ‹ÑLPd™h‹ÏQ>ºÛ”‚¡ôé™Üè}UCû,ÖkT:ähÆ +"÷‘™_GN¾¿²‡@™ÉšãRbpĸ©Ù¥¿Vß
ßñ³TM7¬×ÏËáèðëeóÙ>·c\Z²÷¸ñO‡§o+é_}÷óÜXó¨À{'@ÄK·š’Çü³m’A¨I
Fvcâ—È}Tûþv”( DÑsĶs¯åW¤Sñ& 7Â2´0QQp Î_~ò#WÑ„kÄ's +Š¥mM,¤1Zݪ•›ûøíÄcðL¥™XÉÕŠ÷«€°:i4;ž>.M[ÍúJåÞðO¸sPý‘çóË‹>Aª"áõøÏŠÐÆ1%Ç™ßqíÐÃA„Yé8¿Q6hÓxìdÃ)£SŠâ?…m‘óýv·TÎŒ9
GËô>sEö; 0¦žTp¼îô¥<MR¡û|$J•(àïç¼MWùÇqU²â;¨e¾,Q÷wÈy°Õ‰ +u<ÄÊ”*Üõ¾ú¾‰sp»÷Àë¥rï(ú|%ñ"hÅ…¨“$ +E¦ˆc[¿ò²çFõÍèi”°ˆÒØäz13•ñBPWT*Vf°||ÝbäÚëãei÷>þívÏiž;•}§Í*ê±w7’g¦*k'"ˆ¿ûCîÏ.‰Šx³¢³°o°LžÑ{¶ûlŸ¾4œãg¤ywŽ}zAÝ¿wpöÌV/ãƒ\ü6¶ÀÚÂGQ÷^ºÍãm'™JZ§p‘àtQp5ºÀw4[=Úæ\ð8Ǹ–‘x‡–:.,’¬iÆí£¡'õ©ºD(Îò·|‡‚zC¯£À¨äÖ „VÃSÙ"¾†–+”;,xû#"ßfÃIüÜ)Ñ>&Â*´è¿|§F-Pá3æÅÛ„ŠDÿ"î¤# DÇéž¾SòðƒŸh…J=Œ a§Ý‚×±ÁkâÙËJ?^‰JNnDX
Á[Qì•¥s7CÒɧ§;oŒ]k›þA”‡:[Ølf +ÛÕ&fÒïÞ/5ŸÕ‰ðP’'þ¡ÁŠ¼˜qOkÂS䛕òãʪ)zΨuO-û)}ý)vH9F5£é¢wûT¿w.RÛ—í4+;ž. ðQ ñ
ûÐïüà#¥}ŸÍQ“·ÃÔø0‰}ÊäùêÁªÍËâçWŽ
ª÷:‹¦Üp“ðpê=ú
R†5UÍлÁ™bJÍ×ņNÞÓIÚù„£7äµD«{øù¦’Ú‰\aTGï4 ¨§Þ° +Ò¹üÈPrRÌÜo91àš,cí¤…ùðˆó’^¾Uµ>A[>Zg÷@Ý@ŸëEC.7‰þÝe6†‡#HCîŒ#©°‚ã‡9/ù/ð³‚}O·qÃüæNR$ÃÞzv‡¦±ìFÀÔ¼ýŸIúdŠíë‚\’oÆ¿+ð¦¦\2¶¿¼7«0Q2+“³EÁzI=„lçŸMèºë +í +êp-¬ÄÝöÑ+tm!"ï7<8›Z–êF= ïÃùz·}(QQ(m”©E‚z1ÅݘPÌ·®ô5. +?QDÕ™¸œ·ž˜8›Oƒœ•oSE°‡rôp‘<Ì©*£¿¢ÈÅÓdiUz›ãBé†f^ӺǨ¿#ú Ø"þ7OeðqÛÙTG=%Ögø1TÇ廆‰¥=ÇÁ”øBì¶æÊRéefÅÉ-÷‡kJ~Ý.$&åø¾aÒ±$–çÓ£þó2xoÞù®$µèç”Újä”cŒ3ZжÏkˆ©bXAUï{kE©¯½œNP¨xhÊ>y,îåK0kùâÒ.5Á.$ÕkYb¸×‹r(…ØŸxl)ªbÜû®šTˆOFnMWVâôQø£yʬN)Œ€Xù@µ‡õ×ÒïÊö×4š#—J¨ÈN]8úo‘â!U¢%"ß] µô|þøÅ|r~?fzLË£7ÇñVŸ);óscËâ*šÔRâƒ9à=ðþ^ú°Õum¯‰½q‰HàFB½o×[Îi†sDŠ=ó ê«ïÀ˵%I×_ çR +å½\ÓksfÀåCðÚpé¼Ñ¯0`1ZÔ +Ñ®J†ã›ˆ%ä-“cÕÕNÅk4òJ^wÜö9jírtÔ&t„¼Ó\}z(í6ŲÏÄê×ÉVhQÏ:Ê^…Æ÷n¿¤ù’Þ Y•=æf9Þ‚Pmrè¸+6è1µýVØ·£±:HNBõ©7¯°rɆrXdüÀ³A¨2ÎÊÇþóÌ÷" +ØØ×9Š6I½Ã¡Ó:È?T}q£q`äÚ*4F,û\Ö[Ü@Щ»%s@vDîËÓãï¸ä³™µa¬6ôS"`×Ã.þüÌ—To³E?"ÁæOê)öÁÓÈË
¬E\Zyµ¥[tH +ÆaÕë%mâ¼»UÈŸ%ñ?uƒòZ°˜Êƒb•ø™4ÇêѹgŽå'ã$Ûr!Љ çÕ ntzßù{¤ÓWGÕE¤-’OI^Z#<qÏbïz»(¦0ývS[Ž§Â‘ÊíMºß½Þ0}%œ ÒãÅ’Ætz²›ÍöÛ ä¥€' è
¡ +&ÖîìPÒ BaãwæÛ>?§~õ?åõ*I&M‹GŠ›ÌGsÞ}|b×$¡]›f*ÜxÝm•‘èªÀî>Rw6¼ˆüi½ZŒÀ"ݿǶVÝ`Vq£ø¤ˆé&)#ó©eÆÖñMLëSgq`Ï”–61c¿ +:B™[¶RÖacgé¶yÕC×BÂÌgœ©@íŒzÈäm;¹Ìf"Q…ÔÒ`ù‡°nzÒwo\FY!õ|[ +!ù´ +tr@Å·h“Ž‚¡j–<ï2éÒ!†@€Þo‡c™2 EVžg…Èdâíò·5’Š#¥X9B:6úãßtW}LÄÁdª%¦É,1²ÃR¬5fö$d—tu‰m¸¦”öÈfƒÍÒKa˜MÔK|á?¸ùÏߌ²$¸$~2P²|ÕígªxLrÛ_ã¯qõÓÒZ½EÙc ƒCDº<¿H.û¯r\*(kOŒiú c>¸~¿-.uxZr½8îô42ñFèÖDâÜK±~u'm²HÇD¬Zù–6TÇ€g…cƒ÷»‰Ì +‚MCÁÙ[št¯gת—\ +OJ×±–¬•
-
ºCöÂW—š‰‘®
jÒ¿J’:xM‹ïJw¬K^GYñAg¸ãÇiDÇ1+Ž…|ÄRb‰øµÇN•óšï¬Ð0_ú½b?aO'žä]y׼̢Aä|iüô7ø‹è¾V¢¬¡Äâ=‡ÑQ›a/àkn)oÍ6ç3§#QÊ%•àjDÁëãzž½ŸmN©o!Wf{$E{š†—„²©¢˜žÍf·žIP~æuYJ¼¤Lü¥éÎ6ÌaX|Šé1ôÌüó| · +Ãì§P£Oî)ŸR0Ë1ö¡ùûX Ã6ëje8FǼGæ« ì€ ìž¨K“R‡†Ãªî’j*òØé»>×1\¿Öh9l±-ü¡M9Äè®Ñ$&㨧È1ÊÓH”¤9ôL|ãVõ~ŽqèÜÎ9Ô
F1|ìÃÈÜŠ³Áˆ´ŒæjuR•G‘°'i¾¸÷²†™Jáâ3È&…qÃPíwg™{ulSÄ~ί£rëÚ0ßæÄI1râv[oÖ¿ö¤u
Ùvmÿs’ÛÚþî j¡ãæ«@»h]½%öL™¬qû"?'½ä+ŒÚ°>ݵ°í?º©Š;éí+ž$7øºù×, +_h³O¯T.†ÉìþŒ
:V +{~@_¾KLÏéÛâ3"·àÛJ)[¡AŸúÄ—f-‰ãVJŸAî]»S–ZÈçÎle +m0ÏJœ¶¡±ƒËìœÑJ¤fMŠŽ2TbNç‹Aæ¯Ø?‰ïidó8Mé¤, =ý_ÍaâiîºýŸ×î'pm7x䲕@˜ÝÉ{ÕÃ#ž°óE¤»ÆHè6ï]é?Á
í¢'4cëäÊ‚k¤¸ÇÔÌ%õÇpj
ŽAˆ‘iýº² +}Üw✜°¸k™'b¸D¶£ËUš9A.9OE–C¬JsGå)RêG99@´ŒMË6PWj Î/'Âö{ƒwTœÐlemfÒK–¦šïÁ +endstream +endobj +415 0 obj << /Type /Font /Subtype /Type1 -/Encoding 1161 0 R -/BaseFont /Times-Bold +/Encoding 1952 0 R +/FirstChar 2 +/LastChar 150 +/Widths 1967 0 R +/BaseFont /HJCFNW+NimbusRomNo9L-Medi +/FontDescriptor 413 0 R >> endobj -370 0 obj << -/Length1 916 -/Length2 1345 +413 0 obj << +/Ascent 690 +/CapHeight 690 +/Descent -209 +/FontName /HJCFNW+NimbusRomNo9L-Medi +/ItalicAngle 0 +/StemV 140 +/XHeight 461 +/FontBBox [-168 -341 1000 960] +/Flags 4 +/CharSet (/fi/comma/period/zero/one/two/three/four/five/six/seven/eight/nine/question/A/C/D/E/F/H/I/L/M/O/P/R/S/T/U/W/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/r/s/t/u/v/w/x/y/endash) +/FontFile 414 0 R +>> endobj +1967 0 obj +[556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 250 0 250 0 500 500 500 500 500 500 500 500 500 500 0 0 0 0 0 500 0 722 0 722 722 667 611 0 778 389 0 0 667 944 0 778 611 0 722 556 667 722 0 1000 0 0 0 0 0 0 0 0 0 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 0 444 389 333 556 500 722 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 ] +endobj +411 0 obj << +/Length1 1006 +/Length2 2590 /Length3 532 -/Length 1991 +/Length 3289 /Filter /FlateDecode >> stream -xÚíRkXgE[¹DPD1" A)IŒH5Q@ ‚‚xk‡™I2’Lb2DäV¬`$,EJUÄpQ«k¥Ü* "wÜ䢱‚+bA,V"7q¬µkîþÚ§3æ}ÏùÞïÌ9¯
7؉ˆÃQo1N84püƒÃ@ -=@LÞ…’Jþ¢>î- - Ñäø)—þ‚C"L¨ü!Iä*üÅ*Å?¤†¢oÅù£&}ˆúƒÙ8_ˆNà -Ã…ùÀdÞ˜E¸ -`ƒÆ`€$‘|ß}íúà²õ8,F0œ83WT -))䑈GP€*HÅt.&È# -„(=èGd衆œñ⦨+ý)~^Çyú£ãoö ¾7_Þßîüðö€æ¢ßÂ.Î#ª¾:¹y(Ð -4m þ®m«.çµÂ#ÖëLÑØÖ†ÇÐ%sÏç'·m|yÁСÉ( ϶èRÎö:£ aKþ -Ô -ºÎcßo…럆òV6Xžß© Êì¥Ç-:Ó¤µ2ƒ@×
ãfTV¸$Aí«óW6a÷ë&Š}§Ã÷_D¯7í¶¿òTšÒjÊó8ÞE‹3?Å›víik/Lú(®éŠšá?ßz•F±¯)[pÃlwÕ£4Â%(žçeÒ‘þ}æIq^QCNk¬íØ‚ÂN7¯úú -ëÔÀnç4ÃFc;Ûu.?SiK×'ž³ÏÙ¢µívŒ6)»ûlÝÍ«?µ‡.mð3üMø’õ«Åˆ3áµßrϱ'6«ÐKÙ çx+uá>™Cxv‡6K½|Ö‰Á “¾†YÏøîý!nüÆùPþð1 +xÚíTy<T{'Ê–1ä)ÛÌ`¬—ȾF¡‹ÆÌÁdfa$Kx¯uB7[–ÈZÙJÆ*K–¸T¶Be¯DDDé=uïí¾·÷Ï÷ýëý¼çüsžï÷û{žïyžçy{ŒŠžâ šQÈt”*J0¶Å¸ +‰Àñ¯'hÀqR@¼*? +à 8:à zÈüˆ¯Ž,É^@ëwÏðû“ + +©ŠD¢ !tÿùäöC1S2Ž‚'½5´&€¥R±AüÐAF2d rŒP%SèÐ +UôþºëP±¿šh +Qµf§»,4´6ˆ¢DŽ<1Nüx…ÏîáŽ85[Fõ‡ÔZŸo°é·ûÌ&ÃI;÷eŸsp«ágÚmí`Ý›oóÓX>÷®nªyþ<NÿW/T˜hPÁTàA¬ünZ˜QÙoŠM³ +bÝãœØg{<gO•EúÍpJLrÉßà.*¹gkÜ|y¾Ü~§âûßହ”[MgÅ’‹Ýý3丌ò;ï‡DòúçpvëÒ•m4¤vT+îô^xˆ|š’ýx͹ZñÅÕÒ癫sõÌ1Öü…îu6È0Ží¬Òdm¦ ¾þà|×%äÃZtï‘\NBÔÏØ(ùx„2ÛÚ¢œÅÞùڒê£(a7'™LÔ1ÐÆŸ´¹‰k?ót-‹rêYJÁÞÉ*æ¬û†eåîK/FûN‰I¢ª~Ù?lȽ:¨VسîƒÓáâlß°ÚXÓ/«ÅÃ{.ÆìÚ¸S·¨NöäwŸ{›õ¡Ì,z¡ïÌíWAÃ]¤Üú£uÁ’Pf3ú|…,š0Òw3²B;pBéÅzÞs¿¥O +øUÉXŸõ‚ö|= ½{N&Z‚S×=«ž–\'ÐRo`⻬•Dàò×]áËN]—47ŠJÞ"e*ßS|6z!ýþBéÚw‹=†8R ÏÌ8ÝÀmöé×Sc +5ÐOªºL€G’â»ÅH3²DàM¨(¦H^†–lµ¼”ƒÃ‹#±¤Æ«$í¡!»E„g+¢dã$ÃB!C+*(Þ¢A2×W–7¦*§-
EœÖMë +ãœCŠq_äT™S¨ñŠ¨Ý~õö®˜í±ƒÌŸ¨ˆ2aAD™kÌÚ3K<³¯Ÿ#Dkë…¼dãÑX +O<3]·z~g°ž¾üú^‹gzLÛ2öhºq‡Ôºu²HŒ(†ëv+ÚðèÏ©1§¢ZÞÙ´ºÞ%*Å´®Iš•ÇÜNäHê}”Ï×:ôe%kÅÃn’š¶WK•)ÿËRí®´¬nCc¹î +Ÿàâ}›ÀÞP>E÷ɽK¥ ÷ŽkÕEÞÇx°?÷›“6
r´|rt%ÚN"'F3›tŒÍãdk±LwÕ‚£HPðÁÚ›·®h0¹ƒ
ŠC<&l9#à +ÙuÞŠ«¬ñ™ø&|ï²xÖk“á³å—žûY©_'‡û¶U>ÔNâM—6æ™÷sJÐá6x•È|ÙAùðÔ¤uÃ2ípŸÒõ ½»¼zgÖ é‘>¤áPÞ¤;Ò\5
U9ï”Ì“?¦1õƒ5§T5’‰óGiÅ:£#O‚nl¥Î&_X¯²qÉß38ø6C-ÆÜ&¶XÑ%[Æ“›ù^^Z¾n“ßES5ìrÙù¶FbŸK»v[„S}nºÂ6Ÿk CíU/ÆÖ-8üVêîÁoŒÖH¤ôÙ‰ûÜêðf°uTýê´`&¯I®+áquH^ÅdwûjLöÓ¯Þ‡ÄO¬·´†kÚi—_A×™GŒê1ªN.D¯‡¾…´æ^(Ë^,én÷ìÄŽhõ +™ƒÑêÙ(ë7ú°HKeßJStµ‘éâÁbå +endstream endobj -371 0 obj << +412 0 obj << /Type /Font /Subtype /Type1 -/Encoding 1168 0 R +/Encoding 1968 0 R /FirstChar 0 -/LastChar 105 -/Widths 1169 0 R -/BaseFont /DYYPTQ+CMSY10 -/FontDescriptor 369 0 R +/LastChar 112 +/Widths 1969 0 R +/BaseFont /ZHSJUO+CMSY10 +/FontDescriptor 410 0 R >> endobj -369 0 obj << +410 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 -/FontName /DYYPTQ+CMSY10 -/ItalicAngle -14 +/FontName /ZHSJUO+CMSY10 +/ItalicAngle -14.035 /StemV 85 /XHeight 431 /FontBBox [-29 -960 1116 775] /Flags 4 -/CharSet (/minus/periodcentered/multiply/asteriskmath/bullet/angbracketleft/angbracketright) -/FontFile 370 0 R +/CharSet (/minus/periodcentered/multiply/asteriskmath/plusminus/lessequal/greaterequal/A/M/S/angbracketleft/angbracketright/radical) +/FontFile 411 0 R >> endobj -1169 0 obj -[778 278 778 500 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 389 389 ] +1969 0 obj +[778 278 778 500 0 0 778 0 0 0 0 0 0 0 0 0 0 0 0 0 778 778 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 798 0 0 0 0 0 0 0 0 0 0 0 1201 0 0 0 0 0 606 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 389 389 0 0 0 0 0 0 833 ] endobj -1168 0 obj << +1968 0 obj << /Type /Encoding -/Differences [ 0 /minus/periodcentered/multiply/asteriskmath 4/.notdef 15/bullet 16/.notdef 104/angbracketleft/angbracketright 106/.notdef] +/Differences [ 0 /minus/periodcentered/multiply/asteriskmath 4/.notdef 6/plusminus 7/.notdef 20/lessequal/greaterequal 22/.notdef 65/A 66/.notdef 77/M 78/.notdef 83/S 84/.notdef 104/angbracketleft/angbracketright 106/.notdef 112/radical 113/.notdef] >> endobj -368 0 obj << +408 0 obj << +/Length1 1630 +/Length2 19703 +/Length3 532 +/Length 20616 +/Filter /FlateDecode +>> +stream +xÚ¬ºspfo·&vlû‰mÛ¶m[OÔ±mÛèØNǶŽÙéØÉ׿÷3gê|3ÿÌœ?vÕ¾®…kÝ«jWmrb%Uza3Gs G =3@ÁÚÞÄÍUÅÑ^Á‘[Ž^ÅÜÒ
ðWÎKN.êbn´vt3šó + RWѤ¦¥¥ûOÉ?& +³65wp5§X8º + +`al÷·gÿ’«;˜™»ØY;˜ÿåö_mÐ331ýš•µ©Ã?$°ÿ[eî`ö_+øK׿ògÔPPÒQ× ýß,Ø*ý š—ÓßÜþG5òŽfÿóðŒˆˆ£'À›ž™ƒ@ÏÂÅü÷þýMˆ›…Í÷ò_@Ìÿy–7ºX{tÿÖÍÄü¯êÿÇóŸ'ýÿ#î`êhöÏè¨ÌþNÛÿü£6usqùKò¿Àߪÿãü¯¹77÷47…]_q4å
±ÉÈÎÖcåL‰éô1ƒ„:•7©•Ô:öúgDìqW½×…24Ïð|vx-Ÿ;}ÊÐõaÚQö¦™ÿ.Ä÷%¥î/BÙ¦èâ¤= +b4(GȼЌñ¾^’Û…Ðá`Ò8ú5¥¬bPöþ`¦‹Õúú‰:€Ô½( +ó4$Ç–n–¤8T¦Ô£•œßp¬(…®Q(Àïû¦ÈÖ˜kg†äº²#uõ¼^UúÊÑÂ%)Z(4è¬}¢&~/,ŠŸ$ɆŠöÑщµ©M +ÐBQl—qÕ‚æµäda~g VÏ„¢.÷’p¿›W~þ–Ñø9ßæ’€âMÒøæ6Îuk +i½ç¿ã"œ€-Zföìûµ´ :×æäwMì—RþŠLE¹vZótmß—xýzÒc‡Ü´•5ê³s*Y)?véIF¨ÍOqùÝÈÚX¹¨V•|•ã,´grÇZ3?é÷%‰¬¥æï-³r5õ.ý{D¹“Žì»“Çø÷´—Õ¯﹆Oբܖ^7øÙ 1¬EüRxõÌ
"†0–ºê9%Lt „§´®9}Ȥ½ŠD/}„‘ÚSåF(í{9ù£”I¥'Ëkq/ñ¹iðiªrÜ9jaUaHE{+£C²êÕÀe/' ¼dÒ×ÛÖñ›¨yO7µyCÞÆúÞÅŸVÀ¦°ÎzPúCmðú(²¨…æ‰<Å)·æ¨xd°('¸Žh +©£DcYúgѽGÕ³O˜l*æ¢Ç>ïR º}qߥV‚«7÷%rà#qVyô¡ +§\Ý`'aÀJ`P3z¬oŠ"X‘”¬é´±Îò¾ƒ6Q +UžÅ•„j¥×Ê[§·žv=â§|;Ã\¶¤]H?~w˜¥' ¬ ±¶õ±k é t¢×,vo&¢ÊÁÎ’œñ½ý‘B8`Î$Lp[ iù’Í¢t<„5bV4§.½Éðàr“ÜÐO+Á>Фt’ØÑÒºdij<Éqû¦™î_½ÍpT>΂ +ˆÈùô+úV^5ÄÍ×z-ù“¤SƒËŠ™æ:8¤¶b€’ýôM~"hÍ<y1ñ›9wN÷úø1’ÄÛscÃe@0]ŸZgËDÀ’AAqÀ²½^Ó:ìiŽÔtBÃIµ1eÙfñé¹ÐØíH`®Ç%âžãʹ~ÌÌiZ`ÓºT©Íã]"ìgHëè^ [¿V«PsíDËíªc_Ö]æfã¢Çàu¯.ã8¬áyí7íe,?Ô«$m‡ïrœÉÔ5M–/´·aYYéÜqð€‡?X¹mMm´á彊sÌ,/Pz”D + >&€ÙŒ H“§²â¦ä·YñO¢©¦Öä4†µö¹£!:—†'ë'îß\=È»'3G~G ÌYÇ°z?¤,Hƒ|NZR¹’TÐðÒ£Ÿ§lx„ +è·šœ:[U_ +rAQŽ—r<ÞÓr ‡q~#žóôtÈ>è—|Õ³²` Ý·Óå i”;¼[„àY¬õ¯žn”ÈÔêÿâ:-FùÑëb• +WÑudBif
·0ë,&Ý°.XC ³½g, z€[0—Iz'y¤™æg“Qd'èjÚ#N±“îJ6?×½b®†¤2GºŽ—@ÿk#+•Ÿ‡L®ê»qöîè¹vI²üF9×xì¨Ó·ìâSlþÅóËØj]OÞ©T|@ô¢‚î9¦ B·ÎWý1hŸžDˆiÚ?™t´’¢k\ηÉÉs†Ñ|R³Óì–™ÝofXÍUñoÙf{EÓFë–öH¿Aw¸?ƒ7ûl¥·²ò?TåV¾iÐðžU#nK…of_L)¶N_%ÆZn|å‡i¤¸MÁ +Æ3È ¤5‰g(Î'f!»döQ#gtÖ´´)ù§~Óg£lØFDÛNãûUÏ(ŸÝ'OÒê圚>,a±+;Ä…`ò¼?¤ù´ŸÍiÇMÜžD>œçÆÊÃ=%]Ú-@@ä2çí¿“ì·QšXFdïC‡ŒÕl±‹Uõ ùÌ#§Ô¾¹œÙ}—ן‚n!‘4øjšŒOé¤[óFâ
n8õX¸4AÒQUtñ0œ‚¶‹/ðEÛöPøÀÎÚS·Ê&4S¶”V Ô¾%'Ëü´Zœú™úÑ¿-³FWlÚçõN¬³!Bô÷8A¡*aÃIm +ÞK¯²jå¦I»‡0^¿ËÖ«}™TÙ™Z¯gÁdõctˆãy¼;bïÔ}Ž¯ùøúܤ‘§¡‘ݺƒ6ûCšäµâÞsB¨ÅÞÃgíF1yÃÁ|.Ê"®jV†W²Q”Sî6êG’†î<#ÁÛYZð• <¸ðç6M¦=îÚ-aõ
b3Ekß +GC]8xá¼¹wz¹4_×N:ŸÍókÁ"6ùn±>=ƒßLÙVE–¨üqÿÒ‘õÁiÅL°OnJËë0I9) +ö¥(Ï&/‘Ô~Ô +ﵦ«M3çëÌ +Û¯óÒl¹»¯ w¡q£j|“%.Pp^´mòÅÀzS°Ó^KÁd¾àýØóŽ"{I8óï…·½6qć±²QB8™ }qIî×Z˜>ØOŠ$’]Jˆÿ,Rœõe<xNã-îÜÜŠôÝ»çP:ÞÌy<!Ý2O%–šjb ÃÊ«Ú2éUĆuÚ³BN×tƒÉL„¡äë%Œ‰rD|À,^9ÃÃ>HI@í)øS@–Õ3•¶í&v'„ù»7<èä[Özl2,N^·¬ôwv†õ¤Ì„Ë»§Ø:J4×ïpãüd|_õ™çÊlk¦úŒ.Ó
t K«ñè˜Ê¥;eŒ]éÔFºÔF6p9Cþ,ºÂñ~âJ%ò·oÌ•¬RŠzÃÜ›E߀C¼„(ôQÙÈÐ]ì¬FÛÂyÃBæ?88A°ÀWùïCûKFäb„j£šÝŽîžØë™sʵdH˜³ÛYs¹Ëg+ݼº!„ÚÛnÌ]ó.yÙ[&÷ÑÛÓâ!$(1MʼñÝq<ê´ÎNyüï¾rŠúüŒ†Z•Õ5 +\a¸WXw¶°oÇÙõ +»âÜKÔµŒSã‘`#™xMšgm¶j÷ﵿ¢ÁžL)ûM</6DINŒ©yV3–DŽµ3oS
„/èœ8B%¸lø½sN2q°´ºJWP r‰)0ÚæIõ¸Ôò±ûm¦Sÿ$Kš›‡e± +Â#ÓÜŒ·‡÷sj
ü[£º¦ +9”'“šHc_–ãPÅn¾÷-Q‚iýˆ½vºTÖÊl1VñÙ!dëjØØU,!ì¼"”-xÌç—@††¸eD7¯ZƒÖü6-PÊÝ5{qÆG£Ô‘ºœ4_Xí‘´þfãM-pB’µŒ„’„ÁJçÍht^v@ sE¾ÿ='ÔS¯§8„½¶‹Œ7¿5•“Cx²¥×\o~Ðx⯬÷GÛÊËE¸¥óÛ¯ÔY,Ž_Ñ澬ÁŽ-›6û_7kyŽvŠW[B/¼lîÞ%z²8z2}('n• +GÒ]j÷IÞÏ"‚Gi—¸,Ò aŸ1šm9Eûü¶&”^ïFO"´=p?yÁÝbÕdACâjx¸ú^ˆôÃøV<Z²®e˜ºA¯1åí-üëºXéÔ!‚ö{üÌXF«ûMq¥t£hÚ}ÊON!³ÍSAôú‹?G¸rgí2Àg¶«áæOÀžôK¥DÓšòȸ73oå©•¯ðpvL´xVCȨÜ@1NqÏ$ÁÝ—+ÁêJ‚‹DVKGÓ˜iîÁP:])5œ ß“èïfÚ o|Ô+ëÁüi½ÌÓWq`^L)$ì±2 “O»=ÅLy¹®/*AŸÃgwÞ8;A×Ä„&±0H™i!˜î^ÙWÝ[óû’èDe9Xyy¸ïÞ¯Î#ïHÙÚʾG†Ê™ˆÝn8³ÞK;hV¹Nt«q&]*¾âPñ&„žDzzC:AjM’ùŒžÛåÐr‘´LÕ'vœ&ooŽXUí§(›· «Z +×|»Ë©Ç+=ÅÆÝ0ãAiúÃ@ò]»Öƒöf_J ÈWàwqèÖhœØŠwÉõX_o!ÍHoo¨©z»uáý\¦76ŠrIHë›#-±±çú»•# F0Ójew;'hqh˜¸,¼õΘÄ裇qˆržöëÎ…[Jc1¶¤}Ú.t·k”Òk˜§;“ÖYD}äÏhDj+ÖUr°ð¥ø·„<iˆ™•º¦óDn짗*¸œ1æÙ%Ø+vÁwFcO¨_Ôç/
ØcŠoÅßÞ
„¬%ä%,yÇäè`^×ì*Ö|“Ù¾§
™¬Ëû5‡x9¼å×Ü]Ü
7û(öÄ*“@buqûÀºãÜvo¡]|‡¨P*ÐF~ïÔ1<sO8Dfã@ÆÖVïp[Mjd~G@K3Xšèˆ.`ë·Wº^9 +ÌfP@#åw$´è…ëq2–vÇÎ+ç—‰¿¤FÝ3$–‰žo™9N¥4èÃæÇÁ&³à/øc½%ÆCÿÄ·¶>ÿÐŽžº±™Îñ~4˜IcÖ˜uzÕN=vó2ˆ°*]#Ô?ÆÌ:þL§â AŠÖ4.¸çF,äÁ(ÊÀó,—`‚SËv2‹ãnŒŽy„àQtjé‹Æ’×· +œ»nVmí…HƵ²¾4nrÈ1S®)º-GFæ…Ó’öïÝ1vvú©ù*Ý´/:ñ‘äÎæð"UÄ*›M©®a– sêÞG ¹¾7 ç¹ +fš.CIf…Ñ"«g¨0$gâ§ÿœ5“À +mO3ÈŠ/ÜÇohÌÞqÑ)òB›5˜½rsœ‰¨1mî
“Íë1#!⪸PC¿ú¬Çîþ2ó’ïM<îÿMŒÁZý ÉôÌÖØ^Ĉ.ªH.œCíŽ#n¡ü>ezAº:ÆGÊÏŠA»‘îO÷Ë¢»4Z¡Ïè·µ-k&BÈè}_©PÎ$eIYݪnîíê¤4Ö4¹”`²iÓx±VÚï¸NÕ¢ûÐÂ2îW£#ú:˜{ò*íúV‚)xgìà I0NÄ»4Æ™ûxWPÖn®VƇEA(\>þF1•Z¢ýÇzíiúe"½é“?ŒwþÓW{nûœcSWñºÞ¥tz^ÙõbK*§þý2;‡"éÓ|*sEoœåÍÔyqéh.‘ë*–t±ñbuG†
póZuÅn)ÙhÂÄŒMmo¬ ÇÍÌH*/jK\ã +º¡Í‹¡äÌy_]ÌÒ3©Q[RŸÌGà×û „V +§…+sG´ƒ™\–w¦îSÝ{óü|ý2˜˜d9ˆ£„‰’™?g±ÕÑãx»|±´mhsüš‡S™ß¥÷z¡þ‡ÅWÙ¨BY4£ÿn>Euœ§üÆH³‡ûžiC ö›˜[½:ˆpþ¸¼p=´+±»„ô)«~ñôæ0xWÿ˜hHywIv[ìgq\£°S5òkcÆ[[óŽ¸:|Gœ;Èa‹åt„cÇ:¸–°»‹V—ÌléŸI?G³¾JxCÂ…n²67©›ã¡˜wIï_‚kcõ|q¨%'CÆÛ7õegÝ2…£¡h_Š!QíFÚí¢É5mù00];IôÖçMáâÒ?®IêÈLâ;tLÄ:Úñ} 1Ìç…»NÇ_ÐéùE8ß -X>6g—@ª\Èø$–ïU„©Y¬¥Z1æa6i«Ì挜çÂwã7|ÇÝ}¼)xG¶oñ97°6‚ŸbN°Ô´Æ†²äˆ”y¤ö„HT('9š¤…ü¸CKJIórAR\O¡'§
ÊÎÎ~Õ%_m'|ó[ÁwR˜3ä›DÊîÜ[Õ` êô"°Jçü|B|(¼*KˆŸ€˜®}ÏÆïzmœ<±b8;ÆÓ`¼¸ücX£Êg_GgÈVì6÷÷ÈM<¹Æ`»ÕÐÉæ:q¼•FÐfbG¹A±}vW)°E»1k¼Ü-ó‡GlwB©7dúò \uµëõ'7Öø©÷–7°î9àjŽšÉcyËKQ¸‚YEÇÙmüðMBuzs_å««k- ·ÚmàÅÔYԨрž%ÁÐá\tÜ¢¬¥·Ëz§*'옽“]íƒoŽ€MÃ]—9 \·ÜmoÜtZúQù,ªAlx|`Æ?(Ò›¦àVàù..‘‡œêµX€—ïß;«ÐŠãj—à×$XUÂϤ7œ
R %ØNIkßä̓4W1 ŠUðR(tjY™t« ܯaËü³Ô[ êL5l ¡'M"(©¤3GMyò1Àðo¶¤[Y~VáWÍ®þ¾Ô佇ÿ +ûÑF.ŽôÞ <}øXÛ (ð1`éŸ/©ýø…Î˜× +cÕV IüëÎb†3^Óc^˜Î`dFÈP˜ ¬<Iúñ“wÄÂÞZc¹™<:ÕQMŠI6ø˜ÉÆdS<ñϺªãüûŽF7‘`ŽÑBµeͪ¶ëÒWnP0ü3”ÉjP–ÑqÝ“ñk⟎Shãæ’r ü–'áÚd²ï)äGn¿î7Cò®Ò&+‹†³yjúŒç½iE¿Uç ÒYùdÍØð†ÞÙÅjøDo(ÉÕp¸n Õ,^UÈʆŸ‚bn„ Ëí±Ú_xà?F¨9/OZ¥ëOóµ +¨»ÊZ +ôoÀ"ž¼òTš÷ªu)HG—Æ-u5U
:6bªÞ’[ZÈMô_%xáå|€ŸOÎB‘\_)à¿íLŽzCÃ3qB$·5Ûü‘ÃÌÁÙçî•‹o!ä{d“$Ò€ U\2tl~$ÊàžAã{¶bŸFZEøüÓÏcpÖ‚ùY¨ñôö16ÕÍ& + ßÎà
$,6ÓDñt’æ¡ŸiU;þÓvXþ + £‰ÓP¯ÓIØ2ºsgœ~©Ö„:ét´g\N º22 +Ö3L‹îèYAQà~'@˜·HÄ•m}ào\´ÔÂùæ}ɳ/?jëu®.6⽓„pCïdã³Û¾žá‹@Ò0áæ£`oÿåÖó¡mz
›·ŠD’BWä1Àc°F'¾à¨ÞÏŠŒNAwã²dk›"Ìð¸S܃æþÔ:éq;aé@T’QÁ1ïD•šßðB*"=ä?ÍDNµÁ›lÛœ%F˜rç•žš`Ñy +d€•ãrö†ÿ<sI»™c™¹°»ÂL¹fêV¸Ó»¢kzÔÓisßØüú¡òŠ±x& .ªt6TJMqWvñÅõ¢[æ7Q¢ÓÙû"-rZT\)²6ÒȪãÊBnÞó©<FB¸Ý¢æeBó@r +€ØÂßã‡~Øß#éý…᥋bQ°O +RÖ¨ü‚ððø´×ǽ½ªÑÏžŽ( +‡8—¦ÏËÑ_cUÉI\Òëß+b.bü(<RSnÖí¢ÅðÍÄ,vƽœ,Áf‚¦[!»>6è»"; µcûœ.ôJõÖŠtvðãÜ(ÞctëæW'rVG›f¯ñà1Ôÿ.¨Ãµ*‘¯9¿2ú6Âbøs({é3=~³s0,Ùž6X2m³·Ê!ÑXQVÙ˜æ!)À¹Œ5›-ÔâŽ]¸&»""j¯$ÁlNÕN|%ìü¾ml¨²uÕ£m}ÁBžš{]9&%íJe9[*4è
ZEhàIhoªáG.··eòïFé)9öõ§<¶$´à‹O2Ä¡¸+o©›,Ïh=/ø‘SUá[¬«J;9ŒÜÍHÝéQüñ’й4› A›ÃzÙÌœ¤¿ÏÄOÑùšIŸÁð@œTϼ¡]KY—,ÝHºÓÓ‚|g÷ªƒ)ùôÆþjÍž†(Ÿ¬F=•ÙZI`ú8‘}"µÀàüçÁ/ÁæàÆð]I ìuñ)be©Ú±L¯ñk<V‹É™zóm7—‰š-oB[Fήp^îÆá$^(kªe;õ5üŠ´Ž/ö»¶L=ZŒúCÜQãÄœ³HÑ“Ç1sr|¨à欯æ’B™C•_Q¸vs#ÞÀl³MX¯kº¼ï;A+°Ž¢‡5:z+Zßœ¡ƒˆ
¼¨T²ÜøÚŸ—RÏšŒÊUëk&ˆÅ
¹„øð(kQ'ŒÕ8ðÎ’•-»y«MZåäy8FžÙ·z³æ̲¦½1íÁÊO{2Âû؈/NcqIäB}Gã!n.z6˜
ˆTfûv¤Ô¦öèT鞘ÅUzóLk²aóOÌ=Ý"&Eö–yKkþ‘‹_¸µ#·l›ÆÅä?a9gŽ§äâyc™˜RÝ‹{,u±L{12Cªöøù›¿½ñ¨YV£
Ì8dr$ˆ"ŸFš¤wKêGN>j¡P/H£Â?†pÍ|½Šìdu}áç(1'*8ìëÃAaÈS—„Pº¤ô‚ ŠXé³|Ð%ÈßFÄ"™åÈ2xªýÓó&‚˜E(¹û†£e¶ÃzÕ3(`]}ÙšØk\a6Ò'?Š]ûß7,÷LêŽÌl÷Ó1/ãµDˆa``ä~«<o½ÐO»\k¼òq¼Xk…p'¾`V:èyÛJ¿^¬Ü·˜´ÎÙØuÞQ{W"ø©´Côs‘m«©'œÄYÖÂfËℾÛ7¿>å «@¨<NN•«A.ù j™ÙÊÖùS íCÕûYÊjë*–Û¾Ph·–ÌqêMNïÈ‚¯9‚' p—*Öµ, 2òi™ÇVV3u‚læ·Ý¦Ð¤
žÖ÷ãŠgàÛ;“ƒ…ÕÍC†ørAU/Q‰"ůÑÞ«_HÕ°½ç^&Ѳ91ÕfmØYÎâwöŒË +%Ö{f~F©Å[ÞŠ!’>£C¢À¦Ãkc
"3eI“Fv»vís²ÌÞYoÑðªóædÝe©Ý]¯%«:»µ¥ýÝQ=$tß]R6›>§l‚y:²ºLÉ<œLI*`~éGluuÂP§{°öñ½¶²…ç\Ò3O™ƒÖ¼-ŠAÛIA]3;dF¶©];¹\µ'Ò¦õèrIìûñúÉ@TÆŸXƒ
—”^ˆ›>¡agS·ãã¦è§Uß7Îö¶<_ g%vqð³çLØDüTðŒŸÂ°á=BïÀÚRc€ˆé +ÌÚýÎÂ$”¼NÌ/¼kÕ†}T•@'—Û£FqÀ)áØOv’`«aèùŽ°ìJ„ÈÝéí4‚ô4ñÑDdÉì§&á1ˆ\Dåìwü¹°;Ù3+Ë|må\èÞ¯ô×tùÒ…³õ!—‘uWÁò ûá¬ÕºftÆâÈS)V¶p?Á¿Û_t`•-f½«'¸Ê»#2ó-n‘”Ó,~îkcâr~YÝë~ïS@¿Ý½{MwÕúòtÎÖôÀÞ¤Séý¤•WoóÜèz/©®[}mšMÐ^ûyª³€-¸üBÂ)·^vÕã\«#·ÈβÙ'ÔÒÒ67HçÎržën> +„ch·¢UwÉ”©;M3žú®H‘(Ì*dU¸Â±ÔПR?1ªƒ_ûˆp!Hˆ)[PïLÄ¥´·ž&ƒ½Ï ßC:mßñJS'˜Ü åT„t쨡/.öó}lÜ24?12ôç):qOæ£RÄ£8”…{îã4Î8Ù48Ôô«ðêEøØÜ#jÈÂÃë +gùlËÎ’å¸Q˜M +—9ãÝX´ê6r±¤°±
¾¡Wdƒªô|?a€O]JÚÔb2ÏøªÒDýy4ñµaZ õcœ3ÕèÄTã¦?>´ÉÔ³5æÞÆm±›Þ|:iÿÔUeŠ¯T£¼£×ð„Ow¥ßˆq¹Ly|oÅØ”S°<@œù€Õnzwë©Ï8‡´@ïÙN7ÔCáv=4ÌaZÌlùJÏ·—Q;BIƒ›'œÙÕä1üÜ¥«áL™¬pæûÚl„ ÂÏGC¿_ñó²šQ=»c}°s¡ºìrÂ8Ô³†)çÍ©V†AkÚß ú3€¬±Ÿ²ïI¾£—á[-8px +‰tt|Ø°H±ÐÕ¥fsxöŠ(ÿ)”v¦¸Ži6
8¤ž`ö¼áNMÄ&\}<‡)zðÖÓ—ÙFGkWöåX{H¹özPF;Z»MGøÆ +¶Ç +‘Í‘Õ3Ä~-Õ2ôj´îi\}ƒå“¥/Š¿Ù.&
m?ÿ®b,;«j0Œâ«›^JsÁ6DõŽÌ¹ ‡dpö;$̘I“ΰ‹[Å÷x§£¤nLNùdÁÁ߃å‚omYJŠ³Ž™'é‰èÉËT„ÓÎkÆgæÅM:˜T(H\k„D ÊC|¥©?‡œôNÚ}JÙŽï]"*sr÷£Ô~éGqÕùM›¾¦4dÂoüŒèÙ‘ ?ù̹рš¾õùPM=©mÝÖ«JóÂéxzÎ÷í#PÁQÝQ
[ý¸j=œä8·Òˆanø¥|÷çÆLEX+ôGXD±ÕöÛ`…ýàÒ*]¨ +„jšWÞ°úœ1,jŸ§¿©eH‡“âwü¨4AºÏóÖw=}@Ï¢ç +SQX,;k@h°ì ƒ”Ú¢~ÐzÊ®Vµ +K›rX ѧFÓKÎj4\[/Ñçf€‹Jê:b²“W:äA}±Z˜·\UÅ*gL¥mÚH,R†7xæLJf©ð`˜e™»l½¯Ì…í7-6rxKN‹è'Â$£ëõ_)û™~¥íM.ñÜ\ÿÓ#FÄËÆuˬÁ¯KZS‘3Ë°Ÿ$cÞƳÿWVÀÄXn0Æ~#û±¥ü¹-àíS§3x“ @ÃÞ2áVÅâ–å\|PÆq¬r—Ê»Ž\°Ü~–m#¶)'` , €•´ÛûMT̆~¼Â1£þòÃëñá·s¬Œ4(rŽKÍz=8ê× +®¼m£•-EjψŒ€³æcíæΆcÔoºýX…Â5\’PˆÔã®?×ïÔG·4 èä"±JR{3M¬ÀB±-8wÝ¿nµ€ìûà —Ä6!³Ø)ñ`/?=~2ký…ï’ÜZk2FÞÊVþ;|øšu™„ûÔêæžb÷ÔßAäↃDB¢ô&4{q¿JÎãRÊÙ_s#ÜÌ®y‘HCP¸ë¤)xéWaw.…¯¯# éÐfIî%gíjú(Vì:“÷rççÃ3vUgîxu …µ9–T/[Ég“Åû +vÔtUÝ|×tWKƒJtRöÃQ Ø^!•’ +Î3.u‘Ú¥zzF?8á)L>Î(ß¿ +¬¿ý\¿•0Æ5bt(Cˆ']Û +PõóI1JÓh‚5Òö_¬Mì©iá£ç#É™®,Ý@W`³J«_©xIªü\ý´A©Åù|)A+±Ke Õ¶¾õxÕ +7UÝ+ çÁ`\ùžmc#/XbÕf—©lH4ýäm’/<â’WÞSêkäÄæ R¤7‘êYoŽ™"x{èxEï +Ô"y(luý#2Ä14ñ»,'—`S}éÚC©F‚(mœòM´Ä`Âè¹,$(ý"±uX?J„íÝiJ‹ÿ Å +ÆXB9¡D3ÜSB±»x'àâr*žbÂo¨àcê#š>ÁdÒÏ®Õ×jRþ’žŠò "%Laž˜Œ®-´sMåÎfLñZÐ-†Ð±õNºëªo;õ|½ÿ„rpŠWÆL/±£9·CBs’'ë'çYè>~NJØÊÜe Áë6'GY©!µiV§œe³°\âW +³.K$&N$yú½D¯oMžOÌvŪæO0[ +ÞOL¥cªF®g[ú4U=?èÁÒ°Åo±ÃÜÈ— 9`¹uH¡0{0e&e=Í—RÄ
rQ½Àsƒ›;±•¹tPÉ™|gzúÎG.^ehàóЛOgLtoz¹ØP¢cU}Bû$œ +2tˆŸ1³>.iÊ™ñ±.*{L—‚Ç[K|ÆÈwÜ1V"¾DÏêêߎnf¶º>üª²AÍü-Em9³g§åOÁ´R¢ÒYX¹]š¨ì1ʳ0 %âèI~˜y,=¾L–=ÑbZKï5I7°Ž³Få/öWù¢@!‚Çb8ËŸƒé2Íé×”<þ¿\G`™}Î’ÌlX@³ßˆÙ¶|]µRëúAVõÊe)¡ç÷
Lû}ˆ¿K£¶SÀü0Ïå×›*~¹ØíP´e™Ê,|“8 +²lé‰Ã›|M›íÞ:¸ÝžÊ¿ ÷^v#)zˆ(¤L\ON¬¦s£í):>ülj`ûLVD Ö„×ôÒÔe Üð6€¸k:QoñaWBÞZ—¼y!ëîUéŠE…¨f¦)nîÙ#‹UBf¾˜·Ìþô¼VÞý†rÖÛfÆJ¹¡J¡ R çT‘Fu‹¶Æ,ˆ?x¡Ü–‡ÜÿUŠé)] µƒ~:î‘RKÒ‡t‡Æ‡RŠ;±bµ +®±Å:i`2L ©"Ÿ,ŽfDM›÷˜ +
OÇ£öl™5˜<³q†öŠg9‘G†:lP,+ºWÊøw—ÍòåÔÜñ ñÚ±{€Ë64±‡Z4X„Xª#ýÁ8v0›ä
¯Ÿ‡ÏJ³§•$Oü,qL€‡Â%&.Bš^¡±GôŒõÚtJÄ›`URì{¿Îª˜i$W£eû±‹SA^{e<¦R þãŠ?wLrk>Õ«ÎJ's%À_`¨l±"}ã¨<€¬¹Z’ÈÕHS%ቾiAô²~º5vEúó[wR{ÉDŒðïHÎýÓ7œzçÒUÈÛíE&üo¾‚HîL)¥§ŠcTÔ]ì“¥ßÁñ.fàÅu³
@ÑĦ1eælLÔôrlÿ¿væú` +£‰V%…•¡HÁ™Kÿ£8ãÃõOɈ/]ûÝæñäm’Âfñý„%ˆšØ–£ª…“ÐDø ÷uõ’̈ÏjÓúUzòÏ"çÙV®jbÉjs3
hKµK…àü¤Wʶѷ›èh.Ÿhô‰¶èø¶8ü¦Ô…Ë΃‘ô€$¢ðÀmÚž +S½B‡BôÖIn»cf?úZ}‹©s¸¦™ !û>^·ŠÎ’š^,ÑDlµo(h÷f0C¬kk#ðJÊ뻨kÉý¨åƒš½X~¨â4ÅóQ
í‘Öc–Ö…(¯ 9y(€î‘m—mÌ4„òhÛ€îN²áÞvi‚ËHgRåø¡ÓB3jéäì±ë‡ +ÕJ‹n¥˜ðÅ„àFtÂL¯÷õÌÔ=ƒbºÓFOü3þËÿ!¸*§ýw÷y]¾Û-µ— àöÄ)üûÜQaoÏ—¹"ïKzîê•[êésÅ#Ç2<„<ˆÕ‰k—6§×¬ho_àHý±V&(Œ
Â!äÁ~§:!èéCxVšÈúC,ÿpÍBr„|X™)È+®{'’Ý1SL쥟obŠ±êf©†ö¯p„„ç%r‘IËŒ-sý:º YzÎ/v<~Kâ”vAЬ¤c4[õuw×_ +ëþ}JõÓ;åüÁ½{]¹¢pƒŸñ²fx:yD¾¯¯Š‹x“bóËó$~Hšó»I¸iLð%±žI°8<½y]ì<âU·GãY„çrQäfd;2_Ö†r²üQ´&æÅ_btg%/y‘m¢½Ýâ_š\–ðˆ\G-'Oߺp>Ųeg`z`8
ÀpÑUüÚg)@–3æ!󂢬ï?=ö’
ÇÛ¢6$ù:k Uó0爔j/12•âˆ Ò/ÈÚtæMÕ™¿J"Öí#iÖü»>ܱQ(눕pR\‡6‰ìõHÿHuW¢i§‡(ãÅ r'›J_›oÇSJ,ËN{õ»D JÙ*ø ùðBÕ•·ëëwZ“º}‚ŽûÚÒa£ßÜ,ø©–“½Ÿç Þ´=w1öX:î{ß}Ì#,à@ëÕB1˜°B¹=ŠÄÈwÍ}Žó÷ò†º4I^FŽqʹŒ¼.#-¿à³VÄ6HOj/ج˜ÕM aƒ&¡”wË·ÿ@oñhi=+©ƒ³˜¹ñrÄ|ù2ù’{Ãzá/Å´.ß~®fKAÎÓ—zì`4‚»Î‰¿D›6Æù2‚;4ÌN¿ŠÍ›•ö®âxò6(XdaSûÛFU—~r£í º3ƒÞfÐ[âUém%ñRˆIÐéÍ¡áDR¶&Šœ¦/Š^s§08¸Ê8—”…__^+öû"Ð(ê6劼ʕÅPë!iÆšÞaœ§;|7Ìvt¯!VÀq^ËvtÝ;™²Wؤ®YÎF_ë³%[«ôFgßÖÛœ'íõ"rÿÝ'Av•ü,ŽdØ +GÛÞÌc0É|ôZï{ŒœÍ’£¨P("KvEq¶îh¿’ ++ùòýéÉÙ¶f0f¢Ä`+íí”ÉA/ãÃUß7¬‰¾¶ãç‚qa×”™»çµŽšbK5éº"N’Öð—e~SPNy1'cMü9dS«µ›Ž2„ÍóðÆñb65$‡ìϽC…ÿ7
èûÙèì +d@kÐw™Ç¬{kª}憅¨Õ©°6X
+ QžÔÛ\>¢Šn€·¹mÜ¡$°ÏJÝÍ"÷œM?wkž.ùêï8Sˆ¾rm^Þ‰Ø#ë=Áƒž43дU†Ðœ?ºD¾#lo™Nîz²%:’àÕûŸ¹—È}†)7gšo\.nA‰Y¬héî;/
Üyí¹èh?ê¤ÛO½-ïºR!É-u¹¬UÉ\³„ª8™°¬Ÿ®¡¢(ÏøR°“ úc½{×X§D¿/„Õ–¾u™}óP+Œ¿èÇIïñŠb:
b6R4[R´£ÙÅ_H9øF·ŒÖö}¾ËD}ð¥„bݳpŠŠ¿4QMêl›=•h,H†Å§³ˆ®f:0€Õ6ê¯þ¤J/Ûiø—DãÂB"túâ0Âh#ú¡]Ô mIÚG]ËrXEÛÍöºº½eú5r>|{]$MA‡’ñ’C_5ÞžH¸ñfmÉJ¼&Qv +ž´‰’âÌŠâi¾i¯_žÛ8© Ä4xÏÅ”ÁÉ„Ì’ÌZ$¿J"àôš¦Ú› †|ŒdvŽR‹þ„И m¬Ú·5EíR'Ïϯrbù£”†]Y4웈ˆ +›•ô#Ç’U¥H^#ütÌtëv/p¬k¨`¤f)9t…[´OXhΘÃ÷ÑŒK/):¤ëó8ÁF>8~ÀÒ_<a] we¦ŒÖ! uë¤ñà†ÓšèGö§M}á¥{o‰Yw5¸ÑÁMÈ +FFgñUž[·tL%Q‹-¨´s —÷¾å\RÚõ»ÊZþ`g8òè¼ëx*Â0Šë#«ˆªJ‰!RòGèDéCF·Ï5ð— 'ÎÿUcõþÀí|!ü cÒL¯Í~²j?àá2èGºúòEç$gÎ\RR¢ì»ìÌv¸ð|r‡›$x-þ¸k8Š4³Šj hƒæÞÚFmÖœM]<¹¿¥«êSMµMRúË^U'J‰Kßkœó8‡qZÀRJem¬z’=HôÍïð€µâ@O=wª¤‘HäT +¥8€6C”²ù':Ÿ¢ˆ±Ö)M' 5òa/‰Evöüít¶ê½éX +¯ðH!+€!Ì©-5Iì$-»d˜ðeXÝ#7þ¾ÕΛŸò‹©5eºn§Ú3’6!ãݦHup§…X3V<}$ÅéØ™_AÔÞåãn»wQê·Ê©ÀEÀ¹£¥ž¿@’ÕÁñ™™RçˆLà¼VÜqÄYÔ +endstream +endobj +409 0 obj << /Type /Font /Subtype /Type1 -/Encoding 1161 0 R -/BaseFont /Times-Roman +/Encoding 1952 0 R +/FirstChar 2 +/LastChar 237 +/Widths 1970 0 R +/BaseFont /VNPZUV+NimbusRomNo9L-Regu +/FontDescriptor 407 0 R >> endobj -410 0 obj << +407 0 obj << +/Ascent 678 +/CapHeight 651 +/Descent -216 +/FontName /VNPZUV+NimbusRomNo9L-Regu +/ItalicAngle 0 +/StemV 85 +/XHeight 450 +/FontBBox [-168 -281 1000 924] +/Flags 4 +/CharSet (/fi/fl/exclam/quotedbl/percent/quoteright/parenleft/parenright/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/question/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/bracketleft/bracketright/quoteleft/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/dagger/quotedblleft/quotedblright/endash/emdash/Eacute/eacute/iacute) +/FontFile 408 0 R +>> endobj +1970 0 obj +[556 556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 408 0 0 833 0 333 333 333 0 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 0 0 0 444 0 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 0 333 0 0 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 0 0 0 0 0 0 0 0 0 444 444 0 500 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 611 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 444 0 0 0 278 ] +endobj +452 0 obj << /Type /Pages /Count 6 -/Parent 1170 0 R -/Kids [362 0 R 412 0 R 459 0 R 479 0 R 487 0 R 496 0 R] +/Parent 1971 0 R +/Kids [402 0 R 454 0 R 502 0 R 532 0 R 541 0 R 547 0 R] >> endobj -511 0 obj << +556 0 obj << /Type /Pages /Count 6 -/Parent 1170 0 R -/Kids [502 0 R 513 0 R 519 0 R 524 0 R 529 0 R 539 0 R] +/Parent 1971 0 R +/Kids [553 0 R 558 0 R 574 0 R 583 0 R 588 0 R 594 0 R] >> endobj -547 0 obj << +608 0 obj << /Type /Pages /Count 6 -/Parent 1170 0 R -/Kids [543 0 R 549 0 R 555 0 R 565 0 R 572 0 R 579 0 R] +/Parent 1971 0 R +/Kids [605 0 R 610 0 R 623 0 R 630 0 R 637 0 R 652 0 R] >> endobj -587 0 obj << +670 0 obj << /Type /Pages /Count 6 -/Parent 1170 0 R -/Kids [583 0 R 589 0 R 593 0 R 600 0 R 605 0 R 609 0 R] +/Parent 1971 0 R +/Kids [661 0 R 672 0 R 681 0 R 692 0 R 698 0 R 704 0 R] >> endobj -622 0 obj << +718 0 obj << /Type /Pages /Count 6 -/Parent 1170 0 R -/Kids [616 0 R 624 0 R 629 0 R 634 0 R 640 0 R 650 0 R] +/Parent 1971 0 R +/Kids [709 0 R 720 0 R 728 0 R 734 0 R 742 0 R 747 0 R] >> endobj -660 0 obj << +762 0 obj << /Type /Pages /Count 6 -/Parent 1170 0 R -/Kids [654 0 R 662 0 R 667 0 R 672 0 R 677 0 R 681 0 R] +/Parent 1971 0 R +/Kids [755 0 R 764 0 R 772 0 R 781 0 R 791 0 R 799 0 R] >> endobj -689 0 obj << +824 0 obj << /Type /Pages /Count 6 -/Parent 1171 0 R -/Kids [686 0 R 691 0 R 695 0 R 700 0 R 707 0 R 712 0 R] +/Parent 1972 0 R +/Kids [811 0 R 826 0 R 835 0 R 848 0 R 857 0 R 866 0 R] >> endobj -719 0 obj << +882 0 obj << /Type /Pages /Count 6 -/Parent 1171 0 R -/Kids [716 0 R 721 0 R 725 0 R 729 0 R 733 0 R 737 0 R] +/Parent 1972 0 R +/Kids [870 0 R 884 0 R 895 0 R 901 0 R 909 0 R 916 0 R] >> endobj -744 0 obj << +932 0 obj << /Type /Pages /Count 6 -/Parent 1171 0 R -/Kids [741 0 R 746 0 R 752 0 R 756 0 R 760 0 R 766 0 R] +/Parent 1972 0 R +/Kids [927 0 R 934 0 R 940 0 R 949 0 R 954 0 R 963 0 R] >> endobj -777 0 obj << +977 0 obj << /Type /Pages /Count 6 -/Parent 1171 0 R -/Kids [771 0 R 779 0 R 783 0 R 787 0 R 791 0 R 795 0 R] +/Parent 1972 0 R +/Kids [972 0 R 979 0 R 985 0 R 990 0 R 996 0 R 1000 0 R] >> endobj -802 0 obj << +1022 0 obj << /Type /Pages /Count 6 -/Parent 1171 0 R -/Kids [799 0 R 804 0 R 810 0 R 814 0 R 818 0 R 908 0 R] +/Parent 1972 0 R +/Kids [1011 0 R 1024 0 R 1036 0 R 1044 0 R 1053 0 R 1061 0 R] >> endobj -1091 0 obj << +1071 0 obj << /Type /Pages /Count 6 -/Parent 1171 0 R -/Kids [999 0 R 1093 0 R 1144 0 R 1148 0 R 1152 0 R 1156 0 R] +/Parent 1972 0 R +/Kids [1067 0 R 1073 0 R 1079 0 R 1087 0 R 1093 0 R 1099 0 R] >> endobj -1170 0 obj << +1114 0 obj << +/Type /Pages +/Count 6 +/Parent 1973 0 R +/Kids [1108 0 R 1116 0 R 1124 0 R 1136 0 R 1143 0 R 1147 0 R] +>> endobj +1154 0 obj << +/Type /Pages +/Count 6 +/Parent 1973 0 R +/Kids [1151 0 R 1156 0 R 1162 0 R 1166 0 R 1172 0 R 1176 0 R] +>> endobj +1271 0 obj << +/Type /Pages +/Count 6 +/Parent 1973 0 R +/Kids [1180 0 R 1273 0 R 1371 0 R 1466 0 R 1567 0 R 1598 0 R] +>> endobj +1766 0 obj << +/Type /Pages +/Count 4 +/Parent 1973 0 R +/Kids [1681 0 R 1768 0 R 1853 0 R 1940 0 R] +>> endobj +1971 0 obj << /Type /Pages /Count 36 -/Parent 1172 0 R -/Kids [410 0 R 511 0 R 547 0 R 587 0 R 622 0 R 660 0 R] +/Parent 1974 0 R +/Kids [452 0 R 556 0 R 608 0 R 670 0 R 718 0 R 762 0 R] >> endobj -1171 0 obj << +1972 0 obj << /Type /Pages /Count 36 -/Parent 1172 0 R -/Kids [689 0 R 719 0 R 744 0 R 777 0 R 802 0 R 1091 0 R] +/Parent 1974 0 R +/Kids [824 0 R 882 0 R 932 0 R 977 0 R 1022 0 R 1071 0 R] >> endobj -1172 0 obj << +1973 0 obj << /Type /Pages -/Count 72 -/Kids [1170 0 R 1171 0 R] +/Count 22 +/Parent 1974 0 R +/Kids [1114 0 R 1154 0 R 1271 0 R 1766 0 R] >> endobj -1173 0 obj << +1974 0 obj << +/Type /Pages +/Count 94 +/Kids [1971 0 R 1972 0 R 1973 0 R] +>> endobj +1975 0 obj << /Type /Outlines /First 7 0 R -/Last 247 0 R -/Count 4 +/Last 279 0 R +/Count 5 +>> endobj +399 0 obj << +/Title 400 0 R +/A 397 0 R +/Parent 335 0 R +/Prev 395 0 R +>> endobj +395 0 obj << +/Title 396 0 R +/A 393 0 R +/Parent 335 0 R +/Prev 391 0 R +/Next 399 0 R +>> endobj +391 0 obj << +/Title 392 0 R +/A 389 0 R +/Parent 335 0 R +/Prev 387 0 R +/Next 395 0 R +>> endobj +387 0 obj << +/Title 388 0 R +/A 385 0 R +/Parent 335 0 R +/Prev 383 0 R +/Next 391 0 R +>> endobj +383 0 obj << +/Title 384 0 R +/A 381 0 R +/Parent 335 0 R +/Prev 379 0 R +/Next 387 0 R +>> endobj +379 0 obj << +/Title 380 0 R +/A 377 0 R +/Parent 335 0 R +/Prev 375 0 R +/Next 383 0 R +>> endobj +375 0 obj << +/Title 376 0 R +/A 373 0 R +/Parent 335 0 R +/Prev 371 0 R +/Next 379 0 R +>> endobj +371 0 obj << +/Title 372 0 R +/A 369 0 R +/Parent 335 0 R +/Prev 367 0 R +/Next 375 0 R +>> endobj +367 0 obj << +/Title 368 0 R +/A 365 0 R +/Parent 335 0 R +/Prev 363 0 R +/Next 371 0 R +>> endobj +363 0 obj << +/Title 364 0 R +/A 361 0 R +/Parent 335 0 R +/Prev 359 0 R +/Next 367 0 R >> endobj 359 0 obj << /Title 360 0 R /A 357 0 R -/Parent 303 0 R +/Parent 335 0 R /Prev 355 0 R +/Next 363 0 R >> endobj 355 0 obj << /Title 356 0 R /A 353 0 R -/Parent 303 0 R +/Parent 335 0 R /Prev 351 0 R /Next 359 0 R >> endobj 351 0 obj << /Title 352 0 R /A 349 0 R -/Parent 303 0 R +/Parent 335 0 R /Prev 347 0 R /Next 355 0 R >> endobj 347 0 obj << /Title 348 0 R /A 345 0 R -/Parent 303 0 R +/Parent 335 0 R /Prev 343 0 R /Next 351 0 R >> endobj 343 0 obj << /Title 344 0 R /A 341 0 R -/Parent 303 0 R +/Parent 335 0 R /Prev 339 0 R /Next 347 0 R >> endobj 339 0 obj << /Title 340 0 R /A 337 0 R -/Parent 303 0 R -/Prev 335 0 R +/Parent 335 0 R /Next 343 0 R >> endobj 335 0 obj << /Title 336 0 R /A 333 0 R -/Parent 303 0 R +/Parent 279 0 R /Prev 331 0 R -/Next 339 0 R +/First 339 0 R +/Last 399 0 R +/Count -16 >> endobj 331 0 obj << /Title 332 0 R /A 329 0 R -/Parent 303 0 R -/Prev 327 0 R +/Parent 279 0 R +/Prev 319 0 R /Next 335 0 R >> endobj 327 0 obj << /Title 328 0 R /A 325 0 R -/Parent 303 0 R +/Parent 319 0 R /Prev 323 0 R -/Next 331 0 R >> endobj 323 0 obj << /Title 324 0 R /A 321 0 R -/Parent 303 0 R -/Prev 319 0 R +/Parent 319 0 R /Next 327 0 R >> endobj 319 0 obj << /Title 320 0 R /A 317 0 R -/Parent 303 0 R -/Prev 315 0 R -/Next 323 0 R +/Parent 279 0 R +/Prev 303 0 R +/Next 331 0 R +/First 323 0 R +/Last 327 0 R +/Count -2 >> endobj 315 0 obj << /Title 316 0 R /A 313 0 R /Parent 303 0 R /Prev 311 0 R -/Next 319 0 R >> endobj 311 0 obj << /Title 312 0 R @@ -6977,390 +12673,392 @@ endobj 303 0 obj << /Title 304 0 R /A 301 0 R -/Parent 247 0 R +/Parent 279 0 R /Prev 299 0 R +/Next 319 0 R /First 307 0 R -/Last 359 0 R -/Count -14 +/Last 315 0 R +/Count -3 >> endobj 299 0 obj << /Title 300 0 R /A 297 0 R -/Parent 247 0 R -/Prev 287 0 R +/Parent 279 0 R +/Prev 295 0 R /Next 303 0 R >> endobj 295 0 obj << /Title 296 0 R /A 293 0 R -/Parent 287 0 R +/Parent 279 0 R /Prev 291 0 R +/Next 299 0 R >> endobj 291 0 obj << /Title 292 0 R /A 289 0 R -/Parent 287 0 R +/Parent 279 0 R +/Prev 287 0 R /Next 295 0 R >> endobj 287 0 obj << /Title 288 0 R /A 285 0 R -/Parent 247 0 R -/Prev 271 0 R -/Next 299 0 R -/First 291 0 R -/Last 295 0 R -/Count -2 +/Parent 279 0 R +/Prev 283 0 R +/Next 291 0 R >> endobj 283 0 obj << /Title 284 0 R /A 281 0 R -/Parent 271 0 R -/Prev 279 0 R +/Parent 279 0 R +/Next 287 0 R >> endobj 279 0 obj << /Title 280 0 R /A 277 0 R -/Parent 271 0 R -/Prev 275 0 R -/Next 283 0 R +/Parent 1975 0 R +/Prev 95 0 R +/First 283 0 R +/Last 335 0 R +/Count -9 >> endobj 275 0 obj << /Title 276 0 R /A 273 0 R -/Parent 271 0 R -/Next 279 0 R +/Parent 243 0 R +/Prev 271 0 R >> endobj 271 0 obj << /Title 272 0 R /A 269 0 R -/Parent 247 0 R +/Parent 243 0 R /Prev 267 0 R -/Next 287 0 R -/First 275 0 R -/Last 283 0 R -/Count -3 +/Next 275 0 R >> endobj 267 0 obj << /Title 268 0 R /A 265 0 R -/Parent 247 0 R +/Parent 243 0 R /Prev 263 0 R /Next 271 0 R >> endobj 263 0 obj << /Title 264 0 R /A 261 0 R -/Parent 247 0 R +/Parent 243 0 R /Prev 259 0 R /Next 267 0 R >> endobj 259 0 obj << /Title 260 0 R /A 257 0 R -/Parent 247 0 R +/Parent 243 0 R /Prev 255 0 R /Next 263 0 R >> endobj 255 0 obj << /Title 256 0 R /A 253 0 R -/Parent 247 0 R +/Parent 243 0 R /Prev 251 0 R /Next 259 0 R >> endobj 251 0 obj << /Title 252 0 R /A 249 0 R -/Parent 247 0 R +/Parent 243 0 R +/Prev 247 0 R /Next 255 0 R >> endobj 247 0 obj << /Title 248 0 R /A 245 0 R -/Parent 1173 0 R -/Prev 71 0 R -/First 251 0 R -/Last 303 0 R -/Count -9 +/Parent 243 0 R +/Next 251 0 R >> endobj 243 0 obj << /Title 244 0 R /A 241 0 R -/Parent 235 0 R +/Parent 95 0 R /Prev 239 0 R +/First 247 0 R +/Last 275 0 R +/Count -8 >> endobj 239 0 obj << /Title 240 0 R /A 237 0 R -/Parent 235 0 R +/Parent 95 0 R +/Prev 227 0 R /Next 243 0 R >> endobj 235 0 obj << /Title 236 0 R /A 233 0 R -/Parent 71 0 R +/Parent 227 0 R /Prev 231 0 R -/First 239 0 R -/Last 243 0 R -/Count -2 >> endobj 231 0 obj << /Title 232 0 R /A 229 0 R -/Parent 71 0 R -/Prev 219 0 R +/Parent 227 0 R /Next 235 0 R >> endobj 227 0 obj << /Title 228 0 R /A 225 0 R -/Parent 219 0 R +/Parent 95 0 R /Prev 223 0 R +/Next 239 0 R +/First 231 0 R +/Last 235 0 R +/Count -2 >> endobj 223 0 obj << /Title 224 0 R /A 221 0 R -/Parent 219 0 R +/Parent 95 0 R +/Prev 219 0 R /Next 227 0 R >> endobj 219 0 obj << /Title 220 0 R /A 217 0 R -/Parent 71 0 R -/Prev 215 0 R -/Next 231 0 R -/First 223 0 R -/Last 227 0 R -/Count -2 +/Parent 95 0 R +/Prev 207 0 R +/Next 223 0 R >> endobj 215 0 obj << /Title 216 0 R /A 213 0 R -/Parent 71 0 R +/Parent 207 0 R /Prev 211 0 R -/Next 219 0 R >> endobj 211 0 obj << /Title 212 0 R /A 209 0 R -/Parent 71 0 R -/Prev 199 0 R +/Parent 207 0 R /Next 215 0 R >> endobj 207 0 obj << /Title 208 0 R /A 205 0 R -/Parent 199 0 R -/Prev 203 0 R +/Parent 95 0 R +/Prev 191 0 R +/Next 219 0 R +/First 211 0 R +/Last 215 0 R +/Count -2 >> endobj 203 0 obj << /Title 204 0 R /A 201 0 R -/Parent 199 0 R -/Next 207 0 R +/Parent 191 0 R +/Prev 199 0 R >> endobj 199 0 obj << /Title 200 0 R /A 197 0 R -/Parent 71 0 R -/Prev 183 0 R -/Next 211 0 R -/First 203 0 R -/Last 207 0 R -/Count -2 +/Parent 191 0 R +/Prev 195 0 R +/Next 203 0 R >> endobj 195 0 obj << /Title 196 0 R /A 193 0 R -/Parent 183 0 R -/Prev 191 0 R +/Parent 191 0 R +/Next 199 0 R >> endobj 191 0 obj << /Title 192 0 R /A 189 0 R -/Parent 183 0 R -/Prev 187 0 R -/Next 195 0 R +/Parent 95 0 R +/Prev 171 0 R +/Next 207 0 R +/First 195 0 R +/Last 203 0 R +/Count -3 >> endobj 187 0 obj << /Title 188 0 R /A 185 0 R -/Parent 183 0 R -/Next 191 0 R +/Parent 171 0 R +/Prev 183 0 R >> endobj 183 0 obj << /Title 184 0 R /A 181 0 R -/Parent 71 0 R -/Prev 163 0 R -/Next 199 0 R -/First 187 0 R -/Last 195 0 R -/Count -3 +/Parent 171 0 R +/Prev 179 0 R +/Next 187 0 R >> endobj 179 0 obj << /Title 180 0 R /A 177 0 R -/Parent 163 0 R +/Parent 171 0 R /Prev 175 0 R +/Next 183 0 R >> endobj 175 0 obj << /Title 176 0 R /A 173 0 R -/Parent 163 0 R -/Prev 171 0 R +/Parent 171 0 R /Next 179 0 R >> endobj 171 0 obj << /Title 172 0 R /A 169 0 R -/Parent 163 0 R -/Prev 167 0 R -/Next 175 0 R +/Parent 95 0 R +/Prev 155 0 R +/Next 191 0 R +/First 175 0 R +/Last 187 0 R +/Count -4 >> endobj 167 0 obj << /Title 168 0 R /A 165 0 R -/Parent 163 0 R -/Next 171 0 R +/Parent 155 0 R +/Prev 163 0 R >> endobj 163 0 obj << /Title 164 0 R /A 161 0 R -/Parent 71 0 R -/Prev 147 0 R -/Next 183 0 R -/First 167 0 R -/Last 179 0 R -/Count -4 +/Parent 155 0 R +/Prev 159 0 R +/Next 167 0 R >> endobj 159 0 obj << /Title 160 0 R /A 157 0 R -/Parent 147 0 R -/Prev 155 0 R +/Parent 155 0 R +/Next 163 0 R >> endobj 155 0 obj << /Title 156 0 R /A 153 0 R -/Parent 147 0 R -/Prev 151 0 R -/Next 159 0 R +/Parent 95 0 R +/Prev 131 0 R +/Next 171 0 R +/First 159 0 R +/Last 167 0 R +/Count -3 >> endobj 151 0 obj << /Title 152 0 R /A 149 0 R -/Parent 147 0 R -/Next 155 0 R +/Parent 131 0 R +/Prev 147 0 R >> endobj 147 0 obj << /Title 148 0 R /A 145 0 R -/Parent 71 0 R -/Prev 123 0 R -/Next 163 0 R -/First 151 0 R -/Last 159 0 R -/Count -3 +/Parent 131 0 R +/Prev 143 0 R +/Next 151 0 R >> endobj 143 0 obj << /Title 144 0 R /A 141 0 R -/Parent 123 0 R +/Parent 131 0 R /Prev 139 0 R +/Next 147 0 R >> endobj 139 0 obj << /Title 140 0 R /A 137 0 R -/Parent 123 0 R +/Parent 131 0 R /Prev 135 0 R /Next 143 0 R >> endobj 135 0 obj << /Title 136 0 R /A 133 0 R -/Parent 123 0 R -/Prev 131 0 R +/Parent 131 0 R /Next 139 0 R >> endobj 131 0 obj << /Title 132 0 R /A 129 0 R -/Parent 123 0 R -/Prev 127 0 R -/Next 135 0 R +/Parent 95 0 R +/Prev 103 0 R +/Next 155 0 R +/First 135 0 R +/Last 151 0 R +/Count -5 >> endobj 127 0 obj << /Title 128 0 R /A 125 0 R -/Parent 123 0 R -/Next 131 0 R +/Parent 103 0 R +/Prev 123 0 R >> endobj 123 0 obj << /Title 124 0 R /A 121 0 R -/Parent 71 0 R -/Prev 79 0 R -/Next 147 0 R -/First 127 0 R -/Last 143 0 R -/Count -5 +/Parent 103 0 R +/Prev 119 0 R +/Next 127 0 R >> endobj 119 0 obj << /Title 120 0 R /A 117 0 R -/Parent 79 0 R +/Parent 103 0 R /Prev 115 0 R +/Next 123 0 R >> endobj 115 0 obj << /Title 116 0 R /A 113 0 R -/Parent 79 0 R +/Parent 103 0 R /Prev 111 0 R /Next 119 0 R >> endobj 111 0 obj << /Title 112 0 R /A 109 0 R -/Parent 79 0 R +/Parent 103 0 R /Prev 107 0 R /Next 115 0 R >> endobj 107 0 obj << /Title 108 0 R /A 105 0 R -/Parent 79 0 R -/Prev 103 0 R +/Parent 103 0 R /Next 111 0 R >> endobj 103 0 obj << /Title 104 0 R /A 101 0 R -/Parent 79 0 R +/Parent 95 0 R /Prev 99 0 R -/Next 107 0 R +/Next 131 0 R +/First 107 0 R +/Last 127 0 R +/Count -6 >> endobj 99 0 obj << /Title 100 0 R /A 97 0 R -/Parent 79 0 R -/Prev 95 0 R +/Parent 95 0 R /Next 103 0 R >> endobj 95 0 obj << /Title 96 0 R /A 93 0 R -/Parent 79 0 R -/Prev 91 0 R -/Next 99 0 R +/Parent 1975 0 R +/Prev 79 0 R +/Next 279 0 R +/First 99 0 R +/Last 243 0 R +/Count -12 >> endobj 91 0 obj << /Title 92 0 R /A 89 0 R /Parent 79 0 R /Prev 87 0 R -/Next 95 0 R >> endobj 87 0 obj << /Title 88 0 R @@ -7378,34 +13076,32 @@ endobj 79 0 obj << /Title 80 0 R /A 77 0 R -/Parent 71 0 R -/Prev 75 0 R -/Next 123 0 R +/Parent 1975 0 R +/Prev 27 0 R +/Next 95 0 R /First 83 0 R -/Last 119 0 R -/Count -10 +/Last 91 0 R +/Count -3 >> endobj 75 0 obj << /Title 76 0 R /A 73 0 R -/Parent 71 0 R -/Next 79 0 R +/Parent 27 0 R +/Prev 71 0 R >> endobj 71 0 obj << /Title 72 0 R /A 69 0 R -/Parent 1173 0 R -/Prev 27 0 R -/Next 247 0 R -/First 75 0 R -/Last 235 0 R -/Count -12 +/Parent 27 0 R +/Prev 67 0 R +/Next 75 0 R >> endobj 67 0 obj << /Title 68 0 R /A 65 0 R /Parent 27 0 R /Prev 63 0 R +/Next 71 0 R >> endobj 63 0 obj << /Title 64 0 R @@ -7472,12 +13168,12 @@ endobj 27 0 obj << /Title 28 0 R /A 25 0 R -/Parent 1173 0 R +/Parent 1975 0 R /Prev 7 0 R -/Next 71 0 R +/Next 79 0 R /First 31 0 R -/Last 67 0 R -/Count -10 +/Last 75 0 R +/Count -12 >> endobj 23 0 obj << /Title 24 0 R @@ -7508,1223 +13204,2023 @@ endobj 7 0 obj << /Title 8 0 R /A 5 0 R -/Parent 1173 0 R +/Parent 1975 0 R /Next 27 0 R /First 11 0 R /Last 23 0 R /Count -4 >> endobj -1174 0 obj << -/Names [(Doc-Start) 366 0 R (Hfootnote.1) 485 0 R (Hfootnote.10) 764 0 R (Hfootnote.11) 776 0 R (Hfootnote.12) 808 0 R (Hfootnote.2) 493 0 R (Hfootnote.3) 494 0 R (Hfootnote.4) 500 0 R (Hfootnote.5) 517 0 R (Hfootnote.6) 577 0 R (Hfootnote.7) 598 0 R (Hfootnote.8) 648 0 R (Hfootnote.9) 750 0 R (page.1) 481 0 R (page.10) 545 0 R (page.11) 551 0 R (page.12) 557 0 R (page.13) 567 0 R (page.14) 574 0 R (page.15) 581 0 R (page.16) 585 0 R (page.17) 591 0 R (page.18) 595 0 R (page.19) 602 0 R (page.2) 489 0 R (page.20) 607 0 R (page.21) 611 0 R (page.22) 618 0 R (page.23) 626 0 R (page.24) 631 0 R (page.25) 636 0 R (page.26) 642 0 R (page.27) 652 0 R (page.28) 656 0 R (page.29) 664 0 R (page.3) 498 0 R (page.30) 669 0 R (page.31) 674 0 R (page.32) 679 0 R (page.33) 683 0 R (page.34) 688 0 R (page.35) 693 0 R (page.36) 697 0 R (page.37) 702 0 R (page.38) 709 0 R (page.39) 714 0 R (page.4) 504 0 R (page.40) 718 0 R (page.41) 723 0 R (page.42) 727 0 R (page.43) 731 0 R (page.44) 735 0 R (page.45) 739 0 R (page.46) 743 0 R (page.47) 748 0 R (page.48) 754 0 R (page.49) 758 0 R (page.5) 515 0 R (page.50) 762 0 R (page.51) 768 0 R (page.52) 773 0 R (page.53) 781 0 R (page.54) 785 0 R (page.55) 789 0 R (page.56) 793 0 R (page.57) 797 0 R (page.58) 801 0 R (page.59) 806 0 R (page.6) 521 0 R (page.60) 812 0 R (page.61) 816 0 R (page.62) 820 0 R (page.63) 910 0 R (page.64) 1001 0 R (page.65) 1095 0 R (page.66) 1146 0 R (page.67) 1150 0 R (page.68) 1154 0 R (page.69) 1158 0 R (page.7) 526 0 R (page.8) 531 0 R (page.9) 541 0 R (page.i) 365 0 R (page.ii) 414 0 R (page.iii) 461 0 R (section*.1) 374 0 R (section.1) 6 0 R (section.2) 26 0 R (section.3) 70 0 R (section.4) 246 0 R (subsection.1.1) 10 0 R (subsection.1.2) 14 0 R (subsection.1.3) 18 0 R (subsection.1.4) 22 0 R (subsection.2.1) 30 0 R (subsection.2.10) 66 0 R (subsection.2.2) 34 0 R (subsection.2.3) 38 0 R (subsection.2.4) 42 0 R (subsection.2.5) 46 0 R (subsection.2.6) 50 0 R (subsection.2.7) 54 0 R (subsection.2.8) 58 0 R (subsection.2.9) 62 0 R (subsection.3.1) 74 0 R (subsection.3.10) 218 0 R (subsection.3.11) 230 0 R (subsection.3.12) 234 0 R (subsection.3.2) 78 0 R (subsection.3.3) 122 0 R (subsection.3.4) 146 0 R (subsection.3.5) 162 0 R (subsection.3.6) 182 0 R (subsection.3.7) 198 0 R (subsection.3.8) 210 0 R (subsection.3.9) 214 0 R (subsection.4.1) 250 0 R (subsection.4.2) 254 0 R (subsection.4.3) 258 0 R (subsection.4.4) 262 0 R (subsection.4.5) 266 0 R (subsection.4.6) 270 0 R (subsection.4.7) 286 0 R (subsection.4.8) 298 0 R (subsection.4.9) 302 0 R (subsubsection.3.10.1) 222 0 R (subsubsection.3.10.2) 226 0 R (subsubsection.3.12.1) 238 0 R (subsubsection.3.12.2) 242 0 R (subsubsection.3.2.1) 82 0 R (subsubsection.3.2.10) 118 0 R (subsubsection.3.2.2) 86 0 R (subsubsection.3.2.3) 90 0 R (subsubsection.3.2.4) 94 0 R (subsubsection.3.2.5) 98 0 R (subsubsection.3.2.6) 102 0 R (subsubsection.3.2.7) 106 0 R (subsubsection.3.2.8) 110 0 R (subsubsection.3.2.9) 114 0 R (subsubsection.3.3.1) 126 0 R (subsubsection.3.3.2) 130 0 R (subsubsection.3.3.3) 134 0 R (subsubsection.3.3.4) 138 0 R (subsubsection.3.3.5) 142 0 R (subsubsection.3.4.1) 150 0 R (subsubsection.3.4.2) 154 0 R (subsubsection.3.4.3) 158 0 R (subsubsection.3.5.1) 166 0 R (subsubsection.3.5.2) 170 0 R (subsubsection.3.5.3) 174 0 R (subsubsection.3.5.4) 178 0 R (subsubsection.3.6.1) 186 0 R (subsubsection.3.6.2) 190 0 R (subsubsection.3.6.3) 194 0 R (subsubsection.3.7.1) 202 0 R (subsubsection.3.7.2) 206 0 R (subsubsection.4.6.1) 274 0 R (subsubsection.4.6.2) 278 0 R (subsubsection.4.6.3) 282 0 R (subsubsection.4.7.1) 290 0 R (subsubsection.4.7.2) 294 0 R (subsubsection.4.9.1) 306 0 R (subsubsection.4.9.10) 342 0 R (subsubsection.4.9.11) 346 0 R (subsubsection.4.9.12) 350 0 R (subsubsection.4.9.13) 354 0 R (subsubsection.4.9.14) 358 0 R (subsubsection.4.9.2) 310 0 R (subsubsection.4.9.3) 314 0 R (subsubsection.4.9.4) 318 0 R (subsubsection.4.9.5) 322 0 R (subsubsection.4.9.6) 326 0 R (subsubsection.4.9.7) 330 0 R (subsubsection.4.9.8) 334 0 R (subsubsection.4.9.9) 338 0 R] -/Limits [(Doc-Start) (subsubsection.4.9.9)] +1976 0 obj << +/Names [(Doc-Start) 406 0 R (Hfootnote.1) 539 0 R (Hfootnote.10) 689 0 R (Hfootnote.11) 717 0 R (Hfootnote.12) 833 0 R (Hfootnote.13) 855 0 R (Hfootnote.14) 881 0 R (Hfootnote.15) 893 0 R (Hfootnote.16) 1059 0 R (Hfootnote.17) 1106 0 R (Hfootnote.18) 1122 0 R (Hfootnote.19) 1160 0 R (Hfootnote.2) 545 0 R (Hfootnote.20) 1170 0 R (Hfootnote.3) 551 0 R (Hfootnote.4) 581 0 R (Hfootnote.5) 602 0 R (Hfootnote.6) 603 0 R (Hfootnote.7) 619 0 R (Hfootnote.8) 628 0 R (Hfootnote.9) 650 0 R (Item.1) 634 0 R (Item.2) 635 0 R (page.1) 534 0 R (page.10) 607 0 R (page.11) 612 0 R (page.12) 625 0 R (page.13) 632 0 R (page.14) 639 0 R (page.15) 654 0 R (page.16) 663 0 R (page.17) 674 0 R (page.18) 683 0 R (page.19) 694 0 R (page.2) 543 0 R (page.20) 700 0 R (page.21) 706 0 R (page.22) 711 0 R (page.23) 722 0 R (page.24) 730 0 R (page.25) 736 0 R (page.26) 744 0 R (page.27) 749 0 R (page.28) 757 0 R (page.29) 766 0 R (page.3) 549 0 R (page.30) 774 0 R (page.31) 783 0 R (page.32) 793 0 R (page.33) 801 0 R (page.34) 813 0 R (page.35) 828 0 R (page.36) 837 0 R (page.37) 850 0 R (page.38) 859 0 R (page.39) 868 0 R (page.4) 555 0 R (page.40) 872 0 R (page.41) 886 0 R (page.42) 897 0 R (page.43) 903 0 R (page.44) 911 0 R (page.45) 918 0 R (page.46) 929 0 R (page.47) 936 0 R (page.48) 942 0 R (page.49) 951 0 R (page.5) 560 0 R (page.50) 956 0 R (page.51) 965 0 R (page.52) 974 0 R (page.53) 981 0 R (page.54) 987 0 R (page.55) 992 0 R (page.56) 998 0 R (page.57) 1002 0 R (page.58) 1013 0 R (page.59) 1026 0 R (page.6) 576 0 R (page.60) 1038 0 R (page.61) 1046 0 R (page.62) 1055 0 R (page.63) 1063 0 R (page.64) 1069 0 R (page.65) 1075 0 R (page.66) 1081 0 R (page.67) 1089 0 R (page.68) 1095 0 R (page.69) 1101 0 R (page.7) 585 0 R (page.70) 1110 0 R (page.71) 1118 0 R (page.72) 1126 0 R (page.73) 1138 0 R (page.74) 1145 0 R (page.75) 1149 0 R (page.76) 1153 0 R (page.77) 1158 0 R (page.78) 1164 0 R (page.79) 1168 0 R (page.8) 590 0 R (page.80) 1174 0 R (page.81) 1178 0 R (page.82) 1182 0 R (page.83) 1275 0 R (page.84) 1373 0 R (page.85) 1468 0 R (page.86) 1569 0 R (page.87) 1600 0 R (page.88) 1683 0 R (page.89) 1770 0 R (page.9) 596 0 R (page.90) 1855 0 R (page.91) 1942 0 R (page.i) 405 0 R (page.ii) 456 0 R (page.iii) 504 0 R (section*.1) 416 0 R (section*.10) 655 0 R (section*.100) 975 0 R (section*.101) 976 0 R (section*.102) 982 0 R (section*.103) 983 0 R (section*.104) 988 0 R (section*.105) 994 0 R (section*.106) 809 0 R (section*.107) 1003 0 R (section*.108) 1004 0 R (section*.109) 1005 0 R (section*.11) 656 0 R (section*.110) 1006 0 R (section*.111) 1007 0 R (section*.112) 1008 0 R (section*.113) 1009 0 R (section*.114) 1014 0 R (section*.115) 1015 0 R (section*.116) 1016 0 R (section*.117) 1017 0 R (section*.118) 1018 0 R (section*.119) 1019 0 R (section*.12) 657 0 R (section*.120) 1020 0 R (section*.121) 1021 0 R (section*.122) 1027 0 R (section*.123) 1029 0 R (section*.124) 1030 0 R (section*.125) 1031 0 R (section*.126) 1032 0 R (section*.127) 1033 0 R (section*.128) 1034 0 R (section*.129) 1039 0 R (section*.13) 658 0 R (section*.130) 1040 0 R (section*.131) 1041 0 R (section*.132) 1042 0 R (section*.133) 1047 0 R (section*.134) 1049 0 R (section*.135) 1050 0 R (section*.136) 1051 0 R (section*.137) 1056 0 R (section*.138) 1058 0 R (section*.139) 1065 0 R (section*.14) 659 0 R (section*.140) 1070 0 R (section*.141) 1083 0 R (section*.142) 1084 0 R (section*.143) 1085 0 R (section*.144) 1090 0 R (section*.145) 1096 0 R (section*.146) 1097 0 R (section*.147) 1103 0 R (section*.148) 1105 0 R (section*.149) 1112 0 R (section*.15) 666 0 R (section*.150) 1119 0 R (section*.151) 1121 0 R (section*.152) 1127 0 R (section*.153) 1128 0 R (section*.154) 1129 0 R (section*.155) 1130 0 R (section*.156) 1132 0 R (section*.157) 1134 0 R (section*.158) 1139 0 R (section*.159) 1140 0 R (section*.16) 669 0 R (section*.160) 1141 0 R (section*.17) 675 0 R (section*.18) 677 0 R (section*.19) 684 0 R (section*.2) 616 0 R (section*.20) 688 0 R (section*.21) 679 0 R (section*.22) 696 0 R (section*.23) 701 0 R (section*.24) 702 0 R (section*.25) 707 0 R (section*.26) 712 0 R (section*.27) 714 0 R (section*.28) 716 0 R (section*.29) 723 0 R (section*.3) 617 0 R (section*.30) 724 0 R (section*.31) 725 0 R (section*.32) 726 0 R (section*.33) 731 0 R (section*.34) 732 0 R (section*.35) 737 0 R (section*.36) 739 0 R (section*.37) 740 0 R (section*.38) 745 0 R (section*.39) 753 0 R (section*.4) 627 0 R (section*.40) 767 0 R (section*.41) 770 0 R (section*.42) 775 0 R (section*.43) 776 0 R (section*.44) 777 0 R (section*.45) 778 0 R (section*.46) 784 0 R (section*.47) 786 0 R (section*.48) 795 0 R (section*.49) 804 0 R (section*.5) 633 0 R (section*.50) 807 0 R (section*.51) 808 0 R (section*.52) 815 0 R (section*.53) 816 0 R (section*.54) 817 0 R (section*.55) 819 0 R (section*.56) 823 0 R (section*.57) 830 0 R (section*.58) 831 0 R (section*.59) 832 0 R (section*.6) 621 0 R (section*.60) 838 0 R (section*.61) 839 0 R (section*.62) 843 0 R (section*.63) 846 0 R (section*.64) 852 0 R (section*.65) 853 0 R (section*.66) 854 0 R (section*.67) 860 0 R (section*.68) 864 0 R (section*.69) 874 0 R (section*.7) 640 0 R (section*.70) 878 0 R (section*.71) 880 0 R (section*.72) 887 0 R (section*.73) 890 0 R (section*.74) 891 0 R (section*.75) 898 0 R (section*.76) 905 0 R (section*.77) 906 0 R (section*.78) 907 0 R (section*.79) 912 0 R (section*.8) 642 0 R (section*.80) 913 0 R (section*.81) 914 0 R (section*.82) 919 0 R (section*.83) 921 0 R (section*.84) 923 0 R (section*.85) 930 0 R (section*.86) 931 0 R (section*.87) 937 0 R (section*.88) 938 0 R (section*.89) 943 0 R (section*.9) 645 0 R (section*.90) 945 0 R (section*.91) 946 0 R (section*.92) 947 0 R (section*.93) 952 0 R (section*.94) 957 0 R (section*.95) 959 0 R (section*.96) 966 0 R (section*.97) 967 0 R (section*.98) 968 0 R (section*.99) 970 0 R (section.1) 6 0 R (section.2) 26 0 R (section.3) 78 0 R (section.4) 94 0 R (section.5) 278 0 R (subsection.1.1) 10 0 R (subsection.1.2) 14 0 R (subsection.1.3) 18 0 R (subsection.1.4) 22 0 R (subsection.2.1) 30 0 R (subsection.2.10) 66 0 R (subsection.2.11) 70 0 R (subsection.2.12) 74 0 R (subsection.2.2) 34 0 R (subsection.2.3) 38 0 R (subsection.2.4) 42 0 R (subsection.2.5) 46 0 R (subsection.2.6) 50 0 R (subsection.2.7) 54 0 R (subsection.2.8) 58 0 R (subsection.2.9) 62 0 R (subsection.3.1) 82 0 R (subsection.3.2) 86 0 R (subsection.3.3) 90 0 R (subsection.4.1) 98 0 R (subsection.4.10) 226 0 R (subsection.4.11) 238 0 R (subsection.4.12) 242 0 R (subsection.4.2) 102 0 R (subsection.4.3) 130 0 R (subsection.4.4) 154 0 R (subsection.4.5) 170 0 R (subsection.4.6) 190 0 R (subsection.4.7) 206 0 R (subsection.4.8) 218 0 R (subsection.4.9) 222 0 R (subsection.5.1) 282 0 R (subsection.5.2) 286 0 R (subsection.5.3) 290 0 R (subsection.5.4) 294 0 R (subsection.5.5) 298 0 R (subsection.5.6) 302 0 R (subsection.5.7) 318 0 R (subsection.5.8) 330 0 R (subsection.5.9) 334 0 R (subsubsection.4.10.1) 230 0 R (subsubsection.4.10.2) 234 0 R (subsubsection.4.12.1) 246 0 R (subsubsection.4.12.2) 250 0 R (subsubsection.4.12.3) 254 0 R (subsubsection.4.12.4) 258 0 R (subsubsection.4.12.5) 262 0 R (subsubsection.4.12.6) 266 0 R (subsubsection.4.12.7) 270 0 R (subsubsection.4.12.8) 274 0 R (subsubsection.4.2.1) 106 0 R (subsubsection.4.2.2) 110 0 R (subsubsection.4.2.3) 114 0 R (subsubsection.4.2.4) 118 0 R (subsubsection.4.2.5) 122 0 R (subsubsection.4.2.6) 126 0 R (subsubsection.4.3.1) 134 0 R (subsubsection.4.3.2) 138 0 R (subsubsection.4.3.3) 142 0 R (subsubsection.4.3.4) 146 0 R (subsubsection.4.3.5) 150 0 R (subsubsection.4.4.1) 158 0 R (subsubsection.4.4.2) 162 0 R (subsubsection.4.4.3) 166 0 R (subsubsection.4.5.1) 174 0 R (subsubsection.4.5.2) 178 0 R (subsubsection.4.5.3) 182 0 R (subsubsection.4.5.4) 186 0 R (subsubsection.4.6.1) 194 0 R (subsubsection.4.6.2) 198 0 R (subsubsection.4.6.3) 202 0 R (subsubsection.4.7.1) 210 0 R (subsubsection.4.7.2) 214 0 R (subsubsection.5.6.1) 306 0 R (subsubsection.5.6.2) 310 0 R (subsubsection.5.6.3) 314 0 R (subsubsection.5.7.1) 322 0 R (subsubsection.5.7.2) 326 0 R (subsubsection.5.9.1) 338 0 R (subsubsection.5.9.10) 374 0 R (subsubsection.5.9.11) 378 0 R (subsubsection.5.9.12) 382 0 R (subsubsection.5.9.13) 386 0 R (subsubsection.5.9.14) 390 0 R (subsubsection.5.9.15) 394 0 R (subsubsection.5.9.16) 398 0 R (subsubsection.5.9.2) 342 0 R (subsubsection.5.9.3) 346 0 R (subsubsection.5.9.4) 350 0 R (subsubsection.5.9.5) 354 0 R (subsubsection.5.9.6) 358 0 R (subsubsection.5.9.7) 362 0 R (subsubsection.5.9.8) 366 0 R (subsubsection.5.9.9) 370 0 R] +/Limits [(Doc-Start) (subsubsection.5.9.9)] >> endobj -1175 0 obj << -/Kids [1174 0 R] +1977 0 obj << +/Kids [1976 0 R] >> endobj -1176 0 obj << -/Dests 1175 0 R +1978 0 obj << +/Dests 1977 0 R >> endobj -1177 0 obj << +1979 0 obj << /Type /Catalog -/Pages 1172 0 R -/Outlines 1173 0 R -/Names 1176 0 R -/PageMode /none -/OpenAction 361 0 R -/PTEX.Fullbanner (This is pdfTeX, Version 3.14159-1.00b-pretest-20020211) +/Pages 1974 0 R +/Outlines 1975 0 R +/Names 1978 0 R +/PageMode /none /PageLabels << /Nums [0 << /S /r >> 3 << /S /D >> ] >> +/OpenAction 401 0 R >> endobj -1178 0 obj << -/Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.00b)/Keywords() -/Producer (pdfTeX-1.0b-pdfcrypt) -/CreationDate (D:20031114142200) +1980 0 obj << +/Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfeTeX-1.303)/Keywords() +/CreationDate (D:20060526140543-05'00') +/PTEX.Fullbanner (This is pdfeTeX, Version 3.141592--1.30.3--2.2 (Web2c 7.5.5) kpathsea version 3.5.5) >> endobj xref -0 1179 +0 1981 0000000001 65535 f 0000000002 00000 f 0000000003 00000 f 0000000004 00000 f -0000000367 00000 f -0000000009 00000 n -0000034093 00000 n -0000379452 00000 n -0000000054 00000 n -0000000084 00000 n -0000034153 00000 n -0000379380 00000 n -0000000134 00000 n -0000000157 00000 n -0000034214 00000 n -0000379294 00000 n -0000000208 00000 n -0000000231 00000 n -0000038947 00000 n -0000379208 00000 n -0000000282 00000 n -0000000306 00000 n -0000039008 00000 n -0000379135 00000 n -0000000357 00000 n -0000000380 00000 n -0000047987 00000 n -0000379009 00000 n -0000000426 00000 n -0000000453 00000 n -0000048048 00000 n -0000378935 00000 n -0000000504 00000 n -0000000546 00000 n -0000048108 00000 n -0000378848 00000 n -0000000597 00000 n -0000000653 00000 n -0000052303 00000 n -0000378761 00000 n -0000000704 00000 n -0000000772 00000 n -0000052364 00000 n -0000378674 00000 n -0000000823 00000 n -0000000879 00000 n -0000052425 00000 n -0000378587 00000 n -0000000930 00000 n -0000000981 00000 n -0000052486 00000 n -0000378500 00000 n -0000001032 00000 n -0000001112 00000 n -0000057109 00000 n -0000378413 00000 n -0000001163 00000 n -0000001224 00000 n -0000057170 00000 n -0000378326 00000 n -0000001275 00000 n -0000001340 00000 n -0000057231 00000 n -0000378239 00000 n -0000001391 00000 n -0000001475 00000 n -0000057292 00000 n -0000378165 00000 n -0000001527 00000 n -0000001566 00000 n -0000062932 00000 n -0000378036 00000 n -0000001612 00000 n -0000001642 00000 n -0000062993 00000 n -0000377962 00000 n -0000001693 00000 n -0000001735 00000 n -0000072003 00000 n -0000377835 00000 n -0000001786 00000 n -0000001813 00000 n -0000072064 00000 n -0000377761 00000 n -0000001869 00000 n -0000001903 00000 n -0000072125 00000 n -0000377674 00000 n -0000001959 00000 n -0000002008 00000 n -0000081166 00000 n -0000377587 00000 n -0000002064 00000 n -0000002107 00000 n -0000081227 00000 n -0000377500 00000 n -0000002163 00000 n -0000002210 00000 n -0000093245 00000 n -0000377411 00000 n -0000002266 00000 n -0000002307 00000 n -0000096930 00000 n -0000377320 00000 n -0000002364 00000 n -0000002391 00000 n -0000100791 00000 n -0000377228 00000 n -0000002448 00000 n -0000002482 00000 n -0000104830 00000 n -0000377136 00000 n -0000002539 00000 n -0000002573 00000 n -0000104892 00000 n -0000377044 00000 n -0000002630 00000 n -0000002676 00000 n -0000113377 00000 n -0000376966 00000 n -0000002734 00000 n -0000002787 00000 n -0000113439 00000 n -0000376836 00000 n -0000002839 00000 n -0000002865 00000 n -0000113501 00000 n -0000376757 00000 n -0000002922 00000 n -0000002969 00000 n -0000113563 00000 n -0000376664 00000 n -0000003026 00000 n -0000003062 00000 n -0000116572 00000 n -0000376571 00000 n -0000003119 00000 n -0000003152 00000 n -0000121654 00000 n -0000376478 00000 n -0000003209 00000 n -0000003251 00000 n -0000121716 00000 n -0000376399 00000 n +0000000000 00000 f +0000000015 00000 n +0000040323 00000 n +0000692087 00000 n +0000000060 00000 n +0000000090 00000 n +0000040375 00000 n +0000692015 00000 n +0000000140 00000 n +0000000163 00000 n +0000040432 00000 n +0000691929 00000 n +0000000214 00000 n +0000000237 00000 n +0000040489 00000 n +0000691843 00000 n +0000000288 00000 n +0000000312 00000 n +0000045306 00000 n +0000691770 00000 n +0000000363 00000 n +0000000386 00000 n +0000057035 00000 n +0000691644 00000 n +0000000432 00000 n +0000000459 00000 n +0000057088 00000 n +0000691570 00000 n +0000000510 00000 n +0000000553 00000 n +0000057145 00000 n +0000691483 00000 n +0000000604 00000 n +0000000661 00000 n +0000061828 00000 n +0000691396 00000 n +0000000712 00000 n +0000000781 00000 n +0000061885 00000 n +0000691309 00000 n +0000000832 00000 n +0000000889 00000 n +0000061942 00000 n +0000691222 00000 n +0000000940 00000 n +0000000992 00000 n +0000061999 00000 n +0000691135 00000 n +0000001043 00000 n +0000001124 00000 n +0000066477 00000 n +0000691048 00000 n +0000001175 00000 n +0000001250 00000 n +0000066532 00000 n +0000690961 00000 n +0000001301 00000 n +0000001363 00000 n +0000066589 00000 n +0000690874 00000 n +0000001414 00000 n +0000001480 00000 n +0000066646 00000 n +0000690787 00000 n +0000001532 00000 n +0000001617 00000 n +0000070665 00000 n +0000690700 00000 n +0000001669 00000 n +0000001713 00000 n +0000070722 00000 n +0000690626 00000 n +0000001765 00000 n +0000001798 00000 n +0000075307 00000 n +0000690500 00000 n +0000001844 00000 n +0000001883 00000 n +0000075360 00000 n +0000690426 00000 n +0000001934 00000 n +0000001981 00000 n +0000075417 00000 n +0000690339 00000 n +0000002032 00000 n +0000002067 00000 n +0000077681 00000 n +0000690265 00000 n +0000002118 00000 n +0000002175 00000 n +0000081900 00000 n +0000690136 00000 n +0000002221 00000 n +0000002251 00000 n +0000081953 00000 n +0000690060 00000 n +0000002302 00000 n +0000002345 00000 n +0000091114 00000 n +0000689930 00000 n +0000002397 00000 n +0000002432 00000 n +0000096505 00000 n +0000689851 00000 n +0000002489 00000 n +0000002538 00000 n +0000105931 00000 n +0000689758 00000 n +0000002595 00000 n +0000002642 00000 n +0000105985 00000 n +0000689665 00000 n +0000002699 00000 n +0000002746 00000 n +0000122744 00000 n +0000689572 00000 n +0000002803 00000 n +0000002849 00000 n +0000135161 00000 n +0000689479 00000 n +0000002906 00000 n +0000002932 00000 n +0000139692 00000 n +0000689400 00000 n +0000002989 00000 n +0000003034 00000 n +0000147702 00000 n +0000689269 00000 n +0000003086 00000 n +0000003113 00000 n +0000147760 00000 n +0000689190 00000 n +0000003170 00000 n +0000003216 00000 n +0000147876 00000 n +0000689097 00000 n +0000003273 00000 n 0000003308 00000 n -0000003345 00000 n -0000121777 00000 n -0000376268 00000 n +0000151281 00000 n +0000689004 00000 n +0000003365 00000 n 0000003397 00000 n -0000003439 00000 n -0000125647 00000 n -0000376189 00000 n -0000003496 00000 n -0000003533 00000 n -0000125709 00000 n -0000376096 00000 n -0000003590 00000 n -0000003644 00000 n -0000129680 00000 n -0000376017 00000 n -0000003701 00000 n -0000003728 00000 n -0000129742 00000 n -0000375886 00000 n -0000003780 00000 n -0000003816 00000 n -0000129804 00000 n -0000375807 00000 n -0000003873 00000 n -0000003901 00000 n -0000138745 00000 n -0000375714 00000 n -0000003958 00000 n -0000004024 00000 n -0000142659 00000 n -0000375621 00000 n -0000004081 00000 n +0000151339 00000 n +0000688911 00000 n +0000003454 00000 n +0000003495 00000 n +0000151455 00000 n +0000688832 00000 n +0000003552 00000 n +0000003589 00000 n +0000156499 00000 n +0000688701 00000 n +0000003641 00000 n +0000003683 00000 n +0000160622 00000 n +0000688622 00000 n +0000003740 00000 n +0000003776 00000 n +0000164735 00000 n +0000688529 00000 n +0000003833 00000 n +0000003902 00000 n +0000169682 00000 n +0000688450 00000 n +0000003959 00000 n +0000003985 00000 n +0000179035 00000 n +0000688319 00000 n +0000004037 00000 n +0000004075 00000 n +0000179151 00000 n +0000688240 00000 n 0000004132 00000 n -0000146776 00000 n -0000375542 00000 n -0000004189 00000 n -0000004218 00000 n -0000146838 00000 n -0000375411 00000 n -0000004270 00000 n -0000004313 00000 n -0000146900 00000 n -0000375332 00000 n -0000004370 00000 n -0000004408 00000 n -0000151603 00000 n -0000375239 00000 n -0000004465 00000 n -0000004503 00000 n -0000155500 00000 n -0000375160 00000 n -0000004560 00000 n -0000004608 00000 n -0000171420 00000 n -0000375029 00000 n -0000004660 00000 n -0000004700 00000 n -0000171482 00000 n -0000374950 00000 n -0000004757 00000 n -0000004790 00000 n -0000185187 00000 n -0000374871 00000 n -0000004847 00000 n -0000004890 00000 n -0000188957 00000 n -0000374779 00000 n -0000004942 00000 n -0000004998 00000 n -0000192784 00000 n -0000374687 00000 n -0000005050 00000 n -0000005085 00000 n -0000192846 00000 n -0000374556 00000 n -0000005138 00000 n -0000005176 00000 n -0000192907 00000 n -0000374477 00000 n -0000005234 00000 n -0000005306 00000 n -0000196785 00000 n -0000374398 00000 n -0000005364 00000 n -0000005408 00000 n -0000206517 00000 n -0000374306 00000 n -0000005461 00000 n -0000005492 00000 n -0000215527 00000 n -0000374189 00000 n -0000005545 00000 n -0000005584 00000 n -0000215589 00000 n -0000374110 00000 n -0000005642 00000 n -0000005674 00000 n -0000238306 00000 n -0000374031 00000 n -0000005732 00000 n -0000005760 00000 n -0000243617 00000 n -0000373913 00000 n -0000005807 00000 n -0000005837 00000 n -0000243679 00000 n -0000373834 00000 n -0000005889 00000 n -0000005926 00000 n -0000243741 00000 n -0000373741 00000 n -0000005978 00000 n -0000006014 00000 n -0000243803 00000 n -0000373648 00000 n -0000006066 00000 n -0000006104 00000 n -0000246106 00000 n -0000373555 00000 n -0000006156 00000 n -0000006206 00000 n -0000248948 00000 n -0000373462 00000 n -0000006258 00000 n -0000006320 00000 n -0000253115 00000 n -0000373330 00000 n -0000006372 00000 n -0000006434 00000 n -0000253177 00000 n -0000373251 00000 n -0000006491 00000 n -0000006527 00000 n -0000253239 00000 n -0000373158 00000 n -0000006584 00000 n -0000006628 00000 n -0000256626 00000 n -0000373079 00000 n -0000006685 00000 n -0000006722 00000 n -0000261157 00000 n -0000372947 00000 n -0000006774 00000 n -0000006825 00000 n -0000261219 00000 n -0000372868 00000 n -0000006882 00000 n -0000006916 00000 n -0000264213 00000 n -0000372789 00000 n -0000006973 00000 n -0000007007 00000 n -0000281262 00000 n -0000372696 00000 n -0000007059 00000 n -0000007128 00000 n -0000323528 00000 n -0000372577 00000 n -0000007180 00000 n -0000007224 00000 n -0000323591 00000 n -0000372498 00000 n +0000004159 00000 n +0000195772 00000 n +0000688147 00000 n +0000004216 00000 n +0000004281 00000 n +0000204383 00000 n +0000688054 00000 n +0000004338 00000 n +0000004388 00000 n +0000204498 00000 n +0000687975 00000 n +0000004445 00000 n +0000004473 00000 n +0000204556 00000 n +0000687844 00000 n +0000004525 00000 n +0000004568 00000 n +0000204613 00000 n +0000687765 00000 n +0000004625 00000 n +0000004663 00000 n +0000209588 00000 n +0000687672 00000 n +0000004720 00000 n +0000004758 00000 n +0000224305 00000 n +0000687593 00000 n +0000004815 00000 n +0000004863 00000 n +0000241274 00000 n +0000687462 00000 n +0000004915 00000 n +0000004955 00000 n +0000241332 00000 n +0000687383 00000 n +0000005012 00000 n +0000005044 00000 n +0000259441 00000 n +0000687304 00000 n +0000005101 00000 n +0000005144 00000 n +0000263566 00000 n +0000687212 00000 n +0000005196 00000 n +0000005252 00000 n +0000267705 00000 n +0000687120 00000 n +0000005304 00000 n +0000005339 00000 n +0000267821 00000 n +0000686989 00000 n +0000005392 00000 n +0000005430 00000 n +0000267879 00000 n +0000686910 00000 n +0000005488 00000 n +0000005551 00000 n +0000271973 00000 n +0000686831 00000 n +0000005609 00000 n +0000005647 00000 n +0000283022 00000 n +0000686739 00000 n +0000005700 00000 n +0000005731 00000 n +0000297197 00000 n +0000686622 00000 n +0000005784 00000 n +0000005823 00000 n +0000297256 00000 n +0000686543 00000 n +0000005881 00000 n +0000005908 00000 n +0000301504 00000 n +0000686450 00000 n +0000005966 00000 n +0000005996 00000 n +0000305358 00000 n +0000686357 00000 n +0000006054 00000 n +0000006091 00000 n +0000305473 00000 n +0000686264 00000 n +0000006149 00000 n +0000006196 00000 n +0000318582 00000 n +0000686171 00000 n +0000006254 00000 n +0000006303 00000 n +0000322572 00000 n +0000686078 00000 n +0000006361 00000 n +0000006420 00000 n +0000326749 00000 n +0000685985 00000 n +0000006478 00000 n +0000006512 00000 n +0000334089 00000 n +0000685906 00000 n +0000006570 00000 n +0000006603 00000 n +0000354875 00000 n +0000685788 00000 n +0000006650 00000 n +0000006680 00000 n +0000354930 00000 n +0000685709 00000 n +0000006732 00000 n +0000006769 00000 n +0000354989 00000 n +0000685616 00000 n +0000006821 00000 n +0000006857 00000 n +0000355047 00000 n +0000685523 00000 n +0000006909 00000 n +0000006948 00000 n +0000357486 00000 n +0000685430 00000 n +0000007000 00000 n +0000007051 00000 n +0000360804 00000 n +0000685337 00000 n +0000007103 00000 n +0000007166 00000 n +0000365296 00000 n +0000685205 00000 n +0000007218 00000 n 0000007281 00000 n -0000007308 00000 n -0000323654 00000 n -0000372405 00000 n -0000007365 00000 n -0000007401 00000 n -0000323717 00000 n -0000372312 00000 n -0000007458 00000 n -0000007494 00000 n -0000325161 00000 n -0000372219 00000 n -0000007551 00000 n -0000007578 00000 n -0000325224 00000 n -0000372126 00000 n -0000007635 00000 n -0000007680 00000 n -0000325287 00000 n -0000372033 00000 n -0000007737 00000 n -0000007779 00000 n -0000325350 00000 n -0000371940 00000 n -0000007836 00000 n -0000007871 00000 n -0000325413 00000 n -0000371847 00000 n -0000007928 00000 n -0000007963 00000 n -0000326929 00000 n -0000371754 00000 n -0000008020 00000 n -0000008055 00000 n -0000326992 00000 n -0000371661 00000 n -0000008113 00000 n -0000008148 00000 n -0000327055 00000 n -0000371568 00000 n -0000008206 00000 n -0000008243 00000 n -0000327118 00000 n -0000371475 00000 n -0000008301 00000 n -0000008343 00000 n -0000327181 00000 n -0000371382 00000 n -0000008401 00000 n -0000008425 00000 n -0000327244 00000 n -0000371303 00000 n -0000008483 00000 n -0000008507 00000 n -0000010817 00000 n -0000016109 00000 n -0000008560 00000 n -0000015923 00000 n -0000015985 00000 n -0000000372 00000 f -0000369398 00000 n -0000368692 00000 n -0000366418 00000 n -0000368529 00000 n -0000000382 00000 f -0000366326 00000 n -0000016047 00000 n -0000011181 00000 n -0000011333 00000 n -0000011490 00000 n -0000011647 00000 n -0000011804 00000 n -0000011961 00000 n -0000012113 00000 n -0000000483 00000 f -0000366235 00000 n -0000365343 00000 n -0000347551 00000 n -0000365159 00000 n -0000012269 00000 n -0000012426 00000 n -0000012583 00000 n -0000012739 00000 n -0000012896 00000 n -0000013053 00000 n -0000013210 00000 n -0000013367 00000 n -0000013524 00000 n -0000013682 00000 n -0000013834 00000 n -0000013990 00000 n -0000014147 00000 n -0000014308 00000 n -0000014470 00000 n -0000014632 00000 n -0000014794 00000 n -0000014956 00000 n -0000015118 00000 n -0000015280 00000 n -0000015441 00000 n -0000015603 00000 n -0000015766 00000 n -0000369491 00000 n -0000025838 00000 n -0000018437 00000 n -0000016233 00000 n -0000025776 00000 n -0000018905 00000 n -0000019067 00000 n -0000019228 00000 n -0000019390 00000 n -0000019551 00000 n -0000019713 00000 n -0000019869 00000 n -0000020031 00000 n -0000020193 00000 n -0000020355 00000 n -0000020512 00000 n -0000020673 00000 n -0000020835 00000 n -0000020996 00000 n -0000021158 00000 n -0000021315 00000 n -0000021477 00000 n -0000021639 00000 n -0000021801 00000 n -0000021958 00000 n -0000022120 00000 n -0000022282 00000 n -0000022439 00000 n -0000022596 00000 n -0000022754 00000 n +0000365351 00000 n +0000685126 00000 n +0000007338 00000 n +0000007374 00000 n +0000365410 00000 n +0000685033 00000 n +0000007431 00000 n +0000007475 00000 n +0000369115 00000 n +0000684954 00000 n +0000007532 00000 n +0000007569 00000 n +0000373999 00000 n +0000684822 00000 n +0000007621 00000 n +0000007673 00000 n +0000374058 00000 n +0000684743 00000 n +0000007730 00000 n +0000007764 00000 n +0000377109 00000 n +0000684664 00000 n +0000007821 00000 n +0000007855 00000 n +0000396780 00000 n +0000684571 00000 n +0000007907 00000 n +0000007969 00000 n +0000478325 00000 n +0000684452 00000 n +0000008021 00000 n +0000008066 00000 n +0000478383 00000 n +0000684373 00000 n +0000008123 00000 n +0000008156 00000 n +0000478442 00000 n +0000684280 00000 n +0000008213 00000 n +0000008251 00000 n +0000478505 00000 n +0000684187 00000 n +0000008308 00000 n +0000008357 00000 n +0000478568 00000 n +0000684094 00000 n +0000008414 00000 n +0000008452 00000 n +0000496027 00000 n +0000684001 00000 n +0000008509 00000 n +0000008536 00000 n +0000496085 00000 n +0000683908 00000 n +0000008593 00000 n +0000008638 00000 n +0000496144 00000 n +0000683815 00000 n +0000008695 00000 n +0000008742 00000 n +0000496207 00000 n +0000683722 00000 n +0000008799 00000 n +0000008831 00000 n +0000513731 00000 n +0000683629 00000 n +0000008888 00000 n +0000008923 00000 n +0000513790 00000 n +0000683536 00000 n +0000008981 00000 n +0000009015 00000 n +0000513849 00000 n +0000683443 00000 n +0000009073 00000 n +0000009108 00000 n +0000513912 00000 n +0000683350 00000 n +0000009166 00000 n +0000009201 00000 n +0000531923 00000 n +0000683257 00000 n +0000009259 00000 n +0000009296 00000 n +0000531982 00000 n +0000683164 00000 n +0000009354 00000 n +0000009396 00000 n +0000532045 00000 n +0000683071 00000 n +0000009454 00000 n +0000009478 00000 n +0000532108 00000 n +0000682992 00000 n +0000009536 00000 n +0000009560 00000 n +0000012945 00000 n +0000018016 00000 n +0000009627 00000 n +0000017846 00000 n +0000017904 00000 n +0000679314 00000 n +0000658400 00000 n +0000679139 00000 n +0000657513 00000 n +0000653939 00000 n +0000657350 00000 n +0000653137 00000 n +0000637777 00000 n +0000652962 00000 n +0000017958 00000 n +0000013301 00000 n +0000013453 00000 n +0000013610 00000 n +0000013767 00000 n +0000013923 00000 n +0000014080 00000 n +0000014232 00000 n +0000637264 00000 n +0000626845 00000 n +0000637098 00000 n +0000625916 00000 n +0000613017 00000 n +0000625750 00000 n +0000014389 00000 n +0000014546 00000 n +0000014703 00000 n +0000014859 00000 n +0000015016 00000 n +0000015173 00000 n +0000015329 00000 n +0000015486 00000 n +0000015642 00000 n +0000015800 00000 n +0000015956 00000 n +0000016114 00000 n +0000016265 00000 n +0000016421 00000 n +0000016578 00000 n +0000016735 00000 n +0000016887 00000 n +0000017044 00000 n +0000017199 00000 n +0000017361 00000 n +0000017522 00000 n +0000017684 00000 n +0000680571 00000 n +0000029225 00000 n +0000021636 00000 n +0000018142 00000 n +0000029167 00000 n +0000022112 00000 n +0000022274 00000 n +0000022436 00000 n +0000022593 00000 n +0000022755 00000 n 0000022917 00000 n 0000023079 00000 n -0000023237 00000 n -0000023394 00000 n -0000023557 00000 n -0000023720 00000 n -0000023872 00000 n -0000024029 00000 n -0000024186 00000 n -0000024343 00000 n -0000024500 00000 n -0000024657 00000 n -0000024814 00000 n -0000024976 00000 n -0000025135 00000 n -0000025297 00000 n -0000025453 00000 n -0000025614 00000 n -0000029774 00000 n -0000026880 00000 n -0000025936 00000 n -0000029712 00000 n -0000027132 00000 n -0000027289 00000 n -0000027445 00000 n -0000027607 00000 n -0000027768 00000 n -0000027930 00000 n -0000028091 00000 n -0000028253 00000 n -0000028414 00000 n -0000028575 00000 n -0000028737 00000 n -0000028898 00000 n -0000029061 00000 n -0000029223 00000 n -0000029386 00000 n -0000029549 00000 n -0000034337 00000 n -0000033746 00000 n -0000029846 00000 n -0000034031 00000 n -0000033878 00000 n -0000000505 00000 f -0000347457 00000 n -0000034275 00000 n -0000039193 00000 n -0000038278 00000 n -0000034449 00000 n -0000038885 00000 n -0000038426 00000 n -0000038580 00000 n -0000038734 00000 n -0000039069 00000 n -0000039131 00000 n -0000043464 00000 n -0000043055 00000 n -0000039318 00000 n -0000043340 00000 n -0000043187 00000 n -0000043402 00000 n -0000048169 00000 n -0000047471 00000 n -0000043576 00000 n -0000047925 00000 n -0000000508 00000 f -0000347361 00000 n -0000047611 00000 n -0000000000 00000 f -0000347292 00000 n -0000047768 00000 n -0000369609 00000 n -0000052609 00000 n -0000051955 00000 n -0000048307 00000 n -0000052241 00000 n -0000052087 00000 n -0000052547 00000 n -0000057353 00000 n -0000056758 00000 n -0000052748 00000 n -0000057047 00000 n -0000056890 00000 n -0000059243 00000 n -0000058892 00000 n -0000057505 00000 n -0000059181 00000 n -0000059024 00000 n -0000063054 00000 n -0000062758 00000 n -0000059328 00000 n -0000062870 00000 n -0000346850 00000 n -0000344548 00000 n -0000346688 00000 n -0000344162 00000 n -0000341989 00000 n -0000343999 00000 n -0000067383 00000 n -0000067209 00000 n -0000063217 00000 n -0000067321 00000 n -0000072186 00000 n -0000071652 00000 n -0000067533 00000 n -0000071941 00000 n -0000071784 00000 n -0000369727 00000 n -0000076195 00000 n -0000075670 00000 n -0000072337 00000 n -0000076133 00000 n -0000075810 00000 n -0000075972 00000 n -0000081288 00000 n -0000079981 00000 n -0000076333 00000 n -0000081104 00000 n -0000080153 00000 n -0000080315 00000 n -0000080476 00000 n -0000080632 00000 n -0000080789 00000 n -0000080946 00000 n -0000085718 00000 n -0000085032 00000 n -0000081425 00000 n -0000085656 00000 n -0000085180 00000 n -0000085342 00000 n -0000085499 00000 n -0000089677 00000 n -0000089104 00000 n -0000085830 00000 n -0000089554 00000 n -0000089244 00000 n -0000089400 00000 n -0000089616 00000 n -0000093306 00000 n -0000093071 00000 n -0000089789 00000 n -0000093183 00000 n -0000096992 00000 n -0000096574 00000 n -0000093456 00000 n -0000096868 00000 n -0000096706 00000 n -0000369845 00000 n -0000100853 00000 n -0000100617 00000 n -0000097130 00000 n -0000100729 00000 n -0000105016 00000 n -0000104313 00000 n -0000100991 00000 n -0000104768 00000 n -0000104453 00000 n -0000104614 00000 n -0000104954 00000 n -0000109545 00000 n -0000109194 00000 n -0000105154 00000 n -0000109483 00000 n -0000109326 00000 n -0000113625 00000 n -0000113203 00000 n -0000109682 00000 n -0000113315 00000 n -0000116634 00000 n -0000116398 00000 n -0000113789 00000 n -0000116510 00000 n -0000341457 00000 n -0000332324 00000 n -0000341272 00000 n -0000121838 00000 n -0000120959 00000 n -0000116773 00000 n -0000121592 00000 n -0000121107 00000 n -0000121269 00000 n -0000121430 00000 n -0000369963 00000 n -0000125771 00000 n -0000125291 00000 n -0000121976 00000 n -0000125585 00000 n -0000125423 00000 n -0000129865 00000 n -0000129324 00000 n -0000125908 00000 n -0000129618 00000 n -0000129456 00000 n -0000133916 00000 n -0000133390 00000 n -0000130003 00000 n -0000133854 00000 n -0000133530 00000 n -0000133692 00000 n -0000138869 00000 n -0000137740 00000 n -0000134041 00000 n -0000138683 00000 n -0000137904 00000 n -0000138061 00000 n -0000138217 00000 n -0000138373 00000 n -0000138529 00000 n -0000138807 00000 n -0000142721 00000 n -0000142485 00000 n -0000139006 00000 n -0000142597 00000 n -0000146962 00000 n -0000146602 00000 n -0000142846 00000 n -0000146714 00000 n -0000330197 00000 n -0000328123 00000 n -0000330032 00000 n -0000370081 00000 n -0000151665 00000 n -0000151248 00000 n -0000147126 00000 n -0000151541 00000 n -0000151380 00000 n -0000155562 00000 n -0000155145 00000 n -0000151829 00000 n -0000155438 00000 n -0000155277 00000 n -0000159723 00000 n -0000159368 00000 n -0000155713 00000 n -0000159661 00000 n -0000159500 00000 n -0000163348 00000 n -0000163174 00000 n -0000159835 00000 n -0000163286 00000 n -0000166877 00000 n -0000166521 00000 n -0000163460 00000 n -0000166815 00000 n -0000166653 00000 n -0000171543 00000 n -0000171246 00000 n -0000166989 00000 n -0000171358 00000 n -0000370199 00000 n -0000175590 00000 n -0000175416 00000 n -0000171694 00000 n -0000175528 00000 n -0000180472 00000 n -0000180118 00000 n -0000175728 00000 n -0000180410 00000 n -0000180250 00000 n -0000185249 00000 n -0000184506 00000 n -0000180610 00000 n -0000185125 00000 n -0000184654 00000 n -0000184811 00000 n -0000184968 00000 n -0000189019 00000 n -0000188602 00000 n -0000185374 00000 n -0000188895 00000 n -0000188734 00000 n -0000192969 00000 n -0000192610 00000 n -0000189144 00000 n -0000192722 00000 n -0000196845 00000 n -0000196611 00000 n -0000193120 00000 n -0000196723 00000 n -0000370317 00000 n -0000199541 00000 n -0000199367 00000 n -0000196995 00000 n -0000199479 00000 n -0000202782 00000 n -0000202608 00000 n -0000199653 00000 n -0000202720 00000 n -0000206579 00000 n -0000206343 00000 n -0000202932 00000 n -0000206455 00000 n -0000209562 00000 n -0000209388 00000 n -0000206717 00000 n -0000209500 00000 n -0000212342 00000 n -0000212168 00000 n -0000209674 00000 n -0000212280 00000 n -0000215651 00000 n -0000215353 00000 n -0000212479 00000 n -0000215465 00000 n -0000370435 00000 n -0000219452 00000 n -0000219042 00000 n -0000215789 00000 n -0000219328 00000 n -0000219174 00000 n -0000219390 00000 n -0000222740 00000 n -0000222566 00000 n -0000219564 00000 n -0000222678 00000 n -0000226148 00000 n -0000225974 00000 n -0000222878 00000 n -0000226086 00000 n -0000230343 00000 n -0000229932 00000 n -0000226298 00000 n -0000230219 00000 n -0000230064 00000 n -0000230281 00000 n -0000234375 00000 n -0000234019 00000 n -0000230468 00000 n -0000234313 00000 n -0000234151 00000 n -0000238430 00000 n -0000237788 00000 n -0000234487 00000 n -0000238244 00000 n -0000237928 00000 n -0000238089 00000 n -0000238368 00000 n -0000370553 00000 n -0000240709 00000 n -0000240535 00000 n -0000238542 00000 n -0000240647 00000 n -0000243865 00000 n -0000243443 00000 n -0000240807 00000 n -0000243555 00000 n -0000246168 00000 n -0000245932 00000 n -0000243976 00000 n -0000246044 00000 n -0000249010 00000 n -0000248774 00000 n -0000246279 00000 n -0000248886 00000 n -0000253301 00000 n -0000252941 00000 n -0000249146 00000 n -0000253053 00000 n -0000256688 00000 n -0000256452 00000 n -0000253425 00000 n -0000256564 00000 n -0000370671 00000 n -0000261343 00000 n -0000260808 00000 n -0000256813 00000 n -0000261095 00000 n -0000260940 00000 n -0000261281 00000 n -0000264274 00000 n -0000264039 00000 n -0000261481 00000 n -0000264151 00000 n -0000265549 00000 n -0000265375 00000 n -0000264412 00000 n -0000265487 00000 n -0000281324 00000 n -0000267534 00000 n -0000265648 00000 n -0000281200 00000 n -0000268346 00000 n -0000268496 00000 n -0000268646 00000 n -0000268796 00000 n -0000268946 00000 n -0000269096 00000 n -0000269246 00000 n -0000269396 00000 n -0000269546 00000 n -0000269696 00000 n -0000269846 00000 n -0000269996 00000 n -0000270146 00000 n -0000270296 00000 n -0000270445 00000 n -0000270594 00000 n -0000270744 00000 n -0000270894 00000 n -0000271043 00000 n -0000271191 00000 n -0000271340 00000 n -0000271489 00000 n -0000271639 00000 n -0000271788 00000 n -0000271937 00000 n -0000272086 00000 n -0000272236 00000 n -0000272385 00000 n -0000272534 00000 n -0000272683 00000 n -0000272833 00000 n -0000272983 00000 n -0000273133 00000 n -0000273283 00000 n -0000273432 00000 n -0000273580 00000 n -0000273729 00000 n -0000273878 00000 n -0000274028 00000 n -0000274178 00000 n -0000274327 00000 n -0000274477 00000 n -0000274626 00000 n -0000274775 00000 n -0000274924 00000 n -0000275073 00000 n -0000275222 00000 n -0000275371 00000 n -0000275521 00000 n -0000275669 00000 n -0000275818 00000 n -0000275967 00000 n -0000276116 00000 n -0000276264 00000 n -0000276414 00000 n -0000276561 00000 n -0000276710 00000 n -0000276860 00000 n -0000277009 00000 n -0000277159 00000 n -0000277309 00000 n -0000277459 00000 n -0000277608 00000 n -0000277757 00000 n -0000277907 00000 n -0000278057 00000 n -0000278207 00000 n -0000278357 00000 n -0000278506 00000 n -0000278656 00000 n -0000278805 00000 n -0000278954 00000 n -0000279104 00000 n -0000279254 00000 n -0000279403 00000 n -0000279553 00000 n -0000279703 00000 n -0000279853 00000 n -0000280003 00000 n -0000280153 00000 n -0000280301 00000 n -0000280451 00000 n -0000280600 00000 n -0000280750 00000 n -0000280900 00000 n -0000281050 00000 n -0000297146 00000 n -0000283271 00000 n -0000281449 00000 n -0000297084 00000 n -0000284091 00000 n -0000284241 00000 n -0000284390 00000 n -0000284540 00000 n -0000284689 00000 n -0000284839 00000 n -0000284988 00000 n -0000285138 00000 n -0000285288 00000 n -0000285436 00000 n -0000285586 00000 n -0000285735 00000 n -0000285885 00000 n -0000286034 00000 n -0000286184 00000 n -0000286332 00000 n -0000286482 00000 n -0000286631 00000 n -0000286781 00000 n -0000286930 00000 n -0000287080 00000 n -0000287229 00000 n -0000287378 00000 n -0000287528 00000 n -0000287677 00000 n -0000287827 00000 n -0000287977 00000 n -0000288126 00000 n -0000288276 00000 n -0000288425 00000 n -0000288574 00000 n -0000288723 00000 n -0000288873 00000 n -0000289022 00000 n -0000289172 00000 n -0000289322 00000 n -0000289472 00000 n -0000289622 00000 n -0000289772 00000 n -0000289922 00000 n -0000290071 00000 n -0000290221 00000 n -0000290370 00000 n -0000290518 00000 n -0000290667 00000 n -0000290816 00000 n -0000290964 00000 n -0000291112 00000 n -0000291261 00000 n -0000291409 00000 n -0000291557 00000 n -0000291705 00000 n -0000291855 00000 n -0000292005 00000 n -0000292155 00000 n -0000292305 00000 n -0000292454 00000 n -0000292604 00000 n -0000292754 00000 n -0000292904 00000 n -0000293053 00000 n -0000293202 00000 n -0000293352 00000 n -0000293502 00000 n -0000293652 00000 n -0000293802 00000 n -0000293950 00000 n -0000294099 00000 n -0000294248 00000 n -0000294396 00000 n -0000294545 00000 n -0000294694 00000 n -0000294843 00000 n -0000294992 00000 n -0000295141 00000 n -0000295291 00000 n -0000295440 00000 n -0000295588 00000 n -0000295737 00000 n -0000295887 00000 n -0000296037 00000 n -0000296187 00000 n -0000296336 00000 n -0000296486 00000 n -0000296635 00000 n -0000296785 00000 n -0000296934 00000 n -0000313437 00000 n -0000299045 00000 n -0000297271 00000 n -0000313374 00000 n -0000299972 00000 n -0000300123 00000 n -0000300273 00000 n -0000300424 00000 n -0000300574 00000 n -0000300725 00000 n -0000300875 00000 n -0000301025 00000 n -0000301176 00000 n -0000301327 00000 n -0000301478 00000 n -0000301629 00000 n -0000301780 00000 n -0000301931 00000 n -0000302082 00000 n -0000302232 00000 n -0000302383 00000 n -0000302534 00000 n -0000302685 00000 n -0000302836 00000 n -0000302987 00000 n -0000303138 00000 n -0000303288 00000 n -0000303439 00000 n -0000303590 00000 n -0000303740 00000 n -0000303891 00000 n -0000304042 00000 n -0000304192 00000 n -0000304342 00000 n -0000304493 00000 n -0000304641 00000 n -0000304792 00000 n -0000304942 00000 n -0000305093 00000 n -0000305242 00000 n -0000305393 00000 n -0000305544 00000 n -0000305695 00000 n -0000305846 00000 n -0000305997 00000 n -0000306147 00000 n -0000306298 00000 n -0000306448 00000 n -0000306599 00000 n -0000306749 00000 n -0000306900 00000 n -0000307049 00000 n -0000307200 00000 n -0000307350 00000 n -0000307501 00000 n -0000307652 00000 n -0000307803 00000 n -0000307954 00000 n -0000308104 00000 n -0000308255 00000 n -0000308406 00000 n -0000308557 00000 n -0000308708 00000 n -0000308859 00000 n -0000309010 00000 n -0000309161 00000 n -0000309312 00000 n -0000309463 00000 n -0000309614 00000 n -0000309765 00000 n -0000309916 00000 n -0000310067 00000 n -0000310218 00000 n -0000310368 00000 n -0000310518 00000 n -0000310669 00000 n -0000310817 00000 n -0000310968 00000 n -0000311117 00000 n -0000311268 00000 n -0000311418 00000 n -0000311568 00000 n -0000311718 00000 n -0000311869 00000 n -0000312019 00000 n -0000312170 00000 n -0000312320 00000 n -0000312471 00000 n -0000312622 00000 n -0000312772 00000 n -0000312923 00000 n -0000313073 00000 n -0000313224 00000 n -0000370789 00000 n -0000322276 00000 n -0000314583 00000 n -0000313536 00000 n -0000322212 00000 n -0000315134 00000 n -0000315285 00000 n -0000315435 00000 n -0000315585 00000 n -0000315736 00000 n -0000315886 00000 n -0000316037 00000 n -0000316186 00000 n -0000316337 00000 n -0000316488 00000 n -0000316639 00000 n -0000316790 00000 n -0000316940 00000 n -0000317091 00000 n -0000317242 00000 n -0000317393 00000 n -0000317543 00000 n -0000317694 00000 n -0000317845 00000 n -0000317994 00000 n -0000318144 00000 n -0000318293 00000 n -0000318443 00000 n -0000318592 00000 n -0000318742 00000 n -0000318893 00000 n -0000319043 00000 n -0000319194 00000 n -0000319345 00000 n -0000319496 00000 n -0000319647 00000 n -0000319798 00000 n -0000319949 00000 n -0000320100 00000 n -0000320251 00000 n -0000320402 00000 n -0000320553 00000 n -0000320704 00000 n -0000320855 00000 n -0000321006 00000 n -0000321157 00000 n -0000321308 00000 n -0000321459 00000 n -0000321610 00000 n -0000321761 00000 n -0000321912 00000 n -0000322062 00000 n -0000323780 00000 n -0000323348 00000 n -0000322375 00000 n -0000323464 00000 n -0000325475 00000 n -0000324981 00000 n -0000323879 00000 n -0000325097 00000 n -0000327307 00000 n -0000326749 00000 n -0000325561 00000 n -0000326865 00000 n -0000328037 00000 n -0000327857 00000 n -0000327393 00000 n -0000327973 00000 n -0000330430 00000 n -0000330395 00000 n -0000330533 00000 n -0000341710 00000 n -0000344426 00000 n -0000344387 00000 n -0000347151 00000 n -0000347078 00000 n -0000365884 00000 n -0000369218 00000 n -0000368971 00000 n -0000370913 00000 n -0000371033 00000 n -0000371154 00000 n -0000371227 00000 n -0000379562 00000 n -0000383684 00000 n -0000383725 00000 n -0000383765 00000 n -0000383966 00000 n +0000023241 00000 n +0000023403 00000 n +0000023560 00000 n +0000023722 00000 n +0000023884 00000 n +0000024046 00000 n +0000024203 00000 n +0000024365 00000 n +0000024527 00000 n +0000024689 00000 n +0000024851 00000 n +0000025007 00000 n +0000025169 00000 n +0000025330 00000 n +0000025492 00000 n +0000025648 00000 n +0000025810 00000 n +0000025972 00000 n +0000026128 00000 n +0000026285 00000 n +0000026443 00000 n +0000026606 00000 n +0000026768 00000 n +0000026926 00000 n +0000027084 00000 n +0000027247 00000 n +0000027410 00000 n +0000027573 00000 n +0000027736 00000 n +0000027899 00000 n +0000028062 00000 n +0000028225 00000 n +0000028388 00000 n +0000028540 00000 n +0000028697 00000 n +0000028853 00000 n +0000029010 00000 n +0000036105 00000 n +0000031526 00000 n +0000029325 00000 n +0000036047 00000 n +0000031858 00000 n +0000032015 00000 n +0000032172 00000 n +0000032334 00000 n +0000032496 00000 n +0000032658 00000 n +0000032815 00000 n +0000032977 00000 n +0000033139 00000 n +0000033296 00000 n +0000033453 00000 n +0000033615 00000 n +0000033777 00000 n +0000033939 00000 n +0000034101 00000 n +0000034263 00000 n +0000034425 00000 n +0000034587 00000 n +0000034748 00000 n +0000034910 00000 n +0000035072 00000 n +0000035235 00000 n +0000035397 00000 n +0000035559 00000 n +0000035722 00000 n +0000035885 00000 n +0000040608 00000 n +0000039979 00000 n +0000036177 00000 n +0000040265 00000 n +0000040111 00000 n +0000612322 00000 n +0000597801 00000 n +0000612143 00000 n +0000040546 00000 n +0000045425 00000 n +0000044962 00000 n +0000040722 00000 n +0000045248 00000 n +0000045094 00000 n +0000045363 00000 n +0000050068 00000 n +0000049662 00000 n +0000045552 00000 n +0000049948 00000 n +0000049794 00000 n +0000050006 00000 n +0000052138 00000 n +0000051968 00000 n +0000050168 00000 n +0000052080 00000 n +0000680689 00000 n +0000057202 00000 n +0000056355 00000 n +0000052264 00000 n +0000056977 00000 n +0000597304 00000 n +0000578286 00000 n +0000597138 00000 n +0000577796 00000 n +0000571065 00000 n +0000577625 00000 n +0000056503 00000 n +0000570638 00000 n +0000567055 00000 n +0000570458 00000 n +0000056660 00000 n +0000056821 00000 n +0000062118 00000 n +0000061484 00000 n +0000057371 00000 n +0000061770 00000 n +0000566713 00000 n +0000557343 00000 n +0000566547 00000 n +0000061616 00000 n +0000062056 00000 n +0000066703 00000 n +0000066131 00000 n +0000062287 00000 n +0000066419 00000 n +0000066263 00000 n +0000070779 00000 n +0000070148 00000 n +0000066885 00000 n +0000070607 00000 n +0000070288 00000 n +0000070450 00000 n +0000075598 00000 n +0000074801 00000 n +0000070934 00000 n +0000075249 00000 n +0000074941 00000 n +0000555142 00000 n +0000552985 00000 n +0000554979 00000 n +0000075095 00000 n +0000075474 00000 n +0000075536 00000 n +0000077734 00000 n +0000077511 00000 n +0000075738 00000 n +0000077623 00000 n +0000680807 00000 n +0000082188 00000 n +0000081396 00000 n +0000077848 00000 n +0000081842 00000 n +0000552543 00000 n +0000550257 00000 n +0000552381 00000 n +0000082010 00000 n +0000082068 00000 n +0000081536 00000 n +0000082126 00000 n +0000081689 00000 n +0000091056 00000 n +0000087125 00000 n +0000086661 00000 n +0000082353 00000 n +0000086947 00000 n +0000086793 00000 n +0000087005 00000 n +0000087063 00000 n +0000091288 00000 n +0000090832 00000 n +0000087276 00000 n +0000090944 00000 n +0000091002 00000 n +0000091172 00000 n +0000091230 00000 n +0000096795 00000 n +0000095144 00000 n +0000091440 00000 n +0000096447 00000 n +0000096559 00000 n +0000095324 00000 n +0000096617 00000 n +0000095478 00000 n +0000095639 00000 n +0000096675 00000 n +0000095799 00000 n +0000095961 00000 n +0000096123 00000 n +0000096285 00000 n +0000096733 00000 n +0000101004 00000 n +0000100544 00000 n +0000096934 00000 n +0000100656 00000 n +0000100714 00000 n +0000100772 00000 n +0000100830 00000 n +0000100888 00000 n +0000100946 00000 n +0000106159 00000 n +0000105082 00000 n +0000101155 00000 n +0000105873 00000 n +0000105238 00000 n +0000105399 00000 n +0000106043 00000 n +0000105560 00000 n +0000105716 00000 n +0000106101 00000 n +0000680925 00000 n +0000110048 00000 n +0000109423 00000 n +0000106272 00000 n +0000109878 00000 n +0000109936 00000 n +0000109563 00000 n +0000109990 00000 n +0000109724 00000 n +0000118670 00000 n +0000114564 00000 n +0000113540 00000 n +0000110161 00000 n +0000114332 00000 n +0000114390 00000 n +0000113696 00000 n +0000113852 00000 n +0000114014 00000 n +0000114444 00000 n +0000114502 00000 n +0000114169 00000 n +0000118786 00000 n +0000118327 00000 n +0000114690 00000 n +0000118612 00000 n +0000118459 00000 n +0000118728 00000 n +0000122860 00000 n +0000122516 00000 n +0000118937 00000 n +0000122628 00000 n +0000122686 00000 n +0000122802 00000 n +0000126619 00000 n +0000126391 00000 n +0000123012 00000 n +0000126503 00000 n +0000126561 00000 n +0000131511 00000 n +0000130759 00000 n +0000126760 00000 n +0000131217 00000 n +0000131275 00000 n +0000130899 00000 n +0000131333 00000 n +0000131054 00000 n +0000131391 00000 n +0000131449 00000 n +0000681043 00000 n +0000135451 00000 n +0000134991 00000 n +0000131665 00000 n +0000135103 00000 n +0000135219 00000 n +0000135277 00000 n +0000135335 00000 n +0000135393 00000 n +0000139808 00000 n +0000139464 00000 n +0000135589 00000 n +0000139576 00000 n +0000139634 00000 n +0000139750 00000 n +0000144009 00000 n +0000143490 00000 n +0000139946 00000 n +0000143778 00000 n +0000143836 00000 n +0000143622 00000 n +0000143893 00000 n +0000143951 00000 n +0000147934 00000 n +0000147532 00000 n +0000144147 00000 n +0000147644 00000 n +0000147818 00000 n +0000151513 00000 n +0000151111 00000 n +0000148087 00000 n +0000151223 00000 n +0000549725 00000 n +0000540605 00000 n +0000549540 00000 n +0000151397 00000 n +0000156557 00000 n +0000155637 00000 n +0000151653 00000 n +0000156441 00000 n +0000155793 00000 n +0000155955 00000 n +0000156116 00000 n +0000156279 00000 n +0000681161 00000 n +0000160796 00000 n +0000160099 00000 n +0000156684 00000 n +0000160564 00000 n +0000160680 00000 n +0000160239 00000 n +0000160401 00000 n +0000160738 00000 n +0000165021 00000 n +0000164383 00000 n +0000160948 00000 n +0000164677 00000 n +0000164789 00000 n +0000164847 00000 n +0000164905 00000 n +0000164963 00000 n +0000164515 00000 n +0000169796 00000 n +0000168769 00000 n +0000165147 00000 n +0000169566 00000 n +0000169624 00000 n +0000168925 00000 n +0000169740 00000 n +0000169086 00000 n +0000169247 00000 n +0000169408 00000 n +0000174649 00000 n +0000173899 00000 n +0000169922 00000 n +0000174533 00000 n +0000174047 00000 n +0000174591 00000 n +0000174210 00000 n +0000174371 00000 n +0000179325 00000 n +0000178179 00000 n +0000174789 00000 n +0000178977 00000 n +0000178335 00000 n +0000178498 00000 n +0000179093 00000 n +0000178660 00000 n +0000178822 00000 n +0000179209 00000 n +0000179267 00000 n +0000282960 00000 n +0000184420 00000 n +0000183103 00000 n +0000179477 00000 n +0000184073 00000 n +0000183267 00000 n +0000184131 00000 n +0000184189 00000 n +0000184247 00000 n +0000183429 00000 n +0000184304 00000 n +0000183589 00000 n +0000183751 00000 n +0000183911 00000 n +0000184362 00000 n +0000681279 00000 n +0000191323 00000 n +0000190742 00000 n +0000184546 00000 n +0000191029 00000 n +0000190874 00000 n +0000191087 00000 n +0000191145 00000 n +0000191203 00000 n +0000191261 00000 n +0000196062 00000 n +0000194764 00000 n +0000191449 00000 n +0000195714 00000 n +0000195830 00000 n +0000195888 00000 n +0000194928 00000 n +0000195084 00000 n +0000195240 00000 n +0000195946 00000 n +0000195402 00000 n +0000195557 00000 n +0000196004 00000 n +0000200578 00000 n +0000199999 00000 n +0000196188 00000 n +0000200286 00000 n +0000200131 00000 n +0000200344 00000 n +0000200401 00000 n +0000200458 00000 n +0000200516 00000 n +0000204728 00000 n +0000204213 00000 n +0000200716 00000 n +0000204325 00000 n +0000204440 00000 n +0000538380 00000 n +0000536320 00000 n +0000538215 00000 n +0000204670 00000 n +0000209646 00000 n +0000209418 00000 n +0000204894 00000 n +0000209530 00000 n +0000214635 00000 n +0000213884 00000 n +0000209798 00000 n +0000214341 00000 n +0000214024 00000 n +0000214399 00000 n +0000535999 00000 n +0000533928 00000 n +0000535830 00000 n +0000214457 00000 n +0000214186 00000 n +0000214515 00000 n +0000214573 00000 n +0000681397 00000 n +0000219581 00000 n +0000218666 00000 n +0000214814 00000 n +0000219291 00000 n +0000219349 00000 n +0000218814 00000 n +0000218976 00000 n +0000219403 00000 n +0000219461 00000 n +0000219137 00000 n +0000219519 00000 n +0000224421 00000 n +0000223954 00000 n +0000219760 00000 n +0000224247 00000 n +0000224363 00000 n +0000224086 00000 n +0000228818 00000 n +0000228292 00000 n +0000224559 00000 n +0000228586 00000 n +0000228424 00000 n +0000228644 00000 n +0000228702 00000 n +0000228760 00000 n +0000232374 00000 n +0000232034 00000 n +0000228970 00000 n +0000232146 00000 n +0000232204 00000 n +0000232258 00000 n +0000232316 00000 n +0000237012 00000 n +0000235990 00000 n +0000232487 00000 n +0000236784 00000 n +0000236842 00000 n +0000236146 00000 n +0000236896 00000 n +0000236303 00000 n +0000236954 00000 n +0000236460 00000 n +0000236622 00000 n +0000241448 00000 n +0000241050 00000 n +0000237138 00000 n +0000241162 00000 n +0000241220 00000 n +0000241390 00000 n +0000681515 00000 n +0000245679 00000 n +0000245395 00000 n +0000241601 00000 n +0000245507 00000 n +0000245565 00000 n +0000245623 00000 n +0000250500 00000 n +0000249922 00000 n +0000245818 00000 n +0000250214 00000 n +0000250272 00000 n +0000250054 00000 n +0000250326 00000 n +0000250384 00000 n +0000250442 00000 n +0000254504 00000 n +0000254276 00000 n +0000250639 00000 n +0000254388 00000 n +0000254446 00000 n +0000259557 00000 n +0000258706 00000 n +0000254630 00000 n +0000259325 00000 n +0000259383 00000 n +0000258854 00000 n +0000259499 00000 n +0000259012 00000 n +0000259169 00000 n +0000263682 00000 n +0000263042 00000 n +0000259683 00000 n +0000263335 00000 n +0000263393 00000 n +0000263451 00000 n +0000263509 00000 n +0000263174 00000 n +0000263624 00000 n +0000267995 00000 n +0000267535 00000 n +0000263809 00000 n +0000267647 00000 n +0000267763 00000 n +0000267937 00000 n +0000681633 00000 n +0000272089 00000 n +0000271745 00000 n +0000268148 00000 n +0000271857 00000 n +0000271915 00000 n +0000272031 00000 n +0000275207 00000 n +0000274979 00000 n +0000272216 00000 n +0000275091 00000 n +0000275149 00000 n +0000279134 00000 n +0000278729 00000 n +0000275333 00000 n +0000279018 00000 n +0000278861 00000 n +0000279076 00000 n +0000283079 00000 n +0000282790 00000 n +0000279286 00000 n +0000282902 00000 n +0000286550 00000 n +0000285957 00000 n +0000283219 00000 n +0000286071 00000 n +0000286131 00000 n +0000286191 00000 n +0000286250 00000 n +0000286310 00000 n +0000286370 00000 n +0000286430 00000 n +0000286490 00000 n +0000290150 00000 n +0000289494 00000 n +0000286663 00000 n +0000289610 00000 n +0000289670 00000 n +0000289730 00000 n +0000289790 00000 n +0000289850 00000 n +0000289910 00000 n +0000289970 00000 n +0000290030 00000 n +0000290090 00000 n +0000681752 00000 n +0000293791 00000 n +0000293012 00000 n +0000290277 00000 n +0000293311 00000 n +0000293371 00000 n +0000293149 00000 n +0000293431 00000 n +0000293491 00000 n +0000293551 00000 n +0000293611 00000 n +0000293671 00000 n +0000293731 00000 n +0000297435 00000 n +0000296901 00000 n +0000293930 00000 n +0000297017 00000 n +0000297077 00000 n +0000297137 00000 n +0000297315 00000 n +0000297375 00000 n +0000301683 00000 n +0000301028 00000 n +0000297563 00000 n +0000301328 00000 n +0000301388 00000 n +0000301165 00000 n +0000301444 00000 n +0000301563 00000 n +0000301623 00000 n +0000305656 00000 n +0000305007 00000 n +0000301810 00000 n +0000305298 00000 n +0000305413 00000 n +0000305144 00000 n +0000305532 00000 n +0000305592 00000 n +0000309830 00000 n +0000309411 00000 n +0000305783 00000 n +0000309711 00000 n +0000309548 00000 n +0000309771 00000 n +0000313717 00000 n +0000313481 00000 n +0000309957 00000 n +0000313597 00000 n +0000313657 00000 n +0000681877 00000 n +0000318641 00000 n +0000318054 00000 n +0000313871 00000 n +0000318522 00000 n +0000318200 00000 n +0000318358 00000 n +0000322810 00000 n +0000322213 00000 n +0000318794 00000 n +0000322512 00000 n +0000322350 00000 n +0000322630 00000 n +0000322690 00000 n +0000322750 00000 n +0000326808 00000 n +0000326332 00000 n +0000322937 00000 n +0000326633 00000 n +0000326693 00000 n +0000326469 00000 n +0000330459 00000 n +0000330167 00000 n +0000326960 00000 n +0000330283 00000 n +0000330343 00000 n +0000330399 00000 n +0000334271 00000 n +0000333505 00000 n +0000330598 00000 n +0000333969 00000 n +0000333651 00000 n +0000334029 00000 n +0000333814 00000 n +0000334147 00000 n +0000334207 00000 n +0000338945 00000 n +0000338357 00000 n +0000334398 00000 n +0000338826 00000 n +0000338503 00000 n +0000338886 00000 n +0000338667 00000 n +0000682002 00000 n +0000343183 00000 n +0000342646 00000 n +0000339072 00000 n +0000342939 00000 n +0000342999 00000 n +0000342783 00000 n +0000343059 00000 n +0000343119 00000 n +0000347939 00000 n +0000347047 00000 n +0000343297 00000 n +0000347519 00000 n +0000347579 00000 n +0000347639 00000 n +0000347699 00000 n +0000347759 00000 n +0000347193 00000 n +0000347819 00000 n +0000347356 00000 n +0000347879 00000 n +0000351737 00000 n +0000351382 00000 n +0000348053 00000 n +0000351498 00000 n +0000351558 00000 n +0000351617 00000 n +0000351677 00000 n +0000355106 00000 n +0000354699 00000 n +0000351864 00000 n +0000354815 00000 n +0000357545 00000 n +0000357310 00000 n +0000355220 00000 n +0000357426 00000 n +0000360863 00000 n +0000360628 00000 n +0000357673 00000 n +0000360744 00000 n +0000682127 00000 n +0000365533 00000 n +0000364943 00000 n +0000361002 00000 n +0000365236 00000 n +0000365080 00000 n +0000365469 00000 n +0000369174 00000 n +0000368939 00000 n +0000365661 00000 n +0000369055 00000 n +0000374181 00000 n +0000373646 00000 n +0000369302 00000 n +0000373939 00000 n +0000373783 00000 n +0000374117 00000 n +0000377168 00000 n +0000376933 00000 n +0000374309 00000 n +0000377049 00000 n +0000378359 00000 n +0000378183 00000 n +0000377309 00000 n +0000378299 00000 n +0000396838 00000 n +0000382559 00000 n +0000378460 00000 n +0000396720 00000 n +0000383479 00000 n +0000383630 00000 n +0000383781 00000 n +0000383932 00000 n +0000384082 00000 n +0000384233 00000 n +0000384384 00000 n +0000384534 00000 n +0000384685 00000 n +0000384834 00000 n +0000384985 00000 n +0000385135 00000 n +0000385286 00000 n +0000385437 00000 n +0000385588 00000 n +0000385739 00000 n +0000385889 00000 n +0000386040 00000 n +0000386190 00000 n +0000386341 00000 n +0000386490 00000 n +0000386641 00000 n +0000386791 00000 n +0000386942 00000 n +0000387092 00000 n +0000387243 00000 n +0000387392 00000 n +0000387542 00000 n +0000387693 00000 n +0000387844 00000 n +0000387994 00000 n +0000388145 00000 n +0000388295 00000 n +0000388446 00000 n +0000388597 00000 n +0000388748 00000 n +0000388898 00000 n +0000389049 00000 n +0000389199 00000 n +0000389349 00000 n +0000389498 00000 n +0000389648 00000 n +0000389798 00000 n +0000389949 00000 n +0000390097 00000 n +0000390248 00000 n +0000390399 00000 n +0000390550 00000 n +0000390701 00000 n +0000390850 00000 n +0000391000 00000 n +0000391149 00000 n +0000391300 00000 n +0000391450 00000 n +0000391601 00000 n +0000391752 00000 n +0000391902 00000 n +0000392053 00000 n +0000392204 00000 n +0000392355 00000 n +0000392505 00000 n +0000392656 00000 n +0000392807 00000 n +0000392958 00000 n +0000393108 00000 n +0000393258 00000 n +0000393409 00000 n +0000393560 00000 n +0000393710 00000 n +0000393859 00000 n +0000394009 00000 n +0000394160 00000 n +0000394310 00000 n +0000394460 00000 n +0000394611 00000 n +0000394762 00000 n +0000394913 00000 n +0000395064 00000 n +0000395213 00000 n +0000395363 00000 n +0000395514 00000 n +0000395665 00000 n +0000395816 00000 n +0000395967 00000 n +0000396118 00000 n +0000396269 00000 n +0000396420 00000 n +0000396569 00000 n +0000682252 00000 n +0000416238 00000 n +0000401051 00000 n +0000396966 00000 n +0000416178 00000 n +0000402025 00000 n +0000402176 00000 n +0000402327 00000 n +0000402477 00000 n +0000402627 00000 n +0000402778 00000 n +0000402929 00000 n +0000403079 00000 n +0000403230 00000 n +0000403380 00000 n +0000403530 00000 n +0000403680 00000 n +0000403830 00000 n +0000403981 00000 n +0000404132 00000 n +0000404282 00000 n +0000404433 00000 n +0000404584 00000 n +0000404735 00000 n +0000404886 00000 n +0000405036 00000 n +0000405187 00000 n +0000405338 00000 n +0000405489 00000 n +0000405637 00000 n +0000405788 00000 n +0000405938 00000 n +0000406089 00000 n +0000406240 00000 n +0000406390 00000 n +0000406541 00000 n +0000406692 00000 n +0000406843 00000 n +0000406993 00000 n +0000407144 00000 n +0000407295 00000 n +0000407446 00000 n +0000407596 00000 n +0000407747 00000 n +0000407898 00000 n +0000408049 00000 n +0000408199 00000 n +0000408350 00000 n +0000408501 00000 n +0000408651 00000 n +0000408802 00000 n +0000408953 00000 n +0000409103 00000 n +0000409254 00000 n +0000409405 00000 n +0000409556 00000 n +0000409707 00000 n +0000409858 00000 n +0000410009 00000 n +0000410160 00000 n +0000410311 00000 n +0000410462 00000 n +0000410613 00000 n +0000410764 00000 n +0000410915 00000 n +0000411066 00000 n +0000411216 00000 n +0000411366 00000 n +0000411516 00000 n +0000411667 00000 n +0000411818 00000 n +0000411968 00000 n +0000412119 00000 n +0000412270 00000 n +0000412420 00000 n +0000412571 00000 n +0000412722 00000 n +0000412873 00000 n +0000413024 00000 n +0000413173 00000 n +0000413324 00000 n +0000413474 00000 n +0000413625 00000 n +0000413775 00000 n +0000413926 00000 n +0000414077 00000 n +0000414228 00000 n +0000414379 00000 n +0000414530 00000 n +0000414681 00000 n +0000414829 00000 n +0000414980 00000 n +0000415131 00000 n +0000415280 00000 n +0000415430 00000 n +0000415579 00000 n +0000415728 00000 n +0000415878 00000 n +0000416028 00000 n +0000435281 00000 n +0000420589 00000 n +0000416352 00000 n +0000435221 00000 n +0000421536 00000 n +0000421686 00000 n +0000421836 00000 n +0000421987 00000 n +0000422138 00000 n +0000422289 00000 n +0000422439 00000 n +0000422589 00000 n +0000422740 00000 n +0000422891 00000 n +0000423042 00000 n +0000423191 00000 n +0000423341 00000 n +0000423490 00000 n +0000423640 00000 n +0000423790 00000 n +0000423940 00000 n +0000424091 00000 n +0000424242 00000 n +0000424392 00000 n +0000424542 00000 n +0000424693 00000 n +0000424844 00000 n +0000424994 00000 n +0000425144 00000 n +0000425294 00000 n +0000425445 00000 n +0000425594 00000 n +0000425744 00000 n +0000425892 00000 n +0000426041 00000 n +0000426191 00000 n +0000426340 00000 n +0000426489 00000 n +0000426639 00000 n +0000426790 00000 n +0000426941 00000 n +0000427091 00000 n +0000427240 00000 n +0000427389 00000 n +0000427540 00000 n +0000427690 00000 n +0000427841 00000 n +0000427991 00000 n +0000428142 00000 n +0000428292 00000 n +0000428443 00000 n +0000428594 00000 n +0000428745 00000 n +0000428896 00000 n +0000429047 00000 n +0000429198 00000 n +0000429349 00000 n +0000429500 00000 n +0000429651 00000 n +0000429801 00000 n +0000429952 00000 n +0000430103 00000 n +0000430254 00000 n +0000430405 00000 n +0000430556 00000 n +0000430707 00000 n +0000430857 00000 n +0000431007 00000 n +0000431158 00000 n +0000431308 00000 n +0000431459 00000 n +0000431609 00000 n +0000431760 00000 n +0000431911 00000 n +0000432062 00000 n +0000432213 00000 n +0000432364 00000 n +0000432515 00000 n +0000432665 00000 n +0000432815 00000 n +0000432965 00000 n +0000433116 00000 n +0000433267 00000 n +0000433417 00000 n +0000433568 00000 n +0000433718 00000 n +0000433869 00000 n +0000434019 00000 n +0000434170 00000 n +0000434319 00000 n +0000434468 00000 n +0000434618 00000 n +0000434769 00000 n +0000434919 00000 n +0000435070 00000 n +0000455274 00000 n +0000439607 00000 n +0000435408 00000 n +0000455214 00000 n +0000440608 00000 n +0000440759 00000 n +0000440910 00000 n +0000441061 00000 n +0000441212 00000 n +0000441363 00000 n +0000441514 00000 n +0000441664 00000 n +0000441814 00000 n +0000441965 00000 n +0000442116 00000 n +0000442267 00000 n +0000442417 00000 n +0000442568 00000 n +0000442718 00000 n +0000442869 00000 n +0000443019 00000 n +0000443170 00000 n +0000443321 00000 n +0000443472 00000 n +0000443623 00000 n +0000443774 00000 n +0000443925 00000 n +0000444076 00000 n +0000444227 00000 n +0000444377 00000 n +0000444528 00000 n +0000444678 00000 n +0000444828 00000 n +0000444979 00000 n +0000445128 00000 n +0000445279 00000 n +0000445430 00000 n +0000445579 00000 n +0000445730 00000 n +0000445881 00000 n +0000446031 00000 n +0000446182 00000 n +0000446332 00000 n +0000446482 00000 n +0000446632 00000 n +0000446783 00000 n +0000446932 00000 n +0000447082 00000 n +0000447233 00000 n +0000447383 00000 n +0000447534 00000 n +0000447685 00000 n +0000447836 00000 n +0000447987 00000 n +0000448138 00000 n +0000448288 00000 n +0000448439 00000 n +0000448589 00000 n +0000448740 00000 n +0000448890 00000 n +0000449041 00000 n +0000449192 00000 n +0000449342 00000 n +0000449492 00000 n +0000449643 00000 n +0000449793 00000 n +0000449944 00000 n +0000450093 00000 n +0000450244 00000 n +0000450395 00000 n +0000450546 00000 n +0000450697 00000 n +0000450848 00000 n +0000450999 00000 n +0000451149 00000 n +0000451300 00000 n +0000451451 00000 n +0000451601 00000 n +0000451751 00000 n +0000451902 00000 n +0000452052 00000 n +0000452203 00000 n +0000452354 00000 n +0000452505 00000 n +0000452656 00000 n +0000452807 00000 n +0000452958 00000 n +0000453109 00000 n +0000453260 00000 n +0000453411 00000 n +0000453561 00000 n +0000453712 00000 n +0000453862 00000 n +0000454013 00000 n +0000454163 00000 n +0000454314 00000 n +0000454465 00000 n +0000454616 00000 n +0000454766 00000 n +0000454915 00000 n +0000455064 00000 n +0000461220 00000 n +0000456731 00000 n +0000455388 00000 n +0000461160 00000 n +0000457102 00000 n +0000457251 00000 n +0000457402 00000 n +0000457552 00000 n +0000457701 00000 n +0000457851 00000 n +0000458001 00000 n +0000458152 00000 n +0000458303 00000 n +0000458453 00000 n +0000458602 00000 n +0000458753 00000 n +0000458904 00000 n +0000459055 00000 n +0000459205 00000 n +0000459356 00000 n +0000459506 00000 n +0000459656 00000 n +0000459806 00000 n +0000459956 00000 n +0000460107 00000 n +0000460258 00000 n +0000460407 00000 n +0000460558 00000 n +0000460707 00000 n +0000460858 00000 n +0000461009 00000 n +0000478631 00000 n +0000465205 00000 n +0000461307 00000 n +0000478265 00000 n +0000466044 00000 n +0000466199 00000 n +0000466353 00000 n +0000466508 00000 n +0000466663 00000 n +0000466818 00000 n +0000466972 00000 n +0000467126 00000 n +0000467279 00000 n +0000467434 00000 n +0000467589 00000 n +0000467744 00000 n +0000467899 00000 n +0000468055 00000 n +0000468208 00000 n +0000468363 00000 n +0000468517 00000 n +0000468672 00000 n +0000468826 00000 n +0000468981 00000 n +0000469136 00000 n +0000469291 00000 n +0000469446 00000 n +0000469601 00000 n +0000469756 00000 n +0000469911 00000 n +0000470066 00000 n +0000470221 00000 n +0000470376 00000 n +0000470532 00000 n +0000470687 00000 n +0000470842 00000 n +0000470996 00000 n +0000471150 00000 n +0000471305 00000 n +0000471459 00000 n +0000471615 00000 n +0000471769 00000 n +0000471924 00000 n +0000472079 00000 n +0000472234 00000 n +0000472389 00000 n +0000472542 00000 n +0000472696 00000 n +0000472851 00000 n +0000473006 00000 n +0000473161 00000 n +0000473316 00000 n +0000473469 00000 n +0000473623 00000 n +0000473778 00000 n +0000473932 00000 n +0000474087 00000 n +0000474242 00000 n +0000474397 00000 n +0000474552 00000 n +0000474706 00000 n +0000474860 00000 n +0000475015 00000 n +0000475169 00000 n +0000475324 00000 n +0000475477 00000 n +0000475632 00000 n +0000475787 00000 n +0000475942 00000 n +0000476097 00000 n +0000476252 00000 n +0000476407 00000 n +0000476562 00000 n +0000476716 00000 n +0000476871 00000 n +0000477026 00000 n +0000477181 00000 n +0000477335 00000 n +0000477490 00000 n +0000477646 00000 n +0000477801 00000 n +0000477955 00000 n +0000478110 00000 n +0000496269 00000 n +0000482373 00000 n +0000478732 00000 n +0000495967 00000 n +0000483239 00000 n +0000483395 00000 n +0000483551 00000 n +0000483707 00000 n +0000483863 00000 n +0000484018 00000 n +0000484174 00000 n +0000484329 00000 n +0000484484 00000 n +0000484639 00000 n +0000484793 00000 n +0000484948 00000 n +0000485102 00000 n +0000485258 00000 n +0000485413 00000 n +0000485569 00000 n +0000485725 00000 n +0000485881 00000 n +0000486036 00000 n +0000486192 00000 n +0000486348 00000 n +0000486504 00000 n +0000486660 00000 n +0000486816 00000 n +0000486972 00000 n +0000487128 00000 n +0000487284 00000 n +0000487440 00000 n +0000487596 00000 n +0000487751 00000 n +0000487907 00000 n +0000488061 00000 n +0000488217 00000 n +0000488372 00000 n +0000488528 00000 n +0000488683 00000 n +0000488839 00000 n +0000488995 00000 n +0000489151 00000 n +0000489307 00000 n +0000489463 00000 n +0000489619 00000 n +0000489775 00000 n +0000489931 00000 n +0000490087 00000 n +0000490242 00000 n +0000490398 00000 n +0000490554 00000 n +0000490710 00000 n +0000490866 00000 n +0000491022 00000 n +0000491178 00000 n +0000491333 00000 n +0000491486 00000 n +0000491640 00000 n +0000491794 00000 n +0000491949 00000 n +0000492104 00000 n +0000492258 00000 n +0000492413 00000 n +0000492568 00000 n +0000492722 00000 n +0000492877 00000 n +0000493031 00000 n +0000493186 00000 n +0000493341 00000 n +0000493494 00000 n +0000493649 00000 n +0000493803 00000 n +0000493958 00000 n +0000494112 00000 n +0000494266 00000 n +0000494421 00000 n +0000494575 00000 n +0000494730 00000 n +0000494885 00000 n +0000495039 00000 n +0000495194 00000 n +0000495349 00000 n +0000495504 00000 n +0000495658 00000 n +0000495813 00000 n +0000682377 00000 n +0000513975 00000 n +0000500231 00000 n +0000496356 00000 n +0000513671 00000 n +0000501088 00000 n +0000501242 00000 n +0000501397 00000 n +0000501550 00000 n +0000501704 00000 n +0000501859 00000 n +0000502014 00000 n +0000502169 00000 n +0000502323 00000 n +0000502478 00000 n +0000502632 00000 n +0000502787 00000 n +0000502941 00000 n +0000503094 00000 n +0000503247 00000 n +0000503401 00000 n +0000503555 00000 n +0000503709 00000 n +0000503862 00000 n +0000504016 00000 n +0000504170 00000 n +0000504328 00000 n +0000504486 00000 n +0000504642 00000 n +0000504800 00000 n +0000504958 00000 n +0000505117 00000 n +0000505274 00000 n +0000505432 00000 n +0000505584 00000 n +0000505742 00000 n +0000505898 00000 n +0000506056 00000 n +0000506214 00000 n +0000506371 00000 n +0000506528 00000 n +0000506686 00000 n +0000506844 00000 n +0000507002 00000 n +0000507159 00000 n +0000507317 00000 n +0000507474 00000 n +0000507627 00000 n +0000507782 00000 n +0000507938 00000 n +0000508093 00000 n +0000508248 00000 n +0000508404 00000 n +0000508559 00000 n +0000508715 00000 n +0000508870 00000 n +0000509026 00000 n +0000509179 00000 n +0000509334 00000 n +0000509489 00000 n +0000509645 00000 n +0000509801 00000 n +0000509956 00000 n +0000510111 00000 n +0000510266 00000 n +0000510420 00000 n +0000510575 00000 n +0000510729 00000 n +0000510885 00000 n +0000511040 00000 n +0000511196 00000 n +0000511352 00000 n +0000511508 00000 n +0000511664 00000 n +0000511818 00000 n +0000511972 00000 n +0000512126 00000 n +0000512281 00000 n +0000512435 00000 n +0000512590 00000 n +0000512745 00000 n +0000512899 00000 n +0000513054 00000 n +0000513208 00000 n +0000513362 00000 n +0000513517 00000 n +0000532171 00000 n +0000518129 00000 n +0000514062 00000 n +0000531863 00000 n +0000519004 00000 n +0000519159 00000 n +0000519315 00000 n +0000519470 00000 n +0000519626 00000 n +0000519780 00000 n +0000519935 00000 n +0000520090 00000 n +0000520244 00000 n +0000520399 00000 n +0000520553 00000 n +0000520709 00000 n +0000520862 00000 n +0000521017 00000 n +0000521171 00000 n +0000521327 00000 n +0000521483 00000 n +0000521638 00000 n +0000521793 00000 n +0000521946 00000 n +0000522101 00000 n +0000522256 00000 n +0000522410 00000 n +0000522565 00000 n +0000522720 00000 n +0000522873 00000 n +0000523027 00000 n +0000523182 00000 n +0000523338 00000 n +0000523493 00000 n +0000523647 00000 n +0000523802 00000 n +0000523957 00000 n +0000524111 00000 n +0000524265 00000 n +0000524420 00000 n +0000524576 00000 n +0000524731 00000 n +0000524886 00000 n +0000525039 00000 n +0000525194 00000 n +0000525347 00000 n +0000525502 00000 n +0000525656 00000 n +0000525811 00000 n +0000525966 00000 n +0000526121 00000 n +0000526275 00000 n +0000526431 00000 n +0000526585 00000 n +0000526738 00000 n +0000526892 00000 n +0000527047 00000 n +0000527202 00000 n +0000527357 00000 n +0000527512 00000 n +0000527667 00000 n +0000527822 00000 n +0000527978 00000 n +0000528134 00000 n +0000528288 00000 n +0000528443 00000 n +0000528599 00000 n +0000528755 00000 n +0000528909 00000 n +0000529065 00000 n +0000529220 00000 n +0000529376 00000 n +0000529530 00000 n +0000529686 00000 n +0000529842 00000 n +0000529997 00000 n +0000530153 00000 n +0000530309 00000 n +0000530465 00000 n +0000530621 00000 n +0000530777 00000 n +0000530931 00000 n +0000531086 00000 n +0000531241 00000 n +0000531397 00000 n +0000531552 00000 n +0000531707 00000 n +0000533841 00000 n +0000532829 00000 n +0000532258 00000 n +0000533781 00000 n +0000533002 00000 n +0000533158 00000 n +0000533314 00000 n +0000533470 00000 n +0000533626 00000 n +0000536233 00000 n +0000536208 00000 n +0000538613 00000 n +0000538578 00000 n +0000538716 00000 n +0000549978 00000 n +0000552844 00000 n +0000552771 00000 n +0000555409 00000 n +0000555370 00000 n +0000555531 00000 n +0000566948 00000 n +0000570930 00000 n +0000570871 00000 n +0000578089 00000 n +0000597548 00000 n +0000612658 00000 n +0000626478 00000 n +0000637516 00000 n +0000653509 00000 n +0000658110 00000 n +0000657836 00000 n +0000679899 00000 n +0000682484 00000 n +0000682604 00000 n +0000682726 00000 n +0000682834 00000 n +0000682916 00000 n +0000692197 00000 n +0000700846 00000 n +0000700887 00000 n +0000700927 00000 n +0000701108 00000 n trailer -<< -/Size 1179 -/Root 1177 0 R -/Info 1178 0 R ->> +<< /Size 1981 +/Root 1979 0 R +/Info 1980 0 R +/ID [<EBE87E14798328010A4E5247DF8DA056> <EBE87E14798328010A4E5247DF8DA056>] >> startxref -384155 +701375 %%EOF diff --git a/Master/texmf-dist/doc/generic/mfpic/mfpman.tex b/Master/texmf-dist/doc/generic/mfpic/mfpman.tex index 7f93ed20e27..5a0e1955663 100644 --- a/Master/texmf-dist/doc/generic/mfpic/mfpman.tex +++ b/Master/texmf-dist/doc/generic/mfpic/mfpman.tex @@ -1,28 +1,45 @@ %%% File: mfpman.tex -%%% A part of mfpic 0.7a beta 2004/04/16 +%%% A part of mfpic 0.9 2006/05/26 %%% % Documentation of mfpic macros \documentclass[letterpaper]{article} -\usepackage{pslatex} +% Fonts: TimesRoman, CM Sans serif, and LuxiMono for TeX commands. +\usepackage[T1]{fontenc} +\usepackage{mathptmx} +\usepackage[scaled=.85]{luximono} +\renewcommand\sfdefault{cmss} -\usepackage{mfpdoc} +% Fake chapters (really sections): +\usepackage[chapters]{mfpdoc} \pagestyle{mfpdoc} -\usepackage{verbatim} + \usepackage{makeidx} \makeindex +\usepackage{graphics} + \ifpdf -\usepackage[pdftex,colorlinks,pdfpagemode=none,pdfstartview=FitH,% -plainpages=false,hypertexnames=true]{hyperref} -\pdfstringdefDisableCommands{\def\cs#1{\otherbackslash#1}% - \def\opt#1{#1}\def\prog#1{#1}} +\expandafter\usepackage\expandafter + [\mfpHyOpts,pdfpagelabels=true,hyperindex]{hyperref} +\expandafter\pdfstringdefDisableCommands\expandafter + {\mfpHyDisable} \fi -\title{\Mfp: Pictures in \TeX\\ with Metafont and MetaPost} -\author{Dr Thomas E. Leathrum -\and Geoffrey Tobin\thanks{\email{G.Tobin@latrobe.edu.au}} -\and Daniel H. Luecking\thanks{\email {luecking@uark.edu}}} +\stepcounter{secnumdepth} + +\title{\Mfp{}: Pictures in \TeX{}\\ with Metafont and +MetaPost\thanks{Copywrite 2002--2006, Daniel H. Luecking}} + + +\author{% +Daniel H. Luecking% + \thanks{\email {luecking@uark.edu}: Communications regarding \mfp{} + should be sent to this author. Any first-person references in this + manual refer to Dr.~Luecking.} +\and Dr Thomas E. Leathrum +\and Geoffrey Tobin} + \date{\mfpdate} \begin{document} @@ -34,65 +51,62 @@ plainpages=false,hypertexnames=true]{hyperref} \clearpage \pagenumbering{arabic} -\section{Introduction}\label{introduction} +\chapter{Introduction}\label{introduction} +\thispagestyle{plain} -\subsection{Why?}\label{why} +\section{Why?}\label{why} -Tom got the idea for \mfp% - \footnote{If you're wondering how to pronounce `\mfp': I always say - `em-eff-\textbf{pick}', speaking the first two letters. ---DHL.} % +Tom got the idea for \mfp{}% + \footnote{`\Mfp{}' is pronounced by spelling the first two letters: + `em-eff-pick'.} mostly out of a feeling of frustration. Different output mechanisms for printing or viewing \TeX{} DVI files each have their own ways to include pictures. More often than not, there are provisions for including graphic objects into a \prog{DVI} file using \TeX{} \cs{special}'s. -However, this technique seemed far from \TeX's ideal of -device independence because different \TeX{} output drivers recognize -different \cs{special's}, and handle them in different ways. +However, this technique seemed far from \TeX{}'s ideal of device +independence because different \TeX{} output drivers recognize different +\cs{special's}, and handle them in different ways. -\LaTeX's \env{picture} environment has a hopelessly limited supply of +\LaTeX{}'s \env{picture} environment has a hopelessly limited supply of available objects to draw---if you want to draw a graph of a polynomial curve, you're out of luck. -There was, of course, \PiCTeX, which is wonderfully flexible and general, -but its most obvious feature was its speed---or rather lack of it. -Processing a single picture in \PiCTeX{} could often take several seconds. +There was, of course, \PiCTeX{}, which was wonderfully flexible and +general, but its most obvious feature was its speed---or rather lack of +it. Processing a single picture in \PiCTeX{} (in those days) could often +take several seconds. It occurred to Tom that it might be possible to take advantage of the fact that \MF{} is \emph{designed} for drawing things. The result of -pursuing this idea is \mfp, a set of macros for \TeX{} and -\MF{} which incorporate \MF-drawn pictures into a \TeX{} file. +pursuing this idea was \mfp{}, a set of macros for \TeX{} and +\MF{} which incorporate \MF{}-drawn pictures into a \TeX{} file. With the creation of \MP{} by John Hobby, and the almost universal availability of free \PS{} interpreters like \GS, some \mfp{} users -wanted to run their \mfp{} output through \MP, to produce \PS{} -pictures. Moreover, users wanted to be able to use \pdfTeX, which does -not get along well with PK fonts, but is quite happy with \MP{} -pictures. Unfortunately \file{grafbase.mf}, which contained the \MF{} -macros responsible for processing \mfp's output, was far too -pixel-oriented for \MP. A new file, \file{grafbase.mp} was created, -based very heavily on \file{grafbase.mf} but compatible with \MP. Now -when an \mfp{} output file says \mfc{input grafbase}, either \MF{} or -\MP{} may be run on it, and each program will select its own macros, and -produce (nearly) the same picture. This gets us away from device -independence, but many users were not so much concerned with that as -with having a convenient way to have text and pictures described in the -same document. +wanted to run their \mfp{} output through \MP{}, to produce \PS{} +pictures. Moreover, users wanted to be able to use \pdfTeX{}, which did +not get along well with PK fonts, but was quite happy with \MP{} +pictures. So \MP{} support was added to \mfp{}. This got us a little bit +away from device independence, but many users were not much concerned +with that: they just wanted a convenient way to have text and pictures +described in the same document file. With the extra capabilities of \PS{} (e.g., color) and the corresponding -abilities of \MP, there was a demand for some \mfp{} interface to +abilities of \MP{}, there was a demand for some \mfp{} interface to access them. Consequently, switches (options) have been added to access some of them. When these are used, output files may no longer be -compatible with \MF. +compatible with \MF{}. -\subsection{Who?}\label{author} +\section{Who?}\label{author} -\Mfp{} was written primarily by Tom Leathrum during the late -(northern hemisphere) spring and summer of 1992, while at Dartmouth -College. Different versions were being written and tested for nearly two -years after that, during which time Tom finished his Ph.D. and took a -job at Berry College, in Rome, GA. Between fall of 1992 and fall of -1993, much of the development was carried out by others. Those who -helped most in this process are credited in the Acknowledgements. +The original \Mfp{} (and the core of the current version) was written +primarily by Tom Leathrum during the late (northern hemisphere) spring +and summer of 1992, while at Dartmouth College. Different versions were +being written and tested for nearly two years after that, during which +time Tom finished his Ph.D. and took a job at Berry College, in Rome, +GA. Between fall of 1992 and fall of 1993, much of the development was +carried out by others. Those who helped most in this process are +credited in the Acknowledgements. Somewhere in the mid 1990's the development passed to Geoffrey Tobin who kept things going for several years. @@ -102,56 +116,104 @@ The addition of \MP{} support was carried out by Dan Luecking around since then, with help from Geoffrey and a few others mentioned in the Acknowledgements. -\subsection{What?}\label{manifest} - -See \file{README.txt} for a list and a brief explanation of each of -the files. Only five are actually needed for full access to -\mfp's capabilities: \file{mfpic.tex}, \file{mfpic.sty} (the -latter needed only for \LaTeX's \cs{usepackage}), \file{grafbase.mf} -(needed only if \MF{} will be processing the figures), -\file{grafbase.mp} and \file{dvipsnam.mp} (needed only if \MP{} will be -the processor). - -The readme file that accompanies \mfp{} gives some guidence on the -proper location for the installation of these files. - -\subsection{How?}\label{process} - -Setting up \TeX{} and \MF{} to process these files will, to an extent, -depend on your local installation. The biggest problem you are likely to -have, regardless of your installation, will be convincing \TeX{} and its -output drivers to find \MF's output files. You should do whatever is -necessary (perhaps nothing!) to insure that \TeX{} looks in the current -directory for \file{.tfm} files, and that your dvi driver/viewer looks -in the current directory for \file{.pk} files. If you process your -pictures with \MP{} there is nothing to do in this regard. +\section{What?}\label{manifest} + +See the \file{README} file for a list of files in the distribution and a +brief explanation of each. Only four are actually needed for full access +to \mfp{}'s capabilities: \file{mfpic.dtx}, \file{mfpic.ins}, +\file{grafbase.dtx} and \file{mfppatch.tex}. Running \LaTeX{} on +\file{mfpic.ins} creates the only required files: +\begin{display} + \file{mfpic.tex} and \file{mfpic.sty}, the latter required only for + \LaTeX{}.\\ + \file{grafbase.mf}, required only if \MF{} will be processing + figures.\\ + \file{grafbase.mp} and \file{dvipsnam.mp}, needed only if \MP{} will + be the processor.\\ + \file{mfppatch.tex} is used to distribute simple bug fixes. It does + nothing after a major update, but if it is not installed and a + previous one is, a warning will be issued. +\end{display} +The README file also gives some guidence on the proper location for the +installation of these files. + +\section{How?}\label{process} + +Some guidance on writing files that contain \mfp{} figures can be found +in the accompanying file \file{mfpguide.pdf}. If you use \mfp{} to +produce \MP{} figures the process is straightforward: run \TeX{} (or +\LaTeX), then \MP{}, then \TeX{} again. If there are no errors, then +\prog{dvips} or other DVI-to-PS converter can be run to produce +viewable\slash printable output. You can also run \prog{dvipdfm} to obtain PDF +output, or even use \pdfTeX{} instead of \TeX{} (or \pdfLaTeX{} instead +of \LaTeX{}) to get PDF output directly. Here is an example of the process: for the sample file -\file{pictures.tex}% - \footnote{Read \file{mfpguide.pdf} for examples of minimal \mfp{} - input files.}, % -first run \TeX{} on it (or run \LaTeX{} on \file{lapictures.tex}). You -may see a message from \mfp{} that there is no file \file{pics.tfm}, but -\TeX{} will continue processing the file anyway. When \TeX{} is -finished, you will now have a file called \file{pics.mf}. This is the -\MF{} file containing the descriptions of the pictures for -\file{pictures.tex}. You need to run \MF{} on \file{pics.mf}, with -\cs{mode:=localfont} set up. (Read your \MF{} manual to see how to do +\file{pictures.tex}, first run \TeX{} on it (or run \LaTeX{} on +\file{lapictures.tex}). You may see a message from \mfp{} that there is +no file \file{pics.1}, but \TeX{} will continue processing the file +anyway. When \TeX{} is finished, you will now have a file called +\file{pics.mp}. This is the \MP{} file containing the descriptions of +the pictures for \file{pictures.tex}. You need to run \MP{} on +\file{pics.mp} (Read your \MF{} manual to see how to do this.% - \footnote{If you are new to running \MF, the document - \textit{Metafont for Beginners}, by \hbox{Geoffrey Tobin}, is a good - start. Fetch \file{CTAN/info/metafont-for-beginners.tex}. - `\file{CTAN}' means the Comprehensive \TeX{} Archive Network. You - can find the mirror nearest you by pointing your browser at - \file{http://www.ctan.org/}.}) % + \footnote{The document \textit{Some experiences on running Metafont + and MetaPost}, by Peter Wilson, can be useful for beginners. Fetch + \file{CTAN/info/metafp.pdf}. `\file{CTAN}' means the Comprehensive + \TeX{} Archive Network. You can find the mirror nearest you by + pointing your browser at \file{http://www.ctan.org/}.}) % Typically, you just type \begin{verbatim} - mf pics.mf +mpost pics.mp +\end{verbatim} +(or possibly "\verb$mp pics.mp$"). + +This produces files \file{pics.1}, \file{pics.2}, etc., the number of +files depending on the version of \file{pictures.tex}. You then +reprocessing \file{pictures.tex} with \TeX{} to produce a DVI file. This +file can then be processed with \prog{dvips} (for example) to produce +\PS{} output which can be printed or viewed. One can also process the +DVI with \prog{dvipdfm} to produce a PDF file. + +If \pdfTeX{} is used instead of \TeX{} on the second run, you should be +able to view the resulting PDF file immediately, without any further +processing. + +If instead you use \mfp{} to produce \MF{} figures, things are a little +less straightforward. The process is \TeX{}, then \MF{}, then +\prog{gftopk}, then \TeX{} again. After this, \TeX{}'s DVI output ought +to be viewable and printable by most DVI viewers or printer drivers. For +a few \TeX{} systems there may be some prior setup needed. One needs to +convince \TeX{} and its output drivers to find \MF{}'s output files. You +should do whatever is necessary (perhaps nothing!) to insure that \TeX{} +looks in the current directory for \file{.tfm} files, and that your DVI +drivers look in the current directory for \file{.pk} files. There may +also be some setup needed to ensure that the \file{.pk} files are +created at a resolution that matches your printer's. See the discussion +in \file{mfpguide.pdf}. + +If you want to test this process on the supplied sample files, edit +\file{pictures.tex} removing the \cs{usemetapost} command (or edit +\file{lapictures.tex}, removing the \opt{metapost} option). After that, +run \TeX{} on \file{pictures.tex} (or run \LaTeX{} on +\file{lapictures.tex}). You may see a message from \mfp{} that there is +no file \file{pics.tfm}, but \TeX{} will continue processing the file. +When \TeX{} is finished, you will now have a file called \file{pics.mf}. +This is the \MF{} file containing the descriptions of the pictures for +\file{pictures.tex}. You need to run \MF{} on \file{pics.mf}, with +\texttt{mode:=localfont} set up. +(Read your \MF{} manual to see how to do this.% + \footnote{If you are new to running \MF{}, the document + \textit{Metafont for Beginners}, by Geoffrey~Tobin, is a good + start. Fetch \file{CTAN/info/metafont-for-beginners.tex}.}) % +Typically, you just type +\begin{verbatim} +mf pics.mf \end{verbatim} or, to use a particular printer mode such as \texttt{ljfour}, possibly something like \begin{verbatim} - mf '\mode:=ljfour; input pics.mf' +mf '\mode:=ljfour; input pics.mf' \end{verbatim} This produces a \file{pics.tfm} file and a GF file with a name something like \file{pics.600gf}. The actual number may be different and the @@ -159,39 +221,17 @@ extension may get truncated on some file systems. Then you run \prog{gftopk} on the GF file to produce a PK font file. (Read your \prog{gftopk} manual on how to do this.) Typically, you just run \begin{verbatim} - gftopk pics.600gf +gftopk pics.600gf \end{verbatim} -(or possibly \ \verb$gftopk pics.600gf pics.600pk$ \ or \ -\verb$gftopk pics.600gf pics.pk$ ). +(or possibly ``\verb$gftopk pics.600gf pics.600pk$'' or +``\verb$gftopk pics.600gf pics.pk$''). -Now you have the font (the \file{.pk} file) and font metric file (the -\file{.tfm}) generated by \MF, reprocess the file \file{pictures.tex} -with \TeX. The resulting DVI file should now be complete, and you should +Now that you have the font (the \file{.pk} file) and font metric file (the +\file{.tfm}) generated by \MF{}, reprocess the file \file{pictures.tex} +with \TeX{}. The resulting DVI file should now be complete, and you should be able to print and view it at your computer (assuming your viewer and print driver have been set up to be able to find the PK font generated -from \file{pics.mf}). You can delete \file{pics.600gf} and -\file{pics.log}. - -If you use \mfp{} with the \opt{metapost} option (this would require you -to edit \file{pictures.tex} or \file{lapictures.tex}. See -chapter~\ref{options} for how to do this), then \file{pics.mp} is -produced, and you need to replace the \MF/\prog{gftopk} steps with the -single step of running \MP. (Read your \MP{} documentation on how to do -this.% - \footnote{The document \textit{Some experiences on running Metafont - and MetaPost}, by Peter Wilson, can be useful for beginners. Fetch - \file{CTAN/info/metafp.pdf}.}) % -Typically just -\begin{verbatim} - mpost pics.mp -\end{verbatim} -or possibly \ \verb$mp pics.mp$ . - -After reprocessing \file{pictures.tex} with \TeX{} you should then be -able to run dvips on the resulting DVI file and print or view its \PS{} -output. It \pdfTeX{} is used instead of \TeX{} on the second run, you -should be able to view the resulting PDF file with the pictures -included. +from \file{pics.mf}). It is not advisable to rely on automatic font generation to create the \file{.tfm} and \file{.pk} files. (Different systems do this in @@ -199,60 +239,76 @@ different ways, so here I will try to give a generic explanation.) The reason: later editing of a figure will require new files to be built, and most automatic systems will \emph{not} remake the files once they have been created. This is not so much a problem with the \file{.tfm}, -as \mfp{} never tries to load the font if the \file{.tfm} is absent and -therefore no automatic \file{.tfm}-making should ever be triggered. +because \mfp{} never tries to load the font if the \file{.tfm} is absent +and therefore no automatic \file{.tfm}-making should ever be triggered. However, if you forget to run \prog{gftopk}, then try to view your resulting file, you may have to search your system and delete some -automatically generated \file{.pk} file (they can turn up in -unpredictable places) before you can see any later changes. It might -be wise to write a shell script (batch file) that (1)~runs \MF, (2)~runs -\prog{gftopk} if step~1 returns no error, (3)~deletes the \file{.tfm} if -the \file{.pk} file does not exist. That way, if anything goes wrong, -the \file{.dvi} will not contain the font (\mfp{} will draw a rectangle -and the figure number in place of the figure). - -These processing steps---processing with \TeX, processing with -\MF/\prog{gftopk}, and reprocessing with \TeX---may not always be +automatically generated \file{.pk} file (they can turn up in far-away +places) before you can see any later changes. It might be wise to write +a shell script (batch file) that runs both \MF{} and \prog{gftopk}. It +should also do some error checking and delete the \file{.tfm} if the +\file{.pk} file is not produced. That way, if anything goes wrong, the +\file{.dvi} will not contain the font (\mfp{} will draw a rectangle and +the figure number in place of the figure). + +These processing steps---processing with \TeX{}, processing with +\MF{}\slash\prog{gftopk} or \MP{}, and reprocessing with \TeX{}---may not always be necessary. In particular, if you change the \TeX{} document without making any changes at all to the pictures, then there will be no need to repeat the \MF{} or \MP{} steps. There are also somewhat subtle circumstance under which you can skip the -second \TeX{} step after editing a file that has gone through the above -process. Listing the exact cirumstances is rather involved, so it is -recommended that you always repeat the \TeX{} step if changes have been -made. +second \TeX{} step after editing a figure if the file has already gone +through the above process. Delineating the exact cirumstances is rather +involved, so it is recommended that you always repeat the \TeX{} step if +changes have been made to any figure. What makes \mfp{} work? When you run \TeX{} on the file -\file{pictures.tex}, the \mfp{} macros issue \TeX{} \cs{write -commands}, writing \MF{} (or \MP) commands to a file \file{pics.mf} (or -\file{pics.mp}). The user should never have to read or change the -file \file{pics.mf} directly---the \mfp{} macros take care of it. +\file{pictures.tex}, the \mfp{} macros issue \TeX{} \cs{write} commands, +writing \MF{} (or \MP{}) commands to a file \file{pics.mf} (or +\file{pics.mp}). The user should never have to read or change the file +\file{pics.mf} directly---the \mfp{} macros take care of it. The enterprising user can determine by examining the \mfp{} source and -the resulting \MF{} file, that \mfp{} drawing macros translate almost -directly into similar \MF/\MP{} commands, defined in one of the files -\file{grafbase.mf} or \file{grafbase.mp}. The labels and -captions, however, are placed on the graph by \TeX{} using box -placement techniques similar to those used in \LaTeX's \env{picture} -environment (except when option \opt{mplabels} is in effect, in which -case \MP{} places the labels). +the resulting \file{.mf} or \file{.mp} file, that \mfp{} drawing macros +translate almost directly into similar \MF{}\slash\MP{} commands, +defined in one of the files \file{grafbase.mf} or \file{grafbase.mp}. +The labels and captions, however, are placed on the graph by \TeX{} +using box placement techniques similar to those used in \LaTeX{}'s +\env{picture} environment (except when option \opt{mplabels} is in +effect, in which case the labels are written to the \file{.mp} file and +handled by \MP{}). + +\smallskip +\emph{Note}: In this manual, when describing \mfp{} operations, we will +often refer to ``\MF{}'' when we really mean ``\MF{} or \MP{}''. This +will especially be the case whenever we need to refer to commands in the +two languages which are substantially the same, but occasionally we will +even talk about ``running \MF{}'' when we mean running one or the other +program \texttt{mf} or \texttt{mpost} to process the figures. If we need +to discriminate between the two processors, (for example when they have +different behavior) we will make the difference explicit. +A similar shorthand is used when referring to ``\TeX{}''. It should not be +taken to mean ``plain \TeX{}'', but rather whatever version of \TeX{} is used +to process the source file: plain \TeX{}, \LaTeX{}, \pdfTeX{}, or +\pdfLaTeX{}. Also \AmSTeX{}, \prog{eplain} and some other variants. When +last tried, \mfp{} didn't work with \ConTeXt{}. \clearpage -\section{Options.}\label{options} - -There are now several options to the \mfp{} package. These can be listed -in the standard \LaTeX{} \cs{usepackage} optional argument, or can be -turned on with certain provided commands (the only possibility for plain -\TeX). Some options can be switched off and on throughout the document. -Here we merely list them and provide a general description of their -purpose. More details may be found later in the discussion of the -features affected. The headings below give the option name, the -alternative macro and, if available, the command for turning off the -option. Any option not among those given below will be passed on to the -\prog{graphics} package, provided the \opt{metapost} option has been -used. +\chapter{Options.}\label{options} + +There are several options to the \mfp{} package. These options can be +turned on with certain provided commands, but under \LaTeX{} they can +also be used in the standard \LaTeX{} \cs{usepackage} optional argument. +Some options can be switched off and on throughout the document. Here we +merely list them and provide a general description of their purpose. +More details may be found later in the discussion of the features +affected. The headings below give the option name, the alternative macro +and, if available, the command for turning off the option. Any option +in the \cs{usepackage} command not among those given below will be +passed on to the \prog{graphics} package, provided the \opt{metapost} +option has been used. If the file \file{mfpic.cfg} exists, it will be input just before all options are processed. You can create such a file containing an @@ -260,16 +316,24 @@ options are processed. You can create such a file containing an have as default. Actual options to \cs{usepackage} will override these defaults, of course. And so will any of the commands below. -If the file \file{mfpic.usr} exists, it will be input at the end of the -loading of \mfp. The user can create such a file containing any of the -commands of this section that he would like to have as default. +If a file named \file{mfpic.usr} can be found, it will be input at the +end of the loading of \mfp{}. The user can create such a file containing +any of the commands of this section that he would like to have as +default. + +Finally, if the file \file{mfppatch.tex} can be found, it will be input +slightly before the end of loading \mfp{}. It is part of the \mfp{} +distribution, and will be used to implement minor corrections when bugs +are found. The user should \emph{not} modify this file unless +he really knows what he is doing. -\subsection{\opt{metapost}, \cs{usemetapost}}\label{metapost} -\index{metapost@\opt{metapost}}\index{usemetapost@\cs{usemetapost}} +\section{\opt{metapost}, \cs{usemetapost}.}\label{metapost} +\index{metapost@\opt{metapost}}% +\index{usemetapost@\cs{usemetapost}} Selects \MP{} as the figure processor and makes specific features available. It changes the extension used on the output file to -\file{.mp} to signal that it can no longer be processed with \MF. There +\file{.mp} to signal that it can no longer be processed with \MF{}. There is also a \opt{metafont} option (command \cs{usemetafont}), but it is redundant, as \MF{} is the default. Either command must come before the \cs{opengraphsfile} command (see section~\ref{files}). They should not @@ -284,35 +348,38 @@ package), when \pdfLaTeX{} is used \mfp{} should be loaded and \cs{usemetapost} (if used) declared before \prog{babel} is loaded. -\subsection{\opt{mplabels}, \cs{usemplabels}, -\cs{nomplabels}}\label{mplabels} -\index{mplabels@\opt{mplabels}}\index{usemplabels@\cs{usemplabels}}% +\section{\opt{mplabels}, \cs{usemplabels}, +\cs{nomplabels}.}\label{mplabels} +\index{mplabels@\opt{mplabels}}% +\index{usemplabels@\cs{usemplabels}}% \index{nomplabels@\cs{nomplabels}} Causes all label creation commands to write their contents to the output -file. It has no effect on the \cs{tcaption} command. In this case labels -are handled by \MP{} and can be rotated. It requires \MP, and will be be -ignored without it (\MF{} cannot handle labels). It may also produce an -error either from \TeX{} or \MF. Otherwise the commands can come -anywhere and affect subsequent \cs{tlabel} commands. When this is in -effect, the labels become part of the figure and, in the default -handling, they may be clipped off or covered up by later drawing -elements. But see the next section on the \opt{overlaylabels} option. -Labels added to a picture contribute to the bounding box even if -\opt{truebbox} is not in effect. +file. It effects only labels on the figure, not a caption added by the +\cs{tcaption} command (see section~\ref{text}). In this case labels are +handled by \MP{} and can be rotated. It requires \MP{}, and will be be +ignored without it (\MF{} cannot handle labels). Using this option +without the \opt{metapost} option may also produce an error message +either from \TeX{} or \MF{}. The commands forms can be placed anywhere +and they affect subsequent \cs{tlabel} commands. When this is in effect, +the labels become part of the figure and, in the default handling, they +may be clipped off or covered up by later drawing elements. But see the +next section on the \opt{overlaylabels} option. Labels added to a +picture contribute to the bounding box even if \opt{truebbox} is not in +effect. The user is responsible for adding the appropriate \mfc{verbatimtex} header to the output file if necessary. For this purpose, there is the -\cs{mfpverbtex} command, see section~\ref{labels}. If -the label text contains only valid plain \TeX{} macros, there is -generally no need for a \mfc{verbatimtex} preamble at all. If you add a -\mfc{verbatimtex} preamble of \LaTeX{} code take care to make sure \MP{} -calls \LaTeX{} (for example, by setting the environmental variable -\texttt{TEX} to \texttt{latex} in the command shell of your operating -system.). +\cs{mfpverbtex} command, see section~\ref{labels}. If the label text +contains only valid plain \TeX{} macros, there is generally no need for +a \mfc{verbatimtex} preamble at all. If you add a \mfc{verbatimtex} +preamble of \LaTeX{} code take care to make sure \MP{} calls \LaTeX{} +(for example, the \texttt{mpost} command may take an option for this +purpose, or an environmental variable named \texttt{TEX} may be set +equal to \texttt{latex} in the command shell of your operating system.). -\subsection{\opt{overlaylabels}, \cs{overlaylabels}, \cs{nooverlaylabels}} +\section{\opt{overlaylabels}, \cs{overlaylabels}, \cs{nooverlaylabels}.} \label{overlaylabels} \index{overlaylabels@\opt{overlaylabels}}% \index{overlaylabels@\cs{overlaylabels}}% @@ -333,16 +400,17 @@ With the \opt{metapost} option, but without \opt{mplabels} it has been decided to keep the same behavior (and the same code) as under the \opt{metafont} option. However, when \opt{mplabels} is used, there is the possibility for special effects with text, and it has always been -the behavior before this version to simply place the labels as they +the behavior before version 0.7 to simply place the labels as they occurred. It turns out that placing the labels at the end is cleaner and simpler to code, so I experimented with it and rejected it as a default, but now offer it as an option. With this option, \mfp{} labels have almost the same behavior with or without \opt{mplabels}. -\subsection{\opt{truebbox}, \cs{usetruebbox}, -\cs{notruebbox}}\label{truebbox} -\index{truebbox@\opt{truebbox}}\index{usetruebbox@\cs{usetruebbox}}% +\section{\opt{truebbox}, \cs{usetruebbox}, +\cs{notruebbox}.}\label{truebbox} +\index{truebbox@\opt{truebbox}}% +\index{usetruebbox@\cs{usetruebbox}}% \index{notruebbox@\cs{notruebbox}} Normally \MP{} outputs an EPS file with the actual bounding box of the @@ -350,15 +418,16 @@ figure. By default, \mfp{} \emph{overrides} this and sets the bounding box to the dimensions specified by the \cs{mfpic} command that produced it. (This used to be needed for \TeX{} is to handle \cs{tlabel} commands correctly. Now, it is just for backward compatability, and for -compatability with \MF's behavior.) It is reasonable to let \MP{} have +compatability with \MF{}'s behavior.) It is reasonable to let \MP{} have its way, and that is what this option does. If one of the command forms is used in an \env{mfpic} environment, it affects only that environment, otherwise it affects all subsequent figures. This option currently has -no effect with \MF, but should cause no errors. +no effect with \MF{}, but should cause no errors. -\subsection{\opt{clip}, \cs{clipmfpic}, \cs{noclipmfpic}}\label{clip} -\index{clip@\opt{clip}}\index{clipmfpic@\cs{clipmfpic}}% +\section{\opt{clip}, \cs{clipmfpic}, \cs{noclipmfpic}.}\label{clip} +\index{clip@\opt{clip}}% +\index{clipmfpic@\cs{clipmfpic}}% \index{noclipmfpic@\cs{noclipmfpic}} Causes all parts of the figure outside the rectangle specified by the @@ -368,14 +437,14 @@ only. Otherwise all subsequent figures are affected. Note: this is a rather rudimentary option. It has an often unexpected interaction with truebbox. When both are in effect, \MP{} will produce a bounding box that is the intersection of two rectangles: the true one \emph{without -clipping}, and the box specified in the \cs{mfpic} command. It is -possible that the actual figure will be much smaller (even empty!). This -is a property of the \MP{} \gbc{clip} command and we know of no way to -avoid it. +clipping}, and the clipping rectangle (i.e., the one specified in the +\cs{mfpic} command). It is possible for the actual figure to be much +smaller than this bounding box (even empty!). This is a property of the +\MP{} \gbc{clip} command and we know of no way to avoid it. -\subsection{\opt{centeredcaptions}, \cs{usecenteredcaptions}, -\cs{nocenteredcaptions}}\label{centeredcaptions} +\section{\opt{centeredcaptions}, \cs{usecenteredcaptions}, +\cs{nocenteredcaptions}.}\label{centeredcaptions} \index{centeredcaptions@\opt{centeredcaptions}}% \index{usecenteredcaptions@\cs{usecenteredcaptions}}% \index{nocenteredcaptions@\cs{nocenteredcaptions}} @@ -385,26 +454,47 @@ centered. This has no effect on the normal \LaTeX{} \cs{caption} command.% \footnote{This writer [DHL] feels that \cs{tcaption} is too limited and users ought to apply the caption by other means, such as - \LaTeX's \cs{caption} command, outside the \env{mfpic} - environment.} % + \LaTeX{}'s \cs{caption} command, outside the \env{mfpic} + environment.}% + +The commands can be issued anywhere. If inside an \env{mfpic} +environment they should come before the \cs{tcaption} command and affect +only it, otherwise they affect all subsequent figures. They should not +be used in the argument of a \cs{tcaption} command. + +\section{\opt{raggedcaptions}, \cs{useraggedcaptions}, +\cs{noraggedcaptions}.}\label{raggedcaptions} +\index{raggedcaptions@\opt{raggedcaptions}}% +\index{useraggedcaptions@\cs{useraggedcaptions}}% +\index{noraggedcaptions@\cs{noraggedcaptions}} + +Causes multiline captions created by \cs{tcaption} to have all lines +raggedright. If \opt{centeredcaptions} is on, both sides will be ragged. +The command \cs{noraggedcaptions} restores the default: all lines except +the last justified. The last is either centered or flush left according +to whether \opt{centeredcaptions} is on or off. + The commands can be issued anywhere. If inside an \env{mfpic} environment they should come before the \cs{tcaption} command and affect -only it, otherwise they affect all subsequent figures. +only it, otherwise they affect all subsequent figures. They should not +be used in the argument of a \cs{tcaption} command. -\subsection{\opt{debug}, \cs{mfpicdebugtrue}, -\cs{mfpicdebugfalse}}\label{debug} -\index{debug@\opt{debug}}\index{mfpicdebugtrue@\cs{mfpicdebugtrue}}% +\section{\opt{debug}, \cs{mfpicdebugtrue}, +\cs{mfpicdebugfalse}.}\label{debug} +\index{debug@\opt{debug}}% +\index{mfpicdebugtrue@\cs{mfpicdebugtrue}}% \index{mfpicdebugfalse@\cs{mfpicdebugfalse}} Causes \mfp{} to write a rather large amount of information to the \file{.log} file and sometimes to the terminal. Debug information generated by \file{mfpic.tex} \emph{while loading} is probably of interest only to developers, but can be turned on by giving a definition -to the command \cs{mfpicdebug} prior to loading. +to the command \cs{mfpicdebug} prior to loading. Any definition will +work because \prog{mfpic} only checks whether it is defined. -\subsection{\opt{clearsymbols}, \cs{clearsymbols}, \cs{noclearsymbols}} -\index{clearsymbols@\opt{clearsymbols}} -\index{clearsymbols@\cs{clearsymbols}} +\section{\opt{clearsymbols}, \cs{clearsymbols}, \cs{noclearsymbols}.} +\index{clearsymbols@\opt{clearsymbols}}% +\index{clearsymbols@\cs{clearsymbols}}% \index{noclearsymbols@\cs{noclearsymbols}} \Mfp{} has two commands, \cs{point} and \cs{plotsymbol} that place a @@ -415,7 +505,7 @@ behavior of \cs{point} in the case of \cs{pointfillfalse} is to erase the interior of the disk in addition to drawing its circumference. The second command \cs{plotsymbol} can place a variety of shapes, some -open, some not. Its behavior until now was always simply to draw the +open, some not. Its behavior before version 0.7 was to always draw the shape without erasing the interior. Two other commands that placed these symbols, \cs{plotnodes} and \cs{plot}, had the same behavior. With this option, two of these, \cs{plotsymbol} and \cs{plotnodes}, will erase the @@ -427,29 +517,32 @@ interior of the open symbols before drawing them. Thus this option. -\subsection{\opt{draft}, \opt{final}, \opt{nowrite}, \cs{mfpicdraft}, - \cs{mfpicfinal}, \cs{mfpicnowrite}}\label{draft} -\index{draft@\opt{draft}}\index{final@\opt{final}}% -\index{nowrite@\opt{nowrite}}\index{mfpicdraft@\cs{mfpicdraft}}% -\index{mfpicfinal@\cs{mfpicfinal}}\index{mfpicnowrite@\cs{mfpicnowrite}} +\section{\opt{draft}, \opt{final}, \opt{nowrite}, \cs{mfpicdraft}, + \cs{mfpicfinal}, \cs{mfpicnowrite}.}\label{draft} +\index{draft@\opt{draft}}% +\index{final@\opt{final}}% +\index{nowrite@\opt{nowrite}}% +\index{mfpicdraft@\cs{mfpicdraft}}% +\index{mfpicfinal@\cs{mfpicfinal}}% +\index{mfpicnowrite@\cs{mfpicnowrite}} Under the \opt{metapost} option, the various macros that include the \EPS{} files emit rather large amounts of confusing error messages when -the files don't exist (especially in \LaTeX). For this reason, before -each picture is placed, \mfp{} checks for the existence of the -graphic before trying to include it. However, on some systems checking -for the existence of a nonexistent file can be very slow because the -entire \TeX{} search path will need to be checked. Therefore, \mfp{} -doesn't even attempt any inclusion on the first run. The first run is -detected by the non-existence of \file{\meta{file}.1}, where \meta{file} -is the name given in the \cs{opengraphsfile} command (but see also +the files don't exist (especially in \LaTeX{}). For this reason, before +each picture is placed, \mfp{} checks for the existence of the graphic +before trying to include it. However, on some systems checking for the +existence of a nonexistent file can be very slow because the entire +\TeX{} search path will need to be checked. Therefore, \mfp{} doesn't +even attempt any inclusion on the first run. The first run is detected +by the non-existence of \file{\meta{file}.1}, where \meta{file} is the +name given in the \cs{opengraphsfile} command (but see also section~\ref{files}). These options can be used to override this -automatic detection. All the command versions should come \emph{before} +automatic detection. All the command versions \emph{should} come before the \cs{opengraphsfile} command. The \cs{mfpicnowrite} command \emph{must} come before it. These options might be used if, for example, the first figure has an -error and is not created by \MP, but you would like \mfp{} to go +error and is not created by \MP{}, but you would like \mfp{} to go ahead and include the remaining figures. Then use \opt{final}. It can also be used to override a \LaTeX{} global \opt{draft} option. Or if \file{\meta{file}.1} exists, but other figures still have errors and you @@ -461,11 +554,29 @@ debugged, some time might be saved (with either \opt{metafont} or \opt{metapost}) by not writing the output file again, then \opt{nowrite} can be used. +\section{\opt{mfpreadlog}, \cs{mfpreadlog}.}\label{readlog} +\index{mfpreadlog@\opt{mfpreadlog}}% +\index{mfpreadlog@\cs{mfpreadlog}} -\subsection{Option Scoping Rules}\label{scoping} +From version 0.8, there exists a scheme to allow \MF{} or \MP{} to pass +information back to the \file{.tex} file. This is done by writing code +to the figure file requesting \MF{} to place that information in the +\file{.log} file it produces. This option instructs \mfp{} to +read through that log file line-by-line looking for such information. +Since such log files can be potentially quite lengthy, this is made an +option. If the command form \cs{mfpreadlog} is used, it must come before +the \cs{opengraphsfile} command, since that is when the file will be +examined. At the present time, the only \mfp{} facility that requires +this two-way communication is \cs{assignmfvalue} (see +subsection~\ref{misc}). If this is used, the filename given to +\cs{opengraphsfile} should not be the same as the \TeX{} source file in +which this occurs, as then the wrong \file{.log} may be read. + + +\section{Scoping Rules.}\label{scoping} Some of these options merely change \TeX{} behavior, others write -information to the output file for \MF{} or \MP. Changes in \TeX{} +information to the output file for \MF{} or \MP{}. Changes in \TeX{} behavior obey the normal \TeX{} grouping rules, the information written to the output file obeys \MF{} grouping rules. Since each \env{mfpic} environment is both a \TeX{} group and (corresponds to) a \MF{} group, @@ -479,73 +590,166 @@ commands are exceptions; they obey all \TeX{} scoping rules. We have also tried to make all other \mfp{} commands for changing the various parameters follow this rule: local inside \env{mfpic} -environment, global outside. However, as of this writing I don't -claim to have caught every one. +environment, global outside. If this is ever untrue, and I don't +document that fact, please let me know. The following are special: +\begin{display} \cs{usemetapost}\index{usemetapost@\cs{usemetapost}}, \cs{usemetafont}\index{usemetafont@\cs{usemetafont}}, \cs{mfpicdraft}\index{mfpicdraft@\cs{mfpicdraft}}, \cs{mfpicfinal}\index{mfpicfinal@\cs{mfpicfinal}}, +\cs{mfpicnowrite}\index{mfpicnowrite@\cs{mfpicnowrite}},\\ and -\cs{mfpicnowrite}\index{mfpicnowrite@\cs{mfpicnowrite}}. -Their effects are always global, partly because they should occur prior -to the initialization command \cs{opengraphsfile} (described in -section~\ref{files}). Note that \cs{usemetapost} may cause a file of +\cs{mfpreadlog}\index{mfpreadlog@\cs{mfpreadlog}}. +\end{display} +\noindent Their effects are always global, partly because they should +occur prior to the initialization command \cs{opengraphsfile} (described +in section~\ref{files}). Note that \cs{usemetapost} may cause a file of graphic inclusion macros to be input. If this command is issued inside a group, some definitions in that file may be lost, breaking the graphic inclusion code. + \clearpage -\section{The Macros.}\label{macros} - -In these descriptions we will often refer to `\MF{}' when we really mean -`\MF{} or \MP{}'. This will especially be the case whenever we need to -refer to commands in the two languages which are substantially the same, -but occasionally we will even talk about running `\MF{}' when we mean -running one or the other to process the figures. If we need to -discriminate between the two processors, (for example when they have -different behavior) we will make the difference explicit. +\chapter{\CMF{} Data Types.}\label{types} + +Since the arguments of most \mfp{} drawing commands are sent to \MF{} to +be interpreted, it's useful to know something about \MF{} concepts. In +this chapter we will discuss some of the data types \MF{} supports. +Even the casual user should know how coordinates and colors are treated +and so should at least skim the next two sections. The last +section can be read when the user wants to manipulate more complex +objects. + +\CMF{} permits several different data types, and we will mainly be +concerned with six of these: numeric, pair, color (\MP{} only), path, +picture and boolean.% + \footnote{For the curious, there are a total of eight + types (nine for \MP{}). The other three are string, transform and pen. + \MF{} also permits expressions that produce nothing, which is sometimes + called the vacuous type, but doesn't allow for (or need) variables of + this type.} + +A \emph{variable} is a symbolic name such as \mfc{A} or +\mfc{incenter}. Any sequence of letters and underscores is permitted +as a variable name. Numeric indexes are also allowed, provided all +variables that differ only in the index have the same type. Thus +\mfc{A1}, \mfc{A2}, etc., might be variables which are all of type pair. +Quite a lot more is permited for variable names, but the rules are +rather complex and easy to violate. \Mfp{} has commands for creating +both simple variables and indexed variables (called \emph{arrays}) but +the casual user can get quite a lot of use out of \mfp{} without ever +creating or using a \MF{} variable. + +\CMF{} also has something akin to functions. For example, \mfc{sin(1.57)} +might represent a function named \mfc{sin} receiving the parameter +$1.57$ as input and returning the appropriate value. Functions +can take any number of parameters and return any of the data types that +\MF{} supports.% + \footnote{Including the vacuous type.} + + +\section{\CMF{} numerics and pairs.}\label{pairs} + +\CMF{} has numeric quantities. These include lengths, such as the radius +of a circle, as well as dimension units such as \mfc{in} (inches) +and \mfc{pt} (points). In fact it understands all the same units that +\TeX{} does. Numeric quantities can be constants (explicit numbers) or +variables (symbolic names). In fact, \mfc{in} and \mfc{pt} are symbolic +names for numeric quantities. + +\CMF{} also has \mfc{pair} objects, which may be constants or variables. +Pair constants have the form \mfc{($x$,$y$)} where $x$ and $y$ are +numbers, for example \mfc{(0,0)}. Pairs are two-dimensional quantities +used for representing either points or vectors in a rectangular +(Cartesian) coordinate system. + +In this manual we often represent each pair by a brief name, such as +\meta{p} or \meta{v}, the meanings of which are usually obvious in the +context of the macro. These are intended to be replaced in actual use by +either a pair constant or variable. The succinctness of this notation +helps us to think geometrically rather than only of coordinates. + + +\section{\CMP{} colors.}\label{MPcolors} + +\CMP{} has the same concepts as \MF, but also has color objects, which +may also be constants or variables. Color constants have the form +\mfc{($r$,$g$,$b$)} where $r$, $g$, and $b$ are numbers between $0$ and +$1$ determining the relative proportions of red, green and blue in the +color (the ``rgb'' model). A color variable is a name, like +\mfc{red}, \mfc{blue} (both predefined by \MP) or \gbc{magenta} +(predefined by \mfp{}). + + +\section{\CMF{} paths, pictures and booleans.}\label{paths} + +Most of the things that \mfp{} is designed to draw are paths. Examples +of paths are circles, rectangles, other polygons, graphs of +functions and splines. Because we tend to want to draw these (or fill +them, or render them in other ways) we call the \mfp{} commands that +produce them \emph{figure macros}. Although they are much more complex +than numerics, pairs, or colors, they can still be stored in symbolic +names. + +Normally in \mfp{} we want to create a picture, usually by rendering one +or more paths. It is possible in \MF{} to store a picture in a symbolic +name without actually drawing it. However, because of their complexity, +picture objects require somewhat more care than paths or other data +types. Do not expect to use stored pictures in the same way as stored +paths. In fact, one should use picture variables only in those command +that are explicitely designed for them. In \mfp{} to date these are only +\cs{tile...}\cs{endtile} and \cs{mfpimage} to store pictures, and +\cs{putmfpimage} to draw copies of one. There is also \cs{tess}, but it +is used only to fill a region with copies of a picture created by +\cs{tile}. + +The boolean data type is one of the values \mfc{true} or \mfc{false}. +Boolean variables are symbolic names that can take either of these two +values. Usually these are used to influence the behavior of some command +by setting a relevant boolean variable to one or the other value. -A similar shorthand is used when referring to \TeX{}. It should not be -taken to mean plain\TeX, but rather whatever version of \TeX{} is used -to process the source file: \LaTeX, \pdfTeX, \pdfLaTeX, etc. + +\clearpage +\chapter{The Macros.}\label{macros} Many of the commands of \mfp{} have optional arguments. These are -denoted just as in \LaTeX, with square brackets. Thus, the command for +denoted just as in \LaTeX{}, with square brackets. Thus, the command for drawing a circle can be given -\begin{ex} - \cs{circle}\marg{(0,0),1} -\end{ex} +\begin{verbatim} +\circle{(0,0),1} +\end{verbatim} having only the mandatory argument, or -\begin{ex} - \cs{circle}\oarg{p}\marg{(0,0),1} -\end{ex} +\begin{verbatim} +\circle[p]{(0,0),1} +\end{verbatim} Whenever an optional argument is omitted, the behavior is equivalent to some choice of the optional argument. In this example, the two forms have exactly the same behavior, drawing a circle centered at $(0,0)$ -with radius $1$. In this case we will say that \oarg{p} is the -\emph{default}. Another example is \cs{point}\marg{(1,0)} versus +with radius $1$. In this case we will say ``\oarg{p} is the +\emph{default}''. Another example is \cs{point}\marg{(1,0)} versus \cs{point}\oarg{3pt}\marg{(1,0)}. They both place a dot at the point -$(1,0)$. The second one explicitly request that it have diameter +$(1,0)$. The second one explicitly requests that it have diameter \dim{3pt}; the first will examine the length command \cs{pointsize}, which the user can change, but it is initialized to \dim{2pt}. In this -case we will say the default is the value of \cs{pointsize}, -\emph{initially \dim{2pt}}. +case we will say ``the default is the value of \cs{pointsize}, +\emph{initially} \dim{2pt}''. -Optional arguments for \mfp{} commands may consist of empty brackets -(completely empty, no spaces) and the default will be used. This is -useful only for commands that have two optional arguments and one only -wants to change from the defaults in the second one. An optional -argument should normally not contain any spaces. Even when the argument -contains more than one piece of data, spaces should not separate the -parts. In many cases (perhaps most) this will cause no harm, but it -would be better to avoid doing it altogether. +If an \mfp{} command that takes an optional argument finds only empty +brackets (completely empty, no spaces), then it will use the default +value. This is useful for commands that have two optional arguments and +one wants the default value in the first one and some nondefault value +in the second. An optional argument should normally not contain any +spaces. Even when the argument contains more than one piece of data, +spaces should not separate the parts. In some cases (perhaps most) this +will cause no harm, but it would be better to avoid doing it altogether, +because it will cause wrong results or error messages in some cases. -\subsection{Files and Environments.}\label{files} +\section{Files and Environments.}\label{files} -\begin{cd} +\begin{cd}\pagelabel{opengraphsfile} \cs{opengraphsfile}\marg{\meta{file}}\\ \ $\ldots$\\ \cs{closegraphsfile}% @@ -558,7 +762,7 @@ the pictures to be included in this document. The name of the file will be \file{\meta{file}.mf} (or \file{\meta{file}.mp}). Do \emph{not} specify the extension, which is added automatically. -\emph{Note}: This command will cause \file{\meta{file}.mf} or +\emph{Note}: This command may cause \file{\meta{file}.mf} or \file{\meta{file}.mp} to be overwritten if it already exists, so be sure to consider that when selecting the name. Repeating the running of \TeX{} will overwrite the file created on previous runs, but that should @@ -571,51 +775,74 @@ file and open another, and even to change between \opt{metapost} and \opt{metafont} in between. If anything goes wrong with this, contact the maintainer and it might be fixed in some later version. -\begin{cd} +\begin{cd}\pagelabel{mfpic} \cs{mfpic}\oarg{\meta{xscale}}\oarg{\meta{yscale}}% \marg{\meta{xmin}}\marg{\meta{xmax}}\marg{\meta{ymin}}\marg{\meta{ymax}}\\ \ $\ldots$\\ \cs{endmfpic}% -\index{mfpic@\cs{mfpic}}\index{endmfpic@\cs{endmfpic}} -\end{cd} - -These macros open and close the \env{mfpic} environment in which most of -the rest of the macros make sense. The \cs{mfpic} macro also sets up the -local coordinate system for the picture. The \meta{xscale} and +\index{mfpic@\cs{mfpic}}% +\index{endmfpic@\cs{endmfpic}} +\end{cd} + +These macros open and close the \env{mfpic} environment% + \footnote{We use the term `environment' loosely. However, in + \LaTeX{} one may use an actual \env{mfpic} environment. See + page~\pageref{envusage}.} +in which the drawing macros make sense. While many \mfp{} commands can +be used inside or outside this environment, those that actually produce +visible output are required to be inside. The \cs{mfpic} macro also sets +up the local coordinate system for the picture. The \meta{xscale} and \meta{yscale} parameters establish the length of a coordinate system unit, as a multiple of the \TeX{} dimension \cs{mfpicunit}. If neither -is specified, both are taken to be 1 (i.e., each coordinate system unit -is 1 \cs{mfpicunit}). If only one is specified, then they are assumed to -be equal. The \meta{xmin} and \meta{xmax} parameters establish the lower +is specified, both are taken to be 1 and each coordinate system unit is +1 \cs{mfpicunit}. If only one is specified, then they are assumed to be +equal. Note that some drawing commands require equal scales to work as +expected: if you try to draw a circle with different scales you will get +an ellipse. + +The \meta{xmin} and \meta{xmax} parameters establish the lower and upper bounds for the $x$-axis coordinates; similarly, \meta{ymin} and \meta{ymax} establish the bounds for the $y$-axis. These bounds are expressed in local units---in other words, the actual width of the picture will be $(\meta{xmax}-\meta{xmin})\cdot\meta{xscale}$ times \cs{mfpicunit}, its height $(\meta{ymax}-\meta{ymin})\cdot\meta{yscale}$ -times \cs{mfpicunit}, and its depth zero. One can scale all pictures -uniformly by changing \cs{mfpicunit}, and scale an individual picture by -changing \meta{xscale} and \meta{yscale}. After loading \mfp, -\cs{mfpicunit} has the value \dim{1pt}. One \texttt{pt} is a -\emph{printer's point}, which equals 1/72.27 inches or 0.35146 -millimeters. +times \cs{mfpicunit}, and its depth zero. + +Most of \mfp{}'s drawing macros accept parameters which are +\emph{coordinate pairs}. A coordinate pair is a pair of numbers $(x,y)$ +enclosed in parentheses, with $\meta{xmin} \le x \le \meta{xmax}$ and +$\meta{ymin} +\le y \le \meta{ymax}$.% + \footnote{These inequalities can be violated, usually causing + something to be drawn outside the desired borders of the figure.} +We will call these \emph{graph coordinates} and refer to the numbers $x$ +and $y$ as being \emph{in graph units}. Things like the thickness of +lines and the lengths of arrowheads are required to be expressed in +actual lengths such as \dim{1pt} or \dim{3mm}. These will be referred to as +\emph{absolute} units. + +One can scale all pictures uniformly by changing \cs{mfpicunit}, and +scale an individual picture by changing \meta{xscale} and \meta{yscale}. +After loading \mfp{}, \cs{mfpicunit} has the value \dim{1pt}. One +\texttt{pt} is a \emph{printer's point}, which equals 1/72.27 inches or +0.35146 millimeters. \emph{Note}: Changing \cs{mfpicunit} or the optional parameters will -scale the coordinate system, but not the values of certain parameters -that are defined in absolute units. Examples of these are the default -width of the drawing pen, the default lengths of arrowheads, the default -sizes of dashes and dots, etc. If you wish, you can set these to -multiples of \cs{mfpicunit}, but it is difficult (and probably unwise) -to get them to scale along with the scale parameters. +scale the coordinate system, but not the values of parameters that are +defined in absolute units. If you wish, you can set these to multiples +of \cs{mfpicunit}, but it is difficult (and almost certainly unwise) to +get the thickness of lines (for example) to scale along with the scale +parameters. In addition to establishing the coordinate system, these scales and bounds are used to establish the metric for the \MF{} character or bounding box for the \MP{} figure described within the environment. If -any of these parameters are changed, the \file{.tfm} file (\MF) or the -bounding box (\MP) will be affected, so you will have to be sure to +any of these parameters are changed, the \file{.tfm} file (\MF{}) or the +bounding box (\MP{}) will be affected, so you will have to be sure to reprocess the \TeX{} file after processing the \file{.mf} or \file{.mp} file, even if no other changes are made in the figure. -\begin{cd} +\begin{cd}\pagelabel{mfpicnumber} \cs{mfpicnumber}\marg{\meta{num}}% \index{mfpicnumber@\cs{mfpicnumber}} \end{cd} @@ -637,106 +864,111 @@ option, this command should come before \cs{opengraphsfile}, as that command checks for the existence of the first numbered figure to determine if there are figures to be included. -\begin{cd} +\begin{cd}\pagelabel{everymfpic} +\cs{everymfpic}\marg{\meta{commands}}\\ +\cs{everyendmfpic}\marg{\meta{commands}}% +\index{everymfpic@\cs{everymfpic}}% +\index{everyendmfpic@\cs{everyendmfpic}}% +\end{cd} + +These commands store the \meta{commands}. The first arranges for these +commands to be issued first thing in every \env{mfpic} environment and +the second arranges for its commands to be issued as the last thing in +every such environment. These could be any commands that make sense +inside that environment. Their purpose is mainly to save typing if there +is identical setup being performed in every picture. + +\begin{cd}\pagelabel{envusage} \cs{begin}\marg{mfpic}\texttt{...}\cs{end}\marg{mfpic}% \index{begin@\cs{begin}\marg{mfpic}} \end{cd} -In \LaTeX, instead of \cs{mfpic} and \cs{endmfpic}, you may prefer to -use \cs{begin}\marg{mfpic} and \cs{end}\marg{mfpic}. This is by no means -required: in \LaTeX{} \cs{begin}\marg{command} invokes \cs{command}, and -\cs{end}\marg{command} invokes \cs{endcommand}, for any environment -\env{command}. - -The sample file \file{lapictures.tex} provided with \mfp{} -illustrates this use of an \env{mfpic} environment in \LaTeX. +In \LaTeX{} you may prefer to use \cs{begin}\marg{mfpic} and +\cs{end}\marg{mfpic} (instead of \cs{mfpic} and \cs{endmfpic}). This is +by no means required. The sample file \file{lapictures.tex} provided +with \mfp{} illustrates this use of an \env{mfpic} environment in +\LaTeX{}. \medskip -The rest of the \mfp{} macros do not affect the font metric file -(\file{\meta{file}.tfm}), and so if these commands are changed or added -in your document, you will not have to repeat the third step of -processing (reprocessing with \TeX) to complete your \TeX{} document. -The same is true when option \opt{metapost} is selected without the -\opt{truebbox} option, except under \pdfTeX{} or \pdfLaTeX. Those \TeX{} -programs will embed the figures right in the \file{.pdf} output. For -normal \LaTeX{} + \prog{dvips}, the figures are embedded by -\prog{dvips}, which must always be repeated. +A word about \TeX{} groups inside \env{mfpic} environments. These can be +useful to limit the scope of declarations or of changes to some +variables. However, they do not limit the scope of changes to the figure +file that is being written, so there is a danger that \TeX{} and \MF{} +will have different values. There are also some \mfp{} command that need +to be at the outermost level. Thus, grouping should generaly be avoided +except for those groups provided by \mfp{} commands. \medskip For the remainder of the macros, the numerical parameters are expressed -in the units of the local coordinate system specified by \cs{mfpic}, -unless otherwise indicated. - - -\subsection{Figures.}\label{figures} - -\subsubsection{\CMF{} Pairs.}\label{pairs} - -Since many of the arguments of the \mfp{} drawing commands are -sent to \MF{} to be interpreted, it's useful to know something about -\MF{} concepts. - -In particular, \MF{} has \mfc{pair} objects, which may be constants or -variables. Pair constants have the form \mfc{($x$,$y$)}. Pairs are -two-dimensional rectangular (cartesian) quantities, and are clearly -useful for representing both points and vectors on the plane. - -Moreover, we herein often represent each pair by a brief name, such as -$p$, $v$ or $c$, the meanings of which are usually obvious in the -context of the macro. The succinctness of this notation also helps us to -think geometrically rather than only of coordinates. - -\CMP{} has these same concepts, but also has color objects, which may -also be constants or variables. Color constants have the form -\mfc{($r$,$g$,$b$)} where $r$, $g$, and $b$ are numbers between $0$ and -$1$ determining the relative proportions of red, green and blue in the -color (rgb model). A color variable is a name, like \mfc{magenta} or -\mfc{RoyalBlue} (predefined). There are also color functions like -\mfc{cmyk($x$,$y$,$z$,$w$)} which is defined to convert cmyk values into -\MP's native rgb model. - -Some commands depend on the value of separately defined parameters. All +in graph units, the units of the local coordinate system specified by +\cs{mfpic}, unless otherwise indicated. + +\section{Common objects.}\label{figures} + +The \mfp{} macros that draw things can be roughly divided into two +classes. +\begin{enumerate} + \item Those that simply cause something to be drawn. Examples of these + are the \cs{point} command, which places a dot at a list of + coordinates, and \cs{gridlines}, which draw coordinate lines with + specified separation. + \item Those that both \emph{define} and draw a \emph{path}. The macros + \cs{circle}, \cs{rect}, and \cs{polyline} are examples of these. +\end{enumerate} + +Macros of type 2 are referred to hereafter as \emph{figure macros}, for +lack of a better term. With them one can use \emph{prefix +macros}\index{prefix macro} to modify various aspects of the path and +how it is drawn. For example, +\begin{verbatim} +\polyline{(1,2),(3,4)} +\end{verbatim} +draws a line from $(1,2)$ to $(3,4)$, but +\begin{verbatim} +\dotted\polyline{(1,2),(3,4)} +\end{verbatim} +produces a dotted version, and +\begin{verbatim} +\arrow\polyline{(1,2),(3,4)} +\end{verbatim} +draws it with an arrowhead at the tip. This is not possible with +\cs{gridlines}, for example. As \mfp{} and the accompanying \MF{} +package \grafbase{} are currently written, prefix macros can only be +applied to single paths, and \cs{gridlines} produces a whole set of +lines. In this manual, as each macro is introduced, if it is a figure +macro, this will be explicitly stated. + +Some commands depend on the value of separately defined parameters. all these parameters are initialized when \mfp{} is loaded. In the following descriptions we give the initial value of all the relevant parameters. When \MP{} output is selected, figures can be drawn in any color. -Several of the above mentioned parameters are colors. \Mfp{} provides -commands to change any of these parameters. - +several of the above mentioned parameters are colors. \mfp{} provides +commands to change any of these parameters. To save repetition: all +special colors for figures are initialized to \mfc{black} except +\mfc{background}, which is white. -\subsubsection{Points, Lines, and Rectangles.}\label{points} -\begin{cd} -\cs{pointdef}\marg{\meta{name}}\texttt{($x$,$y$)}% -\index{pointdef@\cs{pointdef}} -\end{cd} +\subsection{Points, lines, and rectangles}\label{points} -Defines a symbolic name for points and their coordinates. \meta{name} is -any legal \TeX{} command name \emph{without} the backslash; $x$ and $y$ -are any numbers. For example, after the command -\cs{pointdef}\marg{A}\texttt{(1,3)}, \cs{A} expands to \texttt{(1,3)}, while -\cs{Ax} and \cs{Ay} expand to \texttt{1} and \texttt{3}, respectively. Because -of the way \cs{tlabel} is defined (see section~\ref{labels} below), one -cannot use \cs{A} to specify where to place a label (unless -\opt{mplabels} is in effect), but must use \texttt{ (\cs{Ax},\cs{Ay})}. In -most other commands, one can use \cs{A} where a pair or point is -required. - -\begin{cd} -\cs{point}\oarg{\meta{ptsize}}\marg{\meta{$p_0$},\meta{$p_1$},$\ldots$}% +\begin{cd}\pagelabel{point} +\cs{point}\oarg{\meta{size}}\marg{\meta{$p_0$},\meta{$p_1$},$\ldots$}% \index{point@\cs{point}} \end{cd} -Draws small disks centered at the points \meta{$p_0$}, \meta{$p_1$}, and -so on. If the optional argument \meta{ptsize} is present, it determines -the diameter of the disks, which otherwise equals the \TeX{} dimension -\cs{pointsize}, initially \dim{2pt}. The disks have a filled interior if -the command \cs{pointfilltrue} has been issued (the initial value), -\cs{pointfillfalse} causes the interior to be erased and an outline -drawn. The color of the circles is the value of the predefined variable -\gbc{pointcolor}, and the inside of the open circles is the value of -\mfc{background}. - -\begin{cd} +Draws small disks centered at the points specified in the list of +ordered pairs. The optional argument \meta{size} is an absolute +dimension that determines the diameter of the disks. The default is the +\TeX{} dimension \cs{pointsize}, initially \dim{2pt}. The disks have a +filled interior if the command \cs{pointfilltrue} has been issued (the +initial behavior). After the command \cs{pointfillfalse}, \cs{point} +commands will produce outlined circles with the interiors erased. The +color of the circles is the value of the predefined variable +\gbc{pointcolor}, and the color inside of the open circles is the value +of the variable \mfc{background}.% + \footnote{\MP{} cannot actually erase. The illusion of erasing is + created by painting over with \mfc{background}.} + +\begin{cd}\pagelabel{plotsymbol} \cs{plotsymbol}\oarg{\meta{size}}\marg{\meta{symbol}}% \marg{\meta{$p_0$},\meta{$p_1$},$\ldots$}% \index{plotsymbol@\cs{plotsymbol}} @@ -744,36 +976,55 @@ drawn. The color of the circles is the value of the predefined variable Draws small symbols centered at the points \meta{$p_0$}, \meta{$p_1$}, and so on. The symbols must be given by name, and the available symbols -are +are: +\begin{display} \gbc{Asterisk}\index{Asterisk@\gbc{Asterisk}}, \gbc{Circle}\index{Circle@\gbc{Circle}}, \gbc{Diamond}\index{Diamond@\gbc{Diamond}}, \gbc{Square}\index{Square@\gbc{Square}}, \gbc{Triangle}\index{Triangle@\gbc{Triangle}}, \gbc{Star}\index{Star@\gbc{Star}}, -\gbc{SolidCircle}\index{SolidCircle@\gbc{SolidCircle}}, +\gbc{SolidCircle}\index{SolidCircle@\gbc{SolidCircle}},\\ \gbc{SolidDiamond}\index{SolidDiamond@\gbc{SolidDiamond}}, \gbc{SolidSquare}\index{SolidSquare@\gbc{SolidSquare}}, \gbc{SolidTriangle}\index{SolidTriangle@\gbc{SolidTriangle}}, \gbc{SolidStar}\index{SolidStar@\gbc{SolidStar}}, \gbc{Cross}\index{Cross@\gbc{Cross}} and \gbc{Plus}\index{Plus@\gbc{Plus}}. -The names should be self-explanatory. Under \opt{metapost}, symbols are -drawn in \gbc{pointcolor}. The \meta{size} defaults to \cs{pointsize} as -in \cs{point} above. \gbc{Asterisk} consists of six -line segments while \gbc{Star} is the standard closed, ten-sided -polygon. The name `\cs{plotsymbol}' comes from the fact that the \cs{plot} -command, which was written first, utilizes these same symbols. The command -\cs{symbol} was already taken (standard \LaTeX). +\end{display} +The names should be self-explanatory, the `\gbc{Solid}' ones are filled +in, the others are outlines. Under \opt{metapost}, symbols are drawn in +\gbc{pointcolor}. The \meta{size} defaults to \cs{pointsize} as in +\cs{point} above. \gbc{Asterisk} consists of six line segments while +\gbc{Star} is the standard five-pointed star formed from ten straight +line segments. \gbc{Cross} is a $\times$ shape. The name +`\cs{plotsymbol}' comes from the fact that the \cs{plot} command (see +subsection~\ref{drawing}), which was written first, utilizes these same +symbols. The command \cs{symbol} was already taken (standard \LaTeX{}). + +While one would rarely want to use them for this purpose, the following +symbols are also available: +\begin{display} +\gbc{Arrowhead}\index{Arrowhead@\gbc{Arrowhead}}, +\gbc{Crossbar}\index{Crossbar@\gbc{Crossbar}}, +\gbc{Leftbar}\index{Leftbar@\gbc{Leftbar}}, +\gbc{Rightbar}\index{Rightbar@\gbc{Rightbar}}, +\gbc{Lefthook}\index{Lefthook@\gbc{Lefthook}}, +\gbc{Righthook}\index{Righthook@\gbc{Righthook}}, +\gbc{Leftharpoon}\index{Leftharpoon@\gbc{Leftharpoon}},\\ +\gbc{Rightharpoon}\index{Rightharpoon@\gbc{Rightharpoon}}. +\end{display} +These are mainly intended for making arrows. See subsection~\ref{arrows} +for a further description. The difference between \cs{pointfillfalse}\cs{point}$\ldots$ and \cs{plotsymbol}\marg{Circle}$\ldots$ is that the inside of the circle -will not be erased in the second version (i.e., whatever else has already -been drawn in that area will remain visible). This is the default (for +will not be erased in the second version, so whatever else has already +been drawn in that area will remain visible. This is the default (for backward compatibility), but that can be changed with the commands below. -\begin{cd} +\begin{cd}\pagelabel{clearsymbols} \cs{clearsymbols}\\ \cs{noclearsymbols}% \index{clearsymbols@\cs{clearsymbols}}% @@ -788,91 +1039,121 @@ subsection~\ref{drawing}) also responds to the settings made by these commands. The \cs{plot} command (also in subsection~\ref{drawing}) does not. -\begin{cd} +You can design your own `symbols'. See the discussion of arrowheads in +subsection~\ref{arrows}, and of storing paths in +subsection~\ref{transformation}. + +\begin{cd}\pagelabel{pointdef} +\cs{pointdef}\marg{\meta{name}}\texttt{(\meta{xcoord},\meta{ycoord})}% +\index{pointdef@\cs{pointdef}} +\end{cd} + +Defines a symbolic name for an ordered pair and the coordinates it +contains. \meta{name} is any legal \TeX{} command name \emph{without} +the backslash; \meta{xcoord} and \meta{ycoord} are any numbers. For +example, after the command \cs{pointdef}\marg{A}\texttt{(1,3)}, \cs{A} +expands to \texttt{(1,3)}, while \cs{Ax} and \cs{Ay} expand to +\texttt{1} and \texttt{3}, respectively. If \opt{mplabels} is in effect +one can use \cs{A} to specify where to place a text label, but if \TeX{} +is placing labels one must use \texttt{ (\cs{Ax},\cs{Ay})}. In most +other cases, one can use \cs{A} where a pair or point is required. + +\begin{cd}\pagelabel{polyline} \cs{polyline}\marg{\meta{$p_0$},\meta{$p_1$},$\ldots$}\\ \cs{lines}\marg{\meta{$p_0$},\meta{$p_1$},$\ldots$}% -\index{polyline@\cs{polyline}}\index{lines@\cs{lines}} +\index{polyline@\cs{polyline}}% +\index{lines@\cs{lines}} \end{cd} -Draws the line segment with endpoints at \meta{$p_0$} and \meta{$p_1$}, -then the line segment with endpoints at \meta{$p_1$} and \meta{$p_2$}, -etc. The result is an open polygonal path through the specified points, -in the specified order. \cs{polyline} and \cs{lines} mean the same -thing. +The figure macro \cs{polyline} produces connected line segments from +\meta{$p_0$} to \meta{$p_1$}, and from there to \meta{$p_2$}, etc. The +result is an open polygonal path through the specified points, in the +specified order. The macro \cs{lines} is an alias for \cs{polyline}. -\begin{cd} -\cs{polygon}\marg{\meta{$p_0$},\meta{$p_1$},$\ldots$}% -\index{polygon@\cs{polygon}} +\begin{cd}\pagelabel{polygon} +\cs{polygon}\marg{\meta{$p_0$},\meta{$p_1$},$\ldots$}\\ +\cs{closedpolyline}\marg{\meta{$p_0$},\meta{$p_1$},$\ldots$}% +\index{polygon@\cs{polygon}}% +\index{closedpolyline@\cs{closedpolyline}} \end{cd} -Draws a closed polygon with vertices at the specified points in the -specified order. +The figure macros \cs{polygon} produces a closed polygon with vertices +at the specified points in the specified order. It works exactly like +\cs{polyline} except the last point in the list is also joined to the +first. The macro \cs{closedpolyline} is an alias for \cs{polygon}. -\begin{cd} +\begin{cd}\pagelabel{rect} \cs{rect}\marg{\meta{$p_0$},\meta{$p_1$}}% \index{rect@\cs{rect}} \end{cd} -Draws the rectangle specified by the points \meta{$p_0$} and -\meta{$p_1$}, these being either pair of opposite corners of the -rectangle in any order. +This figure macro produces the closed rectangle with horizontal and +vertical sides, having the points \meta{$p_0$} and \meta{$p_1$} as +diagonally opposite corners. The same rectangle can be specified in four +different ways: either pair of opposite corners in either order. It is occasionally helpful to know that connected paths like those -produced by \cs{polyline} or \cs{rect} have a \emph{sense} (a -direction). The sense of \cs{polyline} is the direction determined by -the order of the points. For \cs{rect} the sense may be clockwise or -anticlockwise depending on the corners used: it begins at the first of -the two points and goes horizontally from there. - -\begin{cd} +produced by \cs{polyline} or \cs{rect} have a \emph{start} and an +\emph{end} as well as \emph{sense} (or direction). The path produced by +\cs{polyline} starts at the first listed pint and ends at last, having +the direction determined by the order of the points. For \cs{rect} the +sense may be clockwise or anticlockwise depending on the corners used: +it starts by moving horizontally from the first listed point. +Several \mfp{} macros (such as those that add arrowheads) treat the +beginning and the end of a path differently, or adjust their behavior +according to the sense of the curve. + +\begin{cd}\pagelabel{regpolygon} \cs{regpolygon}\marg{\meta{num}}\marg{\meta{name}}% -\marg{\meta{eqn$_1$}}\marg{\meta{eqn$_2$}}% + \marg{\meta{eqn$_1$}}\marg{\meta{eqn$_2$}}% \index{regpolygon@\cs{regpolygon}} \end{cd} -This produces a regular polygon with \meta{num} sides. The second -argument, \meta{name} is a symbolic name. It can be used to refer to the -vertices later. The last two arguments should be equations that position -two of the vertices or one vertex and the center. The center is refered -to by \meta{name}\gbc{0} and the vertices by \meta{name}\gbc{1} -\meta{name}\gbc{2}, etc., going anticlockwise around the polygon. The -\meta{name} itself (without a number) will be a \MF{} variable assigned -the value of \meta{num}. For example, -\begin{ex} -\cs{regpolygon}\marg{5}\marg{Meg}\marg{Meg0=(0,1)}\marg{Meg1=(2,0)} -\end{ex} +This figure macro produces a closed regular polygon with \meta{num} +sides. The second argument, \meta{name} is a symbolic name. It can be +used to refer to the vertices later. The last two arguments should be +equations that position two of the vertices or one vertex and the +center. The center is referred to by \meta{name}\gbc{0} and the vertices +by \meta{name}\gbc{1} \meta{name}\gbc{2}, etc., going anticlockwise +around the polygon. The \meta{name} itself (without a number suffixed) +will be a \MF{} variable assigned the value of \meta{num}. For example, +\begin{verbatim} +\regpolygon{5}{Kay}{Kay0=(0,1)}{Kay1=(2,0)} +\end{verbatim} will produce a regular pentagon with its center at $(0,1)$ and its first vertex at $(2,0)$. One could later draw a star inside it with -\begin{ex} -\cs{polygon}\marg{Meg1,Meg3,Meg5,Meg2,Meg4} -\end{ex} -Moreover, \gbc{Meg} will equal $5$. -The name given becomes a \MF{} variable and care should be taken to make -the name distinctive so as not to redefine some internal variable. +\begin{verbatim} +\polygon{Kay1,Kay3,Kay5,Kay2,Kay4} +\end{verbatim} +Moreover, \gbc{Kay} will equal $5$. The name given becomes a \MF{} +variable and care should be taken to make the name distinctive so as not +to redefine some internal variable. -\subsubsection{A Word on List Arguments}\label{list} +\subsection{A word about list arguments}\label{list} We have seen already four \mfp{} macros that take a mandatory argument -consisting of a list of coordinate pairs. There are many more, and some -that take a comma-separated lists of other types of items. If the lists -are long, especially if they are generated by a program, it might be -more convenient if one could simply refer to an external file for the -data. This is possible, and one does it the following way: instead of -\cs{lines}\marg{\meta{list}}, one can write\index{datafile@\cs{datafile}} +consisting of an arbitrary number of coordinate pairs, separated by +commas. There are many more, and some that take a comma-separated list +of items of other types. If the lists are long, especially if they are +generated by a program, it might be more convenient if one could simply +refer to an external file for the data. This is possible, and one does +it the following way: instead of \cs{polyline}\marg{\meta{list}}, one +can write\index{datafile@\cs{datafile}} \begin{ex} -\cs{lines}\cs{datafile}\marg{\meta{filename}} + \cs{polyline}\cs{datafile}\marg{\meta{filename}} \end{ex} where \meta{filename} is the full name of the file containing the data. The required format of this file and the details of this usage can be found in subsection~\ref{external}. This method is available for any -command that takes a comma-separated list of data as its last argument, -\emph{with the exception of those commands that adds text to the -picture}. Examples of the latter are \cs{plottext} and \cs{axislabels} -(subsection~\ref{text}). +command that takes a comma-separated list of data (of arbitrary length) +as its last argument, \emph{with the exception of those commands that +add text to the picture}. Examples of the latter are \cs{plottext} and +\cs{axislabels} (subsection~\ref{text}). -\subsubsection{Axes, Axis Marks, and Grids.}\label{axes} -\begin{cd} +\subsection{Axes, axis marks, and grids}\label{axesthings} + +\begin{cd}\pagelabel{axes} \cs{axes}\oarg{\meta{hlen}}\\ \cs{xaxis}\oarg{\meta{hlen}}\\ \cs{yaxis}\oarg{\meta{hlen}}% @@ -893,40 +1174,63 @@ macro (section~\ref{modifier}). The color of the head is the value of \gbc{headcolor}, the shaft is \gbc{drawcolor}. Unlike other commands that produce lines or curves, these do not respond -to the prefix macros of sections \ref{modifier}~and \ref{rendering}. -They always draw a solid line (with an arrowhead unless \cs{axisheadlen} -is \dim{0pt}). They \emph{do} respond to changes in the pen thickness -(see \cs{penwd} in section~\ref{parameters}) but that is pretty much the -only possibility for variation. +to prefix macros. They always draw a solid line (with an arrowhead +unless \cs{axisheadlen} is \dim{0pt}). They \emph{do} respond to changes +in the pen thickness (see \cs{penwd} in section~\ref{parameters}) but +that is pretty much the only possibility for variation. -\begin{cd} +\begin{cd}\pagelabel{axis} \cs{axis}\oarg{\meta{hlen}}\marg{\meta{one-axis}}\\ \cs{doaxes}\oarg{\meta{hlen}}\marg{\meta{axis-list}}% -\index{axis@\cs{axis}} -\index{doaxes@\cs{doaxes}} +\index{axis@\cs{axis}}% +\index{doaxes@\cs{doaxes}}% \end{cd} These produce any of 6 different axes. The parameter \meta{one-axis} can -be \texttt{x} or \texttt{y}, to produce (almost) the equivalent of \cs{xaxis} -and \cs{yaxis}; or it can be \texttt{l}, \texttt{b}, \texttt{r}, or \texttt{t} to -produce an axis on the border of the picture (left, bottom, right or -top, respectively). \cs{doaxes} takes a list of any or all of the six -letters (with either spaces or nothing in between) and produces the -appropriate axes. Example: \cs{doaxes}\marg{lbrt}. The optional argument -sets the length of the arrowhead. In the case of axes on the edges, the -default is the value of \cs{sideheadlen}, which \mfp{} -initializes to \dim{0pt}. For the $x$- and $y$-axis the default is -\cs{axisheadlen} as in \cs{xaxis} and \cs{yaxis} above. +be \texttt{x} or \texttt{y}, to produce (almost) the equivalent of +\cs{xaxis} and \cs{yaxis}; or it can be \texttt{l}, \texttt{b}, +\texttt{r}, or \texttt{t} to produce an axis on the border of the +picture (left, bottom, right or top, respectively). \cs{doaxes} takes a +list of any or all of the six letters (with either spaces or nothing in +between) and produces the appropriate axes. Example: +\cs{doaxes}\marg{lbrt}. The optional argument sets the length of the +arrowhead. In the case of axes on the edges, the default is the value of +\cs{sideheadlen}, which \mfp{} initializes to \dim{0pt}. For the $x$- +and $y$-axis the default is \cs{axisheadlen} as in \cs{xaxis} and +\cs{yaxis} above. The commands \cs{axis}\marg{x}, \cs{axis}\marg{y}, and \cs{doaxes}\marg{xy} differ from the old \cs{xaxis}, \cs{yaxis} and -\cs{axes} in that these new versions respond to changes made by -\cs{setrender} (see subsection~\ref{default}). Moreover, prefix macros -may be applied to \cs{axis} without error (see sections -\ref{modifier}~and \ref{rendering}): \cs{dotted}\cs{axis}\marg{x} draws -a dotted $x$-axis, but \cs{dotted}\cs{xaxis} produces a \MF{} error. A -prefix macro applied to \cs{doaxes} generates no error, but only the -first axis in the list will be affected. +\cs{axes} in that these new versions respond to prefix macros. The +\cs{arrow} prefix previously mentioned is an exception: these macros add +an arrowhead automatically. For example, the sequence +\cs{dotted}\cs{axis}\marg{x} draws a dotted $x$-axis, but +\cs{dotted}\cs{xaxis} produces a \MF{} error. A prefix macro applied to +\cs{doaxes} generates no error, but only the first axis in the list will +be affected. + +\begin{cd}\pagelabel{axisline} +\cs{axisline}\marg{\meta{one-axis}}\\ +\cs{border}% +\index{axisline@\cs{axisline}}% +\index{border@\cs{border}}% +\end{cd} + +These are figure macros that draw the line or lines that an \cs{axis} +command would draw. An \cs{axis} command is almost the equivalent of +\begin{display} +\cs{arrow}\oarg{l\meta{hlen}}\cs{axisline}\marg{\meta{one-axis}}. +\end{display} +The \cs{axisline} command is provided as a figure macro for maximum +flexibility. For example, one can use the star-form of the \cs{arrow} +command if desired or decorate it with ones own choice of arrowhead (see +subsection~\ref{arrows}). + +Also a figure macro, \cs{border} produces the rectangle which, if drawn, +is visibly the same as the four border \cs{axisline}\,s (without heads). +It is a closed path and could easily be drawn with a \cs{rect} command, +but the \cs{border} command automatically adjusts for the margins set by +the commands below. The side axes are drawn by default with a pen stroke along the very edge of the picture (as determined by the parameters to \cs{mfpic}). This can @@ -934,47 +1238,52 @@ be changed with the command \cs{axismargin} described below. Axes on the edges are drawn so that they don't cross each other. \cs{doaxes}\marg{lbrt}, for example, produces a perfect rectangle. If the -$x$- and $y$-axis are drawn with \cs{axis} or \cs{doaxis}, then they +$x$- and $y$-axis are drawn with \cs{axis} or \cs{doaxes}, then they will not cross the side axes. For this to work properly, all the following margin settings have to be done before the axes are drawn. -\begin{cd} -\cs{axismargin}\marg{\meta{axis}}\marg{\meta{num}}\\ -\cs{setaxismargins}\marg{\meta{num}}\marg{\meta{num}}\marg{\meta{num}}\marg{\meta{num}}\\ +\begin{cd}\pagelabel{axismargin} +\cs{axismargin}\marg{\meta{one-axis}}\marg{\meta{num}}\\ +\cs{setaxismargins}% + \marg{\meta{num}}\marg{\meta{num}}\marg{\meta{num}}\marg{\meta{num}}\\ \cs{setallaxismargins}\marg{\meta{num}}% \index{axismargin@\cs{axismargin}}% \index{setaxismargins@\cs{setaxismargins}}% -\index{setallaxismargins@\cs{setallaxismargins}} +\index{setallaxismargins@\cs{setallaxismargins}}% \end{cd} -The \meta{axis} is one of the letters \texttt{l}, \texttt{b}, \texttt{r}, or \texttt{ -t}. \cs{axismargin} causes the given axis to be shifted \emph{inward} by -the \meta{num} specified (in \emph{graph} coordinates). The second -command \cs{setaxismargins} takes 4 arguments, using them to set the -margins starting with the left and proceeding anticlockwise. The last -command sets all the axis margins to the same value. +The parameter \meta{one-axis} is one of the letters \texttt{l}, +\texttt{b}, \texttt{r}, or \texttt{ t}, and \cs{axismargin} causes the +given axis to be shifted \emph{inward} by the \meta{num} specified (in +\emph{graph} units). The second command \cs{setaxismargins} takes +4 arguments, using them to set the margins starting with the left and +proceeding anticlockwise. The last command sets all the axis margins to +the same value. A change to an axis margin affects not only the axis at that edge but also the three axes perpendicular to it. For example, if the margins are $M_{\mathrm{lft}}$, $M_{\mathrm{bot}}$, $M_{\mathrm{rt}}$ and -$M_{\mathrm{top}}$, then -\cs{axis b} draws a line starting $M_{\mathrm{lft}}$ graph units from the -left edge and ending $M_{\mathrm{rt}}$ units from the right edge. Of course, -the entire line is $M_{\mathrm{bot}}$ units above the bottom edge. The -margins are also respected by the $x$- and $y$-axis, but only when drawn -with \cs{axis}. The old \cs{xaxis}, \cs{yaxis} and \cs{axes} ignore -them. +$M_{\mathrm{top}}$, then \cs{axis}\marg{b} draws a line starting +$M_{\mathrm{lft}}$ graph units from the left edge and ending +$M_{\mathrm{rt}}$ units from the right edge. Of course, the entire line +is $M_{\mathrm{bot}}$ units above the bottom edge. The margins are also +respected by the $x$- and $y$-axis, but only when drawn with \cs{axis}. +The old \cs{xaxis}, \cs{yaxis} and \cs{axes} ignore them. Special effects can be achieved by lying to one axis about the other -margins. +margins. That is, axes can be draw in separate commands with changes to +the declared margins in between. Be aware that various other commands +are affected by the margin values. Examples are the already mentioned +\cs{border}, as well as \cs{grid} and \cs{gridlines} +(page~\pageref{grid} in this subsection). -\begin{cd} +\begin{cd}\pagelabel{axismarks} \cs{xmarks}\oarg{\meta{len}}\marg{\meta{numberlist}}\\ -\cs{tmarks}\oarg{\meta{len}}\marg{\meta{numberlist}}\\ -\cs{bmarks}\oarg{\meta{len}}\marg{\meta{numberlist}}\\ \cs{ymarks}\oarg{\meta{len}}\marg{\meta{numberlist}}\\ \cs{lmarks}\oarg{\meta{len}}\marg{\meta{numberlist}}\\ +\cs{bmarks}\oarg{\meta{len}}\marg{\meta{numberlist}}\\ \cs{rmarks}\oarg{\meta{len}}\marg{\meta{numberlist}}\\ +\cs{tmarks}\oarg{\meta{len}}\marg{\meta{numberlist}}\\ \cs{axismarks}\marg{\meta{axis}}\oarg{\meta{len}}\marg{\meta{numberlist}}% \index{xmarks@\cs{xmarks}}% \index{tmarks@\cs{tmarks}}% @@ -995,31 +1304,40 @@ changed (see below). The commands may be repeated as often as desired. (The timing of drawing commands can make a difference as outlined in appendix~\ref{mpconsiderations}.) The command \cs{axismarks}\marg{x} is equivalent to \cs{xmarks} and so on for each of the six axes. (I would -have used \cs{marks}, but e\kern-.16em\TeX{} makes that a primitive.) +have used the shorter name \cs{marks}, but that name was already taken +by e\kern-.16em\TeX{}.) The \meta{numberlist} is normally a comma-separated list of numbers. In place of this, one can give a starting number, an increment and an ending number as in the following example: -\begin{ex} - \cs{xmarks}\marg{-2 step 1 until 2} -\end{ex} +\begin{verbatim} +\xmarks{-2 step 1 until 2} +\end{verbatim} is the equivalent of -\begin{ex} - \cs{xmarks}\marg{-2,-1,0,1,2} -\end{ex} +\begin{verbatim} +\xmarks{-2,-1,0,1,2} +\end{verbatim} -One must use exactly the words \mfc{step} and \mfc{until}. There must be -spaces between, but the number of spaces is not +One must use exactly the words \mfc{step} and \mfc{until}. Spaces are +not needed unless a variable name is used in place of one of the +numbers (see subsection~\ref{variables}). The number of spaces is not significant.% \footnote{Experienced \MF{} programmers may recognize that anything - can be used that is permitted in \MF's \meta{forloop} syntax. Thus + can be used that is permitted in \MF{}'s \meta{forloop} syntax. Thus the given example can also be reworded \cs{xmarks}\marg{-2 upto 2}, - or even \cs{xmarks}\marg{2 downto -2}} % -Users should be aware that if any of the numbers are non-integral then -due to natural round-off effects, the last value might be overshot and a -mark not printed there. + or even \cs{xmarks}\marg{2 downto -2}. See subsection~\ref{loops} + for more on for-loops in \mfp{}.} % +Users of this syntax should be aware that if any of the numbers is not +an integer then, because of natural round-off effects, the last value +might be overshot and a mark not printed there. For example, to ensure +that a mark is printed at the point $1.0$ on the $x$-axis, the second +line below is better than the first. +\begin{verbatim} +\xmarks{0 step .2 until 1.0} +\xmarks{0 step .2 until 1.1} +\end{verbatim} -\begin{cd} +\begin{cd}\pagelabel{setaxismarks} \cs{setaxismarks}\marg{\meta{axis}}\marg{\meta{pos}}\\ \cs{setbordermarks}\marg{\meta{lpos}}\marg{\meta{bpos}}\marg{\meta{rpos}}\marg{\meta{tpos}}\\ \cs{setallbordermarks}\marg{\meta{pos}}\\ @@ -1045,22 +1363,21 @@ value. The last two commands are abbreviations for Not all combinations make sense (for example, \cs{setaxismarks}\marg{r}\marg{ontop}). In these cases, no error message -is produced: \gbc{ontop} and \gbc{onleft} are considered to be -equivalent, as are \gbc{onbottom} and \gbc{onright}. The parameters -\gbc{inside} and \gbc{outside} make no sense for the $x$- and $y$-axes, -but if they are used then \gbc{inside} means \gbc{ontop} for the -$x$-axis and \gbc{onright} for the $y$-axis. These words are actually -\MF{} numeric variables defined in the file \file{grafbase.mf}, and the -variables \gbc{ontop} and \gbc{onleft}, for example, are given the same -value. - -\begin{cd} -\cs{grid}\oarg{\meta{ptsize}}\marg{\meta{xsep},\meta{ysep}}\\ -\cs{gridpoints}\oarg{\meta{ptsize}}\marg{\meta{xsep},\meta{ysep}}\\ -\cs{lattice}\oarg{\meta{ptsize}}\marg{\meta{xsep},\meta{ysep}}\\ +is produced: \gbc{ontop} and \gbc{onleft} give the same results, as do +\gbc{onbottom} and \gbc{onright}. The parameters \gbc{inside} and +\gbc{outside} make no sense for the $x$- and $y$-axes, but if they are +used then \gbc{inside} means \gbc{ontop} for the $x$-axis and +\gbc{onright} for the $y$-axis. These words are actually \MF{} numeric +variables and the variables \gbc{ontop} and \gbc{onleft}, for example, +have the same value. + +\begin{cd}\pagelabel{grid} +\cs{grid}\oarg{\meta{size}}\marg{\meta{xsep},\meta{ysep}}\\ +\cs{gridpoints}\oarg{\meta{size}}\marg{\meta{xsep},\meta{ysep}}\\ +\cs{lattice}\oarg{\meta{size}}\marg{\meta{xsep},\meta{ysep}}\\ \cs{hgridlines}\marg{\meta{ysep}}\\ \cs{vgridlines}\marg{\meta{xsep}}\\ -\cs{gridlines}\marg{\meta{xsep},\meta{ysep}} +\cs{gridlines}\marg{\meta{xsep},\meta{ysep}}% \index{grid@\cs{grid}}% \index{gridpoints@\cs{gridpoints}}% \index{lattice@\cs{lattice}}% @@ -1072,26 +1389,29 @@ value. \cs{grid} draws a dot at every point for which the first coordinate is an integer multiple of the \meta{xsep} and the second coordinate is an integer multiple of \meta{ysep}. The diameter of the dot is determined -by \meta{ptsize}. The default is \dim{.5bp} and is hard coded in the -\MF{} macros that ultimately do the drawing. Under the \opt{metapost} -option, the color of the dot is \gbc{pointcolor}. The commands -\cs{gridpoints and \cs{lattice}} are synonyms for \cs{grid}. +by \meta{size}. The default is the value of \cs{griddotsize}, +initially \dim{0.5pt}. Under the \opt{metapost} option, the color of the +dot is \gbc{pointcolor}. The commands \cs{gridpoints and \cs{lattice}} +are synonyms for \cs{grid}. \cs{hgridlines} draws the horizontal and \cs{vgridlines} the vertical lines through these same points. \cs{gridlines} draws both sets of lines. The thickness of the lines is set by \cs{penwd}. Authors are recommended to either reduce the pen width or change \gbc{drawcolor} to -a lighter color for grids. Or omit them entirely: well-designed graphs -usually don't need them and almost never should both horizontals and -verticals be used. +a lighter color for grid lines. Or omit them entirely: well-designed +graphs usually don't need them and almost never should both horizontals +and verticals be used. -\begin{cd} +The above commands draw their dots and lines within the margins set by the +axis margin commands on page~\pageref{axismargin}. + +\begin{cd}\pagelabel{plrgrid} \cs{plrgrid}\marg{\meta{rsep},\meta{anglesep}}\\ \cs{gridarcs}\marg{\meta{rsep}}\\ \cs{gridrays}\marg{\meta{anglesep}}\\ \cs{plrpatch}\marg{\meta{rmin},\meta{rmax},\meta{rsep},% \meta{tmin},\meta{tmax},\meta{tsep}}\\ -\cs{plrgridpoints}\marg{\meta{rsep},\meta{anglesep}}% +\cs{plrgridpoints}\oarg{\meta{size}}\marg{\meta{rsep},\meta{anglesep}}% \index{plrgrid@\cs{plrgrid}}% \index{plrpatch@\cs{plrpatch}}% \index{gridarcs@\cs{gridarcs}}% @@ -1101,14 +1421,17 @@ verticals be used. \cs{plrgrid} fills the graph with circular arcs and radial lines. \cs{gridarcs} draws only the arcs, \cs{gridrays} only the radial lines. -\cs{plrgridpoints} places a dot at all the places the rays and arcs -would intersect. - -The arcs are centered at $(0,0)$ and the lines emanate from $(0,0)$ -(even if $(0,0)$ is not in the graph space). The corresponding \MF{} -commands actually draw enough to cover the graph area and then clip them -to the graph boundaries. If you don't want them clipped, use -\cs{plrpatch}. +\cs{plrgridpoints} places a dot (diameter \meta{size}) at all the places +the rays and arcs would intersect. It takes an optional argument for the +size of the dots, the default being \cs{griddotsize}, the same as the +\cs{grid} command. + +The arcs lie on circles centered at $(0,0)$ and the rays would all meet +at $(0,0)$ if extended. The corresponding \MF{} commands actually draw +just enough to cover the graph area and then clip them to the graph +boundaries. If you don't want them clipped, use \cs{plrpatch}. Unlike +the rectangular coordinate grid commands, these do not respect the axis +margins (rectangular margins don't really belong with polar coordinates). \cs{plrpatch} draws arcs with radii starting at \meta{rmin}, stepping by \meta{rsep} and ending with \meta{rmax}. Each arc goes from angle @@ -1126,80 +1449,283 @@ the boundary rays will be drawn. If \meta{rsep} is larger than drawn. The color used for rays and arcs is \gbc{drawcolor}, and for dots -\gbc{pointcolor}. The advice about \cs{gridlines} holds for \cs{plrgrid} -as well. +\gbc{pointcolor}. The advice about color and use of \cs{gridlines} holds +for \cs{plrgrid} and its relatives as well. + +\begin{cd}\pagelabel{vectorfield} +\cs{vectorfield}\oarg{\meta{hlen}}\marg{\meta{xsp},\meta{ysp}}% +\marg{\meta{formula}}\marg{\meta{restriction}}\\ +\cs{plrvectorfield}\oarg{\meta{hlen}}\marg{\meta{rsp},\meta{tsp}}% +\marg{\meta{formula}}\marg{\meta{restriction}}% +\index{vectorfield@\cs{vectorfield}}% +\index{plrvectorfield@\cs{plrvectorfield}} +\end{cd} + +These commande draw a field of vectors (arrows). The optional argument +is the length of the arrowhead, the default being the dimension +\cs{headlen}, initially \dim{3pt}. + +For \cs{vectorfield}, an arrow is drawn starting from each point $(x,y)$ +where $x$ is an integer multiple of \meta{xsp} and $y$ is an integer +multiple of \meta{ysp}. The vector field is given by \meta{formula}, +which should be a pair-valued expression in the literal variables +\mfc{x} and \mfc{y}. Typically that would be a pair of numeric +expressions enclosed in parentheses and separated by a comma. The last +argument is a boolean expression in the literal variables \mfc{x} and +\mfc{y}, used to restrict the domain. That is, if the expression is +false for some $(x,y)$, no arrow is drawn at that point. If you do not +wish to restrict the domain, type \texttt{true} for the restriction. + +For \cs{plrvectorfield}, an arrow is drawn starting from each point with +polar coordinates $(r,\theta)$ if $r$ is an integer multiple of +\meta{rsp} and $\theta$ is an integer multiple of \meta{tsp}. In this +case, the \meta{formula} must be a pair-valued expression in the literal +variables \mfc{r} and \mfc{t}. This should be (or produce) a pair of $x$ +and $y$ coorinates, not a polar coordinate pair. If you have formulas +$R(r,\theta)$ for the length of each vector and $T(r,\theta)$ for the +angle, then the following will convert to $(x,y)$ pairs: +\begin{verbatim} +{polar (R(r,t),T(r,t))} +\end{verbatim} +The last argument is as in \cs{vectorfield}, except it should depend on +the literal variables \mfc{r} and \mfc{t}. +In either case, the arrow is not drawn if the starting point would lie +within the margins set with \cs{axismargins} and its relatives. -\subsubsection{Circles and Ellipses.}\label{circles} +The following draws a rotational field, omitting the inside of the +circle of radius $1$, where the arrows would be excessively long, and +especially avoiding $(0,0)$ where the vector field is undefined. +\begin{verbatim} +\vectorfield[2.5pt]{.25,.25}{.5*(-y,x)/(x**2 + y**2)}{x**2 + y**2 >= 1} +\end{verbatim} +The following is the same field, represented by arrows whose locations +are regularly spaced in polar coordinates. +\begin{verbatim} +\plrvectorfield[2.5pt]{.25,20}{polar(.5/r,t+90)}{r >= 1} +\end{verbatim} -\begin{cd} + +\subsection{Circles, arcs and ellipses}\label{circles} + +\begin{cd}\pagelabel{circle} \cs{circle}\oarg{\meta{format}}\marg{\meta{specification}}% \index{circle@\cs{circle}}% \end{cd} -Draws a circle. Starting with \mfp{} version 0.7, there are 4 -different ways to specify a circle, so \cs{circle} can be given an -optional argument that determines what data is specified in the -mandatory argument. +This figure macro produces a circle. Starting with \mfp{} version 0.7, +there are more than one way to specify a circle. In version 0.8 and +later there are six ways, and one selects which one by giving +\cs{circle} an optional argument that signals what data will be +specified in the mandatory argument. \begin{cd} \cs{circle}\oarg{p}\marg{\meta{$c$},\meta{$r$}}\\ \cs{circle}\oarg{c}\marg{\meta{$c$},\meta{$p$}}\\ \cs{circle}\oarg{t}\marg{\meta{$p_1$},\meta{$p_2$},\meta{$p_3$}}\\ -\cs{circle}\oarg{s}\marg{\meta{$p_1$},\meta{$p_2$},\meta{$\theta$}}% +\cs{circle}\oarg{s}\marg{\meta{$p_1$},\meta{$p_2$},\meta{$\theta$}}\\ +\cs{circle}\oarg{r}\marg{\meta{$p_1$},\meta{$p_2$},\meta{$r$}}\\ +\cs{circle}\oarg{q}\marg{\meta{$p_1$},\meta{$p_2$},\meta{$r$}}% \index{circle@\cs{circle}}% \end{cd} The optional arguments produce circles according to the following descriptions. - \begin{description} \item[\oarg{p}] The \textit{Polar form} is the default. The data in the -mandatory argument should then be the center $c$ and radius $r$ of the -circle. +mandatory argument should then be the center \meta{c} and radius +\meta{r} of the circle. -\item[\oarg{c}] The \textit{Center-point form}. In this case the data +\item[\oarg{c}] The \textit{center-point form}. In this case the data should be the center and one point on the circumference. -\item[\oarg{t}] The \textit{Three-point form}. The data are three points +\item[\oarg{t}] The \textit{three-point form}. The data are three points that do not lie in a straight line. -\item[\oarg{s}] The \textit{point-sweep}. The data are two points on the +\item[\oarg{s}] The \textit{point-sweep form}. The data are two points on the circle, followed by the angle of arc between them. + +\item[\oarg{r}] The \textit{point-radius form}. The data are two points on the +circle, followed by the radius. There are two circles with this data. +The one that makes the angle from the first to the second point positive +and less than 180 degrees is produced. + +\item[\oarg{q}] The \textit{alternate point-radius form}. The data are +the same as for the \oarg{r} case, except the other circle is produced. \end{description} These optional arguments are also used in the \cs{arc} command (see -subsection~\ref{arcs}). The \cs{circle} command draws the whole circle -which the equivalent \cs{arc} command draws only part of. The sense of -the circle produced is anticlockwise except in the case \texttt{[t]}, -where it is the direction determined by the order of the three points, -and the case \texttt{[s]}, where it is determined by \meta{$\theta$}: -clockwise if negative, anticlockwise if positive. +below). The \cs{circle} command draws the whole circle of which the +corresponding \cs{arc} command draws only a part. The sense of the +circle produced is anticlockwise except in the case \texttt{[t]}, where +it is the direction determined by the order of the three points, and the +case \texttt{[s]}, where it is determined by \meta{$\theta$}: clockwise +if negative, anticlockwise if positive. +\begin{cd}\pagelabel{arc} +\cs{arc}\oarg{\meta{format}}\marg{\meta{specification}}\\ +\cs{arc*}\oarg{\meta{format}}\marg{\meta{specification}}% +\index{arc@\cs{arc}}% +\end{cd} + +This figure macro produces a circular arc specified as determined by the +\meta{format} optional parameter. As with \cs{circle}, the optional +\meta{format} parameter determines the format of the other parameter, as +indicated below. The user is responsible for ensuring that the parameter +values make geometric sense. The starting point of each arc is at the +first specified angle or point and the ending point is at the last one. + +The star-form produces the complementary arc. That is, instead of the +arc described below, it produces the rest of the circle from the ending +point to the starting point of the arc described. + \begin{cd} +\cs{arc}\oarg{s}\marg{\meta{$p_0$},\meta{$p_1$},\meta{$\theta$}}\\ +\cs{arc}\oarg{p}\marg{\meta{$c$},\meta{$\theta_1$},\meta{$\theta_2$},\meta{$r$}}\\ +\cs{arc}\oarg{a}\marg{\meta{$c$},\meta{$r$},\meta{$\theta_1$},\meta{$\theta_2$}}\\ +\cs{arc}\oarg{c}\marg{\meta{$c$},\meta{$p_1$},\meta{$\theta$}}\\ +\cs{arc}\oarg{t}\marg{\meta{$p_0$},\meta{$p_1$},\meta{$p_2$}}\\ +\cs{arc}\oarg{r}\marg{\meta{$p_0$},\meta{$p_1$},\meta{$r$}}\\ +\cs{arc}\oarg{q}\marg{\meta{$p_0$},\meta{$p_1$},\meta{$r$}}% +\index{arc@\cs{arc}}% +\end{cd} + +The optional arguments produce arcs according to the following +descriptions. +\begin{description} +\item[\oarg{s}] The \textit{point-sweep form} is the default format. It +draws the circular arc starting from the point \meta{$p_0$}, ending at +the point \meta{$p_1$}, and covering an arc angle of \meta{$\theta$} +degrees, measured anticlockwise around the center of the circle. If, +for example, the points \meta{$p_0$} and \meta{$p_1$} lie on a +horizontal line with \meta{$p_0$} to the \emph{left}, and \meta{$\theta$} +is between 0~and 360 (degrees), then the arc will sweep \emph{below} the +horizontal line (in order for the arc to be anticlockwise). A +negative value of \meta{$\theta$} gives a clockwise arc from \meta{$p_0$} +to \meta{$p_1$}. + +\item[\oarg{p}] The \textit{polar form} draws the arc of a circle with +center \meta{$c$} starting at the angle \meta{$\theta_1$} and ending at +the angle \meta{$\theta_2$}, with radius \meta{$r$}. Both angles are +measured anticlockwise from the positive $x$ axis. + +\item[\oarg{a}] The \textit{alternate polar form} draws the arc of a +circle with center \meta{$c$} and radius \meta{$r$}, starting at the +angle \meta{$\theta_1$} and ending at the angle \meta{$\theta_2$}. Both +angles are measured anticlockwise from the positive $x$ axis. This is +provided because it seems a more reasonable order of arguments, and +matches the order \cs{sector} requires (see below). The \texttt{p} +option is retained for backward compatibility. + +\item[\oarg{c}] The \textit{center-point-angle form} draws the circular +arc with center \meta{$c$}, starting at the point \meta{$p_1$}, and +sweeping an angle of \meta{$\theta$} around the center from that point. +(This and the point sweep form are the basic methods of handling +arcs---the previous three formats are translated to one of these two +before drawing.) + +\item[\oarg{t}] The \textit{three-point form} draws the circular arc +which passes through all three points given, in the order given. +Internally, this is converted to two applications of the point-sweep +form. + +\item[\oarg{r}] The \textit{point-radius form} draws the circular arc +starting at the point \meta{$p_0$}, ending at \meta{$p_1$}, +with radius \meta{$r$}. Of the four possible arcs on two possible +circles, it produces the one that covers an arc angle $\theta$ +no more than $180$ degrees measured anticlockwise around the center +of the circle. To get the similar arc on the other circle, reverse the +order of the points. + +\item[\oarg{q}] The \textit{alternate point-radius form} is the same as +\oarg{r} except it produces the arc that covers an angle $\theta$ +\emph{no less than} $180$ degrees measured anticlockwise around the +center of the circle. To get the similar arc on the other circle, +reverse the order of the points. + +For both options \oarg{r} and \oarg{q}, if the radius is less than half +the distance between the points, then no such arc exists. In this case, +the command uses a radius equal to half the distance. The difference +between negating the radius and reversing the points is the sense of +the resulting path: it always starts at the first point and ends at the +second. +\end{description} + +\begin{cd}\pagelabel{sector} +\cs{sector}\marg{\meta{$c$},\meta{$r$},\meta{$\theta_1$},\meta{$\theta_2$}}% +\index{sector@\cs{sector}}% +\end{cd} + +This figure macro produces the sector of the circle with center at the +point \meta{$c$} and radius \meta{$r$}, from the angle \meta{$\theta_1$} +to the angle \meta{$\theta_2$}. Both angles are measured in degrees +anticlockwise from the direction parallel to the $x$ axis. The sector +forms a closed path. \emph{Note}: \cs{sector} and \cs{arc}\oarg{p} have +the same parameters, but \emph{in a different order}.% + \footnote{This apparently was unintended, but we now have to live + with it so as not to break existing \file{.tex} files.} + + +\begin{cd}\pagelabel{ellipse} \cs{ellipse}\oarg{\meta{$\theta$}}\marg{\meta{$c$},\meta{$r_x$},\meta{$r_y$}}% \index{ellipse@\cs{ellipse}}% \end{cd} -Draws an ellipse with the $x$ radius \meta{$r_x$} and $y$ radius -\meta{$r_y$}, centered at the point \meta{$c$}. The optional parameter -\meta{$\theta$} provides a way of rotating the ellipse by -\meta{$\theta$} degrees anticlockwise around its center. +This figure macro produces an ellipse with the $x$ radius \meta{$r_x$} +and $y$ radius \meta{$r_y$}, centered at the point \meta{$c$}. The +optional parameter \meta{$\theta$} provides a way of rotating the +ellipse by \meta{$\theta$} degrees anticlockwise around its center. +Ellipses may also be created by differentially scaling a circle and +perhaps rotating the result. See subsection~\ref{transformation}. -\subsubsection{Curves.}\label{curves} +When dealing with arcs and circles, it is useful to work in polar +coordinates: -\begin{cd} -\cs{curve}\oarg{\meta{tension}}\marg{\meta{$p_0$},\meta{$p_1$},$\ldots$}% +\begin{cd}\pagelabel{plr} +\cs{plr}\marg{(\meta{$r_0$},\meta{$\theta_0$}),% + (\meta{$r_1$},\meta{$\theta_1$}), $\ldots$}% +\index{plr@\cs{plr}}% +\end{cd} + +The macro \cs{plr} causes \MF{} to replace the specified list of polar +coordinate pairs by the equivalent list of rectangular (cartesian) +coordinate pairs. Through \cs{plr}, commands designed for rectangular +coordinates can be applied to data represented in polar coordinates. It +must be cautioned that this wholesale conversion of a list applies only +to commands that take a list consisting of an arbitrary number of +points, such as \cs{polyline}. + +The effect of \cs{plr} is to apply a \MF{} command, \gbc{polar}, to each +point in the list, producing a new list. This \MF{} command can also be +used separately in any situation where a \MF{} point is required. For +example, to connect the point $(2,3)$ to the point with polar +coordinates $(1, 135)$ write +\begin{verbatim} +\polyline{(2,3),polar(1,135)} +\end{verbatim} + + +\subsection{Curves}\label{curves} + +\begin{cd}\pagelabel{curve} +\cs{curve}\oarg{\meta{tension}}\marg{\meta{$p_0$},\meta{$p_1$},$\ldots$}\\ +\cs{cyclic}\oarg{\meta{tension}}\marg{\meta{$p_0$},\meta{$p_1$},$\ldots$}\\ +\cs{closedcurve}\oarg{\meta{tension}}\marg{\meta{$p_0$},\meta{$p_1$},$\ldots$}% \index{curve@\cs{curve}}% +\index{cyclic@\cs{cyclic}} +\index{closedcurve@\cs{closedcurve}}% \end{cd} -Draws a smooth path through the specified points, in the specified -order. It is `smooth' in two ways: it never changes direction abruptly -(no `corners' or `cusps' on the curve), and it tries to make turns that are -not too sharp. This latter property is acheived by specifying (to \MF) that -the tangent to the curve at each listed point is to be parallel to the -line from that point's predecessor to its successor. +These figure macros produce a smooth path through the specified points, +in the specified order. It is `smooth' in two ways: it never changes +direction abruptly (no `corners' or `cusps' on the curve), and it tries +to make turns that are not too sharp. This latter property is acheived +by specifying (to \MF{}) that the tangent to the curve at each listed +point is to be parallel to the line from that point's predecessor to its +successor. The \cs{cyclic} variant arranges for the last point to be +connected (smoothly) to the first, and produces a closed \MF{} B\'ezier +curve. The command \cs{closedcurve} is an alias for \cs{cyclic}. The optional \meta{tension} influences \emph{how} smooth the curve is. The special value \mfc{infinity} (in fact, usually anything greater than @@ -1209,7 +1735,7 @@ the flatter the portions in between. \CMF{} requires the tension to be larger than 0.75. The default value of the tension is $1$ when \mfp{} is loaded, but that can be changed with the following command. -\begin{cd} +\begin{cd}\pagelabel{settension} \cs{settension}\marg{\meta{num}}% \index{settension@\cs{settension}} \end{cd} @@ -1217,164 +1743,81 @@ loaded, but that can be changed with the following command. This sets the default tension for all commands that take an optional tension parameter. -\begin{cd} -\cs{cyclic}\oarg{\meta{tension}}\marg{\meta{$p_0$},\meta{$p_1$},$\ldots$}% -\index{cyclic@\cs{cyclic}}% +Sometimes one would like a convex set of points to produce a convex +curve. This will not always be the case with \cs{curve} or \cs{cyclic}. +You can verify this with the following example, where the list of points +traces a rectangle: +\begin{verbatim} +\cyclic{(0,0),(0,1),(1,1),(2,1),(2,0),(0,0)} +\end{verbatim} +To produce a convex curve, use one of the following: + +\begin{cd}\pagelabel{convexcurve} +\cs{convexcurve}\oarg{\meta{tension}}\marg{\meta{$p_0$},\meta{$p_1$},$\ldots$}\\ +\cs{convexcyclic}\oarg{\meta{tension}}\marg{\meta{$p_0$},\meta{$p_1$},$\ldots$}\\ +\cs{closedconvexcurve}\oarg{\meta{tension}}\marg{\meta{$p_0$},\meta{$p_1$},$\ldots$}% +\index{convexcurve@\cs{convexcurve}}% +\index{convexcyclic@\cs{convexcyclic}}% +\index{closedconvexcurve@\cs{closedconvexcurve}}% \end{cd} -Draws a cyclic (i.e., closed) \MF{} B\'ezier curve through the specified -points, in the specified order. It uses the same procedure as -\cs{curve}, but treats the first listed point as having the last as its -predecessor and the last point has the first as its successor. The -\meta{tension} is as in the \cs{curve} command. +These figure macros can be used even if the list of points is not +convex, and the result will be convex where possible. The third one is +an alias for for the second one. \medskip Occasionally it is necessary to specify a sequence of points with -\emph{increasing} $x$ coordinates and draw a curve through them. One +\emph{increasing} $x$-coordinates and draw a curve through them. One would then like the resulting curve both to be smooth \textit{and} to represent a function (that is, the curve always has increasing $x$ coordinate, never turning leftward). This cannot be guaranteed with the \cs{curve} command unless the tension is \texttt{infinity}. -\begin{cd} +\begin{cd}\pagelabel{fcncurve} \cs{fcncurve}\oarg{\meta{tension}}\marg{($x_0$,$y_0$),($x_1$,$y_1$),$\ldots$}% \index{fcncurve@\cs{fcncurve}}% \end{cd} -Draws a curve through the points specified. If the points are listed -with increasing (or decreasing) $x$ coordinates, the curve will also -have increasing (resp., decreasing) $x$ coordinates. The \meta{tension} -is a number equal to or greater than $1.0$ which controls how tightly +This figure macro produces a curve through the points specified. If the +points are listed with increasing (or decreasing) $x$ coordinates, the +curve will also have increasing (resp., decreasing) $x$ coordinates. The +\meta{tension} is a number greater than $1/3$ which controls how tightly the curve is drawn. Generally, the larger it is, the closer the curve is -to the polyline through the points. The default tension is typically $1.2$ -(actually $1.2$ times the value set with \cs{settension}). For those who -know something about \MF, this `tension' is not the same as the \MF{} -notion of tension, the tension in the \cs{curve} command, but it -functions in a similar fashion. In this case it can be any positive -number, but only values greater than or equal to $1$ guarantee the -property of never doubling back. - - -\subsubsection{Circular Arcs.}\label{arcs} - -\begin{cd} -\cs{arc}\oarg{\meta{format}}\marg{\meta{specification}}% -\index{arc@\cs{arc}}% -\end{cd} - -Draws a circular arc specified as determined by the \meta{format} -optional parameter. This macro and \cs{circle} are unusual in that the -optional \meta{format} parameter determines the format of the other -parameter, as indicated below. The user is responsible for ensuring that -the parameter values make geometric sense. - -\begin{cd} -\cs{arc}\oarg{s}\marg{\meta{$p_0$},\meta{$p_1$},\meta{sweep}}\\ -\cs{arc}\oarg{t}\marg{\meta{$p_0$},\meta{$p_1$},\meta{$p_2$}}\\ -\cs{arc}\oarg{p}\marg{\meta{$c$},\meta{$\theta_1$},\meta{$\theta_2$},\meta{$r$}}\\ -\cs{arc}\oarg{a}\marg{\meta{$c$},\meta{$r$},\meta{$\theta_1$},\meta{$\theta_2$}}\\ -\cs{arc}\oarg{c}\marg{\meta{$c$},\meta{$p_1$},\meta{$\theta$}}% -\index{arc@\cs{arc}}% -\end{cd} - -The optional arguments produce arcs according to the following -descriptions. -\begin{description} -\item[\oarg{s}] The \textit{point-Sweep form} is the default format. It -draws the circular arc starting from the point \meta{$p_0$}, ending at -the point \meta{$p_1$}, and covering an arc angle of \meta{sweep} -degrees, measured anticlockwise around the center of the circle. If, -for example, the points \meta{$p_0$} and \meta{$p_1$} lie on a -horizontal line with \meta{$p_0$} to the \emph{left}, and \meta{sweep} -is between 0~and 360 (degrees), then the arc will sweep \emph{below} the -horizontal line (in order for the arc to be anticlockwise). A -negative value of \meta{sweep} gives a clockwise arc from \meta{$p_0$} -to \meta{$p_1$}. - -\item[\oarg{t}] The \textit{Three-point form} draws the circular arc -which passes through all three points given, in the order given. -Internally, this is converted to two applications of the point-sweep -form. - -\item[\oarg{p}] The \textit{Polar form} draws the arc of a circle with -center \meta{$c$} starting at the angle \meta{$\theta_1$} and ending at -the angle \meta{$\theta_2$}, with radius \meta{$r$}. Both angles are -measured anticlockwise from the positive $x$ axis. - -\item[\oarg{a}] The \textit{Alternate polar form} draws the arc of a -circle with center \meta{$c$} and radius \meta{$r$}, starting at the -angle \meta{$\theta_1$} and ending at the angle \meta{$\theta_2$}. Both -angles are measured anticlockwise from the positive $x$ axis. This is -provided because it seems a more reasonable order of arguments, and -matches the order \cs{sector} requires (see subsection~\ref{other} -below). The \texttt{p} option is retained for backward compatibility. - -\item[\oarg{c}] The \textit{Center-point form} draws the circular arc with -center \meta{$c$}, starting at the point \meta{$p_1$}, and sweeping an -angle of \meta{$\theta$} around the center from that point. (This and -the point sweep form are the basic methods of handling arcs---the -previous three formats are translated to one of these two before drawing.) -\end{description} - - -\subsubsection{Other Figures.}\label{other} - -\begin{cd} +to the polyline through the points. The default tension is that set with +\cs{settension}, initially $1$. For those who know something about +\MF{}, this `tension' is not the same as the \MF{} notion of tension, +the tension in the \cs{curve} command, but it functions in a similar +fashion. In this case it can actually be any positive number, but only +values greater than $1/3$ guarantee the property of never doubling back. + +\begin{cd}\pagelabel{turtle} \cs{turtle}\marg{\meta{$p_0$},\meta{$v_1$},\meta{$v_2$},$\ldots$}% \index{turtle@\cs{turtle}}% \end{cd} -Draws a line segment, starting from the point \meta{$p_0$}, and -extending along the (2-dimen\-sional vector) displacement \meta{$v_1$}. -It then draws a line segment from the previous segment's endpoint, along -displacement \meta{$v_2$}. This continues for all listed displacements, -a process similar to `turtle graphics'. - -\begin{cd} -\cs{sector}\marg{\meta{$c$},\meta{$r$},\meta{$\theta_1$},\meta{$\theta_2$}}% -\index{sector@\cs{sector}}% -\end{cd} - -Draws the sector, from the angle \meta{$\theta_1$} to the angle -\meta{$\theta_2$} inside the circle with center at the point \meta{$c$} -and radius \meta{$r$}, where both angles are measured in degrees -anticlockwise from the direction parallel to the $x$ axis. The sector -forms a closed path. \emph{Note}: \cs{sector} and \cs{arc}\oarg{p} have -the same parameters, but \emph{in a different -order}.% - \footnote{This apparently was unintended, but we now have to live - with it so as not to break existing \file{.tex} files.} - -\begin{cd} -\cs{makesector} -\index{makesector@\cs{makesector}} -\end{cd} -The \cs{sector} command requires the center of the arc as one of its -arguments. But if one doesn't know that center (say one only knows three -points the arc connects) then even though the arc can be drawn, -\cs{sector} cannot. The \cs{makesector} command, when followed by any -\cs{arc} command, will find the center and connect it to the two ends of -the arc. It will actually attempt to do the same with any path that -follows, but the `center' it finds (if it finds one) will usually be -meaningless. +This figure macro produces a a sequence of line segments starting from +the point \meta{$p_0$}, and extending along the (2-dimen\-sional vector) +displacement \meta{$v_1$}. The next segment is from the previous +segment's endpoint, along displacement \meta{$v_2$}. This continues for +all listed displacements, a process similar to `turtle graphics'. -\subsubsection{Bar Charts and Pie Charts.}\label{charts} +\subsection{Bar charts and pie charts}\label{charts} -\begin{cd} -\cs{barchart}\oarg{\meta{start},\meta{sep},\meta{r}}\marg{\meta{h-or-v}}\marg{\meta{list}}\\ -\cs{bargraph}$\ldots$\\ -\cs{gantt}$\ldots$\\ -\cs{histogram}$\ldots$\\ -\cs{chartbar}\marg{\meta{num}}\\ -\cs{graphbar}\marg{\meta{num}}\\ -\cs{histobar}\marg{\meta{num}}% +\begin{cd}\pagelabel{barchart} +\cs{barchart}\oarg{\meta{start},\meta{sep},\meta{r}}% + \marg{\meta{h-or-v}}\marg{\meta{list}}\\ +\cs{bargraph}\dots\\ +\cs{gantt}\dots\\ +\cs{histogram}\dots\\ +\cs{mfpbarchart}\dots\\ +\cs{mfpbargraph}\dots\\ +\cs{mfpgantt}\dots\\ +\cs{mfphistogram}\dots \index{barchart@\cs{barchart}}% \index{bargraph@\cs{bargraph}}% \index{histogram@\cs{histogram}}% -\index{chartbar@\cs{chartbar}}% -\index{graphbar@\cs{graphbar}}% -\index{histobar@\cs{histobar}}% +\index{gantt@\cs{gantt}}% \end{cd} The macro \cs{barchart} computes a bar chart or a Gantt chart. It does @@ -1385,12 +1828,20 @@ below). Since bar charts have many names, \cs{bargraph} and synonym; whether a Gantt chart or bar chart is created depends on the data. +Since \cs{barchart} never draws anything, there is no particular reason +it needs to be inside an \env{mfpic} environment. Starting with version +0.9 of \mfp{} this is no longer required, but the command name +\cs{mfpbarchart} must be used outside (in case some other package also +defines \cs{barchart}). One can use any of the four synonyms listed that +start with `\cs{mfp}'. The command to draw the bars is still required to +be inside an \env{mfpic} environment. + \meta{h-or-v} should be \texttt{v} if you want the ends of the bars to be measured vertically from the $x$-axis, or \texttt{h} if they should be measured horizontally from the $y$-axis. \meta{list} should be a -comma-separated list of numbers and/or pairs giving the coordinates of -the end(s) of each bar. A number $c$ is interpreted as the pair $(0,c)$; -a pair $(a,b)$ is interpreted as an interval giving the ends of the bar +comma-separated list of numbers and ordered pairs giving the +end(s) of each bar. A number $c$ is interpreted as the pair $(0,c)$; a +pair $(a,b)$ is interpreted as an interval giving the ends of the bar (for Gantt diagrams). The rest of this description refers to the \texttt{h} case; the \texttt{v} case is analogous. @@ -1408,93 +1859,96 @@ Notice the bars are numbered in order from bottom to top. You can reverse them by making \meta{sep} negative, and making \meta{start} the top edge of the first bar. -The fraction \meta{r} should be between -1 and 1. A negative value +The fraction \meta{r} should be between $-1$ and $1$. A negative value reverses the direction from the `leading edge' of the bar to the `trailing edge'. For example, if one bar chart is created with \begin{ex} - \cs{barchart}\oarg{1,1,-.4}\marg{h}\marg{..} + \cs{barchart}\oarg{1,1,-.4}\marg{h}\marg{$\ldots$} \end{ex} and another with \begin{ex} - \cs{barchart}\oarg{1,1,.4}\marg{h}\marg{..} + \cs{barchart}\oarg{1,1,.4}\marg{h}\marg{$\ldots$} \end{ex} both having the same number of bars, then the first will have its first bar from $y = 1$ to $y = 1 -.4 = .6$, while the second will have its -first bar adjacent to that one, from $1$ to $1 + .4$. Similarly the next +first bar on top of that one, from $1$ to $1 + .4$. Similarly the next bars will be above and below $y=2$, etc. This makes it easy to draw bars next to one another for comparison. -The macro \cs{chartbar} (synonyms \cs{graphbar}, \cs{ganttbar}, and -\cs{histobar}) takes a number from $1$ to the number of elements in the -\meta{list} and draws the rectangular path. This behaves just like any -other figure macro, and the prefix macros from section~\ref{rendering} -may be used to give adjacent bars contrasting colors, fills, etc. +\begin{cd}\pagelabel{chartbar} +\cs{chartbar}\marg{\meta{num}}\\ +\cs{graphbar}\marg{\meta{num}}\\ +\cs{histobar}\marg{\meta{num}}\\ +\cs{ganttbar}\marg{\meta{num}}% +\index{chartbar@\cs{chartbar}}% +\index{graphbar@\cs{graphbar}}% +\index{histobar@\cs{histobar}}% +\index{ganttbar@\cs{ganttbar}}% +\end{cd} + +The figure macro \cs{chartbar} (synonyms \cs{graphbar}, \cs{ganttbar}, +and \cs{histobar}) takes a number from $1$ to the number of elements in +the list of data of the most recent \cs{barchart} command and produces +the corresponding rectangular path computed by that command. This +behaves just like any other figure macro, and the prefix macros from +section~\ref{rendering} may be used to give adjacent bars contrasting +colors, fills, etc. -\begin{cd} +\begin{cd}\pagelabel{piechart} \cs{piechart}\oarg{\meta{dir}\meta{angle}}\marg{\meta{$c$},\meta{$r$}}% \marg{\meta{list}}\\ -\cs{piewedge}\oarg{\meta{spec}\meta{trans}}\marg{\meta{num}}% +\cs{mfppiechart}\dots \index{piechart@\cs{piechart}}% -\index{piewedge@\cs{piewedge}}% \end{cd} The macro \cs{piechart} also does not draw anything, but computes the \cs{piewedge} regions described below. The first part of the optional -parameter, \meta{dir}, is a single letter which may be either \texttt{c} or -\texttt{a} which stand for \emph{clockwise} or \emph{anticlockwise}, -respectively. It is common to draw piecharts with the largest wedge -starting at 12 o'clock (angle 90 degrees) and successive wedges -clockwise from there. This is the default. You can change the starting -angle from 90 with the \meta{angle} parameter, and the change the -direction to counter-clockwise by specifying \texttt{a} for \meta{dir}. It -is also traditional to arrange the wedges from largest to smallest, -except there is often a miscellaneous category which is usually last and -may be larger than some others. Therefore \cs{piechart} makes no attempt -to sort the data. The data is entered as a comma separated \meta{list} -of positive numbers in the second required parameter. These are only -used to determine the relative sizes of the wedges and are not printed -anywhere. The first required parameter should contain a pair \meta{c} -for the center and a positive number \meta{r} for the radius, separated -by a comma. - -After a \cs{piechart} command has been issued, the individual wedges may -be drawn, filled, etc., using \cs{piewedge}\marg{1}, -\cs{piewedge}\marg{2}, etc. Without the optional argument, the wedges -are located according to the arguments of the last \cs{piechart} -command. The optional argument to \cs{piewedge} can override this. The -parameter \meta{spec} is a single letter, which can be \texttt{x}, \texttt{s} -or \texttt{m}. The \texttt{x} stands for \emph{exploded} and it means the -wedge is moved directly out from the center of the pie a distance -\meta{trans}. \meta{trans} should then be a pure number and is -interpreted as a distance in graph units. The \texttt{s} stands for -\emph{shifted} and in this case \meta{trans} should be a pair of the -form \texttt{(\meta{dx},\meta{dy})} indicating the wedge should be shifted -\meta{dx} horizontally and \meta{dy} vertically (in graph units). The -\texttt{m} stands for \emph{move to}, and \meta{trans} is then the absolute -coordinates \texttt{(\meta{x},\meta{y})} in the graph where the point of -the wedge should be placed. - -\subsubsection{Polar Coordinates to Rectangular.}\label{polar} - -\begin{cd} -\cs{plr}\marg{(\meta{$r_0$},\meta{$\theta_0$}), -(\meta{$r_1$},\meta{$\theta_1$}), $\ldots$}% -\index{plr@\cs{plr}}% +parameter, \meta{dir}, is a single letter to indicate a direction: +`\texttt{c}' for \emph{clockwise} or `\texttt{a}' for \emph{anticlockwise}. +The \meta{angle} is the angle in degrees of the starting edge of the +first wedge. The defaults correspond to \oarg{c90}, which means the +first wedge starts at 12~o'clock and proceeds clockwise. + +The first required argument contains the center \meta{$c$} and radius +\meta{$r$} of the chart. The second required argument is the list of +data: positive numbers separated by commas. + +Since this command never actually draws anything, only defining the +wedges, it makes sense to have it available outside the drawing +environment. Starting with version 0.9 of \mfp{} that is the case, but +the command name is \cs{mfppiechart} (to avoid a name clash with some +other package's \cs{piechart} command). The command to draw wedges +(\cs{piewedge}, see below) is still required to be inside an \env{mfpic} +environment. + +\begin{cd}\pagelabel{piewedge} +\cs{piewedge}\oarg{\meta{spec}\meta{trans}}\marg{\meta{num}}% +\index{piewedge@\cs{piewedge}}% \end{cd} -Replaces the specified list of polar coordinate pairs by the equivalent -list of rectangular (cartesian) coordinate pairs. Through \cs{plr}, -commands designed for rectangular coordinates can be applied to data -represented in polar coordinates---and to data containing both -rectangular and polar coordinate pairs. - +This figure macro takes a number from $1$ to the number of elements in +the list of data of the most recent \cs{piechart} command and produces +the corresponding wedge-shaped path computed by that command. By +default, the path is positioned as computed by that \cs{piechart} +command, but The optional argument to \cs{piewedge} can override this. +The parameter \meta{spec} is a single letter, which can be \texttt{x}, +\texttt{s} or \texttt{m}. The \texttt{x} stands for \emph{exploded} and +it means the wedge is moved directly out from the center of the pie a +distance \meta{trans}. \meta{trans} should then be a pure number and is +interpreted as a distance in graph units. The \texttt{s} stands for +\emph{shifted} and in this case \meta{trans} should be a pair of the +form \texttt{(\meta{dx},\meta{dy})} indicating the wedge should be +shifted \meta{dx} horizontally and \meta{dy} vertically (in graph +units). The \texttt{m} stands for \emph{move to}, and \meta{trans} is +then the absolute coordinates \texttt{(\meta{x},\meta{y})} in the graph +where the point of the wedge should be placed. -\subsection{Colors}\label{colors} +\section{Colors.}\label{colors} -\subsubsection{Setting the Default Colors.}\label{defaultcolors} +\subsection{Setting the default colors}\label{defaultcolors} -\begin{cd} +\begin{cd}\pagelabel{drawcolor} \cs{drawcolor}\oarg{\meta{model}}\marg{\meta{colorspec}}\\ \cs{fillcolor}$\ldots$\\ \cs{hatchcolor}$\ldots$\\ @@ -1511,29 +1965,32 @@ rectangular and polar coordinate pairs. \index{backgroundcolor@\cs{backgroundcolor}}% \end{cd} -These macros set the default color for various drawing -elements. Any curve (with one exception, those drawn by \cs{plotdata}), -whether solid, dashed, dotted, or plotted in symbols, will be in the -color set by \cs{drawcolor}. Set the color used by \cs{gfill} with -\cs{fillcolor}. For all the hatching commands use \cs{hatchcolor}. For -the \cs{point}, \cs{plotsymbol} and \cs{grid} commands use -\cs{pointcolor}, and for arrowheads, \cs{headcolor}. When \opt{mplabels} -is in effect, the color of labels can be set with \cs{tlabelcolor}, and -one can set the color used by \cs{gclear} with \cs{backgroundcolor} (the -same color is used in the interior of unfilled points drawn with -\cs{point}). The optional \meta{model} may be one of \opt{rgb}, +These macros set the default color for various drawing elements. Any +curve (with one exception, those drawn by \cs{plotdata}), whether solid, +dashed, dotted, or plotted in symbols, will be in the color set by +\cs{drawcolor}. Set the color used by \cs{gfill} with \cs{fillcolor}. +For all the hatching commands use \cs{hatchcolor}. For the \cs{point}, +\cs{plotsymbol} and \cs{gridpoints} commands use \cs{pointcolor}, and for +arrowheads, \cs{headcolor}. One can set the color used by \cs{gclear} +with \cs{backgroundcolor} (the same color will also be used in the +interior of unfilled points that are drawn with \cs{point}) and, when +\opt{mplabels} is in effect, the color of labels can be set with +\cs{tlabelcolor}. The optional \meta{model} may be one of \opt{rgb}, \opt{RGB}, \opt{cmyk}, \opt{gray}, and \opt{named}. The \meta{colorspec} depends on the model, as outlined below. Each of these commands sets a corresponding \MP{} color variable with the same name (except -\cs{backgroundcolor} sets the color \mfc{background}). Thus one can set -the filling color to the drawing color with -\cs{fillcolor}\marg{drawcolor}. +\cs{backgroundcolor} sets the color \mfc{background}). Thus, after +\texttt{drawcolor} has been set, one can issue the command +\cs{fillcolor}\marg{drawcolor} to fill with the same color. + +As previously discussed, all these colors are initially set to +\mfc{black} except \mfc{background} is set to \mfc{white}. -\subsubsection{\CMP{} Colors.}\label{mpcolors} +\subsection{\CMP{} colors}\label{mpcolors} If the optional \meta{model} specification is omitted, the color -specification may be any expression recognized as a color by \MP. In -\MP, a color is a triple of numbers like \mfc{(1,.5,.5)}, with the +specification may be any expression recognized as a color by \MP{}. In +\MP{}, a color is a triple of numbers like \mfc{(1,.5,.5)}, with the coordinates between 0 and 1, representing red, green and blue levels, respectively. White is given by \mfc{(1,1,1)} and black by \mfc{(0,0,0)}. \CMP{} also has color variables and several have been @@ -1549,7 +2006,7 @@ color functions have been defined in \file{grafbase.mp}: \index{cmyk@\mfc{cmyk($c$,$m$,$y$,$k$)}} \end{cd} -Converts a \opt{cmyk} color specification to \MP's native \opt{rgb}. For +Converts a \opt{cmyk} color specification to \MP{}'s native \opt{rgb}. For example, the command \mfc{cmyk(1,0,0,0)} yields \mfc{(0,1,1)}, which is the definition of \mfc{cyan}. @@ -1583,20 +2040,20 @@ arguments to the 0--1 range, an unknown \meta{name} is converted to \medskip As an example of the use of these functions, one could conceivable write: -\begin{ex} - \cs{drawcolor}\marg{0.5*RGB(255,0,0)+0.5*cmyk(1,0,0,0)} -\end{ex} +\begin{verbatim} +\drawcolor{0.5*RGB(255,0,0)+0.5*cmyk(1,0,0,0)} +\end{verbatim} to have all curves drawn in a color halfway between red and cyan (which turns out to be the same as \gbc{gray(0.5)}). -\subsubsection{Color Models.}\label{colormodels} +\subsection{Color models}\label{colormodels} When the optional \meta{model} is specified in the color setting commands, it determines the format of the color specification: \medskip \halign{\quad#\hfil\quad&#\hfil\cr -{\sl Model:}& {\sl Specification:}\cr +{\slshape Model:}& {\slshape Specification:}\cr \opt{rgb}& Three numbers in the range 0 to 1 separated by commas.\cr \opt{RGB}& Three numbers in the range 0 to 255 separated by commas.\cr \opt{cmyk}& Four numbers in the range 0 to 1 separated by commas.\cr @@ -1607,22 +2064,22 @@ commands, it determines the format of the color specification: \medskip \Mfp{} translates -\begin{ex} - \cs{fillcolor}\oarg{cmyk}\marg{1,.3,0,.2} -\end{ex} +\begin{verbatim} +\fillcolor[cmyk]{1,.3,0,.2} +\end{verbatim} into the equivalent of -\begin{ex} - \cs{fillcolor}\marg{cmyk(1,.3,0,.2)}. -\end{ex} +\begin{verbatim} +\fillcolor{cmyk(1,.3,0,.2)}. +\end{verbatim} Note that when the optional model is specified, the color -specification must not be enclosed in parentheses. Note also that each +specification must \emph{not} be enclosed in parentheses. Note also that each model name is the name of a color function described in the previous subsection. That is how the models are implemented internally. -\subsubsection{Defining a Color Name.}\label{colorname} +\subsection{Defining a color name}\label{colorname} -\begin{cd} +\begin{cd}\pagelabel{mfpdefinecolor} \cs{mfpdefinecolor}\marg{\meta{name}}\marg{\meta{model}}\marg{\meta{colorspec}}% \index{mfpdefinecolor@\cs{mfpdefinecolor}} \end{cd} @@ -1636,175 +2093,290 @@ The mandatory \meta{model} and \meta{colorspec} are as above. A final caution, the colors of an \mfp{} figure are stored in the \file{.mp} output file, and are not related to colors used or defined by the \LaTeX{} \prog{color} package. In particular a color defined only by -\LaTeX's \cs{definecolor} command will remain unknown to \mfp. +\LaTeX{}'s \cs{definecolor} command will remain unknown to \mfp{}. Conversely, \LaTeX{} commands will not recognize any color defined only by \cs{mfpdefinecolor}. -\subsubsection{Color in \MF} +\subsection{Color in \MF{}}\label{MFcolor} \CMF{} was never meant to understand colors, but it certainly can be taught the difference between black and white and, to a limited extent, various grays. Starting with version 0.7, \mfp{} will no longer generate an error when a color-changing command is used under the \opt{metafont} option. Instead, when possible, the variables that represent colors in -\MP{} will be converted to a numeric value between 0 and 1 in \MF. When +\MP{} will be converted to a numeric value between 0 and 1 in \MF{}. When possible (for example, when a region is filled) the numeric will be interpreted as a gray level and shading (see subsection~\ref{filling}) will be used to approximate the gray. In other cases (drawing or dashing of curves, placing of points or symbols, filling with a pattern of hatch lines) the number will be interpreted as black or white: a value less -than 1 will cause the figure to be rendered (in black), while a value +than 1 will cause the figure to be rendered in black, while a value equal to 1 (white) will cause pixels corresponding to the figure to be erased. -This is still somewhat experimental and depends on adhering to certain -restrictions. \CMF's syntax does not recognize a triple of numbers as -any sort of data structure, but it does allow \emph{commands} to have -any number of parameters in parentheses. So colors must be specified -using the color commands such as \gbc{rgb(1,1,0)} or color names such as -\gbc{yellow}, and never as a bare triple. Also, as currently written, -the color names defined in \file{dvipsnam.mp} are not defined in \MF. -With these provisions the same \mfp{} code can often produce either gray -scale \MF{} pictures or \MP{} color pictures depending only on the -\opt{metapost} option. +This depends on adhering to certain restrictions. \CMF{}'s syntax +does not recognize a triple of numbers as any sort of data structure, +but it does allow \emph{commands} to have any number of parameters in +parentheses. So colors must be specified using the color commands such +as \gbc{rgb(1,1,0)} or color names such as \gbc{yellow}, and never as a +bare triple. Also, as currently written, the color names defined in +\file{dvipsnam.mp} are not defined in \MF{}. With these provisions the +same \mfp{} code can often produce either gray scale \MF{} pictures or +\MP{} color pictures depending only on the \opt{metapost} option. The commands \cs{shade} and \cs{gfill}\oarg{gray(.75)} (see subsection~\ref{filling} for their meaning) will produce a similar shade of gray, but there is a difference. The first simply adds small dots on top of whatever is already drawn. The second, however, tries to simulate the \MP{} effect, which is to cover up whatever is previously drawn. -Therefore, it first zeros all affected pixels before adding the dots to +Therefore, it first erases all affected pixels before adding the dots to simulate gray. In particular, \cs{gfill}\oarg{white} should have the same effect as \cs{gclear}. -\subsection{Shape-Modifier Macros.}\label{modifier} +\section{Modifying the figures.}\label{modifier} -Some \mfp{} macros operate as \emph{shape-modifier} macros---for -example, if you want to put an arrowhead on a line segment, you could -write: \cs{arrow}\cs{lines}\marg{(0,0),(1,0)}. These are always prefixed -to some figure drawing command, and apply only to the next following -figure macro (which can be rather far removed) provided that only other -prefix commands intervene. This is a rather long section, but even more -modification prefixes are documented in subsection~\ref{transformation}. +Some \mfp{} macros operate by \emph{modifying} a figure: if you want to +turn an open arc into a closed figure by adding a straight line, you can +write: \cs{lclosed}\cs{arc}\marg{(0,0),(1,0),45}. These are always +prefixed to some figure drawing command, and apply only to the next +following figure macro provided that only other prefix commands +intervene. This is a rather long section, but even more modification +prefixes are documented in subsection~\ref{transformation}. -For the purposes of these macros, a distinction must be made in the -figure macros between `open' and `closed' paths. A path that merely -returns to its starting point is \emph{not} automatically closed; such a -path is open, and must be explicitly closed, for example by \cs{lclosed} -(see below). The (already) closed paths are those that have -`\texttt{closed}' in their name plus: \cs{rect}, \cs{circle}, -\cs{ellipse}, \cs{sector}, \cs{cyclic}, \cs{polygon}, \cs{plrregion}, -\cs{chartbar}, \cs{piewedge}, \cs{tlabelrect}, \cs{tlabeloval}, -\cs{tlabelellipse}, \cs{tlabelcircle} and \cs{btwnfcn} (below). +The combination of a modifying macro, followed by a figure macro, can +usually be thought of as a new figure macro, to which further prefixes +might be prepended. -\subsubsection{Closure of Paths.}\label{closure} +More precisely: all prefix macros have an \emph{input}, an +\emph{output}, and a side effect. The input and output are alway paths. +The input is the path that is output by the \emph{following} prefix or +figure macro. The output is either the same as the input or a +modification of it. The side effect might be a drawing or filling of the +path or the addition of an arrowhead. -\begin{cd} -\cs{lclosed}$\ldots$% -\index{lclosed@\cs{lclosed}} -\end{cd} +We list here a classifications of prefix and figure macros that is +useful for understanding the \mfp{} system. -Makes each open path into a closed path by adding a line segment between -the endpoints of the path. +\begin{description} -\begin{cd} -\cs{bclosed}\oarg{\meta{tens}}$\ldots$ -\index{bclosed@\cs{bclosed}}% -\end{cd} +\item[Figure macros.] These\index{figure macro} have no input; they must + come last in a sequence. They output the path they were designed to + produce. Examples are \cs{circle}, \cs{rect} and \cs{polygon}. If + they have no prefixes, or are preceded only by appending macros (see + next), they invoke a default rendering of the path (usually a + drawing as a solid stroke) as the side effect. + +\item[Macros that append] These\index{prefix macro} pass their input + unchanged as their output. Their side effect is the appending of + some object such as an arrowhead. Currently only the various arrow + macros are appending macros (see subsection~\ref{arrows}). However, + \cs{reverse} (which technically modifies a path and has no side + effect) is coded as an appending macro so that it will work + correctly with arrows. Think of it as `appending' a new direction. + +\item[Macros that render] These\index{prefix macro} pass their + input unchanged as their output. They have the side effect of adding + or subtracting ink from a picture in the shape of the input path. + Examples are \cs{draw}, \cs{dotted}, \cs{gfill} and \cs{gclip}. + +\item[Macros that modify] These\index{prefix macro} output the result of + applying their intended modification to the input path. Examples are + macros that close the path if it was open, macros that apply a + transformation such as a rotation, and macros that return only a + part of a path. If they have no prefixes, or are preceded only by + appending macros (see above), they also invoke a default rendering + of the output path (usually a drawing as a solid stroke of the + modified path) as the side effect. -This macro is similar to \cs{lclosed}, except that it closes an open -path smoothly by drawing a B\'ezier curve. A B\'ezier is \MF's natural -way of connecting points into a curve, and \cs{bclosed} is the simplest -and most efficient closure next to \cs{lclosed}. Moreover it usually -gives a reasonably aesthetic result. Sometimes, however, one might wish -a tighter connection. If that is the case, use the optional argument -with a value of the tension \meta{tens} greater than $1$, the default. -The command \cs{settension} (see subsection~\ref{curves}) can be used to -change the default. +\end{description} -\begin{cd} +\subsection{Closure of paths}\label{closure} + +It should be pointed out that the closure macros will leave already +closed paths unchanged, so it is always safe to add one when uncertain. +Moreover, if the path is not closed but the endpoints are identical, +\cs{lclosed} will close it without adding the (trivial) line segment. + + +\begin{cd}\pagelabel{lclosed} +\cs{lclosed}$\ldots$\\ +\cs{bclosed}\oarg{\meta{tens}}$\ldots$\\ \cs{sclosed}\oarg{\meta{tens}}$\ldots$% +\index{lclosed@\cs{lclosed}} +\index{bclosed@\cs{bclosed}}% \index{sclosed@\cs{sclosed}} \end{cd} -This closes the curve by mimicking the definition of the \cs{curve} -command. That command tries to force the curve to pass through the $n$th -point in a direction parallel to the line from point $(n-1)$ to point -$(n+1)$. In order to close a curve in this way, the direction at the two -endpoints often has to be changed, and this changes the shape of the -first and last segments of the curve. Use \cs{bclosed} if you don't wish -this to happen. However, \cs{sclosed}\cs{curve} produces the same result -as \cs{cyclic} given the same points and tension valuse. The optional -tension argument is as in the \cs{bclosed} command. +These modifying macros all turn an open path into a closed one. If the +path is already closed, they do nothing. + +\cs{lclosed} makes an open path into a closed path by adding a line +segment between the endpoints of the path. In the special case where +the path ends exactly where it begins, all \cs{lclosed} does is change +the type of the path from open to closed. + +The \cs{bclosed} macro is similar to \cs{lclosed}, except that it closes +an open path smoothly by drawing a B\'ezier curve. A B\'ezier is \MF{}'s +natural way of connecting points into a curve, and \cs{bclosed} is the +simplest and most efficient closure next to \cs{lclosed}. Moreover it +usually gives a reasonably aesthetic result. Sometimes, however, one +might wish a tighter connection. If that is the case, use the optional +argument with a value of the tension \meta{tens} greater than $1$, the +default. The command \cs{settension} (see subsection~\ref{curves}) can +be used to change the default. + +\cs{sclosed} closes the curve by mimicking the definition of the +\cs{curve} command. That command tries to force the curve to pass +through the $n$th point in a direction parallel to the line from point +$(n-1)$ to point $(n+1)$. In order to close a curve in this way, the +direction at the two endpoints often has to be changed, and this changes +the shape of the first and last segments of the curve. Use \cs{bclosed} +if you don't wish this to happen. However, \cs{sclosed}\cs{curve} +produces a result almost identical to \cs{cyclic} given the same points +and tension values. The optional tension argument is as in the +\cs{bclosed} command. + +There are two other closure commands but, because they are associated +with particular types of paths (splines), we delay their discussion +until those are discussed (subsection~\ref{splines}). + +\begin{cd}\pagelabel{makesector} +\cs{makesector}\cs{arc}[\meta{fmt}]\marg{\meta{spec}}% +\index{makesector@\cs{makesector}} +\end{cd} +The modifying macro \cs{makesector} can be applied to any path, but it +make sense only if that path is an arc. It appends line segments from +the center of the arc's circle to the ends of the arc, producing a +closed path. It is useful if one doesn't know that center of the arc (a +required parameter of \cs{sector}). It works by selecting the first +point, a middle point, and the last point of the following path, then +calculates the center of the circle through those three points. -\subsubsection{Reversal, Connection and Subpaths.}\label{reversal} -\begin{cd} +\subsection{Reversal, connection and other path modifications}% +\label{reversal} + +\begin{cd}\pagelabel{reverse} \cs{reverse}$\ldots$% \index{reverse@\cs{reverse}} \end{cd} -Turns a path around, reversing its sense. This will affect both -the direction of arrows (e.g. bi-directional arrows can be coded with +This modifies the following path by reversing its sense. This will +affect the direction of arrows: bi-directional arrows can be coded with \cs{arrow}\cs{reverse}\cs{arrow}$\ldots$, where the first \cs{arrow} -modifier applies to the \emph{reversed} path), and the order of -endpoints for a \cs{connect}$\ldots$\cs{endconnect} environment (below). +prefix applies to the \emph{reversed} path. The order of endpoints for +the following \env{connect} environment will also be affected. -\begin{cd} -\cs{connect} $\ldots$ -\cs{endconnect}% -\index{connect@\cs{connect}} +\begin{cd}\pagelabel{connect} +\cs{connect} $\ldots$ \cs{endconnect}% +\index{connect@\cs{connect}}% \index{endconnect@\cs{endconnect}} \end{cd} -This pair of macros, acting as an environment, adds line segments from -the trailing endpoint of one path to the leading endpoint of the -next path, in the given order. The result is a connected, \emph{open} -path. +The macro \cs{connect} produces a connected path by joining all the +paths following it up to the matching \cs{endconnect} command. Line +segments are added from the end of one path to the start of the next. +The whole group acts as one figure macro, permitting any prefix macros +to come before. -\emph{Note}: In \LaTeX, this pair of macros can be used in the form of a -\LaTeX-style environment called \env{connect} ---as in -\cs{begin}\marg{connect}$\ldots$\cs{end}\marg{connect}. +In \LaTeX{}, instead of this pair of macros, an environment named +\env{connect} may be used. For example +\begin{verbatim} +\lclosed +\begin{connect} + \curve{(2,1),(1,2),(0,1)} + \polyline{(0,0),(2,0)} +\end{connect} +\end{verbatim} +produces a closed figure consisting of one smooth curve and three line +segments: the segment produced by \cs{polyline}, the segment added by +the \env{connect} environment, and the segment added by \cs{lclosed}. -\begin{cd} + +\begin{cd}\pagelabel{partpath} \cs{partpath}\marg{\meta{frac1},\meta{frac2}}\dots\\ \cs{subpath}\marg{\meta{num1},\meta{num2}}\dots% \index{partpath@\cs{partpath}}% \index{subpath@\cs{subpath}} \end{cd} -Both produce a part of the following path. In \cs{partpath} the -parameters \meta{frac1} and \meta{frac2} should be numbers between 0 and -1. The path produced travels the same course as the path that follows, -but starts at the point that is \meta{frac1} of the original length -along it, and ends at the point \meta{frac2} of its original length. If -\meta{frac1} is greater than \meta{frac2}, the sense of the path is -reversed. In \cs{subpath}, the two numbers should be between 0 and the -number of B\'ezier segments in the path. This is mainly for experienced -\MF ers and provides an \mfp{} interface to \MF's -`\mfc{subpath}' operation. - -As an example of \cs{partpath}, one can put an arrowhead (see next -subsection) in the middle of a path with something like the following. - +These macros modify the following path by producing only a part of it. In +\cs{partpath} the parameters \meta{frac1} and \meta{frac2} should be +numbers between 0 and 1. The path produced travels the same course as +the path that follows, but starts at the point that is the fraction +\meta{frac1} of the original length along it, and ends at the point +\meta{frac2} of its original length. If \meta{frac1} is greater than +\meta{frac2}, the sense of the path is reversed. In \cs{subpath}, the +two numbers should be between 0 and the number of B\'ezier segments in +the path. This is mainly for experienced \MF{}ers and provides an \mfp{} +interface to \MF{}'s `\mfc{subpath}' operation. + +\begin{cd}\pagelabel{parallelpath} +\cs{parallelpath}{\meta{dist}}$\ldots$ +\index{parallelpath@\cs{parallelpath}} +\end{cd} + +This modifying macro takes the following path and returns a path that +follows beside it, keeping a fixed distance \meta{dist} to the left. If +\meta{dist} is negative, it keeps to the right. Left or right is from +the point of view of a traveller following the given path from start to +finish. The distance is a pure number in \emph{graph} coordinates. Note: +this should be compared to the first optional argument of +\cs{doubledraw} (see subsection~\ref{drawing}), which requires an +absolute dimension like \dim{2pt}, even though it is implemented using +the internal code of \cs{parallelpath}. + +The calculation of the parallel path is approximate and rather +inefficient. It is likely to produce inexplicable small loops where it +tries to follow the inside of tight turns (radius less than +\meta{dist}). Actual corners, (which might be thought of as turns of +radius $0$) are usually detected and dealt with in a reasonable manner. +However, if the path is made up of segments of length \meta{dist} or +less, this is unlikely to work correctly at all. + +\begin{cd}\pagelabel{arccomplement} +\cs{arccomplement}\dots% +\index{arccomplement@\cs{arccomplement}} +\end{cd} + +This macro, to work properly, must be followed by an arc of a circle. It +produces the complementary arc. That is, it produces the circular arc, +which would, if appended to the following arc, complete the circle. The +complementary arc will have the same direction, clockwise or +anticlockwise, as the original. The arc that follows doesn't have to be +produced by \cs{arc}, as in the following example: \begin{ex} -\cs{arrow}\cs{partpath}\marg{0,.5}\cs{draw}\dots +\cs{draw}\oarg{blue}\cs{arccomplement}\\ +\ \cs{draw}\oarg{red}\cs{partpath}\marg{0,.333}\\ +\ \cs{circle}\marg{(0,0),1} \end{ex} +This will draw 1/3 of the circle in red and the rest in blue. +\CMF{} cannot check if a path is really a circular arc. The \MF{} code, +like that of \cs{makesector} (see subsection~\ref{closure}), selects +three key points on the arc, then it produces the rest of the circle +much the same way as the internal code of \cs{arc}\oarg{t} (the three +point option for \cs{arc}). Thus, it will produce \emph{some} arc from +the end of any following path to its beginning (or a straight line if +the three chosen points happen to lie in a straight line). However, the +result needn't bear any significant relation to the original path. -\subsubsection{Arrows.}\label{arrows} -\begin{cd} +\subsection{Arrows}\label{arrows} + +\begin{cd}\pagelabel{arrow} \cs{arrow}\oarg{l\meta{headlen}}\oarg{r\meta{rotate}}% + \oarg{b\meta{backset}}\oarg{c\meta{color}}$\ldots$\\ +\cs{arrow*}\oarg{l\meta{headlen}}\oarg{r\meta{rotate}}% \oarg{b\meta{backset}}\oarg{c\meta{color}}$\ldots$% \index{arrow@\cs{arrow}} \end{cd} -Draws an arrowhead at the endpoint of the open path (or at the last key -point of the closed path) that follows. The optional parameter +This macro adds an arrowhead at the endpoint of the open path (or at the +last key point of the closed path) that follows. The optional parameter \meta{headlen} determines the length of the arrowhead. The default is the value of the \TeX{} dimension \cs{headlen}, initially \dim{3pt}. The optional parameter \meta{rotate} allows the arrowhead to be rotated @@ -1813,23 +2385,178 @@ default is 0. The optional parameter \meta{backset} allows the arrowhead to be `set back' from its original point, thus allowing e.g. double arrowheads. This parameter is in the form of a \TeX{} dimension---its default value is \dim{0pt}. If an arrowhead is both rotated and set -back, the rotation affects the direction in which the arrowhead is set -back. The optional \meta{color} defaults to \gbc{headcolor}. The -optional parameters may appear in any order, but the indicated key -character for each parameter must always appear. +back, it is set back in the direction after the rotation. Actually, +except on a straight line, a better way to set an arrowhead back might +be something like +\begin{ex} + \cs{arrow}\cs{trimpath}\marg{0,5pt}\cs{draw}\dots +\end{ex} +See subsection~\ref{misc} for the \cs{trimpath} macro. The optional +\meta{color} defaults to \gbc{headcolor}. The optional parameters may +appear in any order, the indicated key character determining the meaning +of a parameter. The key letter \texttt{l} for `length' can be replaced +by \texttt{s} for `size'. And, oddly enough, \texttt{b} for `backset' +can be replaced by \texttt{f} for `forward' so that arrow tails (see +below) can share the same internal code for identifying the meaning of +the parameters. + +There is also a star-form: If \cs{arrow} is called as \cs{arrow*}, then +any part of the tip of the following curve that lies outside the +arrowhead shape is clipped off. Imagine a rectangle with one side +connecting the ends of the barbs and the opposite side passing through +the tip. Everything in that rectangle outside the arrowhead is erased, +so be careful using this (also see comments about \MP{}'s method of +`erasing' in the description of \cs{gclear} in +\cs{}subsection~\ref{filling}). One use of this is adding an arrowhead +to a figure rendered with \cs{doubledraw} (see the next section) or with +a rather large pen diameter (see section~\ref{parameters}). + +For the star-form to work, the head has to be added after the path is +drawn. What this means in practice is that the \cs{arrow*} command must +come before any drawing command in the list of prefixes. This is because +prefix macros add their elements to the result of everything that +follows. If you \cs{store} a curve in a path variable (see +subsection~\ref{transformation}), and draw the path and the arrowhead in +separate commands, then the arrow command must come \emph{after} the +drawing command. + +\begin{cd}\pagelabel{arrowhead} +\cs{arrowhead}\marg{\meta{symbol}}\oarg{l\meta{length}}\oarg{r\meta{rotate}}% + \oarg{b\meta{backset}}\oarg{c\meta{color}}$\ldots$\\ +\cs{arrowmid}\marg{\meta{symbol}}\oarg{l\meta{length}}\oarg{r\meta{rotate}}% + \oarg{f\meta{fraction}}\oarg{c\meta{color}}$\ldots$\\ +\cs{arrowtail}\marg{\meta{symbol}}\oarg{l\meta{length}}\oarg{r\meta{rotate}}% + \oarg{f\meta{forward}}\oarg{c\meta{color}}$\ldots$% +\index{arrowhead@\cs{arrowhead}}% +\index{arrowmid@\cs{arrowmid}}% +\index{arrowtail@\cs{arrowtail}} +\end{cd} + +These macros add some sort of symbol at different locations along a +path. The first adds an arrowhead, but the head can be any appropriately +designed symbol. It has been arranged that any of the symbols usable in +\cs{plotsymbol} (see subsection~\ref{points}) can be used: you can have +\gbc{Diamond}- or \gbc{Asterisk}-tipped arrows. The special symbol +\gbc{Arrowhead} produces the same shape as the head in the \cs{arrow} +command. In total eight special \meta{symbols} have been made available, +intended for use with \cs{arrowhead}, \cs{arrowmid} and \cs{arrowtail}. +Here is a list and description of all these symbols. +\begin{description} + \item[\gbc{Arrowhead}] The\index{Arrowhead@\gbc{Arrowhead}} shape that + would be drawn at the end of a path by \cs{arrow}. + \item[\gbc{Leftharpoon}] The\index{Leftharpoon@\gbc{Leftharpoon}} left + half of \gbc{Arrowhead}. + \item[\gbc{Rightharpoon}] The\index{Rightharpoon@\gbc{Rightharpoon}} + right half of \gbc{Arrowhead}. + \item[\gbc{Crossbar}] A\index{Crossbar@\gbc{Crossbar}} short + line crossing the path perpendicularly unless rotated. + \item[\gbc{Leftbar}] Essentially\index{Leftbar@\gbc{Leftbar}} the left + half of \gbc{Crossbar}. + \item[\gbc{Rightbar}] The\index{Rightbar@\gbc{Rightbar}} right half. + \item[\gbc{Lefthook}] An\index{Lefthook@\gbc{Lefthook}} open + semicircle with its open face in the direction of the path, added to + the left side of the path. + \item[\gbc{Righthook}] Like\index{Righthook@\gbc{Righthook}} + \gbc{Lefthook} but on the right side. +\end{description} +Here `left' and `right' are from the point of view of an observer facing +in the direction of the path. + +If the symbol is a closed path (see subsection~\ref{closure} for the +difference between a closed path and one that merely looks closed), the +head will be filled, otherwise its outline will be drawn. Thus +\cs{arrowhead}\marg{Diamond} draws an outline, and +\cs{arrowhead}\marg{SolidDiamond} draws a filled shape because +\gbc{Diamond} has been left open, while \gbc{SolidDiamond} has been +defined to be closed. + +It is possible, to get an outline drawn with the inside erased: +just place the solid version with color \mfc{white} and then the outline +version. This can produce a pleasing result. But recall that the prefix +macro nearest the figure macro is executed first. For example: +\begin{verbatim} +\arrowmid{Circle}\arrowmid{SolidCircle}[cwhite]\polyline{(0,0),(1,1)} +\end{verbatim} + +The symbol is always rotated so that it points in the direction of the +path (for this purpose, all symbols are initially assumed to point +straight upward) before the \oarg{r\meta{rotate}} parameter is applied. + +There is a star-form \cs{arrowhead*} that behaves like \cs{arrow*} (when +possible). The optional arguments are exactly as in \cs{arrow}, with the +same defaults for all of them. + +The second command, \cs{arrowmid}, places the symbol somewhere between +the start and the end of the path. In this case the optional parameter +\oarg{f\meta{fraction}} gives the location of the symbol as a fraction +of the length of the path. The default is \oarg{f0.5}, which places it +approximately in the middle. The other optional arguments have the same +meaning as for \cs{arrowhead}. As with \cs{arrowhead}, the symbol is +rotated to `point' in the direction of the path before the +\oarg{r\meta{rotate}} is applied. + +The third command \cs{arrowtail} places the symbol at the start of the +path. Otherwise it behaves as the other two commands, except the option +\oarg{f\meta{forward}} is an amount to shift the symbol forward from +that first point. + +One might be tempted to use \cs{arrowmid} with the \meta{fraction} equal +to $1$ or $0$ to get arrowheads or tails. This will work sometimes. +However, some shapes have a `tip', that is, a particular point +designated as the tip of the arrowhead. The \cs{arrowhead} and +\cs{arrowtail} commands pay attention to this, while \cs{arrowmid} does +not. Also, \cs{arrowmid} has no star-form. + +You can design your own \meta{symbol} for these commands: use \cs{store} +to store a path in a path variable (see +subsection~\ref{transformation}). These commands assume that the length +is $1$, that the symbol `points' up and that the `tip' (the `pointy +end') is at $(0,0)$ (unless the pair variable \meta{symbol}\gbc{.tip} is +defined, in which case that is taken to be the tip). So draw your symbol +pointing up with its tip at $(0,0)$ and its length equal to $1$ (graph +unit). For example the following produces a solid head with a common +shape: +\begin{verbatim} +\store{myAH}\polygon{(-.5,-1)(0,0),(0.5,-1),(0,-.7)} +\arrowhead{myAH}\arc{(-10,0),(10,0),90} +\end{verbatim} +If you replace the \cs{polygon} above with \cs{polyline}: +\begin{verbatim} +\store{myAH}\polyline{(-.5,-1)(0,0),(0.5,-1),(0,-.7),(-.5,-1)} +\end{verbatim} +the path will not be closed and so the arrowhead will not be filled in. +To make the star-form work with such self-defined symbols, one must also +define a closed path \gbc{myAH.clear} that gives the region to be +erased. In the above example: +\begin{verbatim} +\store{myAH.clear}\polygon{(-.5,-1),(-.5,0),(.5,0),(.5,-1),(0,-.7)} +\end{verbatim} -\subsection{Rendering macros}\label{rendering} -\subsubsection{Drawing.}\label{drawing} +\section{Rendering figures.}\label{rendering} -When \mfp{} is loaded, the initial way in which figures are drawn -is with a solid outline. That is, \cs{lines}\marg{(1,0),(1,1),(0,0)} -will draw two solid lines connecting the points. When the macros in this -section are used, any previously established default (see -subsection~\ref{default} below) is overridden. +When \mfp{} is loaded, the initial way in which figures are drawn is +with a solid outline. That is, \cs{polyline}\marg{(1,0),(1,1),(0,0)} will +draw two solid lines connecting the points. It is possible to establish +a different default (see \cs{setrender} in subsection~\ref{default}), +however that default is used only when no explicit rendering prefix is +present. That is, when the macros in this section are used, any +previously established default is overridden. -\begin{cd} +\begin{cd}\pagelabel{norender} +\cs{norender}$\ldots$% +\index{norender@\cs{norender}}% +\end{cd} + +This causes the following path not to be rendered at all. This can be +used to override \mfp{}'s automatic rendering rules. See +section~\ref{transformation}, page~\pageref{norenderexample} for an +example where one might need to do this. + +\subsection{Drawing}\label{drawing} + +\begin{cd}\pagelabel{draw} \cs{draw}\oarg{\meta{color}}$\ldots$% \index{draw@\cs{draw}} \end{cd} @@ -1839,65 +2566,81 @@ draw a curve and hatch its interior, \cs{draw}\cs{hatch} must be used. The default for \meta{color} is \gbc{drawcolor}. To save repetition, the color used for the following commands is also -\gbc{drawcolor}: \cs{dashed}, \cs{dotted}, \cs{plot}, \cs{plotnodes}, -and \cs{gendashed}, - -\begin{cd} +\gbc{drawcolor}: \cs{dashed}, \cs{dotted}, \cs{doubledraw}, \cs{plot}, +\cs{plotnodes}, and \cs{gendashed}, + +\begin{cd}\pagelabel{doubledraw} +\cs{doubledraw}\oarg{\meta{sep}}\oarg{\meta{color}}$\ldots$ +\index{doubledraw@\cs{doubledraw}} +\end{cd} + +This rendering macro draws the path with a double line. The default +separation (distance between centers of the two penstrokes) is twice the +pen diameter. This normally leaves one line thickness of white space +between. You can change this with the \oarg{\meta{sep}} argument. In +order to make the space between the lines transparent, this command is +implemented by calculating two curves that parallel the given curve and +drawing those. For technical reasons, that calculation is rather lengthy +so this is somewhat inefficient and users of slow machines might want to +avoid it. See also comments at \cs{parallelpath} in +subsection~\ref{reversal}. + +\begin{cd}\pagelabel{dashed} \cs{dashed}\oarg{\meta{length},\meta{space}}$\ldots$% \index{dashed@\cs{dashed}} \end{cd} -Draws dashed segments along the path specified in the next command. The -default length of the dashes is the value of the \TeX{} dimension +This rendering macro draws dashed segments along the path specified. +The default length of the dashes is the value of the \TeX{} dimension \cs{dashlen}, initially \dim{4pt}. The default space between the dashes is the value of the \TeX{} dimension \cs{dashspace}, initially \dim{4pt}. The dashes and the spaces between may be increased or -decreased by as much as ${1\over n}$ of their value, where $n$ is the -number of spaces appearing in the curve, in order to have the proper -dashes at the ends. The dashes at the ends are half of \cs{dashlen} -long. +decreased by as much as $1/n$ of their value, where $n$ is the number of +spaces appearing in the curve, in order to have the proper dashes at the +ends. The dashes at the ends are half of \cs{dashlen} long. -\begin{cd} +\begin{cd}\pagelabel{dotted} \cs{dotted}\oarg{\meta{size},\meta{space}}$\ldots$% \index{dotted@\cs{dotted}} \end{cd} -Draws dots along the specified path. The default size of the dots is the -value of the \TeX{} dimension \cs{dotsize}, initially \dim{0.5pt}. The -default space between the dots is the value of the \TeX{} dimension -\cs{dotspace}, initially \dim{3pt}. The size of the spaces may be -adjusted as in \cs{dashed}. +This rendering macro draws dots along the specified path. The default +size of the dots is the value of the \TeX{} dimension \cs{dotsize}, +initially \dim{0.5pt}. The default space between the dots is the value +of the \TeX{} dimension \cs{dotspace}, initially \dim{3pt}. The size of +the spaces may be adjusted as in \cs{dashed}. -\begin{cd} +\begin{cd}\pagelabel{plot} \cs{plot}\oarg{\meta{size},\meta{space}}\marg{\meta{symbol}}$\ldots$% \index{plot@\cs{plot}} \end{cd} -Similar to \cs{dotted} except copies of \meta{symbol} are drawn along -the path. Possible symbols are those listed under \cs{plotsymbol} in -subsection~\ref{points}. The default \meta{size} is \cs{pointsize} and -the default \meta{space} is \cs{symbolspace}, initially \dim{5pt}. +Similar to \cs{dotted}, this rendering macro draws copies of +\meta{symbol} along the path. Possible symbols are those listed under +\cs{plotsymbol} in subsection~\ref{points}. The default \meta{size} is +\cs{pointsize} (initially \dim{2pt}) and the default \meta{space} is +\cs{symbolspace} (initially \dim{5pt}). -\begin{cd} +\begin{cd}\pagelabel{plotnodes} \cs{plotnodes}\oarg{\meta{size}}\marg{\meta{symbol}}$\ldots$% \index{plotnodes@\cs{plotnodes}} \end{cd} -This places a symbol (same possibilities as in \cs{plotsymbol}, see -subsection~\ref{points}) at each node of the path that follows. A node -is one of the points through which \MF{} draws its curve. If one of the -macros \cs{polyline}\marg{$\ldots$} or \cs{curve}\marg{$\ldots$} -follows, each of the points listed is a node. In the \cs{datafile} -command (below), each of the data points in the file is. In the function -macros (below) the points corresponding to \meta{min}, \meta{max} and -each step in between are nodes. The optional \meta{size} defaults to -\cs{pointsize}. If the command \cs{clearsymbols} has been issued then -the interiors of the open symbols are erased. The effect of something -like the following is rather nice: - +This rendering macro places a symbol at each \emph{node} of the path +that follows. Possible symbols are those listed under \cs{plotsymbol} in +subsection~\ref{points}. A node is one of the points through which \MF{} +draws its curve. If one of the macros \cs{polyline}\marg{$\ldots$} or +\cs{curve}\marg{$\ldots$} follows, each of the points listed is a node. +In the \cs{datafile} command (subsection~\ref{external}), each of the +data points in the file is. In the function macros +(subsection~\ref{plotting}) the points corresponding to \meta{min}, +\meta{max} and each step in between are nodes. The optional \meta{size} +defaults to \cs{pointsize}. If the command \cs{clearsymbols} has been +issued then the interiors of the open symbols are erased. The effect of +something like the following is rather nice: \begin{verbatim} - \clearsymbols - \plotnodes{Circle}\draw\polyline{...} +\clearsymbols +\plotnodes{Circle}\draw\polyline{...} \end{verbatim} This will first draw the polyline with solid lines, and then the points listed will be plotted as open circles with the portion of the lines @@ -1905,107 +2648,197 @@ inside the circles erased. One sees a series of open circles connected one to the next by line segments -\begin{cd} +\begin{cd}\pagelabel{dashpattern} \cs{dashpattern}\marg{\meta{name}}% \marg{\meta{len1},\meta{len2},$\ldots$,\meta{len2k}}% \index{dashpattern@\cs{dashpattern}} \end{cd} For more general dash patterns than \cs{dashed} and \cs{dotted} provide, -there is a generalized dashing command. One must first establish a named -dashing pattern with this command. \meta{name} can be any sequence of -letters and underscores. Try to make it distinctive to avoid undoing -some internal variable. \meta{len1} through \meta{len2k} are an even -number of lengths. The odd ones determine the lengths of dashes, the -even ones the lengths of spaces. A dash of length \texttt{0pt} means a -dot. An alternating dot-dash pattern can be specified with - -\begin{ex} - \cs{dashpattern}\marg{dotdash}\marg{0pt,4pt,3pt,4pt}. -\end{ex} +\mfp{} offers a generalized dashing command. Before using it, one must +first establish a named dashing pattern with the above command. The +\meta{name} can be any sequence of letters and underscores. Try to make +it distinctive to avoid undoing some internal variable. \meta{len1} +through \meta{len2k} are an even number of lengths. The odd ones +determine the lengths of dashes, the even ones the lengths of spaces. A +dash of length \texttt{0pt} means a dot. An alternating dot-dash pattern +can be specified with +\begin{verbatim} +\dashpattern{dotdash}{0pt,4pt,3pt,4pt} +\end{verbatim} \emph{Note}: Since pens have some thickness, dashes look a little longer, and spaces a little shorter, than the numbers suggest. If one -wants dashes and space with the same length, one needs to take the size +wants dashes and spaces with the same length, one needs to take the size desired and increase the spaces by the thickness of the drawing pen -(normally \dim{0.5pt}) and decrease the dashes by the same amount. +(normally) \dim{0.5pt}) and decrease the dashes by the same amount.% + \footnote{Experienced \MP{} users could also set the \mfc{linecap} + variable to \mfc{butt}.} If \cs{dashpattern} is used with an odd number of entries, a space of length \dim{0pt} is appended. This makes the last dash in one copy of the pattern abut the first dash in the next copy. -\begin{cd} +\begin{cd}\pagelabel{gendashed} \cs{gendashed}\marg{\meta{name}}$\ldots$% \index{gendashed@\cs{gendashed}} \end{cd} Once a dashing pattern name has been defined, it can be used in this -command to draw the curve that follows it. Using a name not previously -defined will cause the curve to be drawn with a solid line, and generate -a \MF{} warning, but \TeX{} will not complain. If all the dimensions in -a dash pattern are 0, \cs{gendashed} responds by drawing a solid curve. -The same is true if the pattern has only one entry. +figure macro to draw the curve that follows it. Using a name not +previously defined will cause the curve to be drawn with a solid line, +and generate a \MF{} warning, but \TeX{} will not complain. If all the +dimensions in a dash pattern are 0, \cs{gendashed} responds by drawing a +solid curve. The same is true if the pattern has only one entry. + +\begin{cd}\pagelabel{zigzag} +\cs{zigzag}\marg{\meta{start},\meta{end},\meta{wl},\meta{amp}}\dots\\ +\cs{sinewave}\oarg{\meta{tens}}% + \marg{\meta{start},\meta{end},\meta{wl},\meta{amp}}\dots% +\index{zigzag@\cs{zigzag}}% +\index{sinewave@\cs{sinewave}} +\end{cd} + +These figure macros both draw a solid line that crosses from one +side of the path to the other. The \cs{zigzag} makes a jagged result +while the \cs{sinewave} makes a smooth one. The optional argument of +\cs{sinewave} is a `tension' and controls how smooth the result is. The +default tension is $1$. Higher values make a less smooth path, and +values of 10 or so produce a result almost indistinguishable from +\cs{zigzag}. Tension is required to be greater than $3/4$. + +The mandatory arguments consists of four dimensions separated by a comma. +The rendering produced by these macros actually follow the path a little +way at the start and end of the path. This is controlled by the +dimensions \meta{start} and \meta{end}. + +The third dimension, \meta{wl}, is the distance from one `peak' to the +next (the `wavelength'). The second, \meta{amp}, is the maximum distance +to either side of the true path (the `amplitude'). Reasonable values of +\meta{wl} and \meta{amp} are \dim{8pt} and \dim{2pt}, respectively. +These proportions (4 to 1) causes the zigzag and the sinewave to cross +the path at an angle of about 45 degrees, a rather pleasant result. +Those sizes are close to optimal: too much smaller and the rendering +just looks like a fuzzy line, too much larger, and bends in the path +will distort the zigzagging. + +The zigzags zig to the left first if \meta{amp} is positive, to the +right if it is negative. For closed curves, the beginning and end are +constructed to meet smoothly. It is always arranged that there are an +equal number of left zigs and right zags, so the \meta{wl} is only +approximate. + + +\begin{cd}\pagelabel{corkscrew} +\cs{corkscrew}\oarg{\meta{tens}}% + \marg{\meta{start},\meta{end},\meta{wl},\meta{amp}}\dots\\% +\cs{coil}\oarg{\meta{tens}}% + \marg{\meta{start},\meta{end},\meta{wl},\meta{amp}}\dots% +\index{corkscrew@\cs{corkscrew}}% +\index{coil@\cs{coil}} +\end{cd} + +This rendering macro draws a coil or corkscrew that coils around a +given path, something like this: \includegraphics{coil.mps} (the red +dots show the actual path). The \meta{tens} is a tension option that +controls how `loopy' the result will be (the higher the number the more +jagged). The mandatory argument contains four explicit dimensions. The +first two, \meta{start} and \meta{end} are as in \cs{zigzag}. The +\meta{wl} is the distance from one loop to the next, and \meta{amp} is +the distance from the true path to the tops (or bottoms) of the +loops. If \meta{amp} is positive, the tip of the loop is to the left +of the path, if negative it is to the right. The example at the start of +this paragraph was drawn using the following code: +\begin{verbatim} +\mfpic{0}{33}{0}{6.4} +\dotsize=1pt +\drawcolor{red} + \dotted\polyline{(0,3.2),(33,3.2)} +\drawcolor{black} + \coil[1.5]{3pt,3pt,4.8pt,3.2pt}\polyline{(0,3.2),(33,3.2)} +\endmfpic +\end{verbatim} -\subsubsection{Shading, Filling, Erasing, Clipping, -Hatching.}\label{filling} +\subsection{Shading, filling, erasing, clipping, hatching}\label{filling} -These macros can all be used to fill (or unfill) the interior of closed -paths, even if the paths cross themselves. Filling an open curve is -technically an error, but the \MF{} code responds by drawing the path -and not doing any filling. These macros replace the default rendering: -when they are used the outline will not be drawn unless an explicit -prefix to do so is present. +For the purposes of this section, a distinction must be made in the +figure macros between `open' and `closed' paths. A path that merely +returns to its starting point is \emph{not} automatically closed; such a +path might be open and may need to be explicitly closed, for example by +\cs{lclosed}. The (already) closed paths are those that have +`\texttt{closed}' or `\texttt{cyclic}' in their name plus: +\begin{display} + \cs{belowfcn}, \cs{border}, \cs{btwnfcn}, \cs{btwnplrfcn}, + \cs{chartbar} (and its aliases),\\ + \cs{circle}, \cs{ellipse}, \cs{levelcurve}, \cs{makesector}, + \cs{piewedge}, \cs{plrregion},\\ + \cs{polygon}, \cs{rect}, \cs{regpolygon}, \cs{sector}, + \cs{tlabelcircle}, \cs{tlabelellipse},\\ + \cs{tlabeloval}, and \cs{tlabelrect}. +\end{display} + +The macros of this section can all be used to fill (or unfill) the +interior of closed paths, even if the paths cross themselves. Filling an +open curve is technically an error, but the \MF{} code responds by +drawing the path and not doing any filling. Note that these macros +override the default rendering, so if you want some sort of fill pattern +\emph{and} an outline drawn, you need an explicit prefix for both. -\begin{cd} +\begin{cd}\pagelabel{gfill} \cs{gfill}\oarg{\meta{color}}$\ldots$% \index{gfill@\cs{gfill}} \end{cd} -Fills in the subsequent closed path. Under \MP{} it fills with -\meta{color}, which defaults to +This rendering macro fills in the subsequent closed path. Under \MP{} it +fills with \meta{color}, which defaults to \index{fillcolor@\gbc{fillcolor}}\gbc{fillcolor}. Under \MF{} it approximates the color with a shade of gray, clears the interior, and then fills with a pattern of black and white pixels simulating gray. -\begin{cd} +\begin{cd}\pagelabel{gclear} \cs{gclear}$\ldots$% \index{gclear@\cs{gclear}} \end{cd} -Erases everything \emph{inside} the subsequent closed path (except text -labels under some circumstances, see section~\ref{mplabels} and -\ref{overlaylabels}). Under \MP{} it actually fills with the -predefined color named \mfc{background}. Since \mfc{background} is normally -white, and so are most actual backgrounds, this is usually -indistinguishable from clearing. +This rendering macro erases everything \emph{inside} the subsequent +closed path (except text labels under some circumstances, see +section~\ref{mplabels} and \ref{overlaylabels}). Under \MP{} it actually +fills with the predefined color named \mfc{background}. Since +\mfc{background} is normally \mfc{white}, and so are most actual +backgrounds, this is usually indistinguishable from clearing. However, +if an \env{mfpic} environment utilzes \emph{background text} (see +subsection~\ref{text}), part of the background text may appear to be +`erased'. Unfortunately, there is little that can be done about this. -\begin{cd} +\begin{cd}\pagelabel{gclip} \cs{gclip}$\ldots$% \index{gclip@\cs{gclip}} \end{cd} -Erases everything \emph{outside} the subsequent closed path from the -picture (except text labels under some circumstances, see -section~\ref{mplabels} and \ref{overlaylabels}). +This rendering macro erases everything \emph{outside} the subsequent +closed path from the picture (except text labels under some +circumstances, see section~\ref{mplabels} and \ref{overlaylabels}). Note +that this is a true erasing, even in \MP{}. -\begin{cd} +\begin{cd}\pagelabel{shade} \cs{shade}\oarg{\meta{shadesp}}$\ldots$% \index{shade@\cs{shade}} \end{cd} -Shades the interior of the subsequent closed path with dots. The -diameter of the dots is the \MF{} variable \mfc{shadewd}, set by the -macro \cs{shadewd}\marg{\meta{size}}. Normally this is \dim{0.5pt}. The -optional argument specifies the spacing between (the centers of) the -dots, which defaults to the \TeX{} dimension \cs{shadespace}, initially -\dim{1pt}. If \cs{shadespace} is less than \mfc{shadewd}, the closed -path is filled with black, as if with \cs{gfill}. Under \MP{} this macro -actually fills the path's interior with a shade of gray. The shade to -use is computed based on \cs{shadespace} and \mfc{shadewd}. The default -values of these parameters correspond to a gray level of 75\% of white.% +This rendering macro shades the interior of the subsequent closed path +with dots. The diameter of the dots is the \MF{} variable \mfc{shadewd}, +set by the macro \cs{shadewd}\marg{\meta{size}}. Normally this is +\dim{0.5bp}. The optional argument specifies the spacing between (the +centers of) the dots, which defaults to the \TeX{} dimension +\cs{shadespace}, initially \dim{1pt}. If \cs{shadespace} is less than +\mfc{shadewd}, the closed path is filled with black, as if with +\cs{gfill}. Under \MP{} this macro actually fills the path's interior +with a shade of gray. The shade to use is computed based on +\cs{shadespace} and \mfc{shadewd}. The default values of these +parameters correspond to a gray level of about 78\% of white.% \footnote{If \cs{shadewd} is $w$ and \cs{shadespace} is $s$, then - the level of gray is $1 - (w/s)^2$, where $0$ denotes black and $1$ - white.} % + the level of gray is $1 - (.88w/s)^2$, where $0$ denotes black and + $1$ white.} % The \MF{} version attempts to optimize the dots to the pixel grid corresponding to the printers resolution (to avoid generating dither lines). Because this involves rounding, it will happen that values of @@ -2017,95 +2850,97 @@ parameters and particular printer resolutions cannot be predicted, and we even make no guarantee it will not change from one version of \mfp{} to another. -\begin{cd} +\begin{cd}\pagelabel{polkadot} \cs{polkadot}\oarg{\meta{space}}$\ldots$% \index{polkadot@\cs{polkadot}} \end{cd} -Fills the interior of a closed path with large dots. This is almost what -\cs{shade} does, but there are several differences. \cs{shade} is -intended solely to simulate a gray fill in \MF{} where the only color is -black. So it is optimized for small dots aligned to the pixel grid (in -\MF). In \MP{} all it does is fill with gray and is intended merely for -compatibility. The macro \cs{polkadot} is intended for large dots in any -color, and so it optimizes spacing (a nice hexagonal array) and makes no -attempt to align at the pixel level. The \meta{space} defaults to the -\TeX{} dimension \cs{polkadotspace}, initially \dim{10pt}. The diameter -of the dots is the value of the \MF{} variable \mfc{polkadotwd}, which -can be set with \cs{polkadotwd}\marg{\meta{size}}, and is initially -\dim{5pt}. The dots are colored with -\index{fillcolor@\gbc{fillcolor}}\gbc{fillcolor}. In \MF, nonblack -values of \gbc{fillcolor} will produce shaded dots. - -\begin{cd} +This rendering macro fills the interior of a closed path with large +dots. This is almost what \cs{shade} does, but there are several +differences. \cs{shade} is intended solely to simulate a gray fill in +\MF{} where the only color is black. So it is optimized for small dots +aligned to the pixel grid (in \MF{}). In \MP{} all it does is fill with +gray and is intended merely for compatibility. The macro \cs{polkadot} +is intended for large dots in any color, and so it optimizes spacing (a +nice hexagonal array) and makes no attempt to align at the pixel level. +The \meta{space} defaults to the \TeX{} dimension \cs{polkadotspace}, +initially \dim{10pt}. The diameter of the dots is the value of the \MF{} +variable \mfc{polkadotwd}, which can be set with +\cs{polkadotwd}\marg{\meta{size}}, and is initially \dim{5bp}. The dots +are colored with \index{fillcolor@\gbc{fillcolor}}\gbc{fillcolor}. In +\MF{}, nonblack values of \gbc{fillcolor} will produce shaded dots. + +\begin{cd}\pagelabel{thatch} \cs{thatch}\oarg{\meta{hatchsp},\meta{angle}}\oarg{\meta{color}}$\ldots$% \index{thatch@\cs{thatch}} \end{cd} -Fills a closed path with equally spaced parallel lines at the specified -angle. The thickness of the lines is set by the macro \cs{hatchwd}. In -the optional argument, \meta{hatchsp} specifies the space between lines, -which defaults to the \TeX{} dimension \cs{hatchspace}, initially -\dim{3pt}. The \meta{angle} defaults to 0. The \meta{color} defaults to -\gbc{hatchcolor}. If \cs{hatchspace} is less than the line thickness, -the closed path is filled with \meta{color}, as if with \cs{gfill}. If -the first optional argument appears, both parts must be present, -separated by a comma. For the color argument to be present, the other -optional argument must also be present. However, if one wishes only to -override the default color one can use an empty first optional argument -(completely empty, no spaces). - -\begin{cd} -\cs{lhatch}\oarg{\meta{hatchsp}}\oarg{\meta{color}}$\ldots$% -\index{lhatch@\cs{lhatch}} +This rendering macro fills a closed path with equally spaced parallel +lines at the specified angle. The thickness of the lines is set by the +macro \cs{hatchwd}. In the optional argument, \meta{hatchsp} specifies +the space between lines, which defaults to the \TeX{} dimension +\cs{hatchspace}, initially \dim{3pt}. The \meta{angle} defaults to 0. +The \meta{color} defaults to \gbc{hatchcolor}. If \cs{hatchspace} is +less than the line thickness, the closed path is filled with +\meta{color}, as if with \cs{gfill}. If the first optional argument +appears, both parts must be present, separated by a comma. For the color +argument to be present, the other optional argument must also be +present. However, if one wishes only to override the default color one +can use an empty first optional argument (completely empty, no spaces or +comma). + +\begin{cd}\pagelabel{hatch} +\cs{lhatch}\oarg{\meta{hatchsp}}\oarg{\meta{color}}$\ldots$\\ +\cs{rhatch}\oarg{\meta{hatchsp}}\oarg{\meta{color}}$\ldots$\\ +\cs{hatch}\oarg{\meta{hatchsp}}\oarg{\meta{color}}$\ldots$\\ +\cs{xhatch}\oarg{\meta{hatchsp}}\oarg{\meta{color}}$\ldots$% +\index{lhatch@\cs{lhatch}}% +\index{rhatch@\cs{rhatch}}% +\index{hatch@\cs{hatch}}% +\index{xhatch@\cs{xhatch}}% \end{cd} -Draws lines shading in the subsequent closed path in a left-oblique -hatched (upper left to lower right) pattern. It is exactly the same as +These rendering macros are just \cs{thatch} with predefined values of +the angle. \cs{lhatch} fills the region with left slanted lines (from +upper left to lower right). It is exactly the same as +\begin{display} \cs{thatch}\oarg{\meta{hatchsp},-45}\oarg{\meta{color}}$\ldots$ +\end{display} -\begin{cd} -\cs{rhatch}\oarg{\meta{hatchsp}}\oarg{\meta{color}}$\ldots$% -\index{rhatch@\cs{rhatch}} -\end{cd} - -Draws lines shading in the subsequent closed path in a right-oblique -hatched (lower left to upper right) pattern. It is exactly the same as +\cs{rhatch} draws right slanted lines (lower left to upper right). It is +exactly the same as +\begin{display} \cs{thatch}\oarg{\meta{hatchsp},45}\oarg{\meta{color}}$\ldots$ +\end{display} -\begin{cd} -\cs{hatch}\oarg{\meta{hatchsp}}\oarg{\meta{color}}$\ldots$\\ -\cs{xhatch}\oarg{\meta{hatchsp}}\oarg{\meta{color}}$\ldots$% -\index{hatch@\cs{hatch}}% -\index{xhatch@\cs{xhatch}} -\end{cd} - -Draws lines shading in the subsequent closed path in a cross-hatched +\cs{hatch} (\cs{xhatch} is a synonym) draws lines in a cross-hatched pattern. It is exactly the same as \cs{rhatch} followed by \cs{lhatch} using the same \meta{hatchsp} and \meta{color}. Hatching should normally be used very sparingly, or never if -alternatives are available (color, shading). Hatching at two different -angles is, however, almost the only way to fill in two regions that -\emph{automatically} shows the overlapping region. +alternatives are available (color, shading). However, hatching or +polkadotting on top of another filling macro is almost the only way to +fill in two regions that \emph{automatically} shows the overlap area. +Hatching is at least less garish than polkadots. -\subsubsection{Changing the Default Rendering.}\label{default} +\subsection{Changing the default rendering}\label{default} \emph{Rendering} is the process of converting a geometric description -into a drawing. In \MF, this means producing a bitmap (\MF{} stores +into a drawing. In \MF{}, this means producing a bitmap (\MF{} stores these in \mfc{picture} variables), either by stroking (drawing) a path using a particular pen), or by filling a closed path. In \MP{} it means -producing a \PS{} description of strokes with pens, and fills +producing a \PS{} description of penstrokes and fills (with possible +clipping). -\begin{cd} +\begin{cd}\pagelabel{setrender} \cs{setrender}\marg{\meta{\TeX{} commands}}% \index{setrender@\cs{setrender}} \end{cd} Initially, \mfp{} uses the \cs{draw} command (stroking) as the default operation when a figure is to be rendered. However, this can be changed -to any combination of \mfp{} rendering commands and/or other \TeX{} +to any combination of \mfp{} rendering commands or indeed any \TeX{} commands, by using the \cs{setrender} command. This redefinition is local inside an \env{mfpic} environment, so it can be enclosed in braces to restrict its range. Outside an \env{mfpic} environment it is a global @@ -2115,35 +2950,37 @@ For example, after \cs{setrender}\marg{\cs{dashed}\cs{shade}} the command \cs{circle}\marg{(0,0),1} produces a shaded circle with a dashed outline. Any explicit rendering prefix overrides this default. -\subsubsection{Examples.}\label{examples} +\subsection{Examples}\label{examples} It may be instructive, for the purpose of understanding the syntax of \emph{shape-modifier and rendering prefixes}, to consider two examples: \begin{ex} - \cs{draw}\cs{shade}\cs{lclosed}\cs{lines}\marg{...} + \cs{draw}\cs{gfill}\oarg{red}\cs{lclosed}\cs{polyline}\marg{$\ldots$} \end{ex} -which shades inside a polygon and draws its outline; and +which fills inside a polygon and draws its outline; and \begin{ex} - \cs{shade}\cs{lclosed}\cs{draw}\cs{lines}\marg{...} + \cs{gfill}[red]\cs{lclosed}\cs{draw}\cs{polyline}\marg{$\ldots$} \end{ex} which draws all of the outline \emph{except} the line segment supplied -by \cs{lclosed}, then shades the interior. Thus, in the first case the -path is defined (by \cs{lines}) then closed, then the resulting closed -path is shaded, then drawn; while in the second case the order is: -defined, drawn, closed, shaded. In particular, what is drawn is the path -not yet closed. +by \cs{lclosed}, then fills the interior. Thus, in the first case the +path is first defined (by \cs{polyline}), then closed, then the resulting closed +path is filled, and finally drawn. In the second case the order is: +defined, drawn, closed, filled. In particular, what is drawn in the +second case is the path not yet closed. It should also be pointed out +that in the last case, the fill is placed last and will cover half +the thickness of the previously drawn outline. -\subsection{Functions and Plotting.}\label{functions} +\section{Functions and Plotting.}\label{functions} -In the following macros, expressions like $f(\mathtt{x})$, $g(\mathtt{t})$ +In the following macros, expressions like $f(\mathtt{x})$ or $g(\mathtt{t})$ stand for any legal \MF{} expression, in which the only unknown variables are those indicated (\texttt{x} in the first case, and \texttt{t} in the second). -\subsubsection{Defining Functions}\label{defining} +\subsection{Defining functions}\label{defining} -\begin{cd} +\begin{cd}\pagelabel{fdef} \cs{fdef}\marg{\meta{fcn}}\marg{\meta{param1},\meta{param2},$\ldots$}% \marg{\meta{mf-expr}}% \index{fdef@\cs{fdef}} @@ -2153,14 +2990,14 @@ Defines a \MF{} function \meta{fcn} of the parameters \meta{param1}, \meta{param2}, $\ldots$, by the \MF{} expression \meta{mf-expr} in which the only free parameters are those named. The return type of the function is the same as the type of the expression. What is allowed for -the function name \meta{fcn} is more restrictive than \MF's rule for +the function name \meta{fcn} is more restrictive than \MF{}'s rule for variable names. Roughly speaking, it should consist of letters and underscore characters only. (In particular, for those that know what -this means, the name should have no suffixes.) Try to make the names +this means, the name should have no suffixes.) Try to make the name distinctive to avoid redefining internal \MF{} commands. The expression \meta{mf-expr} is passed directly into the corresponding -\MF{} macro and interpreted there, so \MF's rules for algebraic +\MF{} macro and interpreted there, so \MF{}'s rules for algebraic expressions apply. If \cs{fdef} occurs inside an \env{mfpic} environment, it is local to that environment, otherwise it is available to all subsequent \env{mfpic} environments. @@ -2171,7 +3008,7 @@ place below where a \MF{} expression is required, you can use \mfc{x*x-x}. Operations available include \mfc{+}, \mfc{-}, \mfc{*}, \mfc{/}, and -\mfc{**} (\mfc{x**y}$=x^y$), with \mfc{(} and \mfc{)} for grouping. +\mfc{**} (\mfc{x**y}$=x^y$), with `\mfc{(}' and `\mfc{)}' for grouping. Functions already available include the standard \MF{} functions \mfc{round}, \mfc{floor}, \mfc{ceiling}, \mfc{abs}, \mfc{sqrt}, \mfc{sind}, \mfc{cosd}, \mfc{mlog}, and \mfc{mexp}. Note that in \MF{} @@ -2183,32 +3020,46 @@ so \mfc{x*y**z} means $(xy)^z$. Use parentheses liberally! \mfc{mexp} is its inverse.) You can also define the function \meta{fcn} by cases, using the \MF{} conditional expression \begin{ex} - \mfc{if~\meta{boolean}:~\meta{expr}~elseif - \meta{boolean}:~$\ldots$~else:~\meta{expr}~fi}. + \mfc{if~\meta{boolean}:~\meta{expr}~elseif + \meta{boolean}:~$\ldots$~else:~\meta{expr}~fi}. \end{ex} Relations available for the \meta{boolean} part of the expression include \mfc{=}, \mfc{<}, \mfc{>}, \mfc{<=}, \mfc{<>} and \mfc{>=}. Complicated functions can be defined by a compound expression, which is -a series of \MF{} statements, followed by an expression, all enclosed in -the commands \mfc{begingroup} and \mfc{endgroup}. The \cs{fdef} -command automatically supplies the grouping around the definition so -the user need not type them if the entire \meta{mf-expr} is one such -compound expression. \CMF{} functions can call \MF{} functions, -even recursively. - -Many common functions have been predefined in \file{grafbase}. These -include all the usual trig functions \mfc{tand}, \mfc{cotd}, \mfc{secd}, +a series of \MF{} statements, followed by an expression, all enclosed +between \mfc{begingroup} and \mfc{endgroup}. The \cs{fdef} command +automatically supplies these grouping commands around the definition so +if the entire \meta{mf-expr} is one such compound expression the user +need not type them. \CMF{} functions can call \MF{} functions, even +recursively. + +Many common functions have been predefined in \file{grafbase}, which is +a package of \MF{} macros that implement \prog{mfpic}'s drawing. These +include the rest of the trig functions \mfc{tand}, \mfc{cotd}, \mfc{secd}, \mfc{cscd}, which take angles in degrees, plus variants \mfc{sin}, \mfc{cos}, \mfc{tan}, \mfc{cot}, \mfc{sec}, and \mfc{csc}, which take angles in radians. Some inverse trig functions are also available, the following produce angles in degrees: \mfc{asin}, \mfc{acos}, and \mfc{atan}, and the following in radians: \mfc{invsin}, \mfc{invcos}, \mfc{invtan}. The exponential and hyperbolic functions: \mfc{exp}, -\mfc{sinh}, \mfc{cosh}, \mfc{tanh}, and their inverses \mfc{ln} (or -\mfc{log}), \mfc{asinh}, \mfc{acosh}, and \mfc{atanh} are also defined. +\mfc{sinh}, \mfc{cosh}, \mfc{tanh}, \mfc{coth}, \mfc{sech}, and +\mfc{csch}; and some of their inverses: \mfc{ln} (or \mfc{log}), +\mfc{asinh}, \mfc{acosh}, and \mfc{atanh} are also defined. + +There are also two conversion functions: \gbc{radians(t)} produces the +number of radians in \mfc{t} degrees and \gbc{degrees(t)} produces the +number of degrees in \mfc{t} radians. In these expressions the special +variable \gbc{pi} produces $\pi$, accurate to roughly 5 decimals. +(\CMF{} and \MP{} provide accuracy only to $\pm2^{-17} = \pm +.76\times10^{-5}$.) -\subsubsection{Plotting Functions}\label{plotting} +The integer functions \gbc{gcd(m,n)} and \gbc{lcm(n,m)} produce the +greatest common divisor and least common multiple of two integers +\gbc{m} and \gbc{n}. + + +\subsection{Plotting functions}\label{plotting} The plotting macros take two or more arguments. They have an optional first argument, \meta{spec}, which determines whether a function is @@ -2228,86 +3079,112 @@ steps, then round$((\meta{max}-\meta{min})/\meta{step})$ equal steps are used. One may have to experiment with the size of \meta{step}, since \MF{} merely connects the points corresponding to these steps with what \emph{it} considers to be a smooth curve. Smaller \meta{step} gives -better accuracy, but too small may cause the curve to exceed \MF's +better accuracy, but too small may cause the curve to exceed \MF{}'s capacity or slow down its processing. Increasing the tension may help keep the curve in line, but at the expense of reduced smoothness. There are one or more subsequent arguments, each of which is a \MF{} -function or expression as described above. +function or expression as described above. All the macros are figure +macros, defining a path to which prefixes may be applied. -\begin{cd} +\begin{cd}\pagelabel{function} \cs{function}\oarg{\meta{spec}}\marg{\meta{$x_{\mathrm{min}}$},% \meta{$x_{\mathrm{max}}$},\meta{$\Delta x$}}% \marg{$f(\mathtt{x})$}% \index{function@\cs{function}} \end{cd} -Plots $f(\mathtt{x})$, a \MF{} numeric function or expression of one -numeric argument, which must be denoted by a literal \texttt{x}. The -default \meta{spec} is \texttt{s}. For example -\begin{ex} -\cs{function}\marg{0,pi,pi/10}\marg{sin x} -\end{ex} +This figure macro produces the graph of $y = f(x)$, where $f$ is a \MF{} numeric +function or expression of one numeric argument, which must be denoted by +a literal \texttt{x}. The default \meta{spec} is \texttt{s}. For example +\begin{verbatim} +\function{0,pi,pi/10}{sin x} +\end{verbatim} draws the graph of $\sin x$ between 0 and $\pi$. -\begin{cd} +\begin{cd}\pagelabel{parafcn} \cs{parafcn}\oarg{\meta{spec}}\marg{\meta{$t_{\mathrm{min}}$},% \meta{$t_{\mathrm{max}}$},\meta{$\Delta t$}}% - \marg{\meta{pfcn}}% + \marg{($x(\mathtt{t}), y(\mathtt{t})$)}\\ +\cs{parafcn}\oarg{\meta{spec}}\marg{\meta{$t_{\mathrm{min}}$},% + \meta{$t_{\mathrm{max}}$},\meta{$\Delta t$}}% + \marg{\meta{pair-fcn}}% \index{parafcn@\cs{parafcn}} \end{cd} -Plots the parametric path determined by \meta{pfcn}, where \meta{pfcn} -is a \MF{} function or expression of one numeric argument \texttt{t}, -returning a \MF{} \emph{pair}. Or a pair of numeric expressions -$(x(\mathtt{t}),y(\mathtt{t}))$ enclosed in parentheses and separated by -a comma. The default \meta{spec} is \texttt{s}. For example -\begin{ex} -\cs{parafcn}\marg{0,1,.1}\marg{(2t, t + t*t)} -\end{ex} +This figure macro produces the parametric path determined by the last +argument. This can be a pair of expressions $x(\mathtt{t})$ and +$y(\mathtt{t})$ enclosed in parentheses and separated by a comma, with +the literal variable \texttt{t}. Alternatively, the last argument can be +a \MF{} function or expression in \texttt{t} that returns a pair.% + \footnote{There are very few of these. \CMF{} provides \mfc{dir t}, + which is essentially \mfc{(cosd t, sind t)}. \Mfp{} adds \gbc{cis + t}, which is the radian version \mfc{(cos t, sin t)}.} +The default \meta{spec} is \texttt{s}. For example +\begin{verbatim} +\parafcn{0,1,.1}{(2t, t+t*t)} +\end{verbatim} plots a smooth parabola from $(0,0)$ to $(2,2)$. -\begin{cd} +\begin{cd}\pagelabel{plrfcn} \cs{plrfcn}\oarg{\meta{spec}}\marg{\meta{$\theta_{\mathrm{min}}$},% \meta{$\theta_{\mathrm{max}}$},\meta{$\Delta\theta$}}% \marg{$f(\mathtt{t})$}% \index{plrfcn@\cs{plrfcn}} \end{cd} -Plots the polar function determined by $r=f(\theta)$, where $f$ is a -\MF{} numeric function or expression of one numeric argument, and -$\theta$ varies from \meta{$\theta_{\mathrm{min}}$} to -\meta{$\theta_{\mathrm{max}}$} in steps of \meta{$\Delta\theta$}. Each -$\theta$ value is interpreted as an angle measured in \emph{degrees}. In -the expression $f(\mathtt{t})$, the unknown \texttt{t} stands for -$\theta$. The default \meta{spec} is \texttt{s}. For example -\begin{ex} -\cs{plrfcn}\marg{0,90,5}\marg{sind (2t)} -\end{ex} -draws one loop of a 4-petal rosette. If one needs radian measures, use -something like the following. -\begin{ex} -\cs{plrfcn}\marg{0,pi*radian,pi*radian/18}\marg{sin (2t/radian)} -\end{ex} +This figure macro produces the graph of the polar coordinate equation +$r=f(\theta)$, where $f$ is a \MF{} numeric function or expression of +one numeric argument, and $\theta$ varies from +\meta{$\theta_{\mathrm{min}}$} to \meta{$\theta_{\mathrm{max}}$} in +steps of \meta{$\Delta\theta$}. Each $\theta$ value is interpreted as an +angle measured in \emph{degrees}. In the expression $f(\mathtt{t})$, the +unknown \texttt{t} stands for $\theta$. The default \meta{spec} is +\texttt{s}. For example +\begin{verbatim} +\plrfcn{0,90,5}{sind (2t)} +\end{verbatim} +draws one loop of a 4-petal rosette. Note that this function demands the +variable \mfc{t} be in degrees. The range and step size must be in +degrees and the function must operate on the numeric variable \gbc{t} in +degrees. If one needs to measure angles in radians, use the conversion +functions \gbc{degrees()} and \gbc{radians()}, as follows: +\begin{verbatim} +\plrfcn{0,degrees(pi/2),degrees(pi/36)}{sin (radians(2t))} +\end{verbatim} -\begin{cd} -\cs{btwnfcn}\oarg{\meta{spec}}\marg{\meta{$x_{\mathrm{min}}$},\meta{$x_{\mathrm{max}}$},\meta{$\Delta x$}}% - \marg{$f(\mathtt{x})$}\marg{$g(\mathtt{x})$}% -\index{btwnfcn@\cs{btwnfcn}} -\end{cd} - -Draws the region between the two functions $f(x)$ and $g(x)$, these -being numeric functions of one numeric argument \texttt{x}. The region is -bounded also by the vertical lines at \meta{$x_{\mathrm{min}}$} and \meta{$x_{\mathrm{max}}$}. -Unlike the previous function macros, the default \meta{spec} is -\texttt{p}---this macro is intended to be used for shading between drawn -functions, a task for which smoothness is usually unnecessary. -For example -\begin{ex} -\cs{shade}\cs{btwnfcn}\marg{0,180,5}\marg{0}\marg{sind x} -\end{ex} -shades the area between first crest of a sine wave and the x-axis. +\begin{cd}\pagelabel{btwnfcn} +\cs{btwnfcn}\oarg{\meta{spec}}\marg{\meta{$x_{\mathrm{min}}$},% + \meta{$x_{\mathrm{max}}$},\meta{$\Delta x$}}% + \marg{$f(\mathtt{x})$}\marg{$g(\mathtt{x})$}\\ +\cs{btwnplrfcn}\oarg{\meta{spec}}\marg{\meta{$\theta_{\mathrm{min}}$},% + \meta{$\theta_{\mathrm{max}}$},\meta{$\Delta \theta$}}% + \marg{$f(\mathtt{t})$}\marg{$g(\mathtt{t})$}% +\index{btwnfcn@\cs{btwnfcn}}% +\index{btwnplrfcn@\cs{btwnplrfcn}} +\end{cd} + +These are figure macros. The first one produces a closed path +surrounding the region between the graphs of the two functions. The +second one does the same for two polar functions. That is (in both +cases), the path follows the first function (in order or increasing $x$ +or $\theta$), thence along the straight line to the \emph{end} of the +second one, thence backwards along the second function (decreasing $x$ +or $\theta$) and finally along the straight line to the start. The last +two mandatory arguments, the functions, are specified exactly as in +\cs{function} and \cs{plrfcn}, being numeric functions of one numeric +argument \texttt{x} or \texttt{t}. Unlike the previous function macros, +the default \meta{spec} is \texttt{p}---these macros are intended to be +used for shading between drawn functions, a task for which smoothness is +usually unnecessary. For example, the first line below +\begin{verbatim} +\shade\btwnfcn{0,1,.1}{0}{x - x**2} +\btwnplrfcn[s]{-30,30,5}{1}{2*cosd 2t} +\end{verbatim} +shades the area between the $x$-axis and the given parabola. The second +draws the boundary of the region between the circle $r = 1$ and one loop +of the rosette $r = 2\cos 2\theta$. Note: the effect of \cs{btwnfcn} could also be accomplished with \begin{ex} @@ -2318,34 +3195,104 @@ Note: the effect of \cs{btwnfcn} could also be accomplished with \meta{$x_{\mathrm{max}}$},\meta{$\Delta x$}}\marg{$g(\mathtt{x})$}\\ \cs{endconnect} \end{ex} - -\begin{cd} +\cs{lclosed} was described in subsection~\ref{closure} and the +\cs{connect}\dots\cs{endconnect} pair was described in +subsection~\ref{reversal}. + +\begin{cd}\pagelabel{belowfcn} +\cs{belowfcn}\oarg{\meta{spec}}% + \marg{\meta{$x_{\mathrm{min}}$},\meta{$x_{\mathrm{max}}$},% + \meta{$\Delta x$}}\marg{$f(\mathtt{x})$}\\ \cs{plrregion}\oarg{\meta{spec}}% \marg{\meta{$\theta_{\mathrm{min}}$},\meta{$\theta_{\mathrm{max}}$},% \meta{$\Delta\theta$}}\marg{$f(\mathtt{t})$}% +\index{belowfcn@\cs{belowfcn}}% \index{plrregion@\cs{plrregion}} \end{cd} -Plots the polar region determined by $r=f(\theta)$, where $f$ is a \MF{} -numeric function of one numeric argument \texttt{t}. The $\theta$ -values are angles (measured in \emph{degrees}), varying from -\meta{$\theta_{\mathrm{min}}$} to \meta{$\theta_{\mathrm{max}}$} in -steps of \meta{$\Delta\theta$}. In the expression $f(\mathtt{t})$, the -\texttt{t} stands for $\theta$. The region is also bounded by the angles -\meta{$\theta_{\mathrm{min}}$} and \meta{$\theta_{\mathrm{max}}$}, i.e. -by the line segments joining the origin to the endpoints of the -function. The default \meta{spec} is \texttt{p} ---this macro is -intended to be used for shading a region with the boundary drawn, a task -for which smoothness is usually unnecessary. For example -\begin{ex} -\cs{shade}\cs{plrregion}\marg{0,90,5}\marg{sind (2t)} -\end{ex} -shades one loop of the 4-petal rosette. - - -\subsubsection{Plotting external data files}\label{external} - -\begin{cd} +These figure macros produce identical results to \cs{btwnfcn} and +\cs{btwnplrfcn} when the first function is just $0$. They are, however, +much more efficient. The first of these, \cs{belowfcn}, produces the +path surrounding the region bounded by the $x$-axis, the graph of +$y=f(x)$ and the two vertical lines $x=x_{\mathrm{min}}$ and $x = +x_{\mathrm{max}}$. (The region is not actually \emph{below} $y = f(x)$ +unless $f(x) \ge 0$ throughout the interval.) The second produces the +path surrounding the region bounded by the polar function $r = +f(\theta)$ and the two rays $\theta=\theta_{\mathrm{min}}$ and +$\theta=\theta_{\mathrm{max}}$. + +The arguments of these command are the same as the nonclosed versions, +\cs{function} and \cs{plrfcn}, except the default for the optional +agument is \texttt{[p]}. Again, this is because it is mainly for +shading. However, drawing the boundary is often needed: +\begin{verbatim} +\shade\plrregion{0,90,5}{sind (2t)} +\plrregion[s]{0,90,5}{sind (2t)} +\end{verbatim} +shades one loop of the 4-petal rosette, and then draws it.. + +\begin{cd}\pagelabel{levelcurve} +\cs{levelcurve}\oarg{\meta{spec}}\marg{\meta{seed},\meta{step}} + \marg{\meta{inequality}}% +\index{levelcurve@\cs{levelcurve}} +\end{cd} + +This figure macro produces a level curve of some function $F(x,y)$. +There are three requirements on the parameters for this to work +correctly. First, in order to obtain the curve satisfying $F(x,y) = C$, +the \marg{\meta{inequality}} must be either \verb${F(x,y) > C}$ or +\verb${F(x,y) < C}$.% + \footnote{A non-strict inequality such as \mfc{>=} can be + used, but the result will not be significantly different.} +Second, the level curve must surround the point given by the \meta{seed} +paramter, and third, the inequality must be true at this seed point. + +The command works by searching rightward from \meta{seed} until it +encounters the first point on the level curve. It then tries to find a +nearby point on the level curve and joins it to the first one, and +continues similarly until it finds it has returned near the starting +point. The meaning of ``nearby point on the level curve'' is the +intersection of the level curve with a circle of radius \meta{step} +centered at the previously found point. If the region defined by the +inequality extends beyond the bounds of the picture (as set by the +\cs{mfpic} command), the region is truncated and the resulting curve +will follow along the picture's border. + +Since the algorithm only approximates the level set, a tolerance (how +close the points are to actually being \emph{on} the level curve) is +chosen which gives two decimal places more accuracy than \meta{step}. +The value of \meta{step} is interpreted in \emph{graph} units and +so should be a pure number. The \oarg{\meta{spec}} is either \oarg{p}, +in which case the calculated points are joined with straight lines, or +\oarg{s\meta{tension}} as in \cs{function}. The default is +\oarg{s}: a smooth curve with the current default tension. + +In general, choosing a \meta{step} that corresponds to a few millimeters +works reasonably well. For example, if the graph unit is 1cm (for +example, \cs{mfpicunit=1cm} and no scaling is used), then +\meta{step}${}= 0.5$ might be a reasonable first choice. If the level +set is reasonably smooth and \oarg{s} is used, then the result will +match the actual curve to within .005cm, which is approximately .14pt, +which is less than half the thickness of the standard pen used to draw +it. If you \emph{only} intend to fill it, you might want a little more +accuracy. There is a lower limit: there should not be +more than 2000 steps in the curve. In a figure 10-by-10 graph units, a +level curve without too much oscillation could be about 80 units in +length and a step size of .04 would produce about 2000 steps. + +As a special case, if \meta{step} is 0, the maximum of width and height +of the figure (as given by the arguments to the \env{mfpic} environment) +is divided by 100. For example, in a 5-by-10 graph, giving a step size +of $0$ will actually select \meta{step}${}= 10/100 = 0.1$. + +The algorithm used will produce incorrect results if parts of the curve +that are distant (as measured \emph{along} the curve) are closer than +\meta{step} in actual distance. + + +\subsection{Plotting external data files}\label{external} + +\begin{cd}\pagelabel{datafile} \cs{datafile}\oarg{\meta{spec}}\marg{\meta{file}}\\ \cs{smoothdata}\oarg{\meta{tension}}\\ \cs{unsmoothdata}% @@ -2354,20 +3301,20 @@ shades one loop of the 4-petal rosette. \index{unsmoothdata@\cs{unsmoothdata}} \end{cd} -\cs{datafile} defines a curve connecting the points listed in the file -\meta{file}. (The context makes it clear whether this meaning of -\cs{datafile} or that of subsection~\ref{list} is meant.) The +The figure macro \cs{datafile} produces a curve connecting the points +listed in the file \meta{file}. (The context makes it clear whether this +meaning of \cs{datafile} or that of subsection~\ref{list} is meant.) The \meta{spec} may be \texttt{p} to produce a polygonal path, or \texttt{s} followed by a tension value (as in \cs{curve}) to produce a smooth path. If no \meta{spec} is given, the default is initially \texttt{p}, but \cs{smoothdata} may be used to change this. Thus, after the command -\cs{smoothdata}\oarg{\meta{tension}} the default \meta{spec} is changed -to \texttt{s\meta{tension}}. If the tension parameter is not supplied it -defaults to \mfc{1.0} (or the value set by the \cs{settension} command -if one has been used). +\cs{smoothdata}\oarg{\meta{tension}} the default \oarg{\meta{spec}} is +changed to \oarg{s\meta{tension}}. If the tension parameter is not +supplied it defaults to \mfc{1.0} (or the value set by the +\cs{settension} command if one has been used). -The command \cs{unsmoothdata} restores the default \meta{spec} to -\texttt{p}. +The command \cs{unsmoothdata} restores the default \oarg{\meta{spec}} to +\oarg{p}. By default, each non-blank line in the file is assumed to contain at least two numbers, separated by whitespace (blanks or tabs). The first @@ -2389,30 +3336,32 @@ external data file. For example, if a file \file{ptlist.dat} contains two or more numerical values per line separated by whitespace, then one can draw a dot at each of the points corresponding to the first pair of numbers on each line with the following. -\begin{ex} - \cs{point}\cs{datafile}\marg{ptlist.dat} -\end{ex} +\begin{verbatim} +\point\datafile{ptlist.dat} +\end{verbatim} In fact there is no essential difference between `\cs{datafile}\oarg{p}' and `\cs{polyline}\cs{datafile}', and no difference between `\cs{datafile}\oarg{s}' and `\cs{curve}\cs{datafile}'. - -Here is the full list of \mfp{} macros that allow this usage of -\cs{datafile}\index{datafile@\cs{datafile}}: - - \begin{raggedright} +Here is the full list (omitting aliases) of \mfp{} macros that allow +this usage of \cs{datafile}\index{datafile@\cs{datafile}}: \begin{itemize} -\item Numeric data: \cs{piechart}, \cs{barchart}, \cs{numericarray}, and +\raggedright +\item Numeric data: \cs{piechart}, \cs{barchart}, \cs{numericarray}, + \cs{dashpattern} and all the axis marks commands. -\item Point or vector data: \cs{point}, \cs{plotsymbol}, \cs{polyline}, - \cs{polygon}, \cs{fcncurve}, \cs{curve}, \cs{cyclic}, \cs{turtle}, - \cs{qspline}, \cs{closedqspline}, \cs{cspline}, \cs{closedcspline}, - \cs{mfbezier}, \cs{closedmfbezier}, \cs{qbeziers}, - \cs{closedqbeziers}, and \cs{pairarray}. +\item Point or vector data: + \cs{closedcomputedspline}, \cs{closedcspline}, \cs{closedmfbezier}, + \cs{closedqbeziers}, \cs{closedqspline}, \cs{computedspline}, + \cs{convexcurve}, \cs{convexcyclic}, \cs{cspline}, \cs{curve}, + \cs{cyclic}, \cs{fcncurve}, \cs{fcnspline}, \cs{mfbezier}, + \cs{pairarray}, \cs{periodicfcnspline}, \cs{plotsymbol}, \cs{point}, + \cs{polygon}, \cs{polyline}, \cs{putmfpimage} \cs{qbeziers}, \cs{qspline}, + \cs{turtle}, and \cs{pairarray}. \end{itemize} +In addition, \cs{setmfarray} and \cs{globalsetarray} can be used with +either numeric or pair data. - \end{raggedright} - -\begin{cd} +\begin{cd}\pagelabel{mfpdatacomment} \cs{mfpdatacomment}\cs{}\meta{char}% \index{mfpdatacomment@\cs{mfpdatacomment}} \end{cd} @@ -2421,7 +3370,7 @@ Changes \meta{char} to a comment character and changes the usual \TeX{} comment character \texttt{\%} to an ordinary character \emph{while reading a datafile for drawing}. -\begin{cd} +\begin{cd}\pagelabel{using} \cs{using}\marg{\meta{in-pattern}}\marg{\meta{out-pattern}}% \index{using@\cs{using}} \end{cd} @@ -2439,19 +3388,19 @@ curve. \CMF{} pair expressions can be used in the output portion of \cs{using}. For example \cs{using}\marg{\#1,\#2,\#3}\marg{(\#2,\#1)/10} or even \cs{using}\marg{\#1 \#2 \#3}\marg{polar(\#1,\#2)} if the data are polar coordinates. The default assumptions of the \cs{datafile} -command (i.e., space separated numbers, the first two determining each -point) correspond to the setting -\begin{ex} -\cs{using}\marg{\#1 \#2 \#3}\marg{(\#1,\#2)} -\end{ex} +command (numbers separated by spaces, with the first two determining the +$(x,y)$ pair) corresponds to the following setting. +\begin{verbatim} +\using{#1 #2 #3}{(#1,#2)} +\end{verbatim} The \cs{using} command cannot normally be used in the replacement text of another command. Or rather, it can be so used, but then each \texttt{\#} has to be doubled. If a \cs{using} declaration occurs in an \env{mfpic} environment it is local to that environment. Otherwise it affects all subsequent ones. -\begin{cd} -\cs{sequence}\index{sequence@\cs{sequence}} +\begin{cd}\pagelabel{sequence} +\cs{sequence}% \index{sequence@\cs{sequence}} \end{cd} @@ -2461,26 +3410,26 @@ position, with something like \cs{sequence} will take on the values \texttt{1}, \texttt{2}, etc. as lines are read from the file. -\begin{cd} +\begin{cd}\pagelabel{usingpairdefault} \cs{usingpairdefault}\\ \cs{usingnumericdefault}% \index{usingpairdefault@\cs{usingpairdefault}}% \index{usingnumericdefault@\cs{usingnumericdefault}} \end{cd} -The command \cs{usingpairdefault} restores the above default for pair -data. The command \cs{usingnumericdefault} is the equivalent of -\cs{using}\marg{\#1 \#2}\marg{\#1}. +The command \cs{usingpairdefault} restores the above described default +for pair data. The command \cs{usingnumericdefault} is the equivalent of +\cs{using}\marg{\#1 \#2}\marg{\#1}, a useful default for numeric data. Note that the default value of \cs{using} appears to reference three arguments. If there are only two numbers on a line separated by -whitespace, this will still work because of \TeX's argument matching -rules. \TeX's file reading mechanism normally converts the EOL to a +whitespace, this will still work because of \TeX{}'s argument matching +rules. \TeX{}'s file reading mechanism normally converts the EOL to a space, but there are exceptions so \mfp{} internally adds a space at the end of each line read in to be on the safe side. Then the default definition of \cs{using} reads everything up to the first space as \texttt{\#1} (whitespace is normally compressed to a single space by -\TeX's reading mechanism), then everything to the second space (the one +\TeX{}'s reading mechanism), then everything to the second space (the one added at the end of the line, perhaps) is \texttt{\#2}, then everything to the EOL is \texttt{\#3}. This might assign an empty argument to \texttt{\#3}, but it is discarded anyway. @@ -2489,28 +3438,36 @@ If the numerical data contain percentages with explicit \texttt{\%} signs, then choose another comment character with \cs{mfpdatacomment}. This will change \texttt{\%} to an ordinary character \emph{in the data file}. However, in your \cs{using} command it would still be read as a comment. -The following example shows how to overcome this: +The following allows one to overcome this. + +\begin{cd}\pagelabel{makepercentother} +\cs{makepercentother}\\ +\cs{makepercentcomment}% +\index{makepercentother@\cs{makepercentother}}% +\index{makepercentcomment@\cs{makepercentcomment}} +\end{cd} + +Here is an example or their use: \begin{verbatim} - \makepercentother - \using{#1% #2 #3}{(#1/100,#2)} - \makepercentcomment +\makepercentother +\using{#1% #2 #3}{(#1/100,#2)} +\makepercentcomment \end{verbatim} - -Here\index{makepercentother@\cs{makepercentother}}% -\index{makepercentcomment@\cs{makepercentcomment}} -is an analysis of the meaning of this example: everything in a line, up -to the first percent followed by a space is assigned to parameter -\texttt{\#1}, everything from there to the next space is assigned to -\texttt{\#2} and the rest of the line (which may be empty) is -\texttt{\#3}. On the output side in the above example, the percentage is -divided by 100 to convert it to a fraction, and plotted against the +Here is an analysis of the meaning of this example: everything in a +line, up to the first percent followed by a space is assigned to +parameter \texttt{\#1}, everything from there to the next space is +assigned to \texttt{\#2} and the rest of the line (which may be empty) +is \texttt{\#3}. On the output side in the above example, the percentage +is divided by 100 to convert it to a fraction, and plotted against the second parameter. Note: normal comments should not be used between \cs{makepercentother} and \cs{makepercentcomment}, for obvious reasons. +Moreover, the above construction will fail inside the argument of +another command. -\begin{cd} - \cs{plotdata}\oarg{\meta{spec}}\marg{\meta{file}}% - \index{plotdata@\cs{plotdata}} +\begin{cd}\pagelabel{plotdata} +\cs{plotdata}\oarg{\meta{spec}}\marg{\meta{file}}% +\index{plotdata@\cs{plotdata}} \end{cd} This plots several curves from a single file. The \meta{spec} and the @@ -2527,7 +3484,7 @@ etc., through a total of six different line types. A \cs{gendashed} command is used with predefined dash patterns named \mfc{dashtype0} through \mfc{dashtype5}. This behavior can be changed with: -\begin{cd} +\begin{cd}\pagelabel{coloredlines} \cs{coloredlines}\\ \cs{pointedlines}\\ \cs{datapointsonly}\\ @@ -2538,20 +3495,29 @@ through \mfc{dashtype5}. This behavior can be changed with: \index{dashedlines@\cs{dashedlines}} \end{cd} -The command \cs{coloredlines} changes to cycling through eight different -colors starting with black (hey, black is a color too). This has an -effect only for \MP. The sole exception to the general rule that all -curves are drawn in \gbc{drawcolor} is the \cs{plotdata} command after -\cs{coloredlines} has been issued. The command \cs{pointedlines} causes -\cs{plotdata} to use \cs{plot} commands, cycling through nine symbols. -The command \cs{datapointsonly} causes \cs{plotdata} to use -\cs{plotnodes}\marg{\meta{symbol}} commands to plot the data points -only. (See the Appendix for more details.) The command \cs{dashedlines} -restores the default. If, for some reason, you do not like the default -starting line style (say you want to start with a color other than -black), you can use one of the following commands. - -\begin{cd} +The command \cs{coloredlines} causes \cs{plotdata} to use the rendering +command \cs{draw} with a color option that cycles through eight +different colors starting with black (hey! black is a color too). The +command \cs{pointedlines} causes \cs{plotdata} to use the rendering +command \cs{plot}, cycling through nine symbols. The command +\cs{datapointsonly} causes \cs{plotdata} to use the rendering command +\cs{plotnodes}, cycling through the same nine symbols. The data points +become the nodes of the paths created and so only the data points are +plotted. The command \cs{dashedlines} restores the default. See +appendix~\ref{styles} for the details on the actual dash patterns, +colors and symbols used. + +The command \cs{coloredlines} will produce a warning under the +\opt{metafont} option and substitute \cs{dashedlines}. Under the +\opt{metapost} option, this is the sole exception to the general rule +that all curves are drawn in \gbc{drawcolor} by default: the +\cs{plotdata} command after \cs{coloredlines} has been issued. + +If, for some reason, you do not like the default starting line style +(say you want to start with a color other than black), you can use one +of the following commands. + +\begin{cd}\pagelabel{mfplinetype} \cs{mfplinetype}\marg{\meta{num}}, or\\ \cs{mfplinestyle}\marg{\meta{num}}% \index{mfplinetype@\cs{mfplinetype}}% @@ -2566,23 +3532,23 @@ $0$. If two or more \cs{plotdata} commands are used in the same \env{mfpic} environment, the numbering in each continues where the one before left off (unless you issue one of the commands above in between). \cs{mfplinestyle} means the same as \cs{mfplinetype}, and is included -for compatibility. See the Appendix to find out what dash pattern, +for compatibility. See appendix~\ref{styles} to find out what dash pattern, color or symbol corresponds to each number by default. The commands -below can be used to change the default dashess, colors, or symbols. +below can be used to change the default dashes, colors, or symbols. -\begin{cd} +\begin{cd}\pagelabel{reconfigureplot} \cs{reconfigureplot}\marg{dashes}\marg{\meta{pat$_1$},\dots,\meta{pat$_n$}}\\ \cs{reconfigureplot}\marg{colors}\marg{\meta{clr$_1$},\dots,\meta{clr$_n$}}\\ \cs{reconfigureplot}\marg{symbols}\marg{\meta{symb$_1$},\dots,\meta{symb$_n$}}% \index{reconfigureplot@\cs{reconfigureplot}} \end{cd} -The first argument of \cs{reconfigureplot} is the rendering method to -change: \texttt{dashes}, \texttt{colors}, or \texttt{symbols}. The +The first argument of \cs{reconfigureplot} is the rendering method to be +changed: \texttt{dashes}, \texttt{colors}, or \texttt{symbols}. The second argument is a list of dash patterns, colors, or symbols. The dash patterns should be names of patterns defined through the use of \cs{dashpattern}. The colors can be any color names already known to -\MP, or defined through \cs{mfpdefinecolor}. The symbols can be any of +\MP{}, or defined through \cs{mfpdefinecolor}. The symbols can be any of those listed with the \cs{plotsymbol} command (see subsection~\ref{points}), or any known \MF{} path variable. The colors can also be \MP{} expressions of type color, and the symbols can be @@ -2590,7 +3556,12 @@ expressions of type path. Within a \env{mfpic} environment, the changes made are local to that environment. Outside, they affect all subsequent environments. -\begin{cd} +Using \cs{reconfigureplot}\marg{colors} under the \opt{metafont} option +will have no effect, but may produce an error from \MF{} unless the +colors used conform to the guidelines in subsection~\ref{MFcolor}. +This also holds for \cs{defaultplot}\marg{colors} (below). + +\begin{cd}\pagelabel{defaultplot} \cs{defaultplot}\marg{dashes}\\ \cs{defaultplot}\marg{colors}\\ \cs{defaultplot}\marg{symbols} @@ -2605,51 +3576,55 @@ same meaning here (for \cs{plotdata}) as they do for \cs{datafile} (above). The sequence numbering for \cs{sequence} starts over with each new curve. -\subsection{Labels and Captions.}\label{labels} +\section{Labels and Captions.}\label{labels} -\subsubsection{Setting Text.}\label{text} +\subsection{Setting text}\label{text} If option \opt{metafont} is in effect macros \cs{tlabel}, \cs{tlabels}, \cs{axislabels} and \cs{tcaption} do not affect the \MF{} file -(\file{\meta{file}.mf}) at all, but are added to the picture by \TeX. If +(\file{\meta{file}.mf}) at all, but are added to the picture by \TeX{}. If \opt{metapost} is in effect but \opt{mplabels} is not, they do not affect the \MP{} file. In these cases, if these macros are the only changes or additions to your document, there is no need to repeat the processing with \MF{} or \MP{} nor the reprocessing with \TeX{} in order to complete your \TeX{} document. -\begin{cd} +\begin{cd}\pagelabel{tlabel} \cs{tlabel}\oarg{\meta{just}}\parg{\meta{x},\meta{y}}\marg{\meta{labeltext}}\\ \cs{tlabel}\oarg{\meta{just}}\marg{\meta{pair-list}}\marg{\meta{label text}}\\ \cs{tlabels}\marg{\meta{params$_1$} \meta{params$_2$} $\ldots$}% -\index{tlabel@\cs{tlabel}}\index{tlabels@\cs{tlabels}} +\index{tlabel@\cs{tlabel}}% +\index{tlabels@\cs{tlabels}} \end{cd} -Places \TeX{} labels on the graph. (Not to be confused with \LaTeX's -\cs{label} command.) The special form \cs{tlabels} (note the plural) -essentially just applies \cs{tlabel} to each set of parameters listed in -its argument. That is, each \meta{params$_k$} is a valid set of -parameters for a \cs{tlabel} command. These can be separated by spaces, -newlines, or nothing at all. They should \emph{not} be separated by -blank lines. +These place \TeX{} text or math on the graph. The special form +\cs{tlabels} (note the plural) essentially just applies \cs{tlabel} to +each set of parameters listed in its argument. That is, each +\meta{params$_k$} is a valid set of parameters for a \cs{tlabel} +command. These can be separated by spaces, newlines, or nothing at all. +They should \emph{not} be separated by blank lines. The last required parameter is ordinary \TeX{} text. The pair \parg{\meta{x},\meta{y}} gives the coordinates of a point in the graph -where the text will be placed. It may optionally be enclosed in braces. -In fact, the second syntax may be used if \opt{mplabels} is in effect, -where \meta{pair-list} is any expression recognized as a pair by \MP, or -a comma-separated list of such pairs. +where the text will be placed. It may optionally be enclosed in braces, +\verb${$ and \verb$}$. If braces are used, any number of coordinate +pairs may be listed, separated by commas. This is what is meant by +\meta{pair-list} in the above syntax. If \opt{mplabels} is in effect, +the \meta{pair-list} can be any list of expressions recognized as a pair +by \MP{}. The optional parameter \oarg{\meta{just}} specifies the \emph{justification}, the relative placement of the label with respect -to the point \parg{\meta{x},\meta{y}}. It is a two-character sequence -where the first character is one of \texttt{t} (top), \texttt{c} (center), -\texttt{b} (bottom), or \texttt{B} (Baseline), to specify vertical placement, -and the second character is one of \texttt{l} (left), \texttt{c} (center), or -\texttt{r} (right), to specify horizontal placement. These letters specify -what part of the \emph{text} is to be placed at the given point, so -\texttt{r} puts the right end of the text there---which means the text will be -left of the point. The default justification is \oarg{Bl}. +to the point with coordinates \parg{\meta{x},\meta{y}}. It is a +two-character sequence in which the first character is one of \texttt{t} +(top), \texttt{c} (center), \texttt{b} (bottom), or \texttt{B} +(Baseline), to specify vertical placement, and the second character is +one of \texttt{l} (left), \texttt{c} (center), or \texttt{r} (right), to +specify horizontal placement. These letters specify what part of the +\emph{text} is to be placed at the given point, so \texttt{r} puts the +right end of the text there---which means the text will be left of the +point. The default justification is \oarg{Bl}: the left end of the +baseline of the text is placed at the coordinates. When \opt{mplabels} is in effect, the two characters may optionally be followed by a number, specifying an angle in degrees to rotate the text @@ -2673,7 +3648,7 @@ very rudimentary feature. By default it left justifies the lines and causes \cs{tlabel} to redefine \bbsl. One can center a line by putting \cs{hfil} as the first thing in the line, and right justify by putting \cs{hfill} there (these are \TeX{} primitives). Redefining \bbsl{} can -interfere with \LaTeX's definition. For better control in \LaTeX{} use +interfere with \LaTeX{}'s definition. For better control in \LaTeX{} use \cs{shortstack} inside the label (or a \env{tabular} environment or some other environment which always initializes \bbsl{} with its own definition). @@ -2687,41 +3662,48 @@ If the \opt{mplabels} option is in effect, \cs{tlabel} will write a \mfc{btex $\ldots$ etex} group to the output file, allowing \MP{} to arrange for typesetting the label. Normally, the label becomes part of the picture, rather than being laid on top of it, and can be covered up -by any filling macros that follow, or clipped off by \cs{gclear} or -\cs{gclip}. However, under the \opt{overlaylabels} option (or after the -command \cs{overlaylabels}), labels are saved and added to the picture -at the very end. This may prevent some special effects, but it makes the +by any filling macros that follow, or clipped off by \cs{gclip}. +However, under the \opt{overlaylabels} option (or after the command +\cs{overlaylabels}), labels are saved and added to the picture at the +very end. This may prevent some special effects, but it makes the behavior of labels much more consistent through all the 12 permissable settings of the options \opt{metapost}, \opt{mplabels}, \opt{clip}, and \opt{truebbox}. -\begin{cd} -\cs{everytlabel}\marg{\meta{\TeX-code}}% +There is another command, \cs{startbacktext}, which also save the labels +and adds them later, but \emph{under} the rest of the picture as +background text. Thus, they will not be clipped, but may be covered up. +Since erasing regions with \cs{gclear} actually covers up those regions +with white, labels saved as background text may appear to have portions +erased. + +\begin{cd}\pagelabel{everytlabel} +\cs{everytlabel}\marg{\meta{\TeX{}-code}}% \index{everytlabel@\cs{everytlabel}} \end{cd} -One problem with multi-line \cs{tlabel}s is that each line of their +One problem with multiline \cs{tlabel}s is that each line of their contents constitutes a separate group. This makes it difficult to change the \cs{baselineskip} (for example) inside a label. The command \cs{everytlabel} saves it's contents in a token register and the code is issued in each \cs{tlabel}, as the last thing before the actual line(s) of text. Any switch you want to apply to every line can be supplied. For example -\begin{ex} - \cs{everytlabel}\marg{\cs{bf}\cs{baselineskip} 10pt} -\end{ex} +\begin{verbatim} +\everytlabel{\bf\baselineskip 10pt} +\end{verbatim} will make every line of every \cs{tlabel}'s text come out bold with 10 point baselines. The effect of \cs{everytlabel} is local to the -\env{mfpic} environment, if it is issued inside one. Note that the lines -of a tlabel are wrapped in a box, but the commands of \cs{everytlabel} -are outside all of them, so no actual text should be produced by these -commands. +\env{mfpic} environment, if it is issued inside one. Note that each line +of a tlabel is wrapped in a box, but the commands of \cs{everytlabel} +are outside all of them, so no actual text should be produced by the +contents of \cs{everytlabel}. Using \cs{tlabel} without an optional argument is equivalent to specifying \oarg{Bl}. Use the following command to change this behavior. -\begin{cd} +\begin{cd}\pagelabel{tlabeljustify} \cs{tlabeljustify}\marg{\meta{just}}% \index{tlabeljustify@\cs{tlabeljustify}} \end{cd} @@ -2732,35 +3714,47 @@ optional argument will be as specified in this command. For example, commands lacking an optional argument to be placed as if the argument \oarg{cr45} were used in each. If \opt{mplabels} is not in effect at the time of this command, the rotation part will be saved in case that -option is turned on later, but a warning message will be issued. Without -\opt{mplabels}, the rotation is ignored by \cs{tlabel} . +option is turned on later, but a warning message will be issued. If +\opt{mplabels} is not turned on later, that rotation will be ignored by +\cs{tlabel}. -\begin{cd} +\begin{cd}\pagelabel{tlabeloffset} \cs{tlabeloffset}\marg{\meta{hlen}}\marg{\meta{vlen}}\\ +\cs{tlpointsep}\marg{\meta{len}}\\ +\cs{tlpathsep}\marg{\meta{len}}\\ \cs{tlabelsep}\marg{\meta{len}}% \index{tlabeloffset@\cs{tlabeloffset}}% -\index{tlabelsep@\cs{tlabelsep}} +\index{tlabelsep@\cs{tlabelsep}}% +\index{tlpathsep@\cs{tlpathsep}}% +\index{tlpointsep@\cs{tlpointsep}} \end{cd} The first command causes all subsequent \cs{tlabel} commands to shift the label right by \meta{hlen} and up by \meta{vlen} (negative lengths cause it to be shifted left and down, respectively). -The \cs{tlabelsep} command causes labels to be shifted by the given +The \cs{tlpointsep} command causes labels to be shifted by the given amount in a direction that depends on the optional positioning parameter. For example, if the first letter is \texttt{t} the label is shifted down by the amount \meta{len} and if the second letter is -\texttt{l} it is also shifted right. In all cases it is shifted \emph{away} from -the point of placement (unless the dimension is negative). If \texttt{c} or -\texttt{B} is the first parameter, no vertical shift takes place, and if -\texttt{c} is the second, there is no horizontal shift. This is intended to -be used in cases where something has been drawn at that particular -point, in order to separate the text from the drawing, but the value is -also written to the output file for use by \cs{tlabelrect} -(subsection~\ref{surrounding}) and related -commands. - -\begin{cd} +\texttt{l} it is also shifted right. In all cases it is shifted +\emph{away} from the point of placement (unless the dimension is +negative). If \texttt{c} or \texttt{B} is the first parameter, no +vertical shift takes place, and if \texttt{c} is the second, there is no +horizontal shift. This is intended to be used in cases where something +has been drawn at that particular point, in order to separate the text +from the drawing. + +Prior to version 0.8, this separation also defined the separation +between the label and those curves designed to frame the label +such as \cs{tlabelrect} (subsection~\ref{surrounding}). Now the two +separations are independent and \cs{tlpathsep} is used to set the +separation between the label and such paths. + +For backward compatability, the command \cs{tlabelsep} is still +available and sets both separations to the same value. + +\begin{cd}\pagelabel{axislabels} \cs{axislabels}\marg{\meta{axis}}\oarg{\meta{just}}% \marg{\marg{\meta{text$_1$}}\meta{$n_1$},% \marg{\meta{text$_2$}}\meta{$n_2$},$\ldots$}% @@ -2771,7 +3765,7 @@ This command places the given \TeX{} text (\meta{text$_k$}) at the given positions (\meta{$n_k$}) on the given axis, \meta{axis}, which must be a single letter and one of \texttt{l}, \texttt{b}, \texttt{r}, \texttt{t}, \texttt{x}, or \texttt{y}. The text is placed as in \cs{tlabels} -(including the taking into account of \cs{tlabelsep} and +(including the taking into account of \cs{tlpointsep} and \cs{tlableoffset}), except that the default justification depends on the axis (the settings of \cs{tlabeljustify} are ignored). In the case of the border axes, the default is to place the label outside the axis and @@ -2784,74 +3778,132 @@ justification parameter. For example, to place the text strings `first', `second' and `third' just below the positions 1, 2 and 3 on the $x$-axis, rotated so they read upwards at a 90 degree angle, one can use \cs{axislabels}\marg{x}\oarg{cr90}\marg{\marg{first}1, -\marg{second}2, \marg{third}3} +\marg{second}2, \marg{third}3}. -\begin{cd} +\begin{cd}\pagelabel{plottext} \cs{plottext}\oarg{\meta{just}}\marg{\meta{text}}\marg{($x_0$,$y_0$), ($x_1$,$y_1$), $\ldots$}% \index{plottext@\cs{plottext}} \end{cd} Similar in effect to \cs{point} and \cs{plotsymbol} (but without -requiring \MF), \cs{plottext} places a copy of \meta{text} at each of -the listed points. It simply issues multiple \cs{tlabel} commands with -the same text and optional parameter, but at the different points -listed. This is intended to plot a set of points with a single letter or -font symbol (instead of a \MF{} generated shape). Like \cs{axislabels}, -this does not respond to the setting of \cs{tlabeljustify}. It has a -default setting of \oarg{cc} if the optional argument is omitted. The -points may be MetaPost pair expressions under \opt{mplabels}, but they -must \emph{not} be individually enclosed in braces. (This requirement is -new with version 0.7; prior to that pairs in braces didn't work reliably -anyway.) This command is actually unnecessary under \opt{mplabels} as -the plain \cs{tlabel} command can then be given a list of points. The -\cs{tlabel} command is more efficient, and \cs{plottext} is converted to -it internally. - -\begin{cd} -\cs{mfpverbtex}\marg{\meta{\TeX-cmds}}% +requiring \MF{}), \cs{plottext} places a copy of \meta{text} at each of +the listed points. Since version 0.9, when \cs{tlabel} was enhanced to +allow lists of points, it is implemented by an equivalent \cs{tlabel} +command and is only kept for backward compatibility. It differs from +\cs{tlabel} when the optional argument is absent: the default +justification is \oarg{cc} regardless of the setting of +\cs{tlabeljustify}. + +\begin{cd}\pagelabel{mfpverbtex} +\cs{mfpverbtex}\marg{\meta{\TeX{}-cmds}}% \index{mfpverbtex@\cs{mfpverbtex}} \end{cd} This writes a \mfc{verbatimtex} block to the \file{.mp} file. It makes -sense only if the \opt{mplabels} option is used and so only for \MP. The -\meta{\TeX-cmds} in the argument are written to the \file{.mp} file, -preceded by the \MP{} command \mfc{verbatimtex} and followed by -\mfc{etex}. Line breaks within the \meta{\TeX-cmd} are preserved. The +sense only if the \opt{mplabels} option is used and so only for \MP{}. +The \meta{\TeX{}-cmds} in the argument are written to the \file{.mp} +file, preceded by the \MP{} command \mfc{verbatimtex} and followed by +\mfc{etex}. Line breaks within the \meta{\TeX{}-cmd} are preserved. The \cs{mfpverbtex} command must come before any \cs{tlabel} that is to be affected by it. Any settings common to all \env{mfpic} environments should be in a \cs{mfpverbtex} command preceding all such environments. It may be issued at any point after \mfp{} is loaded, and any number of -times. If it issued before \cs{opengraphsfile}, its contents are saved -and written by that command. Because of the way \MP{} handles -\mfc{verbatimtex} material, the effects cannot be constrained by any -grouping unless one places \TeX{} grouping commands within -\meta{\TeX-cmds}. - -\begin{cd} +times. If it is issued before \cs{opengraphsfile}, its contents are +saved and written by that command. Therefore, it should occur only once +before the \cs{opengraphsfile} command. + +Because of the way \MP{} handles \mfc{verbatimtex} material, the effects +cannot be constrained by any grouping unless one places \TeX{} grouping +commands within \meta{\TeX{}-cmds}. However, \mfp{} itself places +grouping commands into the output file at the beginning and end of each +picture, so definitions written by a \cs{mfpverbtex} are local to any +picture in which it occurs. Prior to version 0.8, \mfp{} did not write +comments that occured within the \meta{\TeX{}-cmds}. Now they will be +preserved, and can be used to place the `\verb$%&latex$' line that some +\TeX{} distributions permit as a signal that latex should be run to +produce the labels. + +This command attempts a near-verbatim writing of the \meta{\TeX{}-cmds} +and, as with all verbatim-like commands, it should not be used in the +argument of another command. + +\begin{cd}\pagelabel{backtext} +\cs{startbacktext} \dots \cs{stopbacktext}% +\index{startbacktext@\cs{startbacktext}}% +\index{stopbacktext@\cs{stopbacktext}} +\end{cd} + +When \TeX{} adds labels (\cs{nomplabels}) they have to be positioned +either on top of a complete figure, or placed under a complete figure. +The most reasonable choice (and happily the easiest to implement) is to +put them on top. When \MP{} is placing labels (option \opt{mplabel}) the +same can be forced with the option \opt{overlaylabels}, but otherwise +they are placed as they occur, with later drawing commands perhaps +putting their results on top of the labels or clipping parts of them off. + +Sometimes it is useful to place some label as a background (not on top), +and yet not have it clipped by later commands. The effect of the command +\cs{startbacktext} is that \cs{tlabel} commands are saved in a special +place until the command \cs{stopbacktext}. Then, at \cs{endmfpic} the +rest of the figure is simply place on top of them. Since labels in \MP{} +files can only consist of characters from some font, if one wants to +include a graphic in the background (for example, via +\cs{includegraphics}), one needs to switch off \opt{mplabels}: +\begin{verbatim} +\nomplabels +\startbacktext + \tlabel[cc](0,0){\includegraphics{mygraph}} +\stopbacktext +\usemplabels +\end{verbatim} +As with other labels, it is permitted to switch \opt{mplabels} off and +on while creating background text. If there are both kinds of labels +within the background text area the ones handled by \TeX{} will be +further back than the ones handled by \MP{}. Within a given type, +earlier ones are further back than later ones. + +\Mfp{} normally uses a naming scheme like \cs{cmd} \dots \cs{endcmd} and +tries to arrange that \env{cmd} can be used as an environment. As +currently written, the extra grouping added by \cs{begin}\marg{cmd} and +\cs{end}\marg{cmd} would break the code that implements background text, +so we have named these in a different way to avoid suggesting this +possiblity. There should be at most one of these pairs in any +\env{mfpic} environment. It can occur anywhere in the environment, but +the two commands must not be inside any grouping. + +Under the \opt{metapost} option, the \cs{gclear} command doesn't really +clear a space, but rather paints the space over with white. Any +background text will not be visible through such `holes'. This is a +limitation of \MP{}. + +\begin{cd}\pagelabel{tcaption} \cs{tcaption}\oarg{\meta{maxwd},\meta{linewd}}\marg{\meta{caption text}}% \index{tcaption@\cs{tcaption}} \end{cd} Places a \TeX{} caption at the bottom of the graph. (Not to be confused -with \LaTeX's similar \cs{caption} command.) The macro will +with \LaTeX{}'s similar \cs{caption} command.) The macro will automatically break lines which are too much wider than the graph---if the \cs{tcaption} line exceeds \meta{maxwd} times the width of the graph, then lines will be broken to form lines at most \meta{linewd} times the width of the graph. The default settings for \meta{maxwd} and -\meta{linewd} are 1.2 and 1.0, respectively. \cs{tcaption} typesets its -argument twice (as does \LaTeX's \cs{caption}), the first time to test -its width, the second time for real. Therefore, the user is advised -\emph{not} to include any global assignments in the caption text. +\meta{linewd} are 1.2 and 1.0, respectively. \cs{tcaption} may typeset +its argument twice (as might \LaTeX{}'s \cs{caption}), the first time as +a single line to test its width, then again if that was too wide. +Therefore, the user is advised \emph{not} to include any global +assignments in the caption text. If the \cs{tcaption} and graph have different widths, the two are centered relative to each other. If the \cs{tcaption} takes multiple -lines, then the lines are both left- and right-justified (except for the -last line), but the first line is not indented. If the option +lines, then the default is to set lines both left- and right-justified +(except for the last line) with no indentation on the first line. If the +option \opt{raggedcaptions} is in effect, the lines are only +left-justified and ragged on the right. Finally, if the option \opt{centeredcaptions} is in effect, each line of the caption will be -centered. +centered (under \opt{raggedcaptions} they will be ragged on both sides). -In a \cs{tcaption}, Explicit line breaks may be specified by using the +In a \cs{tcaption}, explicit line breaks may be specified by using the \bbsl{} command. The separation between the bottom of the picture and the caption can be changed by increasing or decreasing the skip \cs{mfpiccaptionskip}\index{mfpiccaptionskip@\cs{mfpiccaptionskip}} @@ -2859,45 +3911,47 @@ the caption can be changed by increasing or decreasing the skip Many \mfp{} users find the \cs{tcaption} command too limiting (one cannot, for example, place the caption to the side of the figure). It is -common to use some other method (such as \LaTeX's \cs{caption} command +common to use some other method (such as \LaTeX{}'s \cs{caption} command in a \env{figure} environment). The dimensions \cs{mfpicheight} and \cs{mfpicwidth} (see section~\ref{parameters}) might be a convenience for plain \TeX{} users who want to roll their own caption macros. -\subsubsection{Curves surrounding text}\label{surrounding} +\subsection{Curves surrounding text}\label{surrounding} -\begin{cd} +\begin{cd}\pagelabel{tlabelrect} \cs{tlabelrect}\oarg{\meta{rad}}\oarg{\meta{just}}% \meta{pair}\marg{\meta{text}}\\ \cs{tlabelrect*...}% \index{tlabelrect@\cs{tlabelrect}} \end{cd} -This and the following two methods of surounding a bit of text with a -curve share some common characteristics which will be described here. -The commands all take an optional argument that can modify the shape of -the curve. After that come arguments exactly as for the \cs{tlabel} -command except that only a single point is permitted, not a list. (So -\meta{pair} is either of the form \parg{\meta{x},\meta{y}} or the same -enclosed in braces, or for \opt{mplabels} a pair expression in braces.) -After processing the surrounding curve, a \cs{tlabel} is applied to -those arguments unless a \texttt{*} is present. In order for the second -optional argument to be recognized as the second, the first optional -argument must also be present. An empty first optional argument is -permitted, causing the default value to be used. The default for the -justification parameter is \texttt{cc}, for compatibility with past -\mfp{} versions in which these commands all centered the figure around -the point and no justification parameter existed. This default can be -changed with the \cs{tlpathjustify} command below. +This figure macro and the following two methods of surounding a bit of +text with a curve share some common characteristics which will be +described here. The commands all take an optional argument that can +modify the shape of the curve. After that come arguments exactly as for +the \cs{tlabel} command except that only a single point is permitted, +not a list. (So \meta{pair} is either of the form +\parg{\meta{x},\meta{y}} or the same enclosed in braces, or for +\opt{mplabels} a pair expression in braces.) After processing the +surrounding curve, a \cs{tlabel} is applied to those arguments unless a +\texttt{*} is present. In order for the second optional argument (the +optional justification argument for the \cs{tlabel} command) to be +recognized as the second, the first optional argument must also be +present. An empty first optional argument is permitted, causing the +default value to be used. The default for the justification argument is +\texttt{cc}, for compatibility with past \mfp{} versions, in which these +commands all centered the figure around the point and no justification +parameter existed. This default can be changed with the +\cs{tlpathjustify} command below. The plain rectangle version produces a frame separated from the text on -all sides by the amount defined with \cs{tlabelsep}. All other versions +all sides by the amount defined with \cs{tlpathsep}. All other versions produce the smallest described curve that contains this rectangle. These commands may be preceded by prefix macros (see the sections \ref{modifier}~and \ref{rendering}, above). They all have a -`\texttt{*}-form' which produces the curve but omits placing the text. +`star-form' which produces the curve but omits placing the text. All have the effect of rendering the path \emph{before} placing any text. For example, \cs{gclear}\cs{tlabelrect}\dots\ will clear the rectangle and then place the following text in the cleared space. @@ -2911,34 +3965,36 @@ argument \meta{rad}: if the keyword `\texttt{roundends}' is used instead of a dimension, the radius will be chosen to make the nearest quarter circles just meet, so the narrow side of the rectangle is a half circle. -\begin{cd} +\begin{cd}\pagelabel{tlabeloval} \cs{tlabeloval}\oarg{\meta{mult}}\oarg{\meta{just}}% \meta{pair}\marg{\meta{text}}\\ \cs{tlabeloval*...}% \index{tlabeloval@\cs{tlabeloval}} \end{cd} -This is similar to \cs{tlabelrect}, except it draws an ellipse. The -ellipse is calculated to have the same ratio of width to height as the -rectangle mentioned above. The optional \meta{mult} is a multiplier that -increases or decreases this ratio. Values of \meta{mult} larger than 1 -increase the width and decrease the height. +This figure macro is similar to \cs{tlabelrect}, except it produces an +ellipse. The ellipse is calculated to have the same ratio of width to +height as the rectangle mentioned above. The optional \meta{mult} is a +multiplier that increases or decreases this ratio. Values of \meta{mult} +larger than 1 increase the width and decrease the height. -\begin{cd} +\begin{cd}\pagelabel{tlabelellipse} \cs{tlabelellipse}\oarg{\meta{ratio}}\oarg{\meta{just}}% \meta{pair}\marg{\meta{text}}\\ \cs{tlabelellipse*...}\\ \cs{tlabelcircle}\oarg{\meta{just}}\meta{pair}\marg{\meta{text}}\\ \cs{tlabelcircle*...}% -\index{tlabelellipse@\cs{tlabelellipse}}\index{tlabelcircle@\cs{tlabelcircle}} +\index{tlabelellipse@\cs{tlabelellipse}}% +\index{tlabelcircle@\cs{tlabelcircle}} \end{cd} -Draws the smallest ellipse centered at the point that encompasses the -rectangle defined above, and that has a ratio of width to height equal -to \meta{ratio} then places the text. The default ratio is $1$, which -produces a circle. We also provide the command \cs{tlabelcircle}, which -take only the \oarg{\meta{just}} optional argument. Internally, it just -processes any \texttt{*} and calls \cs{tlabelellipse} with parameter 1. +This figure macro produces the smallest ellipse centered at the point +that encompasses the rectangle defined above, and that has a ratio of +width to height equal to \meta{ratio}, then places the text. The default +ratio is $1$, which produces a circle. We also provide the command +\cs{tlabelcircle}, which takes only the \oarg{\meta{just}} optional +argument. Internally, it just processes any \texttt{*} and calls +\cs{tlabelellipse} with parameter 1. In the above \cs{tlabel...} curves, the optional parameter should be positive. If it is zero, all the curves silently revert to @@ -2947,8 +4003,8 @@ of \cs{tlabelrect} this causes the quarter-circles at the corners to be indented rather than convex. In the other cases, there is no visible effect, but in all cases the sense of the curve is reversed. -\begin{cd} -\cs{tlpathjustify}\marg{\meta{just}} +\begin{cd}\pagelabel{tlpathjustify} +\cs{tlpathjustify}\marg{\meta{just}}% \index{tlpathjustify@\cs{tlpathjustify}} \end{cd} @@ -2957,15 +4013,15 @@ and friends. The \meta{just} parameter is exactly as in \cs{tlabeljustify} in subsection~\ref{text}. -\subsection{Saving and Reusing an \mfp{} Picture.}\label{saving} +\section{Saving and Reusing an \mfp{} Picture.}\label{saving} These commands have been changed from versions prior to 0.3.14 in order -to behave more like the \LaTeX's \cs{savebox}, and also to allow the +to behave more like the \LaTeX{}'s \cs{savebox}, and also to allow the reuse of an allocated box. Past files that use \cs{savepic} will have to be edited to add \cs{newsavepic} commands that allocate the \TeX{} boxes. -\begin{cd} +\begin{cd}\pagelabel{newsavepic} \cs{newsavepic}\marg{\meta{picname}}\\ \cs{savepic}\marg{\meta{picname}}\\ \cs{usepic}\marg{\meta{picname}}% @@ -2974,9 +4030,10 @@ boxes. \index{usepic@\cs{usepic}} \end{cd} -\cs{newsavepic} allocates a box (like \LaTeX's \cs{newsavebox}) in which +\cs{newsavepic} allocates a box (like \LaTeX{}'s \cs{newsavebox}) in which to save a picture. As in \cs{newsavebox}, \meta{picname} is a control -sequence. Example: \cs{newsavepic}\marg{\cs{foo}}. +sequence. Example: \cs{newsavepic}\marg{\cs{foo}}. In a \LaTeX{} +document, \cs{newsavepic} is actually defined to be \cs{newsavebox}. \cs{savepic} saves the \emph{next} \cs{mfpic} picture in the named box, which should have been previously allocated with \cs{newsavepic}. (This @@ -2984,22 +4041,27 @@ command should not be used \emph{inside} an \env{mfpic} environment.) The next picture will not be placed, but saved in the box for later use. This is primarily intended as a convenience. One \emph{could} use \begin{ex} - \cs{savebox}\marg{\meta{picname}}\marg{\meta{entire \env{mfpic} environment}}, + \cs{savebox}\marg{\meta{picname}}\marg{\meta{entire + \env{mfpic} environment}}, \end{ex} but \cs{savepic} avoids having to place the \env{mfpic} environment in braces, and avoids one extra level of \TeX{} grouping. It also avoids reading the entire \env{mfpic} environment as a parameter, which would -nullify \mfp's efforts to preserve line breaks in parameters +nullify \mfp{}'s efforts to preserve line breaks in parameters written to the \MF{} output file. If you repeat \cs{savepic} with the same \meta{picname}, the old contents are replaced with the next picture. \cs{usepic} copies the picture that had been saved in the named box. This may be repeated as often as liked to create multiple copies of one -picture. +picture. The \cs{usepic} command is essentially a clone of the \LaTeX{} +\cs{usebox} command. Since the contents of the saved picture are only +defined during the \TeX{} run, \cs{usebox} cannot be used in the +\TeX-commands argument of the \cs{tlabel} command while \opt{mplabels} +is in effect. -\subsection{Picture frames.}\label{frames} +\section{Picture Frames.}\label{frames} When \TeX{} is run but before \MF{} or \MP{} has been run on the output file, \mfp{} detects that the \file{.tfm} file is missing or that @@ -3009,7 +4071,7 @@ dimensions equal to the nominal size of the picture, containing the figure name and number (and any \TeX{} labels). The command(s) used internally to do this are made available to the user. -\begin{cd} +\begin{cd}\pagelabel{mfpframe} \cs{mfpframe}\oarg{\meta{fsep}}% \meta{ material-to-be-framed }% \cs{endmfpframe}\\ @@ -3019,25 +4081,25 @@ internally to do this are made available to the user. \index{mfpframe@\cs{mfpframe}} \end{cd} -These surround their contents with a rectangular frame consisting of -lines with thickness \cs{mfpframethickness} separated from the contents -by the \meta{fsep} if specified, otherwise by the value of the dimension -\cs{mfpframesep}. The default value of the \TeX{} dimensions -\cs{mfpframesep} and \cs{mfpframethickness} are \dim{2pt} and +These commands surround their contents with a rectangular frame +consisting of lines with thickness \cs{mfpframethickness} separated from +the contents by the \meta{fsep} if specified, otherwise by the value of +the dimension \cs{mfpframesep}. The default value of the \TeX{} +dimensions \cs{mfpframesep} and \cs{mfpframethickness} are \dim{2pt} and \dim{0.4pt}, respectively. The \cs{mfpframe} $\ldots$ \cs{endmfpframe} version is preferred around \env{mfpic} environments or verbatim material since it avoids reading the enclosed material before -appropriate \cs{catcode} changes go into effect. In \LaTeX, one can also -use the \cs{begin}\marg{mfpframe} $\ldots$ \cs{end}\marg{mfpframe} +appropriate \cs{catcode} changes go into effect. In \LaTeX{}, one can +also use the \cs{begin}\marg{mfpframe} $\ldots$ \cs{end}\marg{mfpframe} syntax. An alternative way to frame \env{mfpic} pictures is to save them with \cs{savepic} (see previous section) and issue a corresponding -\cs{usepic} command inside any framing environment/command of the user's +\cs{usepic} command inside any framing environment or command of the user's choice or devising. -\subsection{Affine Transforms.}\label{transforms} +\section{Affine Transforms.}\label{transforms} Coordinate transformations that keep parallel lines in parallel are called \emph{affine transforms}. These include translation, rotation, @@ -3047,12 +4109,10 @@ system only---that is, for paths, but not for \cs{tlabel}'s (let alone affine transforms. -\subsubsection{Affine Transforms of the \MF{} Coordinate -System.}\label{affine} +\subsection{Transforming the \MF{} coordinate system}\label{affine} -\begin{cd} -\cs{coords} $\ldots$ -\cs{endcoords}% +\begin{cd}\pagelabel{coords} +\cs{coords} \dots \cs{endcoords}% \index{coords@\cs{coords}}% \index{endcoords@\cs{endcoords}} \end{cd} @@ -3060,80 +4120,72 @@ System.}\label{affine} All affine transforms are restricted to the innermost enclosing \cs{coords}$\ldots$\cs{endcoords} pair. If there is \emph{no} such enclosure, then the transforms will apply to the rest of the \env{mfpic} -environment - -\emph{Note}: In \LaTeX, a \env{coords} environment may be used. +environment. In \LaTeX{}, a \env{coords} environment may be used. \medskip -Transforms provided by \mfp. +\noindent Transforms provided by \mfp{}: -\medskip -\halign -{#\hfil&\quad#\hfil\cr +\nobreak +\begin{cd}\pagelabel{applyT}% +\begin{tabular}[b]{@{}ll@{}} \cs{rotate}\marg{\meta{$\theta$}}% \index{rotate@\cs{rotate}}% - & Rotates around origin by \meta{$\theta$} degrees \cr - \cs{rotatearound}\marg{\meta{point}}\marg{\meta{$\theta$}}% + & Rotate around origin by \meta{$\theta$} degrees.\\ + \cs{rotatearound}\marg{\meta{$p$}}\marg{\meta{$\theta$}}% \index{rotatearound@\cs{rotatearound}}% - & Rotates around point \meta{point} by \meta{$\theta$} degrees \cr - \cs{turn}\oarg{\meta{point}}\marg{\meta{$\theta$}}% + & Rotate around point \meta{$p$} by \meta{$\theta$} degrees.\\ + \cs{turn}\oarg{\meta{p}}\marg{\meta{$\theta$}}% \index{turn@\cs{turn}}% - & Rotates around point \meta{point} (origin is default) by - \meta{$\theta$} \cr - \cs{mirror}\marg{\meta{$p_1$}}\marg{\meta{$p_2$}}% - \index{mirror@\cs{mirror}}% - & Same as \cs{reflectabout}\cr + & Rotate around point \meta{p} (origin is default) by + \meta{$\theta$}.\\ \cs{reflectabout}\marg{\meta{$p_1$}}\marg{\meta{$p_1$}}% \index{reflectabout@\cs{reflectabout}}% - & Reflect about the line \meta{$p_1$}\texttt{--}\meta{$p_2$} \cr - \cs{shift}\marg{\meta{pair}}% + & Reflect in the line through points \meta{$p_1$} and \meta{$p_2$}.\\ + \cs{mirror}\marg{\meta{$p_1$}}\marg{\meta{$p_2$}}% + \index{mirror@\cs{mirror}}% + & Same as \cs{reflectabout}.\\ + \cs{shift}\marg{\meta{v}}% \index{shift@\cs{shift}}% - & Shifts origin by the vector \meta{pair} \cr + & Shift origin by the vector \meta{v}.\\ \cs{scale}\marg{\meta{s}}% \index{scale@\cs{scale}}% - & Scales uniformly by a factor of \meta{s} \cr + & Scale uniformly by a factor of \meta{s}.\\ \cs{xscale}\marg{\meta{s}}% \index{xscale@\cs{xscale}}% - & Scales only the X coordinates by a factor of \meta{s} \cr + & Scale only the $x$ coordinates by a factor of \meta{s}.\\ \cs{yscale}\marg{\meta{s}}% \index{yscale@\cs{yscale}}% - & Scales only the Y coordinates by a factor of \meta{s} \cr + & Scale only the $y$ coordinates by a factor of \meta{s}.\\ \cs{zscale}\marg{\meta{pair}}% \index{zscale@\cs{zscale}}% - & Scales uniformly by magnitude of \meta{pair}, and rotates by angle - of \meta{pair} \cr + & Scale by the magnitude of vector \meta{v}, and rotate by its + angle.\\ \cs{xslant}\marg{\meta{s}}% \index{xslant@\cs{xslant}}% - & Skew in $X$ direction by the multiple \meta{s} of $Y$ \cr + & Skew in $x$ direction by the multiple \meta{s} of $y$.\\ \cs{yslant}\marg{\meta{s}}% \index{yslant@\cs{yslant}}% - & Skew in $Y$ direction by the multiple \meta{s} of $X$ \cr + & Skew in $y$ direction by the multiple \meta{s} of $x$.\\ \cs{zslant}\marg{\meta{pair}}% \index{zslant@\cs{zslant}}% - & See \mfc{zslanted} in \file{grafdoc.tex} \cr + & See \mfc{zslanted} in \file{grafbase.dtx}.\\ \cs{boost}\marg{\meta{$\chi$}}% \index{boost@\cs{boost}}% & Special relativity boost by $\chi$, see \mfc{boost} in - \file{grafdoc.tex} \cr + \file{grafbase.dtx}.\\ \cs{xyswap}% \index{xyswap@\cs{xyswap}}% - & Exchanges the values of $x$ and $y$. \cr}% - -An arbitrary \MF{} transformation can be implemented with - -\begin{cd} -\cs{applyT}\marg{\meta{transformer}}% -\index{applyT@\cs{applyT}} + & Exchange the values of $x$ and $y$.\\ + \cs{applyT}\marg{\meta{transformer}}% + \index{applyT@\cs{applyT}}% + & Apply the \meta{transformer}. +\end{tabular} \end{cd} -This is mainly for \MF{} hackers. This applies the \MF{} -\meta{transformer} to the current coordinate system. For example, the -\mfp{} \TeX{} macro \cs{zslant\#1} is implemented as -\cs{applyT}\marg{zslanted \#1} where the argument \mfc{\#1} is a \MF{} -pair, such as $(x,y)$. Any code that satisfies \MF's syntax for a -\meta{transformer} (see D.~E.~Knuth, ``The \MF book'') is permitted, -although no effort is made to correctly write \TeX{} special characters -nor to preserve linebreaks in the code. +\cs{applyT} is for \MF{} hackers. Any code is permitted that satisfies +\MF{}'s syntax for a \meta{transformer} (see D.~E.~Knuth, ``The +\MF{}book'', page~73), although no effort is made to correctly write +\TeX{} special characters nor to preserve linebreaks in the code. When any of these commands is issued, the effect is to transform all subsequent figures (within the enclosing \env{coords} or \env{mfpic} @@ -3146,10 +4198,15 @@ applied in succession, then the most recent is applied first, so that figures are transformed as if the transformations were applied in the reverse order of their occurrence. This is similar to the application of prefix macros (as well as application of transformations in mathematics: -$T_1 T_2 z$ usually means to apply $T_1$ to the result of $T_2 z$). +$S T z$ usually means to apply $S$ to the result of $T z$). +Finally, some of these may not produce what the unwary user might expect +if the \env{mfpic} environment was started with unequal scaling. For +example, in such a case a rotated rectangle will not have right angles +unless the rotation is by a multiple of 90 degrees. -\subsubsection{Transformation of Paths.}\label{transformation} + +\subsection{Transforming paths}\label{transformation} In the previous section we discussed transformations of the \MF{} coordinate system. Those macros affect the \emph{drawing} of paths and @@ -3157,7 +4214,7 @@ other figures, but do not change the actual paths. We will explain the distinction after introducing two macros for storing and reusing figures. -\begin{cd} +\begin{cd}\pagelabel{store} \cs{store}\marg{\meta{path variable}}\marg{\meta{path}}\\ \cs{store}\marg{\meta{path variable}}\meta{path}% \index{store@\cs{store}} @@ -3165,99 +4222,108 @@ figures. This stores the following \meta{path} in the specified \MF{} \meta{path variable}. Any valid \MF{} symbolic token will do, in particular, any -sequence of letters or underscores. You should be careful to make the +sequence of letters and underscores. You should be careful to make the name distinctive to avoid overwriting the definition of some internal variable. The stored path may later be used as a figure macro using \cs{mfobj} (below). The \meta{path} may be any of the figure macros (such as \cs{curve}\marg{(0,0),(1,0),(1,1)}) or the result of -modifying it. For example. - -\begin{ex} -\cs{store}\marg{pth}\cs{lclosed}\cs{reverse}% - \cs{curve}\marg{(0,0),(1,0),(1,1)}) -\end{ex} +modifying it. For example: +\begin{verbatim} +\store{pth}\lclosed\reverse\curve{(0,0),(1,0),(1,1)} +\end{verbatim} In fact, \cs{store} is a prefix macro that does nothing to the following curve except store it. It acts as a rendering macro with a null rendering, so the curve is not made visible unless other rendering -macros appear before or after it. It is special in that it is the only -prefix macro that allows the following path to be an argument, that is, -enclosed in braces. This is solely to support past \mfp{} versions in -which \cs{store} was \emph{not} defined as a prefix macro. +macros appear before or after it. It allows the following path to be an +argument, that is, enclosed in braces. This is solely to support files +written for past \mfp{} versions in which \cs{store} was \emph{not} +defined as a prefix macro. + +One use of \cs{store} is to create a shorthand for a path that is +otherwise long and tedious to type. Another is to create `symbols' or +`arrowheads' for use in \cs{plotsymbol}, \cs{arrowhead} and related +commands. -\begin{cd} +\begin{cd}\pagelabel{mfobj} \cs{mfobj}\marg{\meta{path expression}}\\ \cs{mpobj}\marg{\meta{path expression}}% -\index{mfobj@\cs{mfobj}}\index{mpobj@\cs{mpobj}} +\index{mfobj@\cs{mfobj}}% +\index{mpobj@\cs{mpobj}} \end{cd} -The \meta{path expression} is a previously stored path variable, or a -valid \MF{} (or \MP) expression combining such variables and/or constant -paths. This allows the use of path variables or expressions as figure -macros, permitting all prefix operations, etc.. Here's some -oversimplified uses of \cs{store} and \cs{mfobj}: +This figure macro produces the path represented by \meta{path +expression}, which is either a path variable in which a path was +previously stored, or a valid \MF{} expression combining such variables +and constant paths. This allows the use of path variables or +expressions as figure macros, permitting all prefix operations, etc.. +Here are some examples of the use of \cs{store} and \cs{mfobj}. \nobreak \begin{verbatim} -\store{my_f}{\circle{...}} % Store a circle. -\dotted\mfobj{my_f} % Now draw it dotted, -\hatch\mfobj{my_f} % and hatch its interior -% Store two curves: -\store{my_f}{\curve{...}} -\store{my_g}{\curve{...}} -% Store two combinations of them: -\store{my_h}{\mfobj{my_f--my_g--cycle}} % a MF path expression -\store{my_k}{% - \lclosed\connect % a combination path created from - \mfobj{my_f}\mfobj{my_g} % mfpic commands. - \endconnect} -\dotted\mfobj{my_f} % Draw the first dotted, -\dotted\mfobj{my_g} % then the second. -\shade\mfobj{my_h} % Now shade one combination. -\hatch\mfobj{my_k} % and hatch the other +\store{my_f}{\cyclic{...}} % Store a closed curve. +\dotted\mfobj{my_f} % Now draw it dotted, +\hatch\mfobj{my_f} % and hatch its interior +% Create two symbols +% one outline: +\store{MyTriang}{\polyline{(-.5,-.5),(.5,-.5),(0,.5),(-.5,-.5)} +% one solid: +\store{MySolidTriang}{\polygon{(-.5,-.5),(.5,-.5),(0,.5)} +% Use them as symbols: +\plotsymbols{MyTriang}{(0,0),(2,2)} +\arrowmid{MySolidTriang}\polyline{(1,1),(0,2)} \end{verbatim} -The two forms \cs{mfobj} and \cs{mpobj} are absolutely equivalent. + +\emph{Note}: If a stored path has the same starting point as ending +point, but is \emph{not} closed then it will behave like \texttt{Circle} +(for example) when used in \cs{plotsymbol}: only its outline is drawn, +and its interior is erased when \opt{clearsymbols} is in effect. If a +closed path is stored, it behaves like \texttt{SolidCircle}: it is not +drawn, but rather filled. If a path is stored that satisfies neither, it +behaves like \texttt{Asterisk}, being simply drawn in all circumstances. + +The two forms \cs{mfobj} and \cs{mpobj} are absolutely equivalent; they +differ only in spelling. It should be noted that every \mfp{} figure is implicitly stored in the object \gbc{curpath}. So you can use \cs{mfobj}\marg{curpath} and get -the path defined by the most recent sequence of prefix macros and -figure. +the path defined by the most recently completed figure macro (possibly +modified by prefixes). Getting back to coordinate transforms, if one changes the coordinate system and then stores and draws a curve, say by \begin{verbatim} - \coords - \rotate{45 deg} - \store{xx}{\rect{(0,0),(1,1)}} - \dashed\mfobj{xx} - \endcoords +\coords + \rotate{45 deg} + \store{xx}{\rect{(0,0),(1,1)}} + \dashed\mfobj{xx} +\endcoords \end{verbatim} one will get a transformed picture, but the object \cs{mfobj}\marg{xx} will contain the simple, unrotated rectangular path and drawing it later (outside the \env{coords} environment) will prove that. This is because the \texttt{coords} environment works at the drawing level, not at the -definition level. In oversimplified terms, \cs{dashed} invokes the -transformation, but not \cs{store}. More precisely, \mfp{} prefix macros -have an input and an output and a side effect. The input is the output -of whatever follows it, the output can be the same as the input (the -case for rendering prefixes) or modified version of that (the closure -prefixes). The side effect is the drawing (dashing, filling) of the path, -appending of an arrowhead, etc.. These side effects have to know where -to place their marks, so a computation is invoked that converts the -user's graph coordinates into \MF's drawing coordinates. The previous -transformation macros work by modifying the parameters used in this -computation. +definition level. + +In oversimplified terms, \cs{dashed} invokes the transformation, but not +\cs{store}. More precisely, the rendering macros have the side effect of +adding ink to the page (or subtracting it). To know where to place this +ink, a calculation is performed that translates graph coordinates to +actual positions. The above transforms work by modify the parameters +used in that calculation. On the other hand, \cs{store} merely stores +the output of the immediately following prefix or figure macro. See the +beginning of section~\ref{modifier} for a discussion of input, output +and side effects of \mfp{} prefix and figure macros. The following transformation prefixes provide a means of actually creating and storing a transformed path. In the terms just discussed, their input is a path, their output is the transformed path, and they -have no side effects (other than invoking the default rendering if no -rendering prefix was previously provided). +have no side effects. -\begin{cd} -\cs{rotatepath}\marg{(\meta{x},\meta{y}),\meta{$\theta$}}$\ldots$\\ -\cs{shiftpath}\marg{(\meta{dx},\meta{dy})}$\ldots$\\ -\cs{scalepath}\marg{(\meta{x},\meta{y}),\meta{s}}$\ldots$\\ +\begin{cd}\pagelabel{shiftpath} +\cs{rotatepath}\marg{\meta{$p$},\meta{$\theta$}}$\ldots$\\ +\cs{shiftpath}\marg{\meta{v}}$\ldots$\\ +\cs{scalepath}\marg{\meta{$p$},\meta{s}}$\ldots$\\ \cs{xscalepath}\marg{\meta{x},\meta{s}}$\ldots$\\ \cs{yscalepath}\marg{\meta{y},\meta{s}}$\ldots$\\ \cs{slantpath}\marg{\meta{y},\meta{s}}$\ldots$\\ @@ -3265,40 +4331,44 @@ rendering prefix was previously provided). \cs{yslantpath}\marg{\meta{x},\meta{s}}$\ldots$\\ \cs{reflectpath}\marg{\meta{$p_1$},\meta{$p_2$}}$\ldots$\\ \cs{xyswappath}$\ldots$\\ -\cs{transformpath}\marg{\meta{transformer}}$\ldots$ -\index{rotatepath@\cs{rotatepath}}\index{shiftpath@\cs{shiftpath}}% -\index{scalepath@\cs{scalepath}}\index{xscalepath@\cs{xscalepath}}% -\index{yscalepath@\cs{yscalepath}}\index{slantpath@\cs{slantpath}}% -\index{xslantpath@\cs{xslantpath}}\index{yslantpath@\cs{yslantpath}}% -\index{reflectpath@\cs{reflectpath}}\index{xyswappath@\cs{xyswappath}}% +\cs{transformpath}\marg{\meta{transformer}}$\ldots$% +\index{rotatepath@\cs{rotatepath}}% +\index{shiftpath@\cs{shiftpath}}% +\index{scalepath@\cs{scalepath}}% +\index{xscalepath@\cs{xscalepath}}% +\index{yscalepath@\cs{yscalepath}}% +\index{slantpath@\cs{slantpath}}% +\index{xslantpath@\cs{xslantpath}}% +\index{yslantpath@\cs{yslantpath}}% +\index{reflectpath@\cs{reflectpath}}% +\index{xyswappath@\cs{xyswappath}}% \index{transformpath@\cs{transformpath}} \end{cd} +These are modifying macros that all return the result of applying an +affine transformation to the following path. They differ in the +transformation applied and the data needed in the mandatory argument. I +have found them extremely useful, and better than \env{coords} +environments when I need to draw a figure, together with several +slightly different versions of it. If \cs{store} is used just before one +of these prefixes, it stores the transformed path rather than the +original. + \cs{rotatepath} rotates the following path by \meta{$\theta$} degrees -about point \mfc{(\meta{x},\meta{y})}. After the commands: -\begin{ex} - \cs{store}\marg{xx}\marg{\cs{rotatepath}\marg{(0,0), 45}% - \cs{rect}\marg{(0,0),(1,1)}} -\end{ex} -the object \cs{mfobj}\marg{xx} contains an actual rotated rectangle, as -drawing it will prove. The above macro, and the five that follow are -extremely useful (and better than \env{coords} environments) if one -needs to draw a figure, together with many slightly different versions -of it. +about point \meta{$p$}. -\cs{shiftpath} shifts the following path by the horizontal amount -\meta{dx} and the vertical amount \meta{dy}. +\cs{shiftpath} shifts the following path by the vector \meta{v}. \cs{scalepath} scales (magnifies or shrinks) the following path by the -factor \meta{s}, in such a way that the point \parg{\meta{x},\meta{y}} -is kept fixed. That is -\begin{ex} - \cs{scalepath}\marg{(0,0),2}\cs{rect}\marg{(0,0),(1,1)} -\end{ex} +factor \meta{s}, in such a way that the point \meta{$p$} is kept fixed. +That is +\begin{verbatim} +\scalepath{(0,0),2}\rect{(0,0),(1,1)} +\end{verbatim} is essentially the same as \cs{rect}\marg{(0,0),(2,2)}, while -\begin{ex} - \cs{scalepath}\marg{(1,1),2}\cs{rect}\marg{(0,0),(1,1)} -\end{ex} +\begin{verbatim} +\scalepath{(1,1),2}\rect{(0,0),(1,1)} +\end{verbatim} is the same as \cs{rect}\marg{(-1,-1),(1,1)}. In both cases the rectangle is doubled in size. In the first case the lower left corner stays the same, while in the second case the the upper right corner @@ -3312,8 +4382,9 @@ fixed. \cs{yscalepath} is similar, except the $y$-direction is affected. keeping points with second coordinate equal to \meta{y} fixed. That is, a point $p$ on the path is moved right by an amount proportional to the height of $p$ above the line $y={}$\meta{y}, with $s$ being the -proportionality factor. Vertical lines in the path will acquire a slope -of $1/s$, while horizontal lines stay horizontal. +proportionality factor. Points below that line move left. Vertical lines +in the path will acquire a slope of $1/s$, while horizontal lines stay +horizontal. \cs{xslantpath} is an alias for \cs{slantpath} @@ -3329,27 +4400,52 @@ exchanged. This is similar in some respects to \cs{reflectpath}\marg{(0,0),(1,1)}, and produces the same result if the $x$ and $y$ scales of the picture are the same. However, \cs{reflectpath} compensates for such different scales (so the path -shape remains the same), while \cs{xyswappath} does not (so that after a -swap, verticals become horizontal and horizontals become vertical). One -cannot have both when the scales are different. +shape remains the same), while \cs{xyswappath} does not. However, after +a swap, verticals become horizontal and horizontals become vertical. +(It is impossible, when the scales are different, for an affine transform +to both preserve shape and exchange horizontal and vertical lines.) + +This compensation for different scales is also done for \cs{rotatepath}, +so the resulting path always has the same shape after the rotation as +before. None of the other path transformation prefixes compensate for +different scales, and none of the coordinate system transformations of +the previous subsection do it. For \MF{} or \MP{} power users, \cs{transformpath} can take any `transformer' and transform the following path with it. Here, a -\emph{transformer} is anything that can follow a path and create a new -path. Examples are \mfc{scaled}, \mfc{shifted (1,1)}, and \mfc{rotatedabout -(0,1)}. +\emph{transformer} is the same as in the previous section. Examples are +\mfc{scaled}, \mfc{shifted(1,1)}, and \mfc{rotatedabout(0,1)}. All these prefixes change only the path that follows, not any rendering of it that follows. For example: -\begin{ex} - \cs{gfill}\cs{rotatepath}\marg{(0,0),90}\cs{dashed}% - \cs{rect}\marg{(0,0),(1,1)} -\end{ex} +\begin{verbatim} +\gfill\rotatepath{(0,0),90}\dashed\rect{(0,0),(1,1)} +\end{verbatim} will not produce a rotated dashed rectangle. Rather the original rectangle will be dashed, and the rotated rectangle will be filled. +One complication is the handling of the default rendering. One expects +\verb$\rect{(0,0),(1,1)}$ to draw a rectangle, and +\verb$\rotatepath{(0,0),45}\rect{(0,0),(1,1)}$ to draw a rotated +rectangle (but not the original). That is, a transformation + figure is +treated as if it were a single figure. But what would one expect in the +following? +\begin{verbatim} +\rotatepath{(0,0),45}\dashed\rect{(0,0),(1,1)} +\end{verbatim} +What one will get is the original dashed and the rotated one with the +default rendering (typically drawn with solid lines). That is, these +prefixes cannot see the renderings that occur later in the sequence. +They add the default rendering as if those didn't exist. If something +other than this is desired, one can either rearrange the prefixes or add +a \phantomsection\label{norenderexample}\cs{norender} in appropriate +places. For example, to add a shifted arrowhead without drawing the +shifted path: +\begin{verbatim} +\arrow\norender\shiftpath{(0,1)}\arrow\draw\lines{(0,0),(8,8)} +\end{verbatim} -\subsection{Parameters.}\label{parameters} +\section{Parameters.}\label{parameters} There are many parameters in \mfp{} which the user can modify to obtain different effects, such as different arrowhead size or shape. @@ -3358,229 +4454,265 @@ macros they modify, but they are all described together here. Many of the parameters are stored by \TeX{} as dimensions, and so are available even if there is no \MF{} file open; changes to them are not -subject to the usual \TeX{} rules of scope however: they are local to -\TeX{} groups only if set inside an \env{mfpic} environment otherwise +subject to the usual \TeX{} rules of scope however: they are local +only to \env{mfpic} environments if set inside one, otherwise they are global. This is for consistency: other parameters are stored by \MF{} (so the macros to change them will have no effect unless a \MF{} -file is open) and the changes are subject to \MF's rules of scope---to +file is open) and the changes are subject to \MF{}'s rules of scope---to the \mfp{} user, this means that changes inside the \cs{mfpic} $\ldots$ \cs{endmfpic} environment are local to that environment, but other \TeX{} groupings have no effect on scope. Some commands (notably those that set the axismargins and \cs{tlabel} parameters) change both \TeX{} -parameters and \MF{} parameters, and it is important to keep then +parameters and \MF{} parameters, and it is important to keep them consistent. -\begin{cd} +There are a few parameters that do obey \TeX{} grouping, but only inside +\env{mfpic} environments. These are noted where the parameter is +described. + +All parameters are initialized when \prog{mfpic} is loaded. We give the +initial value or state in each of these descriptions. + +\begin{cd}\pagelabel{mfpicunit} \cs{mfpicunit}% \index{mfpicunit@\cs{mfpicunit}} \end{cd} -This \TeX{} dimension stores the basic unit length for \mfp{} -pictures---the $x$ and $y$ scales in the \cs{mfpic} macro are multiples -of this unit. The default value is \dim{1pt}. +This dimension stores the basic unit length for \mfp{} pictures. The $x$ +and $y$ scales in the \cs{mfpic} macro are multiples of this unit. The +initial value is \dim{1pt}. It is global outside an \env{mfpic} +environment. Changes made to it inside an \env{mfpic} environment have +no effect and are lost at the end of the environment. -\begin{cd} +\begin{cd}\pagelabel{pointsize} \cs{pointsize}% \index{pointsize@\cs{pointsize}} \end{cd} -This \TeX{} dimension stores the diameter of the circle drawn by the -\cs{point} macro and the diameter of the symbols drawn by -\cs{plotsymbol} and by \cs{plot}. The default value is \dim{2pt}. +This dimension stores the diameter of the circle drawn by the +\cs{point} macro and the diameter of the symbols drawn by \cs{plot}, +\cs{plotsymbol} and \cs{plotnodes}. The initial value is \dim{2pt}. -\begin{cd} -\cs{pointfilltrue} and \cs{pointfillfalse}% +\begin{cd}\pagelabel{pointfilltrue} +\cs{pointfilltrue}, \cs{pointfillfalse}% \index{pointfilltrue@\cs{pointfilltrue}}% \index{pointfillfalse@\cs{pointfillfalse}} \end{cd} This \TeX{} boolean switch determines whether the circle drawn by \cs{point} will be filled or open (outline drawn, inside erased). -The default is \texttt{true}: filled. This value is local to any \TeX{} +The initial state is \texttt{true}: filled. This value is local to any \TeX{} group inside an \env{mfpic} environment. Outside such it is global. -\begin{cd} -\cs{pen}\marg{\meta{drawpensize}}\\ -\cs{drawpen}\marg{\meta{drawpensize}}\\ -\cs{penwd}\marg{\meta{drawpensize}}% +\begin{cd}\pagelabel{drawpen} +\cs{pen}\marg{\meta{size}}\\ +\cs{drawpen}\marg{\meta{size}}\\ +\cs{penwd}\marg{\meta{size}}% \index{pen@\cs{pen}}% \index{drawpen@\cs{drawpen}}% \index{penwd@\cs{penwd}} \end{cd} -Establishes the width of the normal drawing pen. The default is -\dim{0.5pt}. This width is stored by \MF. The shading dots and hatching -pen are unaffected by this. There exist three aliases for this command, -the first two to maintain backward compatibility, the last one for -consistency with other dimension changing commands. Publishers generally -recommended authors to use at least a width of one-half point for -drawings submitted for publication. +These commands establishes the width of the normal drawing pen (that is, +the thickness of lines, whether solid or dashed). The initial value is +\dim{0.5bp}. This width is stored by \MF{}. This has no effect on the +size of dots for \cs{dotted}, \cs{shade}, \cs{grid}, etc. It also has no +effect on the lines drawn for hatching. There exist three aliases for +this command, the first two to maintain backward compatibility, the last +one for consistency with other dimension changing commands. Publishers +generally recommended authors to use at least a width of one-half point +for drawings submitted for publication. -\begin{cd} -\cs{shadewd}\marg{\meta{dotdiam}}% +\begin{cd}\pagelabel{shadewd} +\cs{shadewd}\marg{\meta{diam}}% \index{shadewd@\cs{shadewd}} \end{cd} -Sets the diameter of the dots used in the shading macro. The drawing and -hatching pens are unaffected by this. The default is \dim{0.5pt}, and -the value is stored by \MF. +This command sets the diameter of the dots used in the shading macro. +The drawing and hatching pens are unaffected by this. The initial value +is \dim{0.5bp}, and the value is stored by \MF{}. -\begin{cd} -\cs{hatchwd}\marg{\meta{hatchpensize}}% +\begin{cd}\pagelabel{hatchwd} +\cs{hatchwd}\marg{\meta{size}}% \index{hatchwd@\cs{hatchwd}} \end{cd} -Sets the line thickness used in the hatching macros. The drawing pen and -shading dots are unaffected by this. The default is \dim{0.5pt}, and the -value is stored by \MF. +This sets the line thickness used in the hatching macros. The drawing +pen and shading dots are unaffected by this. The initial value is +\dim{0.5bp}, and the value is stored by \MF{}. -\begin{cd} -\cs{polkadotwd}\marg{\meta{polkadotdiam}}% +\begin{cd}\pagelabel{polkadotwd} +\cs{polkadotwd}\marg{\meta{diam}}% \index{polkadotwd@\cs{polkadotwd}} \end{cd} -Sets the diameter of the dots used in the \cs{polkadot} macro. The -default is \dim{5pt}, and the value is stored by \MF. +This sets the diameter of the dots used in the \cs{polkadot} macro. The +initial value is \dim{5bp}, and the value is stored by \MF{}. -\begin{cd} +\begin{cd}\pagelabel{headlen} \cs{headlen}% \index{headlen@\cs{headlen}} \end{cd} -This \TeX{} dimension stores the length of the arrowhead drawn by -the \cs{arrow} macro. The default value is \dim{3pt}. +This dimension stores the length of the arrowhead drawn by the +\cs{arrow} macro. The initial value is \dim{3pt}. -\begin{cd} +\begin{cd}\pagelabel{axisheadlen} \cs{axisheadlen}% \index{axisheadlen@\cs{axisheadlen}} \end{cd} -This \TeX{} dimension stores the length of the arrowhead drawn by the +This dimension stores the length of the arrowhead drawn by the \cs{axes}, \cs{xaxis} and \cs{yaxis} macros, and by the macros \cs{axis} -and \cs{doaxes} when applied to the parameters \texttt{x} and \texttt{y}. +and \cs{doaxes} when applied to the parameters \texttt{x} and +\texttt{y}. The initial value is \dim{5pt}. -\begin{cd} +\begin{cd}\pagelabel{sideheadlen} \cs{sideheadlen}% \index{sideheadlen@\cs{sideheadlen}} \end{cd} -This \TeX{} dimension stores the length of the arrowhead drawn by the -\cs{axis} and \cs{doaxes} macros when applied to \texttt{l}, \texttt{b}, -\texttt{r} or \texttt{t}. The default value is \dim{0pt}. +This dimension stores the length of the arrowhead drawn by the \cs{axis} +and \cs{doaxes} macros when applied to \texttt{l}, \texttt{b}, +\texttt{r} or \texttt{t}. The initial value is \dim{0pt} (that is, the +default is not to put arrowheads on border axes). -\begin{cd} -\cs{headshape}\marg{\meta{hdwdr}}\marg{\meta{hdten}}\marg{\meta{hfilled}}% +\begin{cd}\pagelabel{headshape} +\cs{headshape}\marg{\meta{ratio}}\marg{\meta{tension}}\marg{\meta{filled}}% \index{headshape@\cs{headshape}} \end{cd} -Establishes the shape of the arrowhead drawn by the \cs{arrow} and -\cs{axes} macros. The value of \meta{hdwdr} is the ratio of the width of -the arrowhead to its length; \meta{hdten} is the tension of the B\'ezier -curves; and \meta{hfilled} is a \MF{} boolean value indicating whether -the arrowheads are to be filled (if \mfc{true}) or open. The default -values are $1$, $1$, \mfc{false}, respectively. The \meta{hdwdr}, -\meta{hdten} and \meta{hfilled} values are stored by \MF. Setting -\meta{hdten} to `\mfc{infinity}' will make the sides of the arrowheads -straight lines. These values are all stored by \MF. +This establishes the shape of the \gbc{Arrowhead} drawn by the +\cs{arrow...} and \cs{axes} macros. It also establishes the shape of +\gbc{Leftharpoon} and \gbc{Rightharpoon}. The value of \meta{ratio} is +the ratio of the width of the arrowhead to its length; \meta{tension} is +the tension of the B\'ezier curves; and \meta{filled} is a \MF{} boolean +value indicating whether the arrowheads are to be filled (if \mfc{true}) +or open. The initial values are $1$, $1$, and \mfc{false}, respectively. +Setting \meta{tension} to `\mfc{infinity}' will make the sides of the +arrowheads straight lines. The harpoon heads are arranged to be exactly +half of the full arrowhead. The \meta{ratio}, \meta{tension} and +\meta{filled} values are stored by \MF{}. -\begin{cd} +After \cs{headshape} is used, the symbols \gbc{Arrowhead}, +\gbc{Leftharpoon}, and \gbc{Rightharpoon} take on the new shape if used +in one of the \cs{plot...} commands. + +\begin{cd}\pagelabel{dashlen} \cs{dashlen}, \cs{dashspace}% \index{dashlen@\cs{dashlen}} \end{cd} -These \TeX{} dimensions store, respectively, the length of dashes and -the length of spaces between dashes, for lines drawn by the \cs{dashed} +These dimensions store, respectively, the length of dashes and the +length of spaces between dashes, for lines drawn by the \cs{dashed} macro. The \cs{dashed} macro may adjust the dashes and the spaces -between by as much as $1\over{n}$ of their value, where $n$ is the -number of spaces appearing in the curve, in order not to have partial -dashes at the ends. The default values are both \dim{4pt}. The dashes -will actually be longer (and the spaces shorter) by the thickness of the -pen used when they are drawn. - -\begin{cd} -\cs{dashlineset}, -\cs{dotlineset}% +between by as much as $1/n$ of their value, where $n$ is the number of +spaces appearing in the curve, in order not to have partial dashes at +the ends. The initial values are both \dim{4pt}. The dashes will +actually be longer (and the spaces shorter) by the thickness of the pen +used when they are drawn. + +\begin{cd}\pagelabel{dashlineset} +\cs{dashlineset}, \cs{dotlineset}% \index{dashlineset@\cs{dashlineset}}% \index{dotlineset@\cs{dotlineset}} \end{cd} -These macros provide convenient standard settings for the \cs{dashlen} +These macros provide shorthands for certain settings of the \cs{dashlen} and \cs{dashspace} dimensions. The macro \cs{dashlineset} sets both -values to \dim{4pt}; the macro \cs{dotlineset} sets \cs{dashlen} to -\dim{1pt} and \cs{dashspace} to \dim{2pt}. +values to \dim{4pt}, while \cs{dotlineset} sets \cs{dashlen} to +\dim{1pt} and \cs{dashspace} to \dim{2pt}. They are kept mainly for +backward compatibility. -\begin{cd} +\begin{cd}\pagelabel{hashlen} \cs{hashlen}% \index{hashlen@\cs{hashlen}} \end{cd} -This \TeX{} dimension stores the length of the axis hash marks drawn by -the \cs{xmarks} and \cs{ymarks} macros. The default value is \dim{4pt}. +This dimension stores the length of the axis hash marks drawn by the +\cs{xmarks} and \cs{ymarks} macros. The initial value is \dim{4pt}. -\begin{cd} +\begin{cd}\pagelabel{shadespace} \cs{shadespace}% \index{shadespace@\cs{shadespace}} \end{cd} -This \TeX{} dimension establishes the spacing between dots drawn by the -\cs{shade} macro. The default value is \dim{1pt}. +This dimension establishes the spacing between dots drawn by the +\cs{shade} macro. The initial value is \dim{1pt}. -\begin{cd} -\cs{darkershade}, -\cs{lightershade}% +\begin{cd}\pagelabel{darkershade} +\cs{darkershade}, \cs{lightershade}% \index{darkershade@\cs{darkershade}}% \index{lightershade@\cs{lightershade}} \end{cd} These macros both multiply the \cs{shadespace} dimension by constant factors, $5/6=.833333$ and $6/5=1.2$ respectively, to provide convenient -standard settings for several levels of shading. +standard settings for several levels of shading. Under \MF{} it is +possible that using one of these macros can have no visible effect. See +the discussion of the \cs{shade} macro in subsection~\ref{filling}. -\begin{cd} +\begin{cd}\pagelabel{polkadotspace} \cs{polkadotspace}% \index{polkadotspace@\cs{polkadotspace}} \end{cd} -This \TeX{} dimension establishes the spacing between the centers of the -dots used in the macro \cs{polkadot}. The default is \dim{10pt}. +This dimension establishes the spacing between the centers of the dots +used for the macro \cs{polkadot}. The initial value is \dim{10pt}. -\begin{cd} -\cs{dotsize}, \index{dotspace@\cs{dotspace}}\cs{dotspace}% -\index{dotsize@\cs{dotsize}} +\begin{cd}\pagelabel{dotsize} +\cs{dotsize}, \cs{dotspace}% +\index{dotsize@\cs{dotsize}}\index{dotspace@\cs{dotspace}}% \end{cd} These \TeX{} dimensions establishes the size and spacing between the -centers of the dots used in the \cs{dotted} macro. The defaults are -\dim{0.5pt} and \dim{3pt}. +centers of the dots used in the \cs{dotted} macro. The initial values +are \dim{0.5pt} and \dim{3pt}. -\begin{cd} +\begin{cd}\pagelabel{griddotsize} +\cs{griddotsize}% +\index{griddotsize@\cs{griddotsize}}% +\end{cd} + +This dimension is used as the default for the sizes of dots in the +\cs{grid} and \cs{plrgridpoints} commands. The initial value is +\dim{0.5pt} + +\begin{cd}\pagelabel{symbolspace} \cs{symbolspace}% \index{symbolspace@\cs{symbolspace}} \end{cd} Similar to \cs{dotspace}, this \TeX{} dimension establishes the space -between symbols placed by the macro -\cs{plot}\marg{\meta{symbol}}$\ldots\,$. Its default is \dim{5pt}. +between the centers of symbols placed by the macro +\cs{plot}\marg{\meta{symbol}}$\ldots\,$. Its initial value is \dim{5pt}. -\begin{cd} +\begin{cd}\pagelabel{hatchspace} \cs{hatchspace}% \index{hatchspace@\cs{hatchspace}} \end{cd} -This \TeX{} dimension establishes the spacing between lines drawn by the -\cs{hatch} macro. The default value is \dim{3pt}. +This dimension establishes the spacing between lines drawn by the +\cs{hatch} macro. The initial value is \dim{3pt}. \begin{cd} +\cs{tlpointsep}\marg{\meta{separation}}\\ +\cs{tlpathsep}\marg{\meta{separation}}\\ \cs{tlabelsep}\marg{\meta{separation}}% +\index{tlpointsep@\cs{tlpointsep}}% +\index{tlpathsep@\cs{tlpathsep}}% \index{tlabelsep@\cs{tlabelsep}} \end{cd} -This macro establishes the separation between a label and its nominal -position. It affects text written with any of the commands \cs{tlabel}, -\cs{tlabels}, \cs{axislabels} or \cs{plottext}. It also sets the -separation between the text and the curve defined by the commands -\cs{tlabelrect}, \cs{tlabeloval} or \cs{tlabelellipse}. The default is -\dim{0pt}. The value is stored by both \TeX{} and \MF. +The first macro establishes the separation between a label and its +nominal position. It affects text written with any of the commands +\cs{tlabel}, \cs{tlabels}, \cs{axislabels} or \cs{plottext}. The second +sets the separation between the text and the curve defined by the +commands \cs{tlabelrect}, \cs{tlabeloval} or \cs{tlabelellipse}. The +third sets both of these separations to the same value. It is for +backward compatibility: in the past there was only one dimension used +for both purposes. The initial value of each is \dim{0pt}. The values +are stored by both \TeX{} and \MF{}. \begin{cd} \cs{tlabeloffset}\marg{\meta{hlen}}\marg{\meta{vlen}}% @@ -3589,73 +4721,133 @@ separation between the text and the curve defined by the commands This macro establishes a uniform offset that applies to all labels. It affects text written with any of the commands \cs{tlabel}, \cs{tlabels}, -\cs{axislabels} or \cs{plottext}. The default is to have both horizontal -and vertical offsets of \dim{0pt}. The values are stored by both \TeX{} -and \MF. +\cs{axislabels} or \cs{plottext}. The initial state is to have both +horizontal and vertical offsets of \dim{0pt}. The values are stored by +both \TeX{} and \MF{}. -\begin{cd} +\begin{cd}\pagelabel{mfpdataperline} \cs{mfpdataperline}% \index{mfpdataperline@\cs{mfpdataperline}} \end{cd} -When \mfp{} is reading data from files and writing it to the -output file, this macro stores the maximum number of points that will be -written on a single line in the output file. Its default is defined by -\cs{def}\cs{mfpdataperline}\marg{5}. +When \mfp{} is reading from data files and writing to the output file, +this macro stores the maximum number of data points that will be written +on a single line in the output file. Its initial definition is +\cs{def}\cs{mfpdataperline}\marg{5}. Any such definition (or +redefinition) obeys \emph{all} \TeX{} groupings. -\begin{cd} -\cs{mfpicheight}, -\cs{mfpicwidth}% +\begin{cd}\pagelabel{mfpicheight} +\cs{mfpicheight}, \cs{mfpicwidth}% \index{mfpicheight@\cs{mfpicheight}}% \index{mfpicwidth@\cs{mfpicwidth}} \end{cd} -These \TeX{} dimensions store the height and width of the figure created -by the most recently completed \env{mfpic} environment. This might -perhaps be of interest to hackers or to aid in precise positioning of -the graphics. They are meant to be read-only: the \cs{endmfpic} command -globally sets them equal to the height and width of the picture. But -\mfp{} does not otherwise make any use of them. +These dimensions store the height and width of the figure created by the +most recently completed \env{mfpic} environment. This might perhaps be +of interest to hackers or to aid in precise positioning of the graphics. +They are meant to be read-only: the \cs{endmfpic} command globally sets +them equal to the height and width of the picture. But \mfp{} does not +otherwise make any use of them. As they are not to be changed, grouping +is irrelevent, but when \mfp{} sets them, it does so globally. These are +set even if the picture is saved with \cs{savepic}. If they are needed +for the corresponding \cs{usepic}, and that occurs after another +\env{mfpic} environment, they should be copied to other length commands +right after the \env{mfpic} environment that set them. +\begin{cd}\pagelabel{mfpiccaptionskip} +\cs{mfpiccaptionskip}% +\index{mfpiccaptionskip@\cs{mfpiccaptionskip}} +\end{cd} -\subsection{For Advanced Users.}\label{advanced} +This skip register (`rubber length' in \LaTeX) stores the space between +a picture and the caption produced with \cs{tcaption}. It is local to +all \TeX{} groups. If changed inside an \env{mfpic} environment it will +affect only the \cs{tcaption} command in that picture. It's initial +setting is \cs{medskipamount}, producing the same space as a +\cs{medskip}. -\subsubsection{Power Users.}\label{power} +\section{For Advanced Users.}\label{advanced} -\begin{cd} +\subsection{Splines}\label{splines} + +\begin{cd}\pagelabel{qspline} \cs{qspline}\marg{\meta{list}}\\ \cs{closedqspline}\marg{\meta{list}}\\ \cs{cspline}\marg{\meta{list}}\\ -\cs{closedcspline}\marg{\meta{list}}\\ +\cs{closedcspline}\marg{\meta{list}}% \index{qspline@\cs{qspline}}% \index{closedqspline@\cs{closedqspline}}% \index{cspline@\cs{cspline}}% \index{closedcspline@\cs{closedcspline}}% \end{cd} -These are alternate ways of defining curves. In each case, \meta{list} -is a comma separated list of points. These represent not the points the -curve passes through, but the \emph{control points}. The first two -produce quadratic B-splines and the last two produce cubic B-splines. If -you don't know what B-splines are, or don't know what control points -are, it is recommended you not use these commands. - -\begin{cd} +These figure macros use alternate ways of defining curves. In each case, +\meta{list} is a comma separated list of ordered pairs. These represent +not the points the curve passes through, but the \emph{control points}. +The first two produce quadratic B-splines and the last two produce cubic +B-splines. If you don't know what B-splines are, or don't know what +control points are, it is recommended you not use these commands. + +For \cs{qspline}, the curve will pass through the midpoints of the line +segments joining the points in the list, tangent to that line segment. + +For the \cs{cspline}, the list also defines line segments. Divide these +into equal thirds at two points on each segment. Connect these +\emph{division points only} to obtain line segments. Each \emph{odd +numbered} segment is the middle third of one of the original line +segments. The \cs{cspline} curve passes through the midpoint of each +\emph{even numbered} line segment, tangent to it. + +\begin{cd}\pagelabel{computedspline} +\cs{computedspline}\marg{\meta{list}}\\ +\cs{closedcomputedspline}\marg{\meta{list}}% +\index{computedspline@\cs{computedspline}}% +\index{closedcomputedspline@\cs{closedcomputedspline}}% +\end{cd} + +These figure macros both produce cubic splines. For these you \emph{do} +provide the list of points the curves are to pass through. They become +the nodes, and then the control points are computed from them. The nodes +do not uniquely determine the control points so extra equations are +required. For the first version, the extra equations give the path zero +curvature at the endpoints (a \emph{relaxed} spline). For the closed +version, the extra equations are those that close the curve smoothly. + +\begin{cd}\pagelabel{fcnspline} +\cs{fcnspline}\marg{\meta{list}}\\ +\cs{periodicfcnspline}\marg{\meta{list}}% +\index{fcnspline@\cs{fcnspline}}% +\index{periodicfcnspline@\cs{periodicfcnspline}}% +\end{cd} + +These figure macros use cubic spline equations to produce a smooth graph +of a function based on a list of points with increasing $x$-values. See +\cs{fcncurve} in section~\ref{curves} for another way to do this. As in +the computed splines, above, the spline equations at the nodes do not +provide sufficient information to compute all control points. In the +basic version, \cs{fcnspline}, extra equations produce a graph with zero +curvature at the endpoints (a relaxed spline), while the periodic +version uses equations that make the first and second derivatives at the +last point match those at the first point. + +\begin{cd}\pagelabel{cbclosed} \cs{cbclosed}$\ldots$\\ \cs{qbclosed}$\ldots$% \index{cbclosed@\cs{cbclosed}}% \index{qbclosed@\cs{qbclosed}} \end{cd} -These are prefix macros for closing curves. The first closes with a -cubic B-spline, the second with a quadratic B-spline. They will close -any given curve, but the command \cs{cbclosed} is meant to close a cubic -B-spline (see above). That is, \cs{cbclosed}\cs{cspline} should produce -the same result as \cs{closedcspline} with the same argument. The -corresponding statements are true of \cs{qbclosed}: it is meant to close -a quadratic B-spline and \cs{qbclosed}\cs{qspline} should produce the -same result as \cs{closedqspline} with the same argument. +These are modifying macros that close the following path. The first +closes with a cubic B-spline, the second with a quadratic B-spline. They +will close any given curve, but the command \cs{cbclosed} is meant to +close a cubic B-spline (see above). That is, \cs{cbclosed}\cs{cspline} +should produce the same result as \cs{closedcspline} with the same +argument. The corresponding statements are true of \cs{qbclosed}: it is +meant to close a quadratic B-spline and \cs{qbclosed}\cs{qspline} should +produce the same result as \cs{closedqspline} with the same argument. + +\subsection{B\'eziers} The power user, having noticed that \cs{curve} and \cs{cyclic} insert some direction modifiers into the path created, may have decided that @@ -3663,47 +4855,50 @@ there is no \mfp{} command to create a simple \MF{} default style path, for example \mfc{(1,1)..(0,1)..(0,0)..cycle}. If so, he or she has forgotten about \cs{mfobj}: the command \begin{verbatim} - \mfobj{(1,1)..(0,1)..(0,0)..cycle} +\mfobj{(1,1)..(0,1)..(0,0)..cycle} \end{verbatim} will produce, in the \file{.mf} file, exactly this path, but surround it -with the \TeX{} wrapping needed to make \mfp's prefix macro system work. +with the \TeX{} wrapping needed to make \mfp{}'s prefix macro system work. However, the syntax of more complicated paths can be extremely lengthy, so we offer this interface: -\begin{cd} +\begin{cd}\pagelabel{mfbezier} \cs{mfbezier}\oarg{\meta{tens}}\marg{\meta{list}}\\ \cs{closedmfbezier}\oarg{\meta{tens}}\marg{\meta{list}}% -\index{mfbezier@\cs{mfbezier}} +\index{mfbezier@\cs{mfbezier}}% \index{closedmfbezier@\cs{closedmfbezier}} \end{cd} -This connects the points in the list with the path join operator -\mfc{..tension \meta{tens}..}. If the tension option \oarg{\meta{tens}} -is omitted, the value set by \cs{settension} (initially 1) is used. One -can get a cyclic path by prepending \cs{bclosed} (with matching tension -option), but it will not produce the same result as \cs{closedmfbezier}. -These are cubic B\'ezier's (but you know that if you are a power user). -Quadratic B\'eziers (as in \LaTeX's picture environment) can be -obtained with the following: +These figure macros uses the \MF{} path join operator `\mfc{..tension +\meta{tens}..}' to connect the points in the list. If the tension option +\oarg{\meta{tens}} is omitted, the value set by \cs{settension} +(initially 1) is used. One can get a cyclic path by prepending +\cs{bclosed} (with matching tension option), but it will not produce the +same result as \cs{closedmfbezier}. These are cubic B\'ezier's (but you +know that if you are a power user). Quadratic B\'eziers (as in +\LaTeX{}'s picture environment) can be obtained with the following: -\begin{cd} +\begin{cd}\pagelabel{qbeziers} \cs{qbeziers}\oarg{\meta{tens}}\marg{\meta{list}}\\ \cs{closedqbeziers}\oarg{\meta{tens}}\marg{\meta{list}}% -\index{qbeziers@\cs{qbeziers}} +\index{qbeziers@\cs{qbeziers}}% \index{closedqbeziers@\cs{closedqbeziers}} \end{cd} -Note the plural, to indicate that they will draw a series of quadratic -B\'eziers. In the \meta{list}, the first, third, fifth, etc., are the -points to connect, while the second, fourth, etc., are the control -points. The open version requires an ending point, and so needs an odd -number of points in the list. The closed version assumes the first point -is the ending, and so requires an even number in the list. The curve -will not automatically be smooth. That depends on the choice of the -control points. +These figure macros produce quadratic B\'ezier curves, the equivalent of +a sequence of \LaTeX{} \cs{qbezier} commands. Note the plural forms, to +distinguish the first from the \LaTeX{} command, and to indicate that +they can draw a \emph{series} of quadratic B\'eziers. In the +\meta{list}, the first, third, fifth, etc., are the points to connect, +while the second, fourth, etc., are the control points. The open version +requires an ending point, and so needs an odd number of points in the +list. The closed version assumes the first point is the ending, and so +requires an even number in the list. The curve will not automatically be +smooth. That depends on the choice of the control points. +\subsection{Raw \MF{} code}\label{mfcode} -\begin{cd} +\begin{cd}\pagelabel{mfsrc} \cs{mfsrc}\marg{\meta{metafont code}}\\ \cs{mfcmd}\marg{\meta{metafont code}}\\ \cs{mflist}\marg{\meta{metafont code}}% @@ -3716,7 +4911,7 @@ These all write the \meta{metafont code} directly to the \MF{} file, using a \TeX{} \cs{write} command. Line breaks within \meta{metafont code} are preserved.% \footnote{Under most circumstances, but not if the command (plus its - argument) is part of another macro} % + argument) is part of the argument of another macro.} % Almost all the \mfp{} drawing macros invoke one of these. Because of the way \TeX{} reads and processes macro arguments, not all drawing macros preserve line breaks (nor do they all need to). However, the ones that @@ -3727,11 +4922,10 @@ in these is minor: \cs{mfsrc} writes its argument without change, \cs{mflist} surrounds its argument with parentheses and then appends a semicolon. -Using these can have some rather bizarre consequences, though, so -it is not recommended to the unwary. It is, however, currently the -only way to make use of \MF's equation solving ability. Here's an -oversimplified example: - +Using these can have some rather bizarre consequences, though, so it is +not recommended to the unwary. It is, however, currently the only way to +make use of \MF{}'s equation solving ability. Here's an oversimplified +example: \begin{verbatim} \mfpic[20]{-0.5}{1.5}{0}{1.5} \mfsrc{z1=(0,0); @@ -3741,66 +4935,115 @@ oversimplified example: \endmfpic \end{verbatim} -Check out the sample \file{forfun.tex} for a more realistic example. +Check out the sample \file{forfun.tex} for a more extensive example. It +should produce the word `\textsf{mfpic}' in blue, outlined in green in a +box with yellow background. -\begin{cd} +\subsection{Creating \MF{} variables}\label{variables} + +\begin{cd}\pagelabel{setmfvariable} \cs{setmfvariable}\marg{\meta{type}}\marg{\meta{name}}\marg{\meta{value}}\\ -\cs{setmpvariable}\marg{\meta{type}}\marg{\meta{name}}\marg{\meta{value}}% -\index{setmfvariable@\cs{setmfvariable}} -\index{setmpvariable@\cs{setmpvariable}} +\cs{setmpvariable}\marg{\meta{type}}\marg{\meta{name}}\marg{\meta{value}}\\ +\cs{globalsetmfvariable}\marg{\meta{type}}\marg{\meta{name}}\marg{\meta{value}}\\ +\cs{setmfnumeric}\marg{\meta{name}}\marg{\meta{value}}\\ +\cs{setmfpair} \marg{\meta{name}}\marg{\meta{value}}\\ +\cs{setmfboolean}\marg{\meta{name}}\marg{\meta{value}}\\ +\cs{setmfcolor} \marg{\meta{name}}\marg{\meta{value}}% +\index{setmfvariable@\cs{setmfvariable}}% +\index{setmpvariable@\cs{setmpvariable}}% +\index{globalsetmfvariable@\cs{globalsetmfvariable}}% +\index{setmfnumeric@\cs{setmfnumeric}}% +\index{setmfpair@\cs{setmfpair}}% +\index{setmfboolean@\cs{setmfboolean}}% +\index{setmfcolor@\cs{setmfcolor}}% \end{cd} These formerly internal \mfp{} macros can be use to define symbolic -names for any \MF{} or \MP{} variable type. They are interchangeable; -you can use either one with or without the \opt{metapost} option. +names for any \MF{} or \MP{} variable type. The first two are +interchangeable; you can use either one with or without the +\opt{metapost} option. The remaining four are abbreviations. For +example, \cs{setmfpair}\marg{X}\marg{(2,0)} is the same as +\cs{setmfvariable}\marg{pair}\marg{X}\marg{(2,0)}. Note that these +overwrite any variable with the specified \meta{name}. For certain +internal names, \MF{} will issue an error, but usually the variable is +silently redefined. For the four abbreviations, there is no ``mp'' +version, but they may be used with either the \opt{metapost} or +\opt{metafont} options. + +The \meta{value} must be a constant of the appropriate type or a \MF{} +expression returning the appropriate type. It can also be (or include) +other variables previously defined. + As an example of their use, since dimensions are numeric data types in -\MF, the command -\begin{ex} - \cs{setmfvariable}\marg{numeric}\verb${my_dim}$\marg{7pt} -\end{ex} +\MF{}, the command +\begin{verbatim} +\setmfnumeric{my_dim}{7pt} +\end{verbatim} would set the \MF{} variable \verb$my_dim$ to the value \texttt{7pt}. After that, \verb$my_dim$ can be used in any \emph{drawing} command where a dimension is required: -\begin{ex} - \cs{plotsymbol}\verb$[my_dim]$\marg{Triangle}\cs{rect}\marg{(0,0),(1,1)} -\end{ex} +\begin{verbatim} +\plotsymbol[my_dim]{Triangle}\rect{(0,0),(1,1)} +\end{verbatim} will plot the rectangle with small triangles spaced \dim{7pt} apart. -You can define paths this way -(\cs{setmfvariable}\marg{path}\marg{X}\marg{(0,0)..(1,1)..(0,1)}), but -the \meta{value} has to be valid \MF{} path construction syntax, -\emph{not} something like \cs{rect}\marg{$\ldots$}. You need \cs{store} -if you want to set a variable to an \mfp{} path. However, defined either -way, they can be used in \cs{mfobj}. - -A variable defined this way is local to the \env{mfpic} environment it -is contained in. It is in fact local to any \MF{} group. In \mfp, only -\cs{connect} {\dots} \cs{endconnect} and \cs{mfpic} {\dots} +The knowledgeable user may realize that \mfc{path} and \gbc{picture} are +\MF{} data types, and may want use them in \cs{setmfvariable}. It is +also true that at some level, \mfp{} figure macros produce a path and +\cs{mfpimage} produces a picture. However, \mfp{} commands cannot be +used in the value portion of \cs{setmfvariable}. The \TeX{} code that +most \mfp{} commands produce would be meaningless to \MF{}. You can +store the path produced by figure macros with \cs{store}, and store +pictures in variables with \cs{mfpimage} or even \cs{tile}. + +With the obvious exception of \cs{globalsetmfvariable} command, these +commands define the variable locally. That is, the variable will revert +to any previous definition (or become undefined) at the end of the +\env{mfpic} environment it is defined in. It is in fact local to any +\MF{} group. In \mfp{}, only \cs{connect} {\dots} \cs{endconnect}, +\cs{mfpimage} {\dots} \cs{endmfpimage}, and \cs{mfpic} {\dots} \cs{endmfpic} create \MF{} groups in the graph file. -\begin{cd} -\cs{noship}\\% -\cs{stopshipping}\\% -\cs{resumeshipping}\\% -\index{noship@\cs{noship}} -\index{stopshipping@\cs{stopshipping}} -\index{resumeshipping@\cs{resumeshipping}} -\end{cd} +A warning about variable names. \CMF{} and \MP{} allow multi-part +variable names like `\mfc{arrowhead length}' or `\mfc{X.r}' The part +after the first space or `.' is called a \mfc{suffix}. In \MF{}, +variable settings are global unless explicitly made local. The code of +the \cs{setmf...} commands does this. However, \MF{} syntax forbids this +localization when a variable name has a suffix. Moreover, if you +localize a variable, \MF{} will localize all variables with that name +plus any suffix. Even more, localizing a variable renders all variables +with the same name plus suffix locally undefined. The command +\cs{globalsetmfvariable} simply omits the localization part, so suffixes +are permitted, but it cannot `globalize' something that has previously +been localized within the same group. + +For example, suppose you use the example code in subsection~\ref{arrows} +and define a custom arrowhead path \gbc{myAH} and the corresponding +clearing path \gbc{myAH.clear}. Suppose now you try to make this head +the default for the \cs{arrow} command by doing the following. +\begin{verbatim} +\setmfvariable{path}{Arrowhead}{myAH} +\end{verbatim} +Then this assignments is local and makes \gbc{Arrowhead.clear} undefined +(locally). You cannot use \cs{setmfvariable} to define +\gbc{Arrowhead.clear}; that will produce an error from \MF{}. You need +to do +\begin{verbatim} +\setmfvariable{path}{Arrowhead}{myAH} +\globalsetmfvariable{path}{Arrowhead.clear}{myAH.clear} +\end{verbatim} +and \emph{both} assignments will be local. To make both assignments +global, use the global version in both. -\cs{stopshipping} turns off character shipping (by \MF{} to the TFM and -GF files, or by \MP{} to appropriate \EPS{} output file) until -\cs{resumeshipping} occurs. If you want just one character not shipped, -just use \cs{noship} inside the mfpic environment. This is useful if all -one wishes to do in the current \env{mfpic} environment is to make -\emph{tiles} (see below). -\begin{cd} -\cs{patharr}\marg{\meta{pv}}$\ldots$\cs{endpatharr}% -\index{patharr@\cs{patharr}}\index{endpatharr@\cs{endpatharr}} +\begin{cd}\pagelabel{patharr} +\cs{patharr}\marg{\meta{name}}$\ldots$\cs{endpatharr}% +\index{patharr@\cs{patharr}}% +\index{endpatharr@\cs{endpatharr}} \end{cd} This pair of macros, acting as an environment, accumulate all enclosing -paths, in order, into a path array named \meta{pv}. A path array is a +paths, in order, into a path array named \meta{name}. A path array is a collection of paths with a common base name indexed by integers from 1 to the number of paths. Any path in the array can be accessed by means of \cs{mfobj}. For example, after @@ -3815,158 +5058,601 @@ are used, \MF{} allows \gbc{pa1} as an abbreviation for \gbc{pa[1]}. However, if a numeric variable or some expression is used (e.g., \gbc{pa[n+1]}) the square brackets are required. -This command can only be used in an \env{mfpic} environment. The -definitions it makes are, however, global. +This command can only be used in an \env{mfpic} environment. For this +reason, the definitions it makes are global. -\emph{Note}: In \LaTeX, this pair of macros can be used in the form of a -\LaTeX-style environment called \env{patharr}---as in +\emph{Note}: In \LaTeX{}, this pair of macros can be used in the form of a +\LaTeX{}-style environment called \env{patharr}---as in \cs{begin}\marg{patharr}$\ldots$\cs{end}\marg{patharr}. -\begin{cd} -\cs{pairarray}\marg{\meta{var}}{\meta{list-of-points}}\\ -\cs{numericarray}\marg{\meta{var}}{\meta{list-of-numbers}}% +\begin{cd}\pagelabel{setmfarray} +\cs{setmfarray}\marg{\meta{type}}\marg{\meta{var}}\marg{\meta{list}}\\ +\cs{setmparray}\marg{\meta{type}}\marg{\meta{var}}\marg{\meta{list}}\\ +\cs{globalsetmfarray}\marg{\meta{type}}\marg{\meta{var}}\marg{\meta{list}}\\ +\cs{pairarray}\marg{\meta{var}}\marg{\meta{list-of-points}}\\ +\cs{numericarray}\marg{\meta{var}}\marg{\meta{list-of-numbers}}\\ +\cs{colorarray}\marg{\meta{var}}\marg{\meta{list-of-colors}}% +\index{setmfarray@\cs{setmfarray}}% +\index{setmparray@\cs{setmparray}}% +\index{globalsetmfarray@\cs{globalsetmfarray}}% \index{pairarray@\cs{pairarray}}% -\index{numericarray@\cs{numericarray}} +\index{numericarray@\cs{numericarray}}% +\index{colorarray@\cs{colorarray}} \end{cd} -These enable the simultaneous definition of pair and numeric variables. +These enable the simultaneous definition of variables. For example, after \begin{verbatim} - \pairarray{X}{(0,1),(1,1),(0,0),(1,0)} +\pairarray{X}{(0,1),(1,1),(0,0),(1,0)} \end{verbatim} the variables \mfc{X1}, \mfc{X2}, \mfc{X3}, and \mfc{X4} are equal to the given points in that order. And then \begin{verbatim} - \polyline{X1,X2,X3,X4} +\polyline{X1,X2,X3,X4} \end{verbatim} will draw the lines connecting these four points. The index may optionally be put in square brackets and may be separated from the name by any number of spaces. If a numeric expression is used instead of an explicit number, square brackets \emph{must} surround it: \gbc{X[1+1]}, -\gbc{X[2]}, \gbc{X2} and \gbc{X 2} are all the same. The arrays are -defined locally if these commands occur in an \env{mfpic} environment, -global otherwise. In all arrays, the variable \gbc{X} itself (not -followed by any digit or brackets) is a number equal to the number of -elements in the array. +\gbc{X[2]}, \gbc{X2} and \gbc{X 2} are all the same. For all these array +commands, the variable \gbc{X} by itself (not followed by any digit or +brackets) becomes a numeric variable equal to the number of elements in +the array. Except for \cs{globalsetmfarray}, the arrays are defined +locally if these commands occur in an \env{mfpic} environment, global +otherwise. Array variables may be used only where the values are processed only by -\MF{} or \MP, they are unknown to \TeX. In particular, they cannot be +\MF{} or \MP{}, they are unknown to \TeX{}. In particular, they cannot be used in commands that position text unless \opt{mplabels} is in effect. +Variables may be used in the \meta{list} parameters of commands, +but they must have been previously defined or otherwise known to \MF{}. Several commands in \mfp{} define arrays of objects that can be used in -other commands. The main ones are \cs{piechart} and \cs{barchart}. These -arrays are always global. Using \cs{piechart} causes the following -arrays to become defined: +other commands. The main ones are \cs{regpolygon}, \cs{piechart} and +\cs{barchart}. These arrays are always global (either because their +use is restricted to an \env{mfpic} environment or for backward +compatibility with the time when they were so restricted). + +Using \cs{regpolygon}{\meta{num}}\marg{X}\marg{...}\marg{...} causes a +pair array named \gbc{X} to be defined having \meta{num} elements (and +the additional pair \gbc{X0} for the center). This is in addition to +creating the actual figure. The variable \gbc{X} alone becomes a numeric +equated to \meta{num}. + +Using \cs{piechart} (or \cs{mfppiechart}) causes the following arrays to +become defined (or redefined): \begin{itemize} \item \gbc{piewedge}, a path array describing the wedges of the chart. - The command \cs{piewdge}\marg{\meta{num}} (without optional - argument) is almost exactly the same as - \cs{mfobj}\marg{piewedge[\meta{num}]}. - \item \gbc{pieangle}, a numeric array, the starting angle of each wedge. - \item \gbc{piedirection}, a pair array, the unit vectors pointing in - the directions of the centers of the wedges. If \cs{pieangle1} - is 0 and \gbc{pieangle2} is 90 degrees, then \gbc{piedirection1} - is $(\cos 45,\sin 45)$. + To access \gbc{piewedge[1]}, for example, one could use + \cs{mfobj}\marg{piewedge[1]}. This is almost exactly the + same as the \mfp{} command \cs{piewdge}\marg{1} without + optional arguments. + \item \gbc{pieangle}, a numeric array, gives the starting angles of + the wedges. + \item \gbc{piedirection}, a pair array, gives the unit vectors + pointing from the center of the piechart through middles of the + wedges. For example, if \cs{pieangle1} is 0 and \gbc{pieangle2} + is 90 degrees, then \gbc{piedirection1} is $(\cos 45,\sin 45)$, + the unit vector whose angle is $45$ degrees. \end{itemize} -Using \cs{barchart} causes the following arrays to become defined. The -exact meaning depends on whether bars are horizontal or vertical. The -following describes horizontal bars; interchange the roles of $x$ and -$y$ if they are vertical: +Using \cs{barchart} (or \cs{mfpbarchart} or any of its aliases) causes +the following arrays to become defined (or redefined). The exact meaning +depends on whether bars are horizontal or vertical. The following +describes horizontal bars; exchange the roles of $x$ and $y$ if they are +vertical (also change `right' to `top', etc.): \begin{itemize} - \item \gbc{barstart}, the position on the $y$-axis of the leading edge - of the bars. - \item \gbc{barbegin}, the $x$-coordinate of the leftmost end of the - bars. - \item \gbc{barend}, the $x$-coordinate of the rightmost end of the - bars. - \item \gbc{chartbar}, the rectangular path of the bar; \gbc{chartbar1} - is the rectangle with corners at \gbc{(barbegin1,barstart1)} and - \gbc{(barend1,barstart+barwd)}, where \gbc{barwd} is the - width (thickness) of the bar. + \item \gbc{barstart}, a numeric array, gives the position on the + $y$-axis of the leading edge of the bars. + \item \gbc{barbegin}, numeric, gives the $x$-coordinate of the + leftmost end of the bars. + \item \gbc{barend}, numeric, gives the $x$-coordinate of the rightmost + end of the bars. + \item \gbc{chartbar}, a path array, gives the actual bars. For + example, \gbc{chartbar2} is the rectangle with opposite corners + \gbc{(barbegin2,barstart2)} and \gbc{(barend2,barstart2+barwd)}, + where the numeric variable \gbc{barwd} is the thickness of the + bar (which is a height for horizontal bars). \item \gbc{barlength}, the same as \gbc{barend}. This is for backward - compatibility; the was name chosen at a time when all the bars - had one side on an axis (i.e., \gbc{barbegin[n] = 0}). + compatibility; the name was chosen at a time when all the bars + had one side on an axis. \end{itemize} -\begin{cd} +\subsection{Miscelaneous pair expressions}\label{pairexpressions} + +A useful \MF{} operator that produces points is the intermediation +operator, whose syntax is +\begin{cd} +\texttt{(\meta{num})[\meta{$p_1$},\meta{$p_2$}]} +\end{cd} +That is, a number or numeric expression in parentheses followed by +literal brackets (this is \emph{not} an optional argument) containing two points +or pair expressions separated by a comma. It returns an intermediate point on +the line through \meta{$p_1$} and \meta{$p_2$}. The formula for the +returned value is $p_1 + \mbox{\meta{num}}(p_2 - p_1)$. The midpoint is +obtained with $\mbox{\meta{num}} = .5$. If the \meta{num} is a pure +number, the parentheses can be omitted, but they are required if it is +any other numeric expression. Values of \meta{num} larger than 1 or +less than zero produce points on the line that lie outside the segment +from $p_1$ to $p_2$. This operator can also be applied to +numbers or (in \MP{}) to colors. So that \mfc{(2/3)[3,6] = 5} and +\mfc{.7[green,blue] = (0,.3,.7)}. See section~\ref{colors} for a +description of colors in \MP{} and \MF{}. + +\begin{cd} + \gbc{pathpoint(\meta{frac},\meta{name})} +\end{cd} +This is another useful \MF{} command. It requires a number, \meta{frac}, +and the \emph{name} of a previously defined \MF{} path variable. +(Defined, for example, using \cs{store}; see +subsection~\ref{transformation}). It returns the point on the path that +is approximately that fraction of the path's length from the start of +the path. For example to draw a line from $(0,0)$ to the midpoint of an +arc, do the following: +\begin{verbatim} +\store{myarc}\draw\arc{(1,0),(0,2),90} +\polyline{(0,0), pathpoint(.5,myarc)} +\end{verbatim} +\CMF{} has no general command for calculating the lengths of paths; +\CMP{} does, but it is quite slow. Thus neither program has an efficient +method for finding the described point, so \mfp{} uses \MF\slash\MP{} macros +that are faster, but less accurate than they could be. Still, the +results should (except in pathological cases) be accurate to within a +couple of percent of the length of the path. If they are not, adjust the +value of the fraction. These remarks about accuracy also hold for any +other command (such as \cs{partpath} in subsection~\ref{reversal}) that +take the fraction of a path length as a parameter. + +The \gbc{pathpoint} command is not a basic \MF{} command, but is defined +by the \prog{grafbase} macros that accompany \mfp{}. + + +\subsection{Manipulating \MF{} picture variables} + +\begin{cd}\pagelabel{tile} \cs{tile}\marg{\meta{tilename},\meta{unit},\meta{wd},\meta{ht},\meta{clip}}\\ - \ $\ldots$\\ + \ \meta{\mfp{} drawing commands}\\ \cs{endtile}% -\index{tile@\cs{tile}}\index{endtile@\cs{endtile}} +\index{tile@\cs{tile}}% +\index{endtile@\cs{endtile}} \end{cd} In this environment, all drawing commands contribute to a \emph{tile}. A \emph{tile} is a rectangular picture which may be used to fill the -interior of closed paths. The units of drawing are given by -\meta{unit}, which should be a dimension (like \dim{1pt} or \dim{2in}). -The tile's horizontal dimensions are $0$ to $\meta{wd}\cdot\meta{unit}$ -and its vertical dimensions $0$ to $\meta{ht}\cdot\meta{unit}$, so -\meta{wd} and \meta{ht} should be pure numbers. If \meta{clip} is -\mfc{true} then all drawing is clipped to be within the tile's boundary. +interior of closed paths. Actually, a tile is a composite object. After +\cs{tile}\marg{Nick, ... } $\ldots$ \cs{endtile} a picture variable +\gbc{Nick.pic} is created as well as numeric variable \gbc{Nick.wd} and +\gbc{Nick.ht}. These are needed by the \cs{tess} command, below. + +The units of drawing are given by \meta{unit}, which should be an +explicit dimension (like \dim{1pt} or \dim{2in}). The tile's horizontal +dimensions are $0$ to $\meta{wd}\cdot\meta{unit}$ and its vertical +dimensions $0$ to $\meta{ht}\cdot\meta{unit}$, so \meta{wd} and +\meta{ht} should be pure numbers. If \meta{clip} is \mfc{true} then the +drawing is clipped to be within the tile's boundary. By using this macro, you can design your own fill patterns (to use them, -see the \cs{tess} macro below), but please take some care with the -\ae sthetics! The \meta{tilename} is globally defined by this command. +see the \cs{tess} macro below), but see the warning about memory use by +the \cs{tess} command. The \meta{tilename} is globally defined by this +command. -\begin{cd} +\begin{cd}\pagelabel{tess} \cs{tess}\marg{\meta{tilename}}$\ldots$% \index{tess@\cs{tess}} \end{cd} -Tile the interior of a closed path with a tessellation comprised of -copies of the \emph{tile} specified by \meta{tilename}. There is no -default \meta{tilename}; you must make all your own tiles. Tiling an -open curve is technically an error, but the \MF{} code responds by -drawing the path and not doing any tiling. +This rendering macro tiles the interior of a closed path with a +tessellation comprised of copies of the \emph{tile} specified by +\meta{tilename}. The tile must have been previously created by +\cs{tile}\marg{\meta{tilename}, ... }. Tiling an open curve is +technically an error, but the \MF{} code responds by drawing the path +and not doing any tiling. The \MF{} code places shifted copies of the +tile picture in a rectangular grid sufficient to cover the region, then +clips it to the closed path before drawing it. Tiling large regions with complicated tiles can exceed the capacity of -some versions of \MP. There is less of a problem with \MF. This is not +some versions of \MP{}. There is less of a problem with \MF{}. This is not because \MF{} has greater capacity, but because of the natural difference between bitmaps and vector graphics. -In \MP, the tiles are copied with whatever color they are given when +In \MP{}, the tiles are copied with whatever color they are given when they are defined. They can be multicolored. -\begin{cd} +Before version 0.8, \cs{tile} was the only way to create a picture +variable, and the only way to draw this picture was with the \cs{tess} +command. Now we have the following command to place multiple copies of +a picture: + +\begin{cd}\pagelabel{putmfpimage} + \cs{putmfpimage}\marg{\meta{name}}{\meta{list}}% +\index{putmfpimage@\cs{putmfpimage}} +\end{cd} + +This take the name of a picture variable and copies the picture at each +location in the \meta{list}, which should be a comma-separated list of +coordinate pairs in graph coorcinates. The picture is copied so that its +\emph{reference point} is placed at each of the locations. The reference +point of a picture created with \cs{tile} is its lower left corner. + +\begin{cd}\pagelabel{mfpimage} + \cs{mfpimage}\oarg{\meta{refpt}}\marg{\meta{picname}}\\ + \ \meta{\mfp{} drawing commands}\\ + \cs{endmfpimage}% +\index{mfpimage@\cs{mfpimage}}% +\index{endmfpimage@\cs{endmfpimage}} +\end{cd} + +This is another way to create a picture variable. The drawing commands +within the \env{mfpimage} environment contribute not to the current +\mfp{} picture, but rather to the picture variable named in \meta{picname}. +Otherwise, they operate exactly as they would outside this environment, +using the same coordinate system and the same default values of all +parameters, etc. (unlike the \env{tile} environment, which defines its +own coordinate system). The picture is created with its reference point +at the point \meta{refpt} given in the optional argument. The default is +\texttt{(0,0)}. For example: +\begin{verbatim} +\mfpimage[(1,1)]{Jan} + \fill\rect{(0,0),(1,1)} + \fill\rect{(1,1),(2,2)} + \rect{(0,0),(2,2)} +\endmfpimage +\end{verbatim} +produces a simple 2-by-2 chessboard with its reference point at the +center point $(1,1)$. One can then write something like +\begin{verbatim} +\putmfpimage{Jan}{(1,1),(3,1),(1,3),(3,3)} +\end{verbatim} +to get a 4-by-4 chessboard: the picture \mfc{Jan} copied with its +center at each of the listed points. + +The behavior of \cs{tlabel}\,s in an \env{mfpimage} environment depends +on the setting. If \opt{mplabels} is turned off, then labels are added +by \TeX{} and are \emph{not} included as part of the named \MF{} or +\MP{} picture variable. If \opt{mplabels} is turned on and +\opt{overlaylabels} is also turned on, or if the \env{mfpimage} +environment is between \cs{startbacktext} and \cs{stopbacktext}, then +the labels will be saved and placed when the \env{mfpic} environment +ends and \emph{not} added to the named picture variable. Thus, to +include text labels in the named picture variable, you must have +\opt{mplabels} on, \opt{overlaylabels} off, and \env{mfpimage} outside +any \cs{startbacktext}\slash\cs{stopbacktext}. + +The picture created by \cs{mfpimage} is locally defined. That is, it +becomes undefined at the end of the current \env{mfpic} environment. If +one needs it to be global, one can use \cs{globalsetmfvariable} (see +subsection~\ref{variables}) to copy it to another variable. For example. +the command +\begin{verbatim} + \globalsetmfvariable{picture}{Dan}{Jan} +\end{verbatim} +would make \gbc{Dan} globally defined to be equal to the current value +of the picture \gbc{Jan}. + +You can use \cs{putmfpimage} inside a \env{mfpimage} environment, +provided the picture being placed has been previously defined. Nesting a +\env{mfpimage} inside another has not been completely tested and is not +recommended. One can use the \LaTeX{} environment construct +\cs{begin}\marg{mfpimage} $\ldots$ \cs{end}\marg{mfpimage} in a LaTeX +document instead of \cs{mfpimage} $\ldots$ \cs{endmfpimage}. + +\subsection{\CMF{} loops}\label{loops} + +All the \mfp{} loop commands create a loop (in the \MF{} language) in +the output file. The \MF{} commands in that loop are executed repeatedly. +From the point of view of \TeX{}, however each command occurs only once. +Starting with version 0.9, these loops can be created inside or outside +the \env{mfpic} drawing environment. If outside, they must not contain +any drawing commands, but can contain commands that set variables, +perform computations, etc. + +\begin{cd}\pagelabel{mfpfor} +\cs{mfpfor}\marg{\meta{for-loop header}}\\ + \ \meta{\mfp{} commands}\\ +\cs{endmfpfor}% +\index{mfpfor@\cs{mfpfor}}% +\index{endmfpfor@\cs{endmfpfor}} +\end{cd} + +This creates a for-loop in the \MF{} output file. The \cs{mfpfor} writes +the start of the loop and \cs{endmfpfor} writes the end. Any code +written in the output file between them is executed repeatedly by +\MF{}, according to the information in \meta{for-loop header}. There are +two types of header possible, illustrated by the following examples. +\begin{verbatim} +\mfpfor{center = (0,0), (1,0), (0,1)} + \gfill\circle{center,1} +\endmfpfor +\end{verbatim} +This example will fill three circles of radius 1 with centers at the +three given points. This type of header has the format +\begin{display} + \mfc{\meta{variable} = \meta{list}} +\end{display} +where \meta{variable} should be a simple variable name and \meta{list} is a +comma separated list of items of the appropriate data type. In the +above, \gbc{center} needs coordinate pairs, but in the following +\begin{verbatim} +\mfpfor{radius = 1,3,4} + \dotted\circle{(0,0),radius} +\endmfpfor +\end{verbatim} +\gbc{radius} needs numeric data. + +The other type of header uses a stepped variable: +\begin{verbatim} +\mfpfor{level = 3 step 2 until 9} + \circle{(0,0),sqrt(level)} +\endmfpfor +\end{verbatim} +This will cause the \MF{} variable \gbc{level} to step through the +values 3, 5, 7 and 9 and the circles with radius $\sqrt{3}$, $\sqrt{5}$, +etc. will be drawn. This type of header has the format +\begin{display} + \mfc{\meta{variable} = \meta{start} step \meta{delta} until \meta{stop}} +\end{display} +where \meta{variable} is as before, while \meta{start}, \meta{delta} and +\meta{stop} are numeric values. If \meta{delta} is positive the loop is +skipped entirely if \meta{stop} is less than \meta{start}. Otherwise the +loop is executed successively with the variable equal to \meta{start}, +then $\meta{start} + \meta{delta}$ then $\meta{start} + 2\meta{delta}$, +etc., as long as the variable is not greater than \meta{stop}. The +behavior is similar if \meta{delta} is negative, except the loop is +repeated only as long as the variable is not less than \meta{stop}. If +\meta{delta} is \mfc{0}, then the \MF{} run will generate an error. + +Note that the index variable (\gbc{center} and \gbc{radius} in the above +two examples) is a temporary \MF{} variable. If \opt{mplabels} is turned +on, this variable will work as expected in the \emph{location} parameter +of a \cs{tlabel} command, but if it is used in the \emph{label} part, it +will be interpreted as \TeX{} code and printed as is. + +The single word ``\mfc{upto}'' can be used as an abbreviation for +``\mfc{step 1 until}'' and ``\mfc{downto}'' for ``\mfc{step -1 until}'' +in for-loop headers. Spaces are not significant in for-loop headers. + +\begin{cd}\pagelabel{mfpwhile} + \cs{mfpwhile}\marg{\meta{condition}}\\ + \ \meta{\mfp{} commands}\\ + \cs{endmfpwhile}% +\index{mfpwhile@\cs{mfpwhile}}% +\index{endmfpwhile@\cs{endmfpwhile}} +\end{cd} + +The \meta{condition} should be an expression that can be either true or +false about a \MF{} variable that changes at some time during the loop +body. The loop body is executed (by \MF) as long as the condition is +true. Example: +\begin{verbatim} +\setmfvariable{numeric}{R}{20} +\mfpwhile{R > 1} + \rect{(0,0), (R,3R)} + \mfcmd{R:=R/2} +\endmfpwhile +\end{verbatim} +There are no \mfp{} command to \emph{systematically} change a variable, +so in this example we have resorted to directly writing a \MF{} assignment +command via \cs{mfcmd} (see subsection~\ref{mfcode} above) that reduces +\mfc{R} by half. The loop will be executed with \mfc{R} having the +successive values $20$, $10$, $5$, $2.5$, and $1.25$. The resulting +picture could have been achieved with \cs{mfpfor} using this list of +values. + +\begin{cd}\pagelabel{mfploop} +\cs{mfploop}\\ + \ \meta{\mfp{} commands}\\ +\cs{mfpuntil}\marg{\meta{condition}}\\ + \ \meta{\mfp{} commands}\\ +\cs{endmfploop}% +\index{mfploop@\cs{mfploop}}% +\index{mfpuntil@\cs{mfpuntil}}% +\index{endmfploop@\cs{endmfploop}}% +\end{cd} + +The body of this loop will be repeated until the \meta{condition} +becomes true. The condition should be some expression that can be either +true or false about a variable that changes during the loop execution. +It should eventually become true. If an \env{mfploop} environment does +not contain an \cs{mfpuntil} command, then the \cs{endmfploop} command +will generate a warning message. If the warning is ignored, and the user +has not otherwise arranged for loop termination,% + \footnote{Perhaps by means of \cs{mfsrc} commands. It is because of + this possibility that only a warning is produced and not an error.} +the \file{.mf} file will contain an infinite loop. The \cs{mfpuntil} +command will break the loop at whatever point it occurs. Example: +\begin{verbatim} +\setmfvariable{numeric}{R}{20} +\mfploop + \mfcmd{R:=R/2} + \mfpuntil{R <= 1} + \rect{(0,0), (R,3R)} +\endmfploop +\end{verbatim} +This will draw rectangles with $R$ equal to $10$, $5$, $2.5$, and +$1.25$. On the next execution of the loop the condition \mfc{R<=1} is +true, and the break occurs before the next rectangle is drawn. + +The command \cs{mfpuntil} can also be used in \env{mfpfor} and +\env{mfpwhile} environments to break the loop prematurely when the given +condition becomes true. + +All three of these loop structures bracket the inner code in a \TeX{} +group. In a \LaTeX{} document, the usual \cs{begin}\slash\cs{end} style can +be used. For example, +\begin{verbatim} +\begin{mfpfor}{radius = 1,3,4} + \circle{(0,0),radius} +\end{mfpfor} +\end{verbatim} + +\subsection{Miscellaneous}\label{misc} + +\begin{cd}\pagelabel{noship} +\cs{noship}\\% +\cs{stopshipping}\\% +\cs{resumeshipping}% +\index{noship@\cs{noship}}% +\index{stopshipping@\cs{stopshipping}}% +\index{resumeshipping@\cs{resumeshipping}} +\end{cd} + +\cs{stopshipping} turns off character shipping (by \MF{} to the TFM and +GF files, or by \MP{} to appropriate \EPS{} output file) until +\cs{resumeshipping} occurs. If you want just one character not shipped, +just use \cs{noship} inside that \env{mfpic} environment. This is useful +if all one wishes to do in the current \env{mfpic} environment is to +make tiles (see above) or define picture variables with \cs{mfpimage} or +path arrays with \cs{patharr}. While \cs{mfpimage} defines the picture +locally, one can globally copy it to another variable with +\cs{globalsetmfvariable} (see subsection~\ref{variables}). + +\begin{cd}\pagelabel{assignmfvalue} +\cs{assignmfvalue}\marg{\meta{\TeX{}-macro}}\marg{\meta{MF-expr}}\\ +\cs{assignmpvalue}\marg{\meta{\TeX{}-macro}}\marg{\meta{MP-expr}}\\ +\cs{globalassignmfvalue}\marg{\meta{\TeX{}-macro}}\marg{\meta{MF-expr}}\\ +\cs{globalassignmpvalue}\marg{\meta{\TeX{}-macro}}\marg{\meta{MP-expr}}% +\index{assignmfvalue@\cs{assignmfvalue}}% +\index{assignmpvalue@\cs{assignmpvalue}}% +\index{globalassignmfvalue@\cs{globalassignmfvalue}}% +\index{globalassignmpvalue@\cs{globalassignmpvalue}}% +\end{cd} + +The `\texttt{mf}' and `\texttt{mp}' versions of these commands differ +only in spelling; either may be substituted for the other in any +document. This command causes the \meta{MF-expr} to be written to the +output file for \MF{} to evaluate. The resulting value is then written +to the \file{.log} file of that \MF{} run. On the next \TeX{} run, if +\opt{mfpreadlog} (see section~\ref{readlog}) is in effect, the macro +\meta{\TeX{}-macro} will be defined to produce the resulting value. For +example: +\begin{verbatim} +\setmfvariable{numeric}{s}{2} +\assignmfvalue{\val}{exp s} +\tlabel(1,2){$e^s = \val$} +\end{verbatim} +After \MF{} is run and then \TeX{} run a second time, \cs{val} will +acquire the definition `7.38905', the value of \gbc{exp s} when +\gbc{s=2} (i.e., $e^2$, correct to at least the fourth decimal place). +If \opt{mplabels} is in effect, the correct label is written to the +figure file only during this second run, and a second \MP{} run will be +required. In many cases (when using \pdfTeX{}, for example, or when the +label changes the figure dimensions), a third \TeX{} run will be +required to make the figure correct when it is included in the document. + +Before \MF{} is run to evaluate the expression, the macro produces +`???'. Thus, it cannot be used in places where a number is needed (as in +the position arguments of a \cs{tlabel} command). Note also that if a +command defined by \cs{assignmfvalue} is used in a tlabel with +\opt{mplabels} in effect, then \opt{mplabels} must be in effect during +the \cs{assignmfvalue} command as well. + +The `\texttt{global}' versions make the definition of the +\meta{\TeX{}-macro} global, surviving the current group. In particular, +it can be used in other pictures. The plain versions create commands +that are only locally defined. Past versions of this manual stated that +you can say +\begin{display} + \cs{global}\cs{assignmfvalue} +\end{display} +to define the macro globally. This turned out not to be true in all +cases, and now it may not be true at all. If a global definition is +needed, use the global versions above. + +Because of the asynchronous nature of the definition process, using +\cs{assignmfvalue} with the same macro name more than once in the same +\env{mfpic} environment will not work. The macro acquires its definition +upon reading the logfile during the execution of \cs{opengraphsfile}, +and it will end up with the last definition encountered. (The same is +true for uses outside \env{mfpic} environments: the macro acquires the +last such definition.) Moreover, the definition is associated to a +picture by number. Which means that reordering the environments or +changing the numbering by any means will require the \TeX{}-\MF{}-\TeX{} +sequence (or more) to be repeated. + +If the \meta{\TeX{}-macro} is already defined, no warning will be issued +and the command will be redefined, so be careful in the name chosen. +If \opt{mplabels} is turned off when \cs{assignmfvalue} is used, but +turned on before the \meta{\TeX{}-macro} is used in a \cs{tlabel} +command, the macro definition will not be written to the \file{.mp} +file, and either an error message, or incorrect label will result +when \MP{} tries to make the tlabel. + +The concept and much of the code for \cs{assignmfvalue} came from Werner +Lemberg. However, I have rewritten it substantially to conform to \mfp{} +conventions and so any errors are my responsibility. + +\begin{cd}\pagelabel{cutoffafter} \cs{cutoffafter}\marg{\meta{obj}}\dots\\ \cs{cutoffbefore}\marg{\meta{obj}}\dots\\ \cs{trimpath}\marg{\meta{dim$_1$},\meta{dim$_2$}}\dots\\ -\cs{trimpath}\marg{\meta{dim$_1$}}\dots\\ +\cs{trimpath}\marg{\meta{dim}}\dots% \index{cutoffafter@\cs{cutoffafter}}% \index{cutoffbefore@\cs{cutoffbefore}}% \index{trimpath@\cs{trimpath}}% \end{cd} -These are prefix macros. The first two take an `object' (a variable in -which a path was previously stored using \cs{store}) and uses it to trim -one end off the following path. \cs{cutoffbefore} cuts off the part of -the path before its first intersection with the object, while -\cs{cutoffafter} cuts off the part after the last intersection. If the -path does not intersect the object, nothing is cut off. If the object -and the path intersect in more than one point, as little as possible -(usually% - \footnote{\MF's methods for finding the `first' point of +These prefix macros modify the following path by cutting part of it off. +The first two take an `object' (a variable in which a path was +previously stored using \cs{store}) and uses it to trim off one end of the +following path. \cs{cutoffbefore} cuts off the part of the path +\emph{before} its first intersection with the object, while +\cs{cutoffafter} cuts off the part \emph{after} the last intersection. +If the path does not intersect the object, nothing is cut off. If the +object and the path intersect in more than one point, as little as +possible (usually% + \footnote{\MF{}'s methods for finding the `first' point of intersection do not always find the actual first one.}) % is cut off. This is completely reliably only when there is only one point of intersection. The \cs{trimpath} macro takes two dimensions separated by commas and -trims those lengths off the initial and terminal ends of the path. If -only one dimension is given, that is used at both ends. This macro is -essentially equivalent to applying \cs{cutoffafter} and then -\cs{cutoffbefore} where the objects are circles which have radii equal -to the given dimensions and which are centered at the endpoints of the -path. Consequently, if the path is shorter than either dimension, it -will not intersect either circle and nothing will be trimmed. Similarly, -if the result of \cs{cutoffafter} is shorter than the first dimension, -then \cs{cutoffbefore} will not trim any more off. The first two macros -can be used to create a curve that starts or ends right at another -figure without having to find the point where the two curves intersect. -The third one can be used on the result to produce a curve that stops -just short of the point of intersection. - -\begin{cd} +trims those lengths off the initial and terminal ends of the path. +Alternatively, it takes one dimension and and trims that length off of +both ends. If any of \meta{dim$_1$}, \meta{dim$_2$} or \meta{dim} is +missing, it is taken to be \dim{0pt}. This macro is essentially +equivalent to applying a combination of the first two commands, using as +the objects circles which have radii equal to the given dimensions and +which are centered at the endpoints of the path. Consequently, if the +path is shorter than either dimension, it will not intersect either +circle and nothing will be trimmed. Similarly, if the result of the +first cut is too short the second cut may not cut anything off. If the +path intersects one of these circles more than once, it is not really +predictable at which point the cut will be made. + +The first two macros can be used to create a curve that starts or ends +right at another figure without having to know the point where the two +curves intersect. The third one can be used on the result to produce a +curve that stops a short distance before the point of intersection. + +\begin{cd}\pagelabel{random} +\cs{randomlines}\marg{\meta{maxshift}}\dots\\ +\cs{randomizepath}\marg{\meta{maxshift}, \meta{weirdness}}\dots +\index{randomizepath@\cs{randomizepath}}% +\index{randomlines@\cs{randomlines}} +\end{cd} + +These modify the following path by applying random shifts to the nodes +of a path. The first one, \cs{randomlines} then simply connects those +new points by straight lines, while the second one also applies +randomization to the control vectors. The \meta{maxshift} argument is +either a positive number (in graph units) that limits the distance a +node can be moved, or it is an ordered pair of positive numbers, in +which case the first limits the horizontal distance and the second +limits the vertical. If \meta{maxshift} is larger than the distance +between nodes, cusps or loops are likely in the result. + +For \cs{randomizepath} the \meta{weirdness} parameter controls how the +control vectors are modified. Roughly speaking the control vectors are +randomly rotated up to $30\langle\mathit{weirdness}\rangle$ degrees and +randomly scaled up or down by a factor of +$2^{\langle\mathit{weirdness}\rangle}$. (A `control vector' is a vector +pointing from a node to one of its control points.) However, this is +done in a way that preserves smoothness at each node where the path is +smooth. Values of \meta{weirdness} greater than 1 are probably too +weird. + + +\begin{cd}\pagelabel{mftitle} \cs{mftitle}\marg{\meta{title}}% \index{mftitle@\cs{mftitle}} \end{cd} @@ -3975,7 +5661,7 @@ Write the string \meta{title} to the \MF{} file, and use it as a \MF{} message. (See \textit{The \MF{}book}, chapter 22, page 187, for two uses of this.) -\begin{cd} +\begin{cd}\pagelabel{tmtitle} \cs{tmtitle}\marg{\meta{title}}% \index{tmtitle@\cs{tmtitle}} \end{cd} @@ -3992,7 +5678,7 @@ are so important to typesetting and drawing, it is common to use up all dimensions to store dimension values. The following is the command that handles the allocation of these dimensions. -\begin{cd} +\begin{cd}\pagelabel{newfdim} \cs{newfdim}\marg{\meta{fdim}}% \index{newfdim@\cs{newfdim}} \end{cd} @@ -4001,23 +5687,22 @@ This create a new global font dimension named \meta{fdim}, which is a \TeX{} control sequence (with backslash). It can be used almost like an ordinary \TeX{} dimension. One exception is that the \TeX{} commands \cs{advance}, \cs{multiply} and \cs{divide} cannot be applied directly -to font dimensions (nor \LaTeX's \cs{addtolength}); however, the font +to font dimensions (nor \LaTeX{}'s \cs{addtolength}); however, the font dimension can be copied to a temporary \TeX{} dimension register, which -can then be manipulated and copied back (using \cs{setlength} in \LaTeX, +can then be manipulated and copied back (using \cs{setlength} in \LaTeX{}, if desired). Another exception is that all changes to a font dimension are global in scope. Also beware that \cs{newfdim} uses font dimensions from a single font, the \file{dummy} font, which most \TeX{} systems ought to have. (You'll know if yours doesn't, because \mfp{} will fail upon loading!) Also, implementations of \TeX{} differ in the number of -font dimensions allowed per font. Hopefully, \mfp{} won't exceed your -local \TeX's limit. +font dimensions allowed per font. \Mfp{} currently uses font dimensions +23 through 52, which should be OK. -All of \mfp's basic dimension parameters are font dimensions. We have -lied slightly when we called them `\TeX{} dimensions'. We arrange for -them to be local to \env{mfpic} environments by saving their values at -the start and restoring them at the end. +Almost all of \mfp{}'s basic dimension parameters are font dimensions. +We arrange for them to be local to \env{mfpic} environments by saving +their values at the start and restoring them at the end. -\begin{cd} +\begin{cd}\pagelabel{setmfpicgraphic} \cs{setmfpicgraphic}\marg{\meta{filename}}% \index{setmfpicgraphic@\cs{setmfpicgraphic}} \end{cd} @@ -4027,7 +5712,7 @@ appendix~\ref{graphics} for a discussion of its use and its default definition. It is a user-level macro so that it can be redefined in unusual cases. It operates on the output of the following macro: -\begin{cd} +\begin{cd}\pagelabel{setfilename} \cs{setfilename}\marg{\meta{file}}\marg{\meta{num}}% \index{setfilename@\cs{setfilename}} \end{cd} @@ -4047,7 +5732,7 @@ creates the actual filename from the above two parts. It should also be completely expandable. See the appendices, subsection~\ref{graphics} for further dicussion. -\begin{cd} +\begin{cd}\pagelabel{preparemfpicgraphic} \cs{preparemfpicgraphic}\marg{\meta{filename}}% \index{preparemfpicgraphic@\cs{preparemfpicgraphic}} \end{cd} @@ -4061,7 +5746,7 @@ redefines an internal command of the graphics package to make the data available. If \cs{setmfpicgraphic} is redefined then this may also have to be redefined. -\begin{cd} +\begin{cd}\pagelabel{getmfpicoffset} \cs{getmfpicoffset}\marg{\meta{filename}}% \index{getmfpicoffset@\cs{getmfpicoffset}} \end{cd} @@ -4071,7 +5756,7 @@ store the offset of the lower left corner of the figure in the macros \cs{mfpicllx} and \cs{mfpiclly}. If \cs{setmfpicgraphic} is redefined then this may also have to be redefined. -\begin{cd} +\begin{cd}\pagelabel{ifmfpmpost} \cs{ifmfpmpost}% \index{ifmfpmpost@\cs{ifmfpmpost}} \end{cd} @@ -4084,72 +5769,50 @@ should not be changing the setting once it is set: a great deal of \mfp{} internal code depends on them, and on keeping them consistent with the \cs{opengraphsfile} commands reading of these booleans. -\begin{cd} -\cs{mfpicversion} +\begin{cd}\pagelabel{mfpicversion} +\cs{mfpicversion}% \index{mfpicversion@\cs{mfpicversion}} \end{cd} This expands to the current \mfp{} version multiplied by 100. At this -writing, it produces `\texttt{70}' because the version is 0.7. It -can be used to test for the current version: +writing, it produces `\texttt{90}' because the version is 0.9. It can +be used to test the version: \begin{verbatim} - \ifx\mfpicversion\undefined \def\mfpicversion{0}\fi - \ifnum\mfpicversion>70 ... \else ... \fi +\ifx\mfpicversion\undefined \def\mfpicversion{0}\fi +\ifnum\mfpicversion>70 ... \else ... \fi \end{verbatim} \cs{mfpicversion} was added in version 0.7. -\subsubsection{Hackers.}\label{hackers} -\Mfp{} employs a modified version of \LaTeX's \cs{@ifnextchar} -that not only skips over spaces when seeking the next character, but -also skips over \cs{relax} or tokens that have been \cs{let} equal to -it. This is because, in contexts where we try to preserve lines, we make -the end-of-line character active and set it equal to \cs{relax}. Since -it is hard to predict in what context a macro will be used, this gives -code like -\begin{ex} - \cs{function}\\ - \oarg{s1.2}\marg{0,2,.1}\marg{ x**2 } -\end{ex} -the same behavior in both.% - \footnote{Actually, because of a bug in previous versions, this was - not true, but it is now. I hope.} -One consequence is that putting \cs{relax} to stop a command from seeing -a `\texttt{[}' as the start of an optional argument will not work for -\mfp{} commands. The same holds for the `\texttt{*}' in those few -commands that have a star-form, and also for other commands that look -ahead (\cs{tlabel} looks for a `\texttt{(}' starting off the location, -and macros that operate on lists of data look ahead for -`\cs{datafile}'). This is not a serious problem, because there is only -one command (\cs{smoothdata}) that takes an optional arguments but -doesn't have mandatory arguments after that. If a `\cs{relax}' appeared -after any other \mfp{} command, it would be taken as an argument and an -error would result. In any case, \cs{empty} will stop the looking ahead -if it should ever be necessary. - -Most of \mfp's commands have arguments with parts delimited by commas +Most of \mfp{}'s commands have arguments with parts delimited by commas and parentheses. In most cases this is no problem because they are written unchanged to the \file{.mf} and there they are parsed just fine. Some commands' arguments, however, have to be parsed by both \TeX{} and -\MF. Examples are \cs{tlabel} (sometimes, under \opt{mplabels}), and +\MF{}. Examples are \cs{tlabel} (sometimes, under \opt{mplabels}), and \cs{pointdef}. One might be tempted to use \MP{} expressions there and that works fine as long as they do not contain commas or parentheses. In such cases, they can sometimes be enclosed in braces to prevent \TeX{} seeing these elements as delimiters, but sometimes these braces might get written to the \file{.mf} (or \file{.mp}) output and cause a \MF{} -(\MP) error. In such cases the following work-around might be possible: - +(\MP{}) error. In such cases the following work-around might be possible: \begin{verbatim} - \def\identity#1{#1} - \pointdef{A}(\identity{angle (1,2)},3) - \rect{(0,0),\A} +\def\identity#1{#1} +\pointdef{A}(\identity{angle (1,2)},3) +\rect{(0,0),\A} \end{verbatim} -The braces prevent \TeX's argument parsing from seeing the first comma +The braces prevent \TeX{}'s argument parsing from seeing the first comma as a delimiter, but upon writing to the \file{.mf}, the \cs{identity} commands are expanded and only the contents appear in the output. (\TeX{} parses the argument to assign meanings to \cs{Ax} and \cs{Ay}.) +If the \prog{babel} package is loaded with certain options, the comma +may become a special character. In that case, one may need to deactivate +babel shorthands before some \mfp{} code. One might use \cs{everymfpic} +to do this in every \env{mfpic} environment. In some cases, one may need +to reactivate babel shorthands insided \cs{tlabel}, and one might use +\cs{everytlabel} for this purpose. See your \prog{babel} documentation +for the commands to do these things. \clearpage @@ -4157,104 +5820,124 @@ parses the argument to assign meanings to \cs{Ax} and \cs{Ay}.) \def\subsectionmark#1{} \def\subsubsectionmark#1{} \thispagestyle{plain} -\section{Appendices}\label{appendices} +\chapter{Appendices}\label{appendices} -\subsection{Acknowledgements.}\label{acknowledgements} +\section{Acknowledgements.}\label{acknowledgements} Tom would like to thank all of the people at Dartmouth as well as out in the network world for testing \mfp{} and sending him back comments. He would particularly like to thank: -\medskip -Geoffrey Tobin %(G.Tobin@latrobe.edu.au) +Geoffrey Tobin for his many suggestions, especially about cleaning up the \MF{} code, enforcing dimensions, fixing the dotted line computations, and speeding up the shading routines (through this process, Geoffrey and Tom managed -to teach each other many of the subtleties of \MF), and for keeping +to teach each other many of the subtleties of \MF{}), and for keeping track of \mfp{} for nearly a year while Tom finished his thesis; -\medskip -Bryan Green %(bgreen@sanjuan.uvic.ca) +Bryan Green for his many suggestions, some of which (including his rewriting the \cs{tcaption} macro) ultimately led to the current version's ability to put graphs in-line or side-by-side; and -\medskip -Uwe Bonnes %(bon@lte.e-technik.uni-erlangen.de) -and Jarom\'\i r Kuben, % (vabo@muni.cz) -who worked out rewrites of \mfp{} during Tom's -working hiatus and who each contributed several valuable ideas. +Uwe Bonnes and +Jarom\'\i r Kuben, +who worked out rewrites of \mfp{} during Tom's working hiatus and who +each contributed several valuable ideas. -\medskip -Some credit also belongs to Anthony Stark, % (ajs@merck.com) +Some credit also belongs to +Anthony Stark, whose work on a FIG to \MF{} converter has had a serious impact on the -development of many of \mfp's capabilities. +development of many of \mfp{}'s capabilities. -\medskip -Finally, Tom would like to thank Alan Vlach, the other \TeX{}nician at -Berry College, for helping him decide on the format of many of the -macros, and for helping with testing. +Finally, Tom would like to thank +Alan Vlach, +the other \TeX{}nician at Berry College, for helping him decide on the +format of many of the macros, and for helping with testing. \medskip Dan Luecking would like to echo Tom's thanks to all of the above, especially Geoffrey Tobin and Jarom\'\i r Kuben. And to add the names -Taco Hoekwater, for comments, advice and suggestions, and Zaimi -Sami~Alex for suggestions. +Taco Hoekwater, for comments, advice and suggestions, Werner Lemberg, +for the \cs{assignmfvalue} command, and Zaimi Sami~Alex for suggestions. But mostly, he'd like to thank Tom Leathrum for starting it all. -\subsection{Changes History.}\label{changes} +\section{Changes History.}\label{changes} -See the file \file{changes.txt} for a somewhat sporadic and rambling -history of changes to \mfp. See the file \file{readme.txt} for a -list of any known problems. +See the file \file{changes.txt} for a somewhat sporadic history of +changes to \mfp{} (through the previous version). See the file +\file{new.txt} for changes since the previous version. See the file +\file{README} for any known problems. %\clearpage -\subsection{Summary of Options}\label{summary} +\section{Summary of Options.}\label{summary} Unless otherwise stated, any of the command forms will be local to the current \env{mfpic} environment if used inside. Otherwise it will affect all later environments. \medskip -\def\stack#1{\everycr{}\def\\{\cr}\halign{\strut##\hfil\cr#1\crcr}} -{\everycr{\noalign{\medskip}} -\halign to \hsize{\opt{#}\hfil\quad\tabskip0pt plus 1fil& - \vtop{\stack{#}}\hfil\quad& - \vtop{\parindent0pt \hsize.45\hsize \rightskip0pt plus1fil\relax - \strut\ignorespaces#\strut}\tabskip0pt\cr -{\rmfamily\scshape Option}:& \textsc{Command form(s)}:& \omit\textsc{Restrictions}: \hfil\cr +% \shortstack doesn't allow [t] aligment: +\def\stack#1{{\tabular[t]{@{}l@{}}#1\endtabular}} + +% Use halign so it will break over 2 pages +{\openup\jot +\halign to \textwidth + {#\hfil\quad\tabskip0ptplus 1fil& + #\hfil\quad& + \vtop{\parindent0pt\rightskip0pt plus 1fil\relax + \hsize.5\hsize\normalbaselines + \strut#\strut}\tabskip0pt \cr +\textsc{Option}:& \textsc{Command form(s)}:& \textsc{Restrictions}:\cr \noalign{\smallskip\hrule\smallskip} -metapost&\cs{usemetapost}& Command must come before - \cs{opengraphsfile}. Incompatible with \opt{metafont} option. \cr -metafont&\cs{usemetafont}& The default. Command must come before - \cs{opengraphsfile}. Incompatible with \opt{metapost} option. \cr -mplabels&\cs{usemplabels},\\ \cs{nomplabels}& Requires - \opt{metapost}. If command is used inside an \env{mfpic} - environment, it should come before \cs{tlabel} commands to be - affected. \cr -overlaylabels&\cs{overlaylabels},\\ \cs{nooverlaylabels}& Has no effect - without \opt{metapost}. \cr -truebbox& \cs{usetruebbox},\\ \cs{notruebbox}& Has no effect - without \opt{metapost}. \cr -clip& \cs{clipmfpic},\\ \cs{noclipmfpic}& No restrictions. \cr -clearsymbols& \cs{clearsymbols},\\ \cs{noclearsymbols}& No restrictions. \cr -centeredcaptions& \cs{usecenteredcaptions},\\ \cs{nocenteredcaptions}& - No restrictions. \cr -debug&\cs{mfpicdebugtrue},\\\cs{mfpicdebugfalse}& To turn on - debugging while \file{mfpic.tex} is loading, issue - \cs{def}\cs{mfpicdebug}\marg{true}. \cr -\vtop{\hbox{draft\strut} - \hbox{final\strut} - \hbox{nowrite\strut}}&\cs{mfpicdraft}\\ - \cs{mfpicfinal}\\ - \cs{mfpicnowrite}& Should not be used - together. Command forms should come before - \cs{opengraphsfile}\cr +\opt{metapost}& + \cs{usemetapost}& + Command must come before \cs{opengraphsfile}. + Incompatible with \opt{metafont} option.\cr +\opt{metafont}& + \cs{usemetafont}& + The default. Command must come before + \cs{opengraphsfile}. Incompatible with \opt{metapost} + option. \cr +\opt{mplabels}& + \stack{\cs{usemplabels},\\ \cs{nomplabels}}& + Requires \opt{metapost}. If command is used inside an + \env{mfpic} environment, it should come before + \cs{tlabel} commands to be affected. \cr +\opt{overlaylabels}& + \stack{\cs{overlaylabels},\\ \cs{nooverlaylabels}}& + Has no effect without \opt{metapost}. \cr +\opt{truebbox}& + \stack{\cs{usetruebbox},\\ \cs{notruebbox}}& + Has no effect without \opt{metapost}. \cr +\opt{clip}& + \stack{\cs{clipmfpic},\\ \cs{noclipmfpic}}& + No restrictions. \cr +\opt{clearsymbols}& + \stack{\cs{clearsymbols},\\ \cs{noclearsymbols}}& + No restrictions. \cr +\stack{\opt{centeredcaptions}\\ \opt{raggedcaptions}}& + \stack{\cs{usecenteredcaptions},\\ \cs{nocenteredcaptions}\\ + \cs{useraggedcaptions},\\ \cs{noraggedcaptions}}& + If command is used inside an \env{mfpic} environment, it + should come before the \cs{tcaption} command.\cr +\opt{debug}& + \stack{\cs{mfpicdebugtrue},\\\cs{mfpicdebugfalse}}& + To turn on debugging while \file{mfpic.tex} is loading, + issue \cs{def}\cs{mfpicdebug}\marg{true}.\cr +\stack{\opt{draft}\\ \opt{final}\\ \opt{nowrite}}& + \stack{\cs{mfpicdraft}\\ \cs{mfpicfinal}\\ \cs{mfpicnowrite}}& + Should not be used together. Command forms should come + before \cs{opengraphsfile} \cr +\opt{mfpreadlog}& + \cs{mfpreadlog}& + Needed for \cs{assignmfvalue}. Must occur before + \cs{opengraphsfile}. \cr }} %\clearpage -\subsection{Plotting styles for \cs{plotdata}}\label{styles} +\section{Plotting Styles for \cs{plotdata}.}\label{styles} When \cs{plotdata} passes from one curve to the next, it increments a counter and uses that counter to select a dash pattern, color, or symbol. @@ -4269,17 +5952,17 @@ These variables must not be used in the second argument of Under \cs{dashedlines}, we have the following dash patterns: \medskip -\indent\vbox{% -\halign{#\hfil\qquad&#\hfil\quad&#\hfil\strut\cr +\begin{tabular}{@{}lll} \textsc{Name}&\textsc{Pattern}&\textsc{Meaning}\cr -\noalign{\smallskip\hrule\smallskip} -\mfc{dashtype0}& \dim{0bp} & solid line \cr -\mfc{dashtype1}& \dim{3bp,4bp} & dashes \cr -\mfc{dashtype2}& \dim{0bp,4bp} & dots \cr -\mfc{dashtype3}& \dim{0bp,4bp,3bp,4bp} & dot-dash \cr -\mfc{dashtype4}& \dim{0bp,4bp,3bp,4bp,0bp,4bp} & dot-dash-dot \cr -\mfc{dashtype5}& \dim{0bp,4bp,3bp,4bp,3bp,4bp} & dot-dash-dash\cr -}} +\hline +\vbox to 10pt{}% +\mfc{dashtype0}& \dim{0bp} & solid line \\ +\mfc{dashtype1}& \dim{3bp,4bp} & dashes \\ +\mfc{dashtype2}& \dim{0bp,4bp} & dots \\ +\mfc{dashtype3}& \dim{0bp,4bp,3bp,4bp} & dot-dash \\ +\mfc{dashtype4}& \dim{0bp,4bp,3bp,4bp,0bp,4bp}& dot-dash-dot \\ +\mfc{dashtype5}& \dim{0bp,4bp,3bp,4bp,3bp,4bp}& dot-dash-dash +\end{tabular} \medskip Under \cs{coloredlines}, we have the following colors. Except for @@ -4289,19 +5972,19 @@ background. (The success of this attempt varies greatly with the output or display device.) \medskip -\indent\vbox{% -\halign{#\hfil\qquad&#\hfil\quad&#\hfil\strut\cr -\textsc{Name}&\textsc{Color}&\textsc{(r,g,b)}\cr -\noalign{\smallskip\hrule\smallskip} -\mfc{colortype0}& black & $( 0, 0, 0)$\cr -\mfc{colortype1}& red & $( 1, 0, 0)$\cr -\mfc{colortype2}& blue & $( .2, .2, 1)$\cr -\mfc{colortype3}& orange & $(.66,.34, 0)$\cr -\mfc{colortype4}& green & $( 0, .8, 0)$\cr -\mfc{colortype5}& magenta& $(.85, 0,.85)$\cr -\mfc{colortype6}& cyan & $( 0,.85,.85)$\cr -\mfc{colortype7}& yellow & $(.85,.85, 0)$\cr -}} +\begin{tabular}{@{}lll} +\textsc{Name}&\textsc{Color}&\textsc{(r,g,b)}\\ +\hline +\vbox to 10pt{}% +\mfc{colortype0}& black & $( 0, 0, 0)$\\ +\mfc{colortype1}& red & $( 1, 0, 0)$\\ +\mfc{colortype2}& blue & $( .2, .2, 1)$\\ +\mfc{colortype3}& orange & $(.66,.34, 0)$\\ +\mfc{colortype4}& green & $( 0, .8, 0)$\\ +\mfc{colortype5}& magenta& $(.85, 0,.85)$\\ +\mfc{colortype6}& cyan & $( 0,.85,.85)$\\ +\mfc{colortype7}& yellow & $(.85,.85, 0)$\\ +\end{tabular} \medskip @@ -4311,29 +5994,29 @@ are identical to the more descriptive name. Syntactically, all are \MF{} path variables. (The order changed between versions 0.6 and 0.7.) \medskip -\indent\vbox{% -\halign{#\hfil\qquad&#\hfil\strut\cr -\textsc{Name}&\textsc{Description}\cr -\noalign{\smallskip\hrule\smallskip} -\mfc{pointtype0}& \mfc{Circle} \cr -\mfc{pointtype1}& \mfc{Cross} \cr -\mfc{pointtype2}& \mfc{SolidDiamond} \cr -\mfc{pointtype3}& \mfc{Square} \cr -\mfc{pointtype4}& \mfc{Plus} \cr -\mfc{pointtype5}& \mfc{Triangle} \cr -\mfc{pointtype6}& \mfc{SolidCircle} \cr -\mfc{pointtype7}& \mfc{Star} \cr -\mfc{pointtype8}& \mfc{SolidTriangle}\cr -}} - -\subsection{Special considerations when using \MF}\label{mfconsiderations} +\begin{tabular}{@{}ll} +\textsc{Name}&\textsc{Description}\\ +\hline +\vbox to 10pt{}% +\mfc{pointtype0}& \mfc{Circle} \\ +\mfc{pointtype1}& \mfc{Cross} \\ +\mfc{pointtype2}& \mfc{SolidDiamond} \\ +\mfc{pointtype3}& \mfc{Square} \\ +\mfc{pointtype4}& \mfc{Plus} \\ +\mfc{pointtype5}& \mfc{Triangle} \\ +\mfc{pointtype6}& \mfc{SolidCircle} \\ +\mfc{pointtype7}& \mfc{Star} \\ +\mfc{pointtype8}& \mfc{SolidTriangle} +\end{tabular} + +\section{Special Considerations When Using \CMF{}.}\label{mfconsiderations} The most important restriction in \MF{} is on the size of a picture. Coordinates in \MF{} ultimately refer to pixel units in the font that is output. These are required to be less than 4096, so an absolute limit on -the size of a picture is whatever length a row of 4096 pixels is. In -fonts prepared for a LaserJet4 (600 DPI), this means about 6.8 inches. -For a 1200 DPI pronter, the limit is about 3.4 inches. +the size of a picture is whatever length a row of 4095 pixels is. In +fonts prepared for a LaserJet4 (600 DPI), this means 6.825 inches +(17.3355cm). For a 1200 DPI pronter, the limit is 3.4125 inches. A similar limit holds for numbers input, and the values of variables: \MF{} will return an error for \mfc{sin 4096}. Intermediate values can @@ -4341,45 +6024,51 @@ be greater (\mfc{sin (2*2048)} will cause no error), but final, stored results are subject to the limit. An \mfp{} example that generated an error recently was: \begin{verbatim} - \mfpicunit 1mm - \mfpic[10]{-3}{7}{-3.5}{5} - \function{-4.5,4,.1}{x*x} - \endmfpic +\mfpicunit 1mm +\mfpic[10]{-3}{7}{-3.5}{5} + \function{-4.5,4,.1}{x*x} +\endmfpic \end{verbatim} -The problem was the value of $(-4.5)^2=20.25$ in pixel units (after -multiplying by the \cs{mfpic} scaling factor the \cs{mfpicunit} in -inches and the DPI value): $20.25\times10\times0.03937\times600 > 4783$. -The error did not occur at the point of creating the font, but merely at -the point of storing the path in an internal variable for manipulation -and drawing. +The problem was the value of $4.5*4.5 = 20.25$: after multiplying by the +\cs{mfpic} scaling factor, the \cs{mfpicunit} in inches, and the DPI +value, this produces $20.25\times10\times0.03937\times600 > 4783$ pixel +units. The error did not occur at the point of creating the font, but +merely at the point of storing the path in an internal variable for +manipulation and drawing. Thus, the fact that this particular picture +was clipped to a much smaller size for printing did not help. +In \MP{}, the limit on numeric values is only 8 times as high: $32768$. +However, that is independent of printer resolution and is interpreted as +\PS{} points (\TeX{}'s `big points'). At $72$ points to the inch, this +allows figures to be about 12.64 yards (11.56m). -\subsection{Special considerations when using \MP}\label{mpconsiderations} -\subsubsection{Required support} +\section{Special Considerations When Using \CMP{}.}\label{mpconsiderations} -To use \mfp{} with \MP, the following support is needed (besides a +\subsection{Required support} + +To use \mfp{} with \MP{}, the following support is needed (besides a working \MP{} installation): -\medskip -\halign{#\hfil\quad&\vtop{\hsize 4.4 truein \raggedright \noindent - \strut#\strut}\hfil\cr -Under plain\TeX &The file \file{epsf.tex}\cr -Under \LaTeX209 &The file \file{epsf.tex} or \file{epsf.sty}\cr -Under \LaTeXe &The package \prog{graphics} or \prog{graphicx}\cr -Under \pdfLaTeX{} &The package \prog{graphics} or - \prog{graphicx} with option \opt{pdftex}\cr -Under plain \pdfTeX{} &The files \file{supp-pdf.tex} and - \file{supp-mis.tex}\cr -In all cases &The files \file{grafbase.mp} and +\medskip\noindent +\begin{tabular}{@{}lp{4.2in}} +plain \TeX{} &The file \file{epsf.tex}\\ +\LaTeX{}209 &(No longer supported, but plain \TeX{} methods +might work)\\ +\LaTeX{} &The package \prog{graphics} or \prog{graphicx}\\ +\pdfLaTeX{} &The package \prog{graphics} or + \prog{graphicx} with option \opt{pdftex}\\ +plain \pdfTeX{} &The files \file{supp-pdf.tex} and + \file{supp-mis.tex}\\ +In all cases &\raggedright The files \file{grafbase.mp} and \file{dvipsnam.mp} plus, of course, \file{mfpic.tex} (and \file{mfpic.sty} for - \LaTeX)\cr -} + \LaTeX{}) +\end{tabular} \medskip The files \file{grafbase.mp} and \file{dvipsnam.mp} should be in a -directory searched by \MP. The remaining files should be in directories +directory searched by \MP{}. The remaining files should be in directories searched by the appropriate \TeX{} variant. If \MP{} cannot find the file \file{grafbase.mp}, then by default it will try to input \file{grafbase.mf}, which is generally futile (or fatal). @@ -4387,35 +6076,36 @@ file \file{grafbase.mp}, then by default it will try to input In case \pdfLaTeX{} is used, the graphics package is given the \opt{pdftex} option. This option requires the file \file{pdftex.def} which currently inputs the files \file{supp-pdf.tex} and -\file{supp-mis.tex}. The file \file{pdftex.def} is supplied with the -\prog{graphics} package. The other two are usually supplied with a -\pdfTeX{} distribution, and are definitely part of the \ConTeXt{} -distribution. Older versions had some bugs in connection with the -\prog{babel} package. One workaround was to load the \prog{graphics} -package and \mfp{} before \prog{babel}. +\file{supp-mis.tex}. These three files should be supplied with +all \TeX{} installations.% + \footnote{At this writing, the file + \file{CTAN/macros/context/cont-mpd.zip} contains these two + \file{supp} files, plus a few others for working with \MP{}.} % +Older versions had some bugs in connection with the \prog{babel} +package. One workaround was to load the \prog{graphics} package and +\mfp{} before \prog{babel}. If the user loads one of the above required files or packages before the -\mfp{} macros are loaded then \mfp{} will not reload them. -If they have not been input, \mfp{} will load whichever one it -decides is required. In the \LaTeXe{} case, \mfp{} will load the -\prog{graphics} package. If the user wishes \prog{graphicx}, then that -package must be loaded before \mfp. +\mfp{} macros are loaded then \mfp{} will not reload them. \Mfp{} will +load whichever one it decides is required. In the \LaTeXe{} case, \mfp{} +will load the \prog{graphics} package. If the user wishes +\prog{graphicx}, then that package must be loaded before \mfp{}. -\subsubsection{\CMP{} is not \MF} +\subsection{\CMP{} is not \MF{}} -\PS{} is not a pixel oriented language and so neither is \MP. The model -for drawing objects is completely different between \MF{} and \MP, and +\PS{} is not a pixel oriented language and so neither is \MP{}. The model +for drawing objects is completely different between \MF{} and \MP{}, and so one cannot always expect the same results. \CMP{} support in \mfp{} was carefully written so that files successfully printed with \mfp{} using \MF{} would be just as successfully printed -using \MP. Nevertheless, it frequently choke on files that make use of +using \MP{}. Nevertheless, it frequently choke on files that make use of the \cs{mfsrc} command for writing code directly to the \file{.mf} file. -While \file{grafbase.mp} is closely based on \file{grafbase.mf}, much of +While \file{grafbase.mp} is closely based on \file{grafbase.mf}, some of the code had to be completely rewritten. Pictures in \MP{} are stored as (possibly nested) sequences of objects, -where objects are things like points, paths, contours, other pictures, -etc. In \MF, pictures are stored as a grid of pixels. Pictures that are +where objects are things like points, paths, contours, sub-pictures, +etc. In \MF{}, pictures are stored as a grid of pixels. Pictures that are relatively simple in one program might be very complex in the other and even exceed memory allocated for their storage. Two examples are the \cs{polkadot} and \cs{hatch} commands. When the polkadot space and size @@ -4423,17 +6113,16 @@ are both too small, a \cs{polkadot}-ed region has been known to exceed \MP{} capacity, while being well within \MF{} capacity. In \MP{} the memory consumed by \cs{hatch} goes up in direct proportion to the linear dimensions of the figure being hatched, while in \MF{} it goes up in -proportion to the area, and then the reverse can happen, with \MF's -capacity exeeded far sooner that \MP's. +proportion to the area (except in horizontal hatching), and then the +reverse can happen, with \MF{}'s capacity exeeded far sooner that \MP{}'s. In \MP{} it is important to note that each prefix modifies the result of the entire following sequence. In essence prefixes can be viewed as being applied in the opposite order to their occurrence. Example: - -\begin{ex} - \cs{dashed}\cs{gfill}\cs{rect}\marg{(0,0),(1,1)} -\end{ex} +\begin{verbatim} +\dashed\gfill\rect{(0,0),(1,1)} +\end{verbatim} This adds the dashed outline to the filled rectangle. That is, first the rectangle is defined, then it is filled, then the outline is drawn in dashed lines. This makes a difference when colors other than black are @@ -4441,9 +6130,9 @@ used. Drawing is done with the center of the virtual pen stroked down the middle of the boundary, so half of its width falls inside the rectangle. On the other hand, filling is done right up to the boundary. In this example, the dashed lines are drawn on top of part of the fill. -In the reverse order, the fill would cover part of the outline. +In the reverse order, the fill would cover part of the dashed outline. -\subsubsection{Graphic inclusion}\label{graphics} +\subsection{Graphic inclusion}\label{graphics} It may be impossible to completely cater to all possible methods of graphic inclusions with automatic tests. The macro that is invoked @@ -4451,39 +6140,44 @@ to include the \PS{} graphic is \cs{setmfpicgraphic} and the user may (carefully!) redefine this to suit special circumstances. Actually, \mfp{} runs the following sequence: -\begin{cd} -\cs{preparemfpicgraphic}\marg{\meta{filename}}\\ -\cs{setmfpicgraphic}\marg{\meta{filename}}\\ -\cs{getmfpicoffset}\marg{\meta{filename}}% +\begin{ex} + \cs{preparemfpicgraphic}\marg{\meta{filename}}\\ + \cs{setmfpicgraphic}\marg{\meta{filename}}\\ + \cs{getmfpicoffset}\marg{\meta{filename}}% \index{preparemfpicgraphic@\cs{preparemfpicgraphic}}% \index{setmfpicgraphic@\cs{setmfpicgraphic}}% \index{getmfpicoffset@\cs{getmfpicoffset}} -\end{cd} +\end{ex} The following are the default definitions for \cs{setmfpicgraphic}: -\medskip -\halign{#:\hfil&\quad#\hfil\cr -In plain \TeX& -\cs{def}\cs{setmfpicgraphic}\texttt{\#1}\marg{\cs{epsfbox}\marg{\#1}}\cr -In \LaTeX209& -\cs{def}\cs{setmfpicgraphic}\texttt{\#1}\marg{\cs{epsfbox}\marg{\#1}}\cr -In \LaTeXe& -\cs{def}\cs{setmfpicgraphic}\texttt{\#1}\marg{\cs{includegraphics}\marg{\#1}}\cr -In \pdfLaTeX& -\cs{def}\cs{setmfpicgraphic}\texttt{\#1}\marg{\cs{includegraphics}\marg{\#1}}\cr -In \pdfTeX& -\cs{def}\cs{setmfpicgraphic}\texttt{\#1}\marg{\cs{convertMPtoPDF}\marg{\#1}% - \marg{1}\marg{1}}\cr -} +\medskip\noindent +\begin{tabular}{@{}ll} +plain \TeX{}& + \cs{def}\cs{setmfpicgraphic}\texttt{\#1}\marg{\cs{epsfbox}% + \marg{\#1}}\\ +\LaTeX{}209& (No longer supported, but likely the plain \TeX{} +definition will be selected.)\\ +\LaTeX{}& + \cs{def}\cs{setmfpicgraphic}\texttt{\#1}\marg{\cs{includegraphics}% + \marg{\#1}}\\ +\pdfLaTeX{}& + \cs{def}\cs{setmfpicgraphic}\texttt{\#1}\marg{\cs{includegraphics}% + \marg{\#1}}\\ +\pdfTeX{}& + \cs{def}\cs{setmfpicgraphic}\texttt{\#1}\marg{\cs{convertMPtoPDF}% + \marg{\#1}\marg{1}\marg{1}} +\end{tabular} + \medskip Moreover, since \MP{} by default writes files with numeric extensions, we add code to each figure, so that these graphics are correctly recognized as \EPS{} or \prog{MPS}. For example, to the figure with extension \file{.1}, we add the equivalent of one of the following \begin{itemize} -\item[] \cs{DeclareGraphicsRule}\marg{.1}\marg{eps}\marg{.1}\marg{} in \LaTeXe. -\item[] \cs{DeclareGraphicsRule}\marg{.1}\marg{mps}\marg{.1}\marg{} in \pdfLaTeX. +\item[] \cs{DeclareGraphicsRule}\marg{.1}\marg{eps}\marg{.1}\marg{} in \LaTeXe{}. +\item[] \cs{DeclareGraphicsRule}\marg{.1}\marg{mps}\marg{.1}\marg{} in +\pdfLaTeX{}. \end{itemize} After running the command \cs{setmfpicgraphic}, \mfp{} runs @@ -4503,17 +6197,15 @@ file name as the only argument, although only \cs{setmfpicgraphic} currently does anything with it. One possible reason for wanting to redefine \cs{setmfpicgraphic} might -be to rescale all pictures. This is \emph{definitely not} a good idea -without the option \opt{mplabels} since the \mfp{} code for -placing labels and captions and reserving space for the picture relies -on the picture having the dimensions given by the arguments to the -\cs{mfpic} command. With \opt{mplabels} plus \opt{truebbox} it will -probably work, but (i)~it has \emph{not} been considered in writing the -\mfp{} code, (ii)~it will then scale all the text as well as the -figure, and (iii)~it will scale all line thickness, which should -normally be a design choice independent of the size of a picture. To -rescale all pictures, one need only change \cs{mfpicunit} and rerun -\TeX{} and \MP. +be to rescale all pictures. This is \emph{definitely not} a good idea. A +good deal of \mfp{}'s figure placemant code assumes that the size of the +figure is consistent with the coordinate system set up by the \cs{mfpic} +command. With \opt{mplabels} plus \opt{truebbox} it might work, but +(i)~it has \emph{not} been considered in writing the \mfp{} code, +(ii)~it will then scale all the text as well as the figure, and (iii)~it +will scale all line thickness, which should normally be a design choice +independent of the size of a picture. To rescale all pictures, one need +only change \cs{mfpicunit} and rerun \TeX{} and \MP{}. A better reason might be to allow the conversion of your \MP{} figures to some other format. Then redefining \cs{setmfpicgraphic} @@ -4538,36 +6230,43 @@ As \mfp{} is currently written, \cs{setfilename} must be definitions, no assignments such as \cs{setcounter}, and no calculations. To test whether a proposed definition is completely expandable, put -\begin{ex} -\cs{message}\marg{\texttt{***}% -\cs{setfilename}\marg{file}\marg{1}\texttt{***}} -\end{ex} +\begin{verbatim} +\message{***\setfilename{file}{1}***} +\end{verbatim} after the definition in a \file{.tex} file and view the result on the terminal or in the \file{.log} file. You should see only your expected filename between the asterisks. -\subsection{\prog{Mfpic} and the rest of the world} +\section{\prog{Mfpic} and the Rest of the World.} -\subsubsection{The literature} +\subsection{The literature} -There are at least two places where \mfp{} has garnered more than a -cursory mention. The most up-to-date is a section in \textit{The +This author has personal knowledge of only one mathematical article +which definitely uses \mfp{} to create diagrams, and that is this +author's joint paper with J.~Duncan and C.~M.~McGregor: \textit{On the +value of pi for norms in $\mathbf{R}^2$} in the College Mathematics +Journal, vol.~35, pages 84--92. + +There are at least two major publications where \mfp{} has garnered more +than a cursory mention. The most up-to-date is a section in \textit{The \LaTeX{} Graphics Companion} by Michel Goossens, Sebastian Rahtz and Frank Mittelbach. It describes a version prior to the introduction of \MP{} support, but it correctly describes a subset of its current -commands and abilities. +commands and abilities. \textit{The \LaTeX{} Companion} (Second Edition) +mentions \mfp{}, but only in its annotation of the bibliography entry +for \textit{\TeX{} Unbound} (see below). The other is \textit{\TeX{} Unbound} by Alan Hoenig, which contains a -chapter on \mfp. Unfortunately, it describes a version that was +chapter on \mfp{}. Unfortunately, it describes a version that was replaced in 1996 with version 0.2.10.9. The following summarizes the differences between the description% \footnote{While I'm at it: \textit{\TeX{} Unbound} occasionally refers to \mfp{} using a logo-like formatting in which the `MF' is in a special font and the `I' is lowered. This `logo' may suggest - a relationship between \mfp{} and \PiCTeX. There is no such + a relationship between \mfp{} and \PiCTeX{}. There is no such relationship, and there is no official logo-like designation for - \mfp.} % + \mfp{}.} % found in Chapter 15 and \mfp{} versions 0.2.10.9 through the current one: @@ -4575,14 +6274,15 @@ current one: command of the same name. The syntax is slightly different from that given for \cs{wedge}: \begin{ex} - \cs{sector}\marg{(\meta{x},\meta{y}), \meta{radius}, \meta{angle1}, \meta{angle2}} + \cs{sector}\marg{(\meta{x},\meta{y}), \meta{radius}, \meta{angle1}, + \meta{angle2}} \end{ex} The macro \cs{plr}\marg{(\meta{$r_0$},\meta{$\theta_0$}),% (\meta{$r_1$},\meta{$\theta_1$}),$\ldots$} is used to convert polar coordinate pairs to rectangular coordinates, so the commands \cs{plrcurve}, \cs{plrcyclic}, \cs{plrlines} and \cs{plrpoint} were -dropped from \mfp. Now use +dropped from \mfp{}. Now use \begin{ex} \cs{curve}\marg{\cs{plr}\marg{(\meta{$r_0$},\meta{$\theta_0$}),% (\meta{$r_1$},\meta{$\theta_1$}),$\ldots$}} @@ -4592,8 +6292,7 @@ instead of \cs{plrcurve}\marg{(\meta{$r_0$},\meta{$\theta_0$}),% (\meta{$r_1$},\meta{$\theta_1$}),$\ldots$} \end{ex} -and similarly for \cs{cyclic}, \cs{lines} and \cs{point} with respect to -\cs{plrcyclic}, \cs{plrlines} and \cs{plrpoint}. +and similarly for \cs{plrcyclic}, \cs{plrlines} and \cs{plrpoint}. \cs{fill} is now renamed \cs{gfill} to avoid conflict with the \LaTeX{} command of the same name. @@ -4610,28 +6309,25 @@ The following affine transform commands were changed from a third person indicative form (which could be confused with a plural noun) to an imperative form: -\medskip -\moveright\parindent -\vbox{% - \halign{#\qquad\hfil&#\hfil\cr - Old name: & New name:\cr - \cs{boosts} & \cs{boost}\cr - \cs{reflectsabout} & \cs{reflectabout}\cr - \cs{rotatesaround} & \cs{rotatearound}\cr - \cs{rotates} & \cs{rotate}\cr - \cs{scales} & \cs{scale}\cr - \cs{shifts} & \cs{shift}\cr - \cs{xscales} & \cs{xscale}\cr - \cs{xslants} & \cs{xslant}\cr - \cs{xyswaps} & \cs{xyswap}\cr - \cs{yscales} & \cs{yscale}\cr - \cs{yslants} & \cs{yslant}\cr - \cs{zscales} & \cs{zscale}\cr - \cs{zslants} & \cs{zslant}\cr - }% -} +\begin{ex} +\begin{tabular}{@{}ll} + Old name: & New name:\\ + \cs{boosts} & \cs{boost}\\ + \cs{reflectsabout} & \cs{reflectabout}\\ + \cs{rotatesaround} & \cs{rotatearound}\\ + \cs{rotates} & \cs{rotate}\\ + \cs{scales} & \cs{scale}\\ + \cs{shifts} & \cs{shift}\\ + \cs{xscales} & \cs{xscale}\\ + \cs{xslants} & \cs{xslant}\\ + \cs{xyswaps} & \cs{xyswap}\\ + \cs{yscales} & \cs{yscale}\\ + \cs{yslants} & \cs{yslant}\\ + \cs{zscales} & \cs{zscale}\\ + \cs{zslants} & \cs{zslant} +\end{tabular} +\end{ex} -\medskip \cs{caption} and \cs{label} are now renamed \cs{tcaption} and \cs{tlabel} to avoid conflict with the \LaTeX{} commands. @@ -4642,10 +6338,10 @@ a semicolon to its argument. \smallskip There is a misprint: \cs{axisheadlin} should be \cs{axisheadlen}. -Finally, in the \LaTeX{} template on page 496: \mfp{} now supports -the \cs{usepackage} method of loading. +Finally, in the \LaTeX{} template on page 496: recent \mfp{} may be +loaded with \cs{usepackage}. -\subsubsection{Other programs} +\subsection{Other programs} There exists a program, \prog{fig2mfpic} that produces \mfp{} code as output. The code produced (as of this writing) is somewhat old and @@ -4662,10 +6358,10 @@ There exist a package, \prog{circuit\_macros}, that can produce a variety of output formats, one of which is \mfp{} code. One writes a file (don't ask me what it consists of) and apparently processes it with \prog{m4} and then \prog{dpic} to produce the output. The \mfp{} code -produced appears to be compatible with the current \mfp. +produced appears to be compatible with the current \mfp{}. \renewcommand\mfpindexheading{% - \subsection{Index of commands, options and parameters by page}} + \section{Index of commands, options and parameters.}} \let\oldcs\cs \renewcommand{\cs}[1]{\leavevmode\mytt{\llap{\char`\\}#1}} @@ -4675,316 +6371,392 @@ produced appears to be compatible with the current \mfp. \columnseprule 0pt \columnsep 35pt -\twocolumn[\subsection{List of commands by type}] +\twocolumn[\section{List of commands by type.}] \parindent0pt \parskip0pt plus .3pt\relax \makeatletter +\renewcommand\@idxitem{\par\hangindent 10\p@} \let\item\@idxitem \makeatother -\subsubsection{Figures} - - \item \cs{arc} - \item \cs{axis} - \item \cs{btwnfcn} - \item \cs{chartbar} - \item \cs{circle} - \item \cs{closedcspline} - \item \cs{closedmfbezier} - \item \cs{closedqbeziers} - \item \cs{closedqspline} - \item \cs{cspline} - \item \cs{curve} - \item \cs{cyclic} - \item \cs{datafile} - \item \cs{ellipse} - \item \cs{fcncurve} - \item \cs{function} - \item \cs{graphbar} - \item \cs{histobar} - \item \cs{lines} - \item \cs{mfbezier} - \item \cs{mfobj} - \item \cs{parafcn} - \item \cs{piewedge} - \item \cs{plrfcn} - \item \cs{plrregion} - \item \cs{polygon} - \item \cs{polyline} - \item \cs{qbeziers} - \item \cs{qspline} - \item \cs{rect} - \item \cs{regpolygon} - \item \cs{sector} - \item \cs{tlabelcircle} - \item \cs{tlabelellipse} - \item \cs{tlabeloval} - \item \cs{tlabelrect} - \item \cs{turtle} - - -\subsubsection{Figure modifiers} - - \item \cs{arrow} - \item \cs{bclosed} - \item \cs{cbclosed} - \item \cs{connect}, \cs{endconnect} - \item \cs{cutoffafter} - \item \cs{cutoffbefore} - \item \cs{lclosed} - \item \cs{makesector} - \item \cs{partpath} - \item \cs{qbclosed} - \item \cs{reflectpath} - \item \cs{reverse} - \item \cs{rotatepath} - \item \cs{scalepath} - \item \cs{sclosed} - \item \cs{shiftpath} - \item \cs{slantpath} - \item \cs{subpath} - \item \cs{transformpath} - \item \cs{trimpath} - \item \cs{xscalepath} - \item \cs{xslantpath} - \item \cs{xyswappath} - \item \cs{yscalepath} - \item \cs{yslantpath} - - -\subsubsection{Figure renderers} - - \item \cs{dashed} - \item \cs{dotted} - \item \cs{draw} - \item \cs{gclear} - \item \cs{gclip} - \item \cs{gendashed} - \item \cs{gfill} - \item \cs{hatch} - \item \cs{lhatch} - \item \cs{plot} - \item \cs{plotdata} (sort of) - \item \cs{plotnodes} - \item \cs{polkadot} - \item \cs{rhatch} - \item \cs{shade} - \item \cs{tess} - \item \cs{thatch} - \item \cs{xhatch} - -\subsubsection{Lengths} - - - \item \cs{axisheadlen} - \item \cs{dashlen} - \item \cs{dotsize} - \item \cs{dotspace} - \item \cs{hashlen} - \item \cs{hatchspace} - \item \cs{headlen} - \item \cs{mfpiccaptionskip} - \item \cs{mfpicheight} - \item \cs{mfpicunit} - \item \cs{mfpicwidth} - \item \cs{pointsize} - \item \cs{polkadotspace} - \item \cs{shadespace} - \item \cs{sideheadlen} - \item \cs{symbolspace} - -\subsubsection{Coordinate transformation} - - \item \cs{applyT} - \item \cs{boost} - \item \cs{coords}, \cs{endcoords} - \item \cs{mirror} - \item \cs{reflectabout} - \item \cs{rotate} - \item \cs{rotatearound} - \item \cs{scale} - \item \cs{shift} - \item \cs{turn} - \item \cs{xscale} - \item \cs{xslant} - \item \cs{xyswap} - \item \cs{yscale} - \item \cs{yslant} - \item \cs{zscale} - \item \cs{zslant} - -\subsubsection{Axes, grids, and marks} - - \item \cs{axes} - \item \cs{axis} - \item \cs{axismarks} - \item \cs{bmarks} - \item \cs{doaxes} - \item \cs{grid} - \item \cs{gridarcs} - \item \cs{gridlines} - \item \cs{gridpoints} - \item \cs{gridrays} - \item \cs{hgridlines} - \item \cs{lattice} - \item \cs{lmarks} - \item \cs{plotsymbol} - \item \cs{plrgrid} - \item \cs{plrgridpoints} - \item \cs{plrpatch} - \item \cs{point} - \item \cs{rmarks} - \item \cs{tmarks} - \item \cs{vgridlines} - \item \cs{xaxis} - \item \cs{xmarks} - \item \cs{yaxis} - \item \cs{ymarks} - -\subsubsection{Setting options} - - \item \cs{clearsymbols} - \item \cs{clipmfpic} - \item \cs{mfpicdebugfalse} - \item \cs{mfpicdebugtrue} - \item \cs{mfpicdraft} - \item \cs{mfpicfinal} - \item \cs{mfpicnowrite} - \item \cs{nocenteredcaptions} - \item \cs{noclearsymbols} - \item \cs{noclipmfpic} - \item \cs{nomplabels} - \item \cs{nooverlaylabels} - \item \cs{noship} - \item \cs{notruebbox} - \item \cs{overlaylabels} - \item \cs{resumeshipping} - \item \cs{stopshipping} - \item \cs{usecenteredcaptions} - \item \cs{usemetafont} - \item \cs{usemetapost} - \item \cs{usemplabels} - \item \cs{usetruebbox} - -\subsubsection{Changing values} - - \item \cs{axismargin} - \item \cs{darkershade} - \item \cs{dashlineset} - \item \cs{dashpattern} - \item \cs{dotlineset} - \item \cs{drawpen} - \item \cs{hatchwd} - \item \cs{headshape} - \item \cs{lightershade} - \item \cs{mfpicnumber} - \item \cs{mfplinestyle} - \item \cs{mfplinetype} - \item \cs{pen} - \item \cs{penwd} - \item \cs{polkadotwd} - \item \cs{setallaxismargins} - \item \cs{setallbordermarks} - \item \cs{setaxismargins} - \item \cs{setaxismarks} - \item \cs{setbordermarks} - \item \cs{setmfvariable} - \item \cs{setmpvariable} - \item \cs{settension} - \item \cs{setxmarks} - \item \cs{setymarks} - \item \cs{shadewd} - -\subsubsection{Changing colors} - - \item \cs{backgroundcolor} - \item \cs{drawcolor} - \item \cs{fillcolor} - \item \cs{hatchcolor} - \item \cs{headcolor} - \item \cs{mfpdefinecolor} - \item \cs{pointcolor} - \item \cs{tlabelcolor} - -\subsubsection{Defining arrays} - - \item \cs{barchart} - \item \cs{bargraph} - \item \cs{histogram} - \item \cs{numericarray} - \item \cs{pairarray} - \item \cs{patharr}, \cs{endpatharr} - \item \cs{piechart} - -\subsubsection{Changing behavior} - - \item \cs{clearsymbols} - \item \cs{coloredlines} - \item \cs{dashedlines} - \item \cs{datapointsonly} - \item \cs{defaultplot} - \item \cs{everytlabel} - \item \cs{makepercentcomment} - \item \cs{makepercentother} - \item \cs{mfpdatacomment} - \item \cs{mfpdataperline} - \item \cs{mfpverbtex} - \item \cs{noclearsymbols} - \item \cs{pointedlines} - \item \cs{pointfillfalse} - \item \cs{pointfilltrue} - \item \cs{reconfigureplot} - \item \cs{setrender} - \item \cs{smoothdata} - \item \cs{tlabeljustify} - \item \cs{tlabeloffset} - \item \cs{tlabelsep} - \item \cs{tlpathjustify} - \item \cs{unsmoothdata} - \item \cs{using} - \item \cs{usingnumericdefault} - \item \cs{usingpairdefault} - -\subsubsection{Files and environments} - - \item \cs{closegraphsfile} - \item \cs{mfpframe}, \cs{endmfpframe} - \item \cs{mfpic}, \cs{endmfpic} - \item \cs{opengraphsfile} - -\subsubsection{Text} - - \item \cs{axislabels} - \item \cs{plottext} - \item \cs{tcaption} - \item \cs{tlabels} - \item \cs{tlabel} - -\subsubsection{Misc} \widowpenalty10000 - - \item \cs{fdef} - \item \cs{getmfpicoffset} - \item \cs{ifmfpmpost} - \item \cs{mfcmd} - \item \cs{mflist} - \item \cs{mfpframed} - \item \cs{mfpicversion} - \item \cs{mfpverbtex} - \item \cs{mfsrc} - \item \cs{mftitle} - \item \cs{newfdim} - \item \cs{newsavepic} - \item \cs{plr} - \item \cs{pointdef} - \item \cs{preparemfpicgraphic} - \item \cs{savepic} - \item \cs{setmfpicgraphic} - \item \cs{setfilename} - \item \cs{sequence} - \item \cs{store} - \item \cs{tile}, \cs{endtile} - \item \cs{tmtitle} - \item \cs{usepic} +\subsection{Figure macros} + + \item \cs{arc}, \pageref{arc} + \item \cs{axis}, \pageref{axis} + \item \cs{axisline}, \pageref{axisline} + \item \cs{belowfcn}, \pageref{belowfcn} + \item \cs{border}, \pageref{axisline} + \item \cs{btwnfcn}, \pageref{btwnfcn} + \item \cs{btwnplrfcn}, \pageref{btwnfcn} + \item \cs{chartbar}, \pageref{chartbar} + \item \cs{circle}, \pageref{circle} + \item \cs{computedspline},\\ + \cs{closedcomputedspline}, \pageref{computedspline} + \item \cs{convexcurve}, \cs{closedconvexcurve}, \pageref{convexcurve} + \item \cs{convexcyclic}, \pageref{convexcurve} + \item \cs{cspline}, \cs{closedcspline}, \pageref{qspline} + \item \cs{curve}, \cs{closedcurve}, \pageref{curve} + \item \cs{cyclic}, \pageref{curve} + \item \cs{datafile}, \pageref{datafile} + \item \cs{ellipse}, \pageref{ellipse} + \item \cs{fcncurve}, \pageref{fcncurve} + \item \cs{fcnspline}, \pageref{fcnspline} + \item \cs{function}, \pageref{function} + \item \cs{ganttbar}, \pageref{chartbar} + \item \cs{graphbar}, \pageref{chartbar} + \item \cs{histobar}, \pageref{chartbar} + \item \cs{levelcurve}, \pageref{levelcurve} + \item \cs{lines}, \pageref{polyline} + \item \cs{mfbezier}, \cs{closedmfbezier}, \pageref{mfbezier} + \item \cs{mfobj}, \cs{mpobj}, \pageref{mfobj} + \item \cs{parafcn}, \pageref{parafcn} + \item \cs{periodicfcnspline}, \pageref{fcnspline} + \item \cs{piewedge}, \pageref{piewedge} + \item \cs{plrfcn}, \pageref{plrfcn} + \item \cs{plrregion}, \pageref{belowfcn} + \item \cs{polygon}, \pageref{polygon} + \item \cs{polyline}, \pageref{polyline} + \item \cs{qbeziers}, \cs{closedqbeziers}, \pageref{qbeziers} + \item \cs{qspline}, \cs{closedqspline}, \pageref{qspline} + \item \cs{rect}, \pageref{rect} + \item \cs{regpolygon}, \pageref{regpolygon} + \item \cs{sector}, \pageref{sector} + \item \cs{tlabelcircle}, \pageref{tlabelellipse} + \item \cs{tlabelellipse}, \pageref{tlabelellipse} + \item \cs{tlabeloval}, \pageref{tlabeloval} + \item \cs{tlabelrect}, \pageref{tlabelrect} + \item \cs{turtle}, \pageref{turtle} + +\subsection{Macros that render} + + \item \cs{corkscrew}, \pageref{corkscrew} + \item \cs{dashed}, \pageref{dashed} + \item \cs{dotted}, \pageref{dotted} + \item \cs{doubledraw}, \pageref{doubledraw} + \item \cs{draw}, \pageref{draw} + \item \cs{gclear}, \pageref{gclear} + \item \cs{gclip}, \pageref{gclip} + \item \cs{gendashed}, \pageref{gendashed} + \item \cs{gfill}, \pageref{gfill} + \item \cs{hatch}, \pageref{hatch} + \item \cs{lhatch}, \pageref{hatch} + \item \cs{plot}, \pageref{plot} + \item \cs{plotdata}, \pageref{plotdata} + \item \cs{plotnodes}, \pageref{plotnodes} + \item \cs{polkadot}, \pageref{polkadot} + \item \cs{rhatch}, \pageref{hatch} + \item \cs{sinewave}, \pageref{zigzag} + \item \cs{shade}, \pageref{shade} + \item \cs{tess}, \pageref{tess} + \item \cs{thatch}, \pageref{thatch} + \item \cs{xhatch}, \pageref{hatch} + \item \cs{zigzag}, \pageref{zigzag} + +\subsection{Macros that append (arrows)} + + \item \cs{arrow}, \pageref{arrow} + \item \cs{arrowhead}, \pageref{arrowhead} + \item \cs{arrowmid}, \pageref{arrowhead} + \item \cs{arrowtail}, \pageref{arrowhead} + +\subsection{Macros that modify} + + \item \cs{bclosed}, \pageref{lclosed} + \item \cs{cbclosed}, \pageref{cbclosed} + \item \cs{connect}, \cs{endconnect}, \pageref{connect} + \item \cs{cutoffafter}, \pageref{cutoffafter} + \item \cs{cutoffbefore}, \pageref{cutoffafter} + \item \cs{lclosed}, \pageref{lclosed} + \item \cs{makesector}, \pageref{makesector} + \item \cs{parallelpath}, \pageref{parallelpath} + \item \cs{partpath}, \pageref{partpath} + \item \cs{qbclosed}, \pageref{cbclosed} + \item \cs{randomizepath}, \pageref{random} + \item \cs{randomlines}, \pageref{random} + \item \cs{reflectpath}, \pageref{shiftpath} + \item \cs{reverse}, \pageref{reverse} + \item \cs{rotatepath}, \pageref{shiftpath} + \item \cs{scalepath}, \pageref{shiftpath} + \item \cs{sclosed}, \pageref{lclosed} + \item \cs{shiftpath}, \pageref{shiftpath} + \item \cs{slantpath}, \pageref{shiftpath} + \item \cs{subpath}, \pageref{partpath} + \item \cs{transformpath}, \pageref{shiftpath} + \item \cs{trimpath}, \pageref{cutoffafter} + \item \cs{xscalepath}, \pageref{shiftpath} + \item \cs{xslantpath}, \pageref{shiftpath} + \item \cs{xyswappath}, \pageref{shiftpath} + \item \cs{yscalepath}, \pageref{shiftpath} + \item \cs{yslantpath}, \pageref{shiftpath} + +\subsection{Lengths} + + \item \cs{axisheadlen}, \pageref{axisheadlen} + \item \cs{dashlen}, \pageref{dashlen} + \item \cs{dotsize}, \pageref{dotsize} + \item \cs{dotspace}, \pageref{dotsize} + \item \cs{griddotsize}, \pageref{griddotsize} + \item \cs{hashlen}, \pageref{hashlen} + \item \cs{hatchspace}, \pageref{hatchspace} + \item \cs{headlen}, \pageref{headlen} + \item \cs{mfpiccaptionskip}, \pageref{mfpiccaptionskip} + \item \cs{mfpicheight}, \pageref{mfpicheight} + \item \cs{mfpicunit}, \pageref{mfpicunit} + \item \cs{mfpicwidth}, \pageref{mfpicheight} + \item \cs{pointsize}, \pageref{pointsize} + \item \cs{polkadotspace}, \pageref{polkadotspace} + \item \cs{shadespace}, \pageref{shadespace} + \item \cs{sideheadlen}, \pageref{sideheadlen} + \item \cs{symbolspace}, \pageref{symbolspace} + +\subsection{Coordinate transformation} + + \item \cs{applyT}, \pageref{applyT} + \item \cs{boost}, \pageref{applyT} + \item \cs{coords}, \cs{endcoords}, \pageref{coords} + \item \cs{mirror}, \pageref{applyT} + \item \cs{reflectabout}, \pageref{applyT} + \item \cs{rotate}, \pageref{applyT} + \item \cs{rotatearound}, \pageref{applyT} + \item \cs{scale}, \pageref{applyT} + \item \cs{shift}, \pageref{applyT} + \item \cs{turn}, \pageref{applyT} + \item \cs{xscale}, \pageref{applyT} + \item \cs{xslant}, \pageref{applyT} + \item \cs{xyswap}, \pageref{applyT} + \item \cs{yscale}, \pageref{applyT} + \item \cs{yslant}, \pageref{applyT} + \item \cs{zscale}, \pageref{applyT} + \item \cs{zslant}, \pageref{applyT} + +\subsection{Symbols, axes, grids, marks} + + \item \cs{axes}, \pageref{axes} + \item \cs{axis}, \pageref{axis} + \item \cs{axismarks}, \pageref{axismarks} + \item \cs{bmarks}, \pageref{axismarks} + \item \cs{doaxes}, \pageref{axis} + \item \cs{grid}, \pageref{grid} + \item \cs{gridarcs}, \pageref{plrgrid} + \item \cs{gridlines}, \pageref{grid} + \item \cs{gridpoints}, \pageref{grid} + \item \cs{gridrays}, \pageref{plrgrid} + \item \cs{hgridlines}, \pageref{grid} + \item \cs{lattice}, \pageref{grid} + \item \cs{lmarks}, \pageref{axismarks} + \item \cs{plotsymbol}, \pageref{plotsymbol} + \item \cs{plrgridpoints}, \pageref{plrgrid} + \item \cs{plrgrid}, \pageref{plrgrid} + \item \cs{plrpatch}, \pageref{plrgrid} + \item \cs{plrvectorfield}, \pageref{vectorfield} + \item \cs{point}, \pageref{point} + \item \cs{putmfpimage}, \pageref{putmfpimage} + \item \cs{rmarks}, \pageref{axismarks} + \item \cs{tmarks}, \pageref{axismarks} + \item \cs{vectorfield}, \pageref{vectorfield} + \item \cs{vgridlines}, \pageref{grid} + \item \cs{xaxis}, \pageref{axes} + \item \cs{xmarks}, \pageref{axismarks} + \item \cs{yaxis}, \pageref{axes} + \item \cs{ymarks}, \pageref{axismarks} + +\subsection{Symbol names} + + \item \gbc{Arrowhead}, \pageref{arrowhead} + \item \gbc{Asterisk}, \pageref{plotsymbol} + \item \gbc{Circle}, \pageref{plotsymbol} + \item \gbc{Crossbar}, \pageref{arrowhead} + \item \gbc{Cross}, \pageref{plotsymbol} + \item \gbc{Diamond}, \pageref{plotsymbol} + \item \gbc{Leftbar}, \pageref{arrowhead} + \item \gbc{Leftharpoon}, \pageref{arrowhead} + \item \gbc{Lefthook}, \pageref{arrowhead} + \item \gbc{Plus}, \pageref{plotsymbol} + \item \gbc{Rightbar}, \pageref{arrowhead} + \item \gbc{Rightharpoon}, \pageref{arrowhead} + \item \gbc{Righthook}, \pageref{arrowhead} + \item \gbc{SolidCircle}, \pageref{plotsymbol} + \item \gbc{SolidDiamond}, \pageref{plotsymbol} + \item \gbc{SolidSquare}, \pageref{plotsymbol} + \item \gbc{SolidStar}, \pageref{plotsymbol} + \item \gbc{SolidTriangle}, \pageref{plotsymbol} + \item \gbc{Square}, \pageref{plotsymbol} + \item \gbc{Star}, \pageref{plotsymbol} + \item \gbc{Triangle}, \pageref{plotsymbol} + +\subsection{Setting options} + + \item \cs{clearsymbols}, \pageref{clearsymbols} + \item \cs{clipmfpic}, \pageref{clip} + \item \cs{mfpicdebugfalse}, \pageref{debug} + \item \cs{mfpicdebugtrue}, \pageref{debug} + \item \cs{mfpicdraft}, \pageref{draft} + \item \cs{mfpicfinal}, \pageref{draft} + \item \cs{mfpicnowrite}, \pageref{draft} + \item \cs{mfpreadlog}, \pageref{readlog} + \item \cs{nocenteredcaptions}, \pageref{centeredcaptions} + \item \cs{noclearsymbols}, \pageref{clearsymbols} + \item \cs{noclipmfpic}, \pageref{clip} + \item \cs{nomplabels}, \pageref{mplabels} + \item \cs{nooverlaylabels}, \pageref{overlaylabels} + \item \cs{noraggedcaptions}, \pageref{raggedcaptions} + \item \cs{notruebbox}, \pageref{truebbox} + \item \cs{overlaylabels}, \pageref{overlaylabels} + \item \cs{usecenteredcaptions}, \pageref{centeredcaptions} + \item \cs{usemetafont}, \pageref{metapost} + \item \cs{usemetapost}, \pageref{metapost} + \item \cs{usemplabels}, \pageref{mplabels} + \item \cs{useraggedcaptions}, \pageref{raggedcaptions} + \item \cs{usetruebbox}, \pageref{truebbox} + +\subsection{Setting values} + + \item \cs{axismargin}, \pageref{axismargin} + \item \cs{darkershade}, \pageref{darkershade} + \item \cs{dashlineset}, \pageref{dashlineset} + \item \cs{dashpattern}, \pageref{dashpattern} + \item \cs{dotlineset}, \pageref{dashlineset} + \item \cs{drawpen}, \pageref{drawpen} + \item \cs{globalsetmfvariable}, \pageref{setmfvariable} + \item \cs{hatchwd}, \pageref{hatchwd} + \item \cs{headshape}, \pageref{headshape} + \item \cs{lightershade}, \pageref{darkershade} + \item \cs{mfpicnumber}, \pageref{mfpicnumber} + \item \cs{mfplinestyle}, \pageref{mfplinetype} + \item \cs{mfplinetype}, \pageref{mfplinetype} + \item \cs{pen}, \pageref{drawpen} + \item \cs{penwd}, \pageref{drawpen} + \item \cs{polkadotwd}, \pageref{polkadotwd} + \item \cs{setallaxismargins}, \pageref{axismargin} + \item \cs{setallbordermarks}, \pageref{setaxismarks} + \item \cs{setaxismargins}, \pageref{axismargin} + \item \cs{setaxismarks}, \pageref{setaxismarks} + \item \cs{setbordermarks}, \pageref{setaxismarks} + \item \cs{setmfboolean}, \pageref{setmfvariable} + \item \cs{setmfcolor}, \pageref{setmfvariable} + \item \cs{setmfnumeric}, \pageref{setmfvariable} + \item \cs{setmfpair}, \pageref{setmfvariable} + \item \cs{setmfvariable}, \pageref{setmfvariable} + \item \cs{setmpvariable}, \pageref{setmfvariable} + \item \cs{settension}, \pageref{settension} + \item \cs{setxmarks}, \pageref{setaxismarks} + \item \cs{setymarks}, \pageref{setaxismarks} + \item \cs{shadewd}, \pageref{shadewd} + +\subsection{Changing colors} + + \item \cs{backgroundcolor}, \pageref{drawcolor} + \item \cs{drawcolor}, \pageref{drawcolor} + \item \cs{fillcolor}, \pageref{drawcolor} + \item \cs{hatchcolor}, \pageref{drawcolor} + \item \cs{headcolor}, \pageref{drawcolor} + \item \cs{mfpdefinecolor}, \pageref{mfpdefinecolor} + \item \cs{pointcolor}, \pageref{drawcolor} + \item \cs{tlabelcolor}, \pageref{drawcolor} + +\subsection{Defining arrays} + + \item \cs{barchart}, \pageref{barchart} + \item \cs{bargraph}, \pageref{barchart} + \item \cs{colorarray}, \pageref{setmfarray} + \item \cs{gantt}, \pageref{barchart} + \item \cs{globalsetmfarray}, \pageref{setmfarray} + \item \cs{histogram}, \pageref{barchart} + \item \cs{mfpbarchart}, \pageref{barchart} + \item \cs{mfpbargraph}, \pageref{barchart} + \item \cs{mfpgantt}, \pageref{barchart} + \item \cs{mfphistogram}, \pageref{barchart} + \item \cs{mfppiechart}, \pageref{piechart} + \item \cs{numericarray}, \pageref{setmfarray} + \item \cs{pairarray}, \pageref{setmfarray} + \item \cs{patharr}, \cs{endpatharr}, \pageref{patharr} + \item \cs{piechart}, \pageref{piechart} + \item \cs{setmfarray}, \pageref{setmfarray} + \item \cs{setmparray}, \pageref{setmfarray} + +\subsection{Changing behavior} + + \item \cs{coloredlines}, \pageref{coloredlines} + \item \cs{dashedlines}, \pageref{coloredlines} + \item \cs{datapointsonly}, \pageref{coloredlines} + \item \cs{defaultplot}, \pageref{defaultplot} + \item \cs{everytlabel}, \pageref{everytlabel} + \item \cs{everymfpic}, \cs{everyendmfpic}, \pageref{everymfpic} + \item \cs{makepercentcomment}, \pageref{makepercentother} + \item \cs{makepercentother}, \pageref{makepercentother} + \item \cs{mfpdatacomment}, \pageref{mfpdatacomment} + \item \cs{mfpdataperline}, \pageref{mfpdataperline} + \item \cs{mfpverbtex}, \pageref{mfpverbtex} + \item \cs{noship}, \pageref{noship} + \item \cs{pointedlines}, \pageref{coloredlines} + \item \cs{pointfillfalse}, \pageref{pointfilltrue} + \item \cs{pointfilltrue}, \pageref{pointfilltrue} + \item \cs{reconfigureplot}, \pageref{reconfigureplot} + \item \cs{resumeshipping}, \pageref{noship} + \item \cs{setrender}, \pageref{setrender} + \item \cs{smoothdata}, \pageref{datafile} + \item \cs{stopshipping}, \pageref{noship} + \item \cs{tlabeljustify}, \pageref{tlabeljustify} + \item \cs{tlabeloffset}, \pageref{tlabeloffset} + \item \cs{tlabelsep}, \pageref{tlabeloffset} + \item \cs{tlpathjustify}, \pageref{tlpathjustify} + \item \cs{tlpathsep}, \pageref{tlabeloffset} + \item \cs{tlpointsep}, \pageref{tlabeloffset} + \item \cs{unsmoothdata}, \pageref{datafile} + \item \cs{using}, \pageref{using} + \item \cs{usingnumericdefault}, \pageref{usingpairdefault} + \item \cs{usingpairdefault}, \pageref{usingpairdefault} + +\subsection{Files and environments} + + \item \cs{closegraphsfile}, \pageref{opengraphsfile} + \item \cs{mfpframe}, \cs{endmfpframe}, \pageref{mfpframe} + \item \cs{mfpic}, \cs{endmfpic}, \pageref{mfpic} + \item \cs{opengraphsfile}, \pageref{opengraphsfile} + +\subsection{Text} + + \item \cs{axislabels}, \pageref{axislabels} + \item \cs{plottext}, \pageref{plottext} + \item \cs{startbacktext}, \pageref{backtext} + \item \cs{stopbacktext}, \pageref{backtext} + \item \cs{tcaption}, \pageref{tcaption} + \item \cs{tlabel}, \pageref{tlabel} + \item \cs{tlabels}, \pageref{tlabel} + +\subsection{Misc} + + \item \cs{assignmfvalue}, \pageref{assignmfvalue} + \item \cs{assignmpvalue}, \pageref{assignmfvalue} + \item \cs{fdef}, \pageref{fdef} + \item \cs{getmfpicoffset}, \pageref{getmfpicoffset} + \item \cs{globalassignmfvalue}, \pageref{assignmfvalue} + \item \cs{globalassignmpvalue}, \pageref{assignmfvalue} + \item \cs{ifmfpmpost}, \pageref{ifmfpmpost} + \item \cs{mfcmd}, \pageref{mfsrc} + \item \cs{mflist}, \pageref{mfsrc} + \item \cs{mfpfor}, \cs{endmfpfor}, \pageref{mfpfor} + \item \cs{mfpframed}, \pageref{mfpframe} + \item \cs{mfpicversion}, \pageref{mfpicversion} + \item \cs{mfpimage}, \cs{endmfpimage}, \pageref{mfpimage} + \item \cs{mfploop}, \cs{endmfploop}, \pageref{mfploop} + \item \cs{mfpuntil}, \pageref{mfploop} + \item \cs{mfpwhile}, \cs{endmfpwhile}, \pageref{mfpwhile} + \item \cs{mfsrc}, \pageref{mfsrc} + \item \cs{mftitle}, \pageref{mftitle} + \item \cs{newfdim}, \pageref{newfdim} + \item \cs{newsavepic}, \pageref{newsavepic} + \item \cs{plr}, \pageref{plr} + \item \cs{pointdef}, \pageref{pointdef} + \item \cs{preparemfpicgraphic}, \pageref{preparemfpicgraphic} + \item \cs{savepic}, \pageref{newsavepic} + \item \cs{sequence}, \pageref{sequence} + \item \cs{setfilename}, \pageref{setfilename} + \item \cs{setmfpicgraphic}, \pageref{setmfpicgraphic} + \item \cs{store}, \pageref{store} + \item \cs{tile}, \cs{endtile}, \pageref{tile} + \item \cs{tmtitle}, \pageref{tmtitle} + \item \cs{usepic}, \pageref{newsavepic} \end{document} diff --git a/Master/texmf-dist/doc/generic/mfpic/pictures.tex b/Master/texmf-dist/doc/generic/mfpic/pictures.tex index 76be74689aa..3906ef38e23 100644 --- a/Master/texmf-dist/doc/generic/mfpic/pictures.tex +++ b/Master/texmf-dist/doc/generic/mfpic/pictures.tex @@ -1,5 +1,5 @@ %%% File: pictures.tex -%%% A part of mfpic 0.7a beta 2004/04/16 +%%% A part of mfpic 0.9 2006/05/26 %%% \magnification=\magstep1 @@ -20,9 +20,9 @@ \voffset 0 truein \input mfpic -%% Uncomment this if you prefer metapost... -%\usemetapost - +%% Comment this if you prefer metafont: +\usemetapost +\useraggedcaptions \ifx\pdfoutput\UndEfInEd \else \pdfpageheight=\paperheight @@ -42,20 +42,20 @@ % |\ /| % | C-F | % |/ \| -% B- - -E +% B.....E \noindent \mfpframe \mfpic[12]{0}{10}{0}{10} \tlabeljustify{cc} -\tcaption[2.0,1.0]{\raggedright{\it Figure 1:} Commutative diagram example.} +\tcaption[2.0,1.0]{{\it Figure 1:} Commutative diagram example.} \tlabels{(1,9){A} (1,1){B} (3,5){C} (9,9){D} (9,1){E} (7,5){F}} -\setrender{\draw\arrow\trimpath{6pt}} +\setrender{\arrow\draw\trimpath{6pt}} \lines{(1,9), (1,1)} % A -> B. \lines{(1,9), (3,5)} % A -> C. \lines{(3,5), (1,1)} % C -> B. @@ -65,8 +65,7 @@ \lines{(7,5), (9,1)} % F -> E. \lines{(3,5), (7,5)} % C -> F. % B- - ->E : -%\dotted\arrow[r90][b-12pt]\arrow[b15pt]\reverse\arrow\lines{(1.5,1), (8.5,1)} -\dotted\arrow\arrow[b10pt]\reverse\arrow\trimpath{6pt}\lines{(1,1), (9,1)} +\arrow\arrow[b10pt]\reverse\arrow\dotted\trimpath{6pt}\lines{(1,1), (9,1)} \endmfpic \endmfpframe @@ -79,7 +78,7 @@ \mfpic[20]{-3}{3}{-3}{3} \axes \function{-2,2,0.1}{((x**3)-x)/3} -\tcaption{\raggedright{\it Figure 2:} Function Plot with Cartesian Axes.} +\tcaption{{\it Figure 2:} Function Plot with Cartesian Axes.} \endmfpic \endmfpframe @@ -92,7 +91,7 @@ \mfpic[30]{-1.5}{1.5}{-1}{1} \parafcn{0,6,0.1}{cosd(150t)*dir(90t)} \gfill\circle{(0,0),0.25} -\tcaption{\raggedright{\it Figure 3:} Parametric Function Plot, and +\tcaption{{\it Figure 3:} Parametric Function Plot, and Filled Circle.} \endmfpic \endmfpframe @@ -124,7 +123,7 @@ Filled Circle.} \shade\sector{(0,0), 1, 60,105} \turtle{(0,0), \plr{(1,105)}} \sector{(0,0), 1, 60,360} -\tcaption{\raggedright{\it Figure 5:} Pie Chart.} +\tcaption{{\it Figure 5:} Pie Chart.} \endmfpic \endmfpframe @@ -138,7 +137,7 @@ Filled Circle.} \mfpframe \mfpic[20]{-2}{2}{-1}{1} \arrow\circle{(0,0),1} -\tcaption{\raggedright{\it Figure 6:} Circle with Arrow.} +\tcaption{{\it Figure 6:} Circle with Arrow.} \endmfpic \endmfpframe @@ -157,7 +156,7 @@ Filled Circle.} \lines{(-1,1), (-1,-1), (1,-1.5)} \point{(0,0)} \dotted\reverse\lines{(-2,2), (-2,-2), (2,-3)} -\tcaption{\rightskip= 0pt plus 3em {\it Figure 7:} Use of hatch, draw, lclosed, connect, +\tcaption{{\it Figure 7:} Use of hatch, draw, lclosed, connect, curve, point, lines, dotted, reverse.} \endmfpic \endmfpframe @@ -169,13 +168,13 @@ Filled Circle.} \noindent \mfpframe \mfpic[40]{-1}{1}{-1}{1} % Was `[20]'. -\tcaption{\raggedright{\it Figure 8:} Simpler variant of the previous figure.} +\tcaption{{\it Figure 8:} Simpler variant of the previous figure.} \hatch\draw\lclosed\connect \curve{(1,0), (0.5,0.25), (0.5,0.5), (0,0.75)} \point{(0,0)} \endconnect \reverse\lines{(-0.5,0.5), (-0.5,-0.5), (0.5,-0.75)} -\tcaption{\raggedright{\it Figure 8:} Simpler variant of the previous figure.} +\tcaption{{\it Figure 8:} Simpler variant of the previous figure.} \endmfpic \endmfpframe @@ -192,6 +191,7 @@ Filled Circle.} \mfpdatacomment\# \fcncurve\datafile{data.dat} \axes +\tcaption{{\it Figure 9:} Example of a graph drawn from data in a file} \endmfpic \endmfpframe diff --git a/Master/texmf-dist/doc/generic/mfpic/refcard.tex b/Master/texmf-dist/doc/generic/mfpic/refcard.tex deleted file mode 100644 index 7078e262e48..00000000000 --- a/Master/texmf-dist/doc/generic/mfpic/refcard.tex +++ /dev/null @@ -1,651 +0,0 @@ -%%% File: refcard.tex -%%% A part of mfpic 0.7a beta 2004/04/16 -%%% -% (Ask your driver to print so that longer dimension is horizontal) -\newdimen\paperlongside - \paperlongside 11 truein -\newdimen\papershortside - \papershortside 8.5 truein - -\ifx\pdfoutput\undefined -\else\ifx\pdfoutput\relax -\else\ifnum\pdfoutput>0 - \pdfpagewidth\paperlongside - \pdfpageheight\papershortside -\fi\fi\fi - -\font\manual=cmcsc8 -\def\MF{{\manual meta}\-{\manual font}} -\def\MP{{\manual meta}\-{\manual post}} -\def\TeX{{\rm T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\null}} -\def\plainTeX{{\rm plain\kern -.15em\TeX}} -\def\LaTeX{{\rm L\raise.42ex\hbox{\kern-.36em \manual a}\kern-.15em\TeX}} -%\def\LaTeXe{\LaTeX$2_{\textstyle\varepsilon}$} -\def\gobble#1{} -\def\dooptparam[#1]{{\tt[#1]}\futurelet\nchr\domacro} -\def\dofixparam[#1]{{\tt\string{#1\string}}\futurelet\nchr\domacro} -\def\doparamswap{\if?\nchr\dooptparam[\expandafter\gobble - \else\dofixparam[\fi} -\def\doparam{\futurelet\nchr\doparamswap} -\def\ddoparam{\expandafter\doparam\gobble} -\def\domacro{\if[\nchr\expandafter\ddoparam\fi} -\def\bsl{{\tt\char\escapechar}} -\def\mac#1{\bsl{\tt#1}\futurelet\nchr\domacro} - -% logical markup to typeset filenames, program names, MF code, -% grafbase identifiers, environment names, email addresses, and -% emphasis. -\def\file#1{{\tt #1}} -\def\prog#1{{\sf #1}} % didn't want everything in \tt -\def\mfc#1{{\tt #1}} -\def\opt#1{{\tt #1}} % LaTeX2e option names -\def\gbc#1{{\tt #1}} -\def\env#1{{\tt #1}} -\def\mail#1{{\tt #1}} -\def\emph#1{{\it #1\/}} - -% Forced, Clean, Linebreak. - -\def\brk{\nobreak\hfil\break} - -\newcount\columnsperpage - -% Entries are too wide for 3 columns. Print 2 columns landscape -\columnsperpage=2 - -% The rest of this header is nicked from gnuplot (which took it from -% Emacs) but was drastically adapted for mfpic. -% -% This file is intended to be processed by plainTeX. -% -% You will need to inform your dvi driver to print it in landscape -% and, optionally, double sided. -% Author of GNU Emacs Refcard: -% Stephen Gildea -% UUCP: mit-erl!gildea -% Internet: gildea@erl.mit.edu -% -% Person who ripped off the formatter for gnuplot: -% Alex Woo -% NASA Ames Research Center -% Internet: woo@ames.arc.nasa.gov -% -% Modified on 9 Dec 1992 by: -% Daniel S. Lewart -% University of Illinois -% Internet: d-lewart@uiuc.edu -% -% Modified on 29 Sep 1999, 11 Jul 2002, 29 Sep 2003 %(for mfpic) by: -% Daniel H. Luecking -% University of Arkansas -% luecking@uark.edu - -\newdimen\intercolumnskip -\newbox\columna -\newbox\columnb - -\hsize4.75truein -\vsize 7.25truein - -% Equal left right, right and middle margins, about .5in on USletter -\intercolumnskip=\paperlongside -\advance\intercolumnskip -2\hsize -\intercolumnskip .33333\intercolumnskip -\hoffset\intercolumnskip -\advance\hoffset -1truein - -% Equal top and bottom margins, about .4in on A4 paper -\voffset\papershortside -\advance\voffset-\vsize -\voffset .5\voffset -\advance\voffset -1truein - -\topskip8truept - -\font\manual=cmcsc10 at 8pt -\font\titlefont=cmbx10 scaled \magstep1 -\font\headingfont=cmbx10 -\font\smallfont=cmr6 -\font\smallsy=cmsy6 -\font\eighti=cmmi8 -\font\sixi=cmmi6 -\font\eightex=cmex10 at 8pt -\font\eightrm=cmr8 -\font\eightbf=cmbx8 -\let\subheadingfont\eightbf -\font\sixbf=cmbx6 -\font\eightit=cmti8 -\font\eighttt=cmtt8 -\font\eightsy=cmsy8 -\font\sixsy=cmsy6 -\font\eightsf=cmss10 at 8pt -\font\eightsl=cmsl8 -\font\tensf=cmss10 -\textfont0=\eightrm \scriptfont0=\smallfont -\textfont1=\eighti \scriptfont1=\sixi -\textfont2=\eightsy \scriptfont2=\sixsy -\textfont3=\eightex \scriptfont3=\eightex \scriptscriptfont3=\eightex -\textfont\bffam\eightbf \scriptfont\bffam\sixbf -\def\rm{\fam0\eightrm} -\def\bf{\fam\bffam\eightbf} -\def\it{\eightit} -\def\tt{\eighttt} -\def\sf{\eightsf} -\def\sl{\eightsl} -\smallskipamount 2pt plus 1pt minus 0pt -\medskipamount 5pt plus 2pt minus 2pt -\bigskipamount 10pt plus 3pt minus 3pt -\normalbaselineskip=10pt -\normalbaselines -\rm -\setbox\strutbox=\hbox{\vrule height6.8pt depth3.2pt width0pt} - -\def\abc{a} -\output={% - \if b\abc \multicolumnformat \global\def\abc{a} - \else\if a\abc - \global\setbox\columna\columnbox \global\def\abc{b} - \global\setbox\columnb\hbox to -\intercolumnskip{} - \fi\fi} -\def\multicolumnformat{\shipout\vbox{% - \hbox{\box\columna\hskip\intercolumnskip - \box\columnb\hskip\intercolumnskip\columnbox}}\advancepageno} -\def\columnbox{\leftline{\pagebody}} - -\def\bye{\par\vfill\supereject - \if a\abc \else\null\vfill\eject\fi - \if a\abc \else\null\vfill\eject\fi - \end} - -% Typewriter type braces (redefinitions of escaped braces) : -\def\{{{\tt \char`\{}} -\def\}{{\tt\char`\}}} - - -\parindent 0pt - -\def\title#1{{\titlefont\centerline{#1}}\vskip 1ex plus .5ex} - -\def\section#1{\par\filbreak - \vskip 2.25ex plus 2ex minus 2ex {\headingfont #1}% - \vskip 1.25ex plus 1ex minus 1.5ex} - -\def\subsection#1{\ifhmode\par\fi - \ifdim\lastskip<1.5ex - \vskip -\lastskip - \vskip 1.5ex plus 1ex minus 1ex - \fi - \filbreak - {\subheadingfont #1}% - \vskip .75ex plus .5ex minus .5ex} - -\newdimen\describeindent -\describeindent=0em - -\def\var#1{$\langle${\it #1\/}$\rangle$} -\def\alt{\unskip$\;|\;$\hfilbreak} -\def\hfilbreak{\hfil\allowbreak\hfilneg} - -\newdimen\secondkeyindent - -\def\describe#1#2{\leavevmode\vtop - {\hsize=\firstkeyfrac\hsize\rightskip=1em plus 1 fill\relax - \secondkeyindent\describeindent \advance\secondkeyindent 1em - \hangindent\secondkeyindent \hangafter1 - \hskip\describeindent\relax\strut#1\nobreak\hskip0pt\strut}% - \vtop - {\hsize=\secondkeyfrac\hsize\rightskip=0pt plus 1 fill\relax - \leavevmode\strut#2\unskip\strut}\par} -\def\code#1{{\sf #1}} - -\title{MFPIC Quick Reference} - -\centerline{(Copyright 2000--2003 by Daniel Luecking)} -\medskip -This information was prepared for version 0.7 of \prog{mfpic}. - -\section{Preamble commands} - -\def\firstkeyfrac{.4} -\def\secondkeyfrac{.6} - -\describe{Load \prog{mfpic} package:} - {\mac{input} \file{mfpic}, or \mac{usepackage}[?\var{options}][mfpic]} -\describe{Options}{\opt{metafont} \alt \opt{metapost}, \opt{mplabels}, - overlaylabels \opt{centeredcaptions}, \opt{clip}, - \opt{truebbox}, \opt{draft}, \opt{final}, \opt{nowrite}} -\describe{Activate options (\plainTeX)} - {\mac{usemetafont} \alt \mac{usemetapost}, \mac{usemplabels}, - \mac{overlaylabels} \mac{usecenteredcaptions}, \mac{clipmfpic}, - \mac{usetruebbox}, \mac{mfpicdraft}, \mac{mfpicfinal}, - \mac{mfpicnowrite}} -\describe{Turn off some options} - {\mac{nomplabels}, \mac{nooverlaylabels} - \mac{nocenteredcaptions}, \mac{noclipmfpic}, \mac{notruebbox}} -\describe{Set up/close the output file} - {\mac{opengraphsfile}[\var{base name}]$\ldots$\mac{closegraphsfile}} - -\section{The {\tensf mfpic} environment} - -\def\firstkeyfrac{.30} -\def\secondkeyfrac{.70} - -\describe{Start an \prog{mfpic} figure} - {\mac{mfpic}[?\var{xscale}][?\var{yscale}]% - \{\var{$x_{\min}$}\}\allowbreak\{\var{$x_{ max}$}\}\allowbreak - \{\var{$y_{min}$}\}\allowbreak\{\var{$y_{max}$}\}\brk - \ \ \ \ \var{MFpic commands}\brk - \mac{endmfpic}} -\describe{\quad\LaTeX{} (optional)} - {\mac{begin}[mfpic]${}\equiv{}$\mac{mfpic}, - \mac{end}[mfpic]${}\equiv{}$\mac{endmfpic}} - -\smallskip -The default \var{xscale} is $1$ (\mac{mfpicunit}), default \var{yscale} -is \var{xscale}. - -\section{Dimensions (lengths)} - -\def\firstkeyfrac{.58} -\def\secondkeyfrac{.42} - -\describe{\sl Purpose; where used:} {\sl Name and default value:} -\vskip1pt -\describe{Unit of length; \mac{mfpic}} {\mac{mfpicunit}, \tt 1pt} -\describe{Size of a symbol; \mac{point}, \mac{plot}, and \mac{plotsymbol}} - {\mac{pointsize}, \tt 2pt} -\describe{Darkness of shading; \mac{shade}} {\mac{shadespace}, \tt 1pt } -\describe{Space between dots; \mac{polkadot}} - {\mac{polkadotspace}, \tt 10pt} -\describe{Space between hatch lines; hatching macros} - {\mac{hatchspace}, \tt 3pt} -\describe{Size of arrowhead; \mac{arrow}} {\mac{headlen}, \tt 3pt} -\describe{Size of x-, y-axis arrowhead; xy-axes macros} - {\mac{axisheadlen}, \tt 5pt} -\describe{Size of border axis arrowhead; side axis macros} - {\mac{sideheadlen}, \tt 0pt} -\describe{Size of marks on axes; axis marks} {\mac{hashlen}, \tt 4pt} -\describe{Size of dashes; \mac{dashed}} {\mac{dashlen}, \tt 4pt} -\describe{Space between dashes; \mac{dashed}} {\mac{dashspace}, \tt 4pt} -\describe{Size of dots; \mac{dotted}} {\mac{dotsize}, \tt 0.5pt} -\describe{Space between dots; \mac{dotted}} {\mac{dotspace}, 3pt} -\describe{Space between symbols; \mac{plot}} {\mac{symbolspace}, \tt 5pt} - -\medskip -The following commands are used to change the size of some dimension -parameters: - -\smallskip -\describe{{\sl Purpose} ({\sl default\/}):} {\sl Command:} -\vskip1pt -\describe{Set diameter of drawing pen ({\tt 0.5pt})} - {\mac{penwd}[\var{dimen}]} -\describe{Set diameter of shading dots ({\tt 0.5pt})} - {\mac{shadewd}[\var{dimen}]} -\describe{Set diameter of polkadot ({\tt 5pt})} - {\mac{polkadotwd}[\var{dimen}]} -\describe{Set diameter of hatching pen ({\tt 0.5pt})} - {\mac{hatchwd}[\var{dimen}]} -\describe{Multiply \mac{shadespace} by 1.2} {\mac{lightershade}} -\describe{Divide \mac{shadespace} by 1.2} {\mac{darkershade}} - - -\section{Colors} - -\def\firstkeyfrac{.45} -\def\secondkeyfrac{.55} - -\smallskip -\describe{Set color for curves} {\mac{drawcolor}[\var{color}]} -\describe{Set color for fills} {\mac{fillcolor}[\var{color}]} -\describe{Set color for points, symbols} {\mac{pointcolor}[\var{color}]} -\describe{Set color for hatching} {\mac{hatchcolor}[\var{color}]} -\describe{Set color for arrowheads} {\mac{headcolor}[\var{color}]} -\describe{Set color for tlabels} {\mac{tlabelcolor}[\var{color}]} -\describe{Set color used by \mac{gclear}} {\mac{backgroundcolor}[\var{color}]} -\describe{\quad \LaTeX{} syntax} - {\mac{drawcolor}[?\var{model}][\var{clrspec}], etc.} -\describe{Define a color name} {\mac{mfpdefinecolor}[\var{name}][\var{model}][\var{clrspec}]} - - -\section{Common geometric figures} - -Drawing commands that operate on a variable length list in braces may -be followed by \mac{datafile}[\var{filename}] instead of the list. - -\subsection{Points} - -\def\firstkeyfrac{.42} -\def\secondkeyfrac{.58} - -\describe{Place a symbol at given point(s)} - {\mac{plotsymbol}[?\var{size}][\var{name}]% - [($x_0,y_0$),($x_1,y_1$),$\ldots$]} -\describe{\quad Available symbol names} {{\tt Triangle}, {\tt Square}, {\tt Circle}, {\tt - Diamond}, {\tt Star}, {\tt SolidTriangle}, {\tt SolidSquare}, {\tt SolidCircle}, - {\tt SolidDiamond}, \tt{SolidStar}, {\tt Plus}, {\tt Cross}, - {\tt Asterisk}} -\describe{Points (filled or unfilled circles)} - {\mac{point}[?\var{size}][($x_0,y_0$),($x_1,y_1$),$\ldots$]} -\describe{Force filled/open circles in \mac{point}:} - {\mac{pointfilltrue}/\mac{pointfillfalse}} - -\subsection{Lines} - -\def\firstkeyfrac{.45} -\def\secondkeyfrac{.55} - -\describe{Connect points with lines} - {\mac{polyline}[($x_0,y_0$),($x_1,y_1$),$\ldots$], - or (\mac{lines})} -\describe{Closed polygon} - {\mac{polygon}[($x_0,y_0$),($x_1,y_1$),$\ldots$]} -\describe{Concatenate vectors} - {\mac{turtle}[\var{initialpoint},\var{$v_1$},\var{$v_2$},$\ldots$]} -\describe{Rectangle (upright) with given corners} - {\mac{rect}[($x_0,y_0$),($x_1,y_1$)]} - -\subsection{Circles, arcs and ellipses} - -\def\firstkeyfrac{.55} -\def\secondkeyfrac{.45} - -\describe{Circles} {} -\describe{\qquad polar form (default):} - {\mac{circle}[?p][\var{center},\var{radius}]} -\describe{\qquad three-point form:} - {\mac{circle}[?t][($x_0,y_0$),($x_1,y_1$),($x_2,y_2$)]} -\describe{\qquad center-point form:} - {\mac{circle}[?c][\var{center},\var{point}]} -\describe{\qquad point-sweep form:} - {\mac{circle}[?s][($x_0,y_0$),($x_1,y_1$),\var{angle}]} -\describe{Arcs} {} -\describe{\qquad polar form:} - {\mac{arc}[?p][\var{center},\var{$\theta_1$},\var{$\theta_2$},% - \var{radius}]} -\describe{\qquad three-point form:} - {\mac{arc}[?t][($x_0,y_0$),($x_1,y_1$),($x_2,y_2$)]} -\describe{\qquad center-point-angle form:} - {\mac{arc}[?c][\var{center},\var{point},\var{angle}]} -\describe{\qquad point-sweep form (default):} - {\mac{arc}[?s][($x_0,y_0$),($x_1,y_1$),\var{angle}]} -\describe{Ellipse, center $(x_0,y_0)$, radii \var{$r_x$}, \var{$r_y$}, angle -\var{$\theta$}} - {\mac{ellipse}[?\var{$\theta$}]% - \tt\{($x_0,y_0$),\var{$r_x$},\var{$r_y$}\}} - -\section{General curves} - -\def\firstkeyfrac{.45} -\def\secondkeyfrac{.55} - -A \var{spec} can be {\tt p} (for polyline) or {\tt s} (for smooth) -followed by a number for the tension. - -\smallskip -\describe{Smooth curve through points} - {\mac{curve}[?\var{tension}][($x_0,y_0$),($x_1,y_1$),$\ldots$]} -\describe{Graph of $y=f(x)$} - {\mac{function}[?\var{spec}][$x_{\min}$,$x_{\max}$,% - $\Delta x$][$f(\hbox{\tt x})$]} -\describe{Graph of parametric curve $(x(t),y(t))$} - {\mac{parafcn}[?\var{spec}][$t_{\min}$,$t_{\max}$,$\Delta t$]% - [($x(\hbox{\tt t})$, $y(\hbox{\tt t})$)]} -\describe{Graph of $r = f(\theta)$} - {\mac{plrfcn}[?\var{spec}]% - [$\theta_{\min}$,$\theta_{\max}$,$\Delta\theta$][$f(\hbox{\tt t})$]} -\describe{Interpolate with a smooth {\it function}} - {\mac{fcncurve}[?\var{tension}][($x_0,y_0$),($x_1,y_1$),$\ldots$]} -\describe{Curve from data in a file*} - {\mac{datafile}[?\var{spec}][\var{file}]} -\describe{\quad Set how \mac{datafile} processes a line} - {\mac{using}[\var{read\_pattern}][\var{write\_pattern}]\brk - Default is \mac{using}[\#1 \#2 \#3][(\#1,\#2)]} - - -\section{Regions} - -\def\firstkeyfrac{.45} -\def\secondkeyfrac{.55} - -Curves are not necessarily `closed' even if the start and end are the -same. The following are closed (may be filled), as are \mac{rect}, -\mac{polygon}, \mac{circle}, and \mac{ellipse}. - -\smallskip -\describe{Closed curve through given points} - {\mac{cyclic}[?\var{tension}][$(x_1,y_1),(x_2,y_2),\ldots$]} -\describe{Circular sector (pie slice)} - {\mac{sector}[\var{center},\var{radius},\var{$\theta_1$},% - \var{$\theta_2$}]} -\describe{Region between two functions} {\mac{btwnfcn}[?\var{spec}][$x_{\min}$,% - $x_{\max}$,$\Delta x$][$f(\hbox{\tt x})$][$g(\hbox{\tt x})$]} -\describe{Region in polar coordinates} - {\mac{plrregion}[?\var{spec}][$\theta_{\min}$,$\theta_{\max}$,% - $\Delta \theta$][$f(\hbox{\tt t})$]} -\describe{Curves surrounding text} - {\mac{tlabelrect}[?\var{radius}]{\tt(\var{x},\var{y})\{\var{text}\}}\brk - \mac{tlabeloval}[?\var{mult}]{\tt(\var{x},\var{y})\{\var{text}\}}\brk - \mac{tlabelellipse}[?\var{ratio}]{\tt(\var{x},\var{y})\{\var{text}\}}\brk - \var{radius}: round corners. \var{mult}: stretch horizontally. - \var{ratio}: width/height of ellipse} - - -\section{Prefix macros} - -\subsection{Drawing curves} - -\def\firstkeyfrac{.4} -\def\secondkeyfrac{.6} - -\describe{Dashed path}{\mac{dashed}[?\var{length},\var{gap}]$\ldots$} -\describe{Dotted path}{\mac{dotted}[?\var{size},\var{gap}]$\ldots$} -\describe{Trace a path with symbols} - {\mac{plot}[?\var{size},\var{gap}][\var{symbol}]$\ldots$} -\describe{Generalized dashes}{\mac{gendashed}[\var{patname}]$\ldots$} -\describe{\quad Define a named dash pattern} - {\mac{dashpattern}[\var{patname}][\var{len$_1$},\var{len$_2$},$\ldots$,% - \var{len$_{2n}$}]} -\describe{Place a symbol at all nodes} - {\mac{plotnodes}[?\var{size}][\var{symbol}]$\ldots$} -\describe{Solid curve*}{\mac{draw}[?\var{color}]$\ldots$} - - -\subsection{Closing a curve} - -\def\firstkeyfrac{.45} -\def\secondkeyfrac{.55} - -These turn any path into a `closed' path (result may be filled). - -\smallskip -\describe{Close with a straight line,}{\mac{lclosed}$\ldots$} -\describe{Close with a smooth join, like \mac{cycle},}{\mac{sclosed}$\ldots$} -\describe{Close letting \MF{} choose}{\mac{bclosed}$\ldots$} - -\subsection{Filling closed curves} - -\def\firstkeyfrac{.4} -\def\secondkeyfrac{.6} - -These filling prefixes turn off drawing of the curve. - -\smallskip -\describe{Solid fill} {\mac{gfill}[?\var{color}]$\ldots$} -\describe{Unfill} {\mac{gclear}$\ldots$} -\describe{Hatched fills} - {\mac{thatch}[?\var{space},\var{angle}][?\var{color}]$\ldots$} -\describe{\qquad \var{angle}${}=45\,$deg} - {\mac{rhatch}[?\var{space}][?\var{color}]$\ldots$} -\describe{\qquad \var{angle}${}=-45\,$deg} - {\mac{lhatch}[?\var{space}][?\var{color}]$\ldots$} -\describe{\qquad crosshatching} - {\mac{xhatch}[?\var{space}][?\var{color}]$\ldots$} -\describe{} {\mac{hatch} $=$ \mac{xhatch}} -\describe{Shading} - {\mac{shade}[?\var{space}]$\ldots$} -\describe{Polkadot fill}{\mac{polkadot}[?\var{space}]$\ldots$} -\describe{Fill with copies of a tile} {\mac{tess}[\var{tile}]$\ldots$} -\describe{\quad Define a tile*} - {\mac{tile}[\var{name},\var{unit},\var{width},\var{height},\var{clip}] - \var{drawing commands} \mac{endtile}} - -\smallskip -* Creates a mini-mfpic, clipped if \var{clip}${}={}${\tt true}. - -\subsection{Storing and reusing a path} - -\describe{Store a path} {\mac{store}[\var{name}]$\ldots$} -\describe{\quad reusing a stored path} {\mac{mfobj}[\var{name}]} - -\subsection{Subpaths} - -\describe{Subpath by fraction of length} - {\mac{partpath}[\var{frac1},\var{frac2}]$\ldots$} -\describe{Subpath by node number} {\mac{subpath}[\var{m},\var{n}]$\ldots$} -\describe{Cutting by another path} - {\mac{cutoffafter}[\var{obj}]$\ldots$, - \mac{cutoffbefore}[\var{obj}]$\ldots$.\brk - \var{obj} is a name created with \mac{store}} -\describe{Trim the ends of a path} - {\mac{trimpath}[\var{dim1},\var{dim2}]$\ldots$} - - -\subsection{Modifying a curve} - -\def\firstkeyfrac{.4} -\def\secondkeyfrac{.6} - -\describe{Add arrowhead to the end} - {\mac{arrow}[?l\var{length}][?r\var{angle}]% - [?b\var{backset}][?c\var{color}]$\ldots$} -\describe{\quad Define arrowhead shape} - {\mac{headshape}[\var{ratio}][\var{tension}][\var{filled}]} -\describe{Reverse a curve} {\mac{reverse}$\ldots$} -\describe{Double arrow} {\mac{arrow}\mac{reverse}\mac{arrow}$\ldots$} -\describe{Rotate around a point} {\mac{rotatepath}[($x_0$,$y_0$),\var{angle}]$\ldots$} -\describe{Reflect about a line} {\mac{reflectpath}[($x_0$,$y_0$),($x_1$,$y_1$)]$\ldots$} -\describe{Shift} {\mac{shiftpath}[($dx$,$dy$)]$\ldots$} -\describe{Scale around a point} {\mac{scalepath}[($x_0$,$y_0$),\var{scale}]$\ldots$} -\describe{xscale about line $x=x_0$} {\mac{xscalepath}[$x_0$,\var{scale}]$\ldots$} -\describe{yscale about line $y=y_0$} {\mac{yscalepath}[$y_0$,\var{scale}]$\ldots$} -\describe{slant, pivoting on line $y=y_0$} {\mac{slantpath}[$y_0$,\var{slant}]$\ldots$} -\describe{yslant, pivoting on line $x=x_0$} {\mac{yslantpath}[$x_0$,\var{slant}]$\ldots$} -\describe{Swap x and y} {\mac{xyswappath}$\ldots$} - - -\section{Axes} - -\def\firstkeyfrac{.30} -\def\secondkeyfrac{.70} - -\describe{Draw x- and/or y-axes} {\mac{axes}[?\var{headlen}], - \mac{xaxis}[?\var{headlen}], \mac{yaxis}[?\var{headlen}]} -\describe{Draw various axes} - {\mac{axis}[?\var{headlen}][\var{axis}], \ \var{axis} is one of - {\tt x}, {\tt y}, {\tt l}, {\tt b}, {\tt r}, or {\tt t}.} -\describe{Draw many axes} {\mac{doaxes}[?\var{headlen}][\var{list}], \ - \var{list} of letters, no commas.} -\describe{Shift border axis inward} - {\mac{axismargin}[\var{axis}][\var{amt}], \ \var{amt} is - in graph units.} -\describe{Add hashmarks to axes}{% - \mac{axismarks}[\var{axis}][?\var{len}][$c_1$,$c_2$,$\ldots$], \ - $c_j$ are positions.\brk Abbrev. by - \mac{xmarks} for \mac{axismarks}[x], etc.} -\describe{Change position of hash marks} - {\mac{setaxismarks}[\var{axis}][\var{pos}] \ \var{pos} is one of - {\tt inside}, {\tt outside}, {\tt centered}, {\tt ontop}, - {\tt onbottom}, {\tt onleft}, or {\tt onright}.} - -\section{Miscellaneous} - -\def\firstkeyfrac{.30} -\def\secondkeyfrac{.70} - -\describe{Text labels} - {\mac{tlabel}[?\var{pos}\var{$\theta$}]% - {\tt($x$,$y$)\{\var{\TeX{} text}\}}\brk - \mac{tlabels}[\var{args$_1$}\var{args$_2$}$\ldots$]\brk - \mac{axislabels}[\var{axis}][?\var{pos}\var{$\theta$}]% - [\{\var{txt$_1$}\}\var{$n_1$},% - \{\var{txt$_2$}\}\var{$n_2$},$\ldots$]\brk - \var{pos} is a two-letter sequence, \var{$\theta$}* the - angle of rotation in degrees; - \var{args$_j$} is an entire set of arguments as in - \mac{tlabel}; - \var{axis} is a letter, \var{txt$_j$} is label, \var{$n_j$} - is coordinate on axis} -\describe{Clipping to a path} {\mac{gclip}$\ldots$} -\describe{Polar conversion} - {\mac{plr}[($r_0$,$\theta_0$),($r_1$,$\theta_1$),$\ldots$]} -\describe{Connect paths} {\mac{connect} \var{path1} \var{path2} $\ldots$ - \mac{endconnect}} -\describe{Draw many curves from one datafile} - {\mac{plotdata}[?\var{spec}][\var{file}], \ \var{spec} is {\tt - p} or {\tt s\var{num}} where \var{num} is the (optional) tension - in the smooth curve} -\describe{Set how \mac{plotdata} draws curves$\dag$}{\mac{dashedlines} - \ (different dash patterns)\brk - \mac{coloredlines} \ (different colors, \MP{} only)\brk - \mac{pointedlines} \ (different symbols, like \mac{plot})\brk - \mac{datapointsonly} \ (different symbols, like \mac{plotnodes})} - -\smallskip -* The angle is optional, and ignored unless option \opt{mplabels} is -in effect.\brk -$\dag$ \mac{plotdata} also respects the \mac{using} setting (see -\mac{datafile} in section {\bf General curves}). - -\bye - -% Other commands: -\mac{setrender}[\<\TeX{} commands\>] - -\mac{coords}$\ldots$\mac{endcoords} -\mac{applyT}[\<transformer\>] -\mac{rotate}[$\theta$] -\mac{rotatearound}[$p$][$\theta$] -\mac{turn}[?$p$][$\theta$] -\mac{mirror}[$p_1$][$p_2$] -\mac{reflectabout}[$p_1$][$p_2$] -\mac{shift}[$p$] -\mac{scale}[$s$] -\mac{xscale}[$s$] -\mac{yscale}[$s$] -\mac{zscale}[$p$] -\mac{xslant}[$s$] -\mac{yslant}[$s$] -\mac{zslant}[$s$] -\mac{boost}[$\chi$] -\mac{xyswap} - -\mac{fdef}[\<fcn\>]% - (\<param1\>,\<param2\>,$\ldots$)% - [\<mf-expr\>] - -\mac{tcaption}[?\<maxwd\>,\<linewd\>][\<caption text\>] - -\mac{savepic}\bsl\<picname\> -\mac{newsavepic} -\mac{usepic} - -\mac{dashlineset}, \mac{dotlineset} - -\mac{mfsrc}[\<metafont code\>] -\mac{noship} - -\mac{store}[\<path variable\>][\<path\>] -\mac{mfobj}[\<path expression\>] -\mac{patharr}[\<pv\>]$\ldots$\mac{endpatharr} - -\mac{mftitle}[\<title\>] -\mac{tmtitle}[\<title\>] - -\mac{newfdim}[\<fdim\>] - -\mac{setmfpicgraphic} -\mac{getmfpicoffset} -\mac{setfilename} - -\bye diff --git a/Master/texmf-dist/fonts/source/public/mfpic/grafbase.mf b/Master/texmf-dist/fonts/source/public/mfpic/grafbase.mf deleted file mode 100644 index 3147d2eef3d..00000000000 --- a/Master/texmf-dist/fonts/source/public/mfpic/grafbase.mf +++ /dev/null @@ -1,2359 +0,0 @@ -%% -%% This is file `grafbase.mf', -%% generated with the docstrip utility. -%% -%% The original source files were: -%% -%% grafbase.dtx (with options: `MF') -%% -%% ------------------------------------------------------------------- -%% -%% Copyright 2002--2003, Daniel H. Luecking -%% -%% Mfpic consists of the 3 files mfpic.dtx, grafbase.dtx and mfpic.ins -%% and the 5 files they generate: mfpic.tex, mfpic.sty, grafbase.mf, -%% grafbase.mp, and dvipsnam.mp. -%% -%% Documentation, examples, and ancillary files are separate. See -%% readme.1st for a complete list. -%% -%% Mfpic may be distributed and/or modified under the conditions of the -%% LaTeX Project Public License, either version 1.2 of this license or (at -%% your option) any later version. The latest version of this license is in -%% -%% http://www.latex-project.org/lppl.txt -%% -%% and version 1.2 or later is part of all distributions of LaTeX version -%% 1999/12/01 or later. -%% -%% With respect to the proposed draft LPPL-1.3: mfpic has maintenance -%% status "maintained". The Current Maintainer is Daniel H. Luecking. There -%% are several Base Interpreters: TeX, LaTeX, MetaPost and Metafont. -%% -string fileversion, filedate; -fileversion := "0.7a beta"; filedate := "2004/04/16"; -def GBmsg expr s = message "Grafbase: " & s; enddef; -def GBerrmsg (expr s) expr t = - errhelp t; - errmessage "Grafbase: "& s; - errhelp ""; -enddef; -if (known grafbaseversion) or (known grafbase) : - GBmsg "You have loaded grafbase more than once! " & - "Please make sure that it is loaded only once."; - endinput; -fi - -boolean grafbase; grafbase := true; -boolean MFPIC; MFPIC := false; - -def checkversions (expr g)= - numeric grafbaseversion; grafbaseversion := g; - if unknown mfpicversion : % no mfpic, or < 0.63 - GBmsg "Recent mfpic not detected."; - elseif g = mfpicversion : - MFPIC := true; - else: - GBerrmsg ("version mismatch") - "The installation may be broken: mfpic and grafbase " & - "versions do not match."; - fi -enddef; - -checkversions (70); - -if unknown base_name : input plain; -elseif not string base_name : input plain; -elseif base_name <> "plain" : input plain; -fi - -boolean METAPOST; - -if known color Maurits Cornelis Escher : METAPOST := true; -else: METAPOST := false; -fi - -if METAPOST : - GBerrmsg ("wrong compiler") - "You may have input to Metapost a file designed for Metafont. " & - "Instead of the file grafbase.mf, Metapost should be using " & - "grafbase.mp. Make sure Metapost can find it."; -fi - -if (unknown debug) or (not boolean debug) : - boolean debug; debug := false; -fi - -def GBdebug = - begingroup - save >>; def >> = message enddef; - >> "Grafbase DEBUG: "; -enddef; -def GBenddebug = - >> "End DEBUG"; - endgroup -enddef; - -vardef mftitle expr t = - t; message t; -enddef; - -if unknown mode : - GBerrmsg ("unknown Metafont mode") - "Please use \mode:=localfont; or a mode known on your " & - "system. If you continue, ljfour mode will be tried."; - mode := lfjour; -fi - -mode_setup; -if debug : - GBdebug; - >> "pixels_per_inch = " & decimal pixels_per_inch; - GBenddebug; -fi -font_identifier := "MFpic graphics"; -font_coding_scheme := "Arbitrary"; -interim designsize := 128pt#; - -if unknown aspect_ratio: aspect_ratio := 1; fi -if unknown hppp : hppp := 1 fi; -if unknown currenttransform : - transform currenttransform; - currenttransform := identity yscaled aspect_ratio; -fi - -interim turningcheck := 0; -interim warningcheck := 0; -numeric unitlen, xscale, yscale, xneg, xpos, yneg, ypos; - -unitlen := 1 bp#; -xscale := 7.2; % (xscale * unitlen) = 1/10 inch -yscale := 7.2; % (yscale * unitlen) = 1/10 inch -xneg := 0; xpos := 10; -yneg := 0; ypos := 10; - -newinternal radian, pi, deg; -deg := 1; pi := 3.14159; -radian := 180/pi; - - -newinternal penwd; penwd := 0.5pt; -pen drawpen; - -def resizedrawpen (expr s) = - interim penwd := s; - setvariable (pen) (drawpen) (pencircle scaled penwd); - save currentpen; pen currentpen; pickup drawpen; -enddef; - -numeric hatchwd; hatchwd := 0.5bp; -pen hatchpen; hatchpen := pencircle scaled hatchwd; - -boolean clipall; clipall := false; -boolean ClipOn; ClipOn := false; -path ClipPath[]; numeric ClipPath; ClipPath = 0; -boolean truebbox; truebbox := false; - -def DoClip (suffix v) = - if ClipOn and (ClipPath > 0) : clipsto (v, ClipPath); fi -enddef; - -def noclip (text t) = - hide( save ClipOn; boolean ClipOn; ClipOn := false; t) -enddef; - -boolean showbbox; showbbox := false; - -let color = numeric; color black, white; -black := 0; white := 1; -def _wc_ = killtext enddef; - -color currentcolor, fillcolor, drawcolor, hatchcolor, - headcolor, pointcolor, tlabelcolor, background; -currentcolor := fillcolor := drawcolor := hatchcolor := - headcolor := pointcolor := tlabelcolor := black; -background := white; - -vardef snapto expr t = - if unknown t : 0 - elseif not (numeric t) : 0 - elseif t < 0 : 0 - elseif t > 1 : 1 - else : t - fi -enddef; - -vardef gray (expr g) = (snapto g)*white enddef; - -vardef makeclr (expr r, g, b) = - gray (sqrt((2r*r + 4g*g + b*b)/7)) -enddef; - -vardef rgb (expr r, g, b) = - makeclr (snapto r, snapto g, snapto b) -enddef; - -vardef cmyk (expr c, m, y, k) = - rgb (1-c-k, 1-m-k, 1-y-k) -enddef; - -vardef RGB (expr R, G, B) = - rgb (R/255, G/255, B/255) -enddef; - -vardef named (suffix c) = forceclr (c) enddef; -vardef forceclr (expr c) = - if unknown c : black - elseif numeric c : gray (c) - elseif color c : c - else : black - fi -enddef; - -color red, green, blue, cyan, magenta, yellow; -red := rgb (1, 0, 0); -green := rgb (0, 1, 0); -blue := rgb (0, 0, 1); -cyan := rgb (0, 1, 1); -magenta := rgb (1, 0, 1); -yellow := rgb (1, 1, 0); - -vardef list (suffix v) (text lst) = - v := 0; for _itm = lst: v[incr v] := _itm; endfor -enddef; - -def map (text proc) (text lst) = - hide(_map := 0;) - for _a = lst : - if _map = 0 : hide(_map := 1;) else: , fi - proc(_a) - endfor -enddef; - -vardef knownarray suffix arr = - save _kna; boolean _kna; - _kna := (known arr) and (numeric arr); - if _kna : - _kna := (arr = floor arr) and (arr >= 1); - for _idx = 1 upto arr : - exitif not _kna; - _kna := known arr[_idx]; - endfor - fi - _kna -enddef; - -def copyarray(suffix from, to) = - to := 0; - for _idx = 1 upto from: - to[incr to] := from[_idx]; - endfor -enddef; - -def maparr (text proc) (suffix p) = - for _idx = 1 upto p: proc (p[_idx]); endfor -enddef; - -def textpairs (suffix p) (text t) = - numeric p; pair p[]; list (p) (t); -enddef; - -vardef chpair (text proc) (expr p) = - (proc (xpart p), proc (ypart p)) -enddef; - -vardef floorpair (expr p) = chpair (floor) (p) enddef; -vardef ceilingpair (expr p) = chpair (ceiling) (p) enddef; -vardef hroundpair (expr p) = chpair (hround) (p) enddef; - -vardef emin (expr a, b) = if a < b : a else: b fi enddef; -vardef emax (expr a, b) = if a > b : a else: b fi enddef; - -vardef pairmin (expr z, w) = - ( emin (xpart z, xpart w), emin (ypart z, ypart w ) ) -enddef; -vardef pairmax (expr z, w) = - ( emax (xpart z, xpart w), emax (ypart z, ypart w ) ) -enddef; - -vardef minpair (suffix p) = - save _mp; pair _mp; _mp := p1; - for _idx = 2 upto p - 1 : - _mp := pairmin(_mp, p[_idx]); - endfor - pairmin (_mp, p[p]) -enddef; -vardef maxpair (suffix p) = - save _mp; pair _mp; _mp := p1; - for _idx = 2 upto p - 1: _mp := pairmax(_mp, p[_idx]); endfor - pairmax (_mp, p[p]) -enddef; - -transform ztr, vtr; -def setztr = - if debug : - GBdebug; - >> "charwd = " & decimal charwd & "pt#"; - >> "charht = " & decimal charht & "pt#"; - >> "w_ = " & decimal w_ & " pixels"; - >> "h_ = " & decimal h_ & " pixels"; - >> "unitlen = " & decimal unitlen & "pt#"; - >> "hppp = " & decimal hppp; - >> "xneg = " & decimal xneg; - >> "xpos = " & decimal xpos; - >> "yneg = " & decimal yneg; - >> "ypos = " & decimal ypos; - >> "xscale = " & decimal xscale; - >> "yscale = " & decimal yscale; - GBenddebug; - fi - save ztr, vtr; - transform ztr, vtr; - vtr := identity xscaled (xscale) yscaled (yscale) - scaled (unitlen*hppp); - ztr := identity shifted (-(xneg, yneg)) transformed vtr; - if debug : - GBdebug; - >> "ztr: "; - show ztr; - >> "vtr: "; - show vtr; - GBenddebug; - fi -enddef; - -vardef zconv (expr a) = a transformed ztr enddef; -vardef invzconv (expr a) = a transformed (inverse ztr) enddef; -vardef vconv (expr v) = v transformed vtr enddef; -vardef invvconv (expr v) = v transformed (inverse vtr) enddef; - -def active_plane = currentpicture enddef; - -vardef image(text t) = - save currentpicture; picture currentpicture; - currentpicture := nullpicture; - t; - currentpicture -enddef; - -def initpic = - setztr; - resizedrawpen (penwd); - if ClipOn : ClipPath := 1; - ClipPath1 := rect (origin, (w_, h_)); - fi - if debug : - GBdebug; - >> "Drawing nominal bounding box around picture"; - GBenddebug; - noclip ( safedraw rect (origin, (w_, h_)) ); - fi -enddef; - -def mfpicenv = enddef; -def endmfpicenv = enddef; -def bounds (expr a, b, c, d) = - xneg := a; xpos := b; - yneg := c; ypos := d; -enddef; - -def setvariable (text kind) (suffix name) (expr value) = - save name; kind name; name := value; -enddef; - -string extra_beginmfpic; extra_beginmfpic := ""; -string extra_endmfpic; extra_endmfpic := ""; - -def beginmfpic (expr ch) = - begingroup - gcode := ch; - save w_, h_, d_; numeric w_, h_, d_; - charwd := (xpos-xneg)*xscale*unitlen; - charht := (ypos-yneg)*yscale*unitlen; - chardp := 0; - charcode := if known ch : byte ch else: 0 fi; - w_ := hround(charwd*hppp); - h_ := vround(charht*hppp); - d_ := vround(chardp*hppp); - charic := 0; clearxy; clearit; clearpen; - scantokens extra_beginchar; - initpic; - scantokens extra_beginmfpic; -enddef; - -def endmfpic = - scantokens extra_endmfpic; - if debug : - GBdebug; - >> "TFM charwd = " & decimal charwd & "pt#"; - >> "TFM charht = " & decimal charht & "pt#"; - GBenddebug; - fi - if proofing>0 : makebox(proofrule); fi - chardx := w_; % desired width of character in pixels - DoClip (active_plane); - if clipall : clipto (active_plane) rect(origin, (w_, h_)); fi - if showbbox : noclip ( safedraw rect (origin, (w_, h_)) ); fi - shipit; - if displaying > 0 : makebox(screenrule); showit; fi - endgroup -enddef; - -pair label_adjust; label_adjust := (0, 0); -numeric label_sep; label_sep := 0; - -def verbatimtex = killtext enddef; - -def newgblabel (expr hf, vf, BL, r) (text s) (text pts) = enddef; -vardef ref_shift (expr hf, vf, BL, ll, ur) = - - ( (hf)[xpart ll, xpart ur], - (vf)[if BL: 0 else: (ypart ll) fi, ypart ur] ) -enddef; - -vardef thegblabel (expr z, r, p) = - ((p shifted z) rotated r) shifted label_adjust -enddef; - -vardef textrect (expr lbl, rad, loc) = - textrectx (.5, .5, false, 0) (origin, lbl, rad, loc) -enddef; -vardef textoval (expr lbl, mult, loc) = - xellipse (true, .5, .5, false, 0) (origin, lbl, mult, loc) -enddef; -vardef textellipse (expr lbl, rat, loc) = - xellipse (false, .5, .5, false, 0) (origin, lbl, rat, loc) -enddef; - -boolean roundends; roundends := true; -vardef textrectx (expr a, b, c, rot, xy, lbl, rad, loc) = - save ll, ur, _r, f, zz; - pair ll, ur, zz; path f; - labeldims (xy, lbl) (ll, ur); - _r := - if boolean rad : - if rad : emin (xpart (ur-ll), ypart (ur-ll))/sqrt(2) - else: 0 - fi - elseif numeric rad : rad - else: 0 - fi; - if _r = 0 : - f := rect(ll, ur); - else: - save p, q; - pair p[]; path q; - p1 := ur - _r*dir(45); % center of upper right arc - p3 := ll + _r*dir(45); % lower left - p2 := (xpart p3, ypart p1); % upper left - p4 := (xpart p1, ypart p3); % lower right - q := quartercircle scaled 2_r; - if _r > 0: - f := (q shifted p1) -- (q rotated 90 shifted p2) - -- (q rotated 180 shifted p3) - -- (q rotated -90 shifted p4) - -- cycle; - else: - f := (q shifted p1) -- (q rotated -90 shifted p4) - -- (q rotated 180 shifted p3) - -- (q rotated 90 shifted p2) - -- cycle; - fi - fi - invvconv(thegblabel(ref_shift(a, b, c, ll, ur), rot, f)) shifted loc -enddef; - -def textovalx = xellipse (true) enddef; -def textellipsex = xellipse (false) enddef; - -vardef xellipse (expr aspect, a, b, c, r, xy, lbl, mult, loc) = - if mult = 0 : - textrectx (a, b, c, r) (xy, lbl, 0, loc) - else: - save ll, ur, cc, ww, hh, f; - pair ll, ur, cc; path f; - labeldims (xy, lbl) (ll, ur); - cc := .5[ll, ur]; % center - (ww, hh) = ur - cc; - if (ww = 0) or (hh = 0) : % make a line: - f = (ll--ur); - else: - save aa, bb, mm; - mm := if aspect : ww/hh*mult else: mult fi; - aa := ww ++ hh*mm; - bb := aa/mm; - f := ellipse(cc, aa, bb, 0); - fi - invvconv(thegblabel (ref_shift (a, b, c, ll, ur), r, f)) shifted loc - fi -enddef; - - -def labeldims (expr xy, lbl) (suffix ll, ur) = - if pair lbl : - ll := xy; ur := lbl; - else: - ll := ur := (0, 0); - fi - ll := ll - label_sep*(1, 1); - ur := ur + label_sep*(1, 1); -enddef; - -newinternal nottoosmall; nottoosmall := eps/2 + 2epsilon; -newinternal reallysmall; reallysmall := 3epsilon; -def signof (expr X) = if X < 0 : - fi enddef; -def TruncateWarn expr s = GBmsg s & " too large; truncating"; enddef; - -vardef secd primary X = - save temp; temp := cosd(X); - if abs(temp) < reallysmall : - TruncateWarn "Secant"; - temp := signof (temp) reallysmall; - fi - 1/temp -enddef; -vardef tand primary X = sind(X)*secd(X) enddef; - -vardef cscd primary X = - save temp; temp := sind(X); - if abs(temp) < reallysmall : - TruncateWarn "Cosecant"; - temp := signof(temp) reallysmall; - fi - 1/temp -enddef; -vardef cotd primary X = cosd(X)*cscd(X) enddef; - -vardef acos primary X = angle (X, 1 +-+ X) enddef; -vardef asin primary X = angle (1 +-+ X, X) enddef; -vardef atan primary X = angle (1, X) enddef; - -vardef sin primary X = sind (X*radian) enddef; -vardef cos primary X = cosd (X*radian) enddef; -vardef tan primary X = tand (X*radian) enddef; -vardef cot primary X = cotd (X*radian) enddef; -vardef sec primary X = secd (X*radian) enddef; -vardef csc primary X = cscd (X*radian) enddef; - -vardef invcos primary X = (acos X)/radian enddef; -vardef invsin primary X = (asin X)/radian enddef; -vardef invtan primary X = (atan X)/radian enddef; - -vardef exp primary X = mexp (256 * X) enddef; -vardef ln primary X = (mlog X) / 256 enddef; -def log = ln enddef; -vardef logbase (expr B) primary X = (mlog X)/(mlog B) enddef; -def logtwo = logbase( 2) enddef; -def logten = logbase(10) enddef; - -vardef Arg primary Z = (angle Z)/radian enddef; -vardef Log primary Z = (ln(abs(Z)), Arg (Z)) enddef; -vardef cis primary T = dir(radian*T) enddef; -vardef zexp primary Z = (exp (xpart Z))*(cis(ypart Z)) enddef; -vardef sgn primary Z = - if Z = origin : origin else: unitvector Z fi -enddef; - -vardef cosh primary X = - save temp; temp := 2 exp (-abs(X)); - if temp < reallysmall : - TruncateWarn "Cosh"; - temp := reallysmall; - fi - 1/temp + temp/4 -enddef; - -vardef sinh primary X = - save temp; temp := 2 exp (-abs(X)); - if temp < reallysmall : - TruncateWarn "Sinh"; - temp := reallysmall; - fi - signof (X) (1/temp - temp/4) -enddef; - -vardef sech primary X = - save temp; temp := exp(-(abs (X))); - 2temp/(1 + temp*temp) -enddef; - -vardef tanh primary X = - save temp; temp := exp(-2(abs (X))); - signof (X) (1 - temp)/(1 + temp) -enddef; - -vardef csch primary X = - save temp; temp := exp(-(abs (X))); - if abs(1 - temp*temp) < reallysmall : - TruncateWarn "Csch"; - signof (X) 2temp / reallysmall - else: - signof (X) 2temp / (1 - temp*temp) - fi -enddef; - -vardef coth primary X = - save temp; temp := tanh(X); - if abs(temp) < reallysmall : - TruncateWarn "Coth"; - temp := signof (temp) reallysmall; - fi - 1/temp -enddef; - -vardef acosh primary y = - if y < 1 : - GBerrmsg ("Undefined function: acosh " & decimal y) - "If you proceed, a value of 0 will be used. " & - "Expect more errors later."; - 0 - else: - ln (y + (y+-+1)) - fi -enddef; - -vardef asinh primary y = ln (y + (y++1)) enddef; - -vardef atanh primary y = - if abs (y) < 1 : - (ln(1+y) - ln(1-y))/2 - else: - GBerrmsg ("Undefined function: atanh " & decimal y) - "If you proceed, a value of plus or minus infinity " & - "will be used. Expect more errors later."; - signof (y) infinity - fi -enddef; - -vardef polar (expr p) = (xpart p) * dir (ypart p) enddef; -def id (expr x) = x enddef; - -transform T_stack[]; T_stack := 0; -def T_push (expr T) = T_stack[incr T_stack] := T; enddef; -def T_pop (suffix $) = - if T_stack > 0 : - $ := T_stack[T_stack]; T_stack := T_stack - 1; - fi -enddef; - -def bcoords = hide ( T_push (ztr); T_push (vtr) ) enddef; -def ecoords = hide ( T_pop (vtr); T_pop (ztr) ) enddef; - -def apply_t (text Transformer) = - ztr := identity Transformer transformed ztr; - vtr := ztr shifted - zconv(origin); -enddef; - -def xslant = slanted enddef; % (x+sy, y). -def yslant primary s = % (x, y+sx). - transformed - begingroup - save _T; transform _T; - origin transformed _T = origin; - (1, 0) transformed _T = (1, s); - (0, 1) transformed _T = (0, 1); - _T - endgroup -enddef; - -def zslant primary p = % (xu+yv, xv+yu), where p = (u, v). - transformed - begingroup - save _T; transform _T; - xpart _T = ypart _T = 0; - xxpart _T = yypart _T = xpart p; - xypart _T = yxpart _T = ypart p; - _T - endgroup -enddef; - -def xyswap = zslant (0, 1) enddef; -def boost primary X = zslant (cosh X, sinh X) enddef; - -vardef rotatedpath (expr p, th) expr f = - f transformed vtr rotatedaround (p transformed vtr, th) - transformed (inverse vtr) -enddef; -vardef scaledpath (expr p, s) expr f = - f shifted -p scaled s shifted p -enddef; -vardef xslantedpath (expr b, s) expr f = - f shifted (0, -b) slanted s shifted (0, b) -enddef; -def slantedpath = xslantedpath enddef; -vardef yslantedpath (expr a, s) expr f = - f shifted (-a, 0) yslant s shifted (0, a) -enddef; -vardef xscaledpath (expr a, s) expr f = - f shifted (-a, 0) xscaled s shifted (a, 0) -enddef; -vardef yscaledpath (expr b, s) expr f = - f shifted (0, -b) yscaled s shifted (0, b) -enddef; -vardef shiftedpath (expr v) expr f = f shifted v enddef; -vardef reflectedpath (expr p, q) expr f = - f transformed vtr - reflectedabout (p transformed vtr, q transformed vtr) - transformed (inverse vtr) -enddef; -vardef xyswappedpath expr f = f xyswap enddef; -vardef transformedpath (text Transformer) expr f = - f Transformer -enddef; - -vardef partialpath (expr a, b) expr f = - save p; path p; - p := zconv (f) scaled (1/unit_of_length); - save cumlen, totlen, idx, ta, tb; - totlen := makelengtharray(cumlen) p; - idx := 0; - if a <= b: - ta := gettime (cumlen, idx) (a*totlen); - tb := gettime (cumlen, idx) (b*totlen); - else: - tb := gettime (cumlen, idx) (b*totlen); - ta := gettime (cumlen, idx) (a*totlen); - fi - subpath (ta, tb) of f -enddef; -vardef gsubpath (expr a, b) expr f = subpath (a, b) of f enddef; - -def mono (suffix u) = cull u keeping (1, infinity); enddef; - -def andto (suffix u) (expr v) = - mono (u); addto u also v; cull u keeping (2, 2); -enddef; -primarydef u picand v = - begingroup save t; picture t; - t := u; andto (t, v); t - endgroup -enddef; - -def orto (suffix u) (expr v) = - mono (u); addto u also v; cull u keeping (1, 2); -enddef; -primarydef u picor v = - begingroup save t; picture t; - t := u; orto (t, v); t - endgroup -enddef; - -def xorto (suffix u) (expr v) = - mono (u); addto u also v; cull u keeping (1, 1); -enddef; -primarydef u picxor v = - begingroup save t; picture t; - t := u; xorto (t, v); t - endgroup -enddef; - -def subto (suffix u) (expr v) = - mono (u); addto u also -v; cull u keeping (1, 1); -enddef; -primarydef u picsub v = - begingroup save t; picture t; - t := u; mono (t); subto (t, v); t - endgroup -enddef; - -def coloraddto (expr clr) (suffix u) (expr v) = - if clr < white : - orto (u, v); - else: - subto (u) (v); - fi; -enddef; - -vardef interior expr c = - save v; picture v; v := nullpicture; - addto v contour (c.t_); - cull v dropping (0, 0); - v -enddef; -vardef interiors suffix cc = - save _ints; picture _ints; _ints := nullpicture; - for _idx = 1 upto cc: - addto _ints also interior cc[_idx]); - endfor - mono (_ints); - _ints -enddef; - -def clipto (suffix vt) expr c = - andto (vt, interior c); -enddef; -def clipsto (suffix vt, cc) = - andto (vt, interiors cc); -enddef; - -vardef Clipped (suffix vt) expr c = - save _Cl; picture _Cl; _Cl := vt; clipto (_Cl) c; _Cl -enddef; -def clipped = Clipped enddef; -def clip = Clipped enddef; - -vardef picneg (suffix vt) expr c = - mono (vt); - (interior c) picsub vt -enddef; - -def shpath (suffix v) (expr q, f) = - addto v doublepath (f.t_) withpen (q.t_); -enddef; - -numeric minpenwd; -minpenwd := 1; % 1 pixel -vardef picpath expr d = - save v; picture v; v := nullpicture; - if penwd >= minpenwd : - shpath (v, drawpen) (d); - mono (v); - fi - v -enddef; - -def picdot (suffix v) (expr w, p) = - addto v also - (w shifted hroundpair (p.t_)); -enddef; - -vardef setdot (expr apath, sc) = - if cycle apath : interior - else : picpath - fi - (apath scaled emax(ceiling (sc), minpenwd)) -enddef; - -numeric shadepicsize; shadepicsize := 0.8bp; -vardef shadepic (suffix dims) (expr grparam) = - pair dims; - save _frac; _frac := 2*emin(grparam, 1 - grparam); - save _hp, _vp, _dotwd, _dotht; - if aspect_ratio < 1 : - _vp := emax (2, hround(shadepicsize.o_)); - _hp := hround (_vp._o_); - _dotwd := hround (_hp*sqrt _frac); - _dotht := if _dotwd = 0 : 0 - else: hround (_hp*_vp*_frac/_dotwd) - fi; - else: - _hp := emax (2, hround (shadepicsize)); - _vp := hround (_hp.o_); - _dotht := hround (_vp*sqrt _frac); - _dotwd := if _dotht = 0 : 0 - else: hround (_hp*_vp*_frac/_dotht) - fi; - fi - dims := ( _hp, _vp._o_ ); - save _shp; picture _shp; _shp := nullpicture; - addto _shp contour rect ((0,0), (_dotwd, _dotht)); - picdot (_shp, _shp, dims); - dims := 2dims; mono (_shp); - if grparam >= .5 : _shp - else : (interior (rect ((0,0), dims))) picsub _shp - fi -enddef; - -vardef shaded (expr clr) expr c = - if cycle c : - if (clr <= black) or (clr >= white) : - interior c - else: - save vsh, shpic, shdims, ll, ur; - picture vsh, shpic; pair shdims, ll, ur; - shpic := shadepic (shdims) (clr); - gbbox (c, ll, ur); - vsh := filledwith (shpic) (shdims, ll, ur); - Clipped (vsh) c - fi - else: picpath c % should we? or just make it null? - fi -enddef; - -vardef filledwith (expr pic, dims, ll, ur) = - save b, v; picture b, v; - b := v := nullpicture; - save fwdims, _ll, _ur; pair fwdims, _ll, _ur; - fwdims := hroundpair (dims.t_); - _ll := floorpair (ll.t_); - _ur := ur.t_; - for s = xpart _ll step xpart fwdims until xpart _ur: - addto b also pic shifted (s, 0); - endfor - for s = ypart _ll step ypart fwdims until ypart _ur: - addto v also b shifted (0, s); - endfor - mono (v); - v -enddef; - -vardef thatchf (suffix v) (expr CT, sp, a, b) = - save _sp; - _sp = signof (ypart(b - a)) abs(sp); - for _y = _sp*( ceiling ((ypart a)/_sp) ) step _sp until ypart b: - shpath (v, hatchpen) - ( ( (xpart a, _y)--(xpart b, _y) ) transformed CT ); - endfor - mono(v); -enddef; - -def tile (suffix atile) (expr unit, width, height, clipit) = - picture atile.pic; atile.pic := nullpicture; - numeric atile.wd, atile.ht; - (atile.wd, atile.ht) = round ((width, height)*unit); - boolean atile.clipon; atile.clipon := clipit; - begingroup - save active_plane; - def active_plane = atile.pic enddef; - save ztr, vtr; transform ztr, vtr; - ztr := identity scaled unit; vtr := ztr; - save ClipOn; boolean ClipOn; - if clipit : - ClipOn := true; - save ClipPath; path ClipPath[]; - ClipPath = 1; - ClipPath[1] = rect(origin, (atile.wd, atile.ht)); - else: - ClipOn := false; - fi -enddef; -def endtile = - DoClip (active_plane); - endgroup -enddef; - -vardef is_tile (suffix atile) = - (known atile.pic ) and (picture atile.pic ) and - (known atile.wd ) and (numeric atile.wd ) and - (known atile.ht ) and (numeric atile.ht ) and - (known atile.clipon) and (boolean atile.clipon) -enddef; - -vardef pnt@# (expr p) = point @# of p enddef; -vardef pre@# (expr p) = precontrol @# of p enddef; -vardef post@# (expr p) = postcontrol @# of p enddef; - -vardef gbbox (expr g) (suffix ll, ur) = - save _s; _s := emax(1, ceiling bbox_split); - ur := ll := pnt 0 (g); - if (length g) > 0 : - for _j = 1 upto length g: - ll := pairmin(ll, pnt[_j] (g)); ur := pairmax(ur, pnt[_j] (g)); - endfor - for _j = 1 upto _s*(length g): - ctrlsbbox (subpath ((_j-1)/_s, _j/_s) of g) (ll, ur); - endfor - fi - if showbbox : noclip ( safedraw rect (ll, ur) ); fi -enddef; - -numeric bbox_split; bbox_split := 2; -def ctrlsbbox (expr p) (suffix ll, ur) = - ll := pairmin (ll, post0 (p)); ll := pairmin (ll, pre 1 (p)); - ur := pairmax (ur, post0 (p)); ur := pairmax (ur, pre 1 (p)); -enddef; - -def safedraw = colorsafedraw (drawcolor) enddef; -vardef colorsafedraw (expr clr) expr d = - save v; picture v; v := picpath d; - DoClip (v); - coloraddto (clr) (active_plane, v); -enddef; - -def NoCycleWarn expr s = - GBmsg s & " cannot be applied to an open path. " - & "The path will be drawn instead."; -enddef; - -def safefill = colorsafefill (fillcolor) enddef; -vardef colorsafefill (expr clr) expr c = - if cycle c : - save v; picture v; v := interior c; - DoClip (v); - if (clr > black) and (clr < white) : - subto (active_plane) (v); - v := nullpicture; - v := shaded (clr) c; - fi - coloraddto (clr) (active_plane, v); - else: NoCycleWarn "fill"; safedraw c; - fi -enddef; -def safeunfill expr c = - if cycle c : noclip (colorsafefill (background) c); - else: NoCycleWarn "unfill"; safedraw c; - fi -enddef; - -def safeclip expr c = - if cycle c : clipto (active_plane) c; - else: NoCycleWarn "clip"; safedraw c; - fi -enddef; - -def store (suffix fs) expr f = -hide( - if (not path f) and (not pair f) : - GBerrmsg ("Second argument to `store' must be a path or pair") - ""; - fi - if not path fs : path fs; fi - fs := f -) -enddef; -vardef stored (suffix fs) expr f = store (fs) f; f enddef; - -def drawn = colordrawn (drawcolor) enddef; -vardef colordrawn (expr clr) expr f = - colorsafedraw (clr) (zconv (f)); f -enddef; - -def filled = colorfilled (fillcolor) enddef; -vardef colorfilled (expr clr) expr c = - colorsafefill (clr) zconv (c); c -enddef; -vardef unfilled expr c = safeunfill zconv (c); c enddef; -vardef Clip expr c = safeclip zconv(c); c enddef; - -numeric shadewd; shadewd := 0.5bp; -path shadedotpath; -shadedotpath := fullcircle; % unitsquare; - -vardef shade (expr sp) expr f = - save g; path g; g := zconv (f); - save gr; numeric gr; - gr := 1 - (.88*abs(shadewd)/sp)**2; - if not cycle g : NoCycleWarn "shade"; safedraw g; - elseif gr <= 0 : safefill g; - else: - save ll, ur; pair ll, ur; - gbbox (g, ll, ur); - ll := floorpair (ll); - save sh, v; picture sh, v; - save dx; dx := ceiling(sp/(sqrt 2)); - sh := setdot (shadedotpath, abs(shadewd)); - v := filledwith (sh, 2(dx, dx), ll, ur); - DoClip(v); - orto (active_plane, Clipped (v) g); - sh := sh shifted hroundpair ((dx, dx).t_); - v := nullpicture; - v := filledwith (sh, 2(dx, dx), ll, ur); - DoClip(v); - orto (active_plane, Clipped (v) g); - fi - f -enddef; - -polkadotwd := 5bp; -mindotspace := 1bp; -path polkadotpath; polkadotpath := fullcircle; - -vardef polkadot (expr sp) expr f = - save g; path g; g := zconv (f); - if not cycle g : NoCycleWarn "polkadot"; safedraw g; - elseif sp <= emax (2*polkadotwd/3, mindotspace) : - safefill g; - else: - save ll, ur; pair ll, ur; - gbbox (g, ll, ur); - save dx, dy; dx := sp/2; dy := dx*(sqrt 3); - hshift := ((xpart (ur - ll)) mod dx)/2; - vshift := ((ypart (ur - ll)) mod dy)/2; - save p, dims; pair p, dims; - p := ll + (hshift, vshift); - dims := 2(dx, dy); - save v, thepolkadot; picture v, thepolkadot; - thepolkadot := setdot (polkadotpath, polkadotwd); - v := filledwith (thepolkadot, dims, p, ur); - p := p + (dx, dy); - orto (v, filledwith (thepolkadot, dims, p, ur)); - DoClip (v); clipto (v) g; - if (fillcolor > black) and (fillcolor < white): % gray - subto (active_plane) (v); - thepolkadot := - shaded (fillcolor) polkadotpath scaled ceiling(polkadotwd); - v := filledwith (thepolkadot, dims, p, ur); - p := p - (dx, dy); - orto (v, filledwith (thepolkadot, dims, p, ur)); - DoClip (v); clipto (v) g; - fi - coloraddto (fillcolor) (active_plane) (v); - fi - f -enddef; - -def thatch = colorthatch (hatchcolor) enddef; -vardef colorthatch (expr clr) (expr sp, theta) expr f = - save g; path g; g := zconv (f); - if not cycle g : NoCycleWarn "hatch"; safedraw g; - elseif sp <= abs(hatchwd) : colorsafefill (clr) g; - else: - save v; picture v; v := nullpicture; - save CT; transform CT; CT := identity rotated theta; - save ll, ur; pair ll, ur; - gbbox (g transformed inverse CT, ll, ur); - thatchf (v, CT, sp, ll, ur); - DoClip(v); - coloraddto (clr) (active_plane) (Clipped (v) g); - fi - f -enddef; - -def hhatch (expr sp) = thatch (sp, 0) enddef; -def vhatch (expr sp) = thatch (sp, 90) enddef; -def lhatch (expr sp) = thatch (sp, -45) enddef; -def rhatch (expr sp) = thatch (sp, 45) enddef; - -def xhatch = colorxhatch (hatchcolor) enddef; -vardef colorxhatch (expr clr, sp) expr f = - colorthatch (clr) (sp, 45) colorthatch (clr) (sp, -45) f -enddef; - -vardef tess (suffix atile) expr c = - save _g; path _g; _g := zconv (c); - if not is_tile (atile) : - GBerrmsg ("Tile parameter " & str atile & " of tess() is invalid") - "This tile may be undefined or incorrectly defined. " & - "If you proceed, tess() will be abandoned and the curve " & - "merely drawn."; safedraw _g; - elseif not cycle _g : NoCycleWarn "tess"; safedraw _g; - else: - save _ll, _ur; pair _ll, _ur; - gbbox (_g, _ll, _ur); - save _ts; picture _ts; - _ts := filledwith (atile.pic, (atile.wd, atile.ht), _ll, _ur); - DoClip (_ts); - orto (active_plane, Clipped (_ts) _g); - fi - c -enddef; - -if unknown segment_split : segment_split := 8; fi -if unknown dashsize : dashsize := 3bp; fi -if unknown dashgap : dashgap := dashsize + 2penwd; fi -if unknown dash_finish : dash_finish := .5; fi -if unknown dash_start : dash_start := .5; fi -if unknown unit_of_length : unit_of_length := 0.1in; fi - -vardef gendashed (suffix pat) expr f = - save _g; path _g; _g := zconv(f); - if (unknown pat.rep) : % no "pattern" - GBmsg "Dash pattern " & str pat & " undefined. " & - "Path will be drawn instead."; - safedraw _g; - elseif pat.rep < 2 : % no "spaces" - safedraw _g; - else: - save _dl, _tmppat; - forsuffixes _s = start, rep, finish : - _dl._s := 0; _tmppat._s := pat._s; - for i = 1 upto pat._s : - _tmppat._s[i] := pat._s[i]/unit_of_length; - _dl._s := _dl._s + _tmppat._s[i]; - endfor - endfor - if _dl.rep = 0 : - GBmsg "Dash pattern " & str pat & " has length 0. " & - "Path will be drawn instead."; - safedraw _g; - else: - save _p; path _p; - _p := _g scaled (1/unit_of_length); - save _cumlen, _totlen, _n, _sf; - _totlen := makelengtharray(_cumlen) _p; - _sf := scale_adjust (_n, _dl)(_totlen); - if _n < 0 : safedraw _g; - else: - forsuffixes _s = start, rep, finish : - for _i = 1 upto _tmppat._s : - _tmppat._s[_i] := _tmppat._s[_i]*_sf; - endfor - _dl._s := _dl._s*_sf; - endfor - save dashingdot; picture dashingdot; - if known plot_pic : dashingdot := makesymbol(plot_pic, penwd); - else: dashingdot := makesymbol(dotpath, penwd); - fi - save _ct, _t, _d, _v; - picture _v; _v := nullpicture; - _ct := 0; - % Begin with pat.start - _d0 := 0; _t0 := 0; - dashit (_tmppat.start) (_v); - % then pat.rep - if _n > 0 : - save _m; _m := ceiling sqrt(_n); - for _j = 0 step _m until _n - 1 : - for _i = 0 upto _m - 1 : - exitif (_i + _j) > _n - 1; - _d0 := _dl.start + (_j + _i)*_dl.rep; - _t0 := gettime(_cumlen, _ct) (_d0); - dashit (_tmppat.rep) (_v); - endfor - % add _m patterns and reset. - DoClip(_v); - mono (_v) - coloraddto (drawcolor) (active_plane, _v); - _v := nullpicture; - endfor - fi - % and finally, pat.finish - _d0 := _totlen - _dl.finish; - _t0 := gettime(_cumlen, _ct) (_d0); - dashit (_tmppat.finish) (_v); - DoClip(_v); - mono(_v) - coloraddto (drawcolor) (active_plane, _v); - fi - fi - fi - f -enddef; - -vardef makelengtharray (suffix clen) expr p = - save _s; _s := emax (1, ceiling segment_split); - clen := _s*length p; clen[0] := 0; - for _i = 1 upto clen : - clen[_i] := clen[_i-1] + abs (pnt[_i/_s] (p) - pnt[(_i-1)/_s] (p)); - endfor - clen[clen] -enddef; - -vardef scale_adjust (suffix n, pl) (expr lngth) = - n := (lngth - pl.start - pl.finish)/pl.rep; - n := if n < 0 : -1 else: round(n) fi; - lngth/(pl.start + emax(n, 0)*pl.rep + pl.finish) -enddef; - -vardef gettime (suffix arr, ct) (expr lngth) = - save _gtl, _s; - _s := emax(1, ceiling segment_split); - _gtl := emax (arr[ct], emin (arr[arr], lngth)); - forever: - exitif ( (arr[ct] <= _gtl) and (_gtl <= arr[ct+1]) ); - ct := ct + 1; % need to exit *before* incrementing - endfor - if arr[ct] = arr[ct+1] : ct - else: ( ct + (_gtl - arr[ct]) / (arr[ct+1] - arr[ct]) ) - fi /_s -enddef; - -def dashit (suffix pos) (suffix pic) = - for _k = 1 upto pos: - if odd _k : % draw a dash of length pos[_k] - if pos[_k] = 0 : % point required - _d1 := _d0; _t1 := _t0; - picdot (pic, dashingdot, pnt [_t0] (_g)); - else: - _d1 := _d0 + pos[_k]; - _t1 := gettime (_cumlen, _ct) (_d1); - shpath (pic, drawpen) (subpath (_t0, _t1) of _g); - fi - else: % find the start of the next dash: - _d0 := _d1 + pos[_k]; - _t0 := gettime(_cumlen, _ct) (_d0); - fi - endfor -enddef; - -def dashpat (suffix pat) (text t) = - pat.rep := 0; - for _itm = t: - pat.rep[incr pat.rep] := _itm; - endfor; - if odd (pat.rep) and (pat.rep > 1): - pat.rep[incr pat.rep] := 0; - fi - pat.start := 1; - pat.start[1] := pat.rep[1]*dash_start; - for _idx = 2 upto pat.rep : - pat.start[incr pat.start] := pat.rep[_idx]; - endfor - pat.finish := 1; - pat.finish[1] := pat.rep[1]*dash_finish; -enddef; - -vardef DASHED (expr dlen, dgap) expr f = - save dashes; dashpat (dashes) (dlen, dgap); - gendashed (dashes) f -enddef; - -def dashed = DASHED enddef; - -vardef doplot (expr spath, sc, dgap) expr f = - save dots; dashpat (dots) (0, dgap); - save plot_pic; picture plot_pic; - plot_pic := makesymbol (spath, sc); - gendashed (dots) f -enddef; - -path dotpath; dotpath := fullcircle; -vardef dotted (expr dsize, dgap) expr f = - doplot (dotpath, dsize, dgap) f -enddef; - -vardef plotnodes (expr symbol, size) expr f = - save _pln; pair _pln[]; - _pln := 0; - for _a = 0 upto (length f) if cycle f : - 1 fi : - _pln[incr _pln] := pnt[_a] (f); - endfor - dosymbols (drawcolor, symbol, size) (_pln); - f -enddef; - -vardef makesymbol (expr spath, sc) = - if path spath : setdot (spath, sc) - elseif picture spath : - save v; picture v; v:= spath; mono (v); v - else: - GBmsg "Undefined symbol for plotting, using dotpath instead."; - setdot (dotpath, sc) - fi -enddef; - -path Triangle, Square, Circle, Diamond, Star, Plus, Cross, - Asterisk, SolidTriangle, SolidSquare, SolidCircle, - SolidDiamond, SolidStar; - -Triangle := (for n = 0 upto 2: - (up rotated 120n)-- endfor up) scaled .78; -SolidTriangle := Triangle & cycle; - -Square := (for n = 0 upto 3: - dir (90n + 45)-- endfor dir 45) scaled .63; -SolidSquare := Square & cycle; - -Circle := halfcircle & halfcircle rotated 180; -SolidCircle := Circle & cycle; - -Diamond := (Square rotated 45) xscaled (1/1.2) yscaled 1.2; -SolidDiamond := Diamond & cycle; - -Plus := (origin for n = 0 upto 3: - --(up rotated 90n)--origin endfor) scaled .65; -Cross := Plus rotated 45; -Asterisk := (origin for n = 0 upto 5: - --(up rotated 60n)--origin endfor) scaled .6; - -pair zz; -zz = (whatever)[up, up rotated 144]; -zz = (whatever)[up rotated 72, up rotated -72]; -Star := (for n = 0 upto 4: - (up rotated 72n)--(zz rotated 72n)-- endfor up) scaled .84; -SolidStar := Star & cycle; -save zz; - -numeric dashtype; -forsuffixes s = start, rep, finish : - numeric dashtype[].s, dashtype[].s[]; -endfor -def defaultdashes = - dashpat (dashtype0) (0); % solid - dashpat (dashtype1) (3bp, 4bp); % dashed - dashpat (dashtype2) (0, 4bp); % dotted - dashpat (dashtype3) (0, 4bp, 3bp, 4bp); % dot-dash - dashpat (dashtype4) (0, 4bp, 3bp, 4bp, 0, 4bp);% dot-dash-dot - dashpat (dashtype5) (0, 4bp, 3bp, 4bp, 3bp, 4bp);% dot-dash-dash - dashtype := 6; -enddef; -defaultdashes; - -vardef isdashpat suffix pat = - (knownarray pat.start) and - (knownarray pat.finish) and - (knownarray pat.rep) -enddef; - -def setdatadashes (text lst) = - save dashtype; dashtype := 0; - forsuffixes _itm = lst : - if isdashpat _itm : - forsuffixes _s = start, rep, finish : - copyarray (_itm._s, dashtype[dashtype]._s); - endfor - dashtype := dashtype + 1; - else: GBmsg "Improper dash pattern in setdatadashes."; - fi - endfor - if dashtype = 0 : - SetdataWarn "dashes"; - defaultdashes; - fi -enddef; -def getdashpat expr n = dashtype[n mod dashtype] enddef; - -def SetdataWarn expr s = - GBmsg "Command setdata"& s &"() failed; using defaults." -enddef; - -def setdatasymbols (text lst) = - save pointtype; path pointtype[]; pointtype := 0; - for _itm = lst : - if (known _itm) and (path _itm): - pointtype[pointtype] := _itm; - pointtype := pointtype + 1; - else: - GBmsg "Improper path in setdatasymbols()."; - fi - endfor - if pointtype = 0: - SetdataWarn "symbols"; - defaultsymbols; - fi -enddef; -def getsymbol expr n := pointtype[n mod pointtype] enddef; - -numeric pointtype; path pointtype[]; -def defaultsymbols = - pointtype0 := Circle; - pointtype1 := Cross; - pointtype2 := SolidDiamond; - pointtype3 := Square; - pointtype4 := Plus; - pointtype5 := Triangle; - pointtype6 := SolidCircle; - pointtype7 := Star; - pointtype8 := SolidTriangle; - pointtype := 9; -enddef; -defaultsymbols; - -vardef bpoint (expr ptwd, b) = - fullcircle scaled ptwd shifted b -enddef; -def pointd (expr ptwd, filled) (text t) = - if filled : - plotsymbol (SolidCircle, ptwd) (t); - else : - begingroup; - save clearsymbols; boolean clearsymbols; clearsymbols := true; - plotsymbol (Circle, ptwd) (t); - endgroup - fi -enddef; - -boolean clearsymbols; clearsymbols := false; -vardef clearable (expr pth) = - false - if path pth : - if (not cycle pth) and (length pth > 0): - if ( pnt0 (pth) = pnt[length pth] (pth) ) : - or true - fi fi fi -enddef; - -def plotsymbol = colorplotsymbol (pointcolor) enddef; -vardef colorplotsymbol (expr clr, spath, sc) (text t) = - save _cpls; - textpairs (_cpls) (t); - dosymbols (clr, spath, sc) (_cpls); -enddef; - -vardef dosymbols (expr clr, spath, sc) (suffix arr) = - save one_symbol, _pls; picture one_symbol, _pls; - if clearsymbols and clearable (spath): - addsymbols (background, spath&cycle, sc) (arr); - fi - addsymbols (clr, spath, sc) (arr); -enddef; - -def addsymbols (expr clr, spath, sc) (suffix arr) = - one_symbol := makesymbol (spath, sc); - _pls := nullpicture; - for _idx = 1 upto arr: - picdot (_pls, one_symbol, zconv(arr[_idx])); - endfor - DoClip (_pls); - mono (_pls); - coloraddto (clr) (active_plane) (_pls); -enddef; - -vardef lclosed expr f = f if not cycle f : --cycle fi enddef; - -numeric default_tension; -default_tension := 1; - -def sclosed = sclosedt (default_tension) enddef; -vardef sclosedt (expr t) expr f = - if cycle f : f - else: save n; n := length f; - if n = 0 : f&cycle - elseif n = 1 : f..tension t..cycle - else : - (pnt0 (f)) { (pnt1(f)) - (pnt[n] (f)) }..tension t - ..(subpath (1, n-1) of f)..tension t - ..(pnt[n](f)) { pnt0(f) - pnt[n-1](f) } - ..tension t..cycle - fi - fi -enddef; - -def bclosed = bclosedt (default_tension) enddef; -vardef bclosedt (expr t) expr f = - f if not cycle f : ..tension t..cycle fi -enddef; - -def uclosed = bclosed enddef; - -def bsplinecontrols (suffix b) expr f = - b := 4; - b1 := 2[pre 1(f), post0(f)]; - b2 := 2[post0(f), pnt 0(f)]; - b3 := 2[b1, b2]; - b4 := 2[b2, b3]; -enddef; - -vardef cbclosed expr f = - if cycle f : f - elseif (length f)=0 : f&cycle - else: - save p, q; pair p[], q[]; - bsplinecontrols (p) f; % defines p1 to p4 - bsplinecontrols (q) reverse f; % defines q1 to q4 - f..controls q2 and q3..opencbs (q1,q4,p4,p1) - ..controls p3 and p2..cycle - fi -enddef; - -vardef qbclosed expr f = - if cycle f : f - else: save n; n := length f; - if n = 0 : f&cycle - else: - save p; pair p[]; p := 4; - p1 := (3/2)[pnt[n](f), pre[n](f)]; - p2 := 2[p1, pnt[n](f)]; - p4 := (3/2)[pnt 0 (f), post0 (f)]; - p3 := 2[p4, pnt 0 (f)]; - f & mkqbs (p) & cycle - fi - fi -enddef; - -vardef makesector expr p = - (pathcenter p)--p--cycle -enddef; - -path cuttings; -vardef cutoffbefore (expr b) expr f = - save w, t, u, n; n:= length f; - pair w; - for k = 1 upto n : - w := (subpath (0,k) of f) intersectiontimes b; - exitif w > left; - endfor - if debug : - GBdebug; - >> "Intersectiontimes:"; - show w; - GBenddebug; - fi - t := xpart w; - if t < 0: - cuttings := pnt0 (f); - f - else: - cuttings := subpath (0,t) of f; - subpath (t, n) of f - fi -enddef; - -vardef cutoffafter (expr b) expr f = - save g; path g; - g := cutoffbefore (b) reverse f; - cuttings := reverse cuttings; - reverse g -enddef; - -vardef trimmedpath (expr btrim, etrim) expr f = - save g, h; path g, h; - g := invvconv (fullcircle scaled 2btrim) shifted pnt0(f); - h := invvconv (fullcircle scaled 2etrim) shifted pnt[length f] (f); - cutoffafter (h) cutoffbefore (g) f -enddef; - -vardef predirection@# (expr p) = - - postdirection[length p - @#] (reverse p) -enddef; - -vardef postdirection@# (expr p) = - save _n; _n := length (p); - save v; pair v; v := __dir (subpath (@#, @# + _n) of p); - if v = origin : - v := - __dir (subpath (@#, @# - _n) of p); - fi - v -enddef; - -vardef __dir (expr p) = - save v, w; pair v, w; w := pnt0 (p); - v := origin; - for n = 1 upto length (p) : - v := post[n-1] (p) - w; - if v = origin : - v := pre[n] (p) - w; - if v = origin : - v := pnt[n] (p) - w; - fi - fi - exitif v <> origin; - endfor - v -enddef; - -newinternal hdwdr, hdten; -interim hdwdr := 1; interim hdten := 1; -boolean hfilled; hfilled := false; - -def headshape (expr wr, tens, fil) = - interim hdwdr := wr; interim hdten := tens; - save hfilled; boolean hfilled; hfilled := fil; -enddef; - -def head = ahead (headcolor) enddef; - -vardef ahead (expr clr, front, back, hwr, tens, filled) = - if front <> back : - save side; pair side; - side := (hwr/2) * ((front-back) rotated 90); - save f; path f; - f := (back + side)..tension tens.. - {front-back}front{back-front}..tension tens.. - (back - side) - if filled : --cycle; colorsafefill (clr) f fi; - colorsafedraw (clr) f; - fi -enddef; - -def headpath = colorheadpath (headcolor) enddef; -vardef colorheadpath (expr clr, hlen, hrot, hback) expr f = - if hlen <> 0 : - save g; path g; g := zconv (f); - save P; pair P[]; - P2 := pnt[length g] (g); - P1 := predirection[length g] (g); - if P1 <> (0, 0) : - P3 := (unitvector P1) rotated hrot; - P4 := P2 - (hback * P3); - P5 := P4 - (hlen * P3); - ahead (clr, P4, P5, hdwdr, hdten, hfilled); - fi - fi - f -enddef; - -def arrowdraw (expr hlen) (expr f) = - store (curpath) headpath (hlen, 0, 0) drawn f; -enddef; - -def xaxis (expr hlen) = arrowdraw (hlen) ((xneg, 0)--(xpos, 0)); enddef; -def yaxis (expr hlen) = arrowdraw (hlen) ((0, yneg)--(0, ypos)); enddef; -def axes (expr hlen) = xaxis (hlen); yaxis (hlen); enddef; - -laxis := baxis := raxis := taxis := 0; - -vardef axisline.x = (xneg + laxis, 0)--(xpos - raxis, 0) enddef; -vardef axisline.y = (0, yneg + baxis)--(0, ypos - taxis) enddef; -vardef axisline.l = axisline.y shifted (xneg + laxis, 0) enddef; -vardef axisline.b = axisline.x shifted (0, yneg + baxis) enddef; -vardef axisline.r = axisline.y shifted (xpos - raxis, 0) enddef; -vardef axisline.t = axisline.x shifted (0, ypos - taxis) enddef; -vardef axis@# (expr len) = - headpath (len, 0, 0) axisline@# -enddef; - -numeric inside, outside, centered, onleft, onright, ontop, onbottom; -inside := -2; -outside := -1; -onright := 1; -onleft := 2; -centered := .5[onright, onleft]; -onbottom := onright; -ontop := onleft; -ltick := rtick := ttick := btick := inside; -xtick := ytick := centered; - -vardef axismarks (expr inang, tp, loc, pdir) (expr len) (text t) = - save _tp, _U, _P, _tic, _ticang; - pair _U, _P, _tic[]; - _ticang := if tp<0 : inang else: 90 fi; - _tp := abs(tp) - 1; - _U := unitvector (vconv (pdir)) rotated _ticang; - _tic1 := (_tp - 1) * len * _U; % start of mark - _tic2 := _tp * len * _U; % end of mark - for _a = t: - safedraw ((_tic1--_tic2) shifted zconv (loc + _a*pdir)); - endfor -enddef; - -def xmarks = axismarks ( 90, xtick, (0, 0), right) enddef; -def ymarks = axismarks (-90, ytick, (0, 0), up) enddef; -def lmarks = axismarks (-90, ltick, (xneg + laxis, 0), up) enddef; -def bmarks = axismarks ( 90, btick, (0, yneg + baxis), right) enddef; -def rmarks = axismarks ( 90, rtick, (xpos - raxis, 0), up) enddef; -def tmarks = axismarks (-90, ttick, (0, ypos - taxis), right) enddef; - -path griddotpath; griddotpath := fullcircle; -def grid = vgrid (0.5bp) enddef; -vardef vgrid (expr dsize, xspace, yspace) = - save gdot, gridpic; picture gdot, gridpic; - gdot := setdot (griddotpath, dsize); - gridpic := nullpicture; - for n = ceiling(xneg/xspace) upto floor(xpos/xspace): - for m = ceiling(yneg/yspace) upto floor(ypos/yspace): - picdot (gridpic, gdot, zconv((n*xspace, m*yspace))); - endfor - endfor - mono (gridpic); - coloraddto (pointcolor) (active_plane) (gridpic); -enddef; - -def hgridlines (expr ysp) = - for n = ceiling((yneg + baxis)/ysp) upto floor((ypos - taxis)/ysp) : - safedraw zconv((xneg + laxis, n*ysp)--(xpos - raxis, n*ysp)); - endfor -enddef; -def vgridlines (expr xsp) = - for n = ceiling((xneg + laxis)/xsp) upto floor((xpos - raxis)/xsp) : - safedraw zconv((n*xsp, yneg + baxis)--(n*xsp, ypos - taxis)); - endfor -enddef; -def gridlines (expr xsp, ysp) = - vgridlines (xsp); hgridlines (ysp); -enddef; - -vardef plrpatch (expr rstart, rstop, rstep, tstart, tstop, tstep) = - save v; picture v; v := nullpicture; - patcharcs (v) (rstart, rstop, rstep, tstart, tstop); - coloraddto (drawcolor) (active_plane, v); - v := nullpicture; - patchrays (v) (tstart, tstop, tstep, rstart, rstop); - coloraddto (drawcolor) (active_plane, v); -enddef; -def patcharcs (suffix X) (expr rstart, rstop, rstep, tstart, tstop) = - for rad = (if rstart=0: rstep else: rstart fi) step rstep until rstop: - orto (X, picpath zconv (arcplr ((0, 0), tstart, tstop, rad)) ); - endfor -enddef; -def patchrays (suffix X) (expr tstart, tstop, tstep, rstart, rstop) = - for _ang = tstart step tstep until tstop: - orto (X) (picpath zconv ((rstart*dir _ang)--(rstop*dir _ang))); - endfor -enddef; - -def polargrid (expr rstep, tstep) = - gridarcs (rstep); gridrays (tstep); -enddef; - -def polargridpoints (expr dsize, rstep, tstep) = - beginpolargrid; - save gdot; picture gdot; gdot := setdot (griddotpath, dsize); - if rmin = 0: - picdot (gridpic, gdot, zconv(origin)); - rmin := rstep; - fi - for n = ceiling (rmin/rstep) upto floor (rmax/rstep) : - for m = ceiling (tmin/tstep) upto floor (tmax/tstep) : - picdot ( gridpic, gdot, zconv ( polar((n*rstep, m*tstep)) ) ); - endfor - endfor - endpolargrid (pointcolor, .5dsize); -enddef; - -def gridarcs (expr rstep) = - beginpolargrid; - if rmin = 0 : % add "circle" of radius 0 - picdot (gridpic, setdot(griddotpath, penwd), zconv(origin)); - fi - rmin := rstep * floor(rmin/rstep + 1); - rmax := rstep*ceiling(rmax/rstep - 1); - patcharcs (gridpic) (rmin, rmax, rstep, tmin, tmax); - endpolargrid (drawcolor, .5penwd); -enddef; - -def gridrays (expr tstep) = - beginpolargrid; - tmin := tstep*ceiling(tmin/tstep); - tmax := tstep * floor(tmax/tstep); - patchrays (gridpic) (tmin, tmax, tstep, rmin, rmax); - endpolargrid (drawcolor, .5penwd); -enddef; - -def beginpolargrid = - begingroup; - save p, r, t, rmax, rmin, tmax, tmin; - pair p[]; - % Four corners: - p0 := (xneg, yneg); p1 := (xneg, ypos); - p2 := (xpos, ypos); p3 := (xpos, yneg); - r0 := abs(p0); rmax := r0; - for j = 1 upto 3 : - r[j] := abs(p[j]); - if rmax < r[j] : rmax := r[j]; fi - endfor - rmin := 0; - if (xneg < 0) and (xpos > 0) and (yneg < 0) and (ypos > 0) : - tmin := 0; tmax := 360; - elseif (p0 = (0,0)) : tmin := 0; tmax := 90; - elseif (p1 = (0,0)) : tmin := -90; tmax := 0; - elseif (p2 = (0,0)) : tmin := -180; tmax := -90; - elseif (p3 = (0,0)) : tmin := 90; tmax := 180; - else : - tmax := tmin := t0 := angle p0; - for j = 1 upto 3: - t := t0 + angle (p[j] rotated -t0); - if tmax < t : tmax := t; fi - if tmin > t : tmin := t; fi - endfor - if (xneg < 0) and (xpos > 0) : % (1) - rmin := emin(abs(yneg), abs(ypos)); - elseif (yneg < 0) and (ypos > 0) : % (2) - rmin := emin(abs(xneg), abs(xpos)); - else : % (3) - rmin := min(r0, r1, r2, r3); - fi - fi - save gridpic; picture gridpic; gridpic := nullpicture; -enddef; - - -def endpolargrid (expr clr, size)= - clipto (gridpic) rect ( zconv((xneg, yneg)) - size*(1,1), - zconv((xpos, ypos)) + size*(1,1) ); - coloraddto (clr) (active_plane) (gridpic); - endgroup -enddef; - -vardef polarpatch (expr rstart, rstop, rstep, tstart, tstop, tstep) = - plrpatch (rstart, rstop, rstep, tstart, tstop, tstep); - safedraw zconv ( arcplr ((0, 0), tstart, tstop, rstop) ); - safedraw zconv ( ((rstart, 0)--(rstop, 0)) rotated tstop ); -enddef; - -vardef rect (expr ll, ur) = - ll--(xpart ur, ypart ll)--ur--(xpart ll, ypart ur)--cycle -enddef; -vardef triangle (expr A, B, C) = A--B--C--cycle enddef; - -vardef regularpolygon (expr n) (suffix Bob) (text eqns) = - pair Bob[]; Bob := emax(round (abs (n)), 2); - eqns; - for _uncle = 1 upto Bob - 1 : - (Bob1 - Bob0) rotated (360*_uncle/Bob) = Bob[_uncle+1] - Bob0; - endfor - mkpoly (true) (Bob) -enddef; - -vardef altitudept expr n of t = - save A, B, C, zz; pair A, B, C, zz; - A := pnt[n] (t); - B := pnt[n + 1] (t); % wraps around a cyclic path - C := pnt[n + 2] (t); - zz = whatever[B,C]; - zz = A + whatever*((C-B) rotated 90); - zz -enddef; - -vardef altitude expr n of t = - (pnt[n](t))--(altitudept n of t) -enddef; - -vardef medianpt expr n of t = - 0.5[pnt[n + 1] (t), pnt[n + 2] (t)] -enddef; - -vardef median expr n of t = - (pnt[n](t))--(medianpt n of t) -enddef; - -vardef anglebisectorpt expr n of t = - save A, B, C; pair A, B, C; - A := pnt[n ] (t); - B := pnt[n + 1] (t); - C := pnt[n + 2] (t); - save zz; pair zz; - zz = whatever[B,C]; - zz = A + whatever*((B-A) rotated (.5*cornerangle (A,B,C))); - zz -enddef; - -vardef anglebisector expr n of t = - (pnt[n](t))--(anglebisectorpt n of t) -enddef; - -vardef cornerangle (expr A, B, C) = - if (A = B) and (B = C) : 60 - elseif (B = C) : 0 - elseif (A = B) or (A = C) : 90 - else: angle ((C - A) rotated (-angle (B - A))) - fi -enddef; - -vardef mkpath (expr smooth, tens, cyclic) (suffix pts) = - if smooth : mksmooth (tens, cyclic, pts) - else : mkpoly (cyclic, pts) - fi -enddef; - -vardef mkpoly (expr cyclic) (suffix pts) = - for _i = 1 upto pts-1: pts[_i]-- endfor - pts[pts] if cyclic : -- cycle fi -enddef; - -vardef polyline (expr cyclic) (text t) = - save _pl; textpairs (_pl) (t); mkpoly (cyclic, _pl) -enddef; - -vardef mksmooth (expr tens, cyclic) (suffix pts) = - pts1 - if pts = 1 : - if cyclic : &cycle fi - else: - if cyclic : - {pts[2]-pts[pts]} - fi - for _i = 2 upto pts-1: - ..tension tens..pts[_i]{pts[_i+1]-pts[_i-1]} - endfor - ..tension tens..pts[pts] - if cyclic : - {pts[1]-pts[pts-1]}..tension tens..cycle - fi - fi -enddef; - -def curve = tcurve (default_tension) enddef; -vardef tcurve (expr tens, cyclic) (text t) = - save _tc; textpairs (_tc) (t); mksmooth (tens, cyclic, _tc) -enddef; - -vardef mkbezier (expr tens, cyclic) (suffix pts) = - for _i = 1 upto pts-1 : pts[_i]..tension tens.. endfor - pts[pts] if cyclic : ..tension tens..cycle fi -enddef; - -def bezier = tbezier (default_tension) enddef; -vardef tbezier (expr tens, cyclic) (text t) = - save _tsb; textpairs (_tsb) (t); mkbezier (tens, cyclic) (_tsb) -enddef; - -vardef mkqbezier (expr cyclic) (suffix pts) = - save _mqb; _mqb := pts; - if (cyclic and odd pts) or not (cyclic or odd pts): - pts[incr _mqb] := pts[pts]; - fi - if cyclic : pts[incr _mqb] := pts1; fi - pts1 - for _i = 2 step 2 until _mqb - 1 : - ..controls 1/3[pts[_i],pts[_i-1]] and 1/3[pts[_i], pts[_i+1]] - ..pts[_i+1] - endfor - if cyclic : &cycle fi -enddef; - -vardef qbezier (expr cyclic) (text t) = - save _qbz; textpairs (_qbz) (t); mkqbezier (cyclic) (_qbz) -enddef; - -vardef openqbs (text t) = - save _oq; textpairs (_oq) (t); mkqbs (_oq) -enddef; - -vardef closedqbs (text t) = - save _cq; textpairs (_cq) (t); - _cq[incr _cq] := _cq1; _cq[incr _cq] := _cq2; - mkqbs (_cq) & cycle -enddef; - -vardef mkqbs (suffix b) = - for _i = 1 upto b-2: - 0.5[b[_i], b[_i+1]] - ..controls 1/6[b[_i+1], b[_i]] and 1/6[b[_i+1], b[_i+2]].. - endfor - 0.5[b[b-1], b[b]] -enddef; - -vardef mkopencbs (suffix b) = - for _i = 1 upto b-3: - (b[_i]+4b[_i+1]+b[_i+2])/6 - ..controls 1/3[b[_i+1], b[_i+2]] and 2/3[b[_i+1], b[_i+2]].. - endfor - (b[b-2]+4b[b-1]+b[b])/6 -enddef; -vardef mkclosedcbs (suffix b) = - mkopencbs (b) & opencbs (b[b-2],b[b-1],b[b], b1, b2, b3) & cycle -enddef; - -vardef opencbs (text t) = - save _oc; textpairs (_oc) (t); mkopencbs (_oc) -enddef; -vardef closedcbs (text t) = - save _clc; textpairs (_clc) (t); mkclosedcbs (_clc) -enddef; - -vardef fcncontrol (expr ftens, X, Y, Z) = - save dl, dr, before, after; pair before, after; - before := Y - X; after := Z - Y; - dl := xpart (before); dr := xpart (after); - if (dr = 0) or (dl = 0): - Y + abs(dr)/ftens * sgn before - else: - Y + abs(dr)/ftens * unitvector (before*dr/dl + after*dl/dr) - fi -enddef; - -vardef mkfcnpath (expr ftens) (suffix q) = - for _i = 1 upto q - 1: - q[_i]..controls fcncontrol (ftens) (q[_i-1], q[_i], q[_i+1]) - and fcncontrol (ftens) (q[_i+2], q[_i+1], q[_i]).. - endfor - q[q] -enddef; - -def fcncurve = functioncurve (emax(1.2default_tension, eps)) enddef; -vardef functioncurve (expr ftens) (text t) = - save _fc; textpairs (_fc) (t); - if _fc > 1 : _fc0 := _fc1; _fc[_fc+1] := _fc[_fc]; fi - mkfcnpath (ftens)(_fc) -enddef; - -vardef turtle (text t) = - save _tu; pair _tu[]; _tu := 0; _tu0 := (0, 0); - for _a = t: _tu[incr _tu] := _tu[_tu - 1] + _a; endfor - mkpoly (false, _tu) -enddef; - -vardef mkarc (expr center, from, to, sweep) = - save n, d; pair d; - n := ceiling (abs(sweep)/45); - d := (from - center) rotated (signof (sweep) 90); - from{d} - for j = 1 upto n-1 : - ..(from rotatedabout (center, j/n*sweep)){d rotated (j/n*sweep)} - endfor ..to{d rotated sweep} -enddef; - -vardef arc (expr center, from, sweep) = - if (center = from) or (sweep = 0) : - from--from - else: - save to; pair to; - to := from rotatedabout (center, sweep); - mkarc (center, from, to, sweep) - fi -enddef; -def arccps = arc enddef; - -vardef arccenter (expr from, to, sweep) = - save ang, c; - pair c; - ang := 90 - (sweep mod 360)/2; % -90 < ang <= 90 - if (abs(ang) = 90) or (from = to) : - GBmsg "The central point of this arc is undefined. " & - "Using midpoint of chord instead."; - 0.5[from, to] - else: - save cd; pair cd; cd := to - from; - c = from + whatever*(cd rotated ang); - if abs(ang) < 30 : - c = (0.5)[from, to] + whatever*(cd rotated 90); - else: - c = to + whatever*(-cd rotated -ang); - fi - c - fi -enddef; - -vardef midarc (expr from, to, sweep) = - save m, cd; pair m, cd; - cd := to - from; - m = from + whatever*( cd rotated (-sweep/4)); - m = 0.5[from, to] + whatever*(cd rotated 90); - m -enddef; - -vardef arcpps (expr from, to, sweep) = - if ((sweep mod 360) = 0) or (from = to) : - GBmsg "Undefined arc. A line segment will be used instead."; - from--to - elseif abs(sweep) <= 90 : - save cd; pair cd; cd := to - from; - if abs(sweep) <= 45 : - from{cd rotated (-sweep/2)}..to{cd rotated (sweep/2)} - else: - from{cd rotated (-sweep/2)}..midarc(from, to, sweep){cd} - ..to{cd rotated (sweep/2)} - fi - else: - save center; pair center; - center := arccenter (from, to, sweep); - mkarc (center, from, to, sweep) - fi -enddef; - -vardef arcplr (expr center, frtheta, totheta, rad) = - if rad = 0 : - center -- center - else: - save from, to; pair from, to; - from := center + rad*dir frtheta; - to := center + rad*dir totheta; - if frtheta = totheta : - from--to - else: - mkarc (center, from, to, totheta - frtheta) - fi - fi -enddef; -vardef arcalt (expr center, radius, anglefrom, angleto) = - arcplr (center, anglefrom, angleto, radius) -enddef; - -vardef arcppp (expr first, second, third) = - arcpps (first, second, 2*cornerangle (third, first, second)) & - arcpps (second, third, 2*cornerangle (first, second, third)) -enddef; - -vardef ellipse (expr center, radx, rady, angle) = - fullcircle xscaled (2*radx) yscaled (2*rady) rotated angle - shifted center -enddef; -vardef circle (expr center, rad) = - fullcircle scaled (2*rad) shifted center -enddef; - -vardef circlecp (expr center, point) = - mkarc (center, point, point, 360) & cycle -enddef; -vardef circleppp (expr one, two, three) = - save ang; numeric ang[]; - ang0 := cornerangle(three, one, two); - ang1 := cornerangle(one, two, three); - ang2 := cornerangle(two, three, one); - arcpps (one, two, 2ang0) & arcpps (two, three, 2ang1) & - arcpps (three, one, 2ang2) & cycle -enddef; -vardef circlepps (expr one, two, sweep) = - save ang, full; numeric ang[], full; - full := signof (sweep) 360; - ang1 := sweep mod (full); - ang2 := full - ang1; - arcpps (one, two, ang1) & arcpps (two, one, ang2) & cycle -enddef; - -vardef pathcenter expr p = - save a, cntr, n; pair cntr, a[]; - n := length p; - a1 = pnt 0 (p); - a3 = pnt [n/2] (p); - if cycle p : - a2 = pnt [n/4] (p); - a4 = pnt [3n/4] (p); - else: - a2 := a3; - a4 := pnt[n] (p); - fi - cntr = .5[a1, a3] + whatever*((a3 - a1) rotated 90); - cntr = .5[a2, a4] + whatever*((a4 - a2) rotated 90); - cntr -enddef; - -vardef circumcircle expr t = - circleppp (pnt0 (t), pnt1 (t), pnt2 (t)) -enddef; - -vardef incircle expr t = - save A, B, C; pair A, B, C; - A := pnt0 (t); - B := pnt1 (t); - C := pnt2 (t); - % Find the tangent points on the sides. E.g., a is the common - % distance from A to the tangent points on the adjacent sides. - save a, b, c; - a + b = abs (B-A); - b + c = abs (C-B); - a + c = abs (A-C); - circleppp (A + a*unitvector (B-A), - B + b*unitvector (C-B), - C + c*unitvector (A-C)) -enddef; - -vardef excircle expr n of t = - save A, B, C; pair A, B, C; - A := pnt[n] (t); - B := pnt[n + 1] (t); % wraps around - C := pnt[n + 2] (t); - save a, b, c; - a - b = abs (B-A); - b + c = abs (C-B); - a - c = abs (C-A); - circleppp (A + a*unitvector(B-A), - B + b*unitvector(C-B), - C + c*unitvector(C-A)) -enddef; - -vardef ninepointcircle expr t = - circleppp (medianpt 0 of t, medianpt 1 of t, medianpt 2 of t) -enddef; - -vardef circumcenter expr t = pathcenter circumcircle t enddef; -vardef incenter expr t = pathcenter incircle t enddef; -vardef excenter expr n of t = pathcenter excircle n of t enddef; -vardef ninepointcenter expr t = pathcenter ninepointcircle t enddef; - -vardef barycenter expr t = - save n, m; n := length t; m := n + 1; - save xxx; - xxx : = pnt0 (t)/m for k = 1 upto n-1 : + pnt[k] (t)/m endfor; - if cycle t: xxx*(1 + 1/n) - else: xxx + pnt[n] (t)/m - fi -enddef; -vardef sector (expr center, rad, frtheta, totheta) = - center -- arcalt (center, rad, frtheta, totheta) -- cycle -enddef; - -vardef mkfcn (expr smooth, tens) (expr bmin, bmax, bst) (text pf) = - save _p; pair _p[]; _p := 0; - save _dx, _n, _r; numeric _dx, _n, _r; - if bmax = bmin : _n := 1; - else: - _r := bmax - bmin; - _dx := max (abs(bst), nottoosmall*abs(_r), epsilon); - _n := emax (round(abs(_r)/_dx), 1); - fi - for _i = 0 upto _n: _p[incr _p] := pf(bmin + _i/_n*_r); endfor - mkpath (smooth, tens, false, _p) -enddef; -def tfcn (expr smooth) = mkfcn (smooth, default_tension) enddef; - -def parafcn (expr smooth) = tparafcn (smooth, default_tension) enddef; -vardef tparafcn (expr sm, tn) (expr bmin, bmax, bst) (text pf) = - save _fp; vardef _fp (expr t) = pf enddef; - mkfcn (sm, tn) (bmin, bmax, bst) (_fp) -enddef; - -vardef xfcn (expr smooth) (expr xmin, xmax, st) (text _fx) = - save _fp; vardef _fp (expr _x) = (_x, _fx(_x)) enddef; - mkfcn (smooth, default_tension) (xmin, xmax, st) (_fp) -enddef; - -def function (expr smooth) = tfunction (smooth, default_tension) enddef; -vardef tfunction (expr smooth, tens) (expr xmin, xmax, st) (text _fx) = - save _fp; vardef _fp (expr x) = (x, _fx) enddef; - mkfcn (smooth, tens) (xmin, xmax, st) (_fp) -enddef; - -def btwnfcn (expr sm) = tbtwnfcn (sm, default_tension) enddef; -vardef tbtwnfcn (expr sm, tn)(expr xlo, xhi, st)(text _fx)(text _gx) = - tfunction (sm, tn) (xlo, xhi, st) (_fx) -- - ( reverse tfunction (sm, tn) (xlo, xhi, st) (_gx) ) -- cycle -enddef; - -vardef rfcn (expr smooth) (expr tmin, tmax, st) (text ft) = - save _fq; vardef _fq (expr t) = (ft(t)) * (dir t) enddef; - mkfcn (smooth, default_tension) (tmin, tmax, st) (_fq) -enddef; - -def plrfcn (expr smooth) = tplrfcn (smooth, default_tension) enddef; -vardef tplrfcn (expr smooth, tens) (expr tmin, tmax, st) (text ft) = - save _fq; vardef _fq (expr t) = (ft) * (dir t) enddef; - mkfcn (smooth, tens) (tmin, tmax, st) (_fq) -enddef; - -vardef piechart (expr sign, ang, cent, rad) (text data) = - save _sum, _tot; - numeric piewedge; piewedge := 0; - numeric pieangle, pieangle[]; pieangle0 := 0; - for _val = data : - pieangle[incr piewedge] := pieangle[piewedge - 1] + _val; - endfor - _tot := pieangle[piewedge]; - pair piecenter; piecenter := cent; - path piewedge[]; - numeric piedirection; pair piedirection[]; - pieangle[piewedge + 1] = ang + sign*360; - for _n = piewedge downto 1 : - pieangle[_n] := ang + sign*pieangle[_n - 1]/_tot*360; - piewedge[_n] = - sector(cent, rad, pieangle[_n], pieangle[_n+1]); - piedirection[_n] := dir(0.5[ pieangle[_n], pieangle[_n+1] ]); - endfor - piedirection := pieangle := piewedge; -enddef; - -def barchart (expr start, sep, r, vert)(text data) = - numeric barbegin, barbegin[], - barend, barend[], - barlength, barlength[], - barstart, barstart[], - chartbar, barwd; - path chartbar[]; - chartbar := 0; barwd := r*sep; - for _itm = data : - barend[incr chartbar] := if pair _itm: ypart _itm else: _itm fi; - barbegin[chartbar] := if pair _itm: xpart _itm else: 0 fi; - endfor - barbegin := barend := barlength := barstart := chartbar; - for _n = 1 upto chartbar : - barstart[_n] := start + sep*(_n-1); - barlength[_n] := barend[_n]; - chartbar[_n] := rect ((barbegin[_n], 0), ( barend[_n], barwd) ) - shifted (0, barstart[_n]) if vert: xyswap fi; - endfor -enddef; - -picture totalpicture; -boolean totalnull, currentnull; -def clearit = - currentpicture := totalpicture := nullpicture; - currentnull := totalnull := true; -enddef; - -def keepit = - mono (currentpicture); - addto totalpicture also currentpicture; - currentpicture := nullpicture; - totalnull := currentnull; - currentnull := true; -enddef; - -def addto_currentpicture = - currentnull := false; - addto currentpicture -enddef; - -def mergeit (text do) = - if totalnull : - do currentpicture - elseif currentnull : - do totalpicture - else: - begingroup - save _v_; picture _v_; - _v_ := currentpicture; - mono (_v_); - addto _v_ also totalpicture; - do _v_ - endgroup - fi -enddef; - -def shipit_ = - mergeit (shipout) -enddef; -def shipit = shipit_ enddef; - -def showit_ = - mergeit (show_) -enddef; -def show_ suffix v = - display v inwindow currentwindow -enddef; - -numeric gcode; gcode := 0; - -% end grafbase.mf -endinput. -%% -%% End of file `grafbase.mf'. diff --git a/Master/texmf-dist/metafont/mfpic/grafbase.mf b/Master/texmf-dist/metafont/mfpic/grafbase.mf new file mode 100644 index 00000000000..470e3e7f346 --- /dev/null +++ b/Master/texmf-dist/metafont/mfpic/grafbase.mf @@ -0,0 +1,3465 @@ +%% +%% This is file `grafbase.mf', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% grafbase.dtx (with options: `MF') +%% +%% ------------------------------------------------------------------- +%% +%% Copyright 2002--2006, Daniel H. Luecking +%% +%% Mfpic may be distributed and/or modified under the conditions of the +%% LaTeX Project Public License, either version 1.3b of this license or (at +%% your option) any later version. The latest version of this license is in +%% <http://www.latex-project.org/lppl.txt> +%% and version 1.3b or later is part of all distributions of LaTeX version +%% 2005/12/01 or later. +%% +%% Mfpic has maintenance status "author-maintained". The Current Maintainer +%% is Daniel H. Luecking. There are several Base Interpreters associated +%% with mfpic: plain TeX, LaTeX, plain Metafont and plain MetaPost. +%% +if (known grafbaseversion) or (known grafbase): + message "Grafbase (" & jobname & "): You have loaded grafbase more " + & "than once! Please make sure that it is loaded only once."; + endinput; +fi +boolean grafbase; grafbase := true; + +string fileversion, filedate; +fileversion := "0.9"; filedate := "2006/05/26"; + +message " Loading grafbase macros, version " & fileversion & " " & + filedate & "."; + +def GBmsg expr s = message "Grafbase (" & jobname & "): " & s; enddef; +def GBwarn expr s = GBmsg "Warning, " & s; enddef; +def GBerrmsg (expr s) expr t = errhelp t; + errmessage "Grafbase (" & jobname & "): " & s; errhelp ""; +enddef; + +boolean MFPIC; MFPIC := false; + +def checkversions (expr g)= + numeric grafbaseversion; grafbaseversion := g; + if unknown mfpicversion: % no mfpic, or < 0.63 + GBmsg "Recent mfpic not detected."; + elseif g = mfpicversion: + MFPIC := true; + else: + message ""; + GBwarn "Version mismatch: " + & "mfpic and grafbase versions do not match."; + message ""; + fi +enddef; + +checkversions (90); + +if unknown base_name : input plain; +elseif not string base_name: input plain; +elseif base_name <> "plain": input plain; +fi + +boolean METAPOST; + +if known color Geamparalele din Babadag: + METAPOST := true; +else: + METAPOST := false; +fi + +if METAPOST: + GBerrmsg ("wrong compiler.") + "This file is for Metafont. For Metapost use grafbase.mp."; +fi + +if not boolean debug: boolean debug; debug := false; fi + +def GBdebug = + begingroup + save >>; def >> = message enddef; + >> "Grafbase DEBUG"; +enddef; +def GBenddebug = + >> "End DEBUG"; + endgroup +enddef; + +vardef mftitle expr t = + if string t: t; message t; fi +enddef; + +if unknown mode: + GBerrmsg ("Metafont mode is unknown.") + "Set mode to a known mode. Perhaps localfont or ljfour. " + & "If you proceed, a generic 600dpi mode will be used."; + if known localfont: mode := localfont; + else: + mode_def GBgeneric = + proofing := 0; + fontmaking := 1; + tracingtitles := 0; + if unknown pixels_per_inch: + pixels_per_inch := 600; + fi + blacker := 0; + fillin := 0; + o_correction := 1; + enddef; + mode := GBgeneric; + fi +fi + +mode_setup; +if debug: + GBdebug; + >> "pixels_per_inch = " & decimal pixels_per_inch; + GBenddebug; +fi +font_identifier := "MFpic graphics"; +font_coding_scheme := "Arbitrary"; +interim designsize := 128pt#; + +if unknown aspect_ratio: aspect_ratio := 1; fi +if unknown hppp: hppp := 1 fi; +if unknown currenttransform: + transform currenttransform; + currenttransform := identity yscaled aspect_ratio; +fi + +interim warningcheck := 0; +interim turningcheck := 0; + +numeric unitlen, xscale, yscale, xneg, xpos, yneg, ypos; + +unitlen := 1 bp#; +xscale := 7.2; +yscale := 7.2; +xneg := 0; xpos := 10; +yneg := 0; ypos := 10; + +newinternal deg, pi, radian; +deg := 1; pi := 3.14159; +radian := 57.29578; +numeric degree; degree := deg; + +newinternal penwd; penwd := 0.5pt; +pen drawpen; + +def resizedrawpen (expr s) = + interim penwd := s; + setvariable (pen) (drawpen) pencircle scaled penwd; + save currentpen; pen currentpen; pickup drawpen; +enddef; + +numeric hatchwd; hatchwd := 0.5bp; +pen hatchpen; hatchpen := pencircle scaled hatchwd; + +boolean clipall; clipall := false; +boolean ClipOn; ClipOn := false; +path ClipPath[]; numeric ClipPath; ClipPath = 0; +boolean truebbox; truebbox := false; + +def DoClip (suffix v) = + if ClipOn and (ClipPath > 0): clipsto (v, ClipPath); fi +enddef; + +def noclip (text t) = + hide ( setboolean (ClipOn) false; t) +enddef; + +boolean showbbox; showbbox := false; + +let color = numeric; color black, white; +black := 0; white := 1; +def withcolor text t = enddef; +def _wc_ = withcolor enddef; + +color currentcolor, drawcolor, fillcolor, hatchcolor, + headcolor, pointcolor, tlabelcolor, background; +currentcolor := fillcolor := drawcolor := hatchcolor := + headcolor := pointcolor := tlabelcolor := black; +background := white; + +vardef snapto expr t = + if unknown t: 0 + elseif not (numeric t): 0 + elseif t < 0: 0 + elseif t > 1: 1 + else: t + fi +enddef; + +vardef gray (expr g) = (snapto g)*white enddef; + +vardef makeclr (expr r, g, b) = + gray (sqrt((2r*r + 4g*g + b*b)/7)) +enddef; + +vardef rgb (expr r, g, b) = + makeclr (snapto r, snapto g, snapto b) +enddef; + +vardef cmyk (expr c, m, y, k) = + rgb (1-c-k, 1-m-k, 1-y-k) +enddef; + +vardef RGB (expr R, G, B) = + rgb (R/255, G/255, B/255) +enddef; + +vardef named (suffix c) = + if unknown c: black else: forceclr (c) fi +enddef; +vardef forceclr (expr c) = + if numeric c: gray (c) + elseif color c: c + else: black + fi +enddef; + +color red, green, blue, cyan, magenta, yellow; +red := rgb (1, 0, 0); +green := rgb (0, 1, 0); +blue := rgb (0, 0, 1); +cyan := rgb (0, 1, 1); +magenta := rgb (1, 0, 1); +yellow := rgb (1, 1, 0); + +def list (suffix v) (text lst) = + v := 0; for _itm = lst: v[incr v] := _itm; endfor + if v = 0: + GBerrmsg ("no list to process!") + "An attempt was made to produce an array from a " + & "list of expressions having no valid entries."; + fi +enddef; + +def map (text proc) (text lst) = + hide (_map := 0;) + for _a = lst: + if _map = 0: hide (_map := 1;) else: , fi + proc (_a) + endfor +enddef; + +vardef knownnumericarray suffix arr = + setboolean (_kna) (known arr) and (numeric arr); + if _kna : + _kna := (arr = floor arr) and (arr >= 1); + for _idx = 1 upto arr : + exitif not _kna; + _kna := (known arr[_idx]) and (numeric arr[_idx]); + endfor + fi + _kna +enddef; + +def copyarray (suffix src, dest) = + for _idx = 1 upto src: dest[_idx] := src[_idx]; endfor + dest := src; +enddef; + +def maparr (text proc) (suffix p) = + for _idx = 1 upto p: proc (p[_idx]); endfor +enddef; + +def textpairs = gsetarray (pair) enddef; + +def setuniquepairs (suffix p) (text t) = + save p; pair p[]; + setpairs (_up) (t); + if _up > 0: + p := 1; p1 := _up1; + for _i = 2 upto _up: + if _up[_i] <> p[p]: p[incr p] := _up[_i]; fi + endfor + else: + p := 0; + fi +enddef; + +vardef chpair (text proc) (expr p) = + (proc (xpart p), proc (ypart p)) +enddef; + +vardef floorpair (expr p) = (floor (xpart p), floor (ypart p)) enddef; +vardef ceilingpair (expr p) = + (ceiling (xpart p), ceiling (ypart p)) +enddef; + +def hroundpair (expr p) = (hround (xpart p), hround (ypart p)) enddef; +vardef goodpair (expr p) = hroundpair(p.t_) enddef; + +vardef emin (expr a, b) = if a < b: a else: b fi enddef; +vardef emax (expr a, b) = if a > b: a else: b fi enddef; + +vardef pairmin (expr z, w) = + ( emin (xpart z, xpart w), emin (ypart z, ypart w ) ) +enddef; +vardef pairmax (expr z, w) = + ( emax (xpart z, xpart w), emax (ypart z, ypart w ) ) +enddef; + +vardef minpair (suffix p) = setpair (_mp) p1; + for _idx = 2 upto p - 1: _mp := pairmin (_mp, p[_idx]); endfor + pairmin (_mp, p[p]) +enddef; +vardef maxpair (suffix p) = setpair (_mp) p1; + for _idx = 2 upto p - 1: _mp := pairmax (_mp, p[_idx]); endfor + pairmax (_mp, p[p]) +enddef; + +primarydef Z xprod W = (xpart Z * ypart W - xpart W * ypart Z) enddef; + +def force_initial (expr p) (suffix f) = + hide( setnumeric (_n) length f; + f := p + if _n = 0: + {0,0} + else: + ..controls post0 (f) and pre 1 (f).. subpath (1,_n) of f + fi;) +enddef; + +def force_terminal (expr p) (suffix f) = + hide(setpath (_f) reverse f; + force_initial (p) (_f); + f := reverse _f;) +enddef; + +def force_equal_ends (suffix f, g) = + hide(save _p; pair _p; + _p := .5[pnt[length f] (f), pnt0(g)]; + force_terminal (_p) (f); force_initial (_p) (g);) +enddef; + +def replace_ends_of_cycle (expr p) (suffix f) = +hide( +if cycle f: + save _n; _n := length f; + f := p + if _n = 0: &cycle + else: .. controls post0 (f) and pre 1 (f) .. + if _n = 1: cycle + else: subpath (1, _n - 1) of f .. + controls post[_n - 1](f) and pre[_n](f) .. cycle + fi + fi; +fi) +enddef; + +pair thetimes; +numeric _Xtime, _Ytime; +tertiarydef a intersects b = + begingroup + thetimes := a intersectiontimes b; + _Xtime := xpart thetimes; + _Ytime := ypart thetimes; + (_Xtime > -1) + endgroup +enddef; + +tertiarydef a misses b = ((a intersectiontimes b) < origin) enddef; + +vardef makepicture (expr s) = + if picture s: s + elseif path s: picpath (s) + else: nullpicture + fi +enddef; + +vardef onepointpath (expr cyclic, q) = + q if cyclic: &cycle else: {0,0} fi +enddef; + +vardef fallbackpath (expr cyclic, p) (text t) = + onepointpath (cyclic, p) +enddef; + +def even = not odd enddef; + +primarydef a divides b = + ((b mod a) = 0) +enddef; + +vardef image (text t) = + newpicture (currentpicture); + t; + currentpicture +enddef; + +def beginimage = + begingroup + newpicture (currentpicture); +enddef; +def endimage = + ; currentpicture + endgroup +enddef; + +def makeimage (suffix name) (expr refpt) = + setpair (_image_reference_point) zconv(refpt); + setpicture (name) beginimage +enddef; +def concludeimage = + endimage shifted + -goodpair (_image_reference_point) +enddef; + +def setvariable (text kind) (suffix name) = + save name; kind name; name := +enddef; +def gsetvariable (text kind) (suffix name) = kind name; name := +enddef; + +def setnumeric (suffix name) = save name; name := enddef; +def setboolean = setvariable (boolean) enddef; +def setpair = setvariable (pair) enddef; +def setpath = setvariable (path) enddef; +def setcolor = setvariable (color) enddef; +def setpicture = setvariable (picture) enddef; +def settension (suffix tn) expr tens = + setnumeric (tn) if tens > 0: tens else: default_tension fi; +enddef; +def fixtension (suffix tn) = if tn < .75: tn := .75; fi enddef; + +def newpicture (suffix pic) = setpicture (pic) nullpicture; enddef; +def convertpath (suffix g) expr f = setpath (g) zconv (f); enddef; + +def setarray (text kind) (suffix name) = + save name; kind name[]; list (name) +enddef; +def setpairs = setarray (pair) enddef; +def gsetarray (text kind) (suffix name) = + numeric name; kind name[]; list (name) +enddef; + + +def setbbox (suffix ll, ur) = + save ll, ur; pair ll, ur; getbbox (ll, ur) +enddef; + +def setsplit (suffix s) expr ss = + setnumeric (s) emax (1, ceiling ss); +enddef; + +transform ztr, vtr; +def setztr = + if debug: + GBdebug; + >> "charwd = " & decimal charwd & "pt#"; + >> "charht = " & decimal charht & "pt#"; + >> "w_ = " & decimal w_ & " pixels"; + >> "h_ = " & decimal h_ & " pixels"; + >> "unitlen = " & decimal unitlen & "pt#"; + >> "hppp = " & decimal hppp; + >> "xneg = " & decimal xneg; + >> "xpos = " & decimal xpos; + >> "yneg = " & decimal yneg; + >> "ypos = " & decimal ypos; + >> "xscale = " & decimal xscale; + >> "yscale = " & decimal yscale; + GBenddebug; + fi + save ztr, vtr; + transform ztr, vtr; + vtr := identity xscaled xscale yscaled yscale scaled (unitlen*hppp); + ztr := identity shifted (-xneg, -yneg) transformed vtr; + if debug: + GBdebug; + >> "ztr is"; + show ztr; + >> "vtr is"; + show vtr; + GBenddebug; + fi +enddef; + +vardef zconv (expr a) = a transformed ztr enddef; +vardef invzconv (expr a) = a transformed (inverse ztr) enddef; +vardef vconv (expr v) = v transformed vtr enddef; +vardef invvconv (expr v) = v transformed (inverse vtr) enddef; + +def active_plane = currentpicture enddef; + +def initpic = + setztr; + resizedrawpen (penwd); + if ClipOn: ClipPath := 1; + ClipPath1 := rect (origin, (w_, h_)); + fi + if debug: + GBdebug; + >> "Drawing nominal bounding box around picture"; + GBenddebug; + noclip ( safedraw rect (origin, (w_, h_)) ); + fi +enddef; + +def mfpicenv = enddef; +def endmfpicenv = enddef; +def bounds (expr a, b, c, d) = + xneg := a; xpos := b; + yneg := c; ypos := d; +enddef; + +string extra_beginmfpic; extra_beginmfpic := ""; +string extra_endmfpic; extra_endmfpic := ""; + +def beginmfpic (expr ch) = + begingroup + gcode := ch; + save w_, h_, d_; + charwd := (xpos-xneg)*xscale*unitlen; + charht := (ypos-yneg)*yscale*unitlen; + chardp := 0; + charcode := if known ch: byte ch else: 0 fi; + w_ := hround (charwd*hppp); + h_ := vround (charht*hppp); + d_ := vround (chardp*hppp); + charic := 0; clearxy; clearit; clearpen; + scantokens extra_beginchar; + initpic; + scantokens extra_beginmfpic; +enddef; + +def endmfpic = + scantokens extra_endmfpic; + if debug: + GBdebug; + >> "TFM charwd = " & decimal charwd & "pt#"; + >> "TFM charht = " & decimal charht & "pt#"; + GBenddebug; + fi + DoClip (active_plane); + if clipall: clipto (active_plane) rect (origin, (w_, h_)); fi + if showbbox: noclip ( safedraw rect (origin, (w_, h_)) ); fi + scantokens extra_endchar; + if proofing > 0: makebox (proofrule); fi + chardx := w_; % desired width of character in pixels + shipit; + if displaying > 0: makebox (screenrule); showit; fi + endgroup +enddef; + +pair label_adjust; +label_adjust := origin; +numeric label_sep, labelpath_sep ; +label_sep := 0; labelpath_sep := 0; +def verbatimtex text t = enddef; + + +vardef newgblabel (expr hf, vf, BL, r) (text s) (text pts) = +enddef; + +vardef gblabel (expr a, b, c, d, r) (text s) (text t) = + newgblabel (b, d, (c = 0) and (d = 0), r) (s) (t); +enddef; + +vardef ref_shift (expr hf, vf, BL, ll, ur) = + - ( (hf)[xpart ll, xpart ur], + (vf)[if BL: 0 else: (ypart ll) fi, ypart ur] ) +enddef; + +vardef thegblabel (expr z, r, p) = + ((p shifted z) rotated r) shifted label_adjust +enddef; + +vardef textrect (expr lbl, rad, loc) = + textrectx (.5, .5, false, 0) (origin, lbl, rad, loc) +enddef; +vardef textoval (expr lbl, mult, loc) = + xellipse (true, .5, .5, false, 0) (origin, lbl, mult, loc) +enddef; +vardef textellipse (expr lbl, rat, loc) = + xellipse (false, .5, .5, false, 0) (origin, lbl, rat, loc) +enddef; + +boolean roundends; roundends := true; +vardef textrectx (expr a, b, c, rot, xy, lbl, rad, loc) = + save ll, ur, _r, f, zz; + pair ll, ur, zz; path f; + pathdims (xy, lbl) (ll, ur); + readjustdims (ll, ur) (labelpath_sep) + _r := if numeric rad: rad + elseif not boolean rad: 0 + elseif rad: emin (xpart(ur-ll), ypart (ur-ll))/sqrt(2) + else: 0 + fi; + if _r = 0: + f := rect (ll, ur); + else: + save p, q; + pair p[]; path q; + p1 := ur - _r*dir(45); + p3 := ll + _r*dir(45); + p2 := (xpart p3, ypart p1); + p4 := (xpart p1, ypart p3); + q := if _r < 0: reverse fi quartercircle scaled 2_r; + f := + (q shifted p1)--(q rotated 90 shifted p2) + --(q rotated 180 shifted p3) + --(q rotated -90 shifted p4)--cycle; + + fi + readjustdims (ll, ur) (label_sep - labelpath_sep); + invvconv (thegblabel (ref_shift(a, b, c, ll, ur), rot, f)) shifted loc +enddef; + +def textovalx = xellipse (true) enddef; +def textellipsex = xellipse (false) enddef; + +vardef xellipse (expr aspect, a, b, c, r, xy, lbl, mult, loc) = + if mult = 0: + textrectx (a, b, c, r) (xy, lbl, 0, loc) + else: + save ll, ur, cc, ww, hh, f; + pair ll, ur, cc; path f; + pathdims (xy, lbl) (ll, ur); + readjustdims (ll, ur) (labelpath_sep) + cc := .5[ll, ur]; + (ww, hh) = ur - cc; + if (ww = 0) or (hh = 0): + f = (ll--ur); + else: + save aa, bb; + aa := ww ++ if aspect: ww else: hh fi *mult; + bb := hh ++ if aspect: hh else: ww fi /mult; + f := ellipse (cc, aa, bb, 0); + fi + readjustdims (ll, ur) (label_sep - labelpath_sep); + invvconv (thegblabel (ref_shift(a, b, c, ll, ur), r, f)) shifted loc + fi +enddef; + +def pathdims (expr xy, lbl) (suffix ll, ur) = + if pair lbl: + ll := xy; ur := lbl; + else: + ll := ur := origin; + fi +enddef; + +def readjustdims (suffix ll, ur) (expr s) = + ll := ll - s*(1,1); + ur := ur + s*(1,1); +enddef; + +newinternal reallysmall; reallysmall := 3epsilon; +newinternal nottoosmall; nottoosmall := eps/2 + 2epsilon; +def signof (expr X) = if X < 0: - fi enddef; +def TruncateWarn expr s = + GBwarn s & " is too large or undefined, so it will be truncated."; +enddef; + +vardef secd primary X = + setnumeric (temp) cosd(X); + if abs(temp) < reallysmall: + TruncateWarn "Secant or Tangent"; + temp := signof (temp) reallysmall; + fi + 1/temp +enddef; +vardef tand primary X = sind(X)*secd(X) enddef; + +vardef cscd primary X = + setnumeric (temp) sind(X); + if abs(temp) < reallysmall: + TruncateWarn "Cosecant or Cotangent"; + temp := signof(temp) reallysmall; + fi + 1/temp +enddef; +vardef cotd primary X = cosd(X)*cscd(X) enddef; + +vardef acos primary X = + if abs X > 1: + TruncateWarn "Argument of arccosine"; + angle (signof(X) 1, 0) + else: + angle (X, 1 +-+ X) + fi +enddef; +vardef asin primary X = + if abs X > 1: + TruncateWarn "Argument of arcsine"; + angle (0, signof(X) 1) + else: + angle (1 +-+ X, X) + fi +enddef; +vardef atan primary X = angle (1, X) enddef; + +vardef sin primary X = sind (X*radian) enddef; +vardef cos primary X = cosd (X*radian) enddef; +vardef tan primary X = tand (X*radian) enddef; +vardef cot primary X = cotd (X*radian) enddef; +vardef sec primary X = secd (X*radian) enddef; +vardef csc primary X = cscd (X*radian) enddef; + +vardef degrees (expr t) = t*radian enddef; +vardef radians (expr t) = t/radian enddef; +vardef invcos primary X = (acos X)/radian enddef; +vardef invsin primary X = (asin X)/radian enddef; +vardef invtan primary X = (atan X)/radian enddef; + +vardef exp primary X = mexp (256 * X) enddef; +vardef ln primary X = (mlog X) / 256 enddef; +def log = ln enddef; +vardef logbase (expr B) primary X = (mlog X)/(mlog B) enddef; +def logtwo = logbase( 2) enddef; +def logten = logbase(10) enddef; + +vardef Arg primary Z = (angle Z)/radian enddef; +vardef Log primary Z = (ln (abs Z), Arg Z) enddef; +vardef cis primary T = dir (T*radian) enddef; +vardef zexp primary Z = (exp (xpart Z)) * cis (ypart Z) enddef; +vardef sgn primary Z = if not (Z = origin): unitvector fi Z enddef; + +vardef cosh primary X = + setnumeric (temp) 2 exp (-abs(X)); + if temp < reallysmall: + TruncateWarn "Cosh"; + temp := reallysmall; + fi + 1/temp + temp/4 +enddef; + +vardef sinh primary X = + setnumeric (temp) 2 exp (-abs(X)); + if temp < reallysmall: + TruncateWarn "Sinh"; + temp := reallysmall; + fi + signof (X) (1/temp - temp/4) +enddef; + +vardef sech primary X = + setnumeric (temp) exp(-(abs (X))); + 2temp/(1 + temp*temp) +enddef; + +vardef tanh primary X = + setnumeric (temp) exp(-2(abs (X))); + signof (X) (1 - temp)/(1 + temp) +enddef; + +vardef csch primary X = + save temp, tempa; temp := exp(-(abs (X))); + tempa := (1 - temp*temp)/2; + if tempa < reallysmall: + TruncateWarn "Csch"; + tempa := reallysmall; + fi + signof (X) temp / tempa +enddef; + +vardef coth primary X = + setnumeric (temp) tanh(X); + if abs(temp) < reallysmall: + TruncateWarn "Coth"; + temp := signof (X) reallysmall; + fi + 1/temp +enddef; + +vardef acosh primary y = + if y < 1: + TruncateWarn "acosh"; + 0 + else: + ln (y + (y +-+ 1)) + fi +enddef; + +vardef asinh primary y = ln (y + (y ++ 1)) enddef; + +vardef atanh primary y = + if abs (y) < 1: + (ln (1 + y) - ln (1 - y))/2 + else: + TruncateWarn "atanh"; + signof (y) infinity + fi +enddef; + +vardef polar primary p = (xpart p) * dir (ypart p) enddef; +def id (expr x) = x enddef; + +primarydef x**y = + if y=2: x*x + elseif (x = floor x) and (abs y = floor y): + 1 for n=1 upto y: *x endfor + else: takepower y of x + fi +enddef; +let ^ = **; +transform T_stack[]; +numeric T_stack; T_stack := 0; +def T_push (expr T) = T_stack[incr T_stack] := T; enddef; +def T_pop (suffix $) = + if T_stack > 0: + $ := T_stack[T_stack]; + T_stack := T_stack - 1; + fi +enddef; + +def bcoords = hide ( T_push (ztr) ) enddef; +def ecoords = hide ( T_pop (ztr); vtr := vectorpart ztr ) enddef; + +vardef vectorpart primary T = T shifted -(origin transformed T) enddef; + +def apply_t (text Transformer) = + ztr := identity Transformer transformed ztr; + vtr := vectorpart ztr; +enddef; + +def xslant = slanted enddef; % (x+sy, y). +def yslant primary s = % (x, y+sx). + transformed + begingroup + save T; transform T; + origin transformed T = origin; + (1, 0) transformed T = (1, s); + (0, 1) transformed T = (0, 1); + T + endgroup +enddef; + +def zslant primary p = % (xu+yv, xv+yu), where p = (u, v). + transformed + begingroup + save T; transform T; + xpart T = ypart T = 0; + xxpart T = yypart T = xpart p; + xypart T = yxpart T = ypart p; + T + endgroup +enddef; + +def xyswap = zslant (0, 1) enddef; +def boost primary X = zslant (cosh X, sinh X) enddef; + +vardef transformedpath (text Transformer) expr f = f Transformer +enddef; + +def rotatedpath (expr p, th) = + transformedpath ( + transformed vtr + rotatedaround (p transformed vtr, th) + transformed (inverse vtr) + ) +enddef; +def reflectedpath (expr p, q) = + transformedpath ( + transformed vtr + reflectedabout (p transformed vtr, q transformed vtr) + transformed (inverse vtr) + ) +enddef; + +def scaledpath (expr p, s) = + transformedpath (shifted -p scaled s shifted p) +enddef; +def xscaledpath (expr a, s) = + transformedpath (shifted (-a, 0) xscaled s shifted (a, 0)) +enddef; +def yscaledpath (expr b, s) = + transformedpath (shifted (0, -b) yscaled s shifted (0, b)) +enddef; + +def slantedpath = xslantedpath enddef; +def xslantedpath (expr b, s) = + transformedpath (shifted (0, -b) slanted s shifted (0, b)) +enddef; +def yslantedpath (expr a, s) = + transformedpath (shifted (-a, 0) yslant s shifted (0, a)) +enddef; + +def shiftedpath (expr v) = transformedpath (shifted v) enddef; + +def xyswappedpath = transformedpath (xyswap) enddef; + +vardef partialpath (expr a, b) expr f = + save flag, flo, fhi, lo, hi, n; + boolean flag; flag = true; + convertpath (g) f; + n := length f; + + flo := snapto emin(a,b); + if flo = 0: + lo := 0; + elseif flo < 1: + setuplengtharray (cum, tot, idx) g; + flag := false; + lo := gettime (cum, idx) (flo*tot); + else: + lo := n; + fi + + fhi := snapto emax (a,b); + if flo = fhi: + hi := lo; + elseif fhi < 1: + if flag: setuplengtharray (cum, tot, idx) g; fi + hi := gettime (cum, idx) (fhi*tot); + else: + hi := n; + fi + + if a > b: reverse fi subpath (lo, hi) of f +enddef; + +vardef gsubpath (expr a, b) expr f = subpath (a, b) of f enddef; + +def setuplengtharray (suffix cum, tot, idx) = + save cum, tot, idx; idx := 0; tot := makelengtharray (cum) +enddef; + +vardef pathtime@# (suffix p) = + if @# <= 0: 0 + elseif @# >= 1: length p + else: + setuplengtharray (cum, tot, idx) p; + gettime (cum, idx) (@#*tot) + fi +enddef; + +vardef pathpoint (expr frac) (suffix p) = + convertpath (_pp) p; pnt[pathtime[frac] (_pp)] (p) +enddef; + +def mono (suffix u) = cull u keeping (1, infinity); enddef; + +def andto (suffix u) (expr v) = + mono (u); addto u also v; cull u keeping (2, 2); +enddef; +primarydef u picand v = + begingroup setpicture (t) u; andto (t, v); t endgroup +enddef; + +def orto (suffix u) (expr v) = + mono (u); addto u also v; cull u keeping (1, infinity); +enddef; +primarydef u picor v = + begingroup setpicture (t) u; orto (t, v); t endgroup +enddef; + +def xorto (suffix u) (expr v) = + mono (u); addto u also v; cull u keeping (1, 1); +enddef; +primarydef u picxor v = + begingroup setpicture (t) u; xorto (t, v); t endgroup +enddef; + +def subto (suffix u) (expr v) = + mono (u); addto u also -v; cull u keeping (1, infinity); +enddef; +primarydef u picsub v = + begingroup setpicture (t) u; mono (t); subto (t, v); t endgroup +enddef; + +def coloraddto (expr clr) (suffix u) (expr v) = + if clr < white: + orto (u, v); + else: + subto (u, v); + fi; +enddef; + +def coloraddon (expr clr) (suffix v) = + if clr < white: + _orto (active_plane, v); + else: + _subto (active_plane, v); + fi; +enddef; + +def _orto (suffix u, v) = + mono (u); mono (v); + addto u also v; +cull u keeping (1, 2); +enddef; + +def _subto (suffix u, v) = + mono (u); mono (v); addto u also -v; cull u keeping (1, 1); +enddef; + +vardef interior expr c = + newpicture (v); + addto v contour (c.t_); + cull v dropping (0,0); + v +enddef; + +vardef interiors suffix cc = + newpicture (_ints); + for _idx = 1 upto cc: + addto _ints also interior cc[_idx]); + endfor + mono (_ints); + _ints +enddef; + +def clipto (suffix vt) expr c = + if path c: + andto (vt, interior c); + fi +enddef; +def clipsto (suffix vt, cc) = + andto (vt, interiors cc); +enddef; + +vardef Clipped (suffix vt) expr c = + setpicture (_Cl) vt; clipto (_Cl) c; _Cl +enddef; +def clip = Clipped enddef; + +vardef picneg (suffix vt) expr c = + setpicture (_pn) interior c; + _subto (_pn, vt); + _pn +enddef; + +def shpath (suffix v) (expr q, f) = + addto v doublepath (f.t_) withpen (q.t_); +enddef; + +numeric minpenwd; +minpenwd := 1; % 1 pixel +vardef picpath expr d = + newpicture (v); + if penwd >= minpenwd: + shpath (v, drawpen) (d); + mono (v); + fi + v +enddef; + +def picdot (suffix v) (expr w, p) = + addto v also + (w shifted goodpair (p)); +enddef; + +vardef setdot (expr apath, sc) = + if cycle apath: interior + else: picpath + fi + (apath scaled emax (ceiling (sc), minpenwd)) +enddef; + +numeric shadepicsize; shadepicsize := 0.8bp; +vardef shadepic (suffix dims) (expr grparam) = + pair dims; + setnumeric (_frac) 2*emin (grparam, 1 - grparam); + save _hp, _vp, _dotwd, _dotht; + if aspect_ratio < 1: + _vp := emax (2, hround (shadepicsize.o_)); + _hp := hround (_vp._o_); + _dotwd := hround (_hp*sqrt _frac); + _dotht := if _dotwd = 0: 0 + else: hround (_hp*_vp*_frac/_dotwd) + fi; + else: + _hp := emax (2, hround (shadepicsize)); + _vp := hround (_hp.o_); + _dotht := hround (_vp*sqrt _frac); + _dotwd := if _dotht = 0: 0 + else: hround (_hp*_vp*_frac/_dotht) + fi; + fi + dims := ( _hp, _vp._o_ ); + newpicture (_shp); + addto _shp contour rect (origin, (_dotwd, _dotht)); + picdot (_shp, _shp, dims); + dims := 2dims; mono (_shp); + if grparam >= .5: _shp + else: (interior (rect (origin, dims))) picsub _shp + fi +enddef; + +vardef shaded (expr clr) expr c = + if cycle c: + if (clr <= black) or (clr >= white): + interior c + else: + save shdims, shpic; + picture shpic; pair shdims; + shpic := shadepic (shdims) (clr); + setbbox (ll, ur) c; + newpicture (vsh); + fillwith (vsh) (shpic, shdims, ll, ur); + clipto (vsh) c; vsh + fi + else: picpath c % should we? or just make it null? + fi +enddef; + +vardef fillwith (suffix v) (expr pic, dims, ll, ur) = + newpicture (b); + save fwdims, _ll, _ur; pair fwdims, _ll, _ur; + fwdims := goodpair (dims); + _ll := floorpair (ll.t_); + _ur := ur.t_; + for s = xpart _ll step xpart fwdims until xpart _ur: + addto b also pic shifted (s, 0); + endfor + for s = ypart _ll step ypart fwdims until ypart _ur: + addto v also b shifted (0, s); + endfor + mono (v); +enddef; + +def thatchf (suffix v) (expr CT, sp, a, b) = + begingroup + setnumeric (_sp) signof (ypart b - ypart a) abs(sp); + for _y = _sp*( ceiling ((ypart a)/_sp) ) step _sp until ypart b: + shpath (v, hatchpen) + ( ( (xpart a, _y)--(xpart b, _y) ) transformed CT ); + endfor + mono (v); + endgroup +enddef; + +def tile (suffix atile) (expr unit, width, height, clipit) = + picture atile.pic; atile.pic := nullpicture; + pair atile.dims; + atile.dims := round ((width, height)*unit); + begingroup + save active_plane; + def active_plane = atile.pic enddef; + save ztr, vtr; transform ztr, vtr; + ztr := identity scaled unit; vtr := ztr; + save xneg, xpos, yneg, ypos; + xneg := 0; xpos := width; yneg := 0; ypos := height; + save ClipOn; boolean ClipOn; + if clipit: + ClipOn := true; + setarray (path) (ClipPath) (rect(origin, atile.dims)); + else: + ClipOn := false; + fi +enddef; +def endtile = + DoClip (active_plane); + endgroup +enddef; + +vardef is_tile (suffix atile) = + (known atile.pic ) and (picture atile.pic) and + (known atile.dims) and (pair atile.dims ) +enddef; + +vardef pnt@# (expr p) = point @# of p enddef; +vardef pre@# (expr p) = precontrol @# of p enddef; +vardef post@# (expr p) = postcontrol @# of p enddef; + +def getbbox (suffix ll, ur) expr g = + setsplit (_s) bbox_split; + ur := ll := pnt 0 (g); + for _j = 1 upto length g: + ll := pairmin (ll, pnt[_j] (g)); ur := pairmax (ur, pnt[_j] (g)); + endfor + for _j = 1 upto _s*(length g): + ctrlsbbox (subpath ((_j-1)/_s, _j/_s) of g) (ll, ur); + endfor + if showbbox: noclip ( safedraw rect (ll, ur) ); fi +enddef; + +numeric bbox_split; bbox_split := 2; +def ctrlsbbox (expr p) (suffix ll, ur) = + ll := pairmin ( pairmin (ll, post0 (p)), pre 1 (p) ); + ur := pairmax ( pairmax (ur, post0 (p)), pre 1 (p) ); +enddef; + +def safedraw = colorsafedraw (drawcolor) enddef; +def colorsafedraw (expr clr) expr d = + begingroup + setpicture (v) picpath d; + DoClip (v); coloraddon (clr, v); + endgroup +enddef; + +def NoCycle (expr s) expr p = + GBwarn s & " cannot be applied to an open path." + & " The path will be drawn instead."; + safedraw p; +enddef; + +vardef isgray (expr X) = (X > black) and (X < white) enddef; + +def safefill = colorsafefill (fillcolor) enddef; +vardef colorsafefill (expr clr) expr c = + if cycle c: + setpicture (v) interior c; + DoClip (v); + if isgray (clr): + _subto (active_plane) (v); + v := nullpicture; + v := shaded (clr) c; + fi + coloraddon (clr, v); + else: NoCycle("fill") c; + fi +enddef; +def safeunfill expr c = + if cycle c: noclip (colorsafefill (background) c); + else: NoCycle("unfill") c; + fi +enddef; + +def safeclip expr c = + if cycle c: clipto (active_plane) c; + else: NoCycle("clip") c; + fi +enddef; + +def store (suffix fs) expr f = +hide ( + if (not path f) and (not pair f): + GBerrmsg ("improper expression type.") + "The second argument to `store' must be a path or pair."; + fi + if not path fs: path fs; fi + fs := f +) +enddef; +vardef stored (suffix fs) expr f = store (fs) f; f enddef; + +def drawn = colordrawn (drawcolor) enddef; +vardef colordrawn (expr clr) expr f = + colorsafedraw (clr) (zconv (f)); f +enddef; + +def zigzag = colorzigzag (drawcolor) enddef; +def colorzigzag (expr clr) = colorwiggle (false, clr, 0) enddef; +def sinewave = colorsinewave (drawcolor) enddef; +def colorsinewave = colorwiggle (true) enddef; + +vardef colorwiggle (expr smth, clr, tens, blen, elen, len, wid) expr f = + convertpath (g) f; + setuplengtharray (cumlen, totlen, ct) g; + save B; + if cycle f: + B := 0; + else: + B := abs(blen)/_rescale_factor; + totlen := totlen - B - abs(elen)/_rescale_factor; + fi + setnumeric (n) 2*round (totlen/len*_rescale_factor); + if n < 2: + colorsafedraw (clr) g; + else: + save T, U, X, Y, Z, p; + pair U, X, Y, Z; path p; + T := if cycle f: 0 else: gettime (cumlen, ct) (B) fi; + Z := pnt[T] (g); + p :=if not cycle f: (subpath (0,T) of g) + if smth: {curl 0} ..tension tens.. else: -- fi + fi + for i = 1 upto n: + hide( + T := gettime (cumlen, ct) (B+(i/n)*totlen); + X := Z; Z := pnt[T] (g); + Y := .5[X,Z]; U := sgn (Z-X); + ) + (Y + (U zscaled (0, if even i: - fi wid))) + if smth: {U}..tension tens.. else: -- fi + endfor + if cycle f: cycle + else: if smth: {curl 0} fi (subpath (T, length g) of g) + fi; + newpicture (v); + if smth: + save n, k; + n := length p; k = n div 50; + for i = 0 step 50 until 50*(k-1): + shpath (v, drawpen) (subpath (i,i+50) of p); + endfor + shpath (v, drawpen) (subpath (50k,n) of p); + else: shpath (v, drawpen) (p); + fi + DoClip(v); coloraddon (clr, v); + fi + f +enddef; + +def corkscrew = colorcorkscrew (drawcolor) enddef; +vardef colorcorkscrew (expr clr, tens, blen, elen, len, wid) expr f = + convertpath (g) f; + setuplengtharray (cumlen, totlen, ct) g; + save B; + if cycle f: + B := 0; + else: + B := abs(blen)/_rescale_factor; + totlen := totlen - B - abs(elen)/_rescale_factor; + fi + setnumeric (n) round (totlen/len*_rescale_factor); + if n < 2: + colorsafedraw (clr) g; + else: + save T, U, X, Y, Z, p; + pair U, X, Y, Z; path p; + T := if cycle f: 0 else: gettime (cumlen, ct) (B) fi; + Z := pnt[T] (g); + p :=if (not cycle f) and (B > 0): (subpath (0,T) of g)-- fi + for i = 1 upto n: + hide( + T := gettime (cumlen, ct) (B+(i/n)*totlen); + X := Z; Z := pnt[T] (g); + Y := .5[X,Z]; U := sgn (Z-X); + ) + (X + (U zscaled (0,-wid))){ U}..tension tens.. + (Y + (U zscaled (0, wid))){-U}..tension tens.. + endfor + if cycle f: cycle + else: + {U}(Z + (U zscaled (0,-wid))) + if elen <> 0: --(subpath(T, length g) of g) fi + fi; + newpicture (v); + save n, k; + n := length p; k = n div 50; + for i = 0 step 50 until 50*(k-1): + shpath (v, drawpen) (subpath (i,i+50) of p); + endfor + shpath (v, drawpen) (subpath (50k,n) of p); + DoClip(v); coloraddon (clr, v); + fi + f +enddef; + +def filled = colorfilled (fillcolor) enddef; +vardef colorfilled (expr clr) expr c = + colorsafefill (clr) zconv (c); c +enddef; +vardef unfilled expr c = safeunfill zconv (c); c enddef; +vardef Clip expr c = safeclip zconv (c); c enddef; + +numeric shadewd; shadewd := 0.5bp; +path shadedotpath; +shadedotpath := fullcircle; + +vardef shade (expr sp) expr f = + convertpath (g) f; + setnumeric (gr) 1 - (.88*abs(shadewd)/sp)**2; + if not cycle g: NoCycle("shade") g; + elseif gr <= 0: safefill g; + else: + setbbox (ll, ur) g; + ll := floorpair (ll); + % setpair (dv) ceiling (sp/(sqrt 2))*(1,1); + % test hex spacing: + setpair (dv) ( ceiling(.5sp), ceiling(.5sp*sqrt 3) ); + setpicture (sh) setdot (shadedotpath, abs(shadewd)); + newpicture (v); + fillwith (v) (sh, 2dv, ll, ur); + newpicture (w); + addto w also v shifted goodpair (dv); + DoClip (v); DoClip (w); + clipto (v) (g); clipto (w) (g); + _orto (active_plane, v); + v := nullpicture; + _orto (active_plane, w); + fi + f +enddef; + +polkadotwd := 5bp; +mindotspace := 1bp; +path polkadotpath; polkadotpath := fullcircle; + +vardef polkadot (expr sp) expr f = + convertpath (g) f; + if not cycle g: NoCycle("polkadot") g; + elseif sp <= emax (2*polkadotwd/3, mindotspace): + safefill g; + else: + setbbox (ll, ur) g; + save dx, dy, dshift; pair dshift; + dx := sp/2; dy := dx*sqrt 3; + dshift := (xpart(ur - ll) mod dx, ypart (ur - ll) mod dy)/2; + save p, dims; pair p, dims; + p := ll + dshift; + dims := 2(dx, dy); + setpicture (thepolkadot) setdot (polkadotpath, polkadotwd); + newpicture (v); + fillwith (v) (thepolkadot, dims, p, ur); + fillwith (v) (thepolkadot, dims, p + (dx, dy), ur); + DoClip (v); clipto (v) g; + if isgray (fillcolor): + _subto (active_plane) (v); + v := nullpicture; + thepolkadot := + shaded (fillcolor) polkadotpath scaled ceiling (polkadotwd); + fillwith (v) (thepolkadot, dims, p, ur); + fillwith (v) (thepolkadot, dims, p + (dx, dy), ur); + DoClip (v); clipto (v) g; + fi + coloraddon (fillcolor, v); + fi + f +enddef; + +def thatch = colorthatch (hatchcolor) enddef; +vardef colorthatch (expr clr) (expr sp, theta) expr f = + convertpath (g) f; + if not cycle g: NoCycle("hatch") g; + elseif sp <= abs(hatchwd): colorsafefill (clr) g; + else: + newpicture (v); + setbbox (ll, ur) g rotated -theta; + thatchf (v, identity rotated theta, sp, ll, ur); + DoClip (v); clipto (v) (g); + coloraddon (clr, v); + fi + f +enddef; + +def hhatch (expr sp) = thatch (sp, 0) enddef; +def vhatch (expr sp) = thatch (sp, 90) enddef; +def lhatch (expr sp) = thatch (sp, -45) enddef; +def rhatch (expr sp) = thatch (sp, 45) enddef; + +def xhatch = colorxhatch (hatchcolor) enddef; +def colorxhatch (expr clr, sp) = + colorthatch (clr) (sp, 45) colorthatch (clr) (sp, -45) +enddef; + +vardef NoTile (suffix atile) expr g = + GBwarn str atile & " is not a valid tile for tess()." + & " The path will be drawn instead."; + safedraw g; +enddef; +vardef tess (suffix atile) expr c = + convertpath (_g) c; + if not cycle _g: NoCycle("tess") _g; + elseif not is_tile (atile): NoTile (atile) _g; + else: + setbbox (_ll, _ur) _g; + newpicture (_ts); + fillwith (_ts) (atile.pic, atile.dims, _ll, _ur); + DoClip (_ts); clipto (_ts) _g; + _orto (active_plane, _ts); + fi + c +enddef; + +if unknown segment_split: segment_split := 8; fi +if unknown dashsize: dashsize := 3bp; fi +if unknown dashgap: dashgap := dashsize + 2penwd; fi +if unknown dash_finish: dash_finish := .5; fi +if unknown dash_start: dash_start := .5; fi +if unknown _rescale_factor: _rescale_factor := 0.1in; fi + +numeric last_dot_size; last_dot_size := 0; +vardef gendashed (suffix pat) expr f = + convertpath (_g) f; + save _dpat; + if not mkdasharrays (pat) (_dpat): + GBwarn "Dash pattern " & str pat + & " undefined. Path will be drawn instead."; + safedraw _g; + elseif _dpat.rep < 2: + safedraw _g; + else: + save _dl; + forsuffixes _s = start, rep, finish: + _dl._s := 0; + for i = 1 upto _dpat._s: + _dpat._s[i] := _dpat._s[i]/_rescale_factor; + _dl._s := _dl._s + _dpat._s[i]; + endfor + endfor + + if _dl.rep = 0: + GBwarn "Dash pattern " & str pat & " has length 0. " + & "Path will be drawn instead."; + safedraw _g; + else: + setuplengtharray (_cumlen, _totlen, _ct) _g; + save _n, _sf, _no_dots; + boolean _no_dots; _no_dots := true; + _sf := scale_adjust (_n, _dl) (_totlen); + if _n < 0: safedraw _g; + else: + forsuffixes _s = start, rep, finish: + for _i = 1 upto _dpat._s: + if (_dpat._s[_i] = 0) and _no_dots: _no_dots := false; + else: _dpat._s[_i] := _dpat._s[_i]*_sf; + fi + endfor + _dl._s := _dl._s*_sf; + endfor + if _no_dots: + else: + if unknown plot_pic: + save plot_pic; path plot_pic; + plot_pic := dotpath; + fi; + last_dot_size := + if known plot_pic.size: plot_pic.size else: penwd fi; + setpicture (dashingdot) makesymbol (plot_pic, last_dot_size); + fi + save _t, _d, _v; + picture _v; _v := nullpicture; + _d0 := 0; _t0 := 0; + dashit (_dpat.start) (_v); + + if _n > 0: + save _m; _m := ceiling sqrt(_n); + for _j = 0 step _m until _n - 1: + for _i = 0 upto _m - 1: + exitif (_i + _j) > _n - 1; + _d0 := _dl.start + (_j + _i)*_dl.rep; + _t0 := gettime (_cumlen, _ct) (_d0); + dashit (_dpat.rep) (_v); + endfor + DoClip (_v); + coloraddon (drawcolor, _v); + _v := nullpicture; + endfor + fi + + _d0 := _totlen - _dl.finish; + _t0 := gettime (_cumlen, _ct) (_d0); + dashit (_dpat.finish) (_v); + DoClip (_v); + coloraddon (drawcolor, _v); + fi + fi + fi + f +enddef; + +vardef makelengtharray (suffix clen) suffix p = + setsplit (_s) segment_split; + numeric clen[]; + clen := _s * length p; clen0 := 0; + for _i = 1 upto clen: + clen[_i] := clen[_i-1] + abs (pnt[_i/_s] (p) - pnt[(_i-1)/_s] (p)) / + _rescale_factor; + endfor + clen[clen] +enddef; + +vardef scale_adjust (suffix n, pl) (expr lngth) = + n := (lngth - pl.start - pl.finish)/pl.rep; + n := if n < 0: -1 else: round(n) fi; + lngth/(pl.start + emax (n, 0)*pl.rep + pl.finish) +enddef; + +vardef gettime (suffix arr, ct) (expr lngth) = + setnumeric (_gtl) emax (arr[ct], emin (arr[arr], lngth)); + setsplit (_s) segment_split; + forever: exitif ( (arr[ct] <= _gtl) and (_gtl <= arr[ct+1]) ); + next ct; + endfor + if arr[ct] = arr[ct+1]: ct + else: ( ct + (_gtl - arr[ct]) / (arr[ct+1] - arr[ct]) ) + fi /_s +enddef; + +def next suffix X = X := X + 1; enddef; + +def dashit (suffix pos) (suffix pic) = + for _k = 1 upto pos: + if odd _k: + if pos[_k] = 0: + _d1 := _d0; _t1 := _t0; + picdot (pic, dashingdot, pnt [_t0] (_g)); + else: + _d1 := _d0 + pos[_k]; + _t1 := gettime (_cumlen, _ct) (_d1); + shpath (pic, drawpen) (subpath (_t0, _t1) of _g); + fi + else: + _d0 := _d1 + pos[_k]; + _t0 := gettime (_cumlen, _ct) (_d0); + fi + endfor +enddef; + +def dashpat (suffix pat) (text t) = + list (pat) (t); + if (pat = 0) or (odd (pat) and (pat > 1)): + pat[incr pat] := 0; + fi +enddef; + +vardef mkdasharrays (suffix src, dest) = + save _bad; boolean _bad; _bad := false; + forsuffixes _s = start, rep, finish: + numeric dest._s, dest._s[]; + boolean _bad._s; + if knownnumericarray src._s: + copyarray (src._s) (dest._s); + _bad._s := false; + else: + _bad := _bad._s := true; + fi + endfor + % _bad = one of the three arrays not copied. + if _bad: + if knownnumericarray src: _bad := false; + if _bad.rep: % make dest.rep = src + copyarray (src) (dest.rep); + fi + if _bad.start: % shrink first dash to get dest.start + copyarray (src) (dest.start); + dest.start1 := dash_start*src1; + fi + if _bad.finish: % use partial first dash for dest.finish + dest.finish := 1; + dest.finish1 := dash_finish*src1; + fi + fi + fi + not _bad +enddef; + +vardef Dashed (expr dlen, dgap) expr f = + save dashes; dashpat (dashes) (dlen, dgap); + gendashed (dashes) f +enddef; + +def DASHED = Dashed enddef; + def dashed = Dashed enddef; + +vardef doplot (expr spath, sc, dgap) expr f = + save dots; dashpat (dots) (0, dgap); + setpicture (plot_pic) makesymbol (spath, sc); + plot_pic.size := sc; + gendashed (dots) f +enddef; + +path dotpath; dotpath := fullcircle; +def dotted = doplot (dotpath) enddef; + +vardef plotnodes (expr symbol, size) expr f = + if size > 0: + save pln; pair pln[]; + pln := 0; + for _a = 0 upto (length f) if cycle f: - 1 fi: + pln[incr pln] := pnt[_a] (f); + endfor + dosymbols (drawcolor, symbol, size) (pln); + fi + f +enddef; + +def showcontrols = colorshowcontrols (pointcolor) enddef; +vardef colorshowcontrols (expr clr, syma, symb, size) expr f = + save shpre, shpost; + pair shpre[], shpost[]; + shpre := 0; shpost := 0; + for a = 0 upto (length f) if cycle f: - 1 fi: + shpre [incr shpre] := pre [a] (f); + shpost[incr shpost] := post[a] (f); + colorsafedraw (clr) + (zconv (shpre[shpre]--pnt[a](f)--shpost[shpost])); + endfor + if size > 0: + if not numeric syma: dosymbols (clr, syma, size) (shpre) ; fi + if not numeric symb: dosymbols (clr, symb, size) (shpost); fi + fi + f +enddef; + +def doubledraw = colordoubledraw (drawcolor) enddef; +vardef colordoubledraw (expr clr, sep) expr f = + convertpath (g) f; + colorsafedraw (clr) (parapath ( sep/2) g); + colorsafedraw (clr) (parapath (-sep/2) g); + f +enddef; + +vardef makesymbol (expr spath, sc) = + if picture spath : + setpicture (v) spath; mono (v); v + elseif path spath: setdot (spath, sc) + else: + GBwarn "Undefined symbol for plotting, " + & "dotpath will be used instead."; + setdot (dotpath, sc) + fi +enddef; + +vardef bpoint (expr ptwd, b) = + fullcircle scaled ptwd shifted b +enddef; + +def pointd (expr ptwd, filled) (text t) = + if filled: + plotsymbol (SolidCircle, ptwd) (t); + else: + begingroup; + setboolean (clearsymbols) true; + plotsymbol (Circle, ptwd) (t); + endgroup + fi +enddef; + +boolean clearsymbols; clearsymbols := false; +vardef clearable (expr pth) = + if path pth: + ( pnt0 (pth) = pnt[length pth] (pth) ) and (not cycle pth) + and (length pth > 0) + else: false + fi +enddef; + +def clearopenpath expr f = + if clearable (f): safeunfill f & cycle; fi +enddef; + +def plotsymbol = colorplotsymbol (pointcolor) enddef; +def colorplotsymbol (expr clr, spath, sc) (text t) = + if sc > 0: + begingroup + setpairs (_cpls) (t); + if _cpls > 0: dosymbols (clr, spath, sc) (_cpls); fi + endgroup + fi +enddef; + +def dosymbols (expr clr, spath, sc) (suffix arr) = + if clearsymbols and clearable (spath): + addsymbols (background, makesymbol (spath&cycle, sc)) (arr); + fi + addsymbols (clr, makesymbol (spath, sc)) (arr); +enddef; + +def addsymbols (expr clr, symb) (suffix arr) = + newpicture (_pls); + for _idx = 1 upto arr: + picdot (_pls, symb, zconv (arr[_idx])); + endfor + DoClip (_pls); coloraddon (clr, _pls); +enddef; + +def putimage (suffix pic) (text t) = + newpicture (_pti); + for _itm = t: + addto _pti also + (pic shifted goodpair (zconv (_itm))); + DoClip (_pti); addto active_plane also _pti; + _pti := nullpicture; + endfor + mono active_plane +enddef; + +def arrowdraw (expr hlen) (expr f) = + store (curpath) headpath (hlen, 0, 0) drawn f; +enddef; + +def xaxis (expr hlen) = arrowdraw (hlen) ((xneg, 0)--(xpos, 0)); +enddef; +def yaxis (expr hlen) = arrowdraw (hlen) ((0, yneg)--(0, ypos)); +enddef; +def axes (expr hlen) = xaxis (hlen); yaxis (hlen); enddef; + +laxis := baxis := raxis := taxis := 0; + +vardef axisline.x = (xneg + laxis, 0)--(xpos - raxis, 0) enddef; +vardef axisline.y = (0, yneg + baxis)--(0, ypos - taxis) enddef; +vardef axisline.l = axisline.y shifted (xneg + laxis, 0) enddef; +vardef axisline.b = axisline.x shifted (0, yneg + baxis) enddef; +vardef axisline.r = axisline.y shifted (xpos - raxis, 0) enddef; +vardef axisline.t = axisline.x shifted (0, ypos - taxis) enddef; + +vardef axis@# (expr len) = headpath (len, 0, 0) axisline@# enddef; + +vardef borderrect = + rect((xneg+laxis,yneg+baxis),(xpos-raxis,ypos-taxis)) +enddef; +numeric inside, outside, centered, onleft, onright, ontop, onbottom; +inside := -2; +outside := -1; +onright := 1; +onleft := 2; +centered := .5[onright, onleft]; +onbottom := onright; +ontop := onleft; +ltick := rtick := ttick := btick := inside; +xtick := ytick := centered; + +vardef axismarks (expr inang, tp, loc, pdir) (expr len) (text t) = + save _tp, _U, _P, _tic, _ticang; + pair _U, _P; path _tic; + _ticang := if tp < 0: inang else: 90 fi; + _tp := abs(tp) - 1; + _U := unitvector (vconv (pdir)) rotated _ticang; + _tic := (-_U--(0,0)) shifted (_tp*_U) scaled len; + for _a = t: + safedraw (_tic shifted zconv (loc + _a*pdir)); + endfor +enddef; + +def xmarks = axismarks ( 90, xtick, origin, right) enddef; +def ymarks = axismarks (-90, ytick, origin, up) enddef; +def lmarks = axismarks (-90, ltick, (xneg + laxis, 0), up) enddef; +def bmarks = axismarks ( 90, btick, (0, yneg + baxis), right) enddef; +def rmarks = axismarks ( 90, rtick, (xpos - raxis, 0), up) enddef; +def tmarks = axismarks (-90, ttick, (0, ypos - taxis), right) enddef; + +path griddotpath; griddotpath := fullcircle; +def grid = vargrid (0.5bp) enddef; +vardef vargrid (expr dsize, xsp, ysp) = + save gdot, gridpic; picture gdot, gridpic; + gdot := setdot (griddotpath, dsize); + gridpic := nullpicture; + for n = ceiling ((xneg + laxis)/xsp) upto floor ((xpos - raxis)/xsp): + for m = ceiling ((yneg + baxis)/ysp) upto floor ((ypos - taxis)/ysp): + picdot (gridpic, gdot, zconv ((n*xsp, m*ysp))); + endfor + endfor + coloraddon (pointcolor, gridpic); +enddef; +def vgrid = vargrid enddef; + +def hgridlines (expr ysp) = + for n = ceiling ((yneg + baxis)/ysp) upto floor ((ypos - taxis)/ysp): + safedraw zconv ((xneg + laxis, n*ysp)--(xpos - raxis, n*ysp)); + endfor +enddef; +def vgridlines (expr xsp) = + for n = ceiling ((xneg + laxis)/xsp) upto floor ((xpos - raxis)/xsp): + safedraw zconv ((n*xsp, yneg + baxis)--(n*xsp, ypos - taxis)); + endfor +enddef; +def gridlines (expr xsp, ysp) = + vgridlines (xsp); hgridlines (ysp); +enddef; + +def vectorfield (expr len, xsp, ysp) (text fcn) (text cond) = + save _vf, _is_OK; + vardef _vf (expr x,y) = ((0,0)--(fcn)) shifted (x,y) enddef; + vardef _is_OK (expr x,y) = cond enddef; + mkvectorfield (len, xsp, ysp) (_vf, _is_OK); +enddef; + +vardef mkvectorfield (expr len, xsp, ysp) (suffix vf, isOK) = + for n = ceiling ((xneg + laxis)/xsp) upto floor ((xpos - raxis)/xsp): + for m = ceiling ((yneg + baxis)/ysp) upto floor ((ypos - taxis)/ysp): + if isOK (n*xsp,m*ysp): arrowdraw (len) (vf(n*xsp,m*ysp)); fi + endfor + endfor +enddef; + +def plrvectorfield (expr len, rsp, tsp) (text fcn) (text cond) = + save _vf, _is_OK, _A, _B, _C, _D; + _A := xneg + laxis; _B := xpos + raxis; + _C := yneg + baxis; _D := ypos + taxis; + vardef _vf (expr r,t) = ((0,0)--(fcn)) shifted (r*dir t) enddef; + vardef _is_OK (expr r,t) = + save _X, _Y; _X := r*cosd t; _Y := r*sind t; + (cond) and (_A < _X) and (_X < _B) and (_C < _Y) and (_Y < _D) + enddef; + mkplrvectorfield (len, rsp, tsp) (_vf, _is_OK); +enddef; + +vardef mkplrvectorfield (expr len, rsp, tsp) (suffix vf, isOK) = + save rmin, rmax, tmin, tmax; + getpolarbounds; + if rmin = 0: + if isOK (0,tmin): arrowdraw (len) (vf (0,tmin)); fi + rmin := rsp; + fi + for n = ceiling (rmin/rsp) upto floor (rmax/rsp): + for m = ceiling (tmin/tsp) upto floor (tmax/tsp): + if isOK (n*rsp,m*tsp): arrowdraw (len) (vf (n*rsp,m*tsp)); fi + endfor + endfor +enddef; + +def patcharcs (suffix X) (expr rstart, rstop, rstep, tstart, tstop) = + for rad = (if rstart = 0: rstep else: rstart fi) + step rstep until rstop: + orto (X, picpath zconv (arcplr (origin, tstart, tstop, rad)) ); + endfor +enddef; +def patchrays (suffix X) (expr tstart, tstop, tstep, rstart, rstop) = + for _ang = tstart step tstep until tstop: + orto (X) (picpath zconv ((rstart*dir _ang)--(rstop*dir _ang))); + endfor +enddef; + +def plrpatch (expr rstart, rstop, rstep, tstart, tstop, tstep) = +begingroup + newpicture (v); + patcharcs (v) (rstart, rstop, rstep, tstart, tstop); + coloraddon (drawcolor, v); + v := nullpicture; + patchrays (v) (tstart, tstop, tstep, rstart, rstop); + coloraddon (drawcolor, v); +endgroup +enddef; + +def gridarcs (expr rstep) = + beginpolargrid; + if rmin = 0: + picdot (gridpic, setdot (griddotpath, penwd), zconv (origin)); + fi + rmin := rstep * floor (rmin/rstep + 1); + rmax := rstep * ceiling (rmax/rstep - 1); + patcharcs (gridpic) (rmin, rmax, rstep, tmin, tmax); + endpolargrid (drawcolor, .5penwd); +enddef; + +def gridrays (expr tstep) = + beginpolargrid; + tmin := tstep * ceiling (tmin/tstep); + tmax := tstep * floor (tmax/tstep); + patchrays (gridpic) (tmin, tmax, tstep, rmin, rmax); + endpolargrid (drawcolor, .5penwd); +enddef; + +def polargrid (expr rstep, tstep) = + gridarcs (rstep); gridrays (tstep); +enddef; + +def polargridpoints (expr dsize, rstep, tstep) = + beginpolargrid; + setpicture (gdot) setdot (griddotpath, dsize); + if rmin = 0: + picdot (gridpic, gdot, zconv (origin)); + rmin := rstep; + fi + for n = ceiling (rmin/rstep) upto floor (rmax/rstep): + for m = ceiling (tmin/tstep) upto floor (tmax/tstep): + picdot ( gridpic, gdot, zconv ( polar ((n*rstep, m*tstep)) ) ); + endfor + endfor + endpolargrid (pointcolor, .5dsize); +enddef; + +def beginpolargrid = +begingroup; + save rmax, rmin, tmax, tmin; + getpolarbounds; + newpicture (gridpic); +enddef; + +def getpolarbounds = + save p, r, t; + pair p[]; + p0 := (xneg, yneg); p1 := (xneg, ypos); + p2 := (xpos, ypos); p3 := (xpos, yneg); + r0 := abs(p0); rmax := r0; + for j = 1 upto 3: + r[j] := abs(p[j]); + if rmax < r[j]: rmax := r[j]; fi + endfor + rmin := 0; + if (xneg < 0) and (xpos > 0) and (yneg < 0) and (ypos > 0): + tmin := 0; tmax := 360; + elseif (p0 = origin): tmin := 0; tmax := 90; + elseif (p1 = origin): tmin := -90; tmax := 0; + elseif (p2 = origin): tmin := -180; tmax := -90; + elseif (p3 = origin): tmin := 90; tmax := 180; + else: + tmax := tmin := t0 := angle p0; + for j = 1 upto 3: + t := t0 + anglefromto (p0, p[j]); + if tmax < t: tmax := t; fi + if tmin > t: tmin := t; fi + endfor + if (xneg < 0) and (0 < xpos): + rmin := emin (abs(yneg), abs(ypos)); + elseif (yneg < 0) and (0 < ypos): + rmin := emin (abs(xneg), abs(xpos)); + else: + rmin := min (r0, r1, r2, r3); + fi + fi +enddef; + + +def endpolargrid (expr clr, size)= + clipto (gridpic) rect ( zconv ((xneg, yneg)) - size*(1,1), + zconv ((xpos, ypos)) + size*(1,1) ); + coloraddon (clr, gridpic); + endgroup +enddef; + +vardef polarpatch (expr rstart, rstop, rstep, tstart, tstop, tstep) = + plrpatch (rstart, rstop, rstep, tstart, tstop, tstep); + safedraw zconv ( arcplr (origin, tstart, tstop, rstop) ); + safedraw zconv ( ((rstart, 0)--(rstop, 0)) rotated tstop ); +enddef; + +vardef rect (expr ll, ur) = + ll--(xpart ur, ypart ll)--ur--(xpart ll, ypart ur)--cycle +enddef; +vardef triangle (expr A, B, C) = A--B--C--cycle enddef; + +vardef regularpolygon (expr n) (suffix Bob) (text eqns) = + pair Bob[]; Bob := emax (round (abs (n)), 2); + eqns; + for _uncle = 1 upto Bob - 1: + (Bob1 - Bob0) rotated (360/Bob*_uncle) = Bob[_uncle+1] - Bob0; + endfor + mkpoly (true) (Bob) +enddef; + +vardef altitudept expr n of t = + save A, B, C, zz; pair A, B, C, zz; + B := pnt[n + 1] (t); + C := pnt[n + 2] (t); + zz = whatever[B,C]; + zz = pnt[n](t) + whatever*((C-B) rotated 90); + zz +enddef; + +vardef altitude expr n of t = + (pnt[n](t))--(altitudept n of t) +enddef; + +vardef medianpt expr n of t = + 0.5[pnt[n + 1] (t), pnt[n + 2] (t)] +enddef; + +vardef median expr n of t = + (pnt[n](t))--(medianpt n of t) +enddef; + +vardef anglebisectorpt expr n of t = + save A, B, C; pair A, B, C; + A := pnt[n ] (t); + B := pnt[n + 1] (t); + C := pnt[n + 2] (t); + save zz; pair zz; + zz = whatever[B,C]; + zz = A + whatever*((B-A) rotated (.5*cornerangle (A,B,C))); + zz +enddef; + +vardef anglebisector expr n of t = + (pnt[n](t))--(anglebisectorpt n of t) +enddef; + +vardef anglefromto (expr u, v) = + if (u = origin) or (v = origin): 0 + else: angle (v rotated (-angle u)) + fi +enddef; + +vardef cornerangle (expr A, B, C) = + if (A = B) and (B = C) : 60 + elseif (A=B) or (A=C) : 90 + else: anglefromto (B - A, C - A) + fi +enddef; + +vardef mkpath (expr smooth, tens, cyclic) (suffix pts) = + if smooth: mksmooth (tens) + else: mkpoly + fi (cyclic, pts) +enddef; + +vardef mkpoly (expr cyclic) (suffix pts) = + for _i = 1 upto pts-1: pts[_i]-- endfor + pts[pts] if cyclic: -- cycle else: {0,0} fi +enddef; + +vardef polyline (expr cyclic) (text t) = + setpairs (_pl) (t); + if _pl=0: NoPoints ("polyline", _pl); fi + mkpoly (cyclic, _pl) +enddef; + +def NoPoints (expr s) (suffix pts) = + GBwarn s & " attempted with empty list."; pts[incr pts] := origin; +enddef; + +vardef turtle (text t) = + setnumeric (_tu) 0; + pair _tu[]; _tu0 := origin; + for _a = t: _tu[incr _tu] := _tu[_tu - 1] + _a; endfor + if _tu = 0: NoPoints("turtle", _tu); fi + mkpoly (false, _tu) +enddef; + +vardef mksmooth (expr tens, cyclic) (suffix pts) = + if pts = 1: onepointpath (cyclic, pts1) + else: + settension (_tn) tens; fixtension (_tn); + pts1 if cyclic: {pts[2]-pts[pts]} fi + for _i = 2 upto pts-1: + ..tension _tn..pts[_i]{pts[_i+1]-pts[_i-1]} + endfor + ..tension _tn..pts[pts] + if cyclic: {pts[1]-pts[pts-1]}..tension _tn..cycle fi + fi +enddef; + +vardef mktenser (expr tens, cyclic) (suffix pts) = + if pts = 1: onepointpath (cyclic, pts1) + else: + settension (_tn) tens; fixtension (_tn); + pts1 if cyclic: {pts[2]-pts[pts]} fi + for _i = 2 upto pts-1: + ..tension atleast _tn..pts[_i]{pts[_i+1]-pts[_i-1]} + endfor + ..tension atleast _tn..pts[pts] + if cyclic: {pts[1]-pts[pts-1]}..tension atleast _tn..cycle fi + fi +enddef; + +vardef mkconvex (expr tens, cyclic) (suffix pts) = + save _B, _d, _tmp; pair _d[]; + settension (_tn) tens; fixtension (_tn); + if pts < 4: mktenser (_tn, cyclic) (pts) + else: + for _j = 2 upto pts - 1: + _B[_j] := sqrt(abs((pts[_j]-pts[_j-1])xprod(pts[_j+1]-pts[_j]))); + endfor + if cyclic: + _B1 := sqrt(abs((pts1 - pts[pts])xprod(pts2 - pts1))); + _B[pts] := sqrt(abs((pts[pts]-pts[pts-1])xprod(pts1 - pts[pts]))); + else: + _B1 := _B2; + _B[pts] := _B[pts-1]; + fi + for _j = 2 upto pts - 1: + _tmp := _B[_j-1] + _B[_j+1]; + _d[_j] := + if _tmp = 0: origin % signal to use curl1 + else: + ( _B[_j+1]*(pts[_j] - pts[_j-1]) + + _B[_j-1]*(pts[_j+1] - pts[_j]) )/_tmp + fi; + endfor + if cyclic: + _tmp := _B[pts] + _B2; + _d1 := + if _tmp = 0: origin + else: + (_B2*(pts1 - pts[pts]) + _B[pts]*(pts2 - pts1))/_tmp + fi; + _tmp := _B[pts-1] + _B1; + _d[pts] := + if _tmp = 0: origin + else: + ( _B1*(pts[pts] - pts[pts-1]) + + _B[pts-1]*(pts1 - pts[pts]) )/_tmp + fi; + else: + _d1 := origin; _d[pts] := origin; + fi + pts1 + for _j = 1 upto pts-1: + {if _d[_j] = origin: curl1 else: _d[_j] fi} + ..tension atleast _tn..pts[_j+1] + endfor + {if _d[pts] = origin: curl1 else: _d[pts] fi} + if cyclic: ..tension atleast _tn..cycle fi + fi +enddef; + +numeric default_tension; default_tension := 1; +def curve = tcurve (default_tension) enddef; +vardef tcurve (expr tens, cyclic) (text t) = + setpairs (_tc) (t); mksmooth (tens, cyclic, _tc) +enddef; + +def ccurve = tccurve (default_tension) enddef; +vardef tccurve (expr tens, cyclic) (text t) = + setuniquepairs (_tcc) (t); mkconvex (tens, cyclic, _tcc) +enddef; + +vardef mkbezier (expr tens, cyclic) (suffix pts) = + settension (_tn) tens; fixtension (_tn); + pts1 + for _i = 2 upto pts: ..tension _tn..pts[_i] endfor + if cyclic: ..tension _tn..cycle else: {0,0} fi +enddef; + +def bezier = tbezier (default_tension) enddef; +vardef tbezier (expr tens, cyclic) (text t) = + setpairs (_tbs) (t); + if _tbs=0: NoPoints ("bezier", _tbs); fi + mkbezier (tens, cyclic) (_tbs) +enddef; + +vardef mkqbezier (expr cyclic) (suffix pts) = + pts1 + if pts=1: {0,0} + else: + for _i = 2 step 2 until pts - 1: + ..controls 1/3[pts[_i], pts[_i-1] ] and 1/3[pts[_i], pts[_i+1] ].. + pts[_i+1] + endfor + if cyclic: + ..controls 1/3[ pts[pts], pts[pts - 1] ] + and 1/3[ pts[pts], pts1 ]..cycle + fi + fi +enddef; + +vardef qbezier (expr cyclic) (text t) = + setpairs (_qbz) (t); + if _qbz=0: NoPoints ("qbezier", _qbz); fi + if _qbz=1: onepointpath (cyclic, _qbz1) + else: + if (cyclic and odd _qbz) or (not cyclic and even _qbz): + _qbz[incr _qbz] := _qbz[_qbz-1]; + fi + mkqbezier (cyclic) (_qbz) + fi +enddef; + +vardef fcncontrol (expr ftens, X, Y, Z) = + Y if (xpart(Z-Y) <> 0) and (xpart(Y-X) <> 0): + + xpart(Z-Y)/3/xpart(Z-X)*(Z - X)/ftens fi +enddef; + +vardef mkfcnpath (expr ftens) (suffix q) = + settension (_tn) ftens; + if _tn <= 0: _tn := 1; fi + for _i = 1 upto q - 1: + q[_i]..controls fcncontrol (_tn) (q[_i-1], q[_i], q[_i+1]) + and fcncontrol (_tn) (q[_i+2], q[_i+1], q[_i]).. + endfor + q[q]{0,0} +enddef; + +def fcncurve = functioncurve (default_tension) enddef; +def tfcncurve = functioncurve enddef; +vardef functioncurve (expr ftens) (text t) = + settension (_ftens) ftens; if _ftens < 1/3: _ftens := 1/3; fi + setuniquepairs (_fc) (t); + if _fc > 1: _fc0 := _fc1; _fc[_fc+1] := _fc[_fc]; fi + mkfcnpath (_ftens) (_fc) +enddef; + +def openqbs = qspline (false) enddef; +def closedqbs = qspline (true) enddef; + +vardef mkqbs (suffix b) = + 0.5[ b1, b2] + if b<3: {0,0} + else: + for _i = 2 upto b-1: + ..controls 1/6[ b[_i], b[_i-1] ] and 1/6[ b[_i], b[_i+1] ].. + 0.5[ b[_i], b[_i+1] ] + endfor + fi +enddef; + +vardef qspline (expr cyclic) (text t) = + setpairs (_qs) (t); + if _qs=0: NoPoints ("qspline", _qs); fi + if _qs=1: _qs[incr _qs] := _qs1; fi + if cyclic: + _qs[incr _qs] := _qs1; _qs[incr _qs] := _qs2; + fi + mkqbs (_qs) if cyclic: & cycle fi +enddef; +vardef mkcbs (suffix b) = + (b[1]+4b[2]+b[3])/6 + if b < 4: {0,0} + else: + for _i = 3 upto b-1: + ..controls 1/3[ b[_i-1], b[_i] ] and 1/3[ b[_i], b[_i-1] ] + .. (b[_i-1] + 4b[_i] + b[_i+1])/6 + endfor + fi +enddef; + +def mkopencbs = mkcbs enddef; +vardef mkclosedcbs (suffix b) = + mkcbs (b) & opencbs (b[b-2],b[b-1],b[b], b1, b2, b3) & cycle +enddef; + +def opencbs = cspline (false) enddef; +def closedcbs = cspline (true) enddef; + +vardef cspline (expr cyclic) (text t) = + setpairs (_cs) (t); + if _cs=0: NoPoints ("cspline", _cs); fi + for _idx = _cs upto 2: _cs[incr _cs] := _cs[_idx]; endfor + if cyclic: + for _idx = 1 upto 3: _cs[incr _cs] := _cs[_idx]; endfor + fi + mkcbs (_cs) if cyclic: & cycle fi +enddef; +def init_spline_eqns (suffix pts) = + save _spl_pre, _spl_post; + pair _spl_pre[], _spl_post[]; + for j= 2 upto pts - 1: + _spl_post[j] + _spl_pre[j] = 2pts[j]; + _spl_pre[j+1]+2_spl_pre[j] = 2_spl_post[j]+_spl_post[j-1]; + endfor +enddef; + +def closed_spline_eqns (suffix pts) = + _spl_post1 + _spl_pre1 = 2pts1; + _spl_post[pts] + _spl_pre[pts] = 2pts[pts]; + _spl_pre2 + 2_spl_pre1 = 2_spl_post1 + _spl_post[pts]; + _spl_pre1+2_spl_pre[pts] = 2_spl_post[pts]+_spl_post[pts-1]; +enddef; + +def relaxed_spline_eqns (suffix pts) = + _spl_pre2 + pts1 = 2_spl_post1; + pts[pts] + _spl_post[pts-1] = 2_spl_pre[pts]; +enddef; + +vardef mksplinepath (expr closed) (suffix pts) = + pts1..controls _spl_post1 and + for j = 2 upto pts if not closed: -1 fi: + _spl_pre[j]..pts[j]..controls _spl_post[j] and + endfor + if closed: _spl_pre1..cycle else: _spl_pre[pts]..pts[pts] fi +enddef; + +def mkspline (expr closed) (suffix pts) = + init_spline_eqns (pts); + if closed: closed_spline_eqns (pts); + else: relaxed_spline_eqns (pts); + fi + mksplinepath (closed) (pts) +enddef; + +vardef dospline (expr closed) (text the_list) = + setpairs (_sp) (the_list); + if _sp=0: NoPoints ("dospline", _sp); fi + if _sp=1: _sp[incr _sp] := _sp1; fi + mkspline (closed) (_sp) +enddef; + +def init_fcnspl_eqns (suffix pts) = + save _dx, _sl; numeric _dx[], _sl[]; + _dx1 := xpart (pts2 - pts1); + for j = 2 upto pts - 1: + _dx[j] := xpart (pts[j+1] - pts[j]); + _sl[j + 1]*_dx[j] + _sl[j-1]*_dx[j-1] + 2_sl[j]*(_dx[j] + _dx[j-1]) + = 3*ypart(pts[j+1] - pts[j-1]); + endfor +enddef; + +def periodic_fcnspl_eqns (suffix pts) = + _sl1 = _sl[pts]; + _sl2*_dx1 + 2_sl1*_dx1 + 2_sl[pts]*_dx[pts-1] + _sl[pts-1]*_dx[pts-1] + = 3 * ypart (pts[2] - pts[pts-1]); +enddef; + +def relaxed_fcnspl_eqns (suffix pts) = + _sl2*_dx1 + 2_sl1*_dx1 = 3 * ypart(pts2 - pts1); + _sl[pts-1]*_dx[pts-1] + 2_sl[pts]*_dx[pts-1] + = 3 * ypart(pts[pts] - pts[pts-1]); +enddef; + +vardef mkfcnsplpath (suffix pts) = + pts1..controls (pts1 + (1, _sl1)/3*_dx1) and + for j = 2 upto pts - 1: + (pts[j] - (1, _sl[j])/3*_dx[j-1]) ..pts[j].. + controls (pts[j] + (1,_sl[j])/3*_dx[j]) and + endfor + (pts[pts] - (1,_sl[pts])*_dx[pts-1]/3)..pts[pts] +enddef; + +vardef mkfcnspline (expr periodic) (suffix pts) = + init_fcnspl_eqns (pts); + if periodic: periodic_fcnspl_eqns (pts); + else: relaxed_fcnspl_eqns (pts); + fi + mkfcnsplpath (pts) +enddef; + +vardef fcnspline (expr periodic) (text the_list) = + setpairs (_fs) (the_list); + if _fs<2: + if _fs=0: NoPoints ("fcnspline", _fs); fi + onepointpath (false, _fs1) + else: + mkfcnspline (periodic) (_fs) + fi +enddef; + +vardef mkarc (expr center, begpt, endpt, sweep) = + if (sweep = 0): begpt--endpt + else: + setnumeric (n) ceiling (abs(sweep)/45); + setpair (d) (begpt - center) rotated (signof (sweep) 90); + begpt{d} + for j = 1 upto n-1: + ..(begpt rotatedabout (center, j/n*sweep)){d rotated (j/n*sweep)} + endfor ..endpt{d rotated sweep} + fi +enddef; + +vardef arc (expr center, begpt, sweep) = + if (center = begpt) or (sweep = 0): begpt--begpt + else: + mkarc (center, begpt, begpt rotatedabout (center, sweep), sweep) + fi +enddef; +def arccps = arc enddef; + +vardef arcpps (expr begpt, endpt, sweep) = + if begpt = endpt: begpt--endpt + else: + setpair (cd) unitvector (endpt-begpt); + if abs(sweep) <= 45: + begpt{cd rotated (-sweep/2)}..endpt{cd rotated (sweep/2)} + elseif abs(sweep) <= 90: + save m; pair m; + m = begpt + whatever*( cd rotated (-sweep/4)); + m = 0.5[begpt, endpt] + whatever*(cd rotated 90); + begpt{cd rotated (-sweep/2)}..m{cd}..endpt{cd rotated (sweep/2)} + else: + setnumeric (ang) 90 - ((sweep/2) mod 180); + if abs(ang) = 90: + GBwarn "undefined arc. A line segment will be used instead."; + begpt--endpt + else: + save c; pair c; + c = begpt + whatever*(cd rotated ang); + c = if abs(ang) < 30: + (0.5)[begpt, endpt] + whatever*(cd rotated 90) + else: + endpt + whatever*(-cd rotated -ang) + fi; + mkarc (c, begpt, endpt, sweep) + fi + fi + fi +enddef; + +vardef arcpp (expr small, begpt, endpt, rad) = + save full, ang; full := signof (rad) 360; + if 2*abs(rad) > abs(begpt - endpt): + ang := if not small: full - fi 2*asin (abs(begpt-endpt)/(2rad)); + else: ang := signof (rad) 180; + fi + arcpps (begpt, endpt, ang) +enddef; +def arcppr (expr begpt, endpt, rad, small) = + arcpp (small, begpt, endpt, rad) +enddef; + +vardef arcplr (expr center, frtheta, totheta, rad) = + if rad = 0: center--center + else: + mkarc (center, center + rad*dir frtheta, + center + rad*dir totheta, totheta - frtheta) + fi +enddef; + +vardef arcalt (expr center, radius, frtheta, totheta) = + arcplr (center, frtheta, totheta, radius) +enddef; + +vardef arcppp (expr first, second, third) = + arcpps (first, second, 2*cornerangle (third, first, second)) & + arcpps (second, third, 2*cornerangle (first, second, third)) +enddef; + +vardef ellipse (expr center, radx, rady, angle) = + fullcircle xscaled (2*radx) yscaled (2*rady) rotated angle + shifted center +enddef; +vardef circle (expr center, rad) = + fullcircle scaled (2*rad) shifted center +enddef; +vardef circlecp (expr center, point) = + mkarc (center, point, point, 360) & cycle +enddef; +vardef circleppp (expr one, two, three) = + arcpps (one, two, 2*cornerangle (three, one, two)) + & arcpps (two, three, 2*cornerangle (one, two, three)) + & arcpps (three, one, 2*cornerangle (two, three, one)) + & cycle +enddef; +vardef circlepps (expr one, two, sweep) = + save ang, full; + full := signof (sweep) 360; + ang := sweep mod full; + arcpps (one, two, ang) & arcpps (two, one, full - ang) & cycle +enddef; +vardef circlepp (expr small, one, two, rad) = + arcpp (small, one, two, rad) & arcpp (not small, two, one, rad) & cycle +enddef; +def circleppr (expr one, two, rad, small) = + circleppr (one, two, rad, small) +enddef; +vardef pathcenter expr p = + save a, cntr, n; pair cntr, a[]; + n := length p; + a1 = pnt 0 (p); + a3 = pnt [n/2] (p); + if cycle p: + a2 = pnt [n/4] (p); + a4 = pnt [3n/4] (p); + else: + a2 := a3; + a4 := pnt[n] (p); + fi + cntr = .5[a1, a3] + whatever*((a3 - a1) rotated 90); + cntr = .5[a2, a4] + whatever*((a4 - a2) rotated 90); + cntr +enddef; + +vardef circumcircle expr t = + circleppp (pnt0 (t), pnt1 (t), pnt2 (t)) +enddef; + +vardef incircle expr t = + save A, B, C; pair A, B, C; + A := pnt0 (t); + B := pnt1 (t); + C := pnt2 (t); + save a, b, c, D, E, F; + D := abs (B-A) = a + b; + E := abs (C-B) = b + c; + F := abs (A-C) = a + c; + circleppp ((a/D)[A,B], (b/E)[B,C], (c/F)[C,A]) +enddef; + +vardef excircle expr n of t = + save A, B, C; pair A, B, C; + A := pnt[n] (t); + B := pnt[n + 1] (t); + C := pnt[n + 2] (t); + save a, b, c, D, E, F; + D := abs (B-A) = a - b; + E := abs (C-B) = b + c; + F := abs (C-A) = a - c; + circleppp ((a/D)[A,B], (b/E)[B,C], (c/F)[A,C]) +enddef; + +vardef ninepointcircle expr t = + circleppp (medianpt 0 of t, medianpt 1 of t, medianpt 2 of t) +enddef; + +vardef barycenter expr t = + save m; m := length t if not cycle t: + 1 fi; + pnt0(t)/m for k = 1 upto m - 1: + pnt[k](t)/m endfor +enddef; + +vardef sector (expr center, rad, frtheta, totheta) = + center -- arcalt (center, rad, frtheta, totheta) -- cycle +enddef; + +vardef mkfcn (expr sm, tens) (expr bmin, bmax, bst) (text pf) = + save _p; pair _p[]; _p := 0; + save _dx, _n, _r; numeric _dx, _n, _r; + if bmax = bmin: _n := 1; + else: + _r := bmax - bmin; + _dx := max (abs(bst), nottoosmall*abs(_r), epsilon); + _n := emax (round(abs(_r)/_dx), 1); + fi + for _i = 0 upto _n: _p[incr _p] := pf(bmin + _i/_n*_r); endfor + mkpath (sm, tens, false, _p) +enddef; + +def tfcn (expr sm) = mkfcn (sm, default_tension) enddef; + +def parafcn (expr sm) = tparafcn (sm, default_tension) enddef; +vardef tparafcn (expr sm, tn) (expr bmin, bmax, bst) (text pf) = + save _fp; vardef _fp (expr t) = pf enddef; + mkfcn (sm, tn) (bmin, bmax, bst) (_fp) +enddef; + +vardef xfcn (expr sm) (expr xmin, xmax, st) (text _fx) = + save _fp; vardef _fp (expr _x) = (_x, _fx(_x)) enddef; + mkfcn (sm, default_tension) (xmin, xmax, st) (_fp) +enddef; + +def function (expr sm) = tfunction (sm, default_tension) enddef; +vardef tfunction (expr sm, tens, xmin, xmax, st) (text _fx) = + save _fp; vardef _fp (expr x) = (x, _fx) enddef; + mkfcn (sm, tens) (xmin, xmax, st) (_fp) +enddef; + +def btwnfcn (expr sm) = tbtwnfcn (sm, default_tension) enddef; +vardef tbtwnfcn (expr sm, tn, xlo, xhi, st)(text _fx)(text _gx) = + tfunction (sm, tn) (xlo, xhi, st) (_fx) -- + ( reverse tfunction (sm, tn) (xlo, xhi, st) (_gx) ) -- cycle +enddef; + +def belowfcn (expr sm) = tbelowfcn (sm, default_tension) enddef; +vardef tbelowfcn (expr sm, tn, xlo, xhi, st)(text _fx) = + (xlo,0)--(xhi,0)-- + (reverse tfunction (sm, tn, xlo, xhi, st)(_fx))--cycle +enddef; + +vardef rfcn (expr sm, tmin, tmax, st) (text ft) = + save _fq; vardef _fq (expr t) = (ft(t)) * (dir t) enddef; + mkfcn (sm, default_tension) (tmin, tmax, st) (_fq) +enddef; + +def plrfcn (expr sm) = tplrfcn (sm, default_tension) enddef; +vardef tplrfcn (expr sm, tens, tmin, tmax, st) (text ft) = + save _fq; vardef _fq (expr t) = (ft) * (dir t) enddef; + mkfcn (sm, tens) (tmin, tmax, st) (_fq) +enddef; + +def btwnplrfcn (expr sm) = tbtwnplrfcn (sm, default_tension) enddef; +vardef tbtwnplrfcn (expr sm, tn, tlo, thi, st)(text _ft)(text _gt)= + tplrfcn (sm, tn, tlo, thi, st) (_ft) -- + ( reverse tplrfcn (sm, tn, tlo, thi, st) (_gt) ) -- cycle +enddef; + +def plrregion (expr sm) = tplrregion (sm, default_tension) enddef; +vardef tplrregion (expr sm, tn, tlo, thi, st) (text _ft) = + (0,0)--tplrfcn (sm, tn, tlo, thi, st ) (_ft)--cycle +enddef; +numeric tolerancefactor; +tolerancefactor := .02; +vardef mklevelset (expr sm, tens, X, Y, t, a, b, c, d) = + save _inside_; + vardef _inside_ (expr U, V) = + inside_levelset (U, V) and (a < U) and (U < b) + and (c < V) and (V < d) + enddef; + if not _inside_ (X, Y): + GBwarn "Invalid seed point for levelset."; + pairmax((a,c), pairmin((X,Y), (b,d)))&cycle + else: + save ls, W, A, B, prev, curr, seed; + pair ls[], prev, curr, seed; + seed := (X,Y); + ls := 0; W := 0; + + save _first_, _next_, get_next; + vardef _first_ (expr U) = _inside_ (U, Y) enddef; + vardef _next_ (expr ang) = + _inside_ (X_curr + t * cosd ang, Y_curr + t * sind ang) + enddef; + def get_next (expr angA, angB) = + X_curr := xpart curr; Y_curr := ypart curr; + ls[incr ls] := curr + t * dir (solve _next_ (angA, angB)); + prev := curr; curr := ls[ls]; + W := W + anglefromto (prev - seed, curr - seed); + enddef; + + interim tolerance := t*tolerancefactor; + ls[incr ls] := (solve _first_ (X, b), Y); + curr := ls[ls]; + interim tolerance := radian*tolerancefactor; + get_next (180, 0); + for n = 3 upto max_points: + A := angle (curr - prev); + get_next (A + 120, A - 120); + exitif ((abs(W) > 180) or (ls > 10)) + and (abs(ls[ls] - ls1) < 1.2t); + endfor + mkpath (sm, tens, true) (ls) + fi +enddef; + +numeric max_points; +max_points := 2000; + +def levelset (expr s) = tlevelset (s, default_tension) enddef; +vardef tlevelset (expr smth, tens, seed, seg) (text cond) = + save inside_levelset, _t; + vardef inside_levelset (expr x, y) = cond enddef; + _t := if seg <= 0: emax (xpos-xneg, ypos-yneg)/max_points * 20 + else: seg fi; + mklevelset (smth, tens, xpart seed, ypart seed, _t) + (xneg, xpos, yneg, ypos) +enddef; + +vardef lclosed expr f = + f + if not cycle f: + if pnt0(f) = pnt[infinity](f): & else: -- fi cycle + fi +enddef; + +def sclosed = sclosedt (default_tension) enddef; +vardef sclosedt (expr t) expr f = + if cycle f: f + else: save n; n := length f; + if n = 0: f&cycle + elseif n = 1: pnt0(f)..tension t..pnt1(f)..tension t..cycle + else: + (pnt0 (f)) { (pnt1(f)) - (pnt[n] (f)) }..tension t + ..(subpath (1, n-1) of f)..tension t + ..(pnt[n](f)) { pnt0(f) - pnt[n-1](f) } + ..tension t..cycle + fi + fi +enddef; + +def bclosed = bclosedt (default_tension) enddef; +vardef bclosedt (expr t) expr f = + f + if not cycle f: + if pnt0(f) = pnt[infinity](f): & else: ..tension t.. fi cycle + fi +enddef; + +def uclosed = bclosed enddef; +def uclosedt = bclosedt enddef; + +def cbcontrols (suffix b, t) = + b1 := 2[t3, t2]; + b2 := 2[t2, t1]; + b3 := 2[b1, b2]; + b4 := 2[b2, b3]; +enddef; + +vardef cbclosed expr f = + save n; n := length f; + if cycle f: f + elseif n = 0: f&cycle + else: + save p, q, t; pair p[], q[], t[]; + t1 := pnt0(f); t2 := post0(f); t3 := pre1(f); + cbcontrols (p, t); % defines p1 to p4 + t1 := pnt[n](f); t2 := pre[n](f); t3 := post[n-1](f); + cbcontrols (q, t); % defines q1 to q4 + f..controls q2 and q3..opencbs (q1,q4,p4,p1) + ..controls p3 and p2..cycle + fi +enddef; + +vardef qbclosed expr f = + if cycle f: f + else: save n; n := length f; + if n = 0: f&cycle + else: + save p; pair p[]; p := 4; + p1 := (3/2)[pnt[n](f), pre[n](f)]; + p2 := 2[p1, pnt[n](f)]; + p4 := (3/2)[pnt 0 (f), post0 (f)]; + p3 := 2[p4, pnt 0 (f)]; + f & mkqbs (p) & cycle + fi + fi +enddef; + +vardef makesector expr p = (pathcenter p)--p--cycle enddef; +vardef arccomplement expr p = + if cycle p: onepointpath (false, pnt0(p)) + else: + setnumeric (nn) length p; + setpairs (pp) (pnt0(p), pnt[.5nn](p), pnt[nn](p)); + arcpps (pp3,pp1,2*cornerangle(pp2,pp3,pp1)) + fi +enddef; + +path cuttings; +vardef cutoffbefore (expr b) expr f = + save t, n; n := length f; + if n > 0: + for k = 1 upto n: + exitif (subpath (0,k) of f) intersects b; + endfor + if _Xtime < 0: + cuttings := pnt0 (f){0,0}; + f + else: + cuttings := subpath (0,_Xtime) of f; + subpath (_Xtime, n) of f + fi + else: f + fi +enddef; + +vardef cutoffafter (expr b) expr f = + setpath (g) cutoffbefore (b) reverse f; + cuttings := reverse cuttings; + reverse g +enddef; + +vardef trimmedpath (expr btrim, etrim) expr f = + save g, h; path g, h; + g := invvconv (fullcircle scaled 2btrim) shifted pnt0(f); + h := invvconv (fullcircle scaled 2etrim) shifted pnt[length f] (f); + cutoffafter (h) cutoffbefore (g) f +enddef; + +vardef predirection@# (expr p) = + - postdirection[length p - @#] (reverse p) +enddef; + +vardef postdirection@# (expr p) = + save _n; _n := length (p); + setpair (v) __dir (subpath (@#, @# + _n) of p); + if v = origin: + v := - __dir (subpath (@#, @# - _n) of p); + fi + v +enddef; + +vardef __dir (expr p) = + save v, w; pair v, w; w := pnt0 (p); + v := origin; + for n = 1 upto length (p): + v := post[n-1] (p) - w; exitif v <> origin; + v := pre [ n ] (p) - w; exitif v <> origin; + v := pnt [ n ] (p) - w; exitif v <> origin; + endfor + sgn v +enddef; + +vardef trivial expr p = (__dir (p) = origin) enddef; + +newinternal hdwdr, hdten; +boolean hfilled; + +def headshape (expr wr, tens, fil) = + interim hdwdr := wr; + interim hdten := if tens>0: tens else: default_tension fi; + if hdten < .75: hdten := .75; fi + setboolean (hfilled) fil; + mkheadpaths; +enddef; +def mkheadpaths = + save Arrowhead, Leftharpoon, Rightharpoon; + path Arrowhead, Leftharpoon, Rightharpoon, + Arrowhead.clear, Leftharpoon.clear, Rightharpoon.clear; + Rightharpoon := (0,0){down}..tension hdten..(.5hdwdr,-1); + Rightharpoon.clear := Rightharpoon--(.5hdwdr,0)--cycle; + Leftharpoon := (reverse Rightharpoon) xscaled -1; + Leftharpoon.clear := (reverse Rightharpoon.clear) xscaled -1; + Arrowhead := Leftharpoon & Rightharpoon; + Arrowhead.clear := Leftharpoon.clear & Rightharpoon.clear & cycle; + if hfilled: + Arrowhead := Arrowhead--cycle; + Rightharpoon := Rightharpoon--(0,-1)--cycle; + Leftharpoon := Leftharpoon--(0,-1)--cycle; + fi +enddef; +headshape (1,1,false); + +def head = ahead (headcolor) enddef; + +vardef ahead (expr clr, front, back, hwr, tens, filled) = + settension (_tn) tens; fixtension (_tn); + if front <> back: + setpair (side) (hwr/2) * ((front-back) rotated 90); + setpath (f) (back + side)..tension _tn.. + {front-back}front{back-front}..tension _tn..(back - side); + if clearhead: + safeunfill (back - side)--(front-side)--(front+side)-- + (back+side) & f & cycle; + colorsafedraw (background) (back - side)--(front-side)-- + (front+side)--(back+side) & f & cycle; + fi + if filled: + f := f--cycle; + colorsafefill (clr) f; + fi + colorsafedraw (clr) f; + fi +enddef; + +def headpath = Gheadpath (false) (Arrowhead) enddef; +def headpathx = Gheadpath (true) (Arrowhead) enddef; + +def colorheadpath = colorGheadpath (false) (Arrowhead) enddef; +def colorheadpathx = colorGheadpath (true) (Arrowhead) enddef; + +def Gheadpath (expr trim) (suffix ah) = + colorGheadpath (trim) (ah) (headcolor) +enddef; +vardef colorGheadpath +(expr trim) (suffix ah) (expr clr, sc, rot, pos) expr f = + if (sc <> 0) and (known ah) and (path ah): + convertpath (_g) f; + setpair (_P) predirection[length _g] (_g); + if _P <> origin: + _P := _P rotated rot; + setnumeric (_ang) anglefromto (up, _P); + _P := pnt[length _g] (_g) - pos * _P; + setpair (_tip) if known ah.tip: ah.tip else: origin fi; + + if trim: + if known ah.clear: + safeunfill (ah.clear shifted - _tip) + scaled sc + rotated _ang + shifted _P; + fi + setnumeric (_ys) max(bp, penwd, last_dot_size); + safeunfill cut_path + xscaled ceiling sc yscaled ceiling _ys + rotated _ang shifted _P; + fi + if cycle ah: colorsafefill else: colorsafedraw fi (clr) + (ah shifted -_tip) + scaled sc + rotated _ang + shifted _P; + fi + fi + f +enddef; + +def tailpath (suffix sh) = colortailpath (sh) (headcolor) enddef; +vardef colortailpath (suffix sh) (expr clr, sc, rot, pos) expr f = + if (sc <> 0) and (known sh) and (path sh): + convertpath (_g) f; + setpair(_P) postdirection0 (_g); + if _P <> origin: + _P := _P rotated rot; + if cycle sh: colorsafefill else: colorsafedraw fi (clr) + (sh if known sh.tip: shifted -sh.tip fi) + scaled sc + rotated anglefromto (up, _P) + shifted (pnt0 (_g) + pos * _P); + fi + fi + f +enddef; + +def midpath (suffix sh) = colormidpath (sh) (headcolor) enddef; +vardef colormidpath (suffix sh) (expr clr, sc, rot, pos) expr f = + if (sc <> 0) and (known sh) and (path sh): + convertpath (_g) f; + setnumeric (_t) pathtime[pos] (_g); + setpair (_P) postdirection[_t] (_g); + if _P <> origin: + _P := _P rotated rot; + if cycle sh: colorsafefill else: colorsafedraw fi (clr) + sh scaled sc + rotated anglefromto (up, _P) + shifted (pnt[_t] (_g)); + fi + fi + f +enddef; + +vardef signeddeviate primary X = + (uniformdeviate 1)[-X,X] +enddef; +vardef scaledeviate (expr W, A) = + 2 ** (signeddeviate W) * dir A +enddef; +vardef polardeviate primary R = + (uniformdeviate abs(R)) * dir uniformdeviate 360 +enddef; +vardef xydeviate primary Z = + (signeddeviate (xpart Z), signeddeviate (ypart Z)) +enddef; + +vardef randompair (expr maxshift) = + if numeric maxshift: polardeviate (maxshift) + elseif pair maxshift: xydeviate (maxshift) + else: (0,0) + fi +enddef; + +vardef detrivialized expr f = + save g; path p, g[]; g := 0; + for k = 1 upto length f: + p := subpath (k-1,k) of f; + if not trivial p: g[incr g] := p; fi + endfor + if g = 0: onepointpath (cycle f, pnt0(f)) + else: g1 for k = 2 upto g: &g[k] endfor if cycle f: &cycle fi + fi +enddef; + +vardef randompath (expr maxshift, weirdness) expr f = + save g, n; path g; + g := detrivialized f; + n := length g; + if n = 0: + f shifted randompair (maxshift) + else: + save X, U, V; + pair X[], U[], V[]; + if cycle g: n := n - 1; fi + for k = 0 upto n: + X[k] := pnt[k](g); + U[k] := X[k] - pre[k](g); + V[k] := post[k](g) - X[k]; + endfor + save A, B; + for k := 0 upto n: + X[k] := X[k] shifted randompair (maxshift); + A := anglefromto (U[k],V[k]); + B := signeddeviate (30weirdness); + U[k] := X[k] - (U[k] zscaled scaledeviate (weirdness,B)); + B := B - A + A * (2 ** signeddeviate weirdness); + V[k] := X[k] + (V[k] zscaled scaledeviate (weirdness,B)); + endfor + X0 for k = 1 upto n: + .. controls V[k-1] and U[k] .. X[k] + endfor + if cycle g: + .. controls V[n] and U0 .. cycle + fi + fi +enddef; + +vardef randomlines (expr maxshift) expr f = + save g, n; path g; + g := detrivialized f; + n := length g; + if n = 0: + f shifted randompair (maxshift) + else: + if cycle g: n := n - 1; fi + (pnt0(g) shifted randompair (maxshift)) + for k = 1 upto n: + -- (pnt[k](g) shifted randompair (maxshift)) + endfor + if cycle g: + -- cycle + fi + fi +enddef; +vardef parasegment (expr d, segs, f) = + if d = 0: f + else: + save u, v, t; pair u[], v[]; + for n = 0 upto segs: + t := n/segs; + u[n] := postdirection [t] (f); + v[n] := pnt[t] (f) + (u[n] zscaled (0,d)); + endfor + v0{u0} + for n = 1 upto segs: ...v[n]{u[n]} endfor + fi +enddef; + +vardef parapath (expr d) expr f = + if d = 0: + f + else: + save a, g, h, p, q, s, t, u, v, w; + path g[], h, p[], q[]; + numeric a, s, t; + pair u, v, w, w[]; + s := emax (3, emin (segment_split, ceiling (max_points/5/length f))); + p := 0; + for i = 1 upto length f: + h := subpath (i-1, i) of f; + if not trivial h: + q[incr p] := h; + p[p] := parasegment (d, s, h); + fi + endfor + if p = 0: + f + else: + a := if d>0: - fi 180; + h := p1; + for i = 1 upto p-1: + u := predirection 1 (q[i]); + v := postdirection 0 (q[i+1]); + w1 := pnt 1 (q[i]) - (u zscaled (0,d)); + w2 := pnt 0 (q[i+1]) - (v zscaled (0,d)); + w3 := pnt [infinity] (h); + w4 := pnt 0 (p[i+1]); + g0 := arcpps(w3, w1, a); + g1 := h & g0; + g2 := arcpps(w2, w4, a) & p[i+1]; + if (p[i] & g0) intersects reverse g2: + s := length g2 - _Ytime; + t := length h - length p[i] + _Xtime; + g1 := subpath (0, t) of g1; + g2 := subpath (s, length g2) of g2; + force_equal_ends (g1, g2); + h := g1 & g2; + else: + h := h .. p[i+1]; + fi + endfor + + if cycle f: + u := predirection 1 (q[p]); + v := postdirection 0 (q[1]); + w1 := pnt 1 (q[p]) - (u zscaled (0,d)); + w2 := pnt 0 (q[1]) - (v zscaled (0,d)); + w3 := pnt [infinity] (h); + w4 := pnt 0 (p[1]); + g3 := arcpps(w3, w1, a); + g0 := arcpps(w2, w4, a); + g1 := g0 & h & g3; + g2 := g0 & p[1]; + if (p[p] & g3) intersects reverse g2: + s := length g2 - _Ytime; + t := length g0 + length h - length p[p] + _Xtime; + g1 := subpath (s, t) of g1; + force_equal_ends (g1, g1); + h := g1 & cycle; + else: + h := h..cycle; + fi + fi + h + fi + fi +enddef; + +vardef turnangle@# (expr f) = + anglefromto(predirection@# (f), postdirection@#(f)) +enddef; + +def setdatadashes (text lst) = + save __type; __type := 0; + forsuffixes _itm = lst: + if knownnumericarray _itm : + copyarray (_itm) (__type[__type]); + next __type; + else: GBwarn "Improper dash pattern in setdatadashes."; + fi + endfor + if __type > 1: + save dashtype; dashtype := __type; + for _j = 0 upto dashtype - 1: + copyarray (__type[_j]) (dashtype[_j]); + endfor + else: + SetdataWarn "dashes"; + fi +enddef; +def getdashpat expr n = dashtype[n mod dashtype] enddef; + +def SetdataWarn expr s = + GBwarn "command setdata"& s &"() failed. Previous values retained."; +enddef; + +numeric Solid, Simpledash, Simpledot, Dotdash, Dotdashdot, Dotdashdash; +dashpat (Solid) (0); +dashpat (Simple_dash) (3bp, 4bp); +dashpat (Simple_dot) (0, 4bp); +dashpat (Dot_dash) (0, 4bp, 3bp, 4bp); +dashpat (Dot_dash_dot) (0, 4bp, 3bp, 4bp, 0, 4bp); +dashpat (Dot_dash_dash) (0, 4bp, 3bp, 4bp, 3bp, 4bp); + +numeric dashtype, dashtype[], dashtype[][]; +def defaultdashes = + setdatadashes (Solid, Simple_dash, Simple_dot, + Dot_dash, Dot_dash_dot, Dot_dash_dash); +enddef; +defaultdashes; + +def setdatasymbols (text lst) = + save __type; path __type[]; + __type := 0; + for _itm = lst: + if (known _itm) and (path _itm): + __type[__type] := _itm; + next __type; + else: + GBwarn "Improper path in setdatasymbols()."; + fi + endfor + if __type > 1: + save pointtype; pointtype := __type; + path pointtype[]; + for _j = 0 upto pointtype - 1: + pointtype[_j] := __type[_j]; + endfor + else: + SetdataWarn "symbols"; + fi +enddef; +def getsymbol expr n := pointtype[n mod pointtype] enddef; + +def DeclareGBSymbols (text S) = + forsuffixes _itm = S: + path _itm; + path _itm.clear; + pair _itm.tip; + endfor +enddef; +DeclareGBSymbols( + Triangle, Square, Circle, Diamond, Star, Plus, Cross, + Asterisk, Crossbar, Leftbar, Rightbar, Righthook, + Lefthook, SolidTriangle, SolidSquare, SolidCircle, + SolidDiamond, SolidStar +); + +vardef undo_cycle expr f = subpath (0, length f) of f enddef; + +SolidTriangle := (up--(dir 210)--(dir -30)--cycle) scaled .78; +Triangle := undo_cycle SolidTriangle; + +Triangle.clear := SolidTriangle.clear := + ((dir -30)--(cosd 30,1)--(cosd 210,1)--(dir 210)--up--cycle) + scaled .78; + +SolidSquare := (up--(-1,1)--(-1,-1)--(1,-1)--(1,1)--cycle) scaled .443; +Square := undo_cycle SolidSquare; + +SolidCircle := fullcircle rotated 90; +Circle := undo_cycle SolidCircle; +Circle.clear := SolidCircle.clear := + halfcircle--(-.5,.5)--(.5,.5)--cycle; + +SolidDiamond := (up--left--down--right--cycle) + scaled .522 yscaled 1.44; +Diamond := undo_cycle SolidDiamond; +Diamond.clear := SolidDiamond.clear := + (right--(1,1)--(-1,1)--left--up--cycle) scaled .522 yscaled 1.44; + +Plus := ((0,0)--up--down--(0,0)--left--right) scaled .65; +Plus.clear := (right--(1,1)--(-1,1)--(left)--cycle) scaled .65; + +Cross := ((0,0)--(dir 45)--(dir -135)--(0,0)--(dir -45)--(dir 135)) + scaled .65; +Cross.clear := ((0,0)--(dir -45)--dir(45)--(dir 135)--(dir -135)--cycle) + scaled .65; + +Asterisk := ((0,0)--up--down--(0,0)--(dir 30)--(dir -150) + --(0,0)--(dir -30)--(dir 150)) scaled .6; +Asterisk.clear := ((0,0)--(dir -30)--(cosd 30,1)--(cosd 150,1) + --(dir -150)--cycle) scaled .6; + +Crossbar := ((0,0)--left--right) scaled .65; +Crossbar.clear := rect (right,(-1,.5)) scaled .65; + +Leftbar := ((0,0)--left); +Rightbar := ((0,0)--right); +Leftbar.clear := rect((0,0),(-1,.5)); +Rightbar.clear := rect((0,0),(1,.5)); + +Righthook := arcpps((0,0),(1,0),180); +Lefthook := Righthook xscaled -1; +Righthook.clear := Righthook--cycle; +Lefthook.clear := Lefthook--cycle; + +vardef mkstar (expr n, m) (suffix A) = + save ang; ang := 360/n; + A1 := up; A3 := up rotated ang; + A2 = (whatever)[A1, A1 rotated ( ang*m)]; + A2 = (whatever)[A3, A3 rotated (-ang*m)]; + for i = 4 upto 2n: + A[i] := A[i-2] rotated ang; + endfor + A := 2n; + mkpoly (true, A) +enddef; + +save _A; pair _A[]; +SolidStar := mkstar (5, 2, _A) scaled .84; +Star := undo_cycle SolidStar; +Star.clear := polyline (true) + (_A9, _A10, _A1, _A2, _A3, (xpart _A3, 1), (xpart _A9, 1)) scaled .84; +SolidStar.clear := Star.clear; + +forsuffixes S = + Triangle, Square, Circle, Diamond, Star, Plus, Cross, + Asterisk, Crossbar, Leftbar, Rightbar, Righthook, + Lefthook, SolidTriangle, SolidSquare, SolidCircle, + SolidDiamond, SolidStar : + S.tip := point 0 of S; +endfor +vardef gcd (expr n, m) = + save a, b, r; + a := emax (abs(m), abs(n)); + b := emin (abs(m), abs(n)); + if b > 0: + forever: + r := a mod b; + exitif r < 1; + a := b; b := r; + endfor + b + else: + a + fi +enddef; + +vardef lcm (expr n, m) = + n*m/gcd(n, m) +enddef; + +path cut_path; cut_path := (.5,0)--(.5,.71)--(-.5,.71)--(-.5,0)--cycle; + +numeric pointtype; path pointtype[]; +def defaultsymbols = + setdatasymbols( Circle, Cross, SolidDiamond, Square, Plus, + Triangle, SolidCircle, Star, SolidTriangle); +enddef; +defaultsymbols; + +def setdatacolors (text lst) = + save __type; color __type[]; + __type := 0; + for _itm = lst: + if (known _itm) and (color _itm): + __type[__type] := _itm; + next __type; + else: GBwarn "Improper color in setdatacolors()."; + fi + endfor + if __type > 1: + save colortype; colortype := __type; + color colortype[]; + for _j = 0 upto colortype - 1: + colortype[_j] := __type[_j]; + endfor + else: + SetdataWarn "colors"; + fi +enddef; +def getcolor expr n = colortype[n mod colortype] enddef; + +color dBlue, dOrange, dGreen, dMagenta, dCyan, dYellow; +dBlue := 0.80blue + .2white; +dOrange := 0.66yellow + .34red; +dGreen := 0.80green; +dMagenta := 0.85magenta; +dCyan := 0.85cyan; +dYellow := 0.85yellow; + +numeric colortype; color colortype[]; +def defaultcolors = + setdatacolors(black, red, dBlue, dOrange, dGreen, + dMagenta, dCyan, dYellow); +enddef; +defaultcolors; + +def computepie (suffix dat) (expr sign, ang, cent, rad) (text data) = +begingroup + save _tot, _max, _toobig; + _max := 0; dat := 0; + for _val = data: + dat[incr dat] := _val; + _max := emax (_max, _val); + endfor + if dat=0: GBwarn "piechart attempted with empty list."; + _toobig := 1; + else: + _toobig := infinity/dat; + fi + if _max > _toobig: + for _idx = 1 upto dat: + dat[_idx] := dat[_idx]/_toobig; + endfor + fi + for _idx = 2 upto dat: + dat[_idx] := dat[_idx - 1] + dat[_idx]; + endfor + _tot := dat[dat]; + for _idx = dat downto 2: + dat[_idx] := ang + sign*dat[_idx-1]/_tot*360; + endfor + dat1 := ang; dat[dat + 1] := ang + 360sign; +endgroup +enddef; + +def piechart (expr sign, ang, cent, rad) (text data) = + save _dat; + computepie (_dat) (sign, ang, cent, rad) (data); + mkpiewedges (_dat, cent, rad); +enddef; + +def mkpiewedges (suffix dat) (expr cent, rad) = + numeric piewedge, piedirection, pieangle, pieangle[]; + pair piecenter, piedirection[]; + path piewedge[]; + piecenter := cent; + piedirection := pieangle := piewedge := dat; + for _idx = 1 upto dat: + pieangle[_idx] := dat[_idx]; + piewedge[_idx] := sector (piecenter, rad, dat[_idx], dat[_idx+1]); + piedirection[_idx] := dir(0.5[ dat[_idx], dat[_idx+1] ]); + endfor +enddef; + +def namedpiechart (suffix nm) (expr sign, ang, cent, rad) (text data) = + save _dat; + computepie (_dat) (sign, ang, cent, rad) (data); + setnumeric (nm) _dat; + pair nm.center, nm.direction[]; + path nm.wedge[]; + nm.center := cent; + for _idx = 1 upto _dat: + nm.wedge[_idx] := sector (cent, rad, _dat[_idx], _dat[_idx+1]); + nm.direction[_idx] := dir(0.5[ _dat[_idx], _dat[_idx+1] ]); + endfor +enddef; + +def barchart (expr firstbar, sep, r, vert)(text data) = + numeric barbegin, barbegin[], + barend, barend[], + barlength, barlength[], + barstart, barstart[], + chartbar, barwd; + path chartbar[]; + chartbar := 0; barwd := r*sep; + for _itm = data: + barend[incr chartbar] := if pair _itm: ypart _itm else: _itm fi; + barbegin[chartbar] := if pair _itm: xpart _itm else: 0 fi; + endfor + barbegin := barend := barlength := barstart := chartbar; + for _nn = 1 upto chartbar: + barstart[_nn] := firstbar + sep*(_nn-1); + barlength[_nn] := barend[_nn]; + chartbar[_nn] := rect ((barbegin[_nn], 0), ( barend[_nn], barwd)) + shifted (0, barstart[_nn]) if vert: xyswap fi; + endfor +enddef; + +def namedbarchart (suffix nm) (expr first, sep, r, vert) (text data) = + save nm; +begingroup + save _bb, _ee, _ww; + path nm.bar[]; + nm := 0; _ww := r*sep; + for _itm = data: + _ee := if pair _itm: ypart _itm else: _itm fi; + _bb := if pair _itm: xpart _itm else: 0 fi; + nm.bar[incr nm] := rect ((_bb, 0), ( _ee, _ww) ) + shifted (0, first + sep*(nm-1)) if vert: xyswap fi; + endfor +endgroup +enddef; + +picture totalpicture; +boolean totalnull, currentnull; +def clearit = + currentpicture := totalpicture := nullpicture; + currentnull := totalnull := true; +enddef; + +def keepit = + addto totalpicture also currentpicture; + mono (totalpicture); + currentpicture := nullpicture; + totalnull := totalnull or currentnull; + currentnull := true; +enddef; + +def addto_currentpicture = + currentnull := false; + addto currentpicture +enddef; + +def mergeit (text do) = + if totalnull: + do currentpicture + elseif currentnull: + do totalpicture + else: + begingroup + save _v_; picture _v_; + _v_ := currentpicture; + addto _v_ also totalpicture; + do _v_ + endgroup + fi +enddef; + +boolean noship; noship := false; +def shipit = if noship: else: mergeit (shipout) fi enddef; + +def showit_ = mergeit (show_) enddef; +def show_ suffix v = display v inwindow currentwindow enddef; + +numeric gcode; gcode := 0; + +% end grafbase.mf +endinput. +%% +%% End of file `grafbase.mf'. diff --git a/Master/texmf-dist/metapost/mfpic/dvipsnam.mp b/Master/texmf-dist/metapost/mfpic/dvipsnam.mp index 7cbc933d2c6..1bc8d9f64c9 100644 --- a/Master/texmf-dist/metapost/mfpic/dvipsnam.mp +++ b/Master/texmf-dist/metapost/mfpic/dvipsnam.mp @@ -8,28 +8,33 @@ %% %% ------------------------------------------------------------------- %% -%% Copyright 2002--2003, Daniel H. Luecking -%% -%% Mfpic consists of the 3 files mfpic.dtx, grafbase.dtx and mfpic.ins -%% and the 5 files they generate: mfpic.tex, mfpic.sty, grafbase.mf, -%% grafbase.mp, and dvipsnam.mp. -%% -%% Documentation, examples, and ancillary files are separate. See -%% readme.1st for a complete list. +%% Copyright 2002--2006, Daniel H. Luecking %% %% Mfpic may be distributed and/or modified under the conditions of the -%% LaTeX Project Public License, either version 1.2 of this license or (at +%% LaTeX Project Public License, either version 1.3b of this license or (at %% your option) any later version. The latest version of this license is in +%% <http://www.latex-project.org/lppl.txt> +%% and version 1.3b or later is part of all distributions of LaTeX version +%% 2005/12/01 or later. %% -%% http://www.latex-project.org/lppl.txt -%% -%% and version 1.2 or later is part of all distributions of LaTeX version -%% 1999/12/01 or later. -%% -%% With respect to the proposed draft LPPL-1.3: mfpic has maintenance -%% status "maintained". The Current Maintainer is Daniel H. Luecking. There -%% are several Base Interpreters: TeX, LaTeX, MetaPost and Metafont. +%% Mfpic has maintenance status "author-maintained". The Current Maintainer +%% is Daniel H. Luecking. There are several Base Interpreters associated +%% with mfpic: plain TeX, LaTeX, plain Metafont and plain MetaPost. %% +if unknown grafbaseversion: + vardef snapto expr t = + if unknown t: 0 + elseif not (numeric t): 0 + elseif t < 0: 0 + elseif t > 1: 1 + else: t + fi + enddef; + vardef cmyk (expr c, m, y, k) = + (snapto 1-c-k, snapto 1-m-k, snapto1-y-k) + enddef; +fi + color Apricot, Aquamarine, Bittersweet, Black, Blue, BlueGreen, BlueViolet, BrickRed, Brown, BurntOrange, CadetBlue, CarnationPink, Cerulean, CornflowerBlue, Cyan, Dandelion, DarkOrchid, Emerald, @@ -42,74 +47,74 @@ Salmon, SeaGreen, Sepia, SkyBlue, SpringGreen, Tan, TealBlue, Thistle, Turquoise, Violet, VioletRed, White, WildStrawberry, Yellow, YellowGreen, YellowOrange; -Apricot = cmyk( 0, 0.32, 0.52, 0); -Aquamarine = cmyk(0.82, 0, 0.30, 0); -Bittersweet = cmyk( 0, 0.75, 1, 0.24); -Black = cmyk( 0, 0, 0, 1); -Blue = cmyk( 1, 1, 0, 0); -BlueGreen = cmyk(0.85, 0, 0.33, 0); -BlueViolet = cmyk(0.86, 0.91, 0, 0.04); -BrickRed = cmyk( 0, 0.89, 0.94, 0.28); -Brown = cmyk( 0, 0.81, 1, 0.60); -BurntOrange = cmyk( 0, 0.51, 1, 0); -CadetBlue = cmyk(0.62, 0.57, 0.23, 0); -CarnationPink = cmyk( 0, 0.63, 0, 0); -Cerulean = cmyk(0.94, 0.11, 0, 0); -CornflowerBlue = cmyk(0.65, 0.13, 0, 0); -Cyan = cmyk( 1, 0, 0, 0); -Dandelion = cmyk( 0, 0.29, 0.84, 0); -DarkOrchid = cmyk(0.40, 0.80, 0.20, 0); -Emerald = cmyk( 1, 0, 0.50, 0); -ForestGreen = cmyk(0.91, 0, 0.88, 0.12); -Fuchsia = cmyk(0.47, 0.91, 0, 0.08); -Goldenrod = cmyk( 0, 0.10, 0.84, 0); -Gray = cmyk( 0, 0, 0, 0.50); -Green = cmyk( 1, 0, 1, 0); -GreenYellow = cmyk(0.15, 0, 0.69, 0); -JungleGreen = cmyk(0.99, 0, 0.52, 0); -Lavender = cmyk( 0, 0.48, 0, 0); -LimeGreen = cmyk(0.50, 0, 1, 0); -Magenta = cmyk( 0, 1, 0, 0); -Mahogany = cmyk( 0, 0.85, 0.87, 0.35); -Maroon = cmyk( 0, 0.87, 0.68, 0.32); -Melon = cmyk( 0, 0.46, 0.50, 0); -MidnightBlue = cmyk(0.98, 0.13, 0, 0.43); -Mulberry = cmyk(0.34, 0.90, 0, 0.02); -NavyBlue = cmyk(0.94, 0.54, 0, 0); -OliveGreen = cmyk(0.64, 0, 0.95, 0.40); -Orange = cmyk( 0, 0.61, 0.87, 0); -OrangeRed = cmyk( 0, 1, 0.50, 0); -Orchid = cmyk(0.32, 0.64, 0, 0); -Peach = cmyk( 0, 0.50, 0.70, 0); -Periwinkle = cmyk(0.57, 0.55, 0, 0); -PineGreen = cmyk(0.92, 0, 0.59, 0.25); -Plum = cmyk(0.50, 1, 0, 0); -ProcessBlue = cmyk(0.96, 0, 0, 0); -Purple = cmyk(0.45, 0.86, 0, 0); -RawSienna = cmyk( 0, 0.72, 1, 0.45); -Red = cmyk( 0, 1, 1, 0); -RedOrange = cmyk( 0, 0.77, 0.87, 0); -RedViolet = cmyk(0.07, 0.90, 0, 0.34); -Rhodamine = cmyk( 0, 0.82, 0, 0); -RoyalBlue = cmyk( 1, 0.50, 0, 0); -RoyalPurple = cmyk(0.75, 0.90, 0, 0); -RubineRed = cmyk( 0, 1, 0.13, 0); -Salmon = cmyk( 0, 0.53, 0.38, 0); -SeaGreen = cmyk(0.69, 0, 0.50, 0); -Sepia = cmyk( 0, 0.83, 1, 0.70); -SkyBlue = cmyk(0.62, 0, 0.12, 0); -SpringGreen = cmyk(0.26, 0, 0.76, 0); -Tan = cmyk(0.14, 0.42, 0.56, 0); -TealBlue = cmyk(0.86, 0, 0.34, 0.02); -Thistle = cmyk(0.12, 0.59, 0, 0); -Turquoise = cmyk(0.85, 0, 0.20, 0); -Violet = cmyk(0.79, 0.88, 0, 0); -VioletRed = cmyk( 0, 0.81, 0, 0); -White = cmyk( 0, 0, 0, 0); -WildStrawberry = cmyk( 0, 0.96, 0.39, 0); -Yellow = cmyk( 0, 0, 1, 0); -YellowGreen = cmyk(0.44, 0, 0.74, 0); -YellowOrange = cmyk( 0, 0.42, 1, 0); +Apricot := cmyk(0,0.32,0.52,0); +Aquamarine := cmyk(0.82,0,0.30,0); +Bittersweet := cmyk(0,0.75,1,0.24); +Black := cmyk(0,0,0,1); +Blue := cmyk(1,1,0,0); +BlueGreen := cmyk(0.85,0,0.33,0); +BlueViolet := cmyk(0.86,0.91,0,0.04); +BrickRed := cmyk(0,0.89,0.94,0.28); +Brown := cmyk(0,0.81,1,0.60); +BurntOrange := cmyk(0,0.51,1,0); +CadetBlue := cmyk(0.62,0.57,0.23,0); +CarnationPink := cmyk(0,0.63,0,0); +Cerulean := cmyk(0.94,0.11,0,0); +CornflowerBlue := cmyk(0.65,0.13,0,0); +Cyan := cmyk(1,0,0,0); +Dandelion := cmyk(0,0.29,0.84,0); +DarkOrchid := cmyk(0.40,0.80,0.20,0); +Emerald := cmyk(1,0,0.50,0); +ForestGreen := cmyk(0.91,0,0.88,0.12); +Fuchsia := cmyk(0.47,0.91,0,0.08); +Goldenrod := cmyk(0,0.10,0.84,0); +Gray := cmyk(0,0,0,0.50); +Green := cmyk(1,0,1,0); +GreenYellow := cmyk(0.15,0,0.69,0); +JungleGreen := cmyk(0.99,0,0.52,0); +Lavender := cmyk(0,0.48,0,0); +LimeGreen := cmyk(0.50,0,1,0); +Magenta := cmyk(0,1,0,0); +Mahogany := cmyk(0,0.85,0.87,0.35); +Maroon := cmyk(0,0.87,0.68,0.32); +Melon := cmyk(0,0.46,0.50,0); +MidnightBlue := cmyk(0.98,0.13,0,0.43); +Mulberry := cmyk(0.34,0.90,0,0.02); +NavyBlue := cmyk(0.94,0.54,0,0); +OliveGreen := cmyk(0.64,0,0.95,0.40); +Orange := cmyk(0,0.61,0.87,0); +OrangeRed := cmyk(0,1,0.50,0); +Orchid := cmyk(0.32,0.64,0,0); +Peach := cmyk(0,0.50,0.70,0); +Periwinkle := cmyk(0.57,0.55,0,0); +PineGreen := cmyk(0.92,0,0.59,0.25); +Plum := cmyk(0.50,1,0,0); +ProcessBlue := cmyk(0.96,0,0,0); +Purple := cmyk(0.45,0.86,0,0); +RawSienna := cmyk(0,0.72,1,0.45); +Red := cmyk(0,1,1,0); +RedOrange := cmyk(0,0.77,0.87,0); +RedViolet := cmyk(0.07,0.90,0,0.34); +Rhodamine := cmyk(0,0.82,0,0); +RoyalBlue := cmyk(1,0.50,0,0); +RoyalPurple := cmyk(0.75,0.90,0,0); +RubineRed := cmyk(0,1,0.13,0); +Salmon := cmyk(0,0.53,0.38,0); +SeaGreen := cmyk(0.69,0,0.50,0); +Sepia := cmyk(0,0.83,1,0.70); +SkyBlue := cmyk(0.62,0,0.12,0); +SpringGreen := cmyk(0.26,0,0.76,0); +Tan := cmyk(0.14,0.42,0.56,0); +TealBlue := cmyk(0.86,0,0.34,0.02); +Thistle := cmyk(0.12,0.59,0,0); +Turquoise := cmyk(0.85,0,0.20,0); +Violet := cmyk(0.79,0.88,0,0); +VioletRed := cmyk(0,0.81,0,0); +White := cmyk(0,0,0,0); +WildStrawberry := cmyk(0,0.96,0.39,0); +Yellow := cmyk(0,0,1,0); +YellowGreen := cmyk(0.44,0,0.74,0); +YellowOrange := cmyk(0,0.42,1,0); endinput. %% diff --git a/Master/texmf-dist/metapost/mfpic/grafbase.mp b/Master/texmf-dist/metapost/mfpic/grafbase.mp index 08e9f3de9b1..225150795f1 100644 --- a/Master/texmf-dist/metapost/mfpic/grafbase.mp +++ b/Master/texmf-dist/metapost/mfpic/grafbase.mp @@ -8,86 +8,80 @@ %% %% ------------------------------------------------------------------- %% -%% Copyright 2002--2003, Daniel H. Luecking -%% -%% Mfpic consists of the 3 files mfpic.dtx, grafbase.dtx and mfpic.ins -%% and the 5 files they generate: mfpic.tex, mfpic.sty, grafbase.mf, -%% grafbase.mp, and dvipsnam.mp. -%% -%% Documentation, examples, and ancillary files are separate. See -%% readme.1st for a complete list. +%% Copyright 2002--2006, Daniel H. Luecking %% %% Mfpic may be distributed and/or modified under the conditions of the -%% LaTeX Project Public License, either version 1.2 of this license or (at +%% LaTeX Project Public License, either version 1.3b of this license or (at %% your option) any later version. The latest version of this license is in +%% <http://www.latex-project.org/lppl.txt> +%% and version 1.3b or later is part of all distributions of LaTeX version +%% 2005/12/01 or later. %% -%% http://www.latex-project.org/lppl.txt -%% -%% and version 1.2 or later is part of all distributions of LaTeX version -%% 1999/12/01 or later. +%% Mfpic has maintenance status "author-maintained". The Current Maintainer +%% is Daniel H. Luecking. There are several Base Interpreters associated +%% with mfpic: plain TeX, LaTeX, plain Metafont and plain MetaPost. %% -%% With respect to the proposed draft LPPL-1.3: mfpic has maintenance -%% status "maintained". The Current Maintainer is Daniel H. Luecking. There -%% are several Base Interpreters: TeX, LaTeX, MetaPost and Metafont. -%% -string fileversion, filedate; -fileversion := "0.7a beta"; filedate := "2004/04/16"; -def GBmsg expr s = message "Grafbase: " & s; enddef; -def GBerrmsg (expr s) expr t = - errhelp t; - errmessage "Grafbase: "& s; - errhelp ""; -enddef; -if (known grafbaseversion) or (known grafbase) : - GBmsg "You have loaded grafbase more than once! " & - "Please make sure that it is loaded only once."; +if (known grafbaseversion) or (known grafbase): + message "Grafbase (" & jobname & "): You have loaded grafbase more " + & "than once! Please make sure that it is loaded only once."; endinput; fi - boolean grafbase; grafbase := true; -boolean MFPIC; MFPIC := false; + +string fileversion, filedate; +fileversion := "0.9"; filedate := "2006/05/26"; + +message " Loading grafbase macros, version " & fileversion & " " & + filedate & "."; + +def GBmsg expr s = message "Grafbase (" & jobname & "): " & s; enddef; +def GBwarn expr s = GBmsg "Warning, " & s; enddef; +def GBerrmsg (expr s) expr t = errhelp t; + errmessage "Grafbase (" & jobname & "): " & s; errhelp ""; +enddef; + +boolean MFPIC; MFPIC := false; def checkversions (expr g)= - numeric grafbaseversion; grafbaseversion := g; - if unknown mfpicversion : % no mfpic, or < 0.63 + numeric grafbaseversion; grafbaseversion := g; + if unknown mfpicversion: % no mfpic, or < 0.63 GBmsg "Recent mfpic not detected."; - elseif g = mfpicversion : + elseif g = mfpicversion: MFPIC := true; else: - GBerrmsg ("version mismatch") - "The installation may be broken: mfpic and grafbase " & - "versions do not match."; + message ""; + GBwarn "Version mismatch: " + & "mfpic and grafbase versions do not match."; + message ""; fi enddef; -checkversions (70); +checkversions (90); -if unknown base_name : input plain; -elseif not string base_name : input plain; -elseif base_name <> "plain" : input plain; +if unknown base_name : input plain; +elseif not string base_name: input plain; +elseif base_name <> "plain": input plain; fi boolean METAPOST; -if known color Maurits Cornelis Escher : METAPOST := true; -else: METAPOST := false; +if known color Geamparalele din Babadag: + METAPOST := true; +else: + METAPOST := false; fi -if not METAPOST : - GBerrmsg ("wrong compiler") - "You may have input to Metafont a file designed for Metapost. " & - "Instead of the file grafbase.mp, Metafont should be using " & - "grafbase.mf. Make sure the extension was not changed."; +if not METAPOST: + GBerrmsg ("wrong compiler.") + "This file is for Metapost. For Metafont use grafbase.mf."; fi -if (unknown debug) or (not boolean debug) : - boolean debug; debug := false; -fi +if not boolean debug: boolean debug; debug := false; fi def GBdebug = begingroup - save >>; def >> = message enddef; - >> "Grafbase DEBUG: "; + save >>; def >> = message enddef; + >> "Grafbase DEBUG"; enddef; def GBenddebug = >> "End DEBUG"; @@ -95,77 +89,78 @@ def GBenddebug = enddef; vardef mftitle expr t = - t; message t; + if string t: t; message t; fi enddef; -pt# := 1pt; -def t_ = transformed currenttransform enddef; -if unknown aspect_ratio: aspect_ratio := 1; fi -if unknown hppp : hppp := 1 fi; -if unknown currenttransform : +pt# := pt; bp# := bp; +def t_ = transformed currenttransform enddef; +if unknown aspect_ratio: aspect_ratio := 1; fi +if unknown hppp: hppp := 1 fi; +if unknown currenttransform: transform currenttransform; currenttransform := identity yscaled aspect_ratio; fi interim warningcheck := 0; -numeric unitlen, xscale, yscale, xneg, xpos, yneg, ypos; -unitlen := 1 bp; -xscale := 7.2; % (xscale * unitlen) = 1/10 inch -yscale := 7.2; % (yscale * unitlen) = 1/10 inch -xneg := 0; xpos := 10; -yneg := 0; ypos := 10; +numeric unitlen, xscale, yscale, xneg, xpos, yneg, ypos; -newinternal radian, pi, deg; -deg := 1; pi := 3.14159; -radian := 180/pi; +unitlen := 1 bp#; +xscale := 7.2; +yscale := 7.2; +xneg := 0; xpos := 10; +yneg := 0; ypos := 10; +newinternal deg, pi, radian; +deg := 1; pi := 3.14159; +radian := 57.29578; +numeric degree; degree := deg; -newinternal penwd; penwd := 0.5pt; +newinternal penwd; penwd := 0.5pt; pen drawpen; def resizedrawpen (expr s) = interim penwd := s; - setvariable (pen) (drawpen) (pencircle scaled penwd); - save currentpen; pen currentpen; pickup drawpen; + setvariable (pen) (drawpen) pencircle scaled penwd; + save currentpen; pen currentpen; pickup drawpen; enddef; -numeric hatchwd; hatchwd := 0.5bp; -pen hatchpen; hatchpen := pencircle scaled hatchwd; +numeric hatchwd; hatchwd := 0.5bp; +pen hatchpen; hatchpen := pencircle scaled hatchwd; -boolean clipall; clipall := false; -boolean ClipOn; ClipOn := false; -path ClipPath[]; numeric ClipPath; ClipPath = 0; -boolean truebbox; truebbox := false; +boolean clipall; clipall := false; +boolean ClipOn; ClipOn := false; +path ClipPath[]; numeric ClipPath; ClipPath = 0; +boolean truebbox; truebbox := false; def DoClip (suffix v) = - if ClipOn and (ClipPath > 0) : clipsto (v, ClipPath); fi + if ClipOn and (ClipPath > 0): clipsto (v, ClipPath); fi enddef; def noclip (text t) = - hide( save ClipOn; boolean ClipOn; ClipOn := false; t) + hide ( setboolean (ClipOn) false; t) enddef; -boolean showbbox; showbbox := false; +boolean showbbox; showbbox := false; -def _wc_ = withcolor enddef; +def _wc_ = withcolor enddef; -color currentcolor, fillcolor, drawcolor, hatchcolor, +color currentcolor, drawcolor, fillcolor, hatchcolor, headcolor, pointcolor, tlabelcolor, background; currentcolor := fillcolor := drawcolor := hatchcolor := headcolor := pointcolor := tlabelcolor := black; background := white; vardef snapto expr t = - if unknown t : 0 - elseif not (numeric t) : 0 - elseif t < 0 : 0 - elseif t > 1 : 1 - else : t + if unknown t: 0 + elseif not (numeric t): 0 + elseif t < 0: 0 + elseif t > 1: 1 + else: t fi enddef; -vardef gray (expr g) = (snapto g)*white enddef; +vardef gray (expr g) = (snapto g)*white enddef; vardef makeclr (expr r, g, b) = (r, g, b) @@ -183,12 +178,13 @@ vardef RGB (expr R, G, B) = rgb (R/255, G/255, B/255) enddef; -vardef named (suffix c) = forceclr (c) enddef; +vardef named (suffix c) = + if unknown c: black else: forceclr (c) fi +enddef; vardef forceclr (expr c) = - if unknown c : black - elseif numeric c : gray (c) - elseif color c : c - else : black + if numeric c: gray (c) + elseif color c: c + else: black fi enddef; @@ -200,55 +196,70 @@ cyan := rgb (0, 1, 1); magenta := rgb (1, 0, 1); yellow := rgb (1, 1, 0); -vardef list (suffix v) (text lst) = - v := 0; for _itm = lst: v[incr v] := _itm; endfor +def list (suffix v) (text lst) = + v := 0; for _itm = lst: v[incr v] := _itm; endfor + if v = 0: + GBerrmsg ("no list to process!") + "An attempt was made to produce an array from a " + & "list of expressions having no valid entries."; + fi enddef; def map (text proc) (text lst) = - hide(_map := 0;) - for _a = lst : - if _map = 0 : hide(_map := 1;) else: , fi - proc(_a) + hide (_map := 0;) + for _a = lst: + if _map = 0: hide (_map := 1;) else: , fi + proc (_a) endfor enddef; -vardef knownarray suffix arr = - save _kna; boolean _kna; - _kna := (known arr) and (numeric arr); +vardef knownnumericarray suffix arr = + setboolean (_kna) (known arr) and (numeric arr); if _kna : _kna := (arr = floor arr) and (arr >= 1); for _idx = 1 upto arr : exitif not _kna; - _kna := known arr[_idx]; + _kna := (known arr[_idx]) and (numeric arr[_idx]); endfor fi _kna enddef; -def copyarray(suffix from, to) = - to := 0; - for _idx = 1 upto from: - to[incr to] := from[_idx]; - endfor +def copyarray (suffix src, dest) = + for _idx = 1 upto src: dest[_idx] := src[_idx]; endfor + dest := src; enddef; def maparr (text proc) (suffix p) = - for _idx = 1 upto p: proc (p[_idx]); endfor + for _idx = 1 upto p: proc (p[_idx]); endfor enddef; -def textpairs (suffix p) (text t) = - numeric p; pair p[]; list (p) (t); +def textpairs = gsetarray (pair) enddef; + +def setuniquepairs (suffix p) (text t) = + save p; pair p[]; + setpairs (_up) (t); + if _up > 0: + p := 1; p1 := _up1; + for _i = 2 upto _up: + if _up[_i] <> p[p]: p[incr p] := _up[_i]; fi + endfor + else: + p := 0; + fi enddef; vardef chpair (text proc) (expr p) = (proc (xpart p), proc (ypart p)) enddef; -vardef floorpair (expr p) = chpair (floor) (p) enddef; -vardef ceilingpair (expr p) = chpair (ceiling) (p) enddef; +vardef floorpair (expr p) = (floor (xpart p), floor (ypart p)) enddef; +vardef ceilingpair (expr p) = + (ceiling (xpart p), ceiling (ypart p)) +enddef; -vardef emin (expr a, b) = if a < b : a else: b fi enddef; -vardef emax (expr a, b) = if a > b : a else: b fi enddef; +vardef emin (expr a, b) = if a < b: a else: b fi enddef; +vardef emax (expr a, b) = if a > b: a else: b fi enddef; vardef pairmin (expr z, w) = ( emin (xpart z, xpart w), emin (ypart z, ypart w ) ) @@ -257,22 +268,147 @@ vardef pairmax (expr z, w) = ( emax (xpart z, xpart w), emax (ypart z, ypart w ) ) enddef; -vardef minpair (suffix p) = - save _mp; pair _mp; _mp := p1; - for _idx = 2 upto p - 1 : - _mp := pairmin(_mp, p[_idx]); - endfor +vardef minpair (suffix p) = setpair (_mp) p1; + for _idx = 2 upto p - 1: _mp := pairmin (_mp, p[_idx]); endfor pairmin (_mp, p[p]) enddef; -vardef maxpair (suffix p) = - save _mp; pair _mp; _mp := p1; - for _idx = 2 upto p - 1: _mp := pairmax(_mp, p[_idx]); endfor +vardef maxpair (suffix p) = setpair (_mp) p1; + for _idx = 2 upto p - 1: _mp := pairmax (_mp, p[_idx]); endfor pairmax (_mp, p[p]) enddef; +primarydef Z xprod W = (xpart Z * ypart W - xpart W * ypart Z) enddef; + +def force_initial (expr p) (suffix f) = + hide( setnumeric (_n) length f; + f := p + if _n = 0: + {0,0} + else: + ..controls post0 (f) and pre 1 (f).. subpath (1,_n) of f + fi;) +enddef; + +def force_terminal (expr p) (suffix f) = + hide(setpath (_f) reverse f; + force_initial (p) (_f); + f := reverse _f;) +enddef; + +def force_equal_ends (suffix f, g) = + hide(save _p; pair _p; + _p := .5[pnt[length f] (f), pnt0(g)]; + force_terminal (_p) (f); force_initial (_p) (g);) +enddef; + +def replace_ends_of_cycle (expr p) (suffix f) = +hide( +if cycle f: + save _n; _n := length f; + f := p + if _n = 0: &cycle + else: .. controls post0 (f) and pre 1 (f) .. + if _n = 1: cycle + else: subpath (1, _n - 1) of f .. + controls post[_n - 1](f) and pre[_n](f) .. cycle + fi + fi; +fi) +enddef; + +pair thetimes; +numeric _Xtime, _Ytime; +tertiarydef a intersects b = + begingroup + thetimes := a intersectiontimes b; + _Xtime := xpart thetimes; + _Ytime := ypart thetimes; + (_Xtime > -1) + endgroup +enddef; + +tertiarydef a misses b = ((a intersectiontimes b) < origin) enddef; + +vardef makepicture (expr s) = + if picture s: s + elseif string s: s infont defaultfont scaled defaultscale + elseif path s: picpath (s) + else: nullpicture + fi +enddef; + +vardef onepointpath (expr cyclic, q) = + q if cyclic: &cycle else: {0,0} fi +enddef; + +vardef fallbackpath (expr cyclic, p) (text t) = + onepointpath (cyclic, p) +enddef; + +def even = not odd enddef; + +primarydef a divides b = + ((b mod a) = 0) +enddef; + +def beginimage = + begingroup + newpicture (currentpicture); +enddef; +def endimage = + ; currentpicture + endgroup +enddef; + +def makeimage (suffix name) (expr refpt) = + setpair (_image_reference_point) zconv(refpt); + setpicture (name) beginimage +enddef; +def concludeimage = + endimage shifted + -_image_reference_point +enddef; + +def setvariable (text kind) (suffix name) = + save name; kind name; name := +enddef; +def gsetvariable (text kind) (suffix name) = kind name; name := +enddef; + +def setnumeric (suffix name) = save name; name := enddef; +def setboolean = setvariable (boolean) enddef; +def setpair = setvariable (pair) enddef; +def setpath = setvariable (path) enddef; +def setcolor = setvariable (color) enddef; +def setpicture = setvariable (picture) enddef; +def settension (suffix tn) expr tens = + setnumeric (tn) if tens > 0: tens else: default_tension fi; +enddef; +def fixtension (suffix tn) = if tn < .75: tn := .75; fi enddef; + +def newpicture (suffix pic) = setpicture (pic) nullpicture; enddef; +def convertpath (suffix g) expr f = setpath (g) zconv (f); enddef; + +def setarray (text kind) (suffix name) = + save name; kind name[]; list (name) +enddef; +def setpairs = setarray (pair) enddef; +def gsetarray (text kind) (suffix name) = + numeric name; kind name[]; list (name) +enddef; + + +def setbbox (suffix ll, ur) = + save ll, ur; pair ll, ur; getbbox (ll, ur) +enddef; + +def setsplit (suffix s) expr ss = + setnumeric (s) emax (1, ceiling ss); +enddef; + transform ztr, vtr; def setztr = - if debug : + if debug: GBdebug; >> "w_ = " & decimal w_ & "bp"; >> "h_ = " & decimal h_ & "bp"; @@ -287,65 +423,63 @@ def setztr = fi save ztr, vtr; transform ztr, vtr; - vtr := identity xscaled (xscale) yscaled (yscale) - scaled (unitlen*hppp); - ztr := identity shifted (-(xneg, yneg)) transformed vtr; - if debug : + vtr := identity xscaled xscale yscaled yscale scaled (unitlen*hppp); + ztr := identity shifted (-xneg, -yneg) transformed vtr; + if debug: GBdebug; - >> "ztr: "; + >> "ztr is"; show ztr; - >> "vtr: "; + >> "vtr is"; show vtr; GBenddebug; fi enddef; -vardef zconv (expr a) = a transformed ztr enddef; -vardef invzconv (expr a) = a transformed (inverse ztr) enddef; -vardef vconv (expr v) = v transformed vtr enddef; -vardef invvconv (expr v) = v transformed (inverse vtr) enddef; +vardef zconv (expr a) = a transformed ztr enddef; +vardef invzconv (expr a) = a transformed (inverse ztr) enddef; +vardef vconv (expr v) = v transformed vtr enddef; +vardef invvconv (expr v) = v transformed (inverse vtr) enddef; -def active_plane = currentpicture enddef; +def active_plane = currentpicture enddef; -boolean overlaylabels; -overlaylabels = false; +boolean overlaylabels, underlaylabels, havebackground; +overlaylabels := false; +underlaylabels := false; +havebackground := false; def initpic = setztr; resizedrawpen (penwd); - if ClipOn : ClipPath := 1; + if ClipOn: ClipPath := 1; ClipPath1 := rect (origin, (w_, h_)); fi - if debug : + if debug: GBdebug; >> "Drawing nominal bounding box around picture"; GBenddebug; noclip ( safedraw rect (origin, (w_, h_)) ); fi - save current_labels; picture current_labels; - current_labels := nullpicture; - save labelbb; pair labelbb.ll, labelbb.ur; + newpicture (foreground_labels); + newpicture (background_labels); + havebackground := false; + save labelbb; pair labelbb.ll, labelbb.ur; labelbb.ll := labelbb.ur := origin; enddef; -def mfpicenv = enddef; -def endmfpicenv = enddef; +def mfpicenv = enddef; +def endmfpicenv = enddef; def bounds (expr a, b, c, d) = - xneg := a; xpos := b; - yneg := c; ypos := d; + xneg := a; xpos := b; + yneg := c; ypos := d; enddef; -def setvariable (text kind) (suffix name) (expr value) = - save name; kind name; name := value; -enddef; - -string extra_beginmfpic; extra_beginmfpic := ""; +string extra_beginmfpic; extra_beginmfpic := ""; string extra_endmfpic; extra_endmfpic := ""; def beginmfpic (expr ch) = beginfig (ch); gcode := ch; - save w_, h_, d_; numeric w_, h_, d_; + save w_, h_, d_; charwd := (xpos-xneg)*xscale*unitlen; charht := (ypos-yneg)*yscale*unitlen; chardp := 0; @@ -358,52 +492,59 @@ enddef; def endmfpic = scantokens extra_endmfpic; - if debug : + if debug: GBdebug; >> "width = " & decimal w_ & "bp"; >> "height = " & decimal h_ & "bp"; GBenddebug; fi DoClip (active_plane); - if clipall : clipto (active_plane) rect(origin, (w_, h_)); fi - if showbbox : noclip ( safedraw rect (origin, (w_, h_)) ); fi + if clipall: clipto (active_plane) rect (origin, (w_, h_)); fi + if showbbox: noclip ( safedraw rect (origin, (w_, h_)) ); fi save _ll, _ur; pair _ll, _ur; - if truebbox : + if truebbox: _ll := llcorner active_plane; _ur := urcorner active_plane; elseif clipall: _ll := origin; _ur := (w_,h_); else: % expand to accomodate labels - _ll := pairmin((0, 0 ), labelbb.ll); - _ur := pairmax((w_, h_), labelbb.ur); + _ll := pairmin ((0, 0 ), labelbb.ll); + _ur := pairmax ((w_, h_), labelbb.ur); fi - _ur := pairmax(_ur, _ll + eps*(1, 1)); - setbounds active_plane to rect(_ll, _ur); - addto active_plane also current_labels; + _ur := pairmax (_ur, _ll + eps*(1, 1)); + setbounds active_plane to rect (_ll, _ur); + if havebackground: + addto background_labels also active_plane; + active_plane := background_labels; + background_labels := nullpicture; + fi + addto active_plane also foreground_labels; + foreground_labels := nullpicture; endfig; enddef; -pair label_adjust; label_adjust := (0, 0); -numeric label_sep; label_sep := 0; +pair label_adjust; +label_adjust := origin; +numeric label_sep, labelpath_sep ; +label_sep := 0; labelpath_sep := 0; vardef newgblabel (expr hf, vf, BL, r) (expr s) (text pts) = - save _lab, _ll, _ur; picture _lab; pair _ll, _ur; - _lab := - if picture s : s - elseif string s : s infont defaultfont scaled defaultscale - elseif path s : picpath (s) - else : nullpicture - fi; - labeldims (origin, _lab) (_ll, _ur); - _lab := thegblabel(ref_shift (hf, vf, BL, _ll, _ur), r, _lab); - save _b; pair _b; - for _itm = pts : - _b := zconv(_itm); - if overlaylabels : - addto current_labels also _lab shifted _b _wc_ tlabelcolor; + save _lab, _ll, _ur; picture _lab; pair _ll, _ur; + _lab := makepicture (s); + pathdims (origin, _lab) (_ll, _ur); + readjustdims (_ll, _ur) (label_sep); + _lab := thegblabel (ref_shift (hf, vf, BL, _ll, _ur), r, _lab); + save _b; pair _b; + for _itm = pts: + _b := zconv (_itm); + if overlaylabels: + addto foreground_labels also _lab shifted _b _wc_ tlabelcolor; + elseif underlaylabels: + addto background_labels also _lab shifted _b _wc_ tlabelcolor; + havebackground := true; else: addto active_plane also _lab shifted _b _wc_ tlabelcolor; labelbb.ll := pairmin (_b + llcorner _lab, labelbb.ll); @@ -418,7 +559,7 @@ enddef; vardef ref_shift (expr hf, vf, BL, ll, ur) = - ( (hf)[xpart ll, xpart ur], - (vf)[if BL: 0 else: (ypart ll) fi, ypart ur] ) + (vf)[if BL: 0 else: (ypart ll) fi, ypart ur] ) enddef; vardef thegblabel (expr z, r, p) = @@ -435,98 +576,89 @@ vardef textellipse (expr lbl, rat, loc) = xellipse (false, .5, .5, false, 0) (origin, lbl, rat, loc) enddef; -boolean roundends; roundends := true; +boolean roundends; roundends := true; vardef textrectx (expr a, b, c, rot, xy, lbl, rad, loc) = save ll, ur, _r, f, zz; pair ll, ur, zz; path f; - labeldims (xy, lbl) (ll, ur); - _r := - if boolean rad : - if rad : emin (xpart (ur-ll), ypart (ur-ll))/sqrt(2) - else: 0 - fi - elseif numeric rad : rad - else: 0 + pathdims (xy, lbl) (ll, ur); + readjustdims (ll, ur) (labelpath_sep) + _r := if numeric rad: rad + elseif not boolean rad: 0 + elseif rad: emin (xpart(ur-ll), ypart (ur-ll))/sqrt(2) + else: 0 fi; - if _r = 0 : - f := rect(ll, ur); + if _r = 0: + f := rect (ll, ur); else: save p, q; pair p[]; path q; - p1 := ur - _r*dir(45); % center of upper right arc - p3 := ll + _r*dir(45); % lower left - p2 := (xpart p3, ypart p1); % upper left - p4 := (xpart p1, ypart p3); % lower right - q := quartercircle scaled 2_r; - if _r > 0: - f := (q shifted p1) -- (q rotated 90 shifted p2) - -- (q rotated 180 shifted p3) - -- (q rotated -90 shifted p4) - -- cycle; - else: - f := (q shifted p1) -- (q rotated -90 shifted p4) - -- (q rotated 180 shifted p3) - -- (q rotated 90 shifted p2) - -- cycle; - fi + p1 := ur - _r*dir(45); + p3 := ll + _r*dir(45); + p2 := (xpart p3, ypart p1); + p4 := (xpart p1, ypart p3); + q := if _r < 0: reverse fi quartercircle scaled 2_r; + f := + (q shifted p1)--(q rotated 90 shifted p2) + --(q rotated 180 shifted p3) + --(q rotated -90 shifted p4)--cycle; + fi - invvconv(thegblabel(ref_shift(a, b, c, ll, ur), rot, f)) shifted loc + readjustdims (ll, ur) (label_sep - labelpath_sep); + invvconv (thegblabel (ref_shift(a, b, c, ll, ur), rot, f)) shifted loc enddef; -def textovalx = xellipse (true) enddef; -def textellipsex = xellipse (false) enddef; +def textovalx = xellipse (true) enddef; +def textellipsex = xellipse (false) enddef; vardef xellipse (expr aspect, a, b, c, r, xy, lbl, mult, loc) = - if mult = 0 : + if mult = 0: textrectx (a, b, c, r) (xy, lbl, 0, loc) else: save ll, ur, cc, ww, hh, f; pair ll, ur, cc; path f; - labeldims (xy, lbl) (ll, ur); - cc := .5[ll, ur]; % center + pathdims (xy, lbl) (ll, ur); + readjustdims (ll, ur) (labelpath_sep) + cc := .5[ll, ur]; (ww, hh) = ur - cc; - if (ww = 0) or (hh = 0) : % make a line: + if (ww = 0) or (hh = 0): f = (ll--ur); else: - save aa, bb, mm; - mm := if aspect : ww/hh*mult else: mult fi; - aa := ww ++ hh*mm; - bb := aa/mm; - f := ellipse(cc, aa, bb, 0); + save aa, bb; + aa := ww ++ if aspect: ww else: hh fi *mult; + bb := hh ++ if aspect: hh else: ww fi /mult; + f := ellipse (cc, aa, bb, 0); fi - invvconv(thegblabel (ref_shift (a, b, c, ll, ur), r, f)) shifted loc + readjustdims (ll, ur) (label_sep - labelpath_sep); + invvconv (thegblabel (ref_shift(a, b, c, ll, ur), r, f)) shifted loc fi enddef; - -def labeldims (expr xy, lbl) (suffix ll, ur) = - if pair lbl : - ll := xy; ur := lbl; +def pathdims (expr xy, lbl) (suffix ll, ur) = + if pair lbl: + ll := xy; ur := lbl; else: - save _lbl; picture _lbl; - _lbl := - if picture lbl : lbl - elseif string lbl : - lbl infont defaultfont scaled defaultscale - elseif path lbl : picpath (lbl) - else : nullpicture - fi; + setpicture (_lbl) makepicture (lbl); ll := llcorner _lbl; ur := urcorner _lbl; fi - ll := ll - label_sep*(1, 1); - ur := ur + label_sep*(1, 1); enddef; -newinternal nottoosmall; nottoosmall := eps/2 + 2epsilon; -newinternal reallysmall; reallysmall := 3epsilon; -def signof (expr X) = if X < 0 : - fi enddef; -def TruncateWarn expr s = GBmsg s & " too large; truncating"; enddef; +def readjustdims (suffix ll, ur) (expr s) = + ll := ll - s*(1,1); + ur := ur + s*(1,1); +enddef; + +newinternal reallysmall; reallysmall := 3epsilon; +newinternal nottoosmall; nottoosmall := eps/2 + 2epsilon; +def signof (expr X) = if X < 0: - fi enddef; +def TruncateWarn expr s = + GBwarn s & " is too large or undefined, so it will be truncated."; +enddef; vardef secd primary X = - save temp; temp := cosd(X); - if abs(temp) < reallysmall : - TruncateWarn "Secant"; + setnumeric (temp) cosd(X); + if abs(temp) < reallysmall: + TruncateWarn "Secant or Tangent"; temp := signof (temp) reallysmall; fi 1/temp @@ -534,17 +666,31 @@ enddef; vardef tand primary X = sind(X)*secd(X) enddef; vardef cscd primary X = - save temp; temp := sind(X); - if abs(temp) < reallysmall : - TruncateWarn "Cosecant"; + setnumeric (temp) sind(X); + if abs(temp) < reallysmall: + TruncateWarn "Cosecant or Cotangent"; temp := signof(temp) reallysmall; fi 1/temp enddef; vardef cotd primary X = cosd(X)*cscd(X) enddef; -vardef acos primary X = angle (X, 1 +-+ X) enddef; -vardef asin primary X = angle (1 +-+ X, X) enddef; +vardef acos primary X = + if abs X > 1: + TruncateWarn "Argument of arccosine"; + angle (signof(X) 1, 0) + else: + angle (X, 1 +-+ X) + fi +enddef; +vardef asin primary X = + if abs X > 1: + TruncateWarn "Argument of arcsine"; + angle (0, signof(X) 1) + else: + angle (1 +-+ X, X) + fi +enddef; vardef atan primary X = angle (1, X) enddef; vardef sin primary X = sind (X*radian) enddef; @@ -554,28 +700,28 @@ vardef cot primary X = cotd (X*radian) enddef; vardef sec primary X = secd (X*radian) enddef; vardef csc primary X = cscd (X*radian) enddef; +vardef degrees (expr t) = t*radian enddef; +vardef radians (expr t) = t/radian enddef; vardef invcos primary X = (acos X)/radian enddef; vardef invsin primary X = (asin X)/radian enddef; vardef invtan primary X = (atan X)/radian enddef; -vardef exp primary X = mexp (256 * X) enddef; -vardef ln primary X = (mlog X) / 256 enddef; -def log = ln enddef; -vardef logbase (expr B) primary X = (mlog X)/(mlog B) enddef; -def logtwo = logbase( 2) enddef; -def logten = logbase(10) enddef; +vardef exp primary X = mexp (256 * X) enddef; +vardef ln primary X = (mlog X) / 256 enddef; +def log = ln enddef; +vardef logbase (expr B) primary X = (mlog X)/(mlog B) enddef; +def logtwo = logbase( 2) enddef; +def logten = logbase(10) enddef; -vardef Arg primary Z = (angle Z)/radian enddef; -vardef Log primary Z = (ln(abs(Z)), Arg (Z)) enddef; -vardef cis primary T = dir(radian*T) enddef; -vardef zexp primary Z = (exp (xpart Z))*(cis(ypart Z)) enddef; -vardef sgn primary Z = - if Z = origin : origin else: unitvector Z fi -enddef; +vardef Arg primary Z = (angle Z)/radian enddef; +vardef Log primary Z = (ln (abs Z), Arg Z) enddef; +vardef cis primary T = dir (T*radian) enddef; +vardef zexp primary Z = (exp (xpart Z)) * cis (ypart Z) enddef; +vardef sgn primary Z = if not (Z = origin): unitvector fi Z enddef; vardef cosh primary X = - save temp; temp := 2 exp (-abs(X)); - if temp < reallysmall : + setnumeric (temp) 2 exp (-abs(X)); + if temp < reallysmall: TruncateWarn "Cosh"; temp := reallysmall; fi @@ -583,8 +729,8 @@ vardef cosh primary X = enddef; vardef sinh primary X = - save temp; temp := 2 exp (-abs(X)); - if temp < reallysmall : + setnumeric (temp) 2 exp (-abs(X)); + if temp < reallysmall: TruncateWarn "Sinh"; temp := reallysmall; fi @@ -592,164 +738,222 @@ vardef sinh primary X = enddef; vardef sech primary X = - save temp; temp := exp(-(abs (X))); + setnumeric (temp) exp(-(abs (X))); 2temp/(1 + temp*temp) enddef; vardef tanh primary X = - save temp; temp := exp(-2(abs (X))); + setnumeric (temp) exp(-2(abs (X))); signof (X) (1 - temp)/(1 + temp) enddef; vardef csch primary X = - save temp; temp := exp(-(abs (X))); - if abs(1 - temp*temp) < reallysmall : + save temp, tempa; temp := exp(-(abs (X))); + tempa := (1 - temp*temp)/2; + if tempa < reallysmall: TruncateWarn "Csch"; - signof (X) 2temp / reallysmall - else: - signof (X) 2temp / (1 - temp*temp) + tempa := reallysmall; fi + signof (X) temp / tempa enddef; vardef coth primary X = - save temp; temp := tanh(X); - if abs(temp) < reallysmall : + setnumeric (temp) tanh(X); + if abs(temp) < reallysmall: TruncateWarn "Coth"; - temp := signof (temp) reallysmall; + temp := signof (X) reallysmall; fi 1/temp enddef; vardef acosh primary y = - if y < 1 : - GBerrmsg ("Undefined function: acosh " & decimal y) - "If you proceed, a value of 0 will be used. " & - "Expect more errors later."; + if y < 1: + TruncateWarn "acosh"; 0 else: - ln (y + (y+-+1)) + ln (y + (y +-+ 1)) fi enddef; -vardef asinh primary y = ln (y + (y++1)) enddef; +vardef asinh primary y = ln (y + (y ++ 1)) enddef; vardef atanh primary y = - if abs (y) < 1 : - (ln(1+y) - ln(1-y))/2 + if abs (y) < 1: + (ln (1 + y) - ln (1 - y))/2 else: - GBerrmsg ("Undefined function: atanh " & decimal y) - "If you proceed, a value of plus or minus infinity " & - "will be used. Expect more errors later."; + TruncateWarn "atanh"; signof (y) infinity fi enddef; -vardef polar (expr p) = (xpart p) * dir (ypart p) enddef; -def id (expr x) = x enddef; +vardef polar primary p = (xpart p) * dir (ypart p) enddef; +def id (expr x) = x enddef; -transform T_stack[]; T_stack := 0; -def T_push (expr T) = T_stack[incr T_stack] := T; enddef; +primarydef x**y = + if y=2: x*x + elseif (x = floor x) and (abs y = floor y): + 1 for n=1 upto y: *x endfor + else: takepower y of x + fi +enddef; +let ^ = **; +transform T_stack[]; +numeric T_stack; T_stack := 0; +def T_push (expr T) = T_stack[incr T_stack] := T; enddef; def T_pop (suffix $) = - if T_stack > 0 : - $ := T_stack[T_stack]; T_stack := T_stack - 1; + if T_stack > 0: + $ := T_stack[T_stack]; + T_stack := T_stack - 1; fi enddef; -def bcoords = hide ( T_push (ztr); T_push (vtr) ) enddef; -def ecoords = hide ( T_pop (vtr); T_pop (ztr) ) enddef; +def bcoords = hide ( T_push (ztr) ) enddef; +def ecoords = hide ( T_pop (ztr); vtr := vectorpart ztr ) enddef; + +vardef vectorpart primary T = T shifted -(origin transformed T) enddef; def apply_t (text Transformer) = ztr := identity Transformer transformed ztr; - vtr := ztr shifted - zconv(origin); + vtr := vectorpart ztr; enddef; -def xslant = slanted enddef; % (x+sy, y). +def xslant = slanted enddef; % (x+sy, y). def yslant primary s = % (x, y+sx). transformed begingroup - save _T; transform _T; - origin transformed _T = origin; - (1, 0) transformed _T = (1, s); - (0, 1) transformed _T = (0, 1); - _T + save T; transform T; + origin transformed T = origin; + (1, 0) transformed T = (1, s); + (0, 1) transformed T = (0, 1); + T endgroup enddef; -def zslant primary p = % (xu+yv, xv+yu), where p = (u, v). +def zslant primary p = % (xu+yv, xv+yu), where p = (u, v). transformed begingroup - save _T; transform _T; - xpart _T = ypart _T = 0; - xxpart _T = yypart _T = xpart p; - xypart _T = yxpart _T = ypart p; - _T + save T; transform T; + xpart T = ypart T = 0; + xxpart T = yypart T = xpart p; + xypart T = yxpart T = ypart p; + T endgroup enddef; -def xyswap = zslant (0, 1) enddef; -def boost primary X = zslant (cosh X, sinh X) enddef; +def xyswap = zslant (0, 1) enddef; +def boost primary X = zslant (cosh X, sinh X) enddef; -vardef rotatedpath (expr p, th) expr f = - f transformed vtr rotatedaround (p transformed vtr, th) - transformed (inverse vtr) +vardef transformedpath (text Transformer) expr f = f Transformer enddef; -vardef scaledpath (expr p, s) expr f = - f shifted -p scaled s shifted p + +def rotatedpath (expr p, th) = + transformedpath ( + transformed vtr + rotatedaround (p transformed vtr, th) + transformed (inverse vtr) + ) enddef; -vardef xslantedpath (expr b, s) expr f = - f shifted (0, -b) slanted s shifted (0, b) +def reflectedpath (expr p, q) = + transformedpath ( + transformed vtr + reflectedabout (p transformed vtr, q transformed vtr) + transformed (inverse vtr) + ) enddef; -def slantedpath = xslantedpath enddef; -vardef yslantedpath (expr a, s) expr f = - f shifted (-a, 0) yslant s shifted (0, a) + +def scaledpath (expr p, s) = + transformedpath (shifted -p scaled s shifted p) enddef; -vardef xscaledpath (expr a, s) expr f = - f shifted (-a, 0) xscaled s shifted (a, 0) +def xscaledpath (expr a, s) = + transformedpath (shifted (-a, 0) xscaled s shifted (a, 0)) enddef; -vardef yscaledpath (expr b, s) expr f = - f shifted (0, -b) yscaled s shifted (0, b) +def yscaledpath (expr b, s) = + transformedpath (shifted (0, -b) yscaled s shifted (0, b)) enddef; -vardef shiftedpath (expr v) expr f = f shifted v enddef; -vardef reflectedpath (expr p, q) expr f = - f transformed vtr - reflectedabout (p transformed vtr, q transformed vtr) - transformed (inverse vtr) + +def slantedpath = xslantedpath enddef; +def xslantedpath (expr b, s) = + transformedpath (shifted (0, -b) slanted s shifted (0, b)) enddef; -vardef xyswappedpath expr f = f xyswap enddef; -vardef transformedpath (text Transformer) expr f = - f Transformer +def yslantedpath (expr a, s) = + transformedpath (shifted (-a, 0) yslant s shifted (0, a)) enddef; +def shiftedpath (expr v) = transformedpath (shifted v) enddef; + +def xyswappedpath = transformedpath (xyswap) enddef; + vardef partialpath (expr a, b) expr f = - save p; path p; - p := zconv (f) scaled (1/unit_of_length); - save cumlen, totlen, idx, ta, tb; - totlen := makelengtharray(cumlen) p; - idx := 0; - if a <= b: - ta := gettime (cumlen, idx) (a*totlen); - tb := gettime (cumlen, idx) (b*totlen); + save flag, flo, fhi, lo, hi, n; + boolean flag; flag = true; + convertpath (g) f; + n := length f; + + flo := snapto emin(a,b); + if flo = 0: + lo := 0; + elseif flo < 1: + setuplengtharray (cum, tot, idx) g; + flag := false; + lo := gettime (cum, idx) (flo*tot); else: - tb := gettime (cumlen, idx) (b*totlen); - ta := gettime (cumlen, idx) (a*totlen); + lo := n; fi - subpath (ta, tb) of f + + fhi := snapto emax (a,b); + if flo = fhi: + hi := lo; + elseif fhi < 1: + if flag: setuplengtharray (cum, tot, idx) g; fi + hi := gettime (cum, idx) (fhi*tot); + else: + hi := n; + fi + + if a > b: reverse fi subpath (lo, hi) of f +enddef; + +vardef gsubpath (expr a, b) expr f = subpath (a, b) of f enddef; + +def setuplengtharray (suffix cum, tot, idx) = + save cum, tot, idx; idx := 0; tot := makelengtharray (cum) +enddef; + +vardef pathtime@# (suffix p) = + if @# <= 0: 0 + elseif @# >= 1: length p + else: + setuplengtharray (cum, tot, idx) p; + gettime (cum, idx) (@#*tot) + fi +enddef; + +vardef pathpoint (expr frac) (suffix p) = + convertpath (_pp) p; pnt[pathtime[frac] (_pp)] (p) enddef; -vardef gsubpath (expr a, b) expr f = subpath (a, b) of f enddef; def coloraddto (expr clr) (suffix u) (expr v) = addto u also v _wc_ clr; enddef; -def orto (suffix u) (expr v) = addto u also v; enddef; +def orto (suffix u) (expr v) = addto u also v; enddef; + +def coloraddon (expr clr) (suffix v) = + addto active_plane also v _wc_ clr; +enddef; + +def _orto (suffix u, v) = + addto u also v; +enddef; vardef interior expr c = - save v; picture v; v := nullpicture; + newpicture (v); addto v contour (c.t_); v enddef; + vardef interiors suffix cc = - save _ints; picture _ints; _ints := nullpicture; + newpicture (_ints); for _idx = 1 upto cc: addto _ints also interior cc[_idx]); endfor @@ -757,28 +961,29 @@ vardef interiors suffix cc = enddef; def clipto (suffix vt) expr c = + if path c: clip vt to c; + fi enddef; def clipsto (suffix vt, cc) = begingroup - save _cl, _cl_; picture _cl, _cl_; _cl_ := nullpicture; + save _cl, _cl_; picture _cl, _cl_; _cl_ := nullpicture; for _idx = 1 upto cc: - _cl := vt; clip _cl to cc[_idx]; addto _cl_ also _cl; + _cl := vt; clip _cl to cc[_idx]; addto _cl_ also _cl; endfor vt := _cl_; endgroup enddef; vardef Clipped (suffix vt) expr c = - save _Cl; picture _Cl; _Cl := vt; clipto (_Cl) c; _Cl + setpicture (_Cl) vt; clipto (_Cl) c; _Cl enddef; -let clipped_ = clipped; -def clipped = Clipped enddef; vardef picneg (suffix vt) expr c = - save _pn; picture _pn; _pn := nullpicture; - addto _pn (interior c) _wc_ fillcolor; - addto _pn also (Clipped (vt) c) _wc_ background; + setpicture (_cl) vt; clip _cl to c; + newpicture (_pn); + addto _pn also (interior c ) _wc_ fillcolor; + addto _pn also _cl _wc_ background; _pn enddef; @@ -789,8 +994,8 @@ enddef; numeric minpenwd; minpenwd := .05bp; % 1 pixel at 1440dpi vardef picpath expr d = - save v; picture v; v := nullpicture; - if penwd >= minpenwd : + newpicture (v); + if penwd >= minpenwd: shpath (v, drawpen) (d); fi v @@ -802,59 +1007,56 @@ def picdot (suffix v) (expr w, p) = enddef; vardef setdot (expr apath, sc) = - if cycle apath : interior - else : picpath + if cycle apath: interior + else: picpath fi - (apath scaled emax(sc, minpenwd)) + (apath scaled emax (sc, minpenwd)) enddef; vardef shaded (expr clr) expr c = - if cycle c : - save v; picture v; - v := nullpicture; + if cycle c: + newpicture (v); addto v contour c _wc_ clr; v - else: picpath c % should we? or just make it null? + else: picpath c % should we? or just make it null? fi enddef; -vardef filledwith (expr pic, dims, ll, ur) = - save b, v; picture b, v; - b := v := nullpicture; +vardef fillwith (suffix v) (expr pic, dims, ll, ur) = + newpicture (b); for s = xpart ll step xpart dims until xpart ur: addto b also pic shifted (s, 0); endfor for s = ypart ll step ypart dims until ypart ur: addto v also b shifted (0, s); endfor - v enddef; -vardef thatchf (suffix v) (expr CT, sp, a, b) = - save _sp; - _sp = signof (ypart(b - a)) abs(sp); - for _y = _sp*( ceiling ((ypart a)/_sp) ) step _sp until ypart b: - shpath (v, hatchpen) - ( ( (xpart a, _y)--(xpart b, _y) ) transformed CT ); - endfor +def thatchf (suffix v) (expr CT, sp, a, b) = + begingroup + setnumeric (_sp) signof (ypart b - ypart a) abs(sp); + for _y = _sp*( ceiling ((ypart a)/_sp) ) step _sp until ypart b: + shpath (v, hatchpen) + ( ( (xpart a, _y)--(xpart b, _y) ) transformed CT ); + endfor + endgroup enddef; def tile (suffix atile) (expr unit, width, height, clipit) = - picture atile.pic; atile.pic := nullpicture; - numeric atile.wd, atile.ht; - (atile.wd, atile.ht) = (width, height)*unit; - boolean atile.clipon; atile.clipon := clipit; + picture atile.pic; atile.pic := nullpicture; + pair atile.dims; + atile.dims := (width, height)*unit; begingroup save active_plane; - def active_plane = atile.pic enddef; - save ztr, vtr; transform ztr, vtr; - ztr := identity scaled unit; vtr := ztr; - save ClipOn; boolean ClipOn; - if clipit : + def active_plane = atile.pic enddef; + save ztr, vtr; transform ztr, vtr; + ztr := identity scaled unit; vtr := ztr; + save xneg, xpos, yneg, ypos; + xneg := 0; xpos := width; yneg := 0; ypos := height; + save ClipOn; boolean ClipOn; + if clipit: ClipOn := true; - save ClipPath; path ClipPath[]; - ClipPath = 1; - ClipPath[1] = rect(origin, (atile.wd, atile.ht)); + setarray (path) (ClipPath) (rect(origin, atile.dims)); else: ClipOn := false; fi @@ -865,88 +1067,173 @@ def endtile = enddef; vardef is_tile (suffix atile) = - (known atile.pic ) and (picture atile.pic ) and - (known atile.wd ) and (numeric atile.wd ) and - (known atile.ht ) and (numeric atile.ht ) and - (known atile.clipon) and (boolean atile.clipon) + (known atile.pic ) and (picture atile.pic) and + (known atile.dims) and (pair atile.dims ) enddef; -vardef pnt@# (expr p) = point @# of p enddef; -vardef pre@# (expr p) = precontrol @# of p enddef; -vardef post@# (expr p) = postcontrol @# of p enddef; +vardef pnt@# (expr p) = point @# of p enddef; +vardef pre@# (expr p) = precontrol @# of p enddef; +vardef post@# (expr p) = postcontrol @# of p enddef; -vardef gbbox (expr g) (suffix ll, ur) = - ll := llcorner g; ur := urcorner g; - if showbbox : noclip ( safedraw rect (ll, ur) ); fi +def getbbox (suffix ll, ur) expr g = + ll := llcorner g; ur := urcorner g; + if showbbox: noclip ( safedraw rect (ll, ur) ); fi enddef; -def safedraw = colorsafedraw (drawcolor) enddef; -vardef colorsafedraw (expr clr) expr d = - save v; picture v; v := picpath d; - DoClip (v); - coloraddto (clr) (active_plane, v); +def safedraw = colorsafedraw (drawcolor) enddef; +def colorsafedraw (expr clr) expr d = + begingroup + setpicture (v) picpath d; + DoClip (v); coloraddon (clr, v); + endgroup enddef; -def NoCycleWarn expr s = - GBmsg s & " cannot be applied to an open path. " - & "The path will be drawn instead."; +def NoCycle (expr s) expr p = + GBwarn s & " cannot be applied to an open path." + & " The path will be drawn instead."; + safedraw p; enddef; -def safefill = colorsafefill (fillcolor) enddef; +def safefill = colorsafefill (fillcolor) enddef; vardef colorsafefill (expr clr) expr c = - if cycle c : - save v; picture v; v := interior c; + if cycle c: + setpicture (v) interior c; DoClip (v); - coloraddto (clr) (active_plane, v); - else: NoCycleWarn "fill"; safedraw c; + coloraddon (clr, v); + else: NoCycle("fill") c; fi enddef; def safeunfill expr c = - if cycle c : noclip (colorsafefill (background) c); - else: NoCycleWarn "unfill"; safedraw c; + if cycle c: noclip (colorsafefill (background) c); + else: NoCycle("unfill") c; fi enddef; def safeclip expr c = - if cycle c : clipto (active_plane) c; - else: NoCycleWarn "clip"; safedraw c; + if cycle c: clipto (active_plane) c; + else: NoCycle("clip") c; fi enddef; def store (suffix fs) expr f = -hide( - if (not path f) and (not pair f) : - GBerrmsg ("Second argument to `store' must be a path or pair") - ""; +hide ( + if (not path f) and (not pair f): + GBerrmsg ("improper expression type.") + "The second argument to `store' must be a path or pair."; fi - if not path fs : path fs; fi + if not path fs: path fs; fi fs := f ) enddef; -vardef stored (suffix fs) expr f = store (fs) f; f enddef; +vardef stored (suffix fs) expr f = store (fs) f; f enddef; -def drawn = colordrawn (drawcolor) enddef; +def drawn = colordrawn (drawcolor) enddef; vardef colordrawn (expr clr) expr f = - colorsafedraw (clr) (zconv (f)); f + colorsafedraw (clr) (zconv (f)); f +enddef; + +def zigzag = colorzigzag (drawcolor) enddef; +def colorzigzag (expr clr) = colorwiggle (false, clr, 0) enddef; +def sinewave = colorsinewave (drawcolor) enddef; +def colorsinewave = colorwiggle (true) enddef; + +vardef colorwiggle (expr smth, clr, tens, blen, elen, len, wid) expr f = + convertpath (g) f; + setuplengtharray (cumlen, totlen, ct) g; + save B; + if cycle f: + B := 0; + else: + B := abs(blen)/_rescale_factor; + totlen := totlen - B - abs(elen)/_rescale_factor; + fi + setnumeric (n) 2*round (totlen/len*_rescale_factor); + if n < 2: + colorsafedraw (clr) g; + else: + save T, U, X, Y, Z, p; + pair U, X, Y, Z; path p; + T := if cycle f: 0 else: gettime (cumlen, ct) (B) fi; + Z := pnt[T] (g); + p :=if not cycle f: (subpath (0,T) of g) + if smth: {curl 0} ..tension tens.. else: -- fi + fi + for i = 1 upto n: + hide( + T := gettime (cumlen, ct) (B+(i/n)*totlen); + X := Z; Z := pnt[T] (g); + Y := .5[X,Z]; U := sgn (Z-X); + ) + (Y + (U zscaled (0, if even i: - fi wid))) + if smth: {U}..tension tens.. else: -- fi + endfor + if cycle f: cycle + else: if smth: {curl 0} fi (subpath (T, length g) of g) + fi; + newpicture (v); + shpath (v, drawpen) (p); + DoClip(v); coloraddon (clr, v); + fi + f enddef; -def filled = colorfilled (fillcolor) enddef; +def corkscrew = colorcorkscrew (drawcolor) enddef; +vardef colorcorkscrew (expr clr, tens, blen, elen, len, wid) expr f = + convertpath (g) f; + setuplengtharray (cumlen, totlen, ct) g; + save B; + if cycle f: + B := 0; + else: + B := abs(blen)/_rescale_factor; + totlen := totlen - B - abs(elen)/_rescale_factor; + fi + setnumeric (n) round (totlen/len*_rescale_factor); + if n < 2: + colorsafedraw (clr) g; + else: + save T, U, X, Y, Z, p; + pair U, X, Y, Z; path p; + T := if cycle f: 0 else: gettime (cumlen, ct) (B) fi; + Z := pnt[T] (g); + p :=if (not cycle f) and (B > 0): (subpath (0,T) of g)-- fi + for i = 1 upto n: + hide( + T := gettime (cumlen, ct) (B+(i/n)*totlen); + X := Z; Z := pnt[T] (g); + Y := .5[X,Z]; U := sgn (Z-X); + ) + (X + (U zscaled (0,-wid))){ U}..tension tens.. + (Y + (U zscaled (0, wid))){-U}..tension tens.. + endfor + if cycle f: cycle + else: + {U}(Z + (U zscaled (0,-wid))) + if elen <> 0: --(subpath(T, length g) of g) fi + fi; + newpicture (v); + shpath (v, drawpen) (p); + DoClip(v); coloraddon (clr, v); + fi + f +enddef; + +def filled = colorfilled (fillcolor) enddef; vardef colorfilled (expr clr) expr c = - colorsafefill (clr) zconv (c); c + colorsafefill (clr) zconv (c); c enddef; -vardef unfilled expr c = safeunfill zconv (c); c enddef; -vardef Clip expr c = safeclip zconv(c); c enddef; +vardef unfilled expr c = safeunfill zconv (c); c enddef; +vardef Clip expr c = safeclip zconv (c); c enddef; -numeric shadewd; shadewd := 0.5bp; +numeric shadewd; shadewd := 0.5bp; path shadedotpath; -shadedotpath := fullcircle; % unitsquare; +shadedotpath := fullcircle; vardef shade (expr sp) expr f = - save g; path g; g := zconv (f); - save gr; numeric gr; - gr := 1 - (.88*abs(shadewd)/sp)**2; - if not cycle g : NoCycleWarn "shade"; safedraw g; - elseif gr <= 0 : safefill g; + convertpath (g) f; + setnumeric (gr) 1 - (.88*abs(shadewd)/sp)**2; + if not cycle g: NoCycle("shade") g; + elseif gr <= 0: safefill g; else: colorsafefill (gr*white) g; fi @@ -955,647 +1242,407 @@ enddef; polkadotwd := 5bp; mindotspace := 1bp; -path polkadotpath; polkadotpath := fullcircle; +path polkadotpath; polkadotpath := fullcircle; vardef polkadot (expr sp) expr f = - save g; path g; g := zconv (f); - if not cycle g : NoCycleWarn "polkadot"; safedraw g; - elseif sp <= emax (2*polkadotwd/3, mindotspace) : + convertpath (g) f; + if not cycle g: NoCycle("polkadot") g; + elseif sp <= emax (2*polkadotwd/3, mindotspace): safefill g; else: - save ll, ur; pair ll, ur; - gbbox (g, ll, ur); - save dx, dy; dx := sp/2; dy := dx*(sqrt 3); - hshift := ((xpart (ur - ll)) mod dx)/2; - vshift := ((ypart (ur - ll)) mod dy)/2; - save p, dims; pair p, dims; - p := ll + (hshift, vshift); + setbbox (ll, ur) g; + save dx, dy, dshift; pair dshift; + dx := sp/2; dy := dx*sqrt 3; + dshift := (xpart(ur - ll) mod dx, ypart (ur - ll) mod dy)/2; + save p, dims; pair p, dims; + p := ll + dshift; dims := 2(dx, dy); - save v, thepolkadot; picture v, thepolkadot; - thepolkadot := setdot (polkadotpath, polkadotwd); - v := filledwith (thepolkadot, dims, p, ur); - p := p + (dx, dy); - orto (v, filledwith (thepolkadot, dims, p, ur)); - DoClip (v); clipto (v) g; - coloraddto (fillcolor) (active_plane) (v); + setpicture (thepolkadot) setdot (polkadotpath, polkadotwd); + newpicture (v); + fillwith (v) (thepolkadot, dims, p, ur); + fillwith (v) (thepolkadot, dims, p + (dx, dy), ur); + DoClip (v); clipto (v) g; + coloraddon (fillcolor, v); fi f enddef; -def thatch = colorthatch (hatchcolor) enddef; +def thatch = colorthatch (hatchcolor) enddef; vardef colorthatch (expr clr) (expr sp, theta) expr f = - save g; path g; g := zconv (f); - if not cycle g : NoCycleWarn "hatch"; safedraw g; - elseif sp <= abs(hatchwd) : colorsafefill (clr) g; + convertpath (g) f; + if not cycle g: NoCycle("hatch") g; + elseif sp <= abs(hatchwd): colorsafefill (clr) g; else: - save v; picture v; v := nullpicture; - save CT; transform CT; CT := identity rotated theta; - save ll, ur; pair ll, ur; - gbbox (g transformed inverse CT, ll, ur); - thatchf (v, CT, sp, ll, ur); - DoClip(v); - coloraddto (clr) (active_plane) (Clipped (v) g); + newpicture (v); + setbbox (ll, ur) g rotated -theta; + thatchf (v, identity rotated theta, sp, ll, ur); + DoClip (v); clipto (v) (g); + coloraddon (clr, v); fi f enddef; -def hhatch (expr sp) = thatch (sp, 0) enddef; -def vhatch (expr sp) = thatch (sp, 90) enddef; -def lhatch (expr sp) = thatch (sp, -45) enddef; -def rhatch (expr sp) = thatch (sp, 45) enddef; +def hhatch (expr sp) = thatch (sp, 0) enddef; +def vhatch (expr sp) = thatch (sp, 90) enddef; +def lhatch (expr sp) = thatch (sp, -45) enddef; +def rhatch (expr sp) = thatch (sp, 45) enddef; -def xhatch = colorxhatch (hatchcolor) enddef; -vardef colorxhatch (expr clr, sp) expr f = - colorthatch (clr) (sp, 45) colorthatch (clr) (sp, -45) f +def xhatch = colorxhatch (hatchcolor) enddef; +def colorxhatch (expr clr, sp) = + colorthatch (clr) (sp, 45) colorthatch (clr) (sp, -45) enddef; +vardef NoTile (suffix atile) expr g = + GBwarn str atile & " is not a valid tile for tess()." + & " The path will be drawn instead."; + safedraw g; +enddef; vardef tess (suffix atile) expr c = - save _g; path _g; _g := zconv (c); - if not is_tile (atile) : - GBerrmsg ("Tile parameter " & str atile & " of tess() is invalid") - "This tile may be undefined or incorrectly defined. " & - "If you proceed, tess() will be abandoned and the curve " & - "merely drawn."; safedraw _g; - elseif not cycle _g : NoCycleWarn "tess"; safedraw _g; + convertpath (_g) c; + if not cycle _g: NoCycle("tess") _g; + elseif not is_tile (atile): NoTile (atile) _g; else: - save _ll, _ur; pair _ll, _ur; - gbbox (_g, _ll, _ur); - save _ts; picture _ts; - _ts := filledwith (atile.pic, (atile.wd, atile.ht), _ll, _ur); - DoClip (_ts); - orto (active_plane, Clipped (_ts) _g); + setbbox (_ll, _ur) _g; + newpicture (_ts); + fillwith (_ts) (atile.pic, atile.dims, _ll, _ur); + DoClip (_ts); clipto (_ts) _g; + _orto (active_plane, _ts); fi c enddef; -if unknown segment_split : segment_split := 8; fi -if unknown dashsize : dashsize := 3bp; fi -if unknown dashgap : dashgap := dashsize + 2penwd; fi -if unknown dash_finish : dash_finish := .5; fi -if unknown dash_start : dash_start := .5; fi -if unknown unit_of_length : unit_of_length := 0.1in; fi +if unknown segment_split: segment_split := 8; fi +if unknown dashsize: dashsize := 3bp; fi +if unknown dashgap: dashgap := dashsize + 2penwd; fi +if unknown dash_finish: dash_finish := .5; fi +if unknown dash_start: dash_start := .5; fi +if unknown _rescale_factor: _rescale_factor := 0.1in; fi +numeric last_dot_size; last_dot_size := 0; vardef gendashed (suffix pat) expr f = - save _g; path _g; _g := zconv(f); - if (unknown pat.rep) : % no "pattern" - GBmsg "Dash pattern " & str pat & " undefined. " & - "Path will be drawn instead."; + convertpath (_g) f; + save _dpat; + if not mkdasharrays (pat) (_dpat): + GBwarn "Dash pattern " & str pat + & " undefined. Path will be drawn instead."; safedraw _g; - elseif pat.rep < 2 : % no "spaces" + elseif _dpat.rep < 2: safedraw _g; else: - save _dl, _tmppat; - forsuffixes _s = start, rep, finish : - _dl._s := 0; _tmppat._s := pat._s; - for i = 1 upto pat._s : - _tmppat._s[i] := pat._s[i]/unit_of_length; - _dl._s := _dl._s + _tmppat._s[i]; + save _dl; + forsuffixes _s = start, rep, finish: + _dl._s := 0; + for i = 1 upto _dpat._s: + _dpat._s[i] := _dpat._s[i]/_rescale_factor; + _dl._s := _dl._s + _dpat._s[i]; endfor endfor - if _dl.rep = 0 : - GBmsg "Dash pattern " & str pat & " has length 0. " & - "Path will be drawn instead."; + + if _dl.rep = 0: + GBwarn "Dash pattern " & str pat & " has length 0. " + & "Path will be drawn instead."; safedraw _g; else: - save _p; path _p; - _p := _g scaled (1/unit_of_length); - save _cumlen, _totlen, _n, _sf; - _totlen := makelengtharray(_cumlen) _p; - _sf := scale_adjust (_n, _dl)(_totlen); - if _n < 0 : safedraw _g; + setuplengtharray (_cumlen, _totlen, _ct) _g; + save _n, _sf, _no_dots; + boolean _no_dots; _no_dots := true; + _sf := scale_adjust (_n, _dl) (_totlen); + if _n < 0: safedraw _g; else: - forsuffixes _s = start, rep, finish : - for _i = 1 upto _tmppat._s : - _tmppat._s[_i] := _tmppat._s[_i]*_sf; + forsuffixes _s = start, rep, finish: + for _i = 1 upto _dpat._s: + if (_dpat._s[_i] = 0) and _no_dots: _no_dots := false; + else: _dpat._s[_i] := _dpat._s[_i]*_sf; + fi endfor _dl._s := _dl._s*_sf; endfor - save dashingdot; picture dashingdot; - if known plot_pic : dashingdot := makesymbol(plot_pic, penwd); - else: dashingdot := makesymbol(dotpath, penwd); + if _no_dots: + else: + if unknown plot_pic: + save plot_pic; path plot_pic; + plot_pic := dotpath; + fi; + last_dot_size := + if known plot_pic.size: plot_pic.size else: penwd fi; + setpicture (dashingdot) makesymbol (plot_pic, last_dot_size); fi - save _ct, _t, _d, _v; - picture _v; _v := nullpicture; - _ct := 0; - % Begin with pat.start - _d0 := 0; _t0 := 0; - dashit (_tmppat.start) (_v); - % then pat.rep - if _n > 0 : - save _m; _m := ceiling sqrt(_n); - for _j = 0 step _m until _n - 1 : - for _i = 0 upto _m - 1 : + save _t, _d, _v; + picture _v; _v := nullpicture; + _d0 := 0; _t0 := 0; + dashit (_dpat.start) (_v); + + if _n > 0: + save _m; _m := ceiling sqrt(_n); + for _j = 0 step _m until _n - 1: + for _i = 0 upto _m - 1: exitif (_i + _j) > _n - 1; _d0 := _dl.start + (_j + _i)*_dl.rep; - _t0 := gettime(_cumlen, _ct) (_d0); - dashit (_tmppat.rep) (_v); + _t0 := gettime (_cumlen, _ct) (_d0); + dashit (_dpat.rep) (_v); endfor - % add _m patterns and reset. - DoClip(_v); - coloraddto (drawcolor) (active_plane, _v); + DoClip (_v); + coloraddon (drawcolor, _v); _v := nullpicture; endfor fi - % and finally, pat.finish + _d0 := _totlen - _dl.finish; - _t0 := gettime(_cumlen, _ct) (_d0); - dashit (_tmppat.finish) (_v); - DoClip(_v); - coloraddto (drawcolor) (active_plane, _v); + _t0 := gettime (_cumlen, _ct) (_d0); + dashit (_dpat.finish) (_v); + DoClip (_v); + coloraddon (drawcolor, _v); fi fi fi f enddef; -vardef makelengtharray (suffix clen) expr p = - save _s; _s := emax (1, ceiling segment_split); - clen := _s*length p; clen[0] := 0; - for _i = 1 upto clen : - clen[_i] := clen[_i-1] + abs (pnt[_i/_s] (p) - pnt[(_i-1)/_s] (p)); +vardef makelengtharray (suffix clen) suffix p = + setsplit (_s) segment_split; + numeric clen[]; + clen := _s * length p; clen0 := 0; + for _i = 1 upto clen: + clen[_i] := clen[_i-1] + abs (pnt[_i/_s] (p) - pnt[(_i-1)/_s] (p)) / + _rescale_factor; endfor clen[clen] enddef; vardef scale_adjust (suffix n, pl) (expr lngth) = n := (lngth - pl.start - pl.finish)/pl.rep; - n := if n < 0 : -1 else: round(n) fi; - lngth/(pl.start + emax(n, 0)*pl.rep + pl.finish) + n := if n < 0: -1 else: round(n) fi; + lngth/(pl.start + emax (n, 0)*pl.rep + pl.finish) enddef; vardef gettime (suffix arr, ct) (expr lngth) = - save _gtl, _s; - _s := emax(1, ceiling segment_split); - _gtl := emax (arr[ct], emin (arr[arr], lngth)); - forever: - exitif ( (arr[ct] <= _gtl) and (_gtl <= arr[ct+1]) ); - ct := ct + 1; % need to exit *before* incrementing + setnumeric (_gtl) emax (arr[ct], emin (arr[arr], lngth)); + setsplit (_s) segment_split; + forever: exitif ( (arr[ct] <= _gtl) and (_gtl <= arr[ct+1]) ); + next ct; endfor - if arr[ct] = arr[ct+1] : ct - else: ( ct + (_gtl - arr[ct]) / (arr[ct+1] - arr[ct]) ) - fi /_s + if arr[ct] = arr[ct+1]: ct + else: ( ct + (_gtl - arr[ct]) / (arr[ct+1] - arr[ct]) ) + fi /_s enddef; +def next suffix X = X := X + 1; enddef; + def dashit (suffix pos) (suffix pic) = for _k = 1 upto pos: - if odd _k : % draw a dash of length pos[_k] - if pos[_k] = 0 : % point required - _d1 := _d0; _t1 := _t0; + if odd _k: + if pos[_k] = 0: + _d1 := _d0; _t1 := _t0; picdot (pic, dashingdot, pnt [_t0] (_g)); else: _d1 := _d0 + pos[_k]; _t1 := gettime (_cumlen, _ct) (_d1); shpath (pic, drawpen) (subpath (_t0, _t1) of _g); fi - else: % find the start of the next dash: + else: _d0 := _d1 + pos[_k]; - _t0 := gettime(_cumlen, _ct) (_d0); + _t0 := gettime (_cumlen, _ct) (_d0); fi endfor enddef; def dashpat (suffix pat) (text t) = - pat.rep := 0; - for _itm = t: - pat.rep[incr pat.rep] := _itm; - endfor; - if odd (pat.rep) and (pat.rep > 1): - pat.rep[incr pat.rep] := 0; - fi - pat.start := 1; - pat.start[1] := pat.rep[1]*dash_start; - for _idx = 2 upto pat.rep : - pat.start[incr pat.start] := pat.rep[_idx]; + list (pat) (t); + if (pat = 0) or (odd (pat) and (pat > 1)): + pat[incr pat] := 0; + fi +enddef; + +vardef mkdasharrays (suffix src, dest) = + save _bad; boolean _bad; _bad := false; + forsuffixes _s = start, rep, finish: + numeric dest._s, dest._s[]; + boolean _bad._s; + if knownnumericarray src._s: + copyarray (src._s) (dest._s); + _bad._s := false; + else: + _bad := _bad._s := true; + fi endfor - pat.finish := 1; - pat.finish[1] := pat.rep[1]*dash_finish; + % _bad = one of the three arrays not copied. + if _bad: + if knownnumericarray src: _bad := false; + if _bad.rep: % make dest.rep = src + copyarray (src) (dest.rep); + fi + if _bad.start: % shrink first dash to get dest.start + copyarray (src) (dest.start); + dest.start1 := dash_start*src1; + fi + if _bad.finish: % use partial first dash for dest.finish + dest.finish := 1; + dest.finish1 := dash_finish*src1; + fi + fi + fi + not _bad enddef; -vardef DASHED (expr dlen, dgap) expr f = - save dashes; dashpat (dashes) (dlen, dgap); +vardef Dashed (expr dlen, dgap) expr f = + save dashes; dashpat (dashes) (dlen, dgap); gendashed (dashes) f enddef; -let dashed_ = dashed; -def dashed = DASHED enddef; +def DASHED = Dashed enddef; vardef doplot (expr spath, sc, dgap) expr f = - save dots; dashpat (dots) (0, dgap); - save plot_pic; picture plot_pic; - plot_pic := makesymbol (spath, sc); + save dots; dashpat (dots) (0, dgap); + setpicture (plot_pic) makesymbol (spath, sc); + plot_pic.size := sc; gendashed (dots) f enddef; -path dotpath; dotpath := fullcircle; -vardef dotted (expr dsize, dgap) expr f = - doplot (dotpath, dsize, dgap) f -enddef; +path dotpath; dotpath := fullcircle; +def dotted = doplot (dotpath) enddef; vardef plotnodes (expr symbol, size) expr f = - save _pln; pair _pln[]; - _pln := 0; - for _a = 0 upto (length f) if cycle f : - 1 fi : - _pln[incr _pln] := pnt[_a] (f); - endfor - dosymbols (drawcolor, symbol, size) (_pln); - f -enddef; - -vardef centerit (expr pic) = - pic shifted -(0.5[urcorner pic, llcorner pic]); -enddef; - -vardef makesymbol (expr spath, sc) = - if path spath : setdot (spath, sc) - elseif picture spath : - spath - elseif string spath : - spath infont defaultfont scaled defaultscale - else: - GBmsg "Undefined symbol for plotting, using dotpath instead."; - setdot (dotpath, sc) + if size > 0: + save pln; pair pln[]; + pln := 0; + for _a = 0 upto (length f) if cycle f: - 1 fi: + pln[incr pln] := pnt[_a] (f); + endfor + dosymbols (drawcolor, symbol, size) (pln); fi + f enddef; -path Triangle, Square, Circle, Diamond, Star, Plus, Cross, - Asterisk, SolidTriangle, SolidSquare, SolidCircle, - SolidDiamond, SolidStar; - -Triangle := (for n = 0 upto 2: - (up rotated 120n)-- endfor up) scaled .78; -SolidTriangle := Triangle & cycle; - -Square := (for n = 0 upto 3: - dir (90n + 45)-- endfor dir 45) scaled .63; -SolidSquare := Square & cycle; - -Circle := halfcircle & halfcircle rotated 180; -SolidCircle := Circle & cycle; - -Diamond := (Square rotated 45) xscaled (1/1.2) yscaled 1.2; -SolidDiamond := Diamond & cycle; - -Plus := (origin for n = 0 upto 3: - --(up rotated 90n)--origin endfor) scaled .65; -Cross := Plus rotated 45; -Asterisk := (origin for n = 0 upto 5: - --(up rotated 60n)--origin endfor) scaled .6; - -pair zz; -zz = (whatever)[up, up rotated 144]; -zz = (whatever)[up rotated 72, up rotated -72]; -Star := (for n = 0 upto 4: - (up rotated 72n)--(zz rotated 72n)-- endfor up) scaled .84; -SolidStar := Star & cycle; -save zz; - -numeric dashtype; -forsuffixes s = start, rep, finish : - numeric dashtype[].s, dashtype[].s[]; -endfor -def defaultdashes = - dashpat (dashtype0) (0); % solid - dashpat (dashtype1) (3bp, 4bp); % dashed - dashpat (dashtype2) (0, 4bp); % dotted - dashpat (dashtype3) (0, 4bp, 3bp, 4bp); % dot-dash - dashpat (dashtype4) (0, 4bp, 3bp, 4bp, 0, 4bp);% dot-dash-dot - dashpat (dashtype5) (0, 4bp, 3bp, 4bp, 3bp, 4bp);% dot-dash-dash - dashtype := 6; -enddef; -defaultdashes; - -vardef isdashpat suffix pat = - (knownarray pat.start) and - (knownarray pat.finish) and - (knownarray pat.rep) -enddef; - -def setdatadashes (text lst) = - save dashtype; dashtype := 0; - forsuffixes _itm = lst : - if isdashpat _itm : - forsuffixes _s = start, rep, finish : - copyarray (_itm._s, dashtype[dashtype]._s); - endfor - dashtype := dashtype + 1; - else: GBmsg "Improper dash pattern in setdatadashes."; - fi +def showcontrols = colorshowcontrols (pointcolor) enddef; +vardef colorshowcontrols (expr clr, syma, symb, size) expr f = + save shpre, shpost; + pair shpre[], shpost[]; + shpre := 0; shpost := 0; + for a = 0 upto (length f) if cycle f: - 1 fi: + shpre [incr shpre] := pre [a] (f); + shpost[incr shpost] := post[a] (f); + colorsafedraw (clr) + (zconv (shpre[shpre]--pnt[a](f)--shpost[shpost])); endfor - if dashtype = 0 : - SetdataWarn "dashes"; - defaultdashes; + if size > 0: + if not numeric syma: dosymbols (clr, syma, size) (shpre) ; fi + if not numeric symb: dosymbols (clr, symb, size) (shpost); fi fi -enddef; -def getdashpat expr n = dashtype[n mod dashtype] enddef; - -def SetdataWarn expr s = - GBmsg "Command setdata"& s &"() failed; using defaults." + f enddef; -def setdatasymbols (text lst) = - save pointtype; path pointtype[]; pointtype := 0; - for _itm = lst : - if (known _itm) and (path _itm): - pointtype[pointtype] := _itm; - pointtype := pointtype + 1; - else: - GBmsg "Improper path in setdatasymbols()."; - fi - endfor - if pointtype = 0: - SetdataWarn "symbols"; - defaultsymbols; - fi +def doubledraw = colordoubledraw (drawcolor) enddef; +vardef colordoubledraw (expr clr, sep) expr f = + convertpath (g) f; + colorsafedraw (clr) (parapath ( sep/2) g); + colorsafedraw (clr) (parapath (-sep/2) g); + f enddef; -def getsymbol expr n := pointtype[n mod pointtype] enddef; -numeric pointtype; path pointtype[]; -def defaultsymbols = - pointtype0 := Circle; - pointtype1 := Cross; - pointtype2 := SolidDiamond; - pointtype3 := Square; - pointtype4 := Plus; - pointtype5 := Triangle; - pointtype6 := SolidCircle; - pointtype7 := Star; - pointtype8 := SolidTriangle; - pointtype := 9; +vardef centerit (expr pic) = + pic shifted -(0.5[urcorner pic, llcorner pic]) enddef; -defaultsymbols; -def setdatacolors (text lst) = - save colortype; color colortype[]; colortype := 0; - for _itm = lst : - if (known _itm) and (color _itm) : - colortype[colortype] := _itm; - colortype := colortype + 1; - else: GBmsg "Improper color in setdatacolors()."; - fi - endfor - if colortype = 0 : - SetdataWarm "colors"; - defaultcolors; +vardef makesymbol (expr spath, sc) = + if picture spath : + spath + elseif path spath: setdot (spath, sc) + elseif string spath: + spath infont defaultfont scaled defaultscale + else: + GBwarn "Undefined symbol for plotting, " + & "dotpath will be used instead."; + setdot (dotpath, sc) fi enddef; -def getcolor expr n = colortype[n mod colortype] enddef; - -numeric colortype; color colortype[]; -def defaultcolors = - colortype0 := black; - colortype1 := red; - colortype2 := 0.80blue + .2white; % blue - colortype3 := 0.66yellow + .34red; % orange - colortype4 := 0.80green; % green - colortype5 := 0.85magenta; % magenta - colortype6 := 0.85cyan; % cyan - colortype7 := 0.85yellow; % yellow - colortype := 8; -enddef; -defaultcolors; vardef bpoint (expr ptwd, b) = fullcircle scaled ptwd shifted b enddef; + def pointd (expr ptwd, filled) (text t) = - if filled : + if filled: plotsymbol (SolidCircle, ptwd) (t); - else : + else: begingroup; - save clearsymbols; boolean clearsymbols; clearsymbols := true; + setboolean (clearsymbols) true; plotsymbol (Circle, ptwd) (t); endgroup fi enddef; -boolean clearsymbols; clearsymbols := false; +boolean clearsymbols; clearsymbols := false; vardef clearable (expr pth) = - false - if path pth : - if (not cycle pth) and (length pth > 0): - if ( pnt0 (pth) = pnt[length pth] (pth) ) : - or true - fi fi fi -enddef; - -def plotsymbol = colorplotsymbol (pointcolor) enddef; -vardef colorplotsymbol (expr clr, spath, sc) (text t) = - save _cpls; - textpairs (_cpls) (t); - dosymbols (clr, spath, sc) (_cpls); -enddef; - -vardef dosymbols (expr clr, spath, sc) (suffix arr) = - save one_symbol, _pls; picture one_symbol, _pls; - if clearsymbols and clearable (spath): - addsymbols (background, spath&cycle, sc) (arr); + if path pth: + ( pnt0 (pth) = pnt[length pth] (pth) ) and (not cycle pth) + and (length pth > 0) + else: false fi - addsymbols (clr, spath, sc) (arr); enddef; -def addsymbols (expr clr, spath, sc) (suffix arr) = - one_symbol := makesymbol (spath, sc); - _pls := nullpicture; - for _idx = 1 upto arr: - picdot (_pls, one_symbol, zconv(arr[_idx])); - endfor - DoClip (_pls); - coloraddto (clr) (active_plane) (_pls); -enddef; - -vardef lclosed expr f = f if not cycle f : --cycle fi enddef; - -numeric default_tension; -default_tension := 1; - -def sclosed = sclosedt (default_tension) enddef; -vardef sclosedt (expr t) expr f = - if cycle f : f - else: save n; n := length f; - if n = 0 : f&cycle - elseif n = 1 : f..tension t..cycle - else : - (pnt0 (f)) { (pnt1(f)) - (pnt[n] (f)) }..tension t - ..(subpath (1, n-1) of f)..tension t - ..(pnt[n](f)) { pnt0(f) - pnt[n-1](f) } - ..tension t..cycle - fi - fi +def clearopenpath expr f = + if clearable (f): safeunfill f & cycle; fi enddef; -def bclosed = bclosedt (default_tension) enddef; -vardef bclosedt (expr t) expr f = - f if not cycle f : ..tension t..cycle fi -enddef; - -def uclosed = bclosed enddef; - -def bsplinecontrols (suffix b) expr f = - b := 4; - b1 := 2[pre 1(f), post0(f)]; - b2 := 2[post0(f), pnt 0(f)]; - b3 := 2[b1, b2]; - b4 := 2[b2, b3]; -enddef; - -vardef cbclosed expr f = - if cycle f : f - elseif (length f)=0 : f&cycle - else: - save p, q; pair p[], q[]; - bsplinecontrols (p) f; % defines p1 to p4 - bsplinecontrols (q) reverse f; % defines q1 to q4 - f..controls q2 and q3..opencbs (q1,q4,p4,p1) - ..controls p3 and p2..cycle +def plotsymbol = colorplotsymbol (pointcolor) enddef; +def colorplotsymbol (expr clr, spath, sc) (text t) = + if sc > 0: + begingroup + setpairs (_cpls) (t); + if _cpls > 0: dosymbols (clr, spath, sc) (_cpls); fi + endgroup fi enddef; -vardef qbclosed expr f = - if cycle f : f - else: save n; n := length f; - if n = 0 : f&cycle - else: - save p; pair p[]; p := 4; - p1 := (3/2)[pnt[n](f), pre[n](f)]; - p2 := 2[p1, pnt[n](f)]; - p4 := (3/2)[pnt 0 (f), post0 (f)]; - p3 := 2[p4, pnt 0 (f)]; - f & mkqbs (p) & cycle - fi +def dosymbols (expr clr, spath, sc) (suffix arr) = + if clearsymbols and clearable (spath): + addsymbols (background, makesymbol (spath&cycle, sc)) (arr); fi + addsymbols (clr, makesymbol (spath, sc)) (arr); enddef; -vardef makesector expr p = - (pathcenter p)--p--cycle -enddef; - -vardef cutoffbefore (expr b) expr f = - save w, t, u, n; n:= length f; - pair w; - for k = 1 upto n : - w := (subpath (0,k) of f) intersectiontimes b; - exitif w > left; +def addsymbols (expr clr, symb) (suffix arr) = + newpicture (_pls); + for _idx = 1 upto arr: + picdot (_pls, symb, zconv (arr[_idx])); endfor - if debug : - GBdebug; - >> "Intersectiontimes:"; - show w; - GBenddebug; - fi - t := xpart w; - if t < 0: - cuttings := pnt0 (f); - f - else: - cuttings := subpath (0,t) of f; - subpath (t, n) of f - fi + DoClip (_pls); coloraddon (clr, _pls); enddef; -vardef cutoffafter (expr b) expr f = - save g; path g; - g := cutoffbefore (b) reverse f; - cuttings := reverse cuttings; - reverse g -enddef; - -vardef trimmedpath (expr btrim, etrim) expr f = - save g, h; path g, h; - g := invvconv (fullcircle scaled 2btrim) shifted pnt0(f); - h := invvconv (fullcircle scaled 2etrim) shifted pnt[length f] (f); - cutoffafter (h) cutoffbefore (g) f -enddef; - -vardef predirection@# (expr p) = - - postdirection[length p - @#] (reverse p) -enddef; - -vardef postdirection@# (expr p) = - save _n; _n := length (p); - save v; pair v; v := __dir (subpath (@#, @# + _n) of p); - if v = origin : - v := - __dir (subpath (@#, @# - _n) of p); - fi - v -enddef; - -vardef __dir (expr p) = - save v, w; pair v, w; w := pnt0 (p); - v := origin; - for n = 1 upto length (p) : - v := post[n-1] (p) - w; - if v = origin : - v := pre[n] (p) - w; - if v = origin : - v := pnt[n] (p) - w; - fi - fi - exitif v <> origin; +def putimage (suffix pic) (text t) = + newpicture (_pti); + for _itm = t: + addto _pti also + (pic shifted zconv (_itm)); + DoClip (_pti); addto active_plane also _pti; + _pti := nullpicture; endfor - v enddef; -newinternal hdwdr, hdten; -interim hdwdr := 1; interim hdten := 1; -boolean hfilled; hfilled := false; - -def headshape (expr wr, tens, fil) = - interim hdwdr := wr; interim hdten := tens; - save hfilled; boolean hfilled; hfilled := fil; +def arrowdraw (expr hlen) (expr f) = + store (curpath) headpath (hlen, 0, 0) drawn f; enddef; -def head = ahead enddef; - -vardef ahead (expr clr, front, back, hwr, tens, filled) = - if front <> back : - save side; pair side; - side := (hwr/2) * ((front-back) rotated 90); - save f; path f; - f := (back + side)..tension tens.. - {front-back}front{back-front}..tension tens.. - (back - side) - if filled : --cycle; colorsafefill (clr) f fi; - colorsafedraw (clr) f; - fi +def xaxis (expr hlen) = arrowdraw (hlen) ((xneg, 0)--(xpos, 0)); enddef; - -def headpath = colorheadpath (headcolor) enddef; -vardef colorheadpath (expr clr, hlen, hrot, hback) expr f = - if hlen <> 0 : - save g; path g; g := zconv (f); - save P; pair P[]; - P2 := pnt[length g] (g); - P1 := predirection[length g] (g); - if P1 <> (0, 0) : - P3 := (unitvector P1) rotated hrot; - P4 := P2 - (hback * P3); - P5 := P4 - (hlen * P3); - ahead (clr, P4, P5, hdwdr, hdten, hfilled); - fi - fi - f +def yaxis (expr hlen) = arrowdraw (hlen) ((0, yneg)--(0, ypos)); enddef; +def axes (expr hlen) = xaxis (hlen); yaxis (hlen); enddef; -def arrowdraw (expr hlen) (expr f) = - store (curpath) headpath (hlen, 0, 0) drawn f; -enddef; +laxis := baxis := raxis := taxis := 0; -def xaxis (expr hlen) = arrowdraw (hlen) ((xneg, 0)--(xpos, 0)); enddef; -def yaxis (expr hlen) = arrowdraw (hlen) ((0, yneg)--(0, ypos)); enddef; -def axes (expr hlen) = xaxis (hlen); yaxis (hlen); enddef; +vardef axisline.x = (xneg + laxis, 0)--(xpos - raxis, 0) enddef; +vardef axisline.y = (0, yneg + baxis)--(0, ypos - taxis) enddef; +vardef axisline.l = axisline.y shifted (xneg + laxis, 0) enddef; +vardef axisline.b = axisline.x shifted (0, yneg + baxis) enddef; +vardef axisline.r = axisline.y shifted (xpos - raxis, 0) enddef; +vardef axisline.t = axisline.x shifted (0, ypos - taxis) enddef; -laxis := baxis := raxis := taxis := 0; +vardef axis@# (expr len) = headpath (len, 0, 0) axisline@# enddef; -vardef axisline.x = (xneg + laxis, 0)--(xpos - raxis, 0) enddef; -vardef axisline.y = (0, yneg + baxis)--(0, ypos - taxis) enddef; -vardef axisline.l = axisline.y shifted (xneg + laxis, 0) enddef; -vardef axisline.b = axisline.x shifted (0, yneg + baxis) enddef; -vardef axisline.r = axisline.y shifted (xpos - raxis, 0) enddef; -vardef axisline.t = axisline.x shifted (0, ypos - taxis) enddef; -vardef axis@# (expr len) = - headpath (len, 0, 0) axisline@# +vardef borderrect = + rect((xneg+laxis,yneg+baxis),(xpos-raxis,ypos-taxis)) enddef; - numeric inside, outside, centered, onleft, onright, ontop, onbottom; inside := -2; outside := -1; @@ -1609,63 +1656,97 @@ xtick := ytick := centered; vardef axismarks (expr inang, tp, loc, pdir) (expr len) (text t) = save _tp, _U, _P, _tic, _ticang; - pair _U, _P, _tic[]; - _ticang := if tp<0 : inang else: 90 fi; + pair _U, _P; path _tic; + _ticang := if tp < 0: inang else: 90 fi; _tp := abs(tp) - 1; _U := unitvector (vconv (pdir)) rotated _ticang; - _tic1 := (_tp - 1) * len * _U; % start of mark - _tic2 := _tp * len * _U; % end of mark + _tic := (-_U--(0,0)) shifted (_tp*_U) scaled len; for _a = t: - safedraw ((_tic1--_tic2) shifted zconv (loc + _a*pdir)); + safedraw (_tic shifted zconv (loc + _a*pdir)); endfor enddef; -def xmarks = axismarks ( 90, xtick, (0, 0), right) enddef; -def ymarks = axismarks (-90, ytick, (0, 0), up) enddef; +def xmarks = axismarks ( 90, xtick, origin, right) enddef; +def ymarks = axismarks (-90, ytick, origin, up) enddef; def lmarks = axismarks (-90, ltick, (xneg + laxis, 0), up) enddef; -def bmarks = axismarks ( 90, btick, (0, yneg + baxis), right) enddef; +def bmarks = axismarks ( 90, btick, (0, yneg + baxis), right) enddef; def rmarks = axismarks ( 90, rtick, (xpos - raxis, 0), up) enddef; -def tmarks = axismarks (-90, ttick, (0, ypos - taxis), right) enddef; +def tmarks = axismarks (-90, ttick, (0, ypos - taxis), right) enddef; -path griddotpath; griddotpath := fullcircle; -def grid = vgrid (0.5bp) enddef; -vardef vgrid (expr dsize, xspace, yspace) = - save gdot, gridpic; picture gdot, gridpic; +path griddotpath; griddotpath := fullcircle; +def grid = vargrid (0.5bp) enddef; +vardef vargrid (expr dsize, xsp, ysp) = + save gdot, gridpic; picture gdot, gridpic; gdot := setdot (griddotpath, dsize); gridpic := nullpicture; - for n = ceiling(xneg/xspace) upto floor(xpos/xspace): - for m = ceiling(yneg/yspace) upto floor(ypos/yspace): - picdot (gridpic, gdot, zconv((n*xspace, m*yspace))); + for n = ceiling ((xneg + laxis)/xsp) upto floor ((xpos - raxis)/xsp): + for m = ceiling ((yneg + baxis)/ysp) upto floor ((ypos - taxis)/ysp): + picdot (gridpic, gdot, zconv ((n*xsp, m*ysp))); endfor endfor - coloraddto (pointcolor) (active_plane) (gridpic); + coloraddon (pointcolor, gridpic); enddef; +def vgrid = vargrid enddef; def hgridlines (expr ysp) = - for n = ceiling((yneg + baxis)/ysp) upto floor((ypos - taxis)/ysp) : - safedraw zconv((xneg + laxis, n*ysp)--(xpos - raxis, n*ysp)); + for n = ceiling ((yneg + baxis)/ysp) upto floor ((ypos - taxis)/ysp): + safedraw zconv ((xneg + laxis, n*ysp)--(xpos - raxis, n*ysp)); endfor enddef; def vgridlines (expr xsp) = - for n = ceiling((xneg + laxis)/xsp) upto floor((xpos - raxis)/xsp) : - safedraw zconv((n*xsp, yneg + baxis)--(n*xsp, ypos - taxis)); + for n = ceiling ((xneg + laxis)/xsp) upto floor ((xpos - raxis)/xsp): + safedraw zconv ((n*xsp, yneg + baxis)--(n*xsp, ypos - taxis)); endfor enddef; def gridlines (expr xsp, ysp) = - vgridlines (xsp); hgridlines (ysp); + vgridlines (xsp); hgridlines (ysp); enddef; -vardef plrpatch (expr rstart, rstop, rstep, tstart, tstop, tstep) = - save v; picture v; v := nullpicture; - patcharcs (v) (rstart, rstop, rstep, tstart, tstop); - coloraddto (drawcolor) (active_plane, v); - v := nullpicture; - patchrays (v) (tstart, tstop, tstep, rstart, rstop); - coloraddto (drawcolor) (active_plane, v); +def vectorfield (expr len, xsp, ysp) (text fcn) (text cond) = + save _vf, _is_OK; + vardef _vf (expr x,y) = ((0,0)--(fcn)) shifted (x,y) enddef; + vardef _is_OK (expr x,y) = cond enddef; + mkvectorfield (len, xsp, ysp) (_vf, _is_OK); enddef; + +vardef mkvectorfield (expr len, xsp, ysp) (suffix vf, isOK) = + for n = ceiling ((xneg + laxis)/xsp) upto floor ((xpos - raxis)/xsp): + for m = ceiling ((yneg + baxis)/ysp) upto floor ((ypos - taxis)/ysp): + if isOK (n*xsp,m*ysp): arrowdraw (len) (vf(n*xsp,m*ysp)); fi + endfor + endfor +enddef; + +def plrvectorfield (expr len, rsp, tsp) (text fcn) (text cond) = + save _vf, _is_OK, _A, _B, _C, _D; + _A := xneg + laxis; _B := xpos + raxis; + _C := yneg + baxis; _D := ypos + taxis; + vardef _vf (expr r,t) = ((0,0)--(fcn)) shifted (r*dir t) enddef; + vardef _is_OK (expr r,t) = + save _X, _Y; _X := r*cosd t; _Y := r*sind t; + (cond) and (_A < _X) and (_X < _B) and (_C < _Y) and (_Y < _D) + enddef; + mkplrvectorfield (len, rsp, tsp) (_vf, _is_OK); +enddef; + +vardef mkplrvectorfield (expr len, rsp, tsp) (suffix vf, isOK) = + save rmin, rmax, tmin, tmax; + getpolarbounds; + if rmin = 0: + if isOK (0,tmin): arrowdraw (len) (vf (0,tmin)); fi + rmin := rsp; + fi + for n = ceiling (rmin/rsp) upto floor (rmax/rsp): + for m = ceiling (tmin/tsp) upto floor (tmax/tsp): + if isOK (n*rsp,m*tsp): arrowdraw (len) (vf (n*rsp,m*tsp)); fi + endfor + endfor +enddef; + def patcharcs (suffix X) (expr rstart, rstop, rstep, tstart, tstop) = - for rad = (if rstart=0: rstep else: rstart fi) step rstep until rstop: - orto (X, picpath zconv (arcplr ((0, 0), tstart, tstop, rad)) ); + for rad = (if rstart = 0: rstep else: rstart fi) + step rstep until rstop: + orto (X, picpath zconv (arcplr (origin, tstart, tstop, rad)) ); endfor enddef; def patchrays (suffix X) (expr tstart, tstop, tstep, rstart, rstop) = @@ -1674,116 +1755,130 @@ def patchrays (suffix X) (expr tstart, tstop, tstep, rstart, rstop) = endfor enddef; -def polargrid (expr rstep, tstep) = - gridarcs (rstep); gridrays (tstep); -enddef; - -def polargridpoints (expr dsize, rstep, tstep) = - beginpolargrid; - save gdot; picture gdot; gdot := setdot (griddotpath, dsize); - if rmin = 0: - picdot (gridpic, gdot, zconv(origin)); - rmin := rstep; - fi - for n = ceiling (rmin/rstep) upto floor (rmax/rstep) : - for m = ceiling (tmin/tstep) upto floor (tmax/tstep) : - picdot ( gridpic, gdot, zconv ( polar((n*rstep, m*tstep)) ) ); - endfor - endfor - endpolargrid (pointcolor, .5dsize); +def plrpatch (expr rstart, rstop, rstep, tstart, tstop, tstep) = +begingroup + newpicture (v); + patcharcs (v) (rstart, rstop, rstep, tstart, tstop); + coloraddon (drawcolor, v); + v := nullpicture; + patchrays (v) (tstart, tstop, tstep, rstart, rstop); + coloraddon (drawcolor, v); +endgroup enddef; def gridarcs (expr rstep) = beginpolargrid; - if rmin = 0 : % add "circle" of radius 0 - picdot (gridpic, setdot(griddotpath, penwd), zconv(origin)); + if rmin = 0: + picdot (gridpic, setdot (griddotpath, penwd), zconv (origin)); fi - rmin := rstep * floor(rmin/rstep + 1); - rmax := rstep*ceiling(rmax/rstep - 1); + rmin := rstep * floor (rmin/rstep + 1); + rmax := rstep * ceiling (rmax/rstep - 1); patcharcs (gridpic) (rmin, rmax, rstep, tmin, tmax); endpolargrid (drawcolor, .5penwd); enddef; def gridrays (expr tstep) = beginpolargrid; - tmin := tstep*ceiling(tmin/tstep); - tmax := tstep * floor(tmax/tstep); + tmin := tstep * ceiling (tmin/tstep); + tmax := tstep * floor (tmax/tstep); patchrays (gridpic) (tmin, tmax, tstep, rmin, rmax); endpolargrid (drawcolor, .5penwd); enddef; +def polargrid (expr rstep, tstep) = + gridarcs (rstep); gridrays (tstep); +enddef; + +def polargridpoints (expr dsize, rstep, tstep) = + beginpolargrid; + setpicture (gdot) setdot (griddotpath, dsize); + if rmin = 0: + picdot (gridpic, gdot, zconv (origin)); + rmin := rstep; + fi + for n = ceiling (rmin/rstep) upto floor (rmax/rstep): + for m = ceiling (tmin/tstep) upto floor (tmax/tstep): + picdot ( gridpic, gdot, zconv ( polar ((n*rstep, m*tstep)) ) ); + endfor + endfor + endpolargrid (pointcolor, .5dsize); +enddef; + def beginpolargrid = - begingroup; - save p, r, t, rmax, rmin, tmax, tmin; +begingroup; + save rmax, rmin, tmax, tmin; + getpolarbounds; + newpicture (gridpic); +enddef; + +def getpolarbounds = + save p, r, t; pair p[]; - % Four corners: - p0 := (xneg, yneg); p1 := (xneg, ypos); - p2 := (xpos, ypos); p3 := (xpos, yneg); - r0 := abs(p0); rmax := r0; - for j = 1 upto 3 : + p0 := (xneg, yneg); p1 := (xneg, ypos); + p2 := (xpos, ypos); p3 := (xpos, yneg); + r0 := abs(p0); rmax := r0; + for j = 1 upto 3: r[j] := abs(p[j]); - if rmax < r[j] : rmax := r[j]; fi + if rmax < r[j]: rmax := r[j]; fi endfor rmin := 0; - if (xneg < 0) and (xpos > 0) and (yneg < 0) and (ypos > 0) : - tmin := 0; tmax := 360; - elseif (p0 = (0,0)) : tmin := 0; tmax := 90; - elseif (p1 = (0,0)) : tmin := -90; tmax := 0; - elseif (p2 = (0,0)) : tmin := -180; tmax := -90; - elseif (p3 = (0,0)) : tmin := 90; tmax := 180; - else : + if (xneg < 0) and (xpos > 0) and (yneg < 0) and (ypos > 0): + tmin := 0; tmax := 360; + elseif (p0 = origin): tmin := 0; tmax := 90; + elseif (p1 = origin): tmin := -90; tmax := 0; + elseif (p2 = origin): tmin := -180; tmax := -90; + elseif (p3 = origin): tmin := 90; tmax := 180; + else: tmax := tmin := t0 := angle p0; for j = 1 upto 3: - t := t0 + angle (p[j] rotated -t0); - if tmax < t : tmax := t; fi - if tmin > t : tmin := t; fi + t := t0 + anglefromto (p0, p[j]); + if tmax < t: tmax := t; fi + if tmin > t: tmin := t; fi endfor - if (xneg < 0) and (xpos > 0) : % (1) - rmin := emin(abs(yneg), abs(ypos)); - elseif (yneg < 0) and (ypos > 0) : % (2) - rmin := emin(abs(xneg), abs(xpos)); - else : % (3) - rmin := min(r0, r1, r2, r3); + if (xneg < 0) and (0 < xpos): + rmin := emin (abs(yneg), abs(ypos)); + elseif (yneg < 0) and (0 < ypos): + rmin := emin (abs(xneg), abs(xpos)); + else: + rmin := min (r0, r1, r2, r3); fi fi - save gridpic; picture gridpic; gridpic := nullpicture; enddef; def endpolargrid (expr clr, size)= - clipto (gridpic) rect ( zconv((xneg, yneg)) - size*(1,1), - zconv((xpos, ypos)) + size*(1,1) ); - coloraddto (clr) (active_plane) (gridpic); + clipto (gridpic) rect ( zconv ((xneg, yneg)) - size*(1,1), + zconv ((xpos, ypos)) + size*(1,1) ); + coloraddon (clr, gridpic); endgroup enddef; vardef polarpatch (expr rstart, rstop, rstep, tstart, tstop, tstep) = plrpatch (rstart, rstop, rstep, tstart, tstop, tstep); - safedraw zconv ( arcplr ((0, 0), tstart, tstop, rstop) ); + safedraw zconv ( arcplr (origin, tstart, tstop, rstop) ); safedraw zconv ( ((rstart, 0)--(rstop, 0)) rotated tstop ); enddef; vardef rect (expr ll, ur) = ll--(xpart ur, ypart ll)--ur--(xpart ll, ypart ur)--cycle enddef; -vardef triangle (expr A, B, C) = A--B--C--cycle enddef; +vardef triangle (expr A, B, C) = A--B--C--cycle enddef; vardef regularpolygon (expr n) (suffix Bob) (text eqns) = - pair Bob[]; Bob := emax(round (abs (n)), 2); + pair Bob[]; Bob := emax (round (abs (n)), 2); eqns; - for _uncle = 1 upto Bob - 1 : - (Bob1 - Bob0) rotated (360*_uncle/Bob) = Bob[_uncle+1] - Bob0; + for _uncle = 1 upto Bob - 1: + (Bob1 - Bob0) rotated (360/Bob*_uncle) = Bob[_uncle+1] - Bob0; endfor mkpoly (true) (Bob) enddef; vardef altitudept expr n of t = - save A, B, C, zz; pair A, B, C, zz; - A := pnt[n] (t); - B := pnt[n + 1] (t); % wraps around a cyclic path + save A, B, C, zz; pair A, B, C, zz; + B := pnt[n + 1] (t); C := pnt[n + 2] (t); zz = whatever[B,C]; - zz = A + whatever*((C-B) rotated 90); + zz = pnt[n](t) + whatever*((C-B) rotated 90); zz enddef; @@ -1800,11 +1895,11 @@ vardef median expr n of t = enddef; vardef anglebisectorpt expr n of t = - save A, B, C; pair A, B, C; + save A, B, C; pair A, B, C; A := pnt[n ] (t); B := pnt[n + 1] (t); C := pnt[n + 2] (t); - save zz; pair zz; + save zz; pair zz; zz = whatever[B,C]; zz = A + whatever*((B-A) rotated (.5*cornerangle (A,B,C))); zz @@ -1814,232 +1909,417 @@ vardef anglebisector expr n of t = (pnt[n](t))--(anglebisectorpt n of t) enddef; +vardef anglefromto (expr u, v) = + if (u = origin) or (v = origin): 0 + else: angle (v rotated (-angle u)) + fi +enddef; + vardef cornerangle (expr A, B, C) = - if (A = B) and (B = C) : 60 - elseif (B = C) : 0 - elseif (A = B) or (A = C) : 90 - else: angle ((C - A) rotated (-angle (B - A))) + if (A = B) and (B = C) : 60 + elseif (A=B) or (A=C) : 90 + else: anglefromto (B - A, C - A) fi enddef; vardef mkpath (expr smooth, tens, cyclic) (suffix pts) = - if smooth : mksmooth (tens, cyclic, pts) - else : mkpoly (cyclic, pts) - fi + if smooth: mksmooth (tens) + else: mkpoly + fi (cyclic, pts) enddef; vardef mkpoly (expr cyclic) (suffix pts) = for _i = 1 upto pts-1: pts[_i]-- endfor - pts[pts] if cyclic : -- cycle fi + pts[pts] if cyclic: -- cycle else: {0,0} fi enddef; vardef polyline (expr cyclic) (text t) = - save _pl; textpairs (_pl) (t); mkpoly (cyclic, _pl) + setpairs (_pl) (t); + if _pl=0: NoPoints ("polyline", _pl); fi + mkpoly (cyclic, _pl) +enddef; + +def NoPoints (expr s) (suffix pts) = + GBwarn s & " attempted with empty list."; pts[incr pts] := origin; +enddef; + +vardef turtle (text t) = + setnumeric (_tu) 0; + pair _tu[]; _tu0 := origin; + for _a = t: _tu[incr _tu] := _tu[_tu - 1] + _a; endfor + if _tu = 0: NoPoints("turtle", _tu); fi + mkpoly (false, _tu) enddef; vardef mksmooth (expr tens, cyclic) (suffix pts) = - pts1 - if pts = 1 : - if cyclic : &cycle fi + if pts = 1: onepointpath (cyclic, pts1) else: - if cyclic : - {pts[2]-pts[pts]} - fi + settension (_tn) tens; fixtension (_tn); + pts1 if cyclic: {pts[2]-pts[pts]} fi for _i = 2 upto pts-1: - ..tension tens..pts[_i]{pts[_i+1]-pts[_i-1]} + ..tension _tn..pts[_i]{pts[_i+1]-pts[_i-1]} + endfor + ..tension _tn..pts[pts] + if cyclic: {pts[1]-pts[pts-1]}..tension _tn..cycle fi + fi +enddef; + +vardef mktenser (expr tens, cyclic) (suffix pts) = + if pts = 1: onepointpath (cyclic, pts1) + else: + settension (_tn) tens; fixtension (_tn); + pts1 if cyclic: {pts[2]-pts[pts]} fi + for _i = 2 upto pts-1: + ..tension atleast _tn..pts[_i]{pts[_i+1]-pts[_i-1]} + endfor + ..tension atleast _tn..pts[pts] + if cyclic: {pts[1]-pts[pts-1]}..tension atleast _tn..cycle fi + fi +enddef; + +vardef mkconvex (expr tens, cyclic) (suffix pts) = + save _B, _d, _tmp; pair _d[]; + settension (_tn) tens; fixtension (_tn); + if pts < 4: mktenser (_tn, cyclic) (pts) + else: + for _j = 2 upto pts - 1: + _B[_j] := sqrt(abs((pts[_j]-pts[_j-1])xprod(pts[_j+1]-pts[_j]))); + endfor + if cyclic: + _B1 := sqrt(abs((pts1 - pts[pts])xprod(pts2 - pts1))); + _B[pts] := sqrt(abs((pts[pts]-pts[pts-1])xprod(pts1 - pts[pts]))); + else: + _B1 := _B2; + _B[pts] := _B[pts-1]; + fi + for _j = 2 upto pts - 1: + _tmp := _B[_j-1] + _B[_j+1]; + _d[_j] := + if _tmp = 0: origin % signal to use curl1 + else: + ( _B[_j+1]*(pts[_j] - pts[_j-1]) + + _B[_j-1]*(pts[_j+1] - pts[_j]) )/_tmp + fi; endfor - ..tension tens..pts[pts] - if cyclic : - {pts[1]-pts[pts-1]}..tension tens..cycle + if cyclic: + _tmp := _B[pts] + _B2; + _d1 := + if _tmp = 0: origin + else: + (_B2*(pts1 - pts[pts]) + _B[pts]*(pts2 - pts1))/_tmp + fi; + _tmp := _B[pts-1] + _B1; + _d[pts] := + if _tmp = 0: origin + else: + ( _B1*(pts[pts] - pts[pts-1]) + + _B[pts-1]*(pts1 - pts[pts]) )/_tmp + fi; + else: + _d1 := origin; _d[pts] := origin; fi + pts1 + for _j = 1 upto pts-1: + {if _d[_j] = origin: curl1 else: _d[_j] fi} + ..tension atleast _tn..pts[_j+1] + endfor + {if _d[pts] = origin: curl1 else: _d[pts] fi} + if cyclic: ..tension atleast _tn..cycle fi fi enddef; -def curve = tcurve (default_tension) enddef; +numeric default_tension; default_tension := 1; +def curve = tcurve (default_tension) enddef; vardef tcurve (expr tens, cyclic) (text t) = - save _tc; textpairs (_tc) (t); mksmooth (tens, cyclic, _tc) + setpairs (_tc) (t); mksmooth (tens, cyclic, _tc) +enddef; + +def ccurve = tccurve (default_tension) enddef; +vardef tccurve (expr tens, cyclic) (text t) = + setuniquepairs (_tcc) (t); mkconvex (tens, cyclic, _tcc) enddef; vardef mkbezier (expr tens, cyclic) (suffix pts) = - for _i = 1 upto pts-1 : pts[_i]..tension tens.. endfor - pts[pts] if cyclic : ..tension tens..cycle fi + settension (_tn) tens; fixtension (_tn); + pts1 + for _i = 2 upto pts: ..tension _tn..pts[_i] endfor + if cyclic: ..tension _tn..cycle else: {0,0} fi enddef; -def bezier = tbezier (default_tension) enddef; +def bezier = tbezier (default_tension) enddef; vardef tbezier (expr tens, cyclic) (text t) = - save _tsb; textpairs (_tsb) (t); mkbezier (tens, cyclic) (_tsb) + setpairs (_tbs) (t); + if _tbs=0: NoPoints ("bezier", _tbs); fi + mkbezier (tens, cyclic) (_tbs) enddef; vardef mkqbezier (expr cyclic) (suffix pts) = - save _mqb; _mqb := pts; - if (cyclic and odd pts) or not (cyclic or odd pts): - pts[incr _mqb] := pts[pts]; - fi - if cyclic : pts[incr _mqb] := pts1; fi pts1 - for _i = 2 step 2 until _mqb - 1 : - ..controls 1/3[pts[_i],pts[_i-1]] and 1/3[pts[_i], pts[_i+1]] - ..pts[_i+1] - endfor - if cyclic : &cycle fi + if pts=1: {0,0} + else: + for _i = 2 step 2 until pts - 1: + ..controls 1/3[pts[_i], pts[_i-1] ] and 1/3[pts[_i], pts[_i+1] ].. + pts[_i+1] + endfor + if cyclic: + ..controls 1/3[ pts[pts], pts[pts - 1] ] + and 1/3[ pts[pts], pts1 ]..cycle + fi + fi enddef; vardef qbezier (expr cyclic) (text t) = - save _qbz; textpairs (_qbz) (t); mkqbezier (cyclic) (_qbz) + setpairs (_qbz) (t); + if _qbz=0: NoPoints ("qbezier", _qbz); fi + if _qbz=1: onepointpath (cyclic, _qbz1) + else: + if (cyclic and odd _qbz) or (not cyclic and even _qbz): + _qbz[incr _qbz] := _qbz[_qbz-1]; + fi + mkqbezier (cyclic) (_qbz) + fi enddef; -vardef openqbs (text t) = - save _oq; textpairs (_oq) (t); mkqbs (_oq) +vardef fcncontrol (expr ftens, X, Y, Z) = + Y if (xpart(Z-Y) <> 0) and (xpart(Y-X) <> 0): + + xpart(Z-Y)/3/xpart(Z-X)*(Z - X)/ftens fi enddef; -vardef closedqbs (text t) = - save _cq; textpairs (_cq) (t); - _cq[incr _cq] := _cq1; _cq[incr _cq] := _cq2; - mkqbs (_cq) & cycle +vardef mkfcnpath (expr ftens) (suffix q) = + settension (_tn) ftens; + if _tn <= 0: _tn := 1; fi + for _i = 1 upto q - 1: + q[_i]..controls fcncontrol (_tn) (q[_i-1], q[_i], q[_i+1]) + and fcncontrol (_tn) (q[_i+2], q[_i+1], q[_i]).. + endfor + q[q]{0,0} enddef; +def fcncurve = functioncurve (default_tension) enddef; +def tfcncurve = functioncurve enddef; +vardef functioncurve (expr ftens) (text t) = + settension (_ftens) ftens; if _ftens < 1/3: _ftens := 1/3; fi + setuniquepairs (_fc) (t); + if _fc > 1: _fc0 := _fc1; _fc[_fc+1] := _fc[_fc]; fi + mkfcnpath (_ftens) (_fc) +enddef; + +def openqbs = qspline (false) enddef; +def closedqbs = qspline (true) enddef; + vardef mkqbs (suffix b) = - for _i = 1 upto b-2: - 0.5[b[_i], b[_i+1]] - ..controls 1/6[b[_i+1], b[_i]] and 1/6[b[_i+1], b[_i+2]].. - endfor - 0.5[b[b-1], b[b]] + 0.5[ b1, b2] + if b<3: {0,0} + else: + for _i = 2 upto b-1: + ..controls 1/6[ b[_i], b[_i-1] ] and 1/6[ b[_i], b[_i+1] ].. + 0.5[ b[_i], b[_i+1] ] + endfor + fi enddef; -vardef mkopencbs (suffix b) = - for _i = 1 upto b-3: - (b[_i]+4b[_i+1]+b[_i+2])/6 - ..controls 1/3[b[_i+1], b[_i+2]] and 2/3[b[_i+1], b[_i+2]].. - endfor - (b[b-2]+4b[b-1]+b[b])/6 +vardef qspline (expr cyclic) (text t) = + setpairs (_qs) (t); + if _qs=0: NoPoints ("qspline", _qs); fi + if _qs=1: _qs[incr _qs] := _qs1; fi + if cyclic: + _qs[incr _qs] := _qs1; _qs[incr _qs] := _qs2; + fi + mkqbs (_qs) if cyclic: & cycle fi enddef; +vardef mkcbs (suffix b) = + (b[1]+4b[2]+b[3])/6 + if b < 4: {0,0} + else: + for _i = 3 upto b-1: + ..controls 1/3[ b[_i-1], b[_i] ] and 1/3[ b[_i], b[_i-1] ] + .. (b[_i-1] + 4b[_i] + b[_i+1])/6 + endfor + fi +enddef; + +def mkopencbs = mkcbs enddef; vardef mkclosedcbs (suffix b) = - mkopencbs (b) & opencbs (b[b-2],b[b-1],b[b], b1, b2, b3) & cycle + mkcbs (b) & opencbs (b[b-2],b[b-1],b[b], b1, b2, b3) & cycle enddef; -vardef opencbs (text t) = - save _oc; textpairs (_oc) (t); mkopencbs (_oc) +def opencbs = cspline (false) enddef; +def closedcbs = cspline (true) enddef; + +vardef cspline (expr cyclic) (text t) = + setpairs (_cs) (t); + if _cs=0: NoPoints ("cspline", _cs); fi + for _idx = _cs upto 2: _cs[incr _cs] := _cs[_idx]; endfor + if cyclic: + for _idx = 1 upto 3: _cs[incr _cs] := _cs[_idx]; endfor + fi + mkcbs (_cs) if cyclic: & cycle fi +enddef; +def init_spline_eqns (suffix pts) = + save _spl_pre, _spl_post; + pair _spl_pre[], _spl_post[]; + for j= 2 upto pts - 1: + _spl_post[j] + _spl_pre[j] = 2pts[j]; + _spl_pre[j+1]+2_spl_pre[j] = 2_spl_post[j]+_spl_post[j-1]; + endfor enddef; -vardef closedcbs (text t) = - save _clc; textpairs (_clc) (t); mkclosedcbs (_clc) + +def closed_spline_eqns (suffix pts) = + _spl_post1 + _spl_pre1 = 2pts1; + _spl_post[pts] + _spl_pre[pts] = 2pts[pts]; + _spl_pre2 + 2_spl_pre1 = 2_spl_post1 + _spl_post[pts]; + _spl_pre1+2_spl_pre[pts] = 2_spl_post[pts]+_spl_post[pts-1]; enddef; -vardef fcncontrol (expr ftens, X, Y, Z) = - save dl, dr, before, after; pair before, after; - before := Y - X; after := Z - Y; - dl := xpart (before); dr := xpart (after); - if (dr = 0) or (dl = 0): - Y + abs(dr)/ftens * sgn before - else: - Y + abs(dr)/ftens * unitvector (before*dr/dl + after*dl/dr) +def relaxed_spline_eqns (suffix pts) = + _spl_pre2 + pts1 = 2_spl_post1; + pts[pts] + _spl_post[pts-1] = 2_spl_pre[pts]; +enddef; + +vardef mksplinepath (expr closed) (suffix pts) = + pts1..controls _spl_post1 and + for j = 2 upto pts if not closed: -1 fi: + _spl_pre[j]..pts[j]..controls _spl_post[j] and + endfor + if closed: _spl_pre1..cycle else: _spl_pre[pts]..pts[pts] fi +enddef; + +def mkspline (expr closed) (suffix pts) = + init_spline_eqns (pts); + if closed: closed_spline_eqns (pts); + else: relaxed_spline_eqns (pts); fi + mksplinepath (closed) (pts) enddef; -vardef mkfcnpath (expr ftens) (suffix q) = - for _i = 1 upto q - 1: - q[_i]..controls fcncontrol (ftens) (q[_i-1], q[_i], q[_i+1]) - and fcncontrol (ftens) (q[_i+2], q[_i+1], q[_i]).. +vardef dospline (expr closed) (text the_list) = + setpairs (_sp) (the_list); + if _sp=0: NoPoints ("dospline", _sp); fi + if _sp=1: _sp[incr _sp] := _sp1; fi + mkspline (closed) (_sp) +enddef; + +def init_fcnspl_eqns (suffix pts) = + save _dx, _sl; numeric _dx[], _sl[]; + _dx1 := xpart (pts2 - pts1); + for j = 2 upto pts - 1: + _dx[j] := xpart (pts[j+1] - pts[j]); + _sl[j + 1]*_dx[j] + _sl[j-1]*_dx[j-1] + 2_sl[j]*(_dx[j] + _dx[j-1]) + = 3*ypart(pts[j+1] - pts[j-1]); endfor - q[q] enddef; -def fcncurve = functioncurve (emax(1.2default_tension, eps)) enddef; -vardef functioncurve (expr ftens) (text t) = - save _fc; textpairs (_fc) (t); - if _fc > 1 : _fc0 := _fc1; _fc[_fc+1] := _fc[_fc]; fi - mkfcnpath (ftens)(_fc) +def periodic_fcnspl_eqns (suffix pts) = + _sl1 = _sl[pts]; + _sl2*_dx1 + 2_sl1*_dx1 + 2_sl[pts]*_dx[pts-1] + _sl[pts-1]*_dx[pts-1] + = 3 * ypart (pts[2] - pts[pts-1]); enddef; -vardef turtle (text t) = - save _tu; pair _tu[]; _tu := 0; _tu0 := (0, 0); - for _a = t: _tu[incr _tu] := _tu[_tu - 1] + _a; endfor - mkpoly (false, _tu) +def relaxed_fcnspl_eqns (suffix pts) = + _sl2*_dx1 + 2_sl1*_dx1 = 3 * ypart(pts2 - pts1); + _sl[pts-1]*_dx[pts-1] + 2_sl[pts]*_dx[pts-1] + = 3 * ypart(pts[pts] - pts[pts-1]); +enddef; + +vardef mkfcnsplpath (suffix pts) = + pts1..controls (pts1 + (1, _sl1)/3*_dx1) and + for j = 2 upto pts - 1: + (pts[j] - (1, _sl[j])/3*_dx[j-1]) ..pts[j].. + controls (pts[j] + (1,_sl[j])/3*_dx[j]) and + endfor + (pts[pts] - (1,_sl[pts])*_dx[pts-1]/3)..pts[pts] enddef; -vardef mkarc (expr center, from, to, sweep) = - save n, d; pair d; - n := ceiling (abs(sweep)/45); - d := (from - center) rotated (signof (sweep) 90); - from{d} - for j = 1 upto n-1 : - ..(from rotatedabout (center, j/n*sweep)){d rotated (j/n*sweep)} - endfor ..to{d rotated sweep} +vardef mkfcnspline (expr periodic) (suffix pts) = + init_fcnspl_eqns (pts); + if periodic: periodic_fcnspl_eqns (pts); + else: relaxed_fcnspl_eqns (pts); + fi + mkfcnsplpath (pts) enddef; -vardef arc (expr center, from, sweep) = - if (center = from) or (sweep = 0) : - from--from +vardef fcnspline (expr periodic) (text the_list) = + setpairs (_fs) (the_list); + if _fs<2: + if _fs=0: NoPoints ("fcnspline", _fs); fi + onepointpath (false, _fs1) else: - save to; pair to; - to := from rotatedabout (center, sweep); - mkarc (center, from, to, sweep) + mkfcnspline (periodic) (_fs) fi enddef; -def arccps = arc enddef; -vardef arccenter (expr from, to, sweep) = - save ang, c; - pair c; - ang := 90 - (sweep mod 360)/2; % -90 < ang <= 90 - if (abs(ang) = 90) or (from = to) : - GBmsg "The central point of this arc is undefined. " & - "Using midpoint of chord instead."; - 0.5[from, to] +vardef mkarc (expr center, begpt, endpt, sweep) = + if (sweep = 0): begpt--endpt else: - save cd; pair cd; cd := to - from; - c = from + whatever*(cd rotated ang); - if abs(ang) < 30 : - c = (0.5)[from, to] + whatever*(cd rotated 90); - else: - c = to + whatever*(-cd rotated -ang); - fi - c + setnumeric (n) ceiling (abs(sweep)/45); + setpair (d) (begpt - center) rotated (signof (sweep) 90); + begpt{d} + for j = 1 upto n-1: + ..(begpt rotatedabout (center, j/n*sweep)){d rotated (j/n*sweep)} + endfor ..endpt{d rotated sweep} fi enddef; -vardef midarc (expr from, to, sweep) = - save m, cd; pair m, cd; - cd := to - from; - m = from + whatever*( cd rotated (-sweep/4)); - m = 0.5[from, to] + whatever*(cd rotated 90); - m +vardef arc (expr center, begpt, sweep) = + if (center = begpt) or (sweep = 0): begpt--begpt + else: + mkarc (center, begpt, begpt rotatedabout (center, sweep), sweep) + fi enddef; +def arccps = arc enddef; -vardef arcpps (expr from, to, sweep) = - if ((sweep mod 360) = 0) or (from = to) : - GBmsg "Undefined arc. A line segment will be used instead."; - from--to - elseif abs(sweep) <= 90 : - save cd; pair cd; cd := to - from; - if abs(sweep) <= 45 : - from{cd rotated (-sweep/2)}..to{cd rotated (sweep/2)} +vardef arcpps (expr begpt, endpt, sweep) = + if begpt = endpt: begpt--endpt + else: + setpair (cd) unitvector (endpt-begpt); + if abs(sweep) <= 45: + begpt{cd rotated (-sweep/2)}..endpt{cd rotated (sweep/2)} + elseif abs(sweep) <= 90: + save m; pair m; + m = begpt + whatever*( cd rotated (-sweep/4)); + m = 0.5[begpt, endpt] + whatever*(cd rotated 90); + begpt{cd rotated (-sweep/2)}..m{cd}..endpt{cd rotated (sweep/2)} else: - from{cd rotated (-sweep/2)}..midarc(from, to, sweep){cd} - ..to{cd rotated (sweep/2)} + setnumeric (ang) 90 - ((sweep/2) mod 180); + if abs(ang) = 90: + GBwarn "undefined arc. A line segment will be used instead."; + begpt--endpt + else: + save c; pair c; + c = begpt + whatever*(cd rotated ang); + c = if abs(ang) < 30: + (0.5)[begpt, endpt] + whatever*(cd rotated 90) + else: + endpt + whatever*(-cd rotated -ang) + fi; + mkarc (c, begpt, endpt, sweep) + fi fi - else: - save center; pair center; - center := arccenter (from, to, sweep); - mkarc (center, from, to, sweep) fi enddef; +vardef arcpp (expr small, begpt, endpt, rad) = + save full, ang; full := signof (rad) 360; + if 2*abs(rad) > abs(begpt - endpt): + ang := if not small: full - fi 2*asin (abs(begpt-endpt)/(2rad)); + else: ang := signof (rad) 180; + fi + arcpps (begpt, endpt, ang) +enddef; +def arcppr (expr begpt, endpt, rad, small) = + arcpp (small, begpt, endpt, rad) +enddef; + vardef arcplr (expr center, frtheta, totheta, rad) = - if rad = 0 : - center -- center + if rad = 0: center--center else: - save from, to; pair from, to; - from := center + rad*dir frtheta; - to := center + rad*dir totheta; - if frtheta = totheta : - from--to - else: - mkarc (center, from, to, totheta - frtheta) - fi + mkarc (center, center + rad*dir frtheta, + center + rad*dir totheta, totheta - frtheta) fi enddef; -vardef arcalt (expr center, radius, anglefrom, angleto) = - arcplr (center, anglefrom, angleto, radius) + +vardef arcalt (expr center, radius, frtheta, totheta) = + arcplr (center, frtheta, totheta, radius) enddef; vardef arcppp (expr first, second, third) = @@ -2054,32 +2334,33 @@ enddef; vardef circle (expr center, rad) = fullcircle scaled (2*rad) shifted center enddef; - vardef circlecp (expr center, point) = mkarc (center, point, point, 360) & cycle enddef; vardef circleppp (expr one, two, three) = - save ang; numeric ang[]; - ang0 := cornerangle(three, one, two); - ang1 := cornerangle(one, two, three); - ang2 := cornerangle(two, three, one); - arcpps (one, two, 2ang0) & arcpps (two, three, 2ang1) & - arcpps (three, one, 2ang2) & cycle + arcpps (one, two, 2*cornerangle (three, one, two)) + & arcpps (two, three, 2*cornerangle (one, two, three)) + & arcpps (three, one, 2*cornerangle (two, three, one)) + & cycle enddef; vardef circlepps (expr one, two, sweep) = - save ang, full; numeric ang[], full; + save ang, full; full := signof (sweep) 360; - ang1 := sweep mod (full); - ang2 := full - ang1; - arcpps (one, two, ang1) & arcpps (two, one, ang2) & cycle + ang := sweep mod full; + arcpps (one, two, ang) & arcpps (two, one, full - ang) & cycle +enddef; +vardef circlepp (expr small, one, two, rad) = + arcpp (small, one, two, rad) & arcpp (not small, two, one, rad) & cycle +enddef; +def circleppr (expr one, two, rad, small) = + circleppr (one, two, rad, small) enddef; - vardef pathcenter expr p = - save a, cntr, n; pair cntr, a[]; + save a, cntr, n; pair cntr, a[]; n := length p; a1 = pnt 0 (p); a3 = pnt [n/2] (p); - if cycle p : + if cycle p: a2 = pnt [n/4] (p); a4 = pnt [3n/4] (p); else: @@ -2096,146 +2377,909 @@ vardef circumcircle expr t = enddef; vardef incircle expr t = - save A, B, C; pair A, B, C; + save A, B, C; pair A, B, C; A := pnt0 (t); B := pnt1 (t); C := pnt2 (t); - % Find the tangent points on the sides. E.g., a is the common - % distance from A to the tangent points on the adjacent sides. - save a, b, c; - a + b = abs (B-A); - b + c = abs (C-B); - a + c = abs (A-C); - circleppp (A + a*unitvector (B-A), - B + b*unitvector (C-B), - C + c*unitvector (A-C)) + save a, b, c, D, E, F; + D := abs (B-A) = a + b; + E := abs (C-B) = b + c; + F := abs (A-C) = a + c; + circleppp ((a/D)[A,B], (b/E)[B,C], (c/F)[C,A]) enddef; vardef excircle expr n of t = - save A, B, C; pair A, B, C; - A := pnt[n] (t); - B := pnt[n + 1] (t); % wraps around + save A, B, C; pair A, B, C; + A := pnt[n] (t); + B := pnt[n + 1] (t); C := pnt[n + 2] (t); - save a, b, c; - a - b = abs (B-A); - b + c = abs (C-B); - a - c = abs (C-A); - circleppp (A + a*unitvector(B-A), - B + b*unitvector(C-B), - C + c*unitvector(C-A)) + save a, b, c, D, E, F; + D := abs (B-A) = a - b; + E := abs (C-B) = b + c; + F := abs (C-A) = a - c; + circleppp ((a/D)[A,B], (b/E)[B,C], (c/F)[A,C]) enddef; vardef ninepointcircle expr t = circleppp (medianpt 0 of t, medianpt 1 of t, medianpt 2 of t) enddef; -vardef circumcenter expr t = pathcenter circumcircle t enddef; -vardef incenter expr t = pathcenter incircle t enddef; -vardef excenter expr n of t = pathcenter excircle n of t enddef; -vardef ninepointcenter expr t = pathcenter ninepointcircle t enddef; - vardef barycenter expr t = - save n, m; n := length t; m := n + 1; - save xxx; - xxx : = pnt0 (t)/m for k = 1 upto n-1 : + pnt[k] (t)/m endfor; - if cycle t: xxx*(1 + 1/n) - else: xxx + pnt[n] (t)/m - fi + save m; m := length t if not cycle t: + 1 fi; + pnt0(t)/m for k = 1 upto m - 1: + pnt[k](t)/m endfor enddef; + vardef sector (expr center, rad, frtheta, totheta) = center -- arcalt (center, rad, frtheta, totheta) -- cycle enddef; -vardef mkfcn (expr smooth, tens) (expr bmin, bmax, bst) (text pf) = - save _p; pair _p[]; _p := 0; - save _dx, _n, _r; numeric _dx, _n, _r; - if bmax = bmin : _n := 1; +vardef mkfcn (expr sm, tens) (expr bmin, bmax, bst) (text pf) = + save _p; pair _p[]; _p := 0; + save _dx, _n, _r; numeric _dx, _n, _r; + if bmax = bmin: _n := 1; else: _r := bmax - bmin; _dx := max (abs(bst), nottoosmall*abs(_r), epsilon); _n := emax (round(abs(_r)/_dx), 1); fi for _i = 0 upto _n: _p[incr _p] := pf(bmin + _i/_n*_r); endfor - mkpath (smooth, tens, false, _p) + mkpath (sm, tens, false, _p) enddef; -def tfcn (expr smooth) = mkfcn (smooth, default_tension) enddef; -def parafcn (expr smooth) = tparafcn (smooth, default_tension) enddef; +def tfcn (expr sm) = mkfcn (sm, default_tension) enddef; + +def parafcn (expr sm) = tparafcn (sm, default_tension) enddef; vardef tparafcn (expr sm, tn) (expr bmin, bmax, bst) (text pf) = - save _fp; vardef _fp (expr t) = pf enddef; + save _fp; vardef _fp (expr t) = pf enddef; mkfcn (sm, tn) (bmin, bmax, bst) (_fp) enddef; -vardef xfcn (expr smooth) (expr xmin, xmax, st) (text _fx) = - save _fp; vardef _fp (expr _x) = (_x, _fx(_x)) enddef; - mkfcn (smooth, default_tension) (xmin, xmax, st) (_fp) +vardef xfcn (expr sm) (expr xmin, xmax, st) (text _fx) = + save _fp; vardef _fp (expr _x) = (_x, _fx(_x)) enddef; + mkfcn (sm, default_tension) (xmin, xmax, st) (_fp) enddef; -def function (expr smooth) = tfunction (smooth, default_tension) enddef; -vardef tfunction (expr smooth, tens) (expr xmin, xmax, st) (text _fx) = - save _fp; vardef _fp (expr x) = (x, _fx) enddef; - mkfcn (smooth, tens) (xmin, xmax, st) (_fp) +def function (expr sm) = tfunction (sm, default_tension) enddef; +vardef tfunction (expr sm, tens, xmin, xmax, st) (text _fx) = + save _fp; vardef _fp (expr x) = (x, _fx) enddef; + mkfcn (sm, tens) (xmin, xmax, st) (_fp) enddef; -def btwnfcn (expr sm) = tbtwnfcn (sm, default_tension) enddef; -vardef tbtwnfcn (expr sm, tn)(expr xlo, xhi, st)(text _fx)(text _gx) = +def btwnfcn (expr sm) = tbtwnfcn (sm, default_tension) enddef; +vardef tbtwnfcn (expr sm, tn, xlo, xhi, st)(text _fx)(text _gx) = tfunction (sm, tn) (xlo, xhi, st) (_fx) -- ( reverse tfunction (sm, tn) (xlo, xhi, st) (_gx) ) -- cycle enddef; -vardef rfcn (expr smooth) (expr tmin, tmax, st) (text ft) = - save _fq; vardef _fq (expr t) = (ft(t)) * (dir t) enddef; - mkfcn (smooth, default_tension) (tmin, tmax, st) (_fq) +def belowfcn (expr sm) = tbelowfcn (sm, default_tension) enddef; +vardef tbelowfcn (expr sm, tn, xlo, xhi, st)(text _fx) = + (xlo,0)--(xhi,0)-- + (reverse tfunction (sm, tn, xlo, xhi, st)(_fx))--cycle +enddef; + +vardef rfcn (expr sm, tmin, tmax, st) (text ft) = + save _fq; vardef _fq (expr t) = (ft(t)) * (dir t) enddef; + mkfcn (sm, default_tension) (tmin, tmax, st) (_fq) +enddef; + +def plrfcn (expr sm) = tplrfcn (sm, default_tension) enddef; +vardef tplrfcn (expr sm, tens, tmin, tmax, st) (text ft) = + save _fq; vardef _fq (expr t) = (ft) * (dir t) enddef; + mkfcn (sm, tens) (tmin, tmax, st) (_fq) +enddef; + +def btwnplrfcn (expr sm) = tbtwnplrfcn (sm, default_tension) enddef; +vardef tbtwnplrfcn (expr sm, tn, tlo, thi, st)(text _ft)(text _gt)= + tplrfcn (sm, tn, tlo, thi, st) (_ft) -- + ( reverse tplrfcn (sm, tn, tlo, thi, st) (_gt) ) -- cycle +enddef; + +def plrregion (expr sm) = tplrregion (sm, default_tension) enddef; +vardef tplrregion (expr sm, tn, tlo, thi, st) (text _ft) = + (0,0)--tplrfcn (sm, tn, tlo, thi, st ) (_ft)--cycle +enddef; +numeric tolerancefactor; +tolerancefactor := .02; +vardef mklevelset (expr sm, tens, X, Y, t, a, b, c, d) = + save _inside_; + vardef _inside_ (expr U, V) = + inside_levelset (U, V) and (a < U) and (U < b) + and (c < V) and (V < d) + enddef; + if not _inside_ (X, Y): + GBwarn "Invalid seed point for levelset."; + pairmax((a,c), pairmin((X,Y), (b,d)))&cycle + else: + save ls, W, A, B, prev, curr, seed; + pair ls[], prev, curr, seed; + seed := (X,Y); + ls := 0; W := 0; + + save _first_, _next_, get_next; + vardef _first_ (expr U) = _inside_ (U, Y) enddef; + vardef _next_ (expr ang) = + _inside_ (X_curr + t * cosd ang, Y_curr + t * sind ang) + enddef; + def get_next (expr angA, angB) = + X_curr := xpart curr; Y_curr := ypart curr; + ls[incr ls] := curr + t * dir (solve _next_ (angA, angB)); + prev := curr; curr := ls[ls]; + W := W + anglefromto (prev - seed, curr - seed); + enddef; + + interim tolerance := t*tolerancefactor; + ls[incr ls] := (solve _first_ (X, b), Y); + curr := ls[ls]; + interim tolerance := radian*tolerancefactor; + get_next (180, 0); + for n = 3 upto max_points: + A := angle (curr - prev); + get_next (A + 120, A - 120); + exitif ((abs(W) > 180) or (ls > 10)) + and (abs(ls[ls] - ls1) < 1.2t); + endfor + mkpath (sm, tens, true) (ls) + fi +enddef; + +numeric max_points; +max_points := 2000; + +def levelset (expr s) = tlevelset (s, default_tension) enddef; +vardef tlevelset (expr smth, tens, seed, seg) (text cond) = + save inside_levelset, _t; + vardef inside_levelset (expr x, y) = cond enddef; + _t := if seg <= 0: emax (xpos-xneg, ypos-yneg)/max_points * 20 + else: seg fi; + mklevelset (smth, tens, xpart seed, ypart seed, _t) + (xneg, xpos, yneg, ypos) +enddef; + +vardef lclosed expr f = + f + if not cycle f: + if pnt0(f) = pnt[infinity](f): & else: -- fi cycle + fi +enddef; + +def sclosed = sclosedt (default_tension) enddef; +vardef sclosedt (expr t) expr f = + if cycle f: f + else: save n; n := length f; + if n = 0: f&cycle + elseif n = 1: pnt0(f)..tension t..pnt1(f)..tension t..cycle + else: + (pnt0 (f)) { (pnt1(f)) - (pnt[n] (f)) }..tension t + ..(subpath (1, n-1) of f)..tension t + ..(pnt[n](f)) { pnt0(f) - pnt[n-1](f) } + ..tension t..cycle + fi + fi enddef; -def plrfcn (expr smooth) = tplrfcn (smooth, default_tension) enddef; -vardef tplrfcn (expr smooth, tens) (expr tmin, tmax, st) (text ft) = - save _fq; vardef _fq (expr t) = (ft) * (dir t) enddef; - mkfcn (smooth, tens) (tmin, tmax, st) (_fq) +def bclosed = bclosedt (default_tension) enddef; +vardef bclosedt (expr t) expr f = + f + if not cycle f: + if pnt0(f) = pnt[infinity](f): & else: ..tension t.. fi cycle + fi +enddef; + +def uclosed = bclosed enddef; +def uclosedt = bclosedt enddef; + +def cbcontrols (suffix b, t) = + b1 := 2[t3, t2]; + b2 := 2[t2, t1]; + b3 := 2[b1, b2]; + b4 := 2[b2, b3]; enddef; -vardef piechart (expr sign, ang, cent, rad) (text data) = - save _sum, _tot; - numeric piewedge; piewedge := 0; - numeric pieangle, pieangle[]; pieangle0 := 0; - for _val = data : - pieangle[incr piewedge] := pieangle[piewedge - 1] + _val; +vardef cbclosed expr f = + save n; n := length f; + if cycle f: f + elseif n = 0: f&cycle + else: + save p, q, t; pair p[], q[], t[]; + t1 := pnt0(f); t2 := post0(f); t3 := pre1(f); + cbcontrols (p, t); % defines p1 to p4 + t1 := pnt[n](f); t2 := pre[n](f); t3 := post[n-1](f); + cbcontrols (q, t); % defines q1 to q4 + f..controls q2 and q3..opencbs (q1,q4,p4,p1) + ..controls p3 and p2..cycle + fi +enddef; + +vardef qbclosed expr f = + if cycle f: f + else: save n; n := length f; + if n = 0: f&cycle + else: + save p; pair p[]; p := 4; + p1 := (3/2)[pnt[n](f), pre[n](f)]; + p2 := 2[p1, pnt[n](f)]; + p4 := (3/2)[pnt 0 (f), post0 (f)]; + p3 := 2[p4, pnt 0 (f)]; + f & mkqbs (p) & cycle + fi + fi +enddef; + +vardef makesector expr p = (pathcenter p)--p--cycle enddef; +vardef arccomplement expr p = + if cycle p: onepointpath (false, pnt0(p)) + else: + setnumeric (nn) length p; + setpairs (pp) (pnt0(p), pnt[.5nn](p), pnt[nn](p)); + arcpps (pp3,pp1,2*cornerangle(pp2,pp3,pp1)) + fi +enddef; + +vardef cutoffbefore (expr b) expr f = + save t, n; n := length f; + if n > 0: + for k = 1 upto n: + exitif (subpath (0,k) of f) intersects b; + endfor + if _Xtime < 0: + cuttings := pnt0 (f){0,0}; + f + else: + cuttings := subpath (0,_Xtime) of f; + subpath (_Xtime, n) of f + fi + else: f + fi +enddef; + +vardef cutoffafter (expr b) expr f = + setpath (g) cutoffbefore (b) reverse f; + cuttings := reverse cuttings; + reverse g +enddef; + +vardef trimmedpath (expr btrim, etrim) expr f = + save g, h; path g, h; + g := invvconv (fullcircle scaled 2btrim) shifted pnt0(f); + h := invvconv (fullcircle scaled 2etrim) shifted pnt[length f] (f); + cutoffafter (h) cutoffbefore (g) f +enddef; + +vardef predirection@# (expr p) = + - postdirection[length p - @#] (reverse p) +enddef; + +vardef postdirection@# (expr p) = + save _n; _n := length (p); + setpair (v) __dir (subpath (@#, @# + _n) of p); + if v = origin: + v := - __dir (subpath (@#, @# - _n) of p); + fi + v +enddef; + +vardef __dir (expr p) = + save v, w; pair v, w; w := pnt0 (p); + v := origin; + for n = 1 upto length (p): + v := post[n-1] (p) - w; exitif v <> origin; + v := pre [ n ] (p) - w; exitif v <> origin; + v := pnt [ n ] (p) - w; exitif v <> origin; + endfor + sgn v +enddef; + +vardef trivial expr p = (__dir (p) = origin) enddef; + +newinternal hdwdr, hdten; +boolean hfilled; + +def headshape (expr wr, tens, fil) = + interim hdwdr := wr; + interim hdten := if tens>0: tens else: default_tension fi; + if hdten < .75: hdten := .75; fi + setboolean (hfilled) fil; + mkheadpaths; +enddef; +def mkheadpaths = + save Arrowhead, Leftharpoon, Rightharpoon; + path Arrowhead, Leftharpoon, Rightharpoon, + Arrowhead.clear, Leftharpoon.clear, Rightharpoon.clear; + Rightharpoon := (0,0){down}..tension hdten..(.5hdwdr,-1); + Rightharpoon.clear := Rightharpoon--(.5hdwdr,0)--cycle; + Leftharpoon := (reverse Rightharpoon) xscaled -1; + Leftharpoon.clear := (reverse Rightharpoon.clear) xscaled -1; + Arrowhead := Leftharpoon & Rightharpoon; + Arrowhead.clear := Leftharpoon.clear & Rightharpoon.clear & cycle; + if hfilled: + Arrowhead := Arrowhead--cycle; + Rightharpoon := Rightharpoon--(0,-1)--cycle; + Leftharpoon := Leftharpoon--(0,-1)--cycle; + fi +enddef; +headshape (1,1,false); + +def head = ahead enddef; + +vardef ahead (expr clr, front, back, hwr, tens, filled) = + settension (_tn) tens; fixtension (_tn); + if front <> back: + setpair (side) (hwr/2) * ((front-back) rotated 90); + setpath (f) (back + side)..tension _tn.. + {front-back}front{back-front}..tension _tn..(back - side); + if clearhead: + safeunfill (back - side)--(front-side)--(front+side)-- + (back+side) & f & cycle; + colorsafedraw (background) (back - side)--(front-side)-- + (front+side)--(back+side) & f & cycle; + fi + if filled: + f := f--cycle; + colorsafefill (clr) f; + fi + colorsafedraw (clr) f; + fi +enddef; + +def headpath = Gheadpath (false) (Arrowhead) enddef; +def headpathx = Gheadpath (true) (Arrowhead) enddef; + +def colorheadpath = colorGheadpath (false) (Arrowhead) enddef; +def colorheadpathx = colorGheadpath (true) (Arrowhead) enddef; + +def Gheadpath (expr trim) (suffix ah) = + colorGheadpath (trim) (ah) (headcolor) +enddef; +vardef colorGheadpath +(expr trim) (suffix ah) (expr clr, sc, rot, pos) expr f = + if (sc <> 0) and (known ah) and (path ah): + convertpath (_g) f; + setpair (_P) predirection[length _g] (_g); + if _P <> origin: + _P := _P rotated rot; + setnumeric (_ang) anglefromto (up, _P); + _P := pnt[length _g] (_g) - pos * _P; + setpair (_tip) if known ah.tip: ah.tip else: origin fi; + + if trim: + if known ah.clear: + safeunfill (ah.clear shifted - _tip) + scaled sc + rotated _ang + shifted _P; + fi + setnumeric (_ys) max(bp, penwd, last_dot_size); + safeunfill cut_path + xscaled sc yscaled _ys + rotated _ang shifted _P; + fi + if cycle ah: colorsafefill else: colorsafedraw fi (clr) + (ah shifted -_tip) + scaled sc + rotated _ang + shifted _P; + fi + fi + f +enddef; + +def tailpath (suffix sh) = colortailpath (sh) (headcolor) enddef; +vardef colortailpath (suffix sh) (expr clr, sc, rot, pos) expr f = + if (sc <> 0) and (known sh) and (path sh): + convertpath (_g) f; + setpair(_P) postdirection0 (_g); + if _P <> origin: + _P := _P rotated rot; + if cycle sh: colorsafefill else: colorsafedraw fi (clr) + (sh if known sh.tip: shifted -sh.tip fi) + scaled sc + rotated anglefromto (up, _P) + shifted (pnt0 (_g) + pos * _P); + fi + fi + f +enddef; + +def midpath (suffix sh) = colormidpath (sh) (headcolor) enddef; +vardef colormidpath (suffix sh) (expr clr, sc, rot, pos) expr f = + if (sc <> 0) and (known sh) and (path sh): + convertpath (_g) f; + setnumeric (_t) pathtime[pos] (_g); + setpair (_P) postdirection[_t] (_g); + if _P <> origin: + _P := _P rotated rot; + if cycle sh: colorsafefill else: colorsafedraw fi (clr) + sh scaled sc + rotated anglefromto (up, _P) + shifted (pnt[_t] (_g)); + fi + fi + f +enddef; + +vardef signeddeviate primary X = + (uniformdeviate 1)[-X,X] +enddef; +vardef scaledeviate (expr W, A) = + 2 ** (signeddeviate W) * dir A +enddef; +vardef polardeviate primary R = + (uniformdeviate abs(R)) * dir uniformdeviate 360 +enddef; +vardef xydeviate primary Z = + (signeddeviate (xpart Z), signeddeviate (ypart Z)) +enddef; + +vardef randompair (expr maxshift) = + if numeric maxshift: polardeviate (maxshift) + elseif pair maxshift: xydeviate (maxshift) + else: (0,0) + fi +enddef; + +vardef detrivialized expr f = + save g; path p, g[]; g := 0; + for k = 1 upto length f: + p := subpath (k-1,k) of f; + if not trivial p: g[incr g] := p; fi endfor - _tot := pieangle[piewedge]; - pair piecenter; piecenter := cent; + if g = 0: onepointpath (cycle f, pnt0(f)) + else: g1 for k = 2 upto g: &g[k] endfor if cycle f: &cycle fi + fi +enddef; + +vardef randompath (expr maxshift, weirdness) expr f = + save g, n; path g; + g := detrivialized f; + n := length g; + if n = 0: + f shifted randompair (maxshift) + else: + save X, U, V; + pair X[], U[], V[]; + if cycle g: n := n - 1; fi + for k = 0 upto n: + X[k] := pnt[k](g); + U[k] := X[k] - pre[k](g); + V[k] := post[k](g) - X[k]; + endfor + save A, B; + for k := 0 upto n: + X[k] := X[k] shifted randompair (maxshift); + A := anglefromto (U[k],V[k]); + B := signeddeviate (30weirdness); + U[k] := X[k] - (U[k] zscaled scaledeviate (weirdness,B)); + B := B - A + A * (2 ** signeddeviate weirdness); + V[k] := X[k] + (V[k] zscaled scaledeviate (weirdness,B)); + endfor + X0 for k = 1 upto n: + .. controls V[k-1] and U[k] .. X[k] + endfor + if cycle g: + .. controls V[n] and U0 .. cycle + fi + fi +enddef; + +vardef randomlines (expr maxshift) expr f = + save g, n; path g; + g := detrivialized f; + n := length g; + if n = 0: + f shifted randompair (maxshift) + else: + if cycle g: n := n - 1; fi + (pnt0(g) shifted randompair (maxshift)) + for k = 1 upto n: + -- (pnt[k](g) shifted randompair (maxshift)) + endfor + if cycle g: + -- cycle + fi + fi +enddef; +vardef parasegment (expr d, segs, f) = + if d = 0: f + else: + save u, v, t; pair u[], v[]; + for n = 0 upto segs: + t := n/segs; + u[n] := postdirection [t] (f); + v[n] := pnt[t] (f) + (u[n] zscaled (0,d)); + endfor + v0{u0} + for n = 1 upto segs: ...v[n]{u[n]} endfor + fi +enddef; + +vardef parapath (expr d) expr f = + if d = 0: + f + else: + save a, g, h, p, q, s, t, u, v, w; + path g[], h, p[], q[]; + numeric a, s, t; + pair u, v, w, w[]; + s := emax (3, emin (segment_split, ceiling (max_points/5/length f))); + p := 0; + for i = 1 upto length f: + h := subpath (i-1, i) of f; + if not trivial h: + q[incr p] := h; + p[p] := parasegment (d, s, h); + fi + endfor + if p = 0: + f + else: + a := if d>0: - fi 180; + h := p1; + for i = 1 upto p-1: + u := predirection 1 (q[i]); + v := postdirection 0 (q[i+1]); + w1 := pnt 1 (q[i]) - (u zscaled (0,d)); + w2 := pnt 0 (q[i+1]) - (v zscaled (0,d)); + w3 := pnt [infinity] (h); + w4 := pnt 0 (p[i+1]); + g0 := arcpps(w3, w1, a); + g1 := h & g0; + g2 := arcpps(w2, w4, a) & p[i+1]; + if (p[i] & g0) intersects reverse g2: + s := length g2 - _Ytime; + t := length h - length p[i] + _Xtime; + g1 := subpath (0, t) of g1; + g2 := subpath (s, length g2) of g2; + force_equal_ends (g1, g2); + h := g1 & g2; + else: + h := h .. p[i+1]; + fi + endfor + + if cycle f: + u := predirection 1 (q[p]); + v := postdirection 0 (q[1]); + w1 := pnt 1 (q[p]) - (u zscaled (0,d)); + w2 := pnt 0 (q[1]) - (v zscaled (0,d)); + w3 := pnt [infinity] (h); + w4 := pnt 0 (p[1]); + g3 := arcpps(w3, w1, a); + g0 := arcpps(w2, w4, a); + g1 := g0 & h & g3; + g2 := g0 & p[1]; + if (p[p] & g3) intersects reverse g2: + s := length g2 - _Ytime; + t := length g0 + length h - length p[p] + _Xtime; + g1 := subpath (s, t) of g1; + force_equal_ends (g1, g1); + h := g1 & cycle; + else: + h := h..cycle; + fi + fi + h + fi + fi +enddef; + +vardef turnangle@# (expr f) = + anglefromto(predirection@# (f), postdirection@#(f)) +enddef; + +def setdatadashes (text lst) = + save __type; __type := 0; + forsuffixes _itm = lst: + if knownnumericarray _itm : + copyarray (_itm) (__type[__type]); + next __type; + else: GBwarn "Improper dash pattern in setdatadashes."; + fi + endfor + if __type > 1: + save dashtype; dashtype := __type; + for _j = 0 upto dashtype - 1: + copyarray (__type[_j]) (dashtype[_j]); + endfor + else: + SetdataWarn "dashes"; + fi +enddef; +def getdashpat expr n = dashtype[n mod dashtype] enddef; + +def SetdataWarn expr s = + GBwarn "command setdata"& s &"() failed. Previous values retained."; +enddef; + +numeric Solid, Simpledash, Simpledot, Dotdash, Dotdashdot, Dotdashdash; +dashpat (Solid) (0); +dashpat (Simple_dash) (3bp, 4bp); +dashpat (Simple_dot) (0, 4bp); +dashpat (Dot_dash) (0, 4bp, 3bp, 4bp); +dashpat (Dot_dash_dot) (0, 4bp, 3bp, 4bp, 0, 4bp); +dashpat (Dot_dash_dash) (0, 4bp, 3bp, 4bp, 3bp, 4bp); + +numeric dashtype, dashtype[], dashtype[][]; +def defaultdashes = + setdatadashes (Solid, Simple_dash, Simple_dot, + Dot_dash, Dot_dash_dot, Dot_dash_dash); +enddef; +defaultdashes; + +def setdatasymbols (text lst) = + save __type; path __type[]; + __type := 0; + for _itm = lst: + if (known _itm) and (path _itm): + __type[__type] := _itm; + next __type; + else: + GBwarn "Improper path in setdatasymbols()."; + fi + endfor + if __type > 1: + save pointtype; pointtype := __type; + path pointtype[]; + for _j = 0 upto pointtype - 1: + pointtype[_j] := __type[_j]; + endfor + else: + SetdataWarn "symbols"; + fi +enddef; +def getsymbol expr n := pointtype[n mod pointtype] enddef; + +def DeclareGBSymbols (text S) = + forsuffixes _itm = S: + path _itm; + path _itm.clear; + pair _itm.tip; + endfor +enddef; +DeclareGBSymbols( + Triangle, Square, Circle, Diamond, Star, Plus, Cross, + Asterisk, Crossbar, Leftbar, Rightbar, Righthook, + Lefthook, SolidTriangle, SolidSquare, SolidCircle, + SolidDiamond, SolidStar +); + +vardef undo_cycle expr f = subpath (0, length f) of f enddef; + +SolidTriangle := (up--(dir 210)--(dir -30)--cycle) scaled .78; +Triangle := undo_cycle SolidTriangle; + +Triangle.clear := SolidTriangle.clear := + ((dir -30)--(cosd 30,1)--(cosd 210,1)--(dir 210)--up--cycle) + scaled .78; + +SolidSquare := (up--(-1,1)--(-1,-1)--(1,-1)--(1,1)--cycle) scaled .443; +Square := undo_cycle SolidSquare; + +SolidCircle := fullcircle rotated 90; +Circle := undo_cycle SolidCircle; +Circle.clear := SolidCircle.clear := + halfcircle--(-.5,.5)--(.5,.5)--cycle; + +SolidDiamond := (up--left--down--right--cycle) + scaled .522 yscaled 1.44; +Diamond := undo_cycle SolidDiamond; +Diamond.clear := SolidDiamond.clear := + (right--(1,1)--(-1,1)--left--up--cycle) scaled .522 yscaled 1.44; + +Plus := ((0,0)--up--down--(0,0)--left--right) scaled .65; +Plus.clear := (right--(1,1)--(-1,1)--(left)--cycle) scaled .65; + +Cross := ((0,0)--(dir 45)--(dir -135)--(0,0)--(dir -45)--(dir 135)) + scaled .65; +Cross.clear := ((0,0)--(dir -45)--dir(45)--(dir 135)--(dir -135)--cycle) + scaled .65; + +Asterisk := ((0,0)--up--down--(0,0)--(dir 30)--(dir -150) + --(0,0)--(dir -30)--(dir 150)) scaled .6; +Asterisk.clear := ((0,0)--(dir -30)--(cosd 30,1)--(cosd 150,1) + --(dir -150)--cycle) scaled .6; + +Crossbar := ((0,0)--left--right) scaled .65; +Crossbar.clear := rect (right,(-1,.5)) scaled .65; + +Leftbar := ((0,0)--left); +Rightbar := ((0,0)--right); +Leftbar.clear := rect((0,0),(-1,.5)); +Rightbar.clear := rect((0,0),(1,.5)); + +Righthook := arcpps((0,0),(1,0),180); +Lefthook := Righthook xscaled -1; +Righthook.clear := Righthook--cycle; +Lefthook.clear := Lefthook--cycle; + +vardef mkstar (expr n, m) (suffix A) = + save ang; ang := 360/n; + A1 := up; A3 := up rotated ang; + A2 = (whatever)[A1, A1 rotated ( ang*m)]; + A2 = (whatever)[A3, A3 rotated (-ang*m)]; + for i = 4 upto 2n: + A[i] := A[i-2] rotated ang; + endfor + A := 2n; + mkpoly (true, A) +enddef; + +save _A; pair _A[]; +SolidStar := mkstar (5, 2, _A) scaled .84; +Star := undo_cycle SolidStar; +Star.clear := polyline (true) + (_A9, _A10, _A1, _A2, _A3, (xpart _A3, 1), (xpart _A9, 1)) scaled .84; +SolidStar.clear := Star.clear; + +forsuffixes S = + Triangle, Square, Circle, Diamond, Star, Plus, Cross, + Asterisk, Crossbar, Leftbar, Rightbar, Righthook, + Lefthook, SolidTriangle, SolidSquare, SolidCircle, + SolidDiamond, SolidStar : + S.tip := point 0 of S; +endfor +vardef gcd (expr n, m) = + save a, b, r; + a := emax (abs(m), abs(n)); + b := emin (abs(m), abs(n)); + if b > 0: + forever: + r := a mod b; + exitif r < 1; + a := b; b := r; + endfor + b + else: + a + fi +enddef; + +vardef lcm (expr n, m) = + n*m/gcd(n, m) +enddef; + +path cut_path; cut_path := (.5,0)--(.5,.71)--(-.5,.71)--(-.5,0)--cycle; + +numeric pointtype; path pointtype[]; +def defaultsymbols = + setdatasymbols( Circle, Cross, SolidDiamond, Square, Plus, + Triangle, SolidCircle, Star, SolidTriangle); +enddef; +defaultsymbols; + +def setdatacolors (text lst) = + save __type; color __type[]; + __type := 0; + for _itm = lst: + if (known _itm) and (color _itm): + __type[__type] := _itm; + next __type; + else: GBwarn "Improper color in setdatacolors()."; + fi + endfor + if __type > 1: + save colortype; colortype := __type; + color colortype[]; + for _j = 0 upto colortype - 1: + colortype[_j] := __type[_j]; + endfor + else: + SetdataWarn "colors"; + fi +enddef; +def getcolor expr n = colortype[n mod colortype] enddef; + +color dBlue, dOrange, dGreen, dMagenta, dCyan, dYellow; +dBlue := 0.80blue + .2white; +dOrange := 0.66yellow + .34red; +dGreen := 0.80green; +dMagenta := 0.85magenta; +dCyan := 0.85cyan; +dYellow := 0.85yellow; + +numeric colortype; color colortype[]; +def defaultcolors = + setdatacolors(black, red, dBlue, dOrange, dGreen, + dMagenta, dCyan, dYellow); +enddef; +defaultcolors; + +def computepie (suffix dat) (expr sign, ang, cent, rad) (text data) = +begingroup + save _tot, _max, _toobig; + _max := 0; dat := 0; + for _val = data: + dat[incr dat] := _val; + _max := emax (_max, _val); + endfor + if dat=0: GBwarn "piechart attempted with empty list."; + _toobig := 1; + else: + _toobig := infinity/dat; + fi + if _max > _toobig: + for _idx = 1 upto dat: + dat[_idx] := dat[_idx]/_toobig; + endfor + fi + for _idx = 2 upto dat: + dat[_idx] := dat[_idx - 1] + dat[_idx]; + endfor + _tot := dat[dat]; + for _idx = dat downto 2: + dat[_idx] := ang + sign*dat[_idx-1]/_tot*360; + endfor + dat1 := ang; dat[dat + 1] := ang + 360sign; +endgroup +enddef; + +def piechart (expr sign, ang, cent, rad) (text data) = + save _dat; + computepie (_dat) (sign, ang, cent, rad) (data); + mkpiewedges (_dat, cent, rad); +enddef; + +def mkpiewedges (suffix dat) (expr cent, rad) = + numeric piewedge, piedirection, pieangle, pieangle[]; + pair piecenter, piedirection[]; path piewedge[]; - numeric piedirection; pair piedirection[]; - pieangle[piewedge + 1] = ang + sign*360; - for _n = piewedge downto 1 : - pieangle[_n] := ang + sign*pieangle[_n - 1]/_tot*360; - piewedge[_n] = - sector(cent, rad, pieangle[_n], pieangle[_n+1]); - piedirection[_n] := dir(0.5[ pieangle[_n], pieangle[_n+1] ]); + piecenter := cent; + piedirection := pieangle := piewedge := dat; + for _idx = 1 upto dat: + pieangle[_idx] := dat[_idx]; + piewedge[_idx] := sector (piecenter, rad, dat[_idx], dat[_idx+1]); + piedirection[_idx] := dir(0.5[ dat[_idx], dat[_idx+1] ]); endfor - piedirection := pieangle := piewedge; enddef; -def barchart (expr start, sep, r, vert)(text data) = +def namedpiechart (suffix nm) (expr sign, ang, cent, rad) (text data) = + save _dat; + computepie (_dat) (sign, ang, cent, rad) (data); + setnumeric (nm) _dat; + pair nm.center, nm.direction[]; + path nm.wedge[]; + nm.center := cent; + for _idx = 1 upto _dat: + nm.wedge[_idx] := sector (cent, rad, _dat[_idx], _dat[_idx+1]); + nm.direction[_idx] := dir(0.5[ _dat[_idx], _dat[_idx+1] ]); + endfor +enddef; + +def barchart (expr firstbar, sep, r, vert)(text data) = numeric barbegin, barbegin[], barend, barend[], barlength, barlength[], barstart, barstart[], chartbar, barwd; path chartbar[]; - chartbar := 0; barwd := r*sep; - for _itm = data : - barend[incr chartbar] := if pair _itm: ypart _itm else: _itm fi; - barbegin[chartbar] := if pair _itm: xpart _itm else: 0 fi; + chartbar := 0; barwd := r*sep; + for _itm = data: + barend[incr chartbar] := if pair _itm: ypart _itm else: _itm fi; + barbegin[chartbar] := if pair _itm: xpart _itm else: 0 fi; endfor barbegin := barend := barlength := barstart := chartbar; - for _n = 1 upto chartbar : - barstart[_n] := start + sep*(_n-1); - barlength[_n] := barend[_n]; - chartbar[_n] := rect ((barbegin[_n], 0), ( barend[_n], barwd) ) - shifted (0, barstart[_n]) if vert: xyswap fi; + for _nn = 1 upto chartbar: + barstart[_nn] := firstbar + sep*(_nn-1); + barlength[_nn] := barend[_nn]; + chartbar[_nn] := rect ((barbegin[_nn], 0), ( barend[_nn], barwd)) + shifted (0, barstart[_nn]) if vert: xyswap fi; endfor enddef; +def namedbarchart (suffix nm) (expr first, sep, r, vert) (text data) = + save nm; +begingroup + save _bb, _ee, _ww; + path nm.bar[]; + nm := 0; _ww := r*sep; + for _itm = data: + _ee := if pair _itm: ypart _itm else: _itm fi; + _bb := if pair _itm: xpart _itm else: 0 fi; + nm.bar[incr nm] := rect ((_bb, 0), ( _ee, _ww) ) + shifted (0, first + sep*(nm-1)) if vert: xyswap fi; + endfor +endgroup +enddef; + picture totalpicture; boolean totalnull, currentnull; def clearit = @@ -2246,7 +3290,7 @@ enddef; def keepit = addto totalpicture also currentpicture; currentpicture := nullpicture; - totalnull := currentnull; + totalnull := totalnull or currentnull; currentnull := true; enddef; @@ -2256,13 +3300,13 @@ def addto_currentpicture = enddef; def mergeit (text do) = - if totalnull : + if totalnull: do currentpicture - elseif currentnull : + elseif currentnull: do totalpicture else: begingroup - save _v_; picture _v_; + save _v_; picture _v_; _v_ := currentpicture; addto _v_ also totalpicture; do _v_ @@ -2270,13 +3314,12 @@ def mergeit (text do) = fi enddef; -def shipit_ = - mergeit (shipout) -enddef; -def shipit = shipit_ enddef; +boolean noship; noship := false; +def shipit = if noship: else: mergeit (shipout) fi enddef; -numeric gcode; gcode := 0; +numeric gcode; gcode := 0; +input dvipsnam.mp; % end grafbase.mp endinput. %% diff --git a/Master/texmf-dist/source/generic/mfpic/grafbase.dtx b/Master/texmf-dist/source/generic/mfpic/grafbase.dtx index 0eadd2885a9..fe734cbcc84 100644 --- a/Master/texmf-dist/source/generic/mfpic/grafbase.dtx +++ b/Master/texmf-dist/source/generic/mfpic/grafbase.dtx @@ -1,32 +1,24 @@ % \iffalse -% Copyright 2002--2003, Daniel H. Luecking +% ------------------------------------------------------------------- % -% Mfpic consists of the 3 files mfpic.dtx, grafbase.dtx and mfpic.ins -% and the 5 files they generate: mfpic.tex, mfpic.sty, grafbase.mf, -% grafbase.mp, and dvipsnam.mp. +% Copyright 2002--2006, Daniel H. Luecking % % Mfpic may be distributed and/or modified under the conditions of the -% LaTeX Project Public License, either version 1.2 of this license or (at +% LaTeX Project Public License, either version 1.3b of this license or (at % your option) any later version. The latest version of this license is in +% <http://www.latex-project.org/lppl.txt> +% and version 1.3b or later is part of all distributions of LaTeX version +% 2003/12/01 or later. % -% http://www.latex-project.org/lppl.txt -% -% and version 1.2 or later is part of all distributions of LaTeX version -% 1999/12/01 or later. -% -% Documentation, examples, and ancillary files are separate and not -% covered by this license. See readme.1st for a complete list. See -% individual files for any copyright and license restrictions. -% -% With respect to the proposed draft LPPL-1.3: mfpic has maintenance -% status "maintained". The Current Maintainer is Daniel H. Luecking. There -% are several Base Interpreters: TeX, LaTeX, MetaPost and Metafont. +% Mfpic has maintenance status "author-maintained". The Current Maintainer +% is Daniel H. Luecking. There are several Base Interpreters: plain TeX, LaTeX, +% plain Metafont and plain MetaPost. % %<*driver> +\ProvidesFile{grafbase.dtx} + [2006/05/26 v0.9. Metafont/post macros to interface with mfpic.]% \documentclass[draft]{ltxdoc} \usepackage{docmfp} -\def\fileversion{0.7a beta} -\def\filedate{2004/04/16} \addtolength{\textwidth}{.5878pt} @@ -41,17 +33,18 @@ \def\Grafbase{\prog{Grafbase}} \def\mfpic{\prog{mfpic}} \def\Mfpic{\prog{Mfpic}} -\def\MF{\prog{metafont}} -\def\MP{\prog{metapost}} -\def\CMF{\prog{Metafont}} -\def\CMP{\prog{Metapost}} +\def\MF{\prog{meta\-font}} +\def\MP{\prog{meta\-post}} +\def\PS{\prog{Post\-Script}} +\def\CMF{\prog{Meta\-font}} +\def\CMP{\prog{Meta\-post}} \def\opt#1{{\sffamily\upshape#1}} -\def\env#1{{\mytt#1}} -\let\file\env -\let\mfc\env -\let\gbc\env -\renewcommand\{{\char`\{} -\renewcommand\}{\char`\}} +\def\mfc#1{{\mytt#1}} +\let\env\mfc +\let\file\mfc +\let\gbc\mfc +\renewcommand\{{{\mytt\char`\{}} +\renewcommand\}{{\mytt\char`\}}} \renewcommand\|{${}\mathrel{|}{}$} \makeatletter @@ -67,6 +60,8 @@ \renewcommand\labelitemiii{\textperiodcentered} \leftmargini\parindent % Stupid index! +\def\usage#1{\textrm{#1}} +\def\index@prologue{\section*{Index}\markboth{Index}{Index}} \def\IndexParms{% \parindent \z@ \columnsep 15pt \parskip 0pt plus 1pt @@ -86,7 +81,10 @@ \string\verb\quotechar*\verbatimchar\string#1\verbatimchar #2 \encapchar usage}% \@esphack} +\def\close@crossref{\SpecialEscapechar{:}} \makeatother +\def\VariableIndex#1{\SpecialMfpIndex{#1}{\variablestring}{}} +\def\RoutineIndex #1{\SpecialMfpIndex{#1}{}{}} \def\pdfTeX{\textrm{pdf\kern.04em\TeX}} \def\pdfLaTeX{\textrm{pdf\kern.06em\LaTeX}} @@ -99,6 +97,8 @@ Geoffrey Tobin and Dan Luecking. Dan wrote this documentation.}} \author{Dan Luecking} \date{\filedate} +\SpecialEscapechar{:} +\def\bslash{:} \DisableCrossrefs \CodelineIndex \AlsoImplementation @@ -110,7 +110,7 @@ %</driver> %\fi % -% \CheckSum{1} +% \CheckSum{1369} % \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 @@ -128,6 +128,7 @@ % Right brace \} Tilde \~} % % \catcode`\_=12 +% \GetFileInfo{grafbase.dtx} % \maketitle % % \begin{abstract} @@ -136,88 +137,112 @@ % \file{.mp} file that, with the help of these macros and \MF{} (or \MP), % can be used to create pictures in the document, especially mathematical % pictures. There are two versions of \grafbase, one for \MF{} and one for -% \MP{}. As they are alike more than unlike, we document both here. +% \MP{}. As they are more alike than different (96\% of the code is +% identical), we document both here. % % This file documents the \grafbase{} source code. The user manual for -% \mfpic{} is \file{mfpicdoc.tex}. +% \mfpic{} is distributed as \file{mfpman.pdf} produced from +% \file{mfpman.tex}. % \end{abstract} % % \StopEventually{\PrintIndex} % \tableofcontents % -% % \section{Introduction}\label{intro} % % \subsection{Identification and checks}\label{checks} % -% We start with identifying information. Then we detect if grafbase was -% loaded already, but we don't do anything about it except write a -% message. -% -% The \gbc{grafbaseversion} is required to match the definition of -% \cs{mfpicversion} in \file{mfpic.tex}. The output file written by the -% \mfpic{} macros includes a test that these are the same, but that would -% fail to catch a new \grafbase{} with an old \mfpic. So we also put a test -% here, and it alone would fail to catch the use of older versions of -% \grafbase{} with current versions of \mfpic. Newer versions of \mfpic{} -% signal their version before inputting \file{grafbase}. Unfortunately -% (for error checking), \grafbase{} can also be used without \mfpic, so if -% \gbc{mfpicversion} is unknown, we merely write a message. +% \DescribeVariable{grafbaseversion} We use \mfc{grafbaseversion} to +% check if \prog{grafbase} has been previously loaded, later we use it +% to check a mismatch with the version of \mfpic{} (if used). +% \gbc{grafbase} was used in previous versions. If either is known, we +% bail out. The \gbc{grafbase} boolean is really never needed, but it +% has been around since I took over. It is possible to write files that +% change behavior when \grafbase{} is loaded, however if they say +% ``\gbc{if grafbase:}, they can only be called with \gbc{grafbase} a +% known boolean. % -% It might be possible (at some point) to optimize things for \mfpic{} use -% whenever \gbc{mfpicversion} is defined, but so far we don't do anything -% except test the version and set this boolean. +% \VariableIndex{fileversion} \gbc{fileversion} and +% \VariableIndex{filedate} \gbc{filedate} provide identifying information. % % \DescribeRoutine{GBmsg} -% \DescribeRoutine{GBerrmsg} % These are used fairly consistently and identify the source of the -% message delivered as being \gbc{"Grafbase"}. The \gbc{GBerrmsg} takes -% care of both the error message and the \mfc{errhelp} string. +% message delivered as being `\gbc{Grafbase}'. \DescribeRoutine{GBwarn} +% Warnings are delivered by \gbc{GBwarn}. The takes care of both the +% \DescribeRoutine{GBerrmsg}\gbc{GBerrmsg}error message and the +% \mfc{errhelp} string. % \begin{macrocode} %<*MF|MP> -string fileversion, filedate; -fileversion := "0.7a beta"; filedate := "2004/04/16"; -def GBmsg expr s = message "Grafbase: " & s; enddef; -def GBerrmsg (expr s) expr t = - errhelp t; - errmessage "Grafbase: "& s; - errhelp ""; -enddef; -if (known grafbaseversion) or (known grafbase) : - GBmsg "You have loaded grafbase more than once! " & - "Please make sure that it is loaded only once."; +if (known grafbaseversion) or (known grafbase): + message "Grafbase (" & jobname & "): You have loaded grafbase more " + & "than once! Please make sure that it is loaded only once."; endinput; fi - boolean grafbase; grafbase := true; -boolean MFPIC; MFPIC := false; + +string fileversion, filedate; +fileversion := "0.9"; filedate := "2006/05/26"; + +message " Loading grafbase macros, version " & fileversion & " " & + filedate & "."; + +def GBmsg expr s = message "Grafbase (" & jobname & "): " & s; enddef; +def GBwarn expr s = GBmsg "Warning, " & s; enddef; +def GBerrmsg (expr s) expr t = errhelp t; + errmessage "Grafbase (" & jobname & "): " & s; errhelp ""; +enddef; + +% \end{macrocode} +% +% \DescribeVariable{MFPIC} +% The \gbc{MFPIC} variable is not yet used at all. +% It might be possible (at some point) to optimize things for \mfpic{} use +% whenever \gbc{mfpicversion} is defined, but so far we don't do anything +% except test the version and set this boolean. +% +% \DescribeVariable{mfpicversion} +% The output file written by the \mfpic{} macros includes a test that +% \gbc{mfpicversion} and \mfc{grafbaseversion} are the same, +% but that would fail to catch a new \grafbase{} with an old \mfpic. So +% we also put a test here with \DescribeRoutine{checkversions} +% \gbc{checkversions}, though it alone would fail to catch the use +% of older versions of \grafbase{} with current versions of \mfpic. Newer +% versions of \mfpic{} signal their version before inputting +% \file{grafbase}. Unfortunately (for error checking), \grafbase{} can +% also be used without \mfpic, so if \gbc{mfpicversion} is unknown, we +% merely write a message. +% \begin{macrocode} +boolean MFPIC; MFPIC := false; def checkversions (expr g)= - numeric grafbaseversion; grafbaseversion := g; - if unknown mfpicversion : % no mfpic, or < 0.63 + numeric grafbaseversion; grafbaseversion := g; + if unknown mfpicversion: % no mfpic, or < 0.63 GBmsg "Recent mfpic not detected."; - elseif g = mfpicversion : + elseif g = mfpicversion: MFPIC := true; else: - GBerrmsg ("version mismatch") - "The installation may be broken: mfpic and grafbase " & - "versions do not match."; + message ""; + GBwarn "Version mismatch: " + & "mfpic and grafbase versions do not match."; + message ""; fi enddef; -checkversions (70); +checkversions (90); % \end{macrocode} % We try to make sure that the macros of \file{plain.mf} or -% \file{plain.mp} are available. +% \file{plain.mp} (where \mfc{base_name} is defined to be \mfc{"plain"}) +% are available. % \begin{macrocode} -if unknown base_name : input plain; -elseif not string base_name : input plain; -elseif base_name <> "plain" : input plain; +if unknown base_name : input plain; +elseif not string base_name: input plain; +elseif base_name <> "plain": input plain; fi % \end{macrocode} % +% \DescribeVariable{METAPOST} % We try to determine which of \MF{} or \MP{} is using these macros. % Perhaps one day we'll merge both versions of \grafbase{} in one file and % use the following boolean. For now, we only use it to catch cases where @@ -225,59 +250,55 @@ fi % % Of course, \MP{} natively knows about colors but \MF{} doesn't, so we % use that to set a boolean \gbc{METAPOST}. We don't simply check if -% \mfc{known blue} is \mfc{true} because `\mfc{blue}' is certainly a legal -% variable name in \MF. Instead we check \mfc{known color X} for -% some unlikely \gbc{X}. In \MP, \gbc{color X} is either true or +% `\mfc{known blue}' is \mfc{true} because `\mfc{blue}' is certainly a legal +% variable name in \MF. Instead we check `\mfc{known color X}' for +% some unlikely \gbc{X}. In \MP, `\gbc{color X}' is either true or % false (\gbc{X} is a color or it isn't) and therefore always known, so -% \gbc{known color X} is always true. +% `\gbc{known color X}' is always true. % -% In \MF{} \mfc{color X} is an identifier (presumably unknown) with the +% In \MF{} `\mfc{color X}' is an identifier (presumably unknown) with the % base name \mfc{color} and suffix \mfc{X}. % \begin{macrocode} boolean METAPOST; -if known color Maurits Cornelis Escher : METAPOST := true; -else: METAPOST := false; +if known color Geamparalele din Babadag: + METAPOST := true; +else: + METAPOST := false; fi %<*MF> -if METAPOST : - GBerrmsg ("wrong compiler") - "You may have input to Metapost a file designed for Metafont. " & - "Instead of the file grafbase.mf, Metapost should be using " & - "grafbase.mp. Make sure Metapost can find it."; +if METAPOST: + GBerrmsg ("wrong compiler.") + "This file is for Metafont. For Metapost use grafbase.mp."; fi %</MF> %<*MP> -if not METAPOST : - GBerrmsg ("wrong compiler") - "You may have input to Metafont a file designed for Metapost. " & - "Instead of the file grafbase.mp, Metafont should be using " & - "grafbase.mf. Make sure the extension was not changed."; +if not METAPOST: + GBerrmsg ("wrong compiler.") + "This file is for Metapost. For Metafont use grafbase.mf."; fi %</MP> % \end{macrocode} % % \DescribeRoutine{GBdebug} -% \DescribeRoutine{GBenddebug} % The \gbc{debug} flag is for developers, who should set it before -% inputing \file{grafbase}. These two routines start and end debug -% messages. +% inputing \file{grafbase}. +% \DescribeRoutine{GBenddebug} +% These two routines start and end debug messages. % % \DescribeRoutine{mftitle} % The \gbc{mftitle} macro is useful when debugging. % It will put its argument, which should be a string, as a TFM comment, % and also print it to the terminal and log file. % \begin{macrocode} -if (unknown debug) or (not boolean debug) : - boolean debug; debug := false; -fi +if not boolean debug: boolean debug; debug := false; fi def GBdebug = begingroup - save >>; def >> = message enddef; - >> "Grafbase DEBUG: "; + save >>; def >> = message enddef; + >> "Grafbase DEBUG"; enddef; def GBenddebug = >> "End DEBUG"; @@ -285,21 +306,23 @@ def GBenddebug = enddef; vardef mftitle expr t = - t; message t; + if string t: t; message t; fi enddef; % \end{macrocode} % -% \subsection{Setting up the font}\label{font} +% \subsection{Setting up the font, \MF{} only}\label{font} % -% Font-related housekeeping is for \MF{} only. \MF{} only produces +% Font-related housekeeping is only for \MF{}. \MF{} only produces % fonts, so we have to define the variables it thinks are needed for % fonts. % +% \DescribeVariable{GBgeneric} % We intercept the \mfc{mode} variable before \mfc{mode_setup} can set -% \mfc{proof} mode. We used to set \mfc{mode := cx} if it was unknown, -% then for a while we just issued an error message; in this version we -% try \mfc{ljfour}. +% \mfc{proof} mode. We used to set \mfc{mode := cx} (and later +% \mfc{ljfour}) if it was unknown. For a while we just issued an error +% message. In this version we define a 600dpi mode called \mfc{GBgeneric} +% as a fallback (neither \gbc{mode} nor \gbc{localfont} known). % % The font identifier and coding scheme are just for information and end % up as comments in the \file{.tfm} file (in all capitals). The design @@ -307,15 +330,29 @@ enddef; % anyway the default if we didn't set it ourselves. % \begin{macrocode} %<*MF> -if unknown mode : - GBerrmsg ("unknown Metafont mode") - "Please use \mode:=localfont; or a mode known on your " & - "system. If you continue, ljfour mode will be tried."; - mode := lfjour; +if unknown mode: + GBerrmsg ("Metafont mode is unknown.") + "Set mode to a known mode. Perhaps localfont or ljfour. " + & "If you proceed, a generic 600dpi mode will be used."; + if known localfont: mode := localfont; + else: + mode_def GBgeneric = + proofing := 0; + fontmaking := 1; + tracingtitles := 0; + if unknown pixels_per_inch: + pixels_per_inch := 600; + fi + blacker := 0; + fillin := 0; + o_correction := 1; + enddef; + mode := GBgeneric; + fi fi mode_setup; -if debug : +if debug: GBdebug; >> "pixels_per_inch = " & decimal pixels_per_inch; GBenddebug; @@ -335,51 +372,74 @@ interim designsize := 128pt#; % two versions of the \file{grafbase} files. Then we define % \gbc{currenttransform} for \MP{} sake. % \begin{macrocode} -%<MP>pt# := 1pt; -%<MP>def t_ = transformed currenttransform enddef; -if unknown aspect_ratio: aspect_ratio := 1; fi -if unknown hppp : hppp := 1 fi; -if unknown currenttransform : +%<MP>pt# := pt; bp# := bp; +%<MP>def t_ = transformed currenttransform enddef; +if unknown aspect_ratio: aspect_ratio := 1; fi +if unknown hppp: hppp := 1 fi; +if unknown currenttransform: transform currenttransform; currenttransform := identity yscaled aspect_ratio; fi % \end{macrocode} % -% Don't complain when variables get too large. For \MF{} this has to be -% after \mfc{mode_setup}, which sets \mfc{warningcheck := 1}. Also don't -% complain if a clockwise path is filled (\MF). +% Don't complain when variables get too large. For \MF{} this \emph{must} +% be after \mfc{mode_setup}. Also don't complain if a clockwise path is +% filled (only \MF{} does this). % \begin{macrocode} -%<MF>interim turningcheck := 0; interim warningcheck := 0; +%<MF>interim turningcheck := 0; + % \end{macrocode} % % \subsection{Initializations}\label{init} % -% Picture size variables would normally be set by a user for each -% picture, or by \mfpic, but we give them default values anyway. +% \VariableIndex{unitlen} +% \VariableIndex{xscale} +% \VariableIndex{yscale} +% \VariableIndex{xneg} +% \VariableIndex{xpos} +% \VariableIndex{yneg} +% \VariableIndex{ypos} +% The following are the various variables determining the extent of a +% picture. These variables would normally be set by a user for each +% picture, or by \mfpic, but we give them default values anyway. They +% give a nominal picture size of one inch with a graph unit corresponding +% to $1/10$ inch. % \begin{macrocode} numeric unitlen, xscale, yscale, xneg, xpos, yneg, ypos; -%<MF>unitlen := 1 bp#; -%<MP>unitlen := 1 bp; -xscale := 7.2; % (xscale * unitlen) = 1/10 inch -yscale := 7.2; % (yscale * unitlen) = 1/10 inch -xneg := 0; xpos := 10; -yneg := 0; ypos := 10; +unitlen := 1 bp#; +xscale := 7.2; +yscale := 7.2; +xneg := 0; xpos := 10; +yneg := 0; ypos := 10; % \end{macrocode} % +% \DescribeVariable{deg}\VariableIndex{degree} % We support both degrees and radians for angles. In \MF, one degree is -% the unit of angle. One radian is $180/\pi$ degrees. A user can say -% \gbc{90} or \gbc{90deg} or \gbc{pi/2*radian} for the same effect. -% \begin{macrocode} -newinternal radian, pi, deg; -deg := 1; pi := 3.14159; -radian := 180/pi; - -% \end{macrocode} -% +% the unit of angle. +% \DescribeVariable{radian} +% One radian is $180/\pi$ degrees. We also define \gbc{pi} so a user can say +% \gbc{90} or \gbc{90deg} or \gbc{pi/2*radian} +% \DescribeVariable{pi} for the same effect. +% Actually, not quite: because of \MF{}'s precision limits, the latter is +% about 90.00025 degrees. \MF{}'s precision is 16 binary places, or +% slightly under 5 decimals. The accuracy of \gbc{pi} and \gbc{radian} is +% the maximum possible. If we \emph{define} \gbc{radian} to be +% \gbc{90/(pi/2)} or \gbc{180/pi} the value of \gbc{pi/2*radian} is even +% less accurate. +% \begin{macrocode} +newinternal deg, pi, radian; +deg := 1; pi := 3.14159; +radian := 57.29578; +numeric degree; degree := deg; + +% \end{macrocode} +% +% \VariableIndex{drawpen} +% \VariableIndex{penwd} % \DescribeRoutine{resizedrawpen} % Since we need to do this frequently, we define a macro that changes the % pen width for subsequent drawing. This enables the file written by @@ -388,7 +448,8 @@ radian := 180/pi; % and \gbc{drawpen}. (We already had this for different % \gbc{beginmfpic}, since that reinitializes drawpen, but now it is local % to other groups as well.) - +% +% \VariableIndex{hatchpen} % We could do this for the hatching pen, but it doesn't seem to change as % often. The \mfc{pickup} command performs \mfc{yscaled aspect_ratio}, but % so does the \gbc{shpath}, the only other place pens are required. In @@ -398,35 +459,41 @@ radian := 180/pi; % journal publisher (e.g., AMS) recommend no smaller than \mfc{.5bp} for % author-supplied drawings. % +% \VariableIndex{hatchwd} % The default \gbc{hatchwd} used to be larger, but it seemed ugly to me. % (Backward compatibility? What's that?). % \begin{macrocode} -newinternal penwd; penwd := 0.5pt; +newinternal penwd; penwd := 0.5pt; pen drawpen; def resizedrawpen (expr s) = interim penwd := s; - setvariable (pen) (drawpen) (pencircle scaled penwd); - save currentpen; pen currentpen; pickup drawpen; + setvariable (pen) (drawpen) pencircle scaled penwd; + save currentpen; pen currentpen; pickup drawpen; enddef; -numeric hatchwd; hatchwd := 0.5bp; -pen hatchpen; hatchpen := pencircle scaled hatchwd; +numeric hatchwd; hatchwd := 0.5bp; +pen hatchpen; hatchpen := pencircle scaled hatchwd; % \end{macrocode} % +% \DescribeVariable{clipall} % We have two booleans related to clipping. One, \gbc{clipall} is meant to % be turned on just once (per picture), and it causes the \gbc{endmfpic} % code to clip the current picture to the boundaries defined by the -% picture size variables. The other, \gbc{ClipOn}, is meant to be turned -% on and off. While on, most drawing macros (all?) will clip their result -% to the current \emph{clipping path array}. The clipping path array is an -% array of paths: \gbc{ClipPath[]} together with a numeric \gbc{ClipPath}. -% The numeric variable contains the number of clipping paths; the paths -% are \gbc{ClipPath[1]} through \gbc{ClipPath[ClipPath]}. A macro later on -% is defined to loop through the array, clipping the current picture to -% the union of their interiors. -% +% picture size variables. The other, +% \DescribeVariable{ClipOn} +% \gbc{ClipOn}, is meant to be turned on and off. While on, most drawing +% macros (all?) will clip their result to the current \emph{clipping path +% array}. +% \DescribeVariable{ClipPath} +% The clipping path array is an array of paths: \gbc{ClipPath[\,]} together +% with a numeric \gbc{ClipPath}. The numeric variable contains the number +% of clipping paths; the paths are \gbc{ClipPath[1]} through +% \gbc{ClipPath[ClipPath]}. A macro later on is defined to loop through +% the array, clipping the current picture to the union of their interiors. +% +% \DescribeVariable{truebbox} % The \gbc{truebbox} boolean sets the bounding box of the picture to its % natural size in \MP. The default behavior of \MP{} is to output a % bounding box that is the natural size of the graphic. The \grafbase{} @@ -444,24 +511,25 @@ pen hatchpen; hatchpen := pencircle scaled hatchwd; % For debugging we sometimes want to make sure something is drawn % without clipping being applied. For this we have \gbc{noclip}. % \begin{macrocode} -boolean clipall; clipall := false; -boolean ClipOn; ClipOn := false; -path ClipPath[]; numeric ClipPath; ClipPath = 0; -boolean truebbox; truebbox := false; +boolean clipall; clipall := false; +boolean ClipOn; ClipOn := false; +path ClipPath[]; numeric ClipPath; ClipPath = 0; +boolean truebbox; truebbox := false; def DoClip (suffix v) = - if ClipOn and (ClipPath > 0) : clipsto (v, ClipPath); fi + if ClipOn and (ClipPath > 0): clipsto (v, ClipPath); fi enddef; def noclip (text t) = - hide( save ClipOn; boolean ClipOn; ClipOn := false; t) + hide ( setboolean (ClipOn) false; t) enddef; % \end{macrocode} % +% \DescribeVariable{showbbox} % The boolean \gbc{showbbox} is for debugging the \gbc{*bbox} macros. % \begin{macrocode} -boolean showbbox; showbbox := false; +boolean showbbox; showbbox := false; % \end{macrocode} % @@ -473,29 +541,36 @@ boolean showbbox; showbbox := false; % colors where the coordinates are 0 or 1. % % \DescribeRoutine{color} -% We begin trying to merge the format of mfpic output files by defining -% \MF{} replacements for some of the \MP{} color variables and macros. Our -% point of view will be: make each color variable a numeric in \MF. Each -% will lie between $0$ and $1$ representing shades of gray. For -% \emph{drawing} commands we will only between nonwhite (black, ${}<1$) or -% white (${}=1$). For filling commands we will allow levels in between, -% and fill with an approximation using a version of \gbc{shade} +% We define \MF{} replacements for some of the \MP{} color variables and +% macros. Our point of view will be: make each color variable a numeric in +% \MF{}. Each will lie between $0$ and $1$ representing shades of gray. +% For \emph{drawing} commands we will only distinguish between nonwhite +% (black, ${}<1$) and white (${}\ge1$). For filling commands we will allow +% levels in between, and fill with an approximation using a version of +% the \gbc{shade} macro. % \begin{macrocode} %<*MF> -let color = numeric; color black, white; -black := 0; white := 1; -def _wc_ = killtext enddef; +let color = numeric; color black, white; +black := 0; white := 1; +def withcolor text t = enddef; %</MF> -%<MP>def _wc_ = withcolor enddef; +def _wc_ = withcolor enddef; % \end{macrocode} % +% \VariableIndex{currentcolor} +% \VariableIndex{drawcolor} +% \VariableIndex{fillcolor} +% \VariableIndex{hatchcolor} +% \VariableIndex{headcolor} +% \VariableIndex{pointcolor} +% \VariableIndex{tlabelcolor} % We also define some color variables whose names reflect their use. % Thus, \gbc{fillcolor} is used for filling, etc. The color % \gbc{currentcolor} isn't used anywhere yet. The color % \mfc{background} is used in \MP{} for unfilling a region. % \begin{macrocode} -color currentcolor, fillcolor, drawcolor, hatchcolor, +color currentcolor, drawcolor, fillcolor, hatchcolor, headcolor, pointcolor, tlabelcolor, background; currentcolor := fillcolor := drawcolor := hatchcolor := headcolor := pointcolor := tlabelcolor := black; @@ -508,11 +583,11 @@ background := white; % ($0$) for unknown and non-numeric input. % \begin{macrocode} vardef snapto expr t = - if unknown t : 0 - elseif not (numeric t) : 0 - elseif t < 0 : 0 - elseif t > 1 : 1 - else : t + if unknown t: 0 + elseif not (numeric t): 0 + elseif t < 0: 0 + elseif t > 1: 1 + else: t fi enddef; @@ -536,7 +611,9 @@ enddef; % models do, it assigns different graylevels to the eight colors that have % components 0 or 1 only, and it is biased toward lighter grays. Of course % it takes \mfc{black} to 0 and \mfc{white} to 1. In \MP, it simply turns -% three numeric parameters to a color triple in the obvious way. +% three numeric parameters to a color triple in the obvious way. It does +% \emph{not} truncate the parameters, so if that is necessary, use +% \gbc{rgb}. % % \DescribeRoutine{rgb} % To simplify \mfpic, we have the nearly redundant \gbc{rgb} which @@ -544,7 +621,7 @@ enddef; % it formally the identity function under \MP, we define it to handle % unknowns, and truncate out of range values. % \begin{macrocode} -vardef gray (expr g) = (snapto g)*white enddef; +vardef gray (expr g) = (snapto g)*white enddef; vardef makeclr (expr r, g, b) = %<MF> gray (sqrt((2r*r + 4g*g + b*b)/7)) @@ -572,25 +649,27 @@ enddef; % This merely rescales numbers in the range 0--255 to the range 0--1. % % \DescribeRoutine{named} +% These last two, like \gbc{rgb}, are nearly redundant, but they convert +% numerics to gray, and convert other non-color variables and unknown +% color variables to black. % \DescribeRoutine{forceclr} -% These, too, are nearly redundant, but they convert numerics to gray, and -% convert other non-color variables and unknown color variables to -% black. The difference between \gbc{named} and \gbc{forceclr} is that the -% former requires a suffix parameter, while the latter takes an -% expression. It may be that the latter will never be needed, but for a -% time it seemed there were cases where we ought to use it to force an -% expression to be a color. +% The difference between \gbc{named} and \gbc{forceclr} is that the +% former requires a suffix parameter (that is, a \emph{name}), while the +% latter takes an expression. It may be that the latter will never be +% needed, but for a time it seemed there were cases where we ought to use +% it to force an expression to be a color. % \begin{macrocode} vardef RGB (expr R, G, B) = rgb (R/255, G/255, B/255) enddef; -vardef named (suffix c) = forceclr (c) enddef; +vardef named (suffix c) = + if unknown c: black else: forceclr (c) fi +enddef; vardef forceclr (expr c) = - if unknown c : black - elseif numeric c : gray (c) - elseif color c : c - else : black + if numeric c: gray (c) + elseif color c: c + else: black fi enddef; @@ -610,16 +689,16 @@ yellow := rgb (1, 1, 0); % % \subsection{Arrays}\label{arrays} % -% \gbc{ClipPath} is a standard example of an array. It is based on the -% fact that a variable can be of a different type from (and can be -% almost completely unrelated to) the variables formed by putting numeric +% \gbc{ClipPath} is a typical example of an array. Arrays are based on the +% fact that a variable can be of a different type from (and can be almost +% completely unrelated to) the variables formed by putting numeric % suffixes on it. % % \DescribeRoutine{list} % The \gbc{list} macro is essentially due to Frank Michielsen, and assigns % a \emph{list} (i.e., a comma separated sequence of expressions) to an % array. Note that the items in the list have to be the same type, and the -% same type as \mfc{v[]}. But \mfc{v} itself must be numeric. +% same type as \mfc{v[\,]}. But \mfc{v} itself must be numeric. % % \DescribeRoutine{map} % The \gbc{map} macro takes two text parameters. The first is any @@ -630,36 +709,42 @@ yellow := rgb (1, 1, 0); % the original version started with a comma indicating an empty starting % expression (normally it would be ignored and that turn through the loop % skipped). However, it managed to produce an error in a reasonable -% but unforeseen usage and so I added the \gbc{_map} variable that -% skips the comma on the first time through the loop. This routine is -% currently only used in the code \mfpic's \cs{plr} writes. -% \begin{macrocode} -vardef list (suffix v) (text lst) = - v := 0; for _itm = lst: v[incr v] := _itm; endfor +% but unforeseen usage (which I've since forgotten) and so I added the +% \gbc{_map} variable that skips the comma on the first time through the +% loop. This routine is currently only used in the code that \mfpic's \ +% \cs{plr} writes. +% \begin{macrocode} +def list (suffix v) (text lst) = + v := 0; for _itm = lst: v[incr v] := _itm; endfor + if v = 0: + GBerrmsg ("no list to process!") + "An attempt was made to produce an array from a " + & "list of expressions having no valid entries."; + fi enddef; def map (text proc) (text lst) = - hide(_map := 0;) - for _a = lst : - if _map = 0 : hide(_map := 1;) else: , fi - proc(_a) + hide (_map := 0;) + for _a = lst: + if _map = 0: hide (_map := 1;) else: , fi + proc (_a) endfor enddef; % \end{macrocode} -% \DescribeRoutine{knownarray} +% \DescribeRoutine{knownnumericarray} % Checks if a suffix is the name of an array. Requires \gbc{arr} to be a % known positive integer, and all the variables \gbc{arr[n]} to be known -% for \gbc{n} from 1 to \gbc{arr}. +% for \gbc{n} from 1 to \gbc{arr}. Since we so far only need it for +% numeric arrays, we also check if each entry is numeric. % \begin{macrocode} -vardef knownarray suffix arr = - save _kna; boolean _kna; - _kna := (known arr) and (numeric arr); +vardef knownnumericarray suffix arr = + setboolean (_kna) (known arr) and (numeric arr); if _kna : _kna := (arr = floor arr) and (arr >= 1); for _idx = 1 upto arr : exitif not _kna; - _kna := known arr[_idx]; + _kna := (known arr[_idx]) and (numeric arr[_idx]); endfor fi _kna @@ -668,25 +753,24 @@ enddef; % \end{macrocode} % % \DescribeRoutine{copyarray} -% We only need this once, but it makes the code much more readable. It -% simply steps through an array and copies the values into another array. +% This makes some code much more readable. It simply steps through an +% array and copies the values into another array. It is only used for +% numeric arrays so far, but could be used for any kind. % \begin{macrocode} -def copyarray(suffix from, to) = - to := 0; - for _idx = 1 upto from: - to[incr to] := from[_idx]; - endfor +def copyarray (suffix src, dest) = + for _idx = 1 upto src: dest[_idx] := src[_idx]; endfor + dest := src; enddef; % \end{macrocode} % % \DescribeRoutine{maparr} % The \gbc{maparr} macro applies a procedure \gbc{proc} to each member of -% array \gbc{p[]} with \gbc{p} members. It returns nothing, and currently -% is unused. Though it could have been used for things like \gbc{maxpair}. +% array \gbc{p[\,]} with \gbc{p} members. It returns nothing. It is currently +% unused, although it was once used for things like \gbc{maxpair}. % \begin{macrocode} def maparr (text proc) (suffix p) = - for _idx = 1 upto p: proc (p[_idx]); endfor + for _idx = 1 upto p: proc (p[_idx]); endfor enddef; % \end{macrocode} @@ -695,62 +779,105 @@ enddef; % This macro takes a suffix (name of an array to be constructed) and a % list of pairs, and assigns them to the array. It is normally called from % another macro, which does any necessary \mfc{save}-ing of the variable -% used for the array name. We used to include ``\mfc{save p;}'' in this -% macro, but ran into a problem once when \mfc{p} had a suffix. You can't -% apply \mfc{save} to a variable with a suffix. Moreover, ``\mfc{save p}'' +% used for the array name. We used to include \mfc{save} in this macro, +% but ran into a problem once when the argument had a suffix. You can't +% apply \mfc{save} to a variable with a suffix. Moreover, `\mfc{save p}' % also renders \mfc{p.x} unknown, so I judged it best to let whoever calls -% this macro decide what to save. -% \begin{macrocode} -def textpairs (suffix p) (text t) = - numeric p; pair p[]; list (p) (t); +% this macro decide what to save. Actually, now it expands to the more +% general command \gbc{gsetarray} with type \gbc{pair}. That command +% then reads the suffix argument that should follow. +% +% Since the above change was made, macros evolved so that \emph{all} uses +% of \gbc{textpairs} are now preceeded by \gbc{save}. Thus, I have now +% replaced them all with calls to \gbc{setpairs} (it calls \gbc{setarray} +% \emph{does} \gbc{save} the variable). In all those cases, the +% `\gbc{saved}' variable is a temporary local array. +% +% \DescribeRoutine{setuniquepairs} +% This does the same but omit any pair if it is identical to the previous +% one. It \mfc{save}\,s the variable, since all its uses are internal +% and require that. +% \begin{macrocode} +def textpairs = gsetarray (pair) enddef; + +def setuniquepairs (suffix p) (text t) = + save p; pair p[]; + setpairs (_up) (t); + if _up > 0: + p := 1; p1 := _up1; + for _i = 2 upto _up: + if _up[_i] <> p[p]: p[incr p] := _up[_i]; fi + endfor + else: + p := 0; + fi enddef; % \end{macrocode} +% +% \subsection{Utilities}\label{utilities} +% % \DescribeRoutine{chpair} -% This applies a procedure \gbc{proc} (which maps numeric to -% numeric) to each part of pair \gbc{p}, and returns the resultant pair. -% -% \DescribeRoutine{floorpair} -% \DescribeRoutine{ceilingpair} -% \DescribeRoutine{hroundpair} -% \gbc{floorpair}, \gbc{ceilingpair} and \gbc{hroundpair} use it with -% \gbc{proc} equal to \mfc{floor}, \mfc{ceiling} and \mfc{hround}. -% The last one is not defined in the \MP{} version of \grafbase{} -% because \mfc{hround} is not defined (only \mfc{round}, which already -% works on pairs). Actually, none of these is used any longer in -% \file{grafbase.mp}. +% This applies a procedure \gbc{proc} (which maps numeric to numeric) to +% each part of pair \gbc{p}, and returns the resultant pair. I've decided +% not to use it (for efficiency), but to leave it defined for backward +% compatibility.\\ +% \DescribeRoutine{floorpair}\gbc{floorpair} applies \mfc{floor} to both +% parts of a pair.\\ +% \DescribeRoutine{ceilingpair}\gbc{ceilingpair} does the same with +% \gbc{ceiling}.\\ +% \DescribeRoutine{hroundpair}\gbc{hroundpair} does the same with +% \gbc{hround}. +% +% All three could use \gbc{chpair} with \gbc{proc} equal to \mfc{floor}, +% \mfc{ceiling} and \mfc{hround}, but I now code them directly. +% +% \DescribeRoutine{goodpair} +% This last one is used (only in \MF{}) to adjust pairs to the pixel grid. +% It is the only place \gbc{hroundpair} is used. None of these is used in +% the \MP{} version. % \begin{macrocode} vardef chpair (text proc) (expr p) = (proc (xpart p), proc (ypart p)) enddef; -vardef floorpair (expr p) = chpair (floor) (p) enddef; -vardef ceilingpair (expr p) = chpair (ceiling) (p) enddef; -%<MF>vardef hroundpair (expr p) = chpair (hround) (p) enddef; +vardef floorpair (expr p) = (floor (xpart p), floor (ypart p)) enddef; +vardef ceilingpair (expr p) = + (ceiling (xpart p), ceiling (ypart p)) +enddef; + +%<*MF> +def hroundpair (expr p) = (hround (xpart p), hround (ypart p)) enddef; +vardef goodpair (expr p) = hroundpair(p.t_) enddef; +%</MF> % \end{macrocode} % % \DescribeRoutine{emin} -% \DescribeRoutine{emax} -% These are more efficient versions of \prog{plain}'s \mfc{min} and -% \mfc{max}: avoiding a \mfc{for} loop when only two values are compared. +% \gbc{emin} differs from \prog{plain}'s \mfc{min} in that it allows +% only two values. It can therefore be coded simply, without the overhead +% of a \mfc{for}-loop. \DescribeRoutine{emax}\gbc{emax} is analogous. Both +% are needed so often that it is possible a significant amount of time is +% saved with these versions. % % \DescribeRoutine{pairmin} -% \DescribeRoutine{pairmax} % \gbc{pairmin} operates on two pairs, returning a pair having the % smaller of the two xparts and the smaller of the two yparts. Of course -% \gbc{pairmax} is analogous, producing the maximum. +% \DescribeRoutine{pairmax}\gbc{pairmax} is analogous, producing the maximum. % % \DescribeRoutine{minpair} -% \DescribeRoutine{maxpair} % The \gbc{minpair} macro returns the pair comprising the minimum $x$ and -% minimum $y$ coordinates of all pairs in the array \gbc{p[]}, where -% \gbc{p} itself is a numeric count of the members in \gbc{p[]}. -% \gbc{maxpair} is analogous. These operate by repeatedly calling -% \gbc{pairmin} or \gbc{pairmax}. +% minimum $y$ coordinates of all pairs in the array \gbc{p[\,]}. +% \DescribeRoutine{maxpair} +% \gbc{maxpair} is analogous. Somehow, both of them have disappeared from +% \grafbase. They were formerly used only in the \gbc{*bbox} macros. +% That code used a loop to build an array of control points and these +% routines would \emph{each} loop through that. The current code uses one +% loop (instead of three) through the control points, updating both the +% maximum and minimum at each one. % \begin{macrocode} -vardef emin (expr a, b) = if a < b : a else: b fi enddef; -vardef emax (expr a, b) = if a > b : a else: b fi enddef; +vardef emin (expr a, b) = if a < b: a else: b fi enddef; +vardef emax (expr a, b) = if a > b: a else: b fi enddef; vardef pairmin (expr z, w) = ( emin (xpart z, xpart w), emin (ypart z, ypart w ) ) @@ -759,23 +886,271 @@ vardef pairmax (expr z, w) = ( emax (xpart z, xpart w), emax (ypart z, ypart w ) ) enddef; -vardef minpair (suffix p) = - save _mp; pair _mp; _mp := p1; - for _idx = 2 upto p - 1 : - _mp := pairmin(_mp, p[_idx]); - endfor +vardef minpair (suffix p) = setpair (_mp) p1; + for _idx = 2 upto p - 1: _mp := pairmin (_mp, p[_idx]); endfor pairmin (_mp, p[p]) enddef; -vardef maxpair (suffix p) = - save _mp; pair _mp; _mp := p1; - for _idx = 2 upto p - 1: _mp := pairmax(_mp, p[_idx]); endfor +vardef maxpair (suffix p) = setpair (_mp) p1; + for _idx = 2 upto p - 1: _mp := pairmax (_mp, p[_idx]); endfor pairmax (_mp, p[p]) enddef; % \end{macrocode} % +% \DescribeRoutine{xprod} +% A binary operation between pairs $z\sb1$ and $x\sb2$ that returns the +% cross product $x\sb1 y\sb2 - x\sb2 y\sb1$. This gives, among other +% things, twice the area of the triangle with two sides $z\sb1$ and +% $z\sb2$. It is used only in \gbc{mkconvex}. +% \begin{macrocode} +primarydef Z xprod W = (xpart Z * ypart W - xpart W * ypart Z) enddef; + +% \end{macrocode} +% +% \DescribeRoutine{force_initial} +% \gbc{force_initial} modifies a path so that it has all the same points +% and controls as before, except its first point is replaced with \mfc{p}. +% \DescribeRoutine{force_terminal}\gbc{force_terminal} replaces the last +% point. This is for cases where, theoretically, paths \gbc{f} and \gbc{g} +% should meet at an endpoint, but do not due to finite precision. Instead +% of doing \mfc{f..g}, which adds a random tiny segment, we adjust the +% endpoints to exactly match the other and do \mfc{f\&g}, producing a join +% without an additional segment. +% +% \DescribeRoutine{force_equal_ends} +% This forces the last point of the first path and the first point of the +% second to equal the average of their original values. It is the only one +% of these four actually used anywhere else in \grafbase. +% \DescribeRoutine{replace_ends_of_cycle}\gbc{replace_ends_of_cycle} +% applies something similar to a cycle. +% \begin{macrocode} +def force_initial (expr p) (suffix f) = + hide( setnumeric (_n) length f; + f := p + if _n = 0: + {0,0} + else: + ..controls post0 (f) and pre 1 (f).. subpath (1,_n) of f + fi;) +enddef; + +def force_terminal (expr p) (suffix f) = + hide(setpath (_f) reverse f; + force_initial (p) (_f); + f := reverse _f;) +enddef; + +def force_equal_ends (suffix f, g) = + hide(save _p; pair _p; + _p := .5[pnt[length f] (f), pnt0(g)]; + force_terminal (_p) (f); force_initial (_p) (g);) +enddef; + +def replace_ends_of_cycle (expr p) (suffix f) = +hide( +if cycle f: + save _n; _n := length f; + f := p + if _n = 0: &cycle + else: .. controls post0 (f) and pre 1 (f) .. + if _n = 1: cycle + else: subpath (1, _n - 1) of f .. + controls post[_n - 1](f) and pre[_n](f) .. cycle + fi + fi; +fi) +enddef; + +% \end{macrocode} +% +% \DescribeRoutine{intersects} +% A binary relation, with the precedence level (almost) that of other +% relations, produces \mfc{true} if \MF{} determines that the paths +% intersect, false otherwise. It also \DescribeVariable{thetimes}sets the +% pair variable \gbc{thetimes} and its parts \gbc{_Xtime} and \gbc{_Ytime}. +% Then \DescribeRoutine{misses}\gbc{misses} is the opposite relation, +% used when the intersection point is not needed. It only occurs in the +% (unused) code of \gbc{tightbbox}. +% \begin{macrocode} +pair thetimes; +numeric _Xtime, _Ytime; +tertiarydef a intersects b = + begingroup + thetimes := a intersectiontimes b; + _Xtime := xpart thetimes; + _Ytime := ypart thetimes; + (_Xtime > -1) + endgroup +enddef; + +tertiarydef a misses b = ((a intersectiontimes b) < origin) enddef; + +% \end{macrocode} +% +% \DescribeRoutine{makepicture} +% Takes any expression and does what it can to make a picture from it. +% +% \DescribeRoutine{onepointpath} +% Takes a point and forces it to be a path. If a vardef takes a list of +% points and it \emph{must} return a path that perhaps \emph{must} be +% cyclic, it can use this as a fallback. If an \mfpic{} command such as +% \cs{arc} receives an invalid optional parameter, it won't know what +% command to write to the output file. It can use +% \DescribeRoutine{fallbackpath}\gbc{fallbackpath} as long as the first +% parameter is a point. +% +% \DescribeRoutine{even} +% Of course \gbc{even} means \gbc{not odd}. +% \begin{macrocode} +vardef makepicture (expr s) = + if picture s: s +%<MP> elseif string s: s infont defaultfont scaled defaultscale + elseif path s: picpath (s) + else: nullpicture + fi +enddef; + +vardef onepointpath (expr cyclic, q) = + q if cyclic: &cycle else: {0,0} fi +enddef; + +vardef fallbackpath (expr cyclic, p) (text t) = + onepointpath (cyclic, p) +enddef; + +def even = not odd enddef; + +primarydef a divides b = + ((b mod a) = 0) +enddef; + +% \end{macrocode} +% +% \DescribeRoutine{image} +% The \mfc{image} macro exists in \file{plain.mp} but not \file{plain.mf}. +% The purpose is to just use the \file{plain} \MF{} and \grafbase{} macros +% as you normally would, but wrap the whole thing in parentheses preceded +% by \gbc{X := image} to get all those things drawn on the picture +% variable \gbc{X}. +% +% \DescribeRoutine{beginimage} +% Instead of making lengthy drawing code a parameter, one might prefer an +% environment-like syntax, writing \gbc{X := beginimage } at the start +% and \DescribeRoutine{endimage}\gbc{endimage} at the end. +% +% \DescribeRoutine{makeimage} +% This is for the \mfpic{} command \cs{mfpimage}. It takes a suffix +% parameter (the name of the picture variable) and a coordinate pair (in +% graph coordinates). The drawing commands, up to the following +% \gbc{endimage}, draw on this picture variable with the given pair as the +% reference point. +% \begin{macrocode} +%<*MF> +vardef image (text t) = + newpicture (currentpicture); + t; + currentpicture +enddef; + +%</MF> +def beginimage = + begingroup + newpicture (currentpicture); +enddef; +def endimage = + ; currentpicture + endgroup +enddef; + +def makeimage (suffix name) (expr refpt) = + setpair (_image_reference_point) zconv(refpt); + setpicture (name) beginimage +enddef; +def concludeimage = + endimage shifted +%<MF> -goodpair (_image_reference_point) +%<MP> -_image_reference_point +enddef; + +% \end{macrocode} +% +% \DescribeRoutine{setvariable} +% This is are mainly to save space in \mfpic-generated files. In \grafbase{} +% itself the \mfc{save} is often inconvenient, but it turns out there are +% many cases where it \emph{is} used; enough so that we have abbreviations +% \RoutineIndex{setpicture}\gbc{setpicture}, +% \RoutineIndex{setpath}\gbc{setpath}, \RoutineIndex{setpair}\gbc{setpair} +% and \RoutineIndex{setboolean}\gbc{setboolean}, together with the +% common uses \RoutineIndex{newpicture}\gbc{newpicture} and +% \RoutineIndex{convertpath}\gbc{convertpath}. +% \DescribeRoutine{gsetvariable}\gbc{gsetvariable} is the global +% version. It has no abbreviations, but it is occasionally needed for +% \mfpic{}. The only difference is the lack of a \gbc{save}. None of these +% commands take the value as a parameter. That should follow, and is picked +% up by the ending \mfc{:=}. +% +% \DescribeRoutine{setarray} +% Then \gbc{setarray} is the array version. It takes the same parameters +% as \gbc{setvariable}, but what should follow is a list of expressions in +% parentheses. It calls \gbc{list} to read each item into +% \gbc{name1}, \gbc{name2}, etc. +% \DescribeRoutine{setpairs}\gbc{setpairs} is an abbreviation for arrays +% of pairs. There is also has a global version +% \DescribeRoutine{gsetarray}\gbc{gsetarray}. +% \begin{macrocode} +def setvariable (text kind) (suffix name) = + save name; kind name; name := +enddef; +def gsetvariable (text kind) (suffix name) = kind name; name := +enddef; + +def setnumeric (suffix name) = save name; name := enddef; +def setboolean = setvariable (boolean) enddef; +def setpair = setvariable (pair) enddef; +def setpath = setvariable (path) enddef; +def setcolor = setvariable (color) enddef; +def setpicture = setvariable (picture) enddef; +def settension (suffix tn) expr tens = + setnumeric (tn) if tens > 0: tens else: default_tension fi; +enddef; +def fixtension (suffix tn) = if tn < .75: tn := .75; fi enddef; + +def newpicture (suffix pic) = setpicture (pic) nullpicture; enddef; +def convertpath (suffix g) expr f = setpath (g) zconv (f); enddef; + +def setarray (text kind) (suffix name) = + save name; kind name[]; list (name) +enddef; +def setpairs = setarray (pair) enddef; +def gsetarray (text kind) (suffix name) = + numeric name; kind name[]; list (name) +enddef; + +% \end{macrocode} +% +% The next are slightly different, but seem to belong here. + +% \DescribeRoutine{setbbox} +% In \gbc{setbbox} we save and initialize \emph{two} pair variables and +% set them to the bounding box of a path that should follow. +% +% \DescribeRoutine{setsplit} +% There are a couple of routines that modify a variable to make sure it is +% positive and integral. In a couple of places two routine \emph{must} use +% the same value. Here we isolate the code that does the modification, and +% then both routines call \gbc{setsplit}. +% \begin{macrocode} +def setbbox (suffix ll, ur) = + save ll, ur; pair ll, ur; getbbox (ll, ur) +enddef; + +def setsplit (suffix s) expr ss = + setnumeric (s) emax (1, ceiling ss); +enddef; + +% \end{macrocode} % -% \section{The \grafbase{} coordinate system}\label{coordinate} +% \section{The \grafbase{} Coordinate System}\label{coordinate} % % We need to make a distinction between graph units, sharped units, and % device units. In \MF, a device unit is 1 pixel. On a LaserJet IV, one @@ -788,7 +1163,7 @@ enddef; % nor \MP{} makes a distinction between distances and numbers: \mfc{2pt} % just means \mfc{2} times the value of \mfc{pt}). When one needs to % draw something actually \emph{one point long}, then \mfc{1pt} is used. -% It is defined to be equal \mfc{pt\#*hppp}, where \mfc{hppp} stands for +% It is defined to equal \mfc{pt\#*hppp}, where \mfc{hppp} stands for % ``horizontal pixels per point'' and its value is usually set by % \mfc{mode_setup}. So \mfc{1pt} is $600/72.27$ (pixels) if % \mfc{mode} is \mfc{ljfour}. @@ -796,7 +1171,7 @@ enddef; % Often, when we want numbers not to become too large, we do calculations, % define paths, etc., in sharped units, then draw by scaling to device % units. In \grafbase{} we take this one step further: a horizontal graph -% unit (i.e., the difference between the graph points (0, 0) and (1, 0)) +% unit (i.e., the difference between the graph points $(0,0)$ and $(1,0)$) % represents \gbc{unitlen*xscale} sharped units, and % \gbc{unitlen*xscale*hppp} actual pixels. The \grafbase{} macros do much % of the calculations in graph units. @@ -808,38 +1183,43 @@ enddef; % Some things need to be in graph units (for example, positions within a % graph defined by the user) or independent of units (standard shapes) % that scale appropriately when scales change. Other things (thickness of -% lines) are a design decision that is either independent of scale, or -% scales in a non-obvious way. The diameter of the drawing pen is one of -% the latter things, so the default pen width is in device units. Also for -% the hatching pen. +% lines) are a design decision that either should be independent of scale +% or should scale in a nonobvious way. The diameter of the drawing pen is +% one of the latter things, so the default pen width is in device units. +% Also for the hatching pen. % % When drawing a path we want to use device coordinates. When defining % paths, we typically want to use graph coordinates. The macros that do % the drawing, therefore, need to convert from one to the other. In % addition, for inclusion of the picture in a \TeX{} document, we normally % want the lower left corner of the graph space to have device coordinates -% (0, 0). +% $(0,0)$. +% +% \subsection{The main transforms}\label{ztr} % +% \DescribeVariable{vtr} % We therefore have two transforms: \gbc{vtr} is the \emph{vector} or % linear transform for pair quantities that remain invariant under shifts, -% and \gbc{ztr} is a \emph{point} or affine transformation for pair -% quantities that change appropriately under shifts. +% and \DescribeVariable{ztr}\gbc{ztr} is a \emph{point} or affine +% transformation for pair quantities that change appropriately under +% shifts. % % The quantities \gbc{xneg}, \gbc{xpos}, \gbc{yneg}, and \gbc{ypos} are % in \emph{graph} coordinates. Shifting by \gbc{(-xneg, -yneg)} transforms -% the lower left corner to $(0, 0)$. Multiplication by \gbc{xscale} and +% the lower left corner to $(0,0)$. Multiplication by \gbc{xscale} and % \gbc{yscale} converts to multiples of \gbc{unitlen} and multiplication % by \gbc{unitlen} gets us sharped coordinates. For \MF{}, % multiplication by \mfc{hppp} converts to device coordinates, while for % \MP{} sharped and device are the same (the printer's PostScript -% rasterizing engine -- or \prog{GhostScript} -- does the final conversion +% rasterizing engine---or \prog{GhostScript}---does the final conversion % to actual pixels). % -% \mfc{currenttransform} (via the macro \mfc{.t_}, defined by -% \mfc{mode_setup}) takes care of the aspect ratio. +% In \MF{}, \mfc{currenttransform} (via the macro \mfc{.t_}, defined by +% \mfc{mode_setup}) takes care of the aspect ratio. In \MP{} the final +% rasterizer should do this. % % \gbc{charwd} and \gbc{charht} are sharped coordinates defined by the -% startup code \gbc{beginmfpic}, and \gbc{w_} and \gbc{h_} are the +% startup code \gbc{beginmfpic}, while \gbc{w_} and \gbc{h_} are the % corresponding device (pixel) coordinates % % \DescribeRoutine{setztr} @@ -849,7 +1229,7 @@ enddef; % \begin{macrocode} transform ztr, vtr; def setztr = - if debug : + if debug: GBdebug; %<*MF> >> "charwd = " & decimal charwd & "pt#"; @@ -874,14 +1254,13 @@ def setztr = fi save ztr, vtr; transform ztr, vtr; - vtr := identity xscaled (xscale) yscaled (yscale) - scaled (unitlen*hppp); - ztr := identity shifted (-(xneg, yneg)) transformed vtr; - if debug : + vtr := identity xscaled xscale yscaled yscale scaled (unitlen*hppp); + ztr := identity shifted (-xneg, -yneg) transformed vtr; + if debug: GBdebug; - >> "ztr: "; + >> "ztr is"; show ztr; - >> "vtr: "; + >> "vtr is"; show vtr; GBenddebug; fi @@ -890,50 +1269,36 @@ enddef; % \end{macrocode} % % \DescribeRoutine{zconv} -% \DescribeRoutine{invzconv} % The macro \gbc{zconv} converts a variety of expressions from graph to -% device coords. The expressions include pairs, paths, and transforms. -% This is an affine transform. The inverse, \gbc{invzconv}, converts a -% variety of expressions from device to graph coordinates. +% device coordinates. The expressions include pairs, paths, and transforms. +% This is an affine transform. The inverse, +% \DescribeRoutine{invzconv}\gbc{invzconv}, converts a variety of +% expressions from device to graph coordinates. % % \DescribeRoutine{vconv} -% \DescribeRoutine{invvconv} % The vector version, \gbc{vconv}, converts a vector \gbc{v} from graph to -% device coordinates. This is a linear (ie, vector) transform. Finally, -% \gbc{invvconv} converts a vector from device to graph coordinates. +% device coordinates. This is a linear (ie, vector) transform. Also, +% \DescribeRoutine{invvconv}\gbc{invvconv} converts a vector from device +% to graph coordinates. % \begin{macrocode} -vardef zconv (expr a) = a transformed ztr enddef; -vardef invzconv (expr a) = a transformed (inverse ztr) enddef; -vardef vconv (expr v) = v transformed vtr enddef; -vardef invvconv (expr v) = v transformed (inverse vtr) enddef; +vardef zconv (expr a) = a transformed ztr enddef; +vardef invzconv (expr a) = a transformed (inverse ztr) enddef; +vardef vconv (expr v) = v transformed vtr enddef; +vardef invvconv (expr v) = v transformed (inverse vtr) enddef; % \end{macrocode} % +% \subsection{The \gbc{mfpic} environment}\label{mfpic} +% % \DescribeRoutine{active_plane} % \gbc{active_plane} is the active drawing plane. \mfc{currentpicture} is % unknown at this stage (because it's set in \gbc{beginmfpic}). We use a % \mfc{def}, and not a picture assignment, partly for this reason but also -% because we can achieve special effects (see \gbc{image} below, and the -% \gbc{tile} macro) by redefining it. -% -% \DescribeRoutine{image} -% The \mfc{image} macro exists in \file{plain.mp} but not \file{plain.mf}. -% The purpose is to just use the \file{plain} \MF{} and \grafbase{} macros -% as you normally would, but wrap the whole thing in parentheses preceded -% by \gbc{X := image} to get all those things drawn on the picture -% variable \gbc{X}. +% because we can achieve special effects by redefining it (see the +% \gbc{tile} macro). % \begin{macrocode} -def active_plane = currentpicture enddef; - -%<*MF> -vardef image(text t) = - save currentpicture; picture currentpicture; - currentpicture := nullpicture; - t; - currentpicture -enddef; +def active_plane = currentpicture enddef; -%</MF> % \end{macrocode} % % \DescribeRoutine{initpic} @@ -943,38 +1308,46 @@ enddef; % based on them. Also, the default \gbc{drawpen} is initialized and the % boundary of the graph space is assigned to the clipping array. % +% If \gbc{underlaylabels} is true, we try to make them part of the +% background, adding them to the picture variable \gbc{background_labels}. +% Just before shipout, the picture is placed on top. +% % If \gbc{overlaylabels} is \gbc{true}, we try to make labels in \MP{} % behave the same as labels in \TeX{} (for \mfpic) by adding the labels % on last. We do this by adding them to the picture variable -% \gbc{current_labels} as they occur, then add that picture onto +% \gbc{foreground_labels} as they occur, then add that picture onto % \gbc{active_plane} just before shipout. For backward compatibility, -% the default for \gbc{overlaylabels} is \gbc{false}. We initialize -% \gbc{current_labels} here. The pair variables \gbc{labelbb.ll} and -% \gbc{labelbb.ur} keep track of the bounding box of added labels in case -% \gbc{overlaylabels}, \gbc{truebbox}, and \gbc{clipall} are all -% \gbc{false}. +% the default for \gbc{overlaylabels} is \gbc{false}. +% +% We initialize \gbc{foreground_labels} and \gbc{background_labels} here. The +% pair variables \gbc{labelbb.ll} and \gbc{labelbb.ur} keep track of the +% bounding box of added labels in case \gbc{overlaylabels}, +% \gbc{truebbox}, and \gbc{clipall} are all \gbc{false}. % \begin{macrocode} %<*MP> -boolean overlaylabels; -overlaylabels = false; +boolean overlaylabels, underlaylabels, havebackground; +overlaylabels := false; +underlaylabels := false; +havebackground := false; %</MP> def initpic = setztr; resizedrawpen (penwd); - if ClipOn : ClipPath := 1; + if ClipOn: ClipPath := 1; ClipPath1 := rect (origin, (w_, h_)); fi - if debug : + if debug: GBdebug; >> "Drawing nominal bounding box around picture"; GBenddebug; noclip ( safedraw rect (origin, (w_, h_)) ); fi %<*MP> - save current_labels; picture current_labels; - current_labels := nullpicture; - save labelbb; pair labelbb.ll, labelbb.ur; + newpicture (foreground_labels); + newpicture (background_labels); + havebackground := false; + save labelbb; pair labelbb.ll, labelbb.ur; labelbb.ll := labelbb.ur := origin; %</MP> enddef; @@ -982,32 +1355,23 @@ enddef; % \end{macrocode} % % \DescribeRoutine{mfpicenv} +% We define a \gbc{mfpicenv} environment for compatibility with older +% \file{graphbase.mf} (mainly for \prog{fig2dev}'s \file{genmf.c}). % \DescribeRoutine{endmfpicenv} -% For compatibility with older \file{graphbase.mf} (for -% \prog{fig2dev}'s \file{genmf.c}). Actually, I have no idea if -% \prog{fig2dev} even works with the current \mfpic. -% \begin{macrocode} -def mfpicenv = enddef; -def endmfpicenv = enddef; -% \end{macrocode} +% Actually, I have no idea if \prog{fig2dev} even works with the current +% \mfpic. +% % \DescribeRoutine{bounds} % This used to be for compatibility also, but I decided it was a % convenient abbreviation, so \mfpic{} uses it now. % \begin{macrocode} +def mfpicenv = enddef; +def endmfpicenv = enddef; def bounds (expr a, b, c, d) = - xneg := a; xpos := b; - yneg := c; ypos := d; -enddef; - -% \end{macrocode} -% -% \DescribeRoutine{setvariable} -% This is mainly to save space in \mfpic-generated files. -def setvariable (text kind) (suffix name) (expr value) = - save name; kind name; name := value; + xneg := a; xpos := b; + yneg := c; ypos := d; enddef; -% \begin{macrocode} % \end{macrocode} % % \DescribeRoutine{beginmfpic} @@ -1029,23 +1393,23 @@ enddef; % The `\mfc{extra_...mfpic}' strings provide a compiler-independent way % to add to the extra beginning and ending tokens. % \begin{macrocode} -string extra_beginmfpic; extra_beginmfpic := ""; +string extra_beginmfpic; extra_beginmfpic := ""; string extra_endmfpic; extra_endmfpic := ""; def beginmfpic (expr ch) = %<MP> beginfig (ch); %<MF> begingroup gcode := ch; - save w_, h_, d_; numeric w_, h_, d_; + save w_, h_, d_; charwd := (xpos-xneg)*xscale*unitlen; charht := (ypos-yneg)*yscale*unitlen; chardp := 0; %<*MF> - charcode := if known ch : byte ch else: 0 fi; - w_ := hround(charwd*hppp); - h_ := vround(charht*hppp); - d_ := vround(chardp*hppp); - charic := 0; clearxy; clearit; clearpen; + charcode := if known ch: byte ch else: 0 fi; + w_ := hround (charwd*hppp); + h_ := vround (charht*hppp); + d_ := vround (chardp*hppp); + charic := 0; clearxy; clearit; clearpen; scantokens extra_beginchar; %</MF> %<*MP> @@ -1067,7 +1431,7 @@ enddef; % \begin{macrocode} def endmfpic = scantokens extra_endmfpic; - if debug : + if debug: GBdebug; %<MF> >> "TFM charwd = " & decimal charwd & "pt#"; %<MF> >> "TFM charht = " & decimal charht & "pt#"; @@ -1075,16 +1439,15 @@ def endmfpic = %<MP> >> "height = " & decimal h_ & "bp"; GBenddebug; fi -%<*MF> - if proofing>0 : makebox(proofrule); fi - chardx := w_; % desired width of character in pixels -%</MF> DoClip (active_plane); - if clipall : clipto (active_plane) rect(origin, (w_, h_)); fi - if showbbox : noclip ( safedraw rect (origin, (w_, h_)) ); fi + if clipall: clipto (active_plane) rect (origin, (w_, h_)); fi + if showbbox: noclip ( safedraw rect (origin, (w_, h_)) ); fi %<*MF> + scantokens extra_endchar; + if proofing > 0: makebox (proofrule); fi + chardx := w_; % desired width of character in pixels shipit; - if displaying > 0 : makebox(screenrule); showit; fi + if displaying > 0: makebox (screenrule); showit; fi endgroup %</MF> % \end{macrocode} @@ -1096,38 +1459,51 @@ def endmfpic = %<*MP> save _ll, _ur; pair _ll, _ur; - if truebbox : + if truebbox: _ll := llcorner active_plane; _ur := urcorner active_plane; % \end{macrocode} % We try to let the bbox include labels, even when they extend beyond the % nominal picture boundaries. However, they will have been clipped off if -% \gbc{clipall} is set. In that case, just set the bounding box to the -% coordinates determined by \gbc{w_} and \gbc{h_} +% \gbc{clipall} is set. In that case, we just set the bounding box to the +% coordinates determined by \gbc{w_} and \gbc{h_}, otherwise we expand +% them to the \gbc{labelbb} values. % \begin{macrocode} elseif clipall: _ll := origin; _ur := (w_,h_); else: % expand to accomodate labels - _ll := pairmin((0, 0 ), labelbb.ll); - _ur := pairmax((w_, h_), labelbb.ur); + _ll := pairmin ((0, 0 ), labelbb.ll); + _ur := pairmax ((w_, h_), labelbb.ur); fi % \end{macrocode} % A bounding box in the output PostScript code can have a side with % length 0 (e.g., a picture drawn with \mfpic{} that contains only % text placed by \TeX). This can cause division by 0 errors in some -% contexts. That's why we don't just let \MP{} determine the bounding box, +% cases. That's why we don't just let \MP{} determine the bounding box, % but force the upper and lower coordinates to differ. % \begin{macrocode} - _ur := pairmax(_ur, _ll + eps*(1, 1)); - setbounds active_plane to rect(_ll, _ur); -% \end{macrocode} -% If \gbc{overlaylabels} was true during a \gbc{newgblabel} command, -% then \gbc{current_labels} contains that labels. We add them now, on top -% of the picture. This might also extend the bbox, but that is an effect -% we want to achieve. -% \begin{macrocode} - addto active_plane also current_labels; + _ur := pairmax (_ur, _ll + eps*(1, 1)); + setbounds active_plane to rect (_ll, _ur); +% \end{macrocode} +% Finally, if \gbc{overlaylabels} or \gbc{underlaylabels} was true during +% a \gbc{newgblabel} command, then the label was not added to +% \mfc{currentpicture} but rather to \gbc{foreground_labels} or +% \gbc{background_labels}. We add those pictures now, the former on top of +% \mfc{currentpicture}, the latter underneath. This might extend the bbox +% calculated above, but that is one of the effects we \emph{want} to +% achieve. Picture variables can consume a lot of memory, so we clear +% each one after we have added it. Unfortunately, we will temporarily +% have two copies of the current picture in memory for background text, so +% we perform this operation only if \gbc{havebackground} is true. +% \begin{macrocode} + if havebackground: + addto background_labels also active_plane; + active_plane := background_labels; + background_labels := nullpicture; + fi + addto active_plane also foreground_labels; + foreground_labels := nullpicture; endfig; %</MP> enddef; @@ -1137,123 +1513,140 @@ enddef; % % \section{Text}\label{text} % -% In the \MP{} version, \gbc{label_adjust} and \gbc{label_sep} are the -% equivalent of \mfpic's \cs{tlabeloffset} and \cs{tlabelsep}. In the -% \MF{} version they are still needed (in \gbc{textrect}, etc.) to place -% the paths that are to surround the text that \TeX{} places. +% In the \MP{} version, \gbc{label_adjust}, \gbc{label_sep} and +% \gbc{labelpath_sep} are the equivalent of \mfpic's \cs{tlabeloffset}, +% \cs{tlpointsep} and \cs{tlpathsep}. In the \MF{} version they are still +% needed (in \gbc{textrect}, etc.) to place the paths that are to surround +% the text that \TeX{} places. % -% \gbc{label_adjust} is a vector displacement for the label, +% \gbc{label_adjust} is a vector displacement applied to all labels, % while \gbc{label_sep} is the distance from the label to % the point of placement, when that point is on the edges of the label's % bounding box. Both are in device coordinates (e.g., \mfc{3bp}). +% Finally, \gbc{labelpath_sep} is the separation of a surrounding path +% from the text. % \begin{macrocode} -pair label_adjust; label_adjust := (0, 0); -numeric label_sep; label_sep := 0; - +pair label_adjust; +label_adjust := origin; +numeric label_sep, labelpath_sep ; +label_sep := 0; labelpath_sep := 0; % \end{macrocode} % % Another aspect of trying to make \mfpic's \file{.mp} and \file{.mf} % the same, we here define a version of \mfc{verbatimtex} for \MF. This -% works only if \mfc{etex} is fillowed by a semicolon, and no semicolons +% works only if \mfc{etex} is followed by a semicolon, and no semicolons % appear in the \TeX{} material. (There may be other forbidden things, and -% certainly any parentheses have to be in matching pairs.) We would like -% the output of \mfpic{} under the \opt{metapost} option to be usable in -% \MF{} with minimal changes. +% certainly any parentheses have to be in matching pairs. Not so obvious +% is that \cs{begingroup} and \cs{endgroup} have to be balanced: \MF{} +% sees \cs{begingroup} as `\verb$\$' plus \mfc{begingroup}.) We would +% like the output of \mfpic{} under the \opt{metapost} option to be usable +% in \MF{} with minimal changes. % \begin{macrocode} -%<MF>def verbatimtex = killtext enddef; +%<MF>def verbatimtex text t = enddef; % \end{macrocode} % % \subsection{Placement of text, \MP{} only}\label{placement} % % \DescribeRoutine{newgblabel} -% \DescribeRoutine{gblabel} % This is how \mfpic{} places labels when \opt{mplabels} is in effect. % Since labels will typically be \mfc{btex...etex}, which are picture % expressions, it will actually place any picture, \gbc{s}. If you feed it % a string or path, it will convert it to a picture (with the \mfc{infont} -% operator or the \gbc{picpath} macro). The first two parameters could easily -% be condensed into one if \mfpic{} support were all that was required, -% however I thought it best to generalize. The first two parameters -% \gbc{hf} and \gbc{vf} are numeric. The \gbc{hf} represent the fraction of -% the text that lies left of the point where the text is placed. Normally, -% \gbc{vf} represents the fraction of text that lies below the point, but -% if the third parameter is \mfc{true}, this fraction is relative to the -% baseline (i.e., the depth is ignored). Currently we only use this with -% \gbc{vf = 0} to get placement on the baseline. (Actually, \mfpic{} only -% ever uses values of 0, .5 and 1 for \gbc{hf} or \gbc{vf}). -% -% The macro \gbc{newgblabel} takes 6 parameters. The first 3, as explained -% above, effect the justification of the text (location of the point of -% placement relative to the label). They correspond to the optional -% parameter of \cs{tlabel} in \mfpic{} as follows: +% operator or the \gbc{picpath} macro). + +% The macro \gbc{newgblabel} takes 6 parameters. The first three +% parameters could easily be condensed into two if \mfpic{} support were +% all that was required, however I thought it best to make it general. +% The parameters \gbc{hf} and \gbc{vf} are numeric, with \gbc{hf} +% representing the fraction of the text that lies left of the point where +% the text is placed and \gbc{vf} represents the fraction of +% text that lies below that point. However, if the third parameter is +% \mfc{true}, then \gbc{vf} is relative to the baseline (i.e., the depth +% is ignored). In \mfpic{} this is only used with \gbc{vf = 0} to get +% placement on the baseline. +% +% These three parameters correspond to the optional parameter of +% \cs{tlabel} in \mfpic{} as follows: % \begin{itemize} -% \item \gbc{hf} determines horizontal position: 0 = \texttt{l}, -% .5 = \texttt{c}, and 1 = \texttt{r}. +% \item \gbc{hf} determines horizontal position: $0=\mathtt{l}$, +% $.5=\mathtt{c}$, and $1 = \mathtt{r}$. % \item \gbc{vf} and \gbc{BL} determine vertical position. For placement -% option \texttt{B}, \gbc{vf} = 0 and \gbc{BL} is \mfc{true}. For the +% option \texttt{B}, $\mathtt{vf} = 0$ and \gbc{BL} is \mfc{true}. For the % rest, \gbc{BL} is \mfc{false} and \gbc{vf} corresponds as follows: -% 0 = \texttt{b}, .5 = \texttt{c} and 1 = \texttt{t}. +% $0 = \mathtt{b}$, $.5 = \mathtt{c}$ and $1 = \mathtt{t}$. +% \end{itemize} +% The remaining parameters have the following meanings: +% \begin{itemize} % \item \gbc{r} is degrees of rotation about the specified point. % \item \gbc{s} is a string or picture expression (typically % \mfc{btex ... etex} code) % \item \gbc{pts} is a list of pairs in graph coordinates. % \end{itemize} -% First the bounding box of the picture is extended by \gbc{label_sep} in -% all directions by \gbc{labeldims}, then a new reference point for the -% picture is calculated using -% \DescribeRoutine{ref_shift}\gbc{ref_shift} -% and then \gbc{thegblabel} rotates it around the reference -% point and adds the \gbc{label_adjust}. Finally, for each \gbc{_itm} in -% \gbc{pts}, the result is shifted by \gbc{_itm}. If \gbc{overlaylabels} -% is true, the label is placed on the picture \gbc{current_labels} and -% added to \gbc{active_plane} at \gbc{endmfpic}. Otherwise, it is added -% directly to \gbc{active_plane} and and the \gbc{labelbb} are adjusted. +% First the bounding box of the picture is determined using +% \gbc{pathdims}. (Why \texttt{\textit{path}dims}? Because it was written +% for the paths that surround text, and was then incorporated into text +% placement when \gbc{newgblabel} replace \gbc{gblabel}.) Then +% \gbc{readjustdims} extends that box by \gbc{label_sep}, a new +% reference point for the picture is calculated using +% \DescribeRoutine{ref_shift}\gbc{ref_shift}, and then \gbc{thegblabel} +% rotates it around the reference point and adds the \gbc{label_adjust}. +% Finally, for each \gbc{_itm} in \gbc{pts}, the result is shifted by +% \gbc{_itm}. If \gbc{overlaylabels} is true, the label is placed on the +% picture \gbc{foreground_labels} and added to \gbc{active_plane} at +% \gbc{endmfpic}. If \gbc{underlaylabels} is true, it is placed in +% picture \gbc{background_labels} and \gbc{active_plane} is placed on top +% of it. Otherwise, it is added directly to \gbc{active_plane} and the +% \gbc{labelbb} variables are adjusted. % % We also use \gbc{ref_shift} in \MF{} since the curves that surround text % require it. % +% \DescribeRoutine{gblabel} % We keep \gbc{gblabel} for backward compatibility with old \mfpic{} % files, but it merely calls \gbc{newgblabel}. While the old \gbc{gblabel} % had the same flexibility as \gbc{newgblabel}, this one assumes that the -% parameters are only those that \mfpic{} would write. We provide a null -% definition for \MF{} to allow \mfpic's \file{.mp} files to be usable with -% minimal changes. +% parameters are only those that \mfpic{} would write. +% +% We provide a null definition of newgblabel for \MF{} to allow \mfpic's +% \file{.mp} files to be somewhat usable with minimal changes. It +% requires a text parameter, since \MF{} would be unable to evaluate +% \mfc{btex} expressions. % \begin{macrocode} -%<MF>def newgblabel (expr hf, vf, BL, r) (text s) (text pts) = enddef; %<*MP> vardef newgblabel (expr hf, vf, BL, r) (expr s) (text pts) = - save _lab, _ll, _ur; picture _lab; pair _ll, _ur; - _lab := - if picture s : s - elseif string s : s infont defaultfont scaled defaultscale - elseif path s : picpath (s) - else : nullpicture - fi; - labeldims (origin, _lab) (_ll, _ur); - _lab := thegblabel(ref_shift (hf, vf, BL, _ll, _ur), r, _lab); - save _b; pair _b; - for _itm = pts : - _b := zconv(_itm); - if overlaylabels : - addto current_labels also _lab shifted _b _wc_ tlabelcolor; + save _lab, _ll, _ur; picture _lab; pair _ll, _ur; + _lab := makepicture (s); + pathdims (origin, _lab) (_ll, _ur); + readjustdims (_ll, _ur) (label_sep); + _lab := thegblabel (ref_shift (hf, vf, BL, _ll, _ur), r, _lab); + save _b; pair _b; + for _itm = pts: + _b := zconv (_itm); + if overlaylabels: + addto foreground_labels also _lab shifted _b _wc_ tlabelcolor; + elseif underlaylabels: + addto background_labels also _lab shifted _b _wc_ tlabelcolor; + havebackground := true; else: addto active_plane also _lab shifted _b _wc_ tlabelcolor; labelbb.ll := pairmin (_b + llcorner _lab, labelbb.ll); labelbb.ur := pairmax (_b + urcorner _lab, labelbb.ur); fi endfor +%</MP> +%<MF>vardef newgblabel (expr hf, vf, BL, r) (text s) (text pts) = enddef; % Assumes a+b=1 and either c+d=1 or c=d=0: -vardef gblabel (expr a, b, c, d, r) (expr s) (text t) = +%<MP>vardef gblabel (expr a, b, c, d, r) (expr s) (text t) = +%<MF>vardef gblabel (expr a, b, c, d, r) (text s) (text t) = newgblabel (b, d, (c = 0) and (d = 0), r) (s) (t); enddef; -%</MP> vardef ref_shift (expr hf, vf, BL, ll, ur) = - ( (hf)[xpart ll, xpart ur], - (vf)[if BL: 0 else: (ypart ll) fi, ypart ur] ) + (vf)[if BL: 0 else: (ypart ll) fi, ypart ur] ) enddef; % \end{macrocode} @@ -1269,35 +1662,35 @@ enddef; % \end{macrocode} % -% \subsection{Decorating the text}\label{decorating} +% \subsection{Decorating the text, \MF{} or \MP{}}\label{decorating} % -% \DescribeRoutine{textrect} -% \DescribeRoutine{textoval} -% \DescribeRoutine{textellipse} % The three macros \gbc{textrect}, \gbc{textoval} and \gbc{textellipse} % are designed to surround a bit of text with some curve. These macros -% return the path in graph coordinates. In the first one, the path is a -% rectangle with rounded corners. The second parameter, \gbc{rad}, is the +% return the path in graph coordinates. In +% \DescribeRoutine{textrect}\gbc{textrect}, the path is a rectangle with +% optionally rounded corners. The second parameter, \gbc{rad}, is the % radius of quarter circles at the corners (in device units). In the other % two cases, the path is an ellipse. They differ in the meaning of the % second parameter. % -% In \gbc{textoval}, the second parameter \emph{multiplies} the ratio of -% width to height of the text to produce the ratio for the ellipse. Thus, -% with \gbc{mult}=1, the ratio will be the same as that of the text. In -% \gbc{textellipse}, the second parameter \gbc{rat} is the actual value of -% the ratio of width to height of the ellipse and a value of 1 produces a -% circle. In either macro, if that parameter is 0, we draw a rectangle. +% In \DescribeRoutine{textoval}\gbc{textoval}, the second parameter +% \emph{multiplies} the ratio of width to height of the text to produce +% the ratio for the ellipse. Thus, with \gbc{mult}=1, the ratio will be +% the same as that of the text. In +% \DescribeRoutine{textellipse}\gbc{textellipse}, the second parameter +% \gbc{rat} is the actual value of the ratio of width to height of the +% ellipse and a value of 1 produces a circle. In either macro, if that +% parameter is 0, we draw a rectangle. % % The size of each path is determined so that, when the text is placed and % the path drawn, it passes through the four corners of the following % rectangle: the rectangle which just encloses the text plus the amount of -% space on all sides determined by \gbc{label_sep}. Note that this means +% space on all sides determined by \gbc{labelpath_sep}. Note that this means % a rectangle with rounded corners will have larger height and width than -% one without. -% -% The placement of each path is: centered at the point given in the third -% parameter \gbc{loc}, shifted by the vector specified in \gbc{label_adjust}. +% one without. These versions always center the surrounding path on the +% the point \gbc{loc}. The extended versions (below) have the same +% flexibility of placement as the commands that place the label being +% surrounded. % % The first parameter \gbc{lbl} is either a pair representing the % height and width of the text (only possibility in \MF) or the actual @@ -1323,77 +1716,77 @@ enddef; % \end{macrocode} % -% \DescribeRoutine{textrectx} -% \DescribeRoutine{textovalx} -% \DescribeRoutine{textellipsex} -% These are extended versions of the previous three. They will now be -% able adjust the position of the path in the same manner as \gbc{newgblabel} -% does the text. In fact, they calculate the position in exactly the same -% manner as that macro, and the first 4 parameters encode that in the same -% way. +% \DescribeRoutine{textrectx}\gbc{textrectx} is the extended version of +% \gbc{textrect} which allows the same adjustments to the rectangle that we +% can apply to the text it surrounds (via \gbc{newgblabel}). In fact, it +% calculates the position in exactly the same manner as that macro, and +% the first 4 parameters encode that position in the same way. +% +% The placement of each path is: shifted and rotated by the same amount +% as the text (by \gbc{ref_shift}) according to the first four parameters, +% then shifted to the point given in the third parameter \gbc{loc}, and +% finally shifted by the vector specified in \gbc{label_adjust}. % % \gbc{lbl} is either the upper right corner of the text or the label % itself. In the first case \gbc{xy} is the lower left corner, in the % second case it is a dummy parameter, the bounding box being obtained (in -% \gbc{labeldims}) by measuring the label. For these extended macros, the +% \gbc{pathdims}) by measuring the label. For these extended macros, the % parameters \gbc{lbl}, \gbc{mult}, \gbc{rad}, and \gbc{loc} are as in % the unextended versions. % -% \gbc{roundends} is a boolean. We really only need it to be a type -% distinguishable from any numeric value. \Mfpic{} users can specify it -% rather than an explicit radius, and when the code of \gbc{textrectx} -% detects this, it uses the maximum radius for the corners (making the -% short side of the `rectangle' a semicircle). That is, if \gbc{rad} is -% a boolean (and \mfc{true}) then the radius at the corners is so chosen. -% (If \gbc{rad} is \mfc{false} the corners are not rounded at all.) +% \DescribeVariable{roundends}\gbc{roundends} is a boolean. We really only +% need it to be a type distinguishable from any numeric value. \Mfpic{} +% users can specify it rather than an explicit radius, and when the code +% of \gbc{textrectx} detects this, it uses the maximum radius for the +% corners (making the short side of the `rectangle' a semicircle). That +% is, if \gbc{rad} is a boolean (and \mfc{true}) then the radius at the +% corners is so chosen. If \gbc{rad} is \mfc{false} the corners are not +% rounded at all. % \begin{macrocode} -boolean roundends; roundends := true; +boolean roundends; roundends := true; vardef textrectx (expr a, b, c, rot, xy, lbl, rad, loc) = save ll, ur, _r, f, zz; pair ll, ur, zz; path f; - labeldims (xy, lbl) (ll, ur); - _r := - if boolean rad : - if rad : emin (xpart (ur-ll), ypart (ur-ll))/sqrt(2) - else: 0 - fi - elseif numeric rad : rad - else: 0 + pathdims (xy, lbl) (ll, ur); + readjustdims (ll, ur) (labelpath_sep) + _r := if numeric rad: rad + elseif not boolean rad: 0 + elseif rad: emin (xpart(ur-ll), ypart (ur-ll))/sqrt(2) + else: 0 fi; - if _r = 0 : - f := rect(ll, ur); + if _r = 0: + f := rect (ll, ur); else: save p, q; pair p[]; path q; - p1 := ur - _r*dir(45); % center of upper right arc - p3 := ll + _r*dir(45); % lower left - p2 := (xpart p3, ypart p1); % upper left - p4 := (xpart p1, ypart p3); % lower right - q := quartercircle scaled 2_r; - if _r > 0: - f := (q shifted p1) -- (q rotated 90 shifted p2) - -- (q rotated 180 shifted p3) - -- (q rotated -90 shifted p4) - -- cycle; - else: - f := (q shifted p1) -- (q rotated -90 shifted p4) - -- (q rotated 180 shifted p3) - -- (q rotated 90 shifted p2) - -- cycle; - fi + p1 := ur - _r*dir(45); + p3 := ll + _r*dir(45); + p2 := (xpart p3, ypart p1); + p4 := (xpart p1, ypart p3); +% \end{macrocode} +% We allow the rounding radius to be negative and make the corners +% indented in that case. We no longer reverse the path in this case. +% \begin{macrocode} + q := if _r < 0: reverse fi quartercircle scaled 2_r; + f := + (q shifted p1)--(q rotated 90 shifted p2) + --(q rotated 180 shifted p3) + --(q rotated -90 shifted p4)--cycle; + fi - invvconv(thegblabel(ref_shift(a, b, c, ll, ur), rot, f)) shifted loc + readjustdims (ll, ur) (label_sep - labelpath_sep); + invvconv (thegblabel (ref_shift(a, b, c, ll, ur), rot, f)) shifted loc enddef; % \end{macrocode} % -% As the coding of \gbc{textoval} and \gbc{textellipse} was refined, it -% turned out that each refinement in one suggested a similar change in the -% other. In the end the two differed only in two lines, so now both call -% another macro \gbc{xellipse}. +% \DescribeRoutine{textellipsex}The macro \gbc{textellipsex} is a simlar +% extension for \gbc{textellipse}. It and the related macro +% \DescribeRoutine{textovalx}\gbc{textovalx} now call a common macro with +% different values of a boolean parameter. % \begin{macrocode} -def textovalx = xellipse (true) enddef; -def textellipsex = xellipse (false) enddef; +def textovalx = xellipse (true) enddef; +def textellipsex = xellipse (false) enddef; % \end{macrocode} % \DescribeRoutine{xellipse} @@ -1401,97 +1794,100 @@ def textellipsex = xellipse (false) enddef; % vertical radii of the resulting ellipse, while \gbc{ww} and \gbc{hh} % are half the width and height size of the text. If the boolean % \gbc{aspect} is true, the aspect ratio of the ellipse (i.e., \gbc{aa/bb}) -% equals \gbc{mult*hh/ww}, otherwise it equals \gbc{mult}. +% equals \gbc{mult*ww/hh}, otherwise it equals \gbc{mult}. % \begin{macrocode} vardef xellipse (expr aspect, a, b, c, r, xy, lbl, mult, loc) = - if mult = 0 : + if mult = 0: textrectx (a, b, c, r) (xy, lbl, 0, loc) else: save ll, ur, cc, ww, hh, f; pair ll, ur, cc; path f; - labeldims (xy, lbl) (ll, ur); - cc := .5[ll, ur]; % center + pathdims (xy, lbl) (ll, ur); + readjustdims (ll, ur) (labelpath_sep) + cc := .5[ll, ur]; (ww, hh) = ur - cc; - if (ww = 0) or (hh = 0) : % make a line: + if (ww = 0) or (hh = 0): f = (ll--ur); else: - save aa, bb, mm; - mm := if aspect : ww/hh*mult else: mult fi; - aa := ww ++ hh*mm; - bb := aa/mm; - f := ellipse(cc, aa, bb, 0); + save aa, bb; +% \end{macrocode} +% +% The \gbc{aa} and \gbc{bb} are now calculated in a way that decreases the +% chance of overflow. As a side effect, negative \gbc{mult} no longer +% reverses the path. +% \begin{macrocode} + aa := ww ++ if aspect: ww else: hh fi *mult; + bb := hh ++ if aspect: hh else: ww fi /mult; + f := ellipse (cc, aa, bb, 0); fi - invvconv(thegblabel (ref_shift (a, b, c, ll, ur), r, f)) shifted loc + readjustdims (ll, ur) (label_sep - labelpath_sep); + invvconv (thegblabel (ref_shift(a, b, c, ll, ur), r, f)) shifted loc fi enddef; % \end{macrocode} % -% \DescribeRoutine{labeldims} +% \DescribeRoutine{pathdims} % This has been changed to make the code of \mfpic{} a bit simpler and % to aid in backward compatibility. It takes a couple of pairs (the actual % or nominal label bounding box corners) or something visible (picture, -% string or path) and assigns suitable values to \gbc{ll} and \gbc{ur} -% then expands the bbox by \gbc{label_sep}. +% string or path) and assigns suitable values to \gbc{ll} and \gbc{ur}. +% +% \DescribeRoutine{readjustdims} +% This is used to add the separations needed to implement the effects of +% \gbc{label_sep} and \gbc{labelpath_sep}. % \begin{macrocode} - -def labeldims (expr xy, lbl) (suffix ll, ur) = - if pair lbl : - ll := xy; ur := lbl; +def pathdims (expr xy, lbl) (suffix ll, ur) = + if pair lbl: + ll := xy; ur := lbl; else: -%<MF> ll := ur := (0, 0); +%<MF> ll := ur := origin; %<*MP> - save _lbl; picture _lbl; - _lbl := - if picture lbl : lbl - elseif string lbl : - lbl infont defaultfont scaled defaultscale - elseif path lbl : picpath (lbl) - else : nullpicture - fi; + setpicture (_lbl) makepicture (lbl); ll := llcorner _lbl; ur := urcorner _lbl; %</MP> fi - ll := ll - label_sep*(1, 1); - ur := ur + label_sep*(1, 1); +enddef; + +def readjustdims (suffix ll, ur) (expr s) = + ll := ll - s*(1,1); + ur := ur + s*(1,1); enddef; % \end{macrocode} % % -% \section{Additional functions}\label{functions} +% \section{Additional Functions}\label{functions} % % Complex variable functions are provided, which interpret a pair $(x, y)$ % as the complex number $z = x + iy$. We also provide for the use of % radians, add the standard exponential and logarithms, and add the % hyperbolic functions and their inverses. % -% The value \gbc{eps/2 + epsilon} is the smallest value with -% reciprocal less than \mfc{infinity}. I set \gbc{nottoosmall} a speck -% bigger to ensure that the same is true of \gbc{2*(nottoosmall/2)}. -% % Normally \mfc{infinity = 2**12 - epsilon} is the largest number allowed % (as a value involved in actual drawing in \MF). Since we set % \mfc{warningcheck=0}, values not assigned to a variable and not % written to the \file{.tfm} file (and any value in \MP) can be as high as % \mfc{2**15 - epsilon}, which is a speck smaller than \mfc{1/(2epsilon)}. -% So \gbc{reallysmall} is to be the smallest number whose reciprocal is a +% So \gbc{reallysmall} is the smallest number whose reciprocal is a % usable number. (\mfc{epsilon} is the smallest possible positive number % in \MF.) % -% We set \gbc{secd x = 1/(cosd x)} unless \gbc{cosd x} is less than ``really -% small'', then we set it equal to \gbc{1/reallysmall}. We do a similar -% thing with \gbc{cscd}. -%^^A -% \DescribeRoutine{TruncateWarn} -% (When such a substitution happens \gbc{TruncateWarn} prints a message +% The value \gbc{eps/2 + epsilon} is the smallest value with +% reciprocal less than \mfc{infinity}. I set \gbc{nottoosmall} a speck +% bigger to ensure that the same is true of \gbc{2*(nottoosmall/2)}. +% +% We set \gbc{secd x = 1/(cosd x)} unless \gbc{cosd x} is less than +% \gbc{reallysmall}, then we set it equal to \gbc{1/reallysmall}. We do a +% similar thing with \gbc{cscd}. (When such a substitution happens +% \DescribeRoutine{TruncateWarn}\gbc{TruncateWarn} prints a message % that a truncation has taken place.) % % Why not just determine what number will produce arithmetic overflow and % test for that? Because I'm lazy: it would require a different number -% for each of the functions. Instead, since \MF{} has no ``arithmetic -% underflow'', I compute something that is guaranteed to work and occurs +% for each of the functions. Instead, since \MF{} has no `arithmetic +% underflow', I compute something that is guaranteed to work and occurs % in the formula for the function as a reciprocal (e.g., $t = e^{-|x|}$ % for \gbc{cosh x}) and make sure the number is not too small to take its % reciprocal. @@ -1500,29 +1896,28 @@ enddef; % This expands to a minus sign if its argument is negative, otherwise % nothing. % \begin{macrocode} -newinternal nottoosmall; nottoosmall := eps/2 + 2epsilon; -newinternal reallysmall; reallysmall := 3epsilon; -def signof (expr X) = if X < 0 : - fi enddef; -def TruncateWarn expr s = GBmsg s & " too large; truncating"; enddef; +newinternal reallysmall; reallysmall := 3epsilon; +newinternal nottoosmall; nottoosmall := eps/2 + 2epsilon; +def signof (expr X) = if X < 0: - fi enddef; +def TruncateWarn expr s = + GBwarn s & " is too large or undefined, so it will be truncated."; +enddef; % \end{macrocode} % In addition to \mfc{sind} and \mfc{cosd} which take angles in degrees, % we define the remaining trig functions \gbc{tand}, \gbc{cotd}, % \gbc{secd}, and \gbc{cscd}. % -% \DescribeRoutine{secd} -% \DescribeRoutine{tand} -% \DescribeRoutine{cscd} -% \DescribeRoutine{cotd} -% We define \gbc{secd}, one of the simplest, to include an ``out of range'' -% test (which also prevents division by 0). Then \gbc{tand} can make use -% of it without any division. We do the same with \gbc{cscd} and -% \gbc{cotd}. +% We define \RoutineIndex{secd}\gbc{secd}, one of the simplest, to include +% an out of range test (which also prevents division by 0). Then +% \RoutineIndex{tand}\gbc{tand} can make use of it without any division. +% We do the same with \RoutineIndex{cscd}\gbc{cscd} and +% \RoutineIndex{cotd}\gbc{cotd}. % \begin{macrocode} vardef secd primary X = - save temp; temp := cosd(X); - if abs(temp) < reallysmall : - TruncateWarn "Secant"; + setnumeric (temp) cosd(X); + if abs(temp) < reallysmall: + TruncateWarn "Secant or Tangent"; temp := signof (temp) reallysmall; fi 1/temp @@ -1530,9 +1925,9 @@ enddef; vardef tand primary X = sind(X)*secd(X) enddef; vardef cscd primary X = - save temp; temp := sind(X); - if abs(temp) < reallysmall : - TruncateWarn "Cosecant"; + setnumeric (temp) sind(X); + if abs(temp) < reallysmall: + TruncateWarn "Cosecant or Cotangent"; temp := signof(temp) reallysmall; fi 1/temp @@ -1540,23 +1935,33 @@ enddef; vardef cotd primary X = cosd(X)*cscd(X) enddef; % \end{macrocode} -% \DescribeRoutine{acos} -% \DescribeRoutine{asin} -% \DescribeRoutine{atan} -% These are the inverse functions, which return an angle in degrees. +% These are the inverse functions, which return an angle in degrees: +% \RoutineIndex{acos}\gbc{acos}, \RoutineIndex{asin}\gbc{asin} and +% \RoutineIndex{atan}\gbc{atan}. % \begin{macrocode} -vardef acos primary X = angle (X, 1 +-+ X) enddef; -vardef asin primary X = angle (1 +-+ X, X) enddef; +vardef acos primary X = + if abs X > 1: + TruncateWarn "Argument of arccosine"; + angle (signof(X) 1, 0) + else: + angle (X, 1 +-+ X) + fi +enddef; +vardef asin primary X = + if abs X > 1: + TruncateWarn "Argument of arcsine"; + angle (0, signof(X) 1) + else: + angle (1 +-+ X, X) + fi +enddef; vardef atan primary X = angle (1, X) enddef; % \end{macrocode} -% \DescribeRoutine{sin} -% \DescribeRoutine{cos} -% \DescribeRoutine{tan} -% \DescribeRoutine{cot} -% \DescribeRoutine{sec} -% \DescribeRoutine{csc} -% Now the trig functions that take angles in radians. +% Now the trig functions that take angles in radians: +% \RoutineIndex{sin}\gbc{sin}, \RoutineIndex{cos}\gbc{cos}, +% \RoutineIndex{tan}\gbc{tan}, \RoutineIndex{cot}\gbc{cot}, +% \RoutineIndex{sec}\gbc{sec} and \RoutineIndex{csc}\gbc{csc}. % \begin{macrocode} vardef sin primary X = sind (X*radian) enddef; vardef cos primary X = cosd (X*radian) enddef; @@ -1566,65 +1971,64 @@ vardef sec primary X = secd (X*radian) enddef; vardef csc primary X = cscd (X*radian) enddef; % \end{macrocode} -% \DescribeRoutine{invsin} -% \DescribeRoutine{invcos} -% \DescribeRoutine{invtan} -% And the inverses that return angles in radians. +% +% It is useful to have a \DescribeRoutine{degrees}command to convert +% from radians to degrees and one to \DescribeRoutine{radians}convert +% from degrees to radians. Thus \gbc{degrees(pi)} produces +% (approximately) $180$ and \gbc{radians(180)} is approximately $\pi$. +% \begin{macrocode} +vardef degrees (expr t) = t*radian enddef; +vardef radians (expr t) = t/radian enddef; +% \end{macrocode} +% +% And the inverses (\RoutineIndex{invsin}\gbc{invsin}, +% \RoutineIndex{invcos}\gbc{invcos} and \RoutineIndex{invtan}\gbc{invtan}) +% that return angles in radians. % \begin{macrocode} vardef invcos primary X = (acos X)/radian enddef; vardef invsin primary X = (asin X)/radian enddef; vardef invtan primary X = (atan X)/radian enddef; % \end{macrocode} -% \DescribeRoutine{exp} -% \DescribeRoutine{ln} -% \DescribeRoutine{log} -% \DescribeRoutine{logbase} -% \DescribeRoutine{logtwo} -% \DescribeRoutine{logten} -% Here we define the standard exponential function. (The \MF{} function -% \mfc{mexp} has the unusual base $e^{1/256}$ to avoid overflow.) The -% inverse of \gbc{exp} is the natural logarithm (\gbc{ln} or \gbc{log}). -% We also have the general base logarithm \gbc{logbase} and its two -% special instances \gbc{logtwo} and \gbc{logten}. -% \begin{macrocode} -vardef exp primary X = mexp (256 * X) enddef; -vardef ln primary X = (mlog X) / 256 enddef; -def log = ln enddef; -vardef logbase (expr B) primary X = (mlog X)/(mlog B) enddef; -def logtwo = logbase( 2) enddef; -def logten = logbase(10) enddef; - -% \end{macrocode} -% \DescribeRoutine{Arg} -% \DescribeRoutine{Log} -% \DescribeRoutine{cis} -% \DescribeRoutine{zexp} -% \DescribeRoutine{sgn} +% +% Here we define the standard exponential function +% \RoutineIndex{exp}\gbc{exp}. (The \MF{} function \mfc{mexp} has the +% unusual base $e^{1/256}$ to avoid overflow.) The inverse of \gbc{exp} is +% the natural logarithm (\RoutineIndex{ln}\gbc{ln} or +% \RoutineIndex{log}\gbc{log}). We also have the general base logarithm +% \RoutineIndex{logbase}\gbc{logbase} and its two special instances +% \RoutineIndex{logtwo} \gbc{logtwo} and \RoutineIndex{logten}\gbc{logten}. +% \begin{macrocode} +vardef exp primary X = mexp (256 * X) enddef; +vardef ln primary X = (mlog X) / 256 enddef; +def log = ln enddef; +vardef logbase (expr B) primary X = (mlog X)/(mlog B) enddef; +def logtwo = logbase( 2) enddef; +def logten = logbase(10) enddef; + +% \end{macrocode} % \CMF's pair variables are a decent replacement for complex variables. % These give some of the more basic functions of standard complex -% analysis. +% analysis: \RoutineIndex{Arg}\gbc{Arg}, \RoutineIndex{Log}\gbc{Log}, +% \RoutineIndex{cis}\gbc{cis}, \RoutineIndex{zexp}\gbc{zexp} and +% \RoutineIndex{sgn}\gbc{sgn}. % \begin{macrocode} -vardef Arg primary Z = (angle Z)/radian enddef; -vardef Log primary Z = (ln(abs(Z)), Arg (Z)) enddef; -vardef cis primary T = dir(radian*T) enddef; -vardef zexp primary Z = (exp (xpart Z))*(cis(ypart Z)) enddef; -vardef sgn primary Z = - if Z = origin : origin else: unitvector Z fi -enddef; +vardef Arg primary Z = (angle Z)/radian enddef; +vardef Log primary Z = (ln (abs Z), Arg Z) enddef; +vardef cis primary T = dir (T*radian) enddef; +vardef zexp primary Z = (exp (xpart Z)) * cis (ypart Z) enddef; +vardef sgn primary Z = if not (Z = origin): unitvector fi Z enddef; % \end{macrocode} -% \DescribeRoutine{cosh} -% \DescribeRoutine{sinh} -% \DescribeRoutine{tanh} -% \DescribeRoutine{sech} -% \DescribeRoutine{csch} -% \DescribeRoutine{coth} -% The hyperbolic functions. +% +% The hyperbolic functions: \RoutineIndex{cosh}\gbc{cosh} +% \RoutineIndex{sinh}\gbc{sinh}, \RoutineIndex{tanh}\gbc{tanh}, +% \RoutineIndex{sech}\gbc{sech}, \RoutineIndex{csch}\gbc{csch} and +% \RoutineIndex{coth}\gbc{coth}. % \begin{macrocode} vardef cosh primary X = - save temp; temp := 2 exp (-abs(X)); - if temp < reallysmall : + setnumeric (temp) 2 exp (-abs(X)); + if temp < reallysmall: TruncateWarn "Cosh"; temp := reallysmall; fi @@ -1632,8 +2036,8 @@ vardef cosh primary X = enddef; vardef sinh primary X = - save temp; temp := 2 exp (-abs(X)); - if temp < reallysmall : + setnumeric (temp) 2 exp (-abs(X)); + if temp < reallysmall: TruncateWarn "Sinh"; temp := reallysmall; fi @@ -1641,60 +2045,55 @@ vardef sinh primary X = enddef; vardef sech primary X = - save temp; temp := exp(-(abs (X))); + setnumeric (temp) exp(-(abs (X))); 2temp/(1 + temp*temp) enddef; vardef tanh primary X = - save temp; temp := exp(-2(abs (X))); + setnumeric (temp) exp(-2(abs (X))); signof (X) (1 - temp)/(1 + temp) enddef; vardef csch primary X = - save temp; temp := exp(-(abs (X))); - if abs(1 - temp*temp) < reallysmall : + save temp, tempa; temp := exp(-(abs (X))); + tempa := (1 - temp*temp)/2; + if tempa < reallysmall: TruncateWarn "Csch"; - signof (X) 2temp / reallysmall - else: - signof (X) 2temp / (1 - temp*temp) + tempa := reallysmall; fi + signof (X) temp / tempa enddef; vardef coth primary X = - save temp; temp := tanh(X); - if abs(temp) < reallysmall : + setnumeric (temp) tanh(X); + if abs(temp) < reallysmall: TruncateWarn "Coth"; - temp := signof (temp) reallysmall; + temp := signof (X) reallysmall; fi 1/temp enddef; % \end{macrocode} -% \DescribeRoutine{acosh} -% \DescribeRoutine{asinh} -% \DescribeRoutine{atanh} -% The inverses of some of the hyperbolic functions. +% The inverses of some of the hyperbolic functions: +% \RoutineIndex{acosh}\gbc{acosh}, \RoutineIndex{asinh}\gbc{asinh} and +% \RoutineIndex{atanh}\gbc{atanh}. % \begin{macrocode} vardef acosh primary y = - if y < 1 : - GBerrmsg ("Undefined function: acosh " & decimal y) - "If you proceed, a value of 0 will be used. " & - "Expect more errors later."; + if y < 1: + TruncateWarn "acosh"; 0 else: - ln (y + (y+-+1)) + ln (y + (y +-+ 1)) fi enddef; -vardef asinh primary y = ln (y + (y++1)) enddef; +vardef asinh primary y = ln (y + (y ++ 1)) enddef; vardef atanh primary y = - if abs (y) < 1 : - (ln(1+y) - ln(1-y))/2 + if abs (y) < 1: + (ln (1 + y) - ln (1 - y))/2 else: - GBerrmsg ("Undefined function: atanh " & decimal y) - "If you proceed, a value of plus or minus infinity " & - "will be used. Expect more errors later."; + TruncateWarn "atanh"; signof (y) infinity fi enddef; @@ -1702,42 +2101,61 @@ enddef; % \end{macrocode} % % \DescribeRoutine{polar} -% \DescribeRoutine{id} % \gbc{polar} converts a polar coordinate pair $(r, \theta)$ to the % corresponding rectangular coordinate pair. -% +% \DescribeRoutine{id} % \gbc{id} returns its argument, which can be any expression of any type. % \begin{macrocode} -vardef polar (expr p) = (xpart p) * dir (ypart p) enddef; -def id (expr x) = x enddef; +vardef polar primary p = (xpart p) * dir (ypart p) enddef; +def id (expr x) = x enddef; % \end{macrocode} % +% The definition of powers (\gbc{x**y}) in \prog{plain} \MF{} and \MP{} +% could be more accurate. In particular \gbc{x=2**10} ought to be an +% integer (that is, satisfy \mfc{x=floor x}). Here we redefine +% \prog{plain}'s \mfc{**}, intercepting the case of a positive integer +% power of an integer. +% \begin{macrocode} +primarydef x**y = + if y=2: x*x + elseif (x = floor x) and (abs y = floor y): + 1 for n=1 upto y: *x endfor + else: takepower y of x + fi +enddef; +let ^ = **; +% \end{macrocode} % -% \section{Coordinate systems and transformations}\label{systems} +% \section{Coordinate Systems and Transformations}\label{systems} % +% \DescribeVariable{T_stack} +% We want to define a localization of the current transform. To do +% this we define a LIFO stack of transforms \gbc{T_stack[\,]}, and a pair of +% macros. % \DescribeRoutine{T_push} +% \gbc{T_push} puts its argument (a transform) on the stack, and % \DescribeRoutine{T_pop} -% \DescribeRoutine{bcoords} -% \DescribeRoutine{ecoords} -% We want to define a localization of the ``current transform''. To do -% this we define a LIFO stack of transforms \gbc{T_stack[]}, a pair of -% macros \gbc{T_push} puts its argument (a transform) on the stack, and % \gbc{T_pop} pops it off into its argument (a transform variable name). -% We also define two localizing macros \gbc{bcoords} that pushes our -% \gbc{ztr} and \gbc{vtr} on the stack, and \gbc{ecoords} that pops them -% off. -% \begin{macrocode} -transform T_stack[]; T_stack := 0; -def T_push (expr T) = T_stack[incr T_stack] := T; enddef; +% We also define two localizing macros +% \DescribeRoutine{bcoords}\gbc{bcoords} that pushes our \gbc{ztr} +% on the stack, and \DescribeRoutine{ecoords}\gbc{ecoords} that pops it +% off. We no longer put \gbc{vtr} on the stack, since we can recalculate +% it whenever \gbc{ztr} is changed. \gbc{apply_t} always did this, now +% \gbc{ecoords} does so as well. +% \begin{macrocode} +transform T_stack[]; +numeric T_stack; T_stack := 0; +def T_push (expr T) = T_stack[incr T_stack] := T; enddef; def T_pop (suffix $) = - if T_stack > 0 : - $ := T_stack[T_stack]; T_stack := T_stack - 1; + if T_stack > 0: + $ := T_stack[T_stack]; + T_stack := T_stack - 1; fi enddef; -def bcoords = hide ( T_push (ztr); T_push (vtr) ) enddef; -def ecoords = hide ( T_pop (vtr); T_pop (ztr) ) enddef; +def bcoords = hide ( T_push (ztr) ) enddef; +def ecoords = hide ( T_pop (ztr); vtr := vectorpart ztr ) enddef; % \end{macrocode} % @@ -1750,276 +2168,363 @@ def ecoords = hide ( T_pop (vtr); T_pop (ztr) ) enddef; % calculate \gbc{vtr} from \gbc{ztr} by arranging that \mfc{origin % transformed vtr} is \mfc{origin}. The syntax is \gbc{apply_t(rotated % theta)} or \gbc{apply_t(transformed T)} if \mfc{T} is a variable or -% expression of type transform. Thus the argument of \gbc{apply_t} is +% expression of type transform. Thus the argument of \gbc{apply_t} is a % phrase which, were it to follow a path, would produce a transformed % path. Knuth calls such a phrase a \emph{transformer}. % \begin{macrocode} +vardef vectorpart primary T = T shifted -(origin transformed T) enddef; + def apply_t (text Transformer) = ztr := identity Transformer transformed ztr; - vtr := ztr shifted - zconv(origin); + vtr := vectorpart ztr; enddef; % \end{macrocode} % -% \DescribeRoutine{xslant} -% \DescribeRoutine{yslant} -% \DescribeRoutine{zslant} -% \DescribeRoutine{xyswap} -% \DescribeRoutine{boost} -% And now we define some available transformers. The only two that -% need comment are \gbc{zslant} and \gbc{boost}. I know that boost comes -% from special relativity, but I have no idea what zslant is about. +% And now we define some available transformers. +% \RoutineIndex{xslant}\gbc{xslant}, \RoutineIndex{yslant}\gbc{yslant}, +% \RoutineIndex{zslant}\gbc{zslant}, \RoutineIndex{xyswap}\gbc{xyswap} and +% \RoutineIndex{boost}\gbc{boost}. The only two that need comment are +% \gbc{zslant} and \gbc{boost}. I know that boost comes from special +% relativity, but I have no idea why zslant is a `slant'. % \begin{macrocode} -def xslant = slanted enddef; % (x+sy, y). +def xslant = slanted enddef; % (x+sy, y). def yslant primary s = % (x, y+sx). transformed begingroup - save _T; transform _T; - origin transformed _T = origin; - (1, 0) transformed _T = (1, s); - (0, 1) transformed _T = (0, 1); - _T + save T; transform T; + origin transformed T = origin; + (1, 0) transformed T = (1, s); + (0, 1) transformed T = (0, 1); + T endgroup enddef; -def zslant primary p = % (xu+yv, xv+yu), where p = (u, v). +def zslant primary p = % (xu+yv, xv+yu), where p = (u, v). transformed begingroup - save _T; transform _T; - xpart _T = ypart _T = 0; - xxpart _T = yypart _T = xpart p; - xypart _T = yxpart _T = ypart p; - _T + save T; transform T; + xpart T = ypart T = 0; + xxpart T = yypart T = xpart p; + xypart T = yxpart T = ypart p; + T endgroup enddef; -def xyswap = zslant (0, 1) enddef; -def boost primary X = zslant (cosh X, sinh X) enddef; +def xyswap = zslant (0, 1) enddef; +def boost primary X = zslant (cosh X, sinh X) enddef; % \end{macrocode} % % \subsection{Path transformation}\label{transformation} % -% These are functions that accept a path and return a path in graph -% coordinates. For the most part they are named and defined to -% apply a similarly named transform to the path and return the result. -% There are two exceptions. When we draw things, we expect that rotated -% and reflected objects appear congruent to the originals. If we define a -% path in graph coordinates, and the x and y directions are scaled -% differently, then simply rotating the graph coordinates will distort -% angles. The same is true of reflection. Therefore, we apply \gbc{vtr} -% (so we are in drawing coordinates) then rotate, then apply \gbc{inverse -% vtr}. This may be a mistake, or perhaps we should do it for all of -% these. For now, I'm sticking with the scheme I inherited. One can -% always use \gbc{coords} and \gbc{apply_t} if one wants the difference in -% scales ignored. +% These are functions that accept and return a path in graph coordinates. +% For the most part they are named and defined to apply a similarly named +% transform to the path and return the result. There are two exceptions. +% When we draw things, we expect that rotated and reflected objects appear +% congruent to the originals. If we define a path in graph coordinates, +% and the $x$ and $y$ directions are scaled differently, then simply +% rotating the graph coordinates will distort angles. The same is true of +% reflection. Therefore, we apply \gbc{vtr} (so we are in drawing +% coordinates) then rotate or reflect, then apply \gbc{inverse vtr}. This +% may be a mistake, or perhaps we should do it for all of these. For now, +% I'm sticking with the scheme I inherited. One can always use +% \gbc{coords} and \gbc{apply_t} if one wants the difference in scales +% ignored. +% +% \DescribeRoutine{transformedpath} +% This is a vardef that reads an undelimited path expression and returns +% the path transformed by the text argument. All the others run this, +% allowing it to grab the path expression. % % \DescribeRoutine{rotatedpath} % This returns the path rotated around point \gbc{p} by angle % \gbc{th} in degrees. % +% \DescribeRoutine{reflectedpath} +% This reflects the path through the line containing points \gbc{p} and +% \gbc{q}. +% % \DescribeRoutine{scaledpath} % This returns the path scaled so that distances from the point % \gbc{p} are multiplied by \gbc{s}. -% -% \DescribeRoutine{xslantedpath} -% This returns the path x-slanted with line $y = {}$\gbc{b} -% being the pivot rather than the x-axis. -% -% \DescribeRoutine{yslantedpath} -% This returns the path y-slanted with line $x = {}$\gbc{a} -% being the pivot rather than the y-axis. -% % \DescribeRoutine{xscaledpath} -% This returns the path scaled so that vertical distances -% from the line $y={}$\gbc{a} are multiplied by \gbc{s}. +% \gbc{xscaledpath} is similar, but only the horizontal distances from +% the line $x={}$\gbc{a} are multiplied by \gbc{s}. And with +% \DescribeRoutine{yscaledpath}\gbc{yscaledpath} the vertical distances +% from the line $y={}$\gbc{b} are multiplied by \gbc{s}. % -% \DescribeRoutine{yscaledpath} -% This returns the path scaled so that vertical distances -% from the line $x={}$\gbc{b} are multiplied by \gbc{s}. +% \DescribeRoutine{xslantedpath} +% This returns the path xslanted with line $y = {}$\gbc{b} +% being the pivot rather than the $x$-axis. \DescribeRoutine{slantedpath} +% The command \gbc{slantedpath} is just an alias for \gbc{xslantedpath}, +% while \DescribeRoutine{yslantedpath}\gbc{yslantedpath} is the vertical +% version, yslanted with line $x = {}$\gbc{a} being the pivot rather than +% the $y$-axis. % % \DescribeRoutine{shiftedpath} % This returns the path shifted by the vector (pair) \gbc{v}. % -% \DescribeRoutine{reflectedpath} -% This returns the path relected about the line through the -% points \gbc{p} and \gbc{q}. -% % \DescribeRoutine{xyswappedpath} -% Finally, this returns the path in which all coordinates -% have had the coordinates exchanged $(a, b) \to (b, a)$. Note that this -% is not the same as \gbc{reflectedpath ((0, 0), (1, 1))}, as it performs the -% reflection in graph coordinates, as its name implies. If \gbc{vtr} has -% not been changed (by \gbc{apply_t}) then \gbc{xyswappedpath} will -% convert vertical lines to horizontal and vice versa. The -% \gbc{reflectedpath} version will not when x and y are scaled differently, -% for then the line \gbc{(0, 0)--(1, 1)} is not at a 45 degree angle in -% device coordinates where drawing takes place. -% \begin{macrocode} -vardef rotatedpath (expr p, th) expr f = - f transformed vtr rotatedaround (p transformed vtr, th) - transformed (inverse vtr) +% This returns the path in which all points have had the coordinates +% exchanged $(a, b) \to (b, a)$. Note that this is not the same as +% \gbc{reflectedpath ((0,0), (1,1))}, as it performs the reflection in +% graph coordinates, as its name implies. If \gbc{vtr} has not been +% changed (by \gbc{apply_t}) then \gbc{xyswappedpath} will convert +% vertical lines to horizontal and vice versa. The \gbc{reflectedpath} +% version will not when $x$ and $y$ are scaled differently, for then the +% line \gbc{(0,0)--(1,1)} is not at a 45 degree angle in device +% coordinates where drawing takes place. +% +% \begin{macrocode} +vardef transformedpath (text Transformer) expr f = f Transformer enddef; -vardef scaledpath (expr p, s) expr f = - f shifted -p scaled s shifted p + +def rotatedpath (expr p, th) = + transformedpath ( + transformed vtr + rotatedaround (p transformed vtr, th) + transformed (inverse vtr) + ) enddef; -vardef xslantedpath (expr b, s) expr f = - f shifted (0, -b) slanted s shifted (0, b) +def reflectedpath (expr p, q) = + transformedpath ( + transformed vtr + reflectedabout (p transformed vtr, q transformed vtr) + transformed (inverse vtr) + ) enddef; -def slantedpath = xslantedpath enddef; -vardef yslantedpath (expr a, s) expr f = - f shifted (-a, 0) yslant s shifted (0, a) + +def scaledpath (expr p, s) = + transformedpath (shifted -p scaled s shifted p) enddef; -vardef xscaledpath (expr a, s) expr f = - f shifted (-a, 0) xscaled s shifted (a, 0) +def xscaledpath (expr a, s) = + transformedpath (shifted (-a, 0) xscaled s shifted (a, 0)) enddef; -vardef yscaledpath (expr b, s) expr f = - f shifted (0, -b) yscaled s shifted (0, b) +def yscaledpath (expr b, s) = + transformedpath (shifted (0, -b) yscaled s shifted (0, b)) enddef; -vardef shiftedpath (expr v) expr f = f shifted v enddef; -vardef reflectedpath (expr p, q) expr f = - f transformed vtr - reflectedabout (p transformed vtr, q transformed vtr) - transformed (inverse vtr) + +def slantedpath = xslantedpath enddef; +def xslantedpath (expr b, s) = + transformedpath (shifted (0, -b) slanted s shifted (0, b)) enddef; -vardef xyswappedpath expr f = f xyswap enddef; -vardef transformedpath (text Transformer) expr f = - f Transformer +def yslantedpath (expr a, s) = + transformedpath (shifted (-a, 0) yslant s shifted (0, a)) enddef; +def shiftedpath (expr v) = transformedpath (shifted v) enddef; + +def xyswappedpath = transformedpath (xyswap) enddef; + % \end{macrocode} % -% \DescribeRoutine{partialpath} -% \DescribeRoutine{gsubpath} % It seems odd, in retrospect, that we got by with a user interface that % didn't include any subpath operations. But recently a user asked for the % ability to add an arrowhead to the \emph{middle} of a path, and it % seemed best to provide a subpath and use existing commands to add an -% arrowhead on its end. This macro takes two fractions $\alpha$ and -% $\beta$ between 0 and 1, and a path \gbc{f}, and returns the subpath -% from $\alpha * {} $\meta{length of \gbc{f}} to $\beta * {}$\meta{length -% of \gbc{f}} of \gbc{f}. \gbc{gsubpath} is the same as \MF's subpath -% primitive, but follows the prefix macro syntax of accepting a path -% expression (rather than a primary) and wrapping the result in a -% \mfc{vardef}. +% arrowhead on its end. +% +% \DescribeRoutine{partialpath} +% The \gbc{partialpath} macro takes two fractions $\alpha$ and $\beta$ +% between 0 and 1, and a path \gbc{f}, and returns the subpath from +% $\alpha * {} $\meta{length of \gbc{f}} to $\beta * {}$\meta{length of +% \gbc{f}} of \gbc{f}. Since the \gbc{gettime} routine was written to +% find the times for an increasing sequence of lengths, it was optimized +% to save the index of the previous length and begin from there. Thus it +% is more efficient to find the smaller of \gbc{a} and \gbc{b} first. +% +% Since running \gbc{gettime} would be a very inefficient way to get the +% first or last point of a path we skip that if either fraction is $0$ or +% $1$ (a common use is to get the first or last half of a path). We also +% skip finding the second time if \gbc{a = b} (an unlikely choice, but +% legal). +% +% \DescribeRoutine{gsubpath} +% \gbc{gsubpath} is the same as \MF's subpath primitive, but follows the +% prefix macro syntax of accepting a path expression (rather than a +% primary) and wrapping the result in a \mfc{vardef}. % \begin{macrocode} vardef partialpath (expr a, b) expr f = - save p; path p; - p := zconv (f) scaled (1/unit_of_length); - save cumlen, totlen, idx, ta, tb; - totlen := makelengtharray(cumlen) p; -% \end{macrocode} -% \gbc{idx} holds the current index into the array \gbc{cumlen[]}. The -% code of \gbc{gettime} is optimized for sorted lengths. If we always -% found \gbc{ta} first, we'd have to re-initialize \gbc{idx} in case -% \gbc{tb < ta}, i.e., search from the beginning again. -% \begin{macrocode} - idx := 0; - if a <= b: - ta := gettime (cumlen, idx) (a*totlen); - tb := gettime (cumlen, idx) (b*totlen); + save flag, flo, fhi, lo, hi, n; + boolean flag; flag = true; + convertpath (g) f; + n := length f; + + flo := snapto emin(a,b); + if flo = 0: + lo := 0; + elseif flo < 1: + setuplengtharray (cum, tot, idx) g; + flag := false; + lo := gettime (cum, idx) (flo*tot); + else: + lo := n; + fi + + fhi := snapto emax (a,b); + if flo = fhi: + hi := lo; + elseif fhi < 1: + if flag: setuplengtharray (cum, tot, idx) g; fi + hi := gettime (cum, idx) (fhi*tot); + else: + hi := n; + fi + + if a > b: reverse fi subpath (lo, hi) of f +enddef; + +vardef gsubpath (expr a, b) expr f = subpath (a, b) of f enddef; + +% \end{macrocode} +% +% \DescribeRoutine{setuplengtharray} +% This does the frequently repeated saving, rescaling and initializing +% for those commands that need to convert distance along a path to the +% corresponding time or point. A path variable should follow, but that +% is picked up by the \gbc{makelengtharry} at the end. +% \begin{macrocode} +def setuplengtharray (suffix cum, tot, idx) = + save cum, tot, idx; idx := 0; tot := makelengtharray (cum) +enddef; + +% \end{macrocode} +% +% \DescribeRoutine{pathtime} +% \gbc{pathtime} returns the time \mfc{t} such that \mfc{point t of p} is +% \gbc{frac} of the distance along \gbc{p} from the start, and +% \DescribeRoutine{pathpoint}\gbc{pathpoint} returns the point itself. +% Because the \gbc{gettime} routine requires it anyway, we truncate +% \gbc{frac} to the interval $[0,1]$ and avoid calling that rather +% lengthy function at $0$ and $1$. +% +% The path in pathtime should be in device coordinates, whereas the +% user-level command \gbc{pathpoint} expects it in graph coordinates. +% In fact, since \gbc{pathpoint} would most likely be used in the +% argument of some figure macro in \mfpic{}, it would require a +% previously stored path, so we make the path a suffix parameter. +% \begin{macrocode} +vardef pathtime@# (suffix p) = + if @# <= 0: 0 + elseif @# >= 1: length p else: - tb := gettime (cumlen, idx) (b*totlen); - ta := gettime (cumlen, idx) (a*totlen); + setuplengtharray (cum, tot, idx) p; + gettime (cum, idx) (@#*tot) fi - subpath (ta, tb) of f enddef; -vardef gsubpath (expr a, b) expr f = subpath (a, b) of f enddef; + +vardef pathpoint (expr frac) (suffix p) = + convertpath (_pp) p; pnt[pathtime[frac] (_pp)] (p) +enddef; % \end{macrocode} % % -% \section{Picture level operations}\label{picture} +% \section{Picture-level Operations}\label{picture} +% +% \subsection{Bitwise logical operations}\label{logical} % % None of these operations are available in \MP. Mostly these are used by % higher level operations. Those higher level operations are available in % \MP, but need to be defined differently. % -% \subsection{Bitwise logical operations}\label{logical} -% % We have two types of operations. One type is a binary operator that % takes two picture expressions and returns a picture, the other type % returns nothing, but merely modifies a given picture variable. These % take the name of a picture and a picture expression and modify the named % one. The binary operators are not used elsewhere in graphbase except -% for \gbc{picsub}, which occurs in \gbc{picneg} and \gbc{shadepic}. +% for \gbc{picsub}, which occurs only in \gbc{shadepic}. They are all +% rather wasteful of memory. % % \DescribeRoutine{mono} -% Here we define the bitwise logical operations: and, or, xor, and +% Here we define the bitwise logical operations: and, or, xor, and % difference. These mostly only work if all pixels have values 0 or 1. % Since \MF{} allows other integer values, we define a \gbc{mono} operator % that converts all pixels with weight ${}\ge 1$ to 1 and all pixels -% with weight ${}\le 0$ to 0. +% with weight ${}\le 0$ to 0. It is important to note that we can apply +% \gbc{mono} only to the suffix parameter in such things as \gbc{orto}. +% The expression parameter needs to be prepared by the routine that calls +% these. The return result is culled, so it consists only of 0s and 1s. % \begin{macrocode} %<*MF> -def mono (suffix u) = cull u keeping (1, infinity); enddef; +def mono (suffix u) = cull u keeping (1, infinity); enddef; % \end{macrocode} -% \DescribeRoutine{andto} -% \DescribeRoutine{picand} -% The bitwise and: in the resulting picture, a pixel is \emph{on} if and -% only if it is \emph{on} in both \gbc{u} and \gbc{v}. +% \DescribeRoutine{andto, picand} +% The bitwise and: in the resulting picture, a pixel is \emph{on} if and +% only if it is \emph{on} in both \gbc{u} and \gbc{v}. \gbc{andto} is +% only used in \gbc{interior} and \gbc{interiors}, \gbc{picand} is not +% used at all. % \begin{macrocode} def andto (suffix u) (expr v) = - mono (u); addto u also v; cull u keeping (2, 2); + mono (u); addto u also v; cull u keeping (2, 2); enddef; primarydef u picand v = - begingroup save t; picture t; - t := u; andto (t, v); t - endgroup + begingroup setpicture (t) u; andto (t, v); t endgroup enddef; % \end{macrocode} -% \DescribeRoutine{orto} -% \DescribeRoutine{picor} +% \DescribeRoutine{orto, picor} % The inclusive or: in the result, a pixel is \emph{on} if and only if it -% is \emph{on} in \gbc{u} or \gbc{v} or both. +% is \emph{on} in \gbc{u} or \gbc{v} or both. I've written these so that +% it doesn't matter if the expression parameter is not mono. It +% \emph{is} required that it have only positive pixels. The command +% \gbc{orto} is only used three places: in \gbc{coloraddto}, which +% is itself never used, and in \gbc{patcharcs} and \gbc{patchrays}. This +% lack of use is because a less memory intensive version, \gbc{_orto}, is +% defined later, and that is what we use. Usually we build a picture +% in a variable \gbc{src} and add that onto another variable \gbc{dest}. +% If one used \gbc{orto (dest, src)}, then \MF{} would evaluate \gbc{src} +% and pass a \emph{copy} of it as the parameter of \gbc{orto}. This +% doubles the memory used, so mostly we use \gbc{_orto}, which passes both +% parameters as suffixes. \gbc{picor} is never used. % \begin{macrocode} def orto (suffix u) (expr v) = - mono (u); addto u also v; cull u keeping (1, 2); + mono (u); addto u also v; cull u keeping (1, infinity); enddef; primarydef u picor v = - begingroup save t; picture t; - t := u; orto (t, v); t - endgroup + begingroup setpicture (t) u; orto (t, v); t endgroup enddef; % \end{macrocode} -% \DescribeRoutine{xorto} -% \DescribeRoutine{picxor} +% \DescribeRoutine{xorto, picxor} % The exclusive or, also called the symmetric difference: % in the result, a pixel is \emph{on} if and only if it is \emph{on} in % \gbc{u} or \gbc{v}, but not both. These are not used elsewhere in % \grafbase. % \begin{macrocode} def xorto (suffix u) (expr v) = - mono (u); addto u also v; cull u keeping (1, 1); + mono (u); addto u also v; cull u keeping (1, 1); enddef; primarydef u picxor v = - begingroup save t; picture t; - t := u; xorto (t, v); t - endgroup + begingroup setpicture (t) u; xorto (t, v); t endgroup enddef; % \end{macrocode} % \DescribeRoutine{subto} -% \DescribeRoutine{picsub} % The nonsymmetric difference: in the result, a pixel is \emph{on} if -% and only if it is \emph{on} in \gbc{u} and off in \gbc{v}. +% and only if it is \emph{on} in \gbc{u} and off in \gbc{v}. It is +% unclear whether a \gbc{v} with negative weights will ever occur, but +% if so, subtracting negative pixels ought to be like adding positive +% ones, so I've changed \mfc{keeping (1,1)} to \gbc{keeping (1,infinity)}. +% With this understanding, it doesn't matter here whether \gbc{v} is +% not mono. As with \gbc{orto}, we have a more memory efficient +% \gbc{_subto} and now use that everywhere. \gbc{subto} is only used in +% \gbc{coloraddto}, which is not used anymore. The binop version +% \DescribeRoutine{picsub}\gbc{picsub} is used only in \gbc{shadepic}. % \begin{macrocode} def subto (suffix u) (expr v) = - mono (u); addto u also -v; cull u keeping (1, 1); + mono (u); addto u also -v; cull u keeping (1, infinity); enddef; primarydef u picsub v = - begingroup save t; picture t; - t := u; mono (t); subto (t, v); t - endgroup + begingroup setpicture (t) u; mono (t); subto (t, v); t endgroup enddef; %</MF> % \end{macrocode} % -% \subsection{Producing and modifying pictures} +% \subsection{Producing and modifying pictures}\label{pictures} % % Here we define some slightly higher level commands that make use (in \MF) % of the previous bitmap operations. In \MP, they mostly need different @@ -2031,26 +2536,65 @@ enddef; % dimension, etc., are in device coordinates. % % \DescribeRoutine{coloraddto} -% This has become a useful abbreviation. In \MF{} it adds when the color +% This was once a useful abbreviation. In \MF{} it adds when the color % is not white, subtracts when it is. Grays are handles in \MF{} by % appropriate preparation of \gbc{u} and \gbc{v}. See, for example, the % code of \gbc{colorsafefill}. In \MP{} it is an abbreviation for the -% basic \mfc{addto} operation, and is defined only so that \MP{} and \MF{} +% basic \mfc{addto} operation. It was defined only so that \MP{} and \MF{} % can share the same higher level code. +% +% When the last parameter \gbc{v} is the name of picture we can save +% memory if we pass the name rather than the value. Problems with picture +% memory turned up in the shading macros for \MF{} and the dashing macros +% for \MP{}. \DescribeRoutine{coloraddon}\gbc{coloraddon} applies this +% memory-saving trick and has completely replaced \gbc{coloraddto} in +% \grafbase{} code. Since \gbc{coloraddto} turned out to be used only with +% \gbc{u} equal to \gbc{active_plane}, we eliminate that parameter from +% \gbc{coloraddon}. +% +% \DescribeRoutine{_orto} +% This version of \gbc{orto} saves memory by passing \emph{both} +% parameters by name. This also allows the application of \gbc{mono} to +% both parameters. In addition to \gbc{coloraddon}, it is used in +% \gbc{shade} and \gbc{tess}. \DescribeRoutine{_subto}We also have +% \gbc{_subto}, an analogous version of \gbc{subto}. % \begin{macrocode} def coloraddto (expr clr) (suffix u) (expr v) = %<*MF> - if clr < white : + if clr < white: orto (u, v); else: - subto (u) (v); + subto (u, v); fi; %</MF> %<MP> addto u also v _wc_ clr; enddef; -%<MP>def orto (suffix u) (expr v) = addto u also v; enddef; +%<MP>def orto (suffix u) (expr v) = addto u also v; enddef; %<MP> +def coloraddon (expr clr) (suffix v) = +%<*MF> + if clr < white: + _orto (active_plane, v); + else: + _subto (active_plane, v); + fi; +%</MF> +%<MP> addto active_plane also v _wc_ clr; +enddef; + +def _orto (suffix u, v) = +%<MF> mono (u); mono (v); + addto u also v; +%<MF>cull u keeping (1, 2); +enddef; + +%<*MF> +def _subto (suffix u, v) = + mono (u); mono (v); addto u also -v; cull u keeping (1, 1); +enddef; + +%</MF> % \end{macrocode} % % \DescribeRoutine{interior} @@ -2061,15 +2605,16 @@ enddef; % also. \gbc{interior} is one of the most used commands throughout the % rest of \grafbase. % -% We ignore color (new behavior), since the higher level commands now -% implement the coloring operations. +% We ignore color (new behavior with \mfpic{} version 0.7), since the +% higher level commands now implement the coloring operations. % \begin{macrocode} vardef interior expr c = - save v; picture v; v := nullpicture; + newpicture (v); addto v contour (c.t_); -%<MF> cull v dropping (0, 0); +%<MF> cull v dropping (0,0); v enddef; + % \end{macrocode} % % \DescribeRoutine{interiors} @@ -2081,7 +2626,7 @@ enddef; % place to put the \mfc{for}-loop and not use this at all. % \begin{macrocode} vardef interiors suffix cc = - save _ints; picture _ints; _ints := nullpicture; + newpicture (_ints); for _idx = 1 upto cc: addto _ints also interior cc[_idx]); endfor @@ -2108,16 +2653,18 @@ enddef; % \gbc{DoClip} command. % \begin{macrocode} def clipto (suffix vt) expr c = + if path c: %<MF> andto (vt, interior c); %<MP> clip vt to c; + fi enddef; def clipsto (suffix vt, cc) = %<MF> andto (vt, interiors cc); %<*MP> begingroup - save _cl, _cl_; picture _cl, _cl_; _cl_ := nullpicture; + save _cl, _cl_; picture _cl, _cl_; _cl_ := nullpicture; for _idx = 1 upto cc: - _cl := vt; clip _cl to cc[_idx]; addto _cl_ also _cl; + _cl := vt; clip _cl to cc[_idx]; addto _cl_ also _cl; endfor vt := _cl_; endgroup @@ -2129,20 +2676,15 @@ enddef; % \DescribeRoutine{Clipped} % Here, rather than modify a given picture, \gbc{Clipped} is a vardef % returning the picture which is the result of clipping the given picture -% to the path. +% to the path. This is not used elsewhere in \grafbase{} nor \mfpic. % % Having found out that \mfc{clipped} is a \MP{} primitive, I've -% changed the name to the uppercase version, but keep the lowercase -% version for now (backward compatibility). We save the primitive -% meaning in \gbc{clipped_}. We also define \gbc{clip} in \MF{} for -% backward compatibility. +% changed the name to the uppercase version. % \begin{macrocode} vardef Clipped (suffix vt) expr c = - save _Cl; picture _Cl; _Cl := vt; clipto (_Cl) c; _Cl + setpicture (_Cl) vt; clipto (_Cl) c; _Cl enddef; -%<MP>let clipped_ = clipped; -def clipped = Clipped enddef; -%<MF>def clip = Clipped enddef; +%<MF>def clip = Clipped enddef; % \end{macrocode} % @@ -2151,21 +2693,23 @@ def clipped = Clipped enddef; % name and a closed path, and returns the part of the picture inside the % path, but with pixels reversed. In \MP{} we can only approximate this: % we clip the given picture and add that (using color \gbc{background}) -% on top of the \gbc{interior} of the curve. This is not used elsewhere -% in \file{grafbase.mp} so it is not really important if \gbc{fillcolor} -% or \mfc{black} is the right choice. +% on top of the \gbc{interior} of the curve colored \gbc{fillcolor}. This +% is not used elsewhere in \file{grafbase.mp} so it may not be really +% important whether \gbc{fillcolor} and \mfc{background} are the right +% choices. % \begin{macrocode} vardef picneg (suffix vt) expr c = %<*MF> - mono (vt); - (interior c) picsub vt + setpicture (_pn) interior c; + _subto (_pn, vt); %</MF> %<*MP> - save _pn; picture _pn; _pn := nullpicture; - addto _pn (interior c) _wc_ fillcolor; - addto _pn also (Clipped (vt) c) _wc_ background; - _pn + setpicture (_cl) vt; clip _cl to c; + newpicture (_pn); + addto _pn also (interior c ) _wc_ fillcolor; + addto _pn also _cl _wc_ background; %</MP> + _pn enddef; % \end{macrocode} @@ -2194,8 +2738,8 @@ numeric minpenwd; %<MF>minpenwd := 1; % 1 pixel %<MP>minpenwd := .05bp; % 1 pixel at 1440dpi vardef picpath expr d = - save v; picture v; v := nullpicture; - if penwd >= minpenwd : + newpicture (v); + if penwd >= minpenwd: shpath (v, drawpen) (d); %<MF> mono (v); fi @@ -2215,7 +2759,7 @@ enddef; def picdot (suffix v) (expr w, p) = addto v also %<MP> (w shifted p); -%<MF> (w shifted hroundpair (p.t_)); +%<MF> (w shifted goodpair (p)); enddef; % \end{macrocode} @@ -2229,15 +2773,16 @@ enddef; % \gbc{minpenwd} is 1). This usually assures that something is drawn. In % \MP, \gbc{minpenwd} has the same purpose (though it is probably not % necessary). This routine is used a number of times where dots are -% needed. Not in \gbc{shaded} (just below) but later in \gbc{shade}, an -% older command taking paths in graph coordinates. +% needed. Not in \gbc{shaded} (just below) but later in \gbc{shade} (an +% older command taking paths in graph coordinates), \gbc{polkadot} and +% some grid-making commands. % \begin{macrocode} vardef setdot (expr apath, sc) = - if cycle apath : interior - else : picpath + if cycle apath: interior + else: picpath fi -%<MF> (apath scaled emax(ceiling (sc), minpenwd)) -%<MP> (apath scaled emax(sc, minpenwd)) +%<MF> (apath scaled emax (ceiling (sc), minpenwd)) +%<MP> (apath scaled emax (sc, minpenwd)) enddef; % \end{macrocode} @@ -2254,12 +2799,18 @@ enddef; % (8 pixels at 360dpi) square. % % As a compromise (symmetric dots look better, but rectangular dots give -% more gray levels) we allow dots to be $k\times (k+1)$-pixels (assuming -% the aspect ratio is 1) rectangles. This produces twice the number of +% more gray levels) we allow dots to be rectangles $k\times (k+1)$-pixels +% (assuming the aspect ratio is 1). This produces twice the number of % gray levels. In my 360dpi example we get 15 gray levels. The two % farthest apart (4 by 4 dots versus 3 by 4 dots) differ by 1/8 in % fraction of area of coverage (which we equate to grayness). % +% Why can't we have 64 grey levels in a $8\times 8$ square? Clearly we +% can in principle turn on any number of the 64 pixels. Unfortunately, +% spread out patterns (which look best) tend to consume memory, while +% clumpy patterns are hard to make good-looking. Compensating for aspect +% ratios unequal to 1 is also pretty hard to do automatically. +% % The parameter \gbc{dims} needs to be a pair variable, and it will be % assigned the actual dimensions of the picture returned. These routines % are complicated by the fact that we may have an aspect ratio unequal to @@ -2267,39 +2818,48 @@ enddef; % $n\times n$ square with two dots, each nearly $k \times k$ and nearly % square, where $2k^2/n^2$ is the gray level needed. % -% First \gbc{dims} is equated to half the size needed, the dot is created -% (\gbc{_shp}) and then the dot is repeated and \gbc{dims} is doubled. -% Finally, for dark gray (gray levels less than .5) we calculate the shade -% picture for \gbc{1 - greylevel} and subtract it from a black square. +% The calculations assume a gray level greater than $1/2$, so the final +% picture will be mostly white (for darker grays, we use the +% complementary gray level to construct the `reverse video', and then +% reverse back). Under this assumption, we concentrate all the black +% pixels into the lower left and upper right quadrant of the picture we +% are creating, so most of the calculation determines one of these +% quadrants. The scratch variables \gbc{_hp} and \gbc{_vp} give the number +% of horizontal and vertical pixels in the lower left quadrant, +% \gbc{_dotwd} and \gbc{_dotht} do the same for the actual dot. Then +% \gbc{_shp} is first set equal to one dot; then a copy of itself is added +% in the upper right quadrant. Finally, the suffix parameter \gbc{dims} is +% equated to the nominal width and height of the picture, and either +% \gbc{_shp} or its reverse is returned. % \begin{macrocode} %<*MF> -numeric shadepicsize; shadepicsize := 0.8bp; +numeric shadepicsize; shadepicsize := 0.8bp; vardef shadepic (suffix dims) (expr grparam) = pair dims; - save _frac; _frac := 2*emin(grparam, 1 - grparam); + setnumeric (_frac) 2*emin (grparam, 1 - grparam); save _hp, _vp, _dotwd, _dotht; - if aspect_ratio < 1 : - _vp := emax (2, hround(shadepicsize.o_)); + if aspect_ratio < 1: + _vp := emax (2, hround (shadepicsize.o_)); _hp := hround (_vp._o_); _dotwd := hround (_hp*sqrt _frac); - _dotht := if _dotwd = 0 : 0 - else: hround (_hp*_vp*_frac/_dotwd) + _dotht := if _dotwd = 0: 0 + else: hround (_hp*_vp*_frac/_dotwd) fi; else: _hp := emax (2, hround (shadepicsize)); _vp := hround (_hp.o_); _dotht := hround (_vp*sqrt _frac); - _dotwd := if _dotht = 0 : 0 - else: hround (_hp*_vp*_frac/_dotht) + _dotwd := if _dotht = 0: 0 + else: hround (_hp*_vp*_frac/_dotht) fi; fi dims := ( _hp, _vp._o_ ); - save _shp; picture _shp; _shp := nullpicture; - addto _shp contour rect ((0,0), (_dotwd, _dotht)); + newpicture (_shp); + addto _shp contour rect (origin, (_dotwd, _dotht)); picdot (_shp, _shp, dims); - dims := 2dims; mono (_shp); - if grparam >= .5 : _shp - else : (interior (rect ((0,0), dims))) picsub _shp + dims := 2dims; mono (_shp); + if grparam >= .5: _shp + else: (interior (rect (origin, dims))) picsub _shp fi enddef; @@ -2308,78 +2868,83 @@ enddef; % % \DescribeRoutine{shaded} % This fills the interior of a contour (device coordinates) with copies of -% \gbc{shadepic}. The routine \gbc{filledwith} is defined later, but its +% \gbc{shadepic}. The routine \gbc{fillwith} is defined later, but its % name reflects its effect: a bounding rectangle (corners at \gbc{ll} and -% \gbc{ur}) is filled with copies of a picture (\gbc{shpic} in this case), -% the picture having nominal dimensions \gbc{shdims} in this case. +% \gbc{ur}) is filled with copies of a picture (in this case, the result +% of \gbc{shadepic}), the picture having nominal dimensions \gbc{shdims} +% in this case. % % It may seem odd that black and white return the same thing. That is % because white is handled in the calling routine by subtracting the % result. % -% The \gbc{gbbox} command is defined in the next section. The bounding -% rectangle it obtains is only approximate in \MF{}, but that is -% sufficient, since we only use it to produce things that are eventually -% clipped. +% The \gbc{setbbox} command was defined earlier, in +% section~\ref{utilities}. The bounding rectangle it obtains is only +% approximate in \MF{}, but that is sufficient, since we only use it to +% produce things that are eventually clipped. % -% I am not sure why we return \gbc{picpath} for non-cycles, but I think -% I once thought to make \gbc{shaded} a replacement for setdot to get gray -% dots (in the \gbc{polkadot} routine). +% We return \gbc{picpath} for non-cycles because I once thought to make +% \gbc{shaded} a replacement for \gbc{setdot} to get gray dots (in the +% \gbc{polkadot} routine). That turns out not to work, but this sort of +% thing is also done in most of the rendering commands that require a +% closed path. % \begin{macrocode} vardef shaded (expr clr) expr c = - if cycle c : + if cycle c: %<*MP> - save v; picture v; - v := nullpicture; + newpicture (v); addto v contour c _wc_ clr; v %</MP> %<*MF> - if (clr <= black) or (clr >= white) : + if (clr <= black) or (clr >= white): interior c else: - save vsh, shpic, shdims, ll, ur; - picture vsh, shpic; pair shdims, ll, ur; + save shdims, shpic; + picture shpic; pair shdims; shpic := shadepic (shdims) (clr); - gbbox (c, ll, ur); - vsh := filledwith (shpic) (shdims, ll, ur); - Clipped (vsh) c + setbbox (ll, ur) c; + newpicture (vsh); + fillwith (vsh) (shpic, shdims, ll, ur); + clipto (vsh) c; vsh fi %</MF> - else: picpath c % should we? or just make it null? + else: picpath c % should we? or just make it null? fi enddef; % \end{macrocode} % -% \DescribeRoutine{filledwith} +% \DescribeRoutine{fillwith} % This is one of the ways we obtain something other than a solid fill. The % routines \gbc{polkadot}, \gbc{tess} and (in \MF) \gbc{shade} and % \gbc{shaded} all use it. % -% It takes a picture expression, along with its dimensions (the pair -% \gbc{dims}) in device coordinates, plus the opposite corners, \gbc{ll} -% and \gbc{ur}, of a boundingbox rectangle, and returns the picture which -% is that rectangle filled with copies of the picture. +% It takes a picture expression \gbc{pic}, along with its dimensions (the +% pair \gbc{dims}) in device coordinates, plus the opposite corners, +% \gbc{ll} and \gbc{ur}, of a boundingbox rectangle, and draws that +% rectangle filled with copies of \gbc{pic}. Starting with \mfpic{} +% version 0.8, it adds to a predefined picture passed by name. Thus the +% calling routine must make sure that picture is initialized (it need +% not be \mfc{nullpicture}). % % One might do this with two nested loops, but it turns out to be much -% (much!) faster to do two separate loops: the second one stacking the row -% built by the first loop. +% faster (surprisingly much!) to do two separate loops: the second one +% stacking copies of the row built by the first loop. % % We try to do any rounding that might have been forgotten. This code % takes a mode's aspect ratio into account so that (most) calling routines % don't have to. (That is, \gbc{dims} should be measured in horizontal -% pixels, while \gbc{fwdims} is in actual pixels. I would have written -% this in terms of \gbc{picdot}, which already handles aspect, but it -% has got to be more efficient to do the aspect ratio calculations -% once rather than every time through the loop.) -% \begin{macrocode} -vardef filledwith (expr pic, dims, ll, ur) = - save b, v; picture b, v; - b := v := nullpicture; +% pixels, while \gbc{fwdims} is in actual pixels. This could have been +% written in terms of \gbc{picdot}, which already handles aspect, but it +% has got to be more efficient to do the aspect ratio calculations once +% rather than every time through the loop.) +% \begin{macrocode} +vardef fillwith (suffix v) (expr pic, dims, ll, ur) = + newpicture (b); %<*MF> - save fwdims, _ll, _ur; pair fwdims, _ll, _ur; - fwdims := hroundpair (dims.t_); + save fwdims, _ll, _ur; pair fwdims, _ll, _ur; + fwdims := goodpair (dims); _ll := floorpair (ll.t_); _ur := ur.t_; for s = xpart _ll step xpart fwdims until xpart _ur: @@ -2398,7 +2963,6 @@ vardef filledwith (expr pic, dims, ll, ur) = addto v also b shifted (0, s); endfor %</MP> - v enddef; % \end{macrocode} @@ -2428,80 +2992,84 @@ enddef; % misaligned hatch lines. (I guess that's the reason; this algorithm % predates me.) % \begin{macrocode} -vardef thatchf (suffix v) (expr CT, sp, a, b) = - save _sp; - _sp = signof (ypart(b - a)) abs(sp); - for _y = _sp*( ceiling ((ypart a)/_sp) ) step _sp until ypart b: - shpath (v, hatchpen) - ( ( (xpart a, _y)--(xpart b, _y) ) transformed CT ); - endfor -%<MF> mono(v); +def thatchf (suffix v) (expr CT, sp, a, b) = + begingroup + setnumeric (_sp) signof (ypart b - ypart a) abs(sp); + for _y = _sp*( ceiling ((ypart a)/_sp) ) step _sp until ypart b: + shpath (v, hatchpen) + ( ( (xpart a, _y)--(xpart b, _y) ) transformed CT ); + endfor +%<MF> mono (v); + endgroup enddef; % \end{macrocode} % % \subsection{Tiles}\label{tiles} % -% Tesselations are a generalization type of fill in which a rectangular -% pattern is repeated throughout a region. The rectangular pattern is -% called a tile. We provide here an environment in which the drawing commands -% add to a picture variable other than \mfc{currentpicture}. We do this -% very simply by redefining \gbc{active_plane}, localizing the -% redefinition between \gbc{tile} and \gbc{endtile} +% Tesselations are a type of fill in which a rectangular pattern is +% repeated throughout a region. The repeated rectangle is called a tile. +% We provide here an environment in which the drawing commands add to a +% picture variable other than \mfc{currentpicture}. We do this very simply +% by redefining \gbc{active_plane}, localizing the redefinition between +% \gbc{tile} and \gbc{endtile} % % \DescribeRoutine{tile} -% \DescribeRoutine{endtile} -% \gbc{tile} accepts one suffix parameter, the name of the tile, followed -% by three numeric expressions and a boolean. \gbc{unit} should be a -% dimension in device units and is the unit of length for all high level -% drawing commands within the environment. \gbc{height} and \gbc{width} -% specify the size of the tile in multiples of \gbc{unit}, and +% The macro \gbc{tile} accepts one suffix parameter, the name of the tile, +% followed by three numeric expressions and a boolean. \gbc{unit} should +% be a dimension in device units and is the unit of length for all high +% level drawing commands within the environment. \gbc{width} and +% \gbc{height} specify the size of the tile in multiples of \gbc{unit}, and % \gbc{clipit} is a boolean that determines if the resulting picture is % clipped to the rectangle these parameters determine. For example,\\ % \indent \gbc{tile (fred)(1in, 1, 2, true)} \\ % starts a tile named \gbc{fred} which will be 1 inch wide and 2 inches % tall, and any marks that extend beyond this rectangle are clipped off. +% The tile is enclosed in a group to delimit these changes to the basic +% drawing parameters. \DescribeRoutine{endtile}\gbc{endtile} merely +% implements the clipping and then closes the group. % % In \MF, the picture should be a whole number of pixels in size, so that % the tiles fit perfectly together. The fact that shifts must be integer % values is only mildly relevant, because the placement code does the % rounding. % -% For tesselation (filling with tiles), we need to know various properties -% of the tile so, in fact, a tile is a composite object consisting of a -% picture, \gbc{fred.pic} in our example (the actual tile), two numerics -% \gbc{fred.wd} and \gbc{fred.ht} (the device dimensions) and a boolean -% \gbc{fred.clipon}. +% For tesselation (filling with tiles) we need to know various properties +% of the tile, so a tile is a composite object consisting of a picture, +% \gbc{fred.pic} in our example (the actual tile) and a pair +% \gbc{fred.dims} of the dimensions (in device units). We used to +% save the \gbc{clipit} parameter in \gbc{atile.clipon}, but it was never +% used. We also used to have separate numerics \gbc{atile.wd} and +% \gbc{atile.ht} but they only got used together as a pair. % \begin{macrocode} def tile (suffix atile) (expr unit, width, height, clipit) = - picture atile.pic; atile.pic := nullpicture; - numeric atile.wd, atile.ht; -%<MF> (atile.wd, atile.ht) = round ((width, height)*unit); -%<MP> (atile.wd, atile.ht) = (width, height)*unit; - boolean atile.clipon; atile.clipon := clipit; + picture atile.pic; atile.pic := nullpicture; + pair atile.dims; +%<MF> atile.dims := round ((width, height)*unit); +%<MP> atile.dims := (width, height)*unit; begingroup % \end{macrocode} -% We simply do a subset of what we do in \gbc{beginmfpic}, redefining +% We do a subset of what we do in \gbc{beginmfpic}, redefining % \gbc{active_plane} so that all drawing commands that add to it will -% contribute to the tile. +% contribute to the tile, and adapting \gbc{ztr} to the tile dimensions. +% Re also redefine \gbc{xneg}, et al., for the benefit of \gbc{levelset}. % \begin{macrocode} -% save active_plane; save active_plane; - def active_plane = atile.pic enddef; - save ztr, vtr; transform ztr, vtr; - ztr := identity scaled unit; vtr := ztr; -% \end{macrocode} -% And if clipit is true we set the \gbc{ClipPath} to the bounding -% rectangle so that all commands that respect \gbc{ClipOn} will draw only -% inside the tile. And in case some don't, \gbc{endtile} clips it all -% anyway. -% \begin{macrocode} - save ClipOn; boolean ClipOn; - if clipit : + def active_plane = atile.pic enddef; + save ztr, vtr; transform ztr, vtr; + ztr := identity scaled unit; vtr := ztr; + save xneg, xpos, yneg, ypos; + xneg := 0; xpos := width; yneg := 0; ypos := height; +% \end{macrocode} +% To implement \gbc{clipit}, we set the current clipping path array +% \gbc{ClipPath[\,]} to the boundary of the tile. Note that this turns off +% user-defined clipping paths, which are unlikely to be correct for the +% local tile coordinates. +% \begin{macrocode} + save ClipOn; boolean ClipOn; + if clipit: ClipOn := true; - save ClipPath; path ClipPath[]; - ClipPath = 1; - ClipPath[1] = rect(origin, (atile.wd, atile.ht)); + setarray (path) (ClipPath) (rect(origin, atile.dims)); else: ClipOn := false; fi @@ -2514,37 +3082,94 @@ enddef; % \end{macrocode} % % \DescribeRoutine{is_tile} -% To test whether \gbc{atile} is really a tile, just see if all the +% To test whether \gbc{atile} is really a tile, just see if the needed % components are defined and of the correct type. % \begin{macrocode} vardef is_tile (suffix atile) = - (known atile.pic ) and (picture atile.pic ) and - (known atile.wd ) and (numeric atile.wd ) and - (known atile.ht ) and (numeric atile.ht ) and - (known atile.clipon) and (boolean atile.clipon) + (known atile.pic ) and (picture atile.pic) and + (known atile.dims) and (pair atile.dims ) enddef; % \end{macrocode} % -% \section{Bounding boxes of paths}\label{bboxes} +% \section{Bounding Boxes of Paths}\label{bboxes} % % To fill a region with other than a solid fill, we normally fill a % rectangle with copies of a picture (or a path) and then clip to the % boundary curve. In order not to place too many copies, we try to find a % rectangle that is not too much larger than that region. For this we have -% the macro \gbc{gbbox} which takes a path expression and two pair -% variables, and sets the pairs to the lower left corner and upper right -% corner, respectively, of a rectangle enclosing the path. In \MF, this -% finds a rather loose box, the smallest rectangle containing all the -% control points and all the nodes of the path. Or rather it used to do -% that. Now we break the path into twice as many nodes and use the control -% points relative to that, which gives a tighter box. Both algorithms make -% use of the fact that the convex hull of the points and controls for a -% path segment contains the segment. -% -% The bounding box macros are used on paths in device coordinates, but -% there is no intrinsic reason that has to be so: they will return the -% bounding box in whatever coordinates the supplied path is in. +% the macro \gbc{getbbox} which takes two pair variable and a path +% expression, and sets the pairs to the lower left corner and upper right +% corner, respectively, of a rectangle enclosing the path. The bounding +% box macros are used on paths in device coordinates, but there is no +% intrinsic reason that has to be so: they will return the bounding box in +% whatever coordinates the supplied path is in. +% +% \DescribeRoutine{getbbox} +% One can get a rather loose bounding rectangle by using the fact that +% each segment of a path (from \mfc{point j of g} to \mfc{point j+1 of g}) +% is contained in the convex set determined by all 4 control points for +% that segment. So we get a containing rectangle by getting the smallest +% and largest values of the $x$- and $y$-coordinates of all those points. +% We can get a considerably tighter fit if we cut each segment in half +% (or more) before doing that. A calling routine is expected to save and +% declare the suffixes \gbc{ll} and \gbc{ur}. Within \grafbase{} commands, +% \gbc{getbbox} is always called by \gbc{setbbox}, which does this. +% +% \DescribeRoutine{ctrlsbbox} +% There is a difference between ``\mfc{postcontrol 0 of (subpath (j,j+1/2) +% of p)}'' and ``\mfc{postcontrol j of p}''. To gain the tighter box we have +% to look at the former. \gbc{ctrlsbbox} just updates the previously found +% corners \gbc{ll} and \gbc{ur} of the bounding box based on the controls +% of the path segment \gbc{p}, and the calling routine \gbc{getbbox} passes +% it half a segment at a time. We don't examine the endpoints of +% the half-segment: one has already been examined by \gbc{getbbox} and +% the other (a subdivision point of an original segment) lies on the line +% segment connecting two control points, and so can't increase the bbox. +% +% We've given this potentially unlimited accuracy by allowing the number +% of subdivisions (\gbc{bbox_split}) to be arbitrary. We choose 2 for the +% default. The \gbc{setsplit} command (subsection~\ref{utilities}) ensures +% that \gbc{_s} is integral and positive, just in case \gbc{bbox_split} +% somehow isn't. +% +% This description applies only to \MF, because \MP{} has built-in +% facilities for determining the bounding box. +% +% \RoutineIndex{pnt} +% \RoutineIndex{pre} +% \RoutineIndex{post} +% I got tired of typing long expressions like ``\gbc{(precontrol length +% p of p)}'', and now use the following abbreviations. +% \begin{macrocode} +vardef pnt@# (expr p) = point @# of p enddef; +vardef pre@# (expr p) = precontrol @# of p enddef; +vardef post@# (expr p) = postcontrol @# of p enddef; + +def getbbox (suffix ll, ur) expr g = +%<MP> ll := llcorner g; ur := urcorner g; +%<*MF> + setsplit (_s) bbox_split; + ur := ll := pnt 0 (g); + for _j = 1 upto length g: + ll := pairmin (ll, pnt[_j] (g)); ur := pairmax (ur, pnt[_j] (g)); + endfor + for _j = 1 upto _s*(length g): + ctrlsbbox (subpath ((_j-1)/_s, _j/_s) of g) (ll, ur); + endfor +%</MF> + if showbbox: noclip ( safedraw rect (ll, ur) ); fi +enddef; + +%<*MF> +numeric bbox_split; bbox_split := 2; +def ctrlsbbox (expr p) (suffix ll, ur) = + ll := pairmin ( pairmin (ll, post0 (p)), pre 1 (p) ); + ur := pairmax ( pairmax (ur, post0 (p)), pre 1 (p) ); +enddef; + +%</MF> +% \end{macrocode} % % We also have \gbc{tightbbox} and \gbc{tbbox} in \MF{} but these are no % longer used so we'll omit them from \grafbase, but keep them in the @@ -2554,124 +3179,62 @@ enddef; % Calculate tight bounding box points \gbc{ll} and \gbc{ur} for path % \gbc{g}. The tight bounding box is accurate to the limits of the % \mfc{solve} macro, which is the numeric \mfc{tolerance}, which we set to -% \mfc{.5} (pixel). This is only called by \gbc{tbbox}, which is never -% used. +% \mfc{.5} (accurate enough, assuming pixel units). This is only called by +% \gbc{tbbox}, which is never used. % % \DescribeRoutine{xlimit} -% \DescribeRoutine{ylimit} % \gbc{xlimit(x)} returns a value of true if the path \gbc{g} doesn't -% cross the vertical line at \gbc{x}. \gbc{ylimit(y)} is the same for -% the horizontal line at \gbc{y}. +% cross the vertical line at \gbc{x}. +% \DescribeRoutine{ylimit}\gbc{ylimit(y)} is the same for the horizontal +% line at \gbc{y}. % \begin{macrocode} %<*unused> -vardef tightbbox (expr g) (suffix ll, ur) = - % true iff horizontal at y does not intersect g: - vardef xlimit (expr x) = - (((x, -infinity)--(x, infinity)) intersectiontimes g) < origin - enddef; - % true iff vertical at x does not intersect g: - vardef ylimit (expr y) = - (((-infinity, y)--(infinity, y)) intersectiontimes g) < origin - enddef; +def tightbbox (expr g) (suffix ll, ur) = +begingroup interim tolerance := .5; - ll := ( (solve xlimit (-infinity, xpart pnt 0 (g))), - (solve ylimit (-infinity, ypart pnt 0 (g))) ); - ur := ( (solve xlimit ( infinity, xpart pnt 0 (g))), - (solve ylimit ( infinity, ypart pnt 0 (g))) ); - if showbbox : + ll := ( (solve _xlimit (-infinity, xpart pnt 0 (g))), + (solve _ylimit (-infinity, ypart pnt 0 (g))) ); + ur := ( (solve _xlimit ( infinity, xpart pnt 0 (g))), + (solve _ylimit ( infinity, ypart pnt 0 (g))) ); +endgroup + if showbbox: noclip ( safedraw rect (ll, ur) ); fi enddef; +vardef _xlimit (expr x) = + ((x, -infinity)--(x, infinity)) misses g +enddef; + +vardef _ylimit (expr y) = + ((-infinity, y)--(infinity, y)) misses g +enddef; + % \end{macrocode} % % \DescribeRoutine{tbbox} % \gbc{tbbox} simply calls \gbc{tightbbox} on each of an array of paths % and takes the maximum of all the upper right corners and the minimum of -% all the lowerleft. Same syntax as \gbc{tightbbox} except that, instead +% all the lower left. Same syntax as \gbc{tightbbox} except that, instead % of a path parameter, \gbc{g} must be the name of an array of paths. -% -% This macro is never used elsewhere in \grafbase. Changed recently to -% use the new \gbc{pairmin} and \gbc{pairmax} macros. This avoids two -% \mfc{for} loops (which seem to be something of a \MF{} bottleneck). +% This macro is never used elsewhere in \grafbase. % \begin{macrocode} vardef tbbox (suffix g) (suffix ll, ur) = - save _gll, _gur; pair _gll, _gur; + save _gll, _gur; pair _gll, _gur; tightbbox (g1, ll, ur); for _idx = 2 upto g: tightbbox (g[_idx], _gll, _gur); - ll := pairmin(ll, _gll); ur := pairmax(ll, _gur); + ll := pairmin (ll, _gll); ur := pairmax (ll, _gur); endfor - if showbbox : noclip ( safedraw rect (ll, ur) ); fi -enddef; -%</unused> -% \end{macrocode} -% -% \DescribeRoutine{gbbox} -% One can get a rather loose bounding rectangle by using the fact that -% each segment of a path (from \mfc{point j of g} to \mfc{point j+1 of g}) -% is contained in the convex set determined by all 4 control points for -% that segment. So we get a containing rectangle by getting the smallest -% and largest values of the x- and y-coordinates of all those points. We -% can get a considerably tighter fit if we cut each segment in half. -% -% \DescribeRoutine{ctrlsbbox} -% There is a difference between `\mfc{postcontrol j of (subpath (j,j+1/2) -% of p)}' and `\mfc{postcontrol j of p}'. To gain the tighter box we have -% to look at the former. \gbc{ctrlsbbox} just updates the previously found -% corners \gbc{ll} and \gbc{ur} of the bounding box based on the controls -% of the path segment \gbc{p}, and the calling routine \gbc{gbbox} passes -% it half a segment at a time. We don't actually examine both endpoints of -% the half-segment, only those that are nodes of the original path. The -% reason is that the subdivision points are already on the line segment -% connecting the controls of the subpaths on either side. We've given this -% potentially unlimited accuracy by allowing the number of subdivisions -% (\gbc{bbox_split}) to be arbitrary. We choose 2 for the default. -% -% This description applies only to \MF, because \MP{} has primitive -% facilities for determining the bounding box. -% -% \DescribeRoutine{pnt} -% \DescribeRoutine{pre} -% \DescribeRoutine{post} -% I got tired of typing long expressions like `\gbc{precontrol length p of p}', -% and now use the abbreviation `\gbc{pre[length p](p)}'. -% \begin{macrocode} -vardef pnt@# (expr p) = point @# of p enddef; -vardef pre@# (expr p) = precontrol @# of p enddef; -vardef post@# (expr p) = postcontrol @# of p enddef; - -vardef gbbox (expr g) (suffix ll, ur) = -%<MP> ll := llcorner g; ur := urcorner g; -%<*MF> - save _s; _s := emax(1, ceiling bbox_split); - ur := ll := pnt 0 (g); - if (length g) > 0 : - for _j = 1 upto length g: - ll := pairmin(ll, pnt[_j] (g)); ur := pairmax(ur, pnt[_j] (g)); - endfor - for _j = 1 upto _s*(length g): - ctrlsbbox (subpath ((_j-1)/_s, _j/_s) of g) (ll, ur); - endfor - fi -%</MF> - if showbbox : noclip ( safedraw rect (ll, ur) ); fi -enddef; - -%<*MF> -numeric bbox_split; bbox_split := 2; -def ctrlsbbox (expr p) (suffix ll, ur) = - ll := pairmin (ll, post0 (p)); ll := pairmin (ll, pre 1 (p)); - ur := pairmax (ur, post0 (p)); ur := pairmax (ur, pre 1 (p)); + if showbbox: noclip ( safedraw rect (ll, ur) ); fi enddef; -%</MF> +%</unused> % \end{macrocode} % -% \section{Device coordinate rendering -% commands}\label{basicrendering} +% \section{Device Coordinate Rendering Commands}\label{basicrendering} % -% We use the word rendering to refer to commands that accept a path +% We use the word `rendering' to refer to commands that accept a path % expression as one parameter and use it to modify the \gbc{active_plane}. % All the commands in this section expect paths, pairs and dimensions in % device coordinates. @@ -2682,75 +3245,81 @@ enddef; % \gbc{safedraw} accepts a path expression, and adds the result to % \gbc{active_plane}. It is the first drawing command to draw % exclusively on \gbc{active_plane}. This is the first of many uses of -% \gbc{coloraddto}. In \MP{} it is basically the primitive \mfc{addto -% ... also ... withcolor ...}, but in \MF{} it adds when the color is less -% than 1 (gray or black), otherwise it subtracts (white). -% -% \DescribeRoutine{colorsafedraw} -% \gbc{safedraw} merely calls colorsafedraw, which calls \gbc{picpath}, -% which calls \gbc{shpath}. One reason for this roundabout path -% is to support older files (\gbc{colorsafedraw} not defined). Another -% is that color handling in \MF{} requires a picture with pixels of -% weight 1 or 0 only (\gbc{picpath}). Moreover, \gbc{shpath} guarantees -% that the mode's aspect ratio is respected. -% \begin{macrocode} -def safedraw = colorsafedraw (drawcolor) enddef; -vardef colorsafedraw (expr clr) expr d = - save v; picture v; v := picpath d; - DoClip (v); - coloraddto (clr) (active_plane, v); +% \gbc{coloraddon}. In \MP{} it is basically the primitives \mfc{addto} +% and \mfc{withcolor} applied to \gbc{active_plane}, but in \MF{} it adds +% when the color is less than 1 (gray or black), otherwise it subtracts +% (white). +% +% \RoutineIndex{colorsafedraw} +% The command \gbc{safedraw} merely calls \gbc{colorsafedraw}, which then +% calls \gbc{picpath}, which calls \gbc{shpath}. One reason for this +% roundabout sequence is to support older files (where \gbc{colorsafedraw} +% was not defined). Another is that color handling in \MF{} requires a +% picture with pixels of weight 1 or 0 only (\gbc{picpath}). Moreover, +% \gbc{shpath} guarantees that the mode's aspect ratio is respected. +% \begin{macrocode} +def safedraw = colorsafedraw (drawcolor) enddef; +def colorsafedraw (expr clr) expr d = + begingroup + setpicture (v) picpath d; + DoClip (v); coloraddon (clr, v); + endgroup enddef; % \end{macrocode} % % \subsection{Filling}\label{basicfilling} % -% \DescribeRoutine{NoCycleWarn} +% \DescribeRoutine{NoCycle} % This is a common warning for all those commands that require a cycle -% (closed) path but an open path is supplied. In addition to the warning +% (closed path) but an open path is supplied. In addition to the warning % in those commands, we also call \gbc{safedraw} for debugging purposes. -% We make no attempt to color the path, but maybe we should. % -% \DescribeRoutine{safefill} -% \DescribeRoutine{colorsafefill} -% \DescribeRoutine{safeunfill} -% These three take one parameter that is a path expression, and -% \gbc{colorsafefill} takes another that is a color. These commands fill -% (or unfill) it in the \gbc{active_plane}. In \MF, when the color is -% strictly between $0$ and 1, a gray fill is simulated with the -% \gbc{shaded} macro. +% \DescribeRoutine{safefill}\RoutineIndex{colorsafefill} +% The basic \gbc{safefill} simply calls the colored version with the +% default parameter \gbc{fillcolor}. \gbc{colorsafefill} takes a color as +% its first parameter and a path expression as second. These commands fill +% the path in the \gbc{active_plane}. In \MF, when the color is strictly +% between $0$ and 1, a gray fill is simulated with the \gbc{shaded} macro. % % To simulate the effect of painting over in gray, the \MF{} version % clears the region before adding the shaded fill. % +% \DescribeRoutine{safeunfill} % \gbc{safeunfill} is just \gbc{safefill} with the color \mfc{background}. % In \MF{}, when \gbc{background = white = 1}, this is detected by -% \gbc{coloraddto} which then subtracts the picture. +% \gbc{coloraddon} which then subtracts the picture. We do this inside +% \gbc{noclip}, just because it seems a user would expect clipping only +% when things are \emph{added}. In \MP{} the white is indeed added, but +% conceptually, material is cleared away. % \begin{macrocode} -def NoCycleWarn expr s = - GBmsg s & " cannot be applied to an open path. " - & "The path will be drawn instead."; +def NoCycle (expr s) expr p = + GBwarn s & " cannot be applied to an open path." + & " The path will be drawn instead."; + safedraw p; enddef; -def safefill = colorsafefill (fillcolor) enddef; +%<MF>vardef isgray (expr X) = (X > black) and (X < white) enddef; +%<MF> +def safefill = colorsafefill (fillcolor) enddef; vardef colorsafefill (expr clr) expr c = - if cycle c : - save v; picture v; v := interior c; + if cycle c: + setpicture (v) interior c; DoClip (v); %<*MF> - if (clr > black) and (clr < white) : - subto (active_plane) (v); + if isgray (clr): + _subto (active_plane) (v); v := nullpicture; v := shaded (clr) c; fi %</MF> - coloraddto (clr) (active_plane, v); - else: NoCycleWarn "fill"; safedraw c; + coloraddon (clr, v); + else: NoCycle("fill") c; fi enddef; def safeunfill expr c = - if cycle c : noclip (colorsafefill (background) c); - else: NoCycleWarn "unfill"; safedraw c; + if cycle c: noclip (colorsafefill (background) c); + else: NoCycle("unfill") c; fi enddef; @@ -2764,14 +3333,14 @@ enddef; % will \gbc{safedraw} non-cyclic paths. % \begin{macrocode} def safeclip expr c = - if cycle c : clipto (active_plane) c; - else: NoCycleWarn "clip"; safedraw c; + if cycle c: clipto (active_plane) c; + else: NoCycle("clip") c; fi enddef; % \end{macrocode} % -% \section{Rendering: the highest level commands}\label{rendering} +% \section{Graph Coordinate Rendering}\label{rendering} % % \DescribeRoutine{store} % Now we come to the highest level rendering operations. These are the @@ -2784,7 +3353,7 @@ enddef; % we provide a command that accepts a path and doesn't pass it on. In % theory, it could do nothing, but in \mfpic{} we store the path in % \gbc{curpath}, making every \mfpic{} figure a path assigment command -% and the rendering is merely a side-effect. +% and the rendering is `merely' a side-effect. % % \DescribeRoutine{stored} % The macro \gbc{stored} performs \gbc{store}, but passes the same path as @@ -2795,56 +3364,194 @@ enddef; % not to hurt. % \begin{macrocode} def store (suffix fs) expr f = -hide( - if (not path f) and (not pair f) : - GBerrmsg ("Second argument to `store' must be a path or pair") - ""; +hide ( + if (not path f) and (not pair f): + GBerrmsg ("improper expression type.") + "The second argument to `store' must be a path or pair."; fi - if not path fs : path fs; fi + if not path fs: path fs; fi fs := f ) enddef; -vardef stored (suffix fs) expr f = store (fs) f; f enddef; +vardef stored (suffix fs) expr f = store (fs) f; f enddef; % \end{macrocode} % % \subsection{Drawing}\label{drawing} % -% \DescribeRoutine{drawn} -% \DescribeRoutine{colordrawn} -% \gbc{drawn} and \gbc{colordrawn} accept a path -% expression \gbc{f} and return the same. In between, \gbc{zconv(f)} is -% subjected to \gbc{colorsafedraw}. +% \DescribeRoutine{drawn}\RoutineIndex{colordrawn} +% The command \gbc{drawn} merely calls \gbc{colordrawn} with the default +% color \gbc{drawcolor}. Then \gbc{colordrawn} takes a color \gbc{clr} +% and a path expression \gbc{f} and returns the same path. In between, +% \gbc{zconv (f)} is subjected to \gbc{colorsafedraw}. % \begin{macrocode} -def drawn = colordrawn (drawcolor) enddef; +def drawn = colordrawn (drawcolor) enddef; vardef colordrawn (expr clr) expr f = - colorsafedraw (clr) (zconv (f)); f + colorsafedraw (clr) (zconv (f)); f +enddef; + +% \end{macrocode} +% +% \DescribeRoutine{colorwiggle} +% This is a multi-tasking command that can draw either zigzag or +% sinewave shapes depending on the boolean first parameter. For \mfc{true} +% we get smooth wiggles, for \mfc{false} we get jagged ones. In the +% smooth case, a tension parameter allows an adjustment to the smoothness. +% The command \DescribeRoutine{zigzag}\RoutineIndex{colorzigzag} +% \gbc{zigzag} calls it with the value \mfc{false} and an arbitrary +% value of the tension; +% \DescribeRoutine{sinewave}\RoutineIndex{colorsinewave}\gbc{sinewave} +% calls it with \mfc{true}, allowing it to pick up the tension parameter. +% All expect a quadruple of dimensions to follow +% +% The reason for using a loop (at the end) that draws the \gbc{sinewave} +% path in pieces, is that all the turning can quickly exceed \MF{}'s limit +% on the autorounding stack. I'd never heard of this stack until I ran +% this without a loop and received the ``capacity exceeded'' message. This +% turns out to be a problem mostly when the ratio of \gbc{len} to +% \gbc{wid} is too small and the `humps' of the sine are more like +% `bulbs'. However it is always a problem with \gbc{corkscrew} (below). +% \begin{macrocode} +def zigzag = colorzigzag (drawcolor) enddef; +def colorzigzag (expr clr) = colorwiggle (false, clr, 0) enddef; +def sinewave = colorsinewave (drawcolor) enddef; +def colorsinewave = colorwiggle (true) enddef; + +vardef colorwiggle (expr smth, clr, tens, blen, elen, len, wid) expr f = + convertpath (g) f; + setuplengtharray (cumlen, totlen, ct) g; + save B; + if cycle f: + B := 0; + else: + B := abs(blen)/_rescale_factor; + totlen := totlen - B - abs(elen)/_rescale_factor; + fi + setnumeric (n) 2*round (totlen/len*_rescale_factor); + if n < 2: + colorsafedraw (clr) g; + else: + save T, U, X, Y, Z, p; + pair U, X, Y, Z; path p; + T := if cycle f: 0 else: gettime (cumlen, ct) (B) fi; + Z := pnt[T] (g); + p :=if not cycle f: (subpath (0,T) of g) + if smth: {curl 0} ..tension tens.. else: -- fi + fi + for i = 1 upto n: + hide( + T := gettime (cumlen, ct) (B+(i/n)*totlen); + X := Z; Z := pnt[T] (g); + Y := .5[X,Z]; U := sgn (Z-X); + ) + (Y + (U zscaled (0, if even i: - fi wid))) + if smth: {U}..tension tens.. else: -- fi + endfor + if cycle f: cycle + else: if smth: {curl 0} fi (subpath (T, length g) of g) + fi; + newpicture (v); +%<MP> shpath (v, drawpen) (p); +%<*MF> + if smth: + save n, k; + n := length p; k = n div 50; + for i = 0 step 50 until 50*(k-1): + shpath (v, drawpen) (subpath (i,i+50) of p); + endfor + shpath (v, drawpen) (subpath (50k,n) of p); + else: shpath (v, drawpen) (p); + fi +%</MF> + DoClip(v); coloraddon (clr, v); + fi + f +enddef; + +% \end{macrocode} +% +% \DescribeRoutine{corkscrew}\RoutineIndex{colorcorkscrew} +% This shares a lot of code with \gbc{zigzag} and \gbc{sinewave}, but +% the middle is considerably different, so it is not really possible to +% make a multipurpose command that can do all three. +% \begin{macrocode} +def corkscrew = colorcorkscrew (drawcolor) enddef; +vardef colorcorkscrew (expr clr, tens, blen, elen, len, wid) expr f = + convertpath (g) f; + setuplengtharray (cumlen, totlen, ct) g; + save B; + if cycle f: + B := 0; + else: + B := abs(blen)/_rescale_factor; + totlen := totlen - B - abs(elen)/_rescale_factor; + fi + setnumeric (n) round (totlen/len*_rescale_factor); + if n < 2: + colorsafedraw (clr) g; + else: + save T, U, X, Y, Z, p; + pair U, X, Y, Z; path p; + T := if cycle f: 0 else: gettime (cumlen, ct) (B) fi; + Z := pnt[T] (g); + p :=if (not cycle f) and (B > 0): (subpath (0,T) of g)-- fi + for i = 1 upto n: + hide( + T := gettime (cumlen, ct) (B+(i/n)*totlen); + X := Z; Z := pnt[T] (g); + Y := .5[X,Z]; U := sgn (Z-X); + ) + (X + (U zscaled (0,-wid))){ U}..tension tens.. + (Y + (U zscaled (0, wid))){-U}..tension tens.. + endfor + if cycle f: cycle + else: + {U}(Z + (U zscaled (0,-wid))) + if elen <> 0: --(subpath(T, length g) of g) fi + fi; + newpicture (v); +%<MP> shpath (v, drawpen) (p); +%<*MF> + save n, k; + n := length p; k = n div 50; + for i = 0 step 50 until 50*(k-1): + shpath (v, drawpen) (subpath (i,i+50) of p); + endfor + shpath (v, drawpen) (subpath (50k,n) of p); +%</MF> + DoClip(v); coloraddon (clr, v); + fi + f enddef; % \end{macrocode} % % \subsection{Filling, unfilling and clipping}\label{filling} % -% \DescribeRoutine{filled} -% \DescribeRoutine{colorfilled} -% \DescribeRoutine{unfilled} -% \DescribeRoutine{Clip} -% These subject \gbc{zconv(f)} to \gbc{colorsafefill}, \gbc{safeunfill} or -% \gbc{safeclip}. The name \gbc{clip} (lowercase) is taken: it is a \MP{} -% primitive and an old \file{grafbase.mf} command we keep for compatibility. +% \DescribeRoutine{filled}\RoutineIndex{colorfilled} +% The command \gbc{filled} calls \gbc{colorfilled} with the default color +% \gbc{fillcolor}. Then \gbc{colorfilled} takes a color \gbc{clr} and a +% path expression \gbc{c}, returning the same path after subjecting +% \gbc{zconv (c)} to \gbc{colorsafefill}. +% \DescribeRoutine{unfilled}\gbc{unfilled} returns the path after running +% \gbc{safeunfill}. % +% \DescribeRoutine{Clip} +% Finally, \gbc{Clip} is similar, running \gbc{safeclip}. The name +% \gbc{clip} (lowercase) is taken: it is a \MP{} primitive. % \begin{macrocode} -def filled = colorfilled (fillcolor) enddef; +def filled = colorfilled (fillcolor) enddef; vardef colorfilled (expr clr) expr c = - colorsafefill (clr) zconv (c); c + colorsafefill (clr) zconv (c); c enddef; -vardef unfilled expr c = safeunfill zconv (c); c enddef; -vardef Clip expr c = safeclip zconv(c); c enddef; +vardef unfilled expr c = safeunfill zconv (c); c enddef; +vardef Clip expr c = safeclip zconv (c); c enddef; % \end{macrocode} % % \subsection{Shading}\label{shading} % +% \DescribeRoutine{shade} % Shading is accomplished differently in \MP{} from \MF; however, many of % the same parameters are used for compatibility (so that \MP{} can be run % on a \file{.mf} created for \grafbase{} by \mfpic). In \MP, shading is @@ -2861,70 +3568,70 @@ vardef Clip expr c = safeclip zconv(c); c enddef; % \gbc{0.5bp} in diameter, spaced (in \mfpic) a default \gbc{1pt} between % centers. % -% \DescribeRoutine{shade} -% This is the old \gbc{shade} macro, filling a contour with small dots. -% The shape and size of the dot used can be selected by defining -% \gbc{shadedotpath} and \gbc{shadewd}. -% -% A closed path representing the boundary of one dot of unit size, -% \gbc{shadedotpath} is initialized to a circle. +% The shape and size of the dots can be selected by defining +% \gbc{shadedotpath} and \gbc{shadewd}. A closed path representing the +% boundary of one dot of unit size, \gbc{shadedotpath} is initialized to a +% circle. % % The parameter \gbc{sp} is the distance between the centers of the dots in % device coordinates, and \gbc{f} is the path to be filled in \emph{graph % coordinates}. % % As usual, if the path is not closed, we draw the curve instead. If the -% spacing is too small relative to \gbc{shadewd}, we fill the curve. Otherwise the \gbc{filledwith} macro is used to fill with copies of -% a dot picture. For speed, it actually fills with a two-dot picture. +% spacing is too small relative to \gbc{shadewd}, we fill the curve. +% Otherwise the \gbc{fillwith} macro is used to fill with copies of +% a dot picture. % \begin{macrocode} -numeric shadewd; shadewd := 0.5bp; +numeric shadewd; shadewd := 0.5bp; path shadedotpath; -shadedotpath := fullcircle; % unitsquare; +shadedotpath := fullcircle; vardef shade (expr sp) expr f = - save g; path g; g := zconv (f); + convertpath (g) f; % \end{macrocode} % It seems clear that the gray level (\gbc{gr}) should depend % quadratically on \gbc{shadewd/sp}. Also, there is a point where the % result is essentially black and a fill would be more efficient. % The value .88 is arrived at empirically and is a compromise so that -% \MF{} and \MP{} produce similar levels of gray on both printers available -% to me. Theoretically, no white will appear when -% \gbc{sqrt(2)*shadewd/sp >= 1} -% \begin{macrocode} - save gr; numeric gr; - gr := 1 - (.88*abs(shadewd)/sp)**2; - if not cycle g : NoCycleWarn "shade"; safedraw g; - elseif gr <= 0 : safefill g; +% \MF{} and \MP{} produce similar levels of gray on both printers +% available to me. +% \begin{macrocode} + setnumeric (gr) 1 - (.88*abs(shadewd)/sp)**2; + if not cycle g: NoCycle("shade") g; + elseif gr <= 0: safefill g; else: %<*MF> - save ll, ur; pair ll, ur; - gbbox (g, ll, ur); + setbbox (ll, ur) g; ll := floorpair (ll); % \end{macrocode} % % What we do is draw a row of dots and stack the rows to fill a rectangle. -% We call \gbc{filledwith} to draw these copies. To save a little memory -% we do this twice with half the dots each time. The second set -% interleaves the first and is staggered from the first by half the -% horizontal spacing. I wonder which which uses less memory, rendering -% \gbc{v} unknown with \mfc{picture v}, or null with \mfc{v := nullpicture}? +% We call \gbc{fillwith} to draw these copies. We have to produce this +% on a picture separate from \gbc{active_plane} so we can apply +% \gbc{DoClip}. Adding one complex picture onto another means there is a +% time at which the added picture and the result are in memory at the same +% time. To save a little memory (at the cost of a little speed), we +% divide the picture into two, each with half the complexity. We add the +% one, then (I hope) recover the memory by equating it to \mfc{nullpicture} +% before adding the second. % % Shifts of pictures need to be by integer number of pixels, but this is -% ensured by \gbc{filledwith}, using \mfc{ceiling} to define \gbc{dx} is +% ensured by \gbc{fillwith}, using \mfc{ceiling} to define \gbc{dv} is % more to ensure it is not rounded down to 0. % \begin{macrocode} - save sh, v; picture sh, v; - save dx; dx := ceiling(sp/(sqrt 2)); - sh := setdot (shadedotpath, abs(shadewd)); - v := filledwith (sh, 2(dx, dx), ll, ur); - DoClip(v); - orto (active_plane, Clipped (v) g); - sh := sh shifted hroundpair ((dx, dx).t_); + % setpair (dv) ceiling (sp/(sqrt 2))*(1,1); + % test hex spacing: + setpair (dv) ( ceiling(.5sp), ceiling(.5sp*sqrt 3) ); + setpicture (sh) setdot (shadedotpath, abs(shadewd)); + newpicture (v); + fillwith (v) (sh, 2dv, ll, ur); + newpicture (w); + addto w also v shifted goodpair (dv); + DoClip (v); DoClip (w); + clipto (v) (g); clipto (w) (g); + _orto (active_plane, v); v := nullpicture; - v := filledwith (sh, 2(dx, dx), ll, ur); - DoClip(v); - orto (active_plane, Clipped (v) g); + _orto (active_plane, w); %</MF> % \end{macrocode} % In \MP{} we just fill with gray. The gray level having been calculated @@ -2955,61 +3662,61 @@ enddef; % % If the space \gbc{sp} and \gbc{polkadotwd} are too small, there will % be a great many tiny dots. It is quite easy to overflow \MP{} capacity -% and the dots are really ugly. In \MF, we already have \gbc{shade} to -% place tiny dots. Therefore, we merely fill if \gbc{sp} is less that a -% certain minimum, even if that minimum is greater than \gbc{polkadotwd}. +% and tiny paths don't rasterize at all well in \PS. In \MF, we already +% have \gbc{shade} to place tiny dots. Therefore, we merely fill if +% \gbc{sp} is less that a certain minimum, even if that minimum is greater +% than \gbc{polkadotwd}. % \begin{macrocode} polkadotwd := 5bp; mindotspace := 1bp; -path polkadotpath; polkadotpath := fullcircle; +path polkadotpath; polkadotpath := fullcircle; vardef polkadot (expr sp) expr f = - save g; path g; g := zconv (f); - if not cycle g : NoCycleWarn "polkadot"; safedraw g; - elseif sp <= emax (2*polkadotwd/3, mindotspace) : + convertpath (g) f; + if not cycle g: NoCycle("polkadot") g; + elseif sp <= emax (2*polkadotwd/3, mindotspace): safefill g; else: - save ll, ur; pair ll, ur; - gbbox (g, ll, ur); + setbbox (ll, ur) g; % \end{macrocode} % As with \gbc{shade}, we shift alternate rows by half the spacing between -% dot centers, \gbc{dx}. The vertical shift \gbc{dy} is slightly larger -% (relatively speaking) and the horizontal smaller. We also apply a -% horizontal and vertical shift to avoid small pieces of dots. What it does -% is take only those dots whose centers lie in the bounding box, and center -% the whole array relative to that box. +% dot centers. The vertical shift is slightly larger (relatively speaking) +% and the horizontal smaller. We apply a further horizontal and vertical +% shift to avoid small pieces of dots. What it does is take only those dots +% whose centers lie in the bounding box, and center the whole array +% relative to that box. % \begin{macrocode} - save dx, dy; dx := sp/2; dy := dx*(sqrt 3); - hshift := ((xpart (ur - ll)) mod dx)/2; - vshift := ((ypart (ur - ll)) mod dy)/2; + save dx, dy, dshift; pair dshift; + dx := sp/2; dy := dx*sqrt 3; + dshift := (xpart(ur - ll) mod dx, ypart (ur - ll) mod dy)/2; % \end{macrocode} % Here, \gbc{p} is the center of the first dot in the lower left corner. % \begin{macrocode} - save p, dims; pair p, dims; - p := ll + (hshift, vshift); + save p, dims; pair p, dims; + p := ll + dshift; dims := 2(dx, dy); % \end{macrocode} % The extra \MF{} code is to clear what's under the dots in case they -% are gray dots. And then to `gray' the dots when fillcolor demands it. -% \begin{macrocode} - save v, thepolkadot; picture v, thepolkadot; - thepolkadot := setdot (polkadotpath, polkadotwd); - v := filledwith (thepolkadot, dims, p, ur); - p := p + (dx, dy); - orto (v, filledwith (thepolkadot, dims, p, ur)); - DoClip (v); clipto (v) g; +% are gray dots. And then to `gray' the dots when \gbc{fillcolor} demands +% it. +% \begin{macrocode} + setpicture (thepolkadot) setdot (polkadotpath, polkadotwd); + newpicture (v); + fillwith (v) (thepolkadot, dims, p, ur); + fillwith (v) (thepolkadot, dims, p + (dx, dy), ur); + DoClip (v); clipto (v) g; %<*MF> - if (fillcolor > black) and (fillcolor < white): % gray - subto (active_plane) (v); + if isgray (fillcolor): + _subto (active_plane) (v); + v := nullpicture; thepolkadot := - shaded (fillcolor) polkadotpath scaled ceiling(polkadotwd); - v := filledwith (thepolkadot, dims, p, ur); - p := p - (dx, dy); - orto (v, filledwith (thepolkadot, dims, p, ur)); - DoClip (v); clipto (v) g; + shaded (fillcolor) polkadotpath scaled ceiling (polkadotwd); + fillwith (v) (thepolkadot, dims, p, ur); + fillwith (v) (thepolkadot, dims, p + (dx, dy), ur); + DoClip (v); clipto (v) g; fi %</MF> - coloraddto (fillcolor) (active_plane) (v); + coloraddon (fillcolor, v); fi f enddef; @@ -3018,8 +3725,7 @@ enddef; % % \subsection{Hatching}\label{hatching} % -% \DescribeRoutine{thatch} -% \DescribeRoutine{colorthatch} +% \DescribeRoutine{thatch}\RoutineIndex{colorthatch} % Hatch interior of path \gbc{f} (graph coordinates) with lines at angle % \gbc{theta}, spaced \gbc{sp} apart (device coordinates). As usual an % unclosed path is simply drawn. The thickness of the lines is determined @@ -3031,52 +3737,49 @@ enddef; % is filled with lines and rotated, it will cover the path. After calling % \gbc{thatchf} we add the picture, clipped to the path. % \begin{macrocode} -def thatch = colorthatch (hatchcolor) enddef; +def thatch = colorthatch (hatchcolor) enddef; vardef colorthatch (expr clr) (expr sp, theta) expr f = - save g; path g; g := zconv (f); - if not cycle g : NoCycleWarn "hatch"; safedraw g; - elseif sp <= abs(hatchwd) : colorsafefill (clr) g; + convertpath (g) f; + if not cycle g: NoCycle("hatch") g; + elseif sp <= abs(hatchwd): colorsafefill (clr) g; else: - save v; picture v; v := nullpicture; - save CT; transform CT; CT := identity rotated theta; - save ll, ur; pair ll, ur; - gbbox (g transformed inverse CT, ll, ur); - thatchf (v, CT, sp, ll, ur); - DoClip(v); - coloraddto (clr) (active_plane) (Clipped (v) g); + newpicture (v); + setbbox (ll, ur) g rotated -theta; + thatchf (v, identity rotated theta, sp, ll, ur); + DoClip (v); clipto (v) (g); + coloraddon (clr, v); fi f enddef; % \end{macrocode} % -% \DescribeRoutine{hhatch} -% \DescribeRoutine{vhatch} -% \DescribeRoutine{lhatch} -% \DescribeRoutine{rhatch} -% \DescribeRoutine{xhatch} % We offer some special cases, calling \gbc{thatch} with different angles. % These take only the spacing (in device coordinates) and a path -% expression (in graph coordinates) as parameters. \gbc{hhatch} has angle -% 0 and so produces horizontal lines; \gbc{vhatch} produces vertical -% lines; \gbc{lhatch} produces lines tilted to the left (running from -% upper left to lower right), and \gbc{rhatch} produces lines running from -% lower left to upper right. \gbc{xhatch} produces cross-hatching, and -% essentially runss \gbc{lhatch} and \gbc{rhatch}. +% expression (in graph coordinates) as parameters.\\ +% \DescribeRoutine{hhatch}\gbc{hhatch} has angle 0 and so produces +% horizontal lines;\\ +% \DescribeRoutine{vhatch}\gbc{vhatch} produces vertical lines;\\ +% \DescribeRoutine{lhatch}\gbc{lhatch} produces lines tilted to the +% left (running from upper left to lower right);\\ +% \DescribeRoutine{rhatch}\gbc{rhatch} produces lines running from lower +% left to upper right; and\\ +% \DescribeRoutine{xhatch}\gbc{xhatch} produces +% cross-hatching, and essentially runs \gbc{lhatch} and \gbc{rhatch}. % % Color is a parameter only for \gbc{colorxhatch}. The reason for that % is to make code written by \mfpic{} simpler. The \mfpic{} commands for % the others actual write calls to \gbc{thatch} or \gbc{colorthatch}. % % \begin{macrocode} -def hhatch (expr sp) = thatch (sp, 0) enddef; -def vhatch (expr sp) = thatch (sp, 90) enddef; -def lhatch (expr sp) = thatch (sp, -45) enddef; -def rhatch (expr sp) = thatch (sp, 45) enddef; +def hhatch (expr sp) = thatch (sp, 0) enddef; +def vhatch (expr sp) = thatch (sp, 90) enddef; +def lhatch (expr sp) = thatch (sp, -45) enddef; +def rhatch (expr sp) = thatch (sp, 45) enddef; -def xhatch = colorxhatch (hatchcolor) enddef; -vardef colorxhatch (expr clr, sp) expr f = - colorthatch (clr) (sp, 45) colorthatch (clr) (sp, -45) f +def xhatch = colorxhatch (hatchcolor) enddef; +def colorxhatch (expr clr, sp) = + colorthatch (clr) (sp, 45) colorthatch (clr) (sp, -45) enddef; % \end{macrocode} @@ -3084,48 +3787,52 @@ enddef; % \subsection{Tesselations}\label{tess} % % \DescribeRoutine{tess} -% Tesselation of interior of closed path is filling with copies of a tile -% (see subsection~\ref{tiles}). The path is in graph units, the tile is a -% suffix parameter and is the name of a previously defined tile. In fact, -% one can create the picture any way one likes (it doesn't have to be with -% the \gbc{tile} environment). Thus \gbc{tess (fred) f;} will work as long -% as \gbc{fred.pic} is a picture \gbc{fred.wd} is its width, etc. -% \begin{macrocode} +% Tesselation of the interior of a closed path means filling with copies +% of a \emph{tile} (see subsection~\ref{tiles}). The path is in graph +% units, the tile is a suffix parameter and is the name of a previously +% defined tile. In fact, one can create the picture any way one likes (it +% doesn't have to be with the \gbc{tile} environment). Thus \gbc{tess +% (fred) f;} will work as long as \gbc{fred.pic} is a picture and +% \gbc{fred.dims} is a pair giving its dimensions. +% \begin{macrocode} +vardef NoTile (suffix atile) expr g = + GBwarn str atile & " is not a valid tile for tess()." + & " The path will be drawn instead."; + safedraw g; +enddef; vardef tess (suffix atile) expr c = - save _g; path _g; _g := zconv (c); - if not is_tile (atile) : - GBerrmsg ("Tile parameter " & str atile & " of tess() is invalid") - "This tile may be undefined or incorrectly defined. " & - "If you proceed, tess() will be abandoned and the curve " & - "merely drawn."; safedraw _g; - elseif not cycle _g : NoCycleWarn "tess"; safedraw _g; + convertpath (_g) c; + if not cycle _g: NoCycle("tess") _g; + elseif not is_tile (atile): NoTile (atile) _g; else: - save _ll, _ur; pair _ll, _ur; - gbbox (_g, _ll, _ur); - save _ts; picture _ts; - _ts := filledwith (atile.pic, (atile.wd, atile.ht), _ll, _ur); - DoClip (_ts); - orto (active_plane, Clipped (_ts) _g); + setbbox (_ll, _ur) _g; + newpicture (_ts); + fillwith (_ts) (atile.pic, atile.dims, _ll, _ur); + DoClip (_ts); clipto (_ts) _g; + _orto (active_plane, _ts); fi c enddef; % \end{macrocode} % -% \subsection{Dots and Dashes}\label{dashes} +% \subsection{Dots and dashes}\label{dashes} % -% \MP{} has some builtin commands for drawing a dashed or dotted curve, +% \MP{} already has commands for drawing a dashed or dotted curve, % but \MF{} does not. Considerable effort went into making this possible -% (before \MP{} even existed). The code is reasonably fast and the result -% is actually better quality than the builtin commands of \MP{} so we use -% the same code in both versions. The \grafbase{} dashing code is designed -% to produce a whole number of dashes on any curve to which it is applied, -% and (usually) to begin and end with half a dash (so that when dashed -% curves abut the result looks decent). The built-in facilities do neither -% of these. In addition, the dotting code is flexible enough that copies -% of any picture (not just a circular dot) can be used to trace a path. -% -% The general command is \gbc{gendashed} which takes a suffix parameter +% (before \MP{} even existed). The code is now reasonably fast and the +% result is actually better quality than \MP{}'s native commands so we use +% the same code in both versions. It does, however, use pretty much +% memory in \MP{}. +% +% The \grafbase{} dashing code is designed to produce a whole number of +% dashes on any curve to which it is applied, and (usually) to begin and +% end with half a dash (so that when dashed curves abut, the result looks +% decent). \MP{}'s own facilities do neither of these. In addition, the +% dotting code is flexible enough that copies of any picture (not just a +% circular dot) can be used to trace a path. +% +% The general command is \gbc{gendashed}, which takes a suffix parameter % (the name of a \emph{dashing pattern}, see below) and a path expression % in graph coordinates. % @@ -3139,25 +3846,25 @@ enddef; % % We start with some variables and their defaults, some of which are no % longer used. \gbc{segment_split} is used in the code for finding the -% approximate length of a curve. This is needed so that adjustments -% can be made so that a whole number of repeated patterns are used. -% \gbc{dashsize} and \gbc{dashgap} are no longer used. Originally they -% gave the lengths of default dashes and the spaces in between. -% \gbc{dash_start} and \gbc{dash_finish} are the fractions of a dash -% length that are used at the start and finish if the command +% approximate length of a curve. This is needed to make adjustments in the +% length of dashes and spaces so that a whole number of repeated patterns +% are used. \gbc{dashsize} and \gbc{dashgap} are no longer used. +% Originally they gave the lengths of default dashes and the spaces in +% between. \gbc{dash_start} and \gbc{dash_finish} are the fractions of a +% dash length that are used at the start and finish if the command % \gbc{dashpat} is used to create the dashing pattern. % -% And \gbc{unit_of_length} is used to adjust numbers downward and avoid +% And \gbc{_rescale_factor} is used to adjust numbers downward and avoid % arithmetic overflow. For a 1200dpi \MF{} mode, a curve 4 inches long % will be over \mfc{infinity} pixels in length, but only 40 deci-inches. % Our default for this variable is just that: 1/10 inch. % \begin{macrocode} -if unknown segment_split : segment_split := 8; fi -if unknown dashsize : dashsize := 3bp; fi -if unknown dashgap : dashgap := dashsize + 2penwd; fi -if unknown dash_finish : dash_finish := .5; fi -if unknown dash_start : dash_start := .5; fi -if unknown unit_of_length : unit_of_length := 0.1in; fi +if unknown segment_split: segment_split := 8; fi +if unknown dashsize: dashsize := 3bp; fi +if unknown dashgap: dashgap := dashsize + 2penwd; fi +if unknown dash_finish: dash_finish := .5; fi +if unknown dash_start: dash_start := .5; fi +if unknown _rescale_factor: _rescale_factor := 0.1in; fi % \end{macrocode} % @@ -3173,85 +3880,96 @@ if unknown unit_of_length : unit_of_length := 0.1in; fi % and you arrange for the dot's size to be different from \gbc{penwd}. % % We generalize this so that \gbc{pat.start} and \gbc{pat.finish} can be -% any patterns, not necessarily related to \gbc{pat.rep}. Also "dots" can be -% symbols like \gbc{Triangle}. We also supply (later) the \gbc{dashpat} -% command which takes a list of lengths, equates \gbc{pat.rep} to them, -% and generates \gbc{pat.start} and \gbc{pat.finish} according to the -% description above. +% any patterns, not necessarily related to \gbc{pat.rep}. Also `dots' can be +% symbols like \gbc{Triangle}. +% +% When we tried to deal with arrays of dashing patterns, it became +% rather a pain to deal with three arrays of arrays. So now we allow the +% suffix \gbc{pat} to be a single array and call \gbc{mkdasharrays} to +% produce \gbc{pat.start} and \gbc{pat.finish}. It returns \gbc{true} if +% all three arrays are successfully produced. +% +% The variable \VariableIndex{last_dot_size} \gbc{last_dot_size} is +% intended to allow the clearing path of arrowhead commands to encompass +% a final dot larger than \gbc{penwd}. % \begin{macrocode} +numeric last_dot_size; last_dot_size := 0; vardef gendashed (suffix pat) expr f = - save _g; path _g; _g := zconv(f); - if (unknown pat.rep) : % no "pattern" - GBmsg "Dash pattern " & str pat & " undefined. " & - "Path will be drawn instead."; + convertpath (_g) f; + save _dpat; + if not mkdasharrays (pat) (_dpat): + GBwarn "Dash pattern " & str pat + & " undefined. Path will be drawn instead."; safedraw _g; - elseif pat.rep < 2 : % no "spaces" + elseif _dpat.rep < 2: safedraw _g; else: % \end{macrocode} -% We want to manipulate the values of \gbc{pat} so that a whole number of -% repetitions are used. So we copy \gbc{pat} to \gbc{_tmppat}. % -% After this loop, \gbc{_dl.s} is the total length of the corresponding -% \gbc{pat.s} in multiples of \gbc{unit_of_length}, and \gbc{_tmppat.s[i]} -% is \gbc{pat.s[i]} converted to these units. +% After the following loop, \gbc{_dl.s} is the total length of the +% corresponding \gbc{pat.s} in multiples of \gbc{_rescale_factor}, and +% \gbc{_dpat.s[i]} has been converted to these units. % \begin{macrocode} - save _dl, _tmppat; - forsuffixes _s = start, rep, finish : - _dl._s := 0; _tmppat._s := pat._s; - for i = 1 upto pat._s : - _tmppat._s[i] := pat._s[i]/unit_of_length; - _dl._s := _dl._s + _tmppat._s[i]; + save _dl; + forsuffixes _s = start, rep, finish: + _dl._s := 0; + for i = 1 upto _dpat._s: + _dpat._s[i] := _dpat._s[i]/_rescale_factor; + _dl._s := _dl._s + _dpat._s[i]; endfor endfor - if _dl.rep = 0 : - GBmsg "Dash pattern " & str pat & " has length 0. " & - "Path will be drawn instead."; + + if _dl.rep = 0: + GBwarn "Dash pattern " & str pat & " has length 0. " + & "Path will be drawn instead."; safedraw _g; else: % \end{macrocode} -% Here \gbc{_g} is our path in device units, but we convert that to our -% unit of length to avoid having paths of length \gbc{infinity}. +% Here \gbc{_g} is our path in device units, but \gbc{setuplengtharray} +% computes lengths in multiples of \gbc{_rescale_factor} to avoid having +% paths of length \gbc{infinity}. % % This is how we process a path mathematically: let $f(t)$, $0 \le t \le % k$ be the formula for the path \gbc{f}, $k$ being the number of segments -% of \gbc{f}, we consider the polygon connecting the points $f(0), f(1/8), -% f(2/8),\ldots,f(k)$ and compute the length of \emph{that} path (assuming -% \gbc{segment_split = 8}). Actually, we compute and save the cumulative +% of \gbc{f}, we consider the polygon connecting the points $f(0), f(1/s), +% f(2/s),\ldots,f(k)$ (where $s$ is \gbc{segment_split}) and compute the +% length of \emph{that} path. Actually, we compute and save the cumulative % lengths at each vertex of this polygon, since we use that later to -% determine ``when'' (i.e., at what values of $t$) to place a dot or draw -% a dash. The command \gbc{makelengtharray} does this, storing the -% cumulative lengths in the array \gbc{_cumlen} and returning the total -% length. +% determine `when' (i.e., at what values of $t$) to place a dot or draw +% a dash. The command \gbc{setuplengtharray} does this, storing the +% cumulative lengths in the array \gbc{_cumlen} and the total in +% \gbc{_totlen}. It also initializes \gbc{_ct} the index into that array. % \begin{macrocode} - save _p; path _p; - _p := _g scaled (1/unit_of_length); - save _cumlen, _totlen, _n, _sf; - _totlen := makelengtharray(_cumlen) _p; + setuplengtharray (_cumlen, _totlen, _ct) _g; % \end{macrocode} -% Now we scale the dashes so that a whole number of patterns make up +% Now we adjust the dashes so that a whole number of patterns make up % the lengths of the approximating polygon. \gbc{scale_adjust} returns % the scaling factor, equates \gbc{_n} to the total number of -% \gbc{pat.rep} to use. If the path length is already less than the length -% of the start and finish patterns, this is equated to $-1$ as a flag to -% draw the path instead. (recall \gbc{_dl.s} holds the length of part -% \gbc{s}). +% \gbc{pat.rep} to use. If the path length is too small compared to the +% length of the start and finish patterns, this is equated to $-1$ as a +% flag to draw the path instead. (recall \gbc{_dl.s} holds the length of +% part \gbc{s}). % -% After this we rescale the dashes and spaces stored in \gbc{_tmppat}, and +% After this we rescale the dashes and spaces stored in \gbc{_dpat}, and % the length of the patterns in \gbc{_dl}. % \begin{macrocode} - _sf := scale_adjust (_n, _dl)(_totlen); - if _n < 0 : safedraw _g; + save _n, _sf, _no_dots; + boolean _no_dots; _no_dots := true; + _sf := scale_adjust (_n, _dl) (_totlen); + if _n < 0: safedraw _g; else: - forsuffixes _s = start, rep, finish : - for _i = 1 upto _tmppat._s : - _tmppat._s[_i] := _tmppat._s[_i]*_sf; + forsuffixes _s = start, rep, finish: + for _i = 1 upto _dpat._s: + if (_dpat._s[_i] = 0) and _no_dots: _no_dots := false; + else: _dpat._s[_i] := _dpat._s[_i]*_sf; + fi endfor _dl._s := _dl._s*_sf; endfor % \end{macrocode} % The user has the capability to use something other than a small disk for -% a dot by defining \gbc{plot_pic}. The utility \gbc{makesymbol} is +% a dot by defining \gbc{plot_pic} (and preferably also storing its +% diameter in \gbc{plot_pic.size}). The utility \gbc{makesymbol} is % defined later. It examines \gbc{plot_pic} and makes a picture depending % on what type of variable it is. The default \gbc{dotpath} is % \mfc{fullcircle}, but user may also change that to get different dots. @@ -3259,9 +3977,15 @@ vardef gendashed (suffix pat) expr f = % parameter is a path}. This is how to increase the dot size (the code in % \gbc{plot} uses this.) % \begin{macrocode} - save dashingdot; picture dashingdot; - if known plot_pic : dashingdot := makesymbol(plot_pic, penwd); - else: dashingdot := makesymbol(dotpath, penwd); + if _no_dots: + else: + if unknown plot_pic: + save plot_pic; path plot_pic; + plot_pic := dotpath; + fi; + last_dot_size := + if known plot_pic.size: plot_pic.size else: penwd fi; + setpicture (dashingdot) makesymbol (plot_pic, last_dot_size); fi % \end{macrocode} % The macro \gbc{dashit} draws the dashes, computing where they go and @@ -3277,56 +4001,52 @@ vardef gendashed (suffix pat) expr f = % start; \gbc{_t0} and \gbc{_t1} are the same, but in terms of time. % A macro \gbc{gettime} converts the first to the second. It uses the % cumulative length array \gbc{_cumlen} for this, and maintains -% \gbc{_ct} as the current index into that array. The parameters to -% \gbc{dashit} are the name of the part of the dashing pattern that is being -% drawn, and a temporary picture variable. The latter holds the picture -% until \gbc{DoClip} can process it, then it is added to \gbc{active_plane}. +% \gbc{_ct} as the current index into that array. +% \begin{macrocode} + save _t, _d, _v; + picture _v; _v := nullpicture; + _d0 := 0; _t0 := 0; + dashit (_dpat.start) (_v); + +% \end{macrocode} +% The parameters to \gbc{dashit} are the name of the part of the dashing +% pattern that is being drawn, and a temporary picture variable. The +% latter holds the picture until \gbc{DoClip} can process it. % The code of \gbc{dashit} leaves \gbc{_d0} pointing to the current % position on the curve, but for safety and to reduce accumulated % round-off error, we initialize it to what it should be before each call. -% \begin{macrocode} - save _ct, _t, _d, _v; - picture _v; _v := nullpicture; - _ct := 0; - % Begin with pat.start - _d0 := 0; _t0 := 0; - dashit (_tmppat.start) (_v); -% \end{macrocode} +% % The repeating pattern has the tendency to use lots of memory. Previously % I added all the dashes to \gbc{_v} and then added it all at once to % \gbc{active_plane}. The purpose was to be able to \gbc{DoClip} it once, -% and add it once with \gbc{coloraddto} to get it drawn in color under \MF. +% and add it once with \gbc{coloraddon} to get it drawn in color under \MF. % This was simplest, but a memory hog requiring $O(n)$ in memory, where % $n$ is the number of repeated patterns. Then we tried clipping and adding % within \gbc{dashit}. This was terribly slow, requiring $O(n)$ in time. -% Now I'm going to try a standard programming trick: accumulate $m < n$ -% repetitions before adding them, the memory should be $O(m)$ and the -% time $O(n/m)$. As a first try, we make $m$ about $\sqrt n$. -% \begin{macrocode} - % then pat.rep - if _n > 0 : - save _m; _m := ceiling sqrt(_n); - for _j = 0 step _m until _n - 1 : - for _i = 0 upto _m - 1 : +% Now we use a standard programming trick: accumulate $m < n$ repetitions +% before adding them, the memory should be $O(m)$ and the time $O(n/m)$. +% Making $m$ about $\sqrt n$ seems to work well. +% \begin{macrocode} + if _n > 0: + save _m; _m := ceiling sqrt(_n); + for _j = 0 step _m until _n - 1: + for _i = 0 upto _m - 1: exitif (_i + _j) > _n - 1; _d0 := _dl.start + (_j + _i)*_dl.rep; - _t0 := gettime(_cumlen, _ct) (_d0); - dashit (_tmppat.rep) (_v); + _t0 := gettime (_cumlen, _ct) (_d0); + dashit (_dpat.rep) (_v); endfor - % add _m patterns and reset. - DoClip(_v); -%<MF> mono (_v) - coloraddto (drawcolor) (active_plane, _v); + DoClip (_v); + coloraddon (drawcolor, _v); _v := nullpicture; endfor fi - % and finally, pat.finish + _d0 := _totlen - _dl.finish; - _t0 := gettime(_cumlen, _ct) (_d0); - dashit (_tmppat.finish) (_v); - DoClip(_v); -%<MF> mono(_v) - coloraddto (drawcolor) (active_plane, _v); + _t0 := gettime (_cumlen, _ct) (_d0); + dashit (_dpat.finish) (_v); + DoClip (_v); + coloraddon (drawcolor, _v); fi fi fi @@ -3336,15 +4056,24 @@ enddef; % \end{macrocode} % % \DescribeRoutine{makelengtharray} -% This takes an array name and a path expression (any coordinates), -% computes the array of partial lengths (of the polygon approximation), -% and returns the total length. -% \begin{macrocode} -vardef makelengtharray (suffix clen) expr p = - save _s; _s := emax (1, ceiling segment_split); - clen := _s*length p; clen[0] := 0; - for _i = 1 upto clen : - clen[_i] := clen[_i-1] + abs (pnt[_i/_s] (p) - pnt[(_i-1)/_s] (p)); +% This takes an array name and a path expression (which is assumed to be +% in device coordinates), computes the array of partial lengths (of the +% polygon approximation), and returns the total length. To avoid numeric +% overflow we rescale the lengths and so the array elements are in units +% of \gbc{_rescale_factor}. At one point we used to rescale the path, +% but that turned out to be unnecessary and made it harder to accomplish +% several of the things we now do with this. We also save a little +% memory by making the path a suffix parameter, which avoids the memory +% used for the `capsule' of an expression parameter. So far all uses apply +% it to a path variable and we have to remember to keep it that way. +% \begin{macrocode} +vardef makelengtharray (suffix clen) suffix p = + setsplit (_s) segment_split; + numeric clen[]; + clen := _s * length p; clen0 := 0; + for _i = 1 upto clen: + clen[_i] := clen[_i-1] + abs (pnt[_i/_s] (p) - pnt[(_i-1)/_s] (p)) / + _rescale_factor; endfor clen[clen] enddef; @@ -3353,7 +4082,7 @@ enddef; % % \DescribeRoutine{scale_adjust} % Here \gbc{n} is a suffix defined by the calling routine, -% \gbc{pl.\{start\|ref\|finish\}} are the lengths of corresponding parts +% \gbc{pl.\{start\|rep\|finish\}} are the lengths of corresponding parts % of a dashing pattern, \gbc{lngth} is the length of some path (determined % by the calling routine). It determines how many times \gbc{pl.rep} goes % into \gbc{lngth - pl.start - pl.finish}. If this is negative it remains @@ -3363,8 +4092,8 @@ enddef; % \begin{macrocode} vardef scale_adjust (suffix n, pl) (expr lngth) = n := (lngth - pl.start - pl.finish)/pl.rep; - n := if n < 0 : -1 else: round(n) fi; - lngth/(pl.start + emax(n, 0)*pl.rep + pl.finish) + n := if n < 0: -1 else: round(n) fi; + lngth/(pl.start + emax (n, 0)*pl.rep + pl.finish) enddef; % \end{macrocode} @@ -3386,21 +4115,22 @@ enddef; % % Once we know what segment we are in, we determine the time by linear % interpolation between the times corresponding to \gbc{ct} and -% \gbc{ct+1}. +% \gbc{ct+1}. Note: in the \mfc{forever} loop, the exit must come before +% the increment. % \begin{macrocode} vardef gettime (suffix arr, ct) (expr lngth) = - save _gtl, _s; - _s := emax(1, ceiling segment_split); - _gtl := emax (arr[ct], emin (arr[arr], lngth)); - forever: - exitif ( (arr[ct] <= _gtl) and (_gtl <= arr[ct+1]) ); - ct := ct + 1; % need to exit *before* incrementing + setnumeric (_gtl) emax (arr[ct], emin (arr[arr], lngth)); + setsplit (_s) segment_split; + forever: exitif ( (arr[ct] <= _gtl) and (_gtl <= arr[ct+1]) ); + next ct; endfor - if arr[ct] = arr[ct+1] : ct - else: ( ct + (_gtl - arr[ct]) / (arr[ct+1] - arr[ct]) ) - fi /_s + if arr[ct] = arr[ct+1]: ct + else: ( ct + (_gtl - arr[ct]) / (arr[ct+1] - arr[ct]) ) + fi /_s enddef; +def next suffix X = X := X + 1; enddef; + % \end{macrocode} % % \DescribeRoutine{dashit} @@ -3414,7 +4144,7 @@ enddef; % the beginning of the dash and we get to the end of the dash by adding % the length of a dash (\gbc{pos[_j]}) to \gbc{_d0} (getting % \gbc{_d1}) and calling \gbc{gettime} (getting \gbc{_t1}). We draw -% the subpath between thos points. Unless \gbc{pos[_j] = 0}, in which case +% the subpath between those points. Unless \gbc{pos[_j] = 0}, in which case % a dot is placed. % % For even \gbc{j} (a space) we are at \gbc{_d1} and \gbc{_t1} and @@ -3423,18 +4153,18 @@ enddef; % \begin{macrocode} def dashit (suffix pos) (suffix pic) = for _k = 1 upto pos: - if odd _k : % draw a dash of length pos[_k] - if pos[_k] = 0 : % point required - _d1 := _d0; _t1 := _t0; + if odd _k: + if pos[_k] = 0: + _d1 := _d0; _t1 := _t0; picdot (pic, dashingdot, pnt [_t0] (_g)); else: _d1 := _d0 + pos[_k]; _t1 := gettime (_cumlen, _ct) (_d1); shpath (pic, drawpen) (subpath (_t0, _t1) of _g); fi - else: % find the start of the next dash: + else: _d0 := _d1 + pos[_k]; - _t0 := gettime(_cumlen, _ct) (_d0); + _t0 := gettime (_cumlen, _ct) (_d0); fi endfor enddef; @@ -3442,55 +4172,77 @@ enddef; % \end{macrocode} % % \DescribeRoutine{dashpat} -% This is a utility to convert a text list of lengths to the three dash -% pattern arrays required by \gbc{gendashed}. We first simply copy the -% list to array \gbc{pat.rep}. If the number is odd we add a 0-length -% item (a nonspacing space). Unless the number is 1, which we use as a -% signal that a curve should be solid and not dashed at all. -% -% \gbc{pat.start} is the same as \gbc{pat.rep} except the first dash is -% reduced by the factor \gbc{dash_start}. \gbc{pat.finish} is just the -% first dash of \gbc{pat.rep} reduced by the factor \gbc{dash_finish}. +% This is a utility to convert a list of lengths to an array. It is almost +% the same as \gbc{list}, but it does make sure the array functions as +% a dashing pattern. It needs to consist of either $1$ item (the signal to +% draw a solid line) or an even number of items. So we add a zero length +% term if the size is $0$ or odd and bigger than $1$. +% +% \DescribeRoutine{mkdasharrays} +% The dashing code in \gbc{gendashed} is written so the the beginning and +% ending patterns can be different from the repeating patterns. If so, +% they must be named \gbc{pat.start}, \gbc{pat.rep} and \gbc{pat.finish}. +% If one of these three is not a known array but \gbc{pat} is, this macro +% creates the array in a generic way. When created this way, \gbc{pat.rep} +% is a copy of \gbc{pat}. So is \gbc{pat.start}, except only a fraction of +% the first dash is used, while \gbc{pat.finish} is just the first dash of +% \gbc{pat} reduced by the factor \gbc{dash_finish}. % \begin{macrocode} def dashpat (suffix pat) (text t) = - pat.rep := 0; - for _itm = t: - pat.rep[incr pat.rep] := _itm; - endfor; - if odd (pat.rep) and (pat.rep > 1): - pat.rep[incr pat.rep] := 0; + list (pat) (t); + if (pat = 0) or (odd (pat) and (pat > 1)): + pat[incr pat] := 0; fi - pat.start := 1; - pat.start[1] := pat.rep[1]*dash_start; - for _idx = 2 upto pat.rep : - pat.start[incr pat.start] := pat.rep[_idx]; +enddef; + +vardef mkdasharrays (suffix src, dest) = + save _bad; boolean _bad; _bad := false; + forsuffixes _s = start, rep, finish: + numeric dest._s, dest._s[]; + boolean _bad._s; + if knownnumericarray src._s: + copyarray (src._s) (dest._s); + _bad._s := false; + else: + _bad := _bad._s := true; + fi endfor - pat.finish := 1; - pat.finish[1] := pat.rep[1]*dash_finish; + % _bad = one of the three arrays not copied. + if _bad: + if knownnumericarray src: _bad := false; + if _bad.rep: % make dest.rep = src + copyarray (src) (dest.rep); + fi + if _bad.start: % shrink first dash to get dest.start + copyarray (src) (dest.start); + dest.start1 := dash_start*src1; + fi + if _bad.finish: % use partial first dash for dest.finish + dest.finish := 1; + dest.finish1 := dash_finish*src1; + fi + fi + fi + not _bad enddef; % \end{macrocode} % -% \DescribeRoutine{dashed} -% \DescribeRoutine{DASHED} -% The old \gbc{dashed} is now implemented by making a dashpattern from the -% two arguments and calling gendashed. When \MP{} support was added, I -% thought it best not to overwrite the \MP{} primitive \gbc{dashed} and -% the command was named \gbc{DASHED}, but then later it seemed better to -% keep \MF/\MP{} compatibility so \gbc{dashed} was used. Now for backward -% compatibility we maintain both. In \MP, we save the primitive -% \mfc{dashed} as \gbc{dashed_}. +% +% The \mfpic{} command \cs{dashed} is now implemented by making a +% dashpattern from the two arguments and calling gendashed. That is the +% definition of \gbc{DASHED}. % % \gbc{dashed} takes parameters which are the length and the space (device % coordinates) and a path (graph coordinates). It returns the path. % \begin{macrocode} -vardef DASHED (expr dlen, dgap) expr f = - save dashes; dashpat (dashes) (dlen, dgap); +vardef Dashed (expr dlen, dgap) expr f = + save dashes; dashpat (dashes) (dlen, dgap); gendashed (dashes) f enddef; -%<MP>let dashed_ = dashed; -def dashed = DASHED enddef; +def DASHED = Dashed enddef; +%<MF> def dashed = Dashed enddef; % \end{macrocode} % @@ -3511,42 +4263,87 @@ def dashed = DASHED enddef; % trained to use when dots are needed. % % After this \gbc{gendashed} is called with a pattern where the dashes are -% 0 length, signalling that dots are used. \gbc{dotted} is implemented by -% calling \gbc{doplot} with \gbc{dotpath} the symbol. +% 0 length, the signal that dots are to be used. \DescribeRoutine{dotted} +% \gbc{dotted} is implemented by calling \gbc{doplot} with \gbc{dotpath} +% the symbol. % \begin{macrocode} vardef doplot (expr spath, sc, dgap) expr f = - save dots; dashpat (dots) (0, dgap); - save plot_pic; picture plot_pic; - plot_pic := makesymbol (spath, sc); + save dots; dashpat (dots) (0, dgap); + setpicture (plot_pic) makesymbol (spath, sc); + plot_pic.size := sc; gendashed (dots) f enddef; -path dotpath; dotpath := fullcircle; -vardef dotted (expr dsize, dgap) expr f = - doplot (dotpath, dsize, dgap) f -enddef; +path dotpath; dotpath := fullcircle; +def dotted = doplot (dotpath) enddef; % \end{macrocode} % % \DescribeRoutine{plotnodes} -% This is a useful little utility to draw the points on top of the -% curve through them. It differs from \gbc{plotsymbol} (defined later) in -% that it takes a path parameter (rather than a list of points) and -% returns that path (so it works with \mfpic{} as a prefix macro). It -% also uses \gbc{drawcolor}. Otherwise it calls the same code. +% These are useful little utilities to draw the points on top of the +% curve through them. \gbc{plotnodes} differs from \gbc{plotsymbol} +% (defined later) in that it takes a path parameter (rather than a list of +% points) and returns that path (so it works with \mfpic{} as a prefix +% macro). It also uses \gbc{drawcolor}. Otherwise it calls the same code. +% +% \DescribeRoutine{showcontrols} +% \gbc{showcontrols} was mainly for debugging; it draws a line segment +% connecting the control points of each node. It optionally draws a symbol +% at each control point. We use \mfc{0} for a `symbol' to indicate we +% don't wish to draw a symbol there. The default color for both the +% symbols and the segment is \gbc{pointcolor}. % \begin{macrocode} vardef plotnodes (expr symbol, size) expr f = - save _pln; pair _pln[]; - _pln := 0; - for _a = 0 upto (length f) if cycle f : - 1 fi : - _pln[incr _pln] := pnt[_a] (f); + if size > 0: + save pln; pair pln[]; + pln := 0; + for _a = 0 upto (length f) if cycle f: - 1 fi: + pln[incr pln] := pnt[_a] (f); + endfor + dosymbols (drawcolor, symbol, size) (pln); + fi + f +enddef; + +def showcontrols = colorshowcontrols (pointcolor) enddef; +vardef colorshowcontrols (expr clr, syma, symb, size) expr f = + save shpre, shpost; + pair shpre[], shpost[]; + shpre := 0; shpost := 0; + for a = 0 upto (length f) if cycle f: - 1 fi: + shpre [incr shpre] := pre [a] (f); + shpost[incr shpost] := post[a] (f); + colorsafedraw (clr) + (zconv (shpre[shpre]--pnt[a](f)--shpost[shpost])); endfor - dosymbols (drawcolor, symbol, size) (_pln); + if size > 0: + if not numeric syma: dosymbols (clr, syma, size) (shpre) ; fi + if not numeric symb: dosymbols (clr, symb, size) (shpost); fi + fi + f +enddef; + +% \end{macrocode} +% \subsection{Double-line drawing}\label{doubleline} +% +% \DescribeRoutine{doubledraw} +% This invokes \gbc{parapath}, which has issues with smooth but wiggly +% paths. An easier approach would be to draw a wide line and erase a +% narrow one in the middle. However, that would not be transparent in +% \MP{}. +% \begin{macrocode} +def doubledraw = colordoubledraw (drawcolor) enddef; +vardef colordoubledraw (expr clr, sep) expr f = + convertpath (g) f; + colorsafedraw (clr) (parapath ( sep/2) g); + colorsafedraw (clr) (parapath (-sep/2) g); f enddef; % \end{macrocode} % +% \section{Points Symbols and Other Pictures}\label{symbols} +% % \DescribeRoutine{centerit} % This accepts a picture and returns the same picture centered. This % is close to impossible in \MF, so we only do it in \MP. Actually, we @@ -3555,266 +4352,36 @@ enddef; % \begin{macrocode} %<*MP> vardef centerit (expr pic) = - pic shifted -(0.5[urcorner pic, llcorner pic]); + pic shifted -(0.5[urcorner pic, llcorner pic]) enddef; %</MP> % \end{macrocode} % % \DescribeRoutine{makesymbol} -% This utility: takes \emph{any} expression and scale and returns a picture. +% This utility takes \emph{any} expression and scale and returns a picture. % If the expression \gbc{spath} is a cycle it returns the interior, for -% other paths it draws the path, in either case scaled by \gbc{sc}. If -% already a picture, it returns it. In \MP, if it is a string, it returns -% a picture containing that string drawn in the \mfc{defaultfont}. In any -% other case, the default dot is returned. +% other paths, a drawing of the path, in either case scaled by \gbc{sc}. +% If already a picture, it returns it. In \MP, if it is a string, it +% returns a picture containing that string drawn in the \mfc{defaultfont}. +% In any other case, the default dot is returned. % \begin{macrocode} vardef makesymbol (expr spath, sc) = - if path spath : setdot (spath, sc) - elseif picture spath : -%<MF> save v; picture v; v:= spath; mono (v); v -%<*MP> - spath - elseif string spath : - spath infont defaultfont scaled defaultscale -%</MP> + if picture spath : +%<MF> setpicture (v) spath; mono (v); v +%<MP> spath + elseif path spath: setdot (spath, sc) +%<MP> elseif string spath: +%<MP> spath infont defaultfont scaled defaultscale else: - GBmsg "Undefined symbol for plotting, using dotpath instead."; + GBwarn "Undefined symbol for plotting, " + & "dotpath will be used instead."; setdot (dotpath, sc) fi enddef; % \end{macrocode} % -% These are some symbols to be used by \gbc{doplot} and \gbc{plotsymbol}. -% They are paths. The ones named with ``\gbc{Solid}'' are closed paths. -% Since these two drawing commands feed the path to \gbc{setdot}, they end -% up filled if they are cyclic, merely drawn if not. -% -% All are intended to have roughly the area (when area makes sense) of a -% circle with diameter 1. -% \begin{macrocode} -path Triangle, Square, Circle, Diamond, Star, Plus, Cross, - Asterisk, SolidTriangle, SolidSquare, SolidCircle, - SolidDiamond, SolidStar; - -Triangle := (for n = 0 upto 2: - (up rotated 120n)-- endfor up) scaled .78; -SolidTriangle := Triangle & cycle; - -Square := (for n = 0 upto 3: - dir (90n + 45)-- endfor dir 45) scaled .63; -SolidSquare := Square & cycle; - -Circle := halfcircle & halfcircle rotated 180; -SolidCircle := Circle & cycle; - -Diamond := (Square rotated 45) xscaled (1/1.2) yscaled 1.2; -SolidDiamond := Diamond & cycle; - -Plus := (origin for n = 0 upto 3: - --(up rotated 90n)--origin endfor) scaled .65; -Cross := Plus rotated 45; -Asterisk := (origin for n = 0 upto 5: - --(up rotated 60n)--origin endfor) scaled .6; - -% \end{macrocode} -% -% We do some computations to find the vertices of a standard 5-pointed -% star (pentagram). The first equation says the indented vertex at the -% ``left shoulder'' is on the line from the top of the ``head'' to the -% ``left foot'', and the second says it is on the line from the ``left -% hand'' to the ``right hand''. That point determined, we get the rest by -% rotaing 72 degrees. -% \begin{macrocode} -pair zz; -zz = (whatever)[up, up rotated 144]; -zz = (whatever)[up rotated 72, up rotated -72]; -Star := (for n = 0 upto 4: - (up rotated 72n)--(zz rotated 72n)-- endfor up) scaled .84; -SolidStar := Star & cycle; -save zz; - -% \end{macrocode} -% -% In \mfpic, the \cs{plotdata} command draws several curves with one -% command. The curves are drawn with changeable methods of rendering. -% There are three schemes. The first draws the curves with different dash -% patterns. Another scheme is to plot the curves with different symbols. -% Still another is to use different colors (\MP{} only). -% -% We implement the changing of patterns (symbols, colors) by defining -% arrays of such things and changing the index into the array. For -% example, when the user has selected dashes, the first curve is -% \gbc{gendashed} with the pattern \gbc{dashtype0}, the next with -% \gbc{dashtype1}, etc. -% -% \DescribeRoutine{defaultdashes} -% These are the usual dash patterns. Their setting is done by a macro -% so the user may easily restore them. The spaces are apparently larger -% than the dashes, but taking the thickness of the pen into account -% (\mfc{.5bp}) the dashes will appear about \mfc{.5bp} larger than stated -% and the spaces about \mfc{.5bp} smaller. -% \begin{macrocode} -numeric dashtype; -forsuffixes s = start, rep, finish : - numeric dashtype[].s, dashtype[].s[]; -endfor -def defaultdashes = - dashpat (dashtype0) (0); % solid - dashpat (dashtype1) (3bp, 4bp); % dashed - dashpat (dashtype2) (0, 4bp); % dotted - dashpat (dashtype3) (0, 4bp, 3bp, 4bp); % dot-dash - dashpat (dashtype4) (0, 4bp, 3bp, 4bp, 0, 4bp);% dot-dash-dot - dashpat (dashtype5) (0, 4bp, 3bp, 4bp, 3bp, 4bp);% dot-dash-dash - dashtype := 6; -enddef; -defaultdashes; - -% \end{macrocode} -% -% \DescribeRoutine{isdashpat} -% Checks, for the given variable \gbc{pat}, if the three arrays that -% make up a dash pattern are know arrays. It does not check if they are -% numeric arrays, but one hardly thinks they could all three exist -% accidentally if they hadn't been created by \gbc{dashpat}. -% -% \DescribeRoutine{setdatadashes} -% We have this method for users to select their own dash patterns. The -% \gbc{setdatadashes} command requires a list of suffixes previously -% defined by the \gbc{dashpat} command. -% -% \DescribeRoutine{getdashpat} -% And finally, we remove the mod-ing operation from \TeX, where it is -% cumbersome, to \MF, where it is trivial, with this command. -% \begin{macrocode} -vardef isdashpat suffix pat = - (knownarray pat.start) and - (knownarray pat.finish) and - (knownarray pat.rep) -enddef; - -def setdatadashes (text lst) = - save dashtype; dashtype := 0; - forsuffixes _itm = lst : - if isdashpat _itm : - forsuffixes _s = start, rep, finish : - copyarray (_itm._s, dashtype[dashtype]._s); - endfor - dashtype := dashtype + 1; - else: GBmsg "Improper dash pattern in setdatadashes."; - fi - endfor - if dashtype = 0 : - SetdataWarn "dashes"; - defaultdashes; - fi -enddef; -def getdashpat expr n = dashtype[n mod dashtype] enddef; - -def SetdataWarn expr s = - GBmsg "Command setdata"& s &"() failed; using defaults." -enddef; - -% \end{macrocode} -% -% \DescribeRoutine{setdatasymbols} -% This can be used to define the sequence of point plotting styles for -% \mfpic's \cs{plotdata} command. We could use it to set the default -% symbols, but I worry about the difficulty chasing down bugs if -% \gbc{defaultpoints} calls \gbc{setdatasymbols} which can again call -% \gbc{defaultpoints}. -% -% \DescribeRoutine{getsymbol} -% This is similar to \gbc{getdashpat}. In fact we could write a -% single macro to do both, but I think we get a more readable \mfpic{} -% output file if we have separate commands. -% \begin{macrocode} -def setdatasymbols (text lst) = - save pointtype; path pointtype[]; pointtype := 0; - for _itm = lst : - if (known _itm) and (path _itm): - pointtype[pointtype] := _itm; - pointtype := pointtype + 1; - else: - GBmsg "Improper path in setdatasymbols()."; - fi - endfor - if pointtype = 0: - SetdataWarn "symbols"; - defaultsymbols; - fi -enddef; -def getsymbol expr n := pointtype[n mod pointtype] enddef; - -% \end{macrocode} -% -% \DescribeRoutine{defaultsymbols} -% We store the default definitions in a macro so the user can restore -% them easily. -% \begin{macrocode} -numeric pointtype; path pointtype[]; -def defaultsymbols = - pointtype0 := Circle; - pointtype1 := Cross; - pointtype2 := SolidDiamond; - pointtype3 := Square; - pointtype4 := Plus; - pointtype5 := Triangle; - pointtype6 := SolidCircle; - pointtype7 := Star; - pointtype8 := SolidTriangle; - pointtype := 9; -enddef; -defaultsymbols; - -% \end{macrocode} -% -% \DescribeRoutine{setdatacolors} -% \DescribeRoutine{getcolor} -% Finally, for \MP, we do a similar pair of commands for setting and -% getting the colors for the \cs{plotdata} command. The default colors -% were tested on screen and on an inkjet printer. The adjustments away -% from pure colors is based on a compromise between those experiments. -% -% \DescribeRoutine{defaultcolors} -% We store the default definitions in a macro so the user can restore -% them easily. -% \begin{macrocode} -%<*MP> -def setdatacolors (text lst) = - save colortype; color colortype[]; colortype := 0; - for _itm = lst : - if (known _itm) and (color _itm) : - colortype[colortype] := _itm; - colortype := colortype + 1; - else: GBmsg "Improper color in setdatacolors()."; - fi - endfor - if colortype = 0 : - SetdataWarm "colors"; - defaultcolors; - fi -enddef; -def getcolor expr n = colortype[n mod colortype] enddef; - -numeric colortype; color colortype[]; -def defaultcolors = - colortype0 := black; - colortype1 := red; - colortype2 := 0.80blue + .2white; % blue - colortype3 := 0.66yellow + .34red; % orange - colortype4 := 0.80green; % green - colortype5 := 0.85magenta; % magenta - colortype6 := 0.85cyan; % cyan - colortype7 := 0.85yellow; % yellow - colortype := 8; -enddef; -defaultcolors; - -%</MP> -% \end{macrocode} -% % Points are filled or unfilled circles. They are implemented with % \gbc{plotsymbol}, but the code differs in that filled or unfilled % circles are determined by a parameter rather than the type of curve. @@ -3823,11 +4390,12 @@ defaultcolors; % \DescribeRoutine{bpoint} % \gbc{bpoint} is basicly a shorthand for a scaled circle shifted to a % point. The scale and the point are in device coordinates. We don't use -% it anywhere in grafbase anymore. +% it anywhere in \grafbase{} anymore. % \begin{macrocode} vardef bpoint (expr ptwd, b) = fullcircle scaled ptwd shifted b enddef; + % \end{macrocode} % % \DescribeRoutine{pointd} @@ -3836,14 +4404,14 @@ enddef; % list \gbc{t}. In case \gbc{filled} is true, \gbc{pointd} calls % \gbc{plotsymbol (SolidCircle)} otherwise we make \gbc{clearsymbols} true % (so that the area where each point is drawn will be cleared before -% drawing it) and call \gbc{plotsymbol(Circle)}. +% drawing it) and call \gbc{plotsymbol (Circle)}. % \begin{macrocode} def pointd (expr ptwd, filled) (text t) = - if filled : + if filled: plotsymbol (SolidCircle, ptwd) (t); - else : + else: begingroup; - save clearsymbols; boolean clearsymbols; clearsymbols := true; + setboolean (clearsymbols) true; plotsymbol (Circle, ptwd) (t); endgroup fi @@ -3851,8 +4419,7 @@ enddef; % \end{macrocode} % -% \DescribeRoutine{plotsymbol} -% \DescribeRoutine{colorplotsymbol} +% \DescribeRoutine{plotsymbol}\RoutineIndex{colorplotsymbol} % These place a symbol centered at each of the graph % coordinate points in the list. The symbol placed is the first parameter, % which would normally be a path, but can be a picture or, in \MP, a @@ -3866,435 +4433,102 @@ enddef; % open path, if its first point is equal to its last point, and % \gbc{clearsymbols} is true, then the interior of the path obtained by % \gbc{\& cycle} is cleared before the path itself is drawn. +% We copy the text list to an array and call \gbc{dosymbols} so that +% \gbc{plotnodes}, \gbc{plotsymbol} and \gbc{showcontrols} can share the +% code. % % \DescribeRoutine{dosymbols} -% \DescribeRoutine{addsymbols} -% We copy the text list to an array and call \gbc{dosymbols} so that -% \gbc{plotnodes} can share the code. Also, since \gbc{dosymbols} uses -% identical code twice (once to clear, once to draw), we put that code -% in \gbc{addsymbols} +% \gbc{dosymbols} uses identical code twice (once to clear, once to draw), +% so we put that code in \gbc{addsymbols}. \DescribeRoutine{addsymbols} +% And finally, \gbc{addsymbols} draws copies of a symbol at a given array +% of points with a given color. % \begin{macrocode} -boolean clearsymbols; clearsymbols := false; +boolean clearsymbols; clearsymbols := false; vardef clearable (expr pth) = - false - if path pth : - if (not cycle pth) and (length pth > 0): - if ( pnt0 (pth) = pnt[length pth] (pth) ) : - or true - fi fi fi -enddef; - -def plotsymbol = colorplotsymbol (pointcolor) enddef; -vardef colorplotsymbol (expr clr, spath, sc) (text t) = - save _cpls; - textpairs (_cpls) (t); - dosymbols (clr, spath, sc) (_cpls); -enddef; - -vardef dosymbols (expr clr, spath, sc) (suffix arr) = - save one_symbol, _pls; picture one_symbol, _pls; - if clearsymbols and clearable (spath): - addsymbols (background, spath&cycle, sc) (arr); - fi - addsymbols (clr, spath, sc) (arr); -enddef; - -def addsymbols (expr clr, spath, sc) (suffix arr) = - one_symbol := makesymbol (spath, sc); - _pls := nullpicture; - for _idx = 1 upto arr: - picdot (_pls, one_symbol, zconv(arr[_idx])); - endfor - DoClip (_pls); -%<MF> mono (_pls); - coloraddto (clr) (active_plane) (_pls); -enddef; - -% \end{macrocode} -% -% -% \section{Modification of paths}\label{modification} -% -% \subsection{Closing a path}\label{closing} -% -% In \MF{} one can close a path by any legal path connection between the -% last point and the keyword \mfc{cycle}. Connecting the last point to the -% first point is not enough. \Grafbase{} commands provide a few different -% ways. All the closure commands have a version with a tension parameter -% when that makes sense. These version make the connection with the -% supplied tension. The ones where it doesn't make sense are \gbc{lclosed}, -% \gbc{cbclosed} and \gbc{qbclosed}. The first always uses a straight line -% and the other two require explicit controls. -% -% \DescribeRoutine{lclosed} -% This closes with a line segment. -% \begin{macrocode} -vardef lclosed expr f = f if not cycle f : --cycle fi enddef; - -% \end{macrocode} -% \DescribeRoutine{sclosed} -% \DescribeRoutine{sclosedt} -% This closes the path in the manner that \gbc{mksmooth} creates a path. -% This will change the first and last segment of the original path. In -% particular, if there are fewer than three segments, the whole path is -% different. -% \begin{macrocode} -numeric default_tension; -default_tension := 1; - -def sclosed = sclosedt (default_tension) enddef; -vardef sclosedt (expr t) expr f = - if cycle f : f - else: save n; n := length f; - if n = 0 : f&cycle - elseif n = 1 : f..tension t..cycle - else : - (pnt0 (f)) { (pnt1(f)) - (pnt[n] (f)) }..tension t - ..(subpath (1, n-1) of f)..tension t - ..(pnt[n](f)) { pnt0(f) - pnt[n-1](f) } - ..tension t..cycle - fi + if path pth: + ( pnt0 (pth) = pnt[length pth] (pth) ) and (not cycle pth) + and (length pth > 0) + else: false fi enddef; -% \end{macrocode} -% \DescribeRoutine{bclosed} -% This closes with the basic default \MF{} Bezi\'er. It is a smooth -% closure, but it does not have the same direction at the endpoints -% that \gbc{mksmooth (true)} would have produced. -% \begin{macrocode} -def bclosed = bclosedt (default_tension) enddef; -vardef bclosedt (expr t) expr f = - f if not cycle f : ..tension t..cycle fi -enddef; - -% \end{macrocode} -% \DescribeRoutine{uclosed} -% This is now just a renaming of \gbc{bclosed}. It turns out (contrary -% to my earlier belief) that just adding \mfc{..cycle} does \emph{not} -% change the original curve. \gbc{sclosed} will do that because it -% takes the curve apart and redoes its end segments. -% \begin{macrocode} -def uclosed = bclosed enddef; - -% \end{macrocode} -% \DescribeRoutine{bsplinecontrols} -% This utility is for use in \gbc{cbclosed}. It converts Bezier segment -% key points of a path \gbc{f}, to cubic B-spline control points stored -% in an array \gbc{b}. The data needed are the first point and first two -% control points of \gbc{f}. The B-spline points needed are \gbc{b1} and -% \gbc{b4}. The extra two points \gbc{b2} and \gbc{b3} divide the line -% from \gbc{b1} to \gbc{b4} into thirds and will be turned into Bezier -% control points of a new path segment. -% \begin{macrocode} -def bsplinecontrols (suffix b) expr f = - b := 4; - b1 := 2[pre 1(f), post0(f)]; - b2 := 2[post0(f), pnt 0(f)]; - b3 := 2[b1, b2]; - b4 := 2[b2, b3]; +def clearopenpath expr f = + if clearable (f): safeunfill f & cycle; fi enddef; -% \end{macrocode} -% -% \DescribeRoutine{cbclosed} -% This closes a path with a cubic B-spline. If the path \gbc{f} had been -% produced by \gbc{opencbs}, then \gbc{q1} and \gbc{q4} would have been the -% last two points in the argument list, and \gbc{p4} and \gbc{p1} would -% have been the first two. We just use them and mimic the effect of -% \gbc{closedcbs}. -% \begin{macrocode} -vardef cbclosed expr f = - if cycle f : f - elseif (length f)=0 : f&cycle - else: - save p, q; pair p[], q[]; - bsplinecontrols (p) f; % defines p1 to p4 - bsplinecontrols (q) reverse f; % defines q1 to q4 - f..controls q2 and q3..opencbs (q1,q4,p4,p1) - ..controls p3 and p2..cycle +def plotsymbol = colorplotsymbol (pointcolor) enddef; +def colorplotsymbol (expr clr, spath, sc) (text t) = + if sc > 0: + begingroup + setpairs (_cpls) (t); + if _cpls > 0: dosymbols (clr, spath, sc) (_cpls); fi + endgroup fi enddef; -% \end{macrocode} -% -% \DescribeRoutine{qbclosed} -% It seems wrong to be able to close with a cubic B-spline but not a -% quadratic B-spline. Therefore I will add such a possibility. We -% calculate B-spline controls \gbc{p[n]} that will agree with those of -% \gbc{f}, if \gbc{f} had been created as a quadratic B-spline. Note -% that \gbc{cbclosed} required three \MF{} links to close the curve; -% \gbc{qbclosed} only requires two. -% \begin{macrocode} -vardef qbclosed expr f = - if cycle f : f - else: save n; n := length f; - if n = 0 : f&cycle - else: - save p; pair p[]; p := 4; - p1 := (3/2)[pnt[n](f), pre[n](f)]; - p2 := 2[p1, pnt[n](f)]; - p4 := (3/2)[pnt 0 (f), post0 (f)]; - p3 := 2[p4, pnt 0 (f)]; - f & mkqbs (p) & cycle - fi +def dosymbols (expr clr, spath, sc) (suffix arr) = + if clearsymbols and clearable (spath): + addsymbols (background, makesymbol (spath&cycle, sc)) (arr); fi + addsymbols (clr, makesymbol (spath, sc)) (arr); enddef; -% \end{macrocode} -% -% \DescribeRoutine{makesector} -% This makes sense only if the path being modified is an arc. It closes -% the arc by connecting its ends to the center of the circle, as -% computed by \gbc{pathcenter}. -% \begin{macrocode} -vardef makesector expr p = - (pathcenter p)--p--cycle -enddef; - -% \end{macrocode} -% \subsection{Trimming a path}\label{trimming} -% -% \DescribeRoutine{cutoffbefore} -% \DescribeRoutine{cutoffafter} -% This is a useful utility operation present in \file{plain.mp} but -% missing from \file{plain.mf}. We write a different version for our -% purposes; it has the syntax of most of our path modification -% commands. Plus, the first loop tries to avoid a bug (or perhaps -% inaccuracy) in \mfc{intersectiontimes} which can return an intersection -% time in a later segment of \gbc{f} than the first intersection point. -% If I can learn the actual method used to find intersection times, I'll -% put in some \mfc{solve} code to get the first \gbc{t} rather than the -% minimal `shuffled binary' of the pair \gbc{w}. -% \begin{macrocode} -%<MF>path cuttings; -vardef cutoffbefore (expr b) expr f = - save w, t, u, n; n:= length f; - pair w; - for k = 1 upto n : - w := (subpath (0,k) of f) intersectiontimes b; - exitif w > left; +def addsymbols (expr clr, symb) (suffix arr) = + newpicture (_pls); + for _idx = 1 upto arr: + picdot (_pls, symb, zconv (arr[_idx])); endfor - if debug : - GBdebug; - >> "Intersectiontimes:"; - show w; - GBenddebug; - fi - t := xpart w; - if t < 0: - cuttings := pnt0 (f); - f - else: - cuttings := subpath (0,t) of f; - subpath (t, n) of f - fi -enddef; - -vardef cutoffafter (expr b) expr f = - save g; path g; - g := cutoffbefore (b) reverse f; - cuttings := reverse cuttings; - reverse g -enddef; - -% \end{macrocode} -% -% \DescribeRoutine{trimmedpath} -% This takes two lengths and a path and trims off the ends of the path -% that lie within the given lengths of the endpoints. The lengths are in -% device coordinates, the path in graph coordinates. -% \begin{macrocode} -vardef trimmedpath (expr btrim, etrim) expr f = - save g, h; path g, h; - g := invvconv (fullcircle scaled 2btrim) shifted pnt0(f); - h := invvconv (fullcircle scaled 2etrim) shifted pnt[length f] (f); - cutoffafter (h) cutoffbefore (g) f + DoClip (_pls); coloraddon (clr, _pls); enddef; % \end{macrocode} % -% \subsection{Appending an arrowhead} -% -% -% \DescribeRoutine{predirection} -% \DescribeRoutine{postdirection} -% \DescribeRoutine{__dir} -% First, some better \mfc{direction} commands. They makes use of the fact -% (easily proved) that a cubic B\'ezier $z\sb0(1 - t)^3 + 3z\sb1(1-t)^2t + -% z\sb2(1-t)t^2 + z\sb3t^3$ has a direction at $z\sb0$ equal to the first -% one of $z\sb{j} -z\sb0$ that is nonzero. -% -% \gbc{__dir} gets the direction at point 0 for an arbitrary path. -% \gbc{postdirection} reduces to this case using \mfc{subpath}. If the -% postdirection is 0, that means the path is trivial from that point to -% the end so we are effectively at an endpoint (noncyclic path) and we use -% the incoming direction. \gbc{predirection} just runs -% \gbc{postdirection} on the reversed path. +% \DescribeRoutine{putimage} +% This is designed to allow \mfpic{} users to make a picture (created with +% \cs{mfpimage} or \cs{tile} perhaps), and put a copy at several +% locations. This allows more complex things than \cs{plotsymbol} and +% more flexibility than \cs{tess}. As the picture is should be completely +% prepared in advance, there is no color or size parameter. Moreover, +% \gbc{pic} might be quite complex, so we don't use \gbc{picdot} which +% takes the added picture as an expression, but rather repeat its code. +% The indirection of adding to \gbc{_pti} is normal when we want to +% respect clipping without clipping what is already drawn. Saving memory +% at some sacrifice of speed, we clip and reset with each addition. (It is +% uncertain whether adding multiple clipped pictures includes the clipping +% path for each addition. I'll have to test the memory use of this code +% versus adding all the copies to \gbc{_pti} and clipping once.) % \begin{macrocode} -vardef predirection@# (expr p) = - - postdirection[length p - @#] (reverse p) -enddef; - -vardef postdirection@# (expr p) = - save _n; _n := length (p); - save v; pair v; v := __dir (subpath (@#, @# + _n) of p); - if v = origin : - v := - __dir (subpath (@#, @# - _n) of p); - fi - v -enddef; - -vardef __dir (expr p) = - save v, w; pair v, w; w := pnt0 (p); - v := origin; - for n = 1 upto length (p) : - v := post[n-1] (p) - w; - if v = origin : - v := pre[n] (p) - w; - if v = origin : - v := pnt[n] (p) - w; - fi - fi - exitif v <> origin; +def putimage (suffix pic) (text t) = + newpicture (_pti); + for _itm = t: + addto _pti also +%<MF> (pic shifted goodpair (zconv (_itm))); +%<MP> (pic shifted zconv (_itm)); + DoClip (_pti); addto active_plane also _pti; + _pti := nullpicture; endfor - v -enddef; - -% \end{macrocode} -% -% Arrowheads can be just two straight lines at an angle placed on the end -% of a curve, or it can be a filled triangle. \grafbase{} permits both, -% but it also allows the two lines (or the corresponding sides of the -% triangle) to be gracefully concave and tangent to the path at the -% endpoint of the path. The parameters controlling the shape of the arrowhead -% are the two numerics \gbc{hdwdr}, the ratio of the length to width of the -% arrowhead, and \gbc{hdten}, the tension in the two angled curves. By -% default, one side of an arrowhead is just the \MF{} path -% \mfc{a..b\marg{\meta{tangent}}}, where \mfc{a} is the base of the -% arrowhead (calculated from \gbc{hdwdr}) and \gbc{b} is the end of the -% path and \meta{tangent} is the direction of the curve at that -% point. The curve can be straightened by increasing \gbc{hdten}, the -% head widened by increasing \gbc{hdwdr} -% -% The arrowhead is drawn by drawing two of the curves described above. If -% \gbc{hfilled} is \mfc{true}, the two base points (\gbc{a} above) are -% connected and the three sided region filled. -% \begin{macrocode} -newinternal hdwdr, hdten; -interim hdwdr := 1; interim hdten := 1; -boolean hfilled; hfilled := false; - -% \end{macrocode} -% -% \DescribeRoutine{headshape} -% The following little utility adjusts the above parameters, call it -% with two pure numbers \gbc{wr} and \gbc{tens} for the \gbc{hdwdr} and -% \gbc{hdten}, and a boolean \gbc{fil} for \gbc{hfilled}. -% \begin{macrocode} -def headshape (expr wr, tens, fil) = - interim hdwdr := wr; interim hdten := tens; - save hfilled; boolean hfilled; hfilled := fil; -enddef; - -% \end{macrocode} -% -% \DescribeRoutine{ahead} -% \DescribeRoutine{colorhead} -% This command draws an arrowhead. \gbc{front} and \gbc{back} are in -% device coordinates. They are the point of the arrowhead (\gbc{front}) -% and the point such that \gbc{front - back} points in the direction of -% the arrow. We use the ratio \gbc{hwr} to compute the other two -% corners. So \gbc{side} is the vector from \gbc{back} to one of the -% corners \gbc{p1}, and the other corner is on the other side. \gbc{f} -% is the path of the arrowhead. -% -% If \gbc{filled} is true we close the curve and fill it, otherwise we -% draw it. \gbc{clr} is the color used to draw or fill it. -% -% For backward compatibility we define \gbc{head}. In \MF{} \gbc{head} -% didn't have a color parameter, while in \MP{} it has always had one, -% in retrospect, this was not a good idea, and we should have followed -% the pattern of other macros. However, \gbc{head} was never a user-level -% macro and I didn't think it mattered. -% \begin{macrocode} -%<MF>def head = ahead (headcolor) enddef; -%<MP>def head = ahead enddef; - -vardef ahead (expr clr, front, back, hwr, tens, filled) = - if front <> back : - save side; pair side; - side := (hwr/2) * ((front-back) rotated 90); - save f; path f; - f := (back + side)..tension tens.. - {front-back}front{back-front}..tension tens.. - (back - side) - if filled : --cycle; colorsafefill (clr) f fi; - colorsafedraw (clr) f; - fi -enddef; - -% \end{macrocode} -% -% It is a fact of life that, unless the path to which the head is added is -% a straight line, the above described arrowhead looks ``off''. But I know -% of no automatic way of making it look good. Therefore \grafbase{} and -% \mfpic{} have provided a means to micro-adjust the head. (Actually, I -% think the best looking arrowhead for small heads and paths of modest -% curvature is obtained by taking a secant for the direction of the head -% head rather than a tangent.) -% -% \DescribeRoutine{headpath} -% \DescribeRoutine{colorheadpath} -% This takes a path expression \gbc{f} in graph coordinates, puts an -% arrowhead on it and returns \gbc{f}. The arrowhead is placed according -% to the first four parameters. \gbc{hlen} is the length of the head in -% device coordinates, the width being determined by \gbc{hdwdr}, and -% and \gbc{hrot} is a rotation adjustment. \gbc{hback} is a distance (in -% device coordinates) by which it is set back from the point of placement. -% It is set back in the direction determined after the rotation. -% -% If the length of the head is 0, we just skip everything and return -% \gbc{f}. -% -% \gbc{headpath} calls \gbc{colorheadpath} with the color set to -% \gbc{headcolor}. -% \begin{macrocode} -def headpath = colorheadpath (headcolor) enddef; -vardef colorheadpath (expr clr, hlen, hrot, hback) expr f = - if hlen <> 0 : - save g; path g; g := zconv (f); - save P; pair P[]; - P2 := pnt[length g] (g); - P1 := predirection[length g] (g); - if P1 <> (0, 0) : - P3 := (unitvector P1) rotated hrot; - P4 := P2 - (hback * P3); - P5 := P4 - (hlen * P3); - ahead (clr, P4, P5, hdwdr, hdten, hfilled); - fi - fi - f +%<MF> mono active_plane enddef; % \end{macrocode} % -% \section{Axes, Axis Tic Marks, and Grids} +% \section{Axes, Tic Marks, and Grids}\label{axes} % % \DescribeRoutine{arrowdraw} -% This is used elsewhere only to draw axes. It returns nothing. This -% doesn't follow the usual pattern of drawing something and returning the -% same path. This makes the old \cs{axes}, \cs{xaxis} and \cs{yaxis} +% This is used in \gbc{vectorfield} and to draw axes. It returns nothing. +% This doesn't follow the usual pattern of drawing a path and returning +% it. This approach makes the old \cs{axes}, \cs{xaxis} and \cs{yaxis} % commands in \mfpic{} impossible to dash or dot. The newer axis drawing % commands permit this and so use other code. % % We simply call \gbc{headpath} with default values, but add \gbc{drawn} % to make sure the path is drawn, and precede it with \gbc{store} so -% \MF{} won't complain of an isolated expression. The new axis commands -% just call \gbc{headpath}, and the \mfpic{} code makes sure it is drawn, -% but it can also be \gbc{dashed}, \gbc{dotted}, and \gbc{doplot}\,ed. +% \MF{} won't complain of an isolated expression. The new \mfpic{} +% method of drawing an axis is to apply \cs{arrow} to the path +% \gbc{axisline}. Thus it can also be \gbc{dashed}, \gbc{dotted}, +% etc. % -% The order is important if axis and head are different colors. This +% The order is significant if axis and head are different colors. This % order puts the head on top of the shaft. % \begin{macrocode} def arrowdraw (expr hlen) (expr f) = @@ -4304,16 +4538,19 @@ enddef; % \end{macrocode} % % \DescribeRoutine{xaxis} -% \DescribeRoutine{yaxis} +% \gbc{xaxis} draws the $x$-axis through the point $(0,0)$ in graph +% coordinates. The only parameter is the length of the arrowhead in device +% coordinates. +% \DescribeRoutine{yaxis}\gbc{yaxis} draws the $y$-axis. +% % \DescribeRoutine{axes} -% These draw the obvious things: the corresponding axis or axes through -% the point (0, 0) in graph coordinates. The only parameter is the length -% of the arrowhead in device coordinates. \gbc{axes} draws both axes with -% the same length of head. +% \gbc{axes} draws both axes with the same length of head. % \begin{macrocode} -def xaxis (expr hlen) = arrowdraw (hlen) ((xneg, 0)--(xpos, 0)); enddef; -def yaxis (expr hlen) = arrowdraw (hlen) ((0, yneg)--(0, ypos)); enddef; -def axes (expr hlen) = xaxis (hlen); yaxis (hlen); enddef; +def xaxis (expr hlen) = arrowdraw (hlen) ((xneg, 0)--(xpos, 0)); +enddef; +def yaxis (expr hlen) = arrowdraw (hlen) ((0, yneg)--(0, ypos)); +enddef; +def axes (expr hlen) = xaxis (hlen); yaxis (hlen); enddef; % \end{macrocode} % @@ -4322,35 +4559,32 @@ def axes (expr hlen) = xaxis (hlen); yaxis (hlen); enddef; % the left side axis, \gbc{baxis} for the bottom axis, etc. They are in % graph coordinates. % -% \DescribeRoutine{axisline.x} -% \DescribeRoutine{axisline.y} -% \DescribeRoutine{axisline.l} -% \DescribeRoutine{axisline.b} -% \DescribeRoutine{axisline.r} -% \DescribeRoutine{axisline.t} -% The commands \gbc{axisline.l}, etc., return the straight line along the -% corresponding edge shifted the appropriate amount. These are vardefs -% rather than variables so they can be affected by changing shift values. +% \DescribeRoutine{axisline} +% The commands \gbc{axisline.x}, etc., return the appropriate straight +% line at the appropriate location. These are vardefs rather than +% variables so they can be affected by changing shift values. % % \DescribeRoutine{axis} % Finally, the commands \gbc{axis.x}, etc. examine their suffix and % apply \gbc{headpath} to the corresponding axis line. With a recent -% change in \mfpic{} code, it no longer gets used, as we now simply apply -% \cs{arrow} to the appropriate \gbc{axisline}. The change was made for -% consistency: so that the head would be drawn on top of the shaft. +% change in \mfpic{} code, it is no longer used there. Instead, code +% is written that allows the head to be drawn after the line is. +% Note it is a vardef, and so returns the line as a path.. % \begin{macrocode} laxis := baxis := raxis := taxis := 0; -vardef axisline.x = (xneg + laxis, 0)--(xpos - raxis, 0) enddef; -vardef axisline.y = (0, yneg + baxis)--(0, ypos - taxis) enddef; -vardef axisline.l = axisline.y shifted (xneg + laxis, 0) enddef; -vardef axisline.b = axisline.x shifted (0, yneg + baxis) enddef; -vardef axisline.r = axisline.y shifted (xpos - raxis, 0) enddef; -vardef axisline.t = axisline.x shifted (0, ypos - taxis) enddef; -vardef axis@# (expr len) = - headpath (len, 0, 0) axisline@# -enddef; +vardef axisline.x = (xneg + laxis, 0)--(xpos - raxis, 0) enddef; +vardef axisline.y = (0, yneg + baxis)--(0, ypos - taxis) enddef; +vardef axisline.l = axisline.y shifted (xneg + laxis, 0) enddef; +vardef axisline.b = axisline.x shifted (0, yneg + baxis) enddef; +vardef axisline.r = axisline.y shifted (xpos - raxis, 0) enddef; +vardef axisline.t = axisline.x shifted (0, ypos - taxis) enddef; + +vardef axis@# (expr len) = headpath (len, 0, 0) axisline@# enddef; +vardef borderrect = + rect((xneg+laxis,yneg+baxis),(xpos-raxis,ypos-taxis)) +enddef; % \end{macrocode} % % Tick marks can be on the inside or outside of a border axis, @@ -4381,7 +4615,7 @@ ontop := onleft; % \end{macrocode} % % We interact with \mfpic{} by allowing the user to change the value of -% \gbc{ltick}, for example, with a command like \ +% \gbc{ltick}, for example, with a command like % \cs{setaxismarks l}\marg{outside}. Here we set the defaults. % \begin{macrocode} ltick := rtick := ttick := btick := inside; @@ -4395,13 +4629,14 @@ xtick := ytick := centered; % values of these parameters. % \begin{itemize} % \item \gbc{inang} is the direction one must rotate the axis to point -% inside. This is always $\pm90$ degrees. The x-axis and y-axis are -% treated just like bottom and left axis in this respect. +% inside. This is always $\pm90$ degrees. The $x$-axis and $y$-axis +% are treated just like bottom and left axis in this respect. % \item \gbc{tp} is the tick position (e.g., \gbc{inside} or % \gbc{ontop}). % \item \gbc{loc} is the location of the 0-point of the axis (graph % coordinates). -% \item \gbc{pdir} is the positive direction on the axis (right or up). +% \item \gbc{pdir} is \mfc{right} or \mfc{up}, indicating the positive +% direction on the axis. % \item \gbc{len} is the length of a tick mark, supplied as an argument % to the individual axis mark commands. % \item \gbc{t} is the list of positions, also supplied. @@ -4409,7 +4644,7 @@ xtick := ytick := centered; % \begin{macrocode} vardef axismarks (expr inang, tp, loc, pdir) (expr len) (text t) = save _tp, _U, _P, _tic, _ticang; - pair _U, _P, _tic[]; + pair _U, _P; path _tic; % \end{macrocode} % For \gbc{onleft}, \gbc{onright}, \gbc{ontop} or \gbc{onbottom}, which % are positive, don't examine \gbc{inang} but for \gbc{inside/outside} @@ -4419,7 +4654,7 @@ vardef axismarks (expr inang, tp, loc, pdir) (expr len) (text t) = % Then we shift the numeric value of \gbc{tp} by one, so \gbc{centered} % corresponds to $.5$ and the rest to either $0$ or $1$. % \begin{macrocode} - _ticang := if tp<0 : inang else: 90 fi; + _ticang := if tp < 0: inang else: 90 fi; _tp := abs(tp) - 1; % \end{macrocode} % Except, we go through the following shenanigans so that the marks are @@ -4429,121 +4664,174 @@ vardef axismarks (expr inang, tp, loc, pdir) (expr len) (text t) = % \begin{macrocode} _U := unitvector (vconv (pdir)) rotated _ticang; % \end{macrocode} -% Next, we use \gbc{_tp} to calculate the ends of the mark. For example, -% if \gbc{tp = inside}, then \gbc{_tp = 1}. Since \gbc{_U} points toward -% inside, \gbc{_tic2} will be \gbc{len} toward the inside and \gbc{_tic1 = -% (0, 0)}. +% Next, we use \gbc{_tp} to calculate the mark. For example, if +% \gbc{tp = inside}, then \gbc{_tp = 1}. Since \gbc{_U} points toward +% inside, \gbc{_tic} will go from \mfc{(0,0)} to a point a distance +% \gbc{len} in the direction of \gbc{_U}. % \begin{macrocode} - _tic1 := (_tp - 1) * len * _U; % start of mark - _tic2 := _tp * len * _U; % end of mark + _tic := (-_U--(0,0)) shifted (_tp*_U) scaled len; % \end{macrocode} -% Finally, convert each numeric position to a point on the axis, a -% multiple of \gbc{pdir} from the 0 point of the axis, and than draw the -% tic. +% Finally, for each numeric value in the list \gbc{t}, draw the tic +% shifted to the corresponding point on the axis. % \begin{macrocode} for _a = t: - safedraw ((_tic1--_tic2) shifted zconv (loc + _a*pdir)); + safedraw (_tic shifted zconv (loc + _a*pdir)); endfor enddef; % \end{macrocode} % % \DescribeRoutine{xmarks} -% \DescribeRoutine{ymarks} -% \DescribeRoutine{lmarks} -% \DescribeRoutine{bmarks} -% \DescribeRoutine{rmarks} -% \DescribeRoutine{tmarks} +% \RoutineIndex{lmarks} +% \RoutineIndex{bmarks} +% \RoutineIndex{rmarks} +% \RoutineIndex{tmarks} % And now the specialized command for each axis. Inside and outside -% really make no sense for the x- and y-axis, but since a bottom axis is -% usually used for x and a left axis for y, we give \gbc{xmarks} the same -% first parameter as \gbc{bmarks} and \gbc{ymarks} the same as \gbc{lmarks}. +% really make no sense for the $x$- and \DescribeRoutine{ymarks}$y$-axis, +% but since a bottom axis is usually used for $x$ and a left axis for $y$, +% we give \gbc{xmarks} the same first parameter as \gbc{bmarks} and +% \gbc{ymarks} the same as \gbc{lmarks}. % \begin{macrocode} -def xmarks = axismarks ( 90, xtick, (0, 0), right) enddef; -def ymarks = axismarks (-90, ytick, (0, 0), up) enddef; +def xmarks = axismarks ( 90, xtick, origin, right) enddef; +def ymarks = axismarks (-90, ytick, origin, up) enddef; def lmarks = axismarks (-90, ltick, (xneg + laxis, 0), up) enddef; -def bmarks = axismarks ( 90, btick, (0, yneg + baxis), right) enddef; +def bmarks = axismarks ( 90, btick, (0, yneg + baxis), right) enddef; def rmarks = axismarks ( 90, rtick, (xpos - raxis, 0), up) enddef; -def tmarks = axismarks (-90, ttick, (0, ypos - taxis), right) enddef; +def tmarks = axismarks (-90, ttick, (0, ypos - taxis), right) enddef; % \end{macrocode} % -% \DescribeRoutine{vgrid} -% \DescribeRoutine{grid} -% This is mainly for the purpose of visualising coordinates. \gbc{vgrid} +% \DescribeRoutine{vargrid, vgrid} +% Mainly for the purpose of visualising coordinates, \gbc{vargrid} % draws a dot of size \gbc{dsize} at every point whose coordinates -% are are \gbc{(n*xspace, m*yspace)}, \gbc{n} and \gbc{m} being integers. +% are are \gbc{(n*xsp, m*ysp)}, \gbc{n} and \gbc{m} being integers. % \gbc{dsize} is in device coordinates, the spacings are in graph -% coordinates. \gbc{grid} is for backward compatibility, calling vgrid -% with a default \gbc{dsize} of \mfc{.5bp}. -% -% \begin{macrocode} -path griddotpath; griddotpath := fullcircle; -def grid = vgrid (0.5bp) enddef; -vardef vgrid (expr dsize, xspace, yspace) = - save gdot, gridpic; picture gdot, gridpic; +% coordinates. \DescribeRoutine{grid}\gbc{grid} is for backward +% compatibility, calling \gbc{vargrid} with a default \gbc{dsize} of +% \mfc{.5bp}. The old name \gbc{vgrid} incorrectly suggests a +% connection to \gbc{vgridlines}. +% \begin{macrocode} +path griddotpath; griddotpath := fullcircle; +def grid = vargrid (0.5bp) enddef; +vardef vargrid (expr dsize, xsp, ysp) = + save gdot, gridpic; picture gdot, gridpic; gdot := setdot (griddotpath, dsize); gridpic := nullpicture; - for n = ceiling(xneg/xspace) upto floor(xpos/xspace): - for m = ceiling(yneg/yspace) upto floor(ypos/yspace): - picdot (gridpic, gdot, zconv((n*xspace, m*yspace))); + for n = ceiling ((xneg + laxis)/xsp) upto floor ((xpos - raxis)/xsp): + for m = ceiling ((yneg + baxis)/ysp) upto floor ((ypos - taxis)/ysp): + picdot (gridpic, gdot, zconv ((n*xsp, m*ysp))); endfor endfor -%<MF> mono (gridpic); - coloraddto (pointcolor) (active_plane) (gridpic); + coloraddon (pointcolor, gridpic); enddef; +def vgrid = vargrid enddef; % \end{macrocode} % -% \DescribeRoutine{hgridlines} -% \DescribeRoutine{vgridlines} -% \DescribeRoutine{gridlines} -% This is more what I think of when I hear ``grid'', but the name was already -% taken. \gbc{gridlines} draws horizontal and vertical lines through the -% same points where \gbc{grid} would draw a dot. To draw only horizontal -% or only vertical lines use \gbc{hgridlines} or \gbc{vgridlines}. +% This is more what I think of when I hear `grid', but the name was +% already taken. \DescribeRoutine{hgridlines}\gbc{hgridlines} draws +% horizontal lines through the same points where \gbc{grid} would draw +% dots, and \DescribeRoutine{vgridlines}\gbc{vgridlines} draws only +% vertical lines through the same points. Finally, +% \DescribeRoutine{gridlines}\gbc{gridlines} draws both. % \begin{macrocode} def hgridlines (expr ysp) = - for n = ceiling((yneg + baxis)/ysp) upto floor((ypos - taxis)/ysp) : - safedraw zconv((xneg + laxis, n*ysp)--(xpos - raxis, n*ysp)); + for n = ceiling ((yneg + baxis)/ysp) upto floor ((ypos - taxis)/ysp): + safedraw zconv ((xneg + laxis, n*ysp)--(xpos - raxis, n*ysp)); endfor enddef; def vgridlines (expr xsp) = - for n = ceiling((xneg + laxis)/xsp) upto floor((xpos - raxis)/xsp) : - safedraw zconv((n*xsp, yneg + baxis)--(n*xsp, ypos - taxis)); + for n = ceiling ((xneg + laxis)/xsp) upto floor ((xpos - raxis)/xsp): + safedraw zconv ((n*xsp, yneg + baxis)--(n*xsp, ypos - taxis)); endfor enddef; def gridlines (expr xsp, ysp) = - vgridlines (xsp); hgridlines (ysp); + vgridlines (xsp); hgridlines (ysp); +enddef; + +% \end{macrocode} +% +% \DescribeRoutine{vectorfield} This command produces a field of arrows +% from a pair-valued formula (text parameter \gbc{fcn}) in a region +% described by a boolean-valued expression (text parameter \gbc{cond}). +% This routine simply makes functions (\mfc{vardef}\,s) out of the +% expressions and calls \DescribeRoutine{mkvectorfield} +% \gbc{mkvectorfield}, which steps through the points described by +% \gbc{xsp} and \gbc{ysp} and places an arrow (actually, any path) at +% each. The arrow path is given by the function \gbc{vf}. The arrow is placed +% at the point only if the function \gbc{isOK} returns true. It also omits +% points that lie in the axis margins. +% +% \DescribeRoutine{plrvectorfield} The polar version differs only in +% the distribution of the arrows. They are placed at regular intervals +% of $r$ an $\theta$. The text parameters should be expressions in +% \gbc{r} and \gbc{t}, but are otherwise the same. In particular, +% \gbc{fcn} should return \MF{} pairs, not polar coordinate pairs. The +% function \gbc{polar} can be used to convert if necessary. Its code is +% very similar, except for the boolean code needed to keep the +% vectors within the bounds of the graph. +% \DescribeRoutine{mkplrvectorfield} It calls \gbc{mkplrvectorfield}, +% which is a lot like the non-polar version, except it first calculates +% the extremes of the polar variables with \gbc{getpolarbounds} and relies +% on the boolean to keep it out of the axis margins. +% \begin{macrocode} +def vectorfield (expr len, xsp, ysp) (text fcn) (text cond) = + save _vf, _is_OK; + vardef _vf (expr x,y) = ((0,0)--(fcn)) shifted (x,y) enddef; + vardef _is_OK (expr x,y) = cond enddef; + mkvectorfield (len, xsp, ysp) (_vf, _is_OK); +enddef; + +vardef mkvectorfield (expr len, xsp, ysp) (suffix vf, isOK) = + for n = ceiling ((xneg + laxis)/xsp) upto floor ((xpos - raxis)/xsp): + for m = ceiling ((yneg + baxis)/ysp) upto floor ((ypos - taxis)/ysp): + if isOK (n*xsp,m*ysp): arrowdraw (len) (vf(n*xsp,m*ysp)); fi + endfor + endfor +enddef; + +def plrvectorfield (expr len, rsp, tsp) (text fcn) (text cond) = + save _vf, _is_OK, _A, _B, _C, _D; + _A := xneg + laxis; _B := xpos + raxis; + _C := yneg + baxis; _D := ypos + taxis; + vardef _vf (expr r,t) = ((0,0)--(fcn)) shifted (r*dir t) enddef; + vardef _is_OK (expr r,t) = + save _X, _Y; _X := r*cosd t; _Y := r*sind t; + (cond) and (_A < _X) and (_X < _B) and (_C < _Y) and (_Y < _D) + enddef; + mkplrvectorfield (len, rsp, tsp) (_vf, _is_OK); +enddef; + +vardef mkplrvectorfield (expr len, rsp, tsp) (suffix vf, isOK) = + save rmin, rmax, tmin, tmax; + getpolarbounds; + if rmin = 0: + if isOK (0,tmin): arrowdraw (len) (vf (0,tmin)); fi + rmin := rsp; + fi + for n = ceiling (rmin/rsp) upto floor (rmax/rsp): + for m = ceiling (tmin/tsp) upto floor (tmax/tsp): + if isOK (n*rsp,m*tsp): arrowdraw (len) (vf (n*rsp,m*tsp)); fi + endfor + endfor enddef; % \end{macrocode} % -% \DescribeRoutine{plrpatch} % \DescribeRoutine{patcharcs} -% \DescribeRoutine{patchrays} -% Polar grids can be drawn two ways. \gbc{patcharcs} draws the arcs -% \gbc{tstart}${}\le \theta \le{}$\gbc{tstop} with $r = {}$\gbc{rstart}, -% stepping by \gbc{rstep} until \gbc{rstop}. \gbc{patchrays} draws the lines -% \gbc{rstart}${}\le r \le{}$\gbc{rstop} with $\theta = {}$\gbc{tstart} -% stepping by \gbc{tstep} until \gbc{tstop}. \gbc{plrpatch} then calls -% -% They are utilities that draw on a picture variable \gbc{X}, and then a -% calling command like \gbc{plrpatch} adds them to \gbc{active_plane}. -% \gbc{plrpatch} used to be called by \gbc{polarpatch}, but now it is -% not called at all. -% \begin{macrocode} -vardef plrpatch (expr rstart, rstop, rstep, tstart, tstop, tstep) = - save v; picture v; v := nullpicture; - patcharcs (v) (rstart, rstop, rstep, tstart, tstop); - coloraddto (drawcolor) (active_plane, v); - v := nullpicture; - patchrays (v) (tstart, tstop, tstep, rstart, rstop); - coloraddto (drawcolor) (active_plane, v); -enddef; +% \gbc{patcharcs} draws on a picture \gbc{X} the arcs \gbc{tstart}${}\le +% \theta \le{}$\gbc{tstop} with radii starting at \gbc{rstart}, stepping +% by \gbc{rstep} until \gbc{rstop}. +% \DescribeRoutine{patchrays}\gbc{patchrays} draws the radial lines +% with $r$ coordinate varying between \gbc{rstart} and \gbc{rstop} at +% angles from \gbc{tstart} to \gbc{tstop} stepping by \gbc{tstep}. +% And \DescribeRoutine{plrpatch}\gbc{plrpatch} simply calls them both, +% and adds the resulting pictures to \gbc{active_plane}. +% \begin{macrocode} def patcharcs (suffix X) (expr rstart, rstop, rstep, tstart, tstop) = - for rad = (if rstart=0: rstep else: rstart fi) step rstep until rstop: - orto (X, picpath zconv (arcplr ((0, 0), tstart, tstop, rad)) ); + for rad = (if rstart = 0: rstep else: rstart fi) + step rstep until rstop: + orto (X, picpath zconv (arcplr (origin, tstart, tstop, rad)) ); endfor enddef; def patchrays (suffix X) (expr tstart, tstop, tstep, rstart, rstop) = @@ -4552,112 +4840,136 @@ def patchrays (suffix X) (expr tstart, tstop, tstep, rstart, rstop) = endfor enddef; +def plrpatch (expr rstart, rstop, rstep, tstart, tstop, tstep) = +begingroup + newpicture (v); + patcharcs (v) (rstart, rstop, rstep, tstart, tstop); + coloraddon (drawcolor, v); + v := nullpicture; + patchrays (v) (tstart, tstop, tstep, rstart, rstop); + coloraddon (drawcolor, v); +endgroup +enddef; + % \end{macrocode} % -% \DescribeRoutine{polargrid} -% \DescribeRoutine{polargridpoints} +% Polar coordinate grids are analogous to \gbc{gridlines} and \gbc{grid}. +% They first draw a grid large enough to cover the whole graph, then clip +% it to the graph boundaries. Since three of the four require +% calculating the dimensions of a polar coordinate patch that completely +% covers the graph rectangle, we isolate that code in +% \gbc{beginpolargrid}, defined later. +% +% % \DescribeRoutine{gridarcs} -% \DescribeRoutine{gridrays} -% These are analogous to \gbc{gridlines} and \gbc{grid}. They first draw a -% grid large enough to cover the whole graph, then clip it to the. graph -% boundaries. The arcs have radii that are multiples of \gbc{rstep} and -% radial lines have angles that are multiples of \gbc{tstep}. The command -% \gbc{polargridpoints} draws dots at the points where the lines and arcs -% in \gbc{poloargrid} would intersect. The `step' parameters are in graph -% coordinates. \gbc{beginpolargrid} computes the bounds for the patch and +% \gbc{gridarcs} creates arcs having radii that are integer multiples of +% \gbc{rstep} and \DescribeRoutine{gridrays}\gbc{gridrays} draws radial +% lines at angles that are multiples of \gbc{tstep}. The command +% \DescribeRoutine{polargrid}\gbc{polargrid}simply calls the first two. +% +% \DescribeRoutine{polargridpoints} +% On the other hand, \gbc{polargridpoints} draws dots at the points where +% the lines and arcs in \gbc{poloargrid} would intersect. The `step' +% parameters are in graph coordinates. \gbc{beginpolargrid} also % declares the picture variable \gbc{gridpic}, while \gbc{endpolargrid} % clips the resulting picture and adds it to \gbc{active_plane}. % -% The \gbc{rmin}, etc., returned are modified to fit the grid established -% by the step sizes. A ray could happen to be one of the graph's sides, so -% we use \mfc{ceiling} and \mfc{floor} which doesn't change integer -% values. However, the arc with radius \gbc{rmin} or \gbc{rmax} could -% touch the graph rectangle in at most 4 points, so we use \mfc{floor (1 -% + x)} and \mfc{ceiling(x - 1)} to start and stop before the edge of the -% graph. +% The \gbc{rmin}, etc., returned by \gbc{beginpolargrid} are modified to +% fit the grid established by the step sizes. A ray could happen to be one +% of the graph's sides, so we use \mfc{ceiling} and \mfc{floor} which +% doesn't change integer values. However, the arc with radius \gbc{rmin} +% or \gbc{rmax} could touch the graph rectangle in at most 4 points, so we +% use \mfc{floor (x + 1)} and \mfc{ceiling (x - 1)} to start and stop +% before the edge of the graph. % \begin{macrocode} -def polargrid (expr rstep, tstep) = - gridarcs (rstep); gridrays (tstep); -enddef; - -def polargridpoints (expr dsize, rstep, tstep) = - beginpolargrid; - save gdot; picture gdot; gdot := setdot (griddotpath, dsize); - if rmin = 0: - picdot (gridpic, gdot, zconv(origin)); - rmin := rstep; - fi - for n = ceiling (rmin/rstep) upto floor (rmax/rstep) : - for m = ceiling (tmin/tstep) upto floor (tmax/tstep) : - picdot ( gridpic, gdot, zconv ( polar((n*rstep, m*tstep)) ) ); - endfor - endfor - endpolargrid (pointcolor, .5dsize); -enddef; - def gridarcs (expr rstep) = beginpolargrid; - if rmin = 0 : % add "circle" of radius 0 - picdot (gridpic, setdot(griddotpath, penwd), zconv(origin)); + if rmin = 0: + picdot (gridpic, setdot (griddotpath, penwd), zconv (origin)); fi - rmin := rstep * floor(rmin/rstep + 1); - rmax := rstep*ceiling(rmax/rstep - 1); + rmin := rstep * floor (rmin/rstep + 1); + rmax := rstep * ceiling (rmax/rstep - 1); patcharcs (gridpic) (rmin, rmax, rstep, tmin, tmax); endpolargrid (drawcolor, .5penwd); enddef; def gridrays (expr tstep) = beginpolargrid; - tmin := tstep*ceiling(tmin/tstep); - tmax := tstep * floor(tmax/tstep); + tmin := tstep * ceiling (tmin/tstep); + tmax := tstep * floor (tmax/tstep); patchrays (gridpic) (tmin, tmax, tstep, rmin, rmax); endpolargrid (drawcolor, .5penwd); enddef; +def polargrid (expr rstep, tstep) = + gridarcs (rstep); gridrays (tstep); +enddef; + +def polargridpoints (expr dsize, rstep, tstep) = + beginpolargrid; + setpicture (gdot) setdot (griddotpath, dsize); + if rmin = 0: + picdot (gridpic, gdot, zconv (origin)); + rmin := rstep; + fi + for n = ceiling (rmin/rstep) upto floor (rmax/rstep): + for m = ceiling (tmin/tstep) upto floor (tmax/tstep): + picdot ( gridpic, gdot, zconv ( polar ((n*rstep, m*tstep)) ) ); + endfor + endfor + endpolargrid (pointcolor, .5dsize); +enddef; + % \end{macrocode} % \DescribeRoutine{beginpolargrid} -% This computes the bounds (on $r$ and $\theta$) of the smallest polar -% coordinate patch that covers the graph rectangle. It leaving the values -% in \gbc{rmin}, \gbc{rmax}, \gbc{tmin} and \gbc{tmax}. It is only for use -% in \gbc{polargrid}, \gbc{gridarcs} and \gbc{gridrays}. +% This calls \gbc{getpolarbounds} to compute the bounds (on $r$ and +% $\theta$) of the smallest polar coordinate patch that covers the graph +% rectangle. \DescribeRoutine{getpolarbounds}That command leaves the values +% in \gbc{rmin}, \gbc{rmax}, \gbc{tmin} and \gbc{tmax}. Then it +% initializes \gbc{gridpic} whereon the grids are drawn. % \begin{macrocode} def beginpolargrid = - begingroup; - save p, r, t, rmax, rmin, tmax, tmin; +begingroup; + save rmax, rmin, tmax, tmin; + getpolarbounds; + newpicture (gridpic); +enddef; + +def getpolarbounds = + save p, r, t; pair p[]; - % Four corners: - p0 := (xneg, yneg); p1 := (xneg, ypos); - p2 := (xpos, ypos); p3 := (xpos, yneg); + p0 := (xneg, yneg); p1 := (xneg, ypos); + p2 := (xpos, ypos); p3 := (xpos, yneg); % \end{macrocode} % This loop finds the radial coordinate of each corner of the graph and % finds the maximum while doing so. % \begin{macrocode} - r0 := abs(p0); rmax := r0; - for j = 1 upto 3 : + r0 := abs(p0); rmax := r0; + for j = 1 upto 3: r[j] := abs(p[j]); - if rmax < r[j] : rmax := r[j]; fi + if rmax < r[j]: rmax := r[j]; fi endfor % \end{macrocode} % When the origin is inside the graph rectangle we need the full range % of $r$ and $\theta$. When the origin is one of the corners, the angles % can just be read off. Otherwise, to find the range of $\theta$ we -% rotate one corner to have angle zero (so now we are guaranteed all -% angles are between $-180$ and $180$) and get the largest and smallest of -% the angles to all the corners. +% essentially rotate one corner to have angle zero, get the angles to all +% corners and rotate back. This guarantees that the wedge with +% \gbc{tmin}${} < \theta < {}$\gbc{tmax} includes the graph. % \begin{macrocode} rmin := 0; - if (xneg < 0) and (xpos > 0) and (yneg < 0) and (ypos > 0) : - tmin := 0; tmax := 360; - elseif (p0 = (0,0)) : tmin := 0; tmax := 90; - elseif (p1 = (0,0)) : tmin := -90; tmax := 0; - elseif (p2 = (0,0)) : tmin := -180; tmax := -90; - elseif (p3 = (0,0)) : tmin := 90; tmax := 180; - else : + if (xneg < 0) and (xpos > 0) and (yneg < 0) and (ypos > 0): + tmin := 0; tmax := 360; + elseif (p0 = origin): tmin := 0; tmax := 90; + elseif (p1 = origin): tmin := -90; tmax := 0; + elseif (p2 = origin): tmin := -180; tmax := -90; + elseif (p3 = origin): tmin := 90; tmax := 180; + else: tmax := tmin := t0 := angle p0; for j = 1 upto 3: - t := t0 + angle (p[j] rotated -t0); - if tmax < t : tmax := t; fi - if tmin > t : tmin := t; fi + t := t0 + anglefromto (p0, p[j]); + if tmax < t: tmax := t; fi + if tmin > t: tmin := t; fi endfor % \end{macrocode} % The minimum value of $r$ can be one of 9 possibilities: if the four @@ -4667,31 +4979,30 @@ def beginpolargrid = % the following order: (1)~above or below, (2)~left or right, and (3)~one % of the four corner regions. % \begin{macrocode} - if (xneg < 0) and (xpos > 0) : % (1) - rmin := emin(abs(yneg), abs(ypos)); - elseif (yneg < 0) and (ypos > 0) : % (2) - rmin := emin(abs(xneg), abs(xpos)); - else : % (3) - rmin := min(r0, r1, r2, r3); + if (xneg < 0) and (0 < xpos): + rmin := emin (abs(yneg), abs(ypos)); + elseif (yneg < 0) and (0 < ypos): + rmin := emin (abs(xneg), abs(xpos)); + else: + rmin := min (r0, r1, r2, r3); fi fi - save gridpic; picture gridpic; gridpic := nullpicture; enddef; % \end{macrocode} % % \DescribeRoutine{endpolargrid} % The \gbc{clr} is \gbc{drawcolor} for line grids, \gbc{pointcolor} for -% dot grids. The size is half the width of the grid's lines or half the -% width of the grid's dots. The purpose is to make sure dots and lines on -% the graph's edge aren't cut off. For dots I should probably put this +% dot grids. The \gbc{size} is half the width of the grid's lines or half +% the width of the grid's dots. The purpose is to make sure dots and lines +% on the graph's edge aren't cut off. For dots I should probably put this % decision in the code that draws them on \gbc{gridpic}. % \begin{macrocode} def endpolargrid (expr clr, size)= - clipto (gridpic) rect ( zconv((xneg, yneg)) - size*(1,1), - zconv((xpos, ypos)) + size*(1,1) ); - coloraddto (clr) (active_plane) (gridpic); + clipto (gridpic) rect ( zconv ((xneg, yneg)) - size*(1,1), + zconv ((xpos, ypos)) + size*(1,1) ); + coloraddon (clr, gridpic); endgroup enddef; @@ -4704,13 +5015,21 @@ enddef; % \begin{macrocode} vardef polarpatch (expr rstart, rstop, rstep, tstart, tstop, tstep) = plrpatch (rstart, rstop, rstep, tstart, tstop, tstep); - safedraw zconv ( arcplr ((0, 0), tstart, tstop, rstop) ); + safedraw zconv ( arcplr (origin, tstart, tstop, rstop) ); safedraw zconv ( ((rstart, 0)--(rstop, 0)) rotated tstop ); enddef; % \end{macrocode} % -% \section{Path construction} +% \section{Path Construction}\label{pathconstruction} +% +% This section is devoted to commands that accept a list or array of +% points and produce a path, usually (but not necessarily) through those +% points. In addition there are a few commands that find some of the key +% points, lines and circles associated with a triangle. No \mfpic{} +% interface is yet available for the triangle commands. +% +% \subsection{Piecewise linear paths}\label{linear} % % \DescribeRoutine{rect} % Most of the macros that only define paths are coordinate independent. @@ -4727,48 +5046,60 @@ enddef; vardef rect (expr ll, ur) = ll--(xpart ur, ypart ll)--ur--(xpart ll, ypart ur)--cycle enddef; -vardef triangle (expr A, B, C) = A--B--C--cycle enddef; +vardef triangle (expr A, B, C) = A--B--C--cycle enddef; % \end{macrocode} % % \DescribeRoutine{regularpolygon} % The first argument is the number of sides, the second is an array name % to hold the list of vertices. The third argument contains two -% equations, preferably the location of two of the vertices, or the -% location of the center and one vertex. That plus the equations in the -% \mfc{for}-loop give \gbc{n+1} equations to determine the \gbc{n} -% vertices and the center. Note that the vertices are numbered -% anticlockwise. +% equations separated by a semicolon, preferably the location of two of +% the vertices, or the location of the center and one vertex. That plus +% the equations in the \mfc{for}-loop give \gbc{n+1} equations to +% determine the \gbc{n} vertices and the center. Note that the vertices +% are numbered anticlockwise. +% +% The equations must \emph{not} be equations that are satisfied by all +% $n$-gons regardless of size and position. For example:\\ +% \indent \gbc{regulapolygon(4)(Ted)(Ted0 := (0,0);Ted1 + Ted3 = (0,0))}\\ +% The second of these says the middle lies halfway between the extremes, +% and is already a consequence of the code. It goes without saying that +% equations that cannot be satisfied by any regular polygon are also out. % \begin{macrocode} vardef regularpolygon (expr n) (suffix Bob) (text eqns) = - pair Bob[]; Bob := emax(round (abs (n)), 2); + pair Bob[]; Bob := emax (round (abs (n)), 2); eqns; - for _uncle = 1 upto Bob - 1 : - (Bob1 - Bob0) rotated (360*_uncle/Bob) = Bob[_uncle+1] - Bob0; + for _uncle = 1 upto Bob - 1: + (Bob1 - Bob0) rotated (360/Bob*_uncle) = Bob[_uncle+1] - Bob0; endfor mkpoly (true) (Bob) enddef; % \end{macrocode} % -% The following set of commands accept any path as argument, but it is +% The following set of commands take a path as argument, but it is % intended that it be a triangle. Even then, they work correctly only if % it is a cycle. % -% \DescribeRoutine{altitudept} -% \DescribeRoutine{altitude} -% These first two produce the perpendicular from \gbc{point n of t} -% to the (extension of) the opposite side (i.e., the altitude). The -% first one determines where the altitude meets the opposite side, and the -% second just connects the two points +% These produce the perpendicular from \,\gbc{point n of t}\, to the +% (extension of) the opposite side (i.e., the altitude). +% \DescribeRoutine{altitudept}The first one determines where the altitude +% meets the opposite side, and the \DescribeRoutine{altitude}second just +% connects the two points. Since \gbc{altitudept} is always \gbc{point 1 +% of altitude}, it is actually redundant. However, the command +% \gbc{medianpt} (defined below) is used outside of the construction of +% \gbc{median}, so it seemed possible the \gbc{altitudept} might be useful +% also. +% +% We need a cycle so that points $n+1$ and $n+2$ will wrap around to the +% start of the path when necessary. % \begin{macrocode} vardef altitudept expr n of t = - save A, B, C, zz; pair A, B, C, zz; - A := pnt[n] (t); - B := pnt[n + 1] (t); % wraps around a cyclic path + save A, B, C, zz; pair A, B, C, zz; + B := pnt[n + 1] (t); C := pnt[n + 2] (t); zz = whatever[B,C]; - zz = A + whatever*((C-B) rotated 90); + zz = pnt[n](t) + whatever*((C-B) rotated 90); zz enddef; @@ -4779,9 +5110,8 @@ enddef; % \end{macrocode} % % \DescribeRoutine{medianpt} -% \DescribeRoutine{median} -% These two produce the line from \gbc{point n of t} to the midpoint of -% the opposite side. +% These two produce the midpoint of the side opposite \,\gbc{point n of t}\, +% and the \DescribeRoutine{median}line connecting those two points. % \begin{macrocode} vardef medianpt expr n of t = 0.5[pnt[n + 1] (t), pnt[n + 2] (t)] @@ -4794,16 +5124,16 @@ enddef; % \end{macrocode} % % \DescribeRoutine{anglebisectorpt} -% \DescribeRoutine{anglebisector} -% These two produce the line from \gbc{point n of t} to the opposite side -% that bisects the angle there. +% The first produces the point on the side opposite \,\gbc{point n of t}\, +% where the angle bisector at that corner crosses it and the second +% produces \DescribeRoutine{anglebisector}the line that bisects that angle. % \begin{macrocode} vardef anglebisectorpt expr n of t = - save A, B, C; pair A, B, C; + save A, B, C; pair A, B, C; A := pnt[n ] (t); B := pnt[n + 1] (t); C := pnt[n + 2] (t); - save zz; pair zz; + save zz; pair zz; zz = whatever[B,C]; zz = A + whatever*((B-A) rotated (.5*cornerangle (A,B,C))); zz @@ -4819,17 +5149,22 @@ enddef; % This calculates the angle at the corner of a triangle. Specifically, % the angle (between $-180$ and $180$) required to rotate the vector % \gbc{B-A} into \gbc{C-A}. For degenerate triangles the seemingly -% arbitrary values 0, 60 and 90 are designed to match the assumptions used -% in the \gbc{arc*} commands. But also to guarantee that the three +% arbitrary values 60 and 90 are designed to match the assumptions used +% in the arc commands. But also to guarantee that the three % \gbc{cornerangle}\,s add up to $\pm180$. \gbc{cornerangle (A,B,C)} gives % the angle at \gbc{A}, positive if \gbc{A--B--C--cycle} is % anticlockwise. % \begin{macrocode} +vardef anglefromto (expr u, v) = + if (u = origin) or (v = origin): 0 + else: angle (v rotated (-angle u)) + fi +enddef; + vardef cornerangle (expr A, B, C) = - if (A = B) and (B = C) : 60 - elseif (B = C) : 0 - elseif (A = B) or (A = C) : 90 - else: angle ((C - A) rotated (-angle (B - A))) + if (A = B) and (B = C) : 60 + elseif (A=B) or (A=C) : 90 + else: anglefromto (B - A, C - A) fi enddef; @@ -4837,15 +5172,15 @@ enddef; % % \DescribeRoutine{mkpath} % This accepts the name of an array of pairs and produces a path -% that connects them. The first two parameters are booleans. If +% that connects them. The first and third parameters are booleans. If % \gbc{smooth} is \mfc{true} a smooth path is produced, otherwise a % polyline. If \gbc{cyclic} is \mfc{true} the path is closed. The work is % actually done by \gbc{mksmooth} or \gbc{mkpoly}. % \begin{macrocode} vardef mkpath (expr smooth, tens, cyclic) (suffix pts) = - if smooth : mksmooth (tens, cyclic, pts) - else : mkpoly (cyclic, pts) - fi + if smooth: mksmooth (tens) + else: mkpoly + fi (cyclic, pts) enddef; % \end{macrocode} @@ -4853,10 +5188,11 @@ enddef; % \DescribeRoutine{mkpoly} % This produces the path of line segments connecting \gbc{pts1}, % \gbc{pts2}, etc., closing it up if the boolean \gbc{cyclic} is true. +% It is also used with an array of paths instead of points. % \begin{macrocode} vardef mkpoly (expr cyclic) (suffix pts) = for _i = 1 upto pts-1: pts[_i]-- endfor - pts[pts] if cyclic : -- cycle fi + pts[pts] if cyclic: -- cycle else: {0,0} fi enddef; % \end{macrocode} @@ -4864,22 +5200,55 @@ enddef; % \DescribeRoutine{polyline} % This is the \mfpic{} interface. Instead of an array name, it accepts a % list of pair expressions, forms an array from them and calls -% \gbc{mkpoly}. +% \gbc{mkpoly}. \DescribeRoutine{NoPoints} prints a warning and sets the +% array a single point, the origin. % \begin{macrocode} vardef polyline (expr cyclic) (text t) = - save _pl; textpairs (_pl) (t); mkpoly (cyclic, _pl) + setpairs (_pl) (t); + if _pl=0: NoPoints ("polyline", _pl); fi + mkpoly (cyclic, _pl) +enddef; + +def NoPoints (expr s) (suffix pts) = + GBwarn s & " attempted with empty list."; pts[incr pts] := origin; +enddef; + +% \end{macrocode} +% +% \DescribeRoutine{turtle} +% \emph{Turtle graphics} was a teaching tool to get youngsters used to the +% concept of programming while also teaching geometry. The students fed an +% Apple II computer a sequence of angles and distances, and a small +% triangle on the screen (the `turtle') would turn the indicated angle +% and travel the indicated distance, tracing a polyline on the screen. +% +% The argument of \gbc{turtle} is a list of pairs. The first is the +% starting point, the rest are vector displacements (moves). The +% distance and incremental angles of the original turtle graphics would +% require keeping track of the current angle and using the \gbc{polar} +% command. +% \begin{macrocode} +vardef turtle (text t) = + setnumeric (_tu) 0; + pair _tu[]; _tu0 := origin; + for _a = t: _tu[incr _tu] := _tu[_tu - 1] + _a; endfor + if _tu = 0: NoPoints("turtle", _tu); fi + mkpoly (false, _tu) enddef; % \end{macrocode} % +% \subsection{Smooth paths}\label{smooth} +% % We added an optional parameter for the tension of smooth curves to % \mfpic. It used to be implemented this way: functions that implement a % tension parameter set \gbc{cur_tension} and called \gbc{mksmooth}, which % uses that tension in its formation of a path. Since \gbc{mksmooth} was % only ever used in this way, I decided to change its syntax to include a % tension parameter. Only the functions \gbc{tcurve} and \gbc{mkpath} -% actually call \gbc{mksmooth} directly, other path building commands with -% tension parameters call \gbc{mkfcn}, which calls \gbc{mkpath}. +% actually call \gbc{mksmooth} directly, most other path building commands +% with tension parameters call \gbc{mkpath} or \gbc{mkfcn} (which calls +% \gbc{mkpath}). % % \DescribeRoutine{mksmooth} % This takes a tension value, a boolean, and the name of an array of @@ -4891,258 +5260,670 @@ enddef; % this smooth version would be pretty close to being convex. If the convex % polygon has several consecutive sides that are in the same direction, % all but the first and last of these segments in the smooth version would -% be straight. We should experiment with ``\mfc{tension atleast}'' here -% to see what difference it makes. +% be straight. % \begin{macrocode} vardef mksmooth (expr tens, cyclic) (suffix pts) = - pts1 - if pts = 1 : - if cyclic : &cycle fi + if pts = 1: onepointpath (cyclic, pts1) else: - if cyclic : - {pts[2]-pts[pts]} - fi + settension (_tn) tens; fixtension (_tn); + pts1 if cyclic: {pts[2]-pts[pts]} fi + for _i = 2 upto pts-1: + ..tension _tn..pts[_i]{pts[_i+1]-pts[_i-1]} + endfor + ..tension _tn..pts[pts] + if cyclic: {pts[1]-pts[pts-1]}..tension _tn..cycle fi + fi +enddef; + +% \end{macrocode} +% \DescribeRoutine{mktenser} +% This is just like \gbc{mksmooth}, except the tension value is preceded +% by \mfc{atleast}. At this writing only \gbc{mkconvex} uses it (as a +% fallback when there are three or fewer points to connect). +% \begin{macrocode} +vardef mktenser (expr tens, cyclic) (suffix pts) = + if pts = 1: onepointpath (cyclic, pts1) + else: + settension (_tn) tens; fixtension (_tn); + pts1 if cyclic: {pts[2]-pts[pts]} fi for _i = 2 upto pts-1: - ..tension tens..pts[_i]{pts[_i+1]-pts[_i-1]} + ..tension atleast _tn..pts[_i]{pts[_i+1]-pts[_i-1]} + endfor + ..tension atleast _tn..pts[pts] + if cyclic: {pts[1]-pts[pts-1]}..tension atleast _tn..cycle fi + fi +enddef; + +% \end{macrocode} +% +% \DescribeRoutine{mkconvex} +% This could have been very much like \gbc{mksmooth}, using +% \mfc{tension atleast} instead of \mfc{tension} (i.e., exactly +% \gbc{mktenser} above). Unfortunately This destroys smoothness at the +% beginning and end of any sequence of three or more points that lie on a +% straight line. Some geometric situations absolutely prevent smoothness, +% but this certainly isn't one of them. Two consecutive points +% identical isn't either, but it does. We let the user or calling command +% arrange for it not to happen (for example, using \gbc{setuniquepairs} +% instead of \gbc{setpairs}. +% +% What we do is weight the direction to be used at each point by how flat +% the polygon is on the two sides of each point, the flatter side +% getting the most weight. If a point is collinear with the next two, +% the flatness is infinite and the curve is forced in that direction. We +% measure the flatness using the square root of the area of the triangle +% made by the given point and the the next two points. Those three points +% lie on a line just when the area is $0$. Using this measure of fltness +% can be disputed (two triangles can be equally flat in terms of angles +% but different in terms of areas), but it has the advantage that if the +% points are subjected to an affine transformation, the weighting is +% unchanged and the constructed direction vectors transform the same way. +% Of course, this is also true of other measures. I've tested only +% the square root of area and it works well for simple cases. +% +% The only way to ensure that the whole path transforms the same as the +% points is to explicitly calculate the controls (in a manner that +% transforms the same way as the points). I will do this if I can figure +% out how it \emph{should} be done. It appears to be a convex programing +% problem. +% +% The end segments of a noncycle are problematic. One could argue that +% this command doesn't apply to noncycles and just truncate the cyclic +% path. I decided to treat them specially and hope the result is useful. +% \begin{macrocode} +vardef mkconvex (expr tens, cyclic) (suffix pts) = + save _B, _d, _tmp; pair _d[]; + settension (_tn) tens; fixtension (_tn); + if pts < 4: mktenser (_tn, cyclic) (pts) + else: + for _j = 2 upto pts - 1: + _B[_j] := sqrt(abs((pts[_j]-pts[_j-1])xprod(pts[_j+1]-pts[_j]))); + endfor + if cyclic: + _B1 := sqrt(abs((pts1 - pts[pts])xprod(pts2 - pts1))); + _B[pts] := sqrt(abs((pts[pts]-pts[pts-1])xprod(pts1 - pts[pts]))); + else: + _B1 := _B2; + _B[pts] := _B[pts-1]; + fi + for _j = 2 upto pts - 1: + _tmp := _B[_j-1] + _B[_j+1]; + _d[_j] := + if _tmp = 0: origin % signal to use curl1 + else: + ( _B[_j+1]*(pts[_j] - pts[_j-1]) + + _B[_j-1]*(pts[_j+1] - pts[_j]) )/_tmp + fi; endfor - ..tension tens..pts[pts] - if cyclic : - {pts[1]-pts[pts-1]}..tension tens..cycle + if cyclic: + _tmp := _B[pts] + _B2; + _d1 := + if _tmp = 0: origin + else: + (_B2*(pts1 - pts[pts]) + _B[pts]*(pts2 - pts1))/_tmp + fi; + _tmp := _B[pts-1] + _B1; + _d[pts] := + if _tmp = 0: origin + else: + ( _B1*(pts[pts] - pts[pts-1]) + + _B[pts-1]*(pts1 - pts[pts]) )/_tmp + fi; + else: + _d1 := origin; _d[pts] := origin; fi + pts1 + for _j = 1 upto pts-1: + {if _d[_j] = origin: curl1 else: _d[_j] fi} + ..tension atleast _tn..pts[_j+1] + endfor + {if _d[pts] = origin: curl1 else: _d[pts] fi} + if cyclic: ..tension atleast _tn..cycle fi fi enddef; % \end{macrocode} % +% The old \cs{curve} command in \mfpic{} permitted no tension parameter +% and wrote a \grafbase{} \gbc{curve} command. % \DescribeRoutine{curve} +% For backward compatibility we keep that name, but simply call the +% \gbc{tcurve} command with the default value for tension. % \DescribeRoutine{tcurve} -% The old \cs{curve} command in \mfpic{} permitted no tension parameter -% and wrote a \grafbase{} \gbc{curve} command. For backward compatibility -% we keep that name, but simply call the \gbc{tcurve} command with the -% default value for tension. \gbc{tcurve} converts a list of pairs to an -% array, then calls \gbc{mksmooth} on the array. +% \gbc{tcurve} converts a list of pairs to an array, then calls +% \gbc{mksmooth} on the array. +% +% The next pair call \gbc{mkconvex}, which tries to produce a convex curve +% when the points form a convex polygon. The first, +% \DescribeRoutine{ccurve}\gbc{ccurve}, merely calls the second with a +% default texnsion, while \DescribeRoutine{tccurve}creates an array from +% the list of pairs and calls \gbc{mkconvex} on it. % \begin{macrocode} -def curve = tcurve (default_tension) enddef; +numeric default_tension; default_tension := 1; +def curve = tcurve (default_tension) enddef; vardef tcurve (expr tens, cyclic) (text t) = - save _tc; textpairs (_tc) (t); mksmooth (tens, cyclic, _tc) + setpairs (_tc) (t); mksmooth (tens, cyclic, _tc) +enddef; + +def ccurve = tccurve (default_tension) enddef; +vardef tccurve (expr tens, cyclic) (text t) = + setuniquepairs (_tcc) (t); mkconvex (tens, cyclic, _tcc) enddef; % \end{macrocode} % -% \DescribeRoutine{mkbezier} -% \DescribeRoutine{bezier} -% \DescribeRoutine{tbezier} % It seemed odd that we had no way for an \MF-savvy user to easily get -% the standard \mfc{p..q..r} kind of path. For such a simple one +% the standard \mfc{p..q..r} kind of path. For such a simple one, % \cs{mfobj} with the explicit path expression would work, but when one % has to add a tension to it, it is nice to have an abbreviation. That's % what these are for. +% +% \DescribeRoutine{mkbezier} +% \gbc{mkbezier} takes an array argument and produces either an open or +% cyclic path with a given tension. \DescribeRoutine{bezier}\gbc{bezier} +% does nothing more than call \gbc{tbezier} with the default tension, +% \DescribeRoutine{tbezier}which takes a list of points and creates an +% array for \gbc{mkbezier} to act on. % \begin{macrocode} vardef mkbezier (expr tens, cyclic) (suffix pts) = - for _i = 1 upto pts-1 : pts[_i]..tension tens.. endfor - pts[pts] if cyclic : ..tension tens..cycle fi + settension (_tn) tens; fixtension (_tn); + pts1 + for _i = 2 upto pts: ..tension _tn..pts[_i] endfor + if cyclic: ..tension _tn..cycle else: {0,0} fi enddef; -def bezier = tbezier (default_tension) enddef; +def bezier = tbezier (default_tension) enddef; vardef tbezier (expr tens, cyclic) (text t) = - save _tsb; textpairs (_tsb) (t); mkbezier (tens, cyclic) (_tsb) + setpairs (_tbs) (t); + if _tbs=0: NoPoints ("bezier", _tbs); fi + mkbezier (tens, cyclic) (_tbs) enddef; % \end{macrocode} % -% \DescribeRoutine{qbezier} -% \DescribeRoutine{mkqbezier} -% It also semed we ought to allow \mfpic{} users to easily reproduce the +% It also seemed we ought to allow \mfpic{} users to easily reproduce the % effect of a sequence of \LaTeX's \cs{qbezier} commands. That's what -% these are for. +% these next are for. % -% These commands and the various splines don't use tension as they have -% their control points explicitly given, not computed from the tension -% value by \MF. The \gbc{qbezier} command does not produce a smooth path -% unless the controls are explicitely chosen for that. The spline commands -% will almost always produce a smooth path. +% These commands and the various splines below don't use tension as they +% have their control points explicitly given, not computed from the +% tension value by \MF. The \gbc{qbezier} command does not produce a +% smooth path unless the controls are explicitely chosen for that. The +% spline commands will almost always produce a smooth path. % +% \DescribeRoutine{mkqbezier} % \gbc{mkqbezier} requires an even number of points for a cyclic path, -% an oddnumber for a noncyclic path. If \gbc{pts} has the wrong parity, -% the last point in the list is repeated. This makes the last segment -% either trivial or a straight line. We increment \gbc{_mqb} instead of -% \gbc{pts} so a user's suffix doesn't unexpectedly change. +% an odd number for a noncyclic path. The \mfc{for}-loop ends on the last +% odd index. If \gbc{pts} is odd and \gbc{cyclic} is true we need to +% manufacture another control point for the connection back to the +% start. We take that to be a repetition of the last point. If \gbc{pts} +% is even and \gbc{cyclic} is false then the loop ends at \gbc{pts-1}. +% Again we need to pick a control to connect to the last point, and again +% we use that last point as the control. In these two cases the last +% link is a straight line. +% +% \DescribeRoutine{qbezier} +% The \gbc{qbezier} command takes a list of points and creates an array +% from then before calling \gbc{mkqbezier}. % \begin{macrocode} vardef mkqbezier (expr cyclic) (suffix pts) = - save _mqb; _mqb := pts; - if (cyclic and odd pts) or not (cyclic or odd pts): - pts[incr _mqb] := pts[pts]; - fi - if cyclic : pts[incr _mqb] := pts1; fi pts1 - for _i = 2 step 2 until _mqb - 1 : - ..controls 1/3[pts[_i],pts[_i-1]] and 1/3[pts[_i], pts[_i+1]] - ..pts[_i+1] - endfor - if cyclic : &cycle fi + if pts=1: {0,0} + else: + for _i = 2 step 2 until pts - 1: + ..controls 1/3[pts[_i], pts[_i-1] ] and 1/3[pts[_i], pts[_i+1] ].. + pts[_i+1] + endfor + if cyclic: + ..controls 1/3[ pts[pts], pts[pts - 1] ] + and 1/3[ pts[pts], pts1 ]..cycle + fi + fi enddef; vardef qbezier (expr cyclic) (text t) = - save _qbz; textpairs (_qbz) (t); mkqbezier (cyclic) (_qbz) + setpairs (_qbz) (t); + if _qbz=0: NoPoints ("qbezier", _qbz); fi + if _qbz=1: onepointpath (cyclic, _qbz1) + else: + if (cyclic and odd _qbz) or (not cyclic and even _qbz): + _qbz[incr _qbz] := _qbz[_qbz-1]; + fi + mkqbezier (cyclic) (_qbz) + fi enddef; % \end{macrocode} % -% For quadratic B-splines, a list of pairs representing the control -% points must be given. The nodes of the path and the cubic Bezi\'er -% controls required to produce a quadratic B-spline are computed. -% -% \DescribeRoutine{mkqbs} -% For simplicity, the list is converted to an array \gbc{_oq} first and -% \gbc{mkqbs} is called. This draws an open spline based on the points in -% an array \gbc{b}. -% \begin{macrocode} -vardef openqbs (text t) = - save _oq; textpairs (_oq) (t); mkqbs (_oq) -enddef; - -vardef closedqbs (text t) = - save _cq; textpairs (_cq) (t); - _cq[incr _cq] := _cq1; _cq[incr _cq] := _cq2; - mkqbs (_cq) & cycle -enddef; - -vardef mkqbs (suffix b) = - for _i = 1 upto b-2: - 0.5[b[_i], b[_i+1]] - ..controls 1/6[b[_i+1], b[_i]] and 1/6[b[_i+1], b[_i+2]].. - endfor - 0.5[b[b-1], b[b]] -enddef; - -% \end{macrocode} -% As for cubic B-splines, I'll have to trust the previous coder, as I -% didn't even know what a cubic B-spline was until I deduced it from his -% code. Earlier versions of \gbc{mkclosedcbs} would define -% \gbc{b[incr b]:=b1} and \gbc{b[incr b]:=b2}. I decided we shouldn't -% change the values of variables associated with the given suffix \gbc{b} -% and so now we use \gbc{mkopencbs} to get most of the way around and then -% fill in the gap with an explicit call to \gbc{opencbs}). -% \begin{macrocode} -vardef mkopencbs (suffix b) = - for _i = 1 upto b-3: - (b[_i]+4b[_i+1]+b[_i+2])/6 - ..controls 1/3[b[_i+1], b[_i+2]] and 2/3[b[_i+1], b[_i+2]].. - endfor - (b[b-2]+4b[b-1]+b[b])/6 -enddef; -vardef mkclosedcbs (suffix b) = - mkopencbs (b) & opencbs (b[b-2],b[b-1],b[b], b1, b2, b3) & cycle -enddef; - -vardef opencbs (text t) = - save _oc; textpairs (_oc) (t); mkopencbs (_oc) -enddef; -vardef closedcbs (text t) = - save _clc; textpairs (_clc) (t); mkclosedcbs (_clc) -enddef; - -% \end{macrocode} -% When calling \gbc{curve} or \gbc{tcurve} there there can be a problem +% When calling \gbc{curve} or \gbc{tcurve} there can be a problem % with the resulting path: even with high tension one is not guaranteed -% that a sequence of points with increasing x-coordinate will produce a -% path with increasing x-coordinate. The requirement to guarantee this is -% that the control points of the segment connecting $(x\sb1, y\sb1)$ to the -% next $(x\sb2, y\sb2)$ have their \gbc{xpart} in the interval $x\sb1 < x -% < x\sb2$. +% that a sequence of points with increasing $x$-coordinate will produce a +% path with increasing $x$-coordinate. The \gbc{fcnspline} command will do +% what we want, but we have no control over the path, apart from the +% equations at the ends. +% +% The requirement to guarantee that a path have increasing $x$-coordinates +% is that the control points of the segment connecting +% $(x\sb{j}, y\sb{j})$ to the next $(x\sb{j+1}, y\sb{j+1})$ have their +% $x$-part in the interval $x\sb{j} < x < x\sb{j+1}$. % % Therefore, if we wish to plot a curve connecting points with increasing -% x-coordinates and believe that the resulting path should be the graph of -% a function, we pretty much have to select the control points ourselves. -% A related problem is to keep the path under control. That is, the -% segment of the curve connecting $(x\sb1, y\sb1)$ to the next $(x\sb2, -% y\sb2)$ should have \gbc{ypart} within an interval not too much larger -% than the interval $y\sb1 < y < y\sb2$. -% -% We accomplish both these tasks at once by making the vector from -% $(x\sb n, y\sb n)$ to its \mfc{postcontrol} have length less than -% $|x\sb{n+1} - x\sb n|$, and the same for the vector from $(x\sb{n+1}, -% y\sb{n+1})$ to its \mfc{precontrol} +% $x$-coordinates and believe that the resulting path should be the graph +% of a function, we pretty much have to select the control points +% ourselves. By default we choose the two controls so the \mfc{xpart}s +% divide the $x$-interval into three equal parts. This makes the B\'ezier +% $f(t)$ linear in the $x$-part and so has the added `advantage' that in +% each segment, $y$ is a cubic function of $x$. It is not a spline, as we +% compute the controls locally and allow them to be modified by an +% additional parameter. % % Another concern is what direction to place the controls. In % \gbc{mksmooth} we ask the direction at a given point to be the average -% of the straight line directions to adjacent points. For graphing -% functions, we average the slopes instead. An added refinement is that -% this is a weighted average, with the nearer x-coordinate being weighted -% more. +% of the straight line directions to adjacent points. We now do the same +% here, though it is not clear if this is best. % % Finally, we permit a tension of sorts by dividing the distance to the -% controls by a parameter \gbc{fcn_tension}. +% controls by a parameter normally equal to \gbc{default_tension}. % % \DescribeRoutine{fcncontrol} -% This computes the control point for the points on the path. The -% parameters \gbc{X, Y, Z} are three successive points of the path to be -% constructed. If they are given in order, it gives the postcontrol of -% \gbc{Y}. If they are in reverse order, the precontrol is obtained. -% Oddly enough, the addition of the trap for \gbc{dl=0} or \gbc{dr=0} -% made it possible to trivially extend the array (in -% \gbc{functioncurve}) and get better looking results than either method -% used before this. +% This computes the control point for the points on the path, following +% the above description. If by chance some $x$ interval is zero, we +% make the controls equal to the nodes, which gives a straight vertical +% (the $y$ values differ because we use \gbc{setuniquepairs}. This also +% abandons smoothness there. +% +% The method selecting the controls is new with \mfpic{} version 0.8. +% Following discussions with Stephan Hennig in \texttt{comp.text.tex} I +% came to the conclusion that the method used ought to satisfy the +% following: if the data are xscaled or yscaled, the control vectors ought +% to scale the same way. The current version does that. % % \DescribeRoutine{mkfcnpath} % This produces the path, calling \gbc{fcncontrol} to produce the controls. % -% \DescribeRoutine{functioncurve} % \DescribeRoutine{fcncurve} -% This is the interface; \gbc{fcncurve} calls \gbc{functioncurve} with the -% default tension, which then takes a list of points, converts it to an -% array, and calls \gbc{mkfcnpath} to build the path. +% This is the \mfpic{} interface; \gbc{fcncurve} calls \gbc{functioncurve} +% with the default tension, which \DescribeRoutine{functioncurve}then +% takes a list of points, converts it to an array, and calls +% \gbc{mkfcnpath} to build the path. % \begin{macrocode} vardef fcncontrol (expr ftens, X, Y, Z) = - save dl, dr, before, after; pair before, after; - before := Y - X; after := Z - Y; - dl := xpart (before); dr := xpart (after); - if (dr = 0) or (dl = 0): - Y + abs(dr)/ftens * sgn before - else: - Y + abs(dr)/ftens * unitvector (before*dr/dl + after*dl/dr) - fi + Y if (xpart(Z-Y) <> 0) and (xpart(Y-X) <> 0): + + xpart(Z-Y)/3/xpart(Z-X)*(Z - X)/ftens fi enddef; -vardef mkfcnpath (expr ftens) (suffix q) = +vardef mkfcnpath (expr ftens) (suffix q) = + settension (_tn) ftens; + if _tn <= 0: _tn := 1; fi for _i = 1 upto q - 1: - q[_i]..controls fcncontrol (ftens) (q[_i-1], q[_i], q[_i+1]) - and fcncontrol (ftens) (q[_i+2], q[_i+1], q[_i]).. + q[_i]..controls fcncontrol (_tn) (q[_i-1], q[_i], q[_i+1]) + and fcncontrol (_tn) (q[_i+2], q[_i+1], q[_i]).. endfor - q[q] + q[q]{0,0} enddef; -def fcncurve = functioncurve (emax(1.2default_tension, eps)) enddef; +def fcncurve = functioncurve (default_tension) enddef; +def tfcncurve = functioncurve enddef; vardef functioncurve (expr ftens) (text t) = - save _fc; textpairs (_fc) (t); - if _fc > 1 : _fc0 := _fc1; _fc[_fc+1] := _fc[_fc]; fi - mkfcnpath (ftens)(_fc) + settension (_ftens) ftens; if _ftens < 1/3: _ftens := 1/3; fi + setuniquepairs (_fc) (t); + if _fc > 1: _fc0 := _fc1; _fc[_fc+1] := _fc[_fc]; fi + mkfcnpath (_ftens) (_fc) enddef; % \end{macrocode} % -% \DescribeRoutine{turtle} -% \emph{Turtle graphics} was a teaching tool to get youngsters used to the -% concept of programming while also teaching geometry. The students fed an -% Apple II computer a sequence of angles and distances, and a small -% triangle on the screen (the ``turtle'') would turn the indicated amount -% and travel the indicated distance, tracing a polyline on the screen. +% \subsection{Splines with explicit controls}\label{splines} % -% The argument of \gbc{turtle} is a list of pairs. The first is the -% starting point, the rest are vector displacements (moves). The -% distance and incremental angles of the original turtle graphics seems -% to have been abandoned at some point in the development of \grafbase. +% For these quadratic B-splines, a list of pairs representing the control +% points must be given. The nodes of the path and the cubic Bezi\'er +% controls required to produce a quadratic B-spline are computed. The +% nodes are just half way between the one control point and the next. +% +% \DescribeRoutine{openqbs} +% For simplicity, the list is converted to an array \gbc{_oq} first. In +% the closed version \DescribeRoutine{closedqbs}additional array elements +% are created at the end, repeating two of the beginning elements. +% Finally, +% \DescribeRoutine{mkqbs} +% \gbc{mkqbs} is called. This draws an open spline based on the points in +% an array \gbc{b}. The additional array elements defined by +% \gbc{closedqbs} cause the resulting path to end where it began and a +% simple \mfc{\&cycle} closes it. +% +% \DescribeRoutine{qspline} The \mfpic{} commands \cs{qspline} and +% \cs{closedqspline} now call \gbc{qspline} with appropriate boolean, for +% consistency with other commands that have the same argument structure. +% The commands \gbc{openqbs}, and \gbc{closedqbs} are no longer needed, +% but are kept for backward compatability. The most efficient setup would +% be to give \gbc{mkqbs} a boolean argument, but that could break old +% files. % \begin{macrocode} -vardef turtle (text t) = - save _tu; pair _tu[]; _tu := 0; _tu0 := (0, 0); - for _a = t: _tu[incr _tu] := _tu[_tu - 1] + _a; endfor - mkpoly (false, _tu) +def openqbs = qspline (false) enddef; +def closedqbs = qspline (true) enddef; + +vardef mkqbs (suffix b) = + 0.5[ b1, b2] + if b<3: {0,0} + else: + for _i = 2 upto b-1: + ..controls 1/6[ b[_i], b[_i-1] ] and 1/6[ b[_i], b[_i+1] ].. + 0.5[ b[_i], b[_i+1] ] + endfor + fi +enddef; + +vardef qspline (expr cyclic) (text t) = + setpairs (_qs) (t); + if _qs=0: NoPoints ("qspline", _qs); fi + if _qs=1: _qs[incr _qs] := _qs1; fi + if cyclic: + _qs[incr _qs] := _qs1; _qs[incr _qs] := _qs2; + fi + mkqbs (_qs) if cyclic: & cycle fi +enddef; +% \end{macrocode} +% +% These cubic B-splines also require a list of `control' points. Each of +% the points $Q$, combined with the next one $Q'$, determine two more +% points that divide the segment from $Q$ to $Q'$ into thirds. These new +% points become the two control points of a \MF{} B\'ezier segment. The +% nodes of these segments are half way between the second control of one +% segment and the first control of the next. +% +% \DescribeRoutine{mkcbs}The main code is in \gbc{mkcbs}, which results +% in an open curve. For backward compatibility, the alias +% \DescribeRoutine{mkopencbs}\gbc{mkopencbs} is supplied. +% +% \DescribeRoutine{mkclosedcbs} +% Earlier versions of \gbc{mkclosedcbs} would partly redefine its suffix +% parameter (for example, using \gbc{b[incr b]:=b1}. I decided this +% shouldn't change the array variable (imagine using two such functions on +% the same array). Now the code has been rearranged so the cubic case is +% handled just like the quadratic. We retain \gbc{mkclosedcbs} only for +% backward compatibility. +% +% \DescribeRoutine{opencbs} +% These are the versions taking a list of points instead of an array name. +% They create a temporary array and call \gbc{mkcbs}, with +% \DescribeRoutine{closedcbs}\gbc{closedcbs} extending the array, just +% like the quadratic versions. +% +% \DescribeRoutine{cspline} The \mfpic{} commands \cs{cspline} and +% \cs{closedcspline} now call \gbc{cspline} with appropriate boolean, for +% consistency with other commands that have the same argument structure. +% The commands \gbc{mkopencbs}, \gbc{opencbs}, and \gbc{closedcbs} are no +% longer needed, but are kept for backward compatability. The most +% efficient setup would be to give \gbc{mkcbs} a boolean argument, but +% that could break old files. +% \begin{macrocode} +vardef mkcbs (suffix b) = + (b[1]+4b[2]+b[3])/6 + if b < 4: {0,0} + else: + for _i = 3 upto b-1: + ..controls 1/3[ b[_i-1], b[_i] ] and 1/3[ b[_i], b[_i-1] ] + .. (b[_i-1] + 4b[_i] + b[_i+1])/6 + endfor + fi +enddef; + +def mkopencbs = mkcbs enddef; +vardef mkclosedcbs (suffix b) = + mkcbs (b) & opencbs (b[b-2],b[b-1],b[b], b1, b2, b3) & cycle +enddef; + +def opencbs = cspline (false) enddef; +def closedcbs = cspline (true) enddef; + +vardef cspline (expr cyclic) (text t) = + setpairs (_cs) (t); + if _cs=0: NoPoints ("cspline", _cs); fi + for _idx = _cs upto 2: _cs[incr _cs] := _cs[_idx]; endfor + if cyclic: + for _idx = 1 upto 3: _cs[incr _cs] := _cs[_idx]; endfor + fi + mkcbs (_cs) if cyclic: & cycle fi +enddef; +% \end{macrocode} +% +% \subsection{Splines with computed controls}\label{computedsplines} +% +% A cubic spline through a set of points is a curve obtained by joining +% each point to the next with a cubic parametrized curve, where adjoining +% cubics must have matching first and second derivative at their common +% point. In the previous section's \gbc{mkcbs}, the control points must be +% supplied, it being up to the user to arrange (if necessary) that the +% spline produced passes through given points. If, instead, these points +% are given, it is possible to compute the necessary controls. +% Unfortunately, the controls are not uniquely determined unless the curve +% is required to be closed. For open curves, there is need for two +% additional conditions at the end points. A `relaxed spline' is produced +% if we require that the second derivative is $0$ at those points. +% +% For a closed curve, the equality of the first and second derivatives at +% the common beginning/ending point gives the needed additional equations. +% +% Note that this equates \emph{time} derivatives, so this works best when +% points are relatively evenly spaced and so the speed is relatively +% uniform. If points are differently spaced then the relatively slower +% speed between closely spaced points allows sharper turns without large +% second derivatives. Curves produced tend to have a more natural look, +% and relaxed splines are most suitable for smoothing data that is +% obtained by taking observations at evenly space times. Still, the +% technique is somewhat unstable when points are closely spaced, for +% example when a small change in the position of one point can produce a +% large change in its direction when viewed from another point. +% +% \DescribeRoutine{init_spline_eqns} +% In this command we generate the equations common to all cubic +% splines: the equality of derivatives at all interior points. +% This command accepts a suffix \gbc{pts}, which is the array of points +% to be connected. It initializes the variables \gbc{_spl_pre[\,]} and +% \gbc{_spl_post[\,]} to unknown arrays of pairs. These will hold the +% control points. +% +% \DescribeRoutine{closed_spline_eqns}The next two macros contain the +% additional equations: for a closed spline these are the same as the +% interior equation, but at the first and last point in the array. For +% \DescribeRoutine{relaxed_spline_eqns}relaxed splines they force +% the second derivative to be 0 at the first and last point. +% +% The macro \gbc{mksplinepath} simply assembles the points and controls +% previously computed into a path. +% +% \DescribeRoutine{mkspline}\gbc{mkspline} issues the +% common equations and then either the closed equations (\gbc{closed = +% true}) or the relaxed equations (\gbc{closed = false}), before calling +% \gbc{mksplinepath}. +% +% The knowledgeable user can call \gbc{init_spline_eqns}, append any +% choice of equations for the end segments, and then call +% \gbc{mksplinepath~(false)} to produce any sort of open spline. +% +% \DescribeRoutine{dospline} +% This version accepts a list of pairs and produces a spline through +% them. It simply stores the list in an array and calls the appropriate +% version that operates on an array. This is the command passed by \mfpic{}. +% \begin{macrocode} +def init_spline_eqns (suffix pts) = + save _spl_pre, _spl_post; + pair _spl_pre[], _spl_post[]; + for j= 2 upto pts - 1: + _spl_post[j] + _spl_pre[j] = 2pts[j]; + _spl_pre[j+1]+2_spl_pre[j] = 2_spl_post[j]+_spl_post[j-1]; + endfor +enddef; + +def closed_spline_eqns (suffix pts) = + _spl_post1 + _spl_pre1 = 2pts1; + _spl_post[pts] + _spl_pre[pts] = 2pts[pts]; + _spl_pre2 + 2_spl_pre1 = 2_spl_post1 + _spl_post[pts]; + _spl_pre1+2_spl_pre[pts] = 2_spl_post[pts]+_spl_post[pts-1]; +enddef; + +def relaxed_spline_eqns (suffix pts) = + _spl_pre2 + pts1 = 2_spl_post1; + pts[pts] + _spl_post[pts-1] = 2_spl_pre[pts]; +enddef; + +vardef mksplinepath (expr closed) (suffix pts) = + pts1..controls _spl_post1 and + for j = 2 upto pts if not closed: -1 fi: + _spl_pre[j]..pts[j]..controls _spl_post[j] and + endfor + if closed: _spl_pre1..cycle else: _spl_pre[pts]..pts[pts] fi +enddef; + +def mkspline (expr closed) (suffix pts) = + init_spline_eqns (pts); + if closed: closed_spline_eqns (pts); + else: relaxed_spline_eqns (pts); + fi + mksplinepath (closed) (pts) +enddef; + +vardef dospline (expr closed) (text the_list) = + setpairs (_sp) (the_list); + if _sp=0: NoPoints ("dospline", _sp); fi + if _sp=1: _sp[incr _sp] := _sp1; fi + mkspline (closed) (_sp) enddef; % \end{macrocode} +% The above computations produce a $2$-dimensional spline. A $1$-dimensional +% cubic spline would be a function $f(t)$ with numeric values rather +% than pair values. Such are often used to interpolate functions. That is, +% given pairs $(x\sb j,y\sb{j})$, and assuming they lie on the graph of +% some function (generally unknown), fill in the graph with $y = f(x)$ +% where $f$ is a cubic function of $x$ in each interval $x\sb j < x < x\sb +% {j+1}$, making sure that the resulting graph is as smooth as possible at +% the points $x\sb j$. +% +% The requirements on our $2$-dimensional path are the following: +% \begin{enumerate} +% \item The $j$th link should connect $(x\sb{j},y\sb{j})$ to $(x\sb{j+1}, +% y\sb{j+1})$. +% \item The $x$-part of that link should increase linearly from $x\sb{j}$ to +% $x\sb{j+1}$ as $t$ goes from $0$ to $1$. +% \item The $y$-part should be a cubic $y = f(x)$. +% \item The $x$-derivatives $df/dx$ and $d^2f/dx^2$ should match at the +% connecting points. +% \end{enumerate} % +% Two necessary equations for converting between $x$ and $t$ coordinates +% are: +% \begin{equation}\label{first} +% x = x\sb{j} + t \Delta x\sb{j} +% \end{equation} +% (where $\Delta x\sb{j} = x\sb{j+1} - x\sb{j}$) and +% \begin{equation}\label{second} +% \frac{df}{dt} = \frac{dx}{dt}\frac{df}{dx} = +% \Delta x\sb{j} \frac{df}{dx}. +% \end{equation} +% Thus we want to choose controls so that (\ref{first}) is maintained and +% so that $x$-derivatives match. It turns out that this requires controls +% at +% \begin{equation} +% \begin{array}{c} +% (x\sb{j}, y\sb{j}) - (\Delta x\sb{j-1}, s\sb{j} \Delta x\sb{j-1})/3\\ +% (x\sb{j}, y\sb{j}) + (\Delta x\sb{j} , s\sb{j} \Delta x\sb{j} )/3 +% \end{array} +% \end{equation} +% where $s\sb{j}$ is the slope (derivative) at $x\sb{j}$. This provides +% matching first derivatives automatically (equation (\ref{second})) and +% also (\ref{first}). To get matching second derivatives we need the same +% conditions as in parametric splines. We use these equations simplified to +% the form: +% \begin{displaymath} +% s\sb{j+1} \Delta x\sb{j} - 2s\sb{j} (\Delta x\sb{j} + +% \Delta x\sb{j-1}) + s\sb{j-1}\Delta x\sb{j-1} +% = 3y\sb{j+1} - 3y\sb{j-1}. +% \end{displaymath} +% There can be almost any equations at the end points. For a relaxed +% spline we equate the second derivatives to 0. To get a periodic +% function, we equate the slope and second derivative at beginning to +% those at the end. This makes it possible to put a shifted copy of the +% graph with starting point at the end of the original and have the same +% smoothness at that connection as at the other points. +% +% \DescribeRoutine{init_fcnspl_eqns} +% This declares the temporary arrays \gbc{_dx[\,]} (the set of $dx\sb j$) +% and \gbc{_sl[\,]} (the desired slopes) and issues the common equations. +% The parameter \gbc{pts} is the array of $(x,y)$ values. +% +% \DescribeRoutine{periodic_fcnspl_eqns}For the periodic case we +% use \gbc{periodic_fcnspl_eqns} to generate the additional +% equations and for the \DescribeRoutine{relaxed_fcnspl_eqns}relaxed case +% we use \gbc{relaxed_fcnspl_eqns}. As before, one can produce custom +% splines by issuing the common equations and then ones own equations. +% +% \DescribeRoutine{mkfcnsplpath} +% Then we assemble the path from the computed information by calling the +% command \gbc{mkfcnsplpath}. +% +% \DescribeRoutine{mkfcnspline} +% These commands emits the appropriate equations then assemble the path. +% The if the first parameter is true it uses the periodic equations, +% otherwise the relaxed equations. +% +% \DescribeRoutine{fcnspline} +% Finally, this command is the one written by \mfpic{}. It copies a list +% of pairs into an array and calls the appropriate command to process +% them. +% \begin{macrocode} +def init_fcnspl_eqns (suffix pts) = + save _dx, _sl; numeric _dx[], _sl[]; + _dx1 := xpart (pts2 - pts1); + for j = 2 upto pts - 1: + _dx[j] := xpart (pts[j+1] - pts[j]); + _sl[j + 1]*_dx[j] + _sl[j-1]*_dx[j-1] + 2_sl[j]*(_dx[j] + _dx[j-1]) + = 3*ypart(pts[j+1] - pts[j-1]); + endfor +enddef; + +def periodic_fcnspl_eqns (suffix pts) = + _sl1 = _sl[pts]; + _sl2*_dx1 + 2_sl1*_dx1 + 2_sl[pts]*_dx[pts-1] + _sl[pts-1]*_dx[pts-1] + = 3 * ypart (pts[2] - pts[pts-1]); +enddef; + +def relaxed_fcnspl_eqns (suffix pts) = + _sl2*_dx1 + 2_sl1*_dx1 = 3 * ypart(pts2 - pts1); + _sl[pts-1]*_dx[pts-1] + 2_sl[pts]*_dx[pts-1] + = 3 * ypart(pts[pts] - pts[pts-1]); +enddef; + +vardef mkfcnsplpath (suffix pts) = + pts1..controls (pts1 + (1, _sl1)/3*_dx1) and + for j = 2 upto pts - 1: + (pts[j] - (1, _sl[j])/3*_dx[j-1]) ..pts[j].. + controls (pts[j] + (1,_sl[j])/3*_dx[j]) and + endfor + (pts[pts] - (1,_sl[pts])*_dx[pts-1]/3)..pts[pts] +enddef; + +vardef mkfcnspline (expr periodic) (suffix pts) = + init_fcnspl_eqns (pts); + if periodic: periodic_fcnspl_eqns (pts); + else: relaxed_fcnspl_eqns (pts); + fi + mkfcnsplpath (pts) +enddef; + +vardef fcnspline (expr periodic) (text the_list) = + setpairs (_fs) (the_list); + if _fs<2: + if _fs=0: NoPoints ("fcnspline", _fs); fi + onepointpath (false, _fs1) + else: + mkfcnspline (periodic) (_fs) + fi +enddef; + +% \end{macrocode} % -% \section{Arcs, Circles and Ellipses} +% \subsection{Arcs, circles and ellipses}\label{arcs} % % We have multiple commands that generate circular arcs, differing in % how the arc is specified. All are (in part) based on the following @@ -5162,9 +5943,13 @@ enddef; % the arc without knowing the center) is unstable. % % There is really no problem with \gbc{mkarc} itself: if you can express -% both \gbc{center} and \gbc{from} in \MF, then the other values on the +% both \gbc{center} and \gbc{begpt} in \MF, then the other values on the % arc should be no problem. % +% Care has been taken that changing the sign of various parameters +% produces reasonable results. And there should be no more problem for +% arcs with sweep larger than 360 degrees than with less. +% % \DescribeRoutine{mkarc} % This takes the center, starting and ending point (pair expressions) and % the angle, and returns the arc defined pretty much the way \file{plain.mf} @@ -5178,19 +5963,25 @@ enddef; % the path created should test equal to that point. Shifting works OK, but % scaling and rotating cause roundoff differences. % -% Note that \gbc{mkarc} has parameters that over-determine the arc. It -% is only called by arc making commands that have calculated these -% parameters. \gbc{mkarc}'s job is to ensure that the arc begins at -% \gbc{from} and ends at \gbc{to} (exactly). -% \begin{macrocode} -vardef mkarc (expr center, from, to, sweep) = - save n, d; pair d; - n := ceiling (abs(sweep)/45); - d := (from - center) rotated (signof (sweep) 90); - from{d} - for j = 1 upto n-1 : - ..(from rotatedabout (center, j/n*sweep)){d rotated (j/n*sweep)} - endfor ..to{d rotated sweep} +% Note that \gbc{mkarc} has parameters that may over-determine the arc. +% It is only called by arc-making commands that have calculated these +% parameters and, I hope, ensured they are compatible. \gbc{mkarc}'s job +% is mainly to ensure that the arc begins at \gbc{begpt} and ends at +% \gbc{endpt} (exactly). A \gbc{sweep} of $0$ is actually incompatible +% with any case where \gbc{begpt<>endpt} unless \gbc{center} is +% literally at infinity, but we allow it even though I am pretty sure +% the other arc commands all filter out that case. +% \begin{macrocode} +vardef mkarc (expr center, begpt, endpt, sweep) = + if (sweep = 0): begpt--endpt + else: + setnumeric (n) ceiling (abs(sweep)/45); + setpair (d) (begpt - center) rotated (signof (sweep) 90); + begpt{d} + for j = 1 upto n-1: + ..(begpt rotatedabout (center, j/n*sweep)){d rotated (j/n*sweep)} + endfor ..endpt{d rotated sweep} + fi enddef; % \end{macrocode} @@ -5200,75 +5991,13 @@ enddef; % subtended. Another name for \gbc{arc} is \gbc{arccps}, (\gbc{cps} is % for ``center, point, sweep''). % \begin{macrocode} -vardef arc (expr center, from, sweep) = - if (center = from) or (sweep = 0) : - from--from +vardef arc (expr center, begpt, sweep) = + if (center = begpt) or (sweep = 0): begpt--begpt else: - save to; pair to; - to := from rotatedabout (center, sweep); - mkarc (center, from, to, sweep) + mkarc (center, begpt, begpt rotatedabout (center, sweep), sweep) fi enddef; -def arccps = arc enddef; - -% \end{macrocode} -% -% \DescribeRoutine{arccenter} -% For arcs greater than 90 degrees we will convert to the above basic -% \gbc{mkarc}. Since two of the methods don't provide the center among the -% parameters, we use the utility \gbc{arccenter} to locate that center, -% given two points and the angle. This can fail (arithmetic overflow) if -% the angle is too small relative to the distance between the points. -% Therefore, we try not to call it for small angles (or angles near -% multiples of 360). -% -% We find the center by solving equations representing two lines which -% must be perpendicular to the circle. Which two lines we use depends on -% the sweep. For accurate solutions we want the angle between the two -% lines to be closer to 90 than to 0. \gbc{ang} is the angle we need to -% rotate the chord \gbc{(to - from)} to be perpendicular to the circle at -% \gbc{from}. \gbc{cd} is a vector in the direction of the chord. When -% \gbc{ang} is close to $\pm90$, we use the lines perpendicular to the circle -% at \gbc{from} and \gbc{to}. Otherwise we use the lines perpendicular -% to the circle at \gbc{from} and perpendicular to the chord at its -% midpoint. The latter is better when \gbc{ang} is between $-30$ and $30$ -% degrees. -% \begin{macrocode} -vardef arccenter (expr from, to, sweep) = - save ang, c; - pair c; - ang := 90 - (sweep mod 360)/2; % -90 < ang <= 90 - if (abs(ang) = 90) or (from = to) : - GBmsg "The central point of this arc is undefined. " & - "Using midpoint of chord instead."; - 0.5[from, to] - else: - save cd; pair cd; cd := to - from; - c = from + whatever*(cd rotated ang); - if abs(ang) < 30 : - c = (0.5)[from, to] + whatever*(cd rotated 90); - else: - c = to + whatever*(-cd rotated -ang); - fi - c - fi -enddef; - -% \end{macrocode} -% -% \DescribeRoutine{midarc} -% This finds the midpoint of the arc determined by two points and an -% angle. It work because the angle subtended at \gbc{from} by an arc of -% length \gbc{sweep/2} is \gbc{sweep/4}. We use it for small angles, as -% we can then draw the arc without having to find its center. -% \begin{macrocode} -vardef midarc (expr from, to, sweep) = - save m, cd; pair m, cd; - cd := to - from; - m = from + whatever*( cd rotated (-sweep/4)); - m = 0.5[from, to] + whatever*(cd rotated 90); - m -enddef; +def arccps = arc enddef; % \end{macrocode} % @@ -5277,57 +6006,112 @@ enddef; % them. If the points are equal or the sweep makes the arc undefined, we % return a line segment. If the sweep is less than 90 degrees we use the % idea from the code of \mfc{quartercircle}, except, when the sweep is -% greater than 45 degrees we let \MF{} find the midpint \gbc{m} of the -% arc. Otherwise, we get the center of the circle and call \gbc{mkarc}. -% \begin{macrocode} -vardef arcpps (expr from, to, sweep) = - if ((sweep mod 360) = 0) or (from = to) : - GBmsg "Undefined arc. A line segment will be used instead."; - from--to - elseif abs(sweep) <= 90 : - save cd; pair cd; cd := to - from; - if abs(sweep) <= 45 : - from{cd rotated (-sweep/2)}..to{cd rotated (sweep/2)} +% greater than 45 degrees we let \MF{} find the midpoint \gbc{m} of the +% arc. Otherwise, we get the center \gbc{c} of the circle and call +% \gbc{mkarc}. +% +% The code for finding \gbc{c} and \gbc{m} used to be separate commands, +% \gbc{arccenter} and \gbc{midarc}. However, this is the only place we +% used them and the several cases that they had to consider are reduced +% because the \mfc{if} in this command takes care of some of them. +% +% The code for finding \gbc{m} uses the fact that chord and the line +% from one of its endpoints to the midpoint subtend a circular arc of +% \gbc{sweep/2} and so the angle between them is half that, \gbc{sweep/4}. +% The code gets the intersection between the line in that direction and +% the perpendicular bisector of the chord. +% +% We find the center by intersecting two lines. One is the radius from +% one end of the chord. Then we branch on two cases: if the chord is close +% to a diameter, use its perpendicular bisector as the other line, +% otherwise use the radius from the opposite end of the chord. Here +% \gbc{cd} is a vector in the direction of the chord from \gbc{begpt} to +% \gbc{endpt}. The angle \gbc{ang} is the amount we have to rotate +% \gbc{cd} about \gbc{begpt} to make it point toward the center of the +% circle. This gives the radius mentioned above. +% \begin{macrocode} +vardef arcpps (expr begpt, endpt, sweep) = + if begpt = endpt: begpt--endpt + else: + setpair (cd) unitvector (endpt-begpt); + if abs(sweep) <= 45: + begpt{cd rotated (-sweep/2)}..endpt{cd rotated (sweep/2)} + elseif abs(sweep) <= 90: + save m; pair m; + m = begpt + whatever*( cd rotated (-sweep/4)); + m = 0.5[begpt, endpt] + whatever*(cd rotated 90); + begpt{cd rotated (-sweep/2)}..m{cd}..endpt{cd rotated (sweep/2)} else: - from{cd rotated (-sweep/2)}..midarc(from, to, sweep){cd} - ..to{cd rotated (sweep/2)} + setnumeric (ang) 90 - ((sweep/2) mod 180); + if abs(ang) = 90: + GBwarn "undefined arc. A line segment will be used instead."; + begpt--endpt + else: + save c; pair c; + c = begpt + whatever*(cd rotated ang); + c = if abs(ang) < 30: + (0.5)[begpt, endpt] + whatever*(cd rotated 90) + else: + endpt + whatever*(-cd rotated -ang) + fi; + mkarc (c, begpt, endpt, sweep) + fi fi - else: - save center; pair center; - center := arccenter (from, to, sweep); - mkarc (center, from, to, sweep) fi enddef; % \end{macrocode} % +% \DescribeRoutine{arcpp} +% In this, two points and the radius of the circle are given. Alone, this +% would determine two circles and therefore 4 arcs. We reduce the +% possibilities to two by assuming the arc is anticlockwise from the first +% point to the second if \gbc{rad} is positive, clockwise if negative. +% Then \gbc{arcpp} produces the one that has absolute value no more than +% 180 degrees if \gbc{small} is true, otherwise the other one. +% \DescribeRoutine{arcppr}\gbc{arcppr} is just \gbc{arcpp} with the +% boolean argument \gbc{small} last (for compatibility with previous +% \mfpic{} versions). +% +% The code computes the angle of the arc and calls \gbc{arcpps}. If the +% radius is not larger than half the distance between the points, we make +% the angle $\pm 180$, which produces a half circle. +% \begin{macrocode} +vardef arcpp (expr small, begpt, endpt, rad) = + save full, ang; full := signof (rad) 360; + if 2*abs(rad) > abs(begpt - endpt): + ang := if not small: full - fi 2*asin (abs(begpt-endpt)/(2rad)); + else: ang := signof (rad) 180; + fi + arcpps (begpt, endpt, ang) +enddef; +def arcppr (expr begpt, endpt, rad, small) = + arcpp (small, begpt, endpt, rad) +enddef; + +% \end{macrocode} +% % \DescribeRoutine{arcplr} % This one takes the center and polar coordinates of the ends relative to % the center. We just call \gbc{mkarc} with the obviously computed % endpoints and sweep. % \begin{macrocode} vardef arcplr (expr center, frtheta, totheta, rad) = - if rad = 0 : - center -- center + if rad = 0: center--center else: - save from, to; pair from, to; - from := center + rad*dir frtheta; - to := center + rad*dir totheta; - if frtheta = totheta : - from--to - else: - mkarc (center, from, to, totheta - frtheta) - fi + mkarc (center, center + rad*dir frtheta, + center + rad*dir totheta, totheta - frtheta) fi enddef; + % \end{macrocode} % % \DescribeRoutine{arcalt} % This one is the same as above, but with the same argument order as % \gbc{sector}. % \begin{macrocode} -vardef arcalt (expr center, radius, anglefrom, angleto) = - arcplr (center, anglefrom, angleto, radius) +vardef arcalt (expr center, radius, frtheta, totheta) = + arcplr (center, frtheta, totheta, radius) enddef; % \end{macrocode} @@ -5347,11 +6131,16 @@ enddef; % \end{macrocode} % % \DescribeRoutine{ellipse} -% \DescribeRoutine{circle} -% We get an ellipse by x-scaling and y-scaling a unit circle, rotating it +% We get an ellipse by xscaling and yscaling a unit circle, rotating it % and then shifting it into position. All parameters are coordinate % independent expressions, with obvious meaning (\gbc{center} is a pair, the % rest numeric). \gbc{circle} is similar, but we only scale and shift. +% +% If either radius is negative, the sense of the ellipse is reversed and +% the starting point changes. If both are negative, only the starting +% point changes. +% \DescribeRoutine{circle} +% \gbc{circle} acts like \gbc{ellipse} with both radii the same. % \begin{macrocode} vardef ellipse (expr center, radx, rady, angle) = fullcircle xscaled (2*radx) yscaled (2*rady) rotated angle @@ -5360,37 +6149,53 @@ enddef; vardef circle (expr center, rad) = fullcircle scaled (2*rad) shifted center enddef; - % \end{macrocode} +% The next four implement different ways of specifying a circle. % \DescribeRoutine{circlecp} +% The first produces the circle with a given center passing through a +% given point. % \DescribeRoutine{circleppp} +% The second produces the circle passing through three given points. % \DescribeRoutine{circlepps} -% The next three implement different ways of specifying a circle. The -% first produces the circle with a given center passing through a given -% point. The second produces the circle passing through three given -% points. The third produces the circle passing through two given points +% The third produces the circle passing through two given points % in such a way that the arc from the first to the second has a given % angle. +% \DescribeRoutine{circleppr} +% The fourth produces the circle with the given radius passing +% through the two points in such a way that the angle from the first point +% to the second is between $0$ and $180$ degrees if the switch \gbc{small} +% is true. If \gbc{small} is false, then the clockwise arc from first to +% second is between $180$ and $360$. If \gbc{rad} is negative, the +% circles switch and their orientation is reversed. +% \DescribeRoutine{circlepp}\gbc{circlepp} is just \gbc{circleppr} with +% a different order of arguments (for previous \mfpic{} versions). +% +% These could be implemented by finding the center and radius and calling +% \gbc{circle}. However, we call the arc commands so that those points +% specified in the parameters that lie on the circle will be nodes of the +% path produced, in the given order. % \begin{macrocode} vardef circlecp (expr center, point) = mkarc (center, point, point, 360) & cycle enddef; vardef circleppp (expr one, two, three) = - save ang; numeric ang[]; - ang0 := cornerangle(three, one, two); - ang1 := cornerangle(one, two, three); - ang2 := cornerangle(two, three, one); - arcpps (one, two, 2ang0) & arcpps (two, three, 2ang1) & - arcpps (three, one, 2ang2) & cycle + arcpps (one, two, 2*cornerangle (three, one, two)) + & arcpps (two, three, 2*cornerangle (one, two, three)) + & arcpps (three, one, 2*cornerangle (two, three, one)) + & cycle enddef; vardef circlepps (expr one, two, sweep) = - save ang, full; numeric ang[], full; + save ang, full; full := signof (sweep) 360; - ang1 := sweep mod (full); - ang2 := full - ang1; - arcpps (one, two, ang1) & arcpps (two, one, ang2) & cycle + ang := sweep mod full; + arcpps (one, two, ang) & arcpps (two, one, full - ang) & cycle +enddef; +vardef circlepp (expr small, one, two, rad) = + arcpp (small, one, two, rad) & arcpp (not small, two, one, rad) & cycle +enddef; +def circleppr (expr one, two, rad, small) = + circleppr (one, two, rad, small) enddef; - % \end{macrocode} % % \DescribeRoutine{pathcenter} @@ -5400,11 +6205,11 @@ enddef; % finds the intersection of the perpendicular bisectors of two chords. % \begin{macrocode} vardef pathcenter expr p = - save a, cntr, n; pair cntr, a[]; + save a, cntr, n; pair cntr, a[]; n := length p; a1 = pnt 0 (p); a3 = pnt [n/2] (p); - if cycle p : + if cycle p: a2 = pnt [n/4] (p); a4 = pnt [3n/4] (p); else: @@ -5417,46 +6222,59 @@ vardef pathcenter expr p = enddef; % \end{macrocode} +% +% The next four commands create certain circles associated to +% triangles. The triangle is specified as a path expression, so they +% produce results for any path, but make sense only for a cyclic +% triangular path. +% % \DescribeRoutine{circumcircle} +% This is just the circle through the three corners. +% % \DescribeRoutine{incircle} -% \DescribeRoutine{excircle} +% This produces the circle inside the triangle that is tangent to all +% three sides. It makes use of the fact that the two tangent +% points on the sides adjacent to corner \gbc{A} (for example) are +% equidistant from \gbc{A}. The three equations then express the fact that +% the sum of the two distances from the tangent point to the corners on +% the same side add up to the length of the side. +% \DescribeRoutine{excircle} In \gbc{excircle}, a corner is given (by +% number from $0$ to $2$) and the circle is produced that is +% \emph{outside} the triangle and is tangent to the side opposite the +% point and tangent to the extensions of the other two sides. +% % \DescribeRoutine{ninepointcircle} -% These four create the relevant circles from a given triangle. The -% triangle is specified as a path expression, so they produce results for -% any path, but make sense only for a cyclic triangular path. +% This circle passes through the following nine points: the midpoint of +% each side, the point on each side (extended, if necessary) where the +% altitude from the opposite corner meets it, and the midpoint of the +% segments connecting each corner to the intersection of the altitudes. % \begin{macrocode} vardef circumcircle expr t = circleppp (pnt0 (t), pnt1 (t), pnt2 (t)) enddef; vardef incircle expr t = - save A, B, C; pair A, B, C; + save A, B, C; pair A, B, C; A := pnt0 (t); B := pnt1 (t); C := pnt2 (t); - % Find the tangent points on the sides. E.g., a is the common - % distance from A to the tangent points on the adjacent sides. - save a, b, c; - a + b = abs (B-A); - b + c = abs (C-B); - a + c = abs (A-C); - circleppp (A + a*unitvector (B-A), - B + b*unitvector (C-B), - C + c*unitvector (A-C)) + save a, b, c, D, E, F; + D := abs (B-A) = a + b; + E := abs (C-B) = b + c; + F := abs (A-C) = a + c; + circleppp ((a/D)[A,B], (b/E)[B,C], (c/F)[C,A]) enddef; vardef excircle expr n of t = - save A, B, C; pair A, B, C; - A := pnt[n] (t); - B := pnt[n + 1] (t); % wraps around + save A, B, C; pair A, B, C; + A := pnt[n] (t); + B := pnt[n + 1] (t); C := pnt[n + 2] (t); - save a, b, c; - a - b = abs (B-A); - b + c = abs (C-B); - a - c = abs (C-A); - circleppp (A + a*unitvector(B-A), - B + b*unitvector(C-B), - C + c*unitvector(C-A)) + save a, b, c, D, E, F; + D := abs (B-A) = a - b; + E := abs (C-B) = b + c; + F := abs (C-A) = a - c; + circleppp ((a/D)[A,B], (b/E)[B,C], (c/F)[A,C]) enddef; vardef ninepointcircle expr t = @@ -5465,30 +6283,28 @@ enddef; % \end{macrocode} % -% \DescribeRoutine{circumcenter} -% \DescribeRoutine{incenter} -% \DescribeRoutine{excenter} -% \DescribeRoutine{ninepointcenter} % \DescribeRoutine{barycenter} -% These find various centers associated with a triangle. The last one is -% made to work for any path. +% This is the average of the three corners of the triangle, or of any +% path. If \gbc{t} is an open path with length $n$ and the nodes are +% $x\sb0$ through $x\sb n$, the barycenter is +% $$ \frac{1}{n+1}\sum\sb{j=0}\sp{n} x\sb j. $$ +% If \gbc{t} is a cycle with $x\sb n = x\sb0$, then it is +% $$ \frac{1}{n}\sum\sb{j=0}\sp{n-1} x\sb j. $$ +% +% For a triangle the barycenter is the intersection of the medians. I +% don't recall if this is the center of any important circle. +% +% The centers of the various circles associated with triangles can be +% found with \gbc{pathcenter}. Or by intersecting vasious lines: the +% \emph{incenter} (center of the inscribed circle)is the intersection of +% the angle bisectors; the \emph{circumcenter} is the intersection of the +% prependicular bisectors. % \begin{macrocode} -vardef circumcenter expr t = pathcenter circumcircle t enddef; -vardef incenter expr t = pathcenter incircle t enddef; -vardef excenter expr n of t = pathcenter excircle n of t enddef; -vardef ninepointcenter expr t = pathcenter ninepointcircle t enddef; - -% Make this work for any path. -% Divide as we go, -% decrease chance of overflow. vardef barycenter expr t = - save n, m; n := length t; m := n + 1; - save xxx; - xxx : = pnt0 (t)/m for k = 1 upto n-1 : + pnt[k] (t)/m endfor; - if cycle t: xxx*(1 + 1/n) - else: xxx + pnt[n] (t)/m - fi + save m; m := length t if not cycle t: + 1 fi; + pnt0(t)/m for k = 1 upto m - 1: + pnt[k](t)/m endfor enddef; + % \end{macrocode} % % \DescribeRoutine{sector} @@ -5504,15 +6320,14 @@ enddef; % \end{macrocode} % % -% \section{Plotting of functions} -% -% In these macros, if the boolean argument \gbc{smooth} is true then the -% path returned will be a B\'ezier, otherwise it will be a polyline. The -% parameter is simply passed to \gbc{mkpath}. If a \gbc{tens} parameter -% exists, then the smooth version will have that value of tension, -% otherwise the value of \gbc{default_tension} is used. +% \subsection{Plotting of functions}\label{functionplots} % -% All of these macros call \gbc{mkfcn}. +% In these macros, if the boolean argument \gbc{sm} is true then the +% path returned will be a B\'ezier, otherwise it will be a polyline. If a +% \gbc{tens} parameter exists, then the smooth version will have that +% value of tension, otherwise the value of \gbc{default_tension} is used. +% These two parameters are simply passed to \gbc{mkpath} by \gbc{mkfcn}, +% and all these macros call \gbc{mkfcn}. % % \DescribeRoutine{mkfcn} % In this command the text parameter \gbc{pf} should be the name of a @@ -5520,30 +6335,33 @@ enddef; % return a pair expression. The parameters \gbc{bmin}, \gbc{bmax} and % \gbc{bst} determine a sequence of numeric values starting at \gbc{bmin}, % stepping by \gbc{bst} and ending with \gbc{bmax}. These are fed to -% \gbc{pf} and the resulting pairs stored in an array. Then -% \gbc{mksmooth} is called with the tension \gbc{tens} and the name of the -% array. +% \gbc{pf} and the resulting pairs stored in an array. Then either +% \gbc{mkpoly} or \gbc{mksmooth} is called with the tension \gbc{tens} and +% the name of the array. % % For stability, we don't actually step by \gbc{bst}, but round % \gbc{(bmax-bmin)/bst} and step that many equal steps. We first adjust % the step size upward so the number of steps doesn't exceed % \gbc{infinity}. The path is forced to begin at \gbc{pf(bmin)} and -% end at \gbc{pf(bmax)} +% end at \gbc{pf(bmax)} even if that is not an integer multiple of +% \gbc{bst}. +% +% \DescribeRoutine{tfcn}This is included for backward compatibility. % \begin{macrocode} -vardef mkfcn (expr smooth, tens) (expr bmin, bmax, bst) (text pf) = - save _p; pair _p[]; _p := 0; - save _dx, _n, _r; numeric _dx, _n, _r; - if bmax = bmin : _n := 1; +vardef mkfcn (expr sm, tens) (expr bmin, bmax, bst) (text pf) = + save _p; pair _p[]; _p := 0; + save _dx, _n, _r; numeric _dx, _n, _r; + if bmax = bmin: _n := 1; else: _r := bmax - bmin; _dx := max (abs(bst), nottoosmall*abs(_r), epsilon); _n := emax (round(abs(_r)/_dx), 1); fi for _i = 0 upto _n: _p[incr _p] := pf(bmin + _i/_n*_r); endfor - mkpath (smooth, tens, false, _p) + mkpath (sm, tens, false, _p) enddef; -% compatibility: -def tfcn (expr smooth) = mkfcn (smooth, default_tension) enddef; + +def tfcn (expr sm) = mkfcn (sm, default_tension) enddef; % \end{macrocode} % @@ -5561,9 +6379,9 @@ def tfcn (expr smooth) = mkfcn (smooth, default_tension) enddef; % that accept a tension argument (\gbc{tfunction} and \gbc{tplrfcn}) and % call them with the default tension. % \begin{macrocode} -def parafcn (expr smooth) = tparafcn (smooth, default_tension) enddef; +def parafcn (expr sm) = tparafcn (sm, default_tension) enddef; vardef tparafcn (expr sm, tn) (expr bmin, bmax, bst) (text pf) = - save _fp; vardef _fp (expr t) = pf enddef; + save _fp; vardef _fp (expr t) = pf enddef; mkfcn (sm, tn) (bmin, bmax, bst) (_fp) enddef; @@ -5574,34 +6392,46 @@ enddef; % valued function \gbc{f}, to a pair valued function \gbc{(x, f(x))}, then % calls \gbc{mkfcn} to return the path that should be the graph of $f(x)$. % \begin{macrocode} -vardef xfcn (expr smooth) (expr xmin, xmax, st) (text _fx) = - save _fp; vardef _fp (expr _x) = (_x, _fx(_x)) enddef; - mkfcn (smooth, default_tension) (xmin, xmax, st) (_fp) +vardef xfcn (expr sm) (expr xmin, xmax, st) (text _fx) = + save _fp; vardef _fp (expr _x) = (_x, _fx(_x)) enddef; + mkfcn (sm, default_tension) (xmin, xmax, st) (_fp) enddef; % \end{macrocode} % % \DescribeRoutine{function} -% This is to \gbc{xfcn} as \gbc{parafcn} is to \gbc{mkfcn}: it -% takes a text argument and copies it into a vardef so as to define a pair -% valued function with a literal \gbc{x} as the argument. +% This is like \gbc{xfcn} but its last argument, instead of a function, +% is a text argument that can be copied literally it into a vardef so as +% to define a pair valued function with a literal \gbc{x} as the argument. % % \DescribeRoutine{btwnfcn} % This is mainly for the sake of simpler \mfpic{} output, implementing -% the \cs{btwnfcn} macro. +% the \cs{btwnfcn} macro. One could code it in \mfpic{} macros with two +% calls to \gbc{function}. +% +% \DescribeRoutine{belowfcn} +% This is essentially \gbc{btwnfcn} with the first function identically +% 0, but it more efficiently graphs $0$ with one straight line +% rather than several end-to-end. % \begin{macrocode} -def function (expr smooth) = tfunction (smooth, default_tension) enddef; -vardef tfunction (expr smooth, tens) (expr xmin, xmax, st) (text _fx) = - save _fp; vardef _fp (expr x) = (x, _fx) enddef; - mkfcn (smooth, tens) (xmin, xmax, st) (_fp) +def function (expr sm) = tfunction (sm, default_tension) enddef; +vardef tfunction (expr sm, tens, xmin, xmax, st) (text _fx) = + save _fp; vardef _fp (expr x) = (x, _fx) enddef; + mkfcn (sm, tens) (xmin, xmax, st) (_fp) enddef; -def btwnfcn (expr sm) = tbtwnfcn (sm, default_tension) enddef; -vardef tbtwnfcn (expr sm, tn)(expr xlo, xhi, st)(text _fx)(text _gx) = +def btwnfcn (expr sm) = tbtwnfcn (sm, default_tension) enddef; +vardef tbtwnfcn (expr sm, tn, xlo, xhi, st)(text _fx)(text _gx) = tfunction (sm, tn) (xlo, xhi, st) (_fx) -- ( reverse tfunction (sm, tn) (xlo, xhi, st) (_gx) ) -- cycle enddef; +def belowfcn (expr sm) = tbelowfcn (sm, default_tension) enddef; +vardef tbelowfcn (expr sm, tn, xlo, xhi, st)(text _fx) = + (xlo,0)--(xhi,0)-- + (reverse tfunction (sm, tn, xlo, xhi, st)(_fx))--cycle +enddef; + % \end{macrocode} % % \DescribeRoutine{rfcn} @@ -5610,32 +6440,1304 @@ enddef; % curve $(\theta, f(\theta))$, converts that to a curve in rectangular % coordinates and calls \gbc{mkfcn} on it. % \begin{macrocode} -vardef rfcn (expr smooth) (expr tmin, tmax, st) (text ft) = - save _fq; vardef _fq (expr t) = (ft(t)) * (dir t) enddef; - mkfcn (smooth, default_tension) (tmin, tmax, st) (_fq) +vardef rfcn (expr sm, tmin, tmax, st) (text ft) = + save _fq; vardef _fq (expr t) = (ft(t)) * (dir t) enddef; + mkfcn (sm, default_tension) (tmin, tmax, st) (_fq) enddef; % \end{macrocode} % % \DescribeRoutine{plrfcn} -% This is to \gbc{rfcn} as \gbc{parafcn} is to \gbc{mkfcn}: the -% text argument should be code that can be copied literally into a -% \mfc{vardef} creating a numeric function with a literal \gbc{t} as the -% parameter (representing $\theta$). +% This is like \gbc{rfcn}, but with a text argument containing code that +% can be copied literally into a \mfc{vardef} creating a numeric function +% with a literal \gbc{t} as the parameter (representing $\theta$). +% +% \DescribeRoutine{btwnplrfcn} This is the polar version of \gbc{btwnfcn}. % \begin{macrocode} -def plrfcn (expr smooth) = tplrfcn (smooth, default_tension) enddef; -vardef tplrfcn (expr smooth, tens) (expr tmin, tmax, st) (text ft) = - save _fq; vardef _fq (expr t) = (ft) * (dir t) enddef; - mkfcn (smooth, tens) (tmin, tmax, st) (_fq) +def plrfcn (expr sm) = tplrfcn (sm, default_tension) enddef; +vardef tplrfcn (expr sm, tens, tmin, tmax, st) (text ft) = + save _fq; vardef _fq (expr t) = (ft) * (dir t) enddef; + mkfcn (sm, tens) (tmin, tmax, st) (_fq) +enddef; + +def btwnplrfcn (expr sm) = tbtwnplrfcn (sm, default_tension) enddef; +vardef tbtwnplrfcn (expr sm, tn, tlo, thi, st)(text _ft)(text _gt)= + tplrfcn (sm, tn, tlo, thi, st) (_ft) -- + ( reverse tplrfcn (sm, tn, tlo, thi, st) (_gt) ) -- cycle enddef; +def plrregion (expr sm) = tplrregion (sm, default_tension) enddef; +vardef tplrregion (expr sm, tn, tlo, thi, st) (text _ft) = + (0,0)--tplrfcn (sm, tn, tlo, thi, st ) (_ft)--cycle +enddef; % \end{macrocode} % +% \DescribeRoutine{mklevelset} +% This command assumes \gbc{inside_levelset} has been defined, which +% should be a boolean-valued function of two variables. It tries to create +% a path such that the expression is true inside the path and false +% outside it. The intended application is to obtain a path surrounding a +% region like $\lbrace (x,y) \mid F(x,y) > 0 \rbrace$. % -% \section{Pie charts and bar charts} +% The parameters are +% \begin{itemize} +% \item \gbc{sm}: Boolean, smooth path (true) or polyline. +% \item \gbc{tens}: Numeric, the tension (if \gbc{sm} is true). +% \item \gbc{X} and \gbc{Y}: A starting point where \gbc{_inside_} +% should return true. +% \item \gbc{t}: Numeric, a step size. +% \item \gbc{a}, \gbc{b}, \gbc{c}, and \gbc{d}: Numeric, the limits +% beyond which the search routine will not go. This is needed to +% get a starting range for the binary chop method of \mfc{solve}. +% In practice, the extent of the \mfpic{} figure will be used. +% \end{itemize} % -% \DescribeRoutine{piechart} -% The \gbc{piechart} command calculates the wedges of a pie from the text +% We use \mfc{solve} to find the first point $z\sb1$ to the right of the +% given point that is on the edge of the region. Then we find the first +% point of intersection between the circle at $z\sb1$ with radius \gbc{t} +% and the edge of the region. Continue from this new point to the next +% until (one hopes) we are within a distance \gbc{t} of the first point. +% The radius \gbc{t} should be in coordinates appropriate for the use: +% graph coordinates when used in \mfpic{} figures. +% +% The tolerance used in the first \mfc{solve} is \gbc{t/50}. In later uses +% it is an angle parameter and is set to a number of degrees sufficient to +% give a distance tolerance at least that. +% +% If the starting point \gbc{(X,Y)} does not actually satisfy the +% condition, a one point path is returned. +% \begin{macrocode} +numeric tolerancefactor; +tolerancefactor := .02; +vardef mklevelset (expr sm, tens, X, Y, t, a, b, c, d) = + save _inside_; + vardef _inside_ (expr U, V) = + inside_levelset (U, V) and (a < U) and (U < b) + and (c < V) and (V < d) + enddef; + if not _inside_ (X, Y): + GBwarn "Invalid seed point for levelset."; + pairmax((a,c), pairmin((X,Y), (b,d)))&cycle + else: + save ls, W, A, B, prev, curr, seed; + pair ls[], prev, curr, seed; + seed := (X,Y); + ls := 0; W := 0; + + save _first_, _next_, get_next; + vardef _first_ (expr U) = _inside_ (U, Y) enddef; + vardef _next_ (expr ang) = + _inside_ (X_curr + t * cosd ang, Y_curr + t * sind ang) + enddef; + def get_next (expr angA, angB) = + X_curr := xpart curr; Y_curr := ypart curr; + ls[incr ls] := curr + t * dir (solve _next_ (angA, angB)); + prev := curr; curr := ls[ls]; + W := W + anglefromto (prev - seed, curr - seed); + enddef; + + interim tolerance := t*tolerancefactor; + ls[incr ls] := (solve _first_ (X, b), Y); + curr := ls[ls]; + interim tolerance := radian*tolerancefactor; + get_next (180, 0); + for n = 3 upto max_points: + A := angle (curr - prev); + get_next (A + 120, A - 120); + exitif ((abs(W) > 180) or (ls > 10)) + and (abs(ls[ls] - ls1) < 1.2t); + endfor + mkpath (sm, tens, true) (ls) + fi +enddef; + +% \end{macrocode} +% \DescribeRoutine{levelset} +% This is the \mfpic{} interface. It checks the \gbc{t} parameter before +% passing it to \gbc{mklevelset}, making sure it is not zero, it passes +% appropriate limits, and defines boolean function \gbc{mklevelset} +% expects with literal \mfc{x} and \mfc{y} as parameters, using the text +% parameter \gbc{cond}. +% \begin{macrocode} +numeric max_points; +max_points := 2000; + +def levelset (expr s) = tlevelset (s, default_tension) enddef; +vardef tlevelset (expr smth, tens, seed, seg) (text cond) = + save inside_levelset, _t; + vardef inside_levelset (expr x, y) = cond enddef; + _t := if seg <= 0: emax (xpos-xneg, ypos-yneg)/max_points * 20 + else: seg fi; + mklevelset (smth, tens, xpart seed, ypart seed, _t) + (xneg, xpos, yneg, ypos) +enddef; + +% \end{macrocode} +% +% \section{Modification of Paths}\label{modification} +% +% \subsection{Closing a path}\label{closing} +% +% In \MF{} one closes a path with any legal path connection between the +% last point and the keyword \mfc{cycle}. Connecting the last point to the +% first point is not enough. \Grafbase{} commands provide a few different +% ways. All the commads take an undelimited path expression as the last +% parameter and return a cycle (closed path). If the path is already +% closed, it is returned unchanged. +% +% All the closure commands have a version with a tension parameter when +% that makes sense. Those versions create the join with the supplied +% tension. The ones where it doesn't make sense are \gbc{lclosed}, +% \gbc{cbclosed} and \gbc{qbclosed}. The first always uses a straight line +% and the other two require explicit controls. +% +% \DescribeRoutine{lclosed} +% This closes with a line segment. If the first and last point are +% already equal, we just use the \mfc{\&} path join. +% \begin{macrocode} +vardef lclosed expr f = + f + if not cycle f: + if pnt0(f) = pnt[infinity](f): & else: -- fi cycle + fi +enddef; + +% \end{macrocode} +% \DescribeRoutine{sclosed} +% This closes the path in the manner that \gbc{mksmooth} creates a path. +% This will change the first and last segment of the original path. In +% particular, if there are fewer than three segments, the whole path can +% be different. It has a variant \DescribeRoutine{sclosedt}\gbc{sclosedt} +% that takes a tension argument. +% \begin{macrocode} +def sclosed = sclosedt (default_tension) enddef; +vardef sclosedt (expr t) expr f = + if cycle f: f + else: save n; n := length f; + if n = 0: f&cycle + elseif n = 1: pnt0(f)..tension t..pnt1(f)..tension t..cycle + else: + (pnt0 (f)) { (pnt1(f)) - (pnt[n] (f)) }..tension t + ..(subpath (1, n-1) of f)..tension t + ..(pnt[n](f)) { pnt0(f) - pnt[n-1](f) } + ..tension t..cycle + fi + fi +enddef; + +% \end{macrocode} +% \DescribeRoutine{bclosed} +% This closes with the basic default \MF{} Bezi\'er. It is a smooth +% closure, but it does not have the same direction at the endpoints +% that \gbc{mksmooth (true)} would have produced. It has a tense variant +% \DescribeRoutine{bclosedt}\gbc{bclosedt} +% \begin{macrocode} +def bclosed = bclosedt (default_tension) enddef; +vardef bclosedt (expr t) expr f = + f + if not cycle f: + if pnt0(f) = pnt[infinity](f): & else: ..tension t.. fi cycle + fi +enddef; + +% \end{macrocode} +% \DescribeRoutine{uclosed} +% Same as \gbc{bclosed}. Retained for backward compatibility. There is +% a tense variant only for \DescribeRoutine{uclosedt}consistency. +% \begin{macrocode} +def uclosed = bclosed enddef; +def uclosedt = bclosedt enddef; + +% \end{macrocode} +% \DescribeRoutine{cbcontrols} +% This utility is for use in \gbc{cbclosed}. It converts Bezier segment +% key points of a path \gbc{f}, to cubic B-spline control points stored +% in an array \gbc{b}. The data needed are the first point and first two +% control points of a path. It is used twice in \gbc{cbclosed} on a path +% and on its reverse. The appropriate three points are passed in the array +% \gbc{t}. +% The B-spline points needed are \gbc{b1} and \gbc{b4}. The extra two +% points \gbc{b2} and \gbc{b3} divide the line from \gbc{b1} to \gbc{b4} +% into thirds and will be turned into Bezier control points of a new path +% segment. +% \begin{macrocode} +def cbcontrols (suffix b, t) = + b1 := 2[t3, t2]; + b2 := 2[t2, t1]; + b3 := 2[b1, b2]; + b4 := 2[b2, b3]; +enddef; + +% \end{macrocode} +% +% \DescribeRoutine{cbclosed} +% This closes a path with a cubic B-spline. If the path \gbc{f} had been +% produced by \gbc{opencbs}, then \gbc{q1} and \gbc{q4} would have been the +% last two points in the argument list, and \gbc{p4} and \gbc{p1} would +% have been the first two. We just use them and mimic the effect of +% \gbc{closedcbs}. +% \begin{macrocode} +vardef cbclosed expr f = + save n; n := length f; + if cycle f: f + elseif n = 0: f&cycle + else: + save p, q, t; pair p[], q[], t[]; + t1 := pnt0(f); t2 := post0(f); t3 := pre1(f); + cbcontrols (p, t); % defines p1 to p4 + t1 := pnt[n](f); t2 := pre[n](f); t3 := post[n-1](f); + cbcontrols (q, t); % defines q1 to q4 + f..controls q2 and q3..opencbs (q1,q4,p4,p1) + ..controls p3 and p2..cycle + fi +enddef; + +% \end{macrocode} +% +% \DescribeRoutine{qbclosed} +% It seemed wrong to be able to close with a cubic B-spline but not a +% quadratic B-spline; therefore I have add such a possibility. We +% calculate B-spline controls \gbc{p[n]} that will agree with those of +% \gbc{f}, if \gbc{f} had been created as a quadratic B-spline. Note +% that \gbc{cbclosed} required three \MF{} links to close the curve; +% \gbc{qbclosed} only requires two (\gbc{mkqbs} on an array of $n$ +% points makes $n-2$ links). +% \begin{macrocode} +vardef qbclosed expr f = + if cycle f: f + else: save n; n := length f; + if n = 0: f&cycle + else: + save p; pair p[]; p := 4; + p1 := (3/2)[pnt[n](f), pre[n](f)]; + p2 := 2[p1, pnt[n](f)]; + p4 := (3/2)[pnt 0 (f), post0 (f)]; + p3 := 2[p4, pnt 0 (f)]; + f & mkqbs (p) & cycle + fi + fi +enddef; + +% \end{macrocode} +% +% \DescribeRoutine{makesector} +% This makes sense only if the path being modified is an arc. It closes +% the arc by connecting its ends to the center of the circle, as +% computed by \gbc{pathcenter}. +% \begin{macrocode} +vardef makesector expr p = (pathcenter p)--p--cycle enddef; +% \end{macrocode} +% +% \DescribeRoutine{arccomplement} +% Getting the complement of an arc is easy if the arc is specified by +% three points. So we just select three points on the arc and do that. +% The \gbc{setpairs} statement makes \gbc{pp1}, \gbc{pp2} and \gbc{pp3} +% three points on the arc \gbc{p} in order. The arc we want goes from +% \gbc{pp3} to \gbc{pp1} with angle twice that of the corner angle at +% \gbc{pp2}. +% \begin{macrocode} +vardef arccomplement expr p = + if cycle p: onepointpath (false, pnt0(p)) + else: + setnumeric (nn) length p; + setpairs (pp) (pnt0(p), pnt[.5nn](p), pnt[nn](p)); + arcpps (pp3,pp1,2*cornerangle(pp2,pp3,pp1)) + fi +enddef; + +% \end{macrocode} +% +% \subsection{Trimming a path}\label{trimming} +% +% \DescribeRoutine{cutoffbefore} +% This is a useful utility operation present in \file{plain.mp} (as +% \mfc{cutbefore}) but missing from \file{plain.mf}. We write a different +% version for our purposes: it has the syntax of most of our path +% modification commands, plus the first loop tries to avoid a bug (or +% perhaps inaccuracy) in \mfc{intersectiontimes} which can return an +% intersection time in a later segment of \gbc{f} than the first +% intersection point. +% +% \DescribeRoutine{cutoffafter} +% What it and \gbc{cutoffafter} do is return the second path with the +% part before\slash after the first path removed. +% \begin{macrocode} +%<MF>path cuttings; +vardef cutoffbefore (expr b) expr f = + save t, n; n := length f; + if n > 0: + for k = 1 upto n: + exitif (subpath (0,k) of f) intersects b; + endfor + if _Xtime < 0: + cuttings := pnt0 (f){0,0}; + f + else: + cuttings := subpath (0,_Xtime) of f; + subpath (_Xtime, n) of f + fi + else: f + fi +enddef; + +vardef cutoffafter (expr b) expr f = + setpath (g) cutoffbefore (b) reverse f; + cuttings := reverse cuttings; + reverse g +enddef; + +% \end{macrocode} +% +% \DescribeRoutine{trimmedpath} +% This takes two lengths and a path and trims off the ends of the path +% that lie within the given lengths of the endpoints. The lengths are in +% device coordinates, the path in graph coordinates. +% \begin{macrocode} +vardef trimmedpath (expr btrim, etrim) expr f = + save g, h; path g, h; + g := invvconv (fullcircle scaled 2btrim) shifted pnt0(f); + h := invvconv (fullcircle scaled 2etrim) shifted pnt[length f] (f); + cutoffafter (h) cutoffbefore (g) f +enddef; + +% \end{macrocode} +% +% \subsection{Creating arrows}\label{arrows} +% +% First, some better \mfc{direction} commands. They makes use of the fact +% (easily proved) that a cubic B\'ezier +% \[ +% z\sb0(1 - t)^3 + 3z\sb1(1-t)^2t + 3z\sb2(1-t)t^2 + z\sb3t^3 +% \] +% has a tangent at $z\sb0$ equal to the first one of $z\sb{j} -z\sb0$ +% that is nonzero. +% +% \DescribeRoutine{__dir} +% \gbc{__dir} gets the direction at point 0 for an arbitrary path. +% \gbc{postdirection} +% \DescribeRoutine{postdirection} +% reduces to this case using \mfc{subpath}. If the postdirection is +% $(0,0)$, that means the path is trivial from that point to the end so we +% are effectively at an endpoint (noncyclic path) and we use the incoming +% direction. If that is $(0,0)$, the path is trivial. +% \DescribeRoutine{predirection} +% \gbc{predirection} just runs \gbc{postdirection} on the reversed path. +% +% \DescribeRoutine{trivial} +% This returns \mfc{true} if a path has direction vector $(0,0)$ (as +% determined by \gbc{__dir}). +% \begin{macrocode} +vardef predirection@# (expr p) = + - postdirection[length p - @#] (reverse p) +enddef; + +vardef postdirection@# (expr p) = + save _n; _n := length (p); + setpair (v) __dir (subpath (@#, @# + _n) of p); + if v = origin: + v := - __dir (subpath (@#, @# - _n) of p); + fi + v +enddef; + +vardef __dir (expr p) = + save v, w; pair v, w; w := pnt0 (p); + v := origin; + for n = 1 upto length (p): + v := post[n-1] (p) - w; exitif v <> origin; + v := pre [ n ] (p) - w; exitif v <> origin; + v := pnt [ n ] (p) - w; exitif v <> origin; + endfor + sgn v +enddef; + +vardef trivial expr p = (__dir (p) = origin) enddef; + +% \end{macrocode} +% +% Arrowheads can be just two straight lines at an angle placed on the end +% of a curve, or it can be a filled triangle. \grafbase{} permits both, +% but it also allows the two lines (or the corresponding sides of the +% triangle) to be gracefully concave and tangent to the path at the +% endpoint of the path. The parameters controlling the shape of the arrowhead +% are the two numerics \gbc{hdwdr}, the ratio of the length to width of the +% arrowhead, and \gbc{hdten}, the tension in the two angled curves. By +% default, one side of an arrowhead is just the \MF{} path +% \mfc{a..b\marg{\meta{tangent}}}, where \mfc{a} is the base of the +% arrowhead (calculated from \gbc{hdwdr}) and \gbc{b} is the end of the +% path and \meta{tangent} is the direction of the path at that +% point. The curve can be straightened by increasing \gbc{hdten}, the +% head widened by increasing \gbc{hdwdr} +% +% The arrowhead is drawn by drawing two of the curves described above. If +% \gbc{hfilled} is \mfc{true}, the two base points (\gbc{a} above) are +% connected and the three sided region filled. +% \begin{macrocode} +newinternal hdwdr, hdten; +boolean hfilled; + +% \end{macrocode} +% +% \DescribeRoutine{headshape} +% The following utility not only adjusts the above parameters, but +% creates the arrowhead paths as it does so. Call it with two pure numbers +% \gbc{wr} and \gbc{tens} for the \gbc{hdwdr} and \gbc{hdten}, and a +% boolean \gbc{fil} for \gbc{hfilled}. The paths include two harpoon +% tips, an arrowhead, and the paths that give regions that will be erased +% when requested. +% \begin{macrocode} +def headshape (expr wr, tens, fil) = + interim hdwdr := wr; + interim hdten := if tens>0: tens else: default_tension fi; + if hdten < .75: hdten := .75; fi + setboolean (hfilled) fil; + mkheadpaths; +enddef; +def mkheadpaths = + save Arrowhead, Leftharpoon, Rightharpoon; + path Arrowhead, Leftharpoon, Rightharpoon, + Arrowhead.clear, Leftharpoon.clear, Rightharpoon.clear; + Rightharpoon := (0,0){down}..tension hdten..(.5hdwdr,-1); + Rightharpoon.clear := Rightharpoon--(.5hdwdr,0)--cycle; + Leftharpoon := (reverse Rightharpoon) xscaled -1; + Leftharpoon.clear := (reverse Rightharpoon.clear) xscaled -1; + Arrowhead := Leftharpoon & Rightharpoon; + Arrowhead.clear := Leftharpoon.clear & Rightharpoon.clear & cycle; + if hfilled: + Arrowhead := Arrowhead--cycle; + Rightharpoon := Rightharpoon--(0,-1)--cycle; + Leftharpoon := Leftharpoon--(0,-1)--cycle; + fi +enddef; +headshape (1,1,false); + +% \end{macrocode} +% +% \DescribeRoutine{ahead} +% This command draws an arrowhead. Current code for arrows no longer uses +% it. \gbc{front} and \gbc{back} are in device coordinates. They are the +% point of the arrowhead (\gbc{front}) and the point such that \gbc{front +% - back} is as long as the arrowhead and points in the direction of the +% arrow. We use the ratio \gbc{hwr} to compute the other two corners. So +% \gbc{side} is the vector from \gbc{back} to one of the corners \gbc{p1}, +% and the other corner is on the other side. \gbc{f} is the path of the +% arrowhead. +% +% If \gbc{filled} is true we close the curve draw it and fill it, +% otherwise we just draw it. (To only fill it, make the pen width $0$.) +% \gbc{clr} is the color used to draw or fill it. +% +% For backward compatibility we define \gbc{head}. In \MF{} \gbc{head} +% didn't have a color parameter, while in \MP{} it has always had one, +% in retrospect, this was not a good idea, and I should have followed +% the pattern of other macros. However, \gbc{head} was never a user-level +% macro and it didn't seem to mattered at the time. +% \begin{macrocode} +%<MF>def head = ahead (headcolor) enddef; +%<MP>def head = ahead enddef; + +vardef ahead (expr clr, front, back, hwr, tens, filled) = + settension (_tn) tens; fixtension (_tn); + if front <> back: + setpair (side) (hwr/2) * ((front-back) rotated 90); + setpath (f) (back + side)..tension _tn.. + {front-back}front{back-front}..tension _tn..(back - side); + if clearhead: + safeunfill (back - side)--(front-side)--(front+side)-- + (back+side) & f & cycle; + colorsafedraw (background) (back - side)--(front-side)-- + (front+side)--(back+side) & f & cycle; + fi + if filled: + f := f--cycle; + colorsafefill (clr) f; + fi + colorsafedraw (clr) f; + fi +enddef; + +% \end{macrocode} +% +% It is a fact of life that, unless the path to which the head is added is +% a straight line, the arrowhead may appear to point in the wrong +% direction. But I know of no automatic way of making it always look +% correct. Therefore \grafbase{} and \mfpic{} have provided a means to +% micro-adjust the head. +% +% The various arrow creation commands take a path expression \gbc{f} in +% graph coordinates, puts a head/tail/decoration on it and returns +% \gbc{f}. There are also four parameters determining (i)~the color, +% (ii)~the size, (iii)~a rotation adjustment, and (iv)~a position +% adjustment. +% +% \DescribeRoutine{headpath}\RoutineIndex{colorheadpath} +% \RoutineIndex{headpathx}\RoutineIndex{colorheadpathx} +% \gbc{headpath} calls \gbc{Gheadpath}, a more general command that takes +% a boolean expression and a shape (path) suffix as arguments. It +% supplies \mfc{false} for the boolean and \gbc{Arrowhead} for the shape. +% The \gbc{headpathx} version differs only in that the boolean is +% \mfc{true}. The \gbc{color...} versions call \gbc{colorGheadpath} in the +% same way, but require that a color parameter follow. +% \begin{macrocode} +def headpath = Gheadpath (false) (Arrowhead) enddef; +def headpathx = Gheadpath (true) (Arrowhead) enddef; + +def colorheadpath = colorGheadpath (false) (Arrowhead) enddef; +def colorheadpathx = colorGheadpath (true) (Arrowhead) enddef; + +% \end{macrocode} +% +% \DescribeRoutine{Gheadpath}\RoutineIndex{colorGheadpath} +% \RoutineIndex{Gheadpathx}\RoutineIndex{colorGheadpathx} +% For general arrowhead shapes we require two paths; one giving the shape +% of the head and the other the shape that is cleared when the boolean +% parameter \gbc{trim} is true. We pass this information by name with a +% suffix parameter \gbc{ah} that names the head shape. Then \gbc{ah.clear} +% names the cleared region. If \gbc{ah} is a cycle, the head is filled, +% otherwise it is drawn with the current \gbc{drawpen}. +% If one wants it drawn and center erased, one could place first the +% solid (filled) version with color \mfc{background}, then the outline +% (drawn only) version. +% +% We also need to know which point on the path is the tip, and +% \gbc{ah.tip} provides that. If \gbc{ah.clear} is undefined, the clearing +% is silently skipped. If \gbc{ah.tip} is unknown, it is taken to be +% \mfc{(0,0)}. The head shape is assumed to be initially defined +% pointing \mfc{up} (to match predefined shapes like \gbc{Triangle} and +% \gbc{Diamond}). +% +% The standard symbols for \gbc{plot} have both the clearing path and +% the tip defined. Thus one can produce \gbc{Diamond}-tipped arrows. The +% old arrow heads are given by \gbc{Arrowhead}, which is redefined with +% every call to \gbc{headshape}. +% +% If the \gbc{rot} and \gbc{pos} parameters are zero, the head is placed +% with its tip at the end of the path, pointing in the direction of the +% path at that point. Otherwise, the head is rotated around the tip by the +% amount \gbc{rot} and \emph{then} shifted backward along its new +% direction by the amount \gbc{pos}. +% +% We have a version that takes a color parameter. The simpler version +% simply calls it with \gbc{clr} equal to \gbc{headcolor}. +% \begin{macrocode} +def Gheadpath (expr trim) (suffix ah) = + colorGheadpath (trim) (ah) (headcolor) +enddef; +vardef colorGheadpath +(expr trim) (suffix ah) (expr clr, sc, rot, pos) expr f = + if (sc <> 0) and (known ah) and (path ah): + convertpath (_g) f; + setpair (_P) predirection[length _g] (_g); + if _P <> origin: + _P := _P rotated rot; + setnumeric (_ang) anglefromto (up, _P); + _P := pnt[length _g] (_g) - pos * _P; + setpair (_tip) if known ah.tip: ah.tip else: origin fi; + + if trim: + if known ah.clear: + safeunfill (ah.clear shifted - _tip) + scaled sc + rotated _ang + shifted _P; + fi + setnumeric (_ys) max(bp, penwd, last_dot_size); + safeunfill cut_path +%<MP> xscaled sc yscaled _ys +%<MF> xscaled ceiling sc yscaled ceiling _ys + rotated _ang shifted _P; + fi + if cycle ah: colorsafefill else: colorsafedraw fi (clr) + (ah shifted -_tip) + scaled sc + rotated _ang + shifted _P; + fi + fi + f +enddef; + +% \end{macrocode} +% +% \DescribeRoutine{tailpath}\RoutineIndex{colortailpath} +% This places a tail at the start of a path. It is almost like +% \gbc{Gheadpath} except there is no clearing done and the tip is at the +% start (point 0) of the path. Also, the position parameter \gbc{pos} is a +% forward shift. +% +% \DescribeRoutine{midpath}\RoutineIndex{colormidpath} +% This is just like \gbc{tailpath} except it puts the given shape +% somewhere in the middle of the path. Its position parameter indicates +% the fraction of the length of the path where the shape is to be placed. +% This works best in two cases: the shape has a definite direction (like +% the \gbc{Arrowhead}) and the tip is placed at the given position, or the +% shape has a center of symmetry and that is placed at the given position. +% We obtain this in most cases by shifting $(0,0)$ to that position. The +% standard arrowhead has its tip at this point, and the standard symbols +% (with the exception of \gbc{Circle}) have their center of symmetry there. +% \begin{macrocode} +def tailpath (suffix sh) = colortailpath (sh) (headcolor) enddef; +vardef colortailpath (suffix sh) (expr clr, sc, rot, pos) expr f = + if (sc <> 0) and (known sh) and (path sh): + convertpath (_g) f; + setpair(_P) postdirection0 (_g); + if _P <> origin: + _P := _P rotated rot; + if cycle sh: colorsafefill else: colorsafedraw fi (clr) + (sh if known sh.tip: shifted -sh.tip fi) + scaled sc + rotated anglefromto (up, _P) + shifted (pnt0 (_g) + pos * _P); + fi + fi + f +enddef; + +def midpath (suffix sh) = colormidpath (sh) (headcolor) enddef; +vardef colormidpath (suffix sh) (expr clr, sc, rot, pos) expr f = + if (sc <> 0) and (known sh) and (path sh): + convertpath (_g) f; + setnumeric (_t) pathtime[pos] (_g); + setpair (_P) postdirection[_t] (_g); + if _P <> origin: + _P := _P rotated rot; + if cycle sh: colorsafefill else: colorsafedraw fi (clr) + sh scaled sc + rotated anglefromto (up, _P) + shifted (pnt[_t] (_g)); + fi + fi + f +enddef; + +% \end{macrocode} +% +% \subsection{Randomizing a path} +% +% In order to randomly change a path, we need to randomly change its +% points and its controls. If we just apply independent random shifts to +% every point and control point, it could happen that the direction from a +% point to a control changes dramatically, introducing a wild change even +% with a small shift (if point and control were very close to begin with). +% Also, this method would almost guarantee that a smooth path would +% randomize into one with all corners. Our solution to these problems is +% in the following paragraph. +% +% If $z\sb0$ and $z\sb3$ are the start and end points, with controls +% $z\sb1$ and $z\sb2$, then we randomize $z\sb0$ and $z\sb3$ using a +% random shift with size supplied as a parameter. If there was a +% preceeding segment, its ending angle and the angle of $z\sb1-z\sb0$ +% determine an angle difference which we multiply by a random factor. +% This determines the direction to the new control point. If there was no +% preceeding segment we rotate $z\sb1-z\sb0$ a random amount. Finally we +% randomly scale $|z\sb1-z\sb0|$. +% +% The following `\gbc{deviate}s' are analogous to \MF{}'s +% \mfc{uniformdeviate}. The first, \DescribeRoutine{signeddeviate} +% \gbc{signeddeviate X}, produces a random number uniformly distributed in +% $(-X, X)$. The second, \DescribeRoutine{scaledeviate} +% \gbc{scaledeviate (W, A)}, produces a pair in a particular direction +% with length distributed in $(2^{-w}, 2^w)$. The third, +% \DescribeRoutine{polardeviate}\gbc{polardeviate R} produces a pair +% whose polar coordinates are separately uniformly distributed, the radius +% over the interval $(0, R)$ the angle over $(0,360)$. The last, +% \DescribeRoutine{xydeviate}\gbc{xydeviate (X,Y)}, produces a pair +% uniformly distributed over the rectangle with corners at $(-X,-Y)$ and +% $(X,Y)$. +% +% \DescribeRoutine{randompair} +% Finally, \gbc{randompair} runs \gbc{polardeviate} if \gbc{X} is +% numeric and \gbc{pairdeviate} if it is a pair. +% \begin{macrocode} +vardef signeddeviate primary X = + (uniformdeviate 1)[-X,X] +enddef; +vardef scaledeviate (expr W, A) = + 2 ** (signeddeviate W) * dir A +enddef; +vardef polardeviate primary R = + (uniformdeviate abs(R)) * dir uniformdeviate 360 +enddef; +vardef xydeviate primary Z = + (signeddeviate (xpart Z), signeddeviate (ypart Z)) +enddef; + +vardef randompair (expr maxshift) = + if numeric maxshift: polardeviate (maxshift) + elseif pair maxshift: xydeviate (maxshift) + else: (0,0) + fi +enddef; + +% \end{macrocode} +% +% \DescribeRoutine{randompath} +% The \gbc{randompath} macro returns a path formed from \gbc{f} by +% shifting each of its point with independent instances of +% \gbc{randompair (maxshift)}. Its control points are also modified, but +% the algorithm is not as simple. +% +% Let $X$ be one of the points of \gbc{f}, with precontrol $X-U$ and +% postcontrol $X+V$. We create random $X'$, $U'$ and $V'$ as follows. +% +% Let $S$ be the pair that results from \gbc{randompair(maxshift)}, let +% $w$ be the value of \gbc{weirdness}, let $\eta\sb j(w)$ be the value of +% the $j$th instance of \gbc{signeddeviate ($w$)}. +% Then $X' = X + S$, $U'$ is $U$ rotated $\beta=30\eta\sb1(w)$ and scaled +% $\sigma = 2^{\eta\sb2(w)}$. Let $\alpha$ be the angle between the two +% vectors $U$ and $V$. Then $V'$ is $\sigma V$ rotated to make the angle +% between $U'$ and $V'$ equal to $\alpha 2^{\eta\sb3(w)}$. +% In the new path, the point is $X'$ with precontrol $X'-U'$ and +% postcontrol $X' + V'$. Note that if the path is smooth at $X$, then +% $\alpha = 0$ and the new angle is also $0$. +% +% \DescribeRoutine{randomlines} +% This is a simpler version that simply shifts the nodes and connects +% the results with straight lines. It is intended to be applied to +% polyline paths. +% +% \DescribeRoutine{detrivialized} +% We start with a routine that strips out trivial segments from a path. +% This makes some loops a lot easier. We wouldn't want to differently +% shift the two (equal) endpoints of a trivial segment, making it +% nontrivial. +% \begin{macrocode} +vardef detrivialized expr f = + save g; path p, g[]; g := 0; + for k = 1 upto length f: + p := subpath (k-1,k) of f; + if not trivial p: g[incr g] := p; fi + endfor + if g = 0: onepointpath (cycle f, pnt0(f)) + else: g1 for k = 2 upto g: &g[k] endfor if cycle f: &cycle fi + fi +enddef; + +vardef randompath (expr maxshift, weirdness) expr f = + save g, n; path g; + g := detrivialized f; + n := length g; + if n = 0: + f shifted randompair (maxshift) + else: + save X, U, V; + pair X[], U[], V[]; + if cycle g: n := n - 1; fi + for k = 0 upto n: + X[k] := pnt[k](g); + U[k] := X[k] - pre[k](g); + V[k] := post[k](g) - X[k]; + endfor + save A, B; + for k := 0 upto n: + X[k] := X[k] shifted randompair (maxshift); + A := anglefromto (U[k],V[k]); + B := signeddeviate (30weirdness); + U[k] := X[k] - (U[k] zscaled scaledeviate (weirdness,B)); + B := B - A + A * (2 ** signeddeviate weirdness); + V[k] := X[k] + (V[k] zscaled scaledeviate (weirdness,B)); + endfor + X0 for k = 1 upto n: + .. controls V[k-1] and U[k] .. X[k] + endfor + if cycle g: + .. controls V[n] and U0 .. cycle + fi + fi +enddef; + +vardef randomlines (expr maxshift) expr f = + save g, n; path g; + g := detrivialized f; + n := length g; + if n = 0: + f shifted randompair (maxshift) + else: + if cycle g: n := n - 1; fi + (pnt0(g) shifted randompair (maxshift)) + for k = 1 upto n: + -- (pnt[k](g) shifted randompair (maxshift)) + endfor + if cycle g: + -- cycle + fi + fi +enddef; +% \end{macrocode} +% +% \subsection{Parallelling a path} +% +% \DescribeRoutine{parasegment} +% This creates a path parallel to a given cubic Bezier segment \gbc{f}. +% It should be called by a command (such as \gbc{parapath}) that makes +% sure \gbc{f} is nontrivial (meaning the directions are non-zero). It +% splits the segment into subsegments for accuracy. Its arguments are the +% distance the original path is shifted, the number of subsegments to +% split into, and the path. +% \begin{macrocode} +vardef parasegment (expr d, segs, f) = + if d = 0: f + else: + save u, v, t; pair u[], v[]; + for n = 0 upto segs: + t := n/segs; + u[n] := postdirection [t] (f); + v[n] := pnt[t] (f) + (u[n] zscaled (0,d)); + endfor + v0{u0} + for n = 1 upto segs: ...v[n]{u[n]} endfor + fi +enddef; + +% \end{macrocode} +% +% \DescribeRoutine{parapath} +% Attempt to parallel one path with another at a distance \gbc{d}. The +% algorithm is as follows: +% \begin{enumerate} +% \item Create an array of paths that parallel each segment of \gbc{f}. +% \item Redo the array by adding a half circle at each end. The purpose +% of the half circle is to force consecutive elements of the array +% to intersect (I hope). +% \item Do something like \mfc{buildcycle}: where consecutive array +% elements intersect, strip the the elements to the subpaths between +% intersection points, and join them directly. +% \item If \gbc{f} is a cycle, process the joining at the endpoints in +% the same way. +% \end{enumerate} +% We use \gbc{force_equal_ends} to force exact equality of endpoints so +% we can join segments with \mfc{\&}. The reason for prefering the +% \mfc{\&} join is to permit better performance of macros (such as this +% one) that take a path apart into segments. If we used `\mfc{..}' instead +% then the returned path would have a great many added segments, nearly +% all of which are nearly trivial. For similar reasons we drop trivial +% segments of \gbc{f}. +% \begin{macrocode} +vardef parapath (expr d) expr f = + if d = 0: + f + else: + save a, g, h, p, q, s, t, u, v, w; + path g[], h, p[], q[]; + numeric a, s, t; + pair u, v, w, w[]; + s := emax (3, emin (segment_split, ceiling (max_points/5/length f))); + p := 0; + for i = 1 upto length f: + h := subpath (i-1, i) of f; + if not trivial h: + q[incr p] := h; + p[p] := parasegment (d, s, h); + fi + endfor + if p = 0: + f + else: + a := if d>0: - fi 180; + h := p1; + for i = 1 upto p-1: + u := predirection 1 (q[i]); + v := postdirection 0 (q[i+1]); + w1 := pnt 1 (q[i]) - (u zscaled (0,d)); + w2 := pnt 0 (q[i+1]) - (v zscaled (0,d)); + w3 := pnt [infinity] (h); + w4 := pnt 0 (p[i+1]); + g0 := arcpps(w3, w1, a); + g1 := h & g0; + g2 := arcpps(w2, w4, a) & p[i+1]; + if (p[i] & g0) intersects reverse g2: + s := length g2 - _Ytime; + t := length h - length p[i] + _Xtime; + g1 := subpath (0, t) of g1; + g2 := subpath (s, length g2) of g2; + force_equal_ends (g1, g2); + h := g1 & g2; + else: + h := h .. p[i+1]; + fi + endfor + + if cycle f: + u := predirection 1 (q[p]); + v := postdirection 0 (q[1]); + w1 := pnt 1 (q[p]) - (u zscaled (0,d)); + w2 := pnt 0 (q[1]) - (v zscaled (0,d)); + w3 := pnt [infinity] (h); + w4 := pnt 0 (p[1]); + g3 := arcpps(w3, w1, a); + g0 := arcpps(w2, w4, a); + g1 := g0 & h & g3; + g2 := g0 & p[1]; + if (p[p] & g3) intersects reverse g2: + s := length g2 - _Ytime; + t := length g0 + length h - length p[p] + _Xtime; + g1 := subpath (s, t) of g1; + force_equal_ends (g1, g1); + h := g1 & cycle; + else: + h := h..cycle; + fi + fi + h + fi + fi +enddef; + +vardef turnangle@# (expr f) = + anglefromto(predirection@# (f), postdirection@#(f)) +enddef; + +% \end{macrocode} +% +% \section{Miscellaneous}\label{misc} +% +% \subsection{Implementation of \mfpic{}'s \cs{plotdata} command}% +% \label{plotdata} +% +% In \mfpic, the \cs{plotdata} command draws several curves with one +% command. The curves are drawn with changeable methods of rendering. +% There are three schemes. The first draws the curves with different dash +% patterns. Another scheme is to plot the curves with different symbols. +% Still another is to use different colors (\MP{} only). +% +% We implement the changing of patterns (symbols, colors) by defining +% arrays of such things and changing the index into the array. For +% example, when the user has selected dashes, the first curve is +% \gbc{gendashed} with the pattern \gbc{dashtype0}, the next with +% \gbc{dashtype1}, etc. +% +% \DescribeRoutine{setdatadashes} +% We have this method for users to select their own dash patterns. The +% \gbc{setdatadashes} command requires a list of suffixes previously +% defined by the \gbc{dashpat} command. Since a dash pattern need only +% be an array, we check if it is one and, if it is, we copy it to the +% next \gbc{dashtype[n]}. We actually copy it to a temporary array and +% make sure there are at least two patterns before we overwrite +% \gbc{dashtype}. +% +% \DescribeRoutine{getdashpat} +% We have removed this mod-ing operation from \TeX, where it is +% cumbersome, to \MF, where it is trivial. +% \begin{macrocode} +def setdatadashes (text lst) = + save __type; __type := 0; + forsuffixes _itm = lst: + if knownnumericarray _itm : + copyarray (_itm) (__type[__type]); +% __type := __type + 1; + next __type; + else: GBwarn "Improper dash pattern in setdatadashes."; + fi + endfor + if __type > 1: + save dashtype; dashtype := __type; + for _j = 0 upto dashtype - 1: + copyarray (__type[_j]) (dashtype[_j]); + endfor + else: + SetdataWarn "dashes"; + fi +enddef; +def getdashpat expr n = dashtype[n mod dashtype] enddef; + +def SetdataWarn expr s = + GBwarn "command setdata"& s &"() failed. Previous values retained."; +enddef; + +% \end{macrocode} +% +% \DescribeRoutine{defaultdashes} +% These are the default dash patterns. Their setting is done by a macro +% so the user may easily restore them. The spaces are apparently larger +% than the dashes, but taking the thickness of the pen into account +% (\mfc{.5bp}) the dashes will appear about \mfc{.5bp} larger than stated +% and the spaces about \mfc{.5bp} smaller (unless the user inexplicably +% sets \mfc{linecap} to \mfc{butt}). +% \begin{macrocode} +numeric Solid, Simpledash, Simpledot, Dotdash, Dotdashdot, Dotdashdash; +dashpat (Solid) (0); +dashpat (Simple_dash) (3bp, 4bp); +dashpat (Simple_dot) (0, 4bp); +dashpat (Dot_dash) (0, 4bp, 3bp, 4bp); +dashpat (Dot_dash_dot) (0, 4bp, 3bp, 4bp, 0, 4bp); +dashpat (Dot_dash_dash) (0, 4bp, 3bp, 4bp, 3bp, 4bp); + +numeric dashtype, dashtype[], dashtype[][]; +def defaultdashes = + setdatadashes (Solid, Simple_dash, Simple_dot, + Dot_dash, Dot_dash_dot, Dot_dash_dash); +enddef; +defaultdashes; + +% \end{macrocode} +% +% \DescribeRoutine{setdatasymbols} +% This can be used to define the sequence of point plotting styles for +% \mfpic's \cs{plotdata} command. It is quite similar to +% \gbc{setdatadashes} above and \gbc{setdatacolors} below. +% +% \DescribeRoutine{getsymbol} +% This is similar to \gbc{getdashpat}. In fact we could write a +% single macro to do both, but I think we get a more readable \mfpic{} +% output file if we have separate commands. +% \begin{macrocode} +def setdatasymbols (text lst) = + save __type; path __type[]; + __type := 0; + for _itm = lst: + if (known _itm) and (path _itm): + __type[__type] := _itm; + next __type; + else: + GBwarn "Improper path in setdatasymbols()."; + fi + endfor + if __type > 1: + save pointtype; pointtype := __type; + path pointtype[]; + for _j = 0 upto pointtype - 1: + pointtype[_j] := __type[_j]; + endfor + else: + SetdataWarn "symbols"; + fi +enddef; +def getsymbol expr n := pointtype[n mod pointtype] enddef; + +% \end{macrocode} +% +% Before we can set the default symbols we need to define some. They need +% to be paths. The ones below named with `\gbc{Solid}' are closed paths. +% Since the drawing commands that use them feed the path to \gbc{setdot}, +% they end up filled if they are cyclic, merely drawn if not. +% +% All are intended to have roughly the area (when area makes sense) of a +% circle with diameter 1. The scaling factors are the square root of the +% ratios of the areas. +% +% Associated with each is a another path with the same basename and the +% suffix \gbc{clear} and a pair with the suffix \gbc{tip}. Moreover, +% they are (mostly) symmetric about the $y$-axis pointing (where that +% makes sense) in the direction \mfc{up}. The purpose of all this is so +% that they can be plugged into code for adding arrowheads/tails of +% different shapes.\VariableIndex{Triangle}\VariableIndex{Square} +% \VariableIndex{Circle}\VariableIndex{Diamond}\VariableIndex{Star} +% \VariableIndex{Plus}\VariableIndex{Cross}\VariableIndex{Asterisk} +% \VariableIndex{Crossbar}\VariableIndex{Leftbar}\VariableIndex{Rightbar} +% \VariableIndex{Righthook}\VariableIndex{Lefthook} +% \VariableIndex{SolidTriangle}\VariableIndex{SolidSquare} +% \VariableIndex{SolidCircle}\VariableIndex{SolidDiamond} +% \VariableIndex{SolidStar} +% \begin{macrocode} +def DeclareGBSymbols (text S) = + forsuffixes _itm = S: + path _itm; + path _itm.clear; + pair _itm.tip; + endfor +enddef; +DeclareGBSymbols( + Triangle, Square, Circle, Diamond, Star, Plus, Cross, + Asterisk, Crossbar, Leftbar, Rightbar, Righthook, + Lefthook, SolidTriangle, SolidSquare, SolidCircle, + SolidDiamond, SolidStar +); + +vardef undo_cycle expr f = subpath (0, length f) of f enddef; + +SolidTriangle := (up--(dir 210)--(dir -30)--cycle) scaled .78; +Triangle := undo_cycle SolidTriangle; + +Triangle.clear := SolidTriangle.clear := + ((dir -30)--(cosd 30,1)--(cosd 210,1)--(dir 210)--up--cycle) + scaled .78; + +SolidSquare := (up--(-1,1)--(-1,-1)--(1,-1)--(1,1)--cycle) scaled .443; +Square := undo_cycle SolidSquare; + +SolidCircle := fullcircle rotated 90; +Circle := undo_cycle SolidCircle; +Circle.clear := SolidCircle.clear := + halfcircle--(-.5,.5)--(.5,.5)--cycle; + +SolidDiamond := (up--left--down--right--cycle) + scaled .522 yscaled 1.44; +Diamond := undo_cycle SolidDiamond; +Diamond.clear := SolidDiamond.clear := + (right--(1,1)--(-1,1)--left--up--cycle) scaled .522 yscaled 1.44; + +% As arrow heads, these have their "tips" at their center. +Plus := ((0,0)--up--down--(0,0)--left--right) scaled .65; +Plus.clear := (right--(1,1)--(-1,1)--(left)--cycle) scaled .65; + +Cross := ((0,0)--(dir 45)--(dir -135)--(0,0)--(dir -45)--(dir 135)) + scaled .65; +Cross.clear := ((0,0)--(dir -45)--dir(45)--(dir 135)--(dir -135)--cycle) + scaled .65; + +Asterisk := ((0,0)--up--down--(0,0)--(dir 30)--(dir -150) + --(0,0)--(dir -30)--(dir 150)) scaled .6; +Asterisk.clear := ((0,0)--(dir -30)--(cosd 30,1)--(cosd 150,1) + --(dir -150)--cycle) scaled .6; + +Crossbar := ((0,0)--left--right) scaled .65; +Crossbar.clear := rect (right,(-1,.5)) scaled .65; + +Leftbar := ((0,0)--left); +Rightbar := ((0,0)--right); +Leftbar.clear := rect((0,0),(-1,.5)); +Rightbar.clear := rect((0,0),(1,.5)); + +Righthook := arcpps((0,0),(1,0),180); +Lefthook := Righthook xscaled -1; +Righthook.clear := Righthook--cycle; +Lefthook.clear := Lefthook--cycle; + +% \end{macrocode} +% +% We do some computations to find the vertices of an n-pointed +% star. We assume that \mfc{A1} is \mfc{up} and the line from there +% to \mfc{A[1 + m]} determines one side of the top point of the star. +% We must have $2 \le {}$\gbc{m}${}\le{}$\gbc{n}${}-2$. The rest of the +% vertices are determined by symmetry. \gbc{Star} is made with \gbc{n=5} +% and \gbc{m=2}. We store the points in an array so we can use them for +% the \gbc{Star.clear} path. +% \begin{macrocode} +vardef mkstar (expr n, m) (suffix A) = + save ang; ang := 360/n; + A1 := up; A3 := up rotated ang; + A2 = (whatever)[A1, A1 rotated ( ang*m)]; + A2 = (whatever)[A3, A3 rotated (-ang*m)]; + for i = 4 upto 2n: + A[i] := A[i-2] rotated ang; + endfor + A := 2n; + mkpoly (true, A) +enddef; + +save _A; pair _A[]; +SolidStar := mkstar (5, 2, _A) scaled .84; +Star := undo_cycle SolidStar; +Star.clear := polyline (true) + (_A9, _A10, _A1, _A2, _A3, (xpart _A3, 1), (xpart _A9, 1)) scaled .84; +SolidStar.clear := Star.clear; + +forsuffixes S = + Triangle, Square, Circle, Diamond, Star, Plus, Cross, + Asterisk, Crossbar, Leftbar, Rightbar, Righthook, + Lefthook, SolidTriangle, SolidSquare, SolidCircle, + SolidDiamond, SolidStar : + S.tip := point 0 of S; +endfor +% \end{macrocode} +% +% \DescribeRoutine{gcd} +% I thought I was going to use \gbc{gcd} for the \gbc{mkstar} routine +% above, but went another way. Still, it might have a future use. Once we +% have it, \DescribeRoutine{lcm}\gbc{lcm} is a snap. Since \gbc{gcd} +% always returns a positive result, \gbc{lcm} satisfies the usual rule for +% signs of products. +% \begin{macrocode} +vardef gcd (expr n, m) = + save a, b, r; + a := emax (abs(m), abs(n)); + b := emin (abs(m), abs(n)); + if b > 0: + forever: + r := a mod b; + exitif r < 1; + a := b; b := r; + endfor + b + else: + a + fi +enddef; + +vardef lcm (expr n, m) = + n*m/gcd(n, m) +enddef; + +% \end{macrocode} +% +% \DescribeVariable{cut_path} +% Additional clearing path, almost the same as plain.mf's \gbc{cut_} (no +% \gbc{cut_} in plain.mp) but rotated, and scaled differently. The odd +% scaling is so that if yscaled by the diameter of a dot, and the dot +% happens to be digitized to a square shape, then the \gbc{cut_path}, +% centered at the center of the dot and rotated 45 degrees, will encompass +% the whole square (theoretically). +% \begin{macrocode} +path cut_path; cut_path := (.5,0)--(.5,.71)--(-.5,.71)--(-.5,0)--cycle; + +% \end{macrocode} +% +% \DescribeRoutine{defaultsymbols} +% The command for restoring the default symbols. +% \begin{macrocode} +numeric pointtype; path pointtype[]; +def defaultsymbols = + setdatasymbols( Circle, Cross, SolidDiamond, Square, Plus, + Triangle, SolidCircle, Star, SolidTriangle); +enddef; +defaultsymbols; + +% \end{macrocode} +% +% \DescribeRoutine{setdatacolors} +% Finally, for \MP, we do a similar pair of commands for setting +% the colors for the \cs{plotdata} command, and for +% \DescribeRoutine{getcolor}getting the next one. +% +% \DescribeRoutine{defaultcolors} +% These default colors were tested on screen and on an inkjet printer. +% The adjustments away from pure colors is based on a compromise between +% those experiments. +% \begin{macrocode} +def setdatacolors (text lst) = + save __type; color __type[]; + __type := 0; + for _itm = lst: + if (known _itm) and (color _itm): + __type[__type] := _itm; + next __type; + else: GBwarn "Improper color in setdatacolors()."; + fi + endfor + if __type > 1: + save colortype; colortype := __type; + color colortype[]; + for _j = 0 upto colortype - 1: + colortype[_j] := __type[_j]; + endfor + else: + SetdataWarn "colors"; + fi +enddef; +def getcolor expr n = colortype[n mod colortype] enddef; + +color dBlue, dOrange, dGreen, dMagenta, dCyan, dYellow; +dBlue := 0.80blue + .2white; +dOrange := 0.66yellow + .34red; +dGreen := 0.80green; +dMagenta := 0.85magenta; +dCyan := 0.85cyan; +dYellow := 0.85yellow; + +numeric colortype; color colortype[]; +def defaultcolors = + setdatacolors(black, red, dBlue, dOrange, dGreen, + dMagenta, dCyan, dYellow); +enddef; +defaultcolors; + +% \end{macrocode} +% +% +% \subsection{Pie Charts and Bar Charts}\label{charts} +% +% \DescribeRoutine{computepie} +% The \gbc{computepie} command calculates the wedges of a pie from the text % parameter \gbc{data}. It should be a list of positive numerics, and the % result will be one wedge for each datum, the area of the wedge being % proportional to the corresponding datum. The wedge for each datum has @@ -5644,31 +7746,92 @@ enddef; % \gbc{sign = -1}, otherwise anticlockwise. The radius of the pie is % \gbc{rad}. % -% After the calculations, the wedges (closed sectors) are stored in the -% array \gbc{piewedge[]} with the numeric \gbc{piewedge} holding the number -% of wedges. The center is saved in \gbc{piecenter}, the directions of the -% wedges (the bisecting rays) are stored in \gbc{piedirection[]}, the -% starting angles of the wedges in \gbc{pieangle[]} -% \begin{macrocode} -vardef piechart (expr sign, ang, cent, rad) (text data) = - save _sum, _tot; - numeric piewedge; piewedge := 0; - numeric pieangle, pieangle[]; pieangle0 := 0; - for _val = data : - pieangle[incr piewedge] := pieangle[piewedge - 1] + _val; +% \DescribeRoutine{piechart} +% This calls \gbc{computepie} to calculate the angles and store that in +% the array \gbc{_dat}, then \gbc{mkpiewedges} creates the actual user +% level arrays. This separation allows us (in a future enhancement) to +% easily handle named piecharts, so there can be more than one defined at +% a time. +% \begin{macrocode} +def computepie (suffix dat) (expr sign, ang, cent, rad) (text data) = +begingroup + save _tot, _max, _toobig; + _max := 0; dat := 0; + for _val = data: + dat[incr dat] := _val; + _max := emax (_max, _val); + endfor + if dat=0: GBwarn "piechart attempted with empty list."; + _toobig := 1; + else: + _toobig := infinity/dat; + fi + if _max > _toobig: + for _idx = 1 upto dat: + dat[_idx] := dat[_idx]/_toobig; + endfor + fi + for _idx = 2 upto dat: + dat[_idx] := dat[_idx - 1] + dat[_idx]; endfor - _tot := pieangle[piewedge]; - pair piecenter; piecenter := cent; + _tot := dat[dat]; + for _idx = dat downto 2: + dat[_idx] := ang + sign*dat[_idx-1]/_tot*360; + endfor + dat1 := ang; dat[dat + 1] := ang + 360sign; +endgroup +enddef; + +def piechart (expr sign, ang, cent, rad) (text data) = + save _dat; + computepie (_dat) (sign, ang, cent, rad) (data); + mkpiewedges (_dat, cent, rad); +enddef; + +% \end{macrocode} +% +% \DescribeRoutine{mkpiewedges} +% The wedges (closed sectors) are stored in the array \gbc{piewedge[\,]} +% with the numeric \gbc{piewedge} holding the number of wedges. The center +% is saved in \gbc{piecenter}, the directions of the wedges (the bisecting +% rays) are stored in \gbc{piedirection[\,]}, the starting angles of the +% wedges in \gbc{pieangle[\,]} +% \begin{macrocode} +def mkpiewedges (suffix dat) (expr cent, rad) = + numeric piewedge, piedirection, pieangle, pieangle[]; + pair piecenter, piedirection[]; path piewedge[]; - numeric piedirection; pair piedirection[]; - pieangle[piewedge + 1] = ang + sign*360; - for _n = piewedge downto 1 : - pieangle[_n] := ang + sign*pieangle[_n - 1]/_tot*360; - piewedge[_n] = - sector(cent, rad, pieangle[_n], pieangle[_n+1]); - piedirection[_n] := dir(0.5[ pieangle[_n], pieangle[_n+1] ]); + piecenter := cent; + piedirection := pieangle := piewedge := dat; + for _idx = 1 upto dat: + pieangle[_idx] := dat[_idx]; + piewedge[_idx] := sector (piecenter, rad, dat[_idx], dat[_idx+1]); + piedirection[_idx] := dir(0.5[ dat[_idx], dat[_idx+1] ]); + endfor +enddef; + +% \end{macrocode} +% +% \DescribeRoutine{namedpiechart} +% This is a future enhancement. It takes a suffix, the name of the chart +% which will be the base name of the various arrays and key values, and +% will be a numeric equal to the number of wedges. The first part is +% identical to that of \gbc{piechart} above. Note that some elements +% of the chart are not (yet) directly accessible. Those needed by mfpic +% are: the paths, the directions and the center. The rest would be easy +% to add. +% \begin{macrocode} +def namedpiechart (suffix nm) (expr sign, ang, cent, rad) (text data) = + save _dat; + computepie (_dat) (sign, ang, cent, rad) (data); + setnumeric (nm) _dat; + pair nm.center, nm.direction[]; + path nm.wedge[]; + nm.center := cent; + for _idx = 1 upto _dat: + nm.wedge[_idx] := sector (cent, rad, _dat[_idx], _dat[_idx+1]); + nm.direction[_idx] := dir(0.5[ _dat[_idx], _dat[_idx+1] ]); endfor - piedirection := pieangle := piewedge; enddef; % \end{macrocode} @@ -5677,56 +7840,85 @@ enddef; % I was told that there are better ways (than piecharts) to represent % quantitative data. Perhaps bar charts are better. \gbc{barchart} % calculates the bars from the text parameter, \gbc{data}. These bars are -% vertical \gbc{vert} is true, otherwise horizontal. +% vertical if \gbc{vert} is true, otherwise horizontal. % -% \gbc{start} is the location (on the appropriate axis) of the start of +% \gbc{firstbar} is the location (on the appropriate axis) of the start of % the first bar. \gbc{sep} is the separation between bar centers. \gbc{r} % is the ratio of the width of the bars to their separation. % -% After the calculations, the array of paths \gbc{chartbar[]} holds the -% rectangles, \gbc{barend[]} holds their rightmost or topmost -% coordinates (which is just the items in \gbc{data} or their y-parts), -% \gbc{barbegin[]} holds their leftmost or bottommost coordinates (either -% 0 or the x-parts of the data), \gbc{barstart[]} holds the appropriate +% After the calculations, the array of paths \gbc{chartbar[\,]} holds the +% rectangles, \gbc{barend[\,]} holds their rightmost or topmost +% coordinates (which is just the items in \gbc{data} or their yparts), +% \gbc{barbegin[\,]} holds their leftmost or bottommost coordinates (either +% 0 or the xparts of the data), \gbc{barstart[\,]} holds the appropriate % coordinate of the leading edge of the bar, and \gbc{barwd = r*sep}. % -% If the data are pair data, this command uses the x-part as the beginning -% of the bar and the y-part as the end. Thus Gantt diagrams can be +% If the data are pair data, this command uses the xpart as the beginning +% of the bar and the ypart as the end. Thus Gantt diagrams can be % created. We keep \gbc{barlength} for backward compatibility (formerly -% all data had to be numeric and bars went from 0 to \gbc{barlength[]}). -% \gbc{barlength[]} was made available to help place some label or symbol -% at the end of a bar and existing code might break if we omitted it. +% all data had to be numeric and bars went from 0 to \gbc{barlength[\,]}). +% \gbc{barlength[\,]} was made available to help place some label or symbol +% at the end of a bar and existing code might break if we omit it. % \begin{macrocode} -def barchart (expr start, sep, r, vert)(text data) = +def barchart (expr firstbar, sep, r, vert)(text data) = numeric barbegin, barbegin[], barend, barend[], barlength, barlength[], barstart, barstart[], chartbar, barwd; path chartbar[]; - chartbar := 0; barwd := r*sep; - for _itm = data : - barend[incr chartbar] := if pair _itm: ypart _itm else: _itm fi; - barbegin[chartbar] := if pair _itm: xpart _itm else: 0 fi; + chartbar := 0; barwd := r*sep; + for _itm = data: + barend[incr chartbar] := if pair _itm: ypart _itm else: _itm fi; + barbegin[chartbar] := if pair _itm: xpart _itm else: 0 fi; endfor barbegin := barend := barlength := barstart := chartbar; - for _n = 1 upto chartbar : - barstart[_n] := start + sep*(_n-1); - barlength[_n] := barend[_n]; - chartbar[_n] := rect ((barbegin[_n], 0), ( barend[_n], barwd) ) - shifted (0, barstart[_n]) if vert: xyswap fi; + for _nn = 1 upto chartbar: + barstart[_nn] := firstbar + sep*(_nn-1); + barlength[_nn] := barend[_nn]; + chartbar[_nn] := rect ((barbegin[_nn], 0), ( barend[_nn], barwd)) + shifted (0, barstart[_nn]) if vert: xyswap fi; + endfor +enddef; + +% \end{macrocode} +% +% \DescribeRoutine{namedbarchart} +% This is a future enhancement. It takes a suffix, the name of the chart, +% which will be the base name of the path array. Note that the various key +% elements (ends of the bar, etc.) are not (yet) directly accessible as in +% the above version, but they would be easy to add. +% \begin{macrocode} +def namedbarchart (suffix nm) (expr first, sep, r, vert) (text data) = + save nm; +begingroup + save _bb, _ee, _ww; + path nm.bar[]; + nm := 0; _ww := r*sep; + for _itm = data: + _ee := if pair _itm: ypart _itm else: _itm fi; + _bb := if pair _itm: xpart _itm else: 0 fi; + nm.bar[incr nm] := rect ((_bb, 0), ( _ee, _ww) ) + shifted (0, first + sep*(nm-1)) if vert: xyswap fi; endfor +endgroup enddef; % \end{macrocode} % %^^A Overlays - taken from MFbook, p 295. (Bruce Leban) % -% \section{Overlays} +% \subsection{Overlays}\label{overlays} % -% This final code predates me. I've never seen it used and don't know what -% its for. For the \MP{} version I just tried to make sure everything was -% defined in \MP{} or \file{plain.mp} and otherwise left it alone. +% This final code predates me. When I inherited \mfpic{} it contained no +% use of \gbc{keepit}. For the \MP{} version I just tried to make sure +% everything was defined in \MP{} or \file{plain.mp} and otherwise left it +% alone. One might presumably issue \gbc{keepit} periodically, clearing +% \mfc{currentpicture} after adding it onto \gbc{totalpicture}. This would +% save some memory because manipulating \mfc{currentpicture} often +% requires a couple of copies to be around simultaneously. Right now we +% treat currentpicture as the place to save things and manipulate local +% picture variables. % \begin{macrocode} picture totalpicture; boolean totalnull, currentnull; @@ -5736,10 +7928,10 @@ def clearit = enddef; def keepit = -%<MF> mono (currentpicture); addto totalpicture also currentpicture; +%<MF> mono (totalpicture); currentpicture := nullpicture; - totalnull := currentnull; + totalnull := totalnull or currentnull; currentnull := true; enddef; @@ -5749,15 +7941,14 @@ def addto_currentpicture = enddef; def mergeit (text do) = - if totalnull : + if totalnull: do currentpicture - elseif currentnull : + elseif currentnull: do totalpicture else: begingroup - save _v_; picture _v_; + save _v_; picture _v_; _v_ := currentpicture; -%<MF> mono (_v_); addto _v_ also totalpicture; do _v_ endgroup @@ -5765,36 +7956,55 @@ def mergeit (text do) = enddef; % \end{macrocode} -% This apparently redundant definition (\gbc{shipit} = \gbc{shipit_}) is -% so that \mfpic{} can turn shipping off and back on by redefining -% \gbc{shipit} to either \gbc{shipit_} or \mfc{relax}. +% This implements \mfpic{}'s \cs{stopshipping} and \cs{resumeshipping} +% commands. It used to be that those commands wrote a redefinition of +% \gbc{shipit}, now we write a boolean assignment and the \cs{shipit} +% command tests it. % \begin{macrocode} -def shipit_ = - mergeit (shipout) -enddef; -def shipit = shipit_ enddef; +boolean noship; noship := false; +def shipit = if noship: else: mergeit (shipout) fi enddef; %<*MF> -def showit_ = - mergeit (show_) -enddef; -def show_ suffix v = - display v inwindow currentwindow -enddef; +def showit_ = mergeit (show_) enddef; +def show_ suffix v = display v inwindow currentwindow enddef; %</MF> % \end{macrocode} % -% Here we initialize \gbc{gcode} (which current versions of mfpic do not use) -% for hacked \mfpic{} files that require it. And that's all. +% Here we initialize \gbc{gcode} (which current versions of mfpic do not +% use) for hacked \mfpic{} files that require it. In \MP{} we load the +% color definitions. And thats all. % \begin{macrocode} -numeric gcode; gcode := 0; +numeric gcode; gcode := 0; %<MF>% end grafbase.mf +%<MP>input dvipsnam.mp; %<MP>% end grafbase.mp %</MF|MP> % \end{macrocode} % +% \subsection{Dvips names for colors}\label{dvipsnam} +% +% In order to make \file{dvipsnam.mp} useful outside grafbase, we repeat +% the definition of \gbc{cmyk} here. +% \begin{macrocode} +%<*dvips> +if unknown grafbaseversion: + vardef snapto expr t = + if unknown t: 0 + elseif not (numeric t): 0 + elseif t < 0: 0 + elseif t > 1: 1 + else: t + fi + enddef; + vardef cmyk (expr c, m, y, k) = + (snapto 1-c-k, snapto 1-m-k, snapto1-y-k) + enddef; +fi + +% \end{macrocode} +% % The following code was borrowed from the the standard \LaTeX{} graphics % package (\file{dvipsname.def} by David Carlisle and Sebastian Rahtz). In % fact it was mostly generated automatically by some editor macros that @@ -5804,9 +8014,9 @@ numeric gcode; gcode := 0; %^^A License, as described in \file{lppl.txt} in the base LaTeX %^^A distribution, either version 1.0 or, at your option, any later version. % -% Declare all the dvips color names to be color variables: +% Declare all the dvips color names to be color variables, and define +% them as in \file{dvipsnam.def}: % \begin{macrocode} -%<*dvips> color Apricot, Aquamarine, Bittersweet, Black, Blue, BlueGreen, BlueViolet, BrickRed, Brown, BurntOrange, CadetBlue, CarnationPink, Cerulean, CornflowerBlue, Cyan, Dandelion, DarkOrchid, Emerald, @@ -5819,79 +8029,74 @@ Salmon, SeaGreen, Sepia, SkyBlue, SpringGreen, Tan, TealBlue, Thistle, Turquoise, Violet, VioletRed, White, WildStrawberry, Yellow, YellowGreen, YellowOrange; -% \end{macrocode} -% The function \gbc{cmyk} (which converts a CMYK quadruple to \MP's rgb -% triple) is defined in \file{grafbase.mp}, which should be input before -% \file{dvipsnam.mp}: -% \begin{macrocode} -Apricot = cmyk( 0, 0.32, 0.52, 0); -Aquamarine = cmyk(0.82, 0, 0.30, 0); -Bittersweet = cmyk( 0, 0.75, 1, 0.24); -Black = cmyk( 0, 0, 0, 1); -Blue = cmyk( 1, 1, 0, 0); -BlueGreen = cmyk(0.85, 0, 0.33, 0); -BlueViolet = cmyk(0.86, 0.91, 0, 0.04); -BrickRed = cmyk( 0, 0.89, 0.94, 0.28); -Brown = cmyk( 0, 0.81, 1, 0.60); -BurntOrange = cmyk( 0, 0.51, 1, 0); -CadetBlue = cmyk(0.62, 0.57, 0.23, 0); -CarnationPink = cmyk( 0, 0.63, 0, 0); -Cerulean = cmyk(0.94, 0.11, 0, 0); -CornflowerBlue = cmyk(0.65, 0.13, 0, 0); -Cyan = cmyk( 1, 0, 0, 0); -Dandelion = cmyk( 0, 0.29, 0.84, 0); -DarkOrchid = cmyk(0.40, 0.80, 0.20, 0); -Emerald = cmyk( 1, 0, 0.50, 0); -ForestGreen = cmyk(0.91, 0, 0.88, 0.12); -Fuchsia = cmyk(0.47, 0.91, 0, 0.08); -Goldenrod = cmyk( 0, 0.10, 0.84, 0); -Gray = cmyk( 0, 0, 0, 0.50); -Green = cmyk( 1, 0, 1, 0); -GreenYellow = cmyk(0.15, 0, 0.69, 0); -JungleGreen = cmyk(0.99, 0, 0.52, 0); -Lavender = cmyk( 0, 0.48, 0, 0); -LimeGreen = cmyk(0.50, 0, 1, 0); -Magenta = cmyk( 0, 1, 0, 0); -Mahogany = cmyk( 0, 0.85, 0.87, 0.35); -Maroon = cmyk( 0, 0.87, 0.68, 0.32); -Melon = cmyk( 0, 0.46, 0.50, 0); -MidnightBlue = cmyk(0.98, 0.13, 0, 0.43); -Mulberry = cmyk(0.34, 0.90, 0, 0.02); -NavyBlue = cmyk(0.94, 0.54, 0, 0); -OliveGreen = cmyk(0.64, 0, 0.95, 0.40); -Orange = cmyk( 0, 0.61, 0.87, 0); -OrangeRed = cmyk( 0, 1, 0.50, 0); -Orchid = cmyk(0.32, 0.64, 0, 0); -Peach = cmyk( 0, 0.50, 0.70, 0); -Periwinkle = cmyk(0.57, 0.55, 0, 0); -PineGreen = cmyk(0.92, 0, 0.59, 0.25); -Plum = cmyk(0.50, 1, 0, 0); -ProcessBlue = cmyk(0.96, 0, 0, 0); -Purple = cmyk(0.45, 0.86, 0, 0); -RawSienna = cmyk( 0, 0.72, 1, 0.45); -Red = cmyk( 0, 1, 1, 0); -RedOrange = cmyk( 0, 0.77, 0.87, 0); -RedViolet = cmyk(0.07, 0.90, 0, 0.34); -Rhodamine = cmyk( 0, 0.82, 0, 0); -RoyalBlue = cmyk( 1, 0.50, 0, 0); -RoyalPurple = cmyk(0.75, 0.90, 0, 0); -RubineRed = cmyk( 0, 1, 0.13, 0); -Salmon = cmyk( 0, 0.53, 0.38, 0); -SeaGreen = cmyk(0.69, 0, 0.50, 0); -Sepia = cmyk( 0, 0.83, 1, 0.70); -SkyBlue = cmyk(0.62, 0, 0.12, 0); -SpringGreen = cmyk(0.26, 0, 0.76, 0); -Tan = cmyk(0.14, 0.42, 0.56, 0); -TealBlue = cmyk(0.86, 0, 0.34, 0.02); -Thistle = cmyk(0.12, 0.59, 0, 0); -Turquoise = cmyk(0.85, 0, 0.20, 0); -Violet = cmyk(0.79, 0.88, 0, 0); -VioletRed = cmyk( 0, 0.81, 0, 0); -White = cmyk( 0, 0, 0, 0); -WildStrawberry = cmyk( 0, 0.96, 0.39, 0); -Yellow = cmyk( 0, 0, 1, 0); -YellowGreen = cmyk(0.44, 0, 0.74, 0); -YellowOrange = cmyk( 0, 0.42, 1, 0); +Apricot := cmyk(0,0.32,0.52,0); +Aquamarine := cmyk(0.82,0,0.30,0); +Bittersweet := cmyk(0,0.75,1,0.24); +Black := cmyk(0,0,0,1); +Blue := cmyk(1,1,0,0); +BlueGreen := cmyk(0.85,0,0.33,0); +BlueViolet := cmyk(0.86,0.91,0,0.04); +BrickRed := cmyk(0,0.89,0.94,0.28); +Brown := cmyk(0,0.81,1,0.60); +BurntOrange := cmyk(0,0.51,1,0); +CadetBlue := cmyk(0.62,0.57,0.23,0); +CarnationPink := cmyk(0,0.63,0,0); +Cerulean := cmyk(0.94,0.11,0,0); +CornflowerBlue := cmyk(0.65,0.13,0,0); +Cyan := cmyk(1,0,0,0); +Dandelion := cmyk(0,0.29,0.84,0); +DarkOrchid := cmyk(0.40,0.80,0.20,0); +Emerald := cmyk(1,0,0.50,0); +ForestGreen := cmyk(0.91,0,0.88,0.12); +Fuchsia := cmyk(0.47,0.91,0,0.08); +Goldenrod := cmyk(0,0.10,0.84,0); +Gray := cmyk(0,0,0,0.50); +Green := cmyk(1,0,1,0); +GreenYellow := cmyk(0.15,0,0.69,0); +JungleGreen := cmyk(0.99,0,0.52,0); +Lavender := cmyk(0,0.48,0,0); +LimeGreen := cmyk(0.50,0,1,0); +Magenta := cmyk(0,1,0,0); +Mahogany := cmyk(0,0.85,0.87,0.35); +Maroon := cmyk(0,0.87,0.68,0.32); +Melon := cmyk(0,0.46,0.50,0); +MidnightBlue := cmyk(0.98,0.13,0,0.43); +Mulberry := cmyk(0.34,0.90,0,0.02); +NavyBlue := cmyk(0.94,0.54,0,0); +OliveGreen := cmyk(0.64,0,0.95,0.40); +Orange := cmyk(0,0.61,0.87,0); +OrangeRed := cmyk(0,1,0.50,0); +Orchid := cmyk(0.32,0.64,0,0); +Peach := cmyk(0,0.50,0.70,0); +Periwinkle := cmyk(0.57,0.55,0,0); +PineGreen := cmyk(0.92,0,0.59,0.25); +Plum := cmyk(0.50,1,0,0); +ProcessBlue := cmyk(0.96,0,0,0); +Purple := cmyk(0.45,0.86,0,0); +RawSienna := cmyk(0,0.72,1,0.45); +Red := cmyk(0,1,1,0); +RedOrange := cmyk(0,0.77,0.87,0); +RedViolet := cmyk(0.07,0.90,0,0.34); +Rhodamine := cmyk(0,0.82,0,0); +RoyalBlue := cmyk(1,0.50,0,0); +RoyalPurple := cmyk(0.75,0.90,0,0); +RubineRed := cmyk(0,1,0.13,0); +Salmon := cmyk(0,0.53,0.38,0); +SeaGreen := cmyk(0.69,0,0.50,0); +Sepia := cmyk(0,0.83,1,0.70); +SkyBlue := cmyk(0.62,0,0.12,0); +SpringGreen := cmyk(0.26,0,0.76,0); +Tan := cmyk(0.14,0.42,0.56,0); +TealBlue := cmyk(0.86,0,0.34,0.02); +Thistle := cmyk(0.12,0.59,0,0); +Turquoise := cmyk(0.85,0,0.20,0); +Violet := cmyk(0.79,0.88,0,0); +VioletRed := cmyk(0,0.81,0,0); +White := cmyk(0,0,0,0); +WildStrawberry := cmyk(0,0.96,0.39,0); +Yellow := cmyk(0,0,1,0); +YellowGreen := cmyk(0.44,0,0.74,0); +YellowOrange := cmyk(0,0.42,1,0); % End of file `dvipsnam.mp'. %</dvips> diff --git a/Master/texmf-dist/source/generic/mfpic/mfpic.dtx b/Master/texmf-dist/source/generic/mfpic/mfpic.dtx index 1789f6e9146..daab8c0d9b6 100644 --- a/Master/texmf-dist/source/generic/mfpic/mfpic.dtx +++ b/Master/texmf-dist/source/generic/mfpic/mfpic.dtx @@ -1,43 +1,42 @@ % \iffalse -% Copyright 2002--2003, Daniel H. Luecking +% ------------------------------------------------------------------- % -% Mfpic consists of the 3 files mfpic.dtx, grafbase.dtx and mfpic.ins -% and the 5 files they generate: mfpic.tex, mfpic.sty, grafbase.mf, -% grafbase.mp, and dvipsnam.mp. +% Copyright 2002--2006, Daniel H. Luecking % % Mfpic may be distributed and/or modified under the conditions of the -% LaTeX Project Public License, either version 1.2 of this license or (at +% LaTeX Project Public License, either version 1.3b of this license or (at % your option) any later version. The latest version of this license is in +% <http://www.latex-project.org/lppl.txt> +% and version 1.3b or later is part of all distributions of LaTeX version +% 2003/12/01 or later. % -% http://www.latex-project.org/lppl.txt -% -% and version 1.2 or later is part of all distributions of LaTeX version -% 1999/12/01 or later. -% -% Documentation, examples, and ancillary files are separate and not -% covered by this license. See readme.1st for a complete list. See -% individual files for any copyright and license restrictions. -% -% With respect to the proposed draft LPPL-1.3: mfpic has maintenance -% status "maintained". The Current Maintainer is Daniel H. Luecking. There -% are several Base Interpreters: TeX, LaTeX, MetaPost and Metafont. +% Mfpic has maintenance status "author-maintained". The Current Maintainer +% is Daniel H. Luecking. There are several Base Interpreters: plain TeX, LaTeX, +% plain Metafont and plain MetaPost. % %<*driver> +\ProvidesFile{mfpic.dtx} +%</driver> +%<sty>\ProvidesPackage{mfpic} +%<*sty> + [2006/05/26 v0.9. Macros for drawing with Metafont/MetaPost.]% +%</sty> +%<*driver> \documentclass[draft]{ltxdoc} -\def\fileversion{0.7a beta} -\def\filedate{2004/04/16} - \addtolength{\textwidth}{.5878pt} -\def\mytt{\mdseries\ttfamily} -\renewcommand\marg[1]{{\mytt \{#1\}}} -\renewcommand\oarg[1]{{\mytt [#1]}} -\renewcommand\parg[1]{{\mytt (#1)}} -\renewcommand{\meta}[1]{{$\langle$\rmfamily\itshape#1$\rangle$}} +\def\mytt{\upshape\mdseries\ttfamily} +\renewcommand\marg[1]{{\mytt\{#1\}}} +\renewcommand\oarg[1]{{\mytt [#1]}} +\renewcommand\parg[1]{{\mytt (#1)}} +\renewcommand \arg[1]{{\mytt \##1}} +\renewcommand\#{\char`\#\relax} +\renewcommand{\meta}[1]{{$\langle$\rmfamily\itshape#1\/$\rangle$}} \DeclareRobustCommand\cs[1]{{\mytt\char`\\#1}} \def\prog#1{{\mdseries\scshape #1}} \def\grafbase{\prog{grafbase}} +\def\Grafbase{\prog{Grafbase}} \def\mfpic{\prog{mfpic}} \def\Mfpic{\prog{Mfpic}} \def\MF{\prog{meta\-font}} @@ -48,7 +47,8 @@ \def\mfc#1{{\mytt#1}} \let\env\mfc \let\file\mfc -\let\gbc\mfc +\let\gbc \mfc +\catcode`\_=12 \renewcommand\{{\char`\{} \renewcommand\}{\char`\}} \renewcommand\|{${}\mathrel{|}{}$} @@ -66,11 +66,15 @@ \renewcommand\labelitemiii{\textperiodcentered} \leftmargini\parindent % Stupid index! +\def\usage#1{\textrm{#1}} +\def\index@prologue{\section*{Index}\markboth{Index}{Index}% + Numbers refer to the page where the corresponding entry is described. +} \def\IndexParms{% \parindent \z@ \columnsep 15pt \parskip 0pt plus 1pt \rightskip 5pt plus2em \mathsurround \z@ - \parfillskip=-5pt \small + \parfillskip-5pt \small % less hanging: \def\@idxitem{\par\hangindent 20pt}% \def\subitem{\@idxitem\hspace*{15pt}}% @@ -99,8 +103,7 @@ \end{document} %</driver> %\fi -% -% \CheckSum{4392} +% \CheckSum{4902} % \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 @@ -117,19 +120,19 @@ % Grave accent \` Left brace \{ Vertical bar \| % Right brace \} Tilde \~} % -% \catcode`\_=12 +% \GetFileInfo{mfpic.dtx} % \maketitle % % \begin{abstract} -% An environment, \env{mfpic}, is defined, within which commands can -% be used for drawing pictures, especially graphs of mathematical -% functions. These commands actually write code to an external file -% which can be processed through \MF{} or \MP{} (depending on package -% options) to produce the picture. The picture is then included on a -% second pass through \TeX. -% -% This file documents the source code. See \file{mfpicdoc.tex} for the -% user documentation. +% An environment, \env{mfpic}, is defined, within which commands can be +% used for drawing pictures, especially of mathematical objects and +% functions. These commands actually write code to an external file to be +% processed through \MF{} or \MP{} (depending on package options) to +% produce the picture. The picture is then included on a second pass +% through \TeX. +% +% This file documents the source code. See \file{mfpman.pdf} or +% \file{mfpman.tex} for the user documentation. % \end{abstract} % % \StopEventually{\PrintIndex} @@ -139,7 +142,9 @@ % \section{Introductory setup}\label{intro} % % \Mfpic{} is designed to work with plain \TeX, \LaTeX, \pdfTeX, and -% \pdfLaTeX. +% \pdfLaTeX. I consistently use it with eplain and AMS\LaTeX{} +% without problems. Users have reported succesfully using it with \AmSTeX. +% It has \emph{not} been successfully used with \ConTeXt. % % \subsection{Versions numbers, category codes, etc.}\label{category} % @@ -150,23 +155,21 @@ % files where various punctuation were made active (e.g., with % \file{french.sty}). % -% \DescribeMacro{\mfpfileversion} -% \DescribeMacro{\mfpfiledate} -% \DescribeMacro{\mfpicversion} -% We keep track of version numbers here. We use \cs{mfpfileversion} -% because \cs{fileversion} is used by very many \LaTeX{} packages. -% This is important, because later we write the version information to the +% We keep track of version numbers here. We store the version and date +% in macros and later we write this version information to the % output file, The \cs{mfpicversion} is 100 times the numeric part of the % version. The output file can compare this number with the corresponding % value in \file{grafbase} and detect installations where there is a % mismatch. % \begin{macrocode} %<*tex> -{\catcode\lq\.12 \catcode\lq\/12% -\gdef\mfpfileversion{0.7a beta}% -\gdef\mfpfiledate{2004/04/16}% -\gdef\mfpicversion{70}}% -\ifx\MFPicpackagE\UndEfInEd\else\expandafter\endinput\fi% +\ifx\mfpfileversion\UndEfInEd\else\expandafter\endinput\fi% +{% + \catcode\lq\.12 \catcode\lq\/12% + \gdef\mfpfileversion{0.9}% + \gdef\mfpfiledate{2006/05/26}% + \gdef\mfpicversion{90}% +}% % \end{macrocode} % % A bug in older versions of some support files is triggered by the macro @@ -177,82 +180,71 @@ \let\+\tabalign% % \end{macrocode} % -% \DescribeMacro{\MFPrestorecode} % We now get rid of unusually catcoded punctuation, space and EOL. -% We save all the current category codes in the macro \cs{MFPicpackagE} +% We save all the current category codes in the macro \cs{mfp@restoreALL} % and restore them at the end by executing this command. -% We try to assume only: that letters, numbers, -% `\texttt\bsl', `\texttt\{', `\texttt\}', `\texttt\#' and -% `\texttt\%' have the usual categories. Styles (e.g., \prog{french}) -% that make punctuation active foul up \cs{write}\,s of MF/MP code. This can -% still occur in user-generated \cs{write}\,s, so maybe some code should be -% added in \cs{mfpic} or \cs{mfsrc} command too. -% \begin{macrocode} -\edef\MFPrestoreequal{\catcode61\space\the\catcode61\relax}% -\catcode61 12\relax% -\edef\MFPrestorespace{\catcode32=\the\catcode32\relax}% -\catcode32=10\relax% -\edef\MFPrestoreEOL{\catcode13=\the\catcode13\relax}% -\catcode13=5\relax -\edef\MFPrestorelq{\catcode96=\the\catcode96\relax}% -\catcode96=12 -\def\MFPrestorecode#1{\catcode`\string#1=\the\catcode`#1\relax}% -% \end{macrocode} -% -% \DescribeMacro{\MFPicpackagE} -% This will be invoked at the end of the file to restore all the catcodes. -% This will fail if some of these characters have really bad codes -% (comment or escape, for example) but that would likely be the case only -% if {\tt\bsl} or {\tt\%} have some different codes and then everything -% above here would fail. -% \begin{macrocode} -\edef\MFPicpackagE{% - \MFPrestorecode{@}\MFPrestorecode{-}% - \MFPrestorecode{:}\MFPrestorecode{;}% - \MFPrestorecode{.}\MFPrestorecode{,}% - \MFPrestorecode{!}\MFPrestorecode{?}% - \MFPrestorecode{(}\MFPrestorecode{)}% - \MFPrestorecode{[}\MFPrestorecode{]}% - \MFPrestorecode{'}\MFPrestorecode{/}% - \MFPrestorecode{"}\MFPrestorecode{*}% - \MFPrestorecode{$}\MFPrestorecode{+}% - \MFPrestorecode{_}\MFPrestorecode{>}% - \MFPrestorecode{<}\MFPrestorecode{~}% - \MFPrestorelq\MFPrestoreEOL\MFPrestorespace - \MFPrestoreequal\catcode 10=\number\catcode10}% -% \end{macrocode} -% -% Set everything to normal except \texttt @=letter, \mfc{_}=other, and -% \texttt \textasciitilde=other. Do this by putting the settings in a -% macro and invoking the macro. That makes it possibly to redo the -% settings inside some other macro, should that ever become necessary. -% Characters 10 and 13 are \verb|^^J| and \verb|^^M|, control-J and -% control-M. -% -% \begin{macrocode} -\catcode`\@=11 -\ifx\@makeother\UndEfInEd \def\@makeother#1{\catcode`#1=12\relax}\fi -\def\mfp@sanitize{% -\catcode10=12\catcode13=5\catcode`\$=3\catcode`\ =10 -\@makeother\:\@makeother\;\@makeother\.\@makeother\,% -\@makeother\!\@makeother\?\@makeother\(\@makeother\)% -\@makeother\[\@makeother\]% -\@makeother\'\@makeother\/\@makeother\"\@makeother\*% -\@makeother\_\@makeother\`\@makeother\+\@makeother\=% -\@makeother\>\@makeother\<\@makeother\~\@makeother\-}% -\mfp@sanitize -\edef\restorenewlinechar{\newlinechar=\number\newlinechar\relax}% -\chardef\mfp@ctrlJ10 \chardef\mfp@ctrlM13 -\newlinechar\mfp@ctrlJ\def\@nl{^^J}% +% We assume that letters, numbers, `\texttt\bsl', `\texttt\{', `\texttt\}', +% `\texttt\#' and `\texttt\%' have the usual categories. However, styles +% (e.g., \prog{french}) that make punctuation active foul up \cs{write}\,s +% of MF/MP code. This can still occur in user-generated \cs{write}\,s, so +% maybe some of this code should be added in \cs{mfpic} or \cs{mfsrc} +% command, too. +% \begin{macrocode} +{% + \catcode61\space12\relax% 61=equal sign + \catcode32=10\relax% 32=space + \catcode13=5 % 13=EOL + \catcode96=12 % 96=left quote + \catcode`\@=11 + \gdef\MFPsavecodes{% + \edef\mfp@restoreNLchar{\newlinechar\number\newlinechar\relax}% + \edef\mfp@restoreELchar{\endlinechar\number\endlinechar\relax}% + \edef\mfp@restoreSP{\catcode32=\number\catcode32\relax}% + \edef\mfp@restoreEOL{\catcode13=\number\catcode13\relax}% + \edef\mfp@restoreALL{\mfp@restorecode{=}\mfp@restorecode{@}% + \mfp@restorecode{$}\mfp@restorecode{:}\mfp@restorecode{;}% + \mfp@restorecode{.}\mfp@restorecode{,}\mfp@restorecode{!}% + \mfp@restorecode{?}\mfp@restorecode{(}\mfp@restorecode{)}% + \mfp@restorecode{[}\mfp@restorecode{]}\mfp@restorecode{<}% + \mfp@restorecode{>}\mfp@restorecode{*}\mfp@restorecode{/}% + \mfp@restorecode{+}\mfp@restorecode{-}\mfp@restorecode{"}% + \mfp@restorecode{'}\mfp@restorecode{_}\mfp@restorecode{`}% + \mfp@restoreEOL\mfp@restoreSP\catcode10=\number\catcode10 + \mfp@restoreNLchar\mfp@restoreELchar}}% + \gdef\mfp@restorecode#1{\catcode`\string#1=\number\catcode`#1\relax}% + \ifx\@makeother\UndEfInEd \gdef\@makeother#1{\catcode`#1=12\relax}\fi + \gdef\MFPsanitize{\endlinechar13 \newlinechar10 + \catcode10=12 \catcode13=5 \catcode`\$=3 \catcode`\ =10 + \@makeother\:\@makeother\;\@makeother\.\@makeother\,% + \@makeother\!\@makeother\?\@makeother\(\@makeother\)% + \@makeother\[\@makeother\]\@makeother\>\@makeother\<% + \@makeother\/\@makeother\*\@makeother\+\@makeother\-% + \@makeother\'\@makeother\"\@makeother\_\@makeother\`% + \@makeother\=\@makeother\@}% +}% +\MFPsavecodes\MFPsanitize +\catcode`@11 +\chardef\mfp@ctrlJ 10 \chardef\mfp@ctrlM 13 % \end{macrocode} % +% \cs{MFPsavecodes} saves a bunch of things that must have (mostly) +% normal settings \cs{mfp@restoreALL} will be invoked at the end of the +% file to restore all the values. +% +% \cs{MFPsanitize} sets (almost) everything to normal. It can be used to +% redo these settings inside some other macro, should that ever become +% necessary. Characters 10 and 13 are \verb|^^J| and \verb|^^M|, +% control-J and control-M. +% % \subsection{Debugging and messages}\label{debug} % -% \DescribeMacro{\ifmfpicdebug} % \DescribeMacro{\mfpicdebug} % To turn on debugging before option processing, the user must make sure % \cs{mfpicdebug} is defined. \cs{mfp@DBlog} writes it contents to the % log file only if debugging is on. +% \DescribeMacro{\ifmfpicdebug}\cs{ifmfpicdebug} is normally set to true +% if the user loads \mfpic{} with the \opt{debug} option, or sets it +% directly with \cs{mfpicdebugtrue} after loading. % \begin{macrocode} \newif\ifmfpicdebug \ifx\mfpicdebug\UndEfInEd \mfpicdebugfalse @@ -261,98 +253,133 @@ \def\mfp@DBlog#1{% \ifmfpicdebug{\let\@msgbreak\mfp@errbrk\wlog{Mfpic debug: #1}}\fi}% % \end{macrocode} -% Various kinds of messages to the screen and log file. \cs{mfp@msg} is only -% used in the definition of the others and to write a blank line. We -% always use the second, which identifies the source of the message, or -% the third, which adds the word `warning'. The fourth is for errors -% and provides for help if a user presses `\texttt h' in response to the -% message. The bit with the spaces is to get a hanging indentation with -% text properly aligned on screen. +% +% We need to write various kinds of messages to the screen and log file. +% \cs{mfp@msg} is only used in the definition of the others and to write a +% blank line. We always use the second, which identifies the source of the +% message, or the third, which adds the word `warning'. The fourth is for +% errors and provides for help if a user presses `\texttt h' in response +% to the message. The bit with the spaces is to get a hanging indentation +% with text properly aligned on screen. The basic \cs{mfp@msg} defines +% \cs{@nl} to place the \cs{newlinechar}, for multiline messages. We +% also define \cs{@nl} in \cs{mfp@write} for new lines in writing to a +% file. We do not define it at all at the outer level. % \begin{macrocode} -\def\mfp@msg#1{{\newlinechar\mfp@ctrlJ\immediate\write16{#1}}}% -\def\@msgbreak{^^J}% +\def\mfp@msg#1{% + {\newlinechar\mfp@ctrlJ\def\@nl{^^J}\immediate\write16{#1}}}% \def\mfp@spaces{\space\space\space\space\space\space}% -% \def\mfp@msgbrk{^^J\mfp@spaces\space}% \def\mfp@errbrk{\mfp@msgbrk\mfp@spaces}% \def\mfp@warnbrk{\mfp@errbrk\space\space}% -% -\def\Mfpic@msg#1{{\let\@msgbreak=\mfp@msgbrk - \mfp@msg{Mfpic: #1 }}}% -\def\Mfpic@warn#1{{\let\@msgbreak=\mfp@warnbrk - \mfp@msg{^^JMfpic warning: #1}}}% -\def\mfp@errmsg#1#2{{\newlinechar\mfp@ctrlJ - \let\@msgbreak\mfp@errbrk +\def\Mfpic@msg#1{{\let\@msgbreak\mfp@msgbrk\mfp@msg{Mfpic: #1}}}% +\def\Mfpic@warn#1{% + {\let\@msgbreak\mfp@warnbrk\mfp@msg{\@nl Mfpic warning: #1}}}% +\def\mfp@errmsg#1#2{{\newlinechar\mfp@ctrlJ\let\@msgbreak\mfp@errbrk \errhelp{#2}\errmessage{Mfpic error: #1}}}% % \end{macrocode} % % In \TeX{} 3.x we can identify the line being processed when a message is -% issued. We do not support \TeX{} 2.x. The command \cs{@mfplineno} is +% issued. We do not support \TeX{} 2.x. The command \cs{mfp@lineno} is % for information written into the output file. % \begin{macrocode} -\def\@online{ on line \number\inputlineno}% -\def\@mfplineno{line \number\inputlineno\space in TeX source}% +\def\mfp@lineno{line \number\inputlineno\space in the TeX source}% % \end{macrocode} % % \subsection{Detecting the format}\label{format} % % To detect its environment, \mfpic{} needs to test whether certain -% commands are defined. The \cs{@xp} is usually used to `expand away' -% the rest of a conditional. \cs{@XP} does this from two levels deep in -% a conditional. (We use \cs{@xp}\cs{@XP}\cs{@xp} later to expand -% away from three levels.) Since it uses \cs{@firstoftwo} and -% \cs{@secondoftwo}, we cannot use it to check their existence. -% \begin{macrocode} -\ifx\@firstoftwo\UndEfInEd \long\def\@firstoftwo#1#2{#1}\fi -\ifx\@secondoftwo\UndEfInEd \long\def\@secondoftwo#1#2{#2}\fi +% commands are defined. We usually use the positive version +% \cs{mfp@ifdefined}. The \cs{@xp} in it is used to `expand away' the rest +% of a conditional. \cs{@XP} does this from two levels deep in a +% conditional. Since our check uses \cs{@firstoftwo} and +% \cs{@secondoftwo}, we cannot use it to check \emph{their} existence (but +% we could use other means). +% +% \cs{mfp@ifundefined} checks its argument to see if it is defined. +% If so, it gobbles all code up to \cs{mfp@enddef}. Otherwise that code is +% executed. This avoids reading code prematurely (category code changes). +% +% We also copy \LaTeX's \cs{@ifundefined} since we have at least five +% places where we need to supply the name without a backslash. +% \begin{macrocode} \let\@xp\expandafter \def\@XP{\@xp\@xp\@xp}% +\long\def\@firstoftwo#1#2{#1}% +\long\def\@secondoftwo#1#2{#2}% \def\mfp@ifdefined#1{% \ifx#1\UndEfInEd \@xp\@secondoftwo \else\ifx#1\relax \@XP\@secondoftwo \else \@XP\@firstoftwo \fi\fi}% +\mfp@ifdefined\@empty{}{\def\@empty{}}% +\mfp@ifdefined\@gobble{}{\def\@gobble#1{}}% \mfp@ifdefined\@firstofone{}{\long\def\@firstofone#1{#1}}% +\mfp@ifdefined\on@line{}% + {\def\on@line{ on input line \number\inputlineno}}% +\let\mfp@enddef\@empty +\long\def\mfp@gobbledef#1\mfp@enddef{}% +\def\mfp@ifundefined#1{\mfp@ifdefined#1\mfp@gobbledef\@empty}% +\mfp@ifundefined\@ifundefined + \def\@ifundefined#1{% + \@xp\ifx\csname #1\endcsname\relax \@xp\@firstoftwo + \else \@xp\@secondoftwo + \fi}% +\mfp@enddef +% \end{macrocode} +% +% The following might be useful in patching things or adding to +% \cs{mfp@additions}. +% \begin{macrocode} +\mfp@ifdefined\g@addto@macro{}{% + \long\def\g@addto@macro#1#2{% + \begingroup + \toks@\@xp{#1#2}% + \xdef#1{\the\toks@}% + \endgroup}}% +\mfp@ifdefined\g@prependto@macro{}{% + \long\def\g@prependto@macro#1#2{% + \begingroup + \toks@{#2}\toks2\@xp{#1}% + \xdef#1{\the\toks@\the\toks2}% + \endgroup}}% % \end{macrocode} % -% We test for the format. If all tests fail we assume plain\TeX{} or -% something compatible. Mainly this is needed to support \LaTeX. I've done -% a few things to work around \ConTeXt, but its been a moving target and -% \mfpic{} didn't work in \ConTeXt{} the last time I tried. +% We test for LaTeX. We assume plain\TeX{}, or something compatible, +% except in a few places where LaTeX{} does thing differently. \Mfpic{} +% didn't work in \ConTeXt{} the last few times I tried. % % Here we see if \cs{documentstyle} is defined, and then make sure % we are not in \AmSTeX{}. Probably there is a better command to test, % and perhaps we should just test whether the functionality required is % present, but I'm not really sure how best to do either of those. % \begin{macrocode} -\newif\if@mfp@latex \@mfp@latexfalse +\newif\ifmfp@latex \mfp@latexfalse \mfp@ifdefined\documentstyle - {{\def\x{AmS-TeX}% - \ifx \fmtname\x \mfp@DBlog{AmS-TeX detected.}% - \else - \global\@mfp@latextrue \mfp@DBlog{LaTeX detected.}% - \fi}}% - {\mfp@DBlog{Neither LaTeX2e nor LaTeX209 nor AmS-TeX.}}% + {\def\mfp@tempa{AmS-TeX}% + \ifx \fmtname\mfp@tempa \mfp@DBlog{AmS-TeX detected.}% + \else \mfp@DBlog{LaTeX detected.}\mfp@latextrue + \fi}% + {\mfp@DBlog{Neither LaTeX nor AmS-TeX detected.}}% % \end{macrocode} % % We are in \LaTeXe{}, as opposed to \LaTeX2.09, if \cs{documentclass} -% is defined. +% is defined. The \file{mfpic.sty} now assumes \LaTeXe{}. It might still +% be possible to use \LaTeX{}2.09 with \cs{input mfpic}, but I don't +% care enough to test it. % \begin{macrocode} -\newif\if@mfp@latexe \@mfp@latexefalse +\newif\ifmfp@latexe \mfp@latexefalse \mfp@ifdefined\documentclass - {\@mfp@latexetrue \mfp@DBlog{LaTeX2e detected.}}% - {\mfp@DBlog{Not LaTeX2e.}}% + {\mfp@latexetrue \mfp@DBlog{LaTeX2e detected.}}% + {\mfp@DBlog{Not LaTeX2e.}}% % \end{macrocode} % % We now test \cs{pdfoutput} to see if pdf support is needed. % \begin{macrocode} -\newif\if@mfp@pdf \@mfp@pdffalse +\newif\ifmfp@pdf \mfp@pdffalse \mfp@ifdefined\pdfoutput {\mfp@DBlog{PdfTeX detected...}% - \ifcase\pdfoutput - \mfp@DBlog{...with dvi output.}% - \else - \@mfp@pdftrue \mfp@DBlog{...with PDF output.}% + \ifnum\pdfoutput<1 \mfp@DBlog{...with dvi output.}% + \else \mfp@pdftrue \mfp@DBlog{...with PDF output.}% \fi}% {\mfp@DBlog{Not pdfTeX.}}% % \end{macrocode} @@ -367,68 +394,148 @@ % inside \cs{tlabel} and \cs{tcaption}. \cs{@@par} (in \LaTeX) and % \cs{endgraf} (in plain \TeX) should equal the primitive \cs{par}. % \begin{macrocode} -\if@mfp@latex \else \let\@@par\endgraf \fi +\ifmfp@latex \else \let\@@par\endgraf \fi \def\mfp@restorepar{\let\par\@@par}% % \end{macrocode} % % Some \mfpic{} commands end with \cs{ignorespaces}. For some others a % better choice is the \LaTeX{} strategy of conditionally ignoring spaces. % \begin{macrocode} -\if@mfp@latex\else - \def\@namedef#1{\@xp\def\csname #1\endcsname}% - \def\@nameuse#1{\csname #1\endcsname}% -\fi -\mfp@ifdefined\@bsphack{}% - {\@nameuse{newskip}\@savsk +\mfp@ifdefined\@namedef{}% + {\def\@namedef#1{\@xp\def\csname #1\endcsname}}% +\mfp@ifdefined\@namelet{}% + {\def\@namelet#1{\@xp\let\csname #1\endcsname}}% +\mfp@ifdefined\@nameuse{}% + {\def\@nameuse#1{\csname #1\endcsname}}% +\mfp@ifundefined\@bsphack + \@nameuse{newskip}\@savsk \@nameuse{newcount}\@savsf \def\@bsphack{\relax \ifhmode \@savsk\lastskip \@savsf\spacefactor \fi}% \def\@esphack{\relax \ifhmode \spacefactor\@savsf \ifdim\@savsk>\z@ \ignorespaces - \fi\fi}}% + \fi\fi}% +\mfp@enddef % \end{macrocode} % +% \subsection{Warning if commands are already defined} +% % We sometimes (either by accident or by choice) redefine things defined % in some formats. For the accidental redefinitions we want to be told, % and since we cannot assume \LaTeX{} with its \cs{newcommand}, we define % a simple check and print a warning when it happens. % \begin{macrocode} \mfp@DBlog{Defining test for previous definitions of macros.}% -\mfp@ifdefined\mfp@testdef - {\Mfpic@warn{% - Hey! How can \string\mfp@testdef\space already be defined? % - \@msgbreak I'll redefine it anyway!}}% - {}% \def\mfp@testdef#1{% \ifx#1\UndEfInEd \else\ifx#1\relax - \Mfpic@warn{\string #1 was previouly defined to be \string\relax.}% + \Mfpic@warn{\string#1 was previouly defined to be \string\relax.}% \else - \Mfpic@warn{\string #1 is already defined!}% + \Mfpic@warn{\string#1 is already defined.}% \fi\fi}% % \end{macrocode} % -% \DescribeMacro{\newdef} -% \DescribeMacro{\newlet} -% Is the proposed definer of new definitions itself not new? Well, +% Is the proposed definer of new definitions itself not new? Well, % we'd like a warning, but go ahead and define it anyway. All % \cs{newdef} does is check whether the macro being defined is already % defined, raise a warning (but \emph{not} an error) and define it % anyway. We do something similar with \cs{let}. % \begin{macrocode} \mfp@testdef\newdef -\mfp@testdef\newlet \def\newdef#1{\mfp@testdef#1\def#1}% \newdef\newlet#1{\mfp@testdef#1\let#1}% % \end{macrocode} % +% \subsection{Error messages and warnings} +% +% If one tries to switch on \MP{} support after the output file has been +% set up, we issue this error message. +% \begin{macrocode} +\newdef\mfp@useMP@error{% + \mfp@errmsg {Command \mfp@b usemetapost too late}% + {It is too late to select the metapost option.^^J% + It must be selected before the \opengraphsfile command.^^J% + If you proceed, the metafont option will be assumed.}}% +% \end{macrocode} +% +% This one is for macros that need an output file to write to, but are +% called before one has been opened. +% \begin{macrocode} +\def\mfp@nooutput@error#1{% + \mfp@errmsg {No output file has been opened}% + {You have tried to used a command, #1, that requires an output^^J% + file to be opened with the \opengraphsfile command, which^^J% + was either not issued or was not successful.}}% +% \end{macrocode} +% +% Some options and commands require the \opt{metapost} option be in +% effect. We define an error message for the case where it is not in +% effect. +% \begin{macrocode} +\newdef\mfp@noMP@error#1{% + \mfp@errmsg {Metafont does not support #1, use MetaPost}% + {Metafont doesn't support #1. Perhaps you forgot to turn on^^J% + MetaPost support by using the metapost option or issuing the^^J% + command \usemetapost. For now, I will ignore it.}}% +% \end{macrocode} +% +% This next is like \cs{mfp@useMP@error}, but it is not so specific. +% It is for other options that also need to be issued before +% \cs{opengraphsfile}. +% \begin{macrocode} +\def\mfp@afteropen@error#1{% + \mfp@errmsg{Improper use of command \string#1\on@line}% + {You must issue the command #1 prior to \opengraphsfile. + It will be ignored now.}}% +% \end{macrocode} +% +% \cs{mfp@end} is defined to be an error message, but that is for +% debugging purposes. It's actual use is to mark the end when we need to +% process a list of tokens. The code should simply detect and remove it, +% and it should never be expanded, so seeing the error message indicates +% a coding error by me, or incorrect syntax by a user. +% \begin{macrocode} +\newdef\mfp@end{% + \mfp@errmsg {Unexpected token \string\mfp@end}% + {If you get this message but did not misuse the command^^J% + \mfp@end, it could mean you have unbalanced braces.}}% +% \end{macrocode} +% +% The next two are error messages for missing or empty data files. +% \begin{macrocode} +\newdef\mfp@nofile@error#1{% + \mfp@errmsg{No data file: #1}% + {The data file you tried to plot was not found.}}% +\newdef\mfp@nodata@error#1{% + \mfp@errmsg{Empty data file: #1}% + {The data file contained only empty lines and comments.}}% +% \end{macrocode} +% +% This message is issued when the \cs{tlabeljustify} command (see +% section~\ref{labelsettings}) is issued with an invalid parameter. +% \begin{macrocode} +\newdef\mfp@justify@error{% + \mfp@errmsg{Invalid justification parameter for text label}% + {The optional argument for an mfpic text label must be^^J% + one of B, b, c or t, followed by^^J + one of l, r or c, optionally followed by an angle.}}% +% \end{macrocode} +% +% This is the default meaning assigned to \cs{@nountil} at the +% beginning of \cs{mfploop}. Use of \cs{mfpuntil} cancels the +% warning, which is otherwise issued by \cs{mfpendloop}. +% \begin{macrocode} +\newdef\mfp@untilwarn{% + \Mfpic@warn{\mfp@b mfploop without \string\mfpuntil!}}% +% \end{macrocode} +% % % \section{Configuring \mfpic{} behavior}\label{configuring} % % \subsection{Options}\label{options} % -% \DescribeMacro{ifmfpmpost} +% \DescribeMacro{\ifmfpmpost} % I have decided to make this a user-level macro so that a user can % write code that behaves one way for \MP{} and another for \MF. However % the commands to change the setting are private. @@ -436,7 +543,7 @@ % Our switch to turn \MP{} support on or off needs to be global, so it % can't be a normal \cs{newif}. % \begin{macrocode} -\global\let\ifmfpmpost\iffalse +\newlet\ifmfpmpost\iffalse \newdef\mfp@mposttrue {\global\let\ifmfpmpost\iftrue}% \newdef\mfp@mpostfalse{\global\let\ifmfpmpost\iffalse}% \newdef\mfp@ifmpost{% @@ -444,29 +551,29 @@ % \end{macrocode} % % \DescribeMacro{\usemetafont} -% We make a user-level commands for switching to the appropriate drawing +% We make user-level commands for switching to the appropriate drawing % program. This is necessary for plain\TeX, but also used internally by % \mfpic. \CMF{} is the default. This command needs to not only clear the % boolean \cs{ifmfpmpost}, but also restore the default graphics inclusion % commands. Actually, it doesn't \emph{need} to unless \cs{usemetapost} % was previously issued to change the default. This would normally not % happen unless the user wanted to close the current graph file and open a -% new one for \MF. +% new one for \MF. For similar reasons, we clear the \opt{mplabels} +% option. % % \MP{} support requires macros for including EPS graphics. What works % best depends on the format, so we delay the definition of -% \cs{usemetapost} until the \LaTeX{} options section, but we define the -% error message here. +% \cs{usemetapost} until the \LaTeX{} options section. +% +% Since \cs{mfpicllx} and \cs{mfpiclly} are globally defined by graphic +% inclusion, we reset then to 0, in case \opt{metafont} and \opt{metapost} +% options are mixed in one file. % \begin{macrocode} \newdef\usemetafont{\mfp@mpostfalse + \nomplabels \def\preparemfpicgraphic##1{}% - \def\setmfpicgraphic##1{\@graphfont\char\mfp@count}% - \def\getmfpicoffset##1{}}% -\newdef\MPtoolate@error{% - \mfp@errmsg {Command \string\usemetapost\space too late.}% - {It is too late to select the metapost option.^^J% - It must be selected before the \opengraphsfile command.^^J% - If you proceed, the metafont option will be assumed.}}% + \def\setmfpicgraphic##1{\mfp@graphfont\char\mfp@count}% + \def\getmfpicoffset##1{\gdef\mfpicllx{0}\gdef\mfpiclly{0}}}% % \end{macrocode} % % Some options need an open \file{.mf} or \file{.mp} file before they @@ -474,174 +581,244 @@ % been issued but not \cs{closegraphsfile}. Since those commands define and % undefine \cs{mfp@filename}, we use that as our test. % \begin{macrocode} -\newdef\@ifmfpfileisopen{\mfp@ifdefined\mfp@filename}% +\newdef\mfp@ifopengraphsfile{\mfp@ifdefined\mfp@filename}% % \end{macrocode} % % \DescribeMacro{\setmfvariable} -% \DescribeMacro{\setmpvariable} % A useful abbreviation for a common requirement: declaring and setting -% a \MF{} variable. I have decided to change it to a user level macro for -% power users. \cs{setmpvariable} is another name for it. It takes three -% arguments: the type of variable, the variable itself, and its value. -% Example: \cs{setmfvariable}\marg{numeric}\marg{shadewd}\marg{.7pt}. +% a \MF{} variable. I have decided to change it to a user-level macro for +% power users. +% \DescribeMacro{\setmpvariable}\cs{setmpvariable} is another name for it. +% It takes three arguments: the type of variable, the variable itself, and +% its value. Example:\\ +% \indent \cs{setmfvariable}\marg{numeric}\marg{shadewd}\marg{.7pt}.\\ % Since it \mfc{save}\,s the variable, it must not have a suffix. This is % not a big problem since mostly it is for internal use. We document % that fact for power users and advise ordinary users on the naming of % \MF{} variables. % -% \DescribeMacro{\setmfboolean} -% \DescribeMacro{\setmfnumeric} -% \DescribeMacro{\setmfcolor} -% Abbreviations for the most common internal uses. In the case of \MF, -% color is the same numeric, but in \MP{} it is a separate variable type. +% We have abbreviations for the most common internal uses. For example +% \SpecialUsageIndex{\setmfboolean}\cs{setmfboolean} is the equivalent of +% \cs{setmfvariable} with type \mfc{boolean}. A similar statement is true +% For \SpecialUsageIndex{\setmfnumeric}\cs{setmfnumeric}, +% \SpecialUsageIndex{\setmfpair}\cs{setmfpair}, and +% \SpecialUsageIndex{\setmfcolor}\cs{setmfcolor}. +% +% \DescribeMacro{\globalsetmfvariable} +% This is like \cs{setmfvariable}, except it doesn't perform a +% \mfc{save} and so the variable is globally defined. Also, +% suffixed variables are permitted (but not numeric suffixes). % \begin{macrocode} \newdef\setmfvariable#1#2#3{% - \@ifmfpfileisopen{\mfcmd{setvariable (#1) (#2) (#3)}}{}}% + \mfp@ifopengraphsfile{\mfcmd{setvariable (#1) (#2) #3}}% + {\mfp@nooutput@error\setmfvariable}}% \newlet\setmpvariable\setmfvariable -\newdef\setmfboolean#1#2{\setmfvariable{boolean}{#1}{#2}}% -\newdef\setmfnumeric#1#2{\setmfvariable{numeric}{#1}{#2}}% -\newdef\setmfcolor#1#2{\setmfvariable{color}{#1}{#2}}% +\newdef\setmfboolean {\setmfvariable{boolean}}% +\newdef\setmfnumeric {\setmfvariable{numeric}}% +\newdef\setmfpair {\setmfvariable{pair}}% +\newdef\setmfcolor {\setmfvariable{color}}% +\newdef\globalsetmfvariable#1#2#3{% + \mfp@ifopengraphsfile{\mfcmd{gsetvariable (#1) (#2) #3}}% + {\mfp@nooutput@error\globalsetmfvariable}}% +\newlet\globalsetvariable\globalsetmfvariable % \end{macrocode} % % The command \cs{setmfvariable} arranges for the value of % that variable to be localized to each figure if set inside one, but % it is global otherwise. We have to be careful that \TeX{} and \MF{} -% stay in sync, as they have different understandings as to what is +% stay in synchrony, as they have different understandings as to what is % global and what is not. So we define a switch that will be set at the % start of an \env{mfpic} environment to test if a command is issued -% inside one. +% inside one. The command \cs{mfp@local} tests this switch and makes the +% following assignment global if it fails. Then we have two shortcuts for +% the more commonly occuring cases. % -% We also define here \texttt{true} and \texttt{false} as macros. These -% are strings we need to write to the output frequently. +% We also define here \texttt{true}, \texttt{false} and \texttt{color} as +% macros. These are strings we need to write to the output frequently. % \begin{macrocode} -\let\ifin@mfpicenv\iffalse +\newlet\ifin@mfpicenv\iffalse \newdef\mfp@local{\relax\ifin@mfpicenv\else\global\fi}% -\newdef\mf@T{true}% -\newdef\mf@F{false}% \newdef\mfp@let{\mfp@local\let}% \newdef\mfp@def{\mfp@local\def}% +\newdef\mfp@T{true}% +\newdef\mfp@F{false}% +\newdef\mfp@C{color}% % \end{macrocode} % % \DescribeMacro{\usecenteredcaptions} -% \DescribeMacro{\nocenteredcaptions} % This (\opt{centeredcaptions}) is the simplest option. Other options -% follow a similar pattern: user-level commands are defined for -% turning on (and sometimes turning off) the option. Selection of -% centered captions can be turned on or off at will throughout a -% document. -% \begin{macrocode} -\newdef\usecenteredcaptions{\mfp@let\if@mfp@centcapt\iftrue}% -\newdef\nocenteredcaptions {\mfp@let\if@mfp@centcapt\iffalse}% +% follow a similar pattern: a user-level command \cs{usecenteredcaptions} +% is defined for turning it on and another +% \DescribeMacro{\nocenteredcaptions}\cs{nocenteredcaptions} is defined +% for turning it off. Selection of centered captions can be turned on or +% off at will throughout a document. +% \begin{macrocode} +\newdef\usecenteredcaptions{\mfp@let\ifmfp@centcapt\iftrue}% +\newdef\nocenteredcaptions {\mfp@let\ifmfp@centcapt\iffalse}% \nocenteredcaptions % \end{macrocode} % +% \DescribeMacro{\useraggedcaptions} +% Here we define the settings for justified and ragged captions. +% Justified captions are the default. Ragged cptions are normally +% raggedright, but are ragged on both sides if \opt{centeredcaptions} is +% in effect. \DescribeMacro{\noraggedcaptions}For justified captions, +% lines are justified on both sides, except the last is centered under +% \opt{centeredcaptions}. +% \begin{macrocode} +\newdef\useraggedcaptions{\mfp@let\mfp@capsettings\mfp@raggedcap}% +\newdef\noraggedcaptions{\mfp@let\mfp@capsettings\mfp@justifiedcap}% +\newdef\mfp@raggedcap{% + \ifmfp@latex + \ifmfp@centcapt \centering \else \raggedright \fi + \else + \rightskip 0pt plus 1fil + \ifmfp@centcapt + \leftskip 0pt plus 1fil + \parfillskip 0pt plus 1fil\relax + \fi + \def\\{\unskip\hbox{}\penalty-\@M\ignorespaces}% + \fi}% +\def\mfp@justifiedcap{% + \ifmfp@centcapt + \leftskip 0pt plus 0.5fil + \rightskip 0pt plus -0.5fil + \parfillskip 0pt plus 1fil\relax + \fi + \def\\{\unskip\hbox{}\hfil\penalty-\@M\ignorespaces}}% +\noraggedcaptions +% \end{macrocode} +% % This common code is repeated almost verbatim four times, so we define % the following abbreviation. The first two arguments are the commands -% to turn the option on and off. The third and fourth are the \TeX{} and -% \MF{} booleans to switch. In all cases, the default for the option is -% \emph{off}, so we run \texttt{\#2} at the end. +% to turn the option on and off. The third and fourth are the \MF{} and +% \TeX{} booleans to switch. In all cases, the default for the option is +% \emph{off}, so we issue the second command after it is defined. +% +% Since the output file has not been opened while \mfpic{} is loading, the +% \MF{} boolean is not set, but the \cs{opengraphsfile} code will check +% the \TeX{} boolean and write the appropriate \MF{} code. % \begin{macrocode} \newdef\mfp@makeoption#1#2#3#4{% - \newdef#1{\mfp@let#3\iftrue\setmfboolean{#4}\mf@T}% - \newdef#2{\mfp@let#3\iffalse\setmfboolean{#4}\mf@F} + \newdef#1{\mfp@let#4\iftrue + \mfp@ifopengraphsfile{\setmfboolean{#3}\mfp@T}{}}% + \newdef#2{\mfp@let#4\iffalse + \mfp@ifopengraphsfile{\setmfboolean{#3}\mfp@F}{}}% #2}% % \end{macrocode} % % \DescribeMacro{\clipmfpic} -% \DescribeMacro{\noclipmfpic} -% The \opt{clip} option shows only what's inside the rectangle -% given in the \cs{mfpic} command. It can be turned on or off for -% each figure independently. The default is the old behavior: no -% clipping. -% -% If the output file has not been opened, \cs{setmfboolean} does nothing. -% But the \cs{opengraphsfile} code checks the boolean and writes the -% appropriate code. +% The \opt{clip} option shows only what's inside the rectangle given in +% the \cs{mfpic} command. It can be turned on or off for each figure +% independently. \DescribeMacro{\noclipmfpic}The default is the old +% behavior: no clipping. % \begin{macrocode} -\mfp@makeoption\clipmfpic\noclipmfpic\if@mfp@clip{clipall}% +\mfp@makeoption\clipmfpic\noclipmfpic{clipall}\ifmfp@clip % \end{macrocode} % % \DescribeMacro{\usetruebbox} -% \DescribeMacro{\notruebbox} % The \opt{truebbox} option lets \MP{} set the true bounding box (which % may differ from the numbers defined through \cs{mfpic}). +% \DescribeMacro{\notruebbox}The default is the old behavior, \cs{notruebbox}. % -% We don't need to be too careful with the scope of truebbox. As -% currently written, \TeX{} never needs to know the setting except to pass -% the information on to \cs{opengraphsfile} if the option is set before -% then. However, we treat it like most other settings, turning on or off -% an appropriate \TeX{} boolean, in case it ever becomes necessary to know -% the setting. It is local to any \env{mfpic}, global otherwise. The -% default is to have \opt{truebbox} turned off. -% \begin{macrocode} -\mfp@makeoption\usetruebbox\notruebbox\if@mfp@truebbox{truebbox}% -% \end{macrocode} -% -% Some options and commands require the \opt{metapost} option be in -% effect. We define a generic error message for such cases. If a command -% or option requires \MP, but the \opt{metapost} option is not set, the -% option is ignored, or the command aborted. +% We don't need to be too careful with the scope of these option +% commands. As currently written, \TeX{} never needs to know the setting +% except to pass the information on to \cs{opengraphsfile} if the option +% is set before then. However, we treat it like most other settings, +% turning on or off an appropriate \TeX{} boolean, in case it ever becomes +% necessary to know the setting. It is local to any \env{mfpic}, global +% otherwise. The default is to have \opt{truebbox} turned off. % \begin{macrocode} -\newdef\noMP@error#1{% - \mfp@errmsg {Metafont does not support #1, use MetaPost.}% - {Metafont doesn't support #1. Perhaps you forgot to turn on^^J% - MetaPost support by using the metapost option or issuing the^^J% - command \usemetapost. For now, I will ignore it.}}% +\mfp@makeoption\usetruebbox\notruebbox{truebbox}\ifmfp@truebbox % \end{macrocode} % % \DescribeMacro{\usemplabels} -% \DescribeMacro{\nomplabels} % An option to let \MP{} create labels, \opt{mplabels} mostly just % switches between two versions of \cs{tlabel} so no \MP{} booleans -% are set and so syncronization of scope is not an issue. The default -% is the old behavior: labels are placed by \TeX. The actual setting is -% delayed until \cs{opengraphsfile} so the order of these commands and -% \cs{usemetapost} is not significant (before \cs{opengraphsfile}). +% are set and so synchronization of scope is not an issue. +% \DescribeMacro{\nomplabels}The default is the old behavior: labels are +% placed by \TeX. The actual setting is delayed until \cs{opengraphsfile} +% so the order of these commands and \cs{usemetapost} is not significant +% (before \cs{opengraphsfile}). % % Because of the frequent need to check this setting, we define % \cs{@ifmplabels} to execute one of two alternatives based on it. -% \begin{macrocode} -\newdef\usemplabels{\mfp@let\if@mfp@mplabels\iftrue - \@ifmfpfileisopen - {\mfp@ifmpost{}% - {\noMP@error{mplabels}\global\let\if@mfp@mplabels\iffalse}}{}}% -\newdef\nomplabels{\mfp@let\if@mfp@mplabels\iffalse}% +% When writing \TeX{} code to the file we need to make sure \texttt\# +% is not doubled. We do this by issuing \cs{mp@mksharpother} before +% reading the argument that will be written. +% \begin{macrocode} +\newdef\usemplabels{\mfp@let\ifmfp@mplabels\iftrue + \mfp@ifopengraphsfile + {\mfp@ifmpost{}% + {\mfp@noMP@error{mplabels}\global\let\ifmfp@mplabels\iffalse}}{}}% +\newdef\nomplabels{\mfp@let\ifmfp@mplabels\iffalse}% \newdef\@ifmplabels{% - \if@mfp@mplabels\@xp\@firstoftwo\else\@xp\@secondoftwo\fi}% + \ifmfp@mplabels\@xp\@firstoftwo\else\@xp\@secondoftwo\fi}% \nomplabels +\newdef\mp@mksharpother{\@ifmplabels{\@makeother\#}{}}% % \end{macrocode} % % \DescribeMacro{\overlaylabels} -% \DescribeMacro{\nooverlaylabels} -% These control an option to defer adding labels (in \MP) until the end -% of the picture. That means they don't get clipped or covered up by any -% drawing elements. Neither of these commands affect \MF, but they write -% to the output file anyway if issued after \cs{opengraphsfile}. +% The option \opt{overlaylabels} instructs \MP{} to defer adding labels +% until the end of the picture. That means they don't get clipped or +% covered up by any drawing elements. \DescribeMacro{\nooverlaylabels}The +% default is the old behavior, \cs{nooverlaylabels}. Neither of these +% commands affect \MF, but they write to the output file anyway if issued +% after \cs{opengraphsfile}. % \begin{macrocode} \mfp@makeoption% - \overlaylabels\nooverlaylabels\if@mfp@overlabels{overlaylabels}% + \overlaylabels\nooverlaylabels{overlaylabels}\ifmfp@overlabels % \end{macrocode} % % \DescribeMacro{\clearsymbols} -% \DescribeMacro{\noclearsymbols} -% These determine whether the symbols drawn by \cs{plotsymbol} and -% \cs{plotnodes} should have their interiors erased before being drawn. +% The option \opt{clearsymbols} causes the symbols drawn by +% \cs{plotsymbol} and \cs{plotnodes} to have their interiors erased before +% being drawn. \DescribeMacro{\noclearsymbols}The default is the old +% behavior: \cs{noclearsymbols}. % \begin{macrocode} \mfp@makeoption% - \clearsymbols\noclearsymbols\if@mfp@clearsym{clearsymbols}% + \clearsymbols\noclearsymbols{clearsymbols}\ifmfp@clearsym +% \end{macrocode} +% +% \DescribeMacro{\stopshipping} +% This is to turn off character shipping for duration of innermost +% enclosing \MF{} group (eg, \env{mfpic} environment). As far as I know +% it has never been tested with \MP. (It hasn't been tested recently even +% in \MF.) The \MF{} code prevents the figure from being added to the font, +% the \TeX{} switch \cs{ifmfp@noship} is checked before \cs{endmfpic} +% attempts to add the (nonexistent) figure to the document. +% \DescribeMacro{\resumeshipping}\cs{resumeshipping} restores character +% shipping. +% +% \DescribeMacro{\noship}\cs{noship} is the older name for +% \cs{stopshipping}. Its name indicated that it was intended for use in +% one picture. This is not actually an option (that is, there is no +% corresponding \cs{DeclareOption} in \LaTeX), but it is coded the same. +% \begin{macrocode} +\mfp@makeoption\stopshipping\resumeshipping{noship}\ifmfp@noship +\newlet\noship\stopshipping +% \end{macrocode} +% +% \DescribeMacro{\mfpreadlog} +% This sets the boolean governing the option to examine the \MF{} or +% \MP{} log file for certain information. +% \begin{macrocode} +\newlet\ifmfp@readlog\iffalse +\newdef\mfpreadlog{% + \mfp@ifopengraphsfile + {\mfp@afteropen@error\mfpreadlog}{\global\let\ifmfp@readlog\iftrue}}% % \end{macrocode} % % \subsection{Graphic inclusion}\label{graphic} % % \DescribeMacro{\mfpicllx} -% \DescribeMacro{\mfpiclly} % The code to include a figure has been divided into three parts. Under % \opt{metapost} we need to both include the figure and save the -% bounding box coordinates of the lower left corner. Here we initialize -% the macros that hold these coordinates. +% \DescribeMacro{\mfpiclly} bounding box coordinates of the lower left +% corner. Here we initialize the macros that hold these coordinates. % \begin{macrocode} -\def\mfpicllx{0}% -\def\mfpiclly{0}% +\newdef\mfpicllx{0}% +\newdef\mfpiclly{0}% % \end{macrocode} % % \DescribeMacro{\preparemfpicgraphic} @@ -671,133 +848,169 @@ % % The definition of these three is delayed to the option processing % section, except under the \MF{} default: \cs{usemetafont} defines them. +% +% We actually define two alternative versions of \cs{@setmfpicgraphic}. +% The normal one is as described above, and a `nofile' alternative for +% when the graphic file somehow doesn't exist. Then we just print the +% filename. % \begin{macrocode} -\newdef\@setmfpicgraphic#1{% +\newdef\normal@setmfpgraphic#1{% \preparemfpicgraphic{#1}\setmfpicgraphic{#1}\getmfpicoffset{#1}}% +\newdef\nofile@setmfpgraphic#1{% + {\edef\mfp@tempa{#1}% + \vbox to 0pt{\vss + \rlap{\kern2pt \mfpdraftfont \mfp@sanitized\mfp@tempa}\kern 2pt}}}% +\mfp@ifdefined\strip@prefix{}{\def\strip@prefix#1>{}}% +\newdef\mfp@sanitized{\@xp\strip@prefix\meaning} +\newlet\@setmfpicgraphic\normal@setmfpgraphic \usemetafont % \end{macrocode} % % \DescribeMacro{\setfilename} % The user can also change \cs{setfilename} to modify the assumed -% filenames of the graphics output by \MP. The default is to concatenate -% the output file's basename with the picture number. +% filenames of the graphics output by \MP. The default is the output +% file's basename (\arg1) with the picture number as the extension. % \begin{macrocode} \newdef\setfilename#1#2{#1.#2}% % \end{macrocode} % -% \DescribeMacro{\ifmfpicdraft} +% The \opt{draft}, \opt{final} and \opt{nowrite} options override +% \mfpic's attempts to automatically detect whether the pictures should +% be included. They also work under the \opt{metafont} option, but are +% less important then (even unnecessary). +% % \DescribeMacro{\mfpicdraft} -% \DescribeMacro{\mfpicfinal} +% The \opt{draft} option (\cs{mfpicdraft} command) causes the pictures +% created by \mfpic{} to be omitted. +% % \DescribeMacro{\mfpicnowrite} -% The \opt{draft}, \opt{final} and \opt{nowrite} options override -% \mfpic's attempts to automatically detect whether the eps -% files should be included. The \opt{final} option can also be used to -% override a global draft option. Each of these sets the user level -% if-command \cs{ifmfpicdraft}, which is retained for backward -% compatibility. These settings are global since they are intended to -% be set for the whole document. The four commands -% \cs{@mfp@draft/finaltrue/false} are used to communicate with the -% \cs{opengraphsfile} command, in case the user-level commands occur before -% then. +% The \opt{nowrite} option (\cs{mfpicnowrite} command) turns off creation +% of the output \file{.mp} file. It is intended to help speed things up +% after all figures are completed, so it permits the insertion of pictures. +% +% \DescribeMacro{\mfpicfinal} +% The \opt{final} option (\cs{mfpicfinal} command) can be used to +% override a global draft option. It forces \mfpic{} to attempt to +% insert the pictures. Under the \opt{metapost} option, missing figures +% may cause serious slow-downs as a large number of directories may be +% searched. +% +% Each of these sets the user level if-command +% \SpecialUsageIndex{\ifmfpicdraft}\cs{ifmfpicdraft}, which is retained +% for backward compatibility. These settings are global since they are +% intended to be set for the whole document. The four commands +% \cs{mfp@\{draft\|final\}\{true\|false\}} are used to communicate with +% the \cs{opengraphsfile} command, in case the user-level commands occur +% before then. % \begin{macrocode} \newif\ifmfpicdraft -\newif\if@mfp@draft -\newif\if@mfp@final -\newif\if@mfp@nowrite +\newlet\ifmfp@draft\iffalse +\newlet\ifmfp@final\iffalse +\newlet\ifmfp@nowrite\iffalse \newdef\mfpicdraft{% - \@ifmfpfileisopen{\global\mfpicdrafttrue}% - {\global\@mfp@drafttrue}}% + \mfp@ifopengraphsfile{\global\mfpicdrafttrue}% + {\global\let\ifmfp@draft\iftrue}}% \newdef\mfpicfinal{% - \@ifmfpfileisopen{\global\mfpicdraftfalse}% - {\global\@mfp@finaltrue}}% + \mfp@ifopengraphsfile{\global\mfpicdraftfalse}% + {\global\let\ifmfp@final\iftrue}}% \newdef\mfpicnowrite{% - \@ifmfpfileisopen - {\mfp@errmsg - {Improper use of command \string\mfpicnowrite\@online.}% - {You must issue the command \mfpicnowrite prior to - \opengraphsfile. It will be ignored now.}}% - {\global\@mfp@nowritetrue}}% + \mfp@ifopengraphsfile{\mfp@afteropen@error\mfpicnowrite}% + {\global\let\ifmfp@nowrite\iftrue}}% +%</tex> % \end{macrocode} % -% \subsection{\CMP{} graphics and \LaTeX{} options}\label{latex} +% \subsection{\LaTeX{} options and \MP{} graphics inclusion}\label{latex} % % Code dependent on \LaTeXe. Mostly this is the option processing -% facilities. -% \begin{macrocode} -\if@mfp@latexe - \ProvidesPackage{mfpic}[2004/04/16 v0.7a beta.]% - \DeclareOption{draft}{\mfpicdraft}% - \DeclareOption{final}{\mfpicfinal}% - \DeclareOption{nowrite}{\mfpicnowrite}% - \DeclareOption{metapost}{\mfp@mposttrue}% - \DeclareOption{metafont}{\usemetafont}% - \DeclareOption{centeredcaptions}{\usecenteredcaptions}% - \DeclareOption{clip}{\clipmfpic}% - \DeclareOption{truebbox}{\usetruebbox}% - \DeclareOption{mplabels}{\usemplabels}% - \DeclareOption{overlaylabels}{\overlaylabels}% - \DeclareOption{clearsymbols}{\clearsymbols}% - \DeclareOption{debug}{\mfpicdebugtrue}% - \DeclareOption*{% - \@ifpackageloaded{graphics}% - {\Mfpic@warn{Unrecognized option \CurrentOption.}}% - {\Mfpic@msg{Passing option \CurrentOption\space to % - graphics package.}% - \PassOptionsToPackage{\CurrentOption}{graphics}}}% -% \end{macrocode} -% If \file{mfpic.cfg} exists, it will be input at this point. Then, -% we \cs{ProcessOptions}, using the *-form because it allows package -% options to take precedence over global options. Thus \mfpic's -% \opt{final} option can counteract the \mfpic-specific side effects of a -% global \opt{draft} option. +% facilities. The declaration of options is in the file +% \file{mfpic.sty}, which will input \file{mfpic.tex}. % \begin{macrocode} - \InputIfFileExists{mfpic.cfg}{}{}% - \ProcessOptions*\relax -% \end{macrocode} -% -% \DescribeMacro{\usemetapost} -% Finally, one of the definitions of \cs{usemetapost}. The other is -% for use outside \LaTeXe, when the \prog{graphics} package cannot be -% assumed to be available. -% \begin{macrocode} - \def\usemetapost{% - \@ifmfpfileisopen{\mfp@mpostfalse\MPtoolate@error}% - {\mfp@mposttrue \RequirePackage{graphics}% -% \end{macrocode} -% -% Unlike all the other eps inclusion macros, \cs{includegraphics} does +%<*sty> +\DeclareOption{draft}{\mfpicdraft}% +\DeclareOption{final}{% + \mfpicfinal\PassOptionsToPackage{final}{graphics}}% +\DeclareOption{nowrite}{\mfpicnowrite}% +\DeclareOption{metapost}{\mfp@mposttrue}% +\DeclareOption{metafont}{\usemetafont}% +\DeclareOption{centeredcaptions}{\usecenteredcaptions}% +\DeclareOption{justifiedcaptions}{\noraggedcaptions}% +\DeclareOption{raggedcaptions}{\useraggedcaptions}% +\DeclareOption{clip}{\clipmfpic}% +\DeclareOption{truebbox}{\usetruebbox}% +\DeclareOption{mplabels}{\usemplabels}% +\DeclareOption{overlaylabels}{\overlaylabels}% +\DeclareOption{clearsymbols}{\clearsymbols}% +\DeclareOption{debug}{\mfpicdebugtrue}% +\DeclareOption{mfpreadlog}{\mfp@readlogtrue}% +\DeclareOption*{% + \@ifpackageloaded{graphics}% + {\Mfpic@warn{Unrecognized option \CurrentOption.}}% + {\Mfpic@msg{Passing option \CurrentOption\space to % + graphics package.}% + \PassOptionsToPackage{\CurrentOption}{graphics}}}% +\newcommand*\mfpdraftfont{\normalfont\ttfamily}% +% \end{macrocode} +% +% Now we define one of three versions of \cs{@usemetapost}. This command +% will be issued by the user level command \cs{usemetapost}, and consists +% of the format dependent code. The one here is, of course, for \LaTeX{} +% and will be in \file{mfpic.sty}. +% +% Unlike all the other EPS inclusion macros, \cs{includegraphics} does % not make the bounding box coordinates available: \cs{Gin@llx} and the % others are defined, but are local to a group surrounding the internals % of \cs{includegraphics}. We locally modify one graphics package internal % macro to globally save the information we need. Here we save the -% original definition and define our replacement. This definitely needs -% to come after the above \cs{RequirePackage} command. -% \begin{macrocode} - \global\let\mfp@save@parse@bb\Gread@parse@bb - \gdef\mfp@parse@bb##1 ##2 ##3 ##4 ##5\\{% - \mfp@save@parse@bb##1 ##2 ##3 ##4 ##5\\% - \xdef\mfpicllx{\Gin@llx}\xdef\mfpiclly{\Gin@lly}}% +% original definition and define our replacement. For this, we definitely +% need to make sure the \prog{graphics} package is loaded. +% \begin{macrocode} +\def\@usemetapost{% + \mfp@ifdefined\includegraphics{}{\RequirePackage{graphics}}% + \let\mfp@save@parse@bb\Gread@parse@bb + \newdef\mfp@parse@bb##1 ##2 ##3 ##4 ##5\\{% + \mfp@save@parse@bb##1 ##2 ##3 ##4 ##5\\% + \xdef\mfpicllx{\Gin@llx}\xdef\mfpiclly{\Gin@lly}}% +% \end{macrocode} +% The \prog{graphics} package makes decisions about graphic files based on +% the files' extensions. Since we don't want to force our users to rename +% all the graphics output by \MP, we add code to \cs{preparemfpicgraphic} +% to force \cs{includegraphics} to treat the current extension (some +% number) as if it were `{\tt eps}' or `{\tt mps}' according to the +% context. We also use this command to substitute the above BoundingBox +% parsing code for the \prog{graphics} package version. +% \begin{macrocode} + \ifmfp@pdf \gdef\mfp@Gtype{mps}% + \else \gdef\mfp@Gtype{eps}% + \fi + \gdef\preparemfpicgraphic##1{% + \@namedef{Gin@rule@.\number\mfp@count}####1{{\mfp@Gtype}% + {.\number\mfp@count}{####1}}% + \let\Gread@parse@bb\mfp@parse@bb}% + \global\let\setmfpicgraphic\includegraphics + \gdef\getmfpicoffset##1{}}% +%</sty> % \end{macrocode} % -% The \prog{graphics} package (as opposed to the \prog{graphicx} package) -% is far too dependent on actual extensions. Since we don't want to -% force our users to rename all the graphics output by \MP, we have to -% force \cs{includegraphics} to treat the current extension (some number) -% as if it were `{\tt eps}' or `{\tt mps}' according to the context. We -% decide which at this point. +% \DescribeMacro{\usemetapost} +% The user level command \cs{usemetapost} starts with a few actions common +% to all formats, then calls \cs{@usemetapost} which is defined +% differently for different formats. % \begin{macrocode} - \if@mfp@pdf \gdef\mfp@Gtype{mps}% - \else \gdef\mfp@Gtype{eps}% - \fi +%<*tex> +\newdef\usemetapost{% + \mfp@ifopengraphsfile{\mfp@mpostfalse\mfp@useMP@error}% + {\mfp@mposttrue \@usemetapost}}% % \end{macrocode} % -% The code we add to \cs{setmfpicgraphic} replaces \cs{Gread@parse@bb} with -% our own version. +% Under \LaTeX, if \file{mfpic.cfg} exists, it will be input at this +% point. Then, we \cs{ProcessOptions}, using the star-form because it allows +% package options to take precedence over global options. Thus \mfpic's +% \opt{final} option can counteract the \mfpic-specific side effects of a +% global \opt{draft} option. % \begin{macrocode} - \gdef\preparemfpicgraphic##1{% - \let\Gread@parse@bb\mfp@parse@bb}% - \gdef\getmfpicoffset##1{}% - \gdef\setmfpicgraphic##1{\includegraphics{##1}}}}% +\ifmfp@latexe + \InputIfFileExists{mfpic.cfg}{}{}% + \ProcessOptions*\relax % \end{macrocode} % % \cs{ProcessOptions} doesn't allow \cs{RequirePackage}\marg{graphics}, @@ -806,49 +1019,46 @@ % close the output file if the user forgot. % \begin{macrocode} \mfp@ifmpost{\usemetapost}{}% - \AtEndDocument{\@closegraphsfile}% + \AtEndDocument{\mfp@closegraphsfile}% % \end{macrocode} % % Now those cases outside \LaTeXe{} that we try to support. % \begin{macrocode} \else - \Mfpic@msg{\mfpfiledate\space v\mfpfileversion.}% + \mfp@msg{}\Mfpic@msg{\mfpfiledate\space v\mfpfileversion.\@nl}% % \end{macrocode} % -% \DescribeMacro{\usemetapost} -% The definition of \cs{usemetapost} depends on the setting of -% \cs{if@mfp@pdf}: \file{epsf.tex} is used for regular \TeX{} and -% \file{supp-pdf.tex} for \pdfTeX. -% \begin{macrocode} - \if@mfp@pdf - \def\usemetapost{% - \@ifmfpfileisopen{\mfp@mpostfalse\MPtoolate@error}% - {\mfp@mposttrue - \mfp@ifdefined\convertMPtoPDF{}{\input supp-pdf\relax}% -% \end{macrocode} -% The command \cs{convertMPtoPDF} takes the filename and and two -% scaling factors. It parses the files PS contents to PDF code. It leaves -% the bounding box info in macros \cs{MPllx}, etc. -% \begin{macrocode} - \gdef\setmfpicgraphic##1{\convertMPtoPDF{##1}{1}{1}}% - \gdef\getmfpicoffset##1{% - \xdef\mfpicllx{\MPllx}\xdef\mfpiclly{\MPlly}}}}% - \else +% The definition of \cs{@usemetapost} in plain \TeX{} depends on the +% setting of \cs{ifmfp@pdf}. However both cases are so similar that we +% define a helper macro \cs{mfp@useMP} that just needs to have the names +% of three commands and one file fed to it. +% \begin{macrocode} + \newdef\mfp@useMP#1#2#3#4{% + \mfp@ifdefined#1{}{\input #2\relax}% + \global\let\setmfpicgraphic\mfp@includeMPS + \gdef\getmfpicoffset##1{\xdef\mfpicllx{#3}\xdef\mfpiclly{#4}}}% +% \end{macrocode} +% +% Under \pdfTeX{}, the graphics inclusion command is \cs{convertMPtoPDF}, +% defined in \file{supp-pdf.tex}. This command parses the file's PS +% contents to PDF code, and leaves the bounding box info in macros +% \cs{MPllx} and \cs{MPlly}. +% \begin{macrocode} + \ifmfp@pdf + \newdef\mfp@includeMPS#1{\convertMPtoPDF{#1}{1}{1}}% + \newdef\@usemetapost{% + \mfp@useMP\convertMPtoPDF{supp-pdf}\MPllx\MPlly}% % \end{macrocode} -% The final case is the generic plain\TeX, \AmSTeX, or \LaTeX2.09. Our -% code uses the macros from \file{epsf.tex}, which should be present in -% every installation that includes \prog{dvips}. The command -% \cs{epsfbox} takes the filename, writes a \cs{special} for -% \prog{dvips} (and other programs) and saves the bounding box -% coordinates in \cs{epsfllx}, etc. -% \begin{macrocode} - \def\usemetapost{% - \@ifmfpfileisopen{\mfp@mpostfalse\MPtoolate@error}% - {\mfp@mposttrue - \mfp@ifdefined\epsfbox {}{\input epsf\relax}% - \gdef\setmfpicgraphic##1{\epsfbox{##1}}% - \gdef\getmfpicoffset##1{% - \xdef\mfpicllx{\epsfllx}\xdef\mfpiclly{\epsflly}}}}% +% +% Under plain\TeX, eplain (still need to test this after recent eplain +% changes), \AmSTeX, or \LaTeX2.09, the graphics inclusion command is +% \cs{epsfbox}, defined in \file{epsf.tex}. This command writes a +% \cs{special} for \prog{dvips} (and other DVI driver programs), and +% leaves the bounding box info in macros \cs{epsfllx} and \cs{epsflly}. +% \begin{macrocode} + \else + \newdef\mfp@includeMPS#1{\epsfbox{#1}}% + \newdef\@usemetapost{\mfp@useMP\epsfbox{epsf}\epsfllx\epsflly}% \fi \fi % \end{macrocode} @@ -856,254 +1066,236 @@ % % \section{Optional parameter handling}\label{optional} % -% We borrow \LaTeX's \cs{@ifnextchar} to have the advantage of -% skipping spaces and EOLs, but we skip \cs{relax} as well. The reason for -% this last is that an EOL will be set equal to \cs{relax} in certain -% contexts and we want option handling to work the same there as -% elsewhere. This could be a mistake, since \cs{relax} is a common method -% to halt such things. However, there should be no occasion in an -% \env{mfpic} environment where one would want a `\texttt[' to follow a -% command and \emph{not} be an optional argument. In text label commands -% we restore the meaning of blank lines, and EOLs ought to be normal. -% -% The first argument of \cs{mfp@ifnextchar} is the token being checked. It -% doesn't have to be a character and we sometimes use \cs{mfp@ifnextchar} -% to check whether a certain command follows. However, it is usually -% `\texttt['. The next argument is the code to run if that character is -% present, the last is code to use if the character is not present. The -% first argument must end with code that handles the character. -% -% The reason for the \cs{long} in the code when the next token is -% \cs{relax} is that it may be \cs{par} which has been \cs{let} equal to -% \cs{relax} in \env{mfpic} environments. +% We borrow \LaTeX's \cs{@ifnextchar}. The first argument is the token +% being checked. It doesn't have to be a character and we sometimes use +% \cs{@ifnextchar} to check whether a certain command follows. +% The next argument is the code to run if that character is present, the +% last is code to use if the character is not present. % \begin{macrocode} \mfp@DBlog{Handlers for optional parameters.}% -\long\def\mfp@ifnextchar#1#2#3{% - \let\mfptmp@d=#1\def\mfptmp@a{#2}% - \def\mfptmp@b{#3}\mfp@checknext}% -\def\mfp@checknext{\futurelet\@let@token\mfp@ifnch}% -\def\mfp@ifnch{% - \ifx\@let@token\@sptoken - \let\mfptmp@c\eatspace@checknext - \else\ifx\@let@token\relax - \long\def\mfptmp@c##1{\mfp@checknext}% - \else\ifx\@let@token\mfptmp@d - \let\mfptmp@c\mfptmp@a - \else - \let\mfptmp@c\mfptmp@b - \fi\fi\fi\mfptmp@c}% -\begingroup - \def\:{\global\let\@sptoken= }\: % - \def\:{\eatspace@checknext}\@xp\gdef\: {\mfp@checknext}% -\endgroup +\mfp@ifundefined\@ifnextchar + \long\def\@ifnextchar#1#2#3{% + \let\reserved@d#1% + \def\reserved@a{#2}% + \def\reserved@b{#3}% + \futurelet\@let@token\@ifnch}% + \def\@ifnch{% + \ifx\@let@token\@sptoken + \let\reserved@c\@xifnch + \else + \ifx\@let@token\reserved@d + \let\reserved@c\reserved@a + \else + \let\reserved@c\reserved@b + \fi + \fi + \reserved@c}% + {% + \def\:{\global\let\@sptoken= }\: % this makes \@sptoken a space token + \def\:{\@xifnch}\@xp\gdef\: {\futurelet\@let@token\@ifnch}% + }% +\mfp@enddef +% \end{macrocode} +% +% The following save us some typing whenever we need to check if some +% token follows, and then remove it if it does. That's what +% \cs{mfp@iftoken} does, being just a generalized form of \LaTeX{}'s +% \cs{@ifstar}. All our star-form commands differ only in what parameter +% is passed to some other command. Thus \cs{mfp@ifstar} passes either +% \arg{2} or \arg{3} to command \arg{1}. +% +% The \cs{mfp@ifend} is for use in processing lists, which all end with +% the token \cs{mfp@end}. \cs{mfp@ifendorcomma} is useful for processing +% comma-separated lists. If \cs{mfp@end} follows, it is removed and \arg1 +% is executed. Otherwise, if a comma follows, it is removed and \arg2 is +% executed. When neither follows, nothing is removed and \arg3 is +% executed. Normally, this last is the main command being applied to each +% element of the list. +% \begin{macrocode} +\def\mfp@iftoken#1#2{\@ifnextchar#1{\@firstoftwo{#2}}}% +\def\mfp@ifstar#1#2#3{\mfp@iftoken*{#1{#2}}{#1{#3}}}% +\def\mfp@ifend{\mfp@iftoken\mfp@end}% +\def\mfp@ifendorcomma#1#2#3{\mfp@ifend{#1}{\mfp@iftoken,{#2}{#3}}}% % \end{macrocode} % % I've taken to making an empty optional argument the default for a lot % of commands. I wanted to make it possible to have the same result for -% empty brackets (i.e., \texttt{[]}) as for omitted brackets. -% The following helps check for emptyness. It uses a simple \cs{if} so -% that \texttt{\#1} will be expanded. I use a non-active -% \texttt{\textasciitilde} to test for emptyness because, even if a tilde -% should accidentally occur in \texttt{\#1}, it will most likely be active -% and expand to something else. In fact, in plain \TeX, -% \cs{mfp@ifempty}\marg{\textasciitilde} will compare -% \texttt{\textasciitilde} to \cs{penalty} and in \LaTeX{} to -% \cs{unhbox}. +% empty brackets (i.e., \texttt{[\,]}) as for omitted brackets. +% \cs{mfp@ifempty} helps check for emptyness. It uses a simple \cs{if} so +% that \arg{1} will be expanded. I use a non-active \texttt\textasciitilde +% (so it won't expand) to test for emptiness because, even if +% a tilde should accidentally occur in a user's \arg1, it will most +% likely be the usual active version which expands to something else. +% +% The shorthand \cs{mfp@ifexist} executes some code if \arg1 is not +% empty, otherwise it does nothing. And \cs{mfp@emptysub} expands to +% \arg1 if it isn't empty, otherwise \arg2. % % The \cs{@ifmtarg} macro is borrowed from \file{ifmtarg.sty}. % It is used when a space should count as empty, but expansion isn't -% wanted. +% needed. It would be nice to have one that counts both as empty, but +% that seems impossible (or impossibly hard). +% \begin{macrocode} +{% + \catcode`Q3 \catcode`\~12 + \gdef\mfp@ifempty#1{\if~#1~\@xp\@firstoftwo\else\@xp\@secondoftwo\fi}% + \gdef\mfp@ifexist#1{\if~#1~\@xp\@gobble\else\@xp\@firstofone\fi}% + \gdef\mfp@emptysub#1#2{\if~#1~#2\else#1\fi}% + \long\gdef\@ifmtarg#1{\@xifmtarg#1QQ\@secondoftwo\@firstoftwo\@nil}% + \long\gdef\@xifmtarg#1#2Q#3#4#5\@nil{#4}% +}% +% \end{macrocode} +% +% These are the two most common methods to parse optional arguments. In +% \cs{mfp@defaultopt}, if an optional argument is present, we use +% \cs{mfp@ifemptyopt} to see if it is empty and substitute a default +% (\arg{2}) if it is. Argument \arg{1} is the command to run +% on the resulting argument after this check. It needn't be a single +% command token, but can (and often will) be a series of commands, or a +% command with additional arguments. +% +% \cs{mfp@nullopt} is a convenient abbreviation for a common case: the +% default option is empty. We could define it in terms of +% \cs{mfp@defaultopt}, but then we'd have the redundant step of checking +% for an empty optional argument, only to replace it by an empty argument. +% That might not make a significant difference, but it just feels wrong. +% +% Both commands turn the delimited argument, if present, into an ordinary +% one. This extra step permits us to avoid many bracket pairs in later +% code. % \begin{macrocode} -\newdef\mfp@ifempty#1{% - \if~#1~\@xp\@firstoftwo\else\@xp\@secondoftwo\fi}% -\begingroup -\catcode`Q=3 -\long\gdef\@ifmtarg#1{\@xifmtarg#1QQ\@secondoftwo\@firstoftwo\@nil}% -\long\gdef\@xifmtarg#1#2Q#3#4#5\@nil{#4}% -\endgroup -\newdef\@ifmtsub#1#2{\@ifmtarg{#1}{#2}{#1}}% -\newdef\mfp@mtsub#1#2{\mfp@ifempty{#1}{#2}{#1}}% -% \end{macrocode} -% -% The following is a historical holdover. Originally all optional arguments -% were handled through \cs{do@ptparam}. Then there arose cases that did not -% fit its assumptions and I wrote \cs{alt@ptparam}. Then, it became more -% efficient to have \cs{mfp@ifnextchar} (defined above) and now -% this command is defined in terms of it. -% -% The first argument of \cs{do@ptparam} is the command to use and the -% second is a default value of the optional argument. The command must be -% defined, and it must be a command whose first argument is delimited by -% `{\tt[}' and `{\tt]}'. Currently this is no longer used: all commands -% use one of the variants below. -% \begin{macrocode} -\newdef\do@ptparam#1#2{\mfp@ifnextchar[{#1}{#1[#2]}}% -% \end{macrocode} -% -% These are variations on the above. In \cs{simple@opt}, if an optional -% argument is present, we check to see if it is empty and substitute the -% default if it is. This was so named because I intended that it be used -% only if the optional argument required no further parsing (because it -% turned the argument into a nondelimited one). But now we use it even -% then and the few commands that require further parsing handle it more or -% less ad hoc. -% -% \cs{null@opt} is a convenient abbreviation for a common case: the -% default option is null. -% \begin{macrocode} -\newdef\simple@opt#1#2{% - \mfp@ifnextchar[{\process@opt{#1}{#2}}{#1{#2}}}% -\newdef\process@opt#1#2[#3]{% - \mfp@ifempty{#3}{#1{#2}}{#1{#3}}}% -\newdef\null@opt#1{\mfp@ifnextchar[{#1}{#1[]}}% -% \end{macrocode} -% -% Quite a few \mfpic{} commands stuff several parameters into a -% single optional argument. Generally, these commands can be coded to -% proceed gracefully if the last parameter is missing (substituting a -% default). However, if more than that are missing, \TeX{} gobbles the -% closing bracket and produces pretty inscrutable error mesages. This -% (adding extra information in one optional argument) was, in retrospect, -% a bad design decision that was made for backward compatibility and -% (originally) to minimize the changes in existing commands. +\newdef\mfp@defaultopt#1#2{% + \@ifnextchar[{\mfp@ifemptyopt{#1}{#2}}{#1{#2}}}% +\newdef\mfp@ifemptyopt#1#2[#3]{\mfp@ifempty{#3}{#1{#2}}{#1{#3}}}% +\newdef\mfp@nullopt#1{\@ifnextchar[{\mfp@getopt{#1}}{#1{}}}% +\newdef\mfp@getopt#1[#2]{#1{#2}}% +% \end{macrocode} +% +% Why do we bother to check for an empty optional argument? Because +% quite a few \mfpic{} commands stuff several parameters into a +% single optional argument. All but the last are processed as undelimited +% arguments and the last one as delimited by the right bracket. If only +% the last parameter is missing, TeX{} takes that as an empty argument and +% we can proceed gracefully (substituting a default). However, if more +% than that are missing, \TeX{} takes the closing bracket as the +% \emph{undelimited} argument and produces pretty inscrutable error +% mesages. This decision to add extra information in one optional argument +% was, in retrospect, a bad one. It was made for backward compatibility +% and (originally) to minimize the changes in existing commands. % Unfortunately we are stuck with it for at least the near future. % -% We use the following utility to check for empty optional parameters. -% \begin{itemize} -% \item {\tt\#1} is the parameter to test (passed by some other macro) -% \item {\tt\#2} is what to use if {\tt\#1} is empty. -% \item {\tt\#3} is the command being passed the optional argument -% \end{itemize} -% We use a \cs{mfp@ifempty} so \texttt{\#1} will get expanded (often we -% pass arguments as macros). After the above revamping of optional -% argument handling, we ended up needing this code only once. -% \begin{macrocode} -\newdef\do@mtparam#1#2#3{\mfp@ifempty{#1}{#3[#2]}{#3[#1]}}% -% \end{macrocode} +% Another reason is that multiple optional arguments generally mean that +% the to specify a later one, all the previous ones need to be specified. +% But with the above code, the user can always use an empty bracket pair +% to indicate the default, minimizing the extra typing. % % % \section{Writing to the \file{.mf} or \file{.mp} file}\label{writing} % % \subsection{Preserving linebreaks}\label{linebreaks} % -% Some macros can take quite long arguments (we call them -% \cs{@listmac}\,s), especially if they are automatically generated by -% some program. While the output file need not ever be looked at, there -% can be a problem with lines too long for the \MF{} executable's line -% buffer. Plus, for debugging, we might want to examine the file \mfpic{} -% writes. We therefore try to get at least the list macros to preserve -% linebreaks on output. -% -% \DescribeMacro{\mfpicobeylines} -% We make use of the \TeX{} property that expandable commands are -% expanded inside \cs{write} commands, but unexpandable commands and -% characters are written verbatim (almost). If this were the only -% consideration, nothing would need to be done. But characters with -% catagory code 5 (end-of-line) are converted to spaces upon reading, so -% we have to change the category of the \cs{endlinechar}, or we have -% change the \cs{endlinechar} to a character in a different category. -% We do the former, because the line a macro starts on will already have -% the end-of-line character added, but its category will not yet be -% established. We need a category that \TeX{} will not \emph{ignore}, -% but that nevertheless has no (or minimal) side effects if encountered in -% a \TeX{} file. We therefore make it active, but \cs{let} it equal to -% \cs{relax}. This makes the end-line-character unexpandable. +% Some macros (the ones we call list macros) can take quite long +% arguments, especially if they are automatically generated by some +% program. While the output file need not ever be looked at, there can be +% a problem with lines too long for the \MF{} executable's line buffer. +% Plus, for debugging, we might want to examine the file \mfpic{} writes. +% We therefore try to get at least the list macros to preserve linebreaks +% on output. +% +% We make use of the \TeX{} property that expandable commands are expanded +% inside \cs{write} commands, but unexpandable commands and characters are +% written verbatim (almost). If this were the only consideration, nothing +% would need to be done. But characters with catagory code 5 (end-of-line) +% are converted to spaces upon reading, so we have to change the category +% of the \cs{endlinechar}, or we have change the \cs{endlinechar} to a +% character of a different category. We do the former, because the line a +% macro starts on will already have the end-of-line character added, but +% it will not yet have been tokenized, so its category can be changed. We +% need a category that \TeX{} will not \emph{ignore}, but that +% nevertheless has no (or minimal) side effects if encountered in a \TeX{} +% file. We therefore make it active, but \cs{let} it equal to \cs{relax}. +% This makes the end-line-character unexpandable since \cs{relax} is not +% expandable. % \begin{macrocode} \mfp@DBlog{Direct output to Metafont/Post file.}% -\begingroup +{% \catcode\mfp@ctrlM\active% \gdef\@activectrlM{^^M}% - \gdef\mfpicobeylines{\catcode\mfp@ctrlM\active\let^^M\relax}% -\endgroup + \gdef\mfp@obeylines{\catcode\mfp@ctrlM\active\let^^M\relax}% +}% % \end{macrocode} % % The choice \cs{relax} seems to be actually a slightly better choice % than \cs{endgraf} (which we used to use, and which equals the % unexpandable primative \cs{par}) because \cs{relax} is permitted before % the opening brace in the syntax of \meta{general text} (for token -% variable assignments, \cs{write}, \cs{message}, and the like) as well as -% being skipped in mfpic's version of \cs{@ifnextchar}. +% variable assignments, \cs{write}, \cs{message}, and the like). % -% \DescribeMacro{\preservelines} % The character assigned to \cs{endlinechar} is added to the end of all % lines read in by \TeX. The character assigned to \cs{newlinechar} % will produce a newline when it occurs in a \cs{write}. Our -% \cs{preservelines} ensures these are the same and makes the above -% changes in category. +% \cs{mfp@keeplines} ensures these are the same and makes the above +% changes in category. This will fail in the following case: +% \cs{endlinechar} is not \verb$^^M$ and the data starts on the same line +% as the command that issued \cs{mfp@keeplines}. But then the output will +% lack only that first linebreak. % \begin{macrocode} -\newdef\preservelines{\newlinechar\mfp@ctrlM - \endlinechar\newlinechar \mfpicobeylines}% +\newdef\mfp@keeplines{\newlinechar\mfp@ctrlM + \endlinechar\newlinechar \mfp@obeylines}% % \end{macrocode} % -% \DescribeMacro{\unpreservelines} -% This is no longer used and may some day be removed. Grouping is -% enough to isolate effects of \cs{preservelines}. The command -% \cs{unpreservelines} simply restores the catcode of control-M to the -% control-M to the usual in formats consistent with plain \TeX. If we -% really wanted to reverse the effects of \cs{preservelines}, we'd have to -% save and restore the four items changed: the values of \cs{newlinchar} -% and \cs{endlinechar}, the category of control-M, and the definition of -% an active control-M. -% \begin{macrocode} -\newdef\unpreservelines{\catcode\mfp@ctrlM=5 }% -% \end{macrocode} +% We want our file writes to issue \cs{mfp@keeplines} before the text is +% read (and category codes assigned). Also we often want to add a few +% items to the argument (figure macros append a semi-colon, list macros +% surround with parentheses), so we isolate the common starting code in +% \cs{mfp@write}, and then invoke the appropriate continuation command. % % \DescribeMacro{\mfsrc} -% \DescribeMacro{\mfcmd} -% \DescribeMacro{\mflist} -% We want these to issue \cs{preservelines} before the text is read -% (and category codes assigned). Also we often want to add a few items to -% the argument (figure macros append a semi-colon, list macros surround -% with parentheses), so we isolate the common starting code in -% \cs{@mfwrite}, and then invoke the appropriate continuation command. -% The ending code is in \cs{@mfsrc}. The \cs{begingroup} in -% \cs{@mfwrite} matches the \cs{endgroup} in \cs{@mfsrc}. The group -% isolates the changes to EOLs. We also equate \cs{@nl} to an active -% control-M so that it can be used for line breaks in cases where it is -% inconvenient to make EOLs active (in the replacement text of +% This one is the most basic, merely writing its contents. For figure +% macros, we ultimately call +% \DescribeMacro{\mfcmd}\cs{mfcmd}, which appends a semicolon, +% terminating any pending \MF{} command. For macros which take a comma +% separated list of values as their arguments, we call +% \DescribeMacro{\mflist}\cs{mflist} which surrounds the list in +% parentheses and appends a semicolon +% +% The ending code is in \cs{mfp@src}. The \cs{begingroup} in +% \cs{mfp@write} matches the \cs{endgroup} in \cs{mfp@src}. The group +% isolates the changes to EOLs. We also define \cs{@nl} to expand to an +% active control-M so that it can be used for line breaks in cases where +% it is inconvenient to make EOLs active (in the replacement text of % \cs{opengraphsfile} and \cs{@mfpic}, for example). % \begin{macrocode} -\newdef\mfsrc {\@mfwrite\@mfsrc\mfsrc}% -\newdef\mfcmd {\@mfwrite\@mfcmd}% -\newdef\mflist{\@mfwrite\@mflist}% -\newdef\@mfwrite{\begingroup - \preservelines \let\@nl\@activectrlM}% +\newdef\mfsrc {\mfp@write\mfp@src\mfsrc}% +\newdef\mfcmd {\mfp@write\mfp@cmd}% +\newdef\mflist{\mfp@write\mfp@wlist}% +\newdef\mfp@write{\begingroup\mfp@keeplines \let\@nl\@activectrlM}% % \end{macrocode} % -% The macro \cs{@mfsrc} does the job of writing to files. The output +% The macro \cs{mfp@src} does the job of writing to files. The output % stream \cs{mfp@out} is declared later. The other two commands invoke -% \cs{@mfsrc} on a slightly modified argument. The first argument to -% \cs{@mfsrc} is the command that called it (for the error message), the +% \cs{mfp@src} on a slightly modified argument. The first argument to +% \cs{mfp@src} is the command that called it (for the error message), the % second is the code to write. % \begin{macrocode} -\newdef\@mfsrc#1#2{% - \@ifmfpfileisopen{\immediate\write\mfp@out{#2}}% - {\nooutputfileerror{#1}}\endgroup}% -\newdef\@mfcmd#1{\@mfsrc\mfcmd{#1;}}% -\newdef\@mflist#1{\@mfsrc\mflist{(#1);}}% +\newdef\mfp@src#1#2{% + \mfp@ifopengraphsfile{\immediate\write\mfp@out{#2}}% + {\mfp@nooutput@error{#1}}\endgroup}% +\newdef\mfp@cmd#1{\mfp@src\mfcmd{#1;}}% +\newdef\mfp@wlist#1{\mfp@src\mflist{(#1);}}% % \end{macrocode} % % \subsection{Initializing the output file}\label{output} % % Category 12 characters percent, sharp and backslash signs for the -% \file{.mf} file. The command \cs{mf@d} is used to write a line of +% \file{.mf} file. The command \cs{mfp@d} is used to write a line of % dashes above and below each figure to make them stand out when debugging -% the file. This might be removed in the final distribution. -% \begin{macrocode} -\newdef\mfp@gobble#1{}% -\edef\mf@p{\@xp\mfp@gobble\string\%}% percent (%) -\edef\mf@s{\@xp\mfp@gobble\string\#}% sharp (#) -\edef\mf@b{\@xp\mfp@gobble\string\\}% backslash (\) -\newdef\mf@d{--------------}% -% \end{macrocode} -% -% Used to mark ends of things, \cs{mfp@delim} should never be expanded, -% but we give it a definition for debugging purposes: +% the file. % \begin{macrocode} -\newdef\mfp@delim{% - \mfp@errmsg {Misplaced \string\mfp@delim.}% - {If you get this message but did not (mis)use the command^^J% - \mfp@delim, please report this to the mfpic maintainer.}}% +\edef\mfp@p{\@xp\@gobble\string\%}% percent (%) +\edef\mfp@s{\@xp\@gobble\string\#}% sharp (#) +\edef\mfp@b{\@xp\@gobble\string\\}% backslash (\) +\newdef\mfp@d{--------------}% % \end{macrocode} % % The current date and time stamp will be written to the \file{.mf} file. @@ -1112,14 +1304,17 @@ % have been equated to the primitive commands \cs{year} and \cs{month} % (which are then redefined). % \begin{macrocode} -{\mfp@ifdefined\normalmonth - {\let\month\normalmonth\let\year\normalyear}{}% - \xdef\mfp@today{\number\year/\ifnum\month<10 0\fi\number\month/% - \ifnum\day<10 0\fi\number\day}% - \count2=\time \divide\count2 by 60 - \xdef\mfp@now{\ifnum\count2<10 0\fi\number\count2:}% - \multiply\count2 by -60 \advance\count2 \time - \xdef\mfp@now{\mfp@now\ifnum\count2<10 0\fi\number\count2 }}% +\mfp@ifdefined\two@digits{}% + {\def\two@digits#1{\ifnum#1<10 0\fi\number#1}}% +{% + \mfp@ifdefined\normalmonth + {\let\month\normalmonth\let\year\normalyear}{}% + \count@\time \divide\count@ by 60 + \xdef\mfp@now{\number\year/\two@digits\month/\two@digits\day + \space at \two@digits\count@:}% + \multiply\count@ by -60 \advance\count@\time + \xdef\mfp@now{\mfp@now\two@digits\count@}% +}% % \end{macrocode} % % These registers are allocated: @@ -1128,17 +1323,17 @@ % \item \cs{mfp@graph} Read stream used to test existence of files and % for reading datafiles. % \item \cs{mfp@count} Number for next \env{mfpic} environment. -% \item \cs{mfp@linetype} Current line style in multi-curve data plots. -% \item \cs{mfp@n} Scratch counter, so far used only in writing data to -% the \file{.mf} file. +% \item \cs{mfp@linetype} Number indexing current line style in +% multi-curve data plots. % \item \cs{mfp@sequence} Counter incremented with every datapoint written -% from a file to implement the feature that a list of numeric data can be -% plotted against its sequence position. +% from a file to implement the feature that a list of numeric data +% can be plotted against its sequence position. % \item \cs{mfp@toks} Temporary token register. -% \item \cs{every@tlabel} Tokens inserted at every \cs{tlabel}. % \item \cs{mfp@verbtex} A temporary token list used by \cs{mfpverbtex}. % \item \cs{mfp@commonverbatimtex} Tokens written at the start of every -% output file inside a \mfc{verbatimtex} group. +% output file inside a \mfc{verbatimtex} group. +% \item \cs{ifmfp@switch} Not exactly a register, but a temporary +% switch for passing information from one macro to another. % \end{itemize} % \begin{macrocode} \mfp@DBlog{Declarations used with data and graphs files.}% @@ -1147,13 +1342,11 @@ \newlet\mfp@data\mfp@graph \newcount\mfp@count \newcount\mfp@linetype -\newcount\mfp@n \newcount\mfp@sequence \newtoks\mfp@toks -\newtoks\every@tlabel \newtoks\mfp@verbtex \newtoks\mfp@commonverbatimtex -\every@tlabel{}% +\newif\ifmfp@switch % \end{macrocode} % % We store most of the \mfc{verbatimtex} block that \mfpic{} relies on in @@ -1161,25 +1354,152 @@ % relies on a couple of catcode changes and we want to be in a situation % where we have that under control. Each line will end with an active % ctrl-M, which is transformed by \cs{mfsrc} into a newline. +% +% The \cs{mpxshipout} is to cover all three cases of the output of +% `\texttt{mpto -tex}'. In public versions of \MP{} prior to 0.9 there was +% no such command in that output file. In 0.9 and 0.901 that command is +% defined at the start of the file, prior to any verbatimtex, but it is +% buggy. This code overwrites it and fixes the bugs. In later versions a +% good definition is used, but it appears only just before the first +% \mfc{btex} and so will overwrite my definition. Thus all cases are +% served. % \begin{macrocode} \begingroup - \let\newtoks\relax - \@makeother\%\@makeother\#\preservelines - \global\mfp@commonverbatimtex= - {\def\MFPtext#1{% - \vbox{\def\\{\cr}\MFPcfont\everylabel - \halign{##\hfil\cr#1\crcr}}}% + \mfp@keeplines\@makeother\#% + \@makeother\%\global\mfp@commonverbatimtex + {\gdef\mpxshipout{\afterassignment\middlempxshipout\setbox0=\hbox}% + \gdef\middlempxshipout{\aftergroup\finishmpxshipout}% + \gdef\finishmpxshipout{\dimen1=\ht0 \dimen2=\dp0 + \dimen0=\dimen1 \advance\dimen0\dimen2 + \setbox0=\hbox{\hbox{\box0 + \ifnum\dimen0>0 \vrule width1sp height\dimen1 depth\dimen2 + \else \vrule width1sp height1sp depth0sp\relax + \fi}}% + \ht0=0pt \dp0=0pt \shipout\hbox{\box0}}% + \def\MFPtext#1{\vbox{\def\\{\cr}\MFPcfont\everylabel + \halign{##\hfil\cr#1\crcr}}}% }\endgroup % \end{macrocode} % -% \DescribeMacro{\opengraphsfile} -% This is the main command to set up the output file. It also aims to -% check whether \MF{} or \MP{} has already been run on the output file, -% thereby determining whether the graphics can be included. It does this -% by checking for the existence of one of the products of these programs. -% In the case of \MF{} it looks for a \file{.tfm} file; in the case of -% \MP{} it looks for the first output graphic. +% We store the first several lines that will be written to the output +% file in a few internal macros, so that changing them will be easier. % +% The first two lines of the output file are comments identifying the +% file, the \mfpic{} version, the tex source file, and the timestamp. +% These are stored in \cs{mfp@versioninfo}. We also let \grafbase{} know +% the \mfpic{} version creating the file. This could catch version +% mismatches. But since older \grafbase{} didn't test this, some +% mismatches will be missed. +% +% After that (\cs{mfp@init@outfile}) we set the \mfc{mode}, the \mfc{mag} +% (both ignored by \MP), and arrange for \grafbase{} macros to be loaded. +% \begin{macrocode} +\newdef\mfp@versioninfo{% + \mfp@p\space\mfp@filename.m\mfp@ifmpost{p}{f}, + generated by Mfpic, v\mfpfileversion\space\mfpfiledate,\@nl + \mfp@p\space from TeX source "\jobname" on \mfp@now\@nl + numeric mfpicversion; mfpicversion:=\mfpicversion;\@nl}% +\newdef\mfp@init@outfile{% + if unknown mode: mode = localfont; fi\@nl + if unknown mag: mag = \number\mag/1000; fi\@nl + if unknown grafbase: input grafbase; fi\@nl\@nl}% +% \end{macrocode} +% Then a comparison of the version of this file, stored in +% \cs{mfpicversion} with the version stored in the \grafbase{} variable +% \mfc{grafbaseversion}. This should catch a mismatch caused by an old +% \grafbase{} with a current \mfpic. +% \begin{macrocode} +\newdef\mfp@versioncheck{% + if unknown grafbaseversion: grafbaseversion = 0; fi\@nl + if grafbaseversion <> mfpicversion :\@nl + GBmsg "Bad mfpic installation: mfpic and grafbase % + versions do not match.";\@nl + fi\@nl}% +% \end{macrocode} +% +% This opens the output file and prints a reminder to the user to run +% \MF{} or \MP{}. +% \begin{macrocode} +\newdef\mfp@openfile{% + \ifmfp@nowrite \else \mfp@msg{}% + \Mfpic@msg{Initializing \mfp@filename\mfp@ext.}% + \immediate\openout\mfp@out=\mfp@filename\mfp@ext\relax + \Mfpic@msg{Don't forget to process \mfp@filename\mfp@ext!}% + \Mfpic@msg{Apply \mfp@progname\space to \mfp@filename\mfp@ext% + \mfp@ifmpost{}{, then gftopk to the resulting gf file}.}% + \Mfpic@msg{Then reprocess this file "\jobname".\@nl}% + \fi}% +% \end{macrocode} +% +% A little bit of \LaTeX{} for checking file existence. +% \begin{macrocode} +\mfp@ifundefined\IfFileExists + \def\IfFileExists#1{\openin\mfp@graph=#1\relax + \ifeof\mfp@graph \@xp\@secondoftwo + \else \immediate\closein\mfp@graph \@xp\@firstoftwo + \fi}% + \def\InputIfFileExists#1#2{\IfFileExists{#1}{#2\input #1\relax}}% +\mfp@enddef +% \end{macrocode} +% +% The following is the code involved in opening the output file and +% checking for the existence of already created figures. +% \cs{mfp@checkoutput} checks if the output file of \MP{} or \MF{} exists. +% The first argument is the extension of that output file (\file{tfm} for +% \MF{}, the starting value of the figure counter for \MP{}). We use the +% existence of that output as a signal that there are graphics to be +% included. +% +% Based on the file existence, we set the values of the draft switch, and +% issue a message. Any other actions needed are passed as \arg2 (it +% exists) and \arg3 (it doesn't). These are nonempty only under the +% \opt{metafont} option: we load the font only if the \file{.tfm} exists, +% otherwise we use a the \texttt{dummy} font. +% +% We do not try to load a nonexistent font because that might trigger some +% \prog{maketfm} script which could be disastrous at this point, when the +% \file{.mf} file is in an uncertain state. +% \begin{macrocode} +\newdef\mfp@checkoutput#1#2#3{% + \IfFileExists{\setfilename\mfp@filename{#1}}% + {\global\mfpicdraftfalse #2}% + {\global\mfpicdrafttrue #3\mfp@msg{}% + \Mfpic@msg{No file \setfilename\mfp@filename{#1}.}% + }}% +\newdef\mfp@checkMPoutput{\mfp@checkoutput{\number\mfp@count}{}{}}% +\newdef\mfp@checkMFoutput{\mfp@checkoutput{tfm}% + {\global\font\mfp@graphfont\mfp@filename\relax}% + {\global\let\mfp@graphfont\mfp@dummy}}% +% \end{macrocode} +% +% For \opt{metapost} the output file needs to load some color macros, and +% write some setup for text labels (even if \cs{nomplabels}, because +% \cs{usemplabels could be turned on later}). \MF{} now can also handle +% the definitions in \file{dvipsnam.mp} but it seems a waste to load all +% those definitions just to get more names for grayscales (even given +% that \MF{} can find that file). +% \begin{macrocode} +\newdef\mfp@MPextras{\mfp@toks\@xp{\every@tlabel}% + \mfsrc{% + if unknown Apricot: input dvipsnam.mp; fi\@nl + verbatimtex\@nl + \ifmfp@verbtex \the\mfp@verbtex\@nl \fi + \the\mfp@commonverbatimtex\@nl + \def\noexpand\everylabel{\the\mfp@toks}\@nl + etex;\@nl}% + \global\mfp@verbtexfalse \global\mfp@verbtex{}% +% \end{macrocode} +% Finally, we process the \MP{}-specific options as they are currently +% known. The \cs{usemplabels} was delayed until now so that the order of +% it and \cs{usemetapost} before now would not matter. +% \begin{macrocode} + \@ifmplabels\usemplabels{}% + \ifmfp@truebbox \usetruebbox \fi + \ifmfp@overlabels \overlaylabels \fi}% +% \end{macrocode} +% +% \DescribeMacro{\opengraphsfile} +% This is the main command to set up the output file. % The name of the output file is its only parameter, and it appends % the extension \file{.mf} or \file{.mp} depending on the whether option % \opt{metafont} or \opt{metapost} was chosen. @@ -1188,173 +1508,165 @@ \newdef\opengraphsfile#1{\@bsphack % \end{macrocode} % A command can determine if it occurs after \cs{opengraphsfile} but -% before \cs{closegraphsfile} by testing whether \cs{mfp@filename} is defined. +% before \cs{closegraphsfile} by testing whether \cs{mfp@filename} is +% defined. We also save the name of the processing program (\MF{} or \MP) +% and the file extension (\file{.mf} of \file{.mp}) in macros for use in +% messages. % \begin{macrocode} - \@ifmfpfileisopen% + \def\mfp@tempa{#1}% + \mfp@ifopengraphsfile% {\Mfpic@warn - {An attempt has been made to open a graph file, #1, - \@msgbreak while another, \mfp@filename, is still open. - \@msgbreak Closing \mfp@filename.}% - \@closegraphsfile}% + {\@nl An attempt has been made to open a graph file, + \mfp@sanitized\mfp@tempa\@msgbreak + while another, \mfp@filename, is still open. \@msgbreak + Closing \mfp@filename.}\mfp@closegraphsfile}% {}% - \xdef\mfp@filename{#1}% -% \end{macrocode} -% The value of \cs{mfp@count} should be the number of the first figure. -% We use the existence of that figure as a signal that there are graphics -% to be included. -% \begin{macrocode} - \mfp@ifmpost{% - \openin\mfp@graph=\setfilename{\mfp@filename}{\number\mfp@count}% - \relax - \ifeof\mfp@graph \mfp@msg{}% - \Mfpic@msg - {No file \setfilename{\mfp@filename}{\number\mfp@count}.^^J}% - \global\mfpicdrafttrue - \else - \global\mfpicdraftfalse - \fi -% \end{macrocode} -% Type out the \MP-specific portion of a reminder to process the -% output. Then on to the \MF{} case. -% \begin{macrocode} - \if@mfp@nowrite \else - \immediate\openout\mfp@out=\mfp@filename.mp\relax - \Mfpic@msg{Don't forget to process \mfp@filename.mp! % - \@msgbreak (Apply metapost to \mfp@filename.mp.)}% - \fi - }{% metafont -% \end{macrocode} -% Under the \opt{metafont} option, we check for the \file{.tfm} file. -% We do not simply try to load the font because that might trigger -% some \prog{maketfm} script which could be disastrous at this point, -% when the \file{.mf} file is in an uncertain state. We open the -% \file{.tfm} for input, and check \cs{ifeof}, as we did in the -% \MP{} graphic case. -% \begin{macrocode} - \openin\mfp@graph=\mfp@filename.tfm\relax - \ifeof\mfp@graph \mfp@msg{}% - \Mfpic@msg{No file \mfp@filename.tfm .^^J}% - \global\let\@graphfont=\mfp@dummy - \global\mfpicdrafttrue + \xdef\mfp@filename{\mfp@sanitized\mfp@tempa} + \xdef\mfp@progname{meta\mfp@ifmpost{pos}{fon}t}% + \xdef\mfp@ext{.m\mfp@ifmpost{p}{f}}% % \end{macrocode} -% If it does exist, we load the font and in either case type out the -% \MF{} specific portion of our reminder. -% \begin{macrocode} - \else - \global\font\@graphfont=\mfp@filename\relax - \global\mfpicdraftfalse - \fi - \if@mfp@nowrite \else - \immediate\openout\mfp@out=\mfp@filename.mf\relax - \Mfpic@msg{Don't forget to process \mfp@filename.mf! % - \@msgbreak (Apply metafont to \mfp@filename.mf, % - then gftopk to the resulting gf file.)}% - \fi - }% -% \end{macrocode} -% The input stream used for testing is closed and the -% unspecific portion of the reminder is typed out, then -% the above settings of \cs{ifmfpicdraft} are overridden if the user has -% explicitly chosen the \opt{draft} or \opt{final} option. The -% \opt{nowrite} option merely disables the \cs{@mfsrc} command. -% \begin{macrocode} - \closein\mfp@graph - \if@mfp@nowrite\else - \Mfpic@msg{Then reprocess this file (\jobname).^^J}% - \fi - \if@mfp@draft\global\mfpicdrafttrue\fi - \if@mfp@final\global\mfpicdraftfalse\fi - \if@mfp@nowrite\gdef\@mfsrc##1##2{}\fi -% \end{macrocode} -% The first two lines of the output file are comments identifying the -% file, the \mfpic{} version, the tex source file, and the date. -% Then we let \grafbase{} know the \mfpic{} version creating the file. -% After that we set the \mfc{mode}, the \mfc{mag} (both ignored by \MP), -% and arrange for \grafbase{} macros to be loaded. The current -% \grafbase{} checks the \gbc{mfpicversion}: if it is unknown, or not -% equal to the value of \gbc{grafbaseversion}, a diagnostic message is -% printed. -% \begin{macrocode} - \mfsrc{% - \mf@p\space\mfp@filename.m\mfp@ifmpost{p}{f}, % - generated by Mfpic, v\mfpfileversion\space\mfpfiledate,\@nl - \mf@p\space from TeX source "\jobname" % - on \mfp@today\space at \mfp@now\@nl - numeric mfpicversion; mfpicversion:=\mfpicversion;\@nl - if unknown mode: mode := localfont; fi\@nl - if unknown mag: mag := \number\mag/1000; fi\@nl - if unknown grafbase: input grafbase; fi\@nl\@nl -% \end{macrocode} -% Then a comparison of the version of this file, stored in -% \cs{mfpicversion} with the version stored in the \grafbase{} variable -% \mfc{grafbaseversion}. This should catch mismatches the previous test -% would miss. +% +% These commands test for the existence of the graphics (\file{.tfm} file +% or first EPS file) and provisionally set \cs{ifmfpicdraft} based on the +% result. Then the \file{.mf} or \file{.mp} file is opened, and the +% automatic settings of \cs{ifmfpicdraft}, etc., are overridden if the +% user has explicitly chosen the \opt{draft} or \opt{final} option. The +% \opt{nowrite} option merely disables the \cs{mfp@src} command, called +% by all the commands that write to the file. % \begin{macrocode} - if unknown grafbaseversion: grafbaseversion := 0; fi\@nl - if grafbaseversion <> mfpicversion :\@nl - GBmsg "Bad mfpic installation: mfpic and grafbase % - versions do not match.";\@nl - fi\@nl}% + \mfp@ifmpost\mfp@checkMPoutput\mfp@checkMFoutput + \mfp@openfile + \ifmfp@draft \global\mfpicdrafttrue \fi + \ifmfp@final \global\mfpicdraftfalse \fi + \ifmfp@nowrite \gdef\mfp@src##1##2{\endgroup}\fi % \end{macrocode} -% For \opt{metapost} we need to load some color macros also, and write -% some setup for text labels (even if \cs{nomplabels}, because -% \cs{usemplabels could be turned on later}). \MF{} now can also handle -% the definitions in \file{dvipsnam.mp} but it seems a waste to load all -% those definitions just to get a few more grayscales (even given \MF{} -% can find that file). +% +% Now we set up the header and preamble of the output file, writing +% version info, initializations, version checking code and extra code +% for \MP{}, if required. +% +% Finally, we process options as they are currently known. These were +% delayed until now because they might require a write to the output file. +% Finally, we read the \prog{meta*o*t} log file, if the option to do that +% is in effect. % \begin{macrocode} - \mfp@ifmpost - {\mfsrc{% - if unknown Apricot: input dvipsnam.mp; fi\@nl - verbatimtex\@nl - \the\mfp@commonverbatimtex\@nl - \def\noexpand\everylabel{\the\every@tlabel}\@nl - \if@mfp@verbtex \the\mfp@verbtex\@nl \fi - etex;\@nl}% - \global\@mfp@verbtexfalse\mfp@verbtex{}% -% \end{macrocode} -% Finally, we write information to the output file, and/or set switches -% based on the options as they are currently known. The \cs{usemplabels} -% was delayed until now so that the order of it and \cs{usemetapost} -% before now would not matter. The other five are issued now because they -% might require a write to the output file. -% \begin{macrocode} - \@ifmplabels{\usemplabels}{}% - \if@mfp@truebbox \usetruebbox \fi - \if@mfp@overlabels \overlaylabels \fi}{}% - \if@mfp@clip \clipmfpic \fi - \if@mfp@clearsym \clearsymbols \fi - \if@shipping\else\stopshipping\fi + \mfsrc{\mfp@versioninfo\mfp@init@outfile\mfp@versioncheck}% + \mfp@ifmpost\mfp@MPextras{}% + \ifmfp@clip \clipmfpic \fi + \ifmfp@clearsym \clearsymbols \fi + \ifmfp@noship \stopshipping \fi + \ifmfp@readlog \mfp@readlogfile \fi \@esphack}% % \end{macrocode} % % \DescribeMacro{\closegraphsfile} -% This finishes off the output files and undefines \cs{mfp@filename}. -% We define an error message free version \cs{@closegraphsfile} for +% This command finishes off the output file and undefines \cs{mfp@filename}. +% We define an error message free version \cs{mfp@closegraphsfile} for % internal use. We unconditionally undefine \cs{mfp@filename} just in % case. % \begin{macrocode} \newdef\closegraphsfile{% - \@ifmfpfileisopen{}{\nooutputfileerror\closegraphsfile}% - \@closegraphsfile \global\let\mfp@filename\UndEfInEd}% -\newdef\@closegraphsfile{% - \@ifmfpfileisopen - {\if@mfp@nowrite \else + \mfp@ifopengraphsfile{}{\mfp@nooutput@error\closegraphsfile}% + \mfp@closegraphsfile}% +\newdef\mfp@closegraphsfile{% + \mfp@ifopengraphsfile + {\ifmfp@nowrite \else \mfsrc{\@nl end.}\immediate\closeout\mfp@out - \fi}{}}% -% \end{macrocode} -% -% \DescribeMacro{\nooutputfileerror} -% We define a generic error message for macros that need an output file -% to write to. \cs{mfsrc} uses it, as does \cs{closegraphsfile}. -% \cs{mfpic} also uses it even though all its writes take place through -% \cs{mfsrc}. This avoids potentially hundreds of error messages. -% \begin{macrocode} -\def\nooutputfileerror#1{% - \mfp@errmsg {No output file has been opened.}% - {You have tried to used a command, #1, that requires an output^^J% - file to be opened with the \opengraphsfile command, which^^J% - was either not issued or was not successful.}}% + \fi \global\let\mfp@filename\UndEfInEd}{}}% +% \end{macrocode} +% +% \subsection{Information from \MF: reading its log file} +% +% \DescribeMacro{\assignmfvalue}\SpecialUsageIndex{\globalassignmfvalue} +% This macro was suggested by Werner Lemberg, who also supplied working +% code. I have made modifications, so I am to blame if it has bugs. It +% writes code to the \file{.mf} file that causes \MF{} to write +% information to its \file{.log} file. If the option \opt{mfpreadlog} has +% been set, that log file will be examined for that information. The +% result, for example, of +% \begin{verbatim} +% \setmfvariable{numeric}{s}{10} +% \assignmfvalue\foo{s+2} +% \end{verbatim} +% is that \cs{foo} will be a macro that expands to `\texttt{12}' (during +% the \TeX{} run following the \MF{} pass). Under \opt{mplabels} a label +% containing \cs{foo} will only be correct in the \file{.mp} file after +% the second \MP{} pass, and so a third \TeX{} run may be required to +% insert the correct figure. To implement localization, the code causes +% the internal command \cs{mfpic-\meta{N}-foo} to be defined to the value, +% where \meta{N} is the number of the current figure. The \cs{foo} is then +% defined to the value of that internal command. Outside any \env{mfpic} +% environment, the internal command is \cs{mfpic--foo}. If the \file{.log} +% file doesn't exist or doesn't yet contain the information, \cs{foo} is +% defined to `???'. +% +% While \cs{mfpicvalue} is merely a signal and doesn't need a +% definition, we give it a useful definition for debugging: its own name. +% It could be accidentally redefined by a user, but that will be harmless; +% the debugging is mainly for me. +% +% It is possible to put \cs{global} in front of \cs{assignmfvalue} and +% its macro will be defined globally in the \TeX{} run, but I could find +% no way to make it global in the \file{.mp} file under \opt{mplabels}. +% Thus, I've created a \cs{globalassignmfvalue}. +% +% \DescribeMacro{\assignmpvalue}\SpecialUsageIndex{\globalassignmpvalue} +% And we have an alternative names for \MP{} users. +% \begin{macrocode} +\edef\mfpicvalue{\string\mfpicvalue}% +\newdef\mfp@cmdname{% + mfpic-\ifin@mfpicenv\number\mfp@count\fi-\@xp\@gobble\string}% +\newdef\assignmfvalue{\mfp@assign\@empty}% +\newdef\globalassignmfvalue{\mfp@assign\global}% +\newdef\mfp@assign#1#2#3{% + #1\edef#2{% + \@ifundefined{\mfp@cmdname#2}{???}{\@nameuse{\mfp@cmdname#2}}}% + \@ifundefined{\mfp@cmdname#2}% + {\mfp@msg{}\Mfpic@msg{No value for \string#2 in mfpic figure + \number\mfp@count.\@nl}}% + {}% + \mfsrc{\@ifmplabels{\@nl verbatimtex #1\def\string#2{#2} etex;\@nl}{}% + message "\string\mfpicvalue";\@nl + message "\mfp@cmdname#2";\@nl + show #3;\@nl + message "";}}% +\newlet\assignmpvalue\assignmfvalue +\newlet\globalassignmpvalue\globalassignmfvalue +% \end{macrocode} +% +% The following code is what really makes \cs{assignmfvalue} work. It is +% similar to code in the \prog{metatex} package, adapted by Werner Lemberg +% and then modified by me. It steps through the \mfpic{} output file looking +% for this signal: a line containing only `\verb$\mfpicvalue$'. It then +% reads the next line, creates a macro name from it, and assigns to that +% macro the value it reads on the next line. This is repeated to the end +% of the file. +% \begin{macrocode} +\newdef\strip@gtgt>> #1\mfp@end{#1}% +\newdef\mfp@readlogfile{% + \openin\mfp@data=\mfp@filename.log\relax + \ifeof\mfp@data \Mfpic@msg{No file \mfp@filename.log.}% + \else + {% + \mfp@resetwhitespace \endlinechar -1 + \catcode`\>12 + \def\@mfpicvalue{\mfpicvalue}% + \message{< Mfpic: Reading \mfp@filename.log}% + \mfp@readloglines + \message{>}% + }% + \fi \closein\mfp@data}% +\newdef\mfp@readloglines{% + \read\mfp@data to \mfp@tempa + \ifeof\mfp@data + \else + \ifx\mfp@tempa\@mfpicvalue + \read\mfp@data to \mfp@tempa + \read\mfp@data to \mfp@tempb + \@XP\xdef\@nameuse\mfp@tempa{\@xp\strip@gtgt\mfp@tempb\mfp@end}% + \fi + \@xp\mfp@readloglines + \fi}% % \end{macrocode} % % @@ -1371,6 +1683,7 @@ % \begin{macrocode} \mfp@DBlog{Using dummy font's dimensions, to spare TeX registers.}% % \end{macrocode} +% % While most fonts have relatively few font dimensions (twenty-two is a % common number), it turns out that if one loads a font and immediately % assigns a value to \cs{fontdimen}~$n$, Then \TeX{} acts as if the font @@ -1385,7 +1698,7 @@ % some unlikely value, which \TeX{} treats as a new font. % \begin{macrocode} \font\mfp@dummy=dummy scaled 1042 -\fontdimen100\mfp@dummy=0pt +\fontdimen100\mfp@dummy0pt % \end{macrocode} % % Some versions of \file{dummy.tfm} have values already assigned to font @@ -1396,25 +1709,28 @@ % We use an auxiliary count register to keep track of new font dimens. % \begin{macrocode} \newcount\mfp@fdc -\mfp@fdc=22 +\mfp@fdc22 % \end{macrocode} -% \DescribeMacro{\newfdim} +% % We define a macros that mimics the behavior of \cs{newdimen}, for % allocating font dimension numbers. It increments \cs{mfp@fdc} and -% defines its argument \texttt{\#1} to expand to an assignment of the -% current \cs{fontdimen}. +% defines its argument \arg{1} to expand to a reference to the +% \cs{fontdimen} with that number. The syntax it produces is valid as +% the left side of a dimension assignment and also as a dimension +% that may follow a real factor and \cs{the}. For example, later we say +% \cs{newfdim}\cs{pointsize} and give it the value \texttt{2pt}. Then +% \verb$\the\pointsize$ prints this value and +% \verb$\pointsize = 0.5\pointsize$ is a valid assignment. % \begin{macrocode} \newdef\newfdim#1{% - \global\advance\mfp@fdc 1 + \global\advance\mfp@fdc1 \xdef#1{\fontdimen\number\mfp@fdc\mfp@dummy}% - \wlog{\string#1=\string\fontdimen\number\mfp@fdc\mfp@dummy}}% + \wlog{\string#1=\fontdimen\number\mfp@fdc\mfp@dummy}}% % \end{macrocode} -% The definition (\cs{xdef}) is global since font dimension -% assignments are always global anyway. \TeX{} will not accept font -% dimensions in its syntax for the dimension arithmetic commands -% \cs{advance}, \cs{multiply} and \cs{divide}. In the rare cases where we -% need to do this we assign the value to a temporary register and -% calculate with it. It is, however OK to use them with a numeric factor. +% \TeX{} will not accept font dimensions in its syntax for the dimension +% arithmetic commands \cs{advance}, \cs{multiply} and \cs{divide}. In the +% rare cases where we need to do this we assign the value to a temporary +% register and calculate with it. % % We allocate a couple of boxes. At the end of an \mfpic{} % environment, \cs{@wholegraph} is loaded with the picture (possibly @@ -1427,38 +1743,31 @@ and a temporary one.}% \newbox\@wholegraph \newbox\@textbox -\newdef\tb@ht{\ht\@textbox}% height, -\newdef\tb@dp{\dp\@textbox}% depth and -\newdef\tb@wd{\wd\@textbox}% width of the text label. +\newdef\tb@ht{\ht\@textbox}% +\newdef\tb@dp{\dp\@textbox}% +\newdef\tb@wd{\wd\@textbox}% % \end{macrocode} % % When labels are processed, they are accumulated in the box % \cs{@alltlabels}. We allocate it, and four \cs{newfdim}\,s for the -% location of the four sides. +% location of three of the sides (We don't need the fourth). The box +% \cs{@backtext} holds `background text', that is, text accumulated +% between \cs{startbacktext} and \cs{stopbacktext}. % \begin{macrocode} \newbox\@alltlabels +\newbox\@backtext \newfdim\@tlabelstop \newfdim\@tlabelsbot \newfdim\@tlabelsleft -\newfdim\@tlabelsright % \end{macrocode} % -% It can be argued that dimensions not needed by \TeX{} should be stored -% in the output file rather than allocating (font) dimensions. These are -% everything below from \cs{pointsize} through \cs{symbolspace}, -% inclusive. This would make syncronictity between \TeX{} and \MF{} easier -% to maintain. Those that are needed by \TeX{} are then few enough to be -% regular \cs{dimen} registers, making them automatically local to each -% \env{mfpic} environment. Unfortunately, changing to such a scheme could -% break some past \mfpic{} files. It would also require recoding every -% command that now writes one of these dimensions to the output. -% -% One of these (\cs{@graphright}) is unused, except for debugging. -% We could also code around \cs{@graphwd} because it is always -% \cs{wd}\cs{@wholegraph}. ^^A Is this true? Check it out. +% The following fontdims record the dimensions of the box containing the +% picture. We need to adjust them when the text labels are added to the +% picture, because \TeX{} doesn't do it automatically. For example, +% kerning left outside the picture will not change the picture box's +% reference point. % \begin{macrocode} \mfp@DBlog{Internal dimension parameters for graph dimensions...}% -\newfdim\@graphwd \newfdim\@graphright \newfdim\@graphleft \newfdim\@graphtop @@ -1471,51 +1780,98 @@ % % The following are for label adjustments. The first two are used to % implement the feature that all labels can be simultaneously shifted an -% equal amount. The last is for the feature that the label can be a -% certain distance separated from the point where it is placed. +% equal amount. The third is for the feature that the label can be a +% certain distance separated from the point where it is placed. And the +% last establishes the distance between a label and a path surrounding it. % \begin{macrocode} \newfdim\tlabel@hadj \newfdim\tlabel@vadj \newfdim\tlabel@sep -\tlabel@hadj=0pt -\tlabel@vadj=0pt -\tlabel@sep=0pt +\newfdim\tlpath@sep +\tlabel@hadj0pt +\tlabel@vadj0pt +\tlabel@sep0pt +\tlpath@sep0pt % \end{macrocode} % +% It can be argued that dimensions not needed by \TeX{} should be stored +% in the output file rather than allocating (font) dimensions. These are +% everything below from \cs{pointsize} through \cs{symbolspace}, +% inclusive. This would make synchrony between \TeX{} and \MF{} easier +% to maintain. Those that are needed by \TeX{} are then few enough to be +% regular \cs{dimen} registers, making them automatically local to each +% \env{mfpic} environment. Unfortunately, changing to such a scheme could +% break some past \mfpic{} files. It would also require recoding every +% command that now writes one of these dimensions to the output. +% % The following are default parameters for various graphics commands that -% take an optional argument for the size of something. We allocate them, -% and then initialize them. +% take an optional argument for the size of something. +% \begin{itemize} +% \item\cs{mfpicunit}\SpecialUsageIndex{mfpicunit}, the unit of length in +% a picture. \cs{@mfpicunit} is used internally. +% \item\cs{pointsize}\SpecialUsageIndex{pointsize}, the diameter of a +% \cs{point}. +% \item\cs{shadespace}\SpecialUsageIndex{shadespace}, the spacing of dots +% in \cs{shade}. +% \item\cs{polkadotspace}\SpecialUsageIndex{polkadotspace}, the spacing of +% polkadots. +% \item\cs{hatchspace}\SpecialUsageIndex{hatchspace}, the spacing of hatch +% lines. +% \item\cs{headlen}\SpecialUsageIndex{headlen}, the size of arrowheads +% (except on axes). +% \item\cs{axisheadlen}\SpecialUsageIndex{axisheadlen}, the size of the +% arrowhead for $x$- and $y$-axes. +% \item\cs{sideheadlen}\SpecialUsageIndex{sideheadlen}, the size of the +% arrowhead for border axes. +% \item\cs{hashlen}\SpecialUsageIndex{hashlen}, the length of tic marks on +% axes. +% \item\cs{dashlen}\SpecialUsageIndex{dashlen}, the length of dashes in +% \cs{dashed}. +% \item\cs{dashspace}\SpecialUsageIndex{dashspace}, the space between such +% dashes. +% \item\cs{dotsize}\SpecialUsageIndex{dotsize}, the size of dots for +% \cs{dotted}. +% \item\cs{griddotsize}\SpecialUsageIndex{griddotsize}, the size of dots +% for \cs{grid} and \cs{plrgridpoints}. +% \item\cs{dotspace}\SpecialUsageIndex{dotspace}, the space between such +% dots. +% \item\cs{symbolspace}\SpecialUsageIndex{symbolspace}, the space between +% symbols used in a \cs{plot} command. +% \end{itemize} +% We allocate them, and then initialize them. % \begin{macrocode} \mfp@DBlog{User level dimension parameters, with default settings.}% -\newfdim\mfpicunit % unit of length -\newfdim\pointsize % diameter of circle -\newfdim\shadespace % spacing of shade dots -\newfdim\polkadotspace % spacing of polkadots -\newfdim\hatchspace % spacing of lines -\newfdim\headlen % size of arrowhead (\arrow) -\newfdim\axisheadlen % size of arrowhead (x, y axes) -\newfdim\sideheadlen % size of arrowhead (border axes) -\newfdim\hashlen % length of marks on axes -\newfdim\dashlen % length of dashes (\dashed) -\newfdim\dashspace % space between dashes -\newfdim\dotsize % size of dots (\dotted) -\newfdim\dotspace % space between dots -\newfdim\symbolspace % space between symbols (\plot) -% -\mfpicunit=1pt -\pointsize=2pt -\shadespace=1pt -\polkadotspace=10pt -\hatchspace=3pt -\headlen=3pt -\axisheadlen=5pt -\sideheadlen=0pt -\hashlen=4pt -\dashlen=4pt -\dashspace=4pt -\dotsize=0.5pt -\dotspace=3pt -\symbolspace=5pt +\newfdim\mfpicunit +\newfdim\@mfpicunit % internal version +\newfdim\pointsize +\newfdim\shadespace +\newfdim\polkadotspace +\newfdim\hatchspace +\newfdim\headlen +\newfdim\axisheadlen +\newfdim\sideheadlen +\newfdim\hashlen +\newfdim\dashlen +\newfdim\dashspace +\newfdim\dotsize +\newfdim\griddotsize +\newfdim\dotspace +\newfdim\symbolspace +\mfpicunit1pt +\pointsize2pt +\shadespace1pt +\polkadotspace10pt +\hatchspace3pt +\headlen3pt +\axisheadlen5pt +\sideheadlen0pt +\hashlen4pt +\dashlen4pt +\dashspace4pt +\dotsize0.5pt +\griddotsize0.5pt +\dotspace3pt +\symbolspace5pt % \end{macrocode} % % Font dimensions are global, and so not restricted to an \env{mfpic} @@ -1523,44 +1879,45 @@ % user to restore a value every time one picture needed a different % value from the rest. To avoid requiring this, the following macro is % used to save all values of these dimensions at the start of a picture, -% and to restore the saved values at the end. (Some internal dimensions -% (\cs{@graph...}, for example) don't need saving since they are reset -% with each picture.) +% and to restore the saved values at the end. Some internal dimensions +% (all the \cs{@graph...}, \cs{@tlabels...} and \cs{tb@...}) don't need +% saving since they are reset with each picture. % \begin{macrocode} \newdef\save@mfpicdimens{% \edef\restore@mfpicdimens{% - \mfpicunit =\the\mfpicunit - \pointsize =\the\pointsize - \shadespace =\the\shadespace -\polkadotspace =\the\polkadotspace - \hatchspace =\the\hatchspace - \headlen =\the\headlen - \axisheadlen =\the\axisheadlen - \sideheadlen =\the\sideheadlen - \hashlen =\the\hashlen - \dashlen =\the\dashlen - \dashspace =\the\dashspace - \dotsize =\the\dotsize - \dotspace =\the\dotspace - \symbolspace =\the\symbolspace - \tlabel@hadj =\the\tlabel@hadj - \tlabel@vadj =\the\tlabel@vadj - \tlabel@sep =\the\tlabel@sep}}% -% \end{macrocode} -% -% \DescribeMacro{\mfpframesep} -% \DescribeMacro{\mfpframethickness} -% \DescribeMacro{\mfpicheight} -% \DescribeMacro{\mfpicwidth} -% \DescribeMacro{\mfpiccaptionskip} -% Here are the few dimension registers we do allocate. The first two are -% scratch registers, the next two govern frames, and the last two are set -% after each picture to that pictures size. A \cs{vskip} of -% \cs{mfpiccaptionskip} is placed between figure and caption by -% \cs{tcaption}. + \mfpicunit \the\mfpicunit + \pointsize \the\pointsize + \shadespace \the\shadespace + \polkadotspace \the\polkadotspace + \hatchspace \the\hatchspace + \headlen \the\headlen + \axisheadlen \the\axisheadlen + \sideheadlen \the\sideheadlen + \hashlen \the\hashlen + \dashlen \the\dashlen + \dashspace \the\dashspace + \dotsize \the\dotsize + \griddotsize \the\griddotsize + \dotspace \the\dotspace + \symbolspace \the\symbolspace + \tlabel@hadj \the\tlabel@hadj + \tlabel@vadj \the\tlabel@vadj + \tlabel@sep \the\tlabel@sep + \tlpath@sep \the\tlpath@sep}}% +% \end{macrocode} +% +% Here are the few dimension registers we do allocate: +% \SpecialUsageIndex{\mfpframesep}\cs{mfpframesep}, and +% \SpecialUsageIndex{\mfpframethickness}\cs{mfpframethickness} +% govern frames. +% \SpecialUsageIndex{\mfpicheight}\cs{mfpicheight} and +% \SpecialUsageIndex{\mfpicwidth}\cs{mfpicwidth} are set +% after each picture to that picture's size. A \cs{vskip} of +% \SpecialUsageIndex{\mfpiccaptionskip}\cs{mfpiccaptionskip} is placed +% between figure and caption by \cs{tcaption}. We also allocate a +% frequently used scratch register % \begin{macrocode} \newdimen\mfp@scratch -\newdimen\mfp@scratchB \newdimen\mfpframesep \newdimen\mfpframethickness \newdimen\mfpicheight @@ -1568,7 +1925,7 @@ \newskip\mfpiccaptionskip \mfpframethickness0.4pt \mfpframesep2pt -\mfpiccaptionskip=\medskipamount +\mfpiccaptionskip\medskipamount % \end{macrocode} % % @@ -1576,15 +1933,15 @@ % % \DescribeMacro{\mfpicnumber} % We make a user-level macro for setting the number of the next graph. -% The purpose of this is so that the output file can be used as a font, -% setting the figure numbers to the ascii codes of printable characters. -% Then creating a composite figure is as easy as changing fonts: -% \marg{\cs{pic} ABABAAB}. The motivation came from a discussion on -% \texttt{comp.text.tex} started by someone who wanted to input a sequence -% of 0's and 1's and get a corresponding sequence of black and white -% squares. +% The original purpose of this is so that the font file could have +% characters in the positions of printable characters. Then creating a +% composite figure is as easy as changing fonts: \marg{\cs{pic} ABABAAB}. +% The motivation came from a discussion on \texttt{comp.text.tex} started +% by someone who wanted to input a sequence of 0's and 1's and get a +% sequence of black and white squares. For \MP{} users it is not very +% important. % \begin{macrocode} -\def\mfpicnumber#1{\global\mfp@count=#1\relax}% +\def\mfpicnumber#1{\global\mfp@count#1\relax}% % \end{macrocode} % % \DescribeMacro{\mfpaddto} @@ -1594,235 +1951,302 @@ % used only in the \cs{axislabels} command, so it needn't be globally % defined, but it might be handy in the future. % \begin{itemize} -% \item[] \texttt{\#1} is a \emph{macro} that expands to some number. -% \item[] \texttt{\#2} is a number to add to it. +% \item[] \arg{1} is a \emph{macro} that expands to some number. +% \item[] \arg{2} is a number to add to it. % \end{itemize} -% The result is stored again in \texttt{\#1}, overwriting the old value. +% The result is stored again in \arg{1}, overwriting the old value. % % \DescribeMacro{\mfpmultiply} -% For my personal use (or for power users), this is the multiplicative -% version, with the same syntax and behavior. -% \begin{macrocode} -\newdef\mfpaddto#1#2{\mfp@scratch=#1pt\advance\mfp@scratch#2pt - \edef#1{\mfp@strippt\mfp@scratch}}% -\newdef\mfpmultiply#1#2{\mfp@scratch=#1pt \mfp@scratch#2\mfp@scratch - \edef#1{\mfp@strippt\mfp@scratch}}% -\begingroup - \@makeother P\@makeother T\lowercase{\gdef\mfp@factor#1PT{#1}}% -\endgroup -\newdef\mfp@strippt{\@xp\mfp@factor\the}% +% This is the multiplicative version, with the same syntax and behavior. +% It is not used anywhere yet. +% \begin{macrocode} +\newdef\mfpaddto#1#2{\mfp@scratch#1pt \advance\mfp@scratch#2pt + \edef#1{\strip@pt\mfp@scratch}}% +\newdef\mfpmultiply#1#2{\mfp@scratch#1pt \mfp@scratch#2\mfp@scratch + \edef#1{\strip@pt\mfp@scratch}}% +\mfp@ifundefined\strip@pt + \begingroup + \lccode`\/`\p + \lccode`\?`\t + \lowercase{% + \endgroup + \def\rem@pt#1.#2/?}{#1\ifnum#2>\z@.#2\fi}% + \def\strip@pt{\@xp\rem@pt\the}% +\mfp@enddef % \end{macrocode} % -% A few user-level utilities. -% % \DescribeMacro{\pointdef} % A point defining macro, suggested by a user. % \begin{itemize} -% \item[] \texttt{\#1} is a symbolic name for a point, only letters. -% \item[] \texttt{\#2} and \texttt{\#3} are the coordinates. +% \item[] \arg{1} is a symbolic name for a point, only letters. +% \item[] \arg{2} and \arg{3} are the coordinates. % \item[] Usage: \cs{pointdef}\marg{A}\parg{2,5} makes \cs{A} expand % to \texttt{(2,5)}, \cs{Ax} to \texttt{2}, and \cs{Ay} to % \texttt{5}. % \end{itemize} % \begin{macrocode} \newdef\pointdef#1(#2,#3){% + \@ifundefined{#1} {}{\Mfpic@warn{\mfp@b#1 already defined.}}% + \@ifundefined{#1x}{}{\Mfpic@warn{\mfp@b#1x already defined.}}% + \@ifundefined{#1y}{}{\Mfpic@warn{\mfp@b#1y already defined.}}% \@namedef{#1}{(#2,#3)}\@namedef{#1x}{#2}\@namedef{#1y}{#3}}% % \end{macrocode} % -% \DescribeMacro{\pairarray} -% \DescribeMacro{\numericarray} -% The first enables the simultaneous definition of \MF{} pair variables -% \mfc{A1}, \mfc{A2}, etc, \mfc{A[n]} by writing, -% \cs{pairarray}\marg{A}\marg{\meta{list}}, the list being a list of -% $n$ ordred pairs. Numeric variables can be created similarly with the -% second command. +% \DescribeMacro{\setmfarray} +% This enables the simultaneous definition of \MF{} (or \MP) variables +% such as \mfc{A1}, \mfc{A2}, etc., by writing +% \cs{setmfarray}\marg{\meta{type}}\marg{\meta{name}}\marg{\meta{list}}, +% the \meta{name} being any \MF{} variable without a suffix, the list being +% a comma separated list of items of the appropriate \meta{type}. +% For example, \cs{setmfarray}\marg{pair} would require a list of +% pairs. +% +% \SpecialUsageIndex{\numericarray} +% As with \cs{setmfvariable}, we provide a few abbreviations. +% \cs{numericarray} is for arrays of numeric variables, +% \SpecialUsageIndex{\pairarray} \cs{pairarray} for arrays of pair +% variables and \SpecialUsageIndex{\colorarray}\cs{colorarray} is for +% arrays of color variables. Finally, to set arrays globally, there is +% \SpecialUsageIndex{\globalsetmfarray}\cs{globalsetmfarray}. % \begin{macrocode} -\newdef\pairarray#1{% - \mfcmd{save #1}\mfsrc{textpairs (#1)}\mfp@writedata}% -\newdef\numericarray#1{\mfcmd{save #1; numeric #1; numeric #1[]}% - \mfsrc{list (#1)}\mfp@writedata}% +\newdef\setmfarray#1#2{\mfsrc{setarray (#1) (#2)}\mfp@writedata}% +\newlet\setmparray\setmfarray +\newdef\pairarray{\setmfarray{pair}}% +\newdef\numericarray{\setmfarray{numeric}}% +\newdef\colorarray{\setmfarray{color}}% +\newdef\globalsetmfarray#1#2{\mfsrc{gsetarray (#1) (#2)}\mfp@writedata}% % \end{macrocode} % -% \DescribeMacro{\lightershade} -% \DescribeMacro{\darkershade} -% Shade adjustment macros. They just multiply or divide \cs{shadespace} -% by 1.2. +% Shade adjustment macros. +% \DescribeMacro{\lightershade}\cs{lightershade} +% just multiplies \cs{shadespace} by $1.2$. While +% \DescribeMacro{\darkershade}\cs{darkershade} divides by $1.2$ +% (actually, multiplies by $1/1.2$) % \begin{macrocode} -\newdef\lightershade{\shadespace=1.2\shadespace}% -\newdef\darkershade{\shadespace=.833333\shadespace}% +\newdef\lightershade{\shadespace1.2\shadespace}% +\newdef\darkershade{\shadespace.83333\shadespace}% % \end{macrocode} % % \DescribeMacro{\dashlineset} -% \DescribeMacro{\dotlineset} % The following arrange for contrastive dashed lines. \cs{dashlineset} % just resets the default parameters that the \cs{dashed} macro uses, +% \DescribeMacro{\dotlineset} % \cs{dotlineset} sets these parameters so that \cs{dashed} produces % something almost dotted. % \begin{macrocode} -\newdef\dashlineset{\dashlen=4pt \dashspace=4pt}% -\newdef\dotlineset{\dashlen=1pt \dashspace=2pt}% +\newdef\dashlineset{\dashlen4pt \dashspace4pt }% +\newdef\dotlineset{\dashlen1pt \dashspace2pt }% % \end{macrocode} % -% \DescribeMacro{\ifpointfill} +% \DescribeMacro{\pointfilltrue} % With the commands \cs{pointfilltrue} or \cs{pointfillfalse} the user % can specify points drawn with the \cs{point} command to be either -% filled in or not. +% filled in or \DescribeMacro{\pointfillfalse}not. % \begin{macrocode} \let\ifpointfill\iftrue \newdef\pointfilltrue{\mfp@let\ifpointfill\iftrue}% \newdef\pointfillfalse{\mfp@let\ifpointfill\iffalse}% % \end{macrocode} % +% \CMF{} has very flexible looping capabilities. Before version 0.8 there +% was no \mfpic{} interface because it seemed that \cs{mfsrc} was the +% simplest way to access this capability. Anything else would have to +% be either a clone of \cs{mfsrc} or limit the possibilities. However, I +% now believe it might be a good thing to have a structured way to perform +% repetitive actions at the \MF{} level. +% +% As of version 0.9, \mfpic{} will allow loops outside \env{mfpic} +% environments. It seems like a reasonable thing to be allowed to do. +% Fortunately, the macro names are already unique. +% +% \DescribeMacro{\mfpfor} +% This is the simplest: it writes the word \mfc{for} plus the contents of +% its only mandatory argument, followed by a colon. The loop is ended by +% \DescribeMacro{\endmfpfor}\cs{endmfpfor} which merely writes the text +% \mfc{endfor}. +% \begin{macrocode} +\newdef\mfpfor#1{\begingroup\mfsrc{for #1:}}% +\newdef\endmfpfor{\mfsrc{endfor}\endgroup}% +% \end{macrocode} +% +% \DescribeMacro{\mfploop} +% This starts a loop with \mfc{forever}. The user is expected to provide +% an escape condition with \DescribeMacro{\mfpuntil}\cs{mfpuntil}, which +% can be placed anywhere among the commands contained in the +% \env{mfploop} environment. \DescribeMacro{\endmfploop}\cs{endmfploop} +% is a clone of \cs{mfpfor} except for the warning. Grouping keeps +% the warning from being turned off if \cs{mfpuntil} occurs in a nested +% loop. +% \begin{macrocode} +\newdef\mfploop{% + \begingroup\mfsrc{forever:}\let\@nountil\mfp@untilwarn}% +\newdef\mfpuntil#1{\mfcmd{exitif #1}\let\@nountil\@empty}% +\newdef\endmfploop{\@nountil\endmfpfor}% +% \end{macrocode} +% +% \DescribeMacro{\mfpwhile} +% This emulates a while-loop, the condition being given in the mandatory +% argument. It has the same behavior, and writes almost the same code as +% \cs{mfploop} with an immediate \cs{mfpuntil} using the negative of the +% condition. The closing, \DescribeMacro{\endmfpwhile}\cs{endmfpwhile}, +% is again the same as \cs{endmfpfor}. +% \begin{macrocode} +\newdef\mfpwhile#1{\begingroup\mfcmd{forever: exitif not(#1)}}% +\newlet\endmfpwhile\endmfpfor +% \end{macrocode} +% +% \DescribeMacro{\plr} +% A little utility to convert a list of pairs into another list of +% pairs, where the given list are assumed to be polar coordinates and the +% results are their Cartesian counterparts. This is guaranteed to work as +% expected only in macros with a list argument, or for a single pair. +% \DescribeMacro{\midpoint} +% And one to calculate the midpoint, given two points separated by a comma. +% Can be used in graphics macros where a point is required. +% \begin{macrocode} +\newdef\plr#1{map (polar) (#1)}% +\newdef\midpoint#1{(0.5[#1])}% +% \end{macrocode} +% % % \section{Macros to implement prefix commands}\label{prefix} % -% \Mfpic{} prefix macros change the behavior of the figure macros. -% Normally we want \cs{circle}\marg{...} to draw the solid outline of a -% circle. So normally \cs{circle}\marg{...} will write a drawing command -% followed by a path expression giving the circle to draw. But -% \cs{dashed}\cs{circle}\marg{...} should write a \emph{dashing} command -% and \emph{omit} the drawing command. Thus, \emph{rendering} macros -% like \cs{dashed} need to set a switch, and figure macros like -% \cs{circle} need to test that switch. -% -% Similar considerations hold for prefix macros that transform the -% figure. The logic is that, at the \MF{} level, every figure macro -% is syntactically a path expression. Every prefix accepts a path -% expression as input and has a path as its return value, so a -% combination prefix + path expression is again a path expression. +% Some \mfpic{} macros, like \cs{circle} create a path. When used without +% a prefix, they also draw the path. At the \MF{} level, every figure +% macro is syntactically a path expression. Other macros are prefix macros +% and operate on a figure macro that follows. Every prefix accepts a path +% expression as input and has a path as its return value, so a combination +% prefix + path expression is again a path expression. +% % Prefixes may also have side effects, such as adding some ink to the % current picture. Such prefixes are called \emph{rendering} macros. +% % Rendering macros normally return the same path as their argument, but -% there are macros that modify the path. Some applying a linear -% transform, some close an open path, some return a subpath. These we call +% there are macros that modify the path. Some apply a linear transform, +% some close an open path, some return a subpath. These we call % \emph{modification} macros. % % This scheme is quite simple, but unfortunately too simple. To avoid -% having to explicitly type a rendering prefix every time, we need -% the above mentioned ability to pass information to the figure macros. +% having to explicitly type a rendering prefix every time, a figure +% macro needs to know if a rendering prefix has occured, so prefix macros +% need to pass information to the figure macro (and to later prefixes). +% % Moreover, \MF{} abhors an `isolated expression', so the first prefix % has to write something with a different syntax, and pass the info that % it has already done so on to later prefixes, who need to test that -% info. +% info. Thus, every prefix macro needs to know if it is the first or a +% later one. They test this \cs{if} command and also set it to false. The +% figure macros, which are last in the chain, close by resetting it true. % \begin{macrocode} \mfp@DBlog{Tests to control multiple prefix commands.}% +\newif\if@mfpstart\@mfpstarttrue % \end{macrocode} % -% Every prefix macro needs to know if it is the first or a later one. -% They test this \cs{if} command and also set it to false. The -% figure macros, which are last in the chain, close by resetting it true. +% If a prefix is a rendering prefix, it writes its rendering code and sets +% the following switch to false, letting the figure macro know it needn't +% invoke the default rendering. Figure macros close by resetting it true. +% Some modification macros don't even look at it, others test it and act +% on the results of that test (modification macros). % \begin{macrocode} -\newif\if@startfig\@startfigtrue +\newif\if@mfprend\@mfprendtrue % \end{macrocode} % -% If a prefix is a rendering prefix, it writes the rendering code -% and sets the following switch to false, letting the figure macro know -% it needn't invoke the default rendering, -% Figure macros close by resetting it true. Some modification macros don't -% touch it at all (the \cs{@modmac}\,s) others just test it -% (\cs{@closmac}\,s). +% The following macro is always (and only) invoked by the first prefix +% macro (or the figure macro, if there are no prefixes). It writes the +% code that prevents an isolated expression. It stores the following path +% expression in the variable \gbc{curpath}. Thus every combination of +% prefixes followed by a figure macro is syntactically a \MF{} variable +% assignment command. % \begin{macrocode} -\newif\if@imrend\@imrendtrue +\newdef\mfp@storepath{\mfsrc{\@nl store (curpath)}}% % \end{macrocode} % -% The following macro is always (and only) invoked by the first prefix -% macro. It writes the code that prevents an isolated expression. It -% stores the following path expression in the variable \gbc{curpath}. Thus -% every combination of prefixes followed by a figure macro is -% syntactically a \MF{} variable assignment command. +% Every prefix and figure macro has to invoke \cs{mfp@first}, since each +% is potentially the first in the sequence. If \cs{@mfpstart} is true, it +% writes the storing command, sets \cs{@mfpstartfalse}, and says that +% rendering is needed. (The rendering macros immediately cancel that +% switch.) % \begin{macrocode} -\newdef\store@path{\mfsrc{\@nl store (curpath)}}% +\newdef\mfp@first{\relax + \if@mfpstart \mfp@storepath \@mfprendtrue \@mfpstartfalse\fi}% % \end{macrocode} % -% Every prefix and figure macro has to invoke \cs{@firststage}, since -% each is potentially the first in the sequence. If -% \cs{if@startfig} is true, it writes the storing command, sets -% \cs{@startfigfalse}, and says that rendering is needed. (The -% rendering macros immediately cancel that switch.) +% Every rendering macro invokes this next command. After the first-stage +% code it writes its rendering command (via \cs{mfsrc}) and passes on the +% info that rendering is no longer required of the figure macro. % \begin{macrocode} -\newdef\@firststage{\relax - \if@startfig \store@path \@imrendtrue \@startfigfalse\fi}% +\newdef\mfp@rendmac{\mfp@first \@mfprendfalse \mfsrc}% % \end{macrocode} % -% \DescribeMacro{\@rendmac} -% Every rendering macro invokes this command. After the first-stage code -% it writes its rendering command (via \cs{mfsrc}) and passes on the info -% that rendering is no longer required of the figure macro. +% The \emph{figure} macros proceed as follows: (i)~they invoke the +% \cs{mfp@first} code, then (ii)~write a rendering macro if necessary +% (\cs{mfp@autorend}), (iii)~then make \cs{@mfpstarttrue} (for the next +% figure) and write \MF{} code that defines the path. The \cs{mfp@modmac} +% macros do only the first two, then write their modification code, +% counting on the following figure macro to do (iii). The idea is that +% [modifier + figure] should act the same as if the path it defines were +% encoded as a single figure command. % \begin{macrocode} -\newdef\@rendmac{\@firststage \@imrendfalse \mfsrc}% +\newdef\mfp@modmac{\mfp@first\mfp@autorend\mfsrc}% +\newdef\mfp@autorend{\if@mfprend\@xp\mfp@render\fi}% % \end{macrocode} % -% \DescribeMacro{\@modmac} -% It is possible we should call this something else, as only \cs{arrow} -% and \cs{reverse} use \cs{@modmac}. Other modifications cause the -% modified path to be drawn as if (modifier+figure) were a solitary figure -% macro. This would be pointless for a reversed path or a path with -% arrowhead added, as presumably the original path would already be drawn. -% Moreover, it can be argued (for \MP{} at least) that the arrowhead -% should be drawn on top of the shaft. This is the only significant effect of -% coding \cs{arrow} and \cs{reverse} as \cs{@modmac}\,s. +% Only axis and arrow commands (plus \cs{reverse}) use \cs{mfp@addmac}. +% As the name suggests, something is added onto an existing figure. That +% is, it is designed to ignore the rendering state and not invoke implicit +% rendering. If no explicit rendering occurs, the figure macro that +% follows invokes a rendering. For arrows, this causes the arrowhead to be +% drawn on top of the drawing of the shaft. % -% It simply invokes the common first-stage code and writes its \MF{} code. +% It would seem \cs{reverse} doesn't fit this name, but it also needs to +% be transparent to the rendering state so that it will work in +% combination with arrows. +% +% \cs{mfp@addmac} simply invokes the common first-stage code and writes +% its \MF{} code. % \begin{macrocode} -\newdef\@modmac{\@firststage \mfsrc}% +\newdef\mfp@addmac{\mfp@first \mfsrc}% % \end{macrocode} % -% \DescribeMacro{\@closmac} -% Other modification macros were added later, and it turned out that -% they needed the same treatment as the closure macros that already -% existed. Therefore, most modification macros invoke \cs{@closmac}. The -% \emph{figure} macros proceed as follows: they invoke the \cs{@firststage} -% code, then write a rendering macro if necessary, then make -% \cs{@starfigtrue} (for the next figure), then write \MF{} code that -% defines the path. These modification macros do only the first two, -% counting on the figure macro to follow to invoke the last two. The idea -% is that {closure + figure} should act the same as if the path it defines -% were encoded as a single figure command. -% -% The \cs{@modmac} and \cs{@closmac} macros differ only when there are -% no preceeding rendering macros. In that case it is as if \cs{draw} (or -% more generally \cs{@render}) precedes the \cs{@closmac} macro. That +% The \cs{mfp@addmac} and \cs{mfp@modmac} macros differ when there are no +% preceeding rendering macros. In that case it is as if \cs{draw} (or +% more generally \cs{mfp@render}) precedes the \cs{mfp@modmac} macro. That % drawing happens \emph{in addition to} any rendering macros that follow. -% This implicitly added \cs{draw} is not present for \cs{@modmac} macros, -% unless it is added by the following figure macro itself. +% This implicitly added \cs{draw} is not present for \cs{mfp@addmac} +% macros; it is added by the following figure macro. The effect of this is +% the \cs{mfp@addmac} macros perform their additions on top of an already +% rendered figure. +% +% \DescribeMacro{\setrender} +% As mentioned above, when a figure macro is invoked without a rendering +% prefix, it will invoke some default. That default is stored in a macro +% and can be changed for special effects. Initially we define it as +% \cs{draw} (with empty optional argument) to draw solid paths in the +% default color, but we provide a command for the user to change it. % \begin{macrocode} -\newdef\@closmac{\@firststage \if@imrend\@xp\@render\fi \mfsrc}% +\newdef\mfp@render{\draw[]}% +\newdef\setrender#1{\mfp@def\mfp@render{#1}}% % \end{macrocode} % -% \DescribeMacro{\setrender} -% As mentioned above, when a figure macro is invoked without a -% rendering prefix, it will invoke some default. That default is stored -% in the macro \cs{@render}, which can be changed for special effects. -% Initially we define it as \cs{draw} to draw solid paths, but provide a -% command for the user to change it. -% \begin{macrocode} -\newdef\@render{\draw[]}% -\newdef\setrender#1{\mfp@def\@render{#1}}% -% \end{macrocode} -% -% \DescribeMacro{\@figmac} -% A figure macro will invoke the common first-stage code, then check -% if rendering is needed. If so, it issues the \cs{@render} command. -% It also resets the startfig switche. Since a figure macro completes -% an assignment command in \MF, we use \cs{mfcmd}, which places a -% semicolon at the end of the code it writes. We define the first part -% (all but the writing) as a separate command because there are a few cases -% where we need to delay that writing. -% \begin{macrocode} -\newdef\@figmacstart{% - \@firststage \if@imrend\@xp\@render\fi \@startfigtrue}% -\newdef\@figmac{\@figmacstart\mfcmd}% -% \end{macrocode} -% -% \DescribeMacro{\@listmac} -% The list macros take as their last argument a list of $(x,y)$ pairs. -% That list can either be typed directly into -% the \TeX{} source file (inside braces, separated by commas) or be -% present in an external datafile. Either way, the data is written -% as a list of \MF{} pairs within an enclosing pair of -% parentheses. Since these are all figure macros, \cs{@listmac} starts out -% just like \cs{@figmac}, but it writes only part of its arguments, the -% last one being handled by \cs{mfp@writedata}. +% A figure macro will invoke the common first-stage code and the rendering +% check. It also resets the \cs{@mfpstart} switch. Because a figure macro +% completes an assignment command in \MF, it writes its code with +% \cs{mfcmd}, which places a semicolon at the end. We define the first +% part (all but the writing) as a separate command because there are a few +% cases where we need to delay that writing. +% \begin{macrocode} +\newdef\mfp@figmacbase{\mfp@first \mfp@autorend \@mfpstarttrue}% +\newdef\mfp@figmac{\mfp@figmacbase\mfcmd}% +% \end{macrocode} +% +% The list macros take as their last argument a list of $(x,y)$ pairs (or +% occasionally a list of numbers). That list can either be typed directly +% into the \TeX{} source file (inside braces, separated by commas) or be +% present in an external datafile. Either way, the data is written as a +% list within an enclosing pair of parentheses. Since these are all +% figure macros, \cs{mfp@listmac} starts out just like \cs{mfp@figmac}, +% but it writes only part of its arguments, the last one (the data list) +% being handled by \cs{mfp@writedata}. % % \cs{mfp@writedata} looks ahead to see if the token \cs{datafile} % follows, if it does \cs{mfp@writefile} is invoked, which gobbles @@ -1833,214 +2257,185 @@ % \cs{mfp@writedata} is also used by non-figure macros such as the axis % marks macros, plus \cs{piechart} and \cs{barchart}. % \begin{macrocode} -\newdef\@listmac#1{\@figmacstart\mfsrc{#1}\mfp@writedata}% -\newdef\mfp@writedata{% - \mfp@ifnextchar\datafile{\mfp@writefile}{\mflist}}% -\newdef\mfp@writefile\datafile#1{\@processdatafile{#1}{\mfp@rwdata}}% +\newdef\mfp@listmac#1{\mfp@figmacbase\mfsrc{#1}\mfp@writedata}% +\newdef\mfp@writedata{\mfp@iftoken\datafile{\mfp@writefile}{\mflist}}% +\newdef\mfp@writefile{% + \mfp@ifopengraphsfile + {\mfp@processfile{\mfp@rwdata}}{\mfp@nooutput@error\datafile}}% % \end{macrocode} % % \DescribeMacro{\mftitle} -% \DescribeMacro{\tmtitle} -% These go here because they didn't seem to go anywhere else. The are -% mainly for debugging the example files. \cs{getmfp@toks} assigns the -% following group to a token register and then invokes its argument. -% \cs{mftitle} and \cs{tmtitle} use this to write the code into -% the string argument of the \grafbase{} command \gbc{mftitle}. -% \cs{mftitle} does only that, while \cs{tmtitle} also writes the argument -% to the \file{.log} file and typesets it in the document. +% This is mainly for debugging the example files. \cs{mfp@title} takes +% two arguments: the command that called it (for the error message of +% \cs{mfp@src}), and some \TeX{} code. That code is written into the string +% argument of the \grafbase{} command \gbc{mftitle} and ends up in the +% \MF{} \file{.log} file and as a comment in the GF file. \cs{mftitle} +% merely calls \cs{mfp@title}, while \DescribeMacro{\tmtitle}\cs{tmtitle} +% also writes the argument to the \TeX{} \file{.log} file and typesets it +% in the document. % % We write the argument as a token list because that is the the easiest % verbatim-like way to do it. % \begin{macrocode} -\newif\if@mfpswitch -\newdef\mftitle{\@bsphack\@mfpswitchtrue\mfp@gettoks\mf@title}% -\newdef\tmtitle{\mfp@gettoks\tm@title}% -\newdef\mfp@gettoks#1{\afterassignment#1\mfp@toks=}% -\newdef\tm@title{\@mfpswitchfalse\mf@title - \wlog{\the\mfp@toks}{\the\mfp@toks}}% -\newdef\mf@title{\mfsrc{}% - \immediate\write\mfp@out{mftitle "\the\mfp@toks";}% - \if@mfpswitch\@esphack\fi}% -% \end{macrocode} -% -% \DescribeMacro{\noship} -% \DescribeMacro{\stopshipping} -% \DescribeMacro{\resumeshipping} -% To turn off character shipping for duration of innermost enclosing -% group (eg, \env{mfpic} environment). As far as I know it has never been -% tested with \MP. (It hasn't been tested recently even in \MF.) The \MF{} -% code prevents the figure from being added to the font, the \TeX{} switch -% \texttt{shipping} is checked before \cs{endmfpic} attempts to add the -% (nonexistent) figure to the document. -% \begin{macrocode} -\newdef\stopshipping{\mfp@let\if@shipping\iffalse - \@ifmfpfileisopen{\mfcmd{save shipit;def shipit = relax enddef}}{}}% -\newdef\resumeshipping{\mfp@let\if@shipping\iftrue - \@ifmfpfileisopen{\mfcmd{save shipit;def shipit = shipit_ enddef}}{}}% -\newlet\noship\stopshipping -\resumeshipping +\newdef\mftitle#1{\@bsphack\mfp@title\mftitle{#1}\@esphack}% +\newdef\tmtitle#1{\mfp@title\tmtitle{#1}\wlog{\the\mfp@toks}{#1}}% +\newdef\mfp@title#1#2{\mfp@toks{#2}% + \mfp@write\mfp@src#1{mftitle "\the\mfp@toks";}}% % \end{macrocode} % % % \section{Macros for getting data from files}\label{rwdata} % % The following command contains the common code to open a data file for -% reading. The first parameter is the filename, the second is what to do +% reading. The second parameter is the filename, the first is what to do % if it exists and is nonempty. We first try to \cs{openin} the file and % issue an error message if that fails. Then we skip any initial blank % lines and comments and complain if that takes us to the end of the % file. Otherwise we execute the command specified. Afterwards, since % each \cs{plotdata} command in a given \env{mfpic} environment % starts with the linetype at which the previous one ended, we allow the -% value of \cs{mfp@linetype} to survive the group. If \texttt{\#2} is -% not \cs{plotdata}, this is harmless (I hope). +% value of \cs{mfp@linetype} to survive this group but not any enclosing +% group. % \begin{macrocode} -\newdef\@processdatafile#1#2{% - \openin\mfp@data=#1\relax - \ifeof\mfp@data \nodatafileerror{#1}% +\newdef\mfp@processfile#1#2{% + \openin\mfp@data=#2\relax + \ifeof\mfp@data \mfp@nofile@error{#2}% \else - \begingroup + \mfp@DBlog{Opening file #2 for data.}% + {% \mfp@resetwhitespace \mfp@setcomment - \skipBlanksandComments - \ifeof\mfp@data \emptydatafileerror{#1}\else #2\fi - \global\mfp@n=\mfp@linetype - \endgroup - \mfp@linetype=\mfp@n + \mfp@skipblanklines + \ifeof\mfp@data + \mfp@nodata@error{#2}% + \else + \message{< Mfpic: Reading #2}% + #1% + \message{>}% + \fi + \@xp + }\@xp\mfp@linetype\number\mfp@linetype\relax + \mfp@DBlog{Closing file #2.}% \fi \closein\mfp@data}% % \end{macrocode} % -% \DescribeMacro{\nodatafileerror} -% \DescribeMacro{\emptydatafileerror} -% These are error messages for missing or empty data files: -% \begin{macrocode} -\newdef\nodatafileerror#1{% - \mfp@errmsg{No data file: #1 .}% - {The data file you tried to plot can't be found.}}% -\newdef\emptydatafileerror#1{% - \mfp@errmsg{Empty data file: #1 .}% - {The file you tried to plot contains only empty lines and comments.}}% -% \end{macrocode} -% % When reading files it is important that white space in the files % always have the same meaning for \TeX{}. This utility resets spaces, % tabs and EOLs to the standard categories. % \begin{macrocode} -\newdef\mfp@resetwhitespace{% - \catcode`\^^M=5 \catcode`\ =10 \catcode`\^^I=10 }% +\newdef\mfp@resetwhitespace{\mfp@restorepar + \endlinechar`\^^M \catcode`\^^M5 \catcode`\ 10 \catcode`\^^I10 }% % \end{macrocode} % -% \DescribeMacro{\skipcomments} -% This does what it says, skipping comments in a data file. It reads a +% \cs{mfp@skipcomments} +% does what it says, skipping comments in a data file. It reads a % line from a previously opened file (input stream \cs{mfp@data}) and % compares it to \cs{@empty}. It calls itself when they are equal (a -% comment line). When this macro finishes, \cs{mfp@temp} contains either -% \cs{par} (blank line or EOF) or real data. +% comment line, a blank line would put a \cs{par} token in \cs{mfp@data}). +% When this macro finishes, \cs{mfp@temp} contains either \cs{par} (blank +% line or EOF) or real data. % \begin{macrocode} -\mfp@ifdefined\@empty{}{\def\@empty{}}% -\newdef\skipcomments{\read\mfp@data to \mfp@temp - \ifx\mfp@temp\@empty \@xp\skipcomments\fi}% +\newdef\mfp@skipcomments{\read\mfp@data to \mfp@temp + \ifx\mfp@temp\@empty \@xp\mfp@skipcomments\fi}% % \end{macrocode} % -% \DescribeMacro{\skipBlanksandComments} -% This command first skips comments. After that \cs{mfp@temp} can contain -% \cs{par}, indicating either EOF or a blank line, or something else. -% In the first case (EOF) the macro terminates, in the second case (blank) -% it calls itself again, in the third case it also terminates, having -% presumably found real data. -% -% When this is called, a file should already be open (by -% \cs{@processdatafile}) using the handle \cs{mfp@data}. +% \cs{mfp@skipblanklines} +% first skips comments. After that \cs{mfp@temp} can contain \cs{par}, +% indicating either EOF or a blank line, or something else. In the first +% case (EOF) the macro terminates, in the second case (blank) it calls +% itself again, in the other case (something else) it also terminates, +% having presumably found real data. % -% The macro \cs{@XP} causes two macros after the next token to be -% expanded, removing the two \cs{fi}\,s (and so avoiding deep nesting). +% When this is called, a file should already be open using the handle +% \cs{mfp@data}. % \begin{macrocode} -\newdef\skipBlanksandComments{\skipcomments +\newdef\mfp@skipblanklines{\mfp@skipcomments \ifeof\mfp@data - \else\ifx\mfp@temp\mfp@par \@XP\skipBlanksandComments + \else\ifx\mfp@temp\mfp@par \@XP\mfp@skipblanklines \fi\fi}% % \end{macrocode} % % The following two commands, \cs{mfp@rwdata} and \cs{mfp@rwdataloop} % perform the work of writing the file (read stream \cs{mfp@data} opened -% by \cs{@processdatafile}). +% by \cs{mfp@processfile}). % -% The counter \cs{mfp@n} is used to keep track of how many lines of the -% data file have been written to one line of the output. The token -% \cs{sequence} in a \cs{using} specification will expand to the value of -% the counter \cs{mfp@sequence}. +% The figure counter \cs{mfp@count} is reused (this should all be inside +% a group) to keep track of how many lines of the data file have been +% written to one line of the output. The token \cs{sequence} in a +% \cs{using} specification will expand to the value of the counter +% \cs{mfp@sequence}. % -% When this first macro is called, a non-blank line has been read to the +% When \cs{mfp@rwdata} is called, a non-blank line has been read to the % macro \cs{mfp@temp}, to which we now add a space. The macro % \cs{mfp@buffer} is what will be written to the output file as soon as it % is long enough. We initialize it by defining it to be an open % parenthesis followed by the result of applying \cs{parse@data} to the % contents of \cs{mfp@temp}. Then we call \cs{mfp@rwdataloop}, which does -% the actual reading and writing. +% the remaining reading and all the writing. % \begin{macrocode} - \def\mfp@rwdata{\mfp@n=1 \mfp@sequence=1 - \def\sequence{\number\mfp@sequence}% - \edef\mfp@temp{\mfp@temp\space}% - \edef\mfp@buffer{(\@xp\parse@data\mfp@temp\mfp@delim}% - \mfp@rwdataloop}% +\newdef\mfp@nextdatum{\@xp\parse@data\mfp@temp\mfp@end}% +\newdef\mfp@rwdata{\mfp@count1 \mfp@sequence1 + \def\sequence{\number\mfp@sequence}% + \edef\mfp@temp{\mfp@temp\space}% + \edef\mfp@buffer{(\mfp@nextdatum}\mfp@rwdataloop}% % \end{macrocode} % % At this point, the buffer has been started with the first datum, so we % read another line. If that is blank, we write the buffer (and the closing -% parenthesis and a semicolon) and terminate the loop. Otherwise we go -% through a loop: +% parenthesis and a semicolon) and terminate the loop. Otherwise we have +% read another datum and then we: % \begin{enumerate} -% \item Increment the sequence counter, +% \item increment the sequence counter, % \item add a comma to the buffer, -% \item test whether the buffer is `full', and -% \item add the datum to the buffer. If the buffer is full in step~3, it is -% written to the output and cleared before going to step~4. +% \item test whether the buffer is `full', and if so, write the buffer +% to the output and clear it, then +% \item add the datum to the buffer. % \end{enumerate} +% The buffer is `full' when \cs{mfp@count} (the number of data in the +% buffer) exceeds \cs{mfp@dataperline}. +% % \cs{mfp@rwdataloop} loops by calling itself at the end. Whenever % \cs{mfp@temp} is empty (comment line read), (1)--(4) are skipped and % another line read. % \begin{macrocode} - \def\mfp@rwdataloop{% - \read\mfp@data to \mfp@temp - \ifx\mfp@temp\mfp@par - \mfcmd{\mfp@buffer)}% +\newdef\mfp@rwdataloop{% + \read\mfp@data to \mfp@temp + \ifx\mfp@temp\mfp@par + \mfcmd{\mfp@buffer)}% + \else + \ifx\mfp@temp\@empty \else - \ifx\mfp@temp\@empty % comment line, read another - \else - \edef\mfp@temp{\mfp@temp\space}% - \advance\mfp@sequence1 - \edef\mfp@buffer{\mfp@buffer\mfp@join}% - \ifnum\mfp@n<\mfpdataperline\relax - \advance\mfp@n1 - \else - \mfsrc{\mfp@buffer}% - \mfp@n=1 - \def\mfp@buffer{}% - \fi - \edef\mfp@buffer{\mfp@buffer - \@xp\parse@data\mfp@temp\mfp@delim}% + \edef\mfp@temp{\mfp@temp\space}% + \advance\mfp@sequence1 + \edef\mfp@buffer{\mfp@buffer\mfp@join}% + \ifnum\mfp@count<\mfpdataperline\relax \advance\mfp@count1 + \else \mfsrc{\mfp@buffer}\mfp@count1 \def\mfp@buffer{}% \fi - \@xp\mfp@rwdataloop - \fi}% + \edef\mfp@buffer{\mfp@buffer\mfp@nextdatum}% + \fi + \@xp\mfp@rwdataloop + \fi}% % \end{macrocode} % % % \section{Various \CMF{} Settings.}\label{MFsettings} % -% \DescribeMacro{\drawpen} -% \DescribeMacro{\pen} % \DescribeMacro{\penwd} % Macros that write changes in default \grafbase{} variables now use the % construct ``\gbc{save x; <type> x; x := <value>;}'' (via a call to % \cs{setmfvariable}). This makes changes local if inside a given \env{mfpic} % environment, global if outside. An exception is \gbc{penwd} which, as an % internal variable uses `\gbc{interim}' instead (via the \grafbase{} -% command \gbc{resizedrawpen}). Both \cs{drawpen} and \cs{pen} have been -% used in the past, while \cs{penwd} is more consistent with other -% commands, so we keep all three. +% command \gbc{resizedrawpen}). +% +% \SpecialUsageIndex{\drawpen} +% \cs{drawpen} was the original command used to set the pen diameter +% (prior to version 0.2.13). At some point it was replaced by +% \SpecialUsageIndex{\pen}\cs{pen}. However \cs{penwd} seems to be more +% consistent with other commands (e.g., \cs{shadewd}), and we keep all three. % \begin{macrocode} -\newdef\drawpen#1{\mfcmd{\@nl resizedrawpen (#1)}}% -\newlet\pen=\drawpen \newlet\penwd=\drawpen +\newdef\pen#1{\mfcmd{\@nl resizedrawpen (#1)}}% +\newlet\penwd\pen \newlet\drawpen\pen % \end{macrocode} % % \DescribeMacro{\shadewd} @@ -2059,35 +2454,34 @@ % \end{macrocode} % % \DescribeMacro{\hatchwd} -% The thickness of lines in the hatching fill. +% The thickness of lines in the hatching fill is set by \cs{hatchwd}. % \begin{macrocode} \newdef\hatchwd#1{\setmfnumeric{hatchwd}{#1}% \setmfvariable{pen}{hatchpen}{pencircle scaled hatchwd}}% % \end{macrocode} % % \DescribeMacro{\dashpattern} -% A dash pattern consists (internal to \MF) of three arrays. The +% A dash pattern consists (internal to \MF) of an array of lengths. The % \grafbase{} command \gbc{dashpat} accepts a name, and a sequence of -% numbers representing the sizes of dashes and spaces, and builds these -% arrays. +% numbers representing the sizes of dashes and spaces, and builds this +% array. It differs from \cs{numericarray} in that a little additional +% checking is done (at the \grafbase{} level). % \begin{macrocode} -\newdef\dashpattern#1#2{\mfcmd{save #1; dashpat (#1) (#2)}}% +\newdef\dashpattern#1{\mfsrc{save #1; dashpat (#1)}\mfp@writedata}% % \end{macrocode} % % \DescribeMacro{\settension} -% This sets the default tension for \cs{curve} commands, as well as for -% any command that takes an optional argument of the form -% \oarg{s\meta{tens}}. This includes \cs{function}, \cs{plrfcn}, -% \cs{fcncurve}, \cs{datafile}, \cs{plotdata} and others. It also sets the -% default tension for \cs{sclosed} and \cs{bclosed}. The value should be -% at least $3/4$. +% This sets the default tension for any command (for example, \cs{curve}) +% that takes an optional argument that contains a tension value. This +% includes also \cs{function}, \cs{plrfcn}, \cs{fcncurve}, \cs{datafile}, +% \cs{plotdata}. It also sets the default tension for \cs{sclosed} and +% \cs{bclosed}. The value should be at least $3/4$. % \begin{macrocode} \newdef\settension#1{\setmfnumeric{default_tension}{#1}}% % \end{macrocode} % % -% \section{Settings for text label placement in -% figures}\label{labelsettings} +% \section{Settings for text label placement in figures}\label{labelsettings} % % \cs{tlabel}\,s are `justified' by placing a particular point of the % text at the location specified. The \cs{tlabel} command accepts an @@ -2103,109 +2497,131 @@ % is empty. The code assumes that if there are only 2, 1 or no parts, then % later parts should be left unchanged. The rotation part is empty by % default (rather than 0), because some commands will emit a warning if -% a nonempty rotation exists without \opt{mlabels}. +% a nonempty rotation exists without \opt{mplabels}. % % The result of \cs{tlabeljustify} is that \cs{tl@vpos} is set equal to % $-1$ if the first letter is (default) \texttt{B} (for Baseline), and % 0--2 if it is \texttt{b} (bottom), \texttt{c} (center) or \texttt{t} % (top). Similarly, \cs{tl@hpos} is set equal to $-1$ if the second % letter is (default) \texttt{l} (for left), and 0 or 1 if it is -% \texttt{c} (center) or \texttt{r} (right). +% \texttt{c} (center) or \texttt{r} (right). Making the defaults +% negative means they must be handled by the \cs{else} portion of any +% \cs{ifcase}. % -% The rotation part is just saved in \cs{tlabel@rot}. This is now true -% even without \opt{mplabels} in case it is turned on later. It is -% ignored by \cs{tlabel} without \opt{mplabels}, but a warning is issued -% here anyway. +% The rotation part is just saved in \cs{tl@rot}. This is true even +% without \opt{mplabels}, in case it is turned on later. It is ignored by +% \cs{tlabel} without \opt{mplabels}, but a warning is issued here anyway. % \begin{macrocode} \newcount\tl@vpos \newcount\tl@hpos -\tl@vpos=-1 \tl@hpos=-1 -\newdef\tlabel@rot{}% -% -\newdef\tlabeljustify#1{% - \mfp@ifempty{#1}{}{\mfp@justify#1\mfp@delim}}% -\def\mfp@justify#1#2\mfp@delim{\mfp@local\mfp@vconv{#1}% - \mfp@ifempty{#2}{}{\@mfp@justify#2\mfp@delim}}% -\newdef\@mfp@justify#1#2\mfp@delim{% - \mfp@local\mfp@hconv{#1}\mfp@local\edef\tlabel@rot{#2} +\newdef\mfp@tlh@l{-1}% +\newdef\mfp@tlh@c{0}% +\newdef\mfp@tlh@r{1}% +\newdef\mfp@tlv@B{-1}% +\newdef\mfp@tlv@b{0}% +\newdef\mfp@tlv@c{1}% +\newdef\mfp@tlv@t{2}% +\newdef\tl@rot{}\tl@vpos-1 \tl@hpos-1 +\newdef\tlabeljustify#1{\mfp@ifexist{#1}{\mfp@justify#1\mfp@end}}% +\newdef\mfp@justify#1#2\mfp@end{\mfp@local\mfp@vconv{#1}% + \mfp@ifexist{#2}{\mfp@@justify#2\mfp@end}}% +\newdef\mfp@@justify#1#2\mfp@end{\mfp@local\mfp@hconv{#1}% + \mfp@local\edef\tl@rot{#2}% \@ifmplabels{}% - {\mfp@ifempty{#2}{}% + {\mfp@ifexist{#2}% {\Mfpic@warn{Rotation of labels is not supported without the - mplabels\@msgbreak option. Rotation may be ignored\@online .}}}}% + mplabels\@msgbreak option. Rotation setting\on@line\space + may be ignored.}}% + }}% \newdef\mfp@vconv#1{% - \if B#1\tl@vpos=-1 \else - \if b#1\tl@vpos= 0 \else - \if c#1\tl@vpos= 1 \else - \if t#1\tl@vpos= 2 \else - \tl@vpos=-1 \mfp@justifyerror - \fi\fi\fi\fi}% + \@ifundefined{mfp@tlv@#1}% + {\tl@vpos-1 \mfp@justify@error}% + {\tl@vpos\@nameuse{mfp@tlv@#1}\relax}}% \newdef\mfp@hconv#1{% - \if l#1\tl@hpos=-1 \else - \if c#1\tl@hpos= 0 \else - \if r#1\tl@hpos= 1 \else - \tl@hpos=-1 \mfp@justifyerror - \fi\fi\fi}% -\newdef\mfp@justifyerror{% - \mfp@errmsg{Invalid justification parameter for text label.}% - {The optional argument for a text label must be^^J% - one of B, b, c or t^^J - followed by l or r or c,^^J% - followed by an angle (optionally).}}% + \@ifundefined{mfp@tlh@#1}% + {\tl@hpos-1 \mfp@justify@error}% + {\tl@hpos\@nameuse{mfp@tlh@#1}\relax}}% % \end{macrocode} % % \DescribeMacro{\tlpathjustify} % This acts just like \cs{tlabeljustify} from the user's point of view. % Since it is only for users, and not used internally, it merely defines -% three macros that \cs{@@@tlpath} passes on to \cs{tlabeljustify} when no -% justification parameter is present. +% three macros that are passed to \cs{tlabeljustify} when no justification +% parameter is present for a \cs{tlabel}-path command. % \begin{macrocode} \newdef\tlpathjustify#1{% - \mfp@ifempty{#1}{}{\tlp@justify#1\mfp@delim}}% -\newdef\tlp@justify#1#2\mfp@delim{\mfp@def\tlpath@v{#1}% - \mfp@ifempty{#2}{}{\tlp@@justify#2\mfp@delim}}% -\newdef\tlp@@justify#1#2\mfp@delim{% + \mfp@ifexist{#1}{\tlp@justify#1\mfp@end}}% +\newdef\tlp@justify#1#2\mfp@end{\mfp@def\tlpath@v{#1}% + \mfp@ifexist{#2}{\tlp@@justify#2\mfp@end}}% +\newdef\tlp@@justify#1#2\mfp@end{% \mfp@def\tlpath@h{#1}\mfp@def\tlpath@r{#2}}% \tlpathjustify{cc}% % \end{macrocode} % +% \DescribeMacro{\tlpointsep} +% This takes an absolute length as its argument and sets parameters that +% determine by how much a tlabel is separated from the point it is placed +% at. This is in case something is drawn at that point, such as a dot or +% a hash mark on an axis. +% +% \DescribeMacro{\tlpathsep} +% This takes an absolute length and sets parameters that determine by how +% much a path created by one of the \cs{tlabel\meta{path}} macros is +% separated from the label it surrounds. +% % \DescribeMacro{\tlabelsep} -% \DescribeMacro{\tlabeloffset} -% \cs{tlabelsep} takes an absolute length as its argument and sets -% parameters that determine by how much a label is separated from the -% point it is placed at. This is in case something is drawn at that point, -% such as a dot or a hash mark on an axis. +% This simply issues both the above commands. This is for compatibility +% with \mfpic{} versions 0.7 or earlier, where both these separations were +% determined by the same parameters. % -% \cs{tlabeloffset}, on the other hand, takes a pair of dimensions, -% representing offsets. This is mainly so that, if labels seem to be off, -% they can all be shifted with one command. +% \DescribeMacro{\tlabeloffset} +% \cs{tlabeloffset}, on the other hand, takes two arguments: dimensions, +% representing offsets of labels from their point of placement. This is +% mainly so that, if labels seem to be off, they can all be shifted with +% one command. % % Both these values are written to the \MF{} file for the sake of the % commands that draw rectangles or ovals around labels. % \begin{macrocode} -\newdef\tlabelsep#1{\mfp@local\tlabel@sep=#1\relax +\newdef\tlpointsep#1{\mfp@local\tlabel@sep#1\relax \setmfnumeric{label_sep}{\the\tlabel@sep}}% +\newdef\tlpathsep#1{\mfp@local\tlpath@sep#1\relax + \setmfnumeric{labelpath_sep}{\the\tlpath@sep}}% +\newdef\tlabelsep#1{\tlpointsep{#1}\tlpathsep{#1}}% \newdef\tlabeloffset#1#2{% - \mfp@local\tlabel@hadj=#1\relax \mfp@local\tlabel@vadj=#2\relax - \setmfvariable{pair}{label_adjust}% + \mfp@local\tlabel@hadj#1\relax \mfp@local\tlabel@vadj#2\relax + \setmfpair{label_adjust}% {(\the\tlabel@hadj,\the\tlabel@vadj)}}% % \end{macrocode} % % \DescribeMacro{\everytlabel} % Every line of a multiline label is written inside a group, so -% adjustments to baselineskip and other things are difficult or impossible. -% Therefore, \cs{everytlabel} is provided to define tokens to be inserted -% before the label code, outside these groups. It is not itself a token -% variable, so that that it can write the tokens to the \MP{} file once, -% instead of at every label. -% \begin{macrocode} -\newdef\everytlabel{\afterassignment\@everytlabel - \mfp@local\every@tlabel}% -\newdef\@everytlabel{% +% adjustments to baselineskip and other things are difficult or +% impossible. Therefore, \cs{everytlabel} is provided to define code to be +% inserted before the label code, outside these groups. The messing around +% with the token register \cs{mfp@toks} is so one can put definitions in +% the code without having to double \arg{} characters. +% +% The command \cs{extra@endtlabel} is called at the end of every +% \cs{tlabel}. Normally it does nothing, but the \cs{tlabels} command +% defines it to repeat the start of a loop. +% \begin{macrocode} +\newdef\everytlabel{\afterassignment\mfp@everytlabel\mfp@toks}% +\newdef\mfp@everytlabel{\mfp@local\edef\every@tlabel{\the\mfp@toks}% \mfp@ifmpost - {\@ifmfpfileisopen + {\mfp@ifopengraphsfile {\mfcmd{verbatimtex\@nl - \def\noexpand\everylabel{\the\every@tlabel} etex}}% + \def\noexpand\everylabel{\the\mfp@toks} etex}}% {}}% {}}% +\newdef\every@tlabel{}% +\newdef\extra@endtlabel{}% +% \end{macrocode} +% +% Without \opt{mplabels} it is impossible to use \MP{} variables in +% a text label placement parameter. I have occasionally found it useful +% to have a \TeX{} version of the numeric variable \gbc{pi}. +% \begin{macrocode} +\newdef\pinumber{3.14159}% % \end{macrocode} % % @@ -2215,13 +2631,44 @@ % This sets the arrowhead shape. The parameters are: the ratio of width % to length, the tension (see \file{grafbase.dtx}) and a boolean % (\gbc{true} or \gbc{false}) to say whether the the head is filled, or -% only the barbs are drawn. (In retrospect, it would have been more -% consistent with other commands to have one \TeX{} parameter with commas -% separating the components.) +% only the barbs are drawn. It would be more consistent with other +% commands to have one \TeX{} parameter with commas separating the +% components, but this is legacy code. % \begin{macrocode} \newdef\headshape#1#2#3{\mfcmd{\@nl headshape (#1, #2, #3)}}% % \end{macrocode} % +% There are up to 4 optional arguments to any given \cs{arrow} command, +% and these can take any one of 6 special indicators ({\mytt b}, {\mytt c}, +% {\mytt f}, {\mytt l}, {\mytt r} or {\mytt s}). Here we define macros +% to handle these options. Each macro is fed a \emph{value}. For example, +% the indicator {\mytt b} must be followed by a length, and that length is +% the argument of \cs{mfp@arr@b}. +% \begin{macrocode} +\newdef\mfp@arr@b#1{\edef\mfp@hlocate{#1}}% +\newdef\mfp@arr@c#1{\edef\mfp@hcolour{#1}}% +\newdef\mfp@arr@l#1{\edef\mfp@hlength{#1}}% +\newdef\mfp@arr@r#1{\edef\mfp@hrotate{#1}}% +\newlet\mfp@arr@f\mfp@arr@b +\newlet\mfp@arr@s\mfp@arr@l +% \end{macrocode} +% +% The \cs{arc} and \cs{circle} commands take an optional argument that +% indicates how the arc or circle is defined (and therefore the format of +% the non-optional argument). These are passed to different \grafbase{} +% commands whose names start with \gbc{arc} or \gbc{circle}. The commands +% below store the rest of that name. The switch is set true by the +% \cs{arc} command and false by \cs{circle}. +% \begin{macrocode} +\newdef\mfp@arc@s{pps}% +\newdef\mfp@arc@t{ppp}% +\newdef\mfp@arc@p{\ifmfp@switch plr\fi}% +\newdef\mfp@arc@a{\ifmfp@switch alt\fi}% +\newdef\mfp@arc@c{cp\ifmfp@switch s\fi}% +\newdef\mfp@arc@r{pp (\mfp@T)}% +\newdef\mfp@arc@q{pp (\mfp@F)}% +% \end{macrocode} +% % \DescribeMacro{\mfpdefinecolor} % \prog{Mfpic} supports color under \MP{} by writing all color % definitions to the output \file{.mp} file. In order to support a @@ -2231,29 +2678,30 @@ % a very dark blue. This can be set by % \cs{mfpdefinecolor}\marg{vdblue}\marg{cmyk}\marg{.3,.3,0,.7}. % -% \DescribeMacro{\fillcolor} -% \DescribeMacro{\drawcolor} -% \DescribeMacro{\headcolor} -% \DescribeMacro{\hatchcolor} -% \DescribeMacro{\pointcolor} -% \DescribeMacro{\tlabelcolor} -% \DescribeMacro{\backgroundcolor} -% To support the syntax -% \cs{fillcolor}\oarg{\meta{model}}\marg{\meta{parameters}}, we just -% call \cs{@mfpcolor} with the \grafbase{} color variable name -% \gbc{fillcolor}. +% Several commands are provided to set certain special colors. Currently +% we have the following commands, setting the color of the same name as +% the command (except \cs{backgroundcolor} which sets a color named +% \gbc{background}): +% \cs{drawcolor}\SpecialUsageIndex{\drawcolor},\\ +% \cs{fillcolor}\SpecialUsageIndex{\fillcolor}, +% \cs{hatchcolor}\SpecialUsageIndex{\hatchcolor}, +% \cs{headcolor}\SpecialUsageIndex{\headcolor}, +% \cs{pointcolor}\SpecialUsageIndex{\pointcolor}, +% \cs{tlabelcolor}\SpecialUsageIndex{\tlabelcolor}, and\\ +% \cs{backgroundcolor}\SpecialUsageIndex{\backgroundcolor}. +% +% These commands support the \LaTeX-like syntax:\\ +% \indent\cs{fillcolor}\oarg{\meta{model}}\marg{\meta{parameters}}.\\ +% The code for \cs{backgroundcolor} has to be spelled out since the +% command name has the string `\texttt{color}', but the color does not. % \begin{macrocode} \newdef\mfpdefinecolor#1#2#3{\setmfcolor{#1}{#2(#3)}}% -\newdef\fillcolor{\@mfpcolor{fillcolor}}% -\newdef\drawcolor{\@mfpcolor{drawcolor}}% -\newdef\headcolor{\@mfpcolor{headcolor}}% -\newdef\hatchcolor{\@mfpcolor{hatchcolor}}% -\newdef\pointcolor{\@mfpcolor{pointcolor}}% -\newdef\tlabelcolor{\@mfpcolor{tlabelcolor}}% -\newdef\backgroundcolor{\@mfpcolor{background}}% -\newdef\@mfpcolor#1{% - \mfp@ifnextchar[{\mfp@color{#1}}{\setmfcolor{#1}}}% -\newdef\mfp@color#1[#2]#3{\setmfcolor{#1}{#2(#3)}}% +\newdef\mfp@defclr#1#2#3{\setmfcolor{#1}{\mfp@ifempty{#2}{#3}{#2(#3)}}}% +\newdef\mfp@newcolorcmd#1{% + \@namedef{#1\mfp@C}{\mfp@nullopt{\mfp@defclr{#1\mfp@C}}}}% +\mfp@newcolorcmd{draw}\mfp@newcolorcmd{fill}\mfp@newcolorcmd{tlabel}% +\mfp@newcolorcmd{hatch}\mfp@newcolorcmd{head}\mfp@newcolorcmd{point}% +\def\backgroundcolor{\mfp@nullopt{\mfp@defclr{background}}}% % \end{macrocode} % % When \cs{plotdata} is used to draw several graphs from one file, each @@ -2279,22 +2727,22 @@ % Dashed lines is the default. % \begin{macrocode} \newdef\dashedlines{\mfp@local\mfp@linetype0 - \mfp@def\mfp@setstyle{\gendashed{getdashpat\number\mfp@linetype}}}% + \mfp@def\mfp@setstyle{\gendashed{getdashpat \number\mfp@linetype}}}% \dashedlines % \end{macrocode} % % \DescribeMacro{\coloredlines} -% This uses \cs{draw} with an optional color parameter set -% to \gbc{colortype0} through (by default) \gbc{colortype 7}. These are -% color variables defined by \grafbase{}. It also issues a warning if -% \MF{} is being used. As with \cs{dashedlines}, a \MP{} command -% \gbc{getcolor} selects these colors. +% This uses \cs{draw} with an optional color parameter set to +% \gbc{colortype0} through (by default) \gbc{colortype7}. These are color +% variables defined by \grafbase{}. It also issues a warning if \MF{} is +% being used. As with \cs{dashedlines}, a \MP{} command \gbc{getcolor} +% selects these colors. % \begin{macrocode} \newdef\coloredlines{% \mfp@ifmpost {\mfp@local\mfp@linetype0 - \mfp@def\mfp@setstyle{\draw [getcolor\number\mfp@linetype]}}% - {\Mfpic@warn{You can't use \string\coloredlines\space in + \mfp@def\mfp@setstyle{\draw[getcolor \number\mfp@linetype]}}% + {\Mfpic@warn{You can't use \mfp@b coloredlines in Metafont.\@msgbreak Using \dashedlines instead}% \dashedlines}}% % \end{macrocode} @@ -2305,7 +2753,7 @@ % through 9 different symbols. % \begin{macrocode} \newdef\pointedlines{\mfp@local\mfp@linetype0 - \mfp@def\mfp@setstyle{\plot{getsymbol\number\mfp@linetype}}}% + \mfp@def\mfp@setstyle{\plot{getsymbol \number\mfp@linetype}}}% % \end{macrocode} % % \DescribeMacro{\datapointsonly} @@ -2353,39 +2801,39 @@ % \end{macrocode} % % \DescribeMacro{\mfplinetype} -% \DescribeMacro{\mfplinestyle} -% The user-level commands \cs{mfplinetype} and \cs{mfplinestyle} allow the -% user to set the starting value of \cs{mfp@linetype}. The default is to -% start at $0$. The names ``linestyle'' and ``linetype'' come from -% an analogous system of changing rendering in \prog{gnuplot}. -% \begin{macrocode} -\newdef\mfplinetype#1{\mfp@local\mfp@linetype=#1}% +% The user-level command \cs{mfplinetype} allows the user to set the +% starting value of \cs{mfp@linetype}. The default is to start at $0$. +% \DescribeMacro{\mfplinestyle}\cs{mfplinestyle} is an alias for this +% same command. The names `linestyle' and `linetype' come from +% an analogous system of changing rendering in \prog{gnuplot}. (The +% reason for two names is that \prog{gnuplot} documentation was not +% consistent in its terminology.) +% \begin{macrocode} +\newdef\mfplinetype#1{\mfp@local\mfp@linetype#1\relax}% \newlet\mfplinestyle\mfplinetype \mfplinetype{0}% % \end{macrocode} % -% \prog{Mfpic} has 6 possible axes, the x- and y-axes pass through the +% \prog{Mfpic} has 6 possible axes, the $x$- and $y$-axes pass through the % origin, $(0,0)$, the four border axes are at the edges of the graph % space, possibly offset from it by some amount. These four commands hold % the amount of that offset in graph units, the default being 0. % \begin{macrocode} -\newdef\mfp@lshift{0}% -\newdef\mfp@bshift{0}% -\newdef\mfp@rshift{0}% -\newdef\mfp@tshift{0}% +\newdef\mfp@lshift{0}\newdef\mfp@bshift{0}% +\newdef\mfp@rshift{0}\newdef\mfp@tshift{0}% % \end{macrocode} % % \DescribeMacro{\axismargin} +% The main user-level command for setting the above offsets is +% \cs{axismargin}. Its first argument is one of the letters l, b, r, or t +% to select the axis and the second is the offset in graph units. A +% positive offset represents an inward shift, which is why we call them +% \emph{margins}. % \DescribeMacro{\setaxismargins} +% The arguments of \cs{setaxismargins} are four offsets for the axes (in +% the above order, which is anticlockwise, starting with the left). % \DescribeMacro{\setallaxismargins} -% These are the user-level command for setting the above offsets. The -% first argument to \cs{axismargin} is one of the letters l, b, r, or t to -% select the axis and the second is the offset in graph units. A positive -% offset represents an inward shift, which is why we call them -% \emph{margins}. The arguments of \cs{setaxismargins} are four offsets -% for the axes (in the above order, which is anticlockwise, starting -% with the left). \cs{setallaxismargins} takes one offset and applies it -% to all axes. +% \cs{setallaxismargins} takes one offset and applies it to all axes. % % The values are passed on to \MF{} in the variables \gbc{laxis}, % \gbc{baxis}, \gbc{raxis}, and \gbc{taxis}. They are also needed by the @@ -2394,44 +2842,54 @@ \newdef\axismargin#1#2{\setmfnumeric{#1axis}{#2}% \mfp@local\@namedef{mfp@#1shift}{#2}}% \newdef\setaxismargins#1#2#3#4{\axismargin l{#1}\axismargin b{#2}% - \axismargin r{#3}\axismargin t{#4}}% + \axismargin r{#3}\axismargin t{#4}}% \newdef\setallaxismargins#1{\setaxismargins{#1}{#1}{#1}{#1}}% % \end{macrocode} % % The following converts axis letters to a numeric, making conditionals for -% axes simpler to code (\cs{ifcase} versus the six nested \cs{if}\,s we -% see here.) Plus we get to define the error message only once. The -% first argument is the letter and the second argument is the calling -% command (for the error message). -% \begin{macrocode} -\newcount\mfp@axisnum -\def\get@axisnum#1#2{% - \if x#1\relax \mfp@axisnum0 - \else\if y#1\relax \mfp@axisnum1 - \else\if l#1\relax \mfp@axisnum2 - \else\if b#1\relax \mfp@axisnum3 - \else\if r#1\relax \mfp@axisnum4 - \else\if t#1\relax \mfp@axisnum5 - \else - \mfp@errmsg {Invalid axis letter "#1".}% - {The command #2 requires an axis to be designated by one of^^J% - the following letters: x, y, l, b, r, or t. If you proceed, ^^J% - x will be assumed.}% - \fi\fi\fi\fi\fi\fi}% +% axes simpler to code (\cs{ifcase} versus six nested \cs{if}\,s). +% Plus we get to define the error message only once. The first argument +% of \cs{mfp@getaxis} is the letter and the third argument is the calling +% command (for the error message). We allow the letter to be instead a word, +% using only the first letter and discarding the rest (\arg2). +% \begin{macrocode} +\def\mfp@axis@x{0}% +\def\mfp@axis@y{1}% +\def\mfp@axis@l{2}% +\def\mfp@axis@b{3}% +\def\mfp@axis@r{4}% +\def\mfp@axis@t{5}% +\def\mfp@getaxis#1#2\mfp@end#3{% + \@ifundefined{mfp@axis@#1}% + {\mfp@errmsg {Invalid axis letter "#1"}% + {The command #3 requires an axis to be designated by one of^^J% + the following letters: x, y, l, b, r, or t. If you proceed, ^^J% + x will be assumed.}\def\mfp@axisnum{0}\def\mfp@axisletter{x}}% + {\edef\mfp@axisnum{\@nameuse{mfp@axis@#1}}\def\mfp@axisletter{#1}}% + \edef\mfp@defheadlen{% + \the\ifnum\mfp@axisnum>1 \sideheadlen\else \axisheadlen\fi}}% % \end{macrocode} % -% \DescribeMacro{\setaxismarks} -% \DescribeMacro{\setxmarks} -% \DescribeMacro{\setymarks} -% \DescribeMacro{\setbordermarks} -% \DescribeMacro{\setallbordermarks} % The tick marks (or hash marks) on the axes can be in three possible -% positions: centered on the axes, all on one side, or all on the other -% side. The default for the x- and y-axes is centered, for the border axes -% it is inside. For changing this we provide the \cs{setaxismarks} command, -% whose first argument is the axis letter, and whose second argument is -% one of the words \texttt{inside}, \texttt{outside}, \texttt{centered}, -% \texttt{ontop}, \texttt{onbottom}, \texttt{onleft}, or \texttt{onright}. +% positions: centered on the axes, on one side, or on the other side. +% The default for the $x$- and $y$-axes is centered, for the border axes it +% is inside. +% \DescribeMacro{\setaxismarks}For changing this we provide the +% \cs{setaxismarks} command, whose first argument is the axis letter, and +% whose second argument is one of the words \texttt{inside}, +% \texttt{outside}, \texttt{centered}, \texttt{ontop}, \texttt{onbottom}, +% \texttt{onleft}, or \texttt{onright}. +% +% \DescribeMacro{\setxmarks} +% \cs{setxmarks} takes one argument and sets the position for the $x$ axis +% only, while +% \DescribeMacro{\setymarks}\cs{setymarks} does the same for the $y$ axis. +% For the border axes we provide +% \DescribeMacro{\setbordermarks}\cs{setbordermarks}, which takes four +% arguments: the positions for the left, bottom, right and top axis (in +% that order). The abbreviation +% \DescribeMacro{\setallbordermarks}\cs{setallbordermarks} takes one +% argument and sets the position for all border axis marks to that. % \begin{macrocode} \newdef\setaxismarks#1#2{\setmfnumeric{#1tick}{#2}}% \newdef\setxmarks#1{\setaxismarks x{#1}}% @@ -2441,8 +2899,6 @@ \newdef\setallbordermarks#1{\setbordermarks{#1}{#1}{#1}{#1}}% % \end{macrocode} % -% \DescribeMacro{\smoothdata} -% \DescribeMacro{\unsmoothdata} % The \cs{datafile} and \cs{plotdata} commands originally just created % polygonal paths, but users requested the ability to draw smooth ones. % Originally only the commands below (\cs{smoothdata} and @@ -2451,30 +2907,42 @@ % effect, so now the commands below just set the defaults for the optional % parameter, storing them in the macros \cs{mfp@smoothness} and % \cs{mfp@tension}. The latter can be used to adjust the tension of the -% \MF{} path if smoothness is `s'. Default tension is now empty rather -% than 1 so we can implement a scheme to change the actual default used. -% \begin{macrocode} -\newdef\smoothdata{\null@opt\@smoothdata}% -\newdef\@smoothdata[#1]{\mfp@def\mfp@smoothness{s}% - \mfp@def\mfp@tension{#1}}% -\newdef\unsmoothdata{\mfp@def\mfp@smoothness{p}% - \mfp@def\mfp@tension{}}% +% \MF{} path if smoothness is `\texttt{s}'. +% +% \DescribeMacro{\smoothdata} +% This takes an option tension argument. It defines \cs{mfp@smoothness} to +% be `\texttt{s}' and \cs{mfp@tension} to be the optional argument. +% Default tension is empty rather than 1 so we can implement a scheme to +% change the actual default used. +% \DescribeMacro{\unsmoothdata}\cs{unsmoothdata} defines +% \cs{mfp@smoothness} to be `\texttt{p}' and \cs{mfp@tension} to be +% empty. The latter might not be necessary. +% \begin{macrocode} +\newdef\mfp@smdata#1{\mfp@def\mfp@smoothness{#1}% + \mfp@nullopt{\mfp@def\mfp@tension}}% +\newdef\smoothdata{\mfp@smdata{s}}% +\newdef\unsmoothdata{\mfp@smdata{p}\@empty}% \unsmoothdata% default % \end{macrocode} % % \DescribeMacro{\using} -% \DescribeMacro{\usingpairdefault} -% \DescribeMacro{\usingnumericdefault} -% These commands control how we interpret data in a file. % The command \cs{using} is named after a keyword in \prog{gnuplot}. It % controls which datum is plotted against which by \cs{plotdata} and -% \cs{datafile}. The default is to read the first two space separated -% words on a line as the x- and y-coordinate of a point. To allow that -% there might be more data on a line, it is also assumed that the second -% word is followed by a space and the rest of the line is read as a third -% parameter that is not used. In case there are only two words, -% \mfpic{} will always add a space on the end and then the third -% parameter will be empty. +% \cs{datafile}. +% +% \DescribeMacro{\usingpairdefault}\cs{usingpairdefault} sets the default, +% which is to read the first two space separated words on a line as the +% $x$ and $y$ coordinate of a point. To allow that there might be more +% data on a line, it is also assumed that the second word is followed by a +% space and the rest of the line is read as a third parameter that is not +% used. In case there are only two words, \mfpic{} will always add a space +% on the end and then the third parameter will be empty. +% +% \DescribeMacro{\usingnumericdefault} +% For the occasional command that needs numeric data, +% \cs{usingnumericdefault} sets \cs{using} so that the first +% space-separated word on a line is selected and the remainder of the line +% discarded. % % The \cs{parse@data} command reads its argument as delimited % parameters, and the \cs{using} command tells what those delimiters are. @@ -2487,23 +2955,22 @@ % parentheses with the first two parameters separated by a comma. This % example is the default as we see here in \cs{usingpairdefault}. This % command can be issued by a user to return to that default. The user can -% also issue \cs{usingnumericdefault} to write the first space separated -% word as a single numeric. This is for commands like \cs{piechart}. +% also issue \cs{usingnumericdefault} to write the first word as a single +% numeric for commands like \cs{piechart}. % % \DescribeMacro{\mfpdataperline} % \cs{mfpdataperline} is a user level macro that controls the maximum % number of points that will be written to a single line in the output. % \begin{macrocode} -\newdef\using#1#2{\mfp@def\parse@data#1\mfp@delim{#2}}% +\newdef\using#1#2{\mfp@def\parse@data#1\mfp@end{#2}}% \newdef\usingpairdefault{\using{##1 ##2 ##3}{(##1,##2)}}% \newdef\usingnumericdefault{\using{##1 ##2}{##1}}% \usingpairdefault \newdef\mfpdataperline{5}% % \end{macrocode} % -% The following macros are used internally by \cs{datafile} and \cs{plotdata}. -% A comment line is read by \TeX{} as empty so we need an empty macro to -% test against, and a blank line is read as \cs{par} (not the primitive +% The following macros are used internally by \cs{datafile} and +% \cs{plotdata}. A blank line is read as \cs{par} (not the primitive % \cs{par}, but the literal token \cs{par}, so it tests as equal to % \cs{mfp@par}. Early versions of \cs{plotdata} wrote a literal \MF{} path % expression to the output file and \cs{mfp@join} created the \mfc{--} @@ -2511,27 +2978,27 @@ % commands followed by a comma separated list of points, so \cs{mfp@join} % has morphed into a comma. % \begin{macrocode} -\newdef\mfp@par{\par}% -\newdef\mfp@join{,}% +\newdef\mfp@par{\par}\newdef\mfp@join{,}% % \end{macrocode} % -% \DescribeMacro{\makepercentother} -% \DescribeMacro{\makepercentcomment} % \DescribeMacro{\mfpdatacomment} % The user can change the comment character for data files with % something like \cs{mfpdatacomment}\marg{\cs{\#}}. This also changes the % percent character to category `other'. We can also use the percent sign -% as part of the numeric data by sandwiching the \cs{using} command -% between \cs{makepercentother} and \cs{makepercentcomment}. Every file -% reading command issues \cs{mfp@setcomment} before reading. The count -% register \cs{@datacomment} hold the ASCII code of the current comment +% as part of the numeric data by placing +% \DescribeMacro{\makepercentother}\cs{makepercentother} before the +% \cs{using} command to turn `\texttt\%' into an ordinary character. +% \DescribeMacro{\makepercentcomment}\cs{makepercentcomment} returns it to +% its usual role as a comment. Every file reading command issues +% \cs{mfp@setcomment} before reading. The count register +% \cs{mfp@commentchar} holds the ASCII code of the current comment % character, the default being the percent sign. % \begin{macrocode} -\newcount\@datacommentchar \@datacommentchar`\% +\newcount\mfp@commentchar \mfp@commentchar`\%% \newdef\makepercentother{\@makeother\%}% -\newdef\makepercentcomment{\catcode`\%=14 }% -\newdef\mfpdatacomment#1{\mfp@local\@datacommentchar`#1}% -\newdef\mfp@setcomment{\makepercentother\catcode\@datacommentchar14 }% +\newdef\makepercentcomment{\catcode`\%14 }% +\newdef\mfpdatacomment#1{\mfp@local\mfp@commentchar`#1}% +\newdef\mfp@setcomment{\makepercentother\catcode\mfp@commentchar14 }% % \end{macrocode} % % \DescribeMacro{\fdef} @@ -2544,128 +3011,490 @@ % be use in \cs{function}, or a pair expression so it can be used alone in % the last argument of \cs{parafcn}. % -% We apply \cs{@makeother} to \texttt{\#} so it doesn't get doubled. The -% \texttt{\#} is frequent in vardefs among the \MF{} gurus. +% We apply \cs{@makeother} to \arg{} so it doesn't get doubled. The +% \arg{} is frequent in vardefs among the \MF{} gurus. % \begin{macrocode} -\newdef\fdef{\begingroup\@makeother\#\preservelines\@fdef}% -\newdef\@fdef#1#2#3{\mfcmd{\@nl save #1;\@nl +\newdef\fdef{\begingroup\@makeother\#\mfp@keeplines\mfp@fdef}% +\newdef\mfp@fdef#1#2#3{\mfcmd{\@nl save #1;\@nl vardef #1 (expr #2) = \@nl #3\@nl enddef}\endgroup}% % \end{macrocode} % -% The following is executed last inside \cs{@mfpic@graf@macs}. It is a -% hook for adding new definitions. It is initialized to empty, and add-on -% packages can add to it. +% The following is executed right after \cs{mfp@grafmacs}. It is a hook +% for adding new definitions inside and \env{mfpic} environment. It is +% initialized to empty, and add-on packages can add to it. % \begin{macrocode} \newdef\mfp@additions{}% % \end{macrocode} % +% \section{The user level graphics macros} % -% \section{The main graphics macros}\label{main} -% -% In order to avoid redefining commands of other packages and in order -% to avoid having other packages redefine \mfpic{} commands, all mfpic -% commands that cannot be used outside the \env{mfpic} environment are -% defined anew with every such environment. This is accomplished by having -% the \cs{mfpic} command execute \cs{@mfpic@graf@macs}, which expands to -% all those definitions. Grouping localizes the definitions, so outside -% \env{mfpic} environments, these commands revert to being undefined, or -% to there original definitions if they had any. As might be expected it -% is quite long, over 300 lines of code at last count. +% This is the start of the definition of \cs{mfp@grafmacs}. It contains +% the definition of every user command that has no purpose outside an +% \env{mfpic} environment. It will be expanded inside every \env{mfpic} +% environment, localizing all these definitions. We do this so we can +% avoid name clashes without giving them all names beginning with \cs{mfp}. % \begin{macrocode} -\newdef\@mfpic@graf@macs{% +\newdef\mfp@grafmacs{% % \end{macrocode} % -% \subsection{Plotting data from files}\label{datafiles} +% \subsection{Figure macros}\label{figure} +% +% These are the figure macros. These are implemented as \MF{} paths that +% can be variously rendered, transformed, etc., with the prefix macros of +% subsection~\ref{prefixcommands}. % -% \DescribeMacro{\plotdata} % Most of the \mfpic{} graphic commands take optional arguments. Most of -% them follow the scheme below: \cs{@plotdata} takes a mandatory argument -% enclosed in brackets, and does the work. \cs{plotdata} is simply defined -% to test for an optional argument and pass it or a default to -% \cs{@plotdata}. In this case, the default option is signaled by -% passing empty brackets via \cs{null@opt}. +% them follow the scheme \cs{mfp@command} takes mandatory arguments +% enclosed in braces, and does the work. \cs{command} is simply defined to +% test for an optional argument (with \cs{mfp@defaultopt}) and pass it or a +% default to \cs{mfp@command}. A typical example is \cs{ellipse} defined +% to be \verb$\mfp@defaultopt\mfp@ellipse0$. In some cases, the default +% option is signaled by passing an empty argument via \cs{mfp@nullopt}. +% +% Of the commands that have no optional argument, most simply write +% the appropriate commands to the output file, and require no +% \cs{mfp@} version. +% +% This section contains a description of the behavior of each command and +% its syntax in use. For those that call an \cs{mfp@} version, the +% implementation is in the next section. +% +% \subsubsection{Common geometric objects}\label{geometric} +% +% The first few (\cs{rect} through \cs{sector}) are closed paths and +% need not be prefixed with a closing macro before filling, etc. +% +% \DescribeMacro{\rect} +% This takes one mandatory argument, the two diagonally opposite +% corners of the rectangle separated by a comma, and draws the rectangle +% with horizontal and vertical sides having these as two corners. The +% direction of the path (which seldom makes a difference) is such that it +% starts at the first specified point and moves horizontally first. % -% \cs{@plotdata} follows the scheme of most of the data file processing -% commands: it calls \cs{@processdatafile} with the name of the file (the -% second parameter of \cs{@plotdata}) and another command, \cs{mfp@doplots}, -% which really does the work. The argument of \cs{mfp@doplots} is the -% original optional parameter of \cs{plotdata}. This optional parameter is -% the smoothness, which may be \oarg{s\meta{tension}} for a smooth path -% or \oarg{p} for a polygonal path, or empty to select whatever default -% was created by \cs{smoothdata}. +% This is an example of a command that requires no further processing. +% The \cs{mfp@figmac} command sets the appropriate switches and writes its +% argument to the output file, followed by a semicolon. % \begin{macrocode} - \newdef\plotdata{\null@opt\@plotdata}% - \newdef\@plotdata[##1]##2{\@processdatafile{##2}{\mfp@doplots{##1}}}% + \newdef\rect##1{\mfp@figmac{rect (##1)}}% % \end{macrocode} % -% \cs{mfp@doplots} is a self-looping macro. It issues the rendering -% prefix (in \cs{mfp@setstyle}), increments the linetype, and writes the -% path expression defined by the first set of data in the file (via -% \cs{do@datafile}, which \emph{really} does the work and which stops at a -% blank line). That part, when prefixed by \cs{@figmacstart}, functions -% as a \cs{@figmac}. When finished with one figure, \cs{@if@enddata} -% checks if there is another set of data in the file. If so, -% \cs{mfp@doplots} calls itself again. +% \DescribeMacro{\regpolygon} +% There are four arguments. The first is the number of sides. The second +% is the name of a variable to represent the vertices. The other +% two should be equations locating two vertices or the center and one +% vertex. If the name used is \gbc{Ver}, then the vertices will be +% \gbc{Ver1}, \gbc{Ver2}, etc., numbering anticlockwise. The center is +% \gbc{Ver0}. Case is significant. After the command, the points can be +% referred to in other \mfpic{} commands (except text label commands +% when \opt{mplabels} is not in effect). +% \begin{macrocode} + \newdef\regpolygon##1##2##3##4{% + \mfp@figmac{regularpolygon (##1) (##2) (##3; ##4;)}}% +% \end{macrocode} % -% The argument is the smoothness parameter(s), which it merely passes on. -% There is no filename argument: since \cs{@processdatafile} has already -% opened the input stream \cs{mfp@data} and subsequent macros will read -% from it. +% \DescribeMacro{\circle} +% This has one optional argument containing one of the letters +% \texttt{t}, \texttt{p} (the default), \texttt{c}, \texttt{s}, +% \texttt{r}, or \texttt{q}. Its purpose is to specify what kind of data +% is in the single mandatory argument. These are a subset of the optional +% arguments that the \cs{arc} commad (below) takes, and have almost the +% same meaning: +% \begin{itemize} +% \item \oarg{t}, the three point form needs three points (of course). +% \item \oarg{p}, the polar form needs the center point and the radius. +% This is the default when the optional argument is absent. +% \item \oarg{c}, the center/point form needs the center and one point on +% the circle. +% \item \oarg{s}, the point-sweep form requires two points and the angle of +% arc between them. The angle may be positive or negative. A +% positive angle indicates the number of degrees anticlockwise from +% the first point to the second. Negative means clockwise. +% \item \oarg{r}, the point-radius form requires two points and the +% radius of the circle. Of the two possible circles, it produces the +% one where the anticlockwise arc from the first point to the second +% is not more than 180 degrees. +% \item \oarg{q}, an alternate point-radius with the same parameters. +% It produces the circle +% where the anticlockwise arc from the first point to the second +% is not less than 180 degrees. +% \end{itemize} +% +% Supplying \cs{arc} with the same parameters, or the appropriate superset +% in the case of \oarg{p} and \oarg{c}, would produce a sub-arc of the +% circle that \cs{circle} produces. This is the reason for giving +% \cs{circle} these options: to make diagrams which show a circle and an +% arc on it. +% +% We use \cs{def} instead of \cs{newdef} because we know \LaTeX{} has +% already defined a \cs{circle} command. We now use the same command, +% \cs{mfp@arccircle}, for arcs and circles, setting a switch to tell it +% which to produce. % \begin{macrocode} - \def\mfp@doplots##1{\mfp@setstyle - \advance\mfp@linetype1 \@figmacstart - \do@datafile{##1}% - \@if@enddata{}{\mfp@doplots{##1}}}% + \def\circle{\mfp@switchfalse\mfp@defaultopt\mfp@arccircle{p}}% % \end{macrocode} % -% When two blank lines occur in succession, \cs{plotdata} is suppose to -% stop. \cs{@ifenddata} is called when \cs{do@datafile} ends (one blank -% line was found), it checks for another blank line (or end-of-file) -% and, if it finds one, selects the first of the two alternatives that -% follow. +% \DescribeMacro{\ellipse} +% \cs{ellipse} has one optional argument, an angle of rotation and one +% mandatory argument, containing the center, the horizontal and vertical +% radii (before rotation), separated by commas. % \begin{macrocode} - \newdef\@if@enddata{% check for another blank line - \ifeof\mfp@data \@xp\@firstoftwo - \else - \skipcomments - \ifx\mfp@temp\mfp@par \@XP\@firstoftwo - \else \@XP\@secondoftwo - \fi - \fi}% + \newdef\ellipse{\mfp@defaultopt\mfp@ellipse{0}}% % \end{macrocode} % -% \DescribeMacro{\datafile} -% \cs{datafile} defines a path connecting the points in a datafile. The -% optional parameter is the smoothness, as in \cs{plotdata}. The other -% parameter is the filename. \cs{@datafile} does the figure macro stuff, -% opens the data file, and calls \cs{do@datafile} which does all the work. +% \DescribeMacro{\sector} +% This is the closed curve starting at the center of a circle, out +% along a radius to the circumference of the circle, along an arc of the +% circle, then back to the center. It has one mandatory argument +% containing the center, the radius, and the two angles, separated by +% commas. % \begin{macrocode} - \newdef\datafile{\null@opt\@datafile}% - \newdef\@datafile[##1]##2{\@figmacstart - \@processdatafile{##2}{\do@datafile{##1}}}% + \newdef\sector##1{\mfp@figmac{sector (##1)}}% % \end{macrocode} % -% I lied. Actually all \cs{do@datafile} does is handle any empty -% optional parameter and call \cs{@do@datafile} to do the work. +% \DescribeMacro{\arc} +% We have seven (actually 14) ways to specify a circular arc. \cs{arc} +% takes an optional argument: a letter to indicate which of the 7 +% specifications. It has one mandatory argument containing the data for +% that specification, separated by commas. It also has a star-form, +% which produces the complementary arc. That is, instead of the arc that +% is specified (as described below) it produces the rest of the circle +% from the end of the specified arc to its start. +% +% The available letters and the corresponding required data are listed +% below. The default optional argument is \oarg{s}. +% \begin{itemize} +% \item \oarg{t}, the three point form needs three ordered pairs. +% \item \oarg{p}, the polar form needs the center point, two angles and +% the radius (in that order). +% \item \oarg{a}, the alternative polar form needs the center, the radius +% and two angles (in that order). +% \item \oarg{c}, the center-point-sweep form needs the center, the +% starting point, and the angle. +% \item \oarg{s}, the points-sweep form requires the starting point, the +% ending point and the angle. +% \item \oarg{r}, the points-radius form requires the starting point, the +% ending point and the radius of the arc. There are two circles with +% the given radius that pass through the given points, and hence +% four possible arcs. One arc on each circle is anticlockwise from +% the first point to the second. Of those two arcs, only one is +% less than $180$ degrees. That one is produced. +% \item \oarg{q} Same as \oarg{r}, except the arc is the larger of two +% anticlockwise arcs. +% \end{itemize} % \begin{macrocode} - \newdef\do@datafile##1{% - \do@mtparam{##1}{\mfp@smoothness\mfp@tension}\@do@datafile}% + \newdef\arc{\mfp@iftoken*{\arccomplement\mfp@arc}{\mfp@arc}}% % \end{macrocode} % -% And \cs{@do@datafile} is mainly just a wrapper, processing the optional -% parameter (passed by either \cs{plotdata} or \cs{datafile}) which -% selects what figure making code should be written. For -% \oarg{s\meta{tension}} a \gbc{curve} command is used. For \oarg{p}, a -% \gbc{polyline}. (The `\cs{mf@F}' means the curve is not closed). +% \subsubsection{List macros}\label{list} +% +% The figure macros of this section are all list macros. They produce a +% path from a list of ordered pairs. The list can be explicitly given as a +% mandatory argument containing a comma-separated list of pair +% expressions, or it can be taken from an external datafile. This is true +% for \cs{polyline} through \cs{turtle}. These macros differ only in how +% the data determine the path. (Some of the splines don't connect given +% points, but rather use the points in a different way to determine a +% curve.) The list of pairs is not an argument of any of these. It should +% follow, and is ultimately written to output by the ending code of +% \cs{mfp@listmac}. This is basic to list macros, and will not be repeated +% for each one. +% +% Commands in this section are grouped by the argument structure of the +% command written to the output file. The first twelve come in pairs +% that are distinguished by a boolean parameter, which usually determines +% whether the path produced is closed, followed by the list. +% +% \DescribeMacro{\polyline} +% The most basic, a polyline or polygonal path, \cs{polyline} draws line +% segments from each point to the next. \DescribeMacro{\lines}\cs{lines} +% is an alias. % -% After that, \cs{mfp@rwdata} is called, which reads and writes the -% data. +% \DescribeMacro{\closedpolyline}\cs{closedpolyline} does the +% same, except it produces a closed path, connecting the last point to the +% first. \DescribeMacro{polygon}\cs{polygon} is an alias. +% +% \DescribeMacro{\computedspline}The \cs{computedspline} command takes a +% list of points and computes the controls of a cubic spline that connects +% the points. Adjacent segments have matching first and second derivatives +% at the common endpoint. It is limited to what is called a \emph{relaxed} +% spline, which has zero curvature at the beginning and ending points. +% +% \DescribeMacro{\closedcomputedspline} +% This is similar, but computes the unique \emph{closed} cubic spline that +% connects a list of points. +% +% The next four commands also produce types of splines. The list of pairs +% is not, however, the points passed through but rather are control points, +% of a sort. +% +% \DescribeMacro{\qspline} +% This produces quadratic splines. The points create the path as follows: +% for successive points $p\sb i, p\sb {i+1}$ in the list, the path passes +% through the midpoint of the line segment connecting $p\sb i$ and +% $p\sb {i+1}$, tangent to that line segment. This causes adjacent +% B\'ezier segments to have matching derivatives at their common +% endpoint. Each three successive data points determines one segment of +% the path. +% +% \DescribeMacro{\closedqspline} +% The closed variant works by creating two additional segments, viewing +% the triples $p\sb{n-1}, p\sb{n}, p\sb1$ and $p\sb{n}, p\sb1, p\sb2$ as +% being `successive'. +% +% \DescribeMacro{\cspline} This produces cubic splines. The points +% determine the curve as follows: for successive points $p\sb i, p\sb +% {i+1}$ in the list, the line segment connecting them is divided into +% thirds with two points $q\sb i$ and $q\sb i'$. The curve then passes +% through the midpoint of the segment from $q\sb {i-1}'$ to $q\sb i$ and +% tangent to that segment. This causes adjacent B\'ezier segments to have +% matching first and second derivatives at their common endpoint. Each +% four successive data points determines one segment of the path. +% +% \DescribeMacro{\closedcspline} The closed variant works by viewing the +% first point as a succesor of the last point, creating three additional +% path segments. +% +% \DescribeMacro{\qbeziers} +% This produces the equivalent of a sequence of \LaTeX{} \cs{qbezier} +% commands. The mandatory argument will be a list of points alternating +% between nodes and control points, ending with the last node. +% \DescribeMacro{\closedqbeziers}The closed version ends with the control +% point between the last node and the first. Therefore, the \cs{qbeziers} +% command needs an odd number of points in the list, while +% \cs{closedqbeziers} needs an even number. If this is not the case, the +% last point in the list is repeated, causing the final segment to be a +% straight line (closed case) or trivial. +% +% Note that quadratic B\'eziers need not be smooth at the nodes unless +% the control points line up. Our plural name distinguishes it from the +% \LaTeX{} command. +% +% \DescribeMacro{\fcnspline} +% The above splines are two dimensional splines, that is, functions of +% $t$ with pair values $(x,y)$. One dimensional splines are functions of +% $x$ with numeric values $y$. This command produces the \emph{graph} of +% such a function computed from a supplied list of points. It is required +% that the $x$-values of the points are in increasing order, although it +% will produce some sort of curve as long as adjacet $x$-values are +% distinct. It produces the graph of a \emph{relaxed} spline, in the sense +% that the second derivative $d^2y/dx^2$ is zero at the beginning and end. +% +% \DescribeMacro{\periodicfcnspline} +% This is the same, but instead of requiring the second derivative to be +% zero at both ends, it produces a graph such that the first and second +% derivatives at the end match the ones at the beginning. If a copy of the +% graph is placed with its starting point at the original graph's ending +% point, then there is a smooth join. If the $y$-values of the +% beginning and ending points match, a periodic graph is obtained. For +% these last two commands the paths cannot be closed, and the boolean +% determines the behavior at the endpoints. +% +% The command \cs{mfp@listi} that implements these writes the command +% name and the argument and ends with code to write the list of pairs. +% \begin{macrocode} + \newdef\lines{\mfp@listi{polyline}\mfp@F}% + \newdef\polygon{\mfp@listi{polyline}\mfp@T}% + \newdef\computedspline{\mfp@listi{dospline}\mfp@F}% + \newdef\closedcomputedspline{\mfp@listi{dospline}\mfp@T}% + \newdef\qspline{\mfp@listi{qspline}\mfp@F}% + \newdef\closedqspline{\mfp@listi{qspline}\mfp@T}% + \newdef\cspline{\mfp@listi{cspline}\mfp@F}% + \newdef\closedcspline{\mfp@listi{cspline}\mfp@T}% + \newdef\qbeziers{\mfp@listi{qbezier}\mfp@F}% + \newdef\closedqbeziers{\mfp@listi{qbezier}\mfp@T}% + \newdef\fcnspline{\mfp@listi{fcnspline}\mfp@F}% + \newdef\periodicfcnspline{\mfp@listi{fcnspline}\mfp@T}% + \newlet\closedpolyline\polygon + \newlet\polyline\lines +% \end{macrocode} +% +% The next six macros have an optional argument called `tension', a +% numerical value that controls how tightly the path turns at each point +% in the list. If the optional argument is absent (or empty), the +% \grafbase{} command that is written takes only a boolean argument +% (closed or not closed) followed by the list of points. If the tension +% argument is present, a different comamnd is written that also has a tension +% argument. The command name is almost the same, but has a `\gbc{t}' +% prepended. The default tension is the \cs{grafbase}{} variable +% \gbc{default_tension}, set with \cs{settension}, initialized to 1. +% Tension of 0 is ignored (ultimately tension is divided by) and may +% produce error messages from \MF{}. +% +% \DescribeMacro{\curve} +% \cs{curve} draws a smooth curve connecting a list of points. it arranges +% for the curve, at point $p\sb n$ to be traveling parallel to the direction +% from $p\sb {n-1}$ to $p\sb {n+1}$ (except at the first and last point). +% +% The closed version \DescribeMacro{\closedcurve}\cs{closedcurve} treats the +% first point and last point the same as the rest. It has the alias +% \DescribeMacro{\cyclic}\cs{cyclic}. +% +% \DescribeMacro{\convexcurve} +% This convex version produces a smooth curve that is convex in those +% places where \cs{polyline} (with the same list of points) would produce +% a convex shape. \DescribeMacro{\closedconvexcurve}It also comes in a closed +% version, with the alias \DescribeMacro{\convexcyclic} +% \cs{convexcyclic}. +% +% \DescribeMacro{\mfbezier} +% This produces the standard \MF{} cubic B\'ezier using the \MF{} path +% join operator (\mfc{..}) with tension given by an optional argument. +% \DescribeMacro{\closedmfbezier}The closed version connects the last +% point to the first in the same way. +% +% The command \cs{mfp@curve} examines the optional argument and writes +% the command name (first argument, possibly modified) with the +% appropriate arguments (the boolean or tension plus boolean). +% \begin{macrocode} + \newdef\curve{\mfp@curve{curve}\mfp@F}% + \newdef\cyclic{\mfp@curve{curve}\mfp@T}% + \newdef\convexcurve{\mfp@curve{ccurve}\mfp@F}% + \newdef\convexcyclic{\mfp@curve{ccurve}\mfp@T}% + \newdef\mfbezier{\mfp@curve{bezier}\mfp@F}% + \newdef\closedmfbezier{\mfp@curve{bezier}\mfp@T}% + \newlet\closedcurve\cyclic + \newlet\closedconvexcurve\convexcyclic +% \end{macrocode} +% +% \DescribeMacro{\fcncurve} +% A `function curve' is the graph of a function of $x$. It should always +% travel left to right. This is not guaranteed by the \cs{curve} macro, +% above, even if the $x$ coordinates are listed in order. \cs{fcncurve} is +% guaranteed to do this if the list of points has the $x$ coordinates so +% ordered. +% +% While the optional argument is called tension, it is not quite the +% same as the tension argument to \cs{curve}, but it has a similar effect. +% The default value is the sane as for \cs{curve}. The above guarantee is +% voided if the value used is ${}\le1/3$. % \begin{macrocode} - \newdef\@do@datafile[##1##2]{% - \mfsrc{% - \if s##1 \mfp@ifempty{##2}{curve }{tcurve (##2) }% - \else polyline - \fi (\mf@F)}\mfp@rwdata}% + \newdef\fcncurve{\mfp@nullopt\mfp@fcncurve}% +% \end{macrocode} +% +% \DescribeMacro{\turtle} +% Many years ago there was a tool for teaching programming concepts to +% young children. They could draw a figure on a screen by programming a +% `turtle' with a sequence of turns and distances. The following is +% similar. It has a mandatory argument containing a list of ordered pairs. +% The first is the coordinates of the starting point, and each of the rest +% is interpreted as a displacement from the current position, along which +% a line segment is to be drawn. The terminal point of that segment is the +% new current position +% \begin{macrocode} + \newdef\turtle{\mfp@listmac{turtle}}% +% \end{macrocode} +% +% \subsubsection{Graphing functions}\label{functions} +% +% \DescribeMacro{\function} +% \prog{Mfpic} provides the ability to plot the graph of any function that +% can be defined in \MF. This is done with the \cs{function} command, a +% figure macro which takes one optional parameter that selects +% the smoothness of the \MF{} path produced. It can be \oarg{p}, which +% draws a polyline path through selected points (much like \cs{polyline}), +% or \oarg{s\meta{tension}} which selects a smooth path (much like +% \cs{curve}\oarg{\meta{tension}}). The tension may be omitted and then +% will be 1 (or the value set by \cs{settension}). The default optional +% argument is \oarg{s}, a smooth curve with the default tension. +% +% There are two mandatory arguments. The second is the function, which +% must be written as a formula (strictly speaking, a \MF{} numerical +% expression) containing only one variable, \texttt{x}. The first +% mandatory argument contains three numbers separated by commas. They are, +% in order, the starting value of \texttt{x}, the ending value, and the +% step size. +% +% \DescribeMacro{\parafcn} +% \cs{parafcn} is similar, except its formula must be an ordered pair of +% formulas (strictly speaking, a \MF{} pair expression) in which +% \texttt{t} is the only variable. +% +% \DescribeMacro{\plrfcn} +% \cs{plrfcn} is similar, except its argument is a formula (a \MF{} +% numeric expression) representing the radius, in which \texttt{t} is the +% only variable, interpreted as the angle coordinate, $\theta$, in degrees. +% +% These three commands are so alike that they call the same macro +% with the name to be written as the first argument and the default +% optional argument as the second. The latter is so that we can reuse it +% for two other commands where the default is different. +% \begin{macrocode} + \newdef\function{\mfp@fcn{function}s}% + \newdef\parafcn{\mfp@fcn{parafcn}s}% + \newdef\plrfcn{\mfp@fcn{plrfcn}s}% +% \end{macrocode} +% +% \DescribeMacro{\btwnfcn} +% The region between two functions \cs{btwnfcn} is a figure macro. It is +% mostly intended for shading or other filling operations so it is already +% closed and, by default, it is not `smooth'. Its parameters are the +% same as those of \cs{function} (above), with two exceptions: the default +% optional argument is \oarg{p} and it has an additional mandatory +% argument, the other function. The resulting \MF{} path travels along the +% graph of the first function from the starting $x$ to the ending $x$, +% thence vertically to the graph of the second function, along it (in +% reverse) to the starting $x$ and finally, vertically to the start of the +% first function's graph. +% +% \DescribeMacro{\btwnplrfcn} +% We also have the polar function version, where the two function +% arguments are as in \cs{plrfcn}. The default option is also \oarg{p}. +% As with \cs{function}, these are implemented by calling a common +% command with the basename of the \grafbase{} command as argument. +% +% \DescribeMacro{\plrregion} +% This is like \cs{btwnplrfcn} with 0 as the first function, but it +% is more efficient. It takes only the other function as an argument. +% Again, the default option is \oarg{p}. +% +% \DescribeMacro{\belowfcn} +% This is like \cs{btwnfcn} with 0 as the first function, but it +% is more efficient. It takes only the other function as an argument. +% The default option is \oarg{p}. +% \begin{macrocode} + \newdef\btwnfcn{\mfp@btwn{btwnfcn}}% + \newdef\btwnplrfcn{\mfp@btwn{btwnplrfcn}}% + \newdef\belowfcn{\mfp@fcn{belowfcn}p}% + \newdef\plrregion{\mfp@fcn{plrregion}p}% +% \end{macrocode} +% +% \DescribeMacro{\levelcurve} +% One way to graph a function of two variables is to draw level curves. +% The figure macro \cs{levelcurve} takes an optional smoothness +% argument (\texttt{[s\meta{tension}]} or \texttt{[p]} with \texttt{p} +% being the default), and two mandatory arguments. The first +% mandatory argument is a `seed' point which is known to lie inside the +% level curve, followed by a comma and a step size. The second is an +% inequality between the function and the level value that is true inside +% the level curve. Strictly speaking, the last argument can be any \MF{} +% boolean valued expression with variables \mfc{x} and \mfc{y}. The simple +% example,\\ +% \indent\verb$\levelcurve[p]{(0,0),0.1}{x*x + y*y < 3}$\\ +% will draw approximately the circle with radius $\sqrt3$ as a sequence of +% line segments with length $0.1$. That will require about 108 segments. +% Its parameters are similar enough to those of \cs{function} that we +% can use the same interface. +% \begin{macrocode} + \def\levelcurve{\mfp@fcn{levelset}p}% +% \end{macrocode} +% +% \subsection{Plotting data from files}\label{datafiles} +% +% \DescribeMacro{\plotdata} +% The optional parameter is the smoothness, which may be +% \oarg{s\meta{tension}} for a smooth path or \oarg{p} for a polygonal +% path, or empty to select the default. The default is \oarg{p} when +% \mfpic{} is loaded, but can be changed with \cs{smoothdata} and restored +% with \cs{unsmoothdata}. +% \begin{macrocode} + \newdef\plotdata{\mfp@nullopt\mfp@plotdata}% +% \end{macrocode} +% +% \DescribeMacro{\datafile} +% \cs{datafile} defines a path connecting the points in a datafile. It has +% an optional parameter for the smoothness, as in \cs{plotdata}. +% \begin{macrocode} + \newdef\datafile{\mfp@nullopt\mfp@datafile}% % \end{macrocode} % % \subsection{The prefix commands}\label{prefixcommands} @@ -2676,7 +3505,7 @@ % This stores an \mfpic{} path in a \MF{} path variable. The argument is % the variable name. It should be followed by an \mfpic{} figure macro % (such as \cs{rect}\marg{...}). The stored path can be reused via the -% \cs{mfobj} command. This command is written as a \cs{@rendmac} even +% \cs{mfobj} command. This command is written as a \cs{mfp@rendmac} even % though it does no rendering. This is so (1)~it will turn off implicit % rendering (any rendering must be explicitly written) and (2) it can be % placed anywhere within the prefix area. This is new behavior with @@ -2686,22 +3515,48 @@ % precede \cs{store}. Note that \cs{store} takes a second argument but % it merely puts it back. This is so that the old syntax (with the figure % macro in braces) will continue to work. +% +% \DescribeMacro{\norender} +% Occasionally it is useful to turn off rendering (say we want to add an +% arrowhead to a subpath of a path that is already rendered). One could +% put \cs{store} at the start with an unused name, but as every path is +% already stored in \gbc{curpath}, that seems redundant. So here is a +% prefix macro with null rendering and no side effects. It is exactly +% like \cs{mfp@rendmac}, except it does not end with \cs{mfsrc}. % \begin{macrocode} - \newdef\store##1##2{\@rendmac{stored (##1)}##2}% + \newdef\store##1##2{\mfp@rendmac{stored (##1)}##2}% + \newdef\norender{\mfp@first\@mfprendfalse}% % \end{macrocode} % % \DescribeMacro{\mfobj} -% \DescribeMacro{\mpobj} % This is the interface to use a \cs{store}-d object. -% \cs{mfobj}\marg{\meta{name}} is a figure macro, and should act pretty -% much exactly the same as if the figure macro that had been stored in the -% variable were typed in its place. Its one argument, the variable name, -% is read by \cs{@figmac}, which operates as described previously, either -% implicitly rendering the path, or allowing it to be picked up by -% preceding prefix macros. +% \cs{mfobj}\marg{\meta{name}} is a figure macro, and should act exactly +% the same as if the figure macro that had been stored in the variable +% were typed in its place. Its one argument is the variable name. +% \DescribeMacro{\mpobj}\cs{mpobj} is another name for the same command. +% \begin{macrocode} + \newlet\mfobj\mfp@figmac \newlet\mpobj\mfobj +% \end{macrocode} +% +% \DescribeMacro{\mfpimage} +% The command \cs{mfpimage} starts a group in which drawing commands +% work just as usual, except they draw in a picture variable, whose name +% is the only mandatory argument to \cs{mfpimage}. +% \DescribeMacro{\endmfpimage}The command \cs{endmfpimage} ends that +% group. There is an optional argument to set the reference point of the +% created picture, the default being \gbc{(0,0)}. The resulting picture +% can then be placed using \cs{putmfpimage}. +% \begin{macrocode} + \newdef\mfpimage{\mfp@defaultopt\mfp@image{(0,0)}}% + \newdef\endmfpimage{\mfcmd{\@nl concludeimage}}% +% \end{macrocode} +% +% \DescribeMacro{\putmfpimage} +% This takes the name of a picture variable created with the +% \cs{mfpimage} environment (or even with the \cs{tile} environment), and +% places it with its reference point at the points in a list. % \begin{macrocode} - \newlet\mfobj\@figmac - \newlet\mpobj\@figmac + \newdef\putmfpimage##1{\mfsrc{\@nl putimage (##1)}\mfp@writedata}% % \end{macrocode} % % \subsubsection{Subpaths} @@ -2719,32 +3574,32 @@ % \cs{cutoffbefore} to the reversed path and reversing the result. % % \DescribeMacro{\trimpath} -% This trims off the specified amounts from the start and end of the -% path. The amounts are two absolute dimensions, separated by commas. -% They may be \TeX{} dimensions. If the first dimension is absent, it is -% set to \texttt{0pt}, if the second is absent, it is set equal to the -% first. (So if both are absent, nothing is trimmed.) +% This trims off the specified absolute amounts from the start and end of +% the path. The amounts can be specified as two absolute dimensions +% separated by a comma, or a single dimension. In the second case, that +% dimension is used at both the start and end. +% +% The implementation uses \cs{mfp@modi} which simply reads the argument +% and writes it (via \cs{mfp@modmac}) as a set of parameters to the +% appropriate \grafbase{} command. With \cs{trimpath}, however, we have to +% parse that argument with \cs{mfp@getdimens}. % \begin{macrocode} - \newdef\cutoffafter##1{\@closmac{cutoffafter (##1)}}% - \newdef\cutoffbefore##1{\@closmac{cutoffbefore (##1)}}% - \newdef\trimpath##1{\@getdimens##1,,\mfp@delim - \@closmac{trimmedpath (\the\mfp@scratch, \the\mfp@scratchB)}}% - \newdef\@getdimens##1,##2,##3\mfp@delim{% - \mfp@scratch \@ifmtsub{##1}{\z@}\relax - \mfp@scratchB\@ifmtsub{##2}{\mfp@scratch}\relax}% + \newdef\cutoffafter {\mfp@modi{cutoffafter}}% + \newdef\cutoffbefore{\mfp@modi{cutoffbefore}}% + \newdef\trimpath##1{\mfp@getdimens##1,,\mfp@end + \mfp@modi{trimmedpath}\mfp@thedimens}% % \end{macrocode} % % \DescribeMacro{\partpath} -% \DescribeMacro{\subpath} -% These produce a subpath of the following path. Each takes a mandatory -% parameter containing two numbers separated by a comma. In -% \cs{partpath}, these should be between 0 and 1 and produce a fraction -% of the following path. In \cs{subpath}, these are absolute numbers between -% 0 and the number of segments in the path, and it produces the equivalent of -% \MF's \mfc{subpath} primitive. +% This produces a subpath of the following path. Its mandatory argument +% contains two numbers separated by a comma. The numbers should be between +% 0 and 1 and produce a fraction of the following path. +% \DescribeMacro{\subpath}\cs{subpath} has a similar argument, but the +% numbers are between $0$ and the number of segments in the path, and it +% produces the equivalent of \MF's \mfc{subpath} primitive. % \begin{macrocode} - \newdef\partpath##1{\@closmac{partialpath (##1)}}% - \newdef\subpath##1{\@closmac{gsubpath (##1)}}% + \newdef\partpath{\mfp@modi{partialpath}}% + \newdef\subpath{\mfp@modi{gsubpath}}% % \end{macrocode} % % \subsubsection{Drawing a curve}\label{drawing} @@ -2753,33 +3608,82 @@ % dashed, colored, etc. % % \DescribeMacro{\draw} -% \cs{draw} is the initial definition of \cs{@render}. It takes one -% optional argument, a color. In \MF{}, where color are just numerics, if -% it is ${}\ge 1$ (representing white) the path is subtracted from the -% picture, otherwise it is drawn in black. +% \cs{draw} takes one optional argument, a color. In \MF{}, where the +% color commands return a numeric, if it is ${}\ge 1$ (representing white) +% the path is subtracted from the picture, otherwise it is drawn in black +% (the default). The default in \MP{} is \gbc{drawcolor}. +% +% We signal the use of the default color by passing a null optional +% argument. Because several commands handle color the same way, and all +% are rendering macros, we have a common macro that only needs the name of +% the \grafbase{} command. +% \begin{macrocode} + \newdef\draw{\mfp@nullopt{\mfp@clroptrend{drawn}}}% +% \end{macrocode} % +% \DescribeMacro{\doubledraw} +% Behaves something like \cs{draw}, except it draws a double line. It +% takes two optional arguments; the first is the distance between the +% centers of the two lines (default \gbc{2penwd}) and the second is a +% color. % \begin{macrocode} - \newdef\draw{\null@opt\@draw}% - \newdef\@draw[##1]{% - \@rendmac{\mfp@ifempty{##1}{drawn}{colordrawn (##1)}}}% + \newdef\doubledraw{\mfp@defaultopt\mfp@doubledraw{2penwd}}% % \end{macrocode} % % \DescribeMacro{\dashed} -% \cs{dashed} (as well as \cs{dotted}) takes one optional argument, -% which should contain the length of the dashes (diameter of dots) and -% the length of the spaces between, separated by a comma. The defaults -% can be seen in the code below. +% \cs{dashed} and \cs{dotted} take one optional argument, which should +% contain the length of the dashes (diameter of \DescribeMacro{\dotted} +% dots) and the length of the spaces between, separated by a comma. +% +% Several rendering macros take an optional argument which is written as +% the first parameter of a \grafbase{} command. Thus all are handled with +% a single macro whose arguments are the name of the command and the +% default for the optional argument. % \begin{macrocode} - \newdef\dashed{\simple@opt\@dashed{\the\dashlen,\the\dashspace}}% - \newdef\@dashed##1{\@rendmac{DASHED (##1)}}% - \newdef\dotted{\simple@opt\@dotted{\the\dotsize,\the\dotspace}}% - \newdef\@dotted##1{\@rendmac{dotted (##1)}}% + \newdef\dashed{\mfp@optrendi{DASHED}{\the\dashlen,\the\dashspace}}% + \newdef\dotted{\mfp@optrendi{dotted}{\the\dotsize,\the\dotspace}}% % \end{macrocode} % % \cs{gendashed} takes one mandatory argument, the name of a dash pattern -% previously defined by \cs{dashpattern} +% previously defined by \cs{dashpattern}. The implementing macro, +% \cs{mfp@rendi}, is like the above, except it doesn't need to perform the +% option processing. +% \begin{macrocode} + \newdef\gendashed{\mfp@rendi{gendashed}}% +% \end{macrocode} +% +% \DescribeMacro{\zigzag} +% This draws a zigzag, crossing from one side of the following path to +% the other. It has one required argument containing four dimensions, +% \meta{dim$\sb1$} through \meta{dim$\sb4$}, separated by commas. What is +% drawn depends on whether the path is closed or open. For an open path, +% this draws the start of the path for a distance \meta{dim$\sb1$}, +% followed by zigzags, followed by the end of the path for a distance +% \meta{dim$\sb2$}. For a closed path the first two dimensions are +% ignored and the zigzags follow the entire path. +% +% The last two dimensions define the size and slant of each `zig'. If we +% think of the zigzags as representing a periodic wave, \meta{dim$\sb3$} +% is the wavelength and \meta{dim$\sb4$} is the amplitude (distance from +% the true path to the sharp points). +% +% \DescribeMacro{\sinewave} +% This is similar, but the result is a smooth sinewave shaped rendering. +% +% \DescribeMacro{\coil} +% This creates a coil, or corkscrew-shaped rendering. In this case +% \meta{dim$\sb3$} is the distance from one loop to the next and +% \meta{dim$\sb4$} is the maximum distance to each side of the path. +% An alias, \DescribeMacro{\corkscrew}\cs{corkscrew}, is provided. +% +% Both \cs{sinewave} and \cs{corkscrew} take an optional `tension' +% argument that affects the smoothness of the result. The default is $1$ +% and the higher the value the closer they become to a zigzag. % \begin{macrocode} - \newdef\gendashed##1{\@rendmac{gendashed (##1)}}% + \newdef\zigzag{\mfp@rendi{zigzag}}% + \newdef\sinewave {\mfp@defaultopt{\mfp@wiggle{sinewave}}1}% + \newdef\coil{\mfp@defaultopt{\mfp@wiggle{corkscrew}}1}% + \newlet\corkscrew\coil % \end{macrocode} % % \cs{plot} is like \cs{dotted}, except the dots are variously shaped @@ -2788,167 +3692,184 @@ % argument, the name of the symbol. This can in principal be any % expression of type \mfc{picture} or \mfc{path}. (In \MP, type % \mfc{string} is also permitted). For the size parameter to work -% correctly, the symbol should be a path, and it should have 1 as it's -% natural size. \Mfpic{} provides the predefined paths +% correctly, the symbol should be a path, and it should have 1 +% as it's natural size. \Mfpic{} provides the predefined paths % \texttt{Triangle}, \texttt{Square}, \texttt{Circle}, \texttt{Star}, % \texttt{Diamond}, \texttt{Plus}, \texttt{Cross} and \texttt{Asterisk}. % The first 5 have filled-in versions: \texttt{SolidTriangle}, etc. +% +% The utility \cs{mfp@optrendii} is similar \cs{mfp@optrendi} except it +% takes an additional argument, in this case, the first mandatory argument +% of \cs{plot}. % \begin{macrocode} - \newdef\plot{\simple@opt\@plot{\the\pointsize, \the\symbolspace}}% - \newdef\@plot##1##2{\@rendmac{doplot (##2, ##1)}}% + \newdef\plot{\mfp@optrendii{doplot}{\the\pointsize,\the\symbolspace}}% % \end{macrocode} % +% \DescribeMacro{\plotnodes} % Sometimes, rather than equally spaced dots or symbols, we would rather % have a symbol at each `node' of the following path. If the path is % created by a list macro, then usually each point in the list is a node -% (but the spline paths are exceptions). For other figures, the nodes -% can seem pretty random. For example, a \cs{circle} command without optional -% argument produces a curve with 8 equally spaced nodes, but with optional -% argument the nodes depend on how it is drawn and the size of any angle -% parameter. +% (but some of the spline paths are exceptions). For other figures, the +% nodes can seem pretty random. For example, a \cs{circle} command without +% optional argument produces a curve with 8 equally spaced nodes, but with +% optional argument the nodes depend on how it is drawn and the size of +% any angle parameter. % % \cs{plotnodes} has almost the same syntax as \cs{plot}, but since it % places the symbols only at the nodes of the path, there is no spacing % parameter in the optional argument. % \begin{macrocode} - \newdef\plotnodes{\simple@opt\@plotnodes{\the\pointsize}}% - \newdef\@plotnodes##1##2{\@rendmac{plotnodes (##2, ##1)}}% + \newdef\plotnodes{\mfp@optrendii{plotnodes}{\the\pointsize}}% +% \end{macrocode} +% +% \DescribeMacro{\showcontrols} +% Mainly for debugging, this places a symbol at the precontrol and +% postcontrol of each node, and draws a line segment from each symbol to +% the node. The names of two symbols are given in a mandatory argument, +% separated by commas. As a special case, if either symbol is just the +% number `\mfc{0}', it is not drawn. There is an optional argument for +% the size of these symbols. If the size is zero, neither symbol is drawn. +% That is useful if one only wants to see the line segments. +% \begin{macrocode} + \newdef\showcontrols{\mfp@optrendii{showcontrols}{\the\pointsize}}% % \end{macrocode} % % \subsubsection{Closing a curve}\label{closing} % +% There are several commands used to close paths (by prefixing them to +% figure macros). The \grafbase{} commands that implement closing have a +% common naming pattern. They all contain the string `\texttt{closed}, +% to which is added a distinguishing prefix. If the command takes a +% tension argument, the letter `\texttt{t}' is appended. The corresponding +% command without the `\texttt{t}' calls it with a default tension value. +% +% These macros all call \cs{mfp@close}, feeding it the proper prefix and +% the tension value (empty if there is no tension option). +% % \DescribeMacro{\sclosed} -% \DescribeMacro{\bclosed} +% The first closes smoothly in the same manner that \cs{curve} creates a +% smooth path. \DescribeMacro{\bclosed}The second uses an ordinary \MF{} +% B\'ezier. These two have an optional argument: the amount of tension to +% put in the connecting link. This makes no sense with the rest. +% % \DescribeMacro{\lclosed} +% \cs{lclosed} always draws a straight line from the end of a path to +% its start. +% % \DescribeMacro{\cbclosed} -% \DescribeMacro{\qbclosed} +% \cs{cbclosed} computes a closure by calculating cubic B-spline control +% points from the path data and then generating a connecting spline (see +% \cs{cspline}). +% \DescribeMacro{\qbclosed}\cs{qbclosed} is similar, but quadratic +% B-splines are used. +% % \DescribeMacro{\uclosed} -% These close a path defined by whatever figure macro follows it. The -% first closes smoothly in the same manner that \cs{curve} creates a -% smooth path, the second uses an ordinary \MF{} B\'ezier. These two have -% an optional argument: the amount of tension to put in the connecting -% link. Higher tension produces a linking segment with sharper turns near -% the endpoints and a flatter path in between. This makes no sense with -% \cs{lclosed}, \cs{qbclosed} or \cs{cbclosed}. The first always draws a -% straight line and the other two requires a link explicitly determined by -% the beginning and ending segments of the path: a cubic B-spline for -% \cs{cbclosed} and a quadratic B-spline for \cs{qbclosed}. See -% \cs{closedcspline} and \cs{closedqspline} described later. -% -% Due to a misunderstanding on my part, \cs{uclosed} was defined in a more -% complicated manner than necessary, and actually produced exactly the -% same path as \cs{bclosed}. So now they are just made to be equal. -% \begin{macrocode} - \newdef\@closed##1##2{% - \@closmac{##1closed\mfp@ifempty{##2}{}{t (##2)}}}% - \newdef\bclosed{\null@opt\@bclosed}% - \newdef\@bclosed[##1]{\@closed b{##1}}% - \newdef\sclosed{\null@opt\@sclosed}% - \newdef\@sclosed[##1]{\@closed s{##1}}% - \newdef\lclosed{\@closed l{}}% - \newdef\cbclosed{\@closed{cb}{}}% - \newdef\qbclosed{\@closed{qb}{}}% +% At one time \cs{uclosed} was defined in a more complicated manner than +% necessary, but actually produced exactly the same path as \cs{bclosed}. +% So now they are just made to be equal. +% \begin{macrocode} + \newdef\bclosed{\mfp@nullopt{\mfp@close b}}% + \newdef\sclosed{\mfp@nullopt{\mfp@close s}}% + \newdef\lclosed{\mfp@close l{}}% + \newdef\cbclosed{\mfp@close{cb}{}}% + \newdef\qbclosed{\mfp@close{qb}{}}% \newlet\uclosed\bclosed % \end{macrocode} % +% \DescribeMacro{\makesector} +% Takes a following arc and draws the sector (even if the center point +% is not known). It really only works if prefixed to one of the +% \cs{arc} commands, but it will attempt to create something even for +% other paths. It calculates the center of the circle containing the arc +% and connects that to the endpoints with two straight lines. +% \begin{macrocode} + \newdef\makesector{\mfp@modmac{makesector}}% +% \end{macrocode} +% % \subsubsection{Filling a closed curve}\label{filling} % % The next few prefix macros fill the interior of the closed path that -% follows with some sort of pattern. The path must be either already -% closed (like that produced by \cs{rect} or \cs{circle}) or explicitly -% closed with a closing prefix. A non-closed path will simply be drawn -% with a solid line. +% follows with some sort of pattern. The path must be closed; if not, +% the path will simply be drawn with a solid line. % % \DescribeMacro{\tess} % \cs{tess} takes one mandatory argument, the name of a previously defined -% tile, and fills with shifted copies of the tile. +% tile (see subsection~\ref{composite}), and fills with shifted copies of +% the tile. % \begin{macrocode} - \newdef\tess##1{\@rendmac{tess (##1)}}% + \newdef\tess{\mfp@rendi{tess}}% % \end{macrocode} % % \DescribeMacro{\shade} +% \cs{shade} is implemented in \MF{} by filling a region with a pattern +% of dots, simulating gray. It take one optional parameter, the separation +% between dots, defaulting to \cs{shadespace}. The size of the dots is +% set by issuing the command \cs{shadewd}. In \MP{} a gray fill is +% used but the syntax is the same. It would be better to just use +% \cs{gfill} instead (described later). +% % \DescribeMacro{\polkadot} -% \cs{shade} and \cs{polkadot} take one optional parameter, the separation -% between dots, defaulting to \cs{shadespace} (resp., \cs{polkadotspace}). -% The size of the dots is set by issuing the command \cs{shadewd} (resp., -% \cs{polkadotwd}). +% This command is actually meant to fill with a pattern of large dots. +% It also takes the separation between dots (default \cs{polkadotspace}) +% as an optional argument. The command \cs{polkadotwd} sets the size of +% the dots. % \begin{macrocode} - \newdef\shade{\simple@opt\@shade{\the\shadespace}}% - \newdef\@shade##1{\@rendmac{shade (##1)}}% - \newdef\polkadot{\simple@opt\@polkadot{\the\polkadotspace}}% - \newdef\@polkadot##1{\@rendmac{polkadot (##1)}}% + \newdef\shade{\mfp@optrendi{shade}{\the\shadespace}}% + \newdef\polkadot{\mfp@optrendi{polkadot}{\the\polkadotspace}}% % \end{macrocode} % % \DescribeMacro{\thatch} -% \DescribeMacro{\lhatch} -% \DescribeMacro{\rhatch} -% \DescribeMacro{\xhatch} % The hatching macros mostly take two optional parameters, the % separation of the hatching lines (default \cs{hatchspace}) and their % color. One slight exception is \cs{thatch}, which is called by all the % others. Its first optional argument is the separation \emph{and} the % angle (default $0$) of the lines, separated by a comma. The other -% hatching macros have a fixed angle. \cs{lhatch} has lines at a $-45$ -% degree angle (upper left to lower right), \cs{rhatch} produces the opposite -% diagonal, and \cs{xhatch} does both sets of lines (cross hatching). -% \begin{macrocode} - \newdef\thatch{\simple@opt\@thatch{\the\hatchspace,0}}% - \newdef\@thatch##1{\null@opt{\@@thatch{##1}}}% - \newdef\@@thatch##1[##2]{\@rendmac{% - \mfp@ifempty{##2}{thatch}{colorthatch (##2)} (##1)}}% - \newdef\lhatch{\simple@opt\@lhatch{\the\hatchspace}}% - \newdef\@lhatch##1{\@thatch{##1,-45}}% - \newdef\rhatch{\simple@opt\@rhatch{\the\hatchspace}}% - \newdef\@rhatch##1{\@thatch{##1,45}}% - \newdef\xhatch{\simple@opt\@xhatch{\the\hatchspace}}% - \newdef\@xhatch##1{\null@opt{\@@xhatch{##1}}}% - \newdef\@@xhatch##1[##2]{\@rendmac{% - \mfp@ifempty{##2}{xhatch}{colorxhatch (##2)} (##1)}}% - \newlet\hatch=\xhatch -% \end{macrocode} -% -% Commands that might conceivably interfere with small bits of \TeX{} -% code in labels have been renamed. Thus, instead of \cs{fill}, which is a -% \LaTeX{} text mode command, we have \cs{gfill}. We also have \cs{gclear} -% and \cs{gclip}. The `g' is for `graphic'. Later, commands that deal -% with text (labels and captions), have `t' prepended to their more -% natural name, thus \cs{tlabel} and \cs{tcaption}. +% hatching macros have a fixed angle. +% \DescribeMacro{\lhatch}\cs{lhatch} has lines at a $-45$ +% degree angle (upper left to lower right), +% \DescribeMacro{\rhatch}\cs{rhatch} produces the opposite +% diagonal (angle $45$ degrees), and \DescribeMacro{\xhatch}\cs{xhatch} +% does both sets of lines (cross hatching). +% \begin{macrocode} + \newdef\thatch{\mfp@defaultopt\mfp@thatch{\the\hatchspace,0}}% + \newdef\lhatch{\mfp@defaultopt\mfp@lhatch{\the\hatchspace}}% + \newdef\rhatch{\mfp@defaultopt\mfp@rhatch{\the\hatchspace}}% + \newdef\xhatch{\mfp@defaultopt\mfp@xhatch{\the\hatchspace}}% + \newlet\hatch\xhatch +% \end{macrocode} % % \DescribeMacro{\gfill} -% \DescribeMacro{\gclear} -% \DescribeMacro{\gclip} % \cs{gfill} take one optional argument, the color with which to fill. % Under \MF{} the color must be a numeric (representing a level of gray) % or one of the color functions, which are defined in \file{grafbase.mf} % to return numeric values. % +% \DescribeMacro{\gclear} % \cs{gclear} will actually fill with the color \texttt{background} in \MP. -% \cs{gclip} might seem to be the inverse of \cs{gclear} (clearing the -% outside of a region), but in \MP{} the mechanism is completely -% different. One wishes \MP{} had an `inverse clip' command to use -% instead of filling with \gbc{background}. The figure macro following -% these commands must be a closed path. +% This merely covers what originally was there. +% +% \DescribeMacro{\gclip} +% \cs{gclip} clears the outside of a region, but it is a true clip +% operation, completely different from \cs{gclear}. % \begin{macrocode} - \newdef\gfill{\null@opt\@gfill}% - \newdef\@gfill[##1]{% - \@rendmac{\mfp@ifempty{##1}{filled}{colorfilled (##1)}}}% - \newdef\gclear{\@rendmac{unfilled}}% - \newdef\gclip{\@rendmac{Clip}}% + \newdef\gfill{\mfp@nullopt{\mfp@clroptrend{filled}}}% + \newdef\gclear{\mfp@rendmac{unfilled}}% + \newdef\gclip{\mfp@rendmac{Clip}}% % \end{macrocode} % -% \subsubsection{Transforming a curve}\label{transforming} +% \subsubsection{Modifying a curve}\label{transforming} % -% The following are transformation prefixes. They are all but one -% implemented with \cs{@closmac} for reasons covered earlier. Most have a -% mandatory argument, the parameters of the transformation. Because of the -% implementation, one can insert rendering macros between a transformation -% macro and the path being transformed, and they will apply to the -% untransformed path. +% The following are transformation prefixes. They are all (except +% \cs{reverse}, for reasons covered in section~\ref{prefix}) implemented +% with \cs{mfp@modmac}. Most have a mandatory argument, the parameters of +% the transformation. Because of the implementation, one can insert +% rendering macros between a transformation macro and the path being +% transformed, and they will apply to the untransformed path. % -% If the \env{mfpic} environment has different x and y scales, the +% If the \env{mfpic} environment has different $x$ and $y$ scales, the % \cs{rotatepath} and \cs{reflectpath} compensates so that the result is -% congruent to the original. The others do not because this is what users -% seem to expect. +% congruent to the original. This is what users seem to expect. The rest +% do not compensate and users don't seem to mind. % \begin{itemize} % \item \cs{reverse} and \cs{xyswappath} have no argument. % \item \cs{rotatepath} takes \marg{\meta{point},\meta{angle}}. @@ -2966,68 +3887,159 @@ % \end{itemize} % % All of them simply write the \grafbase{} command of nearly the same -% name. -% \begin{macrocode} - \newdef\reverse{\@modmac{reverse}}% - \newdef\xyswappath{\@closmac{xyswappedpath}}% - \newdef\rotatepath##1{\@closmac{rotatedpath (##1)}}% - \newdef\shiftpath##1{\@closmac{shiftedpath (##1)}}% - \newdef\scalepath##1{\@closmac{scaledpath (##1)}}% - \newdef\xscalepath##1{\@closmac{xscaledpath (##1)}}% - \newdef\yscalepath##1{\@closmac{yscaledpath (##1)}}% - \newdef\slantpath##1{\@closmac{xslantedpath (##1)}}% +% name, with the same arguments, via +% \cs{mfp@modi}.\SpecialUsageIndex{\reverse} +% \SpecialUsageIndex{\xyswappath}\SpecialUsageIndex{\rotatepath} +% \SpecialUsageIndex{\shiftpath}\SpecialUsageIndex{\scalepath} +% \SpecialUsageIndex{\xscalepath}\SpecialUsageIndex{\yscalepath} +% \SpecialUsageIndex{\slantpath}\SpecialUsageIndex{\xslantpath} +% \SpecialUsageIndex{\yslantpath}\SpecialUsageIndex{\reflectpath} +% \SpecialUsageIndex{\transformpath} +% +% \begin{macrocode} + \newdef\reverse{\mfp@addmac{reverse}}% + \newdef\xyswappath{\mfp@modmac{xyswappedpath}}% + \newdef\rotatepath{\mfp@modi{rotatedpath}}% + \newdef\shiftpath{\mfp@modi{shiftedpath}}% + \newdef\scalepath{\mfp@modi{scaledpath}}% + \newdef\xscalepath{\mfp@modi{xscaledpath}}% + \newdef\yscalepath{\mfp@modi{yscaledpath}}% + \newdef\slantpath{\mfp@modi{xslantedpath}}% \newlet\xslantpath\slantpath - \newdef\yslantpath##1{\@closmac{yslantedpath (##1)}}% - \newdef\reflectpath##1{\@closmac{reflectedpath (##1)}}% - \newdef\transformpath##1{\@closmac{transformedpath (##1)}}% -% \end{macrocode} -% -% \subsubsection{Appending an arrowhead}\label{arrowhead} -% -% \DescribeMacro{\arrow} -% The four macros beginning \cs{@h} are assigned default values at the -% start and changed only if an option calls for it. -% Each option starts with a letter (The initial letters of -% `backset', `color', `length', or `rotate'), followed by a value -% to assign to the corresponding variable (defaulting to \mfc{0pt}, -% \meta{empty}, \cs{the}\cs{headlen} and \gbc{0 deg}). Then \cs{arrow} -% finishes with the invokation of \cs{@arrow}. -% \begin{macrocode} - \def\arrow{\def\@hbackset{0}\def\@hcolour{}% - \edef\@hlength{\the\headlen}\def\@hrotate{0}% - \@arrow}% -% \end{macrocode} -% -% \cs{@arrow} calls \cs{@arrowoption} if it finds an optional parameter. -% After processing the parameter, \cs{@arrowoption} calls \cs{@arrow} -% again. This loop will end when optional arguments run out. Then -% \cs{@@arrow} finishes with the actual \MF{} code. -% \begin{macrocode} - \newdef\@arrow{\mfp@ifnextchar[{\@arrowoption}{\@@arrow}}% - \newdef\@@arrow{% - \@modmac{% - \mfp@ifempty{\@hcolour}{headpath}{colorheadpath (\@hcolour)}% - \space(\@hlength, \@hrotate, \@hbackset)}}% -% \end{macrocode} -% -% Since the \cs{arrow} command takes up to 4 optional arguments in any -% order, we have this utility \cs{@arrowoption} which examines an option's -% contents and assigns a value to an appropriate macro. Since rather nasty -% error messages will result if the contents are empty, we test for this -% and do nothing when there is nothing to process. \cs{@@arrowoption} -% makes the appropriated definitions, then \cs{@arrow} is iterated to -% catch another optional parameter. -% \begin{macrocode} - \newdef\@arrowoption[##1]{% - \mfp@ifempty{##1}{}{\@@arrowoption##1\mfp@delim}\@arrow}% - \newdef\@@arrowoption##1##2\mfp@delim{% - \if l##1\relax \mfp@ifempty{##2}{}{\def\@hlength{##2}}% - \else\if r##1\relax \mfp@ifempty{##2}{}{\def\@hrotate{##2}}% - \else\if b##1\relax \mfp@ifempty{##2}{}{\def\@hbackset{##2}}% - \else\if c##1\relax \mfp@ifempty{##2}{}{\def\@hcolour{##2}}% - \else - \Mfpic@warn{Improper option to \string\arrow\@online .}% - \fi\fi\fi\fi}% + \newdef\yslantpath{\mfp@modi{yslantedpath}}% + \newdef\reflectpath{\mfp@modi{reflectedpath}}% + \newdef\transformpath{\mfp@modi{transformedpath}}% +% \end{macrocode} +% +% \DescribeMacro{\parallelpath} +% This is not an affine transformation, but is a transformation of sorts. +% It tries to define a curve that parallels the following curve at a fixed +% distance. The mandatory argument is the separation, in graph units. It +% is sort of experimental and will probably fail if the path that follows +% is too wild. Since \cs{doubledraw} shares code with \cs{parallelpath}, +% that too will probably fail in similar circumstances. +% \begin{macrocode} + \newdef\parallelpath{\mfp@modi{parapath}}% +% \end{macrocode} +% +% \DescribeMacro{\randomizepath} +% This, too, is a nonaffine transformation. It tries to define a curve +% that remains smooth if the original is, but applies random shifts to the +% nodes and random changes to the direction at each node. +% +% The only argument is mandatory and consists of a maximum shift (in graph +% units) and a `weirdness' (a pure number) separated by a comma. +% +% The maximum shift can be a number, in which case it is the maximum +% possible distance and there is no preferred direction, or it can be an +% ordered pair, in which case it gives maximum horizontal and vertical +% shift amounts. +% +% The `weirdness' is applied to path directions. If it is 0, there is no +% change in directions of the path at nodes. If it is a positive number +% $w$, a random angle of up to $\pm 30 w$ is added to the directions at +% each node. Also a random scaling between $2^{-w}$ and $2^w$ is applied +% to the control vectors. Also, if a path has a corner, the angle between +% the two sides is randomly adjusted to be between $2^{-w}$ and $2^w$ +% times its original size. +% +% \DescribeMacro{\randomlines} +% This is a simpler version whose mandatory argument contains only the +% maximum shift parameter. It shifts the nodes and connects the results +% with straight lines. +% \begin{macrocode} + \newdef\randomizepath{\mfp@modi{randompath}}% + \newdef\randomlines{\mfp@modi{randomlines}}% +% \end{macrocode} +% +% \DescribeMacro{\arccomplement} +% This can precede an arc and then returns its complement. It starts at +% the last point of the following arc and ends at the beginning of that +% arc. The sense of the resulting arc (clockwise or anticlockwise) is the +% same as the arc it is applied to. If the following path is not an arc, +% the result is an arc that connects the end of the path to the beginning, +% but may bear no obvious relation to that path. +% \begin{macrocode} + \newdef\arccomplement{\mfp@modmac{arccomplement}}% +% \end{macrocode} +% +% \subsubsection{Adding arrowheads (and tails)}\label{arrows} +% +% Paths can now have heads and tails and something placed in the +% middle. Also the head, tail or the `something' can be any symbol. In +% addition to the \cs{plotsymbol} possibilities, there is \gbc{Arrowhead}, +% which is the arrowhead of previous \mfpic{} versions, as well as +% \gbc{Leftharpoon} and \gbc{Rightharpoon}, which are the left and right +% halves. +% +% Intended for middle or tail of an arrow are \gbc{Crossbar}, \gbc{Leftbar} +% and \gbc{Rightbar}, and for the tail there are \gbc{Lefthook} and +% \gbc{Righthook}. \gbc{Crossbar} cuts right across the shaft +% (perpendicular unless a rotation option is present) while \gbc{Leftbar} +% extends to the left (from the point of view of someone facing in the +% direction of the path. Similarly \gbc{Lefthook} curls to the left of the +% arrow's shaft. +% +% All the new arrow commands take one mandatory argument, the name of the +% symbol, followed by up to four optional arguments. Three of the optional +% arguments are the same for all commands: these set the color, the size +% and the amount of rotation of the symbol. Normally the symbol is +% adjusted to `point' in the direction of the path (\gbc{Crossbar} is +% actually perpendicular to it); with the rotation option it can be +% adjusted. +% +% For example, \oarg{c red} makes the symbol red, \oarg{l 5pt} or \oarg{s +% 5pt} scales the symbol so its nominal size or length is 5 points, +% \oarg{r 10} rotates the symbol 10 degrees (anticlockwise) from its +% default position. +% +% The other optional argument depends on the command: for heads it is an +% amount to shift the head backward, for tails the amount to shift it +% forward, and for things placed in the middle, it is the fraction of the +% length of the path along which the symbol is placed. +% +% For example, \oarg{b 2pt} shifts a head two points backward, \oarg{f +% 2pt} shifts a tail 2 points forward and \oarg{f .5} puts the symbol +% right in the middle. +% +% The letters are mnemonics, being the initial letters of the words +% `color', `length' or `size', `rotate', `back', and `forward' or +% `fraction'. Actually, the letters \texttt{s} and \texttt{l} have +% identical effects since I couldn't decide which mnemonic was more +% natural. Oddly, \texttt{b} and \texttt{f} have identical effects also. +% So if you accidentally use \oarg{b 2pt} for a tail, it will still be +% shifted \emph{forward}! The reason for this is that these \mfpic{} +% commands all correspond to \grafbase{} commands that have the same +% argument structure. Both \texttt{b} and \texttt{f} simply cause the +% accompanying value to be written into the fourth argument, while the +% different commands use that argument differently. (You can shift a +% tail backwards with a negative argument, if you really need that.) +% +% \DescribeMacro{\arrowhead}\SpecialUsageIndex{\arrow} +% The \cs{arrowhead} command has a star-form which allows part of the +% path beyond the tip of the arrowhead to be erased. The presence of a +% star ultimately changes the \MF{} command passed on to later macros. +% It does so by passing to \cs{mfp@arrowhead} the word `\texttt{true}' for +% the star-form and `\texttt{false}' otherwise. +% +% The old \cs{arrow} command first checks for a star, and passes to +% \cs{mfp@arrow} either an `\texttt{x}' or an empty parameter. This is +% used to construct the \grafbase{} command name. We use \cs{def} +% because \prog{eplain} defines one also. +% \begin{macrocode} + \newdef\arrowhead{\mfp@ifstar\mfp@arrowhead\mfp@T\mfp@F}% + \def\arrow{\mfp@ifstar\mfp@arrow{x}{}}% +% \end{macrocode} +% +% \DescribeMacro{\arrowtail} +% Tails are just like heads except that there is no star-form and the +% \grafbase{} command name (second parameter of \cs{mfp@arr}) is +% different. And \DescribeMacro{\arrowmid}\cs{arrowmid} is just like +% \cs{arrowtail} except for the command name and the different default for +% the position optional argument. +% \begin{macrocode} + \newdef\arrowtail##1{\mfp@arr 0{tailpath (##1)}}% + \newdef\arrowmid##1{\mfp@arr{0.5}{midpath (##1)}}% % \end{macrocode} % % This ends the prefix macros. @@ -3035,24 +4047,30 @@ % \subsection{Transforming the coordinate system}\label{coordinate} % % \DescribeMacro{\coords} -% \DescribeMacro{\endcoords} % The following apply transforms to the \MF{} coordinate system, and -% these can be localized with \cs{coords} $\ldots$ \cs{endcoords}. The -% transforms apply when the curve is \emph{rendered} and have no effect -% on paths merely stored with \cs{store} and \cs{patharr}. Moreover, if a -% path is created with \cs{connect}, it is transformed as a whole. +% these can be localized with the \env{coords} environment. In plain +% \TeX{} \cs{coords} starts the environment and +% \DescribeMacro{\endcoords}\cs{endcoords} closes it. The transforms +% apply when the curve is \emph{rendered} and do not affect what paths are +% defined. Thus, for example, \cs{store} will store the same path +% whatever the state of the coordinate system. In terms of \grafbase{} +% commands, only \gbc{vtr} and \gbc{ztr} are changed, and these are only +% applied when rendering. % % \DescribeMacro{\applyT} % These are implemented by \cs{applyT} which takes as its argument a \MF{} % `transformer'. % % These commands (except \cs{turn}, kept for backward compatibility) have -% at most one argument, the parameters of the transformation. \cs{rotate} -% rotates around the origin, \cs{rotatearound} rotates around a given -% point, \cs{turn} takes the point as an optional argument. +% no optional arguments, only mandatory arguments containing the +% parameters of the transformation. \cs{rotate} rotates around the origin, +% \cs{rotatearound} rotates around a given point, \cs{turn} takes the point +% as an optional argument, defaulting to $(0,0)$. % % Transformations are applied in reverse of the order they appear in the -% file (i.e., the most recent first). +% file (i.e., the most recent first). This applies even if \env{coords} +% environments are nested, except that at \cs{endcoords} the state at +% the matching \cs{coords} is restored. % \begin{macrocode} \newdef\coords{\mfsrc{\@nl bcoords\@nl}}% \newdef\endcoords{\mfsrc{\@nl ecoords\@nl}}% @@ -3060,11 +4078,9 @@ \def\rotate##1{\applyT{rotated ##1}}% \newdef\rotatearound##1##2{% \applyT{rotatedaround (##1, ##2)}}% - \newdef\turn{\simple@opt\@turn{(0,0)}}% - \newdef\@turn##1##2{\rotatearound{##1}{##2}}% - \newdef\reflectabout##1##2{% - \applyT{reflectedabout (##1, ##2)}}% line ##1--##2. - \let\mirror=\reflectabout + \newdef\turn{\mfp@defaultopt\mfp@turn{(0,0)}}% + \newdef\reflectabout##1##2{\applyT{reflectedabout (##1, ##2)}}% + \let\mirror\reflectabout \newdef\shift##1{\applyT{shifted ##1}}% pair. \def\scale##1{\applyT{scaled ##1}}% same scaling \newdef\xscale##1{\applyT{xscaled ##1}}% @@ -3079,28 +4095,24 @@ % % \subsection{Axes and grids}\label{axes} % -% \DescribeMacro{\axes} -% \DescribeMacro{\xaxis} -% \DescribeMacro{\yaxis} % An axis would normally not be thought of as a figure macro, because one % would not want to position them arbitrarily nor transform them. One % would also not want the hassle of having always to specify the origin, % etc. However, one would want to occasionally make them dotted or dashed % or colored. % +% \DescribeMacro{\axes} % The original \cs{axes} was therefore not a figure macro. It always drew -% both axes with solid lines. Later \cs{xaxis} and \cs{yaxis} were -% introduced, which mimicked the behavior of \cs{axes}. For backward -% compatibility, the old behavior is supported with the old commands. The -% optional argument to \cs{axes}, \cs{xaxis} and \cs{yaxis} is the length -% of the arrowhead, defaulting to \cs{the}\cs{axisheadlength}. +% both axes with solid lines. \DescribeMacro{\xaxis}Later \cs{xaxis} and +% \cs{yaxis} were introduced, which mimicked the behavior of \cs{axes}. +% For backward \DescribeMacro{\yaxis}compatibility, the old behavior is +% supported with the old commands. The optional argument to \cs{axes}, +% \cs{xaxis} and \cs{yaxis} is the length of the arrowhead, defaulting to +% \cs{the}\cs{axisheadlen}. % \begin{macrocode} - \newdef\xaxis{\simple@opt\@xaxis{\the\axisheadlen}}% - \newdef\yaxis{\simple@opt\@yaxis{\the\axisheadlen}}% - \newdef\axes{\simple@opt\@axes{\the\axisheadlen}}% - \newdef\@axes##1{\mfcmd{\@nl axes (##1)}}% - \newdef\@xaxis##1{\mfcmd{\@nl xaxis (##1)}}% - \newdef\@yaxis##1{\mfcmd{\@nl yaxis (##1)}}% + \newdef\xaxis{\mfp@defaultopt{\mfp@simple{xaxis}}{\the\axisheadlen}}% + \newdef\yaxis{\mfp@defaultopt{\mfp@simple{yaxis}}{\the\axisheadlen}}% + \newdef\axes{\mfp@defaultopt {\mfp@simple{axes}}{\the\axisheadlen}}% % \end{macrocode} % % \DescribeMacro{\axis} @@ -3108,59 +4120,51 @@ % create axes as figure macros. It also became clear there was so % much common code that it would be better to implement the syntax % \cs{axis}\marg{l}, etc., rather than have separate commands \cs{laxis}, -% etc. for all six possible axes. Therefore, only the x- and y-axes have -% their own commands. The \cs{axis} command has one optional argument +% etc. for all six possible axes. Therefore, only the $x$- and $y$-axes +% have their own commands. The \cs{axis} command has one optional argument % (the arrowhead length) and one mandatory argument, a single letter % designating the axis to draw. % -% The only complication is that the x- and y-axis have one default head -% length, \cs{axisheadlength} (initially \texttt{5pt}), while the side -% axes have a different default, \cs{sideheadlength} (initially \texttt{0pt}). -% Therefore we don't know which default to use until the mandatory argument -% is read. In \cs{@@axis}, we use \cs{get@axisnum} to check this -% mandatory argument and convert it to a number \cs{mfp@axisnum}, which is -% used to select the head length. +% \DescribeMacro{\axisline}The \cs{axisline} command is provided for users +% who want more control. It is a figure macro that produces the +% corresponding line, and the user can use all the flexibility of the +% \cs{arrowhead} command if necessary. % \begin{macrocode} - \newdef\axis{\null@opt\@axis}% - \newdef\@axis[##1]##2{\get@axisnum{##2}\axis - \mfp@ifempty{##1}% - {\edef\mfp@param{% - \ifnum\mfp@axisnum<2 \the\axisheadlen - \else \the\sideheadlen - \fi}\@@axis{\mfp@param}}{\@@axis{##1}}{##2}}% - \newdef\@@axis##1##2{\arrow[l##1]\@figmac{axisline.##2}}% + \newdef\axis{\mfp@nullopt\mfp@axis}% + \newdef\axisline##1{\mfp@figmac{axisline.##1}}% % \end{macrocode} % % \DescribeMacro{\doaxes} % \cs{doaxes} takes one optional argument, the arrowhead length, and one % mandatory argument, all the axes to draw. These should be just letters % with nothing separating them except optional spaces. \cs{doaxes} is -% implemented via the self-looping macro \cs{do@axis}, which applies -% one of two commands to the letter, depending on whether the optional -% parameter was present (\cs{@axis}) or not (\cs{@@axis}). +% implemented via the self-looping macro \cs{mfp@doaxis}. +% +% \DescribeMacro{\border}The \cs{border} command is almost equivalent to +% \cs{doaxes}\marg{lbrt}, except it is a figure macro. With it, the +% whole picture can be filled with a background color, or outlined in any +% available rendering. % \begin{macrocode} - \newdef\doaxes{\null@opt\@doaxes}% - \newdef\@doaxes[##1]##2{\def\mfp@axis{\@axis[##1]}% - \do@axis##2\mfp@delim}% - \newdef\do@axis##1{% - \ifx\mfp@delim##1\relax\else\mfp@axis{##1}\@xp\do@axis\fi}% + \newdef\doaxes{\mfp@nullopt\mfp@doaxes}% + \newdef\border{\mfp@figmac{borderrect}}% % \end{macrocode} % % \DescribeMacro{\axismarks} -% \DescribeMacro{\xmarks} -% \DescribeMacro{\ymarks} -% \DescribeMacro{\lmarks} -% \DescribeMacro{\bmarks} -% \DescribeMacro{\rmarks} -% \DescribeMacro{\tmarks} % Hash marks (or tick marks) on the axes are provided by the % \cs{axismarks} command (\cs{marks} was the original choice, but that -% turned out to conflict with a primative of e\TeX). For brevity, therefore, -% we also have separate commands \cs{xmarks}, etc. \cs{axismarks} has two -% mandatory arguments: the letter for the axis, and a comma separated -% list of numbers giving the positions on the axis. It functions as a list -% macro (see previous discussion of types of macros) and so the list of -% numbers can be prescribed by an external file +% turned out to conflict with one of e\kern-.06em\TeX's primitives). +% For brevity, therefore, we also have separate commands +% \DescribeMacro{\xmarks}\cs{xmarks}, +% \cs{ymarks}\SpecialUsageIndex\ymarks, +% \cs{lmarks}\SpecialUsageIndex\lmarks, +% \cs{bmarks}\SpecialUsageIndex\bmarks, +% \cs{rmarks}\SpecialUsageIndex\rmarks, and +% \cs{tmarks}\SpecialUsageIndex\tmarks. +% +% \cs{axismarks} has two mandatory arguments: the letter for the axis, and +% a comma separated list of numbers giving the positions on the axis. It +% functions as a list macro (see previous discussion of types of macros) +% and so the list of numbers can be prescribed by an external file % \cs{datafile}\marg{\meta{file}}. One must be sure to issue an % appropriate \cs{using} command to produce a numeric list in the output. % This is the main reason for the \cs{usingnumericdefault} command. @@ -3172,10 +4176,9 @@ % first argument (that is, the expectation that optional arguments come % first is still satisfied). The optional argument is the length of the % marks. The position of the marks is controlled separately by the -% \cs{setaxismarks} command, described previously. +% \cs{setaxismarks} command, described in section~\ref{othersettings}. % \begin{macrocode} - \newdef\axismarks##1{\simple@opt{\@marks{##1}}{\the\hashlen}}% - \newdef\@marks##1##2{\mfsrc{\@nl ##1marks (##2)}\mfp@writedata}% + \newdef\axismarks##1{\mfp@defaultopt{\mfp@marks{##1}}{\the\hashlen}}% \newdef\xmarks{\axismarks x}% \newdef\ymarks{\axismarks y}% \newdef\lmarks{\axismarks l}% @@ -3185,73 +4188,95 @@ % \end{macrocode} % % \DescribeMacro{\grid} -% \DescribeMacro{\gridpoints} -% \DescribeMacro{\lattice} -% The first one is, I think, inaccurately named: the word `grid' calls -% to mind a set of lines. It functions in a similar way: allowing a -% visualization of the coordinates, but it actually produces dots. The -% dots are located at the points whose coordinates are integer multiples -% of two numbers, which are given in the single mandatory argument -% separated by commas. The optional first argument is the diameter of the -% dots this defaults to \texttt{0.5bp} (hard coded in \file{grafbase}). -% Because of the name, I have provided two aliases: \cs{gridpoints} -% (for consistency with \cs{gridlines}, below) and \cs{lattice}. +% The command \cs{grid} is, I think, inaccurately named: the word `grid' +% suggests a set of lines, but this actually produces dots. Its function +% is to allow a visualization of the coordinates. The dots are located at +% the points whose coordinates are integer multiples of two numbers, which +% are given in the single mandatory argument separated by commas. The +% optional first argument is the diameter of the dots. This defaults to +% \cs{griddotsize}, initially \texttt{0.5pt}. +% +% Because of my concerns about the name, I have provided two aliases: +% \cs{gridpoints}\SpecialUsageIndex{\gridpoints} (for consistency with +% \cs{gridlines}, below) and \cs{lattice}\SpecialUsageIndex{\lattice}. % % \DescribeMacro{\gridlines} -% Macro \cs{gridlines} takes the same mandatory argument and draws -% horizontal and vertical lines intersecting at all the dots that -% \cs{grid} would draw. Some packages (and \ConTeXt) define a \cs{grid} -% command so we use \cs{def} here instead of \cs{newdef} or \cs{redef}. +% Macro \cs{gridlines} has no optional argument and takes the same +% mandatory argument as \cs{grid}. It draws horizontal and vertical lines +% intersecting at all the dots that \cs{grid} would draw. Some packages +% (and \ConTeXt) define a \cs{grid} command so we use \cs{def} here +% instead of \cs{newdef}. % % \DescribeMacro{\hgridlines} +% This draws only the horizontal lines and its argument is the separation +% (in graph units) between successive lines. % \DescribeMacro{\vgridlines} -% These two draw only the horizontal or vertical lines, and their -% argument is the separation (in graph units) between successive lines. +% \cs{vgridlines} is the vertical version. +% +% No arguments are shown because \cs{mfp@simple} or \cs{mfp@simpli} will +% read what it needs. % \begin{macrocode} - \def\grid{\null@opt\@grid}% - \newdef\@grid[##1]##2{% - \mfcmd{\mfp@ifempty{##1}{grid}{vgrid (##1)} (##2)}}% - \newlet\gridpoints=\grid \newlet\lattice=\grid - \newdef\gridlines##1{\mfcmd{\@nl gridlines (##1)}}% - \newdef\vgridlines##1{\mfcmd{\@nl vgridlines (##1)}}% - \newdef\hgridlines##1{\mfcmd{\@nl hgridlines (##1)}}% + \def\grid{\mfp@defaultopt{\mfp@simplei{vargrid}}{\the\griddotsize}}% + \newlet\gridpoints\grid \newlet\lattice\grid + \newdef\gridlines{\mfp@simple{gridlines}}% + \newdef\vgridlines{\mfp@simple{vgridlines}}% + \newdef\hgridlines{\mfp@simple{hgridlines}}% % \end{macrocode} % % \DescribeMacro{\plrgrid} +% The command \cs{plrgrid} takes one mandatory argument which contains two +% numbers separated by a comma. The first is a radius (in graph +% coordinates) and the second an angle. It draws circular arcs at integer +% multiples of the radius, and radial lines at integer multiples of the +% angle. It fills the picture rectangle and is clipped to that rectangle. +% % \DescribeMacro{\plrgridpoints} -% \DescribeMacro{\gridarcs} -% \DescribeMacro{\gridrays} +% \cs{plrgridpoints} is similar but places only dots at the intersections +% of these arcs and rays. It takes an optional argument for the size of +% the dots, default \cs{griddotsize}. \DescribeMacro{\gridarcs}\cs{gridarcs} +% draws only the arcs. Its only parameter is the distance between them (in +% graph units). \DescribeMacro{\gridrays}\cs{gridrays} draws only the rays +% and its parameter is the angle separating the rays. +% % \DescribeMacro{\plrpatch} -% The command \cs{plrgrid} takes one mandatory argument which contains two -% numbers separated by a comma. The first is a radius and the second an -% angle. It draws circular arcs at integer multiples of the radius, and -% radial lines at integer multiples of the angle. It fills the -% picture rectangle and is clipped to that rectangle. \cs{plrgridpoints} -% is similar but places only dots at the intersections of these arcs and -% rays. It takes an optional argument for the size of the dots, normally -% \cs{dotsize}. \cs{gridarcs} draws only the arcs, \cs{gridrays} only the -% rays. These last two take only one parameter each: the radius separating -% the arcs, and the angle separating the rays. -% -% \cs{plrpatch} draws: a circular arc at a starting -% radius, then increments that radius by a step size and draws another -% arc, etc., and finally draws an arc at the ending radius. It does a similar -% thing for radial lines and angles. It takes one mandatory argument, -% which contains 6 numbers separated by commas: starting radius, ending -% radius, step size, starting angle, ending angle, step size. -% \begin{macrocode} - \newdef\plrgrid##1{\mfcmd{\@nl polargrid (##1)}}% - \newdef\plrgridpoints{\simple@opt\@plrgp{\the\dotsize}}% - \newdef\@plrgp##1##2{\mfcmd{\@nl polargridpoints (##1, ##2)}}% - \newdef\gridarcs##1{\mfcmd{\@nl gridarcs (##1)}}% - \newdef\gridrays##1{\mfcmd{\@nl gridrays (##1)}}% - \newdef\plrpatch##1{\mfcmd{\@nl polarpatch (##1)}}% +% \cs{plrpatch} draws: a circular arc at a starting radius, then +% increments that radius by a step size and draws another arc, etc., and +% finally draws an arc at the ending radius. It does a similar thing for +% radial lines and angles. It takes one mandatory argument, which contains +% $6$ numbers separated by commas: starting radius, ending radius, radius +% step, starting angle, ending angle, angle step. +% \begin{macrocode} + \newdef\plrgrid{\mfp@simple{polargrid}}% + \newdef\plrgridpoints{% + \mfp@defaultopt{\mfp@simplei{polargridpoints}}{\the\griddotsize}}% + \newdef\gridarcs{\mfp@simple{gridarcs}}% + \newdef\gridrays{\mfp@simple{gridrays}}% + \newdef\plrpatch{\mfp@simple{polarpatch}}% +% \end{macrocode} +% +% \DescribeMacro{\vectorfield}The \cs{vectorfield} command draws arrows to +% represent a vector field. It takes one optional argument, the length of +% the arrowhead (default \cs{headlen}), and three mandatory arguments. The +% first is like \cs{grid}: it contains two numbers, separated by commas. +% The arrows are located at the points whose coordinates are integer +% multiples of two numbers. The second argument is the formula for the +% vector field. It should consist of a pair expression in which the only +% unknowns are the variables \texttt{x} and \texttt{y}. The last argument +% should contain a boolean expression in which the only unknowns are +% \texttt{x} and \texttt{y}. The macro steps through the relevant set of +% points and draws the vector only if the boolean is true at that point. +% The set of points considered includes only those inside the axis margins +% (set by \cs{axismargin} and related commands). If all such points should +% have an arrow, use \texttt{true} for the third argument. +% \begin{macrocode} + \newdef\vectorfield{\mfp@defaultopt{\mfp@vectorfield{}}{\the\headlen}} + \newdef\plrvectorfield{% + \mfp@defaultopt{\mfp@vectorfield{plr}}{\the\headlen}} % \end{macrocode} % % \subsection{Visualizing points}\label{points} % % \DescribeMacro{\point} -% \DescribeMacro{\plotsymbol} % \cs{point} draws a dot or a small circle. It takes one optional % argument, the diameter of the dot, and one mandatory argument, the ordered % pair (or comma separated list of them) at which to draw a dot. After @@ -3260,6 +4285,7 @@ % grid macros, it is not a figure macro, but merely does its drawing and % is not subject to any prefix macros. % +% \DescribeMacro{\plotsymbol} % In order to mark points with other than circles, we have the % \cs{plotsymbol} command, so-called because it uses the same symbols as % the \cs{plot} command (previously discussed). There is an optional @@ -3268,432 +4294,32 @@ % is a comma separated list of ordered pairs for the locations. % % For both these commands, the default optional argument is -% \cs{the}\cs{pointsize}. +% \cs{the}\cs{pointsize}. These are list macros: in place of a list of +% points in braces, one can use the \cs{datafile} construct. % \begin{macrocode} - \newdef\point{\simple@opt\@point{\the\pointsize}}% - \newdef\@point##1{% - \mfsrc{\@nl pointd (##1, \ifpointfill\mf@T\else\mf@F\fi)}% - \mfp@writedata}% - \newdef\plotsymbol{\simple@opt\@plotsymbol{\the\pointsize}}% - \newdef\@plotsymbol##1##2{% - \mfsrc{\@nl plotsymbol (##2, ##1)}\mfp@writedata}% + \newdef\point{\mfp@defaultopt\mfp@point{\the\pointsize}}% + \newdef\plotsymbol{\mfp@defaultopt\mfp@plotsymbol{\the\pointsize}}% % \end{macrocode} % % \DescribeMacro{\plottext} -% In \MP{}, \TeX{} labels can be used in place of the symbols in -% \cs{plotsymbol}. Moreover, multiple copies of text can be placed with -% the \cs{tlabel} command (under \opt{mplabels}), as it supports a list of -% points for the location parameter. For \MF{} we supply an alternative, -% \cs{plottext}, which loops through the list of coordinates and issues -% \cs{tlabel} commands. The text can be anything that works in \cs{tlabel}. -% -% It takes one optional argument, the justification of the text (as in the -% \cs{tlabel command}, below---see also \cs{tlabeljustify}, above), -% defaulting to \oarg{cc}. There are two mandatory arguments: the text, -% and a comma separated list of ordered pairs. For consistency with -% \cs{plotsymbol} (and because it works better), we now require the same -% syntax for the points (i.e., no braces around individual points in the -% list as are allowed in \cs{tlabel} commands). -% -% We start by handling the justification, resetting whitespace, -% and loading the text into a token register. Then we read the list of -% points with \cs{@@plottext}. Under \opt{mplabels} we process the whole -% list with a single \cs{tlabel} command. Otherwise we prepare to loop -% through the list of points. The \cs{begingroup} in \cs{@plottext} is -% ended by the command called in \cs{@@plottext}. -% \begin{macrocode} - \newdef\plottext{\simple@opt\@plottext{cc}}% - \newdef\@plottext##1{% - \begingroup - \mfp@resetwhitespace \tlabeljustify{##1}% - \@ifmplabels{\@makeother\#}{}% - \mfp@gettoks\@@plottext}% - \newdef\@@plottext##1{% - \@ifmplabels - {\mfp@setMPpos \def\mfp@points{##1}\@@@tlabel}% - {\@@@plottext##1,\mfp@delim}}% -% \end{macrocode} -% After reading the list of points and appending ending tokens, we -% loop through them. The ending condition is that the next token is -% \cs{mfp@delim}. Otherwise we read the coordinates as delimited macros, -% and call \cs{@tlabel}, feeding it the coordinates and the text to -% plot there (the \cs{begingroup} in \cs{x@plottext} matches the -% \cs{endgroup} in \cs{@tlabel}). Then we recall \cs{@@@plottext} for -% another loop. Since we have used two internal commands of \cs{tlabel} -% code, we have to remember to check this if ever we rewrite \cs{tlabel}. -% \begin{macrocode} - \newdef\@@@plottext{% - \mfp@ifnextchar\mfp@delim{\@firstoftwo\endgroup}{\x@plottext}}% - \newdef\x@plottext(##1,##2),{\begingroup - \@tlabel{##1}{##2}{\the\mfp@toks}\@@@plottext}% -% \end{macrocode} -% -% \subsection{Figure macros}\label{figure} -% -% \subsubsection{Common geometric objects}\label{geometric} -% -% Finally we get to the real figure macros. These are implemented as -% \MF{} paths that can be variously rendered, transformed, etc., with the -% prefix macros. -% -% The first few (\cs{rect} through \cs{makesector}) are closed paths and -% need not be prefixed with a closing macro before filling, etc. -% -% \DescribeMacro{\rect} -% This takes one mandatory argument, the two diagonally opposite -% corners of the rectangle separated by a comma, and draws the rectangle -% with horizontal and vertical sides having these as two corners. The -% direction of the path (which seldom makes a difference) is such that it -% starts at the first specified point and moves horizontally first. -% \begin{macrocode} - \newdef\rect##1{\@figmac{rect (##1)}}% -% \end{macrocode} -% -% \DescribeMacro{\regpolygon} -% There are four arguments. The first is the number of sides. The second -% is the name of a variable to represent the vertices. The other -% two should be equations locating two vertices or the center and one -% vertex. If the name used is \gbc{Ver}, then the vertices will be -% \gbc{Ver1}, \gbc{Ver2}, etc., numbering anticlockwise. The center is -% \gbc{Ver0}. Case is significant. After the command, the points can be -% referred to in other \mfpic{} commands (except text label commands -% when \opt{mplabels} is not in effect). -% \begin{macrocode} -\newdef\regpolygon##1##2##3##4{% - \@figmac{regularpolygon(##1)(##2)(##3;##4;)}}% -% \end{macrocode} -% -% \DescribeMacro{\circle} -% This has one optional argument containing one of the letters -% \texttt{t}, \texttt{p} (the default), \texttt{c}, or \texttt{s}. Its -% purpose is to specify what kind of data is in the single mandatory -% argument. These are a subset of the optional arguments that the \cs{arc} -% commad (below) takes, and have almost the same meaning: -% \begin{itemize} -% \item \oarg{t}, the three point form needs three points (of course). -% \item \oarg{p}, the polar form needs the center point and the radius. -% This is the default when the optional argument is absent. -% \item \oarg{c}, the center/point form needs the center and one point on -% the circle. -% \item \oarg{s}, the point-sweep form requires two points and the angle of -% arc between them. The angle may be positive or negative. A -% positive angle indicates the number of degrees anticlockwise from -% the first point to the second. Negative means clockwise. -% \end{itemize} -% -% Supplying \cs{arc} with the same parameters, or the appropriate superset -% in the case of \oarg{p} and \oarg{c}, would produce a sub-arc of the -% circle that \cs{circle} produces. This is the reason for giving -% \cs{circle} these options: to make diagrams which show a circle and an -% arc on it. (This can also be done with an ellipse by using a -% transform on a circle and its arc. -% -% We use \cs{def} instead of \cs{newdef} or \cs{redef} because we know -% \LaTeX{} has already defined a \cs{circle} command, but plain \TeX{} has -% not. Instead of passing the default \texttt{p}, we pass a null -% argument, causing the code to compare various letters to \cs{relax} -% (always false) and then execute the default code. -% \begin{macrocode} - \def\circle{\null@opt\circl@}% - \newdef\circl@[##1]##2{% - \if t##1\relax \@figmac{circleppp (##2)}% - \else\if c##1\relax \@figmac{circlecp (##2)}% - \else\if s##1\relax \@figmac{circlepps (##2)}% - \else \@figmac{circle (##2)}% - \fi\fi\fi}% -% \end{macrocode} -% -% \DescribeMacro{\ellipse} -% \cs{ellipse} has one optional argument, an angle of rotation and one -% mandatory argument, containing the center, the horizontal radius (before -% rotation) and the vertical radius, separated by commas. +% We keep \cs{plottext} for backward compatability. It is equivalent +% to a \cs{tlabel} command with a different default for the justification +% (\oarg{cc}) and the arguments rearranged. The order for \cs{plottext} +% is: optional justification, then \TeX{} label, then list of points. +% Because of the complication involved in making it work, in this case we +% do not allow a datafile to replace the list of points. All this +% command now does is perform a simplified version of the start of the +% \cs{tlabel} command and jump to one of its internals, \cs{mfp@thelabel}. % \begin{macrocode} - \newdef\ellipse{\simple@opt\@ellipse{0}}% - \newdef\@ellipse##1##2{\@figmac{ellipse (##2, ##1)}}% -% \end{macrocode} -% -% \DescribeMacro{\sector} -% This is the closed curve starting at the center of a circle, out -% along a radius to the circumference of the circle, along an arc of the -% circle, then back to the center. It has one mandatory argument -% containing the center, the radius, and the two angles, separated by -% commas. -% -% \DescribeMacro{\makesector} -% Takes a following arc and draws the sector (even if the center point -% is not known). It is really a prefix macro (closing an arc with two -% straight lines), but the combination \cs{makesector}\cs{arc} acts like a -% figure. -% \begin{macrocode} - \newdef\sector##1{\@figmac{sector (##1)}}% - \newdef\makesector{\@closmac{makesector}}% -% \end{macrocode} -% -% \DescribeMacro{\arc} -% A circular arc can be specified in several ways and we support most of -% them. \cs{arc} takes an optional argument: a letter to indicate which -% specification. It has one mandatory argument containing the data for -% that specification, separated by commas. -% -% The available letters and the corresponding required data are: -% \begin{itemize} -% \item \oarg{t}, the three point form needs three ordered pairs. -% \item \oarg{p}, the polar form needs the center point, two angles and -% the radius. -% \item \oarg{a}, the alternative polar form needs the center, the radius -% and two angles. -% \item \oarg{c}, the center-point-sweep form needs the center, the -% starting point, and the angle. -% \item \oarg{s}, the point-sweep form requires the starting point, the -% ending point and the angle. -% \end{itemize} -% -% The default optional argument is \oarg{s}. (I don't know why. It -% certainly doesn't seem the most natural. I would have picked \oarg{a}.) -% Like \cs{circle}, an empty argument is passed by default. -% \begin{macrocode} - \newdef\arc{\null@opt\@arc}% - \newdef\@arc[##1]##2{% - \if t##1\relax \@figmac{arcppp (##2)}% - \else\if p##1\relax \@figmac{arcplr (##2)}% - \else\if a##1\relax \@figmac{arcalt (##2)}% - \else\if c##1\relax \@figmac{arccps (##2)}% - \else \@figmac{arcpps (##2)}% - \fi\fi\fi\fi}% -% \end{macrocode} -% -% \DescribeMacro{\plr} -% \DescribeMacro{\midpoint} -% A little utility to convert a list of pairs into another list of -% pairs, where the given list are assumed to be polar coordinates and the -% results are their Cartesian counterparts. And one to calculate the -% midpoint, given two points separated by a comma. -% \begin{macrocode} - \newdef\plr##1{map (polar) (##1)}% - \newdef\midpoint##1{(0.5[##1])}% -% \end{macrocode} -% -% \subsubsection{List macros}\label{list} -% -% The next several figure macros are all list macros. They draw a path -% determined by a list of points. The list can be explicitly given as a -% mandatory argument containing a comma-separated list of ordered pairs, -% or it can be taken from an external datafile. This is true for -% \cs{polyline} through \cs{turtle}. These macros differ only in -% how the points determine the path. (The splines don't actually connect -% the points given, but rather use the points in a different way to -% determine a curve.) The list of points is not an argument of any of -% these. It should follow, and is picked up and written to output by the -% ending code of \cs{@listmac}. This is basic to list macros, and will not -% be repeated for each one. -% -% \DescribeMacro{\polyline} -% \DescribeMacro{\polygon} -% The most basic, a polyline or polygonal path, \cs{polyline} -% draws line segments from each point to the next. \cs{lines} is an -% alias. \cs{polygon} does the same, except it closes the path by -% connecting the last point to the first. -% -% In \cs{@polyline}, the argument is \mfc{true} or \mfc{false}, -% indicating whether the path is to be closed. -% \begin{macrocode} - \newdef\polyline{\@polyline\mf@F}% - \newlet\lines=\polyline - \newdef\polygon{\@polyline\mf@T}% - \newdef\@polyline##1{\@listmac{polyline (##1)}}% -% \end{macrocode} -% -% \DescribeMacro{\curve} -% \DescribeMacro{\cyclic} -% \cs{curve} draws a smooth curve connecting a list of points. it arranges -% for the curve, at point $p\sb n$ to be traveling parallel to the direction -% from $p\sb {n-1}$ to $p\sb {n+1}$ (except at the first and last point). -% -% \cs{cyclic} is similar, except the curve is closed, and at the first -% point it also travels parallel to the direction from the previous point -% (the last one listed) to the next. -% -% There is an optional argument, which is the tension. This is a number -% greater than .75. The larger it is, the closer to a polyline one gets. -% The default is 1 (set in \file{grafbase}) or more generally, the value -% set by \cs{settension}. -% \begin{macrocode} - \newdef\curve {\null@opt{\@curve\mf@F}}% - \newdef\cyclic{\null@opt{\@curve\mf@T}}% - \newdef\@curve##1[##2]{% - \@listmac{\mfp@ifempty{##2}{curve}{tcurve (##2)} (##1)}}% -% \end{macrocode} -% -% \DescribeMacro{\fcncurve} -% A `function curve' is the graph of a function of $x$. It should always -% travel left to right. This is not guaranteed by the \cs{curve} macro, -% above, even if the x-coordinates are listed in order. \cs{fcncurve} is -% guaranteed to do this if the list of points has the x-coordinates so -% ordered. -% -% The optional argument is called tension. Internally, it is not quite the -% same as the tension argument to \cs{curve}, but it also governs how -% closely the curve stays to the corresponding polyline. If the optional -% argument is missing, this command uses $1.2$ (more precisely, it uses -% $1.2$ times the value set with \cs{settension}). The above guarantee is -% voided if the value used is less than $1$. However, most curves will -% satisfy the guarantee with some lower values. -% \begin{macrocode} - \newdef\fcncurve{\null@opt\@fcncurve}% - \newdef\@fcncurve[##1]{% - \@listmac{\mfp@ifempty{##1}{fcncurve}{functioncurve (##1)}}}% -% \end{macrocode} -% -% \DescribeMacro{\qspline} -% \DescribeMacro{\closedqspline} -% \DescribeMacro{\cspline} -% \DescribeMacro{\closedcspline} -% These are supposed to be types of splines, about which I know only a -% little. The list or datafile that should follow each command should -% contain not the points passed through, but instead the control data. -% For quadratic B-splines the points create the path as follows: for -% successive points $p\sb i, p\sb {i+1}$ in the list, the path passes through -% the midpoint of the line segment connecting $p\sb i$ and $p\sb {i+1}$, tangent -% to that line segment. -% -% Cubic splines determine the curve as follows: for successive points -% $p\sb i, p\sb {i+1}$ in the list, the line segment connecting them is divided -% into thirds with two points $q\sb i$ and $q\sb i'$. The curve then passes -% through the midpoint of the segment from $q\sb {i-1}'$ to $q\sb i$ and tangent -% to that segment. -% -% `Control' is obtained as follows: the farther apart the points $p\sb i$ -% and $p\sb {i+1}$ (quadratic) or $q\sb {i-1}'$ and $q\sb i$ (cubic) the -% less the curvature of the curve at the midpoint. -% -% The `\texttt{q}' versions produce quadratic splines, the `\texttt{c}' -% versions produce cubic splines. -% \begin{macrocode} - \newdef\qspline{\@listmac{openqbs}}% - \newdef\closedqspline{\@listmac{closedqbs}}% - \newdef\cspline{\@listmac{opencbs}}% - \newdef\closedcspline{\@listmac{closedcbs}}% -% \end{macrocode} -% -% \DescribeMacro{\mfbezier} -% \DescribeMacro{\closedmfbezier} -% These produce the standard \MF{} cubic B\'ezier (the connection is -% \mfc{..} unless the optional argument is used) with tension given by -% an optional argument. A mandatory argument (not shown) contains the -% list of points. -% -% \DescribeMacro{qbeziers} -% \DescribeMacro{closedqbeziers} -% These produce the equivalent of a sequence of \LaTeX{} \cs{qbezier} -% commands. The mandatory argument will be a list of points alternating -% between nodes and control points. Note that quadratic B\'eziers need -% not be smooth at the nodes unless the control points line up. Our -% plural name distinguishes it from the \LaTeX{} command. -% \begin{macrocode} - \newdef\mfbezier{\null@opt{\@mfbezier\mf@F}}% - \newdef\closedmfbezier{\null@opt{\@mfbezier\mf@T}}% - \newdef\@mfbezier##1[##2]{% - \@listmac{\mfp@ifempty{##2}{bezier}{tbezier (##2)} (##1)}}% - \newdef\qbeziers{\@listmac{qbezier (\mf@F)}}% - \newdef\closedqbeziers{\@listmac{qbezier (\mf@T)}}% -% \end{macrocode} -% -% \DescribeMacro{\turtle} -% Many years ago there was a tool for teaching programming concepts to -% young children. They could draw a figure on a screen by programming a -% `turtle' with a sequence of turns and distances. The following is -% similar. It has a mandatory argument containing a list of ordered pairs. -% The first is the coordinates of the starting point, and each of the rest -% is interpreted as a displacement from the current position, along which -% a line segment is to be drawn. The terminal point of that segment is the -% new current position -% \begin{macrocode} - \newdef\turtle{\@listmac{turtle}}% -% \end{macrocode} -% -% \subsubsection{Graphing functions}\label{functions} -% -% \DescribeMacro{\function} -% \prog{Mfpic} provides the ability to plot the graph of any function that -% can be defined in \MF. This is done with the \cs{function} command, a -% figure macro which takes one optional parameter that selects -% the smoothness of the \MF{} path produced. It can be \oarg{p}, which -% draws a polyline path through selected points (much like \cs{polyline}), -% or \oarg{s\meta{tension}} which selects a smooth path (much like -% \cs{curve}\oarg{\meta{tension}}). The tension may be omitted and then -% defaults to 1 (set in \file{grafbase}). The default is \oarg{s}. -% -% There are two mandatory arguments. The second is the function, which -% must be written as a formula (strictly speaking, a \MF{} numerical -% expression) containing only one variable, \texttt{x}. The first -% mandatory argument contains three numbers separated by commas. They are, -% in order, the starting value of \texttt{x}, the ending value, and the -% step size. -% -% \DescribeMacro{\parafcn} -% \cs{parafcn} is similar, except its formula must be an ordered pair of -% formulas (strictly speaking, a \MF{} pair expression) in which -% \texttt{t} is the only variable. -% -% \DescribeMacro{\plrfcn} -% \cs{plrfcn} is similar, except its argument is a formula (a \MF{} -% numeric expression) representing the radius, in which \texttt{t} is the -% only variable, interpreted as the angle coordinate, $\theta$, in degrees. -% -% These three commands are so alike that all they do is set the name to -% be written to the output and call the common code. -% \begin{macrocode} - \newdef\function{\def\mfp@name{function}\mfp@fcn}% - \newdef\parafcn{\def\mfp@name{parafcn}\mfp@fcn}% - \newdef\plrfcn{\def\mfp@name{plrfcn}\mfp@fcn}% - \newdef\mfp@fcn{\simple@opt\@mfp@fcn{s}}% - \newdef\@mfp@fcn##1{\@@mfp@fcn##1\mfp@delim}% - \newdef\@@mfp@fcn##1##2\mfp@delim##3##4{% - \@figmac{\mfp@ifempty{##2}{}{t}\mfp@name\space - (\if p##1\mf@F\else\mf@T\fi \mfp@ifempty{##2}{}{, ##2}) - (##3) (##4)}}% -% \end{macrocode} -% -% \DescribeMacro{\btwnfcn} -% The region between two functions \cs{btwnfcn} is a figure macro. It is -% mostly intended for shading or other filling operations so it is already -% closed and, by default, it is not `smooth'. Its parameters are the -% same as those of \cs{function} (above), with two exceptions: the default -% optional argument is \oarg{p} and it has an additional mandatory -% argument, the other function. The resulting \MF{} path travels along one -% the graph of the first function from the starting $x$ to the ending $x$, -% thence vertically to the graph of the second function, along it (in -% reverse) to the starting $x$ and finally, vertically to the start of the -% first function's graph. -% -% \DescribeMacro{\plrregion} -% The figure macro \cs{plrregion} also produces a closed \MF{} path. It -% has the same parameters as \cs{plrfcn}, and the path produced begins at -% the origin, travels along a straight line in the direction of the -% starting angle to the beginning of the graph of the expression, along -% that graph to the ending angle and then straight back to the origin. Its -% default option is also \oarg{p}. -% \begin{macrocode} - \newdef\btwnfcn{\simple@opt\@btwnfcn{p}}% - \newdef\@btwnfcn##1{\@@btwnfcn##1\mfp@delim}% - \newdef\@@btwnfcn##1##2\mfp@delim##3##4##5{\btwn@params{##1}{##2}% - \@figmac{\t@pref btwnfcn (\s@vals) (##3) (##4) (##5)}}% - \newdef\btwn@params##1##2{% - \edef\s@vals{\if s##1\mf@T\else\mf@F\fi}% - \mfp@ifempty{##2}{\def\t@pref{}}% - {\def\t@pref{t}\edef\s@vals{\s@vals, ##2}}}% - \newdef\plrregion{\simple@opt\@plrregion{p}}% - \newdef\@plrregion##1{\@@plrregion##1\mfp@delim}% - \newdef\@@plrregion##1##2\mfp@delim##3##4{\btwn@params{##1}{##2}% - \@figmac{((0,0)--(\t@pref plrfcn (\s@vals) (##3) (##4))% - --cycle)}}% + \newdef\plottext{\begingroup\mfp@resetwhitespace\mp@mksharpother + \mfp@defaultopt\mfp@plottext{cc}}% % \end{macrocode} % % \subsection{Some composite objects}\label{composite} % % \DescribeMacro{\tile} % A tile is syntactically a \MF{} picture variable. The commands between -% \cs{tile} (or \cs{begin}\marg{tile}) and \cs{endtile} (or +% \cs{tile} and \cs{endtile} (or \cs{begin}\marg{tile} and % \cs{end}\marg{tile}) should be any sequence of \mfpic{} figure macros % with possible prefix macros. They will be drawn not on the main picture % (\gbc{currentpicture}), but on the picture given by the name in the @@ -3707,52 +4333,51 @@ % tile should be clipped to these dimensions (true) or allowed to extend % beyond them (false). % \begin{macrocode} - \newdef\tile##1{\mfcmd{\@nl tile (##1)}}% - \newdef\endtile{\mfsrc{endtile;\@nl}}% + \newdef\tile{\mfp@simple{tile}}% + \newdef\endtile{\mfcmd{\@nl endtile}}% % \end{macrocode} % % \DescribeMacro{\patharr} -% A path array is a set of \MF{} path variables each having the same name -% followed by a different numeric suffix. This command turns off rendering -% and simply assigns these variables in order to the path expressions -% written by the figure macros between \cs{patharr} and \cs{endpatharr}. -% It works by redefining \cs{store@path}, issued by all the figure -% macros. These variables can be accessed in \mfpic{} by using the -% \cs{mfobj} command. +% A path array is a set of \MF{} path variables each having the same base +% name followed by a different numeric suffix. This command turns off +% rendering and simply assigns these variables in order to the path +% expressions written by the figure macros between \cs{patharr} and +% \cs{endpatharr}. It works by redefining \cs{mfp@storepath}, issued by all +% the figure macros. These variables can be accessed in \mfpic{} by using +% the \cs{mfobj} command. The name of the path array \emph{without} a +% numeric suffix is a \MF{} numeric variable whose value is the number of +% array elements. % % \emph{Explicit} rendering commands will work in the sense that the % affected path will be rendered in addition to being assigned to the -% variable. The only parameter is the common name of the variables. +% variable. The only parameter is the common base name of the variables. % \begin{macrocode} \newdef\patharr##1{\begingroup \mfsrc{hide(numeric ##1; path ##1[]; ##1 = 0)}% - \def\store@path{\mfsrc{\@nl store (##1[incr ##1])}}% + \def\mfp@storepath{\mfsrc{\@nl store (##1[incr ##1])}}% \setrender{}}% \newdef\endpatharr{\endgroup}% % \end{macrocode} % % \DescribeMacro{\connect} +% This starts an environment that can contain any sequence of figure +% macros. The environment functions as a single large \cs{mfp@figmac}, the +% figure being the path obtained by connecting all the paths % \DescribeMacro{\endconnect} -% These define an environment that can contain any sequence of figure -% macros. It functions as a single large \cs{@figmac}, the figure being -% the path obtained by connecting all the paths within by straight lines -% from the end of one to the beginning of the next. It is implemented via -% a path array, so the individual figures within the environment have -% implicit rendering turned off. Explicit rendering commands within the +% (up to the following \cs{endconnect} command) by straight lines from the +% end of one to the beginning of the next. It is implemented via a path +% array, so the individual figures within the environment have implicit +% rendering turned off. Explicit rendering commands within the % environment will have the expected effect. % -% The \cs{if@mfp@latex} stuff at the end allows \cs{connect} to be used as +% The \cs{mfp@checklatexenv} at the end allows \cs{connect} to be used as % a \LaTeX{} environment. % \begin{macrocode} - \newdef\connect{\@figmac{begingroup; save nexus}% - \patharr{nexus}}% + \newdef\connect{\mfp@figmac{begingroup; save mfpicnexus}% + \patharr{mfpicnexus}}% \newdef\endconnect{\endpatharr - \mfcmd{\@nl mkpoly (\mf@F, nexus)\@nl endgroup}% - \if@mfp@latex \def\mfptmp@a{connect}% - \ifx\mfptmp@a\@currenvir - \aftergroup\@startfigtrue %\aftergroup\@imrendtrue - \fi - \fi}% + \mfcmd{\@nl mkpoly (\mfp@F, mfpicnexus)\@nl endgroup}% + \mfp@checklatexenv{connect}{\aftergroup\@mfpstarttrue}{}}% % \end{macrocode} % % \subsection{Other graphical features}\label{otherfeatures} @@ -3761,33 +4386,44 @@ % (or bar graphs, or histograms). % % \DescribeMacro{\piechart} -% The \cs{piechart} command takes one optional argument containing a -% letter and an angle, and one mandatory argument containing the data. The -% letter can be `\texttt{c}' for clockwise or `\texttt{a}' for anticlockwise -% and determines the direction around the pie the different wedges will be -% drawn. The angle determines the angle of the first edge (in the given -% direction) of the first wedge. The default is \oarg{c90} which starts -% the first wedge at 12 o'clock and proceeds clockwise from there. The -% data in the mandatory argument are numbers separated by commas. The size -% of a wedge is proportional to the size of the corresponding number. -% \cs{piechart} is a list macro and can take the data from an external -% file. +% Actually, nothing is drawn by the \cs{piechart} command; it only defines +% a path array and a few other internal variables. Since nothing is +% drawn by this command, it makes sense to allow it outside the drawing +% environment, so it has been made available outside \env{mfpic} +% environments with the command name \cs{mfppiechart}(page +% \pageref{charts}). +% +% The \cs{piechart} command takes one optional argument and two mandatory +% argument. The first mandatory argument contains the center and radius of +% the chart separated by a comma; the second is the list of data. The +% optional argument contains a letter and an optional angle. The letter +% can be `\texttt{c}' for clockwise or `\texttt{a}' for anticlockwise and +% determines the direction around the pie the different wedges will be drawn. +% The angle determines the angle of the first edge (in the given +% direction) of the first wedge. The default letter is \texttt{c} and the +% default angle is $90$ degrees, which starts the first wedge at +% 12~o'clock and proceeds from there either clockwise or anticlockwise.. +% +% \cs{piechart} acts like a list macro in that the above arguments should +% be followed by either a list of numbers in braces or a \cs{datafile} +% command (with numbers in a datafile). If this feature is used, an +% appropriate \cs{using} command is needed. If the numbers are listed one +% per line, then \cs{usingnumericdefault} should work. % % \DescribeMacro{\piewedge} -% Actually, nothing is drawn, it only defines a path array and a few -% other internal variables. Each individual wedge (elements of the just -% mentioned array) may be drawn using the \cs{piewedge} command, which is -% a figure macro. That command takes one optional argument that determines -% how the wedge is drawn, as described below, and one mandatory argument, -% the number of the wedge. Without the optional argument, -% \cs{piewedge}\marg{1} draws the first wedge in the position given by the -% arguments of the \cs{piechart} command. +% Each individual wedge (elements of the above mentioned path array) may +% be drawn using the \cs{piewedge} command, which is a figure macro. That +% command takes one optional argument that determines how the wedge is +% drawn (described below) and one mandatory argument, the number of the +% wedge. Without the optional argument, \cs{piewedge}\marg{1} draws the +% first wedge in the position given by the arguments of the \cs{piechart} +% command, as described above. % % The optional arguments can be: % \begin{itemize} -% \item \oarg{x\meta{distance}}, the wedge is exploded, drawn -% shifted outward from its position by \meta{distance} (in graph -% units). +% \item \oarg{x\meta{distance}}, the wedge is `exploded': drawn +% shifted radially outward from the center of the pie chart by +% \meta{distance} (in graph units). % \item \oarg{s(\meta{dx},\meta{dy})}, the wedge is shifted from its % position by \meta{dx} horizontally and \meta{dy} vertically (in % graph units). @@ -3795,80 +4431,513 @@ % point is at coordinates \parg{\meta{x},\meta{y}}. % \end{itemize} % \begin{macrocode} - \newdef\piechart{\simple@opt\@piechart{c}}% - \newdef\@piechart##1{\@@piechart##1\mfp@delim}% - \newdef\@@piechart##1##2\mfp@delim##3{% - \mfsrc{\@nl piechart(\if a##1 \else-\fi1, % - \mfp@mtsub{##2}{90}, ##3)}\mfp@writedata}% - \newdef\piewedge{\simple@opt\@piewedge{d}}% - \newdef\@piewedge##1{\@@piewedge##1\mfp@delim}% - \newdef\@@piewedge##1##2\mfp@delim##3{% - \@figmac{(piewedge[##3]% - \if x##1 shifted (##2*piedirection[##3])% - \else\if s##1 shifted (##2)% - \else\if m##1 shifted (##2 - piecenter)% - \else - \fi\fi\fi)}}% + \newlet\piechart\mfppiechart + \newdef\piewedge{\mfp@defaultopt\mfp@piewedge{d}}% % \end{macrocode} % % \DescribeMacro{\barchart} -% \DescribeMacro{\bargraph} -% \DescribeMacro{\gantt} -% \DescribeMacro{\histogram} -% The \cs{barchart} command takes one optional and two mandatory -% arguments. The last mandatory argument contains the data, separated by -% commas and these determine the length of the bars in graph units. This -% is also a list macro and instead of the list, an external file can hold -% the data. +% As with \cs{piechart}, the \cs{barchart} command does not actually draw +% anything, but defines a path array, so we make available a version for +% use outside \cs{mfpic} environments: \cs{mfpbarchart} (page +% \pageref{charts}). +% +% The \cs{barchart} command takes one optional and a mandatory +% arguments. The data follow the mandatory argument. Like \cs{piechart}, +% the data can be a list in braces or an external file. The data determine +% the length of the bars in graph units. Since version 0.7, the data can +% be a list of numbers or pairs or both. It is difficult to give a +% \cs{using} specification that allows both in an external file, but a +% list in braces is simply written as is and \MF{} has no problems mixing +% them. +% +% Pairs are interpreted as giving the start and end of a bar. Numbers are +% interpreted as giving only the end, with the start at $0$. If a datafile +% is used, an appropriate \cs{using} command should be issued beforehand. +% In that case probably all the data should be pairs or all numeric. % % The optional argument determines the position and width of the bars and % the first mandatory argument determines the orientation. The mandatory -% argument can be \marg{v} for vertical bars with base on the x-axis, or -% \marg{h} for horizontal bars with base on the y-axis. +% argument can be \marg{v} for vertical bars with base on the $x$ axis, or +% \marg{h} for horizontal bars with base on the $y$ axis. % The optional argument contains three numbers separated by commas. The % first is the coordinate of the leading edge of the first bar, the second % is the distance (in graph coordinates) between the leading edge of one % bar and that of the next, and the third is the fraction of that distance % that is occupied by the bar. The default is \oarg{0,1,1}. % -% We provide the aliases \cs{bargraph} and \cs{histogram}. +% We provide the aliases \cs{bargraph}, \cs{histogram} and \cs{gantt}. % % \DescribeMacro{\chartbar} -% \DescribeMacro{\ganttbar} -% \DescribeMacro{\graphbar} -% \DescribeMacro{\histobar} -% The \cs{barchart} command does not actually draw anything, but defines a -% path array. The \cs{chartbar} command can then be used to draw a bar -% (one of the members of the just mentioned array). It is a figure macro -% and take the number of the bar as its mandatory argument. Aliases -% \cs{graphbar} and \cs{histobar} are provided. We avoid \cs{bar} because -% it is a math accent command. -% \begin{macrocode} - \newdef\barchart{\simple@opt\@barchart{0,1,1}}% - \newdef\@barchart##1##2{% - \mfsrc{\@nl barchart (##1, \if h##2\mf@F\else\mf@T\fi)}% - \mfp@writedata}% - \newlet\bargraph=\barchart - \newlet\histogram=\barchart +% The \cs{chartbar} command can then be used to draw a bar (one of the +% members of the just mentioned array). It is a figure macro and take the +% number of the bar as its mandatory argument. Aliases \cs{graphbar}, +% \cs{histobar} and \cs{ganttbar} are provided. We avoid \cs{bar} because +% it is already a math accent command. This ends \cs{mfp@grafmacs}. +% \begin{macrocode} + \newlet\barchart\mfpbarchart + \newlet\bargraph\barchart + \newlet\histogram\barchart \newlet\gantt\barchart - \newdef\chartbar##1{\@figmac{chartbar[##1]}}% - \newlet\graphbar=\chartbar - \newlet\histobar=\chartbar - \newlet\ganttbar=\chartbar + \newdef\chartbar##1{\mfp@figmac{chartbar[##1]}}% + \newlet\graphbar\chartbar + \newlet\histobar\chartbar + \newlet\ganttbar\chartbar +}% end \mfp@grafmacs +% \end{macrocode} +% +% \DescribeMacro{\mfppiechart} +% We make \cs{mfppiechart} and \cs{mfpbarchart}\label{charts} global, +% since all they do is define variables \DescribeMacro{\mfpbarchart} +% and arrays. +% \begin{macrocode} +\newdef\mfppiechart{\mfp@defaultopt\mfp@piechart{c}}% +\newdef\mfpbarchart{\mfp@defaultopt\mfp@barchart{0,1,1}}% +\newlet\mfpbargraph\mfpbarchart +\newlet\mfphistogram\mfpbarchart +\newlet\mfpgantt\mfpbarchart +% \end{macrocode} +% +% \section{Implementing the graphics macros} +% +% To keep \cs{mfp@grafmacs} from becoming unweildy, we define here all the +% internal commands that are called by the user level macros. We've +% given most of them names that begin \cs{mfp} to keep from overwriting +% other package commands +% +% \cs{arc} and \cs{circle} are defined identically except that the first +% sets a switch to true, the second to false. This selects the spelling of +% the corresponding \grafbase{} command and the value of the first +% argument of \gbc{fallbackpath}. Both \cs{arc} and \cs{circle} then +% call \cs{mfp@arccircle} which takes the optional argument as \arg1, +% and the data required for that option as \arg2. Actually, \cs{arc} +% first checks for a * and then calls \cs{mfp@arc}, which follows the +% above description. +% +% The \gbc{fallbackpath} is a $0$-length path at whatever point is listed +% first in \arg2, it is cyclic in the case of a circle (not that it +% matters for a one-point path). +% \begin{macrocode} +\newdef\mfp@arc{\mfp@switchtrue\mfp@defaultopt\mfp@arccircle{s}}% +\newdef\arc@or@circle{\ifmfp@switch arc\else circle\fi}% +\newdef\mfp@arccircle#1#2{% + \@ifundefined{mfp@arc@#1}% + {\Mfpic@warn{Invalid option; ignoring \mfp@b\arc@or@circle\space + command.}% + \mfp@figmac{fallbackpath(\ifmfp@switch\mfp@F\else\mfp@T\fi) (#2)}}% + {\mfp@figmac{\arc@or@circle\@nameuse{mfp@arc@#1} (#2)}}}% +\newdef\mfp@ellipse#1#2{\mfp@figmac{ellipse (#2, #1)}}% +% \end{macrocode} +% +% \cs{mfp@curve} is called by six graphics macros: \cs{curve}, +% \cs{ccurve}, \cs{mfbezier} and their closed variants . Its two arguments +% are the name of a \grafbase{} command, and \mfc{true} or \mfc{false}. +% This works for any \grafbase{} command that creates a smooth path from a +% list of points, provided the command has two versions: one that begins +% with \texttt{t} and takes a tension as the first argument and the other +% without a \texttt{t} that takes the same arguments \emph{except} the +% tension. The second argument of \cs{mfp@curve} determines whether the +% curve is to be closed. These are passed along to \cs{mfp@@curve}, which +% gets the tension as the third argument. +% \begin{macrocode} +\newdef\mfp@curve#1#2{\mfp@nullopt{\mfp@@curve{#1}{#2}}}% +\newdef\mfp@@curve#1#2#3{% + \mfp@listmac{\mfp@ifempty{#3}{#1}{t#1 (#3)} (#2)}}% +% \end{macrocode} +% +% The argument of \cs{mfp@fcncurve} is the optional argument of +% \cs{fcncurve} (the tension). +% \begin{macrocode} +\newdef\mfp@fcncurve#1{% + \mfp@listmac{\mfp@ifempty{#1}{fcncurve}{functioncurve (#1)}}}% +% \end{macrocode} +% +% \cs{mfp@fcn} is called by six commands: \cs{levelcurve}, +% \cs{plrregion}, \cs{belowfcn}, \cs{function}, \cs{plrfcn} and, +% \cs{parafcn}. They have a common argument structure for both +% the \mfpic{} and \grafbase{} command. \cs{mfp@fcn} calls +% \cs{mfp@dotension} to parse the optional tension argument (the second +% argument) leaving the results in the macros \cs{mfp@t} (a \texttt{t} +% for command name if a tension value was present) and \cs{mfp@sval} +% (\texttt{true} or \texttt{false} and the tension value if it was +% present). The first argument is the base name of a \grafbase{} command. +% +% Ultimately, \cs{mfp@@fcn} is called, and only then the two mandatory +% arguments of the calling command are read. +% \begin{macrocode} +\newdef\mfp@fcn#1#2{% + \mfp@defaultopt{\mfp@dotension{\mfp@@fcn{#1}}}{#2}}% +\newdef\mfp@@fcn#1#2#3{% + \mfp@figmac{\mfp@t#1 (\mfp@sval) (#2) (#3)}}% +% \end{macrocode} +% +% \cs{mfp@btwn} is called by \cs{btwnfcn} and \cs{btwnplrfcn}, with the +% name of a \grafbase{} command as its argument. It does the same tension +% processing as \cs{mfp@fcn} and calls \cs{mfp@@btwn}, which reads the +% three mandatory arguments of the calling command. +% \begin{macrocode} +\newdef\mfp@btwn#1{% + \mfp@defaultopt{\mfp@dotension{\mfp@@btwn{#1}}}p}% +\newdef\mfp@@btwn#1#2#3#4{% + \mfp@figmac{\mfp@t#1 (\mfp@sval) (#2) (#3) (#4)}}% +% \end{macrocode} +% +% The tension parsing is done by \cs{mfp@@dotension}. It causes +% \cs{mfp@t} to be empty or \texttt{t} depending on the existence of +% the tension parameter, and causes \cs{mfp@sval} to contain either the +% smoothness boolean alone or the boolean followed by the tension value, +% separated by a comma. After this, \cs{mfp@dotension} calls the code it +% is passed in its first argument. +% \begin{macrocode} +\newdef\mfp@dotension#1#2{\mfp@@dotension#2\mfp@end#1}% +\newdef\mfp@@dotension#1#2\mfp@end{\def\mfp@t{}% + \if p#1\relax \let\mfp@sval\mfp@F + \else \let\mfp@sval\mfp@T + \mfp@ifexist{#2}{\def\mfp@t{t}\edef\mfp@sval{\mfp@sval, #2}}% + \fi}% % \end{macrocode} % -% One can add to \cs{mfp@additions} to extend \mfpic. Currently it -% is empty. This ends \cs{@mfpic@graf@macs}. +% \cs{mfp@plotdata} is called by \cs{plotdata}. I follows the scheme of +% most of the data file processing commands: it passes another command (in +% this case \cs{mfp@doplots}) to \cs{mfp@processfile}, which reads the +% filename as its second argument. The argument of \cs{mfp@plotdata}, +% which is passed to \cs{mfp@doplots}, is the original optional parameter +% of \cs{plotdata}. % \begin{macrocode} - \newdef\pinumber{3.14159}% - \mfp@additions -}% +\newdef\mfp@plotdata#1{\mfp@processfile{\mfp@doplots{#1}}}% +% \end{macrocode} +% +% \cs{mfp@doplots} is a self-looping macro. It issues the rendering +% prefix (in \cs{mfp@setstyle}), increments the linetype, and writes the +% path expression defined by the first set of data in the file (via +% \cs{mfp@@datafile}, which stops at a blank line). That part, when prefixed +% by \cs{mfp@figmacbase}, functions as a \cs{mfp@figmac}. When finished with +% one figure, \cs{mfp@ifenddata} checks if there is another set of data in +% the file. If so, \cs{mfp@doplots} calls itself again. +% +% The argument is the smoothness parameter(s), which it merely passes on. +% There is no filename argument: \cs{mfp@plotdata} has already opened +% the input stream \cs{mfp@data} and subsequent macros will read from it. +% \begin{macrocode} +\newdef\mfp@doplots#1{\mfp@setstyle + \advance\mfp@linetype1 \mfp@figmacbase + \mfp@@datafile{#1}\mfp@ifenddata{}{\mfp@doplots{#1}}}% +% \end{macrocode} +% +% When two blank lines occur in succession, \cs{plotdata} is suppose to +% stop. \cs{mfp@ifenddata} is called when \cs{mfp@@datafile} ends (one blank +% line was found), it checks for another blank line (or end-of-file) +% and, if it finds one, selects the first of the two alternatives that +% follow. +% \begin{macrocode} +\newdef\mfp@ifenddata{% + \ifeof\mfp@data \@xp\@firstoftwo + \else \mfp@skipcomments + \ifx\mfp@temp\mfp@par \@XP\@firstoftwo + \else \@XP\@secondoftwo + \fi + \fi}% +% \end{macrocode} +% +% The \cs{datafile} command, which calls \cs{mfp@datafile} is really +% obsolete, as one can now use \cs{curve} or \cs{polyline} (or any other +% list-to-path command) followed by the \cs{datafile} construct. +% However, it requires only two extra commands and then calls a link in +% the \cs{plotdata} chain of commands, so we keep it. +% +% \cs{mfp@datafile} is called by \cs{datafile}, which passes the optional +% smoothness argument. It does the figure macro stuff, then calls +% \cs{mfp@processfile} to open the data file and run \cs{mfp@@datafile}. +% \begin{macrocode} +\newdef\mfp@datafile#1{% + \mfp@figmacbase\mfp@processfile{\mfp@@datafile{#1}}}% +% \end{macrocode} +% +% \cs{mfp@@datafile} checks for an empty optional parameter and then calls +% \cs{mfp@dodatafile}. We could handle the options earlier in the chain, +% but we would have to do that for both \cs{plotdata} and \cs{datafile} +% since both call on it. It is somewhat more efficient to reproduce a bit +% of the internals of \cs{mfp@defaultopt} just once. +% \begin{macrocode} +\newdef\mfp@@datafile#1{% + \mfp@ifempty{#1}% + {\mfp@dodatafile\mfp@smoothness\mfp@tension}% + {\mfp@dodatafile#1}\mfp@end}% +% \end{macrocode} +% +% And \cs{mfp@dodatafile} is mainly just a wrapper, processing the optional +% parameter (passed by either \cs{plotdata} or \cs{datafile}) which +% selects what figure making code should be written. For +% \oarg{s\meta{tension}} a \gbc{curve} command is used. For \oarg{p}, a +% \gbc{polyline}. (The `\cs{mfp@F}' means the curve is not closed). +% +% After that, \cs{mfp@rwdata} is called, which initiates the reading and +% writing of the the data. +% \begin{macrocode} +\newdef\mfp@dodatafile#1#2\mfp@end{% + \mfsrc{% + \if s#1 \mfp@ifempty{#2}{curve }{tcurve (#2) }% + \else polyline + \fi (\mfp@F)}\mfp@rwdata}% +% \end{macrocode} +% +% \cs{mfp@image} is called by \cs{mfpimage} with the optional argument in +% \arg1 and the mandatory argument in \arg2. +% \begin{macrocode} +\newdef\mfp@image#1#2{\mfsrc{\@nl makeimage (#2, #1)}}% +% \end{macrocode} +% +% The command \cs{mfp@getdimens} is only called by \cs{trimpath}. Its +% first argument is the comma separated pair of dimensions from that +% command. It defines \cs{mfp@thedimens} to expand to exactly that, +% except: if there is only one dimension and no comma (empty \arg2 and +% \arg3), the result is a pair of dimensions both equal to it; if there is +% a comma, but nothing on one side, it returns \texttt{0pt} for the empty +% side. If a \TeX{} dimension command is used in either position, its +% value is returned. +% +% The only time \arg3 is nonempty is when the original argument of +% \cs{trimpath} contains a comma (then \arg3 is a comma). In that case we +% let \cs{mfp@scratch} keep its previous value. +% \begin{macrocode} +\newdef\mfp@getdimens#1,#2,#3\mfp@end{% + \mfp@scratch \@ifmtarg{#1}{\z@}{#1}\relax + \edef\mfp@thedimens{\the\mfp@scratch}% + \@ifmtarg{#3}{}{\mfp@scratch \@ifmtarg{#2}{\z@}{#2}\relax}% + \edef\mfp@thedimens{\mfp@thedimens,\the\mfp@scratch}}% +% \end{macrocode} +% +% The argument of \cs{mfp@doubledraw} is the optional separation parameter +% passed by \cs{doubledraw}. Then the optional color is processed. +% \begin{macrocode} +\newdef\mfp@doubledraw#1{% + \mfp@nullopt{\mfp@clroptrendi{doubledraw}{#1}}}% +% \end{macrocode} +% +% Parameter \arg1 of \cs{mfp@wiggle} is the name, \gbc{sinewave} or +% \gbc{corkscrew}, \arg2 is the optional argument (tension). The four +% dimension values should follow as the mandatory argument of the calling +% command. +% \begin{macrocode} +\newdef\mfp@wiggle#1#2{\mfp@rendi{#1 (#2)}}% +% \end{macrocode} +% +% The utility macros, \cs{mfp@rendi}, \cs{mfp@modi} and \cs{mfp@listi} +% write a command name and one set of parameters. They differ in the setup +% required. The first writes via \cs{mfp@rendmac}, the second via +% \cs{mfp@modmac} and the last via \cs{mfp@listmac}. \cs{mfp@rendii} +% writes two sets of parameters, reversing them. \cs{mfp@optrendi} runs +% \cs{mfp@rendi}, but feeds it the result of processing a optional +% argument. \cs{mfp@optrendii} is similar, running \cs{mfp@rendii}. +% \begin{macrocode} +\newdef\mfp@rendi#1#2{\mfp@rendmac{#1 (#2)}}% +\newdef\mfp@rendii#1#2#3{\mfp@rendmac{#1 (#3, #2)}}% +\newdef\mfp@optrendi#1{\mfp@defaultopt{\mfp@rendi{#1}}}% +\newdef\mfp@optrendii#1{\mfp@defaultopt{\mfp@rendii{#1}}}% +\newdef\mfp@modi#1#2{\mfp@modmac{#1 (#2)}}% +\newdef\mfp@listi#1#2{\mfp@listmac{#1 (#2)}}% +% \end{macrocode} +% +% A great many \grafbase{} rendering commands come in two parts: one +% command takes a color argument and the other command simply calls the +% color version with a default color. In all these commands, the name of +% the first is just the second with `\texttt{color}' prepended. This means +% that the corresponding \mfpic{} rendering commands can share a common +% macro, \cs{mfp@clropt}, which is passed the optional color and the name of +% the second command. +% +% To simplify the output file, if a command's color option is empty +% (signaling the default color) the `\texttt{color}'-free \grafbase{} +% command name is written, otherwise the command name beginning with +% `\texttt{color}' is written along with the color parameter. +% \cs{mfp@clropt} makes the test and writes the command. \arg1 is the +% color argument and \arg2 is the command's base name. The commands +% \cs{mfp@clroptrend} and \cs{mfp@clroptrendi} provide useful +% abbreviations when the command is a rendering command and the +% \grafbase{} command takes no argument or one argument beside the color. +% +% There are a number of commands that are not subject to prefixes. For +% this we have \cs{mfp@simple}. It reads a command name and its +% arguments and writes the command, followed by the arguments wrapped in +% parentheses, followed by a semicolon. We also have \cs{mfp@simplei} +% which reads an additional argument. +% \begin{macrocode} +\newdef\mfp@clropt#1#2{\mfp@ifempty{#1}{#2}{\mfp@C#2 (#1)}}% +\newdef\mfp@clroptrend#1#2{\mfp@rendmac{\mfp@clropt{#2}{#1}}}% +\newdef\mfp@clroptrendi#1#2#3{\mfp@rendmac{\mfp@clropt{#3}{#1} (#2)}}% +\newdef\mfp@simple#1#2{\mfcmd{\@nl #1 (#2)}}% +\newdef\mfp@simplei#1#2#3{\mfcmd{\@nl #1 (#2, #3)}}% +% \end{macrocode} +% +% All the path closing commands are implemented with \cs{mfp@close}. It +% writes the closing command determined by the first argument, with a +% `\texttt{t}' plus the second argument as a parameter, if that is not +% empty. +% \begin{macrocode} +\newdef\mfp@close#1#2{\mfp@modmac{#1closed\mfp@ifexist{#2}{t (#2)}}}% +% \end{macrocode} +% +% These next implement hatching. Except for \cs{mfp@xhatch}, they all call +% \cs{mfp@thatch}. The argument of these is the optional argument of the +% calling command. The second optional argument of that command (the +% color) is processed by \cs{mfp@clroptrendi}. +% \begin{macrocode} +\newdef\mfp@thatch#1{\mfp@nullopt{\mfp@clroptrendi{thatch}{#1}}}% +\newdef\mfp@lhatch#1{\mfp@thatch{#1,-45}}% +\newdef\mfp@rhatch#1{\mfp@thatch{#1,45}}% +\newdef\mfp@xhatch#1{\mfp@nullopt{\mfp@clroptrendi{xhatch}{#1}}}% +% \end{macrocode} +% +% The all-purpose \cs{mfp@arr} sets the default values for the +% \cs{mfp@h...} commands (two of which are passed as parameters). This +% is accomplished by the \cs{mfp@arr@\meta{x}} commands. The +% next two commands constitute a loop that ends when no more options +% follow. Each turn through the loop the initial letter is checked and the +% value that follows it is stored in one of those macro (possibly +% replacing some default). Ultimately, \cs{mfp@doarrow} writes the +% code to the output file. +% \begin{macrocode} +\newdef\mfp@arrowhead#1#2{\mfp@arr 0{Gheadpath (#1) (#2)}}% +\newdef\mfp@arrow#1{\mfp@arr 0{headpath#1}}% +\newdef\mfp@arr#1#2{\mfp@arr@c{}\mfp@arr@l{\the\headlen}% + \mfp@arr@b{#1}\edef\mfp@hcommand{#2}\mfp@arr@r{0}\mfp@@arr}% +\newdef\mfp@@arr{\@ifnextchar[{\mfp@arropt}{\mfp@doarrow}}% +\newdef\mfp@arropt[#1]{% + \mfp@ifexist{#1}{\mfp@@arropt#1\mfp@end}\mfp@@arr}% +\newdef\mfp@@arropt#1#2\mfp@end{% + \mfp@ifempty{#2}% + {\Mfpic@warn{Arrow option #1 has no value\on@line; + it will be ignored.}}% + {\@ifundefined{mfp@arr@#1}% + {\Mfpic@warn{Arrow option #1 invalid \on@line; + it will be ignored}}% + {\@nameuse{mfp@arr@#1}{#2}}% + }}% +\newdef\mfp@doarrow{% + \mfp@addmac{\mfp@clropt{\mfp@hcolour}{\mfp@hcommand} (\mfp@hlength, + \mfp@hrotate, \mfp@hlocate)}}% +% \end{macrocode} +% +% Implement the optional argument of \cs{turn} with \cs{mfp@turn}. +% \begin{macrocode} +\newdef\mfp@turn#1#2{\rotatearound{#1}{#2}}% +% \end{macrocode} +% +% The first argument of \cs{mfp@axis} is the optional argument of +% \cs{axis}. Unfortunately, the $x$ and $y$ axis have one default head +% length, \cs{axisheadlen} (initially \texttt{5pt}), while the side +% axes have a different default, \cs{sideheadlen} (initially \texttt{0pt}). +% Therefore we don't know which default to use until the mandatory argument +% is read. In retrospect, it would have been better to put the optional +% argument after the mandatory one. So if there is no optional argument, +% the first argument of \cs{mfp@axis} is empty rather than a default. +% +% We use \cs{mfp@getaxis} to check the mandatory argument and return the +% default head length in \cs{mfp@defheadlen}. It also stores the +% letter in \cs{mfp@axisletter}, but returns `\texttt{x}' for an invalid +% one. +% +% The letter argument \arg{2} is permitted to be a word, provided it +% begins with one of the allowed letters. The `\marg{(none)}' is there to +% provide an argument (and an informative error message) in the unlikely +% case that this argument is empty. +% +% The \cs{mfp@addmac} command is the internal code that \cs{arrow[l \#1]} +% would produce. This is slightly more efficient than calling \cs{arrow}. +% \begin{macrocode} +\newdef\mfp@axis#1#2{\mfp@getaxis#2{(none)}\mfp@end\axis + \mfp@addmac{headpath (\mfp@emptysub{#1}{\mfp@defheadlen}, 0, 0)}% + \axisline{\mfp@axisletter}}% +\newdef\mfp@doaxes#1#2{\def\mfp@@axis##1{\mfp@axis{#1}{##1}\mfp@@doaxis}% + \mfp@@doaxis#2\mfp@end}% +\newdef\mfp@@doaxis{\mfp@ifend{}\mfp@@axis}% +% \end{macrocode} +% +% The six commands for putting hashmarks on an axis call \cs{mfp@marks} +% with the axis letter and the optional length of the marks. Note that +% the location of the marks is a list of numbers, so it is picked up by +% \cs{mfp@writedata} just as in \cs{mfp@listmac}. But it is not a figure +% macro, so we cannot use \cs{mfp@listmac} itself. +% \begin{macrocode} +\newdef\mfp@marks#1#2{\mfsrc{\@nl #1marks (#2)}\mfp@writedata}% +% \end{macrocode} +% +% Called by \cs{vectorfield} or \cs{plrvectorfield} after processing the +% optional argument, the following simply writes the appropriate +% \grafbase{} code. The first argument is either empty or the string +% `\texttt{plr}'. +% \begin{macrocode} +\newdef\mfp@vectorfield#1#2#3#4#5{% + \mfcmd{#1vectorfield (#2, #3) (#4) (#5)}}% +% \end{macrocode} +% The first argument of both these is the optional size argument of the +% calling commands (\cs{point} and \cs{plotsymbol}). For +% \cs{mfp@plotsymbol} the second argument is the symbol name. +% \begin{macrocode} +\newdef\mfp@point#1{% + \mfsrc{\@nl pointd (#1, \ifpointfill\mfp@T\else\mfp@F\fi)}% + \mfp@writedata}% +\newdef\mfp@plotsymbol#1#2{% + \mfsrc{\@nl plotsymbol (#2, #1)}\mfp@writedata}% +% \end{macrocode} +% +% \cs{mfp@plottext} now simply calls the \cs{tlabel} code, since that can +% now handle a list of points. +% \begin{macrocode} +\newdef\mfp@plottext#1#2#3{\tlabeljustify{#1}% + \def\tl@points{#3}\mfp@toks{#2}\mfp@thelabel\endgroup}% +% \end{macrocode} +% +% The first argument of \cs{mfp@piechart} is the optional argument of +% \cs{piechart}. It comes in two parts: a letter and an optional angle, +% so \cs{mfp@@piechart} is used to parse it. A similar description +% applies to \cs{piewedge}. +% \begin{macrocode} +\newdef\mfp@piechart#1{\mfp@@piechart#1\mfp@end}% +\newdef\mfp@@piechart#1#2\mfp@end#3{% #3 = center,radius + \mfsrc{\@nl piechart(\if a#1 \else-\fi1, % + \mfp@emptysub{#2}{90}, #3)}\mfp@writedata}% +\newdef\mfp@piewedge#1{\mfp@@piewedge#1\mfp@end}% +\newdef\mfp@@piewedge#1#2\mfp@end#3{% #3=number + \mfp@figmac{(piewedge[#3]% + \mfp@ifexist{#2}% + {\if #1x shifted (#2*piedirection[#3])% + \else\if #1s shifted (#2)% + \else\if #1m shifted (#2 - piecenter)% + \fi\fi\fi})}}% +% \end{macrocode} +% +% The optional argument of \cs{barchart} becomes \arg{1} and the data is +% \arg{2}. +% \begin{macrocode} +\newdef\mfp@barchart#1#2{% + \mfsrc{\@nl barchart (#1, \if h#2\mfp@F\else\mfp@T\fi)}% + \mfp@writedata}% % \end{macrocode} % % % \section{The \env{mfpic} environment}\label{mfpicenv} % -% \subsection{Initializations}\label{mfpicinitializations} +% \subsection{Initializing the environment}\label{mfpicinitializations} +% +% For mostly historical reasons, the macros that create labels are +% redefined anew with each \env{mfpic} environment. These have gradually +% grown in number and size. We are still doing this, but the internal +% part of these commands have now been moved outside the environment, +% and only the user lever commands are localized. +% +% \DescribeMacro{\everymfpic} +% This takes a token list and saves it in \cs{every@mfpic} to be issued +% at the very end of the \cs{mfpic} command. There is a companion macro +% \DescribeMacro{\everyendmfpic} that is issued at the very beginning of +% \cs{endmfpic}. These are always global, otherwise they are defined much +% like \cs{everytlabel}. +% \begin{macrocode} +\newdef\everymfpic{\afterassignment\@everymfpic\mfp@toks}% +\newdef\everyendmfpic{\afterassignment\@everyendmfpic\mfp@toks}% +\newdef\@everymfpic{\edef\every@mfpic{\the\mfp@toks}}% +\newdef\@everyendmfpic{\edef\every@endmfpic{\the\mfp@toks}}% +\everymfpic{}\everyendmfpic{}% +% \end{macrocode} % % \DescribeMacro{\mfpic} % This command (or the \LaTeX{} environment \cs{begin}\marg{mfpic}) takes @@ -3877,8 +4946,8 @@ % equal to the xscale. % % There are also 4 mandatory arguments: the first two give the minimum and -% maximum extent of the x coordinates and the last two do the same for the -% y coordinates. The coordinates used in the figure commands within an +% maximum extent of the $x$ coordinates and the last two do the same for the +% $y$ coordinates. The coordinates used in the figure commands within an % mfpic environment are multiplied by the corresponding scales, and that % is the multiple of \cs{mfpicunit} used in positioning, drawing, etc. % @@ -3886,77 +4955,66 @@ % mandatory arguments for \cs{@mfpic}, which contains the actual % definition. % \begin{macrocode} -\newdef\mfpic{\simple@opt\@mfpicA{1}}% -\newdef\@mfpicA#1{\simple@opt{\@mfpic{#1}}{#1}}% +\newdef\mfpic{\mfp@defaultopt\@mfpicA{1}}% +\newdef\@mfpicA#1{\mfp@defaultopt{\@mfpic{#1}}{#1}}% \newdef\@mfpic#1#2#3#4#5#6{% % \end{macrocode} % -% We start by saving \mfpic{} extra fontdimen values. They will be +% We start by saving \mfpic's extra fontdimen values. They will be % restored by \cs{endmfpic}. This makes the values local (font dimensions -% are normally always global). Then we begin a group to localize ordinary +% are normally always global). Also, we save \cs{mfpicunit} using an +% internal name to prevent users from changing it midpicture. +% +% Then we begin a group to localize ordinary % \TeX{} definitions and assignments, disable writes to the output if -% \cs{opengraphsfile} hasn't occurred yet. save the current font in -% \cs{@tcurr} for restoration inside text labels and captions, set the -% switch that says we are in an \cs{mfpic} environment, disable \cs{par} -% so that blank lines have (little or) no effect, and switch to +% \cs{opengraphsfile} hasn't occurred yet (an error), save the current +% font in \cs{@tcurr} for restoration inside text labels and captions, set +% the switch that says we are in an \cs{mfpic} environment, disable +% \cs{par} so that blank lines have (little or) no effect, and switch to % \cs{nullfont} so that stray characters (always an error) and spaces (not -% an error), have no effect. I wonder if \cs{@empty} is a better -% disabling definition for \cs{par} than \cs{relax}. +% an error), have no effect. I don't know whether \cs{relax} is a better +% disabling definition for \cs{par} than \cs{@empty}. % \begin{macrocode} \save@mfpicdimens + \@mfpicunit\mfpicunit \begingroup % ended near end of \endmfpic - \@ifmfpfileisopen{}% - {\if@mfp@nowrite\else \nooutputfileerror{\mfpic}% - \def\@mfsrc##1##2{}% + \edef\xmin{#3}\edef\xmax{#4}\edef\ymin{#5}\edef\ymax{#6}% + \@nameuse{@safe@activestrue}% + \mfp@ifopengraphsfile{}% + {\ifmfp@nowrite\else \mfp@nooutput@error\mfpic + \def\mfp@src##1##2{\endgroup}% \fi}% - \mfp@DBlog{Starting mfpic \number\mfp@count \@online.}% - \font\@tcurr=\fontname\font\relax + \mfp@DBlog{Starting mfpic \number\mfp@count \on@line.}% + \@xp\let\@xp\@tcurr\the\font \let\ifin@mfpicenv\iftrue -% \let\par\relax \let\par\@empty \nullfont % \end{macrocode} % % The graphics macros are undefined outside the \env{mfpic} environment. -% They are defined now by invoking \cs{@mfpic@graf@macs}. -% \begin{macrocode} - \@mfpic@graf@macs -% \end{macrocode} +% They are defined now by invoking \cs{mfp@grafmacs}. % -% Then we define two utility macros used to convert graph coordinates into -% actual dimensions relative to the lower left corner of the picture. The -% first argument is a dimension, but it is normally obtained by first -% multiplying a coordinate value by \cs{mfpicunit}. Since font dimensions -% may be involved, we assign \texttt{\#\#1} to a scratch dimension -% register first, since \TeX{} won't \cs{advance} font dimensions. We make -% the final assignment global for consistency. +% One can add to \cs{mfp@additions} to extend \mfpic. Currently it +% is empty. % \begin{macrocode} - \newdef\@xconv##1{% - {\mfp@scratch = ##1\relax - \advance\mfp@scratch by -#3\mfpicunit - \mfp@scratch = #1\mfp@scratch - \global ##1 = \mfp@scratch}}% - \newdef\@yconv##1{% - {\mfp@scratch=##1\relax - \advance\mfp@scratch by -#5\mfpicunit - \mfp@scratch = #2\mfp@scratch - \global ##1 = \mfp@scratch}}% + \mfp@grafmacs + \mfp@additions % \end{macrocode} % +% We also define the coordinate conversion macros \cs{@xconv} and +% \cs{@yconv} via \cs{mfp@setconv}. These are used to calculate the +% nominal dimensions of the picture and to position \TeX{} labels. +% % We are going to add all text labels to a box \cs{@alltlabels} and put % that whole box on top of the graph during \cs{endmfpic}. -% We initialize the box here. The dimensions \cs{@tlabelsbot}, etc., -% are also initialized. Each will be changed as labels are added, so a -% `non-maxdimen' value at \cs{endmfpic} means there are labels to add. +% We initialize the box here, as well as the dimensions \cs{@tlabelsbot}, +% etc. % \begin{macrocode} -\setbox\@alltlabels\vbox{\hbox{}}% -\@tlabelsbot \maxdimen -\@tlabelstop -\maxdimen -\@tlabelsleft \maxdimen -\@tlabelsright-\maxdimen + \mfp@setconv{#1}{#2}{#3}{#5}% + \mfp@inittlabels % \end{macrocode} % -% The graph is loaded into a box register at the end of the mfpic +% The graph is loaded into a box register at the end of the \env{mfpic} % environment. The size of that box register may have to correspond to the % arguments of the \cs{mfpic} command. Since \cs{endmfpic} doesn't receive % these arguments we process them now. @@ -3966,15 +5024,14 @@ % edges of the graph. These are all font dimensions, so they are global % assignments. % \begin{macrocode} - \@graphright=#4\mfpicunit \@xconv\@graphright - \@graphtop=#6\mfpicunit \@yconv\@graphtop - \@graphleft=0pt - \@graphbot=0pt - \@graphwd=\@graphright + \@xconv{#4}\@graphright + \@yconv{#6}\@graphtop + \@graphleft 0pt + \@graphbot 0pt % \end{macrocode} % -% \subsection{Initialization code for the current -% picture}\label{current} +% \subsection{Initializing the \MF{} picture} +% \label{current} % % Each \env{mfpic} environment produces a \gbc{beginmfpic...endmfpic} % environment in the output file. Here we initialize the variables that @@ -3983,8 +5040,8 @@ % figure as its only argument. For debugging purposes we write a \MF{} % comment the contains the line number in the \TeX{} source file where the % \cs{mfpic} command occurred. We also write a line of dashes -% (\cs{mf@d}) to make it easier to find the start of the environment. This -% will be removed in the public release. +% (\cs{mfp@d}) to make it easier to find the start of the environment. This +% may be removed in the public release. % % When \opt{mplabels} is in effect we need to set the font for the labels % to the saved \cs{@tcurr} by writing some \mfc{verbatimtex} code. Since @@ -3994,15 +5051,15 @@ % fact it can be used any number of times. It's purpose is to be at an % outer level, while \mfc{btex} is localized inside a box % \begin{macrocode} - \mfsrc{\@nl \mf@p\mf@d\mf@d\mf@d\@nl - unitlen := \the\mfpicunit\mf@s;\@nl + \mfsrc{\@nl \mfp@p\mfp@d\mfp@d<\number\mfp@count>\@nl + unitlen := \the\@mfpicunit\mfp@s;\@nl xscale := #1; yscale := #2;\@nl bounds (#3, #4, #5, #6);\@nl \@nl - beginmfpic(\number\mfp@count); \mf@p\space\@mfplineno. + beginmfpic(\number\mfp@count); \mfp@p\space\mfp@lineno. \mfp@ifmpost - {\@nl verbatimtex \@nl - \begingroup\space\font\noexpand\MFPcfont=\fontname\@tcurr\@nl + {\@nl verbatimtex + \bgroup\font\noexpand\MFPcfont=\fontname\@tcurr\relax etex;}{}}% % \end{macrocode} % @@ -4013,17 +5070,18 @@ % \opt{mplabels} where most of the work takes place in \file{grafbase.mp}. % The most involved is the definition of \cs{tlabel} without % \opt{mplabels}. All the rest (except \cs{tcaption}) add labels by -% calling \cs{tlabel}. Some of those could be simpler under \opt{mplabels} -% but then we'd need two versions of each. +% calling \cs{tlabel} or one of its internal commands. Some of those could +% be simpler under \opt{mplabels} but then we'd need two versions of each. % % \DescribeMacro{\tlabel} % This is the common code, processing optional arguments, etc. for -% \cs{tlabel}. It ultimately calls one of \cs{@tlabel} (no -% \opt{mplabels}) or \cs{@@tlabel} (\opt{mplabels}). It takes an optional -% argument describing the justification and rotation, followed by a -% location in one of two syntaxes (which adds to the complication, but we -% want to be backward compatible), followed by the text of the label -% (\TeX{} code). +% \cs{tlabel}. It, and the first several commands it calls, set switches +% and macros based on the arguments. The first argument is optional: the +% justification (the default is that set with the \cs{tlabeljustify} +% command), the second is a location or locations, and the last is the +% \TeX{} code that constitutes the label. All these are ultimately stored +% as macros and then either \cs{mp@tlabel} or \cs{tex@tlabel} is called +% without arguments. % % The location can be in the form \parg{\meta{x},\meta{y}}, but if \MP{} % is processing labels we would like to be able to use \MP{} expressions, @@ -4031,60 +5089,240 @@ % token matching for reading the two coordinates. Therefore we allow the % whole point to be enclosed in braces. Under \opt{mplabels} the contents % of the braces will be written to the output file without any further -% parsing. Without \opt{mplabels}, there should be either no braces, or -% inside the braces is the previously described syntax. +% parsing. Without \opt{mplabels}, the braces should contain a comma +% separated list of locations in the previously described syntax. % -% We start with \cs{begingroup} to hide changes, then reset whitespace to -% its normal catcodes. Without \opt{mplabels} we reset \cs{tlabel@rot} to -% empty. Finally, we check for an optional parameter and run \cs{@tlabel@}, -% feeding it an empty optional argument if there is none. +% We start things off by calling \cs{mfp@label} to process the optional +% argument, feeding it an empty one if none is present. % \begin{macrocode} - \newdef\tlabel{% - \begingroup % ended in \@(@@)tlabel - \mfp@resetwhitespace - \@ifmplabels{}{\def\tlabel@rot{}}% - \null@opt\@tlabel@}% + \newdef\tlabel{\mfp@nullopt\mfp@label}% % \end{macrocode} % -% We run \cs{tlabeljustify} on the optional parameter. This keeps the -% default values of \cs{tl@vpos}, \cs{tl@hpos} and \cs{tlabel@rot} if -% the parameter is empty, otherwise it modifies them inside the current -% group. +% We allow some \cs{tlabels} to be placed behind the picture rather than +% on top. This is easy under \opt{mplabels}: just use \cs{tlabel} before +% any rendering commands (making sure \opt{overlaylabels} is turned off.) +% However, \MP{} labels can contain only fonts and one would often want +% to do this with an included graphic (as a background). After +% \DescribeMacro{\startbacktext} +% \cs{startbacktext}, labels are saved in a special place to be included +% behind the \mfpic{} graphic. This continues until +% \DescribeMacro{\stopbacktext}\cs{stopbacktext}. % -% We then check for a left parenthesis and assume the -% \parg{\meta{x},\meta{y}} syntax in that case, calling \cs{@@tlabel@} -% to process it. Under \opt{mplabels} it stuffs the whole point into -% braces and call the main code \cs{@@tlabel} with that argument, -% otherwise it pulls out the two coordinates and feeds them as the first -% two arguments of the main code \cs{@tlabel}. +% We simply turn off \gbc{overlaylabels} and turn on \gbc{backtextlabels} +% for \MP{}. We also save the box \cs{@alltlabels} in \cs{@wholegraph} +% (which will not be needed until \cs{endmfpic}) and then reinitialize it. +% At \cs{endbacktext} we copy the box \cs{@alltlables} into \cs{@backtext}, +% and then restore what we changed. We let the values of \cs{@tlabelsleft}, +% etc., be updated normally as labels are added to the backtext. % \begin{macrocode} - \newdef\@tlabel@[##1]{\tlabeljustify{##1}% - \mfp@ifnextchar({\@@tlabel@}{\@@tlabel@@}}% - \newdef\@@tlabel@(##1,##2){% - \@ifmplabels - {\@@tlabel{(##1,##2)}}{\@tlabel{##1}{##2}}}% + \newdef\startbacktext{\let\mfp@restoreOL\@empty + \mfp@ifmpost + {\ifmfp@overlabels + \let\mfp@restoreOL\overlaylabels\nooverlaylabels + \fi \setmfboolean{underlaylabels}{\mfp@T}}{}% + \setbox\@wholegraph \box\@alltlabels + \setbox\@alltlabels \vbox{\hbox{}}}% + \newdef\stopbacktext{% + \setbox\@backtext \box\@alltlabels + \setbox\@alltlabels\box\@wholegraph + \mfp@ifmpost{\setmfboolean{underlaylabels}{\mfp@F}}{}% + \mfp@restoreOL}% % \end{macrocode} % -% If no parenthesis, we assume braces surround the point. Under -% \opt{mplabels} we call the main code (\cs{@@tlabel}) with that argument. -% Otherwise, we re-call the above \cs{@@tlabel@} on the contents of the -% braces, assuming (without checking) that the contents are coordinates in -% parentheses. +% \subsection{Surrounding the label with a path}\label{surrounding} +% +% These next macros place labels, but also define a path surrounding the +% label. This allows one to clear a space for the label, create a +% background, draw a box around it, etc., all in one command (with the +% appropriate sequence of prefixes). They take two optional arguments. +% The first optional argument depends on the type of path being created. +% It is described below. The second one is the justification as in the +% \cs{tlabel} command. There are two mandatory arguments, the location +% (same syntax as for \cs{tlabel} except it cannot be a list) and the text. +% They also have star-forms, which create the path but don't place the +% label. +% +% All the curves are sized to just contain what I will call the +% \emph{label strip}. Imagine a rectangle that just fits around the text. +% Now extend it on all sides by the value defined with \cs{tlpathsep}. +% This rectangle is the label strip. +% +% \DescribeMacro{\tlabelrect} +% \cs{tlabelrect} creates the rectangular boundaries of the label strip by +% default. With the optional argument a rectangle with rounded corners is +% produced; the optional argument is the radius of the quarter circles used. +% These quarter circles pass through the corners of the label strip and are +% joined together with straight lines to create the rest of the rectangle. +% As a special case, the optional argument can contain the keyword +% `\texttt{roundends}' to produce a rectangle with the short sides +% replaced by a semicircle. If the radius is negative, the corners are +% concave. +% +% \DescribeMacro{\tlabeloval} +% \cs{tlabeloval} produces an ellipse which, by default has the same +% aspect ratio as the label strip. It's size just includes the label strip, +% and it passes through the four corners. The optional argument contains a +% numerical factor $m$ that changes the width and the height so that the +% width-to-height ratio is multiplied by $m$, but the ellipse still +% passes through those four corners. The default value of $m$ is 1. +% Negative $m$ has the same effect as $|m|$. If $m=0$ a rectangle is +% produced. +% +% \DescribeMacro{\tlabelellipse} +% \cs{tlabelellipse} produces an ellipse, where the optional argument $a$ +% is the ratio of its width to its height. The default for $a$ is 1, which +% produces a circle. Negative $a$ has the same effect as $|a|$. If $a = +% 0$, a rectangle is produced. +% +% \DescribeMacro{\tlabelcircle} +% To get a circle one can use \cs{tlabelellipse} without the optional +% argument, or with argument \oarg{1}. However, it makes for a more +% readable source if the command reflects the shape. \cs{tlabelcircle} is +% defined to be essentially \cs{tlabelellipse}\oarg{1}, but it first +% checks for the \texttt{*} and passes it along in front of the \oarg{1}. +% +% We implement the other three by calling \cs{mfp@labelpath} with the name +% of the curve (\texttt{rect}, \texttt{oval}, or \texttt{ellipse}) and the +% default value of the optional argument (\texttt{0}, \texttt{1}, and +% \texttt{1}, respectively) as arguments. +% \begin{macrocode} + \newdef\tlabelrect{\mfp@labelpath{rect}{0}}% + \newdef\tlabeloval{\mfp@labelpath{oval}{1}}% + \newdef\tlabelellipse{\mfp@labelpath{ellipse}{1}}% + \newdef\tlabelcircle{% + \mfp@iftoken*{\tlabelellipse*[1]}{\tlabelellipse[1]}}% +% \end{macrocode} +% +% \subsection{Placing multiple text labels}\label{multiple} +% +% One of the more onerous things about labels in \env{mfpic} environments +% used to be the shear amount of typing required. The following commands +% are intended to reduce the work by having to repeat only the arguments. +% +% \DescribeMacro{\tlabels} +% This command takes only one argument containing any sequence of valid +% arguments for the \cs{tlabel} command, optionally separated by +% whitespace (but not blank lines). +% +% We begin a group, reset whitespace to normal, and call the command that +% reads the argument. % \begin{macrocode} - \newdef\@@tlabel@@##1{% - \@ifmplabels {\@@tlabel{##1}}{\@@tlabel@##1}}% + \newdef\tlabels{\begingroup + \mfp@resetwhitespace\mp@mksharpother \mfp@labels}% +% \end{macrocode} +% +% Labelling axes generates a lot of \cs{tlabel} commands, or a single +% \cs{tlabels} command with a lot of arguments. Given that such labels +% have much in common (e.g., for the $x$ axis the $y$ coordinate and the +% justification are usually the same for all the labels) we can do still +% better at abbreviating this task. +% +% \DescribeMacro{\axislabels} +% The \cs{axislabels} command takes a mandatory argument (the axis) +% followed by an optional argument (the justification, as in the +% \cs{tlabel} command), followed by another mandatory argument, a comma +% separated list of items of the form \marg{\meta{label}}\meta{coord}. The +% label is placed at that coordinate on the given axis. +% +% Here we call \cs{mfp@axislabel}, feeding it the arguments of the current +% \cs{@mfpic} command. +% \begin{macrocode} + \newdef\axislabels{\mfp@axislabels{#3}{#4}{#5}{#6}}% +% \end{macrocode} +% +% \subsection{Captions}\label{captions} +% +% Captions are not added immediately by the \cs{tcaption} command. That +% command redefines \cs{mfp@docaption} to add it, and \cs{endmfpic} +% executes \cs{mfp@docaption}. For now, \cs{mfp@docaption} does nothing. +% +% \DescribeMacro{\tcaption} +% \cs{tcaption} takes an optional argument that holds two numbers, +% separated by a comma. The first number determines the maximum width of a +% one line caption. Captions larger than that multiple of the width of the +% graphic will be reset as a paragraph, whose lines have length the second +% number times the width of the graph. The defaults are \oarg{1.2,1}. +% \begin{macrocode} + \let\mfp@docaption\@empty + \newdef\tcaption{\mfp@defaultopt\mfp@caption{1.2,1.0}}% +% \end{macrocode} +% +% Finally, invoke the \cs{everymfpic} tokens. +% \begin{macrocode} + \every@mfpic}% End of \@mfpic +% \end{macrocode} +% +% \section{Implementing the label and caption macros} +% +% \cs{mfp@setconv} is passed four of the arguments of the surrounding +% \env{mfpic} environment. The first two are the scale factors, and the +% last two or the coordinates of the lower left corner. It defines two +% macros used to convert graph coordinates into actual dimensions relative +% to the lower left corner of the picture. The second argument of +% \cs{@xconv} and \cs{@yconv} is a dimension register in which the +% converted result is returned. We make the final assignment global for +% consistency (font dimension assignments are always global). +% \begin{macrocode} +\newdef\mfp@setconv#1#2#3#4{% #1,#2=xscale,yscale. #3,#4=xmin,ymin. + \def\@xconv##1##2{% ##1 = coord. ##2 = dimension register or fdim + {\mfp@scratch=##1\@mfpicunit \advance\mfp@scratch by -#3\@mfpicunit + \mfp@scratch=#1\mfp@scratch + \global ##2=\mfp@scratch}}% + \def\@yconv##1##2{% ditto + {\mfp@scratch=##1\@mfpicunit \advance\mfp@scratch by -#4\@mfpicunit + \mfp@scratch=#2\mfp@scratch + \global ##2=\mfp@scratch}}}% +\newdef\mfp@inittlabels{% + \setbox\@alltlabels\vbox{\hbox{}}% + \setbox\@backtext\vbox{\hbox{}}% + \@tlabelsbot \maxdimen + \@tlabelstop -\maxdimen + \@tlabelsleft \maxdimen}% +% \end{macrocode} +% +% The first argument of \cs{mfp@label} is the justification option. After +% starting a group (it is ended in \cs{mfp@label@@}, we restore the +% meaning of whitespace and give \texttt\# a safe catcode for writing to the +% output, if necessary (\opt{mplabels}). Then we run \cs{tlabeljustify} on +% the optional argument. An empty argument means any previously set values +% won't be changed. Then we check for a left parenthesis and assume the +% \parg{\meta{x},\meta{y}} syntax in that case, calling \cs{mfp@label@} +% to process it. All it does is pack it in braces and call +% \cs{mfp@label@@}. If no parentheses we skip to \cs{mfp@label@@}. +% +% Then \cs{mfp@label@@} gets a point or list of points as its first argument +% and the label code as the second. It defines the macro \cs{tl@points} to +% equal the point (or list) and puts the label into a token register. +% +% After all the data are stored away, we call \cs{mfp@thelabel} with no +% parameters. Then the group (begun by \cs{mfp@label}) is ended, and the +% \cs{extra@endtlabel} command invoked. +% \begin{macrocode} +\newdef\mfp@label#1{\begingroup\mfp@resetwhitespace\mp@mksharpother + \tlabeljustify{#1}\@ifnextchar({\mfp@label@}{\mfp@label@@}}% +\newdef\mfp@label@(#1,#2){\mfp@label@@{(#1,#2)}}% +\newdef\mfp@label@@#1#2{\def\tl@points{#1}\mfp@toks{#2}\mfp@thelabel + \endgroup\extra@endtlabel}% +% \end{macrocode} +% +% At this point all the necessary information has been stored and +% \cs{mfp@thelabel} merely branches depending on \opt{mplabels}. +% +% Clearly we could have put this code at the end of \cs{mfp@label@@} instead +% of invoking this command. The point of doing things this way is so that +% other commands too can store away the necessary info while doing other +% things and simply call \cs{mfp@thelabel} to get the label placed. +% \begin{macrocode} +\newdef\mfp@thelabel{\@ifmplabels\mp@tlabel\tex@tlabel}% % \end{macrocode} % -% \DescribeMacro{\extraendtlabel} % We now come to the main code under \opt{mplabels}, which should just % arrange to write the correct commands to the output file. All labels are -% passed as \mfc{btex ... etex} structures. The definition of \cs{MFPtext} -% will have been written earlier by \cs{opengraphsfile}. -% \cs{extraendtlabel} is a hook currently only used by the \cs{tlabels} -% command to force a loop. +% passed as \mfc{btex ... etex} structures via the command \cs{mfp@btex} +% below. The definition of \cs{MFPtext} will have been written earlier by +% \cs{opengraphsfile}. % \begin{macrocode} - \newdef\mfp@btex##1{btex \noexpand\MFPtext{##1} etex}% - \newdef\extraendtlabel{}% +\newdef\mfp@btex#1{btex \noexpand\MFPtext{#1} etex}% % \end{macrocode} % % The command \gbc{newgblabel}, defined in \file{graphbase.mp} for placing @@ -4092,7 +5330,7 @@ % support the \texttt{B} vertical placement option, there would be only % two. All the other options involve placement \emph{relative} to the % bounding box. But the baseline is absolute: \MP{} always puts it at -% y-coordinate 0 in the picture returned by \gbc{btex}. The first two +% $y$ coordinate 0 in the picture returned by \gbc{btex}. The first two % parameters are numerical and the third is boolean. The % first represents the fraction of the text that lies left of given % point. The second is the fraction of the text below the point. If the @@ -4107,489 +5345,346 @@ % % The fourth parameter of \gbc{newgblabel} is the angle of rotation. Empty % rotation is converted to the angle 0, otherwise it is written as is. -% All four parameters are stored in \cs{mfp@MPpos}. +% All four parameters are stored in \cs{mfp@MPpos} by the invocation of +% \cs{mfp@setMPpos}. % \begin{macrocode} - \newdef\mfp@setMPpos{% - \edef\mfp@MPpos{% - \ifcase\tl@hpos .5\or 1\else 0\fi, % horizontal - \ifcase\tl@vpos 0\or .5\or 1\else 0\fi, % vertical - \ifnum \tl@vpos < 0 \mf@T\else\mf@F\fi, % true=Baseline - \mfp@mtsub{\tlabel@rot}{0}}}% +\newdef\mfp@setMPpos{% + \edef\mfp@MPpos{% + \ifcase\tl@hpos .5\or 1\else 0\fi, % horizontal + \ifcase\tl@vpos0\or .5\or 1\else 0\fi, % vertical + \ifnum \tl@vpos<0 \mfp@T\else\mfp@F\fi, % true=Baseline + \mfp@emptysub{\tl@rot}{0}}}% % \end{macrocode} % -% \cs{@@tlabel} is the code called by \cs{tlabel} when \opt{mplabels} is -% in effect. The argument is a \MP{} pair expression, or comma separated -% list of them. It should be followed by the \TeX{} code for the label. -% We will load the label into a token register afterwards. First -% we restore the meaning of blank lines and then make sure any -% \texttt{\#}'s in the \TeX{} code are not doubled by changing their -% category. -% -% We load the label in a token register because writing that is (almost) -% verbatim (blank lines become \cs{par}, \texttt{\#} symbols are -% doubled if we're not careful, and control names have a space appended). -% One day maybe we'll try to obtain a true verbatim writing mode. +% \cs{mp@tlabel} is the code called by \cs{tlabel} when \opt{mplabels} is +% in effect. At this point all the data needed are stored in macros and +% we just have to put it together. Thus, it has no parameters and other +% commands can prepare the data and simply invoke it (or, more usually, +% invoke \cs{mfp@thelabel} which invokes \cs{tex@tlabel} or \cs{mp@tlabel} as +% appropriate). The \gbc{newgblabel} command is written with the +% justification and two more parameters: the label tokens, and the point +% (or list of points). % \begin{macrocode} - \newdef\@@tlabel##1{\def\mfp@points{##1}\mfp@restorepar - \mfp@setMPpos \@makeother\#\mfp@gettoks\@@@tlabel}% -% \end{macrocode} -% Then the \gbc{newgblabel} command is written with the justification -% parameters, and two more: the label tokens, and the point (or list of -% points). The group (begun by \cs{tlabel}) is ended, and the -% \cs{extraendtlabel} command invoked. -% \begin{macrocode} - \newdef\@@@tlabel{% - \mfcmd{\@nl - newgblabel(\mfp@MPpos)(\mfp@btex{\the\mfp@toks})(\mfp@points)}% - \endgroup \extraendtlabel}% +\newdef\mp@tlabel{\mfp@setMPpos + \mfcmd{\@nl newgblabel(\mfp@MPpos)(\mfp@btex{\the\mfp@toks})\@nl + (\tl@points)}}% % \end{macrocode} % % When \opt{mplabels} is not in effect, we use \TeX{} to position the -% label. By this point, the optional justification parameter to -% \cs{tlabel} has been converted to integer values of \cs{tl@vpos} and -% \cs{tl@hpos}, and the coordinates of the location are passed as the -% first two arguments of \cs{@tlabel}. The third argument is the \TeX{} -% code for the label. -% -% We put the label in a box (\cs{@textbox}) so we can measure and position -% it. It is a \cs{vbox} so we can have multiline labels. This is effected -% by wrapping it in a simple, left-aligned, one column \cs{halign}, -% defining \cs{\bsl} to be \cs{cr}. We make this procedure a separate -% macro, since we need to do the identical thing in the \cs{tlabelpath} -% code. -% \begin{macrocode} - \newdef\set@textbox##1{% - \setbox\@textbox=\vbox{\def\\{\cr}\mfp@restorepar - \@tcurr\the\every@tlabel\halign{####\hfil\cr##1\crcr}}}% +% label. We put the label in a box (\cs{@textbox}) so we can measure and +% position it. It is a \cs{vbox} so we can have multiline labels. This is +% effected by wrapping it in a simple, left-aligned, one column +% \cs{halign}, defining \cs{\bsl} to be \cs{cr}. We make this procedure a +% separate macro, since we need to do the identical thing in the +% \cs{tlabelpath} code. +% \begin{macrocode} +\newdef\set@textbox#1{% + \setbox\@textbox\vbox{\def\\{\cr}\mfp@restorepar + \@tcurr\@nameuse{@safe@activesfalse}\every@tlabel + \halign{##\hfil\cr#1\crcr}}}% +% \end{macrocode} +% +% We call \cs{tex@tlabel} to perform the necessary positioning. Again, all +% the necessary data has been stored so \cs{tex@tlabel} takes no parameters. +% Before calling the (rather extensive) positioning code, we have to +% process the (possible) list of points into separate points. Spaces +% outside parentheses are consumed by \cs{@ifnextchar} and separating +% commas (even if there are too many) are gobbled by the +% \cs{mfp@ifendorcomma}. Oddly, this code works even if the separating commas +% are omitted, but the \opt{mplabels} code does not. +% \begin{macrocode} +\newdef\tex@tlabel{\@xp\@textlabel\tl@points\mfp@end}% +\newdef\@textlabel{\mfp@ifendorcomma{}\@textlabel\@@textlabel}% +\newdef\@@textlabel(#1,#2){\tex@@tlabel{#1}{#2}\@textlabel}% +% \end{macrocode} +% +% This is the code that sets and positions the label. We compute its total +% height to simplify later code. The macro \cs{tb@ht} expands to +% \cs{ht}\cs{@textbox} and \cs{tb@dp} to \cs{dp}\cs{@textbox}. +% \begin{macrocode} +\newdef\tex@@tlabel#1#2{% + \set@textbox{\the\mfp@toks}% + \mfp@scratch\tb@ht \advance\mfp@scratch\tb@dp + \tb@totalht\mfp@scratch + \@xconv{#1}\mfp@scratch +% \end{macrocode} +% +% The following computes whether the leftmost extent of the picture will +% be increased by the addition of the label. The macro \cs{tb@wd} expands +% to \cs{wd}\cs{@textbox}. +% +% We have convert the $x$ coordinate of the label's location to a distance +% from the left edge of the picture. We then subtract from that the amount +% of the label extending to the left of this location. Then we add or +% subtract the separation of the label from its location. Finally, we +% simply add the horizontal adjustment defined by the user with +% \cs{tlabeloffset}. The value of \cs{@tlabelsleft} is set equal to this +% if it was greater. We save the calculated value in \cs{tb@moveright}, +% because it is exactly the amount we'll need to \cs{kern} later to +% position the label. +% \begin{macrocode} + \begingroup + \ifcase\tl@hpos \advance\mfp@scratch -0.5\tb@wd % center + \or \advance\mfp@scratch -\tb@wd % right + \advance\mfp@scratch -\tlabel@sep + \else \advance\mfp@scratch \tlabel@sep % left (default) + \fi + \advance\mfp@scratch \tlabel@hadj + \ifdim \mfp@scratch<\@tlabelsleft + \@tlabelsleft\mfp@scratch + \fi + \tb@moveright\mfp@scratch + \endgroup % \end{macrocode} % -% We then compute its total height to simplify later code. -% \begin{macrocode} - \newdef\@tlabel##1##2##3{% - \set@textbox{##3}% - \mfp@scratch\tb@ht \advance\mfp@scratch\tb@dp - \tb@totalht\mfp@scratch +% Now we base the calculations on the uppermost extent of picture and +% label. Otherwise the idea is the same, and we may increase +% \cs{@tlabelstop}. Again we save the calculated result (in \cs{tb@raise}) +% for later positioning of the label. +% \begin{macrocode} + \@yconv{#2}\mfp@scratch + \begingroup + \ifcase\tl@vpos \advance\mfp@scratch \tb@totalht % bottom + \advance\mfp@scratch \tlabel@sep + \or \advance\mfp@scratch 0.5\tb@totalht % center + \or \advance\mfp@scratch -\tlabel@sep % top + \else \advance\mfp@scratch \tb@ht % baseline (default) + \fi + \advance\mfp@scratch \tlabel@vadj + \ifdim \mfp@scratch>\@tlabelstop + \@tlabelstop\mfp@scratch + \fi + \tb@raise\mfp@scratch + \endgroup % \end{macrocode} % -% The following computes whether the rightmost extent of the picture will -% be increased by the addition of the label. We convert the x-coordinate -% of the label's location to a distance from the left edge of the picture. -% We then add to that the amount of the label extending to the right of -% this location. Then we add or subtract the separation of the label -% from its location. Finally, we simply add the horizontal adjustment -% defined by the user with \cs{tlabeloffset}. The value of -% \cs{@tlabelsright} is set equal to this if it was less. We could omit -% this group: we never use \cs{@tlabelsright} except in debugging. -% -% The macro \cs{tb@wd} expands to \cs{wd}\cs{@textbox}. +% Finally we compute the lowermost extent, and save it in \cs{@tlabelsbot}. % \begin{macrocode} - \mfp@scratch=##1\mfpicunit - \@xconv\mfp@scratch - \begingroup - \ifcase\tl@hpos \advance\mfp@scratch 0.5\tb@wd % center - \or \advance\mfp@scratch -\tlabel@sep % right - \else \advance\mfp@scratch \tb@wd % left - \advance\mfp@scratch \tlabel@sep - \fi - \advance\mfp@scratch \tlabel@hadj - \ifdim \mfp@scratch>\@tlabelsright - \@tlabelsright=\mfp@scratch - \fi - \endgroup + \begingroup + \ifcase\tl@vpos \advance\mfp@scratch \tlabel@sep % bottom + \or \advance\mfp@scratch -0.5\tb@totalht % center + \or \advance\mfp@scratch -\tb@totalht % top + \advance\mfp@scratch -\tlabel@sep + \else \advance\mfp@scratch -\tb@dp % baseline (default) + \fi + \advance\mfp@scratch \tlabel@vadj + \ifdim \mfp@scratch<\@tlabelsbot + \@tlabelsbot\mfp@scratch + \fi + \endgroup % \end{macrocode} % -% The following is the same as the previous calculations, but with respect -% to the leftmost extension of picture and label. Here, however, we save -% the calculated value in \cs{tb@moveright}, because it is exactly the -% amount we'll need to \cs{kern} later to position the label. +% Now we've computed the new size of \cs{@alltlabels} and we put the +% new label on top of it with the above calculated kerns. % \begin{macrocode} - \begingroup - \ifcase\tl@hpos \advance\mfp@scratch -0.5\tb@wd % center - \or \advance\mfp@scratch -\tb@wd % right - \advance\mfp@scratch -\tlabel@sep - \else \advance\mfp@scratch \tlabel@sep % left - \fi - \advance\mfp@scratch \tlabel@hadj - \tb@moveright=\mfp@scratch - \ifdim \mfp@scratch<\@tlabelsleft - \@tlabelsleft=\mfp@scratch - \fi - \endgroup + \global \setbox\@alltlabels + \vtop{\unvbox\@alltlabels + \vbox to 0pt{\kern-\tb@raise + \hbox{\kern\tb@moveright\box\@textbox}\vss}}% +}% End \tex@@tlabel % \end{macrocode} % -% Now we base the calculations on the vertical extent of picture and -% label. Otherwise the idea is the same, and we may increase -% \cs{@graphtop}. The macro \cs{tb@ht} means \cs{ht}\cs{@textbox} and -% \cs{tb@dp} means \cs{dp}\cs{@textbox}. Again we save the calculated -% result (in \cs{tb@raise}) for later positioning of the label. -% \begin{macrocode} - \mfp@scratch=##2\mfpicunit - \@yconv\mfp@scratch - \begingroup - \ifcase\tl@vpos \advance\mfp@scratch \tb@totalht % bottom - \advance\mfp@scratch \tlabel@sep - \or \advance\mfp@scratch 0.5\tb@totalht % center - \or \advance\mfp@scratch -\tlabel@sep % top - \else \advance\mfp@scratch \tb@ht % baseline - \fi - \advance\mfp@scratch \tlabel@vadj - \tb@raise=\mfp@scratch - \ifdim \mfp@scratch>\@tlabelstop - \@tlabelstop=\mfp@scratch - \fi - \endgroup -% \end{macrocode} +% The argument of \cs{mfp@labels} is the ostensible argument of +% \cs{tlabels}. Looping is accomplished by defining \cs{extra@endtlabel} +% to repeat \cs{mfp@dolabel}. % -% Finally we compute the bottom-most extent. +% If \cs{mfp@dolabel} sees the end-of-loop delimiter it ends the group and +% gobbles the delimiter. Otherwise it calls \cs{tlabel}, which sees the +% next set of arguments, places the label, and repeats the loop. % \begin{macrocode} - \begingroup - \ifcase\tl@vpos \advance\mfp@scratch \tlabel@sep % bottom - \or \advance\mfp@scratch -0.5\tb@totalht % center - \or \advance\mfp@scratch -\tb@totalht % top - \advance\mfp@scratch -\tlabel@sep - \else \advance\mfp@scratch -\tb@dp % baseline - \fi - \advance\mfp@scratch \tlabel@vadj - \ifdim \mfp@scratch<\@tlabelsbot - \@tlabelsbot=\mfp@scratch - \fi - \endgroup +\newdef\mfp@labels#1{\let\extra@endtlabel\mfp@dolabel + \mfp@dolabel#1\mfp@end}% +\newdef\mfp@dolabel{\mfp@ifend\endgroup\tlabel}% % \end{macrocode} % -% Now we've computed the new size of \cs{@alltlabels} and we put the -% new label on top of it with the above calculated kerns. +% \cs{mfp@labelpath} stores the name of the path in \cs{mfp@name} and the +% default argument in \cs{mfp@param}, then check for a \texttt{*} and set +% a switch based on it before calling \cs{mfp@tlpath}. The +% \cs{mfp@figmacbase} must be outside the group so the switches it sets +% will survive for later commands to detect. % \begin{macrocode} - \global \setbox\@alltlabels=% - \vtop{\unvbox\@alltlabels - \vbox to 0pt{\kern-\tb@raise - \hbox{\kern\tb@moveright\box\@textbox}\vss}}% - \endgroup % group begun in \tlabel - \extraendtlabel}% End \@tlabel +\newdef\mfp@labelpath#1#2{\mfp@figmacbase + \begingroup % ended in \tlabelpath@ + \def\mfp@name{#1}\def\mfp@param{#2}% + \mfp@ifstar\mfp@tlpath\mfp@switchtrue\mfp@switchfalse}% % \end{macrocode} % -% \subsection{Surrounding the label with a path}\label{surrounding} -% -% These next macros place labels, but also define a path surrounding the -% label This allows one to clear a space for the label, create a -% background, draw a box around it, etc. They take two optional arguments. -% The first optional argument depends on the type of path being created. -% It is described below. The second one is the justification as in the -% \cs{tlabel} command. There are two mandatory arguments, the location -% (same syntax as for \cs{tlabel}) and the text. They also have -% star-forms, which create the path but doesn't place the label. -% -% All the curves are sized to just contain what I will call the -% \emph{label strip}. Imagine a rectangle that just fits around the text. -% Now extend it on all sides by the value defined with \cs{tlabelsep}. -% This rectangle is the label strip. -% -% \DescribeMacro{\tlabelrect} -% \cs{tlabelrect} creates the rectangular boundaries of the label strip by -% default. With the optional argument a rectangle with rounded corners is -% produced; the optional argument is the radius of the quarter circles used. -% These quarter circles pass through the corners of the label strip and are -% joined together with straight lines to create the rest of the rectangle. -% As a special case, the optional argument can contain the keyword -% `\texttt{roundends}' to produce a rectangle with the short sides -% replaced by a semicircle. -% -% \DescribeMacro{\tlabeloval} -% \cs{tlabeloval} produces an ellipse which, by default has the same -% aspect ratio as the label strip. It is sized to just include that label strip, -% passing through its four corners. The optional argument contains a -% numerical factor $m$ that, if greater than 1, increases the width and -% decreases the height to maintain this relationship with the label strip, -% while multiplying the width to height ratio by $m$. The default value of -% $m$ is 1. -% -% \DescribeMacro{\tlabelellipse} -% \cs{tlabelellipse} produces an ellipse, where the optional argument $a$ -% is the ratio of its width to its height. The default for $a$ is 1, which -% produces a circle. -% -% \DescribeMacro{\tlabelcircle} -% To get a circle the user can \cs{tlabelellipse} without the optional -% argument, or with argument \oarg{1}. However, it makes for a more -% readable source if the command reflects the shape. \cs{tlabelcircle} is -% defined to be essentially \cs{tlabelellipse}\oarg{1}, but it first -% checks for the \texttt{*} and passes it along in front of the \oarg{1}. -% -% We implement the other three by calling \cs{tlpath} with the name of the -% curve (\texttt{rect}, \texttt{oval}, or \texttt{ellipse}) and the -% default value of the optional argument (\texttt{0}, \texttt{1}, and -% \texttt{1}, respectively) as arguments. +% Process the first optional argument, which has value of \cs{mfp@param} +% as default. The second one is a justification with a default set by the +% user with \cs{tlpathjustify} or the initial \texttt{[cc]} setting. Once +% these are processed, we check whether a parentheses follows, calling one +% of two different handlers for the location parameter(s). % \begin{macrocode} - \newdef\tlabelrect{\tlpath{rect}{0}}% - \newdef\tlabeloval{\tlpath{oval}{1}}% - \newdef\tlabelellipse{\tlpath{ellipse}{1}}% - \newdef\tlabelcircle{% - \mfp@ifnextchar*{\@firstoftwo{\tlabelellipse*[1]}}% - {\tlabelellipse[1]}}% -% \end{macrocode} -% -% We store the name of the path in \cs{mfp@name} and the default argument -% in \cs{mfp@param}, then check for a \texttt{*} and set a switch based -% on it before calling \cs{@tlpath}. The \cs{@figmacstart} must be outside -% the group so the switches it sets will survive for later commands to -% detect. -% \begin{macrocode} - \newdef\tlpath##1##2{\@figmacstart - \begingroup % ended in \tlabelpath@ - \def\mfp@name{##1}\def\mfp@param{##2}% - \mfp@ifnextchar*% - {\@mfpswitchtrue\@firstoftwo{\@tlpath}}% gobbles the star - {\@mfpswitchfalse\@tlpath}}% -% \end{macrocode} -% Process first optional argument. First one has value of \cs{mfp@param} -% as default. The second one has a default justification set by the user -% with \cs{tlpathjustify} or the initial \texttt{[cc]} setting. Once these -% are processed, we check whether a parentheses follows, calling one of -% two different handlers for the location parameter(s). -% \begin{macrocode} - \newdef\@tlpath{\null@opt\@@tlpath}% - \newdef\@@tlpath[##1]{% - \edef\mfp@param{\mfp@mtsub{##1}{\mfp@param}}% - \mfp@resetwhitespace - \simple@opt\@@@tlpath{\tlpath@v\tlpath@h\tlpath@r}}% - \newdef\@@@tlpath##1{\tlabeljustify{##1}% - \mfp@setMPpos \mfp@ifnextchar({\@tlabelpath}{\@@tlabelpath}}% +\newdef\mfp@tlpath#1{#1\mfp@defaultopt\mfp@@tlpath\mfp@param}% +\newdef\mfp@@tlpath#1{\edef\mfp@param{#1}% + \mfp@defaultopt\mfp@tlpath@{\tlpath@v\tlpath@h\tlpath@r}}% +\newdef\mfp@tlpath@#1{\mfp@resetwhitespace\mp@mksharpother + \tlabeljustify{#1}\@ifnextchar({\@tlabelpath}{\@@tlabelpath}}% % \end{macrocode} % % These handlers just stuff the point into a macro and call the command -% that reads the label code. The name \cs{mfp@points} is plural (even +% that reads the label code. The name \cs{tl@points} is plural (even % though only one point is supported) because the internal command that -% places the label expects this macro. We use \cs{@firstofone} so -% that the braces will not be written to the output, but they will -% function as braces for \TeX's parameter matching. -% \begin{macrocode} - \newdef\@tlabelpath (##1,##2){% - \def\mfp@points{(\@firstofone{##1},\@firstofone{##2})}% - \@@@tlabelpath}% - \newdef\@@tlabelpath##1{\def\mfp@points{##1}\@@@tlabelpath}% - \newdef\@@@tlabelpath{\mfp@restorepar - \@ifmplabels{\@makeother\#}{}\mfp@gettoks\tlabelpath@}% -% \end{macrocode} -% -% Under \opt{mplabels} we just call on \MP{} to do everything (including -% measuring the text). Otherwise we measure the text in \TeX{} and feed -% the bounding box corners to \MF{} for making the path. Then we optionally -% place the text based on the switch previously set. All the data needed -% have already been stored in macros by previous commands in the chain. -% \begin{macrocode} - \newdef\tlabelpath@{% - \@ifmplabels - {\mfcmd{text\mfp@name x (\mfp@MPpos)\@nl(origin, % dummy parameter - \mfp@btex{\the\mfp@toks}, \mfp@param, \mfp@points)}}% - {\measure@textbox{\the\mfp@toks}% - \mfcmd{text\mfp@name x (\mfp@MPpos)\@nl(\tb@ll, \tb@ur, % text bbox - \mfp@param, \mfp@points)}}% - \if@mfpswitch \endgroup % *-form, no label placed - \else % tlabel commands contain \endgroup - \@ifmplabels{\@@@tlabel}% - {\@xp\@@tlabel@\mfp@points{\the\mfp@toks}}% - \fi}% -% \end{macrocode} -% -% Here we define the command that measures the text. It is almost a clone -% of a similar code sequence in \cs{@tlabel}, but it produces the \gbc{ll} -% and \gbc{ur} (corners of the boundingbox) that the \grafbase{} code -% needs. +% places the label expects this macro. % \begin{macrocode} - \newdef\measure@textbox##1{% - \set@textbox{##1}% - \edef\tb@ll{(0, -(\the\tb@dp))}% - \edef\tb@ur{(\the\tb@wd, \the\tb@ht)}}% +\newdef\@tlabelpath(#1,#2){\@@tlabelpath{(#1,#2)}}% +\newdef\@@tlabelpath#1#2{% + \def\tl@points{#1}\mfp@toks{#2}\tlabelpath@}% % \end{macrocode} % -% \subsection{Placing multiple text labels}\label{multiple} -% -% \DescribeMacro{\tlabels} -% One of the more onerous things about labels in \env{mfpic} environments -% was the shear number of them. The following was intended to reduce the -% amount of typing by having to repeat only the arguments. \cs{tlabels} -% takes only one argument: any sequence of valid arguments for a \cs{tlabel} -% command, optionally separated by whitespace (but not blank lines). +% By this point, all the elements we need are gathered. For the purposes +% of the label we have \cs{mfp@toks} holding the label code, +% \cs{tl@points} holding the location, and \cs{tlabeljustify} encoding +% the adjustments. For the path, we have the type in \cs{mfp@name}, and the +% one optional parameter parameter in \cs{mfp@param}. % -% We begin a group, reset whitespace to normal, and call the command that -% reads the argument. That command arranges to make the main code -% self-looping by defining \cs{extraendtlabel} to call the beginning of the -% loop, then it feeds its argument to \cs{do@tlabels} followed by a -% delimiter to signal the end of the loop. +% Under \opt{mplabels} we expect \MP{} to measure the text. Otherwise we +% measure the text in \TeX{} and feed the bounding box corners to \MF{} +% for making the path. If \cs{ifmfp@switch} is false we place the text by +% calling \cs{mfp@thelabel}. All the data needed by \cs{mfp@thelabel} have +% already been stored in macros by previous commands in the chain. Then we +% complete the command by ending the group that \cs{mfp@labelpath} +% started. % \begin{macrocode} - \newdef\tlabels{% - \begingroup % ended in \do@tlabels - \mfp@resetwhitespace \@tlabels}% - \newdef\@tlabels##1{\def\extraendtlabel{\do@tlabels}% - \do@tlabels##1\mfp@delim}% +\newdef\tlabelpath@{\@ifmplabels{}{\measure@textbox{\the\mfp@toks}}% + \mfp@setMPpos + \mfcmd{text\mfp@name x (\mfp@MPpos)\@nl + (\@ifmplabels{origin, \mfp@btex{\the\mfp@toks}}{\tb@ll, \tb@ur}, + \mfp@param) (\tl@points)}% + \ifmfp@switch\else \mfp@thelabel\fi \endgroup}% % \end{macrocode} % -% If \cs{do@tlabels} sees the end-of-loop delimiter it ends the group and -% gobbles the delimiter. Otherwise it calls \cs{tlabel}, which sees the -% next set of arguments, and repeats the loop. +% Here we define the command that measures the text. It is almost a clone +% of a similar code sequence in \cs{tex@tlabel}, but it produces the \gbc{ll} +% and \gbc{ur} (corners of the boundingbox) that the \grafbase{} code +% needs. % \begin{macrocode} - \newdef\do@tlabels{% - \mfp@ifnextchar\mfp@delim{\@firstoftwo\endgroup}{\tlabel}}% +\newdef\measure@textbox#1{\set@textbox{#1}% + \mfp@scratch-\tb@dp + \edef\tb@ll{(0, \the\mfp@scratch)}% + \edef\tb@ur{(\the\tb@wd, \the\tb@ht)}}% % \end{macrocode} % -% Labelling axes generates a lot of \cs{tlabel} commands or a single -% \cs{tlabels} command with a lot of arguments. Given that such labels -% have much in common (e.g., for the x-axis the y-coordinate and the -% justification are usually the same for all the labels) we can do still -% better at abbreviating this task. +% The first four argumenmts of \cs{mfp@axislabels} are the edges of the +% surrounding \env{mfpic} environment (left, right, bottom, top). The +% fifth is the axis letter. % -% \DescribeMacro{\axislabels} -% The \cs{axislabels} command takes a mandatory argument (the axis) -% followed by an optional argument (the justification, as in the -% \cs{tlabel} command), followed by another mandatory argument, a comma -% separated list of items of the form -% \marg{\meta{label}}\meta{coordinate}. The label is placed at that -% coordinate on the given axis. This command is complicated by the fact -% that the default justification should be different for each axis (for -% example, for the y-axis it is \oarg{cr} but for the x-axis it is -% \oarg{tc}). For all of them, one of the parts is \texttt{c}, so after -% resetting whitespace we initialize them both to this and later change -% only the one that needs it. +% We start by determining the default justification. which is different +% for each axis (for example, for the left axis it is \oarg{cr} but for +% the bottom axis it is \oarg{tc}). For all of them, one of the parts is +% \texttt{c}, so after resetting whitespace we initialize them both to +% this and later change only the one that needs it. % % Also, one of the coordinates of a label will be given by the argument, % while the other is the location of the axis. However, which coordinate -% is which is different for different axes. What we do is feed the -% argument to \cs{mfp@xcoord} and \cs{mfp@ycoord}. Both are initialized to +% is which is different for different axes. What we do is feed this +% position to \cs{mfp@xcoord} and \cs{mfp@ycoord}. Both are initialized to % the identity macro, but one is changed to expand to just the axis -% position. -% -% The axis position for x- and y-axis is 0. For border axes it is -% calculated by adding the border axis shift to the border coordinate. -% \begin{macrocode} - \newdef\axislabels##1{% - \begingroup % ended in \do@axislabel - \mfp@resetwhitespace \tlabeljustify{cc}% - \let\mfp@xcoord=\@firstofone \let\mfp@ycoord=\@firstofone - \get@axisnum{##1}\axislabels - \ifcase\mfp@axisnum \tl@vpos=2 % x-axis -->[tc] - \def\mfp@ycoord{0}% - \or \tl@hpos=1 % y-axis-->[cr] - \def\mfp@xcoord{0} - \or \tl@hpos=1 % left -->[cr] - \edef\mfp@xcoord{\mfp@lshift}\mfpaddto\mfp@xcoord{#3}% - \or \tl@vpos=2 % bottom-->[tc] - \edef\mfp@ycoord{\mfp@bshift}\mfpaddto\mfp@ycoord{#5}% - \or \tl@hpos=-1 % right -->[cl] - \edef\mfp@xcoord{-\mfp@rshift}\mfpaddto\mfp@xcoord{#4}% - \or \tl@vpos=0 % top -->[bc] - \edef\mfp@ycoord{-\mfp@tshift}\mfpaddto\mfp@ycoord{#6}% +% position. The axis position for $x$ and $y$ axis is 0. For border axes +% it is calculated by adding the border axis shift to the border +% coordinate. +% \begin{macrocode} +\newdef\mfp@axislabels#1#2#3#4#5{% + \begingroup % ended in \mfp@(@)doaxislabel + \mfp@resetwhitespace + \tl@vpos1 \tl@hpos0 + \let\mfp@xcoord\@firstofone \let\mfp@ycoord\@firstofone + \mfp@getaxis#5\relax\mfp@end\axislabels + \ifcase\mfp@axisnum\relax + \tl@vpos2 \def\mfp@ycoord{0}\or + \tl@hpos1 \def\mfp@xcoord{0}\or + \tl@hpos1\edef\mfp@xcoord{\mfp@lshift}% + \mfpaddto\mfp@xcoord{#1}\or + \tl@vpos2\edef\mfp@ycoord{\mfp@bshift}% + \mfpaddto\mfp@ycoord{#3}\or + \tl@hpos-1 \edef\mfp@xcoord{-\mfp@rshift}% + \mfpaddto\mfp@xcoord{#2}\or + \tl@vpos0 \edef\mfp@ycoord{-\mfp@tshift}% + \mfpaddto\mfp@ycoord{#4}% \fi % \end{macrocode} % % Now one of \cs{mfp@xcoord} or \cs{mfp@ycoord} expands to the axis -% position. We change it so that it does this while gobbling a parameter. -% And then call \cs{@axislabels}, feeding it an empty argument as the -% default optional argument. +% position. We change it so that it does this while gobbling the +% parameter, and then call \cs{mfp@@axislabels}, feeding it an empty +% argument as the default optional argument. We also give \texttt\# a safe +% catcode for writing to a \file{.mp} file. % \begin{macrocode} \ifx\@firstofone\mfp@xcoord - \edef\mfp@ycoord####1{\mfp@ycoord}% + \edef\mfp@ycoord##1{\mfp@ycoord}% \else - \edef\mfp@xcoord####1{\mfp@xcoord}% - \fi \null@opt\@axislabels}% -% \end{macrocode} -% -% \cs{@axislabels} processes the contents of the optional parameter and -% calls \cs{do@axislabel} on the list in the argument. An additional item -% is added that signals the end of the loop. -% \begin{macrocode} - \newdef\@axislabels[##1]##2{% - \tlabeljustify{##1}% - \do@axislabel~ ##2,\mfp@delim}% -% \end{macrocode} -% -% We add some code that traps the most common typos: a comma between the -% label and the coordinate, or a missing coordinate, or a doubled comma. -% It seems impossible to detect which of the first two has happened, and -% assuming the first case produces really awful results if the second is -% true. Therefore when a coordinate seems to be missing, we just lose the -% text (as we have no place to put it) and resume the loop. If the first -% case is true, the next iteration will see only the number, read one -% digit or decimal as the text and the rest as the coordinate. The output -% will be wrong, but at least \TeX{} can proceed. -% -% Above we prepended a `\verb*+~ +' so that if the coordinate is missing, -% the braces around the argument won't be lost; the space will be -% consumed in the argument processing of \cs{do@@axislabel}. -% -% The first argument should be the label, and everything from that to the -% comma is the location. In the above error cases, the second argument -% is empty -% \begin{macrocode} - \newdef\do@axislabel~##1,{% - \@ifmtarg{##1}{\x@axislabel}{\do@@axislabel##1\@nil}}% - \newdef\do@@axislabel##1##2\@nil{% - \@ifmtarg{##2}% - {\Mfpic@warn{Possible extra comma, missing coordinate, or - missing\@msgbreak braces in \string\axislabels\@online. - Skipping this label.}}% - {\tlabel(\mfp@xcoord{##2},\mfp@ycoord{##2}){##1}}% - \x@axislabel}% - \newdef\x@axislabel{% check for end of list - \mfp@ifnextchar\mfp@delim{\@firstoftwo\endgroup}{\do@axislabel~ }}% + \edef\mfp@xcoord##1{\mfp@xcoord}% + \fi \mp@mksharpother\mfp@nullopt\mfp@@axislabels}% % \end{macrocode} % -% \subsection{Captions}\label{captions} -% -% Captions are not added immediately by the \cs{tcaption} command. That -% command redefines \cs{@docaption} to add it, and \cs{endmfpic} executes -% \cs{@docaption}. For now, \cs{@docaption} does nothing. +% \cs{mfp@@axislabels} processes the contents of the optional parameter +% and calls \cs{mfp@doaxislabel} on the list of labels. % \begin{macrocode} - \newdef\@docaption{}% +\newdef\mfp@@axislabels#1#2{% + \tlabeljustify{#1}\mfp@doaxislabel#2,\mfp@end}% % \end{macrocode} % -% \DescribeMacro{\tcaption} -% \cs{tcaption} takes an optional argument that holds two numbers, -% separated by a comma. The first number determines the maximum width of a -% one line caption. Captions larger than that multiple of the width of the -% graphic will be reset as a paragraph, whose lines have length the second -% number times the width of the graph. The defaults are \oarg{1.2,1}. +% \cs{mfp@doaxislabel} checks for the end delimiter or a comma (the latter +% is an error). In the first case it ends all label processing, in the +% second it repeats itself, otherwise it continues with +% \cs{mfp@@doaxislabel}. +% +% The argument of \cs{mfp@@doaxislabel} should be the label. This command +% stores the label in \cs{mfp@toks}, then again checks for the delimiter +% or an comma (both are errors). In the first case it ends the process; in +% the second it goes back to \cs{mfp@doaxislabel} for another try. In both +% cases the label is discarded as we don't know where to put it. If +% neither the delimiter nor a comma occurs, \cs{mfp@mkaxislabel} is run. +% +% The argument of \cs{mfp@mkaxislabel} (everything to the next comma) is the +% location. The command \cs{mfp@mkaxislabel} does nothing if the location +% parameter is empty, otherwise it stores the location as a pair and calls +% \cs{mfp@thelabel} to place the label. Finally, it repeats +% \cs{mfp@doaxislabel} for the next iteration. +% \begin{macrocode} +\newdef\mfp@doaxislabel{% + \mfp@ifendorcomma\endgroup\mfp@doaxislabel\mfp@@doaxislabel}% +\newdef\mfp@@doaxislabel#1{\mfp@toks{#1}% + \mfp@ifendorcomma\endgroup\mfp@doaxislabel\mfp@mkaxislabel}% +\newdef\mfp@mkaxislabel#1,{% + \@ifmtarg{#1}{}% + {\edef\tl@points{(\mfp@xcoord{#1},\mfp@ycoord{#1})}\mfp@thelabel}% + \mfp@doaxislabel}% +% \end{macrocode} % -% \cs{@tcaption} has one mandatory argument, the caption's text. In it, the +% \cs{mfp@caption} has one mandatory argument, the caption's text. In it, the % \cs{\bsl} command forces line breaks. This works by forcing the width to % be greater than any reasonable setting of the maximum line width. When % this happens, the caption is reset in a \cs{vbox} and \cs{\bsl} is % redefined like a normal line break. % \begin{macrocode} - \newdef\tcaption{\simple@opt\tcaption@{1.2, 1.0}}% - \newdef\tcaption@##1{\@tcaption##1\mfp@delim}% - \long\def\@tcaption##1,##2\mfp@delim##3{% - \def\@docaption{% - \setbox\@textbox=% - \hbox{\def\\{\hskip\@M\p@}\mfp@restorepar - \@tcurr##3}% +\newdef\mfp@caption#1{\begingroup\mfp@resetwhitespace + \mfp@@caption#1\mfp@end}% +\long\def\mfp@@caption#1,#2\mfp@end#3{\endgroup + \def\mfp@docaption{% + \setbox\@textbox + \hbox{\def\\{\hskip\@M\p@\let\\\relax}\mfp@restorepar + \@nameuse{@safe@activesfalse}\@tcurr#3}% % \end{macrocode} % % If the above \cs{hbox} is too wide, we re-assign \cs{@textbox} to a % \cs{vbox} with \cs{hsize} determined by the second part of the optional -% argument, and with \cs{leftskip} and \cs{rightskip} defined according -% to the setting of \opt{centeredcaptions}. -% \begin{macrocode} - \@graphwd=\wd\@wholegraph - \ifdim\tb@wd>##1\@graphwd - \setbox\@textbox=% - \hbox{% - \vbox{% - \if@mfp@latex % keep LaTeX's `\\' - \else - \def\\{\unskip\hbox{}\hfil\penalty-\@M\ignorespaces}% - \fi - \if@mfp@centcapt - \leftskip=0pt plus 0.5fil - \rightskip=0pt plus -0.5fil - \parfillskip=0pt plus 1fil - \else - \leftskip=0pt - \rightskip=0pt - \fi - \hsize=##2\@graphwd \mfp@restorepar - \noindent\@tcurr ##3% - }% End vbox. - }% End hbox. - \fi +% argument. \cs{mfp@capsettings} implements the \opt{centeredcaptions} +% and \opt{raggedcaptions} options. +% \begin{macrocode} + \mfp@scratch\wd\@wholegraph + \ifdim\tb@wd>#1\mfp@scratch + \setbox\@textbox + \hbox{% + \vbox{% + \hsize#2\mfp@scratch \mfp@restorepar + \leftskip0pt + \rightskip0pt + \mfp@capsettings + \@nameuse{@safe@activesfalse}\noindent\@tcurr #3% + }% End vbox. + }% End hbox. + \fi % \end{macrocode} % % Here we determine the wider of the graph or the caption, then put the @@ -4597,43 +5692,54 @@ % width, stacked one atop the other with \cs{mfpiccaptionskip} (default: % \cs{medskipamount}) in between. % \begin{macrocode} - \mfp@scratch=\wd\@wholegraph - \ifdim \mfp@scratch<\tb@wd \mfp@scratch=\tb@wd \fi - \global\setbox\@wholegraph=% - \vbox{\hbox to \mfp@scratch{\hss\box\@wholegraph\hss}% - \nointerlineskip \vskip\mfpiccaptionskip - \hbox to \mfp@scratch{\hss\box\@textbox\hss}}% End vbox. - }% End \@docaption. -% \ignorespaces - }% End \@tcaption. -% \ignorespaces -}% End of \@mfpic + \ifdim \mfp@scratch<\tb@wd \mfp@scratch\tb@wd \fi + \global\setbox\@wholegraph + \vbox{\hbox to \mfp@scratch{\hss\box\@wholegraph\hss}% + \nointerlineskip \vskip\mfpiccaptionskip + \hbox to \mfp@scratch{\hss\box\@textbox\hss}}% End vbox. + }% End \mfp@docaption. +}% End \mfp@@caption. % \end{macrocode} % +% The following is used in \cs{endmfpic}. The first argument of +% \cs{mfp@adjustdim} is a border dimension of the box containing all the +% labels, the second is a comparison between that and the corresponding +% dimension of the graph box, which is the third argument. The last is the +% macro holding the adjustments needed when \opt{truebbox} is used. The +% first and last line compensate for the fact that the bbox need not start +% at $(0,0)$. The second line checks if the label box extends past the +% graph's edge and adjusts the graph's dimension is it does. +% \begin{macrocode} +\def\mfp@adjustdim#1#2#3#4{% + \mfp@scratch#1\relax \advance\mfp@scratch-#4 bp + \ifdim\mfp@scratch#2#3\relax #3\mfp@scratch \fi + #1\mfp@scratch}% +% \end{macrocode} % % \section{Placing the picture: \cs{endmfpic}}\label{endmfpic} % +% \DescribeMacro{\endmfpic} % By the time \cs{endmfpic} is reached, the \MF{} code for the figure has % all been written to the output file. The labels have all been % accumulated and arrangements have been made to add the caption. % -% \DescribeMacro{\endmfpic} -% Under \opt{metapost}, write \cs{endgroup} to match beginning written +% Under \opt{metapost}, write a right brace to match the left written % by \cs{mfpic} Then write the \cs{grafbase} command \gbc{endmfpic}, % followed by a comment telling which figure number it is, and the line % number in the \TeX{} source where the \cs{endmfpic} occurred. % \begin{macrocode} \mfp@DBlog{Definition of closure of mfpic environment.}% -\newdef\endmfpic{% - \mfsrc{\mfp@ifmpost{\@nl verbatimtex \endgroup\space etex;}{}\@nl - endmfpic;\mf@p (\number\mfp@count) \space\@mfplineno.\@nl - \mf@p\mf@d\mf@d\mf@d\@nl}% +\newdef\endmfpic{\every@endmfpic + \mfsrc{\mfp@ifmpost{\@nl verbatimtex \egroup\space etex;}{}\@nl + endmfpic; \mfp@p\space(\number\mfp@count) \mfp@lineno.\@nl + \mfp@p\mfp@d\mfp@d\mfp@d\@nl}% \ifmfpicdebug\wlog{}\wlog{Mfpic: ENTERED endmfpic.}\wlog{}\fi % \end{macrocode} +% % The code to load and place the box is skipped if figure shipping was % turned off. % \begin{macrocode} - \if@shipping % + \ifmfp@noship \else % \end{macrocode} % % \subsection{Loading and measuring the graphic}\label{loading} @@ -4644,7 +5750,7 @@ % equivalent of issuing \cs{opengraphsfile} at every \cs{mfpic} and % \cs{closegraphsfile} at every \cs{endmfpic}.) % \begin{macrocode} - \global\setbox\@wholegraph=% + \global\setbox\@wholegraph \vbox{% % \end{macrocode} % @@ -4653,66 +5759,61 @@ % \begin{macrocode} \ifmfpicdraft \vbox to \@graphtop{\vss - \hbox to \@graphwd{\kern2pt\tt\#\number\mfp@count\hss}% - \kern2pt}% + \hbox to \@graphright{% + \kern2pt \mfpdraftfont\#\number\mfp@count\hss}% + \kern2pt}% \else % \end{macrocode} % % The \opt{truebbox} option works at the \MP{} level. Without it the % height of the EPS bounding box will actually be the calculated value -% of \cs{@graphtop} (but increased by up to \texttt{2bp} due to rounding). -% With it, the box will be its natural height. In either case, the actual -% height is what we use in the \MP{} case. For \MF{} we use the nominal -% height calculated in \cs{mfpic}. +% of \cs{@graphtop}. With it, the box will be its natural height. But +% in either case, the value will actually be increased by up to +% \texttt{2bp} because of rounding, so the bounding box height is what we +% use in the \MP{} case. For \MF{} we use the nominal height calculated in +% \cs{mfpic}. % \begin{macrocode} - \mfp@ifmpost{\vbox}{\vbox to \@graphtop}% - {\vss + \mfp@ifmpost{\vbox}{\vbox to \@graphtop}% + {\vss % \end{macrocode} % % \cs{@graphfilename} holds the name of the \MP{} output figure. (It will be % ignored by the \opt{metafont} option.) We test if the file exists before % doing the graphic inclusion because of the large number of confusing error % messages many graphic inclusion packages generate otherwise. When absent -% we substitute the figure number for \cs{@setmfpicgraphic}. When present, -% and if in \LaTeXe, we arrange for the current numerical extension to be -% accepted as an EPS or MPS file by the \cs{includegraphics} command of the -% graphics package. -% \begin{macrocode} - \edef\@graphfilename{\setfilename{\mfp@filename}% - {\number\mfp@count}}% - \mfp@ifmpost - {\openin\mfp@graph=\@graphfilename\relax - \ifeof\mfp@graph - \Mfpic@msg{No graph file: \@graphfilename\space.}% - \def\@setmfpicgraphic##1{\raise2pt\hbox{\kern2pt\tt ##1}}% - \closein\mfp@graph - \else\if@mfp@latexe - \@namedef{Gin@rule@.\number\mfp@count}##1{% - {\mfp@Gtype}{.\number\mfp@count}{##1}}% - \fi\fi}{}% +% we substitute the figure filename for \cs{@setmfpicgraphic}. +% \begin{macrocode} + \edef\@graphfilename{% + \setfilename\mfp@filename{\number\mfp@count}}% + \mfp@ifmpost + {\IfFileExists{\@graphfilename}{}% + {\Mfpic@msg{No graph file: \@graphfilename\space.}% + \let\@setmfpicgraphic\nofile@setmfpgraphic}% % \end{macrocode} % % We put the graphic in an \cs{hbox} of the required width and close off % the boxes. % \begin{macrocode} - \mfp@ifmpost{\hbox}{\hbox to \@graphwd}% - {\@xp\@setmfpicgraphic\@xp{\@graphfilename}\hss}% End hbox. - \kern0pt + \hbox}% + {\hbox to \@graphright}% + {\@xp\@setmfpicgraphic\@xp{\@graphfilename}\hss}% + \kern0pt }% End vbox \fi - }%% End vbox (\setbox\@wholegraph) + }%% End \setbox\@wholegraph \vbox % \end{macrocode} % % We change the horizontal and vertical dimensions under \opt{metapost} in % case \opt{truebbox} was in effect, but also because they are almost always % rounded up to whole numbers of \texttt{bp} and therefore, even without -% \opt{truebbox} the calculated values needn't be correct. +% \opt{truebbox}, the calculated values needn't be correct. % \begin{macrocode} \mfp@ifmpost - {\@graphright=\wd\@wholegraph - \@graphtop=\ht\@wholegraph - \@graphwd=\@graphright}{}% + {\@graphright\wd\@wholegraph + \@graphtop\ht\@wholegraph}{}% \ifmfpicdebug + \wlog{Mfpic debug: Dimensions of wholegraph before labels + are added, and before truebbox adjustments:}% \wlog{Mfpic: graphleft = \the\@graphleft}% \wlog{Mfpic: graphright = \the\@graphright}% \wlog{Mfpic: graphtop = \the\@graphtop}% @@ -4726,52 +5827,46 @@ % % \subsection{Adding labels and caption}\label{addlabel} % -% We now add the box \cs{@alltlabels} onto the graph box. The box should -% still have 0pt height and depth, so we can just stick it under the graph +% We now add the boxes \cs{@alltlabels} and \cs{@backtext} onto the graph % box. But first we have to adjust for \cs{mfpicllx} and \cs{mfpiclly} -% which can only be known after the graphics inclusion. We reset the box -% \cs{@alltlabels} so its contents are shifted by these values. We only -% need to do this if labels have have actually been added. The signal that -% this has happened is that the label dimensions are no longer -% $\pm$\cs{maxdimen}. +% which can only be known after the graphics inclusion. We reset those +% boxes so their contents are shifted by these values. We only need to do +% this if labels have have actually been added. The signal that this has +% happened is that the label dimensions are no longer $\pm$\cs{maxdimen}. +% This doesn't indicate whether it is \cs{@alltlabels} or \cs{@backtext} +% (or both) that is nonempty, so one of the box resets may be redundant. % \begin{macrocode} \ifmfpicdebug + \wlog{Mfpic debug: Dimensions of alltlabels, before + truebbox adjustments:}% + \mfp@scratch\mfpicllx bp\relax + \wlog{Mfpic: mfpicllx = \the\mfp@scratch}% + \mfp@scratch\mfpiclly bp\relax + \wlog{Mfpic: mfpiclly = \the\mfp@scratch}% \wlog{Mfpic: tlabelsleft = \the\@tlabelsleft}% - \wlog{Mfpic: tlabelsright = \the\@tlabelsright}% \wlog{Mfpic: tlabelstop = \the\@tlabelstop}% \wlog{Mfpic: tlabelsbot = \the\@tlabelsbot}% \wlog{}% \fi \ifdim\@tlabelsleft < \maxdimen \setbox\@alltlabels\vtop to 0pt{% - \kern \mfpiclly bp - \moveleft \mfpicllx bp \box\@alltlabels - \vss}% + \kern \mfpiclly bp \moveleft \mfpicllx bp \box\@alltlabels\vss}% + \setbox\@backtext \vtop to 0pt{% + \kern \mfpiclly bp \moveleft \mfpicllx bp \box\@backtext \vss}% % \end{macrocode} % Then we adjust \cs{@tlabelsleft}, etc. for the boundingbox offset. -% \begin{macrocode} - \mfp@scratch\@tlabelsleft - \advance\mfp@scratch-\mfpicllx bp - \ifdim\mfp@scratch<\@graphleft - \@graphleft\mfp@scratch - \fi - \mfp@scratch\@tlabelsright - \advance\mfp@scratch-\mfpicllx bp - \ifdim\mfp@scratch>\@graphright - \@graphright\mfp@scratch - \fi - \mfp@scratch\@tlabelstop - \advance\mfp@scratch-\mfpiclly bp - \ifdim\mfp@scratch>\@graphtop - \@graphtop\mfp@scratch - \fi - \mfp@scratch\@tlabelsbot - \advance\mfp@scratch-\mfpiclly bp - \ifdim\mfp@scratch<\@graphbot - \@graphbot\mfp@scratch +% The graph dimensions are also adjusted if the tlabel dimensions extend +% past the edges. +% \begin{macrocode} + \mfp@adjustdim\@tlabelsleft <\@graphleft \mfpicllx + \mfp@adjustdim\@tlabelstop >\@graphtop \mfpiclly + \mfp@adjustdim\@tlabelsbot <\@graphbot \mfpiclly + \ifmfpicdraft\else + \setbox\@wholegraph + \vtop{\offinterlineskip + \box\@backtext\kern-\ht\@wholegraph + \unvbox\@wholegraph\box\@alltlabels}% \fi - \setbox\@wholegraph=\vtop{% - \unvbox\@wholegraph\box\@alltlabels}% \fi % \end{macrocode} % @@ -4787,15 +5882,16 @@ % detected by \TeX. % \begin{macrocode} \ifmfpicdebug + \wlog{Mfpic debug: Dimensions of alltlabels after + truebbox adjustments:}% \wlog{Mfpic: tlabelsleft = \the\@tlabelsleft}% - \wlog{Mfpic: tlabelsright = \the\@tlabelsright}% \wlog{Mfpic: tlabelstop = \the\@tlabelstop}% \wlog{Mfpic: tlabelsbot = \the\@tlabelsbot}% \wlog{}% \fi - \mfp@scratch=\@graphtop + \mfp@scratch\@graphtop \advance\mfp@scratch by -\@graphbot - \global \setbox\@wholegraph=% + \global \setbox\@wholegraph \vbox to \mfp@scratch{\vss \hbox{\kern-\@graphleft\box\@wholegraph}% \kern-\@graphbot}% End vbox. @@ -4807,6 +5903,8 @@ % graphht${}={}$graphtop${}-{}$graphbot, and graphdp${}= 0$. % \begin{macrocode} \ifmfpicdebug + \wlog{Mfpic debug: Dimensions of wholegraph after + labels are added:}% \wlog{Mfpic: graphleft = \the\@graphleft}% \wlog{Mfpic: graphright = \the\@graphright}% \wlog{Mfpic: graphtop = \the\@graphtop}% @@ -4816,10 +5914,9 @@ \wlog{Mfpic: graphdp = \the\dp\@wholegraph}% \wlog{}% \fi - \@docaption - \global\mfpicheight\ht\@wholegraph - \global\mfpicwidth\wd\@wholegraph + \mfp@docaption \ifmfpicdebug + \wlog{Mfpic debug: Values after tcaption added:}% \wlog{Mfpic: graphleft = \the\@graphleft}% \wlog{Mfpic: graphright = \the\@graphright}% \wlog{Mfpic: graphtop = \the\@graphtop}% @@ -4829,49 +5926,72 @@ \wlog{Mfpic: graphdp = \the\dp\@wholegraph}% \wlog{}% \fi + \global\mfpicheight\ht\@wholegraph + \global\mfpicwidth\wd\@wholegraph % \end{macrocode} % % \subsection{Placing the graphic}\label{placing} % % Add a frame around the box \cs{@wholegraph} in draft mode (so its size % can be seen) since there is practically nothing in it except the picture -% number +% number and perhaps some tlabels. % \begin{macrocode} \ifmfpicdraft - \setbox\@wholegraph=% - \hbox{\@mfpframed{-\mfpframethickness}{\box\@wholegraph}}% + \setbox\@wholegraph + \hbox{\@mfpframed{-\mfpframethickness}{\box\@wholegraph}}% \fi % \end{macrocode} -% +% Now we save the graph globally, for placement after \cs{endgroup}. This +% is so that tokens placed by \cs{everypar} will be typeset in the current +% font (instead of \cs{nullfont}). Then we advance the figure count and +% end the group started by the \cs{mfpic} command. +% \begin{macrocode} + \global\setbox\@wholegraph\box\@wholegraph + \global \advance\mfp@count1 + \fi % \ifmfp@noship + \endgroup % Begun near start of \@mfpic +% \end{macrocode} % If the \cs{savepic} command occurred prior to this, then \cs{s@vemfpic} -% is defined and we save this picture in the box named in that -% \cs{savepic} command and stored in the macro \cs{s@vemfpic}. Otherwise, -% \cs{s@vemfpic} is undefined, and we place the picture (\cs{@wholegraph}) -% in the document. Afterward, we undefine \cs{s@vemfpic}. +% is defined and we save this picture in the box named in that command and +% stored in the macro \cs{s@vemfpic}. Otherwise, \cs{s@vemfpic} is +% undefined, and we place the picture (\cs{@wholegraph}) in the document. +% Afterward, we undefine \cs{s@vemfpic}. Note: if \opt{noship} is in +% force, it remains defined, so the next picture will be stored. % \begin{macrocode} + \ifmfp@noship \else \mfp@ifdefined\s@vemfpic - {\global\setbox\s@vemfpic=\box\@wholegraph}% + {\global\setbox\s@vemfpic\box\@wholegraph}% {\leavevmode\box\@wholegraph}% \global\let\s@vemfpic\UndEfInEd + \fi % \end{macrocode} -% -% Now we advance the figure count, end the group started by the \cs{mfpic} -% command, restore the values of extra font dimensions that were saved, -% then arrange for spaces to be ignored in case the syntax -% \cs{begin}\marg{mfpic}$\ldots$\cs{end}\marg{mfpic} was used. +% Then we restore the values of extra font dimensions that were saved. +% Just in case, we unset the switch \cs{in@mfpicenv} and then arrange for +% spaces to be ignored in case this is a \LaTeX{} environment. (I think we +% shouldn't ignore spaces, but I was overruled. The argument was that +% \cs{end}\marg{mfpic} should behave like \cs{endmfpic}. I don't buy it, +% but I will keep things the way they were since version 0.4.) % \begin{macrocode} - \global \advance\mfp@count1 - \fi % end of \if@shipping - \endgroup % Begun near start of \@mfpic \restore@mfpicdimens - \if@mfp@latex - \def\mfptmp@a{mfpic}% - \ifx\mfptmp@a\@currenvir - \@ignoretrue% so \endmfpic and \end{mfpic} have the same effect. - \fi - \fi + \mfp@checklatexenv{mfpic}{\@ignoretrue}{}% + \global\let\in@mfpicenv\iffalse \ignorespaces -}% +}% endmfpic +% \end{macrocode} +% +% The following is a little utility to run at \cs{foo} or \cs{endfoo} to +% see if was initiated as a \LaTeX{} environment or as a plain command. +% The first argument is the environment name, the second is what to do +% if that is the current environment, and the third is what to do +% otherwise. In the two cases we now use it, the third argument is +% empty. +% \begin{macrocode} +\ifmfp@latex + \newdef\mfp@checklatexenv#1#2#3{% + \def\mfp@tempa{#1}\ifx\mfp@tempa\@currenvir #2\else #3\fi}% +\else + \newdef\mfp@checklatexenv#1#2#3{#3}% +\fi % \end{macrocode} % % @@ -4881,26 +6001,26 @@ % % \DescribeMacro{\newsavepic} % One saves a picture by first allocating a save box with -% \cs{newsavepic}\marg{\cs{mypic}}, then saying -% \cs{savepic}\marg{\cs{mypic}} beforehand. The \cs{endmfpic} code -% detects that this has been done and saves the picture in \cs{mypic}. -% It can be placed with \cs{usepic}{\cs{mypic}}. +% \cs{newsavepic}\cs{mypic}, then saying \cs{savepic}\cs{mypic} +% beforehand. The \cs{endmfpic} code detects that this has been done and +% saves the picture in \cs{mypic}. It can be placed with +% \cs{usepic}\cs{mypic}. % % \cs{newsavepic} is just a clone of \LaTeX's \cs{newsavebox}. The one % argument is a control sequence. % \begin{macrocode} -\newdef\newsavepic#1{% - \if@mfp@latex \newsavebox{#1}% - \else +\ifmfp@latex + \newlet\newsavepic\newsavebox +\else + \newdef\newsavepic#1{% \mfp@ifdefined{#1}% - {\mfp@errmsg - {Command \string #1 already defined.}% + {\mfp@errmsg{Command \string #1 already defined}% {You have used \newsavepic with an already defined or an^^J% improper control sequence. Replace #1 with another name.^^J% If you proceed, \newsavepic will be ignored.}}% - {\csname newbox\endcsname#1}% - \fi}% -\newlet\newpic=\newsavepic % compatibility + {\@nameuse{newbox}#1}}% +\fi +\newlet\newpic\newsavepic % \end{macrocode} % % \DescribeMacro{\savepic} @@ -4910,7 +6030,7 @@ % \begin{macrocode} \newdef\savepic#1{\relax \mfp@ifdefined{#1}{\gdef\s@vemfpic{#1}}% - {\mfp@errmsg{Box \string#1 undefined.}% + {\mfp@errmsg{Box \string#1 undefined}% {You tried to save a picture in a box which had not been^^J% previously allocated. Use \newsavepic to allocate a box.}}}% % \end{macrocode} @@ -4926,24 +6046,24 @@ % \subsection{Putting a frame around it}\label{frame} % % This is essentially code I wrote years ago to have a framing command -% that had two properties not enjoyed by come example `\cs{boxit}' commands +% that had two properties not enjoyed by some example `\cs{boxit}' commands % for plain\TeX: It should have a baseline the same as the baseline of the % contents, and it should work as an environment, not by reading an % argument (so verbatim material could be included). % % \DescribeMacro{\mfpframed} -% \DescribeMacro{\mfpframe} % \cs{mfpframed} takes an optional argument (the separation) and a -% mandatory argument, the contents. \cs{mfpframe}$\ldots$\cs{endmfpframe} -% is an environment and \cs{mfpframe} also takes the separation as an -% optional argument. +% mandatory argument, the contents. +% \DescribeMacro{\mfpframe} +% \cs{mfpframe}$\ldots$\cs{endmfpframe} is an environment and +% \cs{mfpframe} also takes the separation as an optional argument. % % \DescribeMacro{\framed} % \cs{framed} is a common command (\ConTeXt{} has one, a few packages also % define it), therefore we only define it if it is not already defined. % \begin{macrocode} -\newdef\mfpframed{\simple@opt\@mfpframed\mfpframesep}% -\newdef\mfpframe{\simple@opt\@mfpframe\mfpframesep}% +\newdef\mfpframed{\mfp@defaultopt\@mfpframed\mfpframesep}% +\newdef\mfpframe{\mfp@defaultopt\@mfpframe\mfpframesep}% \newdef\@mfpframed#1#2{\@mfpframe{#1}#2\endmfpframe}% \newdef\@mfpframe#1{% \leavevmode\hbox\bgroup @@ -4963,83 +6083,93 @@ \egroup % end vtop \vrule width\mfpframethickness \egroup}% end hbox -\mfp@ifdefined\framed{}{\newlet\framed=\mfpframed}% +\mfp@ifdefined\framed{}{\let\framed\mfpframed}% % \end{macrocode} % % \subsection{Adding \mfc{verbatimtex} to the \file{.mp} % file}\label{verbatimtex} % -% \DescribeMacro{mfpverbtex} +% \DescribeMacro{\mfpverbtex} % This is a user level utility for putting some \mfc{verbatimtex} material % in the output file for \MP. We allow the user to do this even before -% \cs{opengraphsfile} by storing it in a token register and setting a flag -% for that command to test. +% \cs{opengraphsfile} (but only once) by storing it in a token register +% and setting a flag for that command to test. +% +% We now want \texttt\% signs to be written to the output, but also +% want to allow the construct +% \begin{verbatim} +% \mfpverbtex% Comment +% {<tex code>}\end{verbatim} +% to function as users might expect. We therefore perform a +% \cs{futurelet} (which should set \cs{mfp@next} equal to the opening +% brace) but we do it solely to get \TeX's scanning mechanism past the +% comment before we change the category of \texttt\%. % \begin{macrocode} -\newif\if@mfp@verbtex -\def\mfpverbtex{% +\def\mfpverbtex{\futurelet\mfp@next\@mfpverbtex}% % \end{macrocode} % -% We start a group, make sure lines will be preserved in writing the -% material, make sure that \texttt{\#} characters will not be doubled by -% changing its category, then continue after loading the code into the +% We start a group, change \texttt\% and \texttt\# to `other' so they +% can be written normally, then continue after loading the code into the % token register \cs{mfp@verbtex}. % \begin{macrocode} - \begingroup \preservelines \@makeother\#% - \afterassignment\mfp@writetex\global\mfp@verbtex=}% +\def\@mfpverbtex{% + \begingroup + \@makeother\#\@makeother\%\mfp@keeplines + \afterassignment\mfp@writetex\global\mfp@verbtex}% % \end{macrocode} -% % We end the group and then either set the switch to tell % \cs{opengraphsfile} that the material is ready, or we write it to the % output, between the commands \gbc{verbatimtex} and \cs{etex}. % \begin{macrocode} +\newif\ifmfp@verbtex \def\mfp@writetex{% \endgroup - \@ifmfpfileisopen + \mfp@ifopengraphsfile {\mfp@ifmpost - {\mfsrc{verbatimtex}\mfsrc{\the\mfp@verbtex}\mfcmd{etex}}% - {\noMP@error{verbatimtex}}% - \global\@mfp@verbtexfalse\mfp@verbtex{}}% - {\global\@mfp@verbtextrue}}% + {\mfsrc{ verbatimtex\@nl \the\mfp@verbtex}\mfcmd{etex}}% + {\mfp@noMP@error\mfpverbtex}% + \global\mfp@verbtexfalse\mfp@verbtex{}}% + {\global\mfp@verbtextrue}}% % \end{macrocode} % % % \section{Finale}\label{finale} % -% Set the default starting graphic number. +% Set the default starting graphic number. We used to start at 0 and +% increment it at the start of each picture, but now we start at 1 and +% increment it at the end of each picture. % \begin{macrocode} -\global\mfp@count=1 % 1 because we now advance it in \endmfpic. +\mfpicnumber{1}% % \end{macrocode} % % Create a system for adding patches in the file \file{mfppatch.tex}, % and for user defaults in a file \file{mfpic.usr}. % \begin{macrocode} -\newdef\MFPICinput#1{% - \immediate\openin\mfp@graph=#1 - \ifeof\mfp@graph - \immediate\closein\mfp@graph - \else - \immediate\closein\mfp@graph - \input #1 - \fi}% -\MFPICinput{mfppatch.tex}% +\InputIfFileExists{mfppatch.tex}{}{}% +% \end{macrocode} +% +% Set the font for missing or draft mode figures (for the file name or +% figure number). This will already have been defined if \file{mfpic.sty} +% was used, so here we can probably assume \LaTeX{} wasn't used, and +% \cs{tt} ought to be available. +% \begin{macrocode} +\mfp@ifdefined\mfpdraftfont{}{\newdef\mfpdraftfont{\tt}}% % \end{macrocode} % -% Restore the meaning of \cs{+}, and of the \cs{newlinechar}, and execute -% the command that restores all the saved category codes. +% Restore the meaning of \cs{+}, and execute the command that restores all +% the saved category codes and \cs{newlinechar}. % \begin{macrocode} \mfp@DBlog{Punctuation, etc., will revert to old catcodes now.}% \let\+\mfpsaveplus -\restorenewlinechar -\MFPicpackagE% -\MFPICinput{mfpic.usr}% +\mfp@restoreALL% +\InputIfFileExists{mfpic.usr}{}{}% %</tex> % \end{macrocode} % -% Generate a (far too) simple wrapper for \LaTeX. +% The \LaTeX{} wrapper inputs \file{mfpic.tex}. % \begin{macrocode} -%<*sty> -\input mfpic.tex\relax -%</sty> +%<sty>\input mfpic.tex\relax % \end{macrocode} +% %\clearpage %\Finale diff --git a/Master/texmf-dist/source/generic/mfpic/mfpic.ins b/Master/texmf-dist/source/generic/mfpic/mfpic.ins index c72d045ecac..d8e874b7506 100644 --- a/Master/texmf-dist/source/generic/mfpic/mfpic.ins +++ b/Master/texmf-dist/source/generic/mfpic/mfpic.ins @@ -1,56 +1,21 @@ -% File mfpic.ins -% Mfpic version 0.7a beta 2004/04/16 -% -% Copyright 2002--2003, Daniel H. Luecking -% -% Mfpic consists of the 3 files mfpic.dtx, grafbase.dtx and mfpic.ins -% and the 5 files they generate: mfpic.tex, mfpic.sty, grafbase.mf, -% grafbase.mp, and dvipsnam.mp. -% -% Mfpic may be distributed and/or modified under the conditions of the -% LaTeX Project Public License, either version 1.2 of this license or (at -% your option) any later version. The latest version of this license is in -% -% http://www.latex-project.org/lppl.txt -% -% and version 1.2 or later is part of all distributions of LaTeX version -% 1999/12/01 or later. -% -% Documentation, examples, and ancillary files are separate and not -% covered by this license. See readme.1st for a complete list. See -% individual files for any copyright and license restrictions. -% -% With respect to the proposed draft LPPL-1.3: mfpic has maintenance -% status "maintained". The Current Maintainer is Daniel H. Luecking. There -% are several Base Interpreters: TeX, LaTeX, MetaPost and Metafont. -% \input docstrip \keepsilent \preamble ------------------------------------------------------------------- -Copyright 2002--2003, Daniel H. Luecking - -Mfpic consists of the 3 files mfpic.dtx, grafbase.dtx and mfpic.ins -and the 5 files they generate: mfpic.tex, mfpic.sty, grafbase.mf, -grafbase.mp, and dvipsnam.mp. - -Documentation, examples, and ancillary files are separate. See -readme.1st for a complete list. +Copyright 2002--2006, Daniel H. Luecking Mfpic may be distributed and/or modified under the conditions of the -LaTeX Project Public License, either version 1.2 of this license or (at +LaTeX Project Public License, either version 1.3b of this license or (at your option) any later version. The latest version of this license is in + <http://www.latex-project.org/lppl.txt> +and version 1.3b or later is part of all distributions of LaTeX version +2005/12/01 or later. - http://www.latex-project.org/lppl.txt - -and version 1.2 or later is part of all distributions of LaTeX version -1999/12/01 or later. - -With respect to the proposed draft LPPL-1.3: mfpic has maintenance -status "maintained". The Current Maintainer is Daniel H. Luecking. There -are several Base Interpreters: TeX, LaTeX, MetaPost and Metafont. +Mfpic has maintenance status "author-maintained". The Current Maintainer +is Daniel H. Luecking. There are several Base Interpreters associated +with mfpic: plain TeX, LaTeX, plain Metafont and plain MetaPost. \endpreamble \edef\zyx{% @@ -60,31 +25,31 @@ endinput.^^J% \askforoverwritefalse -\generate{ \file{mfpic.tex}{\from{mfpic.dtx}{tex}} +\generate{\file{mfpic.tex}{\from{mfpic.dtx}{tex}} \file{mfpic.sty}{\from{mfpic.dtx}{sty}} \usepostamble\zyx \file{grafbase.mf}{\from{grafbase.dtx}{MF}} \file{grafbase.mp}{\from{grafbase.dtx}{MP}} \file{dvipsnam.mp}{\from{grafbase.dtx}{dvips}}} -\def\jts{^^J \space\space\space} +\def\sJ{^^J \space\space\space} \immediate\write16{% -^^J***************************************************************** +^^J******************************************************************* ^^J ^^J To finish the installation: ^^J -^^J -- Copy the files mfpic,tex and mfpic.sty to a location where -\jts TeX and LaTeX will find them. In a TDS compliant system -\jts the directory TEXMF/tex/generic/mfpic/ is recommended. +^^J -- Copy the files mfpic.tex, mfpic.sty and mfppatch.tex to a +\sJ location where TeX and LaTeX will find them. For example, in a +\sJ TDS compliant system, the directory TEXMF/tex/generic/mfpic/ . ^^J ^^J -- Copy the file grafbase.mf to a location where Metafont -\jts will find it, for example TEXMF/metafont/mfpic/ . +\sJ will find it, for example TEXMF/metafont/mfpic/ . ^^J ^^J -- Copy the files grafbase.mp and dvipsnam.mp to a location where -\jts MetaPost will find them, for example TEXMF/metapost/mfpic/ . +\sJ MetaPost will find them, for example TEXMF/metapost/mfpic/ . ^^J ^^J -- Refresh the filename database if your TeX system requires it. ^^J -^^J*****************************************************************} +^^J*******************************************************************} \endbatchfile diff --git a/Master/texmf-dist/tex/generic/mfpic/mfpic.sty b/Master/texmf-dist/tex/generic/mfpic/mfpic.sty index cdd50eb92f8..80121080c80 100644 --- a/Master/texmf-dist/tex/generic/mfpic/mfpic.sty +++ b/Master/texmf-dist/tex/generic/mfpic/mfpic.sty @@ -8,28 +8,59 @@ %% %% ------------------------------------------------------------------- %% -%% Copyright 2002--2003, Daniel H. Luecking -%% -%% Mfpic consists of the 3 files mfpic.dtx, grafbase.dtx and mfpic.ins -%% and the 5 files they generate: mfpic.tex, mfpic.sty, grafbase.mf, -%% grafbase.mp, and dvipsnam.mp. -%% -%% Documentation, examples, and ancillary files are separate. See -%% readme.1st for a complete list. +%% Copyright 2002--2006, Daniel H. Luecking %% %% Mfpic may be distributed and/or modified under the conditions of the -%% LaTeX Project Public License, either version 1.2 of this license or (at +%% LaTeX Project Public License, either version 1.3b of this license or (at %% your option) any later version. The latest version of this license is in +%% <http://www.latex-project.org/lppl.txt> +%% and version 1.3b or later is part of all distributions of LaTeX version +%% 2005/12/01 or later. %% -%% http://www.latex-project.org/lppl.txt -%% -%% and version 1.2 or later is part of all distributions of LaTeX version -%% 1999/12/01 or later. -%% -%% With respect to the proposed draft LPPL-1.3: mfpic has maintenance -%% status "maintained". The Current Maintainer is Daniel H. Luecking. There -%% are several Base Interpreters: TeX, LaTeX, MetaPost and Metafont. +%% Mfpic has maintenance status "author-maintained". The Current Maintainer +%% is Daniel H. Luecking. There are several Base Interpreters associated +%% with mfpic: plain TeX, LaTeX, plain Metafont and plain MetaPost. %% +\ProvidesPackage{mfpic} + [2006/05/26 v0.9. Macros for drawing with Metafont/MetaPost.]% +\DeclareOption{draft}{\mfpicdraft}% +\DeclareOption{final}{% + \mfpicfinal\PassOptionsToPackage{final}{graphics}}% +\DeclareOption{nowrite}{\mfpicnowrite}% +\DeclareOption{metapost}{\mfp@mposttrue}% +\DeclareOption{metafont}{\usemetafont}% +\DeclareOption{centeredcaptions}{\usecenteredcaptions}% +\DeclareOption{justifiedcaptions}{\noraggedcaptions}% +\DeclareOption{raggedcaptions}{\useraggedcaptions}% +\DeclareOption{clip}{\clipmfpic}% +\DeclareOption{truebbox}{\usetruebbox}% +\DeclareOption{mplabels}{\usemplabels}% +\DeclareOption{overlaylabels}{\overlaylabels}% +\DeclareOption{clearsymbols}{\clearsymbols}% +\DeclareOption{debug}{\mfpicdebugtrue}% +\DeclareOption{mfpreadlog}{\mfp@readlogtrue}% +\DeclareOption*{% + \@ifpackageloaded{graphics}% + {\Mfpic@warn{Unrecognized option \CurrentOption.}}% + {\Mfpic@msg{Passing option \CurrentOption\space to % + graphics package.}% + \PassOptionsToPackage{\CurrentOption}{graphics}}}% +\newcommand*\mfpdraftfont{\normalfont\ttfamily}% +\def\@usemetapost{% + \mfp@ifdefined\includegraphics{}{\RequirePackage{graphics}}% + \let\mfp@save@parse@bb\Gread@parse@bb + \newdef\mfp@parse@bb##1 ##2 ##3 ##4 ##5\\{% + \mfp@save@parse@bb##1 ##2 ##3 ##4 ##5\\% + \xdef\mfpicllx{\Gin@llx}\xdef\mfpiclly{\Gin@lly}}% + \ifmfp@pdf \gdef\mfp@Gtype{mps}% + \else \gdef\mfp@Gtype{eps}% + \fi + \gdef\preparemfpicgraphic##1{% + \@namedef{Gin@rule@.\number\mfp@count}####1{{\mfp@Gtype}% + {.\number\mfp@count}{####1}}% + \let\Gread@parse@bb\mfp@parse@bb}% + \global\let\setmfpicgraphic\includegraphics + \gdef\getmfpicoffset##1{}}% \input mfpic.tex\relax \endinput %% diff --git a/Master/texmf-dist/tex/generic/mfpic/mfpic.tex b/Master/texmf-dist/tex/generic/mfpic/mfpic.tex index df2b23850b0..5e8b1d89110 100644 --- a/Master/texmf-dist/tex/generic/mfpic/mfpic.tex +++ b/Master/texmf-dist/tex/generic/mfpic/mfpic.tex @@ -8,497 +8,579 @@ %% %% ------------------------------------------------------------------- %% -%% Copyright 2002--2003, Daniel H. Luecking -%% -%% Mfpic consists of the 3 files mfpic.dtx, grafbase.dtx and mfpic.ins -%% and the 5 files they generate: mfpic.tex, mfpic.sty, grafbase.mf, -%% grafbase.mp, and dvipsnam.mp. -%% -%% Documentation, examples, and ancillary files are separate. See -%% readme.1st for a complete list. +%% Copyright 2002--2006, Daniel H. Luecking %% %% Mfpic may be distributed and/or modified under the conditions of the -%% LaTeX Project Public License, either version 1.2 of this license or (at +%% LaTeX Project Public License, either version 1.3b of this license or (at %% your option) any later version. The latest version of this license is in +%% <http://www.latex-project.org/lppl.txt> +%% and version 1.3b or later is part of all distributions of LaTeX version +%% 2005/12/01 or later. %% -%% http://www.latex-project.org/lppl.txt -%% -%% and version 1.2 or later is part of all distributions of LaTeX version -%% 1999/12/01 or later. +%% Mfpic has maintenance status "author-maintained". The Current Maintainer +%% is Daniel H. Luecking. There are several Base Interpreters associated +%% with mfpic: plain TeX, LaTeX, plain Metafont and plain MetaPost. %% -%% With respect to the proposed draft LPPL-1.3: mfpic has maintenance -%% status "maintained". The Current Maintainer is Daniel H. Luecking. There -%% are several Base Interpreters: TeX, LaTeX, MetaPost and Metafont. -%% -{\catcode\lq\.12 \catcode\lq\/12% -\gdef\mfpfileversion{0.7a beta}% -\gdef\mfpfiledate{2004/04/16}% -\gdef\mfpicversion{70}}% -\ifx\MFPicpackagE\UndEfInEd\else\expandafter\endinput\fi% +\ifx\mfpfileversion\UndEfInEd\else\expandafter\endinput\fi% +{% + \catcode\lq\.12 \catcode\lq\/12% + \gdef\mfpfileversion{0.9}% + \gdef\mfpfiledate{2006/05/26}% + \gdef\mfpicversion{90}% +}% \let\mfpsaveplus\+% \let\+\tabalign% -\edef\MFPrestoreequal{\catcode61\space\the\catcode61\relax}% -\catcode61 12\relax% -\edef\MFPrestorespace{\catcode32=\the\catcode32\relax}% -\catcode32=10\relax% -\edef\MFPrestoreEOL{\catcode13=\the\catcode13\relax}% -\catcode13=5\relax -\edef\MFPrestorelq{\catcode96=\the\catcode96\relax}% -\catcode96=12 -\def\MFPrestorecode#1{\catcode`\string#1=\the\catcode`#1\relax}% -\edef\MFPicpackagE{% - \MFPrestorecode{@}\MFPrestorecode{-}% - \MFPrestorecode{:}\MFPrestorecode{;}% - \MFPrestorecode{.}\MFPrestorecode{,}% - \MFPrestorecode{!}\MFPrestorecode{?}% - \MFPrestorecode{(}\MFPrestorecode{)}% - \MFPrestorecode{[}\MFPrestorecode{]}% - \MFPrestorecode{'}\MFPrestorecode{/}% - \MFPrestorecode{"}\MFPrestorecode{*}% - \MFPrestorecode{$}\MFPrestorecode{+}% - \MFPrestorecode{_}\MFPrestorecode{>}% - \MFPrestorecode{<}\MFPrestorecode{~}% - \MFPrestorelq\MFPrestoreEOL\MFPrestorespace - \MFPrestoreequal\catcode 10=\number\catcode10}% -\catcode`\@=11 -\ifx\@makeother\UndEfInEd \def\@makeother#1{\catcode`#1=12\relax}\fi -\def\mfp@sanitize{% -\catcode10=12\catcode13=5\catcode`\$=3\catcode`\ =10 -\@makeother\:\@makeother\;\@makeother\.\@makeother\,% -\@makeother\!\@makeother\?\@makeother\(\@makeother\)% -\@makeother\[\@makeother\]% -\@makeother\'\@makeother\/\@makeother\"\@makeother\*% -\@makeother\_\@makeother\`\@makeother\+\@makeother\=% -\@makeother\>\@makeother\<\@makeother\~\@makeother\-}% -\mfp@sanitize -\edef\restorenewlinechar{\newlinechar=\number\newlinechar\relax}% -\chardef\mfp@ctrlJ10 \chardef\mfp@ctrlM13 -\newlinechar\mfp@ctrlJ\def\@nl{^^J}% +{% + \catcode61\space12\relax% 61=equal sign + \catcode32=10\relax% 32=space + \catcode13=5 % 13=EOL + \catcode96=12 % 96=left quote + \catcode`\@=11 + \gdef\MFPsavecodes{% + \edef\mfp@restoreNLchar{\newlinechar\number\newlinechar\relax}% + \edef\mfp@restoreELchar{\endlinechar\number\endlinechar\relax}% + \edef\mfp@restoreSP{\catcode32=\number\catcode32\relax}% + \edef\mfp@restoreEOL{\catcode13=\number\catcode13\relax}% + \edef\mfp@restoreALL{\mfp@restorecode{=}\mfp@restorecode{@}% + \mfp@restorecode{$}\mfp@restorecode{:}\mfp@restorecode{;}% + \mfp@restorecode{.}\mfp@restorecode{,}\mfp@restorecode{!}% + \mfp@restorecode{?}\mfp@restorecode{(}\mfp@restorecode{)}% + \mfp@restorecode{[}\mfp@restorecode{]}\mfp@restorecode{<}% + \mfp@restorecode{>}\mfp@restorecode{*}\mfp@restorecode{/}% + \mfp@restorecode{+}\mfp@restorecode{-}\mfp@restorecode{"}% + \mfp@restorecode{'}\mfp@restorecode{_}\mfp@restorecode{`}% + \mfp@restoreEOL\mfp@restoreSP\catcode10=\number\catcode10 + \mfp@restoreNLchar\mfp@restoreELchar}}% + \gdef\mfp@restorecode#1{\catcode`\string#1=\number\catcode`#1\relax}% + \ifx\@makeother\UndEfInEd \gdef\@makeother#1{\catcode`#1=12\relax}\fi + \gdef\MFPsanitize{\endlinechar13 \newlinechar10 + \catcode10=12 \catcode13=5 \catcode`\$=3 \catcode`\ =10 + \@makeother\:\@makeother\;\@makeother\.\@makeother\,% + \@makeother\!\@makeother\?\@makeother\(\@makeother\)% + \@makeother\[\@makeother\]\@makeother\>\@makeother\<% + \@makeother\/\@makeother\*\@makeother\+\@makeother\-% + \@makeother\'\@makeother\"\@makeother\_\@makeother\`% + \@makeother\=\@makeother\@}% +}% +\MFPsavecodes\MFPsanitize +\catcode`@11 +\chardef\mfp@ctrlJ 10 \chardef\mfp@ctrlM 13 \newif\ifmfpicdebug \ifx\mfpicdebug\UndEfInEd \mfpicdebugfalse \else \mfpicdebugtrue \fi \def\mfp@DBlog#1{% \ifmfpicdebug{\let\@msgbreak\mfp@errbrk\wlog{Mfpic debug: #1}}\fi}% -\def\mfp@msg#1{{\newlinechar\mfp@ctrlJ\immediate\write16{#1}}}% -\def\@msgbreak{^^J}% +\def\mfp@msg#1{% + {\newlinechar\mfp@ctrlJ\def\@nl{^^J}\immediate\write16{#1}}}% \def\mfp@spaces{\space\space\space\space\space\space}% \def\mfp@msgbrk{^^J\mfp@spaces\space}% \def\mfp@errbrk{\mfp@msgbrk\mfp@spaces}% \def\mfp@warnbrk{\mfp@errbrk\space\space}% -\def\Mfpic@msg#1{{\let\@msgbreak=\mfp@msgbrk - \mfp@msg{Mfpic: #1 }}}% -\def\Mfpic@warn#1{{\let\@msgbreak=\mfp@warnbrk - \mfp@msg{^^JMfpic warning: #1}}}% -\def\mfp@errmsg#1#2{{\newlinechar\mfp@ctrlJ - \let\@msgbreak\mfp@errbrk +\def\Mfpic@msg#1{{\let\@msgbreak\mfp@msgbrk\mfp@msg{Mfpic: #1}}}% +\def\Mfpic@warn#1{% + {\let\@msgbreak\mfp@warnbrk\mfp@msg{\@nl Mfpic warning: #1}}}% +\def\mfp@errmsg#1#2{{\newlinechar\mfp@ctrlJ\let\@msgbreak\mfp@errbrk \errhelp{#2}\errmessage{Mfpic error: #1}}}% -\def\@online{ on line \number\inputlineno}% -\def\@mfplineno{line \number\inputlineno\space in TeX source}% -\ifx\@firstoftwo\UndEfInEd \long\def\@firstoftwo#1#2{#1}\fi -\ifx\@secondoftwo\UndEfInEd \long\def\@secondoftwo#1#2{#2}\fi +\def\mfp@lineno{line \number\inputlineno\space in the TeX source}% \let\@xp\expandafter \def\@XP{\@xp\@xp\@xp}% +\long\def\@firstoftwo#1#2{#1}% +\long\def\@secondoftwo#1#2{#2}% \def\mfp@ifdefined#1{% \ifx#1\UndEfInEd \@xp\@secondoftwo \else\ifx#1\relax \@XP\@secondoftwo \else \@XP\@firstoftwo \fi\fi}% +\mfp@ifdefined\@empty{}{\def\@empty{}}% +\mfp@ifdefined\@gobble{}{\def\@gobble#1{}}% \mfp@ifdefined\@firstofone{}{\long\def\@firstofone#1{#1}}% -\newif\if@mfp@latex \@mfp@latexfalse +\mfp@ifdefined\on@line{}% + {\def\on@line{ on input line \number\inputlineno}}% +\let\mfp@enddef\@empty +\long\def\mfp@gobbledef#1\mfp@enddef{}% +\def\mfp@ifundefined#1{\mfp@ifdefined#1\mfp@gobbledef\@empty}% +\mfp@ifundefined\@ifundefined + \def\@ifundefined#1{% + \@xp\ifx\csname #1\endcsname\relax \@xp\@firstoftwo + \else \@xp\@secondoftwo + \fi}% +\mfp@enddef +\mfp@ifdefined\g@addto@macro{}{% + \long\def\g@addto@macro#1#2{% + \begingroup + \toks@\@xp{#1#2}% + \xdef#1{\the\toks@}% + \endgroup}}% +\mfp@ifdefined\g@prependto@macro{}{% + \long\def\g@prependto@macro#1#2{% + \begingroup + \toks@{#2}\toks2\@xp{#1}% + \xdef#1{\the\toks@\the\toks2}% + \endgroup}}% +\newif\ifmfp@latex \mfp@latexfalse \mfp@ifdefined\documentstyle - {{\def\x{AmS-TeX}% - \ifx \fmtname\x \mfp@DBlog{AmS-TeX detected.}% - \else - \global\@mfp@latextrue \mfp@DBlog{LaTeX detected.}% - \fi}}% - {\mfp@DBlog{Neither LaTeX2e nor LaTeX209 nor AmS-TeX.}}% -\newif\if@mfp@latexe \@mfp@latexefalse + {\def\mfp@tempa{AmS-TeX}% + \ifx \fmtname\mfp@tempa \mfp@DBlog{AmS-TeX detected.}% + \else \mfp@DBlog{LaTeX detected.}\mfp@latextrue + \fi}% + {\mfp@DBlog{Neither LaTeX nor AmS-TeX detected.}}% +\newif\ifmfp@latexe \mfp@latexefalse \mfp@ifdefined\documentclass - {\@mfp@latexetrue \mfp@DBlog{LaTeX2e detected.}}% - {\mfp@DBlog{Not LaTeX2e.}}% -\newif\if@mfp@pdf \@mfp@pdffalse + {\mfp@latexetrue \mfp@DBlog{LaTeX2e detected.}}% + {\mfp@DBlog{Not LaTeX2e.}}% +\newif\ifmfp@pdf \mfp@pdffalse \mfp@ifdefined\pdfoutput {\mfp@DBlog{PdfTeX detected...}% - \ifcase\pdfoutput - \mfp@DBlog{...with dvi output.}% - \else - \@mfp@pdftrue \mfp@DBlog{...with PDF output.}% + \ifnum\pdfoutput<1 \mfp@DBlog{...with dvi output.}% + \else \mfp@pdftrue \mfp@DBlog{...with PDF output.}% \fi}% {\mfp@DBlog{Not pdfTeX.}}% -\if@mfp@latex \else \let\@@par\endgraf \fi +\ifmfp@latex \else \let\@@par\endgraf \fi \def\mfp@restorepar{\let\par\@@par}% -\if@mfp@latex\else - \def\@namedef#1{\@xp\def\csname #1\endcsname}% - \def\@nameuse#1{\csname #1\endcsname}% -\fi -\mfp@ifdefined\@bsphack{}% - {\@nameuse{newskip}\@savsk +\mfp@ifdefined\@namedef{}% + {\def\@namedef#1{\@xp\def\csname #1\endcsname}}% +\mfp@ifdefined\@namelet{}% + {\def\@namelet#1{\@xp\let\csname #1\endcsname}}% +\mfp@ifdefined\@nameuse{}% + {\def\@nameuse#1{\csname #1\endcsname}}% +\mfp@ifundefined\@bsphack + \@nameuse{newskip}\@savsk \@nameuse{newcount}\@savsf \def\@bsphack{\relax \ifhmode \@savsk\lastskip \@savsf\spacefactor \fi}% \def\@esphack{\relax \ifhmode \spacefactor\@savsf \ifdim\@savsk>\z@ \ignorespaces - \fi\fi}}% + \fi\fi}% +\mfp@enddef \mfp@DBlog{Defining test for previous definitions of macros.}% -\mfp@ifdefined\mfp@testdef - {\Mfpic@warn{% - Hey! How can \string\mfp@testdef\space already be defined? % - \@msgbreak I'll redefine it anyway!}}% - {}% \def\mfp@testdef#1{% \ifx#1\UndEfInEd \else\ifx#1\relax - \Mfpic@warn{\string #1 was previouly defined to be \string\relax.}% + \Mfpic@warn{\string#1 was previouly defined to be \string\relax.}% \else - \Mfpic@warn{\string #1 is already defined!}% + \Mfpic@warn{\string#1 is already defined.}% \fi\fi}% \mfp@testdef\newdef -\mfp@testdef\newlet \def\newdef#1{\mfp@testdef#1\def#1}% \newdef\newlet#1{\mfp@testdef#1\let#1}% -\global\let\ifmfpmpost\iffalse +\newdef\mfp@useMP@error{% + \mfp@errmsg {Command \mfp@b usemetapost too late}% + {It is too late to select the metapost option.^^J% + It must be selected before the \opengraphsfile command.^^J% + If you proceed, the metafont option will be assumed.}}% +\def\mfp@nooutput@error#1{% + \mfp@errmsg {No output file has been opened}% + {You have tried to used a command, #1, that requires an output^^J% + file to be opened with the \opengraphsfile command, which^^J% + was either not issued or was not successful.}}% +\newdef\mfp@noMP@error#1{% + \mfp@errmsg {Metafont does not support #1, use MetaPost}% + {Metafont doesn't support #1. Perhaps you forgot to turn on^^J% + MetaPost support by using the metapost option or issuing the^^J% + command \usemetapost. For now, I will ignore it.}}% +\def\mfp@afteropen@error#1{% + \mfp@errmsg{Improper use of command \string#1\on@line}% + {You must issue the command #1 prior to \opengraphsfile. + It will be ignored now.}}% +\newdef\mfp@end{% + \mfp@errmsg {Unexpected token \string\mfp@end}% + {If you get this message but did not misuse the command^^J% + \mfp@end, it could mean you have unbalanced braces.}}% +\newdef\mfp@nofile@error#1{% + \mfp@errmsg{No data file: #1}% + {The data file you tried to plot was not found.}}% +\newdef\mfp@nodata@error#1{% + \mfp@errmsg{Empty data file: #1}% + {The data file contained only empty lines and comments.}}% +\newdef\mfp@justify@error{% + \mfp@errmsg{Invalid justification parameter for text label}% + {The optional argument for an mfpic text label must be^^J% + one of B, b, c or t, followed by^^J + one of l, r or c, optionally followed by an angle.}}% +\newdef\mfp@untilwarn{% + \Mfpic@warn{\mfp@b mfploop without \string\mfpuntil!}}% +\newlet\ifmfpmpost\iffalse \newdef\mfp@mposttrue {\global\let\ifmfpmpost\iftrue}% \newdef\mfp@mpostfalse{\global\let\ifmfpmpost\iffalse}% \newdef\mfp@ifmpost{% \ifmfpmpost\@xp\@firstoftwo\else\@xp\@secondoftwo\fi}% \newdef\usemetafont{\mfp@mpostfalse + \nomplabels \def\preparemfpicgraphic##1{}% - \def\setmfpicgraphic##1{\@graphfont\char\mfp@count}% - \def\getmfpicoffset##1{}}% -\newdef\MPtoolate@error{% - \mfp@errmsg {Command \string\usemetapost\space too late.}% - {It is too late to select the metapost option.^^J% - It must be selected before the \opengraphsfile command.^^J% - If you proceed, the metafont option will be assumed.}}% -\newdef\@ifmfpfileisopen{\mfp@ifdefined\mfp@filename}% + \def\setmfpicgraphic##1{\mfp@graphfont\char\mfp@count}% + \def\getmfpicoffset##1{\gdef\mfpicllx{0}\gdef\mfpiclly{0}}}% +\newdef\mfp@ifopengraphsfile{\mfp@ifdefined\mfp@filename}% \newdef\setmfvariable#1#2#3{% - \@ifmfpfileisopen{\mfcmd{setvariable (#1) (#2) (#3)}}{}}% + \mfp@ifopengraphsfile{\mfcmd{setvariable (#1) (#2) #3}}% + {\mfp@nooutput@error\setmfvariable}}% \newlet\setmpvariable\setmfvariable -\newdef\setmfboolean#1#2{\setmfvariable{boolean}{#1}{#2}}% -\newdef\setmfnumeric#1#2{\setmfvariable{numeric}{#1}{#2}}% -\newdef\setmfcolor#1#2{\setmfvariable{color}{#1}{#2}}% -\let\ifin@mfpicenv\iffalse +\newdef\setmfboolean {\setmfvariable{boolean}}% +\newdef\setmfnumeric {\setmfvariable{numeric}}% +\newdef\setmfpair {\setmfvariable{pair}}% +\newdef\setmfcolor {\setmfvariable{color}}% +\newdef\globalsetmfvariable#1#2#3{% + \mfp@ifopengraphsfile{\mfcmd{gsetvariable (#1) (#2) #3}}% + {\mfp@nooutput@error\globalsetmfvariable}}% +\newlet\globalsetvariable\globalsetmfvariable +\newlet\ifin@mfpicenv\iffalse \newdef\mfp@local{\relax\ifin@mfpicenv\else\global\fi}% -\newdef\mf@T{true}% -\newdef\mf@F{false}% \newdef\mfp@let{\mfp@local\let}% \newdef\mfp@def{\mfp@local\def}% -\newdef\usecenteredcaptions{\mfp@let\if@mfp@centcapt\iftrue}% -\newdef\nocenteredcaptions {\mfp@let\if@mfp@centcapt\iffalse}% +\newdef\mfp@T{true}% +\newdef\mfp@F{false}% +\newdef\mfp@C{color}% +\newdef\usecenteredcaptions{\mfp@let\ifmfp@centcapt\iftrue}% +\newdef\nocenteredcaptions {\mfp@let\ifmfp@centcapt\iffalse}% \nocenteredcaptions +\newdef\useraggedcaptions{\mfp@let\mfp@capsettings\mfp@raggedcap}% +\newdef\noraggedcaptions{\mfp@let\mfp@capsettings\mfp@justifiedcap}% +\newdef\mfp@raggedcap{% + \ifmfp@latex + \ifmfp@centcapt \centering \else \raggedright \fi + \else + \rightskip 0pt plus 1fil + \ifmfp@centcapt + \leftskip 0pt plus 1fil + \parfillskip 0pt plus 1fil\relax + \fi + \def\\{\unskip\hbox{}\penalty-\@M\ignorespaces}% + \fi}% +\def\mfp@justifiedcap{% + \ifmfp@centcapt + \leftskip 0pt plus 0.5fil + \rightskip 0pt plus -0.5fil + \parfillskip 0pt plus 1fil\relax + \fi + \def\\{\unskip\hbox{}\hfil\penalty-\@M\ignorespaces}}% +\noraggedcaptions \newdef\mfp@makeoption#1#2#3#4{% - \newdef#1{\mfp@let#3\iftrue\setmfboolean{#4}\mf@T}% - \newdef#2{\mfp@let#3\iffalse\setmfboolean{#4}\mf@F} + \newdef#1{\mfp@let#4\iftrue + \mfp@ifopengraphsfile{\setmfboolean{#3}\mfp@T}{}}% + \newdef#2{\mfp@let#4\iffalse + \mfp@ifopengraphsfile{\setmfboolean{#3}\mfp@F}{}}% #2}% -\mfp@makeoption\clipmfpic\noclipmfpic\if@mfp@clip{clipall}% -\mfp@makeoption\usetruebbox\notruebbox\if@mfp@truebbox{truebbox}% -\newdef\noMP@error#1{% - \mfp@errmsg {Metafont does not support #1, use MetaPost.}% - {Metafont doesn't support #1. Perhaps you forgot to turn on^^J% - MetaPost support by using the metapost option or issuing the^^J% - command \usemetapost. For now, I will ignore it.}}% -\newdef\usemplabels{\mfp@let\if@mfp@mplabels\iftrue - \@ifmfpfileisopen - {\mfp@ifmpost{}% - {\noMP@error{mplabels}\global\let\if@mfp@mplabels\iffalse}}{}}% -\newdef\nomplabels{\mfp@let\if@mfp@mplabels\iffalse}% +\mfp@makeoption\clipmfpic\noclipmfpic{clipall}\ifmfp@clip +\mfp@makeoption\usetruebbox\notruebbox{truebbox}\ifmfp@truebbox +\newdef\usemplabels{\mfp@let\ifmfp@mplabels\iftrue + \mfp@ifopengraphsfile + {\mfp@ifmpost{}% + {\mfp@noMP@error{mplabels}\global\let\ifmfp@mplabels\iffalse}}{}}% +\newdef\nomplabels{\mfp@let\ifmfp@mplabels\iffalse}% \newdef\@ifmplabels{% - \if@mfp@mplabels\@xp\@firstoftwo\else\@xp\@secondoftwo\fi}% + \ifmfp@mplabels\@xp\@firstoftwo\else\@xp\@secondoftwo\fi}% \nomplabels +\newdef\mp@mksharpother{\@ifmplabels{\@makeother\#}{}}% \mfp@makeoption% - \overlaylabels\nooverlaylabels\if@mfp@overlabels{overlaylabels}% + \overlaylabels\nooverlaylabels{overlaylabels}\ifmfp@overlabels \mfp@makeoption% - \clearsymbols\noclearsymbols\if@mfp@clearsym{clearsymbols}% -\def\mfpicllx{0}% -\def\mfpiclly{0}% -\newdef\@setmfpicgraphic#1{% + \clearsymbols\noclearsymbols{clearsymbols}\ifmfp@clearsym +\mfp@makeoption\stopshipping\resumeshipping{noship}\ifmfp@noship +\newlet\noship\stopshipping +\newlet\ifmfp@readlog\iffalse +\newdef\mfpreadlog{% + \mfp@ifopengraphsfile + {\mfp@afteropen@error\mfpreadlog}{\global\let\ifmfp@readlog\iftrue}}% +\newdef\mfpicllx{0}% +\newdef\mfpiclly{0}% +\newdef\normal@setmfpgraphic#1{% \preparemfpicgraphic{#1}\setmfpicgraphic{#1}\getmfpicoffset{#1}}% +\newdef\nofile@setmfpgraphic#1{% + {\edef\mfp@tempa{#1}% + \vbox to 0pt{\vss + \rlap{\kern2pt \mfpdraftfont \mfp@sanitized\mfp@tempa}\kern 2pt}}}% +\mfp@ifdefined\strip@prefix{}{\def\strip@prefix#1>{}}% +\newdef\mfp@sanitized{\@xp\strip@prefix\meaning} +\newlet\@setmfpicgraphic\normal@setmfpgraphic \usemetafont \newdef\setfilename#1#2{#1.#2}% \newif\ifmfpicdraft -\newif\if@mfp@draft -\newif\if@mfp@final -\newif\if@mfp@nowrite +\newlet\ifmfp@draft\iffalse +\newlet\ifmfp@final\iffalse +\newlet\ifmfp@nowrite\iffalse \newdef\mfpicdraft{% - \@ifmfpfileisopen{\global\mfpicdrafttrue}% - {\global\@mfp@drafttrue}}% + \mfp@ifopengraphsfile{\global\mfpicdrafttrue}% + {\global\let\ifmfp@draft\iftrue}}% \newdef\mfpicfinal{% - \@ifmfpfileisopen{\global\mfpicdraftfalse}% - {\global\@mfp@finaltrue}}% + \mfp@ifopengraphsfile{\global\mfpicdraftfalse}% + {\global\let\ifmfp@final\iftrue}}% \newdef\mfpicnowrite{% - \@ifmfpfileisopen - {\mfp@errmsg - {Improper use of command \string\mfpicnowrite\@online.}% - {You must issue the command \mfpicnowrite prior to - \opengraphsfile. It will be ignored now.}}% - {\global\@mfp@nowritetrue}}% -\if@mfp@latexe - \ProvidesPackage{mfpic}[2004/04/16 v0.7a beta.]% - \DeclareOption{draft}{\mfpicdraft}% - \DeclareOption{final}{\mfpicfinal}% - \DeclareOption{nowrite}{\mfpicnowrite}% - \DeclareOption{metapost}{\mfp@mposttrue}% - \DeclareOption{metafont}{\usemetafont}% - \DeclareOption{centeredcaptions}{\usecenteredcaptions}% - \DeclareOption{clip}{\clipmfpic}% - \DeclareOption{truebbox}{\usetruebbox}% - \DeclareOption{mplabels}{\usemplabels}% - \DeclareOption{overlaylabels}{\overlaylabels}% - \DeclareOption{clearsymbols}{\clearsymbols}% - \DeclareOption{debug}{\mfpicdebugtrue}% - \DeclareOption*{% - \@ifpackageloaded{graphics}% - {\Mfpic@warn{Unrecognized option \CurrentOption.}}% - {\Mfpic@msg{Passing option \CurrentOption\space to % - graphics package.}% - \PassOptionsToPackage{\CurrentOption}{graphics}}}% + \mfp@ifopengraphsfile{\mfp@afteropen@error\mfpicnowrite}% + {\global\let\ifmfp@nowrite\iftrue}}% +\newdef\usemetapost{% + \mfp@ifopengraphsfile{\mfp@mpostfalse\mfp@useMP@error}% + {\mfp@mposttrue \@usemetapost}}% +\ifmfp@latexe \InputIfFileExists{mfpic.cfg}{}{}% \ProcessOptions*\relax - \def\usemetapost{% - \@ifmfpfileisopen{\mfp@mpostfalse\MPtoolate@error}% - {\mfp@mposttrue \RequirePackage{graphics}% - \global\let\mfp@save@parse@bb\Gread@parse@bb - \gdef\mfp@parse@bb##1 ##2 ##3 ##4 ##5\\{% - \mfp@save@parse@bb##1 ##2 ##3 ##4 ##5\\% - \xdef\mfpicllx{\Gin@llx}\xdef\mfpiclly{\Gin@lly}}% - \if@mfp@pdf \gdef\mfp@Gtype{mps}% - \else \gdef\mfp@Gtype{eps}% - \fi - \gdef\preparemfpicgraphic##1{% - \let\Gread@parse@bb\mfp@parse@bb}% - \gdef\getmfpicoffset##1{}% - \gdef\setmfpicgraphic##1{\includegraphics{##1}}}}% \mfp@ifmpost{\usemetapost}{}% - \AtEndDocument{\@closegraphsfile}% + \AtEndDocument{\mfp@closegraphsfile}% \else - \Mfpic@msg{\mfpfiledate\space v\mfpfileversion.}% - \if@mfp@pdf - \def\usemetapost{% - \@ifmfpfileisopen{\mfp@mpostfalse\MPtoolate@error}% - {\mfp@mposttrue - \mfp@ifdefined\convertMPtoPDF{}{\input supp-pdf\relax}% - \gdef\setmfpicgraphic##1{\convertMPtoPDF{##1}{1}{1}}% - \gdef\getmfpicoffset##1{% - \xdef\mfpicllx{\MPllx}\xdef\mfpiclly{\MPlly}}}}% + \mfp@msg{}\Mfpic@msg{\mfpfiledate\space v\mfpfileversion.\@nl}% + \newdef\mfp@useMP#1#2#3#4{% + \mfp@ifdefined#1{}{\input #2\relax}% + \global\let\setmfpicgraphic\mfp@includeMPS + \gdef\getmfpicoffset##1{\xdef\mfpicllx{#3}\xdef\mfpiclly{#4}}}% + \ifmfp@pdf + \newdef\mfp@includeMPS#1{\convertMPtoPDF{#1}{1}{1}}% + \newdef\@usemetapost{% + \mfp@useMP\convertMPtoPDF{supp-pdf}\MPllx\MPlly}% \else - \def\usemetapost{% - \@ifmfpfileisopen{\mfp@mpostfalse\MPtoolate@error}% - {\mfp@mposttrue - \mfp@ifdefined\epsfbox {}{\input epsf\relax}% - \gdef\setmfpicgraphic##1{\epsfbox{##1}}% - \gdef\getmfpicoffset##1{% - \xdef\mfpicllx{\epsfllx}\xdef\mfpiclly{\epsflly}}}}% + \newdef\mfp@includeMPS#1{\epsfbox{#1}}% + \newdef\@usemetapost{\mfp@useMP\epsfbox{epsf}\epsfllx\epsflly}% \fi \fi \mfp@DBlog{Handlers for optional parameters.}% -\long\def\mfp@ifnextchar#1#2#3{% - \let\mfptmp@d=#1\def\mfptmp@a{#2}% - \def\mfptmp@b{#3}\mfp@checknext}% -\def\mfp@checknext{\futurelet\@let@token\mfp@ifnch}% -\def\mfp@ifnch{% - \ifx\@let@token\@sptoken - \let\mfptmp@c\eatspace@checknext - \else\ifx\@let@token\relax - \long\def\mfptmp@c##1{\mfp@checknext}% - \else\ifx\@let@token\mfptmp@d - \let\mfptmp@c\mfptmp@a - \else - \let\mfptmp@c\mfptmp@b - \fi\fi\fi\mfptmp@c}% -\begingroup - \def\:{\global\let\@sptoken= }\: % - \def\:{\eatspace@checknext}\@xp\gdef\: {\mfp@checknext}% -\endgroup -\newdef\mfp@ifempty#1{% - \if~#1~\@xp\@firstoftwo\else\@xp\@secondoftwo\fi}% -\begingroup -\catcode`Q=3 -\long\gdef\@ifmtarg#1{\@xifmtarg#1QQ\@secondoftwo\@firstoftwo\@nil}% -\long\gdef\@xifmtarg#1#2Q#3#4#5\@nil{#4}% -\endgroup -\newdef\@ifmtsub#1#2{\@ifmtarg{#1}{#2}{#1}}% -\newdef\mfp@mtsub#1#2{\mfp@ifempty{#1}{#2}{#1}}% -\newdef\do@ptparam#1#2{\mfp@ifnextchar[{#1}{#1[#2]}}% -\newdef\simple@opt#1#2{% - \mfp@ifnextchar[{\process@opt{#1}{#2}}{#1{#2}}}% -\newdef\process@opt#1#2[#3]{% - \mfp@ifempty{#3}{#1{#2}}{#1{#3}}}% -\newdef\null@opt#1{\mfp@ifnextchar[{#1}{#1[]}}% -\newdef\do@mtparam#1#2#3{\mfp@ifempty{#1}{#3[#2]}{#3[#1]}}% +\mfp@ifundefined\@ifnextchar + \long\def\@ifnextchar#1#2#3{% + \let\reserved@d#1% + \def\reserved@a{#2}% + \def\reserved@b{#3}% + \futurelet\@let@token\@ifnch}% + \def\@ifnch{% + \ifx\@let@token\@sptoken + \let\reserved@c\@xifnch + \else + \ifx\@let@token\reserved@d + \let\reserved@c\reserved@a + \else + \let\reserved@c\reserved@b + \fi + \fi + \reserved@c}% + {% + \def\:{\global\let\@sptoken= }\: % this makes \@sptoken a space token + \def\:{\@xifnch}\@xp\gdef\: {\futurelet\@let@token\@ifnch}% + }% +\mfp@enddef +\def\mfp@iftoken#1#2{\@ifnextchar#1{\@firstoftwo{#2}}}% +\def\mfp@ifstar#1#2#3{\mfp@iftoken*{#1{#2}}{#1{#3}}}% +\def\mfp@ifend{\mfp@iftoken\mfp@end}% +\def\mfp@ifendorcomma#1#2#3{\mfp@ifend{#1}{\mfp@iftoken,{#2}{#3}}}% +{% + \catcode`Q3 \catcode`\~12 + \gdef\mfp@ifempty#1{\if~#1~\@xp\@firstoftwo\else\@xp\@secondoftwo\fi}% + \gdef\mfp@ifexist#1{\if~#1~\@xp\@gobble\else\@xp\@firstofone\fi}% + \gdef\mfp@emptysub#1#2{\if~#1~#2\else#1\fi}% + \long\gdef\@ifmtarg#1{\@xifmtarg#1QQ\@secondoftwo\@firstoftwo\@nil}% + \long\gdef\@xifmtarg#1#2Q#3#4#5\@nil{#4}% +}% +\newdef\mfp@defaultopt#1#2{% + \@ifnextchar[{\mfp@ifemptyopt{#1}{#2}}{#1{#2}}}% +\newdef\mfp@ifemptyopt#1#2[#3]{\mfp@ifempty{#3}{#1{#2}}{#1{#3}}}% +\newdef\mfp@nullopt#1{\@ifnextchar[{\mfp@getopt{#1}}{#1{}}}% +\newdef\mfp@getopt#1[#2]{#1{#2}}% \mfp@DBlog{Direct output to Metafont/Post file.}% -\begingroup +{% \catcode\mfp@ctrlM\active% \gdef\@activectrlM{^^M}% - \gdef\mfpicobeylines{\catcode\mfp@ctrlM\active\let^^M\relax}% -\endgroup -\newdef\preservelines{\newlinechar\mfp@ctrlM - \endlinechar\newlinechar \mfpicobeylines}% -\newdef\unpreservelines{\catcode\mfp@ctrlM=5 }% -\newdef\mfsrc {\@mfwrite\@mfsrc\mfsrc}% -\newdef\mfcmd {\@mfwrite\@mfcmd}% -\newdef\mflist{\@mfwrite\@mflist}% -\newdef\@mfwrite{\begingroup - \preservelines \let\@nl\@activectrlM}% -\newdef\@mfsrc#1#2{% - \@ifmfpfileisopen{\immediate\write\mfp@out{#2}}% - {\nooutputfileerror{#1}}\endgroup}% -\newdef\@mfcmd#1{\@mfsrc\mfcmd{#1;}}% -\newdef\@mflist#1{\@mfsrc\mflist{(#1);}}% -\newdef\mfp@gobble#1{}% -\edef\mf@p{\@xp\mfp@gobble\string\%}% percent (%) -\edef\mf@s{\@xp\mfp@gobble\string\#}% sharp (#) -\edef\mf@b{\@xp\mfp@gobble\string\\}% backslash (\) -\newdef\mf@d{--------------}% -\newdef\mfp@delim{% - \mfp@errmsg {Misplaced \string\mfp@delim.}% - {If you get this message but did not (mis)use the command^^J% - \mfp@delim, please report this to the mfpic maintainer.}}% -{\mfp@ifdefined\normalmonth - {\let\month\normalmonth\let\year\normalyear}{}% - \xdef\mfp@today{\number\year/\ifnum\month<10 0\fi\number\month/% - \ifnum\day<10 0\fi\number\day}% - \count2=\time \divide\count2 by 60 - \xdef\mfp@now{\ifnum\count2<10 0\fi\number\count2:}% - \multiply\count2 by -60 \advance\count2 \time - \xdef\mfp@now{\mfp@now\ifnum\count2<10 0\fi\number\count2 }}% + \gdef\mfp@obeylines{\catcode\mfp@ctrlM\active\let^^M\relax}% +}% +\newdef\mfp@keeplines{\newlinechar\mfp@ctrlM + \endlinechar\newlinechar \mfp@obeylines}% +\newdef\mfsrc {\mfp@write\mfp@src\mfsrc}% +\newdef\mfcmd {\mfp@write\mfp@cmd}% +\newdef\mflist{\mfp@write\mfp@wlist}% +\newdef\mfp@write{\begingroup\mfp@keeplines \let\@nl\@activectrlM}% +\newdef\mfp@src#1#2{% + \mfp@ifopengraphsfile{\immediate\write\mfp@out{#2}}% + {\mfp@nooutput@error{#1}}\endgroup}% +\newdef\mfp@cmd#1{\mfp@src\mfcmd{#1;}}% +\newdef\mfp@wlist#1{\mfp@src\mflist{(#1);}}% +\edef\mfp@p{\@xp\@gobble\string\%}% percent (%) +\edef\mfp@s{\@xp\@gobble\string\#}% sharp (#) +\edef\mfp@b{\@xp\@gobble\string\\}% backslash (\) +\newdef\mfp@d{--------------}% +\mfp@ifdefined\two@digits{}% + {\def\two@digits#1{\ifnum#1<10 0\fi\number#1}}% +{% + \mfp@ifdefined\normalmonth + {\let\month\normalmonth\let\year\normalyear}{}% + \count@\time \divide\count@ by 60 + \xdef\mfp@now{\number\year/\two@digits\month/\two@digits\day + \space at \two@digits\count@:}% + \multiply\count@ by -60 \advance\count@\time + \xdef\mfp@now{\mfp@now\two@digits\count@}% +}% \mfp@DBlog{Declarations used with data and graphs files.}% \newwrite\mfp@out \newread\mfp@graph \newlet\mfp@data\mfp@graph \newcount\mfp@count \newcount\mfp@linetype -\newcount\mfp@n \newcount\mfp@sequence \newtoks\mfp@toks -\newtoks\every@tlabel \newtoks\mfp@verbtex \newtoks\mfp@commonverbatimtex -\every@tlabel{}% +\newif\ifmfp@switch \begingroup - \let\newtoks\relax - \@makeother\%\@makeother\#\preservelines - \global\mfp@commonverbatimtex= - {\def\MFPtext#1{% - \vbox{\def\\{\cr}\MFPcfont\everylabel - \halign{##\hfil\cr#1\crcr}}}% + \mfp@keeplines\@makeother\#% + \@makeother\%\global\mfp@commonverbatimtex + {\gdef\mpxshipout{\afterassignment\middlempxshipout\setbox0=\hbox}% + \gdef\middlempxshipout{\aftergroup\finishmpxshipout}% + \gdef\finishmpxshipout{\dimen1=\ht0 \dimen2=\dp0 + \dimen0=\dimen1 \advance\dimen0\dimen2 + \setbox0=\hbox{\hbox{\box0 + \ifnum\dimen0>0 \vrule width1sp height\dimen1 depth\dimen2 + \else \vrule width1sp height1sp depth0sp\relax + \fi}}% + \ht0=0pt \dp0=0pt \shipout\hbox{\box0}}% + \def\MFPtext#1{\vbox{\def\\{\cr}\MFPcfont\everylabel + \halign{##\hfil\cr#1\crcr}}}% }\endgroup +\newdef\mfp@versioninfo{% + \mfp@p\space\mfp@filename.m\mfp@ifmpost{p}{f}, + generated by Mfpic, v\mfpfileversion\space\mfpfiledate,\@nl + \mfp@p\space from TeX source "\jobname" on \mfp@now\@nl + numeric mfpicversion; mfpicversion:=\mfpicversion;\@nl}% +\newdef\mfp@init@outfile{% + if unknown mode: mode = localfont; fi\@nl + if unknown mag: mag = \number\mag/1000; fi\@nl + if unknown grafbase: input grafbase; fi\@nl\@nl}% +\newdef\mfp@versioncheck{% + if unknown grafbaseversion: grafbaseversion = 0; fi\@nl + if grafbaseversion <> mfpicversion :\@nl + GBmsg "Bad mfpic installation: mfpic and grafbase % + versions do not match.";\@nl + fi\@nl}% +\newdef\mfp@openfile{% + \ifmfp@nowrite \else \mfp@msg{}% + \Mfpic@msg{Initializing \mfp@filename\mfp@ext.}% + \immediate\openout\mfp@out=\mfp@filename\mfp@ext\relax + \Mfpic@msg{Don't forget to process \mfp@filename\mfp@ext!}% + \Mfpic@msg{Apply \mfp@progname\space to \mfp@filename\mfp@ext% + \mfp@ifmpost{}{, then gftopk to the resulting gf file}.}% + \Mfpic@msg{Then reprocess this file "\jobname".\@nl}% + \fi}% +\mfp@ifundefined\IfFileExists + \def\IfFileExists#1{\openin\mfp@graph=#1\relax + \ifeof\mfp@graph \@xp\@secondoftwo + \else \immediate\closein\mfp@graph \@xp\@firstoftwo + \fi}% + \def\InputIfFileExists#1#2{\IfFileExists{#1}{#2\input #1\relax}}% +\mfp@enddef +\newdef\mfp@checkoutput#1#2#3{% + \IfFileExists{\setfilename\mfp@filename{#1}}% + {\global\mfpicdraftfalse #2}% + {\global\mfpicdrafttrue #3\mfp@msg{}% + \Mfpic@msg{No file \setfilename\mfp@filename{#1}.}% + }}% +\newdef\mfp@checkMPoutput{\mfp@checkoutput{\number\mfp@count}{}{}}% +\newdef\mfp@checkMFoutput{\mfp@checkoutput{tfm}% + {\global\font\mfp@graphfont\mfp@filename\relax}% + {\global\let\mfp@graphfont\mfp@dummy}}% +\newdef\mfp@MPextras{\mfp@toks\@xp{\every@tlabel}% + \mfsrc{% + if unknown Apricot: input dvipsnam.mp; fi\@nl + verbatimtex\@nl + \ifmfp@verbtex \the\mfp@verbtex\@nl \fi + \the\mfp@commonverbatimtex\@nl + \def\noexpand\everylabel{\the\mfp@toks}\@nl + etex;\@nl}% + \global\mfp@verbtexfalse \global\mfp@verbtex{}% + \@ifmplabels\usemplabels{}% + \ifmfp@truebbox \usetruebbox \fi + \ifmfp@overlabels \overlaylabels \fi}% \mfp@DBlog{Macros to open and close graphs files.}% \newdef\opengraphsfile#1{\@bsphack - \@ifmfpfileisopen% + \def\mfp@tempa{#1}% + \mfp@ifopengraphsfile% {\Mfpic@warn - {An attempt has been made to open a graph file, #1, - \@msgbreak while another, \mfp@filename, is still open. - \@msgbreak Closing \mfp@filename.}% - \@closegraphsfile}% + {\@nl An attempt has been made to open a graph file, + \mfp@sanitized\mfp@tempa\@msgbreak + while another, \mfp@filename, is still open. \@msgbreak + Closing \mfp@filename.}\mfp@closegraphsfile}% {}% - \xdef\mfp@filename{#1}% - \mfp@ifmpost{% - \openin\mfp@graph=\setfilename{\mfp@filename}{\number\mfp@count}% - \relax - \ifeof\mfp@graph \mfp@msg{}% - \Mfpic@msg - {No file \setfilename{\mfp@filename}{\number\mfp@count}.^^J}% - \global\mfpicdrafttrue - \else - \global\mfpicdraftfalse - \fi - \if@mfp@nowrite \else - \immediate\openout\mfp@out=\mfp@filename.mp\relax - \Mfpic@msg{Don't forget to process \mfp@filename.mp! % - \@msgbreak (Apply metapost to \mfp@filename.mp.)}% - \fi - }{% metafont - \openin\mfp@graph=\mfp@filename.tfm\relax - \ifeof\mfp@graph \mfp@msg{}% - \Mfpic@msg{No file \mfp@filename.tfm .^^J}% - \global\let\@graphfont=\mfp@dummy - \global\mfpicdrafttrue - \else - \global\font\@graphfont=\mfp@filename\relax - \global\mfpicdraftfalse - \fi - \if@mfp@nowrite \else - \immediate\openout\mfp@out=\mfp@filename.mf\relax - \Mfpic@msg{Don't forget to process \mfp@filename.mf! % - \@msgbreak (Apply metafont to \mfp@filename.mf, % - then gftopk to the resulting gf file.)}% - \fi - }% - \closein\mfp@graph - \if@mfp@nowrite\else - \Mfpic@msg{Then reprocess this file (\jobname).^^J}% - \fi - \if@mfp@draft\global\mfpicdrafttrue\fi - \if@mfp@final\global\mfpicdraftfalse\fi - \if@mfp@nowrite\gdef\@mfsrc##1##2{}\fi - \mfsrc{% - \mf@p\space\mfp@filename.m\mfp@ifmpost{p}{f}, % - generated by Mfpic, v\mfpfileversion\space\mfpfiledate,\@nl - \mf@p\space from TeX source "\jobname" % - on \mfp@today\space at \mfp@now\@nl - numeric mfpicversion; mfpicversion:=\mfpicversion;\@nl - if unknown mode: mode := localfont; fi\@nl - if unknown mag: mag := \number\mag/1000; fi\@nl - if unknown grafbase: input grafbase; fi\@nl\@nl - if unknown grafbaseversion: grafbaseversion := 0; fi\@nl - if grafbaseversion <> mfpicversion :\@nl - GBmsg "Bad mfpic installation: mfpic and grafbase % - versions do not match.";\@nl - fi\@nl}% - \mfp@ifmpost - {\mfsrc{% - if unknown Apricot: input dvipsnam.mp; fi\@nl - verbatimtex\@nl - \the\mfp@commonverbatimtex\@nl - \def\noexpand\everylabel{\the\every@tlabel}\@nl - \if@mfp@verbtex \the\mfp@verbtex\@nl \fi - etex;\@nl}% - \global\@mfp@verbtexfalse\mfp@verbtex{}% - \@ifmplabels{\usemplabels}{}% - \if@mfp@truebbox \usetruebbox \fi - \if@mfp@overlabels \overlaylabels \fi}{}% - \if@mfp@clip \clipmfpic \fi - \if@mfp@clearsym \clearsymbols \fi - \if@shipping\else\stopshipping\fi + \xdef\mfp@filename{\mfp@sanitized\mfp@tempa} + \xdef\mfp@progname{meta\mfp@ifmpost{pos}{fon}t}% + \xdef\mfp@ext{.m\mfp@ifmpost{p}{f}}% + \mfp@ifmpost\mfp@checkMPoutput\mfp@checkMFoutput + \mfp@openfile + \ifmfp@draft \global\mfpicdrafttrue \fi + \ifmfp@final \global\mfpicdraftfalse \fi + \ifmfp@nowrite \gdef\mfp@src##1##2{\endgroup}\fi + \mfsrc{\mfp@versioninfo\mfp@init@outfile\mfp@versioncheck}% + \mfp@ifmpost\mfp@MPextras{}% + \ifmfp@clip \clipmfpic \fi + \ifmfp@clearsym \clearsymbols \fi + \ifmfp@noship \stopshipping \fi + \ifmfp@readlog \mfp@readlogfile \fi \@esphack}% \newdef\closegraphsfile{% - \@ifmfpfileisopen{}{\nooutputfileerror\closegraphsfile}% - \@closegraphsfile \global\let\mfp@filename\UndEfInEd}% -\newdef\@closegraphsfile{% - \@ifmfpfileisopen - {\if@mfp@nowrite \else + \mfp@ifopengraphsfile{}{\mfp@nooutput@error\closegraphsfile}% + \mfp@closegraphsfile}% +\newdef\mfp@closegraphsfile{% + \mfp@ifopengraphsfile + {\ifmfp@nowrite \else \mfsrc{\@nl end.}\immediate\closeout\mfp@out - \fi}{}}% -\def\nooutputfileerror#1{% - \mfp@errmsg {No output file has been opened.}% - {You have tried to used a command, #1, that requires an output^^J% - file to be opened with the \opengraphsfile command, which^^J% - was either not issued or was not successful.}}% + \fi \global\let\mfp@filename\UndEfInEd}{}}% +\edef\mfpicvalue{\string\mfpicvalue}% +\newdef\mfp@cmdname{% + mfpic-\ifin@mfpicenv\number\mfp@count\fi-\@xp\@gobble\string}% +\newdef\assignmfvalue{\mfp@assign\@empty}% +\newdef\globalassignmfvalue{\mfp@assign\global}% +\newdef\mfp@assign#1#2#3{% + #1\edef#2{% + \@ifundefined{\mfp@cmdname#2}{???}{\@nameuse{\mfp@cmdname#2}}}% + \@ifundefined{\mfp@cmdname#2}% + {\mfp@msg{}\Mfpic@msg{No value for \string#2 in mfpic figure + \number\mfp@count.\@nl}}% + {}% + \mfsrc{\@ifmplabels{\@nl verbatimtex #1\def\string#2{#2} etex;\@nl}{}% + message "\string\mfpicvalue";\@nl + message "\mfp@cmdname#2";\@nl + show #3;\@nl + message "";}}% +\newlet\assignmpvalue\assignmfvalue +\newlet\globalassignmpvalue\globalassignmfvalue +\newdef\strip@gtgt>> #1\mfp@end{#1}% +\newdef\mfp@readlogfile{% + \openin\mfp@data=\mfp@filename.log\relax + \ifeof\mfp@data \Mfpic@msg{No file \mfp@filename.log.}% + \else + {% + \mfp@resetwhitespace \endlinechar -1 + \catcode`\>12 + \def\@mfpicvalue{\mfpicvalue}% + \message{< Mfpic: Reading \mfp@filename.log}% + \mfp@readloglines + \message{>}% + }% + \fi \closein\mfp@data}% +\newdef\mfp@readloglines{% + \read\mfp@data to \mfp@tempa + \ifeof\mfp@data + \else + \ifx\mfp@tempa\@mfpicvalue + \read\mfp@data to \mfp@tempa + \read\mfp@data to \mfp@tempb + \@XP\xdef\@nameuse\mfp@tempa{\@xp\strip@gtgt\mfp@tempb\mfp@end}% + \fi + \@xp\mfp@readloglines + \fi}% \mfp@DBlog{Using dummy font's dimensions, to spare TeX registers.}% \font\mfp@dummy=dummy scaled 1042 -\fontdimen100\mfp@dummy=0pt +\fontdimen100\mfp@dummy0pt \newcount\mfp@fdc -\mfp@fdc=22 +\mfp@fdc22 \newdef\newfdim#1{% - \global\advance\mfp@fdc 1 + \global\advance\mfp@fdc1 \xdef#1{\fontdimen\number\mfp@fdc\mfp@dummy}% - \wlog{\string#1=\string\fontdimen\number\mfp@fdc\mfp@dummy}}% + \wlog{\string#1=\fontdimen\number\mfp@fdc\mfp@dummy}}% \mfp@DBlog{A box register for whole labeled graph, % and a temporary one.}% \newbox\@wholegraph \newbox\@textbox -\newdef\tb@ht{\ht\@textbox}% height, -\newdef\tb@dp{\dp\@textbox}% depth and -\newdef\tb@wd{\wd\@textbox}% width of the text label. +\newdef\tb@ht{\ht\@textbox}% +\newdef\tb@dp{\dp\@textbox}% +\newdef\tb@wd{\wd\@textbox}% \newbox\@alltlabels +\newbox\@backtext \newfdim\@tlabelstop \newfdim\@tlabelsbot \newfdim\@tlabelsleft -\newfdim\@tlabelsright \mfp@DBlog{Internal dimension parameters for graph dimensions...}% -\newfdim\@graphwd \newfdim\@graphright \newfdim\@graphleft \newfdim\@graphtop @@ -510,59 +592,65 @@ \newfdim\tlabel@hadj \newfdim\tlabel@vadj \newfdim\tlabel@sep -\tlabel@hadj=0pt -\tlabel@vadj=0pt -\tlabel@sep=0pt +\newfdim\tlpath@sep +\tlabel@hadj0pt +\tlabel@vadj0pt +\tlabel@sep0pt +\tlpath@sep0pt \mfp@DBlog{User level dimension parameters, with default settings.}% -\newfdim\mfpicunit % unit of length -\newfdim\pointsize % diameter of circle -\newfdim\shadespace % spacing of shade dots -\newfdim\polkadotspace % spacing of polkadots -\newfdim\hatchspace % spacing of lines -\newfdim\headlen % size of arrowhead (\arrow) -\newfdim\axisheadlen % size of arrowhead (x, y axes) -\newfdim\sideheadlen % size of arrowhead (border axes) -\newfdim\hashlen % length of marks on axes -\newfdim\dashlen % length of dashes (\dashed) -\newfdim\dashspace % space between dashes -\newfdim\dotsize % size of dots (\dotted) -\newfdim\dotspace % space between dots -\newfdim\symbolspace % space between symbols (\plot) -\mfpicunit=1pt -\pointsize=2pt -\shadespace=1pt -\polkadotspace=10pt -\hatchspace=3pt -\headlen=3pt -\axisheadlen=5pt -\sideheadlen=0pt -\hashlen=4pt -\dashlen=4pt -\dashspace=4pt -\dotsize=0.5pt -\dotspace=3pt -\symbolspace=5pt +\newfdim\mfpicunit +\newfdim\@mfpicunit % internal version +\newfdim\pointsize +\newfdim\shadespace +\newfdim\polkadotspace +\newfdim\hatchspace +\newfdim\headlen +\newfdim\axisheadlen +\newfdim\sideheadlen +\newfdim\hashlen +\newfdim\dashlen +\newfdim\dashspace +\newfdim\dotsize +\newfdim\griddotsize +\newfdim\dotspace +\newfdim\symbolspace +\mfpicunit1pt +\pointsize2pt +\shadespace1pt +\polkadotspace10pt +\hatchspace3pt +\headlen3pt +\axisheadlen5pt +\sideheadlen0pt +\hashlen4pt +\dashlen4pt +\dashspace4pt +\dotsize0.5pt +\griddotsize0.5pt +\dotspace3pt +\symbolspace5pt \newdef\save@mfpicdimens{% \edef\restore@mfpicdimens{% - \mfpicunit =\the\mfpicunit - \pointsize =\the\pointsize - \shadespace =\the\shadespace -\polkadotspace =\the\polkadotspace - \hatchspace =\the\hatchspace - \headlen =\the\headlen - \axisheadlen =\the\axisheadlen - \sideheadlen =\the\sideheadlen - \hashlen =\the\hashlen - \dashlen =\the\dashlen - \dashspace =\the\dashspace - \dotsize =\the\dotsize - \dotspace =\the\dotspace - \symbolspace =\the\symbolspace - \tlabel@hadj =\the\tlabel@hadj - \tlabel@vadj =\the\tlabel@vadj - \tlabel@sep =\the\tlabel@sep}}% + \mfpicunit \the\mfpicunit + \pointsize \the\pointsize + \shadespace \the\shadespace + \polkadotspace \the\polkadotspace + \hatchspace \the\hatchspace + \headlen \the\headlen + \axisheadlen \the\axisheadlen + \sideheadlen \the\sideheadlen + \hashlen \the\hashlen + \dashlen \the\dashlen + \dashspace \the\dashspace + \dotsize \the\dotsize + \griddotsize \the\griddotsize + \dotspace \the\dotspace + \symbolspace \the\symbolspace + \tlabel@hadj \the\tlabel@hadj + \tlabel@vadj \the\tlabel@vadj + \tlabel@sep \the\tlabel@sep + \tlpath@sep \the\tlpath@sep}}% \newdimen\mfp@scratch -\newdimen\mfp@scratchB \newdimen\mfpframesep \newdimen\mfpframethickness \newdimen\mfpicheight @@ -570,385 +658,387 @@ \newskip\mfpiccaptionskip \mfpframethickness0.4pt \mfpframesep2pt -\mfpiccaptionskip=\medskipamount -\def\mfpicnumber#1{\global\mfp@count=#1\relax}% -\newdef\mfpaddto#1#2{\mfp@scratch=#1pt\advance\mfp@scratch#2pt - \edef#1{\mfp@strippt\mfp@scratch}}% -\newdef\mfpmultiply#1#2{\mfp@scratch=#1pt \mfp@scratch#2\mfp@scratch - \edef#1{\mfp@strippt\mfp@scratch}}% -\begingroup - \@makeother P\@makeother T\lowercase{\gdef\mfp@factor#1PT{#1}}% -\endgroup -\newdef\mfp@strippt{\@xp\mfp@factor\the}% +\mfpiccaptionskip\medskipamount +\def\mfpicnumber#1{\global\mfp@count#1\relax}% +\newdef\mfpaddto#1#2{\mfp@scratch#1pt \advance\mfp@scratch#2pt + \edef#1{\strip@pt\mfp@scratch}}% +\newdef\mfpmultiply#1#2{\mfp@scratch#1pt \mfp@scratch#2\mfp@scratch + \edef#1{\strip@pt\mfp@scratch}}% +\mfp@ifundefined\strip@pt + \begingroup + \lccode`\/`\p + \lccode`\?`\t + \lowercase{% + \endgroup + \def\rem@pt#1.#2/?}{#1\ifnum#2>\z@.#2\fi}% + \def\strip@pt{\@xp\rem@pt\the}% +\mfp@enddef \newdef\pointdef#1(#2,#3){% + \@ifundefined{#1} {}{\Mfpic@warn{\mfp@b#1 already defined.}}% + \@ifundefined{#1x}{}{\Mfpic@warn{\mfp@b#1x already defined.}}% + \@ifundefined{#1y}{}{\Mfpic@warn{\mfp@b#1y already defined.}}% \@namedef{#1}{(#2,#3)}\@namedef{#1x}{#2}\@namedef{#1y}{#3}}% -\newdef\pairarray#1{% - \mfcmd{save #1}\mfsrc{textpairs (#1)}\mfp@writedata}% -\newdef\numericarray#1{\mfcmd{save #1; numeric #1; numeric #1[]}% - \mfsrc{list (#1)}\mfp@writedata}% -\newdef\lightershade{\shadespace=1.2\shadespace}% -\newdef\darkershade{\shadespace=.833333\shadespace}% -\newdef\dashlineset{\dashlen=4pt \dashspace=4pt}% -\newdef\dotlineset{\dashlen=1pt \dashspace=2pt}% +\newdef\setmfarray#1#2{\mfsrc{setarray (#1) (#2)}\mfp@writedata}% +\newlet\setmparray\setmfarray +\newdef\pairarray{\setmfarray{pair}}% +\newdef\numericarray{\setmfarray{numeric}}% +\newdef\colorarray{\setmfarray{color}}% +\newdef\globalsetmfarray#1#2{\mfsrc{gsetarray (#1) (#2)}\mfp@writedata}% +\newdef\lightershade{\shadespace1.2\shadespace}% +\newdef\darkershade{\shadespace.83333\shadespace}% +\newdef\dashlineset{\dashlen4pt \dashspace4pt }% +\newdef\dotlineset{\dashlen1pt \dashspace2pt }% \let\ifpointfill\iftrue \newdef\pointfilltrue{\mfp@let\ifpointfill\iftrue}% \newdef\pointfillfalse{\mfp@let\ifpointfill\iffalse}% +\newdef\mfpfor#1{\begingroup\mfsrc{for #1:}}% +\newdef\endmfpfor{\mfsrc{endfor}\endgroup}% +\newdef\mfploop{% + \begingroup\mfsrc{forever:}\let\@nountil\mfp@untilwarn}% +\newdef\mfpuntil#1{\mfcmd{exitif #1}\let\@nountil\@empty}% +\newdef\endmfploop{\@nountil\endmfpfor}% +\newdef\mfpwhile#1{\begingroup\mfcmd{forever: exitif not(#1)}}% +\newlet\endmfpwhile\endmfpfor +\newdef\plr#1{map (polar) (#1)}% +\newdef\midpoint#1{(0.5[#1])}% \mfp@DBlog{Tests to control multiple prefix commands.}% -\newif\if@startfig\@startfigtrue -\newif\if@imrend\@imrendtrue -\newdef\store@path{\mfsrc{\@nl store (curpath)}}% -\newdef\@firststage{\relax - \if@startfig \store@path \@imrendtrue \@startfigfalse\fi}% -\newdef\@rendmac{\@firststage \@imrendfalse \mfsrc}% -\newdef\@modmac{\@firststage \mfsrc}% -\newdef\@closmac{\@firststage \if@imrend\@xp\@render\fi \mfsrc}% -\newdef\@render{\draw[]}% -\newdef\setrender#1{\mfp@def\@render{#1}}% -\newdef\@figmacstart{% - \@firststage \if@imrend\@xp\@render\fi \@startfigtrue}% -\newdef\@figmac{\@figmacstart\mfcmd}% -\newdef\@listmac#1{\@figmacstart\mfsrc{#1}\mfp@writedata}% -\newdef\mfp@writedata{% - \mfp@ifnextchar\datafile{\mfp@writefile}{\mflist}}% -\newdef\mfp@writefile\datafile#1{\@processdatafile{#1}{\mfp@rwdata}}% -\newif\if@mfpswitch -\newdef\mftitle{\@bsphack\@mfpswitchtrue\mfp@gettoks\mf@title}% -\newdef\tmtitle{\mfp@gettoks\tm@title}% -\newdef\mfp@gettoks#1{\afterassignment#1\mfp@toks=}% -\newdef\tm@title{\@mfpswitchfalse\mf@title - \wlog{\the\mfp@toks}{\the\mfp@toks}}% -\newdef\mf@title{\mfsrc{}% - \immediate\write\mfp@out{mftitle "\the\mfp@toks";}% - \if@mfpswitch\@esphack\fi}% -\newdef\stopshipping{\mfp@let\if@shipping\iffalse - \@ifmfpfileisopen{\mfcmd{save shipit;def shipit = relax enddef}}{}}% -\newdef\resumeshipping{\mfp@let\if@shipping\iftrue - \@ifmfpfileisopen{\mfcmd{save shipit;def shipit = shipit_ enddef}}{}}% -\newlet\noship\stopshipping -\resumeshipping -\newdef\@processdatafile#1#2{% - \openin\mfp@data=#1\relax - \ifeof\mfp@data \nodatafileerror{#1}% +\newif\if@mfpstart\@mfpstarttrue +\newif\if@mfprend\@mfprendtrue +\newdef\mfp@storepath{\mfsrc{\@nl store (curpath)}}% +\newdef\mfp@first{\relax + \if@mfpstart \mfp@storepath \@mfprendtrue \@mfpstartfalse\fi}% +\newdef\mfp@rendmac{\mfp@first \@mfprendfalse \mfsrc}% +\newdef\mfp@modmac{\mfp@first\mfp@autorend\mfsrc}% +\newdef\mfp@autorend{\if@mfprend\@xp\mfp@render\fi}% +\newdef\mfp@addmac{\mfp@first \mfsrc}% +\newdef\mfp@render{\draw[]}% +\newdef\setrender#1{\mfp@def\mfp@render{#1}}% +\newdef\mfp@figmacbase{\mfp@first \mfp@autorend \@mfpstarttrue}% +\newdef\mfp@figmac{\mfp@figmacbase\mfcmd}% +\newdef\mfp@listmac#1{\mfp@figmacbase\mfsrc{#1}\mfp@writedata}% +\newdef\mfp@writedata{\mfp@iftoken\datafile{\mfp@writefile}{\mflist}}% +\newdef\mfp@writefile{% + \mfp@ifopengraphsfile + {\mfp@processfile{\mfp@rwdata}}{\mfp@nooutput@error\datafile}}% +\newdef\mftitle#1{\@bsphack\mfp@title\mftitle{#1}\@esphack}% +\newdef\tmtitle#1{\mfp@title\tmtitle{#1}\wlog{\the\mfp@toks}{#1}}% +\newdef\mfp@title#1#2{\mfp@toks{#2}% + \mfp@write\mfp@src#1{mftitle "\the\mfp@toks";}}% +\newdef\mfp@processfile#1#2{% + \openin\mfp@data=#2\relax + \ifeof\mfp@data \mfp@nofile@error{#2}% \else - \begingroup + \mfp@DBlog{Opening file #2 for data.}% + {% \mfp@resetwhitespace \mfp@setcomment - \skipBlanksandComments - \ifeof\mfp@data \emptydatafileerror{#1}\else #2\fi - \global\mfp@n=\mfp@linetype - \endgroup - \mfp@linetype=\mfp@n + \mfp@skipblanklines + \ifeof\mfp@data + \mfp@nodata@error{#2}% + \else + \message{< Mfpic: Reading #2}% + #1% + \message{>}% + \fi + \@xp + }\@xp\mfp@linetype\number\mfp@linetype\relax + \mfp@DBlog{Closing file #2.}% \fi \closein\mfp@data}% -\newdef\nodatafileerror#1{% - \mfp@errmsg{No data file: #1 .}% - {The data file you tried to plot can't be found.}}% -\newdef\emptydatafileerror#1{% - \mfp@errmsg{Empty data file: #1 .}% - {The file you tried to plot contains only empty lines and comments.}}% -\newdef\mfp@resetwhitespace{% - \catcode`\^^M=5 \catcode`\ =10 \catcode`\^^I=10 }% -\mfp@ifdefined\@empty{}{\def\@empty{}}% -\newdef\skipcomments{\read\mfp@data to \mfp@temp - \ifx\mfp@temp\@empty \@xp\skipcomments\fi}% -\newdef\skipBlanksandComments{\skipcomments +\newdef\mfp@resetwhitespace{\mfp@restorepar + \endlinechar`\^^M \catcode`\^^M5 \catcode`\ 10 \catcode`\^^I10 }% +\newdef\mfp@skipcomments{\read\mfp@data to \mfp@temp + \ifx\mfp@temp\@empty \@xp\mfp@skipcomments\fi}% +\newdef\mfp@skipblanklines{\mfp@skipcomments \ifeof\mfp@data - \else\ifx\mfp@temp\mfp@par \@XP\skipBlanksandComments + \else\ifx\mfp@temp\mfp@par \@XP\mfp@skipblanklines \fi\fi}% - \def\mfp@rwdata{\mfp@n=1 \mfp@sequence=1 - \def\sequence{\number\mfp@sequence}% - \edef\mfp@temp{\mfp@temp\space}% - \edef\mfp@buffer{(\@xp\parse@data\mfp@temp\mfp@delim}% - \mfp@rwdataloop}% - \def\mfp@rwdataloop{% - \read\mfp@data to \mfp@temp - \ifx\mfp@temp\mfp@par - \mfcmd{\mfp@buffer)}% +\newdef\mfp@nextdatum{\@xp\parse@data\mfp@temp\mfp@end}% +\newdef\mfp@rwdata{\mfp@count1 \mfp@sequence1 + \def\sequence{\number\mfp@sequence}% + \edef\mfp@temp{\mfp@temp\space}% + \edef\mfp@buffer{(\mfp@nextdatum}\mfp@rwdataloop}% +\newdef\mfp@rwdataloop{% + \read\mfp@data to \mfp@temp + \ifx\mfp@temp\mfp@par + \mfcmd{\mfp@buffer)}% + \else + \ifx\mfp@temp\@empty \else - \ifx\mfp@temp\@empty % comment line, read another - \else - \edef\mfp@temp{\mfp@temp\space}% - \advance\mfp@sequence1 - \edef\mfp@buffer{\mfp@buffer\mfp@join}% - \ifnum\mfp@n<\mfpdataperline\relax - \advance\mfp@n1 - \else - \mfsrc{\mfp@buffer}% - \mfp@n=1 - \def\mfp@buffer{}% - \fi - \edef\mfp@buffer{\mfp@buffer - \@xp\parse@data\mfp@temp\mfp@delim}% + \edef\mfp@temp{\mfp@temp\space}% + \advance\mfp@sequence1 + \edef\mfp@buffer{\mfp@buffer\mfp@join}% + \ifnum\mfp@count<\mfpdataperline\relax \advance\mfp@count1 + \else \mfsrc{\mfp@buffer}\mfp@count1 \def\mfp@buffer{}% \fi - \@xp\mfp@rwdataloop - \fi}% -\newdef\drawpen#1{\mfcmd{\@nl resizedrawpen (#1)}}% -\newlet\pen=\drawpen \newlet\penwd=\drawpen + \edef\mfp@buffer{\mfp@buffer\mfp@nextdatum}% + \fi + \@xp\mfp@rwdataloop + \fi}% +\newdef\pen#1{\mfcmd{\@nl resizedrawpen (#1)}}% +\newlet\penwd\pen \newlet\drawpen\pen \newdef\shadewd#1{\setmfnumeric{shadewd}{#1}}% \newdef\polkadotwd#1{\setmfnumeric{polkadotwd}{#1}}% \newdef\hatchwd#1{\setmfnumeric{hatchwd}{#1}% \setmfvariable{pen}{hatchpen}{pencircle scaled hatchwd}}% -\newdef\dashpattern#1#2{\mfcmd{save #1; dashpat (#1) (#2)}}% +\newdef\dashpattern#1{\mfsrc{save #1; dashpat (#1)}\mfp@writedata}% \newdef\settension#1{\setmfnumeric{default_tension}{#1}}% \newcount\tl@vpos \newcount\tl@hpos -\tl@vpos=-1 \tl@hpos=-1 -\newdef\tlabel@rot{}% -\newdef\tlabeljustify#1{% - \mfp@ifempty{#1}{}{\mfp@justify#1\mfp@delim}}% -\def\mfp@justify#1#2\mfp@delim{\mfp@local\mfp@vconv{#1}% - \mfp@ifempty{#2}{}{\@mfp@justify#2\mfp@delim}}% -\newdef\@mfp@justify#1#2\mfp@delim{% - \mfp@local\mfp@hconv{#1}\mfp@local\edef\tlabel@rot{#2} +\newdef\mfp@tlh@l{-1}% +\newdef\mfp@tlh@c{0}% +\newdef\mfp@tlh@r{1}% +\newdef\mfp@tlv@B{-1}% +\newdef\mfp@tlv@b{0}% +\newdef\mfp@tlv@c{1}% +\newdef\mfp@tlv@t{2}% +\newdef\tl@rot{}\tl@vpos-1 \tl@hpos-1 +\newdef\tlabeljustify#1{\mfp@ifexist{#1}{\mfp@justify#1\mfp@end}}% +\newdef\mfp@justify#1#2\mfp@end{\mfp@local\mfp@vconv{#1}% + \mfp@ifexist{#2}{\mfp@@justify#2\mfp@end}}% +\newdef\mfp@@justify#1#2\mfp@end{\mfp@local\mfp@hconv{#1}% + \mfp@local\edef\tl@rot{#2}% \@ifmplabels{}% - {\mfp@ifempty{#2}{}% + {\mfp@ifexist{#2}% {\Mfpic@warn{Rotation of labels is not supported without the - mplabels\@msgbreak option. Rotation may be ignored\@online .}}}}% + mplabels\@msgbreak option. Rotation setting\on@line\space + may be ignored.}}% + }}% \newdef\mfp@vconv#1{% - \if B#1\tl@vpos=-1 \else - \if b#1\tl@vpos= 0 \else - \if c#1\tl@vpos= 1 \else - \if t#1\tl@vpos= 2 \else - \tl@vpos=-1 \mfp@justifyerror - \fi\fi\fi\fi}% + \@ifundefined{mfp@tlv@#1}% + {\tl@vpos-1 \mfp@justify@error}% + {\tl@vpos\@nameuse{mfp@tlv@#1}\relax}}% \newdef\mfp@hconv#1{% - \if l#1\tl@hpos=-1 \else - \if c#1\tl@hpos= 0 \else - \if r#1\tl@hpos= 1 \else - \tl@hpos=-1 \mfp@justifyerror - \fi\fi\fi}% -\newdef\mfp@justifyerror{% - \mfp@errmsg{Invalid justification parameter for text label.}% - {The optional argument for a text label must be^^J% - one of B, b, c or t^^J - followed by l or r or c,^^J% - followed by an angle (optionally).}}% + \@ifundefined{mfp@tlh@#1}% + {\tl@hpos-1 \mfp@justify@error}% + {\tl@hpos\@nameuse{mfp@tlh@#1}\relax}}% \newdef\tlpathjustify#1{% - \mfp@ifempty{#1}{}{\tlp@justify#1\mfp@delim}}% -\newdef\tlp@justify#1#2\mfp@delim{\mfp@def\tlpath@v{#1}% - \mfp@ifempty{#2}{}{\tlp@@justify#2\mfp@delim}}% -\newdef\tlp@@justify#1#2\mfp@delim{% + \mfp@ifexist{#1}{\tlp@justify#1\mfp@end}}% +\newdef\tlp@justify#1#2\mfp@end{\mfp@def\tlpath@v{#1}% + \mfp@ifexist{#2}{\tlp@@justify#2\mfp@end}}% +\newdef\tlp@@justify#1#2\mfp@end{% \mfp@def\tlpath@h{#1}\mfp@def\tlpath@r{#2}}% \tlpathjustify{cc}% -\newdef\tlabelsep#1{\mfp@local\tlabel@sep=#1\relax +\newdef\tlpointsep#1{\mfp@local\tlabel@sep#1\relax \setmfnumeric{label_sep}{\the\tlabel@sep}}% +\newdef\tlpathsep#1{\mfp@local\tlpath@sep#1\relax + \setmfnumeric{labelpath_sep}{\the\tlpath@sep}}% +\newdef\tlabelsep#1{\tlpointsep{#1}\tlpathsep{#1}}% \newdef\tlabeloffset#1#2{% - \mfp@local\tlabel@hadj=#1\relax \mfp@local\tlabel@vadj=#2\relax - \setmfvariable{pair}{label_adjust}% + \mfp@local\tlabel@hadj#1\relax \mfp@local\tlabel@vadj#2\relax + \setmfpair{label_adjust}% {(\the\tlabel@hadj,\the\tlabel@vadj)}}% -\newdef\everytlabel{\afterassignment\@everytlabel - \mfp@local\every@tlabel}% -\newdef\@everytlabel{% +\newdef\everytlabel{\afterassignment\mfp@everytlabel\mfp@toks}% +\newdef\mfp@everytlabel{\mfp@local\edef\every@tlabel{\the\mfp@toks}% \mfp@ifmpost - {\@ifmfpfileisopen + {\mfp@ifopengraphsfile {\mfcmd{verbatimtex\@nl - \def\noexpand\everylabel{\the\every@tlabel} etex}}% + \def\noexpand\everylabel{\the\mfp@toks} etex}}% {}}% {}}% +\newdef\every@tlabel{}% +\newdef\extra@endtlabel{}% +\newdef\pinumber{3.14159}% \newdef\headshape#1#2#3{\mfcmd{\@nl headshape (#1, #2, #3)}}% +\newdef\mfp@arr@b#1{\edef\mfp@hlocate{#1}}% +\newdef\mfp@arr@c#1{\edef\mfp@hcolour{#1}}% +\newdef\mfp@arr@l#1{\edef\mfp@hlength{#1}}% +\newdef\mfp@arr@r#1{\edef\mfp@hrotate{#1}}% +\newlet\mfp@arr@f\mfp@arr@b +\newlet\mfp@arr@s\mfp@arr@l +\newdef\mfp@arc@s{pps}% +\newdef\mfp@arc@t{ppp}% +\newdef\mfp@arc@p{\ifmfp@switch plr\fi}% +\newdef\mfp@arc@a{\ifmfp@switch alt\fi}% +\newdef\mfp@arc@c{cp\ifmfp@switch s\fi}% +\newdef\mfp@arc@r{pp (\mfp@T)}% +\newdef\mfp@arc@q{pp (\mfp@F)}% \newdef\mfpdefinecolor#1#2#3{\setmfcolor{#1}{#2(#3)}}% -\newdef\fillcolor{\@mfpcolor{fillcolor}}% -\newdef\drawcolor{\@mfpcolor{drawcolor}}% -\newdef\headcolor{\@mfpcolor{headcolor}}% -\newdef\hatchcolor{\@mfpcolor{hatchcolor}}% -\newdef\pointcolor{\@mfpcolor{pointcolor}}% -\newdef\tlabelcolor{\@mfpcolor{tlabelcolor}}% -\newdef\backgroundcolor{\@mfpcolor{background}}% -\newdef\@mfpcolor#1{% - \mfp@ifnextchar[{\mfp@color{#1}}{\setmfcolor{#1}}}% -\newdef\mfp@color#1[#2]#3{\setmfcolor{#1}{#2(#3)}}% +\newdef\mfp@defclr#1#2#3{\setmfcolor{#1}{\mfp@ifempty{#2}{#3}{#2(#3)}}}% +\newdef\mfp@newcolorcmd#1{% + \@namedef{#1\mfp@C}{\mfp@nullopt{\mfp@defclr{#1\mfp@C}}}}% +\mfp@newcolorcmd{draw}\mfp@newcolorcmd{fill}\mfp@newcolorcmd{tlabel}% +\mfp@newcolorcmd{hatch}\mfp@newcolorcmd{head}\mfp@newcolorcmd{point}% +\def\backgroundcolor{\mfp@nullopt{\mfp@defclr{background}}}% \newdef\dashedlines{\mfp@local\mfp@linetype0 - \mfp@def\mfp@setstyle{\gendashed{getdashpat\number\mfp@linetype}}}% + \mfp@def\mfp@setstyle{\gendashed{getdashpat \number\mfp@linetype}}}% \dashedlines \newdef\coloredlines{% \mfp@ifmpost {\mfp@local\mfp@linetype0 - \mfp@def\mfp@setstyle{\draw [getcolor\number\mfp@linetype]}}% - {\Mfpic@warn{You can't use \string\coloredlines\space in + \mfp@def\mfp@setstyle{\draw[getcolor \number\mfp@linetype]}}% + {\Mfpic@warn{You can't use \mfp@b coloredlines in Metafont.\@msgbreak Using \dashedlines instead}% \dashedlines}}% \newdef\pointedlines{\mfp@local\mfp@linetype0 - \mfp@def\mfp@setstyle{\plot{getsymbol\number\mfp@linetype}}}% + \mfp@def\mfp@setstyle{\plot{getsymbol \number\mfp@linetype}}}% \newdef\datapointsonly{\mfp@local\mfp@linetype0 \mfp@def\mfp@setstyle{\relax \plotnodes{getsymbol \number\mfp@linetype}}}% \newdef\reconfigureplot#1{\mfsrc{setdata#1}\mfp@writedata}% \newdef\defaultplot#1{\mfcmd{default#1}}% -\newdef\mfplinetype#1{\mfp@local\mfp@linetype=#1}% +\newdef\mfplinetype#1{\mfp@local\mfp@linetype#1\relax}% \newlet\mfplinestyle\mfplinetype \mfplinetype{0}% -\newdef\mfp@lshift{0}% -\newdef\mfp@bshift{0}% -\newdef\mfp@rshift{0}% -\newdef\mfp@tshift{0}% +\newdef\mfp@lshift{0}\newdef\mfp@bshift{0}% +\newdef\mfp@rshift{0}\newdef\mfp@tshift{0}% \newdef\axismargin#1#2{\setmfnumeric{#1axis}{#2}% \mfp@local\@namedef{mfp@#1shift}{#2}}% \newdef\setaxismargins#1#2#3#4{\axismargin l{#1}\axismargin b{#2}% - \axismargin r{#3}\axismargin t{#4}}% + \axismargin r{#3}\axismargin t{#4}}% \newdef\setallaxismargins#1{\setaxismargins{#1}{#1}{#1}{#1}}% -\newcount\mfp@axisnum -\def\get@axisnum#1#2{% - \if x#1\relax \mfp@axisnum0 - \else\if y#1\relax \mfp@axisnum1 - \else\if l#1\relax \mfp@axisnum2 - \else\if b#1\relax \mfp@axisnum3 - \else\if r#1\relax \mfp@axisnum4 - \else\if t#1\relax \mfp@axisnum5 - \else - \mfp@errmsg {Invalid axis letter "#1".}% - {The command #2 requires an axis to be designated by one of^^J% - the following letters: x, y, l, b, r, or t. If you proceed, ^^J% - x will be assumed.}% - \fi\fi\fi\fi\fi\fi}% +\def\mfp@axis@x{0}% +\def\mfp@axis@y{1}% +\def\mfp@axis@l{2}% +\def\mfp@axis@b{3}% +\def\mfp@axis@r{4}% +\def\mfp@axis@t{5}% +\def\mfp@getaxis#1#2\mfp@end#3{% + \@ifundefined{mfp@axis@#1}% + {\mfp@errmsg {Invalid axis letter "#1"}% + {The command #3 requires an axis to be designated by one of^^J% + the following letters: x, y, l, b, r, or t. If you proceed, ^^J% + x will be assumed.}\def\mfp@axisnum{0}\def\mfp@axisletter{x}}% + {\edef\mfp@axisnum{\@nameuse{mfp@axis@#1}}\def\mfp@axisletter{#1}}% + \edef\mfp@defheadlen{% + \the\ifnum\mfp@axisnum>1 \sideheadlen\else \axisheadlen\fi}}% \newdef\setaxismarks#1#2{\setmfnumeric{#1tick}{#2}}% \newdef\setxmarks#1{\setaxismarks x{#1}}% \newdef\setymarks#1{\setaxismarks y{#1}}% \newdef\setbordermarks#1#2#3#4{\setaxismarks l{#1}\setaxismarks b{#2}% \setaxismarks r{#3}\setaxismarks t{#4}}% \newdef\setallbordermarks#1{\setbordermarks{#1}{#1}{#1}{#1}}% -\newdef\smoothdata{\null@opt\@smoothdata}% -\newdef\@smoothdata[#1]{\mfp@def\mfp@smoothness{s}% - \mfp@def\mfp@tension{#1}}% -\newdef\unsmoothdata{\mfp@def\mfp@smoothness{p}% - \mfp@def\mfp@tension{}}% +\newdef\mfp@smdata#1{\mfp@def\mfp@smoothness{#1}% + \mfp@nullopt{\mfp@def\mfp@tension}}% +\newdef\smoothdata{\mfp@smdata{s}}% +\newdef\unsmoothdata{\mfp@smdata{p}\@empty}% \unsmoothdata% default -\newdef\using#1#2{\mfp@def\parse@data#1\mfp@delim{#2}}% +\newdef\using#1#2{\mfp@def\parse@data#1\mfp@end{#2}}% \newdef\usingpairdefault{\using{##1 ##2 ##3}{(##1,##2)}}% \newdef\usingnumericdefault{\using{##1 ##2}{##1}}% \usingpairdefault \newdef\mfpdataperline{5}% -\newdef\mfp@par{\par}% -\newdef\mfp@join{,}% -\newcount\@datacommentchar \@datacommentchar`\% +\newdef\mfp@par{\par}\newdef\mfp@join{,}% +\newcount\mfp@commentchar \mfp@commentchar`\%% \newdef\makepercentother{\@makeother\%}% -\newdef\makepercentcomment{\catcode`\%=14 }% -\newdef\mfpdatacomment#1{\mfp@local\@datacommentchar`#1}% -\newdef\mfp@setcomment{\makepercentother\catcode\@datacommentchar14 }% -\newdef\fdef{\begingroup\@makeother\#\preservelines\@fdef}% -\newdef\@fdef#1#2#3{\mfcmd{\@nl save #1;\@nl +\newdef\makepercentcomment{\catcode`\%14 }% +\newdef\mfpdatacomment#1{\mfp@local\mfp@commentchar`#1}% +\newdef\mfp@setcomment{\makepercentother\catcode\mfp@commentchar14 }% +\newdef\fdef{\begingroup\@makeother\#\mfp@keeplines\mfp@fdef}% +\newdef\mfp@fdef#1#2#3{\mfcmd{\@nl save #1;\@nl vardef #1 (expr #2) = \@nl #3\@nl enddef}\endgroup}% \newdef\mfp@additions{}% -\newdef\@mfpic@graf@macs{% - \newdef\plotdata{\null@opt\@plotdata}% - \newdef\@plotdata[##1]##2{\@processdatafile{##2}{\mfp@doplots{##1}}}% - \def\mfp@doplots##1{\mfp@setstyle - \advance\mfp@linetype1 \@figmacstart - \do@datafile{##1}% - \@if@enddata{}{\mfp@doplots{##1}}}% - \newdef\@if@enddata{% check for another blank line - \ifeof\mfp@data \@xp\@firstoftwo - \else - \skipcomments - \ifx\mfp@temp\mfp@par \@XP\@firstoftwo - \else \@XP\@secondoftwo - \fi - \fi}% - \newdef\datafile{\null@opt\@datafile}% - \newdef\@datafile[##1]##2{\@figmacstart - \@processdatafile{##2}{\do@datafile{##1}}}% - \newdef\do@datafile##1{% - \do@mtparam{##1}{\mfp@smoothness\mfp@tension}\@do@datafile}% - \newdef\@do@datafile[##1##2]{% - \mfsrc{% - \if s##1 \mfp@ifempty{##2}{curve }{tcurve (##2) }% - \else polyline - \fi (\mf@F)}\mfp@rwdata}% - \newdef\store##1##2{\@rendmac{stored (##1)}##2}% - \newlet\mfobj\@figmac - \newlet\mpobj\@figmac - \newdef\cutoffafter##1{\@closmac{cutoffafter (##1)}}% - \newdef\cutoffbefore##1{\@closmac{cutoffbefore (##1)}}% - \newdef\trimpath##1{\@getdimens##1,,\mfp@delim - \@closmac{trimmedpath (\the\mfp@scratch, \the\mfp@scratchB)}}% - \newdef\@getdimens##1,##2,##3\mfp@delim{% - \mfp@scratch \@ifmtsub{##1}{\z@}\relax - \mfp@scratchB\@ifmtsub{##2}{\mfp@scratch}\relax}% - \newdef\partpath##1{\@closmac{partialpath (##1)}}% - \newdef\subpath##1{\@closmac{gsubpath (##1)}}% - \newdef\draw{\null@opt\@draw}% - \newdef\@draw[##1]{% - \@rendmac{\mfp@ifempty{##1}{drawn}{colordrawn (##1)}}}% - \newdef\dashed{\simple@opt\@dashed{\the\dashlen,\the\dashspace}}% - \newdef\@dashed##1{\@rendmac{DASHED (##1)}}% - \newdef\dotted{\simple@opt\@dotted{\the\dotsize,\the\dotspace}}% - \newdef\@dotted##1{\@rendmac{dotted (##1)}}% - \newdef\gendashed##1{\@rendmac{gendashed (##1)}}% - \newdef\plot{\simple@opt\@plot{\the\pointsize, \the\symbolspace}}% - \newdef\@plot##1##2{\@rendmac{doplot (##2, ##1)}}% - \newdef\plotnodes{\simple@opt\@plotnodes{\the\pointsize}}% - \newdef\@plotnodes##1##2{\@rendmac{plotnodes (##2, ##1)}}% - \newdef\@closed##1##2{% - \@closmac{##1closed\mfp@ifempty{##2}{}{t (##2)}}}% - \newdef\bclosed{\null@opt\@bclosed}% - \newdef\@bclosed[##1]{\@closed b{##1}}% - \newdef\sclosed{\null@opt\@sclosed}% - \newdef\@sclosed[##1]{\@closed s{##1}}% - \newdef\lclosed{\@closed l{}}% - \newdef\cbclosed{\@closed{cb}{}}% - \newdef\qbclosed{\@closed{qb}{}}% +\newdef\mfp@grafmacs{% + \newdef\rect##1{\mfp@figmac{rect (##1)}}% + \newdef\regpolygon##1##2##3##4{% + \mfp@figmac{regularpolygon (##1) (##2) (##3; ##4;)}}% + \def\circle{\mfp@switchfalse\mfp@defaultopt\mfp@arccircle{p}}% + \newdef\ellipse{\mfp@defaultopt\mfp@ellipse{0}}% + \newdef\sector##1{\mfp@figmac{sector (##1)}}% + \newdef\arc{\mfp@iftoken*{\arccomplement\mfp@arc}{\mfp@arc}}% + \newdef\lines{\mfp@listi{polyline}\mfp@F}% + \newdef\polygon{\mfp@listi{polyline}\mfp@T}% + \newdef\computedspline{\mfp@listi{dospline}\mfp@F}% + \newdef\closedcomputedspline{\mfp@listi{dospline}\mfp@T}% + \newdef\qspline{\mfp@listi{qspline}\mfp@F}% + \newdef\closedqspline{\mfp@listi{qspline}\mfp@T}% + \newdef\cspline{\mfp@listi{cspline}\mfp@F}% + \newdef\closedcspline{\mfp@listi{cspline}\mfp@T}% + \newdef\qbeziers{\mfp@listi{qbezier}\mfp@F}% + \newdef\closedqbeziers{\mfp@listi{qbezier}\mfp@T}% + \newdef\fcnspline{\mfp@listi{fcnspline}\mfp@F}% + \newdef\periodicfcnspline{\mfp@listi{fcnspline}\mfp@T}% + \newlet\closedpolyline\polygon + \newlet\polyline\lines + \newdef\curve{\mfp@curve{curve}\mfp@F}% + \newdef\cyclic{\mfp@curve{curve}\mfp@T}% + \newdef\convexcurve{\mfp@curve{ccurve}\mfp@F}% + \newdef\convexcyclic{\mfp@curve{ccurve}\mfp@T}% + \newdef\mfbezier{\mfp@curve{bezier}\mfp@F}% + \newdef\closedmfbezier{\mfp@curve{bezier}\mfp@T}% + \newlet\closedcurve\cyclic + \newlet\closedconvexcurve\convexcyclic + \newdef\fcncurve{\mfp@nullopt\mfp@fcncurve}% + \newdef\turtle{\mfp@listmac{turtle}}% + \newdef\function{\mfp@fcn{function}s}% + \newdef\parafcn{\mfp@fcn{parafcn}s}% + \newdef\plrfcn{\mfp@fcn{plrfcn}s}% + \newdef\btwnfcn{\mfp@btwn{btwnfcn}}% + \newdef\btwnplrfcn{\mfp@btwn{btwnplrfcn}}% + \newdef\belowfcn{\mfp@fcn{belowfcn}p}% + \newdef\plrregion{\mfp@fcn{plrregion}p}% + \def\levelcurve{\mfp@fcn{levelset}p}% + \newdef\plotdata{\mfp@nullopt\mfp@plotdata}% + \newdef\datafile{\mfp@nullopt\mfp@datafile}% + \newdef\store##1##2{\mfp@rendmac{stored (##1)}##2}% + \newdef\norender{\mfp@first\@mfprendfalse}% + \newlet\mfobj\mfp@figmac \newlet\mpobj\mfobj + \newdef\mfpimage{\mfp@defaultopt\mfp@image{(0,0)}}% + \newdef\endmfpimage{\mfcmd{\@nl concludeimage}}% + \newdef\putmfpimage##1{\mfsrc{\@nl putimage (##1)}\mfp@writedata}% + \newdef\cutoffafter {\mfp@modi{cutoffafter}}% + \newdef\cutoffbefore{\mfp@modi{cutoffbefore}}% + \newdef\trimpath##1{\mfp@getdimens##1,,\mfp@end + \mfp@modi{trimmedpath}\mfp@thedimens}% + \newdef\partpath{\mfp@modi{partialpath}}% + \newdef\subpath{\mfp@modi{gsubpath}}% + \newdef\draw{\mfp@nullopt{\mfp@clroptrend{drawn}}}% + \newdef\doubledraw{\mfp@defaultopt\mfp@doubledraw{2penwd}}% + \newdef\dashed{\mfp@optrendi{DASHED}{\the\dashlen,\the\dashspace}}% + \newdef\dotted{\mfp@optrendi{dotted}{\the\dotsize,\the\dotspace}}% + \newdef\gendashed{\mfp@rendi{gendashed}}% + \newdef\zigzag{\mfp@rendi{zigzag}}% + \newdef\sinewave {\mfp@defaultopt{\mfp@wiggle{sinewave}}1}% + \newdef\coil{\mfp@defaultopt{\mfp@wiggle{corkscrew}}1}% + \newlet\corkscrew\coil + \newdef\plot{\mfp@optrendii{doplot}{\the\pointsize,\the\symbolspace}}% + \newdef\plotnodes{\mfp@optrendii{plotnodes}{\the\pointsize}}% + \newdef\showcontrols{\mfp@optrendii{showcontrols}{\the\pointsize}}% + \newdef\bclosed{\mfp@nullopt{\mfp@close b}}% + \newdef\sclosed{\mfp@nullopt{\mfp@close s}}% + \newdef\lclosed{\mfp@close l{}}% + \newdef\cbclosed{\mfp@close{cb}{}}% + \newdef\qbclosed{\mfp@close{qb}{}}% \newlet\uclosed\bclosed - \newdef\tess##1{\@rendmac{tess (##1)}}% - \newdef\shade{\simple@opt\@shade{\the\shadespace}}% - \newdef\@shade##1{\@rendmac{shade (##1)}}% - \newdef\polkadot{\simple@opt\@polkadot{\the\polkadotspace}}% - \newdef\@polkadot##1{\@rendmac{polkadot (##1)}}% - \newdef\thatch{\simple@opt\@thatch{\the\hatchspace,0}}% - \newdef\@thatch##1{\null@opt{\@@thatch{##1}}}% - \newdef\@@thatch##1[##2]{\@rendmac{% - \mfp@ifempty{##2}{thatch}{colorthatch (##2)} (##1)}}% - \newdef\lhatch{\simple@opt\@lhatch{\the\hatchspace}}% - \newdef\@lhatch##1{\@thatch{##1,-45}}% - \newdef\rhatch{\simple@opt\@rhatch{\the\hatchspace}}% - \newdef\@rhatch##1{\@thatch{##1,45}}% - \newdef\xhatch{\simple@opt\@xhatch{\the\hatchspace}}% - \newdef\@xhatch##1{\null@opt{\@@xhatch{##1}}}% - \newdef\@@xhatch##1[##2]{\@rendmac{% - \mfp@ifempty{##2}{xhatch}{colorxhatch (##2)} (##1)}}% - \newlet\hatch=\xhatch - \newdef\gfill{\null@opt\@gfill}% - \newdef\@gfill[##1]{% - \@rendmac{\mfp@ifempty{##1}{filled}{colorfilled (##1)}}}% - \newdef\gclear{\@rendmac{unfilled}}% - \newdef\gclip{\@rendmac{Clip}}% - \newdef\reverse{\@modmac{reverse}}% - \newdef\xyswappath{\@closmac{xyswappedpath}}% - \newdef\rotatepath##1{\@closmac{rotatedpath (##1)}}% - \newdef\shiftpath##1{\@closmac{shiftedpath (##1)}}% - \newdef\scalepath##1{\@closmac{scaledpath (##1)}}% - \newdef\xscalepath##1{\@closmac{xscaledpath (##1)}}% - \newdef\yscalepath##1{\@closmac{yscaledpath (##1)}}% - \newdef\slantpath##1{\@closmac{xslantedpath (##1)}}% + \newdef\makesector{\mfp@modmac{makesector}}% + \newdef\tess{\mfp@rendi{tess}}% + \newdef\shade{\mfp@optrendi{shade}{\the\shadespace}}% + \newdef\polkadot{\mfp@optrendi{polkadot}{\the\polkadotspace}}% + \newdef\thatch{\mfp@defaultopt\mfp@thatch{\the\hatchspace,0}}% + \newdef\lhatch{\mfp@defaultopt\mfp@lhatch{\the\hatchspace}}% + \newdef\rhatch{\mfp@defaultopt\mfp@rhatch{\the\hatchspace}}% + \newdef\xhatch{\mfp@defaultopt\mfp@xhatch{\the\hatchspace}}% + \newlet\hatch\xhatch + \newdef\gfill{\mfp@nullopt{\mfp@clroptrend{filled}}}% + \newdef\gclear{\mfp@rendmac{unfilled}}% + \newdef\gclip{\mfp@rendmac{Clip}}% + \newdef\reverse{\mfp@addmac{reverse}}% + \newdef\xyswappath{\mfp@modmac{xyswappedpath}}% + \newdef\rotatepath{\mfp@modi{rotatedpath}}% + \newdef\shiftpath{\mfp@modi{shiftedpath}}% + \newdef\scalepath{\mfp@modi{scaledpath}}% + \newdef\xscalepath{\mfp@modi{xscaledpath}}% + \newdef\yscalepath{\mfp@modi{yscaledpath}}% + \newdef\slantpath{\mfp@modi{xslantedpath}}% \newlet\xslantpath\slantpath - \newdef\yslantpath##1{\@closmac{yslantedpath (##1)}}% - \newdef\reflectpath##1{\@closmac{reflectedpath (##1)}}% - \newdef\transformpath##1{\@closmac{transformedpath (##1)}}% - \def\arrow{\def\@hbackset{0}\def\@hcolour{}% - \edef\@hlength{\the\headlen}\def\@hrotate{0}% - \@arrow}% - \newdef\@arrow{\mfp@ifnextchar[{\@arrowoption}{\@@arrow}}% - \newdef\@@arrow{% - \@modmac{% - \mfp@ifempty{\@hcolour}{headpath}{colorheadpath (\@hcolour)}% - \space(\@hlength, \@hrotate, \@hbackset)}}% - \newdef\@arrowoption[##1]{% - \mfp@ifempty{##1}{}{\@@arrowoption##1\mfp@delim}\@arrow}% - \newdef\@@arrowoption##1##2\mfp@delim{% - \if l##1\relax \mfp@ifempty{##2}{}{\def\@hlength{##2}}% - \else\if r##1\relax \mfp@ifempty{##2}{}{\def\@hrotate{##2}}% - \else\if b##1\relax \mfp@ifempty{##2}{}{\def\@hbackset{##2}}% - \else\if c##1\relax \mfp@ifempty{##2}{}{\def\@hcolour{##2}}% - \else - \Mfpic@warn{Improper option to \string\arrow\@online .}% - \fi\fi\fi\fi}% + \newdef\yslantpath{\mfp@modi{yslantedpath}}% + \newdef\reflectpath{\mfp@modi{reflectedpath}}% + \newdef\transformpath{\mfp@modi{transformedpath}}% + \newdef\parallelpath{\mfp@modi{parapath}}% + \newdef\randomizepath{\mfp@modi{randompath}}% + \newdef\randomlines{\mfp@modi{randomlines}}% + \newdef\arccomplement{\mfp@modmac{arccomplement}}% + \newdef\arrowhead{\mfp@ifstar\mfp@arrowhead\mfp@T\mfp@F}% + \def\arrow{\mfp@ifstar\mfp@arrow{x}{}}% + \newdef\arrowtail##1{\mfp@arr 0{tailpath (##1)}}% + \newdef\arrowmid##1{\mfp@arr{0.5}{midpath (##1)}}% \newdef\coords{\mfsrc{\@nl bcoords\@nl}}% \newdef\endcoords{\mfsrc{\@nl ecoords\@nl}}% \newdef\applyT##1{\mfsrc{\@nl hide(apply_t (##1))}}% \def\rotate##1{\applyT{rotated ##1}}% \newdef\rotatearound##1##2{% \applyT{rotatedaround (##1, ##2)}}% - \newdef\turn{\simple@opt\@turn{(0,0)}}% - \newdef\@turn##1##2{\rotatearound{##1}{##2}}% - \newdef\reflectabout##1##2{% - \applyT{reflectedabout (##1, ##2)}}% line ##1--##2. - \let\mirror=\reflectabout + \newdef\turn{\mfp@defaultopt\mfp@turn{(0,0)}}% + \newdef\reflectabout##1##2{\applyT{reflectedabout (##1, ##2)}}% + \let\mirror\reflectabout \newdef\shift##1{\applyT{shifted ##1}}% pair. \def\scale##1{\applyT{scaled ##1}}% same scaling \newdef\xscale##1{\applyT{xscaled ##1}}% @@ -959,478 +1049,467 @@ \newdef\zslant##1{\applyT{zslant ##1}}% \newdef\boost##1{\applyT{boost ##1}}% \newdef\xyswap{\applyT{xyswap}}% - \newdef\xaxis{\simple@opt\@xaxis{\the\axisheadlen}}% - \newdef\yaxis{\simple@opt\@yaxis{\the\axisheadlen}}% - \newdef\axes{\simple@opt\@axes{\the\axisheadlen}}% - \newdef\@axes##1{\mfcmd{\@nl axes (##1)}}% - \newdef\@xaxis##1{\mfcmd{\@nl xaxis (##1)}}% - \newdef\@yaxis##1{\mfcmd{\@nl yaxis (##1)}}% - \newdef\axis{\null@opt\@axis}% - \newdef\@axis[##1]##2{\get@axisnum{##2}\axis - \mfp@ifempty{##1}% - {\edef\mfp@param{% - \ifnum\mfp@axisnum<2 \the\axisheadlen - \else \the\sideheadlen - \fi}\@@axis{\mfp@param}}{\@@axis{##1}}{##2}}% - \newdef\@@axis##1##2{\arrow[l##1]\@figmac{axisline.##2}}% - \newdef\doaxes{\null@opt\@doaxes}% - \newdef\@doaxes[##1]##2{\def\mfp@axis{\@axis[##1]}% - \do@axis##2\mfp@delim}% - \newdef\do@axis##1{% - \ifx\mfp@delim##1\relax\else\mfp@axis{##1}\@xp\do@axis\fi}% - \newdef\axismarks##1{\simple@opt{\@marks{##1}}{\the\hashlen}}% - \newdef\@marks##1##2{\mfsrc{\@nl ##1marks (##2)}\mfp@writedata}% + \newdef\xaxis{\mfp@defaultopt{\mfp@simple{xaxis}}{\the\axisheadlen}}% + \newdef\yaxis{\mfp@defaultopt{\mfp@simple{yaxis}}{\the\axisheadlen}}% + \newdef\axes{\mfp@defaultopt {\mfp@simple{axes}}{\the\axisheadlen}}% + \newdef\axis{\mfp@nullopt\mfp@axis}% + \newdef\axisline##1{\mfp@figmac{axisline.##1}}% + \newdef\doaxes{\mfp@nullopt\mfp@doaxes}% + \newdef\border{\mfp@figmac{borderrect}}% + \newdef\axismarks##1{\mfp@defaultopt{\mfp@marks{##1}}{\the\hashlen}}% \newdef\xmarks{\axismarks x}% \newdef\ymarks{\axismarks y}% \newdef\lmarks{\axismarks l}% \newdef\bmarks{\axismarks b}% \newdef\rmarks{\axismarks r}% \newdef\tmarks{\axismarks t}% - \def\grid{\null@opt\@grid}% - \newdef\@grid[##1]##2{% - \mfcmd{\mfp@ifempty{##1}{grid}{vgrid (##1)} (##2)}}% - \newlet\gridpoints=\grid \newlet\lattice=\grid - \newdef\gridlines##1{\mfcmd{\@nl gridlines (##1)}}% - \newdef\vgridlines##1{\mfcmd{\@nl vgridlines (##1)}}% - \newdef\hgridlines##1{\mfcmd{\@nl hgridlines (##1)}}% - \newdef\plrgrid##1{\mfcmd{\@nl polargrid (##1)}}% - \newdef\plrgridpoints{\simple@opt\@plrgp{\the\dotsize}}% - \newdef\@plrgp##1##2{\mfcmd{\@nl polargridpoints (##1, ##2)}}% - \newdef\gridarcs##1{\mfcmd{\@nl gridarcs (##1)}}% - \newdef\gridrays##1{\mfcmd{\@nl gridrays (##1)}}% - \newdef\plrpatch##1{\mfcmd{\@nl polarpatch (##1)}}% - \newdef\point{\simple@opt\@point{\the\pointsize}}% - \newdef\@point##1{% - \mfsrc{\@nl pointd (##1, \ifpointfill\mf@T\else\mf@F\fi)}% - \mfp@writedata}% - \newdef\plotsymbol{\simple@opt\@plotsymbol{\the\pointsize}}% - \newdef\@plotsymbol##1##2{% - \mfsrc{\@nl plotsymbol (##2, ##1)}\mfp@writedata}% - \newdef\plottext{\simple@opt\@plottext{cc}}% - \newdef\@plottext##1{% - \begingroup - \mfp@resetwhitespace \tlabeljustify{##1}% - \@ifmplabels{\@makeother\#}{}% - \mfp@gettoks\@@plottext}% - \newdef\@@plottext##1{% - \@ifmplabels - {\mfp@setMPpos \def\mfp@points{##1}\@@@tlabel}% - {\@@@plottext##1,\mfp@delim}}% - \newdef\@@@plottext{% - \mfp@ifnextchar\mfp@delim{\@firstoftwo\endgroup}{\x@plottext}}% - \newdef\x@plottext(##1,##2),{\begingroup - \@tlabel{##1}{##2}{\the\mfp@toks}\@@@plottext}% - \newdef\rect##1{\@figmac{rect (##1)}}% -\newdef\regpolygon##1##2##3##4{% - \@figmac{regularpolygon(##1)(##2)(##3;##4;)}}% - \def\circle{\null@opt\circl@}% - \newdef\circl@[##1]##2{% - \if t##1\relax \@figmac{circleppp (##2)}% - \else\if c##1\relax \@figmac{circlecp (##2)}% - \else\if s##1\relax \@figmac{circlepps (##2)}% - \else \@figmac{circle (##2)}% - \fi\fi\fi}% - \newdef\ellipse{\simple@opt\@ellipse{0}}% - \newdef\@ellipse##1##2{\@figmac{ellipse (##2, ##1)}}% - \newdef\sector##1{\@figmac{sector (##1)}}% - \newdef\makesector{\@closmac{makesector}}% - \newdef\arc{\null@opt\@arc}% - \newdef\@arc[##1]##2{% - \if t##1\relax \@figmac{arcppp (##2)}% - \else\if p##1\relax \@figmac{arcplr (##2)}% - \else\if a##1\relax \@figmac{arcalt (##2)}% - \else\if c##1\relax \@figmac{arccps (##2)}% - \else \@figmac{arcpps (##2)}% - \fi\fi\fi\fi}% - \newdef\plr##1{map (polar) (##1)}% - \newdef\midpoint##1{(0.5[##1])}% - \newdef\polyline{\@polyline\mf@F}% - \newlet\lines=\polyline - \newdef\polygon{\@polyline\mf@T}% - \newdef\@polyline##1{\@listmac{polyline (##1)}}% - \newdef\curve {\null@opt{\@curve\mf@F}}% - \newdef\cyclic{\null@opt{\@curve\mf@T}}% - \newdef\@curve##1[##2]{% - \@listmac{\mfp@ifempty{##2}{curve}{tcurve (##2)} (##1)}}% - \newdef\fcncurve{\null@opt\@fcncurve}% - \newdef\@fcncurve[##1]{% - \@listmac{\mfp@ifempty{##1}{fcncurve}{functioncurve (##1)}}}% - \newdef\qspline{\@listmac{openqbs}}% - \newdef\closedqspline{\@listmac{closedqbs}}% - \newdef\cspline{\@listmac{opencbs}}% - \newdef\closedcspline{\@listmac{closedcbs}}% - \newdef\mfbezier{\null@opt{\@mfbezier\mf@F}}% - \newdef\closedmfbezier{\null@opt{\@mfbezier\mf@T}}% - \newdef\@mfbezier##1[##2]{% - \@listmac{\mfp@ifempty{##2}{bezier}{tbezier (##2)} (##1)}}% - \newdef\qbeziers{\@listmac{qbezier (\mf@F)}}% - \newdef\closedqbeziers{\@listmac{qbezier (\mf@T)}}% - \newdef\turtle{\@listmac{turtle}}% - \newdef\function{\def\mfp@name{function}\mfp@fcn}% - \newdef\parafcn{\def\mfp@name{parafcn}\mfp@fcn}% - \newdef\plrfcn{\def\mfp@name{plrfcn}\mfp@fcn}% - \newdef\mfp@fcn{\simple@opt\@mfp@fcn{s}}% - \newdef\@mfp@fcn##1{\@@mfp@fcn##1\mfp@delim}% - \newdef\@@mfp@fcn##1##2\mfp@delim##3##4{% - \@figmac{\mfp@ifempty{##2}{}{t}\mfp@name\space - (\if p##1\mf@F\else\mf@T\fi \mfp@ifempty{##2}{}{, ##2}) - (##3) (##4)}}% - \newdef\btwnfcn{\simple@opt\@btwnfcn{p}}% - \newdef\@btwnfcn##1{\@@btwnfcn##1\mfp@delim}% - \newdef\@@btwnfcn##1##2\mfp@delim##3##4##5{\btwn@params{##1}{##2}% - \@figmac{\t@pref btwnfcn (\s@vals) (##3) (##4) (##5)}}% - \newdef\btwn@params##1##2{% - \edef\s@vals{\if s##1\mf@T\else\mf@F\fi}% - \mfp@ifempty{##2}{\def\t@pref{}}% - {\def\t@pref{t}\edef\s@vals{\s@vals, ##2}}}% - \newdef\plrregion{\simple@opt\@plrregion{p}}% - \newdef\@plrregion##1{\@@plrregion##1\mfp@delim}% - \newdef\@@plrregion##1##2\mfp@delim##3##4{\btwn@params{##1}{##2}% - \@figmac{((0,0)--(\t@pref plrfcn (\s@vals) (##3) (##4))% - --cycle)}}% - \newdef\tile##1{\mfcmd{\@nl tile (##1)}}% - \newdef\endtile{\mfsrc{endtile;\@nl}}% + \def\grid{\mfp@defaultopt{\mfp@simplei{vargrid}}{\the\griddotsize}}% + \newlet\gridpoints\grid \newlet\lattice\grid + \newdef\gridlines{\mfp@simple{gridlines}}% + \newdef\vgridlines{\mfp@simple{vgridlines}}% + \newdef\hgridlines{\mfp@simple{hgridlines}}% + \newdef\plrgrid{\mfp@simple{polargrid}}% + \newdef\plrgridpoints{% + \mfp@defaultopt{\mfp@simplei{polargridpoints}}{\the\griddotsize}}% + \newdef\gridarcs{\mfp@simple{gridarcs}}% + \newdef\gridrays{\mfp@simple{gridrays}}% + \newdef\plrpatch{\mfp@simple{polarpatch}}% + \newdef\vectorfield{\mfp@defaultopt{\mfp@vectorfield{}}{\the\headlen}} + \newdef\plrvectorfield{% + \mfp@defaultopt{\mfp@vectorfield{plr}}{\the\headlen}} + \newdef\point{\mfp@defaultopt\mfp@point{\the\pointsize}}% + \newdef\plotsymbol{\mfp@defaultopt\mfp@plotsymbol{\the\pointsize}}% + \newdef\plottext{\begingroup\mfp@resetwhitespace\mp@mksharpother + \mfp@defaultopt\mfp@plottext{cc}}% + \newdef\tile{\mfp@simple{tile}}% + \newdef\endtile{\mfcmd{\@nl endtile}}% \newdef\patharr##1{\begingroup \mfsrc{hide(numeric ##1; path ##1[]; ##1 = 0)}% - \def\store@path{\mfsrc{\@nl store (##1[incr ##1])}}% + \def\mfp@storepath{\mfsrc{\@nl store (##1[incr ##1])}}% \setrender{}}% \newdef\endpatharr{\endgroup}% - \newdef\connect{\@figmac{begingroup; save nexus}% - \patharr{nexus}}% + \newdef\connect{\mfp@figmac{begingroup; save mfpicnexus}% + \patharr{mfpicnexus}}% \newdef\endconnect{\endpatharr - \mfcmd{\@nl mkpoly (\mf@F, nexus)\@nl endgroup}% - \if@mfp@latex \def\mfptmp@a{connect}% - \ifx\mfptmp@a\@currenvir - \aftergroup\@startfigtrue %\aftergroup\@imrendtrue - \fi - \fi}% - \newdef\piechart{\simple@opt\@piechart{c}}% - \newdef\@piechart##1{\@@piechart##1\mfp@delim}% - \newdef\@@piechart##1##2\mfp@delim##3{% - \mfsrc{\@nl piechart(\if a##1 \else-\fi1, % - \mfp@mtsub{##2}{90}, ##3)}\mfp@writedata}% - \newdef\piewedge{\simple@opt\@piewedge{d}}% - \newdef\@piewedge##1{\@@piewedge##1\mfp@delim}% - \newdef\@@piewedge##1##2\mfp@delim##3{% - \@figmac{(piewedge[##3]% - \if x##1 shifted (##2*piedirection[##3])% - \else\if s##1 shifted (##2)% - \else\if m##1 shifted (##2 - piecenter)% - \else - \fi\fi\fi)}}% - \newdef\barchart{\simple@opt\@barchart{0,1,1}}% - \newdef\@barchart##1##2{% - \mfsrc{\@nl barchart (##1, \if h##2\mf@F\else\mf@T\fi)}% - \mfp@writedata}% - \newlet\bargraph=\barchart - \newlet\histogram=\barchart + \mfcmd{\@nl mkpoly (\mfp@F, mfpicnexus)\@nl endgroup}% + \mfp@checklatexenv{connect}{\aftergroup\@mfpstarttrue}{}}% + \newlet\piechart\mfppiechart + \newdef\piewedge{\mfp@defaultopt\mfp@piewedge{d}}% + \newlet\barchart\mfpbarchart + \newlet\bargraph\barchart + \newlet\histogram\barchart \newlet\gantt\barchart - \newdef\chartbar##1{\@figmac{chartbar[##1]}}% - \newlet\graphbar=\chartbar - \newlet\histobar=\chartbar - \newlet\ganttbar=\chartbar - \newdef\pinumber{3.14159}% - \mfp@additions -}% -\newdef\mfpic{\simple@opt\@mfpicA{1}}% -\newdef\@mfpicA#1{\simple@opt{\@mfpic{#1}}{#1}}% + \newdef\chartbar##1{\mfp@figmac{chartbar[##1]}}% + \newlet\graphbar\chartbar + \newlet\histobar\chartbar + \newlet\ganttbar\chartbar +}% end \mfp@grafmacs +\newdef\mfppiechart{\mfp@defaultopt\mfp@piechart{c}}% +\newdef\mfpbarchart{\mfp@defaultopt\mfp@barchart{0,1,1}}% +\newlet\mfpbargraph\mfpbarchart +\newlet\mfphistogram\mfpbarchart +\newlet\mfpgantt\mfpbarchart +\newdef\mfp@arc{\mfp@switchtrue\mfp@defaultopt\mfp@arccircle{s}}% +\newdef\arc@or@circle{\ifmfp@switch arc\else circle\fi}% +\newdef\mfp@arccircle#1#2{% + \@ifundefined{mfp@arc@#1}% + {\Mfpic@warn{Invalid option; ignoring \mfp@b\arc@or@circle\space + command.}% + \mfp@figmac{fallbackpath(\ifmfp@switch\mfp@F\else\mfp@T\fi) (#2)}}% + {\mfp@figmac{\arc@or@circle\@nameuse{mfp@arc@#1} (#2)}}}% +\newdef\mfp@ellipse#1#2{\mfp@figmac{ellipse (#2, #1)}}% +\newdef\mfp@curve#1#2{\mfp@nullopt{\mfp@@curve{#1}{#2}}}% +\newdef\mfp@@curve#1#2#3{% + \mfp@listmac{\mfp@ifempty{#3}{#1}{t#1 (#3)} (#2)}}% +\newdef\mfp@fcncurve#1{% + \mfp@listmac{\mfp@ifempty{#1}{fcncurve}{functioncurve (#1)}}}% +\newdef\mfp@fcn#1#2{% + \mfp@defaultopt{\mfp@dotension{\mfp@@fcn{#1}}}{#2}}% +\newdef\mfp@@fcn#1#2#3{% + \mfp@figmac{\mfp@t#1 (\mfp@sval) (#2) (#3)}}% +\newdef\mfp@btwn#1{% + \mfp@defaultopt{\mfp@dotension{\mfp@@btwn{#1}}}p}% +\newdef\mfp@@btwn#1#2#3#4{% + \mfp@figmac{\mfp@t#1 (\mfp@sval) (#2) (#3) (#4)}}% +\newdef\mfp@dotension#1#2{\mfp@@dotension#2\mfp@end#1}% +\newdef\mfp@@dotension#1#2\mfp@end{\def\mfp@t{}% + \if p#1\relax \let\mfp@sval\mfp@F + \else \let\mfp@sval\mfp@T + \mfp@ifexist{#2}{\def\mfp@t{t}\edef\mfp@sval{\mfp@sval, #2}}% + \fi}% +\newdef\mfp@plotdata#1{\mfp@processfile{\mfp@doplots{#1}}}% +\newdef\mfp@doplots#1{\mfp@setstyle + \advance\mfp@linetype1 \mfp@figmacbase + \mfp@@datafile{#1}\mfp@ifenddata{}{\mfp@doplots{#1}}}% +\newdef\mfp@ifenddata{% + \ifeof\mfp@data \@xp\@firstoftwo + \else \mfp@skipcomments + \ifx\mfp@temp\mfp@par \@XP\@firstoftwo + \else \@XP\@secondoftwo + \fi + \fi}% +\newdef\mfp@datafile#1{% + \mfp@figmacbase\mfp@processfile{\mfp@@datafile{#1}}}% +\newdef\mfp@@datafile#1{% + \mfp@ifempty{#1}% + {\mfp@dodatafile\mfp@smoothness\mfp@tension}% + {\mfp@dodatafile#1}\mfp@end}% +\newdef\mfp@dodatafile#1#2\mfp@end{% + \mfsrc{% + \if s#1 \mfp@ifempty{#2}{curve }{tcurve (#2) }% + \else polyline + \fi (\mfp@F)}\mfp@rwdata}% +\newdef\mfp@image#1#2{\mfsrc{\@nl makeimage (#2, #1)}}% +\newdef\mfp@getdimens#1,#2,#3\mfp@end{% + \mfp@scratch \@ifmtarg{#1}{\z@}{#1}\relax + \edef\mfp@thedimens{\the\mfp@scratch}% + \@ifmtarg{#3}{}{\mfp@scratch \@ifmtarg{#2}{\z@}{#2}\relax}% + \edef\mfp@thedimens{\mfp@thedimens,\the\mfp@scratch}}% +\newdef\mfp@doubledraw#1{% + \mfp@nullopt{\mfp@clroptrendi{doubledraw}{#1}}}% +\newdef\mfp@wiggle#1#2{\mfp@rendi{#1 (#2)}}% +\newdef\mfp@rendi#1#2{\mfp@rendmac{#1 (#2)}}% +\newdef\mfp@rendii#1#2#3{\mfp@rendmac{#1 (#3, #2)}}% +\newdef\mfp@optrendi#1{\mfp@defaultopt{\mfp@rendi{#1}}}% +\newdef\mfp@optrendii#1{\mfp@defaultopt{\mfp@rendii{#1}}}% +\newdef\mfp@modi#1#2{\mfp@modmac{#1 (#2)}}% +\newdef\mfp@listi#1#2{\mfp@listmac{#1 (#2)}}% +\newdef\mfp@clropt#1#2{\mfp@ifempty{#1}{#2}{\mfp@C#2 (#1)}}% +\newdef\mfp@clroptrend#1#2{\mfp@rendmac{\mfp@clropt{#2}{#1}}}% +\newdef\mfp@clroptrendi#1#2#3{\mfp@rendmac{\mfp@clropt{#3}{#1} (#2)}}% +\newdef\mfp@simple#1#2{\mfcmd{\@nl #1 (#2)}}% +\newdef\mfp@simplei#1#2#3{\mfcmd{\@nl #1 (#2, #3)}}% +\newdef\mfp@close#1#2{\mfp@modmac{#1closed\mfp@ifexist{#2}{t (#2)}}}% +\newdef\mfp@thatch#1{\mfp@nullopt{\mfp@clroptrendi{thatch}{#1}}}% +\newdef\mfp@lhatch#1{\mfp@thatch{#1,-45}}% +\newdef\mfp@rhatch#1{\mfp@thatch{#1,45}}% +\newdef\mfp@xhatch#1{\mfp@nullopt{\mfp@clroptrendi{xhatch}{#1}}}% +\newdef\mfp@arrowhead#1#2{\mfp@arr 0{Gheadpath (#1) (#2)}}% +\newdef\mfp@arrow#1{\mfp@arr 0{headpath#1}}% +\newdef\mfp@arr#1#2{\mfp@arr@c{}\mfp@arr@l{\the\headlen}% + \mfp@arr@b{#1}\edef\mfp@hcommand{#2}\mfp@arr@r{0}\mfp@@arr}% +\newdef\mfp@@arr{\@ifnextchar[{\mfp@arropt}{\mfp@doarrow}}% +\newdef\mfp@arropt[#1]{% + \mfp@ifexist{#1}{\mfp@@arropt#1\mfp@end}\mfp@@arr}% +\newdef\mfp@@arropt#1#2\mfp@end{% + \mfp@ifempty{#2}% + {\Mfpic@warn{Arrow option #1 has no value\on@line; + it will be ignored.}}% + {\@ifundefined{mfp@arr@#1}% + {\Mfpic@warn{Arrow option #1 invalid \on@line; + it will be ignored}}% + {\@nameuse{mfp@arr@#1}{#2}}% + }}% +\newdef\mfp@doarrow{% + \mfp@addmac{\mfp@clropt{\mfp@hcolour}{\mfp@hcommand} (\mfp@hlength, + \mfp@hrotate, \mfp@hlocate)}}% +\newdef\mfp@turn#1#2{\rotatearound{#1}{#2}}% +\newdef\mfp@axis#1#2{\mfp@getaxis#2{(none)}\mfp@end\axis + \mfp@addmac{headpath (\mfp@emptysub{#1}{\mfp@defheadlen}, 0, 0)}% + \axisline{\mfp@axisletter}}% +\newdef\mfp@doaxes#1#2{\def\mfp@@axis##1{\mfp@axis{#1}{##1}\mfp@@doaxis}% + \mfp@@doaxis#2\mfp@end}% +\newdef\mfp@@doaxis{\mfp@ifend{}\mfp@@axis}% +\newdef\mfp@marks#1#2{\mfsrc{\@nl #1marks (#2)}\mfp@writedata}% +\newdef\mfp@vectorfield#1#2#3#4#5{% + \mfcmd{#1vectorfield (#2, #3) (#4) (#5)}}% +\newdef\mfp@point#1{% + \mfsrc{\@nl pointd (#1, \ifpointfill\mfp@T\else\mfp@F\fi)}% + \mfp@writedata}% +\newdef\mfp@plotsymbol#1#2{% + \mfsrc{\@nl plotsymbol (#2, #1)}\mfp@writedata}% +\newdef\mfp@plottext#1#2#3{\tlabeljustify{#1}% + \def\tl@points{#3}\mfp@toks{#2}\mfp@thelabel\endgroup}% +\newdef\mfp@piechart#1{\mfp@@piechart#1\mfp@end}% +\newdef\mfp@@piechart#1#2\mfp@end#3{% #3 = center,radius + \mfsrc{\@nl piechart(\if a#1 \else-\fi1, % + \mfp@emptysub{#2}{90}, #3)}\mfp@writedata}% +\newdef\mfp@piewedge#1{\mfp@@piewedge#1\mfp@end}% +\newdef\mfp@@piewedge#1#2\mfp@end#3{% #3=number + \mfp@figmac{(piewedge[#3]% + \mfp@ifexist{#2}% + {\if #1x shifted (#2*piedirection[#3])% + \else\if #1s shifted (#2)% + \else\if #1m shifted (#2 - piecenter)% + \fi\fi\fi})}}% +\newdef\mfp@barchart#1#2{% + \mfsrc{\@nl barchart (#1, \if h#2\mfp@F\else\mfp@T\fi)}% + \mfp@writedata}% +\newdef\everymfpic{\afterassignment\@everymfpic\mfp@toks}% +\newdef\everyendmfpic{\afterassignment\@everyendmfpic\mfp@toks}% +\newdef\@everymfpic{\edef\every@mfpic{\the\mfp@toks}}% +\newdef\@everyendmfpic{\edef\every@endmfpic{\the\mfp@toks}}% +\everymfpic{}\everyendmfpic{}% +\newdef\mfpic{\mfp@defaultopt\@mfpicA{1}}% +\newdef\@mfpicA#1{\mfp@defaultopt{\@mfpic{#1}}{#1}}% \newdef\@mfpic#1#2#3#4#5#6{% \save@mfpicdimens + \@mfpicunit\mfpicunit \begingroup % ended near end of \endmfpic - \@ifmfpfileisopen{}% - {\if@mfp@nowrite\else \nooutputfileerror{\mfpic}% - \def\@mfsrc##1##2{}% + \edef\xmin{#3}\edef\xmax{#4}\edef\ymin{#5}\edef\ymax{#6}% + \@nameuse{@safe@activestrue}% + \mfp@ifopengraphsfile{}% + {\ifmfp@nowrite\else \mfp@nooutput@error\mfpic + \def\mfp@src##1##2{\endgroup}% \fi}% - \mfp@DBlog{Starting mfpic \number\mfp@count \@online.}% - \font\@tcurr=\fontname\font\relax + \mfp@DBlog{Starting mfpic \number\mfp@count \on@line.}% + \@xp\let\@xp\@tcurr\the\font \let\ifin@mfpicenv\iftrue \let\par\@empty \nullfont - \@mfpic@graf@macs - \newdef\@xconv##1{% - {\mfp@scratch = ##1\relax - \advance\mfp@scratch by -#3\mfpicunit - \mfp@scratch = #1\mfp@scratch - \global ##1 = \mfp@scratch}}% - \newdef\@yconv##1{% - {\mfp@scratch=##1\relax - \advance\mfp@scratch by -#5\mfpicunit - \mfp@scratch = #2\mfp@scratch - \global ##1 = \mfp@scratch}}% -\setbox\@alltlabels\vbox{\hbox{}}% -\@tlabelsbot \maxdimen -\@tlabelstop -\maxdimen -\@tlabelsleft \maxdimen -\@tlabelsright-\maxdimen - \@graphright=#4\mfpicunit \@xconv\@graphright - \@graphtop=#6\mfpicunit \@yconv\@graphtop - \@graphleft=0pt - \@graphbot=0pt - \@graphwd=\@graphright - \mfsrc{\@nl \mf@p\mf@d\mf@d\mf@d\@nl - unitlen := \the\mfpicunit\mf@s;\@nl + \mfp@grafmacs + \mfp@additions + \mfp@setconv{#1}{#2}{#3}{#5}% + \mfp@inittlabels + \@xconv{#4}\@graphright + \@yconv{#6}\@graphtop + \@graphleft 0pt + \@graphbot 0pt + \mfsrc{\@nl \mfp@p\mfp@d\mfp@d<\number\mfp@count>\@nl + unitlen := \the\@mfpicunit\mfp@s;\@nl xscale := #1; yscale := #2;\@nl bounds (#3, #4, #5, #6);\@nl \@nl - beginmfpic(\number\mfp@count); \mf@p\space\@mfplineno. + beginmfpic(\number\mfp@count); \mfp@p\space\mfp@lineno. \mfp@ifmpost - {\@nl verbatimtex \@nl - \begingroup\space\font\noexpand\MFPcfont=\fontname\@tcurr\@nl + {\@nl verbatimtex + \bgroup\font\noexpand\MFPcfont=\fontname\@tcurr\relax etex;}{}}% - \newdef\tlabel{% - \begingroup % ended in \@(@@)tlabel - \mfp@resetwhitespace - \@ifmplabels{}{\def\tlabel@rot{}}% - \null@opt\@tlabel@}% - \newdef\@tlabel@[##1]{\tlabeljustify{##1}% - \mfp@ifnextchar({\@@tlabel@}{\@@tlabel@@}}% - \newdef\@@tlabel@(##1,##2){% - \@ifmplabels - {\@@tlabel{(##1,##2)}}{\@tlabel{##1}{##2}}}% - \newdef\@@tlabel@@##1{% - \@ifmplabels {\@@tlabel{##1}}{\@@tlabel@##1}}% - \newdef\mfp@btex##1{btex \noexpand\MFPtext{##1} etex}% - \newdef\extraendtlabel{}% - \newdef\mfp@setMPpos{% - \edef\mfp@MPpos{% - \ifcase\tl@hpos .5\or 1\else 0\fi, % horizontal - \ifcase\tl@vpos 0\or .5\or 1\else 0\fi, % vertical - \ifnum \tl@vpos < 0 \mf@T\else\mf@F\fi, % true=Baseline - \mfp@mtsub{\tlabel@rot}{0}}}% - \newdef\@@tlabel##1{\def\mfp@points{##1}\mfp@restorepar - \mfp@setMPpos \@makeother\#\mfp@gettoks\@@@tlabel}% - \newdef\@@@tlabel{% - \mfcmd{\@nl - newgblabel(\mfp@MPpos)(\mfp@btex{\the\mfp@toks})(\mfp@points)}% - \endgroup \extraendtlabel}% - \newdef\set@textbox##1{% - \setbox\@textbox=\vbox{\def\\{\cr}\mfp@restorepar - \@tcurr\the\every@tlabel\halign{####\hfil\cr##1\crcr}}}% - \newdef\@tlabel##1##2##3{% - \set@textbox{##3}% - \mfp@scratch\tb@ht \advance\mfp@scratch\tb@dp - \tb@totalht\mfp@scratch - \mfp@scratch=##1\mfpicunit - \@xconv\mfp@scratch - \begingroup - \ifcase\tl@hpos \advance\mfp@scratch 0.5\tb@wd % center - \or \advance\mfp@scratch -\tlabel@sep % right - \else \advance\mfp@scratch \tb@wd % left - \advance\mfp@scratch \tlabel@sep - \fi - \advance\mfp@scratch \tlabel@hadj - \ifdim \mfp@scratch>\@tlabelsright - \@tlabelsright=\mfp@scratch - \fi - \endgroup - \begingroup - \ifcase\tl@hpos \advance\mfp@scratch -0.5\tb@wd % center - \or \advance\mfp@scratch -\tb@wd % right - \advance\mfp@scratch -\tlabel@sep - \else \advance\mfp@scratch \tlabel@sep % left - \fi - \advance\mfp@scratch \tlabel@hadj - \tb@moveright=\mfp@scratch - \ifdim \mfp@scratch<\@tlabelsleft - \@tlabelsleft=\mfp@scratch - \fi - \endgroup - \mfp@scratch=##2\mfpicunit - \@yconv\mfp@scratch - \begingroup - \ifcase\tl@vpos \advance\mfp@scratch \tb@totalht % bottom - \advance\mfp@scratch \tlabel@sep - \or \advance\mfp@scratch 0.5\tb@totalht % center - \or \advance\mfp@scratch -\tlabel@sep % top - \else \advance\mfp@scratch \tb@ht % baseline - \fi - \advance\mfp@scratch \tlabel@vadj - \tb@raise=\mfp@scratch - \ifdim \mfp@scratch>\@tlabelstop - \@tlabelstop=\mfp@scratch - \fi - \endgroup - \begingroup - \ifcase\tl@vpos \advance\mfp@scratch \tlabel@sep % bottom - \or \advance\mfp@scratch -0.5\tb@totalht % center - \or \advance\mfp@scratch -\tb@totalht % top - \advance\mfp@scratch -\tlabel@sep - \else \advance\mfp@scratch -\tb@dp % baseline - \fi - \advance\mfp@scratch \tlabel@vadj - \ifdim \mfp@scratch<\@tlabelsbot - \@tlabelsbot=\mfp@scratch - \fi - \endgroup - \global \setbox\@alltlabels=% - \vtop{\unvbox\@alltlabels - \vbox to 0pt{\kern-\tb@raise - \hbox{\kern\tb@moveright\box\@textbox}\vss}}% - \endgroup % group begun in \tlabel - \extraendtlabel}% End \@tlabel - \newdef\tlabelrect{\tlpath{rect}{0}}% - \newdef\tlabeloval{\tlpath{oval}{1}}% - \newdef\tlabelellipse{\tlpath{ellipse}{1}}% + \newdef\tlabel{\mfp@nullopt\mfp@label}% + \newdef\startbacktext{\let\mfp@restoreOL\@empty + \mfp@ifmpost + {\ifmfp@overlabels + \let\mfp@restoreOL\overlaylabels\nooverlaylabels + \fi \setmfboolean{underlaylabels}{\mfp@T}}{}% + \setbox\@wholegraph \box\@alltlabels + \setbox\@alltlabels \vbox{\hbox{}}}% + \newdef\stopbacktext{% + \setbox\@backtext \box\@alltlabels + \setbox\@alltlabels\box\@wholegraph + \mfp@ifmpost{\setmfboolean{underlaylabels}{\mfp@F}}{}% + \mfp@restoreOL}% + \newdef\tlabelrect{\mfp@labelpath{rect}{0}}% + \newdef\tlabeloval{\mfp@labelpath{oval}{1}}% + \newdef\tlabelellipse{\mfp@labelpath{ellipse}{1}}% \newdef\tlabelcircle{% - \mfp@ifnextchar*{\@firstoftwo{\tlabelellipse*[1]}}% - {\tlabelellipse[1]}}% - \newdef\tlpath##1##2{\@figmacstart - \begingroup % ended in \tlabelpath@ - \def\mfp@name{##1}\def\mfp@param{##2}% - \mfp@ifnextchar*% - {\@mfpswitchtrue\@firstoftwo{\@tlpath}}% gobbles the star - {\@mfpswitchfalse\@tlpath}}% - \newdef\@tlpath{\null@opt\@@tlpath}% - \newdef\@@tlpath[##1]{% - \edef\mfp@param{\mfp@mtsub{##1}{\mfp@param}}% - \mfp@resetwhitespace - \simple@opt\@@@tlpath{\tlpath@v\tlpath@h\tlpath@r}}% - \newdef\@@@tlpath##1{\tlabeljustify{##1}% - \mfp@setMPpos \mfp@ifnextchar({\@tlabelpath}{\@@tlabelpath}}% - \newdef\@tlabelpath (##1,##2){% - \def\mfp@points{(\@firstofone{##1},\@firstofone{##2})}% - \@@@tlabelpath}% - \newdef\@@tlabelpath##1{\def\mfp@points{##1}\@@@tlabelpath}% - \newdef\@@@tlabelpath{\mfp@restorepar - \@ifmplabels{\@makeother\#}{}\mfp@gettoks\tlabelpath@}% - \newdef\tlabelpath@{% - \@ifmplabels - {\mfcmd{text\mfp@name x (\mfp@MPpos)\@nl(origin, % dummy parameter - \mfp@btex{\the\mfp@toks}, \mfp@param, \mfp@points)}}% - {\measure@textbox{\the\mfp@toks}% - \mfcmd{text\mfp@name x (\mfp@MPpos)\@nl(\tb@ll, \tb@ur, % text bbox - \mfp@param, \mfp@points)}}% - \if@mfpswitch \endgroup % *-form, no label placed - \else % tlabel commands contain \endgroup - \@ifmplabels{\@@@tlabel}% - {\@xp\@@tlabel@\mfp@points{\the\mfp@toks}}% - \fi}% - \newdef\measure@textbox##1{% - \set@textbox{##1}% - \edef\tb@ll{(0, -(\the\tb@dp))}% - \edef\tb@ur{(\the\tb@wd, \the\tb@ht)}}% - \newdef\tlabels{% - \begingroup % ended in \do@tlabels - \mfp@resetwhitespace \@tlabels}% - \newdef\@tlabels##1{\def\extraendtlabel{\do@tlabels}% - \do@tlabels##1\mfp@delim}% - \newdef\do@tlabels{% - \mfp@ifnextchar\mfp@delim{\@firstoftwo\endgroup}{\tlabel}}% - \newdef\axislabels##1{% - \begingroup % ended in \do@axislabel - \mfp@resetwhitespace \tlabeljustify{cc}% - \let\mfp@xcoord=\@firstofone \let\mfp@ycoord=\@firstofone - \get@axisnum{##1}\axislabels - \ifcase\mfp@axisnum \tl@vpos=2 % x-axis -->[tc] - \def\mfp@ycoord{0}% - \or \tl@hpos=1 % y-axis-->[cr] - \def\mfp@xcoord{0} - \or \tl@hpos=1 % left -->[cr] - \edef\mfp@xcoord{\mfp@lshift}\mfpaddto\mfp@xcoord{#3}% - \or \tl@vpos=2 % bottom-->[tc] - \edef\mfp@ycoord{\mfp@bshift}\mfpaddto\mfp@ycoord{#5}% - \or \tl@hpos=-1 % right -->[cl] - \edef\mfp@xcoord{-\mfp@rshift}\mfpaddto\mfp@xcoord{#4}% - \or \tl@vpos=0 % top -->[bc] - \edef\mfp@ycoord{-\mfp@tshift}\mfpaddto\mfp@ycoord{#6}% + \mfp@iftoken*{\tlabelellipse*[1]}{\tlabelellipse[1]}}% + \newdef\tlabels{\begingroup + \mfp@resetwhitespace\mp@mksharpother \mfp@labels}% + \newdef\axislabels{\mfp@axislabels{#3}{#4}{#5}{#6}}% + \let\mfp@docaption\@empty + \newdef\tcaption{\mfp@defaultopt\mfp@caption{1.2,1.0}}% + \every@mfpic}% End of \@mfpic +\newdef\mfp@setconv#1#2#3#4{% #1,#2=xscale,yscale. #3,#4=xmin,ymin. + \def\@xconv##1##2{% ##1 = coord. ##2 = dimension register or fdim + {\mfp@scratch=##1\@mfpicunit \advance\mfp@scratch by -#3\@mfpicunit + \mfp@scratch=#1\mfp@scratch + \global ##2=\mfp@scratch}}% + \def\@yconv##1##2{% ditto + {\mfp@scratch=##1\@mfpicunit \advance\mfp@scratch by -#4\@mfpicunit + \mfp@scratch=#2\mfp@scratch + \global ##2=\mfp@scratch}}}% +\newdef\mfp@inittlabels{% + \setbox\@alltlabels\vbox{\hbox{}}% + \setbox\@backtext\vbox{\hbox{}}% + \@tlabelsbot \maxdimen + \@tlabelstop -\maxdimen + \@tlabelsleft \maxdimen}% +\newdef\mfp@label#1{\begingroup\mfp@resetwhitespace\mp@mksharpother + \tlabeljustify{#1}\@ifnextchar({\mfp@label@}{\mfp@label@@}}% +\newdef\mfp@label@(#1,#2){\mfp@label@@{(#1,#2)}}% +\newdef\mfp@label@@#1#2{\def\tl@points{#1}\mfp@toks{#2}\mfp@thelabel + \endgroup\extra@endtlabel}% +\newdef\mfp@thelabel{\@ifmplabels\mp@tlabel\tex@tlabel}% +\newdef\mfp@btex#1{btex \noexpand\MFPtext{#1} etex}% +\newdef\mfp@setMPpos{% + \edef\mfp@MPpos{% + \ifcase\tl@hpos .5\or 1\else 0\fi, % horizontal + \ifcase\tl@vpos0\or .5\or 1\else 0\fi, % vertical + \ifnum \tl@vpos<0 \mfp@T\else\mfp@F\fi, % true=Baseline + \mfp@emptysub{\tl@rot}{0}}}% +\newdef\mp@tlabel{\mfp@setMPpos + \mfcmd{\@nl newgblabel(\mfp@MPpos)(\mfp@btex{\the\mfp@toks})\@nl + (\tl@points)}}% +\newdef\set@textbox#1{% + \setbox\@textbox\vbox{\def\\{\cr}\mfp@restorepar + \@tcurr\@nameuse{@safe@activesfalse}\every@tlabel + \halign{##\hfil\cr#1\crcr}}}% +\newdef\tex@tlabel{\@xp\@textlabel\tl@points\mfp@end}% +\newdef\@textlabel{\mfp@ifendorcomma{}\@textlabel\@@textlabel}% +\newdef\@@textlabel(#1,#2){\tex@@tlabel{#1}{#2}\@textlabel}% +\newdef\tex@@tlabel#1#2{% + \set@textbox{\the\mfp@toks}% + \mfp@scratch\tb@ht \advance\mfp@scratch\tb@dp + \tb@totalht\mfp@scratch + \@xconv{#1}\mfp@scratch + \begingroup + \ifcase\tl@hpos \advance\mfp@scratch -0.5\tb@wd % center + \or \advance\mfp@scratch -\tb@wd % right + \advance\mfp@scratch -\tlabel@sep + \else \advance\mfp@scratch \tlabel@sep % left (default) + \fi + \advance\mfp@scratch \tlabel@hadj + \ifdim \mfp@scratch<\@tlabelsleft + \@tlabelsleft\mfp@scratch + \fi + \tb@moveright\mfp@scratch + \endgroup + \@yconv{#2}\mfp@scratch + \begingroup + \ifcase\tl@vpos \advance\mfp@scratch \tb@totalht % bottom + \advance\mfp@scratch \tlabel@sep + \or \advance\mfp@scratch 0.5\tb@totalht % center + \or \advance\mfp@scratch -\tlabel@sep % top + \else \advance\mfp@scratch \tb@ht % baseline (default) + \fi + \advance\mfp@scratch \tlabel@vadj + \ifdim \mfp@scratch>\@tlabelstop + \@tlabelstop\mfp@scratch + \fi + \tb@raise\mfp@scratch + \endgroup + \begingroup + \ifcase\tl@vpos \advance\mfp@scratch \tlabel@sep % bottom + \or \advance\mfp@scratch -0.5\tb@totalht % center + \or \advance\mfp@scratch -\tb@totalht % top + \advance\mfp@scratch -\tlabel@sep + \else \advance\mfp@scratch -\tb@dp % baseline (default) + \fi + \advance\mfp@scratch \tlabel@vadj + \ifdim \mfp@scratch<\@tlabelsbot + \@tlabelsbot\mfp@scratch + \fi + \endgroup + \global \setbox\@alltlabels + \vtop{\unvbox\@alltlabels + \vbox to 0pt{\kern-\tb@raise + \hbox{\kern\tb@moveright\box\@textbox}\vss}}% +}% End \tex@@tlabel +\newdef\mfp@labels#1{\let\extra@endtlabel\mfp@dolabel + \mfp@dolabel#1\mfp@end}% +\newdef\mfp@dolabel{\mfp@ifend\endgroup\tlabel}% +\newdef\mfp@labelpath#1#2{\mfp@figmacbase + \begingroup % ended in \tlabelpath@ + \def\mfp@name{#1}\def\mfp@param{#2}% + \mfp@ifstar\mfp@tlpath\mfp@switchtrue\mfp@switchfalse}% +\newdef\mfp@tlpath#1{#1\mfp@defaultopt\mfp@@tlpath\mfp@param}% +\newdef\mfp@@tlpath#1{\edef\mfp@param{#1}% + \mfp@defaultopt\mfp@tlpath@{\tlpath@v\tlpath@h\tlpath@r}}% +\newdef\mfp@tlpath@#1{\mfp@resetwhitespace\mp@mksharpother + \tlabeljustify{#1}\@ifnextchar({\@tlabelpath}{\@@tlabelpath}}% +\newdef\@tlabelpath(#1,#2){\@@tlabelpath{(#1,#2)}}% +\newdef\@@tlabelpath#1#2{% + \def\tl@points{#1}\mfp@toks{#2}\tlabelpath@}% +\newdef\tlabelpath@{\@ifmplabels{}{\measure@textbox{\the\mfp@toks}}% + \mfp@setMPpos + \mfcmd{text\mfp@name x (\mfp@MPpos)\@nl + (\@ifmplabels{origin, \mfp@btex{\the\mfp@toks}}{\tb@ll, \tb@ur}, + \mfp@param) (\tl@points)}% + \ifmfp@switch\else \mfp@thelabel\fi \endgroup}% +\newdef\measure@textbox#1{\set@textbox{#1}% + \mfp@scratch-\tb@dp + \edef\tb@ll{(0, \the\mfp@scratch)}% + \edef\tb@ur{(\the\tb@wd, \the\tb@ht)}}% +\newdef\mfp@axislabels#1#2#3#4#5{% + \begingroup % ended in \mfp@(@)doaxislabel + \mfp@resetwhitespace + \tl@vpos1 \tl@hpos0 + \let\mfp@xcoord\@firstofone \let\mfp@ycoord\@firstofone + \mfp@getaxis#5\relax\mfp@end\axislabels + \ifcase\mfp@axisnum\relax + \tl@vpos2 \def\mfp@ycoord{0}\or + \tl@hpos1 \def\mfp@xcoord{0}\or + \tl@hpos1\edef\mfp@xcoord{\mfp@lshift}% + \mfpaddto\mfp@xcoord{#1}\or + \tl@vpos2\edef\mfp@ycoord{\mfp@bshift}% + \mfpaddto\mfp@ycoord{#3}\or + \tl@hpos-1 \edef\mfp@xcoord{-\mfp@rshift}% + \mfpaddto\mfp@xcoord{#2}\or + \tl@vpos0 \edef\mfp@ycoord{-\mfp@tshift}% + \mfpaddto\mfp@ycoord{#4}% \fi \ifx\@firstofone\mfp@xcoord - \edef\mfp@ycoord####1{\mfp@ycoord}% + \edef\mfp@ycoord##1{\mfp@ycoord}% \else - \edef\mfp@xcoord####1{\mfp@xcoord}% - \fi \null@opt\@axislabels}% - \newdef\@axislabels[##1]##2{% - \tlabeljustify{##1}% - \do@axislabel~ ##2,\mfp@delim}% - \newdef\do@axislabel~##1,{% - \@ifmtarg{##1}{\x@axislabel}{\do@@axislabel##1\@nil}}% - \newdef\do@@axislabel##1##2\@nil{% - \@ifmtarg{##2}% - {\Mfpic@warn{Possible extra comma, missing coordinate, or - missing\@msgbreak braces in \string\axislabels\@online. - Skipping this label.}}% - {\tlabel(\mfp@xcoord{##2},\mfp@ycoord{##2}){##1}}% - \x@axislabel}% - \newdef\x@axislabel{% check for end of list - \mfp@ifnextchar\mfp@delim{\@firstoftwo\endgroup}{\do@axislabel~ }}% - \newdef\@docaption{}% - \newdef\tcaption{\simple@opt\tcaption@{1.2, 1.0}}% - \newdef\tcaption@##1{\@tcaption##1\mfp@delim}% - \long\def\@tcaption##1,##2\mfp@delim##3{% - \def\@docaption{% - \setbox\@textbox=% - \hbox{\def\\{\hskip\@M\p@}\mfp@restorepar - \@tcurr##3}% - \@graphwd=\wd\@wholegraph - \ifdim\tb@wd>##1\@graphwd - \setbox\@textbox=% - \hbox{% - \vbox{% - \if@mfp@latex % keep LaTeX's `\\' - \else - \def\\{\unskip\hbox{}\hfil\penalty-\@M\ignorespaces}% - \fi - \if@mfp@centcapt - \leftskip=0pt plus 0.5fil - \rightskip=0pt plus -0.5fil - \parfillskip=0pt plus 1fil - \else - \leftskip=0pt - \rightskip=0pt - \fi - \hsize=##2\@graphwd \mfp@restorepar - \noindent\@tcurr ##3% - }% End vbox. - }% End hbox. - \fi - \mfp@scratch=\wd\@wholegraph - \ifdim \mfp@scratch<\tb@wd \mfp@scratch=\tb@wd \fi - \global\setbox\@wholegraph=% - \vbox{\hbox to \mfp@scratch{\hss\box\@wholegraph\hss}% - \nointerlineskip \vskip\mfpiccaptionskip - \hbox to \mfp@scratch{\hss\box\@textbox\hss}}% End vbox. - }% End \@docaption. - }% End \@tcaption. -}% End of \@mfpic + \edef\mfp@xcoord##1{\mfp@xcoord}% + \fi \mp@mksharpother\mfp@nullopt\mfp@@axislabels}% +\newdef\mfp@@axislabels#1#2{% + \tlabeljustify{#1}\mfp@doaxislabel#2,\mfp@end}% +\newdef\mfp@doaxislabel{% + \mfp@ifendorcomma\endgroup\mfp@doaxislabel\mfp@@doaxislabel}% +\newdef\mfp@@doaxislabel#1{\mfp@toks{#1}% + \mfp@ifendorcomma\endgroup\mfp@doaxislabel\mfp@mkaxislabel}% +\newdef\mfp@mkaxislabel#1,{% + \@ifmtarg{#1}{}% + {\edef\tl@points{(\mfp@xcoord{#1},\mfp@ycoord{#1})}\mfp@thelabel}% + \mfp@doaxislabel}% +\newdef\mfp@caption#1{\begingroup\mfp@resetwhitespace + \mfp@@caption#1\mfp@end}% +\long\def\mfp@@caption#1,#2\mfp@end#3{\endgroup + \def\mfp@docaption{% + \setbox\@textbox + \hbox{\def\\{\hskip\@M\p@\let\\\relax}\mfp@restorepar + \@nameuse{@safe@activesfalse}\@tcurr#3}% + \mfp@scratch\wd\@wholegraph + \ifdim\tb@wd>#1\mfp@scratch + \setbox\@textbox + \hbox{% + \vbox{% + \hsize#2\mfp@scratch \mfp@restorepar + \leftskip0pt + \rightskip0pt + \mfp@capsettings + \@nameuse{@safe@activesfalse}\noindent\@tcurr #3% + }% End vbox. + }% End hbox. + \fi + \ifdim \mfp@scratch<\tb@wd \mfp@scratch\tb@wd \fi + \global\setbox\@wholegraph + \vbox{\hbox to \mfp@scratch{\hss\box\@wholegraph\hss}% + \nointerlineskip \vskip\mfpiccaptionskip + \hbox to \mfp@scratch{\hss\box\@textbox\hss}}% End vbox. + }% End \mfp@docaption. +}% End \mfp@@caption. +\def\mfp@adjustdim#1#2#3#4{% + \mfp@scratch#1\relax \advance\mfp@scratch-#4 bp + \ifdim\mfp@scratch#2#3\relax #3\mfp@scratch \fi + #1\mfp@scratch}% \mfp@DBlog{Definition of closure of mfpic environment.}% -\newdef\endmfpic{% - \mfsrc{\mfp@ifmpost{\@nl verbatimtex \endgroup\space etex;}{}\@nl - endmfpic;\mf@p (\number\mfp@count) \space\@mfplineno.\@nl - \mf@p\mf@d\mf@d\mf@d\@nl}% +\newdef\endmfpic{\every@endmfpic + \mfsrc{\mfp@ifmpost{\@nl verbatimtex \egroup\space etex;}{}\@nl + endmfpic; \mfp@p\space(\number\mfp@count) \mfp@lineno.\@nl + \mfp@p\mfp@d\mfp@d\mfp@d\@nl}% \ifmfpicdebug\wlog{}\wlog{Mfpic: ENTERED endmfpic.}\wlog{}\fi - \if@shipping % - \global\setbox\@wholegraph=% + \ifmfp@noship \else + \global\setbox\@wholegraph \vbox{% \ifmfpicdraft \vbox to \@graphtop{\vss - \hbox to \@graphwd{\kern2pt\tt\#\number\mfp@count\hss}% - \kern2pt}% + \hbox to \@graphright{% + \kern2pt \mfpdraftfont\#\number\mfp@count\hss}% + \kern2pt}% \else - \mfp@ifmpost{\vbox}{\vbox to \@graphtop}% - {\vss - \edef\@graphfilename{\setfilename{\mfp@filename}% - {\number\mfp@count}}% - \mfp@ifmpost - {\openin\mfp@graph=\@graphfilename\relax - \ifeof\mfp@graph - \Mfpic@msg{No graph file: \@graphfilename\space.}% - \def\@setmfpicgraphic##1{\raise2pt\hbox{\kern2pt\tt ##1}}% - \closein\mfp@graph - \else\if@mfp@latexe - \@namedef{Gin@rule@.\number\mfp@count}##1{% - {\mfp@Gtype}{.\number\mfp@count}{##1}}% - \fi\fi}{}% - \mfp@ifmpost{\hbox}{\hbox to \@graphwd}% - {\@xp\@setmfpicgraphic\@xp{\@graphfilename}\hss}% End hbox. - \kern0pt + \mfp@ifmpost{\vbox}{\vbox to \@graphtop}% + {\vss + \edef\@graphfilename{% + \setfilename\mfp@filename{\number\mfp@count}}% + \mfp@ifmpost + {\IfFileExists{\@graphfilename}{}% + {\Mfpic@msg{No graph file: \@graphfilename\space.}% + \let\@setmfpicgraphic\nofile@setmfpgraphic}% + \hbox}% + {\hbox to \@graphright}% + {\@xp\@setmfpicgraphic\@xp{\@graphfilename}\hss}% + \kern0pt }% End vbox \fi - }%% End vbox (\setbox\@wholegraph) + }%% End \setbox\@wholegraph \vbox \mfp@ifmpost - {\@graphright=\wd\@wholegraph - \@graphtop=\ht\@wholegraph - \@graphwd=\@graphright}{}% + {\@graphright\wd\@wholegraph + \@graphtop\ht\@wholegraph}{}% \ifmfpicdebug + \wlog{Mfpic debug: Dimensions of wholegraph before labels + are added, and before truebbox adjustments:}% \wlog{Mfpic: graphleft = \the\@graphleft}% \wlog{Mfpic: graphright = \the\@graphright}% \wlog{Mfpic: graphtop = \the\@graphtop}% @@ -1441,54 +1520,49 @@ \wlog{}% \fi \ifmfpicdebug + \wlog{Mfpic debug: Dimensions of alltlabels, before + truebbox adjustments:}% + \mfp@scratch\mfpicllx bp\relax + \wlog{Mfpic: mfpicllx = \the\mfp@scratch}% + \mfp@scratch\mfpiclly bp\relax + \wlog{Mfpic: mfpiclly = \the\mfp@scratch}% \wlog{Mfpic: tlabelsleft = \the\@tlabelsleft}% - \wlog{Mfpic: tlabelsright = \the\@tlabelsright}% \wlog{Mfpic: tlabelstop = \the\@tlabelstop}% \wlog{Mfpic: tlabelsbot = \the\@tlabelsbot}% \wlog{}% \fi \ifdim\@tlabelsleft < \maxdimen \setbox\@alltlabels\vtop to 0pt{% - \kern \mfpiclly bp - \moveleft \mfpicllx bp \box\@alltlabels - \vss}% - \mfp@scratch\@tlabelsleft - \advance\mfp@scratch-\mfpicllx bp - \ifdim\mfp@scratch<\@graphleft - \@graphleft\mfp@scratch - \fi - \mfp@scratch\@tlabelsright - \advance\mfp@scratch-\mfpicllx bp - \ifdim\mfp@scratch>\@graphright - \@graphright\mfp@scratch + \kern \mfpiclly bp \moveleft \mfpicllx bp \box\@alltlabels\vss}% + \setbox\@backtext \vtop to 0pt{% + \kern \mfpiclly bp \moveleft \mfpicllx bp \box\@backtext \vss}% + \mfp@adjustdim\@tlabelsleft <\@graphleft \mfpicllx + \mfp@adjustdim\@tlabelstop >\@graphtop \mfpiclly + \mfp@adjustdim\@tlabelsbot <\@graphbot \mfpiclly + \ifmfpicdraft\else + \setbox\@wholegraph + \vtop{\offinterlineskip + \box\@backtext\kern-\ht\@wholegraph + \unvbox\@wholegraph\box\@alltlabels}% \fi - \mfp@scratch\@tlabelstop - \advance\mfp@scratch-\mfpiclly bp - \ifdim\mfp@scratch>\@graphtop - \@graphtop\mfp@scratch - \fi - \mfp@scratch\@tlabelsbot - \advance\mfp@scratch-\mfpiclly bp - \ifdim\mfp@scratch<\@graphbot - \@graphbot\mfp@scratch - \fi - \setbox\@wholegraph=\vtop{% - \unvbox\@wholegraph\box\@alltlabels}% \fi \ifmfpicdebug + \wlog{Mfpic debug: Dimensions of alltlabels after + truebbox adjustments:}% \wlog{Mfpic: tlabelsleft = \the\@tlabelsleft}% - \wlog{Mfpic: tlabelsright = \the\@tlabelsright}% \wlog{Mfpic: tlabelstop = \the\@tlabelstop}% \wlog{Mfpic: tlabelsbot = \the\@tlabelsbot}% \wlog{}% \fi - \mfp@scratch=\@graphtop + \mfp@scratch\@graphtop \advance\mfp@scratch by -\@graphbot - \global \setbox\@wholegraph=% + \global \setbox\@wholegraph \vbox to \mfp@scratch{\vss \hbox{\kern-\@graphleft\box\@wholegraph}% \kern-\@graphbot}% End vbox. \ifmfpicdebug + \wlog{Mfpic debug: Dimensions of wholegraph after + labels are added:}% \wlog{Mfpic: graphleft = \the\@graphleft}% \wlog{Mfpic: graphright = \the\@graphright}% \wlog{Mfpic: graphtop = \the\@graphtop}% @@ -1498,10 +1572,9 @@ \wlog{Mfpic: graphdp = \the\dp\@wholegraph}% \wlog{}% \fi - \@docaption - \global\mfpicheight\ht\@wholegraph - \global\mfpicwidth\wd\@wholegraph + \mfp@docaption \ifmfpicdebug + \wlog{Mfpic debug: Values after tcaption added:}% \wlog{Mfpic: graphleft = \the\@graphleft}% \wlog{Mfpic: graphright = \the\@graphright}% \wlog{Mfpic: graphtop = \the\@graphtop}% @@ -1511,46 +1584,53 @@ \wlog{Mfpic: graphdp = \the\dp\@wholegraph}% \wlog{}% \fi + \global\mfpicheight\ht\@wholegraph + \global\mfpicwidth\wd\@wholegraph \ifmfpicdraft - \setbox\@wholegraph=% - \hbox{\@mfpframed{-\mfpframethickness}{\box\@wholegraph}}% + \setbox\@wholegraph + \hbox{\@mfpframed{-\mfpframethickness}{\box\@wholegraph}}% \fi + \global\setbox\@wholegraph\box\@wholegraph + \global \advance\mfp@count1 + \fi % \ifmfp@noship + \endgroup % Begun near start of \@mfpic + \ifmfp@noship \else \mfp@ifdefined\s@vemfpic - {\global\setbox\s@vemfpic=\box\@wholegraph}% + {\global\setbox\s@vemfpic\box\@wholegraph}% {\leavevmode\box\@wholegraph}% \global\let\s@vemfpic\UndEfInEd - \global \advance\mfp@count1 - \fi % end of \if@shipping - \endgroup % Begun near start of \@mfpic - \restore@mfpicdimens - \if@mfp@latex - \def\mfptmp@a{mfpic}% - \ifx\mfptmp@a\@currenvir - \@ignoretrue% so \endmfpic and \end{mfpic} have the same effect. - \fi \fi + \restore@mfpicdimens + \mfp@checklatexenv{mfpic}{\@ignoretrue}{}% + \global\let\in@mfpicenv\iffalse \ignorespaces -}% -\newdef\newsavepic#1{% - \if@mfp@latex \newsavebox{#1}% - \else +}% endmfpic +\ifmfp@latex + \newdef\mfp@checklatexenv#1#2#3{% + \def\mfp@tempa{#1}\ifx\mfp@tempa\@currenvir #2\else #3\fi}% +\else + \newdef\mfp@checklatexenv#1#2#3{#3}% +\fi +\ifmfp@latex + \newlet\newsavepic\newsavebox +\else + \newdef\newsavepic#1{% \mfp@ifdefined{#1}% - {\mfp@errmsg - {Command \string #1 already defined.}% + {\mfp@errmsg{Command \string #1 already defined}% {You have used \newsavepic with an already defined or an^^J% improper control sequence. Replace #1 with another name.^^J% If you proceed, \newsavepic will be ignored.}}% - {\csname newbox\endcsname#1}% - \fi}% -\newlet\newpic=\newsavepic % compatibility + {\@nameuse{newbox}#1}}% +\fi +\newlet\newpic\newsavepic \newdef\savepic#1{\relax \mfp@ifdefined{#1}{\gdef\s@vemfpic{#1}}% - {\mfp@errmsg{Box \string#1 undefined.}% + {\mfp@errmsg{Box \string#1 undefined}% {You tried to save a picture in a box which had not been^^J% previously allocated. Use \newsavepic to allocate a box.}}}% \newdef\usepic#1{\leavevmode \copy#1\relax}% -\newdef\mfpframed{\simple@opt\@mfpframed\mfpframesep}% -\newdef\mfpframe{\simple@opt\@mfpframe\mfpframesep}% +\newdef\mfpframed{\mfp@defaultopt\@mfpframed\mfpframesep}% +\newdef\mfpframe{\mfp@defaultopt\@mfpframe\mfpframesep}% \newdef\@mfpframed#1#2{\@mfpframe{#1}#2\endmfpframe}% \newdef\@mfpframe#1{% \leavevmode\hbox\bgroup @@ -1570,34 +1650,28 @@ \egroup % end vtop \vrule width\mfpframethickness \egroup}% end hbox -\mfp@ifdefined\framed{}{\newlet\framed=\mfpframed}% -\newif\if@mfp@verbtex -\def\mfpverbtex{% - \begingroup \preservelines \@makeother\#% - \afterassignment\mfp@writetex\global\mfp@verbtex=}% +\mfp@ifdefined\framed{}{\let\framed\mfpframed}% +\def\mfpverbtex{\futurelet\mfp@next\@mfpverbtex}% +\def\@mfpverbtex{% + \begingroup + \@makeother\#\@makeother\%\mfp@keeplines + \afterassignment\mfp@writetex\global\mfp@verbtex}% +\newif\ifmfp@verbtex \def\mfp@writetex{% \endgroup - \@ifmfpfileisopen + \mfp@ifopengraphsfile {\mfp@ifmpost - {\mfsrc{verbatimtex}\mfsrc{\the\mfp@verbtex}\mfcmd{etex}}% - {\noMP@error{verbatimtex}}% - \global\@mfp@verbtexfalse\mfp@verbtex{}}% - {\global\@mfp@verbtextrue}}% -\global\mfp@count=1 % 1 because we now advance it in \endmfpic. -\newdef\MFPICinput#1{% - \immediate\openin\mfp@graph=#1 - \ifeof\mfp@graph - \immediate\closein\mfp@graph - \else - \immediate\closein\mfp@graph - \input #1 - \fi}% -\MFPICinput{mfppatch.tex}% + {\mfsrc{ verbatimtex\@nl \the\mfp@verbtex}\mfcmd{etex}}% + {\mfp@noMP@error\mfpverbtex}% + \global\mfp@verbtexfalse\mfp@verbtex{}}% + {\global\mfp@verbtextrue}}% +\mfpicnumber{1}% +\InputIfFileExists{mfppatch.tex}{}{}% +\mfp@ifdefined\mfpdraftfont{}{\newdef\mfpdraftfont{\tt}}% \mfp@DBlog{Punctuation, etc., will revert to old catcodes now.}% \let\+\mfpsaveplus -\restorenewlinechar -\MFPicpackagE% -\MFPICinput{mfpic.usr}% +\mfp@restoreALL% +\InputIfFileExists{mfpic.usr}{}{}% \endinput %% %% End of file `mfpic.tex'. diff --git a/Master/texmf-dist/tex/generic/mfpic/mfppatch.tex b/Master/texmf-dist/tex/generic/mfpic/mfppatch.tex new file mode 100644 index 00000000000..3d47072f8ef --- /dev/null +++ b/Master/texmf-dist/tex/generic/mfpic/mfppatch.tex @@ -0,0 +1,14 @@ +%%% File: mfppatch.tex +%%% A patch for mfpic 0.9 2006/05/26 +%%% +\def\mfp@versionpatched{0.9}% +\def\mfp@patchinfo{% + \Mfpic@warn{This patch is only for mfpic version \mfp@versionpatched!\@nl}}% +\let\mfp@dopatches\endinput +\ifx\mfpfileversion\mfp@versionpatched + \def\mfp@patchinfo{}% + \def\mfp@dopatches{}% +\fi +\mfp@patchinfo +\mfp@dopatches +\endinput diff --git a/Master/texmf-dist/tpm/mfpic.tpm b/Master/texmf-dist/tpm/mfpic.tpm index 518e509697c..1c2ebf03763 100644 --- a/Master/texmf-dist/tpm/mfpic.tpm +++ b/Master/texmf-dist/tpm/mfpic.tpm @@ -3,7 +3,7 @@ <rdf:Description about="http://texlive.dante.de/texlive/Package/mfpic.zip"> <TPM:Name>mfpic</TPM:Name> <TPM:Type>Package</TPM:Type> - <TPM:Date>2006/01/11 23:49:28</TPM:Date> + <TPM:Date>2006/05/31 23:12:00</TPM:Date> <TPM:Version>0.7a beta</TPM:Version> <TPM:Creator>rahtz</TPM:Creator> <TPM:Title> @@ -22,30 +22,33 @@ LaTeX and PDFLaTeX. <TPM:Author>Daniel H. Luecking and Geoffrey Tobin</TPM:Author> <TPM:Size>1716459</TPM:Size> <TPM:Build/> - <TPM:RunFiles size="196533"> -texmf-dist/fonts/source/public/mfpic/grafbase.mf + <TPM:RunFiles size="259709"> +texmf-dist/metafont/mfpic/grafbase.mf texmf-dist/metapost/mfpic/dvipsnam.mp texmf-dist/metapost/mfpic/grafbase.mp texmf-dist/tex/generic/mfpic/mfpic.sty texmf-dist/tex/generic/mfpic/mfpic.tex +texmf-dist/tex/generic/mfpic/mfppatch.tex texmf-dist/tpm/mfpic.tpm </TPM:RunFiles> - <TPM:DocFiles size="1075457"> + <TPM:DocFiles size="1596493"> texmf-dist/doc/generic/mfpic/README texmf-dist/doc/generic/mfpic/changes.txt +texmf-dist/doc/generic/mfpic/coil.mps texmf-dist/doc/generic/mfpic/data.dat texmf-dist/doc/generic/mfpic/forfun.tex texmf-dist/doc/generic/mfpic/install.txt texmf-dist/doc/generic/mfpic/lapictures.tex +texmf-dist/doc/generic/mfpic/mfpcard.pdf +texmf-dist/doc/generic/mfpic/mfpcard.tex texmf-dist/doc/generic/mfpic/mfpdoc.sty texmf-dist/doc/generic/mfpic/mfpguide.pdf texmf-dist/doc/generic/mfpic/mfpguide.tex texmf-dist/doc/generic/mfpic/mfpman.pdf texmf-dist/doc/generic/mfpic/mfpman.tex texmf-dist/doc/generic/mfpic/pictures.tex -texmf-dist/doc/generic/mfpic/refcard.tex </TPM:DocFiles> - <TPM:SourceFiles size="444469"> + <TPM:SourceFiles size="588944"> texmf-dist/source/generic/mfpic/grafbase.dtx texmf-dist/source/generic/mfpic/mfpic.dtx texmf-dist/source/generic/mfpic/mfpic.ins diff --git a/Master/texmf/lists/mfpic b/Master/texmf/lists/mfpic index 9f5686f727d..f12f3554040 100644 --- a/Master/texmf/lists/mfpic +++ b/Master/texmf/lists/mfpic @@ -1,24 +1,27 @@ texmf-dist/doc/generic/mfpic/README texmf-dist/doc/generic/mfpic/changes.txt +texmf-dist/doc/generic/mfpic/coil.mps texmf-dist/doc/generic/mfpic/data.dat texmf-dist/doc/generic/mfpic/forfun.tex texmf-dist/doc/generic/mfpic/install.txt texmf-dist/doc/generic/mfpic/lapictures.tex +texmf-dist/doc/generic/mfpic/mfpcard.pdf +texmf-dist/doc/generic/mfpic/mfpcard.tex texmf-dist/doc/generic/mfpic/mfpdoc.sty texmf-dist/doc/generic/mfpic/mfpguide.pdf texmf-dist/doc/generic/mfpic/mfpguide.tex texmf-dist/doc/generic/mfpic/mfpman.pdf texmf-dist/doc/generic/mfpic/mfpman.tex texmf-dist/doc/generic/mfpic/pictures.tex -texmf-dist/doc/generic/mfpic/refcard.tex texmf-dist/source/generic/mfpic/grafbase.dtx texmf-dist/source/generic/mfpic/mfpic.dtx texmf-dist/source/generic/mfpic/mfpic.ins -texmf-dist/fonts/source/public/mfpic/grafbase.mf +texmf-dist/metafont/mfpic/grafbase.mf texmf-dist/metapost/mfpic/dvipsnam.mp texmf-dist/metapost/mfpic/grafbase.mp texmf-dist/tex/generic/mfpic/mfpic.sty texmf-dist/tex/generic/mfpic/mfpic.tex +texmf-dist/tex/generic/mfpic/mfppatch.tex texmf-dist/tpm/mfpic.tpm texmf/lists/mfpic |