summaryrefslogtreecommitdiff
path: root/fonts/utilities/mf2ps
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /fonts/utilities/mf2ps
Initial commit
Diffstat (limited to 'fonts/utilities/mf2ps')
-rw-r--r--fonts/utilities/mf2ps/MFfonts/bases/README9
-rw-r--r--fonts/utilities/mf2ps/MFfonts/bases/move9
-rw-r--r--fonts/utilities/mf2ps/MFfonts/bases/myplain.base184
-rw-r--r--fonts/utilities/mf2ps/MFfonts/bases/myplain.log17
-rw-r--r--fonts/utilities/mf2ps/MFfonts/bases/myplain.mf622
-rw-r--r--fonts/utilities/mf2ps/MFfonts/bases/myplain.tfm1
-rw-r--r--fonts/utilities/mf2ps/READ.ME37
-rw-r--r--fonts/utilities/mf2ps/doc/Fig8.ps287
-rw-r--r--fonts/utilities/mf2ps/doc/Makefile17
-rw-r--r--fonts/utilities/mf2ps/doc/README10
-rw-r--r--fonts/utilities/mf2ps/doc/fig1.ps29
-rw-r--r--fonts/utilities/mf2ps/doc/fig10.ps283
-rw-r--r--fonts/utilities/mf2ps/doc/fig2.ps138
-rw-r--r--fonts/utilities/mf2ps/doc/fig4.ps283
-rw-r--r--fonts/utilities/mf2ps/doc/fig5.ps236
-rw-r--r--fonts/utilities/mf2ps/doc/fig6.ps30
-rw-r--r--fonts/utilities/mf2ps/doc/fig7.ps447
-rw-r--r--fonts/utilities/mf2ps/doc/fig8.ps292
-rw-r--r--fonts/utilities/mf2ps/doc/fig9.ps114
-rw-r--r--fonts/utilities/mf2ps/doc/figure.pages89
-rw-r--r--fonts/utilities/mf2ps/doc/figure.pages.ps508
-rw-r--r--fonts/utilities/mf2ps/doc/paper1755
-rw-r--r--fonts/utilities/mf2ps/doc/paper.pdfbin0 -> 142847 bytes
-rw-r--r--fonts/utilities/mf2ps/doc/paper.ps16427
-rw-r--r--fonts/utilities/mf2ps/doc/paper.ref1890
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/README15
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/builtins.ps16
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/cm.ps211
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/cm.tex8
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/cm7.ps503
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/cm7.tex12
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/cmr.ps4555
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/cmtt.ps6993
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/lasy.ps1715
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/logo.ps1096
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/sy.ps415
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/sy.tex11
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/tt.ps180
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/tt.tex8
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/tt7.ps457
-rw-r--r--fonts/utilities/mf2ps/doc/printsamples/tt7.tex12
-rw-r--r--fonts/utilities/mf2ps/mf2ps/.make3
-rw-r--r--fonts/utilities/mf2ps/mf2ps/Makefile24
-rw-r--r--fonts/utilities/mf2ps/mf2ps/README8
-rw-r--r--fonts/utilities/mf2ps/mf2ps/mf2ps1.h388
-rw-r--r--fonts/utilities/mf2ps/mf2ps/mf2ps1.p95
-rw-r--r--fonts/utilities/mf2ps/mf2ps/mf2ps2.h25
-rw-r--r--fonts/utilities/mf2ps/mf2ps/mf2ps2.p143
-rw-r--r--fonts/utilities/mf2ps/mf2ps/mf2ps3.p657
-rw-r--r--fonts/utilities/mf2ps/mf2ps/mf2psv.p19049
-rw-r--r--fonts/utilities/mf2ps/mf2ps/mf_ext.h54
-rw-r--r--fonts/utilities/mf2ps/mf2ps/mf_window.h15
-rw-r--r--fonts/utilities/mf2ps/mf2ps/uncompressing/README3
-rw-r--r--fonts/utilities/mf2ps/mf2ps/uncompressing/mf2ps1.p95
-rw-r--r--fonts/utilities/mf2ps/mf2ps/uncompressing/mf2ps2.p117
-rw-r--r--fonts/utilities/mf2ps/mf2ps/uncompressing/mf2ps3.p649
56 files changed, 61246 insertions, 0 deletions
diff --git a/fonts/utilities/mf2ps/MFfonts/bases/README b/fonts/utilities/mf2ps/MFfonts/bases/README
new file mode 100644
index 0000000000..6dbe588d1e
--- /dev/null
+++ b/fonts/utilities/mf2ps/MFfonts/bases/README
@@ -0,0 +1,9 @@
+To prevent tarring from clobbering your original, I have renamed the plain*
+files here to myplain*.. but to run them, they have to be renamed back to
+plain*.. do so after moving the originals some place out of the way
+
+the shell script move does this..
+
+all the plain* files are the ones I used
+plain.base and other plain.* file were generated by
+inimf running on plain.mf
diff --git a/fonts/utilities/mf2ps/MFfonts/bases/move b/fonts/utilities/mf2ps/MFfonts/bases/move
new file mode 100644
index 0000000000..8f3d5a571b
--- /dev/null
+++ b/fonts/utilities/mf2ps/MFfonts/bases/move
@@ -0,0 +1,9 @@
+mkdir originals
+mv plain.base originals
+mv plain.log originals
+mv plain.mf originals
+mv plain.tfm originals
+mv myplain.base plain.base
+mv myplain.log plain.log
+mv myplain.mf plain.mf
+mv myplain.tfm plain.tfm
diff --git a/fonts/utilities/mf2ps/MFfonts/bases/myplain.base b/fonts/utilities/mf2ps/MFfonts/bases/myplain.base
new file mode 100644
index 0000000000..25d669be59
--- /dev/null
+++ b/fonts/utilities/mf2ps/MFfonts/bases/myplain.base
@@ -0,0 +1,184 @@
+Hu04V !$'*-0369<?BEHKNQTWZ]`abcdefghijklmnopqrstuvwxyz{|}~24p"+6@CJv&a!\?jsF|
+"%2b},16=DSYgju  $ ( - 8 ? F P Y f i n u x 
+
+
+
+
+!
+#
+&
+(
+*
+,
+3
+:
+@
+G
+R
+Y
+`
+g
+x
+
+
+
+
+
+
+
+
+
+
+
+  ) 6 B O [ h l q t x    " . 7 E G O U [ h q w y ~       % ' , 1 6 @ K W [ ] b i n p s { 
+)@n>h  #&)7BDexIqTl  29<>R #2BT).1ARZ/dn!To#+0;@g)[8]_bhr~+g3`.\Ez3?h ) ` t !'!_!!!!!!" """ "K"T"z""##D#w######$*$Z$e$t$$$$$$$$$$%%%%@%n%%%%%%%&&& &&2&l&&&'!'Q'''(
+((N(}((())U))))**@*s**++L+P+++++,,/,1,b,,,-->-k---./.V.z.../$/F/{//0
+0?0m000111&1a11112#2S2e223 33?3{33344S4s4445%5O5n55566/6b6677B7^778 88D8v8889.919D9`999:&:]::::;8;A;q;;<<A<o<<==7=G=s=v=z===> >->:>?>D>{>>>??:?e?o???@'@:@C@L@P@\@l@n@v@y@}@@@@@@@@@@@A-A4A>ABAIASA[AbAoAAB B3BGBtBBBC'CbCrCCCDD@DkDDDE E7ELEEEEEF FF>F^FFFGG!G2GbGjGrG|GGGGHH)H.H:HGHTHHHHI-I:IOIuIwI{IIIJ J0JGJMJvJyJJJJJK K"K3K6K8KKK~KKKKKKLLL LL,LWLgLxL}LLLLLLMM<MQMXMbMmMvMMMMMMMMMMMMMMMMMMMMMMMMNNN N NNN$N.N8NBNJNVN_NdNoNxNNNNNNNNNNNNNNNNNNNNNNO OOO%O'OBOSOUOWOpOxOzOOOOOOOOOOOOOOOOOOOOOOOPPPP P"P$P&P(P*P,P.P:PAPMPZPmPPPPPPQ Q QBQLQQQVQ`QdQiQyQQQQQQQQQQQQQQQQQQRR RRR!R(R/R2R5R9R=R@RCRGRKRTR^RmR{R}RRRRRRRRRRRRRRRRSSS SSSS.S9S=SHSPSXS_SgSoSxSSSSSSSSSSSSSSSSSSSSSSSSSSTTT
+TTT!T(T0T5T:TCTMTVT`ThTqTzTTTTTTTTTTTTTUU
+UUU#U,U6UGUZUlUyUUUUUUUUUVV
+VVV#V0V:VNVWVyVVVVV^^@^^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^^[^^\^^]^^^^^_ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~^^?buffer sizepool sizenumber of strings???End of file on the terminal!! (That makes 100 errors; please try again.)? Type <return> to proceed, S to scroll future error messages,R to run without stopping, Q to run quietly,I to insert something, E to edit your file,1 or ... or 9 to ignore the next 1 to 9 tokens of input,H for help, X to quit.OK, entering batchmodenonstopmodescrollmode...insert>I have just deleted some text, as you asked.You can now delete more, or insert, or whatever.Sorry, I don't know how to help in this situation.Maybe you should try asking a human?Sorry, I already gave what help I could...An error might have occurred before I noticed any problems.``If all else fails, read the instructions.''Emergency stopMETAFONT capacity exceeded, sorry [If you really absolutely need more capacity,you can ask a wizard to enlarge me.This can't happen (I'm broken. Please show this to someone who can fix can fixI can't go on meeting you like thisOne of your faux pas seems to have wounded me deeply...in fact, I'm barely conscious. Please fix it and try again.InterruptionYou rang?Try to insert some instructions for me (e.g.,`I show x'),unless you just want to quit by typing `X'.Missing `' has been insertedArithmetic overflowUh, oh. A little while ago one of the quantities that I wascomputing got too large, so I'm afraid your answers will besomewhat askew. You'll probably have to adopt differenttactics next time. But I shall try to carry on anyway.Square root of has been replaced by 0Since I don't take square roots of negative numbers,I'm zeroing this one. Proceed, with fingers crossed.Pythagorean subtraction +-+Logarithm of Since I don't take logs of non-positive numbers,angle(0,0) is taken as zeroThe `angle' between two identical points is undefined.main memory sizeAVAIL list clobbered at Double-AVAIL list clobbered at Doubly free location at Bad flag at New busy locs:LINK(INFO(vacuousbooleanunknown booleanstringunknown stringpenunknown penfuture penpathunknown pathpictureunknown picturetransformpairknown numericdependentproto-dependentnumericindependenttoken liststructuredunsuffixed macrosuffixed macroundefinedtruefalsenullpicturenullpenjobnamereadstringpencirclenormaldeviateoddknownunknownnotdecimalreversemakepathmakepentotalweightocthexASCIIcharlengthturningnumberxpartypartxxpartxypartyxpartyypartsqrtmexpmlogsindcosdflooruniformdeviatecharexistsanglecycle++orand<=>=<>rotatedslantedscaledshiftedtransformedxscaledyscaledzscaledintersectiontimessubstringsubpathdirectiontimepointprecontrolpostcontrolpenoffset..tracingtitlestracingequationstracingcapsulestracingchoicestracingspecstracingpenstracingcommandstracingrestorestracingmacrostracingedgestracingoutputtracingstatstracingonlineyearmonthdaytimecharcodecharextcharwdcharhtchardpcharicchardxchardydesignsizehpppvpppxoffsetyoffsetpausingshowstoppingfontmakingproofingsmoothingautoroundinggranularityfillinturningcheckwarningcheck at line a bad variablefiendgroupenddefendfor INACCESSIBLEhash sizeEQUIV(:=addtoatatleastbegingroupcontrolscullcurldelimitersdisplayeveryjobexitifexpandafterfrominwindowinterimletnewinternalofopenwindowrandomseedsavescantokensshipoutstepstrtensiontountiltoken ETC. CLOBBERED IMPOSSIBLE NONEXISTENT BAD[](EXPR(SUFFIX(TEXT->>-><expr>-><expr>of<primary>-><suffix>-><text>->(SAVED)varxxxyyxyy%CAPSULEpart struct{restoring Path{open?}..control? ..{curl ..tension and ..controls ??, before choices, after choicesSome number got too bigThe path that I just computed is out of range.So it will probably look funny. Proceed, for a laugh.path sizeEdge structurerow |Scaled picture would be too bigI can't yscale the picture as requested---it wouldmake some coordinates too large or too small.Proceed, and I'll omit the transformation.I can't xscale the picture as requested---it wouldmove table sizeTracing edges (weight (No new edges added.)Cycle spec % beginning in octant `% entering octant ` & cycleENENNENNWWNWWSWSSWSSEESE ..controls % segment (, before subdivision into octants, after subdivision, after subdivision and double autorounding, after subdivision and autoroundingCurve out of rangeAt least one of the coordinates in the path I'm about todigitize was really huge (potentially bigger than 4095).So I've cut it back to the maximum size.The results will probably be pretty wild.rounding table sizePen polygon .. cycle .. (newly created)Pen too largeThe cycle you specified has a coordinate of 4095.5 or more.So I've replaced it by the trivial path `(0,0)..cycle'.Pen cycle must be convexThe cycle you specified either has consecutive equal pointsor turns right or turns through more than 360 degrees.pen polygon size@ Octant offset), from to @ retrograde line from @ transition line , from dep*4Value is too large (The equation I just processed has given some variablea value of 4096 or more. Continue and I'll try to copewith that big value; but it might be dangerous.(Set warningcheck:=0 to suppress this message.)#### ## Bad PREVDEP at Out of order at Redundant equationI already knew that this equation was true.But perhaps no harm has been done; let's continue.[unknown command code!]<*><insert><scantokens>l.<forever> <argument> <recently read> <to be read again> <inserted text> <for()> input stack sizetext input levelsendinputIncomplete if; all text was ignored after line A forbidden `outer' token occurred in skipped text.This kind of error happens when you say `if...' and forgetthe matching `fi'. I've inserted a `fi'; this might work.The file ended while I was skipping conditional text.File endedForbidden token found while scanning I suspect you have forgotten an `enddef',causing me to read past where you wanted me to stop.I'll try to recover; but if the error is serious,you'd better type `E' or `X' now and fix your file.to the end of the statementA previous error seems to have propagated,a text argumentIt seems that a right delimiter was left out,the definition of the text of a loopI suspect you have forgotten an `endfor',Runaway text?definition?loop?Text line contains an invalid characterA funny symbol that I can't read has just been input.Continue, and I'll forget that it ever happened.Incomplete string token has been flushedStrings should finish on the same line as they began.I've deleted the partial string; you might want toinsert another by typing, e.g., `I"new string"'.Enormous number has been reducedI can't handle numbers bigger than about 4095.99998;so I've changed your constant to that maximum amount.(Please type a command or say `end')*** (job aborted, no legal end found)=>defvardefprimarydefsecondarydeftertiarydefforforsuffixesforeverquote#@@#Missing symbolic token insertedSorry: You can't redefine a number, string, or expr.I've inserted an inaccessible symbol so that yourdefinition will be completed without mixing me up too badly.Sorry: You can't redefine my error-recovery tokens.The next thing in this `def' should have been `=',because I've already looked at the definition heading.But don't worry; I'll pretend that an equals signwas present. Everything from here to `enddef'will be the replacement text of this macro.exprsuffixtextprimarysecondarytertiaryThis variable already starts with a macroAfter `vardef a' you can't say `vardef a.b'.So I'll have to discard this definition.Missing parameter type; `expr' will be assumedYou should've had `expr' or `suffix' or `text' here.parameter stack sizeExtra `endfor'I'm not currently working on a for loop,so I had better not try to end anything.inputLost loopI'm confused; after exiting from a loop, I still seemto want to repeat it. I'll try to forget the problem.No loop is in progressWhy say `exitif' when there's nothing to exit from?After `exitif <boolean exp>' I expect to see a semicolon.I shall pretend that one was there.*** (loop confusion)Not a stringI'm going to flush this expression, sincescantokens should be followed by a known string.)<-Too many arguments to Missing `I'm going to assume that the comma I just read was aright delimiter, and then I'll begin expanding the macro.You might want to delete some tokens before continuing.Missing argument to That macro has more parameters than you thought.I'll continue by pretending that each missing argumentis either zero or null.I've finished reading a macro argument and am about toread another; the arguments weren't delimited correctly.I've gotten to the end of the macro parameter list. for I've got the first argument; will look now for the other.ifelseelseifThere should've been a colon after the condition.{true}{false}Extra I'm ignoring this; it doesn't match any if.Improper When you say `for x=a step b until c',the initial value `a' and the step size `b'and the final value `c' must have known numeric values.The next thing in this loop should have been `=' or `:='.was present, and I'll look for the values next.The next thing in this loop should have been a `:'.So I'll pretend that a colon was present;everything from here to `endfor' will be iterated. ENDFOR{loop value=initial valuestep sizeI assume you meant to say `until' after `step'.So I'll look for the final value and colon next.final valueinput file nameI can't find file `I can't write on file `'..mfPlease type another *** (job aborted, file error in nonstop mode): mfput.log**transcript file name file name for outputFile names can't appear within macrosSorry...I've converted what follows to tokens,possibly garbaging the name you gave.Please delete the tokens and insert the name again.exp (see the transcript file) (future pen)linearform>> recycle### = A primary expression can't begin with `I'm afraid I need some sort of value in order to continue,so I've tentatively inserted `0'. You may want todelete this zero and insert something else;see Chapter 27 of The METAFONTbook for an example.Nonnumeric ypart has been replaced by 0I thought you were giving me a pair `(x,y)'; butafter finding a nice xpart `x' I found a ypart `y'that isn't of numeric type. So I've changed y to zero.(The y that I didn't like appears above the error message.)A group begun on line never endedI saw a `begingroup' back there that hasn't been matchedby `endgroup'. So I've inserted `endgroup' now.Division by zeroI'll pretend that you meant to divide by 1.Improper subscript has been replaced by zeroA bracketed subscript must have a known numeric value;unfortunately, what I found was the value that appears justabove this error message. So I'll try a zero subscript.Variable has been obliteratedIt seems you did a nasty thing---probably by accident,but nevertheless you nearly hornswoggled me...While I was evaluating the right-hand side of thiscommand, something happened, and the left-hand sideis no longer a variable! So I won't change anything.While I was evaluating the suffix of this variable,something was redefined, and it's no longer a variable!In order to get back on my feet, I've inserted `0' instead.copyI've scanned an expression of the form `a[b,c',so a right bracket should have come next.I've seen a `[' and a subscript value, in a suffix,A secondaryA tertiaryPen path must be a cycleI can't make a pen from the given path.AnUndefined coordinates have been replaced by (0,0)I need x and y numbers for this part of the path.The value I found (see above) was no good;so I'll try to keep going by using zero instead.(Chapter 27 of The METAFONTbook explains thatyou might want to type `I ???' now.)Undefined x coordinate has been replaced by 0I need a `known' x value for this part of the path.Undefined y coordinate has been replaced by 0I need a `known' y value for this part of the path.I've scanned a direction spec for part of a path,so a right brace should have come next.Improper curl has been replaced by 1A curl must be a known, nonnegative number.I've got the x coordinate of a path direction;will look for the y coordinate next.A path join command should end with two dots.Improper tension has been set to 1The expression above should have been a number > 3/4.Paths don't touch; `&' will be changed to `..'When you join paths `p&q', the ending point of pmust be exactly equal to the starting point of q.So I'm going to pretend that you said `p..q' instead.Undefined condition will be treated as `false'The expression shown above should have had a definitetrue-or-false value. I'm changing it to `false'.*** (cannot readstring in nonstop modes)unknown pairunknown numericNot implemented: I'm afraid I don't know how to apply that operation to thatparticular type. Continue, and I'll simply return theargument (shown above) as the result of the operation.)}String contains illegal digitsI zeroed out characters that weren't in the range 0..7.I zeroed out characters that weren't hex digits.Number too large (I have trouble with numbers greater than 4095; watch out.combination of types. Continue, and I'll return the secondargument (see above) as the result of the operation.{(The quantities shown above have not been equated.Oh dear. I can't decide if the expression above is positive,negative, or zero. So this comparison test won't be `true'.Unknown relation will be considered false)*(You're trying to divide the quantity shown above the errormessage by zero. I'm going to divide it by one instead.Improper transformation argumentThe expression shown above has the wrong type,so I can't transform anything using it.Transform components aren't all knownI'm unable to apply a partially specified transformationexcept to a fully known pair or transform.That transformation is too hardI can apply complicated transformations to paths,but I can only do integer operations on pictures.Too far to shiftI can't shift the picture as requested---it wouldA statement can't begin with `I was looking for the beginning of a new statement.If you just proceed without changing anything, I'll ignoreeverything up to the next `;'. Please insert a semicolonnow in front of anything that you don't want me to delete.(See Chapter 27 of The METAFONTbook for an example.)Extra tokens will be flushedI've just read as much of that statement as I could fathom,so a semicolon should have been next. It's very puzzling...but I'll try to get myself back together, by ignoringIsolated expressionI couldn't find an `=' or `:=' after theexpression that is shown above this error message,so I guess I'll just ignore it and carry on.Improper `:=' will be changed to `='I didn't find a variable name at the left of the `:=',so I'm going to pretend that you said `=' instead.)=(Internal quantity `' must receive a known valueI can't set an internal quantity to anything but a knownnumeric value, so I'll have to ignore this assignment.Equation cannot be performed (I'm sorry, but I don't know how to make such things equal.(See the two expressions just above the error message.)Redundant or inconsistent equationAn equation between already-known quantities can't help.But don't worry; continue and I'll just ignore it.Inconsistent equationThe equation I just read contradicts what was said before. (off by Declared variable conflicts with previous vardefYou can't use, e.g., `numeric foo[]' after `vardef foo'.Proceed, and I'll ignore the illegal redeclaration.Illegal suffix of declared variable will be flushedVariables in declarations must consist entirely ofnames and collective subscripts, e.g., `x[]a'.Are you trying to use a reserved word in a variable name?I'm going to discard the junk I found here,up to the next comma or the end of the declaration.Explicit subscripts like `x15a' aren't permitted.Extra `endgroup'I'm not currently working on a `begingroup',enddumpAlways say `randomseed:=<numeric expression>'.Unknown value will be ignoredYour expression was too random for me to handle,so I won't change the random seed just now.{randomseed:=errorstopmodeinnerouterI found no right delimiter to match a left one. So I'veput one in, behind the scenes; this may fix the problem.The token `' is no longer a right delimiterStrange: This token has lost its former meaning!I'll read it as a right delimiter this time;but watch out, I'll probably miss it later.(%CAPSULE)' isn't an internal quantitySomething like `tracingonline' should follow `interim'.You should have said `let symbol = something'.was present. The next token I read will be `something'.number of internalsshowtokenshowstatsshowshowvariableshowdependencies> (outer) lefright delimiter that matches tagvariablemacro:'d macro:[repeat the loop]Memory usage still untouched)String usage =macro:OKThis isn't an error message; I'm just showing something.contourdoublepathalsowithpenwithweightdroppingkeepingImproper typeNext time say `withweight <known numeric expression>';I'll ignore the bad `with' clause and look for another.Next time say `withpen <known pen expression>';Weight must be -3, -2, -1, +1, +2, or +3 is the wrong type (I was looking for a "known" picture variable.So I'll not change anything just now.Not a suitable variableAt this point I needed to see the name of a picture variable.(Or perhaps you have indeed presented me with one; I mighthave missed it, if it wasn't followed by the proper token.)Improper `addto'This expression should have specified a known picture.This expression should have been a known path.Not a cycleThat contour should have ended with `..cycle' or `&cycle'.Strange path (turning number is zero)Backwards path (turning number is negative)The path doesn't have a counterclockwise orientation,so I'll probably have trouble drawing it.(See Chapter 27 of The METAFONTbook for more help.)Bad window numberIt should be the number of an open window.Improper `openwindow'Say `openwindow k from (r0,c0) to (r1,c1) at (x,y)',where all quantities are known and k is between 0 and 15.Bad culling amountsAlways cull by known amounts that exclude 0.messageerrmessageerrhelpA message should be a known string expression.(That was another `errmessage'.)This error message was generated by an `errmessage'command, so I can't give any explicit help.Pretend that you're Miss Marple, examine all clues,and deduce the truth by inspired guesses.Enormous has been reducedFont metric dimensions must be less than 2048pt.charlistligtableextensibleheaderbytefontdimenInvalid code has been replaced by 0I was looking for a number between 0 and 255, or for astring of length 1. Didn't find it; will use 0 instead.Character code is already in a ligtablein a charlistIt's not legal to label a character more than once.Improper locationI was looking for a known, positive number.For safety's sake I'll ignore the present command.A colon should follow a headerbyte or fontinfo location.ligtable sizeIllegal ligtable stepI was looking for `=:' or `kern' here.=:kernLigature program too longAfter 256 ligtable steps, no more colons are allowed.Improper kernThe amount of kern should be a known numeric value.I'm processing `extensible c: t,m,b,r'.Improper font parameter(some values had to be adjusted by as much as pt)(illegal design size has been changed to 128pt).tfmfile name for font metricsFont metrics written on (a font metric dimension font metric dimensions had to be decreased) METAFONT output .gfgf (just shipped out)(There's unbounded black in character shipped out!)specialnumspecialUnsuitable expressionThe expression shown above has the wrong type to be output.title Output written on character, bytes). (INIMF) strings of total length memory locations dumped; current usage is symbolic tokens (preloaded base=.basebase file nameBeginning to dump on file Transcript written on (end occurred when on line was incomplete)(see the transcript file for additional information)(dump is performed only by INIMF)debug # (-1 to exit):myplainmyplain.mfmyplain.logbase_namebase_versionplain1.0uptodowntoexitunlessrelax\\]]-----infinity...gobblegobbledgghide???stopinteractloggingalltracingalltracingnoneepsepsilonrightleftupdownoriginquartercirclehalfcirclefullcircleunitsquareidentityblankpictureunitpixeldittocapsule_defpensquarepenrazorpenspeckwhateverabsroundhroundvroundo__o_ceilingbytedirunitvectorinverseT_counterclockwisetensepathmoddivdotprod**takepowerUndefined power: **directiondirectionpointa_The direction doesn't occurintersectionpointx_y_The paths don't intersectsoftjoinc_join_radiusb_incrdecrreflectedaboutrotatedaroundrotatedaboutminu_setu_uumaxflexn_z_dz_superellipseinterpathsolvetrue_xfalse_xtx_fx_tolerancefix_unitsmmpixels_per_inchcmptpcddccbpinaspect_ratioblackero_correctiondefine_pixelsdefine_whole_pixelsdefine_whole_vertical_pixelsdefine_good_x_pixelsgooddefine_good_y_pixelsdefine_blacker_pixelsdefine_whole_blacker_pixelsdefine_whole_vertical_blacker_pixelsdefine_corrected_pixelsdefine_horizontal_corrected_pixelslowres_fixratiofirstmode_setupmodeproofcurrenttransforminput mode_namemagdisplayingextra_setupclearitpickupsmodemagstepmode_defnumber_of_modesproofproof_proof_smokesmokesmoke_smoke_grayfont blackmakeboxmaketickslowreslowreslowres_lowres_midmidmid_mid_sunsunsun_sun_localfontcurrentpencurrentpen_pathcurrentpicturet_filladdto_currentpicturedrawfilldrawdrawdotdef_pen_path_unfillundrawunfilldrawundrawdoterasedefault_wt_cullitcutdrawcutoffthetapic_cut_pen_lftpen_rtpen_toppen_botnumeric_pickup_pen_pickup_pen_Unknown penclearpenpen_lft_pen_rt_pen_top_pen_bot_pen_path_pen_count_savepenclear_pen_memorylftrttopbotpenpospenstrokepath_cyclestroke_makelabellcode_nodot 1 2 3 4 0 5 6 7 8labelspenlabels$$rangenumtokthruproofrulerulescreenrulerulepenmakegridxlistylisttitlefonttitlefont labelfontlabelfont grayfontgrayfont slantfontslantfont proofoffsetoffsetproofrulethicknessrulethicknessbegincharw_sharph_sharpd_sharpclearxyextra_begincharitalcorrx_sharpchange_widthendcharextra_endcharshipitshowitfont_sizefont_slantfont_normal_spacefont_normal_stretchfont_normal_shrinkfont_x_heightfont_quadfont_extra_spacefont_identifierfont_identifier_font_coding_schemefont_coding_scheme_UNSPECIFIEDscreen_rowsscreen_colscurrentwindowopenitshowit_screencharsshowit;screenstrokesimagerulesmakebox(screenrule);gfcornerslet makebox=maketicks;proofing:=1;nodisplaysdisplaying:=0;notransformsbye (preloaded base=myplain 89.3.8)ЊЊЊЊ݊ЊЊ @7orr r
+r r r r r s s  s s s" 4s> sA  4kk sOs\sb sf s~ s s s s s s k k s T k s s k Vss t k @tttt%t0!t:t< Z4)tEtF ËTZtNt` k<tltwiiffoo ll uxxrru~ { ~{  ъЋiouk kkky,Ykk{Y{kԋ{y,{Z Ջ**UU[l Ìl([l l" l2(l8 lD lT(lZ  U****U
+UUlf .lv(ql(zl(y"y,(%*%l C 222?"u0tz[ll U.ll  2m m m m m eClmn n  n l  ÌUnr ql 6 
+kn| ffn 33n fn vn n n +Ll n ffn 33n f::n ,n n n qHl    
+Jm<m l،ekn ffn 33n fn n n n D UUUUUUUUky,ky,n ?n =n n n n
+)Rn n n 9# n _'o .~#\oЍf_Z}B|r~. !5}}|~~|<! C}Z~r|BJ! QZZrBBrX !h+go o ffoI oX o` oq -o p p" 'p< p? э~HE$
+)R $>@ $s荪$MK! @}Z~r|B! ZZrBBr9G!&ǍՋ$ڍߍ$"$&0$$d$ ! @ZZrBBr9G!fnp Hp p p p p HEp =p ffq Mkh9q*qC qI qj qn
+Ћs4
+ЋmqxdЊЎQ ] _  g&>S>Qgr r
+ r  {r r& oMr]urzr ώg}yu_qI[t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t u u u u% u* R(<uo   
+ 
+ &,)#,&#)82
+/5
+28 5/A>;DD;>APM
+MP GJ
+JG V\YS\VSYhb
+_e
+bh e_ъАh>8VP &iϊ" u
+#k 
+,Q Y#Q
+Б`*]b]БgdidБnekpkБurwrБ|qy~yБϑ ʊ Ȋ Ɗ h h ,h 2{i i$ Yi) i. i3 i8 i= iB ɑiY
+if it
+i
+i i
+i
+i i Ցi i i j j [j j/  jM j\ j j jj j jj  Njj jj Y j˒"%%".+(.+(4411::77@CC==@LIFLIFъВL4.@:"{Oj Yj j {k( k0kB -kI܍[<يqЊhhhhh]h>hhohhБ'hgh2hghhБ'hgh2hghhБ'hh2hhhЊ<hhh<huh6hh>huhhhAhh̊Б'h[h2h[hhҊЊ*-h'h.h)h)h6hhh܊Њ6hhhЊh2h6hhЊzh-hyhhhЊh'h6hhhЊh<h=h>hhoh<hhhЊ*-.h)ii*ici-ii)iiii i
+i i i*i Zizi-i Ziyi)iniiЊi2iiiЊi2i i i!Њi#;7i%i&Њi(;7i*i+Њi-;7i/i0Њi2;7i4i5Њi7;7i9i:Њi<;7i>i?ЊiA;7iCiDЊiF2iG iHiIЊiK<iL*iM*iNiOiiP-iQiR+iSiT,iUxiV)iW-iX*.iZi[ii\-i]i^+i_i`,iaxib)ic)id ie;7igihii6ij<ik*il*iminiio-ipyiq)ir-is*.iuiviiw-ixyiy)iz)i{ i|<i}*i~*iiei.i-iyi)i-i*iiei.-iyi)i)i i;ixi->iyiii6i<i*i*izi-ixi)i-i*izi-.ixi)i)i i<i*i*izi-)i-i*izi-)i)i i;iiei.i-iiii->iziiii iЊi<i*i*iii-ii+ii,ixi)i-i*iiii-ii+ii,ixi)i)i i;7iii6i<i*i*iiii-iyi)i-i*iiei.i-iyi)i)i i;ixi->iyiii6i<i*i*izi-ixi)j-j*jzj-)j)j j;jj ej
+.j -j j ij->jzjijj jЊjj<jj<j*jj)jj;?j j!j"<j#j$<j%xj&2j'j(j)<j**j+j,)j-j.;?j0j1j2<j3[j4j5j6Бj8,j9;j:j;.j<;j=j>+j?j@?jAxjBjCxjD2jExjFjGЊjIjJ2jKjL;?jNjOjPjQЊ<jSjTjU<jV jW<jXjY<jZj[<2j]j^<j_*j`ja+jbjc)jd)je2jfejg<jh*jijj+jkjl)jm)jn2joijp<jq*jrjs+jtju)jvZjw2jxxjy<jzj{2j|j}<j~j2jj<jj2jj<j;jjjj;jjjj2jjnjjjjjjjjj<jnjjЊjjj<jjljj<jjj Zjj'jnjjj Zjj'jnjjj Zjj'jnjjŠj Zjj' jnjjʊЊj jϊj jQjjjj)j6jjjjjڊЊj܋jj<jjljj<jjjj<jjljj<yjjjjЊ6j^jyj\j?j-j;jj^#,jj>jyjijkkЊ XkkЊ^kk\k?k k
+k,k 6k 6k<k*kk%k{k-kk%kk)k Zkk;k k>k%kk;k sk!-k"-k#mk$>k%k&k';?k)k*k+nk-k. k/kFk16k2<k3*k4%k5{k6-k7%k8k9)k: Zk;k<;k= k>>k?%k@kA;?kCkDkEnkGkJkH kckK*kLkMkN)kOkPkQ<kR*kSkTkU)kVlkWkX<kYkZ'k[ Zk\k]k^;k_k`kakbnkdkekfkgЊ<kikj<.kl2kmkn<kokp2kqkr<ksktkukv<kwkxkykz)k{k|k}<k~`kkkskk"kkk<.kkmkk"kkk<02kkYknkkЊkQkkskkkkmkkk;kkk;kmkkQkk6k<k k2kfkk;ksk-kmk>kfkkkk*ksk Zkzk,kmk Zkzk)6>k Zkzk<k*ksk Zkyk,kmk Zkyk)<>k Zkyk<kkџk*D-kk)k>k*kmk Zkzk.ksk Zkzk-kmk Zkyk.ksk Zkyk)knkkkkl k<k*kk*k*-k<k)k,kk)k)k<k>kk*k*-l<l)l,ll)l<lll <l
+l l nlll/l<l*ll*l*-ll)l,ll)l)l<l>ll *l!*-l#l$)l%,l&l')l(<l)l*l+<l,l-l.nl0l1lQl3<l4*l5l6*l7*-l9Bl:)l;,l<l=)l>)l?<l@>lAlB*lC*-lEBlF)lG,lHlI)lJ<lKlLlM<lNlOlPnlRlSlslU<lV*lWlX*lY*-l[Rl\)l],l^l_)l`)la<lb>lcld*le*-lgRlh)li,ljlk)ll<lmlnlo<lplqlrnltlullw.lx*lylz,l{l|)l})l~nlllRl.l*lRl,ll)lZlnllll<l;ll*l<l-,)l;llll,lĊlnlllll;ll*ll-A)l;llll,lĊlnllllBl;ll*G-lBl)l;llll,lĊlnllÊllRl;ll*a-lRl)l;llll,lĊlnllՊЊ<l^l\l*l-lll<l^l\ll-llyl<l^l\lel-l^l\ll-l^l\lql-l^l\lll<2lllЊ<lll<2l<m2mm2mBm2mRm<m"m2m m
+m m9m <mm>m^mm\m*m<m<m>m^mm\mem<mm>m^mm \m!m"<m#Bm$>m%^m&m'\m(qm)<m*Rm+>m,^m-m.\m/m0<m1m2>m3^m4m5m6\m7Њm8nm:m;Њ<m=m>m?<m@:mA*mBmCmDmEmFmG)mH2mI<mJ<mK:mL*mMmNmOmPmQmR)mS2mTmU<mVmWmXmYmZlm[2m\Bm]<m^m_m`mamblmc2mdRme<mfmgmhmi2mjmkmlЊ<mnmo^mpmq\mr*ms2mtmu<mv^mwmx\myemz2m{<m|<m}^m~m\mm2mm<m^mm\mqm2mBm<m^mm\mm2mRm<m^mm\mm2mm;mm m<sm;m^mm\mm1mmmЊmmm;mmm;mmmmmmm2mm<mmm6mm<mm.mm*K-M)mmmm<m*mmhmmɟmm*m*m<m-mm-mBm-mRm)mm,O)m$mm)m"mmm<mmQmmm)mmm<Q2mmYm<S2mmYmnmmmmЊmm<m*mmm'mmm-mmn'nn)nn<n*nnŌ[n n
+,]-n n Ō_n)nnnЌc.n2nn<nn<nn<n`nn n<nn <n!`n"2n#n$Yn%nn&n'Њ`n)n*n+n,n-Њ`n/n0n1n2n3Њ`n5n6n7n8n9Њ`n;n<n=n>n?Њ*nAnB&nCVnD>nEnF)nGnHnIЊnKQnLnMnNhnOnP"nQnRnSnT;nUnV1nWnXnYЊn[Qn\n]@n^n_n`ЊnbQncndne)nfngnhЊ6njnknlЊnnno"npnq<g.ns2ntnunvЊn{nynx<u2n}n~<w2nNn<y2nn<{2nMn<}2nn<n،2nn2n<nЊ<2nn<2nNn<2nn<2nMn<2nn<n،2nn2n<nЊ<2nn<2nNn<2nn<2nMn<2nn<n،2nn2n<nЊ<nn>nnon<'ngn2ngn-n<2nn<nnΊЊ< 2nn<2nNn<2nn<2nMn<2nn<n؍2nn2n<nЊ^n Xn\nnnAnn<!'n Xnn2n^n Xn\nn<nnn2n Xnno*oč%)o݊onooo<o o
+o o Њ<l2oo<o*oo,oՍn)o$ooo<oo<ooooo ;o!o"o#;o$o%1o&o'2o(o)<o*go+o,<o-bo.<o/o0o1o20o3>o4:o5Ao6<o7o8o9+o:>o;o<Ao=;o>o?]o@>oA:oBooC<oD]oE>oFoGooH;p>oJoKoL<oMoN+oOMoP2oQMoR<oSoT2oUoVoW<r>oYoZ;o[o\1o]o^o_<t>oaob;ocod1oeof<ogoh^oioj\okol;omon*ooop'v)or;osotouovow<oxoyoz<o{o|o}o~<o o>oo;oo1oo<x2oooЊoo6o<oo2o%o;o o>o%oo;o$ouo0o$oo+oo?ouo0ooo6oo<o$o%o2o$oo<o%o2oo;o$oo?o$o%oro<o$o%o2o$ouo<o%o2ouo;o$ouo=o$o%oro<o$o%o>o$oo>o$ouo<o%o>oo>oo>ouo;ouo1oo;o o>o%oo<oo-oo-ouoonoo oЊ6o<oho,o*oo+oo+o$o%o)oZo2o%o;o o>o%ppp pЊ6p<php,p*p p
++p p +p $p%p)p)p2p%p;p p>p%ppp pЊ6pp<p:z2p %p!;|6p#%p$p%<p&*p'p(,p)p*+p+$p,%p-)p.)p/2p0%p1;p2 p3>p4%p5p6p7 p8Њ6p:p;<2p=%p>;6p@%pApB<pC*pDpE,pFpG+pH$pI%pJ)pKZpL2pM%pN;pO pP>pQ%pRpSpT pUЊ6pW<pXpY,pZp[+p\$p]%p^2p_%p`;pa pb>pc%pdpepf pgЊ6pi<pj*pkpl+pm$pn%po)ppzpqpr2ps%pt;pu pv>pw%pxpypz p{Њ6p}<p~*pp+p$p%p)pypp2p%p;p p>p%ppp pЊ6p<p*pp+p$p%p)p)p2p%p;p p>p%ppp pЊ6p<p*pp+p$p%p)pZp2p%p;p p>p%ppp pЊ6p<pp+p$p%p2p%p;p p>p%ppp pŊЊ<pp+pp2pAp<pp2pp<pMp2pp<0pMp2pp<p2pp<pՎ02pp<0pMp2pp<0pMp2pp< 0pMp2pp<"0pMp2pppq%p6p<pp2ppp;qqq;q*qq)q Zqq<q q
+6q *q q .qq)q<qq<q^qq-qq\$2qq;qq<qq2qq <q!q"2q#q$nq&q'q(q)qrq+^q,q-q.'q/q0-q1q2q3'q4q5\q6q7;q8q9Qq:;q;q<Qq=q>6q? q@^qAqBŎ,,qDuqEqF-qGqHŎ.,qJuqKqL\qMqNEqO^qPqQqRuqS3qT-qUqVqWuqX3qY\qZq[9q\ q]^q^q_q`uqaqb-qcqdqeuqfqg\qhqi;0.qkqlqm@2>qouqpiqqnqsqtquqvqwЊQqyqz~q{q|.q}q~|q*q^qqq-qqq\qq-q^qqlq-qqlq\qq)qq~qq|qqq~qq.qq|q*q^qqq-qqq\qq-q^qqlq-qqlq\qq)qq~qq|qqq~qq.qq|q*q^qqq-qqq\qq-q^qqlq-qqlq\qq)qq~qq|qqq~qq.qq|q*q^qq܋q-qqߋq\qq-q^qqlq-qqlq\qq)qq~qq|qqqqqqqqЊ^qq\qqq6q~qdr|r^rlr\rrr;U.rr @W>r lr iYr*cr.r^rr\rr2rdr6r<r{r2r^rrr\rr ;r! r">r#{r$ir%<e2r'r()r)r*r+ r,Њr.>r/r0<r1r2r3r4;r5r6r7rr8r9r:;r;r<r=r>r?rXrA6rBrC<rDrE2rFrG;rHrI?rJrKrL;rM rN>rOrPirQ<rRrSrT<rUrVrWnrYrZ r[r\rur^6r_r`<rarb2rcrd;rerf=rgrhri;rj rk>rlrmirn<rorprq<rrrsrtnrvrw rxryЊr{hr|r}r~r.rhrrrrъrr<rrr>rrr<rrr.r>rrr<rr>rrrr<rr>rrrr<rrrnrrrrrr Zr<m.r Zr2r Zrnrrr Zr<,r Zr2r ZrnrrЊrrrr*r'r-rr)rr;rrrr'rr~rrr'rr|r;=rrrrrrr*rr-)rr;rr~rrŊr|rrŊr;=rrr<r*rrrr)rr2rr<r*rrrr)rr2rs<ssŊshs$s]s2s s
+ns s Њss^sssss-sssss\;sss<s*)s ss!;
+=s#s$s%<s&s's(s)>s**s+s,-s-s.)s/<s0s1-s2s3s4ns5s6sLs8s9s:s;s<<s=*)s?ss@;=sBsCsD<sEsFsGsHsI2sJsKnsMsNsYsPsQsRsS.sTsUsVsW3sXnsZs[Њs]s^*s_s`sa''scsdse'ssg)shsi;sjsksl6smsn0so;spsqsr`ss>stosuisv;swsx6sysz+s{;s|s}@ >sosis;":sss;ss\s>ss$;s&;s*(?ss)sEs**>ss)srs*sss+ss)ss;,?ssssЊsssss;sss+ss;2>ssssЊ*sss+sss,ssls+ssls)ssÊЊ*ss0ss)s\ssˊЊ*s*ss0ss)s\s+ss.ss)ssيssss'ss;ssQs;ssQss6sssslss;8.sss@:>slsisnsstsss;@6ssst<B2ttYtntttt <t
+t >t t tt<tttntttt<t0tĊtnttt"tt ؊t!nt#t$t-t&t't(;t)t*t+t,nt.t/t7*t1t2.t3)t4\t5.t6nt8t9tB:t;*R,t=t>t?)t@\tAntCtDtK*X,tGtH)tI\tJntLtMtitOtP;tQtR*tStTtU)tV-tWtXltYZtZ)t[;t\t]t^rt_*^,tatb)tc\td;tetftgthntjtktq@tm<tn@totpntrtsЋttt> tytt}t~Atx Xtt| XtvЊ<2tGt<2t1t<2t>t<2tt<2tt<2tTt<2tt<2t`t<2tt<2tt<2tt<2tWt<2tUt<2tttЊTt<2tWt<2tUttЊ<2tGt<2t1t<2t>t<2tt<2tt<2tTt<2tt<2t`t<2tt<2tt<2tt<2ttt܊Њ*2tUt<2tWt)tttЊкtSt<ttIttЊ*t6t<2tWtYt)tttЊ<tt<t tntttu uЊuЊuЊ puu  u
+u Њ u 'uu uuЊ~u|u u~u|uuЊ^u^uuЊu u!u"u#Њ^.u&#u'u(Њ^#u-u+hАЊR ~$#)%$)'&S0)(**))>+*G7,+E+-,O.-F+0/H6;:N<;P=<M2>=Q3?>O2@?)A@=UT)\[?]\^]@`_,(ba)cb)dc)ed)fe)hg)ih)lk)ml)nm)on)qp)rq)sr)ts)ut)vu)xw)yx)zy){z)|{.~}A6"d)j
+XnJ
+$!im
+T7#!ˎE)08(_% ))9"(r
+)w)s 1s5jmm
+I-=u
+ / <%($p
+Z p|
+$=&,")ڋV)1("2IM5yL6N27R29N9:P2Gi'
+Q7BXiE
+o Y7pu$
+s4(t
+)u
+7"Tnm
+7(.(/()8"),k)) Z7 J-5())BKHGu
+s7,)u
+)[E():")d%4(K-)Q))dGwW)ǎ}))*")(6(j
+8!(  1 1( !)J)B(1"!݋P)'+()9C-]6Qm):t
+B*(K\n.
+M5(N)S!8`fbp
+Ai
+4" 1(e2h
+)r
+t{
+
+)h
+͎A)s
+)_S"pV
+-(:#(}k
+jR
+\ X)
+i@
+)Po)j7
+*6n
+7t
+:<3">p
+@F)AEL4L'(R)T(UYs5[y?)^`~(c0"d<)eqn)h)(i kF)m"oYpL;qvi)sYuk)vB"w/"yt
+U )"n)u5h
+xE) 2(R b#8BOq)q
+h
+ό)WnZ
+&o
+[n4
+b%^:(pu) , X7@j
+:C)(-""4D'WI)5D5i,
+7hHiJ
+QjH
+\5))]̎C)qdx^%Ќ)).(s5-("!/(0(,(`n
++(tu
+h
+Ջ)ul
+`% i
+ mm
+ h
+D$-)1 (6E<h>(G(IXN=&(O%!Re;(Su
+YX qo|)rIg=(H)())Ns)J!
+(_h
+) )79(6(3"Qu)
+C"aY)!  r
+;$(U)T$ V7()0i6
+?8)Bf<(Jt)QD$U$ (V>)Z\)\@"_p
+cA(g1j)h
+W7m2"nM qp
+{j
+z`).f)%p
+6Du
+?((|)Snw
+?"Uni
+r-
+H+"U7,OIn
+Ǝ))o
+(){)
+5P<i;
+ RVF'"cI)s?( kg)2(y)` ֏Ŏ)8h
+<"(&(CQ(^ c:Vna
+Ό)a%>"#p9
+r@
+ 8(( )>'(# (%()!ph
+ 8k1;
+) +)"!!#aJ(Mn
+*r`)+>n
+-:n
+3c%45;"6#7t
+8!9*)<؋b)=h
+>" (?k
+@u,
+A3(FYn@
+K"8OZn:
+Q=Tt
+W7 ([)^eKl5"n)p X8~̥h
+h
+i
+@(i"
+i1
+h
+)j
+)j
+k
+)~(){k
+d0)b)]n(
+Rnz
+J)En
+B)4o
+3m
+/O)*W)()')p
+ 3(:)0(i)))s5ߋL)ދN)ʎG)*(t
+)zLgZ! \-[7A"="9"."&"F)XX)>[?/H6:N;PEDBCQA))B !"#$%&'()*+,-./01$2$3456789:;<=>? _   
+)R07^efghsn>
diff --git a/fonts/utilities/mf2ps/MFfonts/bases/myplain.log b/fonts/utilities/mf2ps/MFfonts/bases/myplain.log
new file mode 100644
index 0000000000..89ef087e3b
--- /dev/null
+++ b/fonts/utilities/mf2ps/MFfonts/bases/myplain.log
@@ -0,0 +1,17 @@
+This is METAFONT, Version 1.0 for Berkeley UNIX (INIMF) 8 MAR 1989 16:23
+**\input myplain;dump;end.
+(myplain.mf
+Preloading the plain base, version 1.0: preliminaries,
+ basic constants and mathematical macros,
+ macros for converting from device-independent units to pixels,
+ macros and tables for various modes of operation,
+ macros for drawing and filling,
+ macros for proof labels and rules,
+ macros for character and font administration,
+and a few last-minute items.)
+Beginning to dump on file myplain.base
+ (preloaded base=myplain 89.3.8)
+1230 strings of total length 22208
+4690 memory locations dumped; current usage is 1362&3209
+493 symbolic tokens
+Font metrics written on myplain.tfm
diff --git a/fonts/utilities/mf2ps/MFfonts/bases/myplain.mf b/fonts/utilities/mf2ps/MFfonts/bases/myplain.mf
new file mode 100644
index 0000000000..9c85b7e622
--- /dev/null
+++ b/fonts/utilities/mf2ps/MFfonts/bases/myplain.mf
@@ -0,0 +1,622 @@
+% This is the plain METAFONT base that's described in The METAFONTbook.
+% N.B.: Please change "base_version" whenever this file is modified!
+% And don't modify the file under any circumstances.
+string base_name, base_version; base_name="plain"; base_version="1.0";
+
+message "Preloading the plain base, version "&base_version&": preliminaries,";
+
+delimiters (); % this makes parentheses behave like parentheses
+def upto = step 1 until enddef; % syntactic sugar
+def downto = step -1 until enddef;
+def exitunless expr c = exitif not c enddef;
+let relax = \; % ignore the word `relax', as in TeX
+let \\ = \; % double relaxation is like single
+def ]] = ] ] enddef; % right brackets should be loners
+def -- = {curl 1}..{curl 1} enddef;
+def --- = .. tension infinity .. enddef;
+def ... = .. tension atleast 1 .. enddef;
+
+def gobble primary g = enddef;
+primarydef g gobbled gg = enddef;
+def hide(text t) = exitif numeric begingroup t;endgroup; enddef;
+def ??? = hide(interim showstopping:=1; showdependencies) enddef;
+def stop expr s = message s; gobble readstring enddef;
+
+smoothing:=1; autorounding:=2; % this adjusts curves to the raster
+turningcheck:=2; % this will warn about a "strange path"
+granularity:=1; % this says that pixels are pixels
+
+def interact = % sets up to make "show" commands stop
+ hide(showstopping:=1; tracingonline:=1) enddef;
+
+def loggingall = % puts tracing info into the log
+ tracingcommands:=3; tracingedges:=2; tracingtitles:=1; tracingequations:=1;
+ tracingcapsules:=1; tracingspecs:=1; tracingpens:=1; tracingchoices:=1;
+ tracingstats:=1; tracingoutput:=1; tracingmacros:=1; tracingrestores:=1;
+ enddef;
+
+def tracingall = % turns on every form of tracing
+ tracingonline:=1; showstopping:=1; loggingall enddef;
+
+def tracingnone = % turns off every form of tracing
+ tracingcommands:=0; tracingonline:=0; showstopping:=0;
+ tracingedges:=0; tracingtitles:=0; tracingequations:=0;
+ tracingcapsules:=0; tracingspecs:=0; tracingpens:=0; tracingchoices:=0;
+ tracingstats:=0; tracingoutput:=0; tracingmacros:=0; tracingrestores:=0;
+ enddef;
+
+message " basic constants and mathematical macros,";
+
+% numeric constants
+newinternal eps,epsilon,infinity,_;
+eps := .00049; % this is a pretty small positive number
+epsilon := 1/256/256; % but this is the smallest
+infinity := 4095.99998; % and this is the largest
+_ := -1; % internal constant to make macros unreadable but shorter
+
+% pair constants
+pair right,left,up,down,origin;
+origin=(0,0); up=-down=(0,1); right=-left=(1,0);
+
+% path constants
+path quartercircle,halfcircle,fullcircle,unitsquare;
+quartercircle=(right{up}..(right+up)/sqrt2..up{left}) scaled .5;
+halfcircle=quartercircle & quartercircle rotated 90;
+fullcircle=halfcircle & halfcircle rotated 180 & cycle;
+unitsquare=(0,0)--(1,0)--(1,1)--(0,1)--cycle;
+
+% transform constants
+transform identity;
+for z=origin,right,up: z transformed identity = z; endfor
+
+% picture constants
+picture blankpicture,unitpixel;
+blankpicture=nullpicture; % `display blankpicture...'
+unitpixel=nullpicture; addto unitpixel contour unitsquare;
+
+% string constants
+string ditto; ditto = char 34; % ASCII double-quote mark
+
+% pen constants
+def capsule_def(suffix s) primary u = def s = u enddef enddef;
+capsule_def(pensquare) makepen(unitsquare shifted -(.5,.5));
+capsule_def(penrazor) makepen((-.5,0)--(.5,0)--cycle);
+pen penspeck; penspeck=pensquare scaled eps;
+
+% nullary operators
+vardef whatever = save ?; ? enddef;
+
+% unary operators
+let abs = length;
+
+vardef round primary u =
+ if numeric u: floor(u+.5)
+ elseif pair u: (hround xpart u, vround ypart u)
+ else: u fi enddef;
+
+vardef hround primary x = floor(x+.5) enddef;
+vardef vround primary y = floor(y.o_+.5)_o_ enddef;
+
+vardef ceiling primary x = -floor(-x) enddef;
+
+vardef byte primary s =
+ if string s: ASCII fi s enddef;
+
+vardef dir primary d = right rotated d enddef;
+
+vardef unitvector primary z = z/abs z enddef;
+
+vardef inverse primary T =
+ transform T_; T_ transformed T = identity; T_ enddef;
+
+vardef counterclockwise primary c =
+ interim autorounding:=0;
+ if turningnumber c <= 0: reverse fi c enddef;
+
+vardef tensepath expr r =
+ for k=0 upto length r - 1: point k of r --- endfor
+ if cycle r: cycle else: point infinity of r fi enddef;
+
+% binary operators
+
+primarydef x mod y = (x-y*floor(x/y)) enddef;
+primarydef x div y = floor(x/y) enddef;
+primarydef w dotprod z = (xpart w * xpart z + ypart w * ypart z) enddef;
+
+primarydef x**y = if y=2: x*x else: takepower y of x fi enddef;
+def takepower expr y of x =
+ if x>0: mexp(y*mlog x)
+ elseif (x=0) and (y>0): 0
+ else: 1
+ if y=floor y:
+ if y>=0: for n=1 upto y: *x endfor
+ else: for n=_ downto y: /x endfor
+ fi
+ else: hide(errmessage "Undefined power: " & decimal x&"**"&decimal y)
+ fi fi enddef;
+
+vardef direction expr t of p =
+ postcontrol t of p - precontrol t of p enddef;
+
+vardef directionpoint expr z of p =
+ a_:=directiontime z of p;
+ if a_<0: errmessage("The direction doesn't occur"); fi
+ point a_ of p enddef;
+
+secondarydef p intersectionpoint q =
+ begingroup save x_,y_; (x_,y_)=p intersectiontimes q;
+ if x_<0: errmessage("The paths don't intersect"); origin
+ else: .5[point x_ of p, point y_ of q] fi endgroup
+enddef;
+
+tertiarydef p softjoin q =
+ begingroup c_:=fullcircle scaled 2join_radius shifted point 0 of q;
+ a_:=ypart(c_ intersectiontimes p); b_:=ypart(c_ intersectiontimes q);
+ if a_<0:point 0 of p{direction 0 of p} else: subpath(0,a_) of p fi
+ ... if b_<0:{direction infinity of q}point infinity of q
+ else: subpath(b_,infinity) of q fi endgroup enddef;
+newinternal join_radius,a_,b_; path c_;
+
+% special operators
+vardef incr suffix $ = $:=$+1; $ enddef;
+vardef decr suffix $ = $:=$-1; $ enddef;
+
+def reflectedabout(expr w,z) = % reflects about the line w..z
+ transformed
+ begingroup transform T_;
+ w transformed T_ = w; z transformed T_ = z;
+ xxpart T_ = -yypart T_; xypart T_ = yxpart T_; % T_ is a reflection
+ T_ endgroup enddef;
+
+def rotatedaround(expr z, d) = % rotates d degrees around z
+ shifted -z rotated d shifted z enddef;
+let rotatedabout = rotatedaround; % for roundabout people
+
+vardef min(expr u)(text t) = % t is a list of numerics, pairs, or strings
+ save u_; setu_ u; for uu = t: if uu<u_: u_:=uu; fi endfor
+ u_ enddef;
+
+vardef max(expr u)(text t) = % t is a list of numerics, pairs, or strings
+ save u_; setu_ u; for uu = t: if uu>u_: u_:=uu; fi endfor
+ u_ enddef;
+
+def setu_ primary u =
+ if pair u: pair u_ elseif string u: string u_ fi;
+ u_=u enddef;
+
+def flex(text t) = % t is a list of pairs
+ hide(n_:=0; for z=t: z_[incr n_]:=z; endfor
+ dz_:=z_[n_]-z_1)
+ z_1 for k=2 upto n_-1: ...z_[k]{dz_} endfor ...z_[n_] enddef;
+newinternal n_; pair z_[],dz_;
+
+def superellipse(expr r,t,l,b,s)=
+ r{up}...(s[xpart t,xpart r],s[ypart r,ypart t]){t-r}...
+ t{left}...(s[xpart t,xpart l],s[ypart l,ypart t]){l-t}...
+ l{down}...(s[xpart b,xpart l],s[ypart l,ypart b]){b-l}...
+ b{right}...(s[xpart b,xpart r],s[ypart r,ypart b]){r-b}...cycle enddef;
+
+vardef interpath(expr a,p,q) =
+ for t=0 upto length p-1: a[point t of p, point t of q]
+ ..controls a[postcontrol t of p, postcontrol t of q]
+ and a[precontrol t+1 of p, precontrol t+1 of q] .. endfor
+ if cycle p: cycle
+ else: a[point infinity of p, point infinity of q] fi enddef;
+
+vardef solve@#(expr true_x,false_x)= % @#(true_x)=true, @#(false_x)=false
+ tx_:=true_x; fx_:=false_x;
+ forever: x_:=.5[tx_,fx_]; exitif abs(tx_-fx_)<=tolerance;
+ if @#(x_): tx_ else: fx_ fi :=x_; endfor
+ x_ enddef; % now x_ is near where @# changes from true to false
+newinternal tolerance, tx_,fx_,x_; tolerance:=.1;
+
+message " macros for converting from device-independent units to pixels,";
+
+def fix_units = % define the conversion factors, given pixels_per_inch
+ mm:=pixels_per_inch/25.4; cm:=pixels_per_inch/2.54;
+ pt:=pixels_per_inch/72.27; pc:=pixels_per_inch/6.0225;
+ dd:=1238/1157pt; cc:=12dd;
+ bp:=pixels_per_inch/72; in:=pixels_per_inch;
+ hppp:=pt; % horizontal pixels per point
+ vppp:=aspect_ratio*hppp; % vertical pixels per point
+ enddef;
+
+mm#=2.84528; pt#=1; dd#=1.07001; bp#:=1.00375;
+cm#=28.45276; pc#=12; cc#=12.84010; in#:=72.27;
+
+newinternal pixels_per_inch; % the given resolution
+newinternal blacker, o_correction; % device-oriented corrections
+
+def define_pixels(text t) =
+ forsuffixes $=t: $:=$.#*hppp; endfor enddef;
+def define_whole_pixels(text t) =
+ forsuffixes $=t: $:=hround($.#*hppp); endfor enddef;
+def define_whole_vertical_pixels(text t) =
+ forsuffixes $=t: $:=vround($.#*hppp); endfor enddef;
+def define_good_x_pixels(text t) =
+ forsuffixes $=t: $:=good.x($.#*hppp); endfor enddef;
+def define_good_y_pixels(text t) =
+ forsuffixes $=t: $:=good.y($.#*hppp); endfor enddef;
+def define_blacker_pixels(text t) =
+ forsuffixes $=t: $:=$.#*hppp+blacker; endfor enddef;
+def define_whole_blacker_pixels(text t) =
+ forsuffixes $=t: $:=hround($.#*hppp+blacker);
+ if $<=0: $:=1; fi endfor enddef;
+def define_whole_vertical_blacker_pixels(text t) =
+ forsuffixes $=t: $:=vround($.#*hppp+blacker);
+ if $<=0: $:=1_o_; fi endfor enddef;
+def define_corrected_pixels(text t) =
+ forsuffixes $=t: $:=vround($.#*hppp*o_correction)+eps; endfor enddef;
+def define_horizontal_corrected_pixels(text t) =
+ forsuffixes $=t: $:=hround($.#*hppp*o_correction)+eps; endfor enddef;
+
+def lowres_fix(text t) expr ratio =
+ begingroup save min,max,first;
+ forsuffixes $=t: if unknown min: min=max=first=$; min#=max#=$.#;
+ elseif $.#<min#: min:=$; min#:=$.#;
+ elseif $.#>max#: max:=$; max#:=$.#; fi endfor
+ if max/min>ratio*max#/min#: forsuffixes $=t: $:=first; endfor fi
+ endgroup enddef;
+
+message " macros and tables for various modes of operation,";
+
+def mode_setup =
+ warningcheck:=0;
+ if unknown mode: mode=proof; fi
+ numeric aspect_ratio; transform currenttransform;
+ scantokens if string mode:("input "&mode) else: mode_name[mode] fi;
+ if unknown mag: mag=1; fi
+ if unknown aspect_ratio: aspect_ratio=1; fi
+ displaying:=proofing;
+ pixels_per_inch:=pixels_per_inch*mag;
+ if aspect_ratio=1: let o_=\; let _o_=\
+ else: def o_=*aspect_ratio enddef; def _o_=/aspect_ratio enddef fi;
+ fix_units;
+ scantokens extra_setup; % the user's special last-minute adjustments
+ currenttransform:=
+ if unknown currenttransform: identity else: currenttransform fi
+ yscaled aspect_ratio;
+ clearit;
+ pickup pencircle scaled (.4pt+blacker);
+ warningcheck:=1; enddef;
+def smode = string mode; mode enddef;
+string extra_setup, mode_name[];
+extra_setup=""; % usually there's nothing special to do
+newinternal displaying; % if positive, endchar will `showit'
+
+vardef magstep primary m = mexp(46.67432m) enddef;
+
+def mode_def suffix $ =
+ $:=incr number_of_modes;
+ mode_name[$]:=str$ & "_";
+ expandafter quote def scantokens mode_name[$] enddef;
+newinternal number_of_modes;
+
+% proof mode: for initial design of characters
+mode_def proof =
+ proofing:=2; % yes, we're making full proofs
+ fontmaking:=1; % no, we're not making a font
+ tracingtitles:=1; % yes, show titles online
+ pixels_per_inch:=2601.72; % that's 36 pixels per pt
+ blacker:=0; % no additional blackness
+ fillin:=0; % no compensation for fillin
+ o_correction:=1; % no reduction in overshoot
+ enddef;
+
+% smoke mode: for label-free proofs to mount on the wall
+mode_def smoke =
+ proof_; % same as proof mode, except:
+ proofing:=1; % yes, we're making unlabeled proofs
+ extra_setup:=extra_setup&"grayfont black"; % with solid black pixels
+ let makebox=maketicks; % make the boxes less obtrusive
+ enddef;
+
+% lowres mode: for certain devices that print 200 pixels per inch
+mode_def lowres =
+ proofing:=0; % no, we're not making proofs
+ fontmaking:=1; % yes, we are making a font
+ tracingtitles:=1; % no, don't show titles at all
+ pixels_per_inch:=200; % that's the meaning of lowres
+ blacker:=.65; % make pens a bit blacker
+ fillin:=.2; % compensate for diagonal fillin
+ o_correction:=.4; % but don't overshoot as much
+ enddef;
+
+% mid mode: for certain devices that print 300 pixels per inch
+mode_def mid =
+ proofing:=0; % no, we're not making proofs
+ fontmaking:=1; % yes, we are making a font
+ tracingtitles:=1; % no, don't show titles at all
+ pixels_per_inch:=300; % Laser printer resolution
+ blacker:=.65; % make pens a bit blacker
+ fillin:=.2; % compensate for diagonal fillin
+ o_correction:=.4; % but don't overshoot as much
+ enddef;
+
+% sun mode: for SUN screen with 118 pixels_per_inch
+mode_def sun =
+ proofing:=0; % no, we're not making proofs
+ fontmaking:=1; % yes, we are making a font
+ tracingtitles:=1; % no, don't show titles at all
+ pixels_per_inch:=118; % Sun's screen resolution
+ blacker:=.65; % make pens a bit blacker
+ fillin:=.2; % compensate for diagonal fillin
+ o_correction:=.4; % but don't overshoot as much
+ enddef;
+
+localfont:=lowres; % the mode most commonly used to make fonts
+
+% It is customary to input another file to supplement the PLAIN base.
+% This supplementary file adds analogous modes, corresponding to
+% local output devices, and it redefines `localfont' as appropriate.
+% The values of screen_rows and screen_cols should also be updated.
+% The auxiliary file should set base_version:=base_version&"/localname".
+% Remember that the present file PLAIN.MF should not be changed;
+% all local changes should be confined to a separate file.
+
+message " macros for drawing and filling,";
+
+pen currentpen;
+path currentpen_path;
+picture currentpicture;
+transform currenttransform;
+def t_ = transformed currenttransform enddef;
+
+def fill expr c =
+%----------------
+month := -1;
+%----------------
+addto_currentpicture contour c.t_ enddef;
+def addto_currentpicture = addto currentpicture enddef;
+def draw expr p =
+ addto_currentpicture doublepath p.t_ withpen currentpen enddef;
+def filldraw expr c = fill counterclockwise c withpen currentpen enddef;
+def drawdot expr z = if unknown currentpen_path: def_pen_path_ fi
+ addto_currentpicture contour
+ currentpen_path shifted z.t_ withpen penspeck enddef;
+def def_pen_path_ =
+ hide(currentpen_path=tensepath makepath currentpen) enddef;
+
+def unfill expr c = fill c withweight _ enddef;
+def undraw expr p = draw p withweight _ enddef;
+def unfilldraw expr c = filldraw c withweight _ enddef;
+def undrawdot expr z = drawdot z withweight _ enddef;
+def erase text t =
+ begingroup
+ interim default_wt_:=_;
+ cullit; t withweight _; cullit; endgroup;
+% ----------------------------
+ year := -2 % visiting Erase
+%----------------------------
+enddef;
+newinternal default_wt_; default_wt_:=1;
+
+def cutdraw expr p =
+ cutoff(point 0 of p, 180+angle direction 0 of p);
+ cutoff(point infinity of p, angle direction infinity of p);
+ draw p enddef;
+vardef cutoff(expr z,theta) =
+ interim autorounding := 0; interim smoothing := 0;
+ addto pic_ doublepath z.t_ withpen currentpen;
+ addto pic_ contour
+ (cut_ scaled (1+max(pen_lft,pen_rt,pen_top,pen_bot))t_
+ rotated theta shifted z);
+ cull pic_ keeping (2,2) withweight -default_wt_;
+ addto currentpicture also pic_;
+ pic_:=nullpicture enddef;
+picture pic_; pic_:=nullpicture;
+path cut_; cut_ = ((0,_)--(1,_)--(1,1)--(0,1)--cycle) scaled 1.42;
+
+def pickup secondary q =
+ if numeric q: numeric_pickup_ else: pen_pickup_ fi q enddef;
+def numeric_pickup_ primary q =
+ if unknown pen_[q]: errmessage "Unknown pen"; clearpen
+ else: currentpen:=pen_[q];
+ pen_lft:=pen_lft_[q];
+ pen_rt:=pen_rt_[q];
+ pen_top:=pen_top_[q];
+ pen_bot:=pen_bot_[q];
+ currentpen_path:=pen_path_[q] fi; enddef;
+def pen_pickup_ primary q =
+ currentpen:=q yscaled aspect_ratio;
+ pen_lft:=xpart penoffset down of currentpen;
+ pen_rt:=xpart penoffset up of currentpen;
+ pen_top:=(ypart penoffset left of currentpen)_o_;
+ pen_bot:=(ypart penoffset right of currentpen)_o_;
+ path currentpen_path; enddef;
+newinternal pen_lft,pen_rt,pen_top,pen_bot,pen_count_;
+
+vardef savepen = pen_[incr pen_count_]=currentpen;
+ pen_lft_[pen_count_]=pen_lft;
+ pen_rt_[pen_count_]=pen_rt;
+ pen_top_[pen_count_]=pen_top;
+ pen_bot_[pen_count_]=pen_bot;
+ pen_path_[pen_count_]=currentpen_path;
+ pen_count_ enddef;
+
+def clearpen = currentpen:=nullpen;
+ pen_lft:=pen_rt:=pen_top:=pen_bot:=0;
+ path currentpen_path;
+ enddef;
+def clear_pen_memory =
+ pen_count_:=0;
+ numeric pen_lft_[],pen_rt_[],pen_top_[],pen_bot_[];
+ pen currentpen,pen_[];
+ path currentpen_path, pen_path_[];
+ enddef;
+
+vardef lft primary x = x + if pair x: (pen_lft,0) else: pen_lft fi enddef;
+vardef rt primary x = x + if pair x: (pen_rt,0) else: pen_rt fi enddef;
+vardef top primary y = y + if pair y: (0,pen_top) else: pen_top fi enddef;
+vardef bot primary y = y + if pair y: (0,pen_bot) else: pen_bot fi enddef;
+vardef good.x primary x = hround(x+pen_lft)-pen_lft enddef;
+vardef good.y primary y = vround(y+pen_top)-pen_top enddef;
+vardef good.lft primary z = save z_; pair z_;
+ (z_+(pen_lft,0))t_=round((z+(pen_lft,0))t_); z_ enddef;
+vardef good.rt primary z = save z_; pair z_;
+ (z_+(pen_rt,0))t_=round((z+(pen_rt,0))t_); z_ enddef;
+vardef good.top primary z = save z_; pair z_;
+ (z_+(pen_top,0))t_=round((z+(pen_top,0))t_); z_ enddef;
+vardef good.bot primary z = save z_; pair z_;
+ (z_+(pen_bot,0))t_=round((z+(pen_bot,0))t_); z_ enddef;
+
+vardef penpos@#(expr b,d) =
+ (x@#r-x@#l,y@#r-y@#l)=(b,0) rotated d;
+ x@#=.5(x@#l+x@#r); y@#=.5(y@#l+y@#r) enddef;
+
+def penstroke text t =
+ forsuffixes e = l,r: path_.e:=t; endfor
+ if cycle path_.l: cyclestroke_
+ else: fill path_.l -- reverse path_.r -- cycle fi enddef;
+def cyclestroke_ =
+ begingroup interim turningcheck:=0;
+ addto pic_ contour path_.l.t_ withweight 1;
+ addto pic_ contour path_.r.t_ withweight _;
+ cull pic_ dropping origin withweight default_wt_;
+ addto_currentpicture also pic_;
+ pic_:=nullpicture;
+%-----------------------------------------
+ year := -1; % visiting Cycle_stroke
+%-----------------------------------------
+ endgroup;
+enddef;
+path path_.l,path_.r;
+
+message " macros for proof labels and rules,";
+
+vardef makelabel@#(expr s,z) = % puts string s at point z
+ if known z: special lcode_@# & s;
+ numspecial xpart(z.t_); numspecial ypart(z.t_) fi enddef;
+string lcode_,lcode_.top,lcode_.lft,lcode_.rt,lcode_.bot,
+ lcode_.top.nodot,lcode_.lft.nodot,lcode_.rt.nodot,lcode_.bot.nodot;
+lcode_.top=" 1"; lcode_.lft=" 2"; lcode_.rt=" 3"; lcode_.bot=" 4";
+lcode_=" 0"; % change to " /" to avoid listing in overflow column
+lcode_.top.nodot=" 5"; lcode_.lft.nodot=" 6";
+lcode_.rt.nodot=" 7"; lcode_.bot.nodot=" 8";
+
+vardef labels@#(text t) =
+ if proofing>1: forsuffixes $=t:
+ makelabel@#(str$,z$); endfor
+ fi enddef;
+vardef penlabels@#(text t) =
+ if proofing>1: forsuffixes $$=l,,r: forsuffixes $=t:
+ makelabel@#(str$.$$,z$.$$); endfor endfor
+ fi enddef;
+
+def range expr x = numtok[x] enddef;
+def numtok suffix x=x enddef;
+tertiarydef m thru n =
+ m for x=m+1 step 1 until n: , numtok[x] endfor enddef;
+
+def proofrule(expr w,z) =
+ special "rule"; numspecial xpart w; numspecial ypart w;
+ numspecial xpart z; numspecial ypart z enddef;
+def screenrule(expr w,z) =
+ addto currentpicture doublepath w--z withpen rulepen enddef;
+pen rulepen; rulepen = pensquare scaled 2;
+
+def makegrid(text xlist,ylist) =
+% xmin_ := min(xlist); xmax_ := max(xlist);
+% ymin_ := min(ylist); ymax_ := max(ylist);
+% for x=xlist: proofrule((x,ymin_), (x,ymax_)); endfor
+% for y=ylist: proofrule((xmin_,y), (xmax_,y)); endfor
+ enddef;
+
+vardef titlefont suffix $ = special "titlefont "&str$ enddef;
+vardef labelfont suffix $ = special "labelfont "&str$ enddef;
+vardef grayfont suffix $ = special "grayfont "&str$ enddef;
+vardef slantfont suffix $ = special "slantfont "&str$ enddef;
+def proofoffset primary z = % shifts proof output by z
+ special "offset"; numspecial xpart z; numspecial ypart z enddef;
+vardef proofrulethickness expr x =
+ special "rulethickness"; numspecial x enddef;
+
+message " macros for character and font administration,";
+
+def beginchar(expr c,w_sharp,h_sharp,d_sharp) =
+ begingroup
+ charcode:=if known c: byte c else: 0 fi;
+ charwd:=w_sharp; charht:=h_sharp; chardp:=d_sharp;
+ w:=hround(charwd*hppp); h:=vround(charht*hppp); d:=vround(chardp*hppp);
+ charic:=0; clearxy; clearit; clearpen; scantokens extra_beginchar;
+ enddef;
+
+def italcorr expr x_sharp = if x_sharp>0: charic:=x_sharp fi enddef;
+
+def change_width =
+ w:=w if w>charwd*hppp:- else:+ fi 1 enddef;
+
+def endchar =
+ scantokens extra_endchar;
+ if proofing>0: makebox(proofrule); fi
+ chardx:=w; % desired width of the character in pixels
+ shipit;
+ if displaying>0: makebox(screenrule); showit; fi
+ endgroup enddef;
+
+string extra_beginchar, extra_endchar;
+extra_beginchar=extra_endchar="";
+
+def makebox(text r) =
+ for y=0,h.o_,-d.o_: r((0,y),(w,y)); endfor % horizontals
+ for x=0,w: r((x,-d.o_),(x,h.o_)); endfor % verticals
+ if charic<>0: r((w+charic*hppp,h.o_),(w+charic*hppp,.5h.o_)); fi
+ enddef;
+
+def maketicks(text r) =
+ for y=0,h.o_,-d.o_: r((0,y),(10,y)); r((w-10,y),(w,y)); endfor
+ for x=0,w: r((x,10-d.o_),(x,-d.o_)); r((x,h.o_-10),(x,h.o_)); endfor
+ if charic<>0: r((w+charic*hppp,h.o_-10),(w+charic*hppp,h.o_)); fi
+ enddef;
+
+def font_size expr x = designsize:=x enddef;
+def font_slant expr x = fontdimen 1: x enddef;
+def font_normal_space expr x = fontdimen 2: x enddef;
+def font_normal_stretch expr x = fontdimen 3: x enddef;
+def font_normal_shrink expr x = fontdimen 4: x enddef;
+def font_x_height expr x = fontdimen 5: x enddef;
+def font_quad expr x = fontdimen 6: x enddef;
+def font_extra_space expr x = fontdimen 7: x enddef;
+
+def font_identifier expr x = font_identifier_:=x enddef;
+def font_coding_scheme expr x = font_coding_scheme_:=x enddef;
+string font_identifier_, font_coding_scheme_;
+font_identifier_=font_coding_scheme_="UNSPECIFIED";
+
+message "and a few last-minute items.";
+
+vardef z@#=(x@#,y@#) enddef;
+
+newinternal screen_rows, screen_cols, currentwindow;
+screen_rows:=400; % these values should be corrected,
+screen_cols:=500; % by reading in a separate file after PLAIN.MF
+
+def openit = openwindow currentwindow
+ from origin to (screen_rows,screen_cols) at (-50,300) enddef;
+def showit = openit; let showit=showit_; showit enddef; % first time only
+def showit_ = display currentpicture inwindow currentwindow enddef;
+
+def clearxy = save x,y enddef;
+def clearit = currentpicture:=nullpicture enddef;
+def shipit = shipout currentpicture enddef;
+def cullit = cull currentpicture dropping (-infinity,0) enddef;
+
+def screenchars = % endchar should `showit'
+ extra_endchar:=extra_endchar&"showit;" enddef;
+def screenstrokes = % every stroke should `showit'
+ def addto_currentpicture text t=
+ addto currentpicture t; showit enddef; enddef;
+def imagerules = % a box should be part of the character image
+ extra_beginchar:=extra_beginchar & "makebox(screenrule);" enddef;
+def gfcorners = % `maketicks' should send rules to the GF file
+ extra_setup:=extra_setup & "let makebox=maketicks;proofing:=1;" enddef;
+def nodisplays = % endchar shouldn't `showit'
+ extra_setup:=extra_setup & "displaying:=0;" enddef;
+def notransforms = % currenttransform should not be used
+ let t_ = \ enddef;
+
+let bye = end; outer end,bye;
+
+clear_pen_memory; % initialize the `savepen' mechanism
+mode_setup; % establish proof mode as the default
+numeric mode,mag; % but leave mode and mag undefined
diff --git a/fonts/utilities/mf2ps/MFfonts/bases/myplain.tfm b/fonts/utilities/mf2ps/MFfonts/bases/myplain.tfm
new file mode 100644
index 0000000000..b7c73d6384
--- /dev/null
+++ b/fonts/utilities/mf2ps/MFfonts/bases/myplain.tfm
@@ -0,0 +1 @@
+ 
diff --git a/fonts/utilities/mf2ps/READ.ME b/fonts/utilities/mf2ps/READ.ME
new file mode 100644
index 0000000000..9455be68ea
--- /dev/null
+++ b/fonts/utilities/mf2ps/READ.ME
@@ -0,0 +1,37 @@
+It has come to my attention that our assumption that the MFlib that we had
+was the current standard is NOT true. The problem is that I am sitting here
+in Pittsburgh and cannot get to the machine in Israel with the original
+version. I will be back there in a week and a half (23 December) and will be
+back to Pittsburgh, where I can easily rebuild this archive only by 1
+February 1991. If someone has the correct mflib.a and would inform me where
+I can snarf it from, I will attempt to build the mf2ps here and if that
+works I will post it here.
+
+I am sorry to cause this inconvenience; this is a problem living in a place
+that does not quite get everything up to date and from which telnet and ftp
+are expensive propositions.
+******************************************************
+Note that mf2ps is built out of mf84 for the sun. It uses suntools. So it
+will not work directly on other machines. However, I suspect that by making
+the changes we made to mf84 modules to those on another machine, you will
+come up with an mf2ps for another machine.
+::::::::::::::
+doc
+::::::::::::::
+This directory contains the troff sources for the mf2ps paper
+Environment for Translating \f(LGMETAFONT\fP to PostSscript
+published in TUGboat 11:4, pages 525-541 at the end of 1990.
+
+::::::::::::::
+mf2ps
+::::::::::::::
+This directory contains almost all the modules to make mf2ps. This
+directory should be installed parallel to mf84 so that the includes will
+work.
+
+::::::::::::::
+MFfonts/bases
+::::::::::::::
+all the plain* files are the ones I used
+plain.base and other plain.* file were generated by
+inimf running on plain.mf
diff --git a/fonts/utilities/mf2ps/doc/Fig8.ps b/fonts/utilities/mf2ps/doc/Fig8.ps
new file mode 100644
index 0000000000..4f1f96813b
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/Fig8.ps
@@ -0,0 +1,287 @@
+%! Simon font
+%%BoundingBox: 0 -10 40 50
+%%Was: 0 -5 40 40
+%%Was: 0 0 40 40
+%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_letter_x
+(
+gsave
+initclip
+newpath
+0 0 M
+0 1000 L
+1000 1000 L
+1000 0 L
+0 0 L
+%new path
+ 192 488 M
+ 22 -2 44 -2 66 -2 c
+ 0 2 l
+ 28 0 54 0 82 2 c
+ -2 -2 l
+-148 0 l
+closepath
+%end path
+%erase
+%new path
+ 404 180 M
+ 146 0 l
+ -22 2 -44 2 -66 2 c
+ 0 -2 l
+-82 0 l
+closepath
+%end path
+%erase
+%new path
+ 410 488 M
+ 24 -2 48 -2 72 -2 c
+ 0 2 l
+ 20 0 38 0 58 2 c
+ -2 -2 l
+-130 0 l
+closepath
+%end path
+%erase
+%new path
+ 188 180 M
+ 128 0 l
+ -24 2 -48 2 -72 2 c
+ 0 -2 l
+-58 0 l
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 280 486 M
+ -2 2 -6 4 -8 4 c
+ 0 -2 l
+ -38 0 l
+ -2 0 -2 0 -4 -2 c
+ 0 -2 l
+ 2 0 l
+ 0 -4 l
+ 76 -100 154 -198 230 -298 c
+ 2 -2 6 -2 8 -2 c
+ 38 0 l
+ 2 0 2 0 4 2 c
+ 0 2 l
+ -2 0 l
+ 0 4 l
+ -76 100 -154 198 -230 298 c
+closepath
+%end path
+fill
+%new path
+ 230 180 M
+ 10 0 l
+ 6 0 12 2 16 6 c
+ 0 0 2 2 2 2 c
+ 80 100 160 198 238 298 c
+ 2 0 2 2 2 2 c
+ -2 0 l
+ 0 0 0 0 -2 2 c
+ -2 0 l
+ 0 -2 l
+ -6 0 l
+ -6 0 -12 -2 -16 -6 c
+ 0 0 -2 -2 -2 -2 c
+ -80 -100 -160 -198 -238 -298 c
+ -2 0 -2 -2 -2 -2 c
+closepath
+%end path
+fill
+%new path
+ 264 442 M
+ 24 0 l
+ -10 16 -22 32 -32 48 c
+ 0 -2 l
+ -66 0 l
+ 0 -22 l
+ 2 0 l
+ 16 0 34 0 46 -4 c
+ 6 -2 10 -6 16 -10 c
+ 2 -4 6 -8 10 -12 c
+closepath
+%end path
+fill
+%new path
+ 314 442 M
+ -2 2 -2 6 -2 8 c
+ 2 0 l
+ 0 4 0 6 4 10 c
+ 6 6 14 8 22 8 c
+ 0 22 l
+ -2 -2 l
+ -80 0 l
+ 10 -16 22 -32 32 -48 c
+ 0 2 l
+ 26 0 l
+closepath
+%end path
+fill
+%new path
+ 428 226 M
+ 2 -2 2 -6 2 -8 c
+ -2 0 l
+ 0 -4 0 -6 -4 -10 c
+ -6 -6 -14 -8 -22 -8 c
+ 0 -20 l
+ 82 0 l
+ -10 16 -22 32 -32 48 c
+ 0 -2 l
+-26 0 l
+closepath
+%end path
+fill
+%new path
+ 478 226 M
+ -24 0 l
+ 10 -16 22 -32 32 -46 c
+ 66 0 l
+ 0 22 l
+ -2 0 l
+ -16 0 -34 0 -46 4 c
+ -6 2 -10 6 -16 10 c
+ -2 4 -6 8 -10 12 c
+closepath
+%end path
+fill
+%new path
+ 422 422 M
+ 12 0 l
+ 16 22 32 46 48 68 c
+ -2 -2 l
+ -72 0 l
+ 0 -22 l
+ 2 0 l
+ 6 0 12 -2 16 -6 c
+ 2 -2 4 -6 4 -10 c
+ 2 -2 2 -4 2 -6 c
+ -2 0 l
+ 0 -8 -4 -18 -10 -24 c
+closepath
+%end path
+fill
+%new path
+ 446 422 M
+ 2 4 6 8 10 12 c
+ 8 8 20 16 32 22 c
+ 16 8 34 12 52 12 c
+ 0 22 l
+ -2 -2 l
+ -58 0 l
+ -16 -22 -32 -46 -48 -68 c
+ 2 2 l
+ 12 0 l
+closepath
+%end path
+fill
+%new path
+ 280 246 M
+ -2 -4 -6 -8 -10 -12 c
+ -8 -8 -20 -16 -32 -22 c
+ -16 -8 -34 -12 -52 -12 c
+ 0 -20 l
+ 60 0 l
+ 16 22 32 46 48 68 c
+ -2 -2 l
+-12 0 l
+closepath
+%end path
+fill
+%new path
+ 304 246 M
+ -12 0 l
+ -16 -22 -32 -46 -48 -66 c
+ 74 0 l
+ 0 22 l
+ -2 0 l
+ -6 0 -12 2 -16 6 c
+ -2 2 -4 6 -4 10 c
+ -2 2 -2 4 -2 6 c
+ 2 0 l
+ 0 8 4 18 10 24 c
+closepath
+%end path
+fill
+grestore
+) def
+
+end % of CharDefs dictionary
+
+Encoding 120 /The_letter_x put
+
+Metrics
+ begin
+/The_letter_x 367 fudge add def
+/.notdef 0 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /M {moveto} def
+ /L {lineto} def
+ /l {rlineto} def
+ /C {curveto} def
+ /c {rcurveto} def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+%was: 0 -180
+ 0 -200
+ charwdth 1000
+ setcachedevice
+ -186 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+%was: /FontBBox [186 fudge sub 180 552 490] def
+ /FontBBox [186 fudge sub 200 552 490] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 40 scalefont setfont
+ 0 0 moveto (x) show
diff --git a/fonts/utilities/mf2ps/doc/Makefile b/fonts/utilities/mf2ps/doc/Makefile
new file mode 100644
index 0000000000..dd388b5747
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/Makefile
@@ -0,0 +1,17 @@
+F=paper
+PAGES=
+QUEUE=
+/usr/users/dberry/.refsidx.ia: /usr/users/dberry/.refs
+ mkey /usr/users/dberry/.refs | inv -n /usr/users/dberry/.refsidx
+
+$F.ref: $F /usr/users/dberry/.refsidx.ia
+ refer -e -n -p /usr/users/dberry/.refsidx -sADT $F > $F.ref
+
+psroff: $F.ref
+ psfig $F.ref | tbl | eqn | psroff $(PAGES) -ILG -mXP -mpsfig
+
+$F.dt: $F.ref
+ psfig -d $F.ref | tbl | eqn | dtroff $(PAGES) -mXP -mpsfig > $F.dt
+
+$F.ps: $F.ref
+ psfig $F.ref | tbl | eqn | psroff $(PAGES) -ILG -mXP -mpsfig -t > $F.ps
diff --git a/fonts/utilities/mf2ps/doc/README b/fonts/utilities/mf2ps/doc/README
new file mode 100644
index 0000000000..813d51ae37
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/README
@@ -0,0 +1,10 @@
+This directory contains the troff sources for the mf2ps paper
+Environment for Translating \f(LGMETAFONT\fP to PostSscript
+published in TUGboat 11:4, pages 525-541 at the end of 1990.
+
+The refer database addressed by the makefile to make paper.ref from
+paper is too big to include here.. So I have left paper.ref here.
+Also you may not have the tmac.X macro package to run troff. So I have
+left paper.ps in PostScript form here
+To get the pieces of the paper, send paper.ps figure.pages.ps and
+the *.ps pages of the printsamples through your favorite PS printer.
diff --git a/fonts/utilities/mf2ps/doc/fig1.ps b/fonts/utilities/mf2ps/doc/fig1.ps
new file mode 100644
index 0000000000..07ee55dffa
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/fig1.ps
@@ -0,0 +1,29 @@
+%!
+%%Title: N
+%%Creator: fig2ps
+%%CreationDate: Fri Jul 6 08:19:03 1990
+%%For: dberry@cs24 (dberry,479C,4325,252027,@$CP037,shlomo,cs24,)
+%%Pages: 0
+%%BoundingBox: 0 -12 108 174
+%%Was: 0 0 108 162
+%%EndComments
+/$F2psDict 32 dict def $F2psDict begin $F2psDict /mtrx matrix put
+ end /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def %%EndProlog
+$F2psBegin
+1 setlinecap 1 setlinejoin
+-72 72 translate
+0.000000 162.000000 translate 0.900 -0.900 scale
+0.700 setlinewidth
+% Polyline
+newpath 179 79 moveto 199 79 lineto 199 259 lineto 179 259 lineto closepath gsave 0.000 setgray fill grestore stroke
+% Polyline
+newpath 159 219 moveto 179 219 lineto 179 239 lineto 159 239 lineto closepath gsave 0.000 setgray fill grestore stroke
+% Polyline
+newpath 139 179 moveto 159 179 lineto 159 219 lineto 139 219 lineto closepath gsave 0.000 setgray fill grestore stroke
+% Polyline
+newpath 119 139 moveto 139 139 lineto 139 179 lineto 119 179 lineto closepath gsave 0.000 setgray fill grestore stroke
+% Polyline
+newpath 99 99 moveto 119 99 lineto 119 139 lineto 99 139 lineto closepath gsave 0.000 setgray fill grestore stroke
+% Polyline
+newpath 79 79 moveto 99 79 lineto 99 259 lineto 79 259 lineto closepath gsave 0.000 setgray fill grestore stroke
+$F2psEnd
diff --git a/fonts/utilities/mf2ps/doc/fig10.ps b/fonts/utilities/mf2ps/doc/fig10.ps
new file mode 100644
index 0000000000..c4dedc6357
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/fig10.ps
@@ -0,0 +1,283 @@
+%! Simon font
+%%BoundingBox: 0 0 40 40
+%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_letter_x
+(
+gsave
+initclip
+newpath
+0 0 M
+0 1000 L
+1000 1000 L
+1000 0 L
+0 0 L
+%new path
+ 192 488 0.8 add M
+ 22 -2 0.8 add 44 -2 0.8 add 66 -2 0.8 add c
+ 0 2 0.8 add l
+ 28 0 0.8 add 54 0 0.8 add 82 2 0.8 add c
+ -2 -2 0.8 add l
+-148 0 l
+closepath
+%end path
+%erase
+%new path
+ 404 180 0.8 sub M
+ 146 0 0.8 sub l
+ -22 2 0.8 sub -44 2 0.8 sub -66 2 0.8 sub c
+ 0 -2 0.8 sub l
+-82 0 l
+closepath
+%end path
+%erase
+%new path
+ 410 488 0.8 add M
+ 24 -2 0.8 add 48 -2 0.8 add 72 -2 0.8 add c
+ 0 2 0.8 add l
+ 20 0 0.8 add 38 0 0.8 add 58 2 0.8 add c
+ -2 -2 0.8 add l
+-130 0 l
+closepath
+%end path
+%erase
+%new path
+ 188 180 0.8 sub M
+ 128 0 0.8 sub l
+ -24 2 0.8 sub -48 2 0.8 sub -72 2 0.8 sub c
+ 0 -2 0.8 sub l
+-58 0 l
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 280 486 M
+ -2 2 -6 4 -8 4 c
+ 0 -2 l
+ -38 0 l
+ -2 0 -2 0 -4 -2 c
+ 0 -2 l
+ 2 0 l
+ 0 -4 l
+ 76 -100 154 -198 230 -298 c
+ 2 -2 6 -2 8 -2 c
+ 38 0 l
+ 2 0 2 0 4 2 c
+ 0 2 l
+ -2 0 l
+ 0 4 l
+ -76 100 -154 198 -230 298 c
+closepath
+%end path
+fill
+%new path
+ 230 180 M
+ 10 0 l
+ 6 0 12 2 16 6 c
+ 0 0 2 2 2 2 c
+ 80 100 160 198 238 298 c
+ 2 0 2 2 2 2 c
+ -2 0 l
+ 0 0 0 0 -2 2 c
+ -2 0 l
+ 0 -2 l
+ -6 0 l
+ -6 0 -12 -2 -16 -6 c
+ 0 0 -2 -2 -2 -2 c
+ -80 -100 -160 -198 -238 -298 c
+ -2 0 -2 -2 -2 -2 c
+closepath
+%end path
+fill
+%new path
+ 264 442 M
+ 24 0 l
+ -10 16 -22 32 -32 48 c
+ 0 -2 l
+ -66 0 l
+ 0 -22 l
+ 2 0 l
+ 16 0 34 0 46 -4 c
+ 6 -2 10 -6 16 -10 c
+ 2 -4 6 -8 10 -12 c
+closepath
+%end path
+fill
+%new path
+ 314 442 M
+ -2 2 -2 6 -2 8 c
+ 2 0 l
+ 0 4 0 6 4 10 c
+ 6 6 14 8 22 8 c
+ 0 22 l
+ -2 -2 l
+ -80 0 l
+ 10 -16 22 -32 32 -48 c
+ 0 2 l
+ 26 0 l
+closepath
+%end path
+fill
+%new path
+ 428 226 M
+ 2 -2 2 -6 2 -8 c
+ -2 0 l
+ 0 -4 0 -6 -4 -10 c
+ -6 -6 -14 -8 -22 -8 c
+ 0 -20 l
+ 82 0 l
+ -10 16 -22 32 -32 48 c
+ 0 -2 l
+-26 0 l
+closepath
+%end path
+fill
+%new path
+ 478 226 M
+ -24 0 l
+ 10 -16 22 -32 32 -46 c
+ 66 0 l
+ 0 22 l
+ -2 0 l
+ -16 0 -34 0 -46 4 c
+ -6 2 -10 6 -16 10 c
+ -2 4 -6 8 -10 12 c
+closepath
+%end path
+fill
+%new path
+ 422 422 M
+ 12 0 l
+ 16 22 32 46 48 68 c
+ -2 -2 l
+ -72 0 l
+ 0 -22 l
+ 2 0 l
+ 6 0 12 -2 16 -6 c
+ 2 -2 4 -6 4 -10 c
+ 2 -2 2 -4 2 -6 c
+ -2 0 l
+ 0 -8 -4 -18 -10 -24 c
+closepath
+%end path
+fill
+%new path
+ 446 422 M
+ 2 4 6 8 10 12 c
+ 8 8 20 16 32 22 c
+ 16 8 34 12 52 12 c
+ 0 22 l
+ -2 -2 l
+ -58 0 l
+ -16 -22 -32 -46 -48 -68 c
+ 2 2 l
+ 12 0 l
+closepath
+%end path
+fill
+%new path
+ 280 246 M
+ -2 -4 -6 -8 -10 -12 c
+ -8 -8 -20 -16 -32 -22 c
+ -16 -8 -34 -12 -52 -12 c
+ 0 -20 l
+ 60 0 l
+ 16 22 32 46 48 68 c
+ -2 -2 l
+-12 0 l
+closepath
+%end path
+fill
+%new path
+ 304 246 M
+ -12 0 l
+ -16 -22 -32 -46 -48 -66 c
+ 74 0 l
+ 0 22 l
+ -2 0 l
+ -6 0 -12 2 -16 6 c
+ -2 2 -4 6 -4 10 c
+ -2 2 -2 4 -2 6 c
+ 2 0 l
+ 0 8 4 18 10 24 c
+closepath
+%end path
+fill
+grestore
+) def
+
+end % of CharDefs dictionary
+
+Encoding 120 /The_letter_x put
+
+Metrics
+ begin
+/The_letter_x 367 fudge add def
+/.notdef 0 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /M {moveto} def
+ /L {lineto} def
+ /l {rlineto} def
+ /C {curveto} def
+ /c {rcurveto} def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -186 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [186 fudge sub 180 552 490] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 40 scalefont setfont
+ 0 0 moveto (x) show
diff --git a/fonts/utilities/mf2ps/doc/fig2.ps b/fonts/utilities/mf2ps/doc/fig2.ps
new file mode 100644
index 0000000000..9e1e4a2721
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/fig2.ps
@@ -0,0 +1,138 @@
+%!
+%%Title: bezier
+%%Creator: fig2ps
+%%CreationDate: Fri Jul 6 08:19:07 1990
+%%For: dberry@cs24 (dberry,479C,4325,252027,@$CP037,shlomo,cs24,)
+%%Pages: 0
+%%BoundingBox: 0 0 205 419
+%%EndComments
+/$F2psDict 32 dict def $F2psDict begin $F2psDict /mtrx matrix put
+ /DrawEllipse { /endangle exch def /startangle exch def /yrad exch def /xrad exch def /y exch def /x exch def /savematrix mtrx currentmatrix def x y translate xrad yrad scale 0 0 1 startangle endangle arc savematrix setmatrix } def
+ /DrawSplineSection { /y3 exch def /x3 exch def /y2 exch def /x2 exch def /y1 exch def /x1 exch def /xa x1 x2 x1 sub 0.666667 mul add def /ya y1 y2 y1 sub 0.666667 mul add def /xb x3 x2 x3 sub 0.666667 mul add def /yb y3 y2 y3 sub 0.666667 mul add def x1 y1 lineto xa ya xb yb x3 y3 curveto } def
+ end /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def %%EndProlog
+$F2psBegin
+1 setlinecap 1 setlinejoin
+-77 80 translate
+0.000000 419.000000 translate 0.900 -0.900 scale
+0.700 setlinewidth
+% Ellipse
+newpath 299 434 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+% Ellipse
+newpath 259 354 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+% Ellipse
+newpath 199 394 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+% Ellipse
+newpath 179 474 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+% Ellipse
+newpath 159 534 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+% Ellipse
+newpath 99 474 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+% Ellipse
+newpath 119 387 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+ [1 3.200000] 0 setdash
+% Polyline
+newpath 99 199 moveto 179 119 lineto 239 299 lineto 299 199 lineto stroke
+stroke
+ [] 0 setdash
+% Open spline
+newpath 99.000 474.000 moveto 109.000 431.500 lineto
+ 109.000 431.500 119.000 389.000 139.000 461.500 DrawSplineSection
+ 139.000 461.500 159.000 534.000 169.000 504.000 DrawSplineSection
+ 169.000 504.000 179.000 474.000 189.000 434.000 DrawSplineSection
+ 189.000 434.000 199.000 394.000 229.000 374.000 DrawSplineSection
+ 229.000 374.000 259.000 354.000 279.000 394.000 DrawSplineSection
+ 299.000 434.000 lineto stroke
+% Open spline
+newpath 99.000 199.000 moveto 139.000 159.000 lineto
+ 139.000 159.000 179.000 119.000 209.000 209.000 DrawSplineSection
+ 209.000 209.000 239.000 299.000 269.000 249.000 DrawSplineSection
+ 299.000 199.000 lineto stroke
+/Times-Italic findfont 12.000 scalefont setfont
+299 184 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+304 189 moveto
+1 -1 scale
+(4)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+309 429 moveto
+1 -1 scale
+(7)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+269 349 moveto
+1 -1 scale
+(6)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+209 384 moveto
+1 -1 scale
+(5)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+159 554 moveto
+1 -1 scale
+(3)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+154 549 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+94 469 moveto
+1 -1 scale
+(1)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+89 464 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+130 379 moveto
+1 -1 scale
+(2)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+125 374 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+204 379 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+189 494 moveto
+1 -1 scale
+(4)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+184 489 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+304 424 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+264 344 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+99 179 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+104 184 moveto
+1 -1 scale
+(1)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+179 104 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+184 109 moveto
+1 -1 scale
+(2)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+239 314 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+244 319 moveto
+1 -1 scale
+(3)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+$F2psEnd
diff --git a/fonts/utilities/mf2ps/doc/fig4.ps b/fonts/utilities/mf2ps/doc/fig4.ps
new file mode 100644
index 0000000000..fd6a94666b
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/fig4.ps
@@ -0,0 +1,283 @@
+%! Simon font
+%%BoundingBox: 0 0 70 70
+%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_letter_Q
+(
+newpath
+%new path
+ 458 668 M
+ -38 0 -74 -18 -102 -44 c
+ -8 -8 -14 -18 -22 -26 c
+ -34 -52 -44 -114 -44 -176 c
+ 2 0 l
+ 0 -60 10 -122 44 -172 c
+ 8 -10 14 -18 22 -24 c
+ 28 -28 62 -46 102 -46 c
+ 0 2 l
+ 40 0 74 18 102 46 c
+ 8 6 14 14 22 24 c
+ 34 50 44 112 44 172 c
+ -2 0 l
+ 0 62 -10 124 -44 176 c
+ -8 8 -14 18 -22 26 c
+ -28 26 -64 44 -102 44 c
+closepath
+%end path
+%new path
+ 458 686 M
+ -60 0 -118 -26 -162 -68 c
+ -2 -4 -6 -6 -8 -10 c
+ -46 -50 -70 -118 -70 -186 c
+ 2 0 l
+ 0 -68 24 -134 70 -184 c
+ 2 -2 4 -4 8 -6 c
+ 42 -44 100 -68 162 -68 c
+ 0 2 l
+ 62 0 120 24 162 68 c
+ 4 2 6 4 8 6 c
+ 46 50 70 116 70 184 c
+ -2 0 l
+ 0 68 -24 136 -70 186 c
+ -2 4 -6 6 -8 10 c
+ -44 42 -102 68 -162 68 c
+closepath
+%end path
+%new path
+ 466 178 M
+ -2 2 l
+ -4 0 l
+ -6 0 -12 2 -16 4 c
+ 0 -2 l
+ 2 0 l
+ -6 2 -14 8 -18 12 c
+ -2 0 l
+ 6 -4 l
+ 0 0 l
+ -2 2 l
+ -6 6 -10 12 -12 20 c
+ 2 -4 l
+ -2 2 l
+ -2 4 -2 10 -2 16 c
+ 2 0 l
+ -2 2 l
+ 2 -2 l
+ -2 -6 l
+ 2 4 l
+ 0 6 0 12 2 18 c
+ 0 -2 l
+ -2 -2 l
+ 2 0 l
+ 2 8 6 16 12 22 c
+ 0 -2 l
+ -8 -4 l
+ 2 0 l
+ 2 2 l
+ 2 0 l
+ 4 6 12 10 18 12 c
+ -4 -2 l
+ 2 2 l
+ 4 2 10 2 16 2 c
+ -2 -2 l
+ 4 2 l
+ 2 2 l
+ -8 -4 l
+ -6 4 l
+ 4 -2 l
+ 2 -2 l
+ 2 0 l
+ 8 0 16 -2 22 -4 c
+ -2 2 l
+ -2 0 l
+ 10 -4 16 -8 22 -14 c
+ 0 2 l
+ 2 -2 l
+ -6 4 l
+ 0 0 l
+ 2 0 l
+ 8 -10 16 -24 20 -38 c
+ 0 2 l
+ -2 2 l
+ 2 0 l
+ 12 -38 14 -84 26 -122 c
+ -2 2 l
+ 2 -4 l
+ 6 -14 12 -28 22 -38 c
+ -2 2 l
+ 4 -4 l
+ 6 -6 14 -10 22 -14 c
+ 0 2 l
+ 2 -2 l
+ 2 0 l
+ 6 -2 14 -4 22 -4 c
+ 2 0 l
+ 0 2 l
+ 8 0 14 2 20 4 c
+ 0 -2 l
+ 2 2 l
+ 2 0 l
+ 8 4 16 8 24 16 c
+ -2 -2 l
+ 4 4 l
+ 10 10 18 26 24 42 c
+ 0 2 l
+ 2 2 l
+ 6 20 10 46 10 70 c
+ -2 4 l
+ -2 2 l
+ -4 2 l
+ -2 0 l
+ 0 -2 l
+ -2 0 l
+ 2 2 l
+ -4 -2 l
+ -2 -2 l
+ -2 -4 l
+ 0 -8 -2 -16 -4 -22 c
+ 2 0 l
+ 0 2 l
+ -4 -10 -10 -20 -18 -28 c
+ 0 0 l
+ 8 4 l
+ -4 0 l
+ -2 -2 l
+ -8 -8 -18 -14 -28 -18 c
+ 0 2 l
+ 2 0 l
+ -6 -2 -14 -4 -22 -4 c
+ -2 0 l
+ -4 -4 l
+ 8 4 l
+ 6 -4 l
+ -2 4 l
+ -4 0 l
+ 0 2 l
+ -8 0 -14 0 -20 2 c
+ 4 -2 l
+ -2 2 l
+ -10 4 -16 8 -24 14 c
+ -2 0 l
+ 6 -4 l
+ 2 -2 l
+ -2 2 l
+ 0 2 l
+ -34 34 -42 100 -74 134 c
+ 0 -2 l
+ -2 4 l
+ -2 0 l
+ -6 8 -14 12 -24 16 c
+ 2 -2 l
+ -4 2 l
+ -6 2 -14 4 -20 4 c
+ -2 0 l
+ 0 -2 l
+ -6 0 -12 0 -16 -2 c
+ -2 0 l
+ -2 -2 l
+ -6 -2 -14 -6 -18 -12 c
+ 0 2 l
+ -2 -4 l
+ -2 0 l
+ -6 -6 -10 -14 -12 -22 c
+ 0 -2 l
+ -2 0 l
+ -2 -6 -2 -12 -2 -18 c
+ 2 2 l
+ 0 -4 l
+ 0 -6 0 -12 2 -16 c
+ 0 -2 l
+ 2 -2 l
+ 2 -8 6 -14 12 -20 c
+ 2 -2 l
+ 2 0 l
+ 4 -4 12 -10 18 -12 c
+ 0 2 l
+ 2 -2 l
+ 2 0 l
+ 4 -2 10 -4 16 -4 c
+ -2 2 l
+ 6 0 l
+ 2 4 l
+ 2 2 l
+ 0 2 l
+ -2 4 l
+closepath
+%end path
+eofill
+) def
+
+end % of CharDefs dictionary
+
+Encoding 81 /The_letter_Q put
+Encoding 89 /The_letter_Y put
+
+Metrics
+ begin
+/The_letter_Q 527 fudge add def
+/The_letter_Y 525 fudge add def
+/.notdef 400 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /M {moveto} def
+ /L {lineto} def
+ /l {rlineto} def
+ /C {curveto} def
+ /c {rcurveto} def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -178 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [178 fudge sub 40 704 688] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 70 scalefont setfont
+ 0 0 moveto (Q) show
diff --git a/fonts/utilities/mf2ps/doc/fig5.ps b/fonts/utilities/mf2ps/doc/fig5.ps
new file mode 100644
index 0000000000..bb868ba57c
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/fig5.ps
@@ -0,0 +1,236 @@
+%! Simon font
+%%BoundingBox: 0 0 70 70
+%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_letter_Y
+(
+gsave
+initclip
+newpath
+0 0 M
+0 1000 L
+1000 1000 L
+1000 0 L
+0 0 L
+%new path
+ 180 670 0.5 add M
+ 28 -2 0.5 add 58 -2 0.5 add 88 -2 0.5 add c
+ 0 2 0.5 add l
+ 38 0 0.5 add 74 0 0.5 add 110 2 0.5 add c
+ -2 -2 0.5 add l
+-198 0 l
+closepath
+%end path
+%erase
+%new path
+ 550 670 0.5 add M
+ 28 -2 0.5 add 56 -2 0.5 add 84 -2 0.5 add c
+ 0 2 0.5 add l
+ 24 0 0.5 add 46 0 0.5 add 68 2 0.5 add c
+ -2 -2 0.5 add l
+-152 0 l
+closepath
+%end path
+%erase
+%new path
+ 334 180 0.5 sub M
+ 208 0 0.5 sub l
+ -34 2 0.5 sub -70 2 0.5 sub -104 2 0.5 sub c
+ 0 -2 0.5 sub l
+-106 0 l
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 462 406 M
+ 54 86 106 172 160 258 c
+ 0 2 2 2 2 4 c
+ 4 2 8 4 12 4 c
+ 8 0 l
+ 0 -2 l
+ 0 0 2 0 2 -2 c
+ 2 0 2 -2 2 -4 c
+ -2 0 l
+ 0 -2 l
+ -60 -96 -118 -192 -178 -288 c
+ 0 -188 l
+ 0 -2 0 -4 -2 -6 c
+ -52 0 l
+ -2 0 -4 0 -6 2 c
+ -2 2 -2 4 -2 6 c
+ 2 0 l
+ 0 188 l
+ -2 0 l
+ -58 96 -118 192 -176 288 c
+ 0 2 l
+ 2 0 l
+ 0 2 0 4 2 4 c
+ 0 2 2 2 2 2 c
+ 54 0 l
+ 0 -2 l
+ 6 0 10 -2 12 -4 c
+ 2 -2 2 -2 4 -4 c
+ 52 -86 104 -172 156 -258 c
+closepath
+%end path
+%new path
+ 256 624 M
+ 36 0 l
+ -8 16 -18 32 -26 48 c
+ 0 -2 l
+ -88 0 l
+ 0 -22 l
+ 2 0 l
+ 16 0 40 0 54 -4 c
+ 4 -2 10 -6 14 -10 c
+ 2 -4 6 -8 8 -12 c
+closepath
+%end path
+%new path
+ 328 624 M
+ -2 2 -2 6 -2 8 c
+ 2 0 l
+ 0 4 0 8 2 10 c
+ 2 0 2 0 4 2 c
+ 12 6 28 6 44 6 c
+ 0 22 l
+ -2 -2 l
+ -108 0 l
+ 8 -16 18 -32 26 -48 c
+ 0 2 l
+ 36 0 l
+closepath
+%end path
+%new path
+ 584 604 M
+ 14 0 l
+ 12 22 24 46 36 68 c
+ -2 -2 l
+ -84 0 l
+ 0 -22 l
+ 2 0 l
+ 12 0 24 -2 32 -10 c
+ 2 -2 2 -2 4 -4 c
+ 2 -4 4 -8 4 -14 c
+ -2 0 l
+ 0 -6 -2 -12 -6 -18 c
+closepath
+%end path
+%new path
+ 610 604 M
+ 4 6 10 12 14 18 c
+ 8 6 14 12 24 16 c
+ 16 8 34 12 54 12 c
+ 0 22 l
+ -2 -2 l
+ -68 0 l
+ -12 -22 -24 -46 -36 -68 c
+ 2 2 l
+ 12 0 l
+closepath
+%end path
+%new path
+ 406 226 M
+ 0 -6 -2 -14 -6 -18 c
+ -2 -2 -4 -2 -6 -4 c
+ -12 -4 -42 -4 -62 -4 c
+ 0 -20 l
+ 108 0 l
+ 0 48 l
+ -2 -2 l
+-32 0 l
+closepath
+%end path
+%new path
+ 468 226 M
+ -30 0 l
+ 0 -46 l
+ 106 0 l
+ 0 22 l
+ -2 0 l
+ -20 0 -50 0 -62 4 c
+ -2 2 -4 2 -6 4 c
+ -4 4 -6 12 -6 18 c
+closepath
+%end path
+fill
+grestore
+) def
+
+end % of CharDefs dictionary
+
+Encoding 81 /The_letter_Q put
+Encoding 89 /The_letter_Y put
+
+Metrics
+ begin
+/The_letter_Q 527 fudge add def
+/The_letter_Y 525 fudge add def
+/.notdef 400 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /M {moveto} def
+ /L {lineto} def
+ /l {rlineto} def
+ /C {curveto} def
+ /c {rcurveto} def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -178 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [178 fudge sub 40 704 688] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 70 scalefont setfont
+ 0 0 moveto (Y) show
diff --git a/fonts/utilities/mf2ps/doc/fig6.ps b/fonts/utilities/mf2ps/doc/fig6.ps
new file mode 100644
index 0000000000..a2c6f548c8
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/fig6.ps
@@ -0,0 +1,30 @@
+%!
+%%Title: O
+%%Creator: fig2ps
+%%CreationDate: Fri Jul 6 08:19:06 1990
+%%For: dberry@cs24 (dberry,479C,4325,252027,@$CP037,shlomo,cs24,)
+%%Pages: 0
+%%BoundingBox: 0 -12 217 234
+%%Was: 0 0 217 222
+%%EndComments
+/$F2psDict 32 dict def $F2psDict begin $F2psDict /mtrx matrix put
+ /DrawEllipse { /endangle exch def /startangle exch def /yrad exch def /xrad exch def /y exch def /x exch def /savematrix mtrx currentmatrix def x y translate xrad yrad scale 0 0 1 startangle endangle arc savematrix setmatrix } def
+ end /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def %%EndProlog
+$F2psBegin
+1 setlinecap 1 setlinejoin
+-71 68 translate
+0.000000 222.000000 translate 0.900 -0.900 scale
+0.700 setlinewidth
+% Ellipse
+newpath 199 199 121 121 0 360 DrawEllipse gsave 0.750 setgray fill grestore stroke
+% Ellipse
+newpath 199 199 61 61 0 360 DrawEllipse gsave 1.000 setgray fill grestore stroke
+% Polyline
+newpath 189 316 moveto 217 319 lineto 189 322 lineto 189 316 lineto closepath gsave 0.000 setgray fill grestore stroke
+% Polyline
+newpath 210 262 moveto 186 259 lineto 210 256 lineto 210 262 lineto closepath gsave 0.000 setgray fill grestore stroke
+% Polyline
+newpath 188 137 moveto 212 139 lineto 188 143 lineto 188 137 lineto closepath gsave 0.000 setgray fill grestore stroke
+% Polyline
+newpath 210 82 moveto 182 79 lineto 210 75 lineto 210 82 lineto closepath gsave 0.000 setgray fill grestore stroke
+$F2psEnd
diff --git a/fonts/utilities/mf2ps/doc/fig7.ps b/fonts/utilities/mf2ps/doc/fig7.ps
new file mode 100644
index 0000000000..7681203441
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/fig7.ps
@@ -0,0 +1,447 @@
+%! Simon font
+%%BoundingBox: 0 0 158 70
+%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_letter_Q
+(
+newpath
+%new path
+ 458 668 M
+ -38 0 -74 -18 -102 -44 c
+ -8 -8 -14 -18 -22 -26 c
+ -34 -52 -44 -114 -44 -176 c
+ 2 0 l
+ 0 -60 10 -122 44 -172 c
+ 8 -10 14 -18 22 -24 c
+ 28 -28 62 -46 102 -46 c
+ 0 2 l
+ 40 0 74 18 102 46 c
+ 8 6 14 14 22 24 c
+ 34 50 44 112 44 172 c
+ -2 0 l
+ 0 62 -10 124 -44 176 c
+ -8 8 -14 18 -22 26 c
+ -28 26 -64 44 -102 44 c
+closepath
+%end path
+%new path
+ 458 686 M
+ -60 0 -118 -26 -162 -68 c
+ -2 -4 -6 -6 -8 -10 c
+ -46 -50 -70 -118 -70 -186 c
+ 2 0 l
+ 0 -68 24 -134 70 -184 c
+ 2 -2 4 -4 8 -6 c
+ 42 -44 100 -68 162 -68 c
+ 0 2 l
+ 62 0 120 24 162 68 c
+ 4 2 6 4 8 6 c
+ 46 50 70 116 70 184 c
+ -2 0 l
+ 0 68 -24 136 -70 186 c
+ -2 4 -6 6 -8 10 c
+ -44 42 -102 68 -162 68 c
+closepath
+%end path
+eofill
+%new path
+ 466 178 M
+ -2 2 l
+ -4 0 l
+ -6 0 -12 2 -16 4 c
+ 0 -2 l
+ 2 0 l
+ -6 2 -14 8 -18 12 c
+ -2 0 l
+ 6 -4 l
+ 0 0 l
+ -2 2 l
+ -6 6 -10 12 -12 20 c
+ 2 -4 l
+ -2 2 l
+ -2 4 -2 10 -2 16 c
+ 2 0 l
+ -2 2 l
+ 2 -2 l
+ -2 -6 l
+ 2 4 l
+ 0 6 0 12 2 18 c
+ 0 -2 l
+ -2 -2 l
+ 2 0 l
+ 2 8 6 16 12 22 c
+ 0 -2 l
+ -8 -4 l
+ 2 0 l
+ 2 2 l
+ 2 0 l
+ 4 6 12 10 18 12 c
+ -4 -2 l
+ 2 2 l
+ 4 2 10 2 16 2 c
+ -2 -2 l
+ 4 2 l
+ 2 2 l
+ -8 -4 l
+ -6 4 l
+ 4 -2 l
+ 2 -2 l
+ 2 0 l
+ 8 0 16 -2 22 -4 c
+ -2 2 l
+ -2 0 l
+ 10 -4 16 -8 22 -14 c
+ 0 2 l
+ 2 -2 l
+ -6 4 l
+ 0 0 l
+ 2 0 l
+ 8 -10 16 -24 20 -38 c
+ 0 2 l
+ -2 2 l
+ 2 0 l
+ 12 -38 14 -84 26 -122 c
+ -2 2 l
+ 2 -4 l
+ 6 -14 12 -28 22 -38 c
+ -2 2 l
+ 4 -4 l
+ 6 -6 14 -10 22 -14 c
+ 0 2 l
+ 2 -2 l
+ 2 0 l
+ 6 -2 14 -4 22 -4 c
+ 2 0 l
+ 0 2 l
+ 8 0 14 2 20 4 c
+ 0 -2 l
+ 2 2 l
+ 2 0 l
+ 8 4 16 8 24 16 c
+ -2 -2 l
+ 4 4 l
+ 10 10 18 26 24 42 c
+ 0 2 l
+ 2 2 l
+ 6 20 10 46 10 70 c
+ -2 4 l
+ -2 2 l
+ -4 2 l
+ -2 0 l
+ 0 -2 l
+ -2 0 l
+ 2 2 l
+ -4 -2 l
+ -2 -2 l
+ -2 -4 l
+ 0 -8 -2 -16 -4 -22 c
+ 2 0 l
+ 0 2 l
+ -4 -10 -10 -20 -18 -28 c
+ 0 0 l
+ 8 4 l
+ -4 0 l
+ -2 -2 l
+ -8 -8 -18 -14 -28 -18 c
+ 0 2 l
+ 2 0 l
+ -6 -2 -14 -4 -22 -4 c
+ -2 0 l
+ -4 -4 l
+ 8 4 l
+ 6 -4 l
+ -2 4 l
+ -4 0 l
+ 0 2 l
+ -8 0 -14 0 -20 2 c
+ 4 -2 l
+ -2 2 l
+ -10 4 -16 8 -24 14 c
+ -2 0 l
+ 6 -4 l
+ 2 -2 l
+ -2 2 l
+ 0 2 l
+ -34 34 -42 100 -74 134 c
+ 0 -2 l
+ -2 4 l
+ -2 0 l
+ -6 8 -14 12 -24 16 c
+ 2 -2 l
+ -4 2 l
+ -6 2 -14 4 -20 4 c
+ -2 0 l
+ 0 -2 l
+ -6 0 -12 0 -16 -2 c
+ -2 0 l
+ -2 -2 l
+ -6 -2 -14 -6 -18 -12 c
+ 0 2 l
+ -2 -4 l
+ -2 0 l
+ -6 -6 -10 -14 -12 -22 c
+ 0 -2 l
+ -2 0 l
+ -2 -6 -2 -12 -2 -18 c
+ 2 2 l
+ 0 -4 l
+ 0 -6 0 -12 2 -16 c
+ 0 -2 l
+ 2 -2 l
+ 2 -8 6 -14 12 -20 c
+ 2 -2 l
+ 2 0 l
+ 4 -4 12 -10 18 -12 c
+ 0 2 l
+ 2 -2 l
+ 2 0 l
+ 4 -2 10 -4 16 -4 c
+ -2 2 l
+ 6 0 l
+ 2 4 l
+ 2 2 l
+ 0 2 l
+ -2 4 l
+closepath
+%end path
+fill
+) def
+
+/The_letter_Y
+(
+gsave
+initclip
+newpath
+0 0 M
+0 1000 L
+1000 1000 L
+1000 0 L
+0 0 L
+%new path
+ 180 670 0.8 add M
+ 28 -2 0.8 add 58 -2 0.8 add 88 -2 0.8 add c
+ 0 2 0.8 add l
+ 38 0 0.8 add 74 0 0.8 add 110 2 0.8 add c
+ -2 -2 0.8 add l
+-198 0 l
+closepath
+%end path
+%erase
+%new path
+ 550 670 0.8 add M
+ 28 -2 0.8 add 56 -2 0.8 add 84 -2 0.8 add c
+ 0 2 0.8 add l
+ 24 0 0.8 add 46 0 0.8 add 68 2 0.8 add c
+ -2 -2 0.8 add l
+-152 0 l
+closepath
+%end path
+%erase
+%new path
+ 334 180 0.8 sub M
+ 208 0 0.8 sub l
+ -34 2 0.8 sub -70 2 0.8 sub -104 2 0.8 sub c
+ 0 -2 0.8 sub l
+-106 0 l
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 462 406 M
+ 54 86 106 172 160 258 c
+ 0 2 2 2 2 4 c
+ 4 2 8 4 12 4 c
+ 8 0 l
+ 0 -2 l
+ 0 0 2 0 2 -2 c
+ 2 0 2 -2 2 -4 c
+ -2 0 l
+ 0 -2 l
+ -60 -96 -118 -192 -178 -288 c
+ 0 -188 l
+ 0 -2 0 -4 -2 -6 c
+ -52 0 l
+ -2 0 -4 0 -6 2 c
+ -2 2 -2 4 -2 6 c
+ 2 0 l
+ 0 188 l
+ -2 0 l
+ -58 96 -118 192 -176 288 c
+ 0 2 l
+ 2 0 l
+ 0 2 0 4 2 4 c
+ 0 2 2 2 2 2 c
+ 54 0 l
+ 0 -2 l
+ 6 0 10 -2 12 -4 c
+ 2 -2 2 -2 4 -4 c
+ 52 -86 104 -172 156 -258 c
+closepath
+%end path
+fill
+%new path
+ 256 624 M
+ 36 0 l
+ -8 16 -18 32 -26 48 c
+ 0 -2 l
+ -88 0 l
+ 0 -22 l
+ 2 0 l
+ 16 0 40 0 54 -4 c
+ 4 -2 10 -6 14 -10 c
+ 2 -4 6 -8 8 -12 c
+closepath
+%end path
+fill
+%new path
+ 328 624 M
+ -2 2 -2 6 -2 8 c
+ 2 0 l
+ 0 4 0 8 2 10 c
+ 2 0 2 0 4 2 c
+ 12 6 28 6 44 6 c
+ 0 22 l
+ -2 -2 l
+ -108 0 l
+ 8 -16 18 -32 26 -48 c
+ 0 2 l
+ 36 0 l
+closepath
+%end path
+fill
+%new path
+ 584 604 M
+ 14 0 l
+ 12 22 24 46 36 68 c
+ -2 -2 l
+ -84 0 l
+ 0 -22 l
+ 2 0 l
+ 12 0 24 -2 32 -10 c
+ 2 -2 2 -2 4 -4 c
+ 2 -4 4 -8 4 -14 c
+ -2 0 l
+ 0 -6 -2 -12 -6 -18 c
+closepath
+%end path
+fill
+%new path
+ 610 604 M
+ 4 6 10 12 14 18 c
+ 8 6 14 12 24 16 c
+ 16 8 34 12 54 12 c
+ 0 22 l
+ -2 -2 l
+ -68 0 l
+ -12 -22 -24 -46 -36 -68 c
+ 2 2 l
+ 12 0 l
+closepath
+%end path
+fill
+%new path
+ 406 226 M
+ 0 -6 -2 -14 -6 -18 c
+ -2 -2 -4 -2 -6 -4 c
+ -12 -4 -42 -4 -62 -4 c
+ 0 -20 l
+ 108 0 l
+ 0 48 l
+ -2 -2 l
+-32 0 l
+closepath
+%end path
+fill
+%new path
+ 468 226 M
+ -30 0 l
+ 0 -46 l
+ 106 0 l
+ 0 22 l
+ -2 0 l
+ -20 0 -50 0 -62 4 c
+ -2 2 -4 2 -6 4 c
+ -4 4 -6 12 -6 18 c
+closepath
+%end path
+fill
+grestore
+) def
+
+end % of CharDefs dictionary
+
+Encoding 81 /The_letter_Q put
+Encoding 89 /The_letter_Y put
+
+Metrics
+ begin
+/The_letter_Q 527 fudge add def
+/The_letter_Y 525 fudge add def
+/.notdef 400 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /M {moveto} def
+ /L {lineto} def
+ /l {rlineto} def
+ /C {curveto} def
+ /c {rcurveto} def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -178 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [178 fudge sub 40 704 688] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 70 scalefont setfont
+ 0 0 moveto (Q Y) show
diff --git a/fonts/utilities/mf2ps/doc/fig8.ps b/fonts/utilities/mf2ps/doc/fig8.ps
new file mode 100644
index 0000000000..7ece37f42a
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/fig8.ps
@@ -0,0 +1,292 @@
+%! Simon font
+%%BoundingBox: 0 0 40 40
+%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_letter_x
+(
+gsave
+initclip
+newpath
+0 0 M
+0 1000 L
+1000 1000 L
+1000 0 L
+0 0 L
+%new path
+ 192 488 M
+ 22 -2 44 -2 66 -2 c
+ 0 2 l
+ 28 0 54 0 82 2 c
+ -2 -2 l
+-148 0 l
+closepath
+%end path
+%erase
+%new path
+ 404 180 M
+ 146 0 l
+ -22 2 -44 2 -66 2 c
+ 0 -2 l
+-82 0 l
+closepath
+%end path
+%erase
+%new path
+ 410 488 M
+ 24 -2 48 -2 72 -2 c
+ 0 2 l
+ 20 0 38 0 58 2 c
+ -2 -2 l
+-130 0 l
+closepath
+%end path
+%erase
+%new path
+ 188 180 M
+ 128 0 l
+ -24 2 -48 2 -72 2 c
+ 0 -2 l
+-58 0 l
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 280 486 M
+ -2 2 -6 4 -8 4 c
+ 0 -2 l
+ -38 0 l
+ -2 0 -2 0 -4 -2 c
+ 0 -2 l
+ 2 0 l
+ 0 -4 l
+ 76 -100 154 -198 230 -298 c
+ 2 -2 6 -2 8 -2 c
+ 38 0 l
+ 2 0 2 0 4 2 c
+ 0 2 l
+ -2 0 l
+ 0 4 l
+ -76 100 -154 198 -230 298 c
+closepath
+%end path
+fill
+%new path
+ 230 180 M
+ 10 0 l
+ 6 0 12 2 16 6 c
+ 0 0 2 2 2 2 c
+ 80 100 160 198 238 298 c
+ 2 0 2 2 2 2 c
+ -2 0 l
+ 0 0 0 0 -2 2 c
+ -2 0 l
+ 0 -2 l
+ -6 0 l
+ -6 0 -12 -2 -16 -6 c
+ 0 0 -2 -2 -2 -2 c
+ -80 -100 -160 -198 -238 -298 c
+ -2 0 -2 -2 -2 -2 c
+closepath
+%end path
+fill
+%new path
+ 264 442 M
+ 24 0 l
+ -10 16 -22 32 -32 48 c
+ 0 -2 l
+ -66 0 l
+ 0 -22 l
+ 2 0 l
+ 16 0 34 0 46 -4 c
+ 6 -2 10 -6 16 -10 c
+ 2 -4 6 -8 10 -12 c
+closepath
+%end path
+fill
+%new path
+ 314 442 M
+ -2 2 -2 6 -2 8 c
+ 2 0 l
+ 0 4 0 6 4 10 c
+ 6 6 14 8 22 8 c
+ 0 22 l
+ -2 -2 l
+ -80 0 l
+ 10 -16 22 -32 32 -48 c
+ 0 2 l
+ 26 0 l
+closepath
+%end path
+fill
+%new path
+ 428 226 M
+ 2 -2 2 -6 2 -8 c
+ -2 0 l
+ 0 -4 0 -6 -4 -10 c
+ -6 -6 -14 -8 -22 -8 c
+ 0 -20 l
+ 82 0 l
+ -10 16 -22 32 -32 48 c
+ 0 -2 l
+-26 0 l
+closepath
+%end path
+fill
+%new path
+ 478 226 M
+ -24 0 l
+ 10 -16 22 -32 32 -46 c
+ 66 0 l
+ 0 22 l
+ -2 0 l
+ -16 0 -34 0 -46 4 c
+ -6 2 -10 6 -16 10 c
+ -2 4 -6 8 -10 12 c
+closepath
+%end path
+fill
+%new path
+ 422 422 M
+ 12 0 l
+ 16 22 32 46 48 68 c
+ -2 -2 l
+ -72 0 l
+ 0 -22 l
+ 2 0 l
+ 6 0 12 -2 16 -6 c
+ 2 -2 4 -6 4 -10 c
+ 2 -2 2 -4 2 -6 c
+ -2 0 l
+ 0 -8 -4 -18 -10 -24 c
+closepath
+%end path
+fill
+%new path
+ 446 422 M
+ 2 4 6 8 10 12 c
+ 8 8 20 16 32 22 c
+ 16 8 34 12 52 12 c
+ 0 22 l
+ -2 -2 l
+ -58 0 l
+ -16 -22 -32 -46 -48 -68 c
+ 2 2 l
+ 12 0 l
+closepath
+%end path
+fill
+%new path
+ 280 246 M
+ -2 -4 -6 -8 -10 -12 c
+ -8 -8 -20 -16 -32 -22 c
+ -16 -8 -34 -12 -52 -12 c
+ 0 -20 l
+ 60 0 l
+ 16 22 32 46 48 68 c
+ -2 -2 l
+-12 0 l
+closepath
+%end path
+fill
+%new path
+ 304 246 M
+ -12 0 l
+ -16 -22 -32 -46 -48 -66 c
+ 74 0 l
+ 0 22 l
+ -2 0 l
+ -6 0 -12 2 -16 6 c
+ -2 2 -4 6 -4 10 c
+ -2 2 -2 4 -2 6 c
+ 2 0 l
+ 0 8 4 18 10 24 c
+closepath
+%end path
+fill
+%for fake line
+newpath
+160 180 M
+360 0 l
+0 .5 l
+-360 0 l
+0 -.5 l
+closepath
+fill
+grestore
+) def
+
+end % of CharDefs dictionary
+
+Encoding 120 /The_letter_x put
+
+Metrics
+ begin
+/The_letter_x 367 fudge add def
+/.notdef 0 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /M {moveto} def
+ /L {lineto} def
+ /l {rlineto} def
+ /C {curveto} def
+ /c {rcurveto} def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -186 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [186 fudge sub 180 552 490] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 40 scalefont setfont
+ 0 0 moveto (x) show
diff --git a/fonts/utilities/mf2ps/doc/fig9.ps b/fonts/utilities/mf2ps/doc/fig9.ps
new file mode 100644
index 0000000000..f2934f6579
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/fig9.ps
@@ -0,0 +1,114 @@
+%! Simon font
+%%BoundingBox: 0 0 40 52
+%%Was: 0 0 40 40
+%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_square
+(
+ gsave
+ initclip
+ newpath
+
+ 0 0 moveto
+ 0 1000 lineto
+ 1000 1000 lineto
+ 1000 0 lineto
+ 0 0 lineto
+
+ 300 100 moveto
+ 700 100 lineto
+ 700 300 lineto
+ 300 300 lineto
+ 300 100 lineto
+
+ 700 900 moveto
+ 300 900 lineto
+ 300 700 lineto
+ 700 700 lineto
+ 700 900 lineto
+
+ eoclip
+
+ newpath
+ 100 100 moveto
+ 900 100 lineto
+ 900 900 lineto
+ 100 900 lineto
+ 100 100 lineto
+ fill
+ grestore
+) def
+
+end % of CharDefs dictionary
+
+Encoding 120 /The_square put
+
+Metrics
+ begin
+/The_square 1000 fudge add def
+/.notdef 0 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /M {moveto} def
+ /L {lineto} def
+ /l {rlineto} def
+ /C {curveto} def
+ /c {rcurveto} def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -186 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [186 fudge sub 180 552 490] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 40 scalefont setfont
+ 0 0 moveto (x) show
diff --git a/fonts/utilities/mf2ps/doc/figure.pages b/fonts/utilities/mf2ps/doc/figure.pages
new file mode 100644
index 0000000000..107f981e65
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/figure.pages
@@ -0,0 +1,89 @@
+.en
+.pl 11.125i
+.LL 6.5i
+.ls 1
+.ds BL ''%''
+.hy 14
+\
+.sp 8.25i
+.ce
+Figure 3
+.bp
+.ta .2i +.2i
+.nf
+R M \07:
+ 10:
+ 12:
+
+ P \07:
+ 10:
+ 12:
+
+T M \08:
+ 10:
+ 12:
+
+ P \08:
+ 10:
+ 12:
+
+L M 10:
+
+ P 10:
+.fi
+.sp 2
+.ce
+Figure 11-LW300
+.sp 3
+.nf
+R M 10:
+ 12:
+
+ P 10:
+ 12:
+
+T M 10:
+ 12:
+
+ P 10:
+ 12:
+
+L M 10:
+
+ P 10:
+.fi
+.sp 2
+.ce
+Figure 11-VT600
+.bp
+.nf
+R M 10:
+ 12:
+
+ P 10:
+ 12:
+
+T M 10:
+ 12:
+
+ P 10:
+ 12:
+
+L M 10:
+
+ P 10:
+.fi
+.sp 2
+.ce
+Figure 11-LT1270
+.sp 2
+.nf
+LW300:
+.sp 8v
+VT600:
+.sp 8v
+LT1270:
+.sp 8v
+.sp
+.ce
+Figure 12
diff --git a/fonts/utilities/mf2ps/doc/figure.pages.ps b/fonts/utilities/mf2ps/doc/figure.pages.ps
new file mode 100644
index 0000000000..57a0330a5d
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/figure.pages.ps
@@ -0,0 +1,508 @@
+%!PS-Adobe-1.0
+%%Creator: ah.sei.cmu.edu:dberry (Daniel Berry)
+%%Title: stdin (ditroff)
+%%CreationDate: Wed Oct 17 22:20:03 1990
+%%EndComments
+/PageLength 11 def
+% lib/psdit.pro -- prolog for psdit (ditroff) files
+% Copyright (c) 1984, 1985 Adobe Systems, Inc. All Rights Reserved.
+
+/PageLength 11 def
+% psfig additions
+/DocumentInitState [ matrix currentmatrix currentlinewidth currentlinecap
+currentlinejoin currentdash currentgray currentmiterlimit ] cvx def
+
+/startFig {
+ /SavedState save def
+ userdict maxlength dict begin
+ currentpoint transform
+
+ DocumentInitState setmiterlimit setgray setdash setlinejoin setlinecap
+ setlinewidth setmatrix
+
+ itransform moveto
+
+ /ury exch def
+ /urx exch def
+ /lly exch def
+ /llx exch def
+ /y exch 72 mul resolution div def
+ /x exch 72 mul resolution div def
+
+ currentpoint /cy exch def /cx exch def
+
+ /sx x urx llx sub div def
+ /sy y ury lly sub div def
+
+ sx sy scale
+
+ cx sx div llx sub
+ cy sy div ury sub translate
+
+ /DefFigCTM matrix currentmatrix def
+
+ /initmatrix {
+ DefFigCTM setmatrix
+ } def
+ /defaultmatrix {
+ DefFigCTM exch copy
+ } def
+
+ /initgraphics {
+ DocumentInitState setmiterlimit setgray setdash
+ setlinejoin setlinecap setlinewidth setmatrix
+ DefFigCTM setmatrix
+ } def
+
+ /showpage {
+ initgraphics
+ } def
+
+} def
+/clipFig {
+ currentpoint 6 2 roll
+ newpath 4 copy
+ 4 2 roll moveto
+ 6 -1 roll exch lineto
+ exch lineto
+ exch lineto
+ closepath clip
+ newpath
+ moveto
+} def
+/doclip { llx lly urx ury clipFig } def
+/endFig {
+ end SavedState restore
+} def
+/globalstart {
+ fontnum fontsize fontslant fontheight
+ mh my resolution slotno currentpoint
+ pagesave restore gsave
+} def
+/globalend {
+ grestore moveto
+ /slotno exch def /resolution exch def /my exch def
+ /mh exch def
+ /fontheight exch def
+ /fontslant exch def /fontsize exch def /fontnum exch def
+ F
+ /pagesave save def
+} def
+% end of psfig additions
+
+/$DITroff 140 dict def $DITroff begin
+/fontnum 1 def /fontsize 10 def /fontheight 10 def /fontslant 0 def
+/xi
+ {0 72 PageLength mul translate 72 resolution div dup neg scale 0 0 moveto
+ /fontnum 1 def /fontsize 10 def /fontheight 10 def /fontslant 0 def
+ F /firstpage true def /pagesave save def}def
+/PB{save /psv exch def currentpoint translate
+ resolution 72 div dup neg scale 0 0 moveto}def
+/PE{psv restore}def
+/arctoobig 90 def /arctoosmall .05 def
+/m1 matrix def /m2 matrix def /m3 matrix def /oldmat matrix def
+/tan{dup sin exch cos div}def
+/point{.1 resolution add 72 div mul}def
+/dround {transform round exch round exch itransform}def
+/xT{/devname exch def}def
+/xr{/mh exch def /my exch def /resolution exch def}def
+/xp{}def
+/xs{docsave restore end}def
+/xt{showpage}def
+/xf{/fontname exch def /slotno exch def fontnames slotno get fontname eq not
+ {fonts slotno fontname findfont put fontnames slotno fontname put}if}def
+/xH{/fontheight exch def}def
+/xS{/fontslant exch def}def
+/s{/fontsize exch def /fontheight fontsize def}def
+/f{/fontnum exch def}def
+/F {fontheight 0 le {/fontheight fontsize def}if
+ fonts fontnum get fontsize point 0 0 fontheight point neg 0 0 m1 astore
+ fontslant 0 ne{1 0 fontslant tan 1 0 0 m2 astore m3 concatmatrix}if
+ makefont setfont .04 fontsize point mul 0 dround pop setlinewidth
+ } def
+/X{exch currentpoint exch pop moveto show}def
+/N{3 1 roll moveto show}def
+/Y{exch currentpoint pop exch moveto show}def
+/S{show}def
+/MX{currentpoint exch pop moveto}def
+/MY{currentpoint pop exch moveto}def
+/MXY{moveto}def
+/cb{pop}def % action on unknown char -- nothing for now
+/n{}def /w{}def
+/p{pop firstpage not{showpage}if pagesave restore /pagesave save def
+ /firstpage false def}def
+/abspoint{currentpoint exch pop add exch currentpoint pop add exch}def
+/distance{dup mul exch dup mul add sqrt}def
+/dstroke{currentpoint stroke moveto}def
+/Dl{2 copy gsave rlineto stroke grestore rmoveto}def
+/arcellipse{/diamv exch def /diamh exch def oldmat currentmatrix pop
+ currentpoint translate 1 diamv diamh div scale /rad diamh 2 div def
+ currentpoint exch rad add exch rad -180 180 arc oldmat setmatrix}def
+/Dc{dup arcellipse dstroke}def
+/De{arcellipse dstroke}def
+/Da{/endv exch def /endh exch def /centerv exch def /centerh exch def
+ /cradius centerv centerv mul centerh centerh mul add sqrt def
+ /eradius endv endv mul endh endh mul add sqrt def
+ /endang endv endh atan def
+ /startang centerv neg centerh neg atan def
+ /sweep startang endang sub dup 0 lt{360 add}if def
+ sweep arctoobig gt
+ {/midang startang sweep 2 div sub def /midrad cradius eradius add 2 div def
+ /midh midang cos midrad mul def /midv midang sin midrad mul def
+ midh neg midv neg endh endv centerh centerv midh midv Da
+ currentpoint moveto Da}
+ {sweep arctoosmall ge
+ {/controldelt 1 sweep 2 div cos sub 3 sweep 2 div sin mul div 4 mul def
+ centerv neg controldelt mul centerh controldelt mul
+ endv neg controldelt mul centerh add endh add
+ endh controldelt mul centerv add endv add
+ centerh endh add centerv endv add rcurveto dstroke}
+ {centerh endh add centerv endv add rlineto dstroke}ifelse}ifelse}def
+
+/Barray 200 array def % 200 values in a wiggle
+/D~{mark}def
+/D~~{counttomark Barray exch 0 exch getinterval astore /Bcontrol exch def pop
+ /Blen Bcontrol length def Blen 4 ge Blen 2 mod 0 eq and
+ {Bcontrol 0 get Bcontrol 1 get abspoint /Ycont exch def /Xcont exch def
+ Bcontrol 0 2 copy get 2 mul put Bcontrol 1 2 copy get 2 mul put
+ Bcontrol Blen 2 sub 2 copy get 2 mul put
+ Bcontrol Blen 1 sub 2 copy get 2 mul put
+ /Ybi /Xbi currentpoint 3 1 roll def def 0 2 Blen 4 sub
+ {/i exch def
+ Bcontrol i get 3 div Bcontrol i 1 add get 3 div
+ Bcontrol i get 3 mul Bcontrol i 2 add get add 6 div
+ Bcontrol i 1 add get 3 mul Bcontrol i 3 add get add 6 div
+ /Xbi Xcont Bcontrol i 2 add get 2 div add def
+ /Ybi Ycont Bcontrol i 3 add get 2 div add def
+ /Xcont Xcont Bcontrol i 2 add get add def
+ /Ycont Ycont Bcontrol i 3 add get add def
+ Xbi currentpoint pop sub Ybi currentpoint exch pop sub rcurveto
+ }for dstroke}if}def
+end
+/ditstart{$DITroff begin
+ /nfonts 49 def
+ /fonts[nfonts{0}repeat]def
+ /fontnames[nfonts{()}repeat]def
+/docsave save def
+}def
+
+% character outcalls
+/oc
+ {/pswid exch def /cc exch def /name exch def
+ /ditwid pswid fontsize mul resolution mul 72000 div def
+ /ditsiz fontsize resolution mul 72 div def
+ ocprocs name known{ocprocs name get exec}{name cb}
+ ifelse}def
+/fractm [.65 0 0 .6 0 0] def
+/fraction
+ {/fden exch def /fnum exch def gsave /cf currentfont def
+ cf fractm makefont setfont 0 .3 dm 2 copy neg rmoveto
+ fnum show rmoveto currentfont cf setfont(\244)show setfont fden show
+ grestore ditwid 0 rmoveto} def
+
+/ocb
+ {/s2 .5 dm def /s4 .25 dm def
+ 2 setlinejoin gsave currentpoint newpath dround translate 0 0 moveto}def
+/oce {grestore ditwid 0 rmoveto}def
+/occ {grestore}def
+/dm {ditsiz mul}def
+/4p {pop pop pop pop}def
+
+/ocprocs 25 dict def ocprocs begin
+(X0) {ocb oce}def %room for building special characters with X names
+(X1) {ocb oce}def %all these do is move the width of the char which is 1 em
+(X2) {ocb oce}def
+(X3) {ocb oce}def
+(X4) {ocb oce}def
+(X5) {ocb oce}def
+(X6) {ocb oce}def
+(X7) {ocb oce}def
+(X8) {ocb oce}def
+(X9) {ocb oce}def
+(XX) {ocb oce}def
+
+(MD) {ocb 0 -.25 dm moveto .4333 dm -1 dm lineto .8666 dm -.25 dm lineto
+ 0 -.25 dm lineto closepath stroke occ
+ ocb 0 -.75 dm moveto .8666 dm -.75 dm lineto .4333 dm 0 dm lineto
+ 0 -.75 dm lineto closepath stroke oce}def
+(OU) { ocb .5 dm -.35 dm moveto currentpoint newpath .35 dm 0 360 arc closepath
+ stroke occ
+ ocb .3 dm -.50 dm moveto .3 dm -.3 dm lineto
+ .5 dm -.3 dm .2 dm 180 360 arcn .7 dm -.50 dm lineto stroke oce}def
+
+(14) {(1)(4)fraction}def
+(12) {(1)(2)fraction}def
+(34) {(3)(4)fraction}def
+(18) {(1)(8)fraction}def
+(38) {(3)(8)fraction}def
+(58) {(5)(8)fraction}def
+(78) {(7)(8)fraction}def
+(13) {(1)(3)fraction}def
+(23) {(2)(3)fraction}def
+
+(ff) {gsave (f) show -.06 dm 0 rmoveto (f) show oce}def
+(Fl) {gsave (f) show -.06 dm 0 rmoveto (\257) show oce}def
+(Fi) {gsave (f) show -.06 dm 0 rmoveto (\256) show oce}def
+end
+
+% DIThacks fonts for some special chars
+50 dict dup begin
+/FontType 3 def
+/FontName /DIThacks def
+/FontMatrix [.001 0.0 0.0 .001 0.0 0.0] def
+/FontBBox [-220 -280 900 900] def% a lie but ...
+/Encoding 256 array def
+0 1 255{Encoding exch /.notdef put}for
+Encoding
+ dup 8#040/space put %space
+ dup 8#110/rc put %right ceil
+ dup 8#111/lt put %left top curl
+ dup 8#112/bv put %bold vert
+ dup 8#113/lk put %left mid curl
+ dup 8#114/lb put %left bot curl
+ dup 8#115/rt put %right top curl
+ dup 8#116/rk put %right mid curl
+ dup 8#117/rb put %right bot curl
+ dup 8#120/rf put %right floor
+ dup 8#121/lf put %left floor
+ dup 8#122/lc put %left ceil
+ dup 8#140/sq put %square
+ dup 8#141/bx put %box
+ dup 8#142/ci put %circle
+ dup 8#143/br put %box rule
+ dup 8#144/rn put %root extender
+ dup 8#145/vr put %vertical rule
+ dup 8#146/ob put %outline bullet
+ dup 8#147/bu put %bullet
+ dup 8#150/ru put %rule
+ dup 8#151/ul put %underline
+ pop
+/DITfd 100 dict def
+/BuildChar{0 begin
+ /cc exch def /fd exch def
+ /charname fd /Encoding get cc get def
+ /charwid fd /Metrics get charname get def
+ /charproc fd /CharProcs get charname get def
+ charwid 0 fd /FontBBox get aload pop setcachedevice
+ 40 setlinewidth
+ newpath 0 0 moveto gsave charproc grestore
+ end}def
+/BuildChar load 0 DITfd put
+%/UniqueID 5 def
+/CharProcs 50 dict def
+CharProcs begin
+/space{}def
+/.notdef{}def
+/ru{500 0 rls}def
+/rn{-55 725 moveto 500 0 rlineto 25 setlinewidth stroke}def
+/vr{125 800 moveto 0 -770 rls}def
+/bv{125 800 moveto 0 -1000 rls}def
+/br{0 770 moveto 0 -1040 rls}def
+/ul{0 -250 moveto 500 0 rls}def
+/ob{200 250 rmoveto currentpoint newpath 200 0 360 arc closepath stroke}def
+/bu{200 250 rmoveto currentpoint newpath 200 0 360 arc closepath fill}def
+/sq{80 0 rmoveto currentpoint dround newpath moveto
+ 640 0 rlineto 0 640 rlineto -640 0 rlineto closepath stroke}def
+/bx{80 0 rmoveto currentpoint dround newpath moveto
+ 640 0 rlineto 0 640 rlineto -640 0 rlineto closepath fill}def
+/ci{355 333 rmoveto currentpoint newpath 333 0 360 arc
+ 50 setlinewidth stroke}def
+
+/lt{125 -200 moveto 125 400 lineto 125 550 260 780 375 800 curveto stroke}def
+/lb{125 800 moveto 125 200 lineto 125 50 260 -180 375 -200 curveto stroke}def
+/rt{125 -200 moveto 125 400 lineto 125 550 -10 780 -125 800 curveto stroke}def
+/rb{125 800 moveto 125 200 lineto 125 50 -10 -180 -125 -200 curveto stroke}def
+/lk{125 800 moveto 125 700 lineto 125 550 125 320 -125 300 curveto
+ 125 -200 moveto 125 -100 lineto 125 50 125 280 -125 300 curveto stroke}def
+/rk{125 800 moveto 125 700 lineto 125 550 125 320 375 300 curveto
+ 125 -200 moveto 125 -100 lineto 125 50 125 280 375 300 curveto stroke}def
+/lf{125 800 moveto 0 -1000 rlineto s4 0 rls}def
+/rf{125 800 moveto 0 -1000 rlineto s4 neg 0 rls}def
+/lc{125 -200 moveto 0 1000 rlineto s4 0 rls}def
+/rc{125 -200 moveto 0 1000 rlineto s4 neg 0 rls}def
+end
+
+/Metrics 50 dict def Metrics begin
+/.notdef 0 def
+/space 500 def
+/ru 500 def
+/br 0 def
+/lt 250 def
+/lb 250 def
+/rt 250 def
+/rb 250 def
+/lk 250 def
+/rk 250 def
+/rc 250 def
+/lc 250 def
+/rf 250 def
+/lf 250 def
+/bv 250 def
+/ob 350 def
+/bu 350 def
+/ci 750 def
+/bx 750 def
+/sq 750 def
+/rn 500 def
+/ul 500 def
+/vr 0 def
+end
+
+DITfd begin
+/s2 500 def /s4 250 def /s3 333 def
+/a4p{arcto pop pop pop pop}def
+/2cx{2 copy exch}def
+/rls{rlineto stroke}def
+/currx{currentpoint pop}def
+/dround{transform round exch round exch itransform} def
+end
+end
+/DIThacks exch definefont pop
+ditstart
+(psc)xT
+576 1 1 xr
+1(Times-Roman)xf 1 f F
+2(Times-Italic)xf 2 f F
+3(Times-Bold)xf 3 f F
+4(Times-BoldItalic)xf 4 f F
+5(Courier)xf 5 f F
+6(Courier-Oblique)xf 6 f F
+7(Courier-Bold)xf 7 f F
+8(Courier-BoldOblique)xf 8 f F
+9(Helvetica)xf 9 f F
+10(Helvetica-Oblique)xf 10 f F
+11(Helvetica-Bold)xf 11 f F
+12(Helvetica-BoldOblique)xf 12 f F
+13(Hebrew-Frank-Ruehl)xf 13 f F
+14(Hebrew-Gam)xf 14 f F
+15(Hebrew-Gam-Bold)xf 15 f F
+16(Hebrew-Yuval)xf 16 f F
+17(Hebrew-David)xf 17 f F
+18(Hebrew-Tel-Aviv)xf 18 f F
+19(Hebrew-OldJaffa)xf 19 f F
+20(AvantGarde-Book)xf 20 f F
+21(AvantGarde-BookOblique)xf 21 f F
+22(AvantGarde-Demi)xf 22 f F
+23(AvantGarde-DemiOblique)xf 23 f F
+24(NewCenturySchlbk-Roman)xf 24 f F
+25(NewCenturySchlbk-Italic)xf 25 f F
+26(NewCenturySchlbk-Bold)xf 26 f F
+27(NewCenturySchlbk-BoldItalic)xf 27 f F
+28(Palatino-Roman)xf 28 f F
+29(Palatino-Italic)xf 29 f F
+30(Palatino-Bold)xf 30 f F
+31(Palatino-BoldItalic)xf 31 f F
+32(ZapfChancery-MediumItalic)xf 32 f F
+33(ZapfDingbats)xf 33 f F
+34(Bookman-Light)xf 34 f F
+35(Bookman-LightItalic)xf 35 f F
+36(Bookman-Demi)xf 36 f F
+37(Bookman-DemiItalic)xf 37 f F
+38(Helvetica-Narrow)xf 38 f F
+39(Helvetica-Narrow-Oblique)xf 39 f F
+40(Helvetica-Narrow-Bold)xf 40 f F
+41(Helvetica-Narrow-BoldOblique)xf 41 f F
+42(Nescii-Initial-Stroke)xf 42 f F
+43(Nescii-Middle-Stroke)xf 43 f F
+44(Nescii-Final-Stroke)xf 44 f F
+45(Nescii-Standalone-Stroke)xf 45 f F
+46(Arabic-Naskh)xf 46 f F
+47(Symbol)xf 47 f F
+48(DIThacks)xf 48 f F
+xi
+%%EndProlog
+
+%%Page: 1 1
+1 p
+10 s 10 xH 0 xS 1 f F
+10 s 10 xH 0 xS 1 f F
+2313 5520(Figure)N
+2542(3)X
+2428 6084(7)N
+
+%%Page: 2 2
+2 p
+10 s 10 xH 0 xS 1 f F
+576 672(R)N
+691(M)X
+846(7:)X
+806 768(10:)N
+806 864(12:)N
+691 1056(P)N
+846(7:)X
+806 1152(10:)N
+806 1248(12:)N
+576 1440(T)N
+691(M)X
+846(8:)X
+806 1536(10:)N
+806 1632(12:)N
+691 1824(P)N
+846(8:)X
+806 1920(10:)N
+806 2016(12:)N
+576 2208(L)N
+691(M)X
+806(10:)X
+691 2400(P)N
+806(10:)X
+2157 2688(Figure)N
+2386(11-LW300)X
+576 3072(R)N
+691(M)X
+806(10:)X
+806 3168(12:)N
+691 3360(P)N
+806(10:)X
+806 3456(12:)N
+576 3648(T)N
+691(M)X
+806(10:)X
+806 3744(12:)N
+691 3936(P)N
+806(10:)X
+806 4032(12:)N
+576 4224(L)N
+691(M)X
+806(10:)X
+691 4416(P)N
+806(10:)X
+2166 4704(Figure)N
+2395(11-VT600)X
+2428 6084(14)N
+
+%%Page: 3 3
+3 p
+10 s 10 xH 0 xS 1 f F
+576 672(R)N
+691(M)X
+806(10:)X
+806 768(12:)N
+691 960(P)N
+806(10:)X
+806 1056(12:)N
+576 1248(T)N
+691(M)X
+806(10:)X
+806 1344(12:)N
+691 1536(P)N
+806(10:)X
+806 1632(12:)N
+576 1824(L)N
+691(M)X
+806(10:)X
+691 2016(P)N
+806(10:)X
+2151 2304(Figure)N
+2380(11-LT1270)X
+576 2592(LW300:)N
+576 3456(VT600:)N
+576 4320(LT1270:)N
+2293 5280(Figure)N
+2522(12)X
+2428 6084(15)N
+
+%%Trailer
+xt
+
+xs
diff --git a/fonts/utilities/mf2ps/doc/paper b/fonts/utilities/mf2ps/doc/paper
new file mode 100644
index 0000000000..d93f426299
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/paper
@@ -0,0 +1,1755 @@
+.pl 11.125i
+.de rb
+.ta 2m +5m +5m
+.nr t1\\n(.i
+.ls \\n(sq
+.in \\n(sem
+..
+.de rf
+.br
+.ne \\n(scu+\\n(sdu
+.sp \\n(sdu
+.ti -2m
+..
+.de LE
+.sp .5v
+..
+.de SU
+.ne 2v
+.br
+.ti 1.66P
+\f3\\$1\fP
+..
+.de Su
+.ne 2v
+.sp 1v
+\fB\&\\$1\fP
+..
+.de su
+.ne 3v
+.sp 1v
+.na
+\fB\&\\$1\fP
+.br
+.ad
+..
+.de PP
+.sp .5v
+..
+.de qb
+.in +\\n(sju
+.LL -\\n(sju
+.sp .5v
+..
+.de qe
+.in -\\n(sju
+.LL +\\n(sju
+.sp .5v
+..
+.de cl
+.ta\\n(sou +5m +5m
+.in+\\n(snu
+..
+.de dl
+.br
+.in-\\n(snu
+..
+.de ES
+.ft C
+.sp
+.nf
+.in +1.66P
+..
+.de EE
+.fi
+.ft R
+.sp
+.in -1.66P
+..
+.dehd
+.HS
+.nrhe+1
+.ie\\n(cn>1\{\
+.ie\\nc>\\n(cn\{\
+'sp\\n(bhu-1v
+.nr 1F \\n(.f
+.nr 1S \\n(.s
+.ft
+.ps
+.nr 2F \\n(.f
+.nr 2S \\n(.s
+.ft 1
+.ps 10
+.iee .tl \\*(Te
+.el.tl \\*(To
+.ft \\n(2F
+.ps \\n(2S
+.ft \\n(1F
+.ps \\n(1S
+'sp|\\n(thu
+.nrc 1 1
+.mkmx\}
+.el\{\
+.po+\\n(cwu+\\n(csu
+'sp|\\n(mxu\}\}
+.el\{\
+.if\\n(f5\{\
+.nr% +\\n(f5
+.nrf50 1\}
+'sp\\n(bhu-1v
+.nr 1F \\n(.f
+.nr 1S \\n(.s
+.ft
+.ps
+.nr 2F \\n(.f
+.nr 2S \\n(.s
+.ft 1
+.ps 10
+.iee .tl \\*(Te
+.el.tl \\*(To
+.ft \\n(2F
+.ps \\n(2S
+.ft \\n(1F
+.ps \\n(1S
+'sp|\\n(thu\}
+.chfx -\\n(tfu
+.chfo -\\n(tfu
+.if\\n(z1 .fz
+.chfo -\\n(tfu
+.if!\\n(f0 .ns
+.if\\n(f0\{\
+.nrf5\\n(f6
+.nrf6\\n(f7
+.nrf70
+.Ff
+.ie\\n(fa\{\
+.nrfa0
+.nrh21\}
+.el\{\
+.ie\\nx\{.if (\\n(nlu+5v)>(\\n(.p+\\nyu) .nr h1 1\}
+.el\{.if \\n(.tu<6v .nr h1 1\}\}\}
+.if\\n(h1=1\{\
+.nrh10
+'bp\}
+.if\\n(h2=1\{\
+.nrh20
+.fo\}
+.chfo (\\nyu-1v)
+.nrhe-1
+.HE
+..
+.defo
+.FS
+.if!\\n(he\{.if \\nx .xf\}
+.nrfa0
+.ie\\n(fg\{\
+.nrfa1
+.diGA\}
+.el\{\
+.ie\\n(cn<2\{\
+'chfo 32000
+'chfx 32000
+'sp(\\n(.pu-\\n(nlu-\\n(tfu+\\n(bfu-1v)u
+.nr 1F \\n(.f
+.nr 1S \\n(.s
+.ft
+.ps
+.nr 2F \\n(.f
+.nr 2S \\n(.s
+.ft 1
+.ps 10
+.iee .tl \\*(Be
+.el.tl \\*(Bo
+.ft \\n(2F
+.ps \\n(2S
+.ft \\n(1F
+.ps \\n(1S
+'bp\}
+.el.mf\}
+.FE
+..
+.demf
+.ie\\n+c<=\\n(cn .hd
+.el\{\
+.po\\n(cou
+.lt 6.63i
+'chfo 32000
+'chfx 32000
+'sp(\\n(.pu-\\n(nlu-\\n(tfu+\\n(bfu-1v)u
+.nr 1F \\n(.f
+.nr 1S \\n(.s
+.ft
+.ps
+.nr 2F \\n(.f
+.nr 2S \\n(.s
+.ft 1
+.ps 10
+.iee .tl \\*(Be
+.el.tl \\*(Bo
+.ft \\n(2F
+.ps \\n(2S
+.ft \\n(1F
+.ps \\n(1S
+'bp\}
+..
+.defn
+.ie\\nx .ne \\n(rcv-2v
+.el.ne \\n(rcv
+.if\\n(fn .AB"Nesting of footnotes is a no no"
+.nrfn1
+.daFN
+.ev1
+.ie\\n+x=1\{\
+.sp 10p
+\s-5\l'5P\(ul'\s+5
+.br\}
+.el.sp \\n(srv
+.fi
+.ad
+..
+.\" REFER macros .... citations
+.nr se 3u \" space to indent in emms
+.de []
+.][ \\$1
+..
+.de ][
+.if \\$1>5 .tm Bad arg to []
+.if !"\\*([O"" .if !\\n([O .as [O .
+.[\\$1
+..
+.ds RB ".RE
+.ds [. " [
+.ds .] ]
+.if n .ds [o ""
+.if n .ds [c ""
+.if t .ds [o \(lq
+.if t .ds [c \(rq
+.\" the next lines deal with the problem of .[1] or [1].
+.\" refer will write "linexxx\*(<.[1]\*(>.
+.\" and either "<." or ">." should produce the .;
+.\" similarly for ,
+.ds >. .
+.ds >, ,
+.de [5 \" tm style
+\\*([A, \\f2\\*([T\\f1,
+.ie \\n(TN \\*([M.
+.el UCLA Computer Science Department internal memorandum (\\*([D).
+.br
+..
+.de [0 \" other
+.if !"\\*([A"" \\*([A,
+.if !"\\*([O"" \\*([O
+.if !"\\*([D"" \& (\\*([D).
+.br
+..
+.de [1 \" journal article
+.if !"\\*([A"" \\*([A,
+.if !"\\*([T"" \\*([o\\*([T,\\*([c
+\\f2\\*([J\\f1\c
+.if !"\\*([V"" .if n \& Vol.\&\c
+.if !"\\*([V"" \& \\f3\\*([V\\f1\c
+.if !"\\*([N"" (\\*([N)\c
+.if !"\\*([P"" \{\
+.ie \\n([P>0 , pp.\c
+.el , p.\c
+\& \\*([P\c\}
+.if !"\\*([I"" .if "\\*([R"" , \\*([I\c
+.if !"\\*([D"" \& (\\*([D)\c
+\&.
+.if !"\\*([O"" \\*([O
+.br
+..
+.de [2 \" book
+.if !"\\*([A"" \\*([A,
+.if !"\\*([T"" \\f2\\*([T,\\f1
+\\*([I\c
+.if !"\\*([C"" , \\*([C\c
+.if !"\\*([D"" \& (\\*([D)\c
+\&.
+.if !"\\*([G"" Gov't. ordering no. \\*([G.
+.if !"\\*([O"" \\*([O
+.br
+..
+.de [4 \" report
+.if !"\\*([A"" \\*([A,
+\\*([o\\*([T,\\*([c
+\\*([R\c
+.if !"\\*([G"" \& (\\*([G)\c
+.if !"\\*([I"" , \\*([I\c
+.if !"\\*([C"" , \\*([C\c
+.if !"\\*([D"" \& (\\*([D)\c
+\&.
+.if !"\\*([O"" \\*([O
+.br
+..
+.de [3 \" article in book
+.if !"\\*([A"" \\*([A,
+.if !"\\*([T"" \\*([o\\*([T,\\*([c
+.if !"\\*([P"" pp. \\*([P
+in \\f2\\*([B\\f1\c
+.if !"\\*([E"" , ed. \\*([E\c
+.if !"\\*([I"" , \\*([I\c
+.if !"\\*([C"" , \\*([C\c
+.if !"\\*([D"" \& (\\*([D)\c
+\&.
+.if !"\\*([O"" \\*([O
+.br
+..
+.\" define warning that mX does not support references as footnotes
+.de ]-
+.AB"Can't do references as footnotes. Use '-e' or '-s' option with 'refer'
+..
+.de ]<
+.\" define the real ]- next-reference macro
+. de ]-
+. rm [V [P [A [T
+. rm [N [C [B [O
+. rm [R [I [E [D
+. rf
+\\\\*([F. \c
+\\..
+.\"now start the reference subsection
+\\*(RB
+.rb
+..
+.de ]>
+.re
+..
+.de ]]
+this is never
+executed
+and just
+uses up an end-of-file
+bug.
+..
+.de TS
+.sp
+..
+.de TE
+.sp .25v
+.ce
+\\$1
+.sp .5v
+.ien .ta .8i +.8i +.8i +.8i +.8i +.8i +.8i +.8i +.8i +.8i
+.el.ta .5i +.5i +.5i +.5i +.5i +.5i +.5i +.5i +.5i +.5i
+..
+.de ca
+.sp .5v
+.ce
+\&\\$1
+.sp 8p
+..
+.de CT
+.if \\n(ff .F0 "\\$1" "\\n%"
+..
+.nr sd 1i/24u \" # of inches to space between references (used as u).
+.nr sf 1.66P \" space to indent for paragraph (used as u).
+.nr sg 1u \" # of spaces needed before trap to start paragraph(used as v).
+.nr sh 0u \" # of spaces done to start a new paragraph (used as v).
+.nr si 1u \" # of spaces used to start an example (used as v).
+.nr sj 1.66P \" space to indent for an example (used as u);
+.nr sn 1.66P \" amount of space to indent for list (used as u).
+.nr so 1P \" amount of space to temp indent for each list entry (used as u).
+.nr sp 1i/12u \" spacing for each element of list (or sublist) (used as u).
+.nr sa 1v \" # of spaces to do before subtitles (used as u).
+.nr se 3u \" # of spaces to indent for a reference (used as ems).
+.nr sm 1i \" # of spaces of need to do a subtitle (used as u).
+.nr fv 3 \" set font variable for subtitles to Helvetica
+.nr si 1u \" # of spaces used to start an example (used as v).
+.nr sk 1u \" # of spaces left at the end of an example (used as v);
+.deRT
+.ien .ta .8i +.8i +.8i +.8i +.8i +.8i +.8i +.8i +.8i +.8i
+.el.ta .25i +.25i +.25i +.25i +.25i +.25i +.25i +.25i +.25i +.25i
+..
+.RT
+.EQ
+delim $$
+.EN
+.ds MF \f(LGMETA\%FONT\fP
+.ds TB \fITUG\%boat\fP
+.ds BZ B\o'e\(aa'zier
+.ds TX T\v'+.2m'\h'-.1m'E\h'-.1m'\v'-.2m'X
+.ds LT L\v'-.15m'\h'-.3m'\s-2A\s+2\v'.15m'\h'-.1m'T\v'.2m'\h'-.10m'E\h'-.10m'\v'-.2m'X
+.ds BT B\\h'-0.05m'\\s-2I\\h'-0.025m'B\\s0\\h'-0.08m'\\*(TX
+.ds pS P\s-2OST\%\s0S\s-2CRIPT\s0
+.ds P1 \f2P\fP\v'.2m'\s-3\f11\fP\s+3\^\v'-.2m'
+.ds P2 \f2P\fP\v'.2m'\s-3\f12\fP\s+3\^\v'-.2m'
+.ds P3 \f2P\fP\v'.2m'\s-3\f13\fP\s+3\^\v'-.2m'
+.ds P4 \f2P\fP\v'.2m'\s-3\f14\fP\s+3\^\v'-.2m'
+.en
+.LL 39.00P
+.ls 1
+.ds BL ''%''
+.hy 14
+The next page begins the paper. The macro package I use cannot start
+double columning until AFTER some text is printed..
+.pn 1
+.bp
+.MC 2 18.75P 1.5P 1i
+.mk xx
+\v'-1v'\l'18.7P'
+.sp |\n(xxu
+\s+2Environment for Translating
+.br
+\*(MF to \*(pS\s0
+.sp 3p
+.ti 1.66P
+Shimon Yanai and Daniel M. Berry
+.sp 8p
+\fBAbstract\fP
+.PP
+This paper describes a program, \fHmf2ps\fP, that translates a
+\*(MF font definition into a definition for the same font in the
+\*(pS language. \fHmf2ps\fP is constructed out
+of the part of the \*(MF program that extracts the envelopes of the
+letters; these envelopes are converted into \*(pS outlines.
+.su "1\ \ \ Introduction"
+.PP
+This paper describes a program, \fHmf2ps\fP,
+that takes from a \*(MF
+.[
+knu86
+.]
+.[
+knu87
+.]
+program for a font all the necessary information in order to
+create an equivalent \*(pS
+.[
+PostScript language reference manual
+.]
+font definition. The program makes use of the front end of the
+\*(MF program to extract the envelopes of the letters to produce the
+\*(pS outlines. What makes this process natural is that both \*(MF and
+\*(pS make liberal use of \*(BZ curves to describe non-circular
+curves.
+.pp
+By producing this translator, it is hoped to be able to produce from
+\*(MF fonts \*(pS outline fonts which are more compact than the
+bitmapped fonts produced by the \*(MF program. Certainly the outline
+fonts are more easily scaled to other magnifications and possibly even
+other design sizes than are bitmaps. Moreover, doing so makes fonts
+heretofore available only on \*(TX
+.[
+knu84
+.]
+and other DVI-based formatters,
+available on \fHditroff\fR
+.[
+Ker82
+.]
+and other formatters which have evolved,
+or have been designed, for use with \*(pS printers. This paper, which is
+typeset by \fHditroff\fR, uses a \*(pS version of the
+logo font in order to print the word \(lq\*(MF\|\(rq in the same appearance as
+in \*(TX-generated documents.
+Moreover, these new \*(pS outline fonts can be used in \*(TX also! One
+needs only the
+T\v'+.2m'\h'-.1m'E\h'-.1m'\v'-.2m'X\v'+.2m'\h'-.1m'P\h'-.1m'\v'-.2m'S
+.[
+bechtolsheim
+.]
+software.
+.pp
+The organization of this paper is as follows. Section 2 presents the
+background of this work. Section 3 explains the rationale behind
+building the translator and describes a previous attempt at writing the
+translator and an approach to avoid. The software engineering aspect of
+the translator is described also in Section 3. The details of the
+implementation are exposed in Section 4. Section 5 describes the
+operation of the program. Section 6 evaluates the results. Finally
+Section 7 describes improvements to the translator that are left for
+future work.
+.su "2\ \ \ Background"
+.PP
+Typesetter formatting systems such as \*(TX and \fHditroff\fP use fonts
+as raw material. The formatters accept mixed text and commands as input
+and produce output, which, if sent to the laser printers or typesetters,
+yields formatted text printed on pages. The laser printers and
+typesetters use fonts, i.e., sets of printable patterns, one per
+character, in various representations in order to cause the desired
+characters to appear on the printed form. For some printers, bitmaps
+are used, with 1's representing inked dots and 0's representing
+non-inked dots. Other printers accept commands that cause drawing of
+the characters, the printer providing the inked dots according to the
+drawing commands. One such popular command language is \*(pS, and its
+usual use is to specify the outline of the character with the
+interpreting printer filling in the outline with ink. One popular
+method of describing fonts is with the \*(MF language, in which
+declarative definitions of how to paint the characters are given in
+terms of pen path and pen shape. Another popular method is the same
+\*(pS that many printers accept. The prime difference is that the \*(MF
+program translates the font definitions into bitmaps prior to sending
+the font to the printer while a \*(pS printer translates the outlines
+into bitmaps at the time of printing. Interestingly, both the \*(MF
+language and the \*(pS language use \*(BZ curves for describing the
+curves followed by the pen or the outlines. As usually configured
+these days, \*(TX uses bitmapped fonts in the Computer Modern family
+generated by \*(MF, and \fHditroff\fP uses \*(pS outline fonts supplied
+by Adobe.
+.pp
+The subsequent subsections delve deeper into these issues in order to
+be able to state the goal of this paper in the next section.
+.Su "2.1\ \ \ Fonts, design sizes, and magnifications."
+As mentioned, fonts are the raw material of typesetting. A font is a
+set of printable patterns, one for each character, that causes printing
+of that character in a particular recognizable style on the page. As
+mentioned, these patterns can be represented by bitmaps or drawing
+instructions.
+.pp
+Characters come in various sizes. There are two independent notions of
+sizing for fonts, point size or design size and magnification. The
+\fIdesign size\fP is the size at which the character is designed to be used
+and is, in well-designed text, the size in which the character appears
+in final, printed copy. Design size is
+usually expressed in units of points, which are each approximately 1/72
+of an inch. Most normal text in books, newspapers, and magazines is
+printed in 10 point type. Headlines are larger, perhaps as large as 30
+points. The \fImagnification\fP of a font is the inverse of the ratio
+between the design size of the character and the size of the
+character as it emerges on the printer, the assumption being that the
+final copy is a photo reduction of the printed copy. Thus, if photo
+reduction halves linear dimensions, one prints with magnification 2.
+If everything is done right, then after reduction, the letter appears at
+its design size.
+.pp
+A 10 point design sized font printed at mag\%ni\%fi\%ca\%tion 2 is similar to
+but not quite the same as a 20 point version of the same font.
+For example, the serifs on a large point size are smaller than they would
+be if strict linear magnification were used. Other proportions, e.g., of
+x-height to cap-height and of width to height, are also
+different. While many purists, Knuth
+included, insist on using a different pattern for each design size,
+many people accept magnification as yielding acceptable fonts at other
+point sizes. If the unit of magnification is not too big the results
+are acceptable even to many purists.
+.Su "2.2\ \ \ Problems with bitmapped fonts."
+A bitmap for a character is a rectangular array of bits covering the
+so-called bounding box or frame that exactly contains a letter. Figure
+1 shows a low resolution bit map for the letter \(lqN\(rq in a sans
+serif font. The inked squares or pixels are denoted by \(lq1\(rq bits
+and the uninked pixels are denoted by \(lq0\(rq bits.
+.fs
+.F+
+figure fig1.ps
+.F-
+.ca "Figure 1"
+.fe
+The low resolution example of Figure 1 illustrates a major problem
+with bitmapped fonts. Curved lines and straight lines that are neither
+vertical nor horizontal cannot be represented exactly by a rectangular
+pattern of pixels. One is forced to approximate them with rectangular
+steps. At high resolution, e.g. above 1000 or so, the human eye cannot
+see the steps, but at low resolution the steps are quite apparent.
+Visible steps are called \(lqjaggies\(rq after the jagged edges.
+.pp
+Bitmaps for a font must be built for each design size, magnification,
+and resolution. If the resolution is fixed, as is the case on most
+printers, a bitmap must be built for each design size and
+magnification. An attempt to use a given bitmap at a larger design
+size or magnification by just enlarging the area of each dot yields a
+bad case of jaggies.
+.Su "2.3\ \ \ \*(MF and its environment."
+.ft 1
+\*(MF, a language for the specification of fonts or typefaces, has been
+used to provide fonts for the \*(TX family of typesetting systems. A
+\*(MF user writes a program for each letter or symbol of an alphabet.
+These programs are different from the usual computer programs, because
+they are essentially declarative rather than imperative, using an
+algebraic language to describe the center stroke or edges of the characters. The
+description of a letter in \*(MF is a set of equations describing the
+strokes. When combined with parameters describing the pen shape and
+size, one gets a full description of a letter. Sizes and shapes of pen
+nibs can be varied in \*(MF and the characters can be built up in such
+a way that the outlines of each stroke are precisely controlled. Herein
+lies the advantage of \*(MF; a font is easily specified and variations
+are obtained by varying parameters.
+.pp
+Currently, the program that converts a set of \*(MF font descriptions
+into a bitmapped font translates the description of a letter combined
+with a point size and a magnification into a bitmap. This bitmap can be
+sent to the printer to get a letter on the page. Herein lies a
+disadvantage of \*(MF; a bit map must be kept for each point size and
+magnification, and this can require a lot of space.
+.Su "2.4\ \ \ The \*(pS language."
+The \*(pS language is an interpretive programming language with
+graphics capabilities. \*(pS's extensive page description capabilities
+are embedded into a general-purpose programming language framework. The
+language includes a conventional set of data types such as numbers,
+arrays, and strings, control primitives such as conditionals, loops and
+procedures, and some unusual features such as dictionaries. In most
+\*(pS fonts, each letter is described by an imperative program tracing
+the outline of the letter. This tracing may include curves given as
+\*(BZ curves, straight lines, arcs, etc. A \*(pS printer interprets
+this outline program to draw and fill in the letters on the page. Some
+consider the imperative nature of \*(pS to be a disadvantage in
+comparison to \*(MF's declarative nature. The main advantage of \*(pS
+relative to \*(MF is that one needs to keep only the outline. If, as in
+the usual case, the outline is specified in terms of a fixed path
+through Euclidean two-space, this outline may be scaled arbitrarily to
+yield any magnification. The scaling is done by the \*(pS interpreter
+at the printer. Thus the different magnifications do not require any
+additional storage space. Actually, the outlines are kept as if they
+were for the Adobe-standard 1000 dots
+per emm, which at a design size of 10 points amounts to 7200 dpi.
+Because a typical phototypesetter has a maximum resolution of
+about 2500 dpi, the outlines are said to be arbitrarily
+scaleable. If the outlines are kept, as are many \*(MF definitions, as
+paths through points calculated by the outline program, then it is
+possible to, say, make serifs grow more slowly than linearly. It would
+then be possible to have one \*(pS font scaleable to all design sizes.
+Generally, outline fonts are not written this way, so that strictly
+speaking they are scaleable only to all magnifications.
+.pp
+In addition, the \*(pS language has a way to work with bitmapped fonts.
+While the \*(pS printer can scale them before printing, the end result
+is that each of the fixed number of dots in the bitmap is made larger
+or smaller. Since the human will see larger dots as jagged lines, such
+fonts are not really considered scaleable.
+.Su "2.5\ \ \ \*(BZ curves."
+Both \*(MF and \*(pS use \*(BZ cubics to specify curves. For the \*(BZ
+form, four points are used, the start point, the end point, and two
+control points, as shown in the top half of Figure 2.
+The tangent vectors of the
+endpoints are determined from the line segments \*(P1\*(P2 and
+\*(P3\*(P4. The mathematical introduction of the \*(BZ form
+when given four points \*(P1, \*(P2, \*(P3, and \*(P4 is
+.sp
+.in +.125i
+$z(t)~=~(1-t) sup 3 "\*(P1" ~+~3t(t-1) sup 2 "\*(P2" ~+~3t sup 2 (1-t) "\*(P3" ~+~t sup 3 "\*(P4" ,$
+.sp
+.in -.125i
+for $0~<=~t~<=~1$.
+.pp
+Two characteristics of the \*(BZ form tend to make it widely used in
+graphics. First, by choosing the control points one can easily mold the
+curve to a desired shape. Second, the four control points taken in another
+order define a convex polygon, \*(P1 \*(P2 \*(P4 \*(P3 \*(P1 in this case,
+the \fIconvex hull\fR\h'-.05m', which bounds the \*(BZ
+curve. The convex hull is useful in clipping a curve against a window.
+.pp
+When a \*(MF user specifies a path, \*(MF creates a list of knots and
+control points for the associated cubic spline curves.
+If the user has not specified the control points explicitly, \*(MF
+itself finds some for the splines of a curve, while \*(pS requires all
+the four points to be explicitly given.
+.fs
+.F+
+figure fig2.ps
+.F-
+.ca "Figure 2"
+.fe
+.su "3\ \ \ \*(MF to \*(pS compiler\(em why\ and\ how"
+.ft 1
+.PP
+This section describes a major performance problem with \*(MF-generated
+fonts that perhaps can be solved by translating them into \*(pS fonts.
+The goals of this translation are established. Based on these goals, a
+particular approach is adopted to engineer the software largely from
+existing components.
+.Su "3.1\ \ \ A problem with \*(MF-generated bitmapped fonts."
+.ft 1
+In \*(MF, one gets one bitmap per point size and magnification. The
+size of these bitmaps grows as the square of product of the design size
+and
+the magnification and requires a large storage space. Files that are
+sent to the printer will be large, especially if lots of different
+point sizes or magnifications are used. In \*(pS with outline fonts,
+there is one outline per character which can be scaled arbitrarily to
+any magnification that might be needed. Moreover, \*(pS outline fonts
+are generally more compact than bitmapped fonts. For example, an
+enclosed rectangle is represented by its four corner points rather than
+by all the bits enclosed by the rectangle.
+.pp
+Certainly the outline fonts are more easily scaled to other
+magnifications. By scaling the bitmapped fonts downward, too much
+information is lost, and scaling upward introduces the jaggies.
+Moreover, the pixel array is device dependent; it is valid for output
+devices of only one particular resolution and one choice of possible
+data values per pixel. Scaleable fonts have a great advantage \(em you
+need only one font description file for all magnifications of that font.
+Actually, \*(pS outline fonts are more scaleable even than the \*(MF
+originals for another reason. In,
+.[
+Knu84
+.]
+it is said, \(lqCaution:
+before using this `\fBat\fR' feature (i.e. scaling downward or upward) you
+should check to make sure that your typesetter supports the font at the
+size in question; \*(TX will accept any \(L<desired size\(L> that is positive
+and less than 2048 points, but the final output will not be right
+unless the scaled font really is available on your printing
+device.\(rq Getting \*(pS outline versions of \*(MF fonts is possible
+since both are based on \*(BZ curves. Doing so makes fonts heretofore
+available only on \*(TX and other DVI-based formatters available on
+\fHditroff\fR and other formatters which have evolved to or have been
+designed for use with \*(pS printers.
+.Su "3.2\ \ \ Goals."
+Based on the observations of Section 3.1,
+the goal of this research is to produce a \*(MF to
+\*(pS compiler, \fHmf2ps\fP. Its operational requirements are items 1
+through 5:
+.l1 1
+.le
+It must be possible to translate any legitimate \*(MF font definition
+at any given design size into a \*(pS outline font.
+.le
+The resulting \*(pS outline font should be arbitrarily scaleable.
+.le
+The resulting fonts should look like the bitmapped fonts when printed
+on the same printer.
+.le
+The resulting \*(pS outline font should be more compact \fIwhen sent to
+the printer\fP than a \*(pS version of the \*(MF-generated bitmapped
+font.
+.e1
+.sp .5v
+The fourth requirement deserves a bit of explanation and qualification.
+First note that what is compared is what is sent to the printer.
+Certainly there are compressed versions of the bitmapped fonts that
+reduce the disk storage requirements of the bitmapped fonts. However,
+they must be uncompressed before sending them to most printers. It is the
+printer's storage that is limited; generally disk space is in
+abundance. However, since printers these days are general purpose
+computers, what a printer accepts may in fact be a compression that it
+has been programmed to undo.
+.pp
+Now for the case in which disk space is of concern, the comparison
+should still be relative to printable versions. There exist algorithms,
+e.g. that of Lempel and Ziv
+.[
+lempel ziv
+.]
+that can be used to compress \*(pS outline fonts which are, after all,
+just ASCII files. Therefore, in order not to have a contest between
+compression algorithms, the uncompressed versions are compared. Furthermore,
+in order not to have a contest between different kinds of printers that may
+have differing font representations, \*(pS outline fonts are compared to
+\*(pS bitmapped fonts. When
+considering disk space, the fact that one bitmapped font is needed for
+each magnification is taken into account. Thus, the interest is in
+comparing the size of a scaleable outline font to the total storage for
+the bitmapped fonts for all magnifications of a given design size.
+.cl
+.le
+The resulting \*(pS outline font should be more compact than the total
+of the sizes of the \*(pS versions of the \*(MF-generated bitmapped
+fonts at each available magnification. Even this comparison is not
+completely fair since only specific magnifications are provided, while
+the \*(pS font is arbitrarily scaleable.
+.dl
+.sp .5v
+.pp
+Observe finally, that the comparison is against mag\%ni\%fi\%ca\%tions
+of a single design size since purists would argue that there should
+be a different outline font for each design size.
+Since there are those that do not
+require this purity, the various design sizes will be compared also.
+.pp
+The software engineering goal is item 6.
+.cl
+.le
+\fHmf2ps\fP should be written as much as possible using the existing
+\*(MF program both to save work and to ensure that all \*(MF-acceptable
+font definitions are handled.
+.dl
+.sp .5v
+The evaluation of the results will be
+done relative to these goals.
+.Su "3.3\ \ \ Previous attempts."
+Leslie Carr wrote a collection of programs to produce \*(pS outline
+fonts from \*(MF fonts in 1987. Carr's programs take as input the
+\fIlog\fR output file of \*(MF which contains a description of all
+the paths that \*(MF traces out in drawing a character.
+.pp
+Carr has problems of information loss as a result of not having entered
+into the \*(MF program. This is the reason why Carr's characters are
+poor looking. In,
+.[
+Car87
+.]
+Carr observes, \(lqIn the \&\fCcmr10\fP font,
+the \fIcrisp\fP pen has diameter zero, so serifs have square corners. In
+the \&\fCcmtt10\fP font, \fIcrisp\fP is set to a larger value and the serifs
+end in semicircles. Because the shape of the current pen can NOT be
+taken into account in \*(pS, these differences in the characters shapes
+will not be seen. This is a \fBfundamental\fR problem: given a path $p$
+and a pen $q$ (whose shape is also an arbitrary path), \*(MF
+effectively envelopes $p$ with respect to the shape of $q$; \*(pS can
+do nothing other than stroke it to produce a line of constant width.
+This incompatibility comes to light when the width of the pen is
+significant to the shape of the character\(rq.
+.pp
+In order to avoid this problem, \fHmf2ps\fP finds the internally
+generated envelope, which is used as the boundaries of the inked
+region, and uses this envelope as the outline. It does not matter, then,
+what the pen path and the pen shape are.
+.pp
+More recently, during the time that the work described herein was being
+done, there were other efforts with similar goals.
+.pp
+Doug Henderson
+.[
+henderson outline fonts
+.]
+obtained outline font characters by modifying the \&\fCendchar\fP macro,
+which is called for each character after the bitmap is generated, to take
+the bitmap for the character and white out all but the bits on the edge.
+The number of bits left on the edge is varied according to the resolution
+of the bitmap. These outlines, being bitmapped, are just as unscaleable as
+are the bitmaps for the filled-in characters.
+.pp
+Neil Raine and Graham Toal
+.[
+toal private
+.]
+have developed software that takes the bitmaps and rediscovers the
+outlines by tracing the pixels. The outlines that are used as the basis
+for \*(pS fonts are, for the most part, generated from bitmaps at 2400
+dpi. They first generate RISC OS outline fonts which are screen fonts
+for Acorn's Archimedes RISC computer. These are true scaleable
+outlines. Then, these outlines are converted into \*(pS format. Toal
+says that the the quality of the fonts produced is not too great at low
+resolutions because of shortcomings in Adobe's rendering algorithm. He
+adds that at 1200 dpi on a phototypesetter, they are indistinguishable
+from \*(MF-generated bitmapped fonts. These authors suspect that
+information that is critical for good appearance is lost when tracing
+an outline on a bitmap generated from a mathematically described
+envelope. Better results should be obtainable using the original
+envelope.
+.pp
+John Hobby
+.[
+hobby postscript output system
+.]
+has developed a program called MetaPost, which translates from an extension
+of \*(MF into \*(pS cubic splines and commands.
+His goal was to turn \*(MF into a system for
+typesetting general graphics, including embedded text. His approach,
+similar to ours, was to modify the \*(MF program into what he desired.
+Befitting his more general goals, besides modifying the output, he has
+added new commands to the input language. Moreover, his translation appears
+to be a direct mapping from a \*(MF command sequence to a
+\*(pS command sequence.
+The result is a program more powerful than \fHmf2ps\fP.
+It will be interesting to compare fonts produced by MetaPost and
+\fHmf2ps\fP for appearance and performance.
+.Su "3.4\ \ \ Methodology."
+There are a number of ways to build the compiler. They include
+.l1 1
+.le
+writing the whole compiler from \*(MF to \*(pS from scratch: This has
+the advantage that one does not have to get into another person's
+software, which is not very pleasant when the software is so big. On
+the other hand, one would have to treat the whole job of turning
+mathematical equations and any arbitrary pen shape into outlines.
+.le
+using the \*(MF output as was done by Leslie Carr:
+.[
+Carr
+.]
+This has the advantage of not requiring delving into another's
+software, but the generated information is not enough if one wants no
+deviations from the originals.
+.le
+getting into the \*(MF program: This requires examining the internals
+of the \*(MF program. However, \*(MF and \*(pS make liberal use of
+\*(BZ curves to describe non-circular curves. This fact makes the
+translation process natural. For each specified path, \*(MF creates
+control points for the associated cubic spline curves before
+calculating the bit map. \*(MF also calculates the edge offsets implied
+by the pen shape. Using the necessary information one can get a new set
+of control points that define \*(BZ curves and lines that are needed to
+build the \*(pS outline fonts.
+.e1
+.Su "3.5\ \ \ Software engineering of solution."
+The idea is to split the \*(MF program into front end and back end. The
+front end takes \*(MF specification of a character, magnification, and
+point size, and produces the envelope, i.e., the outline of the
+character, and the back end fills the envelope with bits. Taking the
+existing front end and writing a new back end that converts the
+envelope into a \*(pS specification of an outline is our method of
+producing \fHmf2ps\fP. The bit-filling process will be done by the
+printer.
+.pp
+In order to make \*(pS fonts arbitrarily scaleable, we have to ask the
+\fHmf2ps\fP program to use a very large magnification, at least to try to
+match the grid on which Adobe plots the points of its outlines. Adobe plots
+its characters on a $1000~times~1000$ grid. Thus, Adobe's resolution is
+1000 dpm (dots per em), which for design size 10 points is 7200 dpi.
+Unfortunately, \*(MF, and thus \fHmf2ps\fP accepts resolutions only up to
+3000 dpi. The results should be sufficient to produce fonts scaleable
+up to magnification 7 or 8, which is a reasonable range in
+typesetting.
+.pp
+This approach helps meet goal 6 because the original unchanged \*(MF
+program is used. Thus, exactly the same input is accepted as in the
+\*(MF program. There is some extra frosting obtained by the chosen
+approach. The program for translating \*(MF to \*(pS is actually a bit
+of an interactive environment because the new back end is an extension
+of the existing one. This existing back-end provides an interpreter
+that executes a \*(MF character definition and displays the defined
+character on the screen. Figure 3
+shows the dump of a screen containing several windows, one showing a
+\*(MF definition, another showing the result of its interpretation, and
+a third containing the \*(pS translation of the definition in the first
+window. If software to interpret \*(pS definitions were available here,
+a fourth window could be set up showing the result of interpreting the
+translation of the third window. This would allow comparison of the
+character's appearances without having to print them on paper.
+.su "4\ \ \ The program"
+.PP
+In the following discussion, the \*(MF program is often called just
+\(lq\*(MF\|\(rq.
+.pp
+The \*(MF program has been written so that it can be made to run
+efficiently in a wide variety of operating environments by making
+comparatively few changes. Such flexibility is possible because the
+program is written in the \&\fCWEB\fR language which is at a higher level
+than Pascal. The preprocessing step that converts \&\fCWEB\fR to Pascal
+is able to introduce most of the necessary refinements. Semiautomatic
+translation to other languages is also feasible, because the program
+does not make extensive use of features that are peculiar to Pascal.
+.pp
+The program has two important variations: First, there is a long and slow
+version called \s-1\fHINIMF\fR\s0, which does the extra calculations needed to
+initialize \*(MF's internal tables. It has to be run first. It
+initializes everything from scratch without reading a base file, and it
+has the capability of dumping a base file. Secondly, there is a shorter and
+faster production version called \s-1\fHVIRMF\fR\s0, which cuts the
+initialization to a bare minimum. It is a virgin program that needs
+to input a base file in order to get started. \s-1\fHVIRMF\fR\s0 typically has
+more memory capacity than \s-1\fHINIMF\fR\s0, because it does not need the
+space consumed by the dumping and undumping routines, etc.
+.pp
+In order to generate a compiler that translates \*(MF to \*(pS,
+additional external procedures and functions were added to the \*(MF
+program so that it runs exactly the same except that when it asks for
+an output file name, it asks for an additional name, for the extra
+output file that is to contain the \*(pS outlines. Those changes were
+made on the Pascal version of the \s-1\fHVIRMF\fR\s0, and were compiled later
+with \*(MF's library files.
+(It was a complete oversight on our part not to have modified the
+\&\fCWEB\fP version of \s-1\fHVIRMF\fP\s0.)
+A few extra lines were added to the
+macro file, \&\fCplain.mf\fR. These act as flags, identifying that
+\*(MF has entered some of the macros.
+.Su "4.1\ \ \ Basic idea."
+To specify a character in \*(MF, one specifies either
+an envelope (outline) or
+a center-line path and a pen head.
+For the former, \*(MF just fills the envelope with bits.
+For the latter, \*(MF pretends that it is drawing the character
+with a pen of specified
+head shape following the specified path, i.e., the center of the head
+stays on the path. The distance from the center-line path and outer
+edge of ink trail left by pen head is called the \fIoffset\fR\h'-.1m'.
+So, for a character, \*(MF follows the center-line path to calculate the path
+of offset points, i.e., the envelope, and then fills the envelope with
+bits.
+In either case, \*(MF ends up filling an envelope.
+.pp
+We need to break \*(MF into a front end and a back end at the point
+just after the envelope has been calculated. Then we provide a new back
+end that converts the envelope into \*(pS instead of filling the
+envelope with bits. Note then that the \*(pS printer will fill in the
+envelope with bits as it fills the path obtained from the envelope.
+.pp
+The following subsections describe the data and the calculations
+involved in the new back end.
+.Su "4.2\ \ \ Data structures."
+The main data structures that \*(MF keeps for a character are the
+center-line path, the pen shape, and the envelope path. There are a few
+operations that can be performed on paths, called transformations.
+.SU "4.2.1\ \ \ \*(MF's path representation."
+.ft 1
+When a \*(MF user specifies a path, \*(MF creates a list of knots and
+control points for the associated cubic spline curves. If the knots are
+$z sub 0 ,~z sub 1 ,...,~z sub n$, there are control points $z sub k
+sup +$ and $z sub k+1 sup -$ such that the cubic splines between the
+knots $z sub k$ and $z sub {k+1}$ are defined by the \*(BZ formula
+.sp
+.in +.4375i
+$z(t)~=~B(z sub k, z sub k sup + , z sub k+1 sup - , z sub k+1 ;t)$
+.sp .2v
+\h'\w'$z(t)~$'u'$=~(1~-~t) sup 3 z sub k ~+~ 3t(t~-~1) sup 2 z sub k sup +$
+.sp .2v
+\h'5P'$+~ 3t sup 2 (1~-~t)z sub k+1 sup - ~+~ t sup 3 z sub k+1$,
+.sp
+.in -.4375i
+for $0~<=~t~<=~1$.
+.pp
+There is a 7-word node for each knot $z sub k$, containing one word of
+control information and six words for the $x$ and $y$ coordinates of $z
+sub k sup -$ and $z sub k$ and $z sub k sup +$. The control
+information appears in the \fIleft_type\fR and \fIright_type\fR
+fields and they specify properties of the curve as it enters and leaves
+the knot. There is also a \fIlink\fR field, which points to the
+following knot. Before the \*(BZ control points have been calculated,
+the memory space they will ultimately occupy is taken up by information
+that can be used to compute them. The \*(MF \fImake_choices\fR
+procedure chooses angles and control points for the splines of a curve
+when the user has not specified them explicitly.
+.SU "4.2.2\ \ \ \*(MF's path transformation."
+.ft 1
+When \*(MF digitizes a path, it reduces the problem to the special case
+of paths that travel in the \fIfirst octant\fR directions; i.e., each
+cubic $z(t)~=~(x(t),y(t))$ being digitized will have the property that
+$0~<=~y prime (t)~<=~x prime (t)$. This assumption makes digitizing
+simpler and faster than if the direction of motion has to be tested
+repeatedly. When $z(t)$ is cubic, $x prime (t)$ and $y prime (t)$ are
+quadratic, hence each of the four polynomials, $x prime (t)$, $y prime (t)$, $x
+prime (t) - y prime (t)$, and $x prime (t) + y prime (t)$, crosses
+through $0$ at most twice. If we subdivide the given cubic at these
+places, we get at most nine subintervals. In each of these intervals
+each of $x prime (t)$, $y prime (t)$, $x prime (t) - y prime (t)$, and
+$x prime (t) + y prime (t)$ has a constant sign. The curve can be
+transformed in each of these subintervals so that it travels entirely
+in first octant directions, if we exchange $x$ and $- x$, $y$ and $-
+y$, and $x$ and $y$ as necessary.
+.Su "4.3\ \ \ Pens and envelopes."
+There are two kinds of pen heads that may be used, polygonal and
+elliptic. There are a number of trade-offs involved in their use. The
+first subsection treats the case of an $n$-vertex polygonal pen shape
+and the second treats the case of an elliptical pen shape. Both
+describe the influence of pen shape on the envelope of the font.
+.SU "4.3.1\ \ \ Polygonal pens."
+Suppose that the vertices of a polygon are $w sub 0 ,~w sub 1 ,...,~w
+sub n-1 , ~w sub n ~=~ w sub 0$ in counterclockwise order. A convexity
+condition requires that each vertex turns left when one proceeds from
+$w sub 0$ to $w sub 1$ $...$ to $w sub n$. The envelope is obtained if we
+offset a given curve $z(t)$ by $w sub k$ when that curve is traveling
+in a direction $z prime (t)$ lying between the directions $w sub k - w
+sub k-1$ and $w sub k+1 - w sub k$. At times $t$ when the curve
+direction $z prime (t)$ increases past $w sub k+1 - w sub k$, \*(MF
+temporarily stops plotting the offset curve and inserts a straight line
+from $z(t) + w sub k$ to $z(t) + w sub k+1$; notice that this straight
+line is tangent to the offset curve. Similarly, when the curve
+direction decreases past $w sub k - w sub k-1$, \*(MF stops plotting
+and inserts a straight line from $z(t) + w sub k$ to $z(t) + w sub
+k-1$; the latter line is actually a retrograde step, which will not be
+part of the final envelope under \*(MF's assumptions. The result of
+this consideration is a continuous path that consists of alternating
+curves and straight line segments. The segments are usually so short,
+in practice, that they blend with the curves.
+.SU "4.3.2\ \ \ Elliptical pens."
+To get the envelope of a cyclic path with respect to an ellipse, \*(MF
+calculates the envelope with respect to a polygonal approximation to
+the ellipse. This has two important advantages over trying to obtain
+the exact envelope:
+.l1 1
+.le
+Polygonal envelopes give better results, because the polygon has
+been designed to counteract problems that arise from digitization; the
+polygon includes sub-pixel corrections to an exact ellipse that make
+the results essentially independent of where the path falls on the
+raster.
+.le
+Polygonal envelopes of cubic splines are cubic splines. Hence it is
+not necessary to introduce completely different routines. By contrast,
+exact envelopes of cubic splines with respect to ellipses are
+complicated curves, more difficult to plot than cubics.
+.e1
+.Su "4.4\ \ \ Taking out data."
+After \*(MF has calculated the paths and the offsets, it is ready to
+send the values to the \fImake_moves\fR procedure which generates
+discrete moves for any four points that represent a \*(BZ curve. This
+is done for each one of the cyclic paths from which the letter is built.
+When the offsets are zero, this is done by the \fIfill_spec\fR
+procedure. Otherwise this is done by the \fIfill_envelope\fR
+procedure. In the latter case, the line segments, which were discussed
+earlier, should be taken out also in order to get smooth connections
+between the different curves that the cyclic path is built from.
+Because \*(pS describes any shape in terms of curves and lines, this is
+the point to take advantage of \*(MF's calculations, i.e., when \*(MF
+calls the \fImake_moves\fR procedure and when \*(MF draws line
+segments for offset corrections.
+.Su "4.5\ \ \ Processing the data."
+The generated data are not ready yet to be used. First, we should
+unskew, i.e., transform from the first octant back to the original, the
+paths according to the octant that the paths were traveled in before
+they were skewed. This unskewing is done by taking out the octant
+number at the moment that the \fImake_moves\fR procedure is called
+and then using \*(MF's \fIunskew\fR procedure that sets values $x
+prime$ and $y prime$ to the original coordinate values of a point,
+given an octant code and coordinates $(x,y)$ after they have been
+mapped into the first octant and skewed; the new values are sent to the
+\fIsend_p_s\fR procedure. This procedure has eight formal parameters
+that are all used when sending a curve. When sending a line,
+only four parameters are used, two to denote the start point and two to
+denote the end point; the remaining four parameters are sent as zeros
+so \fIsend_p_s\fR can distinguish whether a line was sent or a curve.
+In the next step, \fIsend_p_s\fR unscales the numbers because \*(MF
+works with units of scaled points, of which there are $2 sup 16$ in an
+ordinary point. While unscaling, the values are
+transformed in order to send them to the \*(pS dictionary
+\&\fCFontBBox\fP command. After this pre-processing,
+the data are sent to a temporary file.
+.SU "4.5.1\ \ \ Getting more information."
+When \*(MF calls the \fImake_moves\fR procedure, it does not have any
+information on the role that this path is going to play, whether the
+current cyclic path is going to be \fIfilled\fP or whether it will act as
+a boundary of a region to be \fIerased\fP.
+.pp
+In order to distinguish between the cases, more information has to be
+taken. This is done by copying the \&\fCplain.mf\fR file into a new
+file named \&\fCmyplain.mf\fR and adding a few lines to it. The
+additional code was added in order to identify \*(MF's use of the
+macros. \*(MF uses the variables for date only once, when the program
+is started, so it was decided to use them in the rest of the
+program.
+The \&\fCyear\fR is changed to $-1$ when \*(MF's \&\fCpen_stroke\fR
+macro is applied on a cyclic path, i.e., in the characters such as
+\(lqo\(rq, \(lqO\(rq, and \(lqQ\(rq, and to $-2$ when the \&\fCerase\fR
+macro is called. The \&\fCmonth\fR is changed when the \&\fCfill\fR
+macro is called. There are three kinds of paths:
+.l1 1
+.le
+paths to be \fIfilled\fP are processed using the \*(pS \&\fCfill\fR
+command.
+.le
+paths to be \fIstroked\fP are processed using the \*(pS \&\fCeofill\fR
+command.
+.le
+paths to be \fIerased\fP are processed using specialized procedures
+which will be discussed later.
+.e1
+.sp .5v
+.pp
+A letter cannot always be treated as one unit by means of the
+\&\fCfill\fR and \&\fCeofill\fR commands. For instance, the letter
+\(lqQ\(rq is built of two different paths, the first of which is
+stroked and the second of which is filled. Generating the letter
+using the \*(pS \&\fCeofill\fR command causes a hole in the image (see
+Figure 4).
+.fs
+.F+
+figure fig4.ps
+.F-
+.ca "Figure 4"
+.fe
+So while generating a letter, fill mode can be changed for each cyclic
+path. Moreover, when generating a letter whose paths should be filled,
+it is not always possible to use just one \&\fCfill\fR command (see
+Figure 5).
+.fs
+.F+
+figure fig5.ps
+.F-
+.ca "Figure 5"
+.fe
+When a \*(pS \&\fCfill\fR command is applied to a path that is composed
+of more than one subpath, say two for the sake of simplicity, and one
+subpath is inside the other and is drawn in a direction opposite to the
+external one, the internal path is considered a hole and is not filled
+(see Figure 6).
+.fs
+.F+
+figure fig6.ps
+.F-
+.ca "Figure 6"
+.fe
+So, if several paths are to be filled in this manner, the description
+of each one of them should be ended with the \&\fCfill\fR command.
+There is one more benefit to using this strategy: The \*(pS \fCcurrent
+path\fR stack becomes empty after encountering any kind of \&\fCfill\fR
+command. Therefore, using the \&\fCfill\fR command after each path can
+help avoid \&\fCstack overflow error\fRs if all paths together are too
+long.
+.SU "4.5.2\ \ \ Treating erasing paths."
+There are three methods of handling the problem of paths that should be
+erased by \fHmf2ps\fP itself:
+.l1 1
+.le
+filling with white: Because erasing paths are built in order to erase
+an existing filled area and \*(pS overlaps paths (i.e., a region is
+shown in the color that was drawn last), erasing paths can be
+implemented by filling those paths with white. This solution is the
+easiest, but it works only if the background is white and the letter is
+drawn in some level of gray. If one wants to draw a letter with
+background other than white, the resulting appearance will not be correct.
+.pp
+.le
+calculating new paths resulting from subtracting the erasing paths from
+the previous filled paths: Such a solution can be global. However, it
+costs a lot in terms of processing time and accuracy, because paths are
+given implicitly by four points, and in order to calculate the new
+paths, one should find the intersection points of \*(BZ curves, i.e.,
+to find points that lie on both \*(BZ curves, and then calculate new
+curves, which are difficult to calculate from those points.
+.pp
+.le
+using the \*(pS \&\fCeoclip\fR command: Be\%cause the letters are bounded
+in a $1000~times 1000$ box, a primary square path whose segments are
+$1000$ units long should be declared and after it all the erasing paths
+should be listed. After relocating the erasing paths we are ready to
+declare \&\fCeoclip\fR, which means that the clipping path is the
+external primary one and the internal paths, the erasing paths, are
+holes. This is an elegant solution that uses the power of the language
+and is available in simple situations in which there is no intersection
+between the erasing paths (see Figure 7).
+If there were intersections, a little more
+sophisticated use of the \&\fCeoclip\fR command would be needed. Relocation
+of the erasing paths is done by the procedure \&\fCdoarrange\fR.
+.e1
+.fs
+.F+
+figure fig7.ps
+.F-
+.ca "Figure 7"
+.fe
+.pp
+There are other problems caused by the erasing paths. Because the
+erasing paths have segments in common with paths to be filled, \*(pS must
+decide whether the common segments are in the clipping path or not.
+\*(pS does not seem to have a consistent policy on that and it seems to
+be that the decision is taken arbitrarily (see Figure 8).
+.fs
+.F+
+figure fig8.ps
+.F-
+.ca "Figure 8"
+.fe
+An attempt to resolve the clipping path problem led to the first author
+sending the following electronic message (obviously, not as nicely
+formatted as herein) to Glenn Reid of Adobe Systems, Inc.
+.qb
+.nf
+From simon Tue Mar 21 13:22:32 1989
+To: greid@adobe.com
+Subject: Problem in PostScript
+.fi
+.sp
+Dear Mr. Reid
+.sp
+I have got a problem in understanding the PostScript
+policy in determining \(lqwhat is in the clipping path\(rq.
+I think there is a problem in the boundaries.
+Here is an example that shows that problem:
+.es
+.ft C
+ gsave
+ initclip
+ newpath
+
+ 0 0 moveto
+ 0 1000 lineto
+ 1000 1000 lineto
+ 1000 0 lineto
+ 0 0 lineto
+
+ 300 100 moveto
+ 700 100 lineto
+ 700 300 lineto
+ 300 300 lineto
+ 300 100 lineto
+
+ 700 900 moveto
+ 300 900 lineto
+ 300 700 lineto
+ 700 700 lineto
+ 700 900 lineto
+
+ eoclip
+
+ newpath
+ 100 100 moveto
+ 900 100 lineto
+ 900 900 lineto
+ 100 900 lineto
+ 100 100 lineto
+ fill
+ grestore
+.ee
+.ft R
+As you see, the problem is that on top of the shape, the line
+which belongs to the upper \(lqhole\(rq in the clipping path and to the
+current path ( to be filled ) is drawn, and on bottom of the
+shape it is not.
+.sp
+This is happening both on the Apple Laser printer and on the
+QMS-80.
+.sp
+I would be glad to have a reply from you.
+.sp
+.nf
+Thanks in advance
+Shimon Yanai
+C.S Dep.
+Technion
+.fi
+.qe
+What Mr. Reid saw when he printed the \*(pS commands contained in the
+message is reproduced in Figure 9.
+.fs
+.F+
+figure fig9.ps
+.F-
+.ca "Figure 9"
+.fe
+Mr. Reid replied with the following:
+.qb
+.nf
+From: greid@adobe.com (Glenn Reid)
+To: Shimon Yanai <simon@techunix>
+Cc: greid@adobe.com
+Subject: Re: Problem in PostScript
+In-Reply-To: Your message of Wed, 22 Mar 89 ...
+Date: Wed, 22 Mar 89 11:41:35 PST
+.fi
+.sp
+The problem is that the path you are filling falls exactly on the edge
+of the clipping path. This produces a zero-width area to fill, and
+unfortunately it sometimes fills and sometimes does not with the
+current fill algorithm. I believe that it is related to the direction
+of the paths; if the paths are going in opposite directions along the
+same line, it will fill with a one-pixel area, but if they are going in
+the same direction, it will not fill.
+I believe this has been fixed to be more consistent in Display
+PostScript, for what it's worth.
+.sp
+Glenn Reid
+.br
+Adobe Systems
+.qe
+.pp
+The idea of using opposite directions had been checked before sending
+the letter, so the problem had to be solved within the back end of
+\fHmf2ps\fP. The
+erasing paths near the top of the letter had their $y$ coordinates
+increased by 0.8 points, and those near the bottom had their $y$
+coordinates decreased by the same amount. This shift is invisible to
+the human eye because the font definitions are in terms of hundreds of
+points (see Figure 10). This solution was designed to work with most
+existing \*(MF fonts. It is possible that there will be fonts that are not
+treated well by this solution.
+.fs
+.F+
+figure fig10.ps
+.F-
+.ca "Figure 10"
+.fe
+.Su "4.6\ \ \ Optimization."
+Optimization is done in order to make the description of the fonts
+shorter and to save work in the \*(pS interpreter. This is done in
+three ways:
+.l1 1
+.le
+not printing lines with length zero. As was said earlier, the \*(MF
+program prints lines to connect offset points. There are times that
+after rounding or truncating the output data, the start point and the
+end point are equal. In such cases, the lines are eliminated.
+.le
+checking if the \*(BZ curve acts as a line. From the definition of the
+\*(BZ curve, it is known that if the two control points lie on the line
+that connects the start point and the end point, the curve is of degree
+one. In such cases \fHmf2ps\fP generates a command to print a line from
+the start point to the end point, thus saving space and avoiding
+redundant calculations for the \*(pS interpreter.
+.le
+checking if a series of consecutive line segments are in the same line.
+This is done by storing the segments in a buffer and checking whether a
+new segment is collinear with the last stored.
+.e1
+.Su "4.7\ \ \ Changed or added routines."
+The following is a list of routines that were changed or added in order
+to build \fHmf2ps\fP from \*(MF.
+.in +1P
+.LE
+\fIprintchar\fP was modified to get character names.
+.LE
+\fIfixdateandtime\fP was modified to initialize variables that were used as flags in the macros.
+.LE
+\fIfillspec\fP was modified to send out data on splines.
+.LE
+\fIskewlineedges\fP was modified to send out offset lines.
+.LE
+\fIdualmoves\fP was modified to send out offset lines.
+.LE
+\fIfillenvelope\fP was modified to send out data on splines.
+.LE
+\fIdostatement\fP was modified to identify tokens that are strings.
+.LE
+\fImain\fP was modified to call the \fHmf2ps\fP procedure in the beginning and ending of the program.
+.LE
+\fIsendcurve\fP was added to unskew spline values and to send them to the next process.
+.LE
+\fIsendline\fP was added to unskew line values and to send them to the next process.
+.LE
+\fIok\fP was added to check if two lines are collinear.
+.LE
+\fIrestore\fP was added to restore the parameters of the last line.
+.LE
+\fIrecall\fP was added to recall values from the buffer.
+.LE
+\fIus\fP was added to convert the \*(MF scale so that a letter would fit the
+Adobe standard $1000~times~1000$ bounding box.
+.LE
+\fIsend_p_s\fP was added to create a \*(pS file of lines and curves.
+.LE
+\fImakemoves\fP was modified to send out spline data.
+.LE
+\fIdump\fP was added to append information from the file named \&\fCf\fP to the file named \&\fCg\fP.
+.LE
+\fIcheckerase\fP was added to identify the file that contains \(lqerase\(rq commands, and their position within the file.
+.LE
+\fIdoarrange\fP was added to put erasing paths at the beginning of the file.
+.LE
+\fIprint_start\fP was added to signal the beginning of a new cyclic path to be processed.
+.LE
+\fIprint_end\fP was added to signal the end of the current cyclic path.
+.LE
+\fIinit_ps\fP was added to make initializations.
+.LE
+\fImakenewdef\fP was added to make initializations when more than one character
+occurs in the input.
+.LE
+\fIcloseolddef\fP was added to close the last definition.
+.LE
+\fItini_ps\fP was added to handle the ending of the process.
+.LE
+\fIauxprintchar\fP was added to print characters.
+.LE
+\fIauxprint\fP was added to print strings.
+.in -1P
+.su "5\ \ \ Operation of \fHmf2ps\fP in a \fHU\s-2NIX\s0\fP environment"
+.ft 1
+.PP
+When invoked,
+\fHmf2ps\fP
+first asks for an output file name. For the example this file is called
+\&\fCex1\fP. \fHmf2ps\fP then asks,
+.ES
+.fi
+.na
+\(lq\&\fCAre you creating the whole dictionary (y/n)?\fP\(rq.
+.EE
+.ad
+If the answer is other than \(lq\&\fCy\fP\(rq
+or \(lq\&\fCY\fP\(rq, it is considered \(lq\&\fCno\fP\(rq. If the
+answer is \(lq\&\fCy\fP\(rq or \(lq\&\fCY\fP\(rq, then the whole
+dictionary is created. This means that \fHmf2ps\fP creates a \*(pS
+dictionary that includes entries for all the characters that are in
+the input, e.g., \&\fCcmr10\fP set. This dictionary needs additional
+definitions such as \fIleft side bearing, width, bounding box\fP, etc.
+These definitions need information on character features that must be
+calculated within the program. Otherwise, the whole dictionary is not
+created and the program treats the input as a single character
+definition that is to be translated into a \*(pS outline definition.
+After \fHmf2ps\fP prompts \(lq\&\fC**\fP\(rq, we are in the \*(MF
+environment. Now the user inputs
+.ES
+\s-1\\mode=hires;\\nodisplays;\\input cmr10;\(cr\s0
+.EE
+After \fHmf2ps\fP has finished, the resulting \*(pS font dictionary can
+be used to print text. In order to print text, the font dictionary
+should be installed in some formatter's font source directory, and then
+it can be loaded through the formatter's commands. The dictionary
+followed by appropriate \fHshow\fP and \fHshowpage\fP commands can also
+be sent directly to the printer.
+.su "6\ \ \ Evaluation of results"
+.PP
+This section evaluates the \fHmf2ps\fP program relative to goals
+established in section 3.2. The program was produced as a variation of
+\*(MF and it accepts any \*(MF font definition and produces a \*(pS
+outline font scaleable up to magnification 8, or to point size 80 if
+you are not a purist. Thus goals 6 and 1 have been entirely met and
+goal 2 is partially met. To meet goal 2 fully the program must be
+modified to allow large enough arrays to handle magnifications up to
+7200; this is left to future work.
+.pp
+It remains to evaluate the appearance and sizes of the outline fonts
+relative to the bitmapped fonts to see if goals 3, 4, and 5 have been
+met.
+.Su "6.1\ \ \ Appearance."
+In order to compare appearances, the outline font (Sub\%sub\%fi\%gure P)
+and and the 300 dpi bitmapped font (Sub\%sub\%fi\%gure M) generated from
+the same \*(MF definition are used to
+print similar sentences at one, two, or three different sizes or
+magnifications on three devices of differing resolutions.
+The sentences are printed in the \&\fCcmr\fP (Sub\%fi\%gure R),
+\&\fCcmtt\fP (Sub\%fi\%gure T), and \&\fClasy\fP (Sub\%fi\%gure S) typefaces.
+The bitmapped fonts may be printed at design sizes 7, 8, 10, or 12, and
+the outline fonts may be printed at magnifications .7, .8, 1.0, or 1.2.
+Finally, the three devices are the 300 dpi LaserWriterII (Figure
+11-LW300), the 600 dpi Varityper (Figure 11-VT600), and the 1270 dpi
+Linotronic 300 (Figure 11-LT1270). The bitmapped font examples are
+formatted with \*(TX while the outline font examples are hand-coded \*(pS
+files sent directly to the printer. Since the
+formatter with which this paper is printed can use arbitrary \*(pS
+fonts, half of the examples could have been done in-line without
+pasting in. However, for fairness in the comparison, all examples were
+cut out and pasted in.
+.pp
+There are visible differences due to differences in the formatting
+software. \*(TX squeezes the letters closer together than does the \*(pS
+engine. Moreover, the interword space is constant in the \*(pS
+dictionary but is varied by \*(TX according to the line structure.
+These differences are not the differences that are at issue here.
+.pp
+On the 300 dpi device, the characters from the bitmapped fonts print thinner
+than are those of the outline fonts. However, the edges of both sets are
+equally smooth or jagged as the case may be in all sizes. Overall, then,
+the appearance of the characters of the bitmapped fonts is crisper than
+that of the outline fonts.
+On the higher resolution devices,
+the thicknesses of the characters are closer to being
+equal at all sizes. Thus, the \*(MF program does a better job of building a
+correctly sized bitmap at 300 dpi than does the 300 dpi \*(pS engine of the
+LaserWriterII. The latter seems to round up too much. However, both
+seem to get the edges equally smooth even at low sizes and low resolutions.
+.pp
+At the two higher resolutions, the outline fonts are significantly better
+than the outline fonts at lower resolutions and are significantly better
+than the bitmapped fonts at the same resolution of printing. However, this
+latter is true because the bitmapped fonts were generated by the \*(MF
+program specifically to be printed at 300 dpi.
+When a 300-dpi bitmap is printed with no scaling at 600 or 1270 dpi, it
+remains a 300-dpi bitmap. As expected, the 300-dpi bitmapped fonts print better
+at 300 dpi than they do at the two higher resolutions.
+.pp
+The generated outlines are not fine-tuned for printing at low resolutions,
+such as 300 dpi,
+as are the \*(MF-generated bitmaps. It might be useful to make use of
+the \*(pS facilities for hinting to improve the appearance of the
+characters printed from the outlines at low resolutions.
+.pp
+Figure 12 shows samples of similar sentences printed on the same three
+devices using the standard Helvetica, Times
+Roman, and Courier \*(pS outline fonts built into most \*(pS-executing
+laser printers.
+It appears to these authors that the standard \*(pS fonts are
+significantly better than those generated from \*(MF fonts. However,
+this is not surprising. Adobe uses a grid of $1000~times~1000$ for its
+character definitions, resulting in a resolution of 7200 dpi for characters
+printed at point size 10.
+Because of size limitations of the
+\*(MF program the \*(MF outline fonts are using a resolution of 3,000
+points per inch. However, when using the letters in small sizes such as
+from 10 to 70,
+quality differences are hardly visible especially when working
+with printers that have a resolution of 300 points per inch such as the
+Apple LaserWriter.
+Moreover, Adobe makes liberal use of hinting to
+improve the appearance of its fonts at low resolutions.
+We completely ignored hinting, as we did not see any way to
+automatically generate the hints.
+.Su "6.2\ \ \ Sizes of fonts."
+Recall that it is necessary to compare the size of the \*(pS outline
+font for a particular \*(MF definition to the sizes of the bitmapped
+fonts in \*(pS fonts for the individual and all magnifications.
+.pp
+This comparison is made in this section for the \&\fCcmr10\fP font at the
+standard set of six magnifications 1, 1.095, 1.2, 1.44, 1.728, and 2.07
+(which are approximations of 1.2 raised to the powers 0, .5, 1, 2, 3,
+and 4, respectively). In addition, as a gesture to those who are not
+purists and accept magnifications of the 10 point design size as
+different point sizes, the comparison includes the \&\fCcmr\fP font at
+point size 5, 6, 7, 8, 9, 10, 12, and 17, the standard eight design
+sizes maintained for use with \*(TX.
+.pp
+Table 1 shows the sizes in bytes. Thus it is clear that the
+\*(pS outline font is bigger than any bitmapped font and that goal 4
+fails. Moreover, it is clear that the outline font is bigger than the
+sum over all magnifications of one design size and than the sum over
+all standard design sizes. Thus goal 5 fails. In fact, this failure is the
+reason that the samples of Figure 11 involve only upper case letters. Samples
+with complete fonts with both cases often overloaded the printer available
+to the students at the time this work was done.
+.TS
+center;
+l r l r l.
+Font Design Magni- Bitmap Outlines
+ size fication (size in (size in
+ bytes) bytes)
+_
+\fCcmr\fP 10 1.0 22,812 245,000
+\ \ " 10 1.095 24,231 \ \ \ \ "
+\ \ " 10 1.2 26,044 \ \ \ \ "
+\ \ " 10 1.44 31,892 \ \ \ \ "
+\ \ " 10 1.728 39,614 \ \ \ \ "
+\ \ " 10 2.07 50,578 \ \ \ \ "
+\fCcmr\fP 5 1.0 16,729 \ \ \ \ "
+\ \ " 6 1.0 17,757 \ \ \ \ "
+\ \ " 7 1.0 18,820 \ \ \ \ "
+\ \ " 8 1.0 20,041 \ \ \ \ "
+\ \ " 9 1.0 21,580 \ \ \ \ "
+\ \ " 12 1.0 25,658 \ \ \ \ "
+\ \ " 17 1.0 37,140 \ \ \ \ "
+_
+Total 352,896 245,000
+.TE "Table 1"
+.br
+.RT
+.pp
+However, do note that the outline font is smaller than the sum over all
+design sizes and magnifications thereof.
+.pp
+So in terms of disk space for the non-purists, the outline font
+represents a savings. Again notice that not all magnifications of the
+bitmapped fonts are maintained and the outline font is arbitrarily
+scaleable. Moreover, as the magnification grows the size of the bitmap
+grows even more rapidly.
+.pp
+The disappointment with respect to saving printer and disk memory says
+that it is important to spend more effort to optimize the outline
+font.
+.pp
+All is not lost, though! As this paper was being prepared for publication
+in \*(TB,
+one reviewer, Nelson Beebe, pointed out something that we can only kick
+ourselves for not noticing. The \*(pS outline fonts that are generated by
+\fHmf2ps\fP are horrendously wasteful in space. They use original, built-in
+command names and absolute coordinates. A significant reduction in size can
+be obtained by definition and use in the outlines of single-character
+command names, e.g., \(lq\fCM\fP\(rq for \(lq\fCmoveto\fP\(rq, and by use
+of relative versions of these commands with operands of fewer digits after
+the initial absolute \&\fCmoveto\fP of any character. A simple filter was
+written to obtain new compressed versions of the \*(pS outline fonts. The
+appearances of the output when printing with these new versions is
+unchanged, but what is sent to the printer is significantly smaller, about
+37.7% smaller. The reduction on a per-letter basis is about 45%.
+Table 2 shows the information of Table 1 for the new versions of the
+outline fonts.
+.TS
+center;
+l r l r l.
+Font Design Magni- Bitmap Outlines
+ size fication (size in (size in
+ bytes) bytes)
+_
+\fCcmr\fP 10 1.0 22,812 152,670
+\ \ " 10 1.095 24,231 \ \ \ \ "
+\ \ " 10 1.2 26,044 \ \ \ \ "
+\ \ " 10 1.44 31,892 \ \ \ \ "
+\ \ " 10 1.728 39,614 \ \ \ \ "
+\ \ " 10 2.07 50,578 \ \ \ \ "
+\fCcmr\fP 5 1.0 16,729 \ \ \ \ "
+\ \ " 6 1.0 17,757 \ \ \ \ "
+\ \ " 7 1.0 18,820 \ \ \ \ "
+\ \ " 8 1.0 20,041 \ \ \ \ "
+\ \ " 9 1.0 21,580 \ \ \ \ "
+\ \ " 12 1.0 25,658 \ \ \ \ "
+\ \ " 17 1.0 37,140 \ \ \ \ "
+_
+Total 352,896 152,670
+.TE "Table 2"
+.br
+.RT
+.pp
+There are still better compressions that can be achieved. According to
+Beebe,
+.[
+beebe private
+.]
+Toal and Raine's outline representation of \&\fCcmr\fP at 10 points
+requires about twice the space needed for bitmaps of the same; at 14 to
+16 points, the outlines and the bitmaps occupy about the same amount of
+space; above 16 points, the outlines are smaller than the bitmaps. It
+is clear that better encodings exist than we explored and these must be
+explored for any future version of \fHmf2ps\fP.
+.pp
+One such better encoding appears to be that used by Adobe for its own
+proprietary fonts; fonts encoded this way have a FontType of 1.
+User defined fonts have a FontType of 3. Beebe
+.[
+beebe private
+.]
+says that type 1 fonts are handled with greater efficiency than type 3
+fonts on most existing \*(pS interpreters, especially those that are based
+on Adobe-licensed code.
+Adobe has recently published specifications for the type 1 font encoding,
+.[
+adobe type 1
+.]
+thus allowing anyone to produced type 1 fonts. Beebe believes that the
+market forces will drive other companies to encode their fonts as type 1.
+Moreover, as more and more windowing systems based on \*(pS, e.g., NeWS
+and NeXT, appear, the attraction of \*(pS outline fonts will increase, as
+then the same font can be used for both printing and previewing. Thus, the
+incentive will be to convert \*(MF fonts into type 1 \*(pS outline fonts.
+.pp
+Ultimately, the tradeoff is between the size of the font sent to the
+printer, and the time it takes for the printer to decode the program
+for the characters. However, with proper cacheing, a big enough cache,
+and a not very fancy document, the decoding is done only once per
+character for the document!
+.su "7\ \ \ Future work"
+.PP
+For the future, there are a number of improvements that can be made.
+Currently, each letter of the \*(pS outline fonts is described as a set
+of cyclic paths. When all are filled or stroked, one gets the desired
+letter. Some of those cyclic paths have a common boundary that is
+inside the letter and is not necessary for the outline description of
+the letter as a whole. Eliminating these paths and creating one
+outline for the letter will save space. Today this can be done
+manually, and is worth the effort because the translation process is
+done only once. From that time on, the font is used the way it is.
+.pp
+As was demonstrated by Beebe's rescue of our result, closer attention
+should be paid to obtaining more compact representations of character
+outlines, representations for which \*(pS routines can be written to
+interpret them into standard outline drawing commands.
+Collapsing commands into single characters and using relative movements
+saved significant amounts of space. Perhaps, even more dramatic savings can
+be obtained by giving coordinates and distances in hexadecimal.
+.pp
+More effort can be spent on modifying the program in order to allow
+magnifications up to 7200 points. Thus, no jaggies will be seen, as
+occasionally happens when using higher magnifications, e.g., in our
+translated fonts at magnification 8. This could be done by enlarging
+the program arrays to handle characters based on 7200 points. A
+sophisticated solution is required if one wants to save room while
+compiling the input font. In such a case, any linear translation which
+is done within the \*(pS program is with a factor less than 1.
+.pp
+\*(MF was changed for \*(TX 3.0. It is necessary to build a new version of
+\fHmf2ps\fP based on this latest version of \*(MF. As the changes to the
+\*(MF program deal mainly with ligatures and kerning, the calculation of
+envelopes is probably not affected. Therefore, it is likely that
+the portion of \*(MF up to the calculation of the envelope can still be
+used as a front end for \fHmf2ps\fP with very little change in the
+portion of the program we wrote.
+.pp
+Finally, it might be worthwhile, for the sake of portability to other
+systems and enhanceability by \pother
+.sp
+humans, to rewrite or to write the next
+version of \fHmf2ps\fP with \&\fCWEB\fP.
+.su "Acknowledgments"
+.PP
+The authors thank the
+\*(TB editors, and Nelson Beebe for their help, sharp comments, and
+result-saving ideas.
+Dealing with their comments made this a better paper.
+.su "References"
+.[
+$LIST$
+.]
+.RT
+.sp 2
+.ta 1P +1P
+.in +6P
+.ps 9
+.vs 11
+.nf
+.ti -1P
+\(dm Shimon Yanai
+IBM Science and Technology
+ Center
+Technion City
+.sp
+Haifa 32000
+Israel
+yanai@israearn.bitnet
+.sp
+.ti -1P
+\(dm Daniel M. Berry
+Computer Science
+Technion
+Haifa 32000
+Israel
+dberry@cs.technion.ac.il
+.fi
+.in -6P
+.RT
diff --git a/fonts/utilities/mf2ps/doc/paper.pdf b/fonts/utilities/mf2ps/doc/paper.pdf
new file mode 100644
index 0000000000..343d5ecc7a
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/paper.pdf
Binary files differ
diff --git a/fonts/utilities/mf2ps/doc/paper.ps b/fonts/utilities/mf2ps/doc/paper.ps
new file mode 100644
index 0000000000..8803b81c31
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/paper.ps
@@ -0,0 +1,16427 @@
+%!PS-Adobe-1.0
+%%Creator: ah.sei.cmu.edu:dberry (Daniel Berry)
+%%Title: stdin (ditroff)
+%%CreationDate: Wed Oct 17 22:08:40 1990
+%%EndComments
+/PageLength 11 def
+% lib/psdit.pro -- prolog for psdit (ditroff) files
+% Copyright (c) 1984, 1985 Adobe Systems, Inc. All Rights Reserved.
+
+/PageLength 11 def
+% psfig additions
+/DocumentInitState [ matrix currentmatrix currentlinewidth currentlinecap
+currentlinejoin currentdash currentgray currentmiterlimit ] cvx def
+
+/startFig {
+ /SavedState save def
+ userdict maxlength dict begin
+ currentpoint transform
+
+ DocumentInitState setmiterlimit setgray setdash setlinejoin setlinecap
+ setlinewidth setmatrix
+
+ itransform moveto
+
+ /ury exch def
+ /urx exch def
+ /lly exch def
+ /llx exch def
+ /y exch 72 mul resolution div def
+ /x exch 72 mul resolution div def
+
+ currentpoint /cy exch def /cx exch def
+
+ /sx x urx llx sub div def
+ /sy y ury lly sub div def
+
+ sx sy scale
+
+ cx sx div llx sub
+ cy sy div ury sub translate
+
+ /DefFigCTM matrix currentmatrix def
+
+ /initmatrix {
+ DefFigCTM setmatrix
+ } def
+ /defaultmatrix {
+ DefFigCTM exch copy
+ } def
+
+ /initgraphics {
+ DocumentInitState setmiterlimit setgray setdash
+ setlinejoin setlinecap setlinewidth setmatrix
+ DefFigCTM setmatrix
+ } def
+
+ /showpage {
+ initgraphics
+ } def
+
+} def
+/clipFig {
+ currentpoint 6 2 roll
+ newpath 4 copy
+ 4 2 roll moveto
+ 6 -1 roll exch lineto
+ exch lineto
+ exch lineto
+ closepath clip
+ newpath
+ moveto
+} def
+/doclip { llx lly urx ury clipFig } def
+/endFig {
+ end SavedState restore
+} def
+/globalstart {
+ fontnum fontsize fontslant fontheight
+ mh my resolution slotno currentpoint
+ pagesave restore gsave
+} def
+/globalend {
+ grestore moveto
+ /slotno exch def /resolution exch def /my exch def
+ /mh exch def
+ /fontheight exch def
+ /fontslant exch def /fontsize exch def /fontnum exch def
+ F
+ /pagesave save def
+} def
+% end of psfig additions
+
+/$DITroff 140 dict def $DITroff begin
+/fontnum 1 def /fontsize 10 def /fontheight 10 def /fontslant 0 def
+/xi
+ {0 72 PageLength mul translate 72 resolution div dup neg scale 0 0 moveto
+ /fontnum 1 def /fontsize 10 def /fontheight 10 def /fontslant 0 def
+ F /firstpage true def /pagesave save def}def
+/PB{save /psv exch def currentpoint translate
+ resolution 72 div dup neg scale 0 0 moveto}def
+/PE{psv restore}def
+/arctoobig 90 def /arctoosmall .05 def
+/m1 matrix def /m2 matrix def /m3 matrix def /oldmat matrix def
+/tan{dup sin exch cos div}def
+/point{.1 resolution add 72 div mul}def
+/dround {transform round exch round exch itransform}def
+/xT{/devname exch def}def
+/xr{/mh exch def /my exch def /resolution exch def}def
+/xp{}def
+/xs{docsave restore end}def
+/xt{showpage}def
+/xf{/fontname exch def /slotno exch def fontnames slotno get fontname eq not
+ {fonts slotno fontname findfont put fontnames slotno fontname put}if}def
+/xH{/fontheight exch def}def
+/xS{/fontslant exch def}def
+/s{/fontsize exch def /fontheight fontsize def}def
+/f{/fontnum exch def}def
+/F {fontheight 0 le {/fontheight fontsize def}if
+ fonts fontnum get fontsize point 0 0 fontheight point neg 0 0 m1 astore
+ fontslant 0 ne{1 0 fontslant tan 1 0 0 m2 astore m3 concatmatrix}if
+ makefont setfont .04 fontsize point mul 0 dround pop setlinewidth
+ } def
+/X{exch currentpoint exch pop moveto show}def
+/N{3 1 roll moveto show}def
+/Y{exch currentpoint pop exch moveto show}def
+/S{show}def
+/MX{currentpoint exch pop moveto}def
+/MY{currentpoint pop exch moveto}def
+/MXY{moveto}def
+/cb{pop}def % action on unknown char -- nothing for now
+/n{}def /w{}def
+/p{pop firstpage not{showpage}if pagesave restore /pagesave save def
+ /firstpage false def}def
+/abspoint{currentpoint exch pop add exch currentpoint pop add exch}def
+/distance{dup mul exch dup mul add sqrt}def
+/dstroke{currentpoint stroke moveto}def
+/Dl{2 copy gsave rlineto stroke grestore rmoveto}def
+/arcellipse{/diamv exch def /diamh exch def oldmat currentmatrix pop
+ currentpoint translate 1 diamv diamh div scale /rad diamh 2 div def
+ currentpoint exch rad add exch rad -180 180 arc oldmat setmatrix}def
+/Dc{dup arcellipse dstroke}def
+/De{arcellipse dstroke}def
+/Da{/endv exch def /endh exch def /centerv exch def /centerh exch def
+ /cradius centerv centerv mul centerh centerh mul add sqrt def
+ /eradius endv endv mul endh endh mul add sqrt def
+ /endang endv endh atan def
+ /startang centerv neg centerh neg atan def
+ /sweep startang endang sub dup 0 lt{360 add}if def
+ sweep arctoobig gt
+ {/midang startang sweep 2 div sub def /midrad cradius eradius add 2 div def
+ /midh midang cos midrad mul def /midv midang sin midrad mul def
+ midh neg midv neg endh endv centerh centerv midh midv Da
+ currentpoint moveto Da}
+ {sweep arctoosmall ge
+ {/controldelt 1 sweep 2 div cos sub 3 sweep 2 div sin mul div 4 mul def
+ centerv neg controldelt mul centerh controldelt mul
+ endv neg controldelt mul centerh add endh add
+ endh controldelt mul centerv add endv add
+ centerh endh add centerv endv add rcurveto dstroke}
+ {centerh endh add centerv endv add rlineto dstroke}ifelse}ifelse}def
+
+/Barray 200 array def % 200 values in a wiggle
+/D~{mark}def
+/D~~{counttomark Barray exch 0 exch getinterval astore /Bcontrol exch def pop
+ /Blen Bcontrol length def Blen 4 ge Blen 2 mod 0 eq and
+ {Bcontrol 0 get Bcontrol 1 get abspoint /Ycont exch def /Xcont exch def
+ Bcontrol 0 2 copy get 2 mul put Bcontrol 1 2 copy get 2 mul put
+ Bcontrol Blen 2 sub 2 copy get 2 mul put
+ Bcontrol Blen 1 sub 2 copy get 2 mul put
+ /Ybi /Xbi currentpoint 3 1 roll def def 0 2 Blen 4 sub
+ {/i exch def
+ Bcontrol i get 3 div Bcontrol i 1 add get 3 div
+ Bcontrol i get 3 mul Bcontrol i 2 add get add 6 div
+ Bcontrol i 1 add get 3 mul Bcontrol i 3 add get add 6 div
+ /Xbi Xcont Bcontrol i 2 add get 2 div add def
+ /Ybi Ycont Bcontrol i 3 add get 2 div add def
+ /Xcont Xcont Bcontrol i 2 add get add def
+ /Ycont Ycont Bcontrol i 3 add get add def
+ Xbi currentpoint pop sub Ybi currentpoint exch pop sub rcurveto
+ }for dstroke}if}def
+end
+/ditstart{$DITroff begin
+ /nfonts 49 def
+ /fonts[nfonts{0}repeat]def
+ /fontnames[nfonts{()}repeat]def
+/docsave save def
+}def
+
+% character outcalls
+/oc
+ {/pswid exch def /cc exch def /name exch def
+ /ditwid pswid fontsize mul resolution mul 72000 div def
+ /ditsiz fontsize resolution mul 72 div def
+ ocprocs name known{ocprocs name get exec}{name cb}
+ ifelse}def
+/fractm [.65 0 0 .6 0 0] def
+/fraction
+ {/fden exch def /fnum exch def gsave /cf currentfont def
+ cf fractm makefont setfont 0 .3 dm 2 copy neg rmoveto
+ fnum show rmoveto currentfont cf setfont(\244)show setfont fden show
+ grestore ditwid 0 rmoveto} def
+
+/ocb
+ {/s2 .5 dm def /s4 .25 dm def
+ 2 setlinejoin gsave currentpoint newpath dround translate 0 0 moveto}def
+/oce {grestore ditwid 0 rmoveto}def
+/occ {grestore}def
+/dm {ditsiz mul}def
+/4p {pop pop pop pop}def
+
+/ocprocs 25 dict def ocprocs begin
+(X0) {ocb oce}def %room for building special characters with X names
+(X1) {ocb oce}def %all these do is move the width of the char which is 1 em
+(X2) {ocb oce}def
+(X3) {ocb oce}def
+(X4) {ocb oce}def
+(X5) {ocb oce}def
+(X6) {ocb oce}def
+(X7) {ocb oce}def
+(X8) {ocb oce}def
+(X9) {ocb oce}def
+(XX) {ocb oce}def
+
+(MD) {ocb 0 -.25 dm moveto .4333 dm -1 dm lineto .8666 dm -.25 dm lineto
+ 0 -.25 dm lineto closepath stroke occ
+ ocb 0 -.75 dm moveto .8666 dm -.75 dm lineto .4333 dm 0 dm lineto
+ 0 -.75 dm lineto closepath stroke oce}def
+(OU) { ocb .5 dm -.35 dm moveto currentpoint newpath .35 dm 0 360 arc closepath
+ stroke occ
+ ocb .3 dm -.50 dm moveto .3 dm -.3 dm lineto
+ .5 dm -.3 dm .2 dm 180 360 arcn .7 dm -.50 dm lineto stroke oce}def
+
+(14) {(1)(4)fraction}def
+(12) {(1)(2)fraction}def
+(34) {(3)(4)fraction}def
+(18) {(1)(8)fraction}def
+(38) {(3)(8)fraction}def
+(58) {(5)(8)fraction}def
+(78) {(7)(8)fraction}def
+(13) {(1)(3)fraction}def
+(23) {(2)(3)fraction}def
+
+(ff) {gsave (f) show -.06 dm 0 rmoveto (f) show oce}def
+(Fl) {gsave (f) show -.06 dm 0 rmoveto (\257) show oce}def
+(Fi) {gsave (f) show -.06 dm 0 rmoveto (\256) show oce}def
+end
+
+% DIThacks fonts for some special chars
+50 dict dup begin
+/FontType 3 def
+/FontName /DIThacks def
+/FontMatrix [.001 0.0 0.0 .001 0.0 0.0] def
+/FontBBox [-220 -280 900 900] def% a lie but ...
+/Encoding 256 array def
+0 1 255{Encoding exch /.notdef put}for
+Encoding
+ dup 8#040/space put %space
+ dup 8#110/rc put %right ceil
+ dup 8#111/lt put %left top curl
+ dup 8#112/bv put %bold vert
+ dup 8#113/lk put %left mid curl
+ dup 8#114/lb put %left bot curl
+ dup 8#115/rt put %right top curl
+ dup 8#116/rk put %right mid curl
+ dup 8#117/rb put %right bot curl
+ dup 8#120/rf put %right floor
+ dup 8#121/lf put %left floor
+ dup 8#122/lc put %left ceil
+ dup 8#140/sq put %square
+ dup 8#141/bx put %box
+ dup 8#142/ci put %circle
+ dup 8#143/br put %box rule
+ dup 8#144/rn put %root extender
+ dup 8#145/vr put %vertical rule
+ dup 8#146/ob put %outline bullet
+ dup 8#147/bu put %bullet
+ dup 8#150/ru put %rule
+ dup 8#151/ul put %underline
+ pop
+/DITfd 100 dict def
+/BuildChar{0 begin
+ /cc exch def /fd exch def
+ /charname fd /Encoding get cc get def
+ /charwid fd /Metrics get charname get def
+ /charproc fd /CharProcs get charname get def
+ charwid 0 fd /FontBBox get aload pop setcachedevice
+ 40 setlinewidth
+ newpath 0 0 moveto gsave charproc grestore
+ end}def
+/BuildChar load 0 DITfd put
+%/UniqueID 5 def
+/CharProcs 50 dict def
+CharProcs begin
+/space{}def
+/.notdef{}def
+/ru{500 0 rls}def
+/rn{-55 725 moveto 500 0 rlineto 25 setlinewidth stroke}def
+/vr{125 800 moveto 0 -770 rls}def
+/bv{125 800 moveto 0 -1000 rls}def
+/br{0 770 moveto 0 -1040 rls}def
+/ul{0 -250 moveto 500 0 rls}def
+/ob{200 250 rmoveto currentpoint newpath 200 0 360 arc closepath stroke}def
+/bu{200 250 rmoveto currentpoint newpath 200 0 360 arc closepath fill}def
+/sq{80 0 rmoveto currentpoint dround newpath moveto
+ 640 0 rlineto 0 640 rlineto -640 0 rlineto closepath stroke}def
+/bx{80 0 rmoveto currentpoint dround newpath moveto
+ 640 0 rlineto 0 640 rlineto -640 0 rlineto closepath fill}def
+/ci{355 333 rmoveto currentpoint newpath 333 0 360 arc
+ 50 setlinewidth stroke}def
+
+/lt{125 -200 moveto 125 400 lineto 125 550 260 780 375 800 curveto stroke}def
+/lb{125 800 moveto 125 200 lineto 125 50 260 -180 375 -200 curveto stroke}def
+/rt{125 -200 moveto 125 400 lineto 125 550 -10 780 -125 800 curveto stroke}def
+/rb{125 800 moveto 125 200 lineto 125 50 -10 -180 -125 -200 curveto stroke}def
+/lk{125 800 moveto 125 700 lineto 125 550 125 320 -125 300 curveto
+ 125 -200 moveto 125 -100 lineto 125 50 125 280 -125 300 curveto stroke}def
+/rk{125 800 moveto 125 700 lineto 125 550 125 320 375 300 curveto
+ 125 -200 moveto 125 -100 lineto 125 50 125 280 375 300 curveto stroke}def
+/lf{125 800 moveto 0 -1000 rlineto s4 0 rls}def
+/rf{125 800 moveto 0 -1000 rlineto s4 neg 0 rls}def
+/lc{125 -200 moveto 0 1000 rlineto s4 0 rls}def
+/rc{125 -200 moveto 0 1000 rlineto s4 neg 0 rls}def
+end
+
+/Metrics 50 dict def Metrics begin
+/.notdef 0 def
+/space 500 def
+/ru 500 def
+/br 0 def
+/lt 250 def
+/lb 250 def
+/rt 250 def
+/rb 250 def
+/lk 250 def
+/rk 250 def
+/rc 250 def
+/lc 250 def
+/rf 250 def
+/lf 250 def
+/bv 250 def
+/ob 350 def
+/bu 350 def
+/ci 750 def
+/bx 750 def
+/sq 750 def
+/rn 500 def
+/ul 500 def
+/vr 0 def
+end
+
+DITfd begin
+/s2 500 def /s4 250 def /s3 333 def
+/a4p{arcto pop pop pop pop}def
+/2cx{2 copy exch}def
+/rls{rlineto stroke}def
+/currx{currentpoint pop}def
+/dround{transform round exch round exch itransform} def
+end
+end
+/DIThacks exch definefont pop
+%! MF-logo font
+%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/MF-logoFont 10 dict def
+/fudge 110 def
+MF-logoFont begin
+%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+/hyphen
+(
+newpath
+%new path
+200 350 moveto
+596 350 lineto
+596 396 lineto
+200 396 lineto
+200 350 lineto
+closepath
+%end path
+fill
+) def
+
+/M
+(
+newpath
+%new path
+ 280 180 moveto
+ 282 186 lineto
+ 284 190 lineto
+ 284 600 lineto
+ 280 586 lineto
+ 260 576 lineto
+ 266 576 lineto
+ 268 578 lineto
+ 274 580 lineto
+ 280 586 lineto
+ 260 576 lineto
+ 240 586 lineto
+ 244 580 lineto
+ 250 578 lineto
+ 254 576 lineto
+ 260 576 lineto
+ 240 586 lineto
+ 236 596 lineto
+ 236 590 lineto
+ 238 590 lineto
+ 306 470 376 348 446 228 curveto
+ 444 230 lineto
+ 448 224 lineto
+ 452 220 lineto
+ 458 216 lineto
+ 462 216 lineto
+ 468 214 lineto
+ 474 216 lineto
+ 476 216 lineto
+ 482 220 lineto
+ 488 224 lineto
+ 490 230 lineto
+ 492 230 lineto
+ 560 350 630 472 700 592 curveto
+ 698 590 lineto
+ 700 596 lineto
+ 700 600 lineto
+ 696 586 lineto
+ 676 576 lineto
+ 682 576 lineto
+ 684 578 lineto
+ 690 580 lineto
+ 696 586 lineto
+ 676 576 lineto
+ 656 586 lineto
+ 660 580 lineto
+ 666 578 lineto
+ 670 576 lineto
+ 676 576 lineto
+ 656 586 lineto
+ 652 596 lineto
+ 652 590 lineto
+ 656 586 lineto
+ 652 596 lineto
+ 656 610 lineto
+ 652 604 lineto
+ 652 600 lineto
+ 650 598 lineto
+ 650 194 lineto
+ 652 194 lineto
+ 652 186 lineto
+ 656 180 lineto
+ 660 178 lineto
+ 666 174 lineto
+ 670 174 lineto
+ 676 172 lineto
+ 682 174 lineto
+ 684 174 lineto
+ 690 178 lineto
+ 696 180 lineto
+ 698 186 lineto
+ 700 190 lineto
+ 700 600 lineto
+ 698 604 lineto
+ 696 610 lineto
+ 690 614 lineto
+ 684 618 lineto
+ 682 618 lineto
+ 676 620 lineto
+ 670 618 lineto
+ 666 618 lineto
+ 660 614 lineto
+ 656 610 lineto
+ 652 604 lineto
+ 582 484 512 362 444 242 curveto
+ 444 234 lineto
+ 448 248 lineto
+ 468 258 lineto
+ 462 258 lineto
+ 458 256 lineto
+ 452 254 lineto
+ 448 248 lineto
+ 468 258 lineto
+ 488 248 lineto
+ 482 254 lineto
+ 476 256 lineto
+ 474 258 lineto
+ 468 258 lineto
+ 488 248 lineto
+ 492 238 lineto
+ 490 244 lineto
+ 420 364 350 486 282 606 curveto
+ 282 604 lineto
+ 280 610 lineto
+ 274 614 lineto
+ 268 618 lineto
+ 266 618 lineto
+ 260 620 lineto
+ 254 618 lineto
+ 250 618 lineto
+ 244 614 lineto
+ 240 610 lineto
+ 236 604 lineto
+ 236 600 lineto
+ 234 598 lineto
+ 234 194 lineto
+ 236 194 lineto
+ 236 186 lineto
+ 240 180 lineto
+ 244 178 lineto
+ 250 174 lineto
+ 254 174 lineto
+ 260 172 lineto
+ 266 174 lineto
+ 268 174 lineto
+ 274 178 lineto
+ 280 180 lineto
+closepath
+%end path
+fill
+) def
+
+/E
+(
+newpath
+%new path
+ 556 224 moveto
+ 554 222 lineto
+ 258 222 lineto
+ 260 224 lineto
+ 254 222 lineto
+ 250 222 lineto
+ 244 218 lineto
+ 240 214 lineto
+ 260 224 lineto
+ 280 214 lineto
+ 274 218 lineto
+ 268 222 lineto
+ 266 222 lineto
+ 260 224 lineto
+ 280 214 lineto
+ 284 204 lineto
+ 282 208 lineto
+ 280 214 lineto
+ 284 204 lineto
+ 280 190 lineto
+ 282 194 lineto
+ 284 200 lineto
+ 284 592 lineto
+ 280 578 lineto
+ 260 568 lineto
+ 562 568 lineto
+ 564 570 lineto
+ 570 572 lineto
+ 576 578 lineto
+ 578 582 lineto
+ 580 588 lineto
+ 580 592 lineto
+ 578 596 lineto
+ 576 602 lineto
+ 570 606 lineto
+ 564 610 lineto
+ 562 610 lineto
+ 556 612 lineto
+ 554 610 lineto
+ 258 610 lineto
+ 260 612 lineto
+ 254 610 lineto
+ 250 610 lineto
+ 244 606 lineto
+ 240 602 lineto
+ 236 596 lineto
+ 236 592 lineto
+ 234 590 lineto
+ 234 202 lineto
+ 236 204 lineto
+ 236 194 lineto
+ 240 190 lineto
+ 244 184 lineto
+ 250 182 lineto
+ 254 180 lineto
+ 562 180 lineto
+ 564 182 lineto
+ 570 184 lineto
+ 576 190 lineto
+ 578 194 lineto
+ 580 200 lineto
+ 580 204 lineto
+ 578 208 lineto
+ 576 214 lineto
+ 570 218 lineto
+ 564 222 lineto
+ 562 222 lineto
+ 556 224 lineto
+closepath
+%end path
+%new path
+ 260 352 moveto
+ 518 352 lineto
+ 520 354 lineto
+ 526 356 lineto
+ 532 362 lineto
+ 534 366 lineto
+ 536 372 lineto
+ 536 376 lineto
+ 534 380 lineto
+ 532 386 lineto
+ 526 390 lineto
+ 520 394 lineto
+ 518 394 lineto
+ 512 396 lineto
+ 510 394 lineto
+ 258 394 lineto
+ 260 396 lineto
+ 254 394 lineto
+ 250 394 lineto
+ 244 390 lineto
+ 240 386 lineto
+ 236 380 lineto
+ 236 366 lineto
+ 240 362 lineto
+ 244 356 lineto
+ 250 354 lineto
+ 254 352 lineto
+ 260 352 lineto
+closepath
+%end path
+fill
+) def
+
+/T
+(
+newpath
+%new path
+ 202 568 moveto
+ 578 568 lineto
+ 580 570 lineto
+ 586 572 lineto
+ 592 578 lineto
+ 594 582 lineto
+ 596 588 lineto
+ 596 592 lineto
+ 594 596 lineto
+ 592 602 lineto
+ 586 606 lineto
+ 580 610 lineto
+ 578 610 lineto
+ 572 612 lineto
+ 570 610 lineto
+ 202 610 lineto
+ 202 612 lineto
+ 196 610 lineto
+ 194 610 lineto
+ 188 606 lineto
+ 182 602 lineto
+ 180 596 lineto
+ 180 582 lineto
+ 182 578 lineto
+ 188 572 lineto
+ 194 570 lineto
+ 196 568 lineto
+ 202 568 lineto
+closepath
+%end path
+%new path
+ 368 602 moveto
+ 364 596 lineto
+ 364 592 lineto
+ 362 590 lineto
+ 362 194 lineto
+ 364 194 lineto
+ 364 186 lineto
+ 368 180 lineto
+ 372 178 lineto
+ 378 174 lineto
+ 382 174 lineto
+ 388 172 lineto
+ 394 174 lineto
+ 396 174 lineto
+ 402 178 lineto
+ 408 180 lineto
+ 410 186 lineto
+ 412 190 lineto
+ 412 592 lineto
+ 410 596 lineto
+ 408 602 lineto
+ 402 606 lineto
+ 396 610 lineto
+ 394 610 lineto
+ 388 612 lineto
+ 382 610 lineto
+ 378 610 lineto
+ 372 606 lineto
+ 368 602 lineto
+closepath
+%end path
+fill
+) def
+
+/A
+(
+newpath
+%new path
+ 280 180 moveto
+ 282 186 lineto
+ 284 190 lineto
+ 284 376 lineto
+ 280 362 lineto
+ 260 352 lineto
+ 586 352 lineto
+ 588 354 lineto
+ 594 356 lineto
+ 600 362 lineto
+ 580 352 lineto
+ 560 362 lineto
+ 564 356 lineto
+ 570 354 lineto
+ 574 352 lineto
+ 580 352 lineto
+ 560 362 lineto
+ 556 372 lineto
+ 556 366 lineto
+ 560 362 lineto
+ 556 372 lineto
+ 560 386 lineto
+ 556 380 lineto
+ 556 376 lineto
+ 554 374 lineto
+ 554 194 lineto
+ 556 194 lineto
+ 556 186 lineto
+ 560 180 lineto
+ 564 178 lineto
+ 570 174 lineto
+ 574 174 lineto
+ 580 172 lineto
+ 586 174 lineto
+ 588 174 lineto
+ 594 178 lineto
+ 600 180 lineto
+ 602 186 lineto
+ 604 190 lineto
+ 604 376 lineto
+ 602 380 lineto
+ 600 386 lineto
+ 594 390 lineto
+ 588 394 lineto
+ 586 394 lineto
+ 580 396 lineto
+ 578 394 lineto
+ 258 394 lineto
+ 260 396 lineto
+ 254 394 lineto
+ 250 394 lineto
+ 244 390 lineto
+ 240 386 lineto
+ 236 380 lineto
+ 236 376 lineto
+ 234 374 lineto
+ 234 194 lineto
+ 236 194 lineto
+ 236 186 lineto
+ 240 180 lineto
+ 244 178 lineto
+ 250 174 lineto
+ 254 174 lineto
+ 260 172 lineto
+ 266 174 lineto
+ 268 174 lineto
+ 274 178 lineto
+ 280 180 lineto
+closepath
+%end path
+%new path
+ 280 362 moveto
+ 282 366 lineto
+ 284 372 lineto
+ 284 410 284 452 292 490 curveto
+ 290 488 lineto
+ 290 484 lineto
+ 294 504 300 522 310 538 curveto
+ 306 532 lineto
+ 308 534 lineto
+ 308 536 310 538 312 542 curveto
+ 314 546 318 548 322 552 curveto
+ 320 552 lineto
+ 324 556 lineto
+ 324 566 lineto
+ 320 552 lineto
+ 300 542 lineto
+ 306 542 lineto
+ 310 544 lineto
+ 316 546 lineto
+ 316 548 lineto
+ 324 554 332 560 340 564 curveto
+ 334 560 lineto
+ 334 562 lineto
+ 340 564 346 566 350 568 curveto
+ 346 566 lineto
+ 348 568 lineto
+ 356 570 364 572 374 574 curveto
+ 372 572 lineto
+ 368 572 lineto
+ 384 576 402 576 420 576 curveto
+ 426 576 lineto
+ 428 578 lineto
+ 434 580 lineto
+ 440 586 lineto
+ 420 576 lineto
+ 400 586 lineto
+ 404 580 lineto
+ 410 578 lineto
+ 414 576 lineto
+ 420 576 lineto
+ 420 574 lineto
+ 438 574 456 574 472 570 curveto
+ 472 572 lineto
+ 466 572 lineto
+ 476 570 484 568 492 566 curveto
+ 488 568 lineto
+ 490 566 lineto
+ 494 564 500 562 506 560 curveto
+ 504 560 lineto
+ 498 564 lineto
+ 500 562 lineto
+ 508 558 516 552 524 546 curveto
+ 522 546 lineto
+ 528 544 lineto
+ 532 542 lineto
+ 538 542 lineto
+ 518 552 lineto
+ 514 562 lineto
+ 514 556 lineto
+ 518 552 lineto
+ 518 550 lineto
+ 522 546 526 544 528 540 curveto
+ 530 536 532 534 532 532 curveto
+ 528 538 lineto
+ 530 536 lineto
+ 540 520 546 502 550 482 curveto
+ 548 484 lineto
+ 548 488 lineto
+ 556 450 556 408 556 370 curveto
+ 556 366 lineto
+ 560 362 lineto
+ 564 356 lineto
+ 570 354 lineto
+ 574 352 lineto
+ 586 352 lineto
+ 588 354 lineto
+ 594 356 lineto
+ 600 362 lineto
+ 602 366 lineto
+ 604 372 lineto
+ 604 376 lineto
+ 602 376 lineto
+ 602 414 602 456 594 494 curveto
+ 596 492 lineto
+ 594 498 lineto
+ 590 518 584 536 574 552 curveto
+ 572 556 lineto
+ 570 558 lineto
+ 570 560 568 562 566 566 curveto
+ 564 570 560 572 556 576 curveto
+ 558 576 lineto
+ 552 580 lineto
+ 552 582 lineto
+ 544 588 536 594 528 598 curveto
+ 522 600 lineto
+ 522 602 lineto
+ 516 604 510 606 506 608 curveto
+ 504 608 lineto
+ 502 610 lineto
+ 494 612 486 614 476 616 curveto
+ 478 614 lineto
+ 472 616 lineto
+ 470 616 lineto
+ 454 620 436 620 418 620 curveto
+ 420 620 lineto
+ 418 618 lineto
+ 400 618 382 618 366 614 curveto
+ 366 616 lineto
+ 360 614 lineto
+ 350 612 342 610 334 608 curveto
+ 332 608 lineto
+ 330 606 lineto
+ 326 604 320 602 314 600 curveto
+ 316 600 lineto
+ 310 598 lineto
+ 308 596 lineto
+ 300 592 292 586 284 580 curveto
+ 286 580 lineto
+ 280 576 lineto
+ 280 574 lineto
+ 276 570 272 568 270 564 curveto
+ 268 560 266 558 266 556 curveto
+ 264 552 lineto
+ 262 550 lineto
+ 252 534 246 516 242 496 curveto
+ 244 498 lineto
+ 242 492 lineto
+ 234 454 234 412 234 374 curveto
+ 236 376 lineto
+ 236 366 lineto
+ 240 362 lineto
+ 244 356 lineto
+ 250 354 lineto
+ 254 352 lineto
+ 266 352 lineto
+ 268 354 lineto
+ 274 356 lineto
+ 280 362 lineto
+closepath
+%end path
+fill
+) def
+
+/F
+(
+newpath
+%new path
+ 280 180 moveto
+ 282 186 lineto
+ 284 190 lineto
+ 284 592 lineto
+ 280 578 lineto
+ 260 568 lineto
+ 562 568 lineto
+ 564 570 lineto
+ 570 572 lineto
+ 576 578 lineto
+ 578 582 lineto
+ 580 588 lineto
+ 580 592 lineto
+ 578 596 lineto
+ 576 602 lineto
+ 570 606 lineto
+ 564 610 lineto
+ 562 610 lineto
+ 556 612 lineto
+ 554 610 lineto
+ 258 610 lineto
+ 260 612 lineto
+ 254 610 lineto
+ 250 610 lineto
+ 244 606 lineto
+ 240 602 lineto
+ 236 596 lineto
+ 236 592 lineto
+ 234 590 lineto
+ 234 194 lineto
+ 236 194 lineto
+ 236 186 lineto
+ 240 180 lineto
+ 244 178 lineto
+ 250 174 lineto
+ 254 174 lineto
+ 260 172 lineto
+ 266 174 lineto
+ 268 174 lineto
+ 274 178 lineto
+ 280 180 lineto
+closepath
+%end path
+%new path
+ 260 352 moveto
+ 518 352 lineto
+ 520 354 lineto
+ 526 356 lineto
+ 532 362 lineto
+ 534 366 lineto
+ 536 372 lineto
+ 536 376 lineto
+ 534 380 lineto
+ 532 386 lineto
+ 526 390 lineto
+ 520 394 lineto
+ 518 394 lineto
+ 512 396 lineto
+ 510 394 lineto
+ 258 394 lineto
+ 260 396 lineto
+ 254 394 lineto
+ 250 394 lineto
+ 244 390 lineto
+ 240 386 lineto
+ 236 380 lineto
+ 236 366 lineto
+ 240 362 lineto
+ 244 356 lineto
+ 250 354 lineto
+ 254 352 lineto
+ 260 352 lineto
+closepath
+%end path
+fill
+) def
+
+/O
+(
+newpath
+%new path
+ 248 362 moveto
+ 250 366 lineto
+ 252 372 lineto
+ 252 408 252 446 258 480 curveto
+ 256 474 lineto
+ 258 476 lineto
+ 262 494 268 514 278 530 curveto
+ 276 528 lineto
+ 274 524 lineto
+ 278 530 282 536 286 542 curveto
+ 288 544 290 546 292 546 curveto
+ 290 546 lineto
+ 294 550 lineto
+ 294 560 lineto
+ 290 546 lineto
+ 270 536 lineto
+ 276 536 lineto
+ 280 538 lineto
+ 286 540 lineto
+ 286 542 lineto
+ 296 550 306 558 316 562 curveto
+ 314 562 lineto
+ 308 558 lineto
+ 310 560 lineto
+ 316 562 322 564 328 566 curveto
+ 326 566 lineto
+ 324 564 lineto
+ 324 566 lineto
+ 334 568 344 570 352 572 curveto
+ 346 570 lineto
+ 346 572 lineto
+ 370 576 396 576 420 576 curveto
+ 426 576 lineto
+ 428 578 lineto
+ 434 580 lineto
+ 440 586 lineto
+ 420 576 lineto
+ 400 586 lineto
+ 404 580 lineto
+ 410 578 lineto
+ 414 576 lineto
+ 420 576 lineto
+ 420 574 lineto
+ 444 574 470 574 494 570 curveto
+ 492 570 lineto
+ 486 572 lineto
+ 488 570 lineto
+ 496 568 506 566 516 564 curveto
+ 514 564 lineto
+ 512 566 lineto
+ 512 564 lineto
+ 518 562 524 560 530 558 curveto
+ 524 562 lineto
+ 524 560 lineto
+ 534 556 544 548 554 540 curveto
+ 552 540 lineto
+ 558 538 lineto
+ 562 536 lineto
+ 568 536 lineto
+ 548 546 lineto
+ 544 556 lineto
+ 544 550 lineto
+ 548 546 lineto
+ 548 544 lineto
+ 550 544 552 542 554 540 curveto
+ 558 534 562 528 566 522 curveto
+ 564 524 lineto
+ 562 528 lineto
+ 572 512 578 492 582 474 curveto
+ 580 480 lineto
+ 582 478 lineto
+ 588 444 588 406 588 370 curveto
+ 588 366 lineto
+ 592 362 lineto
+ 596 356 lineto
+ 602 354 lineto
+ 606 352 lineto
+ 618 352 lineto
+ 620 354 lineto
+ 626 356 lineto
+ 632 362 lineto
+ 634 366 lineto
+ 636 372 lineto
+ 636 376 lineto
+ 634 376 lineto
+ 634 412 634 450 628 484 curveto
+ 628 488 lineto
+ 626 490 lineto
+ 622 508 616 528 606 544 curveto
+ 608 542 lineto
+ 604 548 lineto
+ 600 554 596 560 592 566 curveto
+ 590 568 588 570 586 570 curveto
+ 588 570 lineto
+ 582 574 lineto
+ 582 576 lineto
+ 572 584 562 592 552 596 curveto
+ 554 596 lineto
+ 548 598 lineto
+ 546 600 lineto
+ 540 602 534 604 528 606 curveto
+ 526 606 lineto
+ 526 608 lineto
+ 516 610 506 612 498 614 curveto
+ 492 614 lineto
+ 492 616 lineto
+ 468 620 442 620 418 620 curveto
+ 420 620 lineto
+ 418 618 lineto
+ 394 618 368 618 344 614 curveto
+ 340 614 lineto
+ 338 612 lineto
+ 330 610 320 608 310 606 curveto
+ 308 606 lineto
+ 308 604 lineto
+ 302 602 296 600 290 598 curveto
+ 284 596 lineto
+ 284 594 lineto
+ 274 590 264 582 254 574 curveto
+ 256 574 lineto
+ 250 570 lineto
+ 250 568 lineto
+ 248 568 246 566 244 564 curveto
+ 240 558 236 552 232 546 curveto
+ 234 548 lineto
+ 230 542 lineto
+ 220 526 214 506 210 488 curveto
+ 210 484 lineto
+ 208 482 lineto
+ 202 448 202 410 202 374 curveto
+ 204 376 lineto
+ 204 366 lineto
+ 208 362 lineto
+ 212 356 lineto
+ 218 354 lineto
+ 222 352 lineto
+ 234 352 lineto
+ 236 354 lineto
+ 242 356 lineto
+ 248 362 lineto
+closepath
+%end path
+%new path
+ 204 372 moveto
+ 204 370 lineto
+ 204 344 204 316 210 292 curveto
+ 208 292 lineto
+ 210 288 lineto
+ 210 286 lineto
+ 214 272 218 256 226 244 curveto
+ 228 240 lineto
+ 230 238 lineto
+ 234 232 238 224 244 218 curveto
+ 244 220 lineto
+ 248 214 lineto
+ 250 214 lineto
+ 250 212 250 212 252 212 curveto
+ 260 204 268 198 278 194 curveto
+ 276 194 lineto
+ 282 192 lineto
+ 284 190 lineto
+ 290 188 296 186 302 184 curveto
+ 304 184 lineto
+ 304 182 lineto
+ 314 180 322 180 332 178 curveto
+ 338 178 lineto
+ 338 176 lineto
+ 364 172 394 172 420 172 curveto
+ 420 174 lineto
+ 446 174 476 174 502 178 curveto
+ 506 178 lineto
+ 508 180 lineto
+ 518 180 526 182 536 184 curveto
+ 538 184 lineto
+ 538 186 lineto
+ 544 188 550 190 556 192 curveto
+ 562 194 lineto
+ 562 196 lineto
+ 572 200 580 206 588 214 curveto
+ 590 214 590 214 590 216 curveto
+ 590 214 lineto
+ 594 220 lineto
+ 596 220 lineto
+ 602 226 606 234 610 240 curveto
+ 612 244 lineto
+ 614 246 lineto
+ 622 258 626 274 630 288 curveto
+ 628 288 lineto
+ 630 292 lineto
+ 630 294 lineto
+ 636 318 636 346 636 372 curveto
+ 636 376 lineto
+ 634 380 lineto
+ 632 386 lineto
+ 626 390 lineto
+ 620 394 lineto
+ 618 394 lineto
+ 612 396 lineto
+ 606 394 lineto
+ 602 394 lineto
+ 596 390 lineto
+ 592 386 lineto
+ 588 380 lineto
+ 588 376 lineto
+ 586 374 lineto
+ 586 348 586 320 580 296 curveto
+ 582 296 lineto
+ 582 300 lineto
+ 578 286 574 270 566 258 curveto
+ 570 264 lineto
+ 568 262 lineto
+ 564 256 560 248 554 242 curveto
+ 554 244 lineto
+ 552 238 lineto
+ 550 234 lineto
+ 550 230 lineto
+ 554 244 lineto
+ 574 254 lineto
+ 568 252 lineto
+ 566 252 lineto
+ 560 248 lineto
+ 558 248 lineto
+ 558 246 558 246 556 246 curveto
+ 548 238 540 232 530 228 curveto
+ 532 228 lineto
+ 538 232 lineto
+ 536 230 lineto
+ 530 228 524 226 518 224 curveto
+ 520 224 lineto
+ 522 226 lineto
+ 522 224 lineto
+ 512 222 504 220 494 218 curveto
+ 500 220 lineto
+ 500 218 lineto
+ 474 214 444 214 418 214 curveto
+ 420 216 lineto
+ 414 214 lineto
+ 410 214 lineto
+ 404 210 lineto
+ 400 206 lineto
+ 420 216 lineto
+ 440 206 lineto
+ 434 210 lineto
+ 428 214 lineto
+ 426 214 lineto
+ 420 216 lineto
+ 418 216 lineto
+ 392 216 362 216 336 220 curveto
+ 338 220 lineto
+ 344 218 lineto
+ 342 220 lineto
+ 332 222 324 224 314 226 curveto
+ 316 226 lineto
+ 318 224 lineto
+ 318 226 lineto
+ 312 228 306 230 300 232 curveto
+ 306 228 lineto
+ 306 230 lineto
+ 296 234 288 240 280 248 curveto
+ 278 248 278 248 278 250 curveto
+ 278 248 lineto
+ 272 252 lineto
+ 270 252 lineto
+ 264 254 lineto
+ 284 244 lineto
+ 288 234 lineto
+ 286 238 lineto
+ 284 244 lineto
+ 282 244 lineto
+ 276 250 272 258 268 264 curveto
+ 272 258 lineto
+ 270 260 lineto
+ 262 272 258 288 254 302 curveto
+ 256 302 lineto
+ 256 298 lineto
+ 250 322 250 350 250 376 curveto
+ 252 376 lineto
+ 250 380 lineto
+ 248 386 lineto
+ 242 390 lineto
+ 236 394 lineto
+ 234 394 lineto
+ 228 396 lineto
+ 222 394 lineto
+ 218 394 lineto
+ 212 390 lineto
+ 208 386 lineto
+ 204 380 lineto
+ 204 372 lineto
+closepath
+%end path
+fill
+) def
+
+/N
+(
+newpath
+%new path
+ 280 180 moveto
+ 282 186 lineto
+ 284 190 lineto
+ 284 600 lineto
+ 280 586 lineto
+ 260 576 lineto
+ 266 576 lineto
+ 268 578 lineto
+ 274 580 lineto
+ 280 586 lineto
+ 260 576 lineto
+ 240 586 lineto
+ 244 580 lineto
+ 250 578 lineto
+ 254 576 lineto
+ 260 576 lineto
+ 240 586 lineto
+ 236 596 lineto
+ 236 590 lineto
+ 240 586 lineto
+ 240 584 lineto
+ 346 464 454 344 560 224 curveto
+ 564 220 lineto
+ 570 216 lineto
+ 574 216 lineto
+ 580 214 lineto
+ 586 216 lineto
+ 588 216 lineto
+ 594 220 lineto
+ 600 224 lineto
+ 602 230 lineto
+ 604 234 lineto
+ 604 238 lineto
+ 602 244 lineto
+ 600 248 lineto
+ 598 250 lineto
+ 492 370 384 490 278 610 curveto
+ 280 610 lineto
+ 274 614 lineto
+ 268 618 lineto
+ 266 618 lineto
+ 260 620 lineto
+ 254 618 lineto
+ 250 618 lineto
+ 244 614 lineto
+ 240 610 lineto
+ 236 604 lineto
+ 236 600 lineto
+ 234 598 lineto
+ 234 194 lineto
+ 236 194 lineto
+ 236 186 lineto
+ 240 180 lineto
+ 244 178 lineto
+ 250 174 lineto
+ 254 174 lineto
+ 260 172 lineto
+ 266 174 lineto
+ 268 174 lineto
+ 274 178 lineto
+ 280 180 lineto
+closepath
+%end path
+%new path
+ 600 180 moveto
+ 602 186 lineto
+ 604 190 lineto
+ 604 600 lineto
+ 602 604 lineto
+ 600 610 lineto
+ 594 614 lineto
+ 588 618 lineto
+ 586 618 lineto
+ 580 620 lineto
+ 574 618 lineto
+ 570 618 lineto
+ 564 614 lineto
+ 560 610 lineto
+ 556 604 lineto
+ 556 600 lineto
+ 554 598 lineto
+ 554 194 lineto
+ 556 194 lineto
+ 556 186 lineto
+ 560 180 lineto
+ 564 178 lineto
+ 570 174 lineto
+ 574 174 lineto
+ 580 172 lineto
+ 586 174 lineto
+ 588 174 lineto
+ 594 178 lineto
+ 600 180 lineto
+closepath
+%end path
+fill
+) def
+
+end % of CharDefs dictionary
+
+Encoding 77 /M put
+Encoding 69 /E put
+Encoding 84 /T put
+Encoding 65 /A put
+Encoding 70 /F put
+Encoding 79 /O put
+Encoding 78 /N put
+Encoding 45 /hyphen put
+
+Metrics
+ begin
+/.notdef 0 def
+/M 520 fudge add def
+/E 400 fudge add def
+/T 416 fudge add def
+/A 424 fudge add def
+/F 346 fudge add def
+/O 434 fudge add def
+/N 424 fudge add def
+/hyphen 416 fudge add def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ % bounding box : [180 180 700 700]
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 80 add 1000
+ setcachedevice
+ -182 fudge add -230 translate
+ 1.1 1.3 scale
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [182 fudge sub 180 700 620] def
+
+ end
+
+ /MF-logo MF-logoFont definefont pop
+
+%/MF-logo findfont 11 scalefont setfont
+%100 210 moveto (METAFONT) show
+%1 2 scale (METAFONT) show
+%1 2 scale (METAFONT) show
+%showpage
+ditstart
+(psc)xT
+576 1 1 xr
+1(Times-Roman)xf 1 f F
+2(Times-Italic)xf 2 f F
+3(Times-Bold)xf 3 f F
+4(Times-BoldItalic)xf 4 f F
+5(Courier)xf 5 f F
+6(Courier-Oblique)xf 6 f F
+7(Courier-Bold)xf 7 f F
+8(Courier-BoldOblique)xf 8 f F
+9(Helvetica)xf 9 f F
+10(Helvetica-Oblique)xf 10 f F
+11(Helvetica-Bold)xf 11 f F
+12(Helvetica-BoldOblique)xf 12 f F
+13(Hebrew-Frank-Ruehl)xf 13 f F
+14(Hebrew-Gam)xf 14 f F
+15(Hebrew-Gam-Bold)xf 15 f F
+16(Hebrew-Yuval)xf 16 f F
+17(Hebrew-David)xf 17 f F
+18(Hebrew-Tel-Aviv)xf 18 f F
+19(Hebrew-OldJaffa)xf 19 f F
+20(AvantGarde-Book)xf 20 f F
+21(AvantGarde-BookOblique)xf 21 f F
+22(AvantGarde-Demi)xf 22 f F
+23(AvantGarde-DemiOblique)xf 23 f F
+24(NewCenturySchlbk-Roman)xf 24 f F
+25(NewCenturySchlbk-Italic)xf 25 f F
+26(NewCenturySchlbk-Bold)xf 26 f F
+27(NewCenturySchlbk-BoldItalic)xf 27 f F
+28(Palatino-Roman)xf 28 f F
+29(Palatino-Italic)xf 29 f F
+30(Palatino-Bold)xf 30 f F
+31(Palatino-BoldItalic)xf 31 f F
+32(ZapfChancery-MediumItalic)xf 32 f F
+33(ZapfDingbats)xf 33 f F
+34(Bookman-Light)xf 34 f F
+35(Bookman-LightItalic)xf 35 f F
+36(Bookman-Demi)xf 36 f F
+37(Bookman-DemiItalic)xf 37 f F
+38(Helvetica-Narrow)xf 38 f F
+39(Helvetica-Narrow-Oblique)xf 39 f F
+40(Helvetica-Narrow-Bold)xf 40 f F
+41(Helvetica-Narrow-BoldOblique)xf 41 f F
+42(Nescii-Initial-Stroke)xf 42 f F
+43(Nescii-Middle-Stroke)xf 43 f F
+44(Nescii-Final-Stroke)xf 44 f F
+45(Nescii-Standalone-Stroke)xf 45 f F
+46(Arabic-Naskh)xf 46 f F
+47(Symbol)xf 47 f F
+48(DIThacks)xf 48 f F
+xi
+%%EndProlog
+
+%%Page: 1 2
+1 p
+10 s 10 xH 0 xS 1 f F
+48 f F
+576 576(h)N
+611(h)X
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+(h)S
+12 s 12 xH 1 f F
+576 672(Environment)N
+1103(for)X
+1239(Translating)X
+0(MF-logo)xf 0 f F
+576 768(METAFONT)N
+1 f F
+1007(to)X
+1106(P)X
+10 s 10 xH F
+1159(OST)X
+12 s 12 xH F
+1310(S)X
+10 s 10 xH F
+1363(CRIPT)X
+735 888(Shimon)N
+1003(Yanai)X
+1215(and)X
+1351(Daniel)X
+1585(M.)X
+1696(Berry)X
+3 f F
+576 1048(Abstract)N
+1 f F
+576 1192(This)N
+745(paper)X
+951(describes)X
+1277(a)X
+1340(program,)X
+9 f F
+1661(mf2ps)X
+1 f F
+1878(,)X
+1925(that)X
+2073(translates)X
+576 1288(a)N
+0 f F
+654(METAFONT)X
+1 f F
+1037(font)X
+1207(de\256nition)X
+1554(into)X
+1719(a)X
+1796(de\256nition)X
+2143(for)X
+2278(the)X
+576 1384(same)N
+769(font)X
+926(in)X
+1017(the)X
+1144(P)X
+8 s 8 xH F
+1188(OST)X
+10 s 10 xH F
+1309(S)X
+8 s 8 xH F
+1353(CRIPT)X
+10 s 10 xH F
+1564(language.)X
+9 f F
+1905(mf2ps)X
+1 f F
+2151(is)X
+2233(con-)X
+576 1480(structed)N
+859(out)X
+990(of)X
+1086(the)X
+1213(part)X
+1366(of)X
+1461(the)X
+0 f F
+1587(METAFONT)X
+1 f F
+1956(program)X
+2256(that)X
+576 1576(extracts)N
+846(the)X
+964(envelopes)X
+1305(of)X
+1392(the)X
+1510(letters;)X
+1749(these)X
+1935(envelopes)X
+2277(are)X
+576 1672(converted)N
+913(into)X
+1057(P)X
+8 s 8 xH F
+1101(OST)X
+10 s 10 xH F
+1222(S)X
+8 s 8 xH F
+1266(CRIPT)X
+10 s 10 xH F
+1468(outlines.)X
+3 f F
+576 1864(1)N
+676(Introduction)X
+1 f F
+576 2008(This)N
+739(paper)X
+939(describes)X
+1259(a)X
+1316(program,)X
+9 f F
+1632(mf2ps)X
+1 f F
+1849(,)X
+1891(that)X
+2033(takes)X
+2220(from)X
+576 2104(a)N
+0 f F
+641(METAFONT)X
+1 f F
+1011([10,)X
+1151(11])X
+1287(program)X
+1588(for)X
+1711(a)X
+1776(font)X
+1934(all)X
+2043(the)X
+2170(neces-)X
+576 2200(sary)N
+735(information)X
+1138(in)X
+1225(order)X
+1421(to)X
+1509(create)X
+1728(an)X
+1830(equivalent)X
+2190(P)X
+8 s 8 xH F
+2234(OST-)X
+10 s 10 xH F
+576 2296(S)N
+8 s 8 xH F
+620(CRIPT)X
+10 s 10 xH F
+834([1])X
+959(font)X
+1119(de\256nition.)X
+1476(The)X
+1632(program)X
+1935(makes)X
+2171(use)X
+2309(of)X
+576 2392(the)N
+704(front)X
+890(end)X
+1036(of)X
+1133(the)X
+0 f F
+1261(METAFONT)X
+1 f F
+1632(program)X
+1935(to)X
+2028(extract)X
+2278(the)X
+576 2488(envelopes)N
+920(of)X
+1010(the)X
+1131(letters)X
+1349(to)X
+1433(produce)X
+1714(the)X
+1834(P)X
+8 s 8 xH F
+1878(OST)X
+10 s 10 xH F
+1999(S)X
+8 s 8 xH F
+2043(CRIPT)X
+10 s 10 xH F
+2247(out-)X
+576 2584(lines.)N
+791(What)X
+1009(makes)X
+1258(this)X
+1417(process)X
+1703(natural)X
+1971(is)X
+2069(that)X
+2234(both)X
+0 f F
+576 2680(METAFONT)N
+1 f F
+944(and)X
+1087(P)X
+8 s 8 xH F
+1131(OST)X
+10 s 10 xH F
+1252(S)X
+8 s 8 xH F
+1296(CRIPT)X
+10 s 10 xH F
+1505(make)X
+1706(liberal)X
+1938(use)X
+2072(of)X
+2165(Be)X
+2223(\302zier)X
+576 2776(curves)N
+806(to)X
+888(describe)X
+1176(non-circular)X
+1589(curves.)X
+735 2872(By)N
+852(producing)X
+1201(this)X
+1340(translator,)X
+1687(it)X
+1755(is)X
+1833(hoped)X
+2054(to)X
+2141(be)X
+2242(able)X
+576 2968(to)N
+673(produce)X
+967(from)X
+0 f F
+1158(METAFONT)X
+1 f F
+1534(fonts)X
+1729(P)X
+8 s 8 xH F
+1773(OST)X
+10 s 10 xH F
+1894(S)X
+8 s 8 xH F
+1938(CRIPT)X
+10 s 10 xH F
+2154(outline)X
+576 3064(fonts)N
+757(which)X
+974(are)X
+1095(more)X
+1282(compact)X
+1576(than)X
+1736(the)X
+1856(bitmapped)X
+2216(fonts)X
+576 3160(produced)N
+899(by)X
+1003(the)X
+0 f F
+1125(METAFONT)X
+1 f F
+1490(program.)X
+1805(Certainly)X
+2126(the)X
+2247(out-)X
+576 3256(line)N
+717(fonts)X
+898(are)X
+1018(more)X
+1204(easily)X
+1412(scaled)X
+1634(to)X
+1718(other)X
+1905(magni\256cations)X
+576 3352(and)N
+721(possibly)X
+1016(even)X
+1196(other)X
+1389(design)X
+1626(sizes)X
+1810(than)X
+1976(are)X
+2103(bitmaps.)X
+576 3448(Moreover,)N
+950(doing)X
+1169(so)X
+1277(makes)X
+1519(fonts)X
+1717(heretofore)X
+2086(available)X
+576 3544(only)N
+741(on)X
+843(T)X
+884 3560(E)N
+925 3544(X)N
+1005([9])X
+1121(and)X
+1259(other)X
+1446(DVI-based)X
+1821(formatters,)X
+2193(avail-)X
+576 3640(able)N
+751(on)X
+9 f F
+874(ditroff)X
+1 f F
+1114([8])X
+1249(and)X
+1407(other)X
+1614(formatters)X
+1986(which)X
+2224(have)X
+576 3736(evolved,)N
+891(or)X
+998(have)X
+1190(been)X
+1382(designed,)X
+1727(for)X
+1861(use)X
+2008(with)X
+2190(P)X
+8 s 8 xH F
+2234(OST-)X
+10 s 10 xH F
+576 3832(S)N
+8 s 8 xH F
+620(CRIPT)X
+10 s 10 xH F
+825(printers.)X
+1114(This)X
+1280(paper,)X
+1503(which)X
+1723(is)X
+1800(typeset)X
+2051(by)X
+9 f F
+2157(ditroff)X
+1 f F
+2356(,)X
+576 3928(uses)N
+741(a)X
+804(P)X
+8 s 8 xH F
+848(OST)X
+10 s 10 xH F
+969(S)X
+8 s 8 xH F
+1013(CRIPT)X
+10 s 10 xH F
+1222(version)X
+1485(of)X
+1579(the)X
+1704(logo)X
+1873(font)X
+2029(in)X
+2118(order)X
+2314(to)X
+576 4024(print)N
+752(the)X
+875(word)X
+1065(\252)X
+0 f F
+1101(METAFONT)X
+1 f F
+1455(\272)X
+1517(in)X
+1605(the)X
+1729(same)X
+1920(appearance)X
+2309(as)X
+576 4120(in)N
+685(T)X
+726 4136(E)N
+767 4120(X-generated)N
+1212(documents.)X
+1646(Moreover,)X
+2030(these)X
+2242(new)X
+576 4216(P)N
+8 s 8 xH F
+620(OST)X
+10 s 10 xH F
+741(S)X
+8 s 8 xH F
+785(CRIPT)X
+10 s 10 xH F
+989(outline)X
+1233(fonts)X
+1415(can)X
+1549(be)X
+1647(used)X
+1816(in)X
+1900(T)X
+1941 4232(E)N
+1982 4216(X)N
+2063(also!)X
+2242(One)X
+576 4312(needs)N
+779(only)X
+941(the)X
+1059(T)X
+1100 4328(E)N
+1141 4312(X)N
+1191 4328(P)N
+1227 4312(S)N
+1291([3])X
+1405(software.)X
+735 4408(The)N
+888(organization)X
+1318(of)X
+1414(this)X
+1558(paper)X
+1766(is)X
+1848(as)X
+1944(follows.)X
+2233(Sec-)X
+576 4504(tion)N
+728(2)X
+796(presents)X
+1087(the)X
+1213(background)X
+1620(of)X
+1715(this)X
+1857(work.)X
+2069(Section)X
+2336(3)X
+576 4600(explains)N
+864(the)X
+984(rationale)X
+1287(behind)X
+1527(building)X
+1815(the)X
+1935(translator)X
+2260(and)X
+576 4696(describes)N
+912(a)X
+985(previous)X
+1298(attempt)X
+1575(at)X
+1670(writing)X
+1938(the)X
+2073(translator)X
+576 4792(and)N
+730(an)X
+845(approach)X
+1179(to)X
+1280(avoid.)X
+1517(The)X
+1681(software)X
+1997(engineering)X
+576 4888(aspect)N
+808(of)X
+906(the)X
+1035(translator)X
+1369(is)X
+1453(described)X
+1792(also)X
+1952(in)X
+2045(Section)X
+2316(3.)X
+576 4984(The)N
+730(details)X
+968(of)X
+1064(the)X
+1191(implementation)X
+1722(are)X
+1850(exposed)X
+2142(in)X
+2233(Sec-)X
+576 5080(tion)N
+738(4.)X
+836(Section)X
+1114(5)X
+1192(describes)X
+1528(the)X
+1663(operation)X
+2003(of)X
+2107(the)X
+2242(pro-)X
+576 5176(gram.)N
+786(Section)X
+1051(6)X
+1116(evaluates)X
+1440(the)X
+1563(results.)X
+1818(Finally)X
+2070(Section)X
+2336(7)X
+576 5272(describes)N
+895(improvements)X
+1373(to)X
+1455(the)X
+1573(translator)X
+1896(that)X
+2036(are)X
+2155(left)X
+2282(for)X
+576 5368(future)N
+788(work.)X
+3 f F
+576 5560(2)N
+676(Background)X
+1 f F
+576 5704(Typesetter)N
+943(formatting)X
+1309(systems)X
+1590(such)X
+1765(as)X
+1861(T)X
+1902 5720(E)N
+1943 5704(X)N
+2030(and)X
+9 f F
+2177(ditroff)X
+1 f F
+2520 672(use)N
+2653(fonts)X
+2838(as)X
+2930(raw)X
+3076(material.)X
+3384(The)X
+3534(formatters)X
+3889(accept)X
+4120(mixed)X
+2520 768(text)N
+2661(and)X
+2798(commands)X
+3166(as)X
+3254(input)X
+3439(and)X
+3577(produce)X
+3858(output,)X
+4104(which,)X
+2520 864(if)N
+2592(sent)X
+2744(to)X
+2829(the)X
+2950(laser)X
+3125(printers)X
+3392(or)X
+3481(typesetters,)X
+3866(yields)X
+4079(format-)X
+2520 960(ted)N
+2672(text)X
+2846(printed)X
+3127(on)X
+3261(pages.)X
+3518(The)X
+3697(laser)X
+3904(printers)X
+4204(and)X
+2520 1056(typesetters)N
+2887(use)X
+3018(fonts,)X
+3222(i.e.,)X
+3364(sets)X
+3508(of)X
+3599(printable)X
+3907(patterns,)X
+4204(one)X
+2520 1152(per)N
+2666(character,)X
+3025(in)X
+3130(various)X
+3409(representations)X
+3938(in)X
+4044(order)X
+4258(to)X
+2520 1248(cause)N
+2735(the)X
+2869(desired)X
+3136(characters)X
+3498(to)X
+3595(appear)X
+3845(on)X
+3960(the)X
+4093(printed)X
+2520 1344(form.)N
+2736(For)X
+2887(some)X
+3096(printers,)X
+3401(bitmaps)X
+3694(are)X
+3833(used,)X
+4040(with)X
+4222(1's)X
+2520 1440(representing)N
+2943(inked)X
+3147(dots)X
+3306(and)X
+3448(0's)X
+3572(representing)X
+3995(non-inked)X
+2520 1536(dots.)N
+2698(Other)X
+2906(printers)X
+3176(accept)X
+3408(commands)X
+3781(that)X
+3927(cause)X
+4132(draw-)X
+2520 1632(ing)N
+2658(of)X
+2761(the)X
+2895(characters,)X
+3278(the)X
+3412(printer)X
+3662(providing)X
+4009(the)X
+4142(inked)X
+2520 1728(dots)N
+2692(according)X
+3049(to)X
+3151(the)X
+3289(drawing)X
+3592(commands.)X
+3999(One)X
+4173(such)X
+2520 1824(popular)N
+2814(command)X
+3179(language)X
+3518(is)X
+3620(P)X
+8 s 8 xH F
+3664(OST)X
+10 s 10 xH F
+3785(S)X
+8 s 8 xH F
+3829(CRIPT)X
+10 s 10 xH F
+4011(,)X
+4080(and)X
+4245(its)X
+2520 1920(usual)N
+2714(use)X
+2846(is)X
+2924(to)X
+3011(specify)X
+3268(the)X
+3391(outline)X
+3639(of)X
+3732(the)X
+3856(character)X
+4178(with)X
+2520 2016(the)N
+2653(interpreting)X
+3062(printer)X
+3311(\256lling)X
+3536(in)X
+3633(the)X
+3766(outline)X
+4022(with)X
+4198(ink.)X
+2520 2112(One)N
+2694(popular)X
+2980(method)X
+3261(of)X
+3369(describing)X
+3744(fonts)X
+3945(is)X
+4039(with)X
+4222(the)X
+0 f F
+2520 2208(METAFONT)N
+1 f F
+2884(language,)X
+3217(in)X
+3301(which)X
+3519(declarative)X
+3894(de\256nitions)X
+4253(of)X
+2520 2304(how)N
+2689(to)X
+2782(paint)X
+2973(the)X
+3102(characters)X
+3460(are)X
+3591(given)X
+3801(in)X
+3895(terms)X
+4105(of)X
+4204(pen)X
+2520 2400(path)N
+2699(and)X
+2856(pen)X
+3013(shape.)X
+3257(Another)X
+3561(popular)X
+3847(method)X
+4128(is)X
+4222(the)X
+2520 2496(same)N
+2708(P)X
+8 s 8 xH F
+2752(OST)X
+10 s 10 xH F
+2873(S)X
+8 s 8 xH F
+2917(CRIPT)X
+10 s 10 xH F
+3122(that)X
+3265(many)X
+3466(printers)X
+3734(accept.)X
+3984(The)X
+4133(prime)X
+2520 2592(di)N
+2582 MX
+(ff)138 606 oc
+2630(erence)X
+2869(is)X
+2950(that)X
+3098(the)X
+0 f F
+3224(METAFONT)X
+1 f F
+3593(program)X
+3892(translates)X
+4222(the)X
+2520 2688(font)N
+2671(de\256nitions)X
+3030(into)X
+3176(bitmaps)X
+3451(prior)X
+3629(to)X
+3713(sending)X
+3985(the)X
+4106(font)X
+4258(to)X
+2520 2784(the)N
+2657(printer)X
+2910(while)X
+3126(a)X
+3200(P)X
+8 s 8 xH F
+3244(OST)X
+10 s 10 xH F
+3365(S)X
+8 s 8 xH F
+3409(CRIPT)X
+10 s 10 xH F
+3629(printer)X
+3881(translates)X
+4222(the)X
+2520 2880(outlines)N
+2806(into)X
+2963(bitmaps)X
+3249(at)X
+3340(the)X
+3471(time)X
+3646(of)X
+3746(printing.)X
+4052(Interest-)X
+2520 2976(ingly,)N
+2724(both)X
+2886(the)X
+0 f F
+3004(METAFONT)X
+1 f F
+3365(language)X
+3675(and)X
+3811(the)X
+3929(P)X
+8 s 8 xH F
+3973(OST)X
+10 s 10 xH F
+4094(S)X
+8 s 8 xH F
+4138(CRIPT)X
+10 s 10 xH F
+2520 3072(language)N
+2845(use)X
+2987(Be)X
+3045(\302zier)X
+3233(curves)X
+3478(for)X
+3607(describing)X
+3976(the)X
+4110(curves)X
+2520 3168(followed)N
+2863(by)X
+3001(the)X
+3157(pen)X
+3331(or)X
+3456(the)X
+3612(outlines.)X
+3943(As)X
+4089(usually)X
+2520 3264(con\256gured)N
+2886(these)X
+3074(days,)X
+3264(T)X
+3305 3280(E)N
+3346 3264(X)N
+3428(uses)X
+3590(bitmapped)X
+3952(fonts)X
+4136(in)X
+4222(the)X
+2520 3360(Computer)N
+2865(Modern)X
+3144(family)X
+3378(generated)X
+3715(by)X
+0 f F
+3819(METAFONT)X
+1 f F
+4160(,)X
+4204(and)X
+9 f F
+2520 3456(ditroff)N
+1 f F
+2775(uses)X
+2969(P)X
+8 s 8 xH F
+3013(OST)X
+10 s 10 xH F
+3134(S)X
+8 s 8 xH F
+3178(CRIPT)X
+10 s 10 xH F
+3416(outline)X
+3695(fonts)X
+3912(supplied)X
+4240(by)X
+2520 3552(Adobe.)N
+2679 3648(The)N
+2859(subsequent)X
+3270(subsections)X
+3695(delve)X
+3925(deeper)X
+4196(into)X
+2520 3744(these)N
+2712(issues)X
+2929(in)X
+3017(order)X
+3213(to)X
+3301(be)X
+3403(able)X
+3563(to)X
+3651(state)X
+3824(the)X
+3948(goal)X
+4112(of)X
+4205(this)X
+2520 3840(paper)N
+2719(in)X
+2801(the)X
+2919(next)X
+3077(section.)X
+3 f F
+2520 4032(2.1)N
+2680(Fonts,)X
+2947(design)X
+3220(sizes,)X
+3452(and)X
+3637(magni\256cations.)X
+1 f F
+4231(As)X
+2520 4128(mentioned,)N
+2904(fonts)X
+3090(are)X
+3215(the)X
+3339(raw)X
+3486(material)X
+3774(of)X
+3866(typesetting.)X
+4262(A)X
+2520 4224(font)N
+2676(is)X
+2756(a)X
+2819(set)X
+2935(of)X
+3029(printable)X
+3341(patterns,)X
+3642(one)X
+3785(for)X
+3906(each)X
+4082(charac-)X
+2520 4320(ter,)N
+2650(that)X
+2795(causes)X
+3030(printing)X
+3308(of)X
+3400(that)X
+3545(character)X
+3866(in)X
+3952(a)X
+4012(particular)X
+2520 4416(recognizable)N
+2970(style)X
+3160(on)X
+3279(the)X
+3416(page.)X
+3628(As)X
+3757(mentioned,)X
+4155(these)X
+2520 4512(patterns)N
+2821(can)X
+2980(be)X
+3102(represented)X
+3519(by)X
+3645(bitmaps)X
+3944(or)X
+4057(drawing)X
+2520 4608(instructions.)N
+2679 4704(Characters)N
+3057(come)X
+3265(in)X
+3361(various)X
+3632(sizes.)X
+3843(There)X
+4066(are)X
+4200(two)X
+2520 4800(independent)N
+2948(notions)X
+3219(of)X
+3322(sizing)X
+3549(for)X
+3679(fonts,)X
+3894(point)X
+4093(size)X
+4253(or)X
+2520 4896(design)N
+2764(size)X
+2924(and)X
+3075(magni\256cation.)X
+3571(The)X
+2 f F
+3732(design)X
+3977(size)X
+1 f F
+4133(is)X
+4222(the)X
+2520 4992(size)N
+2674(at)X
+2761(which)X
+2986(the)X
+3113(character)X
+3438(is)X
+3520(designed)X
+3834(to)X
+3925(be)X
+4029(used)X
+4204(and)X
+2520 5088(is,)N
+2615(in)X
+2699(well-designed)X
+3171(text,)X
+3333(the)X
+3453(size)X
+3600(in)X
+3684(which)X
+3903(the)X
+4024(character)X
+2520 5184(appears)N
+2803(in)X
+2902(\256nal,)X
+3101(printed)X
+3364(copy.)X
+3576(Design)X
+3839(size)X
+4000(is)X
+4089(usually)X
+2520 5280(expressed)N
+2870(in)X
+2965(units)X
+3153(of)X
+3254(points,)X
+3503(which)X
+3733(are)X
+3866(each)X
+4048(approxi-)X
+2520 5376(mately)N
+2778(1/72)X
+2960(of)X
+3067(an)X
+3183(inch.)X
+3380(Most)X
+3583(normal)X
+3849(text)X
+4008(in)X
+4109(books,)X
+2520 5472(newspapers,)N
+2940(and)X
+3081(magazines)X
+3446(is)X
+3525(printed)X
+3778(in)X
+3866(10)X
+3972(point)X
+4162(type.)X
+2520 5568(Headlines)N
+2864(are)X
+2986(larger,)X
+3217(perhaps)X
+3490(as)X
+3580(large)X
+3764(as)X
+3854(30)X
+3957(points.)X
+4195(The)X
+2 f F
+2520 5664(magni\256cation)N
+1 f F
+3008(of)X
+3123(a)X
+3207(font)X
+3384(is)X
+3485(the)X
+3631(inverse)X
+3911(of)X
+4026(the)X
+4173(ratio)X
+2465 6084(1)N
+
+%%Page: 2 3
+2 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+1 f F
+576 672(between)N
+868(the)X
+990(design)X
+1223(size)X
+1371(of)X
+1461(the)X
+1582(character)X
+1901(and)X
+2040(the)X
+2161(size)X
+2309(of)X
+576 768(the)N
+701(character)X
+1024(as)X
+1119(it)X
+1191(emerges)X
+1487(on)X
+1595(the)X
+1721(printer,)X
+1983(the)X
+2109(assump-)X
+576 864(tion)N
+723(being)X
+923(that)X
+1065(the)X
+1185(\256nal)X
+1349(copy)X
+1527(is)X
+1602(a)X
+1660(photo)X
+1864(reduction)X
+2189(of)X
+2278(the)X
+576 960(printed)N
+845(copy.)X
+1063(Thus,)X
+1285(if)X
+1376(photo)X
+1600(reduction)X
+1945(halves)X
+2193(linear)X
+576 1056(dimensions,)N
+988(one)X
+1132(prints)X
+1342(with)X
+1512(magni\256cation)X
+1980(2.)X
+2088(If)X
+2170(every-)X
+576 1152(thing)N
+788(is)X
+889(done)X
+1093(right,)X
+1312(then)X
+1498(after)X
+1694(reduction,)X
+2065(the)X
+2211(letter)X
+576 1248(appears)N
+842(at)X
+920(its)X
+1015(design)X
+1244(size.)X
+735 1344(A)N
+819(10)X
+925(point)X
+1115(design)X
+1350(sized)X
+1541(font)X
+1696(printed)X
+1949(at)X
+2033(magni\256ca-)X
+576 1440(tion)N
+725(2)X
+790(is)X
+868(similar)X
+1115(to)X
+1202(but)X
+1329(not)X
+1456(quite)X
+1641(the)X
+1764(same)X
+1954(as)X
+2046(a)X
+2107(20)X
+2212(point)X
+576 1536(version)N
+839(of)X
+933(the)X
+1058(same)X
+1250(font.)X
+1446(For)X
+1584(example,)X
+1904(the)X
+2030(serifs)X
+2232(on)X
+2340(a)X
+576 1632(large)N
+763(point)X
+953(size)X
+1104(are)X
+1229(smaller)X
+1490(than)X
+1653(they)X
+1816(would)X
+2041(be)X
+2142(if)X
+2216(strict)X
+576 1728(linear)N
+783(magni\256cation)X
+1247(were)X
+1428(used.)X
+1619(Other)X
+1826(proportions,)X
+2240(e.g.,)X
+576 1824(of)N
+679(x-height)X
+982(to)X
+1080(cap-height)X
+1455(and)X
+1606(of)X
+1708(width)X
+1925(to)X
+2022(height,)X
+2277(are)X
+576 1920(also)N
+751(di)X
+813 MX
+(ff)138 606 oc
+861(erent.)X
+1088(While)X
+1330(many)X
+1554(purists,)X
+1833(Knuth)X
+2080(included,)X
+576 2016(insist)N
+773(on)X
+881(using)X
+1082(a)X
+1146(di)X
+1208 MX
+(ff)138 606 oc
+1256(erent)X
+1445(pattern)X
+1696(for)X
+1818(each)X
+1994(design)X
+2231(size,)X
+576 2112(many)N
+787(people)X
+1034(accept)X
+1273(magni\256cation)X
+1746(as)X
+1847(yielding)X
+2143(accept-)X
+576 2208(able)N
+777(fonts)X
+1004(at)X
+1129(other)X
+1361(point)X
+1592(sizes.)X
+1835(If)X
+1955(the)X
+2119(unit)X
+2309(of)X
+576 2304(magni\256cation)N
+1047(is)X
+1132(not)X
+1266(too)X
+1400(big)X
+1534(the)X
+1664(results)X
+1905(are)X
+2036(acceptable)X
+576 2400(even)N
+748(to)X
+830(many)X
+1028(purists.)X
+3 f F
+576 2592(2.2)N
+736(Problems)X
+1086(with)X
+1262(bitmapped)X
+1655(fonts.)X
+1 f F
+1889(A)X
+1972(bitmap)X
+2220(for)X
+2340(a)X
+576 2688(character)N
+898(is)X
+977(a)X
+1039(rectangular)X
+1426(array)X
+1617(of)X
+1709(bits)X
+1849(covering)X
+2155(the)X
+2278(so-)X
+576 2784(called)N
+802(bounding)X
+1138(box)X
+1292(or)X
+1393(frame)X
+1616(that)X
+1771(exactly)X
+2038(contains)X
+2340(a)X
+576 2880(letter.)N
+789(Figure)X
+1026(1)X
+1094(shows)X
+1322(a)X
+1386(low)X
+1534(resolution)X
+1881(bit)X
+1992(map)X
+2157(for)X
+2278(the)X
+576 2976(letter)N
+762(\252N\272)X
+913(in)X
+996(a)X
+1053(sans)X
+1212(serif)X
+1377(font.)X
+1548(The)X
+1695(inked)X
+1895(squares)X
+2158(or)X
+2247(pix-)X
+576 3072(els)N
+694(are)X
+822(denoted)X
+1105(by)X
+1214(\2521\272)X
+1355(bits)X
+1499(and)X
+1644(the)X
+1771(uninked)X
+2058(pixels)X
+2277(are)X
+576 3168(denoted)N
+850(by)X
+950(\2520\272)X
+1082(bits.)X
+1044 3264 MXY
+864
+1488
+0.00
+-12.00
+108.00
+174.00
+startFig
+%!
+%%%Title: N
+%%%Creator: fig2ps
+%%%CreationDate: Fri Jul 6 08:19:03 1990
+%%%For: dberry@cs24 (dberry,479C,4325,252027,@$CP037,shlomo,cs24,)
+%%%Pages: 0
+%%%BoundingBox: 0 -12 108 174
+%%%Was: 0 0 108 162
+%%%EndComments
+/$F2psDict 32 dict def $F2psDict begin $F2psDict /mtrx matrix put
+ end /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def %%EndProlog
+$F2psBegin
+1 setlinecap 1 setlinejoin
+-72 72 translate
+0.000000 162.000000 translate 0.900 -0.900 scale
+0.700 setlinewidth
+%% Polyline
+newpath 179 79 moveto 199 79 lineto 199 259 lineto 179 259 lineto closepath gsave 0.000 setgray fill grestore stroke
+%% Polyline
+newpath 159 219 moveto 179 219 lineto 179 239 lineto 159 239 lineto closepath gsave 0.000 setgray fill grestore stroke
+%% Polyline
+newpath 139 179 moveto 159 179 lineto 159 219 lineto 139 219 lineto closepath gsave 0.000 setgray fill grestore stroke
+%% Polyline
+newpath 119 139 moveto 139 139 lineto 139 179 lineto 119 179 lineto closepath gsave 0.000 setgray fill grestore stroke
+%% Polyline
+newpath 99 99 moveto 119 99 lineto 119 139 lineto 99 139 lineto closepath gsave 0.000 setgray fill grestore stroke
+%% Polyline
+newpath 79 79 moveto 99 79 lineto 99 259 lineto 79 259 lineto closepath gsave 0.000 setgray fill grestore stroke
+$F2psEnd
+endFig
+1341 4896(Figure)N
+1570(1)X
+576 5056(The)N
+738(low)X
+895(resolution)X
+1252(example)X
+1561(of)X
+1666(Figure)X
+1913(1)X
+1991(illustrates)X
+2340(a)X
+576 5152(major)N
+790(problem)X
+1083(with)X
+1251(bitmapped)X
+1615(fonts.)X
+1821(Curved)X
+2083(lines)X
+2260(and)X
+576 5248(straight)N
+858(lines)X
+1051(that)X
+1213(are)X
+1354(neither)X
+1619(vertical)X
+1902(nor)X
+2051(horizontal)X
+576 5344(cannot)N
+820(be)X
+926(represented)X
+1327(exactly)X
+1588(by)X
+1697(a)X
+1762(rectangular)X
+2153(pattern)X
+576 5440(of)N
+669(pixels.)X
+906(One)X
+1066(is)X
+1145(forced)X
+1377(to)X
+1466(approximate)X
+1894(them)X
+2081(with)X
+2250(rec-)X
+576 5536(tangular)N
+872(steps.)X
+1085(At)X
+1198(high)X
+1373(resolution,)X
+1745(e.g.)X
+1893(above)X
+2117(1000)X
+2309(or)X
+576 5632(so,)N
+707(the)X
+845(human)X
+1103(eye)X
+1255(cannot)X
+1510(see)X
+1654(the)X
+1793(steps,)X
+2014(but)X
+2157(at)X
+2256(low)X
+2520 672(resolution)N
+2877(the)X
+3012(steps)X
+3209(are)X
+3344(quite)X
+3540(apparent.)X
+3893(Visible)X
+4160(steps)X
+2520 768(are)N
+2639(called)X
+2851(\252jaggies\272)X
+3170(after)X
+3338(the)X
+3456(jagged)X
+3690(edges.)X
+2679 864(Bitmaps)N
+2977(for)X
+3103(a)X
+3171(font)X
+3332(must)X
+3519(be)X
+3627(built)X
+3805(for)X
+3931(each)X
+4111(design)X
+2520 960(size,)N
+2696(magni\256cation,)X
+3187(and)X
+3334(resolution.)X
+3705(If)X
+3789(the)X
+3917(resolution)X
+4267(is)X
+2520 1056(\256xed,)N
+2724(as)X
+2816(is)X
+2894(the)X
+3017(case)X
+3181(on)X
+3286(most)X
+3466(printers,)X
+3756(a)X
+3817(bitmap)X
+4064(must)X
+4244(be)X
+2520 1152(built)N
+2687(for)X
+2802(each)X
+2971(design)X
+3201(size)X
+3346(and)X
+3482(magni\256cation.)X
+3962(An)X
+4080(attempt)X
+2520 1248(to)N
+2633(use)X
+2791(a)X
+2878(given)X
+3107(bitmap)X
+3380(at)X
+3489(a)X
+3576(larger)X
+3815(design)X
+4076(size)X
+4253(or)X
+2520 1344(magni\256cation)N
+2999(by)X
+3118(just)X
+3272(enlarging)X
+3614(the)X
+3751(area)X
+3925(of)X
+4031(each)X
+4218(dot)X
+2520 1440(yields)N
+2731(a)X
+2787(bad)X
+2923(case)X
+3082(of)X
+3169(jaggies.)X
+3 f F
+2520 1632(2.3)N
+0 f F
+2680(METAFONT)X
+3 f F
+3064(and)X
+3235(its)X
+3359(environment.)X
+0 f F
+3879(METAFONT)X
+1 f F
+4220(,)X
+4284(a)X
+2520 1728(language)N
+2834(for)X
+2952(the)X
+3074(speci\256cation)X
+3503(of)X
+3593(fonts)X
+3776(or)X
+3866(typefaces,)X
+4213(has)X
+2520 1824(been)N
+2719(used)X
+2913(to)X
+3022(provide)X
+3314(fonts)X
+3521(for)X
+3662(the)X
+3808(T)X
+3849 1840(E)N
+3890 1824(X)N
+3996(family)X
+4253(of)X
+2520 1920(typesetting)N
+2911(systems.)X
+3224(A)X
+0 f F
+3322(METAFONT)X
+1 f F
+3703(user)X
+3876(writes)X
+4111(a)X
+4186(pro-)X
+2520 2016(gram)N
+2716(for)X
+2841(each)X
+3020(letter)X
+3216(or)X
+3314(symbol)X
+3580(of)X
+3678(an)X
+3785(alphabet.)X
+4128(These)X
+2520 2112(programs)N
+2862(are)X
+2999(di)X
+3061 MX
+(ff)138 606 oc
+3109(erent)X
+3308(from)X
+3502(the)X
+3638(usual)X
+3845(computer)X
+4186(pro-)X
+2520 2208(grams,)N
+2771(because)X
+3061(they)X
+3234(are)X
+3369(essentially)X
+3743(declarative)X
+4132(rather)X
+2520 2304(than)N
+2726(imperative,)X
+3156(using)X
+3396(an)X
+3539(algebraic)X
+3901(language)X
+4258(to)X
+2520 2400(describe)N
+2822(the)X
+2955(center)X
+3187(stroke)X
+3418(or)X
+3520(edges)X
+3738(of)X
+3840(the)X
+3973(characters.)X
+2520 2496(The)N
+2666(description)X
+3043(of)X
+3131(a)X
+3188(letter)X
+3373(in)X
+0 f F
+3455(METAFONT)X
+1 f F
+3816(is)X
+3889(a)X
+3945(set)X
+4054(of)X
+4141(equa-)X
+2520 2592(tions)N
+2727(describing)X
+3113(the)X
+3264(strokes.)X
+3564(When)X
+3809(combined)X
+4178(with)X
+2520 2688(parameters)N
+2900(describing)X
+3261(the)X
+3385(pen)X
+3527(shape)X
+3736(and)X
+3878(size,)X
+4049(one)X
+4191(gets)X
+2520 2784(a)N
+2588(full)X
+2731(description)X
+3119(of)X
+3219(a)X
+3288(letter.)X
+3506(Sizes)X
+3708(and)X
+3857(shapes)X
+4104(of)X
+4204(pen)X
+2520 2880(nibs)N
+2678(can)X
+2815(be)X
+2916(varied)X
+3142(in)X
+0 f F
+3229(METAFONT)X
+1 f F
+3595(and)X
+3735(the)X
+3857(characters)X
+4208(can)X
+2520 2976(be)N
+2635(built)X
+2820(up)X
+2939(in)X
+3040(such)X
+3226(a)X
+3301(way)X
+3474(that)X
+3634(the)X
+3772(outlines)X
+4065(of)X
+4172(each)X
+2520 3072(stroke)N
+2748(are)X
+2879(precisely)X
+3201(controlled.)X
+3578(Herein)X
+3829(lies)X
+3972(the)X
+4101(advan-)X
+2520 3168(tage)N
+2680(of)X
+0 f F
+2774(METAFONT)X
+1 f F
+3115(;)X
+3164(a)X
+3227(font)X
+3383(is)X
+3463(easily)X
+3677(speci\256ed)X
+3989(and)X
+4132(varia-)X
+2520 3264(tions)N
+2695(are)X
+2814(obtained)X
+3110(by)X
+3210(varying)X
+3475(parameters.)X
+2679 3360(Currently,)N
+3057(the)X
+3206(program)X
+3529(that)X
+3700(converts)X
+4024(a)X
+4112(set)X
+4253(of)X
+0 f F
+2520 3456(METAFONT)N
+1 f F
+2914(font)X
+3096(descriptions)X
+3536(into)X
+3713(a)X
+3801(bitmapped)X
+4191(font)X
+2520 3552(translates)N
+2858(the)X
+2991(description)X
+3382(of)X
+3484(a)X
+3555(letter)X
+3755(combined)X
+4106(with)X
+4284(a)X
+2520 3648(point)N
+2714(size)X
+2869(and)X
+3015(a)X
+3080(magni\256cation)X
+3549(into)X
+3702(a)X
+3767(bitmap.)X
+4038(This)X
+4209(bit-)X
+2520 3744(map)N
+2678(can)X
+2810(be)X
+2906(sent)X
+3055(to)X
+3137(the)X
+3255(printer)X
+3489(to)X
+3571(get)X
+3689(a)X
+3745(letter)X
+3930(on)X
+4030(the)X
+4148(page.)X
+2520 3840(Herein)N
+2780(lies)X
+2932(a)X
+3009(disadvantage)X
+3469(of)X
+0 f F
+3577(METAFONT)X
+1 f F
+3918(;)X
+3981(a)X
+4058(bit)X
+4182(map)X
+2520 3936(must)N
+2698(be)X
+2797(kept)X
+2958(for)X
+3075(each)X
+3246(point)X
+3433(size)X
+3581(and)X
+3720(magni\256cation,)X
+4204(and)X
+2520 4032(this)N
+2655(can)X
+2787(require)X
+3035(a)X
+3091(lot)X
+3195(of)X
+3282(space.)X
+3 f F
+2520 4224(2.4)N
+2680(The)X
+2869(P)X
+8 s 8 xH F
+2918(OST)X
+10 s 10 xH F
+3047(S)X
+8 s 8 xH F
+3091(CRIPT)X
+10 s 10 xH F
+3346(language.)X
+1 f F
+3748(The)X
+3929(P)X
+8 s 8 xH F
+3973(OST)X
+10 s 10 xH F
+4094(S)X
+8 s 8 xH F
+4138(CRIPT)X
+10 s 10 xH F
+2520 4320(language)N
+2834(is)X
+2911(an)X
+3011(interpretive)X
+3405(programming)X
+3865(language)X
+4178(with)X
+2520 4416(graphics)N
+2851(capabilities.)X
+3296(P)X
+8 s 8 xH F
+3340(OST)X
+10 s 10 xH F
+3461(S)X
+8 s 8 xH F
+3505(CRIPT)X
+10 s 10 xH F
+3687('s)X
+3805(extensive)X
+4168(page)X
+2520 4512(description)N
+2914(capabilities)X
+3317(are)X
+3454(embedded)X
+3822(into)X
+3983(a)X
+4056(general-)X
+2520 4608(purpose)N
+2854(programming)X
+3370(language)X
+3741(framework.)X
+4195(The)X
+2520 4704(language)N
+2834(includes)X
+3125(a)X
+3185(conventional)X
+3622(set)X
+3734(of)X
+3824(data)X
+3981(types)X
+4173(such)X
+2520 4800(as)N
+2611(numbers,)X
+2931(arrays,)X
+3173(and)X
+3314(strings,)X
+3572(control)X
+3824(primitives)X
+4173(such)X
+2520 4896(as)N
+2650(conditionals,)X
+3124(loops)X
+3360(and)X
+3538(procedures,)X
+3973(and)X
+4151(some)X
+2520 4992(unusual)N
+2809(features)X
+3104(such)X
+3291(as)X
+3398(dictionaries.)X
+3832(In)X
+3939(most)X
+4134(P)X
+8 s 8 xH F
+4178(OST-)X
+10 s 10 xH F
+2520 5088(S)N
+8 s 8 xH F
+2564(CRIPT)X
+10 s 10 xH F
+2774(fonts,)X
+2982(each)X
+3158(letter)X
+3351(is)X
+3432(described)X
+3767(by)X
+3874(an)X
+3977(imperative)X
+2520 5184(program)N
+2825(tracing)X
+3081(the)X
+3213(outline)X
+3469(of)X
+3570(the)X
+3702(letter.)X
+3921(This)X
+4097(tracing)X
+2520 5280(may)N
+2700(include)X
+2978(curves)X
+3230(given)X
+3449(as)X
+3557(Be)X
+3615(\302zier)X
+3809(curves,)X
+4080(straight)X
+2520 5376(lines,)N
+2731(arcs,)X
+2921(etc.)X
+3075(A)X
+3174(P)X
+8 s 8 xH F
+3218(OST)X
+10 s 10 xH F
+3339(S)X
+8 s 8 xH F
+3383(CRIPT)X
+10 s 10 xH F
+3606(printer)X
+3861(interprets)X
+4205(this)X
+2520 5472(outline)N
+2777(program)X
+3084(to)X
+3181(draw)X
+3377(and)X
+3528(\256ll)X
+3650(in)X
+3746(the)X
+3878(letters)X
+4108(on)X
+4222(the)X
+2520 5568(page.)N
+2731(Some)X
+2953(consider)X
+3265(the)X
+3403(imperative)X
+3786(nature)X
+4027(of)X
+4134(P)X
+8 s 8 xH F
+4178(OST-)X
+10 s 10 xH F
+2520 5664(S)N
+8 s 8 xH F
+2564(CRIPT)X
+10 s 10 xH F
+2780(to)X
+2875(be)X
+2984(a)X
+3053(disadvantage)X
+3505(in)X
+3600(comparison)X
+4007(to)X
+0 f F
+4102(META-)X
+1 f F
+2465 6084(2)N
+
+%%Page: 3 4
+3 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+576 672(FONT)N
+1 f F
+741('s)X
+853(declarative)X
+1260(nature.)X
+1535(The)X
+1714(main)X
+1928(advantage)X
+2309(of)X
+576 768(P)N
+8 s 8 xH F
+620(OST)X
+10 s 10 xH F
+741(S)X
+8 s 8 xH F
+785(CRIPT)X
+10 s 10 xH F
+996(relative)X
+1266(to)X
+0 f F
+1357(METAFONT)X
+1 f F
+1727(is)X
+1809(that)X
+1958(one)X
+2103(needs)X
+2314(to)X
+576 864(keep)N
+756(only)X
+926(the)X
+1052(outline.)X
+1322(If,)X
+1424(as)X
+1519(in)X
+1609(the)X
+1735(usual)X
+1932(case,)X
+2120(the)X
+2247(out-)X
+576 960(line)N
+747(is)X
+851(speci\256ed)X
+1186(in)X
+1298(terms)X
+1526(of)X
+1643(a)X
+1729(\256xed)X
+1939(path)X
+2127(through)X
+576 1056(Euclidean)N
+929(two-space,)X
+1307(this)X
+1455(outline)X
+1710(may)X
+1881(be)X
+1990(scaled)X
+2224(arbi-)X
+576 1152(trarily)N
+803(to)X
+896(yield)X
+1087(any)X
+1234(magni\256cation.)X
+1725(The)X
+1880(scaling)X
+2137(is)X
+2220(done)X
+576 1248(by)N
+687(the)X
+816(P)X
+8 s 8 xH F
+860(OST)X
+10 s 10 xH F
+981(S)X
+8 s 8 xH F
+1025(CRIPT)X
+10 s 10 xH F
+1238(interpreter)X
+1604(at)X
+1693(the)X
+1822(printer.)X
+2087(Thus)X
+2278(the)X
+576 1344(di)N
+638 MX
+(ff)138 606 oc
+686(erent)X
+883(magni\256cations)X
+1390(do)X
+1505(not)X
+1642(require)X
+1905(any)X
+2056(additional)X
+576 1440(storage)N
+833(space.)X
+1057(Actually,)X
+1378(the)X
+1502(outlines)X
+1781(are)X
+1906(kept)X
+2070(as)X
+2163(if)X
+2238(they)X
+576 1536(were)N
+754(for)X
+869(the)X
+988(Adobe-standard)X
+1522(1000)X
+1703(dots)X
+1857(per)X
+1980(emm,)X
+2180(which)X
+576 1632(at)N
+675(a)X
+752(design)X
+1002(size)X
+1168(of)X
+1276(10)X
+1398(points)X
+1635(amounts)X
+1948(to)X
+2052(7200)X
+2254(dpi.)X
+576 1728(Because)N
+867(a)X
+926(typical)X
+1166(phototypesetter)X
+1682(has)X
+1811(a)X
+1869(maximum)X
+2215(reso-)X
+576 1824(lution)N
+799(of)X
+903(about)X
+1118(2500)X
+1315(dpi,)X
+1474(the)X
+1609(outlines)X
+1899(are)X
+2035(said)X
+2201(to)X
+2300(be)X
+576 1920(arbitrarily)N
+939(scaleable.)X
+1296(If)X
+1392(the)X
+1532(outlines)X
+1827(are)X
+1968(kept,)X
+2168(as)X
+2277(are)X
+576 2016(many)N
+0 f F
+794(METAFONT)X
+1 f F
+1175(de\256nitions,)X
+1573(as)X
+1681(paths)X
+1891(through)X
+2181(points)X
+576 2112(calculated)N
+925(by)X
+1028(the)X
+1149(outline)X
+1394(program,)X
+1709(then)X
+1869(it)X
+1935(is)X
+2010(possible)X
+2294(to,)X
+576 2208(say,)N
+744(make)X
+959(serifs)X
+1174(grow)X
+1380(more)X
+1586(slowly)X
+1840(than)X
+2020(linearly.)X
+2327(It)X
+576 2304(would)N
+811(then)X
+984(be)X
+1094(possible)X
+1390(to)X
+1486(have)X
+1672(one)X
+1822(P)X
+8 s 8 xH F
+1866(OST)X
+10 s 10 xH F
+1987(S)X
+8 s 8 xH F
+2031(CRIPT)X
+10 s 10 xH F
+2247(font)X
+576 2400(scaleable)N
+905(to)X
+1001(all)X
+1115(design)X
+1358(sizes.)X
+1588(Generally,)X
+1959(outline)X
+2216(fonts)X
+576 2496(are)N
+705(not)X
+837(written)X
+1094(this)X
+1239(way,)X
+1423(so)X
+1524(that)X
+1673(strictly)X
+1924(speaking)X
+2238(they)X
+576 2592(are)N
+695(scaleable)X
+1010(only)X
+1172(to)X
+1254(all)X
+1354(magni\256cations.)X
+735 2688(In)N
+823(addition,)X
+1126(the)X
+1246(P)X
+8 s 8 xH F
+1290(OST)X
+10 s 10 xH F
+1411(S)X
+8 s 8 xH F
+1455(CRIPT)X
+10 s 10 xH F
+1659(language)X
+1971(has)X
+2100(a)X
+2158(way)X
+2314(to)X
+576 2784(work)N
+786(with)X
+973(bitmapped)X
+1356(fonts.)X
+1601(While)X
+1842(the)X
+1985(P)X
+8 s 8 xH F
+2029(OST)X
+10 s 10 xH F
+2150(S)X
+8 s 8 xH F
+2194(CRIPT)X
+10 s 10 xH F
+576 2880(printer)N
+815(can)X
+952(scale)X
+1138(them)X
+1323(before)X
+1554(printing,)X
+1853(the)X
+1977(end)X
+2119(result)X
+2323(is)X
+576 2976(that)N
+726(each)X
+904(of)X
+1001(the)X
+1129(\256xed)X
+1319(number)X
+1594(of)X
+1691(dots)X
+1854(in)X
+1945(the)X
+2072(bitmap)X
+2323(is)X
+576 3072(made)N
+772(larger)X
+983(or)X
+1073(smaller.)X
+1352(Since)X
+1553(the)X
+1674(human)X
+1915(will)X
+2062(see)X
+2188(larger)X
+576 3168(dots)N
+752(as)X
+862(jagged)X
+1119(lines,)X
+1332(such)X
+1521(fonts)X
+1723(are)X
+1864(not)X
+2008(really)X
+2233(con-)X
+576 3264(sidered)N
+828(scaleable.)X
+3 f F
+576 3456(2.5)N
+736(Be)X
+794(\302zier)X
+986(curves.)X
+1 f F
+1280(Both)X
+0 f F
+1466(METAFONT)X
+1 f F
+1838(and)X
+1985(P)X
+8 s 8 xH F
+2029(OST)X
+10 s 10 xH F
+2150(S)X
+8 s 8 xH F
+2194(CRIPT)X
+10 s 10 xH F
+576 3552(use)N
+725(Be)X
+783(\302zier)X
+978(cubics)X
+1225(to)X
+1329(specify)X
+1603(curves.)X
+1874(For)X
+2026(the)X
+2165(Be)X
+2223(\302zier)X
+576 3648(form,)N
+773(four)X
+928(points)X
+1144(are)X
+1264(used,)X
+1452(the)X
+1571(start)X
+1730(point,)X
+1935(the)X
+2054(end)X
+2192(point,)X
+576 3744(and)N
+716(two)X
+860(control)X
+1111(points,)X
+1350(as)X
+1441(shown)X
+1674(in)X
+1759(the)X
+1880(top)X
+2005(half)X
+2153(of)X
+2243(Fig-)X
+576 3840(ure)N
+708(2.)X
+817(The)X
+971(tangent)X
+1236(vectors)X
+1497(of)X
+1593(the)X
+1720(endpoints)X
+2060(are)X
+2188(deter-)X
+576 3936(mined)N
+818(from)X
+1016(the)X
+1156(line)X
+1318(segments)X
+2 f F
+1658(P)X
+7 s 7 xH 1 f F
+1707 3952(1)N
+10 s 10 xH 2 f F
+1741 3936(P)N
+7 s 7 xH 1 f F
+1790 3952(2)N
+10 s 10 xH F
+1866 3936(and)N
+2 f F
+2024(P)X
+7 s 7 xH 1 f F
+2073 3952(3)N
+10 s 10 xH 2 f F
+2107 3936(P)N
+7 s 7 xH 1 f F
+2156 3952(4)N
+10 s 10 xH F
+2190 3936(.)N
+2251(The)X
+576 4032(mathematical)N
+1053(introduction)X
+1489(of)X
+1601(the)X
+1744(Be)X
+1802(\302zier)X
+2000(form)X
+2202(when)X
+576 4128(given)N
+774(four)X
+928(points)X
+2 f F
+1143(P)X
+7 s 7 xH 1 f F
+1192 4144(1)N
+10 s 10 xH F
+1226 4128(,)N
+2 f F
+1266(P)X
+7 s 7 xH 1 f F
+1315 4144(2)N
+10 s 10 xH F
+1349 4128(,)N
+2 f F
+1389(P)X
+7 s 7 xH 1 f F
+1438 4144(3)N
+10 s 10 xH F
+1472 4128(,)N
+1512(and)X
+2 f F
+1648(P)X
+7 s 7 xH 1 f F
+1697 4144(4)N
+10 s 10 xH F
+1751 4128(is)N
+2 f F
+648 4320(z)N
+1 f F
+692(\()X
+2 f F
+719(t)X
+1 f F
+747(\))X
+47 f F
+794(=)X
+1 f F
+858(\(1)X
+47 f F
+925(-)X
+2 f F
+969(t)X
+1 f F
+997(\))X
+7 s 7 xH F
+1024 4288(3)N
+10 s 10 xH 2 f F
+1058 4320(P)N
+7 s 7 xH 1 f F
+1107 4336(1)N
+10 s 10 xH 47 f F
+1161 4320(+)N
+1 f F
+1225(3)X
+2 f F
+(t)S
+1 f F
+1300(\()X
+2 f F
+1327(t)X
+47 f F
+1362(-)X
+1 f F
+1406(1\))X
+7 s 7 xH F
+1473 4288(2)N
+10 s 10 xH 2 f F
+1507 4320(P)N
+7 s 7 xH 1 f F
+1556 4336(2)N
+10 s 10 xH 47 f F
+1610 4320(+)N
+1 f F
+1674(3)X
+2 f F
+(t)S
+7 s 7 xH 1 f F
+1745 4288(2)N
+10 s 10 xH F
+1779 4320(\(1)N
+47 f F
+1846(-)X
+2 f F
+1890(t)X
+1 f F
+1918(\))X
+2 f F
+1945(P)X
+7 s 7 xH 1 f F
+1994 4336(3)N
+10 s 10 xH 47 f F
+2048 4320(+)N
+2 f F
+2112(t)X
+7 s 7 xH 1 f F
+2143 4288(3)N
+10 s 10 xH 2 f F
+2177 4320(P)N
+7 s 7 xH 1 f F
+2226 4336(4)N
+10 s 10 xH F
+2260 4320(,)N
+576 4512(for)N
+690(0)X
+47 f F
+750(\243)X
+2 f F
+814(t)X
+47 f F
+862(\243)X
+1 f F
+926(1.)X
+735 4608(Two)N
+925(characteristics)X
+1428(of)X
+1538(the)X
+1679(Be)X
+1737(\302zier)X
+1933(form)X
+2132(tend)X
+2314(to)X
+576 4704(make)N
+776(it)X
+846(widely)X
+1090(used)X
+1263(in)X
+1351(graphics.)X
+1668(First,)X
+1859(by)X
+1964(choosing)X
+2278(the)X
+576 4800(control)N
+850(points)X
+1092(one)X
+1255(can)X
+1414(easily)X
+1648(mold)X
+1859(the)X
+2004(curve)X
+2230(to)X
+2340(a)X
+576 4896(desired)N
+836(shape.)X
+1067(Second,)X
+1351(the)X
+1476(four)X
+1637(control)X
+1891(points)X
+2113(taken)X
+2314(in)X
+576 4992(another)N
+839(order)X
+1031(de\256ne)X
+1250(a)X
+1309(convex)X
+1564(polygon,)X
+2 f F
+1869(P)X
+7 s 7 xH 1 f F
+1918 5008(1)N
+10 s 10 xH 2 f F
+1975 4992(P)N
+7 s 7 xH 1 f F
+2024 5008(2)N
+10 s 10 xH 2 f F
+2081 4992(P)N
+7 s 7 xH 1 f F
+2130 5008(4)N
+10 s 10 xH 2 f F
+2187 4992(P)N
+7 s 7 xH 1 f F
+2236 5008(3)N
+10 s 10 xH 2 f F
+2293 4992(P)N
+7 s 7 xH 1 f F
+2342 5008(1)N
+10 s 10 xH F
+576 5088(in)N
+668(this)X
+813(case,)X
+1002(the)X
+2 f F
+1130(convex)X
+1384(hull)X
+1 f F
+1504(,)X
+1553(which)X
+1778(bounds)X
+2038(the)X
+2165(Be)X
+2223(\302zier)X
+576 5184(curve.)N
+811(The)X
+973(convex)X
+1242(hull)X
+1403(is)X
+1493(useful)X
+1726(in)X
+1825(clipping)X
+2124(a)X
+2197(curve)X
+576 5280(against)N
+823(a)X
+879(window.)X
+735 5376(When)N
+962(a)X
+0 f F
+1033(METAFONT)X
+1 f F
+1410(user)X
+1580(speci\256es)X
+1892(a)X
+1964(path,)X
+0 f F
+2158(META-)X
+576 5472(FONT)N
+1 f F
+772(creates)X
+1027(a)X
+1094(list)X
+1222(of)X
+1320(knots)X
+1524(and)X
+1671(control)X
+1929(points)X
+2154(for)X
+2278(the)X
+576 5568(associated)N
+951(cubic)X
+1170(spline)X
+1406(curves.)X
+1701(If)X
+1800(the)X
+1943(user)X
+2122(has)X
+2274(not)X
+576 5664(speci\256ed)N
+890(the)X
+1017(control)X
+1273(points)X
+1497(explicitly,)X
+0 f F
+1847(METAFONT)X
+1 f F
+2216(itself)X
+2520 672(\256nds)N
+2696(some)X
+2886(for)X
+3001(the)X
+3120(splines)X
+3363(of)X
+3451(a)X
+3508(curve,)X
+3729(while)X
+3929(P)X
+8 s 8 xH F
+3973(OST)X
+10 s 10 xH F
+4094(S)X
+8 s 8 xH F
+4138(CRIPT)X
+10 s 10 xH F
+2520 768(requires)N
+2799(all)X
+2899(the)X
+3017(four)X
+3171(points)X
+3386(to)X
+3468(be)X
+3564(explicitly)X
+3886(given.)X
+2600 864 MXY
+1640
+3352
+0.00
+0.00
+205.00
+419.00
+startFig
+%!
+%%%Title: bezier
+%%%Creator: fig2ps
+%%%CreationDate: Fri Jul 6 08:19:07 1990
+%%%For: dberry@cs24 (dberry,479C,4325,252027,@$CP037,shlomo,cs24,)
+%%%Pages: 0
+%%%BoundingBox: 0 0 205 419
+%%%EndComments
+/$F2psDict 32 dict def $F2psDict begin $F2psDict /mtrx matrix put
+ /DrawEllipse { /endangle exch def /startangle exch def /yrad exch def /xrad exch def /y exch def /x exch def /savematrix mtrx currentmatrix def x y translate xrad yrad scale 0 0 1 startangle endangle arc savematrix setmatrix } def
+ /DrawSplineSection { /y3 exch def /x3 exch def /y2 exch def /x2 exch def /y1 exch def /x1 exch def /xa x1 x2 x1 sub 0.666667 mul add def /ya y1 y2 y1 sub 0.666667 mul add def /xb x3 x2 x3 sub 0.666667 mul add def /yb y3 y2 y3 sub 0.666667 mul add def x1 y1 lineto xa ya xb yb x3 y3 curveto } def
+ end /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def %%EndProlog
+$F2psBegin
+1 setlinecap 1 setlinejoin
+-77 80 translate
+0.000000 419.000000 translate 0.900 -0.900 scale
+0.700 setlinewidth
+%% Ellipse
+newpath 299 434 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+%% Ellipse
+newpath 259 354 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+%% Ellipse
+newpath 199 394 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+%% Ellipse
+newpath 179 474 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+%% Ellipse
+newpath 159 534 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+%% Ellipse
+newpath 99 474 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+%% Ellipse
+newpath 119 387 2 2 0 360 DrawEllipse gsave 0.000 setgray fill grestore stroke
+ [1 3.200000] 0 setdash
+%% Polyline
+newpath 99 199 moveto 179 119 lineto 239 299 lineto 299 199 lineto stroke
+stroke
+ [] 0 setdash
+%% Open spline
+newpath 99.000 474.000 moveto 109.000 431.500 lineto
+ 109.000 431.500 119.000 389.000 139.000 461.500 DrawSplineSection
+ 139.000 461.500 159.000 534.000 169.000 504.000 DrawSplineSection
+ 169.000 504.000 179.000 474.000 189.000 434.000 DrawSplineSection
+ 189.000 434.000 199.000 394.000 229.000 374.000 DrawSplineSection
+ 229.000 374.000 259.000 354.000 279.000 394.000 DrawSplineSection
+ 299.000 434.000 lineto stroke
+%% Open spline
+newpath 99.000 199.000 moveto 139.000 159.000 lineto
+ 139.000 159.000 179.000 119.000 209.000 209.000 DrawSplineSection
+ 209.000 209.000 239.000 299.000 269.000 249.000 DrawSplineSection
+ 299.000 199.000 lineto stroke
+/Times-Italic findfont 12.000 scalefont setfont
+299 184 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+304 189 moveto
+1 -1 scale
+(4)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+309 429 moveto
+1 -1 scale
+(7)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+269 349 moveto
+1 -1 scale
+(6)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+209 384 moveto
+1 -1 scale
+(5)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+159 554 moveto
+1 -1 scale
+(3)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+154 549 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+94 469 moveto
+1 -1 scale
+(1)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+89 464 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+130 379 moveto
+1 -1 scale
+(2)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+125 374 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+204 379 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+189 494 moveto
+1 -1 scale
+(4)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+184 489 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+304 424 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+264 344 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+99 179 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+104 184 moveto
+1 -1 scale
+(1)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+179 104 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+184 109 moveto
+1 -1 scale
+(2)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Italic findfont 12.000 scalefont setfont
+239 314 moveto
+1 -1 scale
+(P)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+/Times-Roman findfont 9.000 scalefont setfont
+244 319 moveto
+1 -1 scale
+(3)dup stringwidth pop 2 div neg 0 rmoveto gsave 0.000 rotate show grestore 1 -1 scale
+$F2psEnd
+endFig
+3285 4360(Figure)N
+3514(2)X
+3 f F
+2520 4616(3)N
+0 f F
+2620(METAFONT)X
+3 f F
+2981(to)X
+3068(P)X
+8 s 8 xH F
+3117(OST)X
+10 s 10 xH F
+3246(S)X
+8 s 8 xH F
+3290(CRIPT)X
+10 s 10 xH F
+3509(compiler\320)X
+2520 4712(why)N
+2682(and)X
+2830(how)X
+1 f F
+2520 4856(This)N
+2701(section)X
+2967(describes)X
+3305(a)X
+3380(major)X
+3606(performance)X
+4053(problem)X
+2520 4952(with)N
+0 f F
+2706(METAFONT)X
+1 f F
+3047(-generated)X
+3430(fonts)X
+3633(that)X
+3796(perhaps)X
+4089(can)X
+4244(be)X
+2520 5048(solved)N
+2753(by)X
+2857(translating)X
+3220(them)X
+3405(into)X
+3554(P)X
+8 s 8 xH F
+3598(OST)X
+10 s 10 xH F
+3719(S)X
+8 s 8 xH F
+3763(CRIPT)X
+10 s 10 xH F
+3970(fonts.)X
+4195(The)X
+2520 5144(goals)N
+2714(of)X
+2806(this)X
+2946(translation)X
+3308(are)X
+3431(established.)X
+3831(Based)X
+4051(on)X
+4155(these)X
+2520 5240(goals,)N
+2737(a)X
+2801(particular)X
+3137(approach)X
+3460(is)X
+3542(adopted)X
+3825(to)X
+3916(engineer)X
+4222(the)X
+2520 5336(software)N
+2817(largely)X
+3060(from)X
+3236(existing)X
+3509(components.)X
+3 f F
+2520 5528(3.1)N
+2680(A)X
+2816(problem)X
+3184(with)X
+0 f F
+3414(METAFONT)X
+3 f F
+3755(-generated)X
+4200(bit-)X
+2520 5624(mapped)N
+2821(fonts.)X
+1 f F
+3056(In)X
+0 f F
+3148(METAFONT)X
+1 f F
+3489(,)X
+3534(one)X
+3675(gets)X
+3829(one)X
+3970(bitmap)X
+4217(per)X
+2520 5720(point)N
+2709(size)X
+2859(and)X
+3000(magni\256cation.)X
+3485(The)X
+3635(size)X
+3785(of)X
+3877(these)X
+4067(bitmaps)X
+2465 6084(3)N
+
+%%Page: 4 5
+4 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+1 f F
+576 672(grows)N
+803(as)X
+901(the)X
+1029(square)X
+1269(of)X
+1366(product)X
+1641(of)X
+1738(the)X
+1866(design)X
+2105(size)X
+2260(and)X
+576 768(the)N
+711(magni\256cation)X
+1188(and)X
+1341(requires)X
+1637(a)X
+1710(large)X
+1908(storage)X
+2177(space.)X
+576 864(Files)N
+754(that)X
+896(are)X
+1017(sent)X
+1168(to)X
+1252(the)X
+1372(printer)X
+1608(will)X
+1754(be)X
+1852(large,)X
+2055(especially)X
+576 960(if)N
+667(lots)X
+824(of)X
+933(di)X
+995 MX
+(ff)138 606 oc
+1043(erent)X
+1247(point)X
+1454(sizes)X
+1653(or)X
+1763(magni\256cations)X
+2277(are)X
+576 1056(used.)N
+781(In)X
+886(P)X
+8 s 8 xH F
+930(OST)X
+10 s 10 xH F
+1051(S)X
+8 s 8 xH F
+1095(CRIPT)X
+10 s 10 xH F
+1315(with)X
+1495(outline)X
+1755(fonts,)X
+1972(there)X
+2170(is)X
+2260(one)X
+576 1152(outline)N
+824(per)X
+953(character)X
+1275(which)X
+1497(can)X
+1635(be)X
+1738(scaled)X
+1966(arbitrarily)X
+2314(to)X
+576 1248(any)N
+739(magni\256cation)X
+1225(that)X
+1391(might)X
+1623(be)X
+1745(needed.)X
+2039(Moreover,)X
+576 1344(P)N
+8 s 8 xH F
+620(OST)X
+10 s 10 xH F
+741(S)X
+8 s 8 xH F
+785(CRIPT)X
+10 s 10 xH F
+999(outline)X
+1253(fonts)X
+1445(are)X
+1576(generally)X
+1907(more)X
+2104(compact)X
+576 1440(than)N
+737(bitmapped)X
+1098(fonts.)X
+1301(For)X
+1435(example,)X
+1750(an)X
+1849(enclosed)X
+2152(rectan-)X
+576 1536(gle)N
+703(is)X
+785(represented)X
+1185(by)X
+1294(its)X
+1398(four)X
+1561(corner)X
+1796(points)X
+2020(rather)X
+2238(than)X
+576 1632(by)N
+676(all)X
+776(the)X
+894(bits)X
+1029(enclosed)X
+1330(by)X
+1430(the)X
+1548(rectangle.)X
+735 1728(Certainly)N
+1063(the)X
+1191(outline)X
+1443(fonts)X
+1633(are)X
+1762(more)X
+1957(easily)X
+2175(scaled)X
+576 1824(to)N
+662(other)X
+851(magni\256cations.)X
+1366(By)X
+1483(scaling)X
+1734(the)X
+1855(bitmapped)X
+2216(fonts)X
+576 1920(downward,)N
+971(too)X
+1109(much)X
+1323(information)X
+1737(is)X
+1826(lost,)X
+1997(and)X
+2149(scaling)X
+576 2016(upward)N
+862(introduces)X
+1240(the)X
+1382(jaggies.)X
+1693(Moreover,)X
+2074(the)X
+2216(pixel)X
+576 2112(array)N
+766(is)X
+843(device)X
+1078(dependent;)X
+1455(it)X
+1524(is)X
+1602(valid)X
+1787(for)X
+1906(output)X
+2135(devices)X
+576 2208(of)N
+666(only)X
+831(one)X
+969(particular)X
+1299(resolution)X
+1641(and)X
+1779(one)X
+1917(choice)X
+2149(of)X
+2238(pos-)X
+576 2304(sible)N
+750(data)X
+907(values)X
+1135(per)X
+1261(pixel.)X
+1464(Scaleable)X
+1795(fonts)X
+1979(have)X
+2155(a)X
+2215(great)X
+576 2400(advantage)N
+923(\320)X
+1024(you)X
+1165(need)X
+1337(only)X
+1499(one)X
+1635(font)X
+1784(description)X
+2160(\256le)X
+2282(for)X
+576 2496(all)N
+690(magni\256cations)X
+1195(of)X
+1296(that)X
+1450(font.)X
+1654(Actually,)X
+1985(P)X
+8 s 8 xH F
+2029(OST)X
+10 s 10 xH F
+2150(S)X
+8 s 8 xH F
+2194(CRIPT)X
+10 s 10 xH F
+576 2592(outline)N
+830(fonts)X
+1022(are)X
+1153(more)X
+1350(scaleable)X
+1677(even)X
+1860(than)X
+2029(the)X
+0 f F
+2158(META-)X
+576 2688(FONT)N
+1 f F
+781(originals)X
+1101(for)X
+1235(another)X
+1516(reason.)X
+1786(In)X
+1893([9],)X
+2048(it)X
+2133(is)X
+2227(said,)X
+576 2784(\252Caution:)N
+930(before)X
+1179(using)X
+1395(this)X
+1553(`)X
+3 f F
+1580(at)X
+1 f F
+1647(')X
+1716(feature)X
+1982(\(i.e.)X
+2149(scaling)X
+576 2880(downward)N
+944(or)X
+1040(upward\))X
+1337(you)X
+1486(should)X
+1728(check)X
+1946(to)X
+2038(make)X
+2242(sure)X
+576 2976(that)N
+717(your)X
+885(typesetter)X
+1218(supports)X
+1510(the)X
+1629(font)X
+1779(at)X
+1857(the)X
+1975(size)X
+2120(in)X
+2202(ques-)X
+576 3072(tion;)N
+747(T)X
+788 3088(E)N
+829 3072(X)N
+913(will)X
+1063(accept)X
+1295(any)X
+47 f F
+1437(\341)X
+1 f F
+1463(desired)X
+1721(size)X
+47 f F
+1846(\361)X
+1 f F
+1898(that)X
+2044(is)X
+2123(positive)X
+576 3168(and)N
+720(less)X
+868(than)X
+1034(2048)X
+1222(points,)X
+1465(but)X
+1595(the)X
+1721(\256nal)X
+1891(output)X
+2123(will)X
+2274(not)X
+576 3264(be)N
+689(right)X
+877(unless)X
+1114(the)X
+1250(scaled)X
+1489(font)X
+1656(really)X
+1877(is)X
+1968(available)X
+2296(on)X
+576 3360(your)N
+749(printing)X
+1027(device.\272)X
+1318(Getting)X
+1583(P)X
+8 s 8 xH F
+1627(OST)X
+10 s 10 xH F
+1748(S)X
+8 s 8 xH F
+1792(CRIPT)X
+10 s 10 xH F
+1999(outline)X
+2246(ver-)X
+576 3456(sions)N
+783(of)X
+0 f F
+893(METAFONT)X
+1 f F
+1277(fonts)X
+1480(is)X
+1576(possible)X
+1882(since)X
+2091(both)X
+2277(are)X
+576 3552(based)N
+788(on)X
+897(Be)X
+955(\302zier)X
+1137(curves.)X
+1396(Doing)X
+1625(so)X
+1725(makes)X
+1959(fonts)X
+2148(hereto-)X
+576 3648(fore)N
+738(available)X
+1061(only)X
+1236(on)X
+1349(T)X
+1390 3664(E)N
+1431 3648(X)N
+1522(and)X
+1671(other)X
+1869(DVI-based)X
+2255(for-)X
+576 3744(matters)N
+839(available)X
+1156(on)X
+9 f F
+1265(ditroff)X
+1 f F
+1491(and)X
+1633(other)X
+1824(formatters)X
+2180(which)X
+576 3840(have)N
+765(evolved)X
+1056(to)X
+1155(or)X
+1259(have)X
+1448(been)X
+1637(designed)X
+1959(for)X
+2090(use)X
+2234(with)X
+576 3936(P)N
+8 s 8 xH F
+620(OST)X
+10 s 10 xH F
+741(S)X
+8 s 8 xH F
+785(CRIPT)X
+10 s 10 xH F
+987(printers.)X
+3 f F
+576 4128(3.2)N
+736(Goals.)X
+1 f F
+999(Based)X
+1223(on)X
+1331(the)X
+1457(observations)X
+1891(of)X
+1987(Section)X
+2256(3.1,)X
+576 4224(the)N
+704(goal)X
+872(of)X
+969(this)X
+1114(research)X
+1413(is)X
+1496(to)X
+1588(produce)X
+1877(a)X
+0 f F
+1943(METAFONT)X
+1 f F
+2314(to)X
+576 4320(P)N
+8 s 8 xH F
+620(OST)X
+10 s 10 xH F
+741(S)X
+8 s 8 xH F
+785(CRIPT)X
+10 s 10 xH F
+1000(compiler,)X
+9 f F
+1341(mf2ps)X
+1 f F
+1558(.)X
+1612(Its)X
+1726(operational)X
+2121(require-)X
+576 4416(ments)N
+787(are)X
+906(items)X
+1099(1)X
+1159(through)X
+1428(5:)X
+639 4560(1.)N
+735(It)X
+831(must)X
+1033(be)X
+1156(possible)X
+1465(to)X
+1574(translate)X
+1893(any)X
+2056(legitimate)X
+0 f F
+735 4656(METAFONT)N
+1 f F
+1102(font)X
+1257(de\256nition)X
+1589(at)X
+1673(any)X
+1814(given)X
+2017(design)X
+2251(size)X
+735 4752(into)N
+879(a)X
+935(P)X
+8 s 8 xH F
+979(OST)X
+10 s 10 xH F
+1100(S)X
+8 s 8 xH F
+1144(CRIPT)X
+10 s 10 xH F
+1346(outline)X
+1588(font.)X
+639 4896(2.)N
+735(The)X
+894(resulting)X
+1208(P)X
+8 s 8 xH F
+1252(OST)X
+10 s 10 xH F
+1373(S)X
+8 s 8 xH F
+1417(CRIPT)X
+10 s 10 xH F
+1633(outline)X
+1889(font)X
+2052(should)X
+2300(be)X
+735 4992(arbitrarily)N
+1076(scaleable.)X
+639 5136(3.)N
+735(The)X
+883(resulting)X
+1186(fonts)X
+1369(should)X
+1606(look)X
+1772(like)X
+1916(the)X
+2038(bitmapped)X
+735 5232(fonts)N
+915(when)X
+1109(printed)X
+1356(on)X
+1456(the)X
+1574(same)X
+1759(printer.)X
+639 5376(4.)N
+735(The)X
+894(resulting)X
+1208(P)X
+8 s 8 xH F
+1252(OST)X
+10 s 10 xH F
+1373(S)X
+8 s 8 xH F
+1417(CRIPT)X
+10 s 10 xH F
+1633(outline)X
+1889(font)X
+2052(should)X
+2300(be)X
+735 5472(more)N
+944(compact)X
+2 f F
+1260(when)X
+1473(sent)X
+1646(to)X
+1752(the)X
+1894(printer)X
+1 f F
+2159(than)X
+2340(a)X
+735 5568(P)N
+8 s 8 xH F
+779(OST)X
+10 s 10 xH F
+900(S)X
+8 s 8 xH F
+944(CRIPT)X
+10 s 10 xH F
+1168(version)X
+1446(of)X
+1555(the)X
+0 f F
+1695(METAFONT)X
+1 f F
+2036(-generated)X
+735 5664(bitmapped)N
+1093(font.)X
+2520 672(The)N
+2681(fourth)X
+2913(requirement)X
+3337(deserves)X
+3650(a)X
+3722(bit)X
+3842(of)X
+3946(explanation)X
+2520 768(and)N
+2669(quali\256cation.)X
+3142(First)X
+3321(note)X
+3492(that)X
+3645(what)X
+3833(is)X
+3918(compared)X
+4267(is)X
+2520 864(what)N
+2737(is)X
+2851(sent)X
+3041(to)X
+3164(the)X
+3323(printer.)X
+3638(Certainly)X
+3998(there)X
+4221(are)X
+2520 960(compressed)N
+2922(versions)X
+3212(of)X
+3301(the)X
+3421(bitmapped)X
+3781(fonts)X
+3963(that)X
+4105(reduce)X
+2520 1056(the)N
+2651(disk)X
+2817(storage)X
+3082(requirements)X
+3535(of)X
+3636(the)X
+3768(bitmapped)X
+4140(fonts.)X
+2520 1152(However,)N
+2869(they)X
+3041(must)X
+3230(be)X
+3340(uncompressed)X
+3832(before)X
+4071(sending)X
+2520 1248(them)N
+2708(to)X
+2798(most)X
+2981(printers.)X
+3274(It)X
+3351(is)X
+3432(the)X
+3558(printer's)X
+3858(storage)X
+4118(that)X
+4267(is)X
+2520 1344(limited;)N
+2789(generally)X
+3109(disk)X
+3263(space)X
+3463(is)X
+3537(in)X
+3620(abundance.)X
+4005(However,)X
+2520 1440(since)N
+2716(printers)X
+2992(these)X
+3188(days)X
+3367(are)X
+3498(general)X
+3767(purpose)X
+4053(comput-)X
+2520 1536(ers,)N
+2655(what)X
+2832(a)X
+2889(printer)X
+3124(accepts)X
+3382(may)X
+3540(in)X
+3622(fact)X
+3763(be)X
+3859(a)X
+3915(compression)X
+2520 1632(that)N
+2660(it)X
+2724(has)X
+2851(been)X
+3023(programmed)X
+3453(to)X
+3535(undo.)X
+2679 1728(Now)N
+2867(for)X
+2993(the)X
+3123(case)X
+3294(in)X
+3388(which)X
+3616(disk)X
+3781(space)X
+3992(is)X
+4077(of)X
+4177(con-)X
+2520 1824(cern,)N
+2701(the)X
+2821(comparison)X
+3217(should)X
+3452(still)X
+3593(be)X
+3690(relative)X
+3952(to)X
+4035(printable)X
+2520 1920(versions.)N
+2844(There)X
+3069(exist)X
+3258(algorithms,)X
+3658(e.g.)X
+3812(that)X
+3970(of)X
+4075(Lempel)X
+2520 2016(and)N
+2662(Ziv)X
+2799([13])X
+2959(that)X
+3104(can)X
+3241(be)X
+3342(used)X
+3514(to)X
+3601(compress)X
+3929(P)X
+8 s 8 xH F
+3973(OST)X
+10 s 10 xH F
+4094(S)X
+8 s 8 xH F
+4138(CRIPT)X
+10 s 10 xH F
+2520 2112(outline)N
+2789(fonts)X
+2996(which)X
+3239(are,)X
+3405(after)X
+3600(all,)X
+3747(just)X
+3910(ASCII)X
+4167(\256les.)X
+2520 2208(Therefore,)N
+2906(in)X
+3016(order)X
+3234(not)X
+3384(to)X
+3494(have)X
+3694(a)X
+3778(contest)X
+4052(between)X
+2520 2304(compression)N
+2947(algorithms,)X
+3331(the)X
+3451(uncompressed)X
+3932(versions)X
+4221(are)X
+2520 2400(compared.)N
+2886(Furthermore,)X
+3336(in)X
+3427(order)X
+3626(not)X
+3757(to)X
+3848(have)X
+4029(a)X
+4093(contest)X
+2520 2496(between)N
+2840(di)X
+2902 MX
+(ff)138 606 oc
+2950(erent)X
+3163(kinds)X
+3388(of)X
+3507(printers)X
+3804(that)X
+3977(may)X
+4168(have)X
+2520 2592(di)N
+2582 MX
+(ff)138 606 oc
+2630(ering)X
+2819(font)X
+2972(representations,)X
+3501(P)X
+8 s 8 xH F
+3545(OST)X
+10 s 10 xH F
+3666(S)X
+8 s 8 xH F
+3710(CRIPT)X
+10 s 10 xH F
+3915(outline)X
+4160(fonts)X
+2520 2688(are)N
+2655(compared)X
+3009(to)X
+3108(P)X
+8 s 8 xH F
+3152(OST)X
+10 s 10 xH F
+3273(S)X
+8 s 8 xH F
+3317(CRIPT)X
+10 s 10 xH F
+3536(bitmapped)X
+3911(fonts.)X
+4128(When)X
+2520 2784(considering)N
+2916(disk)X
+3071(space,)X
+3292(the)X
+3412(fact)X
+3554(that)X
+3695(one)X
+3832(bitmapped)X
+4191(font)X
+2520 2880(is)N
+2600(needed)X
+2855(for)X
+2976(each)X
+3151(magni\256cation)X
+3618(is)X
+3698(taken)X
+3899(into)X
+4050(account.)X
+2520 2976(Thus,)N
+2721(the)X
+2840(interest)X
+3097(is)X
+3171(in)X
+3254(comparing)X
+3618(the)X
+3737(size)X
+3882(of)X
+3969(a)X
+4025(scaleable)X
+2520 3072(outline)N
+2767(font)X
+2921(to)X
+3008(the)X
+3131(total)X
+3298(storage)X
+3555(for)X
+3674(the)X
+3797(bitmapped)X
+4160(fonts)X
+2520 3168(for)N
+2634(all)X
+2734(magni\256cations)X
+3225(of)X
+3312(a)X
+3368(given)X
+3566(design)X
+3795(size.)X
+2583 3312(5.)N
+2679(The)X
+2838(resulting)X
+3152(P)X
+8 s 8 xH F
+3196(OST)X
+10 s 10 xH F
+3317(S)X
+8 s 8 xH F
+3361(CRIPT)X
+10 s 10 xH F
+3577(outline)X
+3833(font)X
+3996(should)X
+4244(be)X
+2679 3408(more)N
+2882(compact)X
+3192(than)X
+3368(the)X
+3504(total)X
+3684(of)X
+3789(the)X
+3925(sizes)X
+4118(of)X
+4222(the)X
+2679 3504(P)N
+8 s 8 xH F
+2723(OST)X
+10 s 10 xH F
+2844(S)X
+8 s 8 xH F
+2888(CRIPT)X
+10 s 10 xH F
+3104(versions)X
+3405(of)X
+3506(the)X
+0 f F
+3639(METAFONT)X
+1 f F
+3980(-generated)X
+2679 3600(bitmapped)N
+3055(fonts)X
+3253(at)X
+3348(each)X
+3533(available)X
+3860(magni\256cation.)X
+2679 3696(Even)N
+2872(this)X
+3015(comparison)X
+3417(is)X
+3498(not)X
+3629(completely)X
+4014(fair)X
+4155(since)X
+2679 3792(only)N
+2862(speci\256c)X
+3147(magni\256cations)X
+3658(are)X
+3797(provided,)X
+4142(while)X
+2679 3888(the)N
+2797(P)X
+8 s 8 xH F
+2841(OST)X
+10 s 10 xH F
+2962(S)X
+8 s 8 xH F
+3006(CRIPT)X
+10 s 10 xH F
+3208(font)X
+3357(is)X
+3430(arbitrarily)X
+3771(scaleable.)X
+2679 4032(Observe)N
+2993(\256nally,)X
+3263(that)X
+3429(the)X
+3573(comparison)X
+3993(is)X
+4093(against)X
+2520 4128(magni\256cations)N
+3038(of)X
+3151(a)X
+3233(single)X
+3470(design)X
+3725(size)X
+3896(since)X
+4107(purists)X
+2520 4224(would)N
+2741(argue)X
+2941(that)X
+3082(there)X
+3264(should)X
+3498(be)X
+3596(a)X
+3654(di)X
+3716 MX
+(ff)138 606 oc
+3764(erent)X
+3947(outline)X
+4191(font)X
+2520 4320(for)N
+2642(each)X
+2818(design)X
+3055(size.)X
+3248(Since)X
+3454(there)X
+3642(are)X
+3768(those)X
+3964(that)X
+4111(do)X
+4218(not)X
+2520 4416(require)N
+2768(this)X
+2903(purity,)X
+3134(the)X
+3252(various)X
+3508(design)X
+3737(sizes)X
+3913(will)X
+4058(be)X
+4155(com-)X
+2520 4512(pared)N
+2719(also.)X
+2679 4608(The)N
+2824(software)X
+3121(engineering)X
+3520(goal)X
+3678(is)X
+3751(item)X
+3913(6.)X
+2583 4752(6.)N
+9 f F
+2679(mf2ps)X
+1 f F
+2916(should)X
+3149(be)X
+3245(written)X
+3492(as)X
+3579(much)X
+3777(as)X
+3864(possible)X
+4147(using)X
+2679 4848(the)N
+2801(existing)X
+0 f F
+3078(METAFONT)X
+1 f F
+3443(program)X
+3739(both)X
+3904(to)X
+3989(save)X
+4155(work)X
+2679 4944(and)N
+2831(to)X
+2929(ensure)X
+3175(that)X
+3331(all)X
+0 f F
+3447(METAFONT)X
+1 f F
+3788(-acceptable)X
+4191(font)X
+2679 5040(de\256nitions)N
+3036(are)X
+3155(handled.)X
+2520 5184(The)N
+2679(evaluation)X
+3047(of)X
+3148(the)X
+3280(results)X
+3523(will)X
+3681(be)X
+3791(done)X
+3982(relative)X
+4258(to)X
+2520 5280(these)N
+2705(goals.)X
+3 f F
+2520 5472(3.3)N
+2680(Previous)X
+2999(attempts.)X
+1 f F
+3359(Leslie)X
+3576(Carr)X
+3741(wrote)X
+3946(a)X
+4004(collection)X
+2520 5568(of)N
+2613(programs)X
+2942(to)X
+3030(produce)X
+3315(P)X
+8 s 8 xH F
+3359(OST)X
+10 s 10 xH F
+3480(S)X
+8 s 8 xH F
+3524(CRIPT)X
+10 s 10 xH F
+3732(outline)X
+3979(fonts)X
+4164(from)X
+0 f F
+2520 5664(METAFONT)N
+1 f F
+2884(fonts)X
+3067(in)X
+3152(1987.)X
+3355(Carr's)X
+3580(programs)X
+3907(take)X
+4065(as)X
+4156(input)X
+2465 6084(4)N
+
+%%Page: 5 6
+5 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+1 f F
+576 672(the)N
+2 f F
+723(log)X
+1 f F
+874(output)X
+1127(\256le)X
+1277(of)X
+0 f F
+1392(METAFONT)X
+1 f F
+1781(which)X
+2025(contains)X
+2340(a)X
+576 768(description)N
+956(of)X
+1047(all)X
+1151(the)X
+1273(paths)X
+1466(that)X
+0 f F
+1610(METAFONT)X
+1 f F
+1975(traces)X
+2187(out)X
+2314(in)X
+576 864(drawing)N
+859(a)X
+915(character.)X
+735 960(Carr)N
+908(has)X
+1045(problems)X
+1373(of)X
+1470(information)X
+1878(loss)X
+2033(as)X
+2131(a)X
+2198(result)X
+576 1056(of)N
+666(not)X
+791(having)X
+1032(entered)X
+1291(into)X
+1437(the)X
+0 f F
+1557(METAFONT)X
+1 f F
+1920(program.)X
+2234(This)X
+576 1152(is)N
+650(the)X
+769(reason)X
+1001(why)X
+1161(Carr's)X
+1384(characters)X
+1733(are)X
+1854(poor)X
+2023(looking.)X
+2309(In)X
+576 1248([5],)N
+721(Carr)X
+895(observes,)X
+1227(\252In)X
+1361(the)X
+5 f F
+1490(cmr10)X
+1 f F
+1761(font,)X
+1941(the)X
+2 f F
+2070(crisp)X
+1 f F
+2260(pen)X
+576 1344(has)N
+707(diameter)X
+1013(zero,)X
+1197(so)X
+1293(serifs)X
+1492(have)X
+1669(square)X
+1904(corners.)X
+2186(In)X
+2278(the)X
+5 f F
+576 1440(cmtt10)N
+1 f F
+903(font,)X
+2 f F
+1091(crisp)X
+1 f F
+1290(is)X
+1382(set)X
+1510(to)X
+1611(a)X
+1686(larger)X
+1912(value)X
+2124(and)X
+2278(the)X
+576 1536(serifs)N
+794(end)X
+954(in)X
+1060(semicircles.)X
+1485(Because)X
+1797(the)X
+1939(shape)X
+2166(of)X
+2278(the)X
+576 1632(current)N
+839(pen)X
+989(can)X
+1135(NOT)X
+1334(be)X
+1444(taken)X
+1652(into)X
+1810(account)X
+2094(in)X
+2190(P)X
+8 s 8 xH F
+2234(OST-)X
+10 s 10 xH F
+576 1728(S)N
+8 s 8 xH F
+620(CRIPT)X
+10 s 10 xH F
+802(,)X
+852(these)X
+1047(di)X
+1109 MX
+(ff)138 606 oc
+1157(erences)X
+1429(in)X
+1521(the)X
+1649(characters)X
+2007(shapes)X
+2252(will)X
+576 1824(not)N
+711(be)X
+820(seen.)X
+1015(This)X
+1189(is)X
+1274(a)X
+3 f F
+1342(fundamental)X
+1 f F
+1809(problem:)X
+2130(given)X
+2340(a)X
+576 1920(path)N
+2 f F
+747(p)X
+1 f F
+820(and)X
+969(a)X
+1038(pen)X
+2 f F
+1187(q)X
+1 f F
+1260(\(whose)X
+1525(shape)X
+1741(is)X
+1827(also)X
+1989(an)X
+2099(arbitrary)X
+576 2016(path\),)N
+0 f F
+782(METAFONT)X
+1 f F
+1144(e)X
+1180 MX
+(ff)138 606 oc
+1228(ectively)X
+1503(envelopes)X
+2 f F
+1844(p)X
+1 f F
+1904(with)X
+2066(respect)X
+2314(to)X
+576 2112(the)N
+702(shape)X
+914(of)X
+2 f F
+1010(q)X
+1 f F
+(;)S
+1101(P)X
+8 s 8 xH F
+1145(OST)X
+10 s 10 xH F
+1266(S)X
+8 s 8 xH F
+1310(CRIPT)X
+10 s 10 xH F
+1521(can)X
+1662(do)X
+1771(nothing)X
+2044(other)X
+2238(than)X
+576 2208(stroke)N
+815(it)X
+902(to)X
+1007(produce)X
+1309(a)X
+1388(line)X
+1551(of)X
+1661(constant)X
+1970(width.)X
+2234(This)X
+576 2304(incompatibility)N
+1099(comes)X
+1339(to)X
+1436(light)X
+1617(when)X
+1826(the)X
+1959(width)X
+2176(of)X
+2278(the)X
+576 2400(pen)N
+712(is)X
+785(signi\256cant)X
+1138(to)X
+1220(the)X
+1338(shape)X
+1541(of)X
+1628(the)X
+1746(character\272.)X
+735 2496(In)N
+838(order)X
+1044(to)X
+1142(avoid)X
+1356(this)X
+1507(problem,)X
+9 f F
+1832(mf2ps)X
+1 f F
+2086(\256nds)X
+2278(the)X
+576 2592(internally)N
+928(generated)X
+1285(envelope,)X
+1639(which)X
+1879(is)X
+1976(used)X
+2167(as)X
+2278(the)X
+576 2688(boundaries)N
+955(of)X
+1049(the)X
+1174(inked)X
+1380(region,)X
+1633(and)X
+1777(uses)X
+1943(this)X
+2086(envelope)X
+576 2784(as)N
+678(the)X
+811(outline.)X
+1087(It)X
+1170(does)X
+1351(not)X
+1487(matter,)X
+1746(then,)X
+1938(what)X
+2128(the)X
+2260(pen)X
+576 2880(path)N
+734(and)X
+870(the)X
+988(pen)X
+1124(shape)X
+1327(are.)X
+735 2976(More)N
+959(recently,)X
+1289(during)X
+1549(the)X
+1698(time)X
+1891(that)X
+2062(the)X
+2211(work)X
+576 3072(described)N
+931(herein)X
+1179(was)X
+1351(being)X
+1576(done,)X
+1799(there)X
+2007(were)X
+2211(other)X
+576 3168(e)N
+612 MX
+(ff)138 606 oc
+660(orts)X
+800(with)X
+962(similar)X
+1204(goals.)X
+735 3264(Doug)N
+939(Henderson)X
+1313([6])X
+1433(obtained)X
+1735(outline)X
+1983(font)X
+2138(charac-)X
+576 3360(ters)N
+714(by)X
+816(modifying)X
+1171(the)X
+5 f F
+1291(endchar)X
+1 f F
+1649(macro,)X
+1892(which)X
+2110(is)X
+2184(called)X
+576 3456(for)N
+693(each)X
+864(character)X
+1183(after)X
+1354(the)X
+1476(bitmap)X
+1722(is)X
+1799(generated,)X
+2156(to)X
+2242(take)X
+576 3552(the)N
+706(bitmap)X
+960(for)X
+1086(the)X
+1216(character)X
+1544(and)X
+1692(white)X
+1901(out)X
+2034(all)X
+2145(but)X
+2278(the)X
+576 3648(bits)N
+713(on)X
+815(the)X
+935(edge.)X
+1150(The)X
+1298(number)X
+1566(of)X
+1656(bits)X
+1794(left)X
+1924(on)X
+2027(the)X
+2148(edge)X
+2323(is)X
+576 3744(varied)N
+803(according)X
+1146(to)X
+1234(the)X
+1357(resolution)X
+1702(of)X
+1794(the)X
+1917(bitmap.)X
+2184(These)X
+576 3840(outlines,)N
+870(being)X
+1069(bitmapped,)X
+1448(are)X
+1568(just)X
+1704(as)X
+1792(unscaleable)X
+2188(as)X
+2277(are)X
+576 3936(the)N
+694(bitmaps)X
+967(for)X
+1081(the)X
+1199(\256lled-in)X
+1472(characters.)X
+735 4032(Neil)N
+898(Raine)X
+1110(and)X
+1251(Graham)X
+1535(Toal)X
+1708([12])X
+1868(have)X
+2046(developed)X
+576 4128(software)N
+876(that)X
+1019(takes)X
+1206(the)X
+1326(bitmaps)X
+1601(and)X
+1739(rediscovers)X
+2127(the)X
+2247(out-)X
+576 4224(lines)N
+749(by)X
+851(tracing)X
+1096(the)X
+1216(pixels.)X
+1450(The)X
+1598(outlines)X
+1874(that)X
+2017(are)X
+2139(used)X
+2309(as)X
+576 4320(the)N
+706(basis)X
+898(for)X
+1024(P)X
+8 s 8 xH F
+1068(OST)X
+10 s 10 xH F
+1189(S)X
+8 s 8 xH F
+1233(CRIPT)X
+10 s 10 xH F
+1447(fonts)X
+1639(are,)X
+1790(for)X
+1916(the)X
+2045(most)X
+2231(part,)X
+576 4416(generated)N
+911(from)X
+1089(bitmaps)X
+1364(at)X
+1444(2400)X
+1626(dpi.)X
+1770(They)X
+1957(\256rst)X
+2103(generate)X
+576 4512(RISC)N
+801(OS)X
+951(outline)X
+1221(fonts)X
+1429(which)X
+1673(are)X
+1820(screen)X
+2074(fonts)X
+2282(for)X
+576 4608(Acorn's)N
+874(Archimedes)X
+1301(RISC)X
+1517(computer.)X
+1880(These)X
+2112(are)X
+2251(true)X
+576 4704(scaleable)N
+907(outlines.)X
+1216(Then,)X
+1437(these)X
+1637(outlines)X
+1925(are)X
+2059(converted)X
+576 4800(into)N
+728(P)X
+8 s 8 xH F
+772(OST)X
+10 s 10 xH F
+893(S)X
+8 s 8 xH F
+937(CRIPT)X
+10 s 10 xH F
+1147(format.)X
+1409(Toal)X
+1584(says)X
+1751(that)X
+1900(the)X
+2027(the)X
+2154(quality)X
+576 4896(of)N
+666(the)X
+787(fonts)X
+970(produced)X
+1292(is)X
+1368(not)X
+1493(too)X
+1618(great)X
+1802(at)X
+1883(low)X
+2025(resolutions)X
+576 4992(because)N
+871(of)X
+978(shortcomings)X
+1449(in)X
+1551(Adobe's)X
+1863(rendering)X
+2211(algo-)X
+576 5088(rithm.)N
+802(He)X
+929(adds)X
+1109(that)X
+1262(at)X
+1353(1200)X
+1546(dpi)X
+1681(on)X
+1794(a)X
+1862(phototypesetter,)X
+576 5184(they)N
+759(are)X
+903(indistinguishable)X
+1494(from)X
+0 f F
+1695(METAFONT)X
+1 f F
+2036(-generated)X
+576 5280(bitmapped)N
+934(fonts.)X
+1134(These)X
+1346(authors)X
+1602(suspect)X
+1858(that)X
+1998(information)X
+576 5376(that)N
+720(is)X
+797(critical)X
+1044(for)X
+1163(good)X
+1348(appearance)X
+1736(is)X
+1814(lost)X
+1954(when)X
+2153(tracing)X
+576 5472(an)N
+673(outline)X
+916(on)X
+1017(a)X
+1074(bitmap)X
+1317(generated)X
+1650(from)X
+1826(a)X
+1882(mathematically)X
+576 5568(described)N
+909(envelope.)X
+1244(Better)X
+1466(results)X
+1701(should)X
+1940(be)X
+2042(obtainable)X
+576 5664(using)N
+769(the)X
+887(original)X
+1156(envelope.)X
+2679 672(John)N
+2864(Hobby)X
+3116([7])X
+3244(has)X
+3385(developed)X
+3750(a)X
+3821(program)X
+4128(called)X
+2520 768(MetaPost,)N
+2865(which)X
+3083(translates)X
+3408(from)X
+3586(an)X
+3684(extension)X
+4013(of)X
+0 f F
+4102(META-)X
+2520 864(FONT)N
+1 f F
+2725(into)X
+2889(P)X
+8 s 8 xH F
+2933(OST)X
+10 s 10 xH F
+3054(S)X
+8 s 8 xH F
+3098(CRIPT)X
+10 s 10 xH F
+3320(cubic)X
+3534(splines)X
+3796(and)X
+3953(commands.)X
+2520 960(His)N
+2678(goal)X
+2863(was)X
+3035(to)X
+3144(turn)X
+0 f F
+3319(METAFONT)X
+1 f F
+3706(into)X
+3876(a)X
+3958(system)X
+4226(for)X
+2520 1056(typesetting)N
+2900(general)X
+3166(graphics,)X
+3488(including)X
+3820(embedded)X
+4180(text.)X
+2520 1152(His)N
+2653(approach,)X
+2990(similar)X
+3234(to)X
+3318(ours,)X
+3498(was)X
+3645(to)X
+3729(modify)X
+3982(the)X
+0 f F
+4102(META-)X
+2520 1248(FONT)N
+1 f F
+2709(program)X
+3005(into)X
+3154(what)X
+3335(he)X
+3436(desired.)X
+3733(Be\256tting)X
+4037(his)X
+4155(more)X
+2520 1344(general)N
+2800(goals,)X
+3032(besides)X
+3311(modifying)X
+3687(the)X
+3828(output,)X
+4095(he)X
+4213(has)X
+2520 1440(added)N
+2734(new)X
+2890(commands)X
+3259(to)X
+3343(the)X
+3463(input)X
+3650(language.)X
+3983(Moreover,)X
+2520 1536(his)N
+2646(translation)X
+3017(appears)X
+3296(to)X
+3391(be)X
+3500(a)X
+3569(direct)X
+3784(mapping)X
+4096(from)X
+4284(a)X
+0 f F
+2520 1632(METAFONT)N
+1 f F
+2893(command)X
+3241(sequence)X
+3568(to)X
+3662(a)X
+3731(P)X
+8 s 8 xH F
+3775(OST)X
+10 s 10 xH F
+3896(S)X
+8 s 8 xH F
+3940(CRIPT)X
+10 s 10 xH F
+4155(com-)X
+2520 1728(mand)N
+2719(sequence.)X
+3075(The)X
+3221(result)X
+3420(is)X
+3494(a)X
+3551(program)X
+3844(more)X
+4030(powerful)X
+2520 1824(than)N
+9 f F
+2680(mf2ps)X
+1 f F
+2897(.)X
+2957(It)X
+3026(will)X
+3170(be)X
+3266(interesting)X
+3624(to)X
+3707(compare)X
+4005(fonts)X
+4186(pro-)X
+2520 1920(duced)N
+2736(by)X
+2840(MetaPost)X
+3166(and)X
+9 f F
+3308(mf2ps)X
+1 f F
+3548(for)X
+3665(appearance)X
+4051(and)X
+4190(per-)X
+2520 2016(formance.)N
+3 f F
+2520 2208(3.4)N
+2680(Methodology.)X
+1 f F
+3210(There)X
+3439(are)X
+3579(a)X
+3656(number)X
+3942(of)X
+4051(ways)X
+4258(to)X
+2520 2304(build)N
+2704(the)X
+2822(compiler.)X
+3147(They)X
+3332(include)X
+2583 2448(1.)N
+2679(writing)X
+2955(the)X
+3098(whole)X
+3339(compiler)X
+3669(from)X
+0 f F
+3871(METAFONT)X
+1 f F
+4258(to)X
+2679 2544(P)N
+8 s 8 xH F
+2723(OST)X
+10 s 10 xH F
+2844(S)X
+8 s 8 xH F
+2888(CRIPT)X
+10 s 10 xH F
+3099(from)X
+3284(scratch:)X
+3563(This)X
+3733(has)X
+3868(the)X
+3994(advantage)X
+2679 2640(that)N
+2822(one)X
+2961(does)X
+3131(not)X
+3256(have)X
+3431(to)X
+3516(get)X
+3637(into)X
+3784(another)X
+4048(person's)X
+2679 2736(software,)N
+3021(which)X
+3262(is)X
+3360(not)X
+3507(very)X
+3695(pleasant)X
+4003(when)X
+4222(the)X
+2679 2832(software)N
+2985(is)X
+3067(so)X
+3167(big.)X
+3318(On)X
+3445(the)X
+3573(other)X
+3768(hand,)X
+3974(one)X
+4120(would)X
+2679 2928(have)N
+2860(to)X
+2950(treat)X
+3121(the)X
+3247(whole)X
+3471(job)X
+3601(of)X
+3696(turning)X
+3955(mathemati-)X
+2679 3024(cal)N
+2795(equations)X
+3124(and)X
+3262(any)X
+3400(arbitrary)X
+3699(pen)X
+3838(shape)X
+4044(into)X
+4191(out-)X
+2679 3120(lines.)N
+2583 3264(2.)N
+2679(using)X
+2877(the)X
+0 f F
+3000(METAFONT)X
+1 f F
+3366(output)X
+3595(as)X
+3687(was)X
+3837(done)X
+4018(by)X
+4124(Leslie)X
+2679 3360(Carr)N
+2853([5]:)X
+3000(This)X
+3173(has)X
+3311(the)X
+3440(advantage)X
+3797(of)X
+3894(not)X
+4026(requiring)X
+2679 3456(delving)N
+2947(into)X
+3099(another's)X
+3426(software,)X
+3751(but)X
+3881(the)X
+4007(generated)X
+2679 3552(information)N
+3087(is)X
+3170(not)X
+3302(enough)X
+3568(if)X
+3647(one)X
+3793(wants)X
+4010(no)X
+4119(devia-)X
+2679 3648(tions)N
+2854(from)X
+3030(the)X
+3148(originals.)X
+2583 3792(3.)N
+2679(getting)X
+2927(into)X
+3078(the)X
+0 f F
+3203(METAFONT)X
+1 f F
+3571(program:)X
+3892(This)X
+4061(requires)X
+2679 3888(examining)N
+3039(the)X
+3159(internals)X
+3457(of)X
+3546(the)X
+0 f F
+3666(METAFONT)X
+1 f F
+4028(program.)X
+2679 3984(However,)N
+0 f F
+3070(METAFONT)X
+1 f F
+3487(and)X
+3679(P)X
+8 s 8 xH F
+3723(OST)X
+10 s 10 xH F
+3844(S)X
+8 s 8 xH F
+3888(CRIPT)X
+10 s 10 xH F
+4146(make)X
+2679 4080(liberal)N
+2936(use)X
+3095(of)X
+3214(Be)X
+3272(\302zier)X
+3477(curves)X
+3739(to)X
+3853(describe)X
+4173(non-)X
+2679 4176(circular)N
+2968(curves.)X
+3241(This)X
+3426(fact)X
+3591(makes)X
+3840(the)X
+3982(translation)X
+2679 4272(process)N
+2960(natural.)X
+3243(For)X
+3394(each)X
+3581(speci\256ed)X
+3905(path,)X
+0 f F
+4102(META-)X
+2679 4368(FONT)N
+1 f F
+2895(creates)X
+3170(control)X
+3448(points)X
+3694(for)X
+3840(the)X
+3990(associated)X
+2679 4464(cubic)N
+2877(spline)X
+3092(curves)X
+3326(before)X
+3556(calculating)X
+3932(the)X
+4054(bit)X
+4162(map.)X
+0 f F
+2679 4560(METAFONT)N
+1 f F
+3045(also)X
+3199(calculates)X
+3541(the)X
+3664(edge)X
+3842(o)X
+(ff)138 606 oc
+3930(sets)X
+4076(implied)X
+2679 4656(by)N
+2783(the)X
+2905(pen)X
+3045(shape.)X
+3271(Using)X
+3485(the)X
+3606(necessary)X
+3942(information)X
+2679 4752(one)N
+2820(can)X
+2957(get)X
+3080(a)X
+3141(new)X
+3300(set)X
+3414(of)X
+3506(control)X
+3758(points)X
+3978(that)X
+4124(de\256ne)X
+2679 4848(Be)N
+2737(\302zier)X
+2911(curves)X
+3142(and)X
+3278(lines)X
+3449(that)X
+3589(are)X
+3708(needed)X
+3956(to)X
+4038(build)X
+4222(the)X
+2679 4944(P)N
+8 s 8 xH F
+2723(OST)X
+10 s 10 xH F
+2844(S)X
+8 s 8 xH F
+2888(CRIPT)X
+10 s 10 xH F
+3090(outline)X
+3332(fonts.)X
+3 f F
+2520 5136(3.5)N
+2680(Software)X
+3013(engineering)X
+3439(of)X
+3532(solution.)X
+1 f F
+3868(The)X
+4019(idea)X
+4179(is)X
+4258(to)X
+2520 5232(split)N
+2693(the)X
+0 f F
+2827(METAFONT)X
+1 f F
+3204(program)X
+3512(into)X
+3672(front)X
+3864(end)X
+4016(and)X
+4168(back)X
+2520 5328(end.)N
+2687(The)X
+2843(front)X
+3030(end)X
+3178(takes)X
+0 f F
+3375(METAFONT)X
+1 f F
+3748(speci\256cation)X
+4185(of)X
+4284(a)X
+2520 5424(character,)N
+2869(magni\256cation,)X
+3361(and)X
+3509(point)X
+3705(size,)X
+3882(and)X
+4030(produces)X
+2520 5520(the)N
+2646(envelope,)X
+2984(i.e.,)X
+3131(the)X
+3258(outline)X
+3509(of)X
+3605(the)X
+3732(character,)X
+4077(and)X
+4222(the)X
+2520 5616(back)N
+2700(end)X
+2844(\256lls)X
+2990(the)X
+3115(envelope)X
+3432(with)X
+3601(bits.)X
+3763(Taking)X
+4017(the)X
+4142(exist-)X
+2520 5712(ing)N
+2646(front)X
+2827(end)X
+2968(and)X
+3109(writing)X
+3365(a)X
+3426(new)X
+3585(back)X
+3762(end)X
+3903(that)X
+4048(converts)X
+2465 6084(5)N
+
+%%Page: 6 7
+6 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+1 f F
+576 672(the)N
+697(envelope)X
+1010(into)X
+1157(a)X
+1216(P)X
+8 s 8 xH F
+1260(OST)X
+10 s 10 xH F
+1381(S)X
+8 s 8 xH F
+1425(CRIPT)X
+10 s 10 xH F
+1630(speci\256cation)X
+2058(of)X
+2148(an)X
+2247(out-)X
+576 768(line)N
+723(is)X
+804(our)X
+939(method)X
+1207(of)X
+1302(producing)X
+9 f F
+1657(mf2ps)X
+1 f F
+1874(.)X
+1922(The)X
+2075(bit-\256lling)X
+576 864(process)N
+837(will)X
+981(be)X
+1077(done)X
+1253(by)X
+1353(the)X
+1471(printer.)X
+735 960(In)N
+851(order)X
+1070(to)X
+1181(make)X
+1404(P)X
+8 s 8 xH F
+1448(OST)X
+10 s 10 xH F
+1569(S)X
+8 s 8 xH F
+1613(CRIPT)X
+10 s 10 xH F
+1845(fonts)X
+2055(arbitrarily)X
+576 1056(scaleable,)N
+919(we)X
+1041(have)X
+1221(to)X
+1311(ask)X
+1446(the)X
+9 f F
+1574(mf2ps)X
+1 f F
+1818(program)X
+2117(to)X
+2206(use)X
+2340(a)X
+576 1152(very)N
+755(large)X
+952(magni\256cation,)X
+1448(at)X
+1542(least)X
+1725(to)X
+1823(try)X
+1948(to)X
+2046(match)X
+2278(the)X
+576 1248(grid)N
+741(on)X
+857(which)X
+1089(Adobe)X
+1338(plots)X
+1528(the)X
+1661(points)X
+1891(of)X
+1993(its)X
+2103(outlines.)X
+576 1344(Adobe)N
+812(plots)X
+989(its)X
+1086(characters)X
+1435(on)X
+1538(a)X
+1597(1000)X
+47 f F
+1777(\264)X
+1 f F
+1841(1000)X
+2024(grid.)X
+2196(Thus,)X
+576 1440(Adobe's)N
+880(resolution)X
+1231(is)X
+1315(1000)X
+1506(dpm)X
+1679(\(dots)X
+1870(per)X
+2004(em\),)X
+2180(which)X
+576 1536(for)N
+704(design)X
+947(size)X
+1106(10)X
+1220(points)X
+1449(is)X
+1536(7200)X
+1730(dpi.)X
+1906(Unfortunately,)X
+0 f F
+576 1632(METAFONT)N
+1 f F
+917(,)X
+960(and)X
+1099(thus)X
+9 f F
+1257(mf2ps)X
+1 f F
+1497(accepts)X
+1757(resolutions)X
+2131(only)X
+2296(up)X
+576 1728(to)N
+662(3000)X
+846(dpi.)X
+992(The)X
+1141(results)X
+1374(should)X
+1611(be)X
+1712(su)X
+1783 MX
+(Fi)139 825 oc
+(cient)S
+2030(to)X
+2117(produce)X
+576 1824(fonts)N
+768(scaleable)X
+1094(up)X
+1205(to)X
+1298(magni\256cation)X
+1769(7)X
+1840(or)X
+1938(8,)X
+2029(which)X
+2256(is)X
+2340(a)X
+576 1920(reasonable)N
+940(range)X
+1139(in)X
+1221(typesetting.)X
+735 2016(This)N
+898(approach)X
+1214(helps)X
+1404(meet)X
+1581(goal)X
+1740(6)X
+1801(because)X
+2078(the)X
+2198(origi-)X
+576 2112(nal)N
+731(unchanged)X
+0 f F
+1136(METAFONT)X
+1 f F
+1534(program)X
+1863(is)X
+1973(used.)X
+2196(Thus,)X
+576 2208(exactly)N
+834(the)X
+958(same)X
+1149(input)X
+1339(is)X
+1418(accepted)X
+1727(as)X
+1821(in)X
+1910(the)X
+0 f F
+2035(METAFONT)X
+1 f F
+576 2304(program.)N
+898(There)X
+1116(is)X
+1198(some)X
+1396(extra)X
+1586(frosting)X
+1864(obtained)X
+2169(by)X
+2278(the)X
+576 2400(chosen)N
+834(approach.)X
+1185(The)X
+1346(program)X
+1654(for)X
+1784(translating)X
+0 f F
+2158(META-)X
+576 2496(FONT)N
+1 f F
+772(to)X
+865(P)X
+8 s 8 xH F
+909(OST)X
+10 s 10 xH F
+1030(S)X
+8 s 8 xH F
+1074(CRIPT)X
+10 s 10 xH F
+1287(is)X
+1370(actually)X
+1654(a)X
+1720(bit)X
+1834(of)X
+1931(an)X
+2037(interactive)X
+576 2592(environment)N
+1006(because)X
+1286(the)X
+1409(new)X
+1568(back)X
+1746(end)X
+1888(is)X
+1967(an)X
+2069(extension)X
+576 2688(of)N
+669(the)X
+793(existing)X
+1072(one.)X
+1234(This)X
+1401(existing)X
+1679(back-end)X
+1999(provides)X
+2300(an)X
+576 2784(interpreter)N
+990(that)X
+1189(executes)X
+1545(a)X
+0 f F
+1660(METAFONT)X
+1 f F
+2080(character)X
+576 2880(de\256nition)N
+926(and)X
+1086(displays)X
+1392(the)X
+1534(de\256ned)X
+1814(character)X
+2154(on)X
+2278(the)X
+576 2976(screen.)N
+824(Figure)X
+1055(3)X
+1117(shows)X
+1339(the)X
+1459(dump)X
+1663(of)X
+1752(a)X
+1810(screen)X
+2038(containing)X
+576 3072(several)N
+833(windows,)X
+1171(one)X
+1316(showing)X
+1616(a)X
+0 f F
+1681(METAFONT)X
+1 f F
+2050(de\256nition,)X
+576 3168(another)N
+850(showing)X
+1154(the)X
+1285(result)X
+1496(of)X
+1596(its)X
+1704(interpretation,)X
+2190(and)X
+2340(a)X
+576 3264(third)N
+781(containing)X
+1172(the)X
+1323(P)X
+8 s 8 xH F
+1367(OST)X
+10 s 10 xH F
+1488(S)X
+8 s 8 xH F
+1532(CRIPT)X
+10 s 10 xH F
+1767(translation)X
+2158(of)X
+2278(the)X
+576 3360(de\256nition)N
+915(in)X
+1010(the)X
+1141(\256rst)X
+1298(window.)X
+1609(If)X
+1697(software)X
+2008(to)X
+2104(interpret)X
+576 3456(P)N
+8 s 8 xH F
+620(OST)X
+10 s 10 xH F
+741(S)X
+8 s 8 xH F
+785(CRIPT)X
+10 s 10 xH F
+1006(de\256nitions)X
+1382(were)X
+1578(available)X
+1907(here,)X
+2105(a)X
+2180(fourth)X
+576 3552(window)N
+856(could)X
+1057(be)X
+1156(set)X
+1268(up)X
+1371(showing)X
+1665(the)X
+1786(result)X
+1987(of)X
+2077(interpret-)X
+576 3648(ing)N
+719(the)X
+858(translation)X
+1237(of)X
+1345(the)X
+1484(third)X
+1676(window.)X
+1994(This)X
+2176(would)X
+576 3744(allow)N
+821(comparison)X
+1262(of)X
+1396(the)X
+1561(character's)X
+1982(appearances)X
+576 3840(without)N
+840(having)X
+1078(to)X
+1160(print)X
+1331(them)X
+1511(on)X
+1611(paper.)X
+3 f F
+576 4032(4)N
+676(The)X
+829(program)X
+1 f F
+576 4176(In)N
+672(the)X
+799(following)X
+1139(discussion,)X
+1522(the)X
+0 f F
+1650(METAFONT)X
+1 f F
+2021(program)X
+2323(is)X
+576 4272(often)N
+761(called)X
+973(just)X
+1108(\252)X
+0 f F
+1144(METAFONT)X
+1 f F
+1498(\272.)X
+735 4368(The)N
+0 f F
+882(METAFONT)X
+1 f F
+1245(program)X
+1540(has)X
+1670(been)X
+1845(written)X
+2095(so)X
+2189(that)X
+2332(it)X
+576 4464(can)N
+729(be)X
+846(made)X
+1061(to)X
+1164(run)X
+1312(e)X
+1348 MX
+(Fi)139 825 oc
+(ciently)S
+1672(in)X
+1774(a)X
+1850(wide)X
+2046(variety)X
+2309(of)X
+576 4560(operating)N
+911(environments)X
+1379(by)X
+1491(making)X
+1763(comparatively)X
+2255(few)X
+576 4656(changes.)N
+891(Such)X
+1087(\257exibility)X
+1433(is)X
+1522(possible)X
+1819(because)X
+2109(the)X
+2242(pro-)X
+576 4752(gram)N
+782(is)X
+876(written)X
+1145(in)X
+1249(the)X
+5 f F
+1389(WEB)X
+1 f F
+1575(language)X
+1907(which)X
+2145(is)X
+2240(at)X
+2340(a)X
+576 4848(higher)N
+818(level)X
+1011(than)X
+1186(Pascal.)X
+1448(The)X
+1609(preprocessing)X
+2091(step)X
+2256(that)X
+576 4944(converts)N
+5 f F
+872(WEB)X
+1 f F
+1040(to)X
+1126(Pascal)X
+1355(is)X
+1432(able)X
+1591(to)X
+1678(introduce)X
+2006(most)X
+2186(of)X
+2278(the)X
+576 5040(necessary)N
+943(re\256nements.)X
+1390(Semiautomatic)X
+1923(translation)X
+2314(to)X
+576 5136(other)N
+774(languages)X
+1129(is)X
+1216(also)X
+1379(feasible,)X
+1683(because)X
+1972(the)X
+2104(program)X
+576 5232(does)N
+751(not)X
+881(make)X
+1083(extensive)X
+1414(use)X
+1548(of)X
+1642(features)X
+1924(that)X
+2071(are)X
+2197(pecu-)X
+576 5328(liar)N
+703(to)X
+785(Pascal.)X
+735 5424(The)N
+893(program)X
+1198(has)X
+1339(two)X
+1493(important)X
+1838(variations:)X
+2210(First,)X
+576 5520(there)N
+771(is)X
+858(a)X
+928(long)X
+1104(and)X
+1253(slow)X
+1437(version)X
+1706(called)X
+9 s 9 xH 9 f F
+1931(INIMF)X
+10 s 10 xH 1 f F
+2127(,)X
+2180(which)X
+576 5616(does)N
+754(the)X
+884(extra)X
+1077(calculations)X
+1492(needed)X
+1752(to)X
+1846(initialize)X
+0 f F
+2158(META-)X
+576 5712(FONT)N
+1 f F
+741('s)X
+821(internal)X
+1088(tables.)X
+1317(It)X
+1388(has)X
+1517(to)X
+1601(be)X
+1699(run)X
+1828(\256rst.)X
+1994(It)X
+2065(initializes)X
+2520 672(everything)N
+2884(from)X
+3061(scratch)X
+3310(without)X
+3575(reading)X
+3837(a)X
+3895(base)X
+4060(\256le,)X
+4204(and)X
+2520 768(it)N
+2594(has)X
+2731(the)X
+2859(capability)X
+3205(of)X
+3301(dumping)X
+3614(a)X
+3679(base)X
+3851(\256le.)X
+4002(Secondly,)X
+2520 864(there)N
+2713(is)X
+2798(a)X
+2866(shorter)X
+3121(and)X
+3269(faster)X
+3480(production)X
+3859(version)X
+4128(called)X
+9 s 9 xH 9 f F
+2520 960(VIRMF)N
+10 s 10 xH 1 f F
+2744(,)X
+2785(which)X
+3002(cuts)X
+3151(the)X
+3269(initialization)X
+3693(to)X
+3775(a)X
+3831(bare)X
+3990(minimum.)X
+2520 1056(It)N
+2596(is)X
+2676(a)X
+2739(virgin)X
+2957(program)X
+3256(that)X
+3403(needs)X
+3613(to)X
+3702(input)X
+3893(a)X
+3957(base)X
+4128(\256le)X
+4258(in)X
+2520 1152(order)N
+2715(to)X
+2801(get)X
+2923(started.)X
+9 s 9 xH 9 f F
+3181(VIRMF)X
+10 s 10 xH 1 f F
+3429(typically)X
+3733(has)X
+3864(more)X
+4053(memory)X
+2520 1248(capacity)N
+2810(than)X
+9 s 9 xH 9 f F
+2970(INIMF)X
+10 s 10 xH 1 f F
+3166(,)X
+3208(because)X
+3485(it)X
+3551(does)X
+3720(not)X
+3845(need)X
+4020(the)X
+4141(space)X
+2520 1344(consumed)N
+2865(by)X
+2965(the)X
+3083(dumping)X
+3387(and)X
+3523(undumping)X
+3907(routines,)X
+4205(etc.)X
+2679 1440(In)N
+2792(order)X
+3008(to)X
+3116(generate)X
+3435(a)X
+3518(compiler)X
+3850(that)X
+4017(translates)X
+0 f F
+2520 1536(METAFONT)N
+1 f F
+2916(to)X
+3033(P)X
+8 s 8 xH F
+3077(OST)X
+10 s 10 xH F
+3198(S)X
+8 s 8 xH F
+3242(CRIPT)X
+10 s 10 xH F
+3424(,)X
+3499(additional)X
+3873(external)X
+4186(pro-)X
+2520 1632(cedures)N
+2807(and)X
+2964(functions)X
+3303(were)X
+3501(added)X
+3735(to)X
+3839(the)X
+0 f F
+3979(METAFONT)X
+1 f F
+2520 1728(program)N
+2829(so)X
+2937(that)X
+3094(it)X
+3175(runs)X
+3350(exactly)X
+3619(the)X
+3753(same)X
+3954(except)X
+4200(that)X
+2520 1824(when)N
+2715(it)X
+2780(asks)X
+2939(for)X
+3054(an)X
+3151(output)X
+3376(\256le)X
+3499(name,)X
+3715(it)X
+3781(asks)X
+3941(for)X
+4057(an)X
+4155(addi-)X
+2520 1920(tional)N
+2732(name,)X
+2956(for)X
+3080(the)X
+3208(extra)X
+3398(output)X
+3631(\256le)X
+3762(that)X
+3911(is)X
+3993(to)X
+4084(contain)X
+2520 2016(the)N
+2642(P)X
+8 s 8 xH F
+2686(OST)X
+10 s 10 xH F
+2807(S)X
+8 s 8 xH F
+2851(CRIPT)X
+10 s 10 xH F
+3057(outlines.)X
+3354(Those)X
+3575(changes)X
+3859(were)X
+4041(made)X
+4240(on)X
+2520 2112(the)N
+2654(Pascal)X
+2894(version)X
+3165(of)X
+3267(the)X
+9 s 9 xH 9 f F
+3400(VIRMF)X
+10 s 10 xH 1 f F
+3624(,)X
+3679(and)X
+3830(were)X
+4022(compiled)X
+2520 2208(later)N
+2687(with)X
+0 f F
+2853(METAFONT)X
+1 f F
+3194('s)X
+3277(library)X
+3516(\256les.)X
+3714(\(It)X
+3815(was)X
+3965(a)X
+4026(complete)X
+2520 2304(oversight)N
+2840(on)X
+2942(our)X
+3071(part)X
+3218(not)X
+3342(to)X
+3426(have)X
+3600(modi\256ed)X
+3906(the)X
+5 f F
+4025(WEB)X
+1 f F
+4190(ver-)X
+2520 2400(sion)N
+2683(of)X
+9 s 9 xH 9 f F
+2781(VIRMF)X
+10 s 10 xH 1 f F
+3005(.\))X
+3103(A)X
+3192(few)X
+3344(extra)X
+3536(lines)X
+3718(were)X
+3906(added)X
+4129(to)X
+4222(the)X
+2520 2496(macro)N
+2750(\256le,)X
+5 f F
+2901(plain.mf)X
+1 f F
+(.)S
+3333(These)X
+3553(act)X
+3675(as)X
+3770(\257ags,)X
+3969(identifying)X
+2520 2592(that)N
+0 f F
+2660(METAFONT)X
+1 f F
+3021(has)X
+3148(entered)X
+3405(some)X
+3594(of)X
+3681(the)X
+3799(macros.)X
+3 f F
+2520 2784(4.1)N
+2680(Basic)X
+2890(idea.)X
+1 f F
+3100(To)X
+3217(specify)X
+3478(a)X
+3543(character)X
+3868(in)X
+0 f F
+3959(METAFONT)X
+1 f F
+4300(,)X
+2520 2880(one)N
+2668(speci\256es)X
+2976(either)X
+3191(an)X
+3299(envelope)X
+3621(\(outline\))X
+3929(or)X
+4028(a)X
+4096(center-)X
+2520 2976(line)N
+2672(path)X
+2842(and)X
+2990(a)X
+3058(pen)X
+3207(head.)X
+3432(For)X
+3576(the)X
+3707(former,)X
+0 f F
+3979(METAFONT)X
+1 f F
+2520 3072(just)N
+2665(\256lls)X
+2814(the)X
+2942(envelope)X
+3262(with)X
+3434(bits.)X
+3619(For)X
+3760(the)X
+3888(latter,)X
+0 f F
+4102(META-)X
+2520 3168(FONT)N
+1 f F
+2719(pretends)X
+3025(that)X
+3179(it)X
+3257(is)X
+3345(drawing)X
+3643(the)X
+3776(character)X
+4107(with)X
+4284(a)X
+2520 3264(pen)N
+2680(of)X
+2791(speci\256ed)X
+3119(head)X
+3314(shape)X
+3540(following)X
+3894(the)X
+4035(speci\256ed)X
+2520 3360(path,)N
+2704(i.e.,)X
+2848(the)X
+2972(center)X
+3195(of)X
+3288(the)X
+3412(head)X
+3591(stays)X
+3778(on)X
+3885(the)X
+4010(path.)X
+4195(The)X
+2520 3456(distance)N
+2806(from)X
+2984(the)X
+3104(center-line)X
+3470(path)X
+3630(and)X
+3768(outer)X
+3955(edge)X
+4129(of)X
+4218(ink)X
+2520 3552(trail)N
+2671(left)X
+2800(by)X
+2902(pen)X
+3040(head)X
+3215(is)X
+3291(called)X
+3506(the)X
+2 f F
+3627(o)X
+(ff)138 495 oc
+3707(set)X
+1 f F
+3788(.)X
+3851(So,)X
+3978(for)X
+4095(a)X
+4154(char-)X
+2520 3648(acter,)N
+0 f F
+2726(METAFONT)X
+1 f F
+3096(follows)X
+3365(the)X
+3492(center-line)X
+3865(path)X
+4032(to)X
+4123(calcu-)X
+2520 3744(late)N
+2656(the)X
+2775(path)X
+2934(of)X
+3022(o)X
+(ff)138 606 oc
+3110(set)X
+3220(points,)X
+3456(i.e.,)X
+3595(the)X
+3714(envelope,)X
+4045(and)X
+4182(then)X
+2520 3840(\256lls)N
+2670(the)X
+2799(envelope)X
+3120(with)X
+3293(bits.)X
+3479(In)X
+3577(either)X
+3790(case,)X
+0 f F
+3979(METAFONT)X
+1 f F
+2520 3936(ends)N
+2687(up)X
+2787(\256lling)X
+2997(an)X
+3093(envelope.)X
+2679 4032(We)N
+2812(need)X
+2985(to)X
+3068(break)X
+0 f F
+3268(METAFONT)X
+1 f F
+3630(into)X
+3775(a)X
+3832(front)X
+4009(end)X
+4146(and)X
+4284(a)X
+2520 4128(back)N
+2703(end)X
+2850(at)X
+2938(the)X
+3066(point)X
+3260(just)X
+3405(after)X
+3583(the)X
+3711(envelope)X
+4031(has)X
+4168(been)X
+2520 4224(calculated.)N
+2893(Then)X
+3085(we)X
+3206(provide)X
+3479(a)X
+3543(new)X
+3705(back)X
+3885(end)X
+4029(that)X
+4177(con-)X
+2520 4320(verts)N
+2713(the)X
+2848(envelope)X
+3175(into)X
+3336(P)X
+8 s 8 xH F
+3380(OST)X
+10 s 10 xH F
+3501(S)X
+8 s 8 xH F
+3545(CRIPT)X
+10 s 10 xH F
+3764(instead)X
+4027(of)X
+4130(\256lling)X
+2520 4416(the)N
+2647(envelope)X
+2966(with)X
+3137(bits.)X
+3301(Note)X
+3486(then)X
+3653(that)X
+3802(the)X
+3929(P)X
+8 s 8 xH F
+3973(OST)X
+10 s 10 xH F
+4094(S)X
+8 s 8 xH F
+4138(CRIPT)X
+10 s 10 xH F
+2520 4512(printer)N
+2765(will)X
+2920(\256ll)X
+3039(in)X
+3132(the)X
+3261(envelope)X
+3582(with)X
+3755(bits)X
+3901(as)X
+3999(it)X
+4073(\256lls)X
+4222(the)X
+2520 4608(path)N
+2678(obtained)X
+2974(from)X
+3150(the)X
+3268(envelope.)X
+2679 4704(The)N
+2840(following)X
+3187(subsections)X
+3593(describe)X
+3898(the)X
+4033(data)X
+4204(and)X
+2520 4800(the)N
+2638(calculations)X
+3041(involved)X
+3341(in)X
+3423(the)X
+3541(new)X
+3695(back)X
+3867(end.)X
+3 f F
+2520 4992(4.2)N
+2680(Data)X
+2884(structures.)X
+1 f F
+3311(The)X
+3475(main)X
+3674(data)X
+3848(structures)X
+4200(that)X
+0 f F
+2520 5088(METAFONT)N
+1 f F
+2906(keeps)X
+3133(for)X
+3271(a)X
+3351(character)X
+3691(are)X
+3834(the)X
+3976(center-line)X
+2520 5184(path,)N
+2702(the)X
+2824(pen)X
+2964(shape,)X
+3191(and)X
+3331(the)X
+3453(envelope)X
+3767(path.)X
+3949(There)X
+4161(are)X
+4284(a)X
+2520 5280(few)N
+2672(operations)X
+3036(that)X
+3186(can)X
+3328(be)X
+3434(performed)X
+3799(on)X
+3909(paths,)X
+4128(called)X
+2520 5376(transformations.)N
+3 f F
+2679 5472(4.2.1)N
+0 f F
+2899(METAFONT)X
+3 f F
+3240('s)X
+3323(path)X
+3503(representation.)X
+1 f F
+4067(When)X
+4284(a)X
+0 f F
+2520 5568(METAFONT)N
+1 f F
+2898(user)X
+3069(speci\256es)X
+3381(a)X
+3453(path,)X
+0 f F
+3647(METAFONT)X
+1 f F
+4024(creates)X
+4284(a)X
+2520 5664(list)N
+2642(of)X
+2734(knots)X
+2932(and)X
+3073(control)X
+3325(points)X
+3546(for)X
+3666(the)X
+3790(associated)X
+4146(cubic)X
+2465 6084(6)N
+
+%%Page: 7 8
+7 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+1 f F
+576 672(spline)N
+793(curves.)X
+1049(If)X
+1129(the)X
+1252(knots)X
+1450(are)X
+2 f F
+1574(z)X
+7 s 7 xH 1 f F
+1614 688(0)N
+10 s 10 xH F
+1648 672(,)N
+2 f F
+1694(z)X
+7 s 7 xH 1 f F
+1734 688(1)N
+10 s 10 xH F
+1768 672(,)N
+1808(.)X
+1848(.)X
+1888(.)X
+1928(,)X
+2 f F
+1981(z)X
+7 s 7 xH F
+2012 688(n)N
+10 s 10 xH 1 f F
+2046 672(,)N
+2091(there)X
+2277(are)X
+576 768(control)N
+835(points)X
+2 f F
+1062(z)X
+7 s 7 xH F
+1097 783(k)N
+47 f F
+1097 736(+)N
+10 s 10 xH 1 f F
+1167 768(and)N
+2 f F
+1316(z)X
+7 s 7 xH F
+1351 783(k)N
+47 f F
+1385(+)X
+1 f F
+1416(1)X
+47 f F
+1351 736(-)N
+10 s 10 xH 1 f F
+1483 768(such)N
+1663(that)X
+1816(the)X
+1947(cubic)X
+2154(splines)X
+576 864(between)N
+867(the)X
+988(knots)X
+2 f F
+1184(z)X
+7 s 7 xH F
+1215 880(k)N
+10 s 10 xH 1 f F
+1269 864(and)N
+2 f F
+1408(z)X
+7 s 7 xH F
+1439 880(k)N
+47 f F
+1473(+)X
+1 f F
+1504(1)X
+10 s 10 xH F
+1561 864(are)N
+1683(de\256ned)X
+1942(by)X
+2045(the)X
+2165(Be)X
+2223(\302zier)X
+576 960(formula)N
+2 f F
+828 1152(z)N
+1 f F
+872(\()X
+2 f F
+899(t)X
+1 f F
+927(\))X
+47 f F
+974(=)X
+2 f F
+1038(B)X
+1 f F
+1100(\()X
+2 f F
+1127(z)X
+7 s 7 xH F
+1158 1168(k)N
+1 f F
+1183(,)X
+10 s 10 xH 2 f F
+1207 1152(z)N
+7 s 7 xH F
+1242 1167(k)N
+47 f F
+1242 1120(+)N
+10 s 10 xH 1 f F
+1279 1152(,)N
+2 f F
+1305(z)X
+7 s 7 xH F
+1340 1167(k)N
+47 f F
+1374(+)X
+1 f F
+1405(1)X
+47 f F
+1340 1120(-)N
+10 s 10 xH 1 f F
+1439 1152(,)N
+2 f F
+1465(z)X
+7 s 7 xH F
+1496 1168(k)N
+47 f F
+1530(+)X
+1 f F
+1561(1)X
+10 s 10 xH F
+1595 1152(;)N
+2 f F
+1617(t)X
+1 f F
+1645(\))X
+47 f F
+974 1267(=)N
+1 f F
+1038(\(1)X
+47 f F
+1125(-)X
+2 f F
+1189(t)X
+1 f F
+1217(\))X
+7 s 7 xH F
+1244 1235(3)N
+10 s 10 xH 2 f F
+1278 1267(z)N
+7 s 7 xH F
+1309 1283(k)N
+10 s 10 xH 47 f F
+1360 1267(+)N
+1 f F
+1424(3)X
+2 f F
+(t)S
+1 f F
+1499(\()X
+2 f F
+1526(t)X
+47 f F
+1574(-)X
+1 f F
+1638(1\))X
+7 s 7 xH F
+1705 1235(2)N
+10 s 10 xH 2 f F
+1739 1267(z)N
+7 s 7 xH F
+1774 1282(k)N
+47 f F
+1774 1235(+)N
+10 s 10 xH F
+1308 1382(+)N
+1 f F
+1372(3)X
+2 f F
+(t)S
+7 s 7 xH 1 f F
+1443 1350(2)N
+10 s 10 xH F
+1477 1382(\(1)N
+47 f F
+1564(-)X
+2 f F
+1628(t)X
+1 f F
+1656(\))X
+2 f F
+1683(z)X
+7 s 7 xH F
+1718 1397(k)N
+47 f F
+1752(+)X
+1 f F
+1783(1)X
+47 f F
+1718 1350(-)N
+10 s 10 xH F
+1843 1382(+)N
+2 f F
+1907(t)X
+7 s 7 xH 1 f F
+1938 1350(3)N
+10 s 10 xH 2 f F
+1972 1382(z)N
+7 s 7 xH F
+2003 1398(k)N
+47 f F
+2037(+)X
+1 f F
+2068(1)X
+10 s 10 xH F
+2102 1382(,)N
+576 1574(for)N
+690(0)X
+47 f F
+750(\243)X
+2 f F
+814(t)X
+47 f F
+862(\243)X
+1 f F
+926(1.)X
+735 1670(There)N
+950(is)X
+1030(a)X
+1093(7-word)X
+1352(node)X
+1535(for)X
+1657(each)X
+1833(knot)X
+2 f F
+2003(z)X
+7 s 7 xH F
+2034 1686(k)N
+10 s 10 xH 1 f F
+2065 1670(,)N
+2113(contain-)X
+576 1766(ing)N
+706(one)X
+850(word)X
+1043(of)X
+1137(control)X
+1391(information)X
+1796(and)X
+1939(six)X
+2059(words)X
+2282(for)X
+576 1862(the)N
+2 f F
+696(x)X
+1 f F
+754(and)X
+2 f F
+892(y)X
+1 f F
+950(coordinates)X
+1342(of)X
+2 f F
+1431(z)X
+7 s 7 xH F
+1466 1877(k)N
+47 f F
+1466 1830(-)N
+10 s 10 xH 1 f F
+1525 1862(and)N
+2 f F
+1663(z)X
+7 s 7 xH F
+1694 1878(k)N
+10 s 10 xH 1 f F
+1747 1862(and)N
+2 f F
+1886(z)X
+7 s 7 xH F
+1921 1877(k)N
+47 f F
+1921 1830(+)N
+10 s 10 xH 1 f F
+1958 1862(.)N
+2001(The)X
+2149(control)X
+576 1958(information)N
+1004(appears)X
+1299(in)X
+1410(the)X
+2 f F
+1557(left_type)X
+1 f F
+1882(and)X
+2 f F
+2047(right_type)X
+1 f F
+576 2054(\256elds)N
+789(and)X
+945(they)X
+1123(specify)X
+1395(properties)X
+1757(of)X
+1865(the)X
+2004(curve)X
+2224(as)X
+2332(it)X
+576 2150(enters)N
+803(and)X
+954(leaves)X
+1190(the)X
+1322(knot.)X
+1518(There)X
+1740(is)X
+1827(also)X
+1990(a)X
+2 f F
+2060(link)X
+1 f F
+2214(\256eld,)X
+576 2246(which)N
+803(points)X
+1029(to)X
+1122(the)X
+1251(following)X
+1593(knot.)X
+1786(Before)X
+2036(the)X
+2165(Be)X
+2223(\302zier)X
+576 2342(control)N
+830(points)X
+1052(have)X
+1230(been)X
+1408(calculated,)X
+1780(the)X
+1904(memory)X
+2197(space)X
+576 2438(they)N
+741(will)X
+892(ultimately)X
+1243(occupy)X
+1502(is)X
+1582(taken)X
+1783(up)X
+1890(by)X
+1998(information)X
+576 2534(that)N
+742(can)X
+899(be)X
+1020(used)X
+1212(to)X
+1319(compute)X
+1640(them.)X
+1865(The)X
+0 f F
+2035(METAFONT)X
+2 f F
+576 2630(make_choices)N
+1 f F
+1072(procedure)X
+1439(chooses)X
+1738(angles)X
+1988(and)X
+2149(control)X
+576 2726(points)N
+798(for)X
+919(the)X
+1044(splines)X
+1293(of)X
+1387(a)X
+1450(curve)X
+1656(when)X
+1857(the)X
+1981(user)X
+2141(has)X
+2274(not)X
+576 2822(speci\256ed)N
+881(them)X
+1061(explicitly.)X
+3 f F
+735 2918(4.2.2)N
+0 f F
+955(METAFONT)X
+3 f F
+1296('s)X
+1392(path)X
+1585(transformation.)X
+1 f F
+2184(When)X
+0 f F
+576 3014(METAFONT)N
+1 f F
+952(digitizes)X
+1258(a)X
+1329(path,)X
+1522(it)X
+1601(reduces)X
+1881(the)X
+2013(problem)X
+2314(to)X
+576 3110(the)N
+705(special)X
+959(case)X
+1129(of)X
+1228(paths)X
+1429(that)X
+1581(travel)X
+1796(in)X
+1890(the)X
+2 f F
+2020(\256rst)X
+2176(octant)X
+1 f F
+576 3206(directions;)N
+938(i.e.,)X
+1080(each)X
+1252(cubic)X
+2 f F
+1449(z)X
+1 f F
+1493(\()X
+2 f F
+1520(t)X
+1 f F
+1548(\))X
+47 f F
+1595(=)X
+1 f F
+1659(\()X
+2 f F
+1686(x)X
+1 f F
+1735(\()X
+2 f F
+1762(t)X
+1 f F
+1790(\),)X
+2 f F
+1843(y)X
+1 f F
+1892(\()X
+2 f F
+1919(t)X
+1 f F
+1947(\)\))X
+2024(being)X
+2225(digi-)X
+576 3302(tized)N
+763(will)X
+918(have)X
+1101(the)X
+1230(property)X
+1534(that)X
+1686(0)X
+47 f F
+1746(\243)X
+2 f F
+1810(y)X
+47 f F
+1852(\242)X
+1 f F
+1872(\()X
+2 f F
+1899(t)X
+1 f F
+1927(\))X
+47 f F
+1974(\243)X
+2 f F
+2038(x)X
+47 f F
+2080(\242)X
+1 f F
+2100(\()X
+2 f F
+2127(t)X
+1 f F
+2155(\).)X
+2234(This)X
+576 3398(assumption)N
+969(makes)X
+1203(digitizing)X
+1538(simpler)X
+1807(and)X
+1952(faster)X
+2160(than)X
+2327(if)X
+576 3494(the)N
+716(direction)X
+1043(of)X
+1152(motion)X
+1420(has)X
+1569(to)X
+1673(be)X
+1791(tested)X
+2021(repeatedly.)X
+576 3590(When)N
+2 f F
+793(z)X
+1 f F
+837(\()X
+2 f F
+864(t)X
+1 f F
+892(\))X
+944(is)X
+1022(cubic,)X
+2 f F
+1241(x)X
+47 f F
+1283(\242)X
+1 f F
+1303(\()X
+2 f F
+1330(t)X
+1 f F
+1358(\))X
+1410(and)X
+2 f F
+1551(y)X
+47 f F
+1593(\242)X
+1 f F
+1613(\()X
+2 f F
+1640(t)X
+1 f F
+1668(\))X
+1720(are)X
+1844(quadratic,)X
+2188(hence)X
+576 3686(each)N
+760(of)X
+864(the)X
+999(four)X
+1170(polynomials,)X
+2 f F
+1622(x)X
+47 f F
+1664(\242)X
+1 f F
+1684(\()X
+2 f F
+1711(t)X
+1 f F
+1739(\),)X
+2 f F
+1823(y)X
+47 f F
+1865(\242)X
+1 f F
+1885(\()X
+2 f F
+1912(t)X
+1 f F
+1940(\),)X
+2 f F
+2024(x)X
+47 f F
+2066(\242)X
+1 f F
+2086(\()X
+2 f F
+2113(t)X
+1 f F
+2141(\))X
+47 f F
+2168(-)X
+2 f F
+2212(y)X
+47 f F
+2254(\242)X
+1 f F
+2274(\()X
+2 f F
+2301(t)X
+1 f F
+2329(\),)X
+576 3782(and)N
+2 f F
+721(x)X
+47 f F
+763(\242)X
+1 f F
+783(\()X
+2 f F
+810(t)X
+1 f F
+838(\))X
+47 f F
+865(+)X
+2 f F
+909(y)X
+47 f F
+951(\242)X
+1 f F
+971(\()X
+2 f F
+998(t)X
+1 f F
+1026(\),)X
+1102(crosses)X
+1363(through)X
+1641(0)X
+1709(at)X
+1795(most)X
+1978(twice.)X
+2200(If)X
+2282(we)X
+576 3878(subdivide)N
+925(the)X
+1061(given)X
+1277(cubic)X
+1489(at)X
+1585(these)X
+1788(places,)X
+2048(we)X
+2181(get)X
+2318(at)X
+576 3974(most)N
+760(nine)X
+927(subintervals.)X
+1363(In)X
+1459(each)X
+1636(of)X
+1731(these)X
+1924(intervals)X
+2228(each)X
+576 4070(of)N
+2 f F
+667(x)X
+47 f F
+709(\242)X
+1 f F
+729(\()X
+2 f F
+756(t)X
+1 f F
+784(\),)X
+2 f F
+855(y)X
+47 f F
+897(\242)X
+1 f F
+917(\()X
+2 f F
+944(t)X
+1 f F
+972(\),)X
+2 f F
+1043(x)X
+47 f F
+1085(\242)X
+1 f F
+1105(\()X
+2 f F
+1132(t)X
+1 f F
+1160(\))X
+47 f F
+1187(-)X
+2 f F
+1231(y)X
+47 f F
+1273(\242)X
+1 f F
+1293(\()X
+2 f F
+1320(t)X
+1 f F
+1348(\),)X
+1419(and)X
+2 f F
+1559(x)X
+47 f F
+1601(\242)X
+1 f F
+1621(\()X
+2 f F
+1648(t)X
+1 f F
+1676(\))X
+47 f F
+1703(+)X
+2 f F
+1747(y)X
+47 f F
+1789(\242)X
+1 f F
+1809(\()X
+2 f F
+1836(t)X
+1 f F
+1864(\))X
+1916(has)X
+2048(a)X
+2109(constant)X
+576 4166(sign.)N
+766(The)X
+927(curve)X
+1142(can)X
+1290(be)X
+1402(transformed)X
+1826(in)X
+1924(each)X
+2108(of)X
+2211(these)X
+576 4262(subintervals)N
+1005(so)X
+1118(that)X
+1280(it)X
+1366(travels)X
+1622(entirely)X
+1909(in)X
+2013(\256rst)X
+2180(octant)X
+576 4358(directions,)N
+933(if)X
+1003(we)X
+1118(exchange)X
+2 f F
+1443(x)X
+1 f F
+1500(and)X
+47 f F
+1636(-)X
+2 f F
+1680(x)X
+1 f F
+1716(,)X
+2 f F
+1756(y)X
+1 f F
+1812(and)X
+47 f F
+1948(-)X
+2 f F
+1992(y)X
+1 f F
+2028(,)X
+2068(and)X
+2 f F
+2204(x)X
+1 f F
+2260(and)X
+2 f F
+576 4454(y)N
+1 f F
+632(as)X
+719(necessary.)X
+3 f F
+576 4646(4.3)N
+736(Pens)X
+923(and)X
+1078(envelopes.)X
+1 f F
+1474(There)X
+1689(are)X
+1816(two)X
+1964(kinds)X
+2165(of)X
+2260(pen)X
+576 4742(heads)N
+791(that)X
+943(may)X
+1112(be)X
+1219(used,)X
+1417(polygonal)X
+1768(and)X
+1915(elliptic.)X
+2188(There)X
+576 4838(are)N
+708(a)X
+778(number)X
+1057(of)X
+1158(trade-o)X
+1386 MX
+(ff)138 606 oc
+1434(s)X
+1499(involved)X
+1813(in)X
+1909(their)X
+2090(use.)X
+2251(The)X
+576 4934(\256rst)N
+725(subsection)X
+1088(treats)X
+1287(the)X
+1410(case)X
+1573(of)X
+1664(an)X
+2 f F
+1764(n)X
+1 f F
+(-vertex)S
+2056(polygonal)X
+576 5030(pen)N
+715(shape)X
+921(and)X
+1060(the)X
+1181(second)X
+1427(treats)X
+1624(the)X
+1745(case)X
+1907(of)X
+1997(an)X
+2096(elliptical)X
+576 5126(pen)N
+717(shape.)X
+945(Both)X
+1125(describe)X
+1418(the)X
+1540(in\257uence)X
+1858(of)X
+1949(pen)X
+2089(shape)X
+2296(on)X
+576 5222(the)N
+694(envelope)X
+1004(of)X
+1091(the)X
+1209(font.)X
+3 f F
+735 5318(4.3.1)N
+955(Polygonal)X
+1322(pens.)X
+1 f F
+1547(Suppose)X
+1848(that)X
+1998(the)X
+2126(vertices)X
+576 5414(of)N
+672(a)X
+737(polygon)X
+1028(are)X
+2 f F
+1156(w)X
+7 s 7 xH 1 f F
+1218 5430(0)N
+10 s 10 xH F
+1252 5414(,)N
+2 f F
+1298(w)X
+7 s 7 xH 1 f F
+1360 5430(1)N
+10 s 10 xH F
+1394 5414(,)N
+1434(.)X
+1474(.)X
+1514(.)X
+1554(,)X
+2 f F
+1607(w)X
+7 s 7 xH F
+1660 5430(n)N
+47 f F
+1697(-)X
+1 f F
+1728(1)X
+10 s 10 xH F
+1762 5414(,)N
+2 f F
+1808(w)X
+7 s 7 xH F
+1861 5430(n)N
+10 s 10 xH 47 f F
+1915 5414(=)N
+2 f F
+1979(w)X
+7 s 7 xH 1 f F
+2041 5430(0)N
+10 s 10 xH F
+2103 5414(in)N
+2193(coun-)X
+576 5510(terclockwise)N
+1006(order.)X
+1221(A)X
+1304(convexity)X
+1645(condition)X
+1972(requires)X
+2256(that)X
+576 5606(each)N
+757(vertex)X
+991(turns)X
+1184(left)X
+1324(when)X
+1531(one)X
+1680(proceeds)X
+1998(from)X
+2 f F
+2186(w)X
+7 s 7 xH 1 f F
+2248 5622(0)N
+10 s 10 xH F
+2314 5606(to)N
+2 f F
+576 5702(w)N
+7 s 7 xH 1 f F
+638 5718(1)N
+10 s 10 xH F
+718 5678(.)N
+758(.)X
+798(.)X
+864 5702(to)N
+2 f F
+953(w)X
+7 s 7 xH F
+1006 5718(n)N
+10 s 10 xH 1 f F
+1040 5702(.)N
+1087(The)X
+1239(envelope)X
+1556(is)X
+1636(obtained)X
+1939(if)X
+2015(we)X
+2136(o)X
+(ff)138 606 oc
+2224(set)X
+2340(a)X
+2520 672(given)N
+2721(curve)X
+2 f F
+2923(z)X
+1 f F
+2967(\()X
+2 f F
+2994(t)X
+1 f F
+3022(\))X
+3071(by)X
+2 f F
+3173(w)X
+7 s 7 xH F
+3226 688(k)N
+10 s 10 xH 1 f F
+3279 672(when)N
+3475(that)X
+3617(curve)X
+3818(is)X
+3893(traveling)X
+4200(in)X
+4284(a)X
+2520 768(direction)N
+2 f F
+2846(z)X
+47 f F
+2883(\242)X
+1 f F
+2903(\()X
+2 f F
+2930(t)X
+1 f F
+2958(\))X
+3026(lying)X
+3232(between)X
+3542(the)X
+3682(directions)X
+2 f F
+4040(w)X
+7 s 7 xH F
+4093 784(k)N
+10 s 10 xH 47 f F
+4124 768(-)N
+2 f F
+4168(w)X
+7 s 7 xH F
+4221 784(k)N
+47 f F
+4255(-)X
+1 f F
+4286(1)X
+10 s 10 xH F
+2520 864(and)N
+2 f F
+2662(w)X
+7 s 7 xH F
+2715 880(k)N
+47 f F
+2749(+)X
+1 f F
+2780(1)X
+10 s 10 xH 47 f F
+2814 864(-)N
+2 f F
+2858(w)X
+7 s 7 xH F
+2911 880(k)N
+10 s 10 xH 1 f F
+2942 864(.)N
+2988(At)X
+3094(times)X
+2 f F
+3293(t)X
+1 f F
+3341(when)X
+3541(the)X
+3665(curve)X
+3870(direction)X
+2 f F
+4181(z)X
+47 f F
+4218(\242)X
+1 f F
+4238(\()X
+2 f F
+4265(t)X
+1 f F
+4293(\))X
+2520 960(increases)N
+2854(past)X
+2 f F
+3022(w)X
+7 s 7 xH F
+3075 976(k)N
+47 f F
+3109(+)X
+1 f F
+3140(1)X
+10 s 10 xH 47 f F
+3174 960(-)N
+2 f F
+3218(w)X
+7 s 7 xH F
+3271 976(k)N
+10 s 10 xH 1 f F
+3302 960(,)N
+0 f F
+3361(METAFONT)X
+1 f F
+3742(temporarily)X
+4156(stops)X
+2520 1056(plotting)N
+2793(the)X
+2916(o)X
+(ff)138 606 oc
+3004(set)X
+3118(curve)X
+3322(and)X
+3463(inserts)X
+3696(a)X
+3756(straight)X
+4020(line)X
+4164(from)X
+2 f F
+2520 1152(z)N
+1 f F
+2564(\()X
+2 f F
+2591(t)X
+1 f F
+2619(\))X
+47 f F
+2646(+)X
+2 f F
+2690(w)X
+7 s 7 xH F
+2743 1168(k)N
+10 s 10 xH 1 f F
+2811 1152(to)N
+2 f F
+2910(z)X
+1 f F
+2954(\()X
+2 f F
+2981(t)X
+1 f F
+3009(\))X
+47 f F
+3036(+)X
+2 f F
+3080(w)X
+7 s 7 xH F
+3133 1168(k)N
+47 f F
+3167(+)X
+1 f F
+3198(1)X
+10 s 10 xH F
+3232 1152(;)N
+3291(notice)X
+3524(that)X
+3681(this)X
+3833(straight)X
+4110(line)X
+4267(is)X
+2520 1248(tangent)N
+2789(to)X
+2884(the)X
+3015(o)X
+(ff)138 606 oc
+3103(set)X
+3225(curve.)X
+3456(Similarly,)X
+3805(when)X
+4011(the)X
+4141(curve)X
+2520 1344(direction)N
+2825(decreases)X
+3154(past)X
+2 f F
+3303(w)X
+7 s 7 xH F
+3356 1360(k)N
+10 s 10 xH 47 f F
+3387 1344(-)N
+2 f F
+3431(w)X
+7 s 7 xH F
+3484 1360(k)N
+47 f F
+3518(-)X
+1 f F
+3549(1)X
+10 s 10 xH F
+3583 1344(,)N
+0 f F
+3623(METAFONT)X
+1 f F
+3984(stops)X
+4169(plot-)X
+2520 1440(ting)N
+2705(and)X
+2882(inserts)X
+3152(a)X
+3248(straight)X
+3548(line)X
+3728(from)X
+2 f F
+3944(z)X
+1 f F
+3988(\()X
+2 f F
+4015(t)X
+1 f F
+4043(\))X
+47 f F
+4070(+)X
+2 f F
+4114(w)X
+7 s 7 xH F
+4167 1456(k)N
+10 s 10 xH 1 f F
+4258 1440(to)N
+2 f F
+2520 1536(z)N
+1 f F
+2564(\()X
+2 f F
+2591(t)X
+1 f F
+2619(\))X
+47 f F
+2646(+)X
+2 f F
+2690(w)X
+7 s 7 xH F
+2743 1552(k)N
+47 f F
+2777(-)X
+1 f F
+2808(1)X
+10 s 10 xH F
+2842 1536(;)N
+2895(the)X
+3024(latter)X
+3220(line)X
+3371(is)X
+3455(actually)X
+3740(a)X
+3808(retrograde)X
+4171(step,)X
+2520 1632(which)N
+2761(will)X
+2929(not)X
+3075(be)X
+3195(part)X
+3364(of)X
+3475(the)X
+3617(\256nal)X
+3803(envelope)X
+4137(under)X
+0 f F
+2520 1728(METAFONT)N
+1 f F
+2861('s)X
+2946(assumptions.)X
+3388(The)X
+3541(result)X
+3747(of)X
+3842(this)X
+3985(considera-)X
+2520 1824(tion)N
+2684(is)X
+2777(a)X
+2853(continuous)X
+3243(path)X
+3420(that)X
+3579(consists)X
+3871(of)X
+3977(alternating)X
+2520 1920(curves)N
+2769(and)X
+2924(straight)X
+3203(line)X
+3362(segments.)X
+3719(The)X
+3883(segments)X
+4221(are)X
+2520 2016(usually)N
+2785(so)X
+2890(short,)X
+3104(in)X
+3200(practice,)X
+3509(that)X
+3663(they)X
+3835(blend)X
+4047(with)X
+4222(the)X
+2520 2112(curves.)N
+3 f F
+2679 2208(4.3.2)N
+2899(Elliptical)X
+3243(pens.)X
+1 f F
+3472(To)X
+3595(get)X
+3727(the)X
+3859(envelope)X
+4183(of)X
+4284(a)X
+2520 2304(cyclic)N
+2737(path)X
+2900(with)X
+3067(respect)X
+3319(to)X
+3405(an)X
+3505(ellipse,)X
+0 f F
+3758(METAFONT)X
+1 f F
+4123(calcu-)X
+2520 2400(lates)N
+2692(the)X
+2815(envelope)X
+3130(with)X
+3298(respect)X
+3552(to)X
+3640(a)X
+3702(polygonal)X
+4048(approxi-)X
+2520 2496(mation)N
+2779(to)X
+2878(the)X
+3012(ellipse.)X
+3277(This)X
+3455(has)X
+3598(two)X
+3754(important)X
+4101(advan-)X
+2520 2592(tages)N
+2705(over)X
+2868(trying)X
+3079(to)X
+3161(obtain)X
+3381(the)X
+3499(exact)X
+3689(envelope:)X
+2583 2736(1.)N
+2679(Polygonal)X
+3041(envelopes)X
+3400(give)X
+3576(better)X
+3797(results,)X
+4065(because)X
+2679 2832(the)N
+2801(polygon)X
+3087(has)X
+3218(been)X
+3394(designed)X
+3703(to)X
+3788(counteract)X
+4146(prob-)X
+2679 2928(lems)N
+2882(that)X
+3054(arise)X
+3259(from)X
+3468(digitization;)X
+3907(the)X
+4058(polygon)X
+2679 3024(includes)N
+2980(sub-pixel)X
+3312(corrections)X
+3703(to)X
+3799(an)X
+3908(exact)X
+4111(ellipse)X
+2679 3120(that)N
+2839(make)X
+3053(the)X
+3191(results)X
+3441(essentially)X
+3820(independent)X
+4253(of)X
+2679 3216(where)N
+2896(the)X
+3014(path)X
+3172(falls)X
+3330(on)X
+3430(the)X
+3548(raster.)X
+2583 3360(2.)N
+2679(Polygonal)X
+3046(envelopes)X
+3410(of)X
+3520(cubic)X
+3737(splines)X
+4003(are)X
+4146(cubic)X
+2679 3456(splines.)N
+2967(Hence)X
+3218(it)X
+3307(is)X
+3405(not)X
+3552(necessary)X
+3910(to)X
+4017(introduce)X
+2679 3552(completely)N
+3074(di)X
+3136 MX
+(ff)138 606 oc
+3184(erent)X
+3385(routines.)X
+3703(By)X
+3836(contrast,)X
+4150(exact)X
+2679 3648(envelopes)N
+3027(of)X
+3121(cubic)X
+3322(splines)X
+3570(with)X
+3738(respect)X
+3992(to)X
+4080(ellipses)X
+2679 3744(are)N
+2804(complicated)X
+3222(curves,)X
+3478(more)X
+3669(di)X
+3731 MX
+(Fi)139 825 oc
+(cult)S
+3943(to)X
+4031(plot)X
+4182(than)X
+2679 3840(cubics.)N
+3 f F
+2520 4032(4.4)N
+2680(Taking)X
+2948(out)X
+3084(data.)X
+1 f F
+3300(After)X
+0 f F
+3495(METAFONT)X
+1 f F
+3861(has)X
+3994(calculated)X
+2520 4128(the)N
+2639(paths)X
+2828(and)X
+2964(the)X
+3082(o)X
+(ff)138 606 oc
+3170(sets,)X
+3330(it)X
+3394(is)X
+3467(ready)X
+3666(to)X
+3748(send)X
+3915(the)X
+4033(values)X
+4258(to)X
+2520 4224(the)N
+2 f F
+2661(make_moves)X
+1 f F
+3116(procedure)X
+3482(which)X
+3722(generates)X
+4070(discrete)X
+2520 4320(moves)N
+2751(for)X
+2867(any)X
+3004(four)X
+3159(points)X
+3375(that)X
+3516(represent)X
+3832(a)X
+3889(Be)X
+3947(\302zier)X
+4121(curve.)X
+2520 4416(This)N
+2702(is)X
+2796(done)X
+2993(for)X
+3128(each)X
+3317(one)X
+3474(of)X
+3582(the)X
+3721(cyclic)X
+3954(paths)X
+4164(from)X
+2520 4512(which)N
+2740(the)X
+2861(letter)X
+3049(is)X
+3125(built.)X
+3334(When)X
+3549(the)X
+3670(o)X
+(ff)138 606 oc
+3758(sets)X
+3901(are)X
+4023(zero,)X
+4205(this)X
+2520 4608(is)N
+2611(done)X
+2805(by)X
+2923(the)X
+2 f F
+3059(\256ll_spec)X
+1 f F
+3364(procedure.)X
+3744(Otherwise)X
+4113(this)X
+4267(is)X
+2520 4704(done)N
+2705(by)X
+2813(the)X
+2 f F
+2939(\256ll_envelope)X
+1 f F
+3377(procedure.)X
+3747(In)X
+3842(the)X
+3968(latter)X
+4161(case,)X
+2520 4800(the)N
+2641(line)X
+2784(segments,)X
+3125(which)X
+3345(were)X
+3526(discussed)X
+3857(earlier,)X
+4107(should)X
+2520 4896(be)N
+2631(taken)X
+2840(out)X
+2977(also)X
+3140(in)X
+3236(order)X
+3440(to)X
+3536(get)X
+3668(smooth)X
+3937(connections)X
+2520 4992(between)N
+2810(the)X
+2931(di)X
+2993 MX
+(ff)138 606 oc
+3041(erent)X
+3225(curves)X
+3458(that)X
+3601(the)X
+3722(cyclic)X
+3937(path)X
+4098(is)X
+4174(built)X
+2520 5088(from.)N
+2764(Because)X
+3080(P)X
+8 s 8 xH F
+3124(OST)X
+10 s 10 xH F
+3245(S)X
+8 s 8 xH F
+3289(CRIPT)X
+10 s 10 xH F
+3519(describes)X
+3865(any)X
+4028(shape)X
+4258(in)X
+2520 5184(terms)N
+2741(of)X
+2851(curves)X
+3104(and)X
+3263(lines,)X
+3477(this)X
+3635(is)X
+3731(the)X
+3872(point)X
+4080(to)X
+4186(take)X
+2520 5280(advantage)N
+2909(of)X
+0 f F
+3039(METAFONT)X
+1 f F
+3380('s)X
+3501(calculations,)X
+3966(i.e.,)X
+4146(when)X
+0 f F
+2520 5376(METAFONT)N
+1 f F
+2892(calls)X
+3071(the)X
+2 f F
+3201(make_moves)X
+1 f F
+3644(procedure)X
+3998(and)X
+4146(when)X
+0 f F
+2520 5472(METAFONT)N
+1 f F
+2881(draws)X
+3093(line)X
+3233(segments)X
+3551(for)X
+3665(o)X
+(ff)138 606 oc
+3753(set)X
+3862(corrections.)X
+3 f F
+2520 5664(4.5)N
+2680(Processing)X
+3074(the)X
+3210(data.)X
+1 f F
+3430(The)X
+3584(generated)X
+3926(data)X
+4089(are)X
+4218(not)X
+2465 6084(8)N
+
+%%Page: 8 9
+8 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+1 f F
+576 672(ready)N
+796(yet)X
+935(to)X
+1037(be)X
+1153(used.)X
+1360(First,)X
+1566(we)X
+1700(should)X
+1953(unskew,)X
+2258(i.e.,)X
+576 768(transform)N
+914(from)X
+1096(the)X
+1220(\256rst)X
+1370(octant)X
+1592(back)X
+1770(to)X
+1858(the)X
+1982(original,)X
+2278(the)X
+576 864(paths)N
+775(according)X
+1121(to)X
+1212(the)X
+1339(octant)X
+1564(that)X
+1713(the)X
+1840(paths)X
+2038(were)X
+2224(trav-)X
+576 960(eled)N
+747(in)X
+846(before)X
+1089(they)X
+1264(were)X
+1459(skewed.)X
+1758(This)X
+1938(unskewing)X
+2323(is)X
+576 1056(done)N
+766(by)X
+880(taking)X
+1114(out)X
+1250(the)X
+1382(octant)X
+1612(number)X
+1891(at)X
+1983(the)X
+2114(moment)X
+576 1152(that)N
+718(the)X
+2 f F
+838(make_moves)X
+1 f F
+1271(procedure)X
+1615(is)X
+1690(called)X
+1904(and)X
+2042(then)X
+2203(using)X
+0 f F
+576 1248(METAFONT)N
+1 f F
+917('s)X
+2 f F
+1007(unskew)X
+1 f F
+1275(procedure)X
+1629(that)X
+1780(sets)X
+1931(values)X
+2 f F
+2167(x)X
+47 f F
+2209(\242)X
+1 f F
+2260(and)X
+2 f F
+576 1344(y)N
+47 f F
+618(\242)X
+1 f F
+662(to)X
+748(the)X
+870(original)X
+1143(coordinate)X
+1506(values)X
+1735(of)X
+1827(a)X
+1888(point,)X
+2097(given)X
+2300(an)X
+576 1440(octant)N
+800(code)X
+980(and)X
+1123(coordinates)X
+1520(\()X
+2 f F
+1547(x)X
+1 f F
+1583(,)X
+2 f F
+1609(y)X
+1 f F
+1651(\))X
+1705(after)X
+1880(they)X
+2045(have)X
+2224(been)X
+576 1536(mapped)N
+850(into)X
+995(the)X
+1114(\256rst)X
+1259(octant)X
+1476(and)X
+1613(skewed;)X
+1897(the)X
+2016(new)X
+2171(values)X
+576 1632(are)N
+701(sent)X
+855(to)X
+942(the)X
+2 f F
+1065(send_p_s)X
+1 f F
+1388(procedure.)X
+1755(This)X
+1922(procedure)X
+2269(has)X
+576 1728(eight)N
+761(formal)X
+1000(parameters)X
+1378(that)X
+1523(are)X
+1648(all)X
+1754(used)X
+1927(when)X
+2127(sending)X
+576 1824(a)N
+637(curve.)X
+861(When)X
+1078(sending)X
+1352(a)X
+1412(line,)X
+1576(only)X
+1742(four)X
+1900(parameters)X
+2277(are)X
+576 1920(used,)N
+763(two)X
+903(to)X
+985(denote)X
+1219(the)X
+1338(start)X
+1497(point)X
+1682(and)X
+1819(two)X
+1960(to)X
+2043(denote)X
+2278(the)X
+576 2016(end)N
+729(point;)X
+952(the)X
+1087(remaining)X
+1449(four)X
+1620(parameters)X
+2009(are)X
+2144(sent)X
+2309(as)X
+576 2112(zeros)N
+778(so)X
+2 f F
+881(send_p_s)X
+1 f F
+1211(can)X
+1355(distinguish)X
+1737(whether)X
+2029(a)X
+2098(line)X
+2251(was)X
+576 2208(sent)N
+728(or)X
+818(a)X
+877(curve.)X
+1119(In)X
+1209(the)X
+1330(next)X
+1491(step,)X
+2 f F
+1663(send_p_s)X
+1 f F
+1984(unscales)X
+2278(the)X
+576 2304(numbers)N
+875(because)X
+0 f F
+1154(METAFONT)X
+1 f F
+1519(works)X
+1739(with)X
+1905(units)X
+2084(of)X
+2175(scaled)X
+576 2400(points,)N
+832(of)X
+940(which)X
+1177(there)X
+1379(are)X
+1519(2)X
+7 s 7 xH F
+2368(16)Y
+10 s 10 xH F
+1662 2400(in)N
+1764(an)X
+1880(ordinary)X
+2192(point.)X
+576 2496(While)N
+796(unscaling,)X
+1147(the)X
+1269(values)X
+1498(are)X
+1621(transformed)X
+2033(in)X
+2119(order)X
+2314(to)X
+576 2592(send)N
+762(them)X
+961(to)X
+1062(the)X
+1199(P)X
+8 s 8 xH F
+1243(OST)X
+10 s 10 xH F
+1364(S)X
+8 s 8 xH F
+1408(CRIPT)X
+10 s 10 xH F
+1629(dictionary)X
+5 f F
+1992(FontBBox)X
+1 f F
+576 2688(command.)N
+932(After)X
+1122(this)X
+1257(pre-processing,)X
+1770(the)X
+1889(data)X
+2044(are)X
+2164(sent)X
+2314(to)X
+576 2784(a)N
+632(temporary)X
+982(\256le.)X
+3 f F
+735 2880(4.5.1)N
+955(Getting)X
+1244(more)X
+1454(information.)X
+1 f F
+1934(When)X
+0 f F
+2158(META-)X
+576 2976(FONT)N
+1 f F
+765(calls)X
+936(the)X
+2 f F
+1058(make_moves)X
+1 f F
+1493(procedure,)X
+1859(it)X
+1927(does)X
+2098(not)X
+2224(have)X
+576 3072(any)N
+725(information)X
+1136(on)X
+1249(the)X
+1380(role)X
+1538(that)X
+1691(this)X
+1839(path)X
+2011(is)X
+2098(going)X
+2314(to)X
+576 3168(play,)N
+774(whether)X
+1073(the)X
+1211(current)X
+1478(cyclic)X
+1709(path)X
+1886(is)X
+1978(going)X
+2199(to)X
+2300(be)X
+2 f F
+576 3264(\256lled)N
+1 f F
+759(or)X
+849(whether)X
+1131(it)X
+1198(will)X
+1345(act)X
+1462(as)X
+1552(a)X
+1611(boundary)X
+1937(of)X
+2027(a)X
+2086(region)X
+2314(to)X
+576 3360(be)N
+2 f F
+672(erased)X
+1 f F
+886(.)X
+735 3456(In)N
+840(order)X
+1048(to)X
+1149(distinguish)X
+1538(between)X
+1845(the)X
+1982(cases,)X
+2211(more)X
+576 3552(information)N
+987(has)X
+1127(to)X
+1222(be)X
+1331(taken.)X
+1558(This)X
+1733(is)X
+1818(done)X
+2006(by)X
+2118(copying)X
+576 3648(the)N
+5 f F
+760(plain.mf)X
+1 f F
+1230(\256le)X
+1418(into)X
+1629(a)X
+1752(new)X
+1973(\256le)X
+2162(named)X
+5 f F
+576 3744(myplain.mf)N
+1 f F
+1086(and)X
+1231(adding)X
+1478(a)X
+1543(few)X
+1693(lines)X
+1873(to)X
+1964(it.)X
+2057(The)X
+2211(addi-)X
+576 3840(tional)N
+783(code)X
+961(was)X
+1112(added)X
+1330(in)X
+1418(order)X
+1614(to)X
+1702(identify)X
+0 f F
+1977(METAFONT)X
+1 f F
+2318('s)X
+576 3936(use)N
+704(of)X
+791(the)X
+909(macros.)X
+0 f F
+1181(METAFONT)X
+1 f F
+1542(uses)X
+1700(the)X
+1818(variables)X
+2128(for)X
+2242(date)X
+576 4032(only)N
+764(once,)X
+982(when)X
+1202(the)X
+1346(program)X
+1664(is)X
+1763(started,)X
+2043(so)X
+2160(it)X
+2251(was)X
+576 4128(decided)N
+861(to)X
+958(use)X
+1100(them)X
+1294(in)X
+1390(the)X
+1522(rest)X
+1672(of)X
+1773(the)X
+1905(program.)X
+2251(The)X
+5 f F
+576 4224(year)N
+1 f F
+862(is)X
+1009(changed)X
+1372(to)X
+47 f F
+1529(-)X
+1 f F
+1573(1)X
+1708(when)X
+0 f F
+1977(METAFONT)X
+1 f F
+2318('s)X
+5 f F
+576 4320(pen_stroke)N
+1 f F
+1077(macro)X
+1299(is)X
+1373(applied)X
+1630(on)X
+1730(a)X
+1786(cyclic)X
+1998(path,)X
+2176(i.e.,)X
+2314(in)X
+576 4416(the)N
+709(characters)X
+1071(such)X
+1253(as)X
+1355(\252o\272,)X
+1522(\252O\272,)X
+1707(and)X
+1858(\252Q\272,)X
+2043(and)X
+2194(to)X
+47 f F
+2292(-)X
+1 f F
+2336(2)X
+576 4512(when)N
+801(the)X
+5 f F
+950(erase)X
+1 f F
+1241(macro)X
+1493(is)X
+1596(called.)X
+1858(The)X
+5 f F
+2033(month)X
+1 f F
+2323(is)X
+576 4608(changed)N
+883(when)X
+1096(the)X
+5 f F
+1233(fill)X
+1 f F
+1464(macro)X
+1704(is)X
+1797(called.)X
+2049(There)X
+2277(are)X
+576 4704(three)N
+757(kinds)X
+950(of)X
+1037(paths:)X
+639 4848(1.)N
+735(paths)X
+941(to)X
+1040(be)X
+2 f F
+1153(\256lled)X
+1 f F
+1351(are)X
+1488(processed)X
+1843(using)X
+2054(the)X
+2190(P)X
+8 s 8 xH F
+2234(OST-)X
+10 s 10 xH F
+735 4944(S)N
+8 s 8 xH F
+779(CRIPT)X
+10 s 10 xH 5 f F
+981(fill)X
+1 f F
+1193(command.)X
+639 5088(2.)N
+735(paths)X
+932(to)X
+1022(be)X
+2 f F
+1126(stroked)X
+1 f F
+1390(are)X
+1517(processed)X
+1862(using)X
+2063(the)X
+2190(P)X
+8 s 8 xH F
+2234(OST-)X
+10 s 10 xH F
+735 5184(S)N
+8 s 8 xH F
+779(CRIPT)X
+10 s 10 xH 5 f F
+981(eofill)X
+1 f F
+1289(command.)X
+639 5328(3.)N
+735(paths)X
+928(to)X
+1015(be)X
+2 f F
+1116(erased)X
+1 f F
+1355(are)X
+1479(processed)X
+1821(using)X
+2019(specialized)X
+735 5424(procedures)N
+1108(which)X
+1324(will)X
+1468(be)X
+1564(discussed)X
+1891(later.)X
+735 5568(A)N
+826(letter)X
+1024(cannot)X
+1271(always)X
+1527(be)X
+1636(treated)X
+1888(as)X
+1988(one)X
+2138(unit)X
+2296(by)X
+576 5664(means)N
+832(of)X
+950(the)X
+5 f F
+1099(fill)X
+1 f F
+1342(and)X
+5 f F
+1509(eofill)X
+1 f F
+1848(commands.)X
+2265(For)X
+2520 672(instance,)N
+2833(the)X
+2962(letter)X
+3158(\252Q\272)X
+3319(is)X
+3403(built)X
+3580(of)X
+3678(two)X
+3829(di)X
+3891 MX
+(ff)138 606 oc
+3939(erent)X
+4131(paths,)X
+2520 768(the)N
+2643(\256rst)X
+2792(of)X
+2884(which)X
+3105(is)X
+3183(stroked)X
+3444(and)X
+3585(the)X
+3708(second)X
+3956(of)X
+4047(which)X
+4267(is)X
+2520 864(\256lled.)N
+2759(Generating)X
+3171(the)X
+3325(letter)X
+3546(using)X
+3775(the)X
+3929(P)X
+8 s 8 xH F
+3973(OST)X
+10 s 10 xH F
+4094(S)X
+8 s 8 xH F
+4138(CRIPT)X
+10 s 10 xH 5 f F
+2520 960(eofill)N
+1 f F
+2830(command)X
+3168(causes)X
+3400(a)X
+3458(hole)X
+3617(in)X
+3700(the)X
+3819(image)X
+4036(\(see)X
+4187(Fig-)X
+2520 1056(ure)N
+2643(4\).)X
+3140 1152 MXY
+560
+560
+0.00
+0.00
+70.00
+70.00
+startFig
+%! Simon font
+%%%BoundingBox: 0 0 70 70
+%%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+%% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_letter_Q
+(
+newpath
+%%new path
+ 458 668 M
+ -38 0 -74 -18 -102 -44 c
+ -8 -8 -14 -18 -22 -26 c
+ -34 -52 -44 -114 -44 -176 c
+ 2 0 l
+ 0 -60 10 -122 44 -172 c
+ 8 -10 14 -18 22 -24 c
+ 28 -28 62 -46 102 -46 c
+ 0 2 l
+ 40 0 74 18 102 46 c
+ 8 6 14 14 22 24 c
+ 34 50 44 112 44 172 c
+ -2 0 l
+ 0 62 -10 124 -44 176 c
+ -8 8 -14 18 -22 26 c
+ -28 26 -64 44 -102 44 c
+closepath
+%%end path
+%%new path
+ 458 686 M
+ -60 0 -118 -26 -162 -68 c
+ -2 -4 -6 -6 -8 -10 c
+ -46 -50 -70 -118 -70 -186 c
+ 2 0 l
+ 0 -68 24 -134 70 -184 c
+ 2 -2 4 -4 8 -6 c
+ 42 -44 100 -68 162 -68 c
+ 0 2 l
+ 62 0 120 24 162 68 c
+ 4 2 6 4 8 6 c
+ 46 50 70 116 70 184 c
+ -2 0 l
+ 0 68 -24 136 -70 186 c
+ -2 4 -6 6 -8 10 c
+ -44 42 -102 68 -162 68 c
+closepath
+%%end path
+%%new path
+ 466 178 M
+ -2 2 l
+ -4 0 l
+ -6 0 -12 2 -16 4 c
+ 0 -2 l
+ 2 0 l
+ -6 2 -14 8 -18 12 c
+ -2 0 l
+ 6 -4 l
+ 0 0 l
+ -2 2 l
+ -6 6 -10 12 -12 20 c
+ 2 -4 l
+ -2 2 l
+ -2 4 -2 10 -2 16 c
+ 2 0 l
+ -2 2 l
+ 2 -2 l
+ -2 -6 l
+ 2 4 l
+ 0 6 0 12 2 18 c
+ 0 -2 l
+ -2 -2 l
+ 2 0 l
+ 2 8 6 16 12 22 c
+ 0 -2 l
+ -8 -4 l
+ 2 0 l
+ 2 2 l
+ 2 0 l
+ 4 6 12 10 18 12 c
+ -4 -2 l
+ 2 2 l
+ 4 2 10 2 16 2 c
+ -2 -2 l
+ 4 2 l
+ 2 2 l
+ -8 -4 l
+ -6 4 l
+ 4 -2 l
+ 2 -2 l
+ 2 0 l
+ 8 0 16 -2 22 -4 c
+ -2 2 l
+ -2 0 l
+ 10 -4 16 -8 22 -14 c
+ 0 2 l
+ 2 -2 l
+ -6 4 l
+ 0 0 l
+ 2 0 l
+ 8 -10 16 -24 20 -38 c
+ 0 2 l
+ -2 2 l
+ 2 0 l
+ 12 -38 14 -84 26 -122 c
+ -2 2 l
+ 2 -4 l
+ 6 -14 12 -28 22 -38 c
+ -2 2 l
+ 4 -4 l
+ 6 -6 14 -10 22 -14 c
+ 0 2 l
+ 2 -2 l
+ 2 0 l
+ 6 -2 14 -4 22 -4 c
+ 2 0 l
+ 0 2 l
+ 8 0 14 2 20 4 c
+ 0 -2 l
+ 2 2 l
+ 2 0 l
+ 8 4 16 8 24 16 c
+ -2 -2 l
+ 4 4 l
+ 10 10 18 26 24 42 c
+ 0 2 l
+ 2 2 l
+ 6 20 10 46 10 70 c
+ -2 4 l
+ -2 2 l
+ -4 2 l
+ -2 0 l
+ 0 -2 l
+ -2 0 l
+ 2 2 l
+ -4 -2 l
+ -2 -2 l
+ -2 -4 l
+ 0 -8 -2 -16 -4 -22 c
+ 2 0 l
+ 0 2 l
+ -4 -10 -10 -20 -18 -28 c
+ 0 0 l
+ 8 4 l
+ -4 0 l
+ -2 -2 l
+ -8 -8 -18 -14 -28 -18 c
+ 0 2 l
+ 2 0 l
+ -6 -2 -14 -4 -22 -4 c
+ -2 0 l
+ -4 -4 l
+ 8 4 l
+ 6 -4 l
+ -2 4 l
+ -4 0 l
+ 0 2 l
+ -8 0 -14 0 -20 2 c
+ 4 -2 l
+ -2 2 l
+ -10 4 -16 8 -24 14 c
+ -2 0 l
+ 6 -4 l
+ 2 -2 l
+ -2 2 l
+ 0 2 l
+ -34 34 -42 100 -74 134 c
+ 0 -2 l
+ -2 4 l
+ -2 0 l
+ -6 8 -14 12 -24 16 c
+ 2 -2 l
+ -4 2 l
+ -6 2 -14 4 -20 4 c
+ -2 0 l
+ 0 -2 l
+ -6 0 -12 0 -16 -2 c
+ -2 0 l
+ -2 -2 l
+ -6 -2 -14 -6 -18 -12 c
+ 0 2 l
+ -2 -4 l
+ -2 0 l
+ -6 -6 -10 -14 -12 -22 c
+ 0 -2 l
+ -2 0 l
+ -2 -6 -2 -12 -2 -18 c
+ 2 2 l
+ 0 -4 l
+ 0 -6 0 -12 2 -16 c
+ 0 -2 l
+ 2 -2 l
+ 2 -8 6 -14 12 -20 c
+ 2 -2 l
+ 2 0 l
+ 4 -4 12 -10 18 -12 c
+ 0 2 l
+ 2 -2 l
+ 2 0 l
+ 4 -2 10 -4 16 -4 c
+ -2 2 l
+ 6 0 l
+ 2 4 l
+ 2 2 l
+ 0 2 l
+ -2 4 l
+closepath
+%%end path
+eofill
+) def
+
+end % of CharDefs dictionary
+
+Encoding 81 /The_letter_Q put
+Encoding 89 /The_letter_Y put
+
+Metrics
+ begin
+/The_letter_Q 527 fudge add def
+/The_letter_Y 525 fudge add def
+/.notdef 400 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /M {moveto} def
+ /L {lineto} def
+ /l {rlineto} def
+ /C {curveto} def
+ /c {rcurveto} def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -178 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [178 fudge sub 40 704 688] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 70 scalefont setfont
+ 0 0 moveto (Q) show
+endFig
+3285 1856(Figure)N
+3514(4)X
+2520 2016(So)N
+2632(while)X
+2838(generating)X
+3205(a)X
+3269(letter,)X
+3482(\256ll)X
+3599(mode)X
+3806(can)X
+3947(be)X
+4052(changed)X
+2520 2112(for)N
+2660(each)X
+2854(cyclic)X
+3092(path.)X
+3296(Moreover,)X
+3679(when)X
+3899(generating)X
+4284(a)X
+2520 2208(letter)N
+2707(whose)X
+2934(paths)X
+3126(should)X
+3362(be)X
+3461(\256lled,)X
+3668(it)X
+3735(is)X
+3811(not)X
+3936(always)X
+4182(pos-)X
+2520 2304(sible)N
+2691(to)X
+2773(use)X
+2900(just)X
+3035(one)X
+5 f F
+3171(fill)X
+1 f F
+3383(command)X
+3719(\(see)X
+3869(Figure)X
+4098(5\).)X
+3140 2400 MXY
+560
+560
+0.00
+0.00
+70.00
+70.00
+startFig
+%! Simon font
+%%%BoundingBox: 0 0 70 70
+%%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+%% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_letter_Y
+(
+gsave
+initclip
+newpath
+0 0 M
+0 1000 L
+1000 1000 L
+1000 0 L
+0 0 L
+%%new path
+ 180 670 0.5 add M
+ 28 -2 0.5 add 58 -2 0.5 add 88 -2 0.5 add c
+ 0 2 0.5 add l
+ 38 0 0.5 add 74 0 0.5 add 110 2 0.5 add c
+ -2 -2 0.5 add l
+-198 0 l
+closepath
+%%end path
+%%erase
+%%new path
+ 550 670 0.5 add M
+ 28 -2 0.5 add 56 -2 0.5 add 84 -2 0.5 add c
+ 0 2 0.5 add l
+ 24 0 0.5 add 46 0 0.5 add 68 2 0.5 add c
+ -2 -2 0.5 add l
+-152 0 l
+closepath
+%%end path
+%%erase
+%%new path
+ 334 180 0.5 sub M
+ 208 0 0.5 sub l
+ -34 2 0.5 sub -70 2 0.5 sub -104 2 0.5 sub c
+ 0 -2 0.5 sub l
+-106 0 l
+closepath
+%%end path
+%%erase
+eoclip
+newpath
+%%new path
+ 462 406 M
+ 54 86 106 172 160 258 c
+ 0 2 2 2 2 4 c
+ 4 2 8 4 12 4 c
+ 8 0 l
+ 0 -2 l
+ 0 0 2 0 2 -2 c
+ 2 0 2 -2 2 -4 c
+ -2 0 l
+ 0 -2 l
+ -60 -96 -118 -192 -178 -288 c
+ 0 -188 l
+ 0 -2 0 -4 -2 -6 c
+ -52 0 l
+ -2 0 -4 0 -6 2 c
+ -2 2 -2 4 -2 6 c
+ 2 0 l
+ 0 188 l
+ -2 0 l
+ -58 96 -118 192 -176 288 c
+ 0 2 l
+ 2 0 l
+ 0 2 0 4 2 4 c
+ 0 2 2 2 2 2 c
+ 54 0 l
+ 0 -2 l
+ 6 0 10 -2 12 -4 c
+ 2 -2 2 -2 4 -4 c
+ 52 -86 104 -172 156 -258 c
+closepath
+%%end path
+%%new path
+ 256 624 M
+ 36 0 l
+ -8 16 -18 32 -26 48 c
+ 0 -2 l
+ -88 0 l
+ 0 -22 l
+ 2 0 l
+ 16 0 40 0 54 -4 c
+ 4 -2 10 -6 14 -10 c
+ 2 -4 6 -8 8 -12 c
+closepath
+%%end path
+%%new path
+ 328 624 M
+ -2 2 -2 6 -2 8 c
+ 2 0 l
+ 0 4 0 8 2 10 c
+ 2 0 2 0 4 2 c
+ 12 6 28 6 44 6 c
+ 0 22 l
+ -2 -2 l
+ -108 0 l
+ 8 -16 18 -32 26 -48 c
+ 0 2 l
+ 36 0 l
+closepath
+%%end path
+%%new path
+ 584 604 M
+ 14 0 l
+ 12 22 24 46 36 68 c
+ -2 -2 l
+ -84 0 l
+ 0 -22 l
+ 2 0 l
+ 12 0 24 -2 32 -10 c
+ 2 -2 2 -2 4 -4 c
+ 2 -4 4 -8 4 -14 c
+ -2 0 l
+ 0 -6 -2 -12 -6 -18 c
+closepath
+%%end path
+%%new path
+ 610 604 M
+ 4 6 10 12 14 18 c
+ 8 6 14 12 24 16 c
+ 16 8 34 12 54 12 c
+ 0 22 l
+ -2 -2 l
+ -68 0 l
+ -12 -22 -24 -46 -36 -68 c
+ 2 2 l
+ 12 0 l
+closepath
+%%end path
+%%new path
+ 406 226 M
+ 0 -6 -2 -14 -6 -18 c
+ -2 -2 -4 -2 -6 -4 c
+ -12 -4 -42 -4 -62 -4 c
+ 0 -20 l
+ 108 0 l
+ 0 48 l
+ -2 -2 l
+-32 0 l
+closepath
+%%end path
+%%new path
+ 468 226 M
+ -30 0 l
+ 0 -46 l
+ 106 0 l
+ 0 22 l
+ -2 0 l
+ -20 0 -50 0 -62 4 c
+ -2 2 -4 2 -6 4 c
+ -4 4 -6 12 -6 18 c
+closepath
+%%end path
+fill
+grestore
+) def
+
+end % of CharDefs dictionary
+
+Encoding 81 /The_letter_Q put
+Encoding 89 /The_letter_Y put
+
+Metrics
+ begin
+/The_letter_Q 527 fudge add def
+/The_letter_Y 525 fudge add def
+/.notdef 400 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /M {moveto} def
+ /L {lineto} def
+ /l {rlineto} def
+ /C {curveto} def
+ /c {rcurveto} def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -178 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [178 fudge sub 40 704 688] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 70 scalefont setfont
+ 0 0 moveto (Y) show
+endFig
+3285 3104(Figure)N
+3514(5)X
+2520 3264(When)N
+2747(a)X
+2818(P)X
+8 s 8 xH F
+2862(OST)X
+10 s 10 xH F
+2983(S)X
+8 s 8 xH F
+3027(CRIPT)X
+10 s 10 xH 5 f F
+3245(fill)X
+1 f F
+3473(command)X
+3825(is)X
+3914(applied)X
+4186(to)X
+4284(a)X
+2520 3360(path)N
+2692(that)X
+2846(is)X
+2933(composed)X
+3292(of)X
+3393(more)X
+3591(than)X
+3762(one)X
+3911(subpath,)X
+4213(say)X
+2520 3456(two)N
+2661(for)X
+2776(the)X
+2895(sake)X
+3059(of)X
+3147(simplicity,)X
+3507(and)X
+3645(one)X
+3783(subpath)X
+4054(is)X
+4129(inside)X
+2520 3552(the)N
+2654(other)X
+2855(and)X
+3007(is)X
+3095(drawn)X
+3331(in)X
+3428(a)X
+3499(direction)X
+3819(opposite)X
+4125(to)X
+4222(the)X
+2520 3648(external)N
+2804(one,)X
+2966(the)X
+3090(internal)X
+3361(path)X
+3525(is)X
+3604(considered)X
+3978(a)X
+4040(hole)X
+4204(and)X
+2520 3744(is)N
+2593(not)X
+2715(\256lled)X
+2899(\(see)X
+3049(Figure)X
+3279(6\).)X
+3407(So,)X
+3532(if)X
+3602(several)X
+3851(paths)X
+4041(are)X
+4161(to)X
+4244(be)X
+2520 3840(\256lled)N
+2723(in)X
+2824(this)X
+2978(manner,)X
+3278(the)X
+3414(description)X
+3808(of)X
+3913(each)X
+4099(one)X
+4253(of)X
+2520 3936(them)N
+2702(should)X
+2938(be)X
+3037(ended)X
+3252(with)X
+3417(the)X
+5 f F
+3538(fill)X
+1 f F
+3753(command.)X
+4132(There)X
+2520 4032(is)N
+2608(one)X
+2759(more)X
+2959(bene\256t)X
+3212(to)X
+3309(using)X
+3516(this)X
+3665(strategy:)X
+3975(The)X
+4134(P)X
+8 s 8 xH F
+4178(OST-)X
+10 s 10 xH F
+2520 4128(S)N
+8 s 8 xH F
+2564(CRIPT)X
+10 s 10 xH 5 f F
+2806(current)X
+3202(path)X
+1 f F
+3427(stack)X
+3625(becomes)X
+3939(empty)X
+4172(after)X
+2520 4224(encountering)N
+2971(any)X
+3119(kind)X
+3293(of)X
+5 f F
+3392(fill)X
+1 f F
+3615(command.)X
+3982(Therefore,)X
+2520 4320(using)N
+2735(the)X
+5 f F
+2875(fill)X
+1 f F
+3109(command)X
+3467(after)X
+3657(each)X
+3847(path)X
+4027(can)X
+4182(help)X
+2520 4416(avoid)N
+5 f F
+2761(stack)X
+3091(overflow)X
+3565(error)X
+1 f F
+(s)S
+3898(if)X
+4009(all)X
+4151(paths)X
+2520 4512(together)N
+2803(are)X
+2922(too)X
+3044(long.)X
+3 f F
+2679 4608(4.5.2)N
+2899(Treating)X
+3237(erasing)X
+3526(paths.)X
+1 f F
+3792(There)X
+4020(are)X
+4159(three)X
+2520 4704(methods)N
+2822(of)X
+2920(handling)X
+3231(the)X
+3360(problem)X
+3658(of)X
+3756(paths)X
+3956(that)X
+4107(should)X
+2520 4800(be)N
+2616(erased)X
+2842(by)X
+9 f F
+2944(mf2ps)X
+1 f F
+3181(itself:)X
+2583 4944(1.)N
+2679(\256lling)X
+2896(with)X
+3066(white:)X
+3294(Because)X
+3590(erasing)X
+3850(paths)X
+4047(are)X
+4174(built)X
+2679 5040(in)N
+2769(order)X
+2967(to)X
+3057(erase)X
+3251(an)X
+3355(existing)X
+3636(\256lled)X
+3828(area)X
+3991(and)X
+4134(P)X
+8 s 8 xH F
+4178(OST-)X
+10 s 10 xH F
+2679 5136(S)N
+8 s 8 xH F
+2723(CRIPT)X
+10 s 10 xH F
+2938(overlaps)X
+3243(paths)X
+3445(\(i.e.,)X
+3623(a)X
+3692(region)X
+3930(is)X
+4016(shown)X
+4258(in)X
+2679 5232(the)N
+2798(color)X
+2984(that)X
+3125(was)X
+3271(drawn)X
+3493(last\),)X
+3671(erasing)X
+3923(paths)X
+4112(can)X
+4244(be)X
+2679 5328(implemented)N
+3142(by)X
+3268(\256lling)X
+3504(those)X
+3719(paths)X
+3934(with)X
+4122(white.)X
+2679 5424(This)N
+2844(solution)X
+3124(is)X
+3200(the)X
+3321(easiest,)X
+3578(but)X
+3703(it)X
+3769(works)X
+3987(only)X
+4151(if)X
+4222(the)X
+2679 5520(background)N
+3100(is)X
+3195(white)X
+3415(and)X
+3573(the)X
+3713(letter)X
+3920(is)X
+4015(drawn)X
+4258(in)X
+2679 5616(some)N
+2879(level)X
+3066(of)X
+3164(gray.)X
+3358(If)X
+3443(one)X
+3589(wants)X
+3806(to)X
+3898(draw)X
+4089(a)X
+4155(letter)X
+2679 5712(with)N
+2861(background)X
+3280(other)X
+3485(than)X
+3663(white,)X
+3901(the)X
+4040(resulting)X
+2465 6084(9)N
+
+%%Page: 9 10
+9 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+608 672 MXY
+1736
+1968
+0.00
+-12.00
+217.00
+234.00
+startFig
+%!
+%%%Title: O
+%%%Creator: fig2ps
+%%%CreationDate: Fri Jul 6 08:19:06 1990
+%%%For: dberry@cs24 (dberry,479C,4325,252027,@$CP037,shlomo,cs24,)
+%%%Pages: 0
+%%%BoundingBox: 0 -12 217 234
+%%%Was: 0 0 217 222
+%%%EndComments
+/$F2psDict 32 dict def $F2psDict begin $F2psDict /mtrx matrix put
+ /DrawEllipse { /endangle exch def /startangle exch def /yrad exch def /xrad exch def /y exch def /x exch def /savematrix mtrx currentmatrix def x y translate xrad yrad scale 0 0 1 startangle endangle arc savematrix setmatrix } def
+ end /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def %%EndProlog
+$F2psBegin
+1 setlinecap 1 setlinejoin
+-71 68 translate
+0.000000 222.000000 translate 0.900 -0.900 scale
+0.700 setlinewidth
+%% Ellipse
+newpath 199 199 121 121 0 360 DrawEllipse gsave 0.750 setgray fill grestore stroke
+%% Ellipse
+newpath 199 199 61 61 0 360 DrawEllipse gsave 1.000 setgray fill grestore stroke
+%% Polyline
+newpath 189 316 moveto 217 319 lineto 189 322 lineto 189 316 lineto closepath gsave 0.000 setgray fill grestore stroke
+%% Polyline
+newpath 210 262 moveto 186 259 lineto 210 256 lineto 210 262 lineto closepath gsave 0.000 setgray fill grestore stroke
+%% Polyline
+newpath 188 137 moveto 212 139 lineto 188 143 lineto 188 137 lineto closepath gsave 0.000 setgray fill grestore stroke
+%% Polyline
+newpath 210 82 moveto 182 79 lineto 210 75 lineto 210 82 lineto closepath gsave 0.000 setgray fill grestore stroke
+$F2psEnd
+endFig
+1 f F
+1341 2784(Figure)N
+1570(6)X
+735 2944(appearance)N
+1118(will)X
+1262(not)X
+1384(be)X
+1480(correct.)X
+639 3088(2.)N
+735(calculating)X
+1125(new)X
+1298(paths)X
+1506(resulting)X
+1825(from)X
+2020(subtracting)X
+735 3184(the)N
+870(erasing)X
+1139(paths)X
+1345(from)X
+1538(the)X
+1673(previous)X
+1985(\256lled)X
+2185(paths:)X
+735 3280(Such)N
+920(a)X
+981(solution)X
+1263(can)X
+1400(be)X
+1501(global.)X
+1746(However,)X
+2086(it)X
+2155(costs)X
+2340(a)X
+735 3376(lot)N
+868(in)X
+979(terms)X
+1206(of)X
+1322(processing)X
+1714(time)X
+1905(and)X
+2069(accuracy,)X
+735 3472(because)N
+1018(paths)X
+1215(are)X
+1343(given)X
+1550(implicitly)X
+1889(by)X
+1998(four)X
+2161(points,)X
+735 3568(and)N
+873(in)X
+957(order)X
+1149(to)X
+1233(calculate)X
+1541(the)X
+1661(new)X
+1816(paths,)X
+2026(one)X
+2163(should)X
+735 3664(\256nd)N
+879(the)X
+997(intersection)X
+1391(points)X
+1606(of)X
+1693(Be)X
+1751(\302zier)X
+1924(curves,)X
+2175(i.e.,)X
+2314(to)X
+735 3760(\256nd)N
+882(points)X
+1100(that)X
+1243(lie)X
+1346(on)X
+1449(both)X
+1614(Be)X
+1672(\302zier)X
+1848(curves,)X
+2100(and)X
+2238(then)X
+735 3856(calculate)N
+1048(new)X
+1209(curves,)X
+1466(which)X
+1689(are)X
+1815(di)X
+1877 MX
+(Fi)139 825 oc
+(cult)S
+2090(to)X
+2179(calcu-)X
+735 3952(late)N
+871(from)X
+1047(those)X
+1236(points.)X
+639 4096(3.)N
+735(using)X
+955(the)X
+1100(P)X
+8 s 8 xH F
+1144(OST)X
+10 s 10 xH F
+1265(S)X
+8 s 8 xH F
+1309(CRIPT)X
+10 s 10 xH 5 f F
+1538(eoclip)X
+1 f F
+1874(command:)X
+2260(Be-)X
+735 4192(cause)N
+936(the)X
+1056(letters)X
+1274(are)X
+1394(bounded)X
+1691(in)X
+1774(a)X
+1831(1000)X
+47 f F
+2011(\264)X
+1 f F
+2055(1000)X
+2236(box,)X
+735 4288(a)N
+805(primary)X
+1093(square)X
+1337(path)X
+1509(whose)X
+1749(segments)X
+2082(are)X
+2216(1000)X
+735 4384(units)N
+923(long)X
+1098(should)X
+1344(be)X
+1453(declared)X
+1759(and)X
+1908(after)X
+2089(it)X
+2166(all)X
+2278(the)X
+735 4480(erasing)N
+991(paths)X
+1184(should)X
+1421(be)X
+1521(listed.)X
+1738(After)X
+1932(relocating)X
+2278(the)X
+735 4576(erasing)N
+1005(paths)X
+1212(we)X
+1344(are)X
+1481(ready)X
+1698(to)X
+1798(declare)X
+5 f F
+2068(eoclip)X
+1 f F
+(,)S
+735 4672(which)N
+957(means)X
+1188(that)X
+1334(the)X
+1458(clipping)X
+1747(path)X
+1912(is)X
+1992(the)X
+2117(external)X
+735 4768(primary)N
+1031(one)X
+1189(and)X
+1347(the)X
+1487(internal)X
+1774(paths,)X
+2005(the)X
+2144(erasing)X
+735 4864(paths,)N
+959(are)X
+1093(holes.)X
+1317(This)X
+1494(is)X
+1583(an)X
+1695(elegant)X
+1963(solution)X
+2256(that)X
+735 4960(uses)N
+899(the)X
+1023(power)X
+1250(of)X
+1342(the)X
+1465(language)X
+1780(and)X
+1921(is)X
+1999(available)X
+2314(in)X
+735 5056(simple)N
+976(situations)X
+1310(in)X
+1400(which)X
+1624(there)X
+1813(is)X
+1894(no)X
+2002(intersection)X
+735 5152(between)N
+1030(the)X
+1155(erasing)X
+1414(paths)X
+1610(\(see)X
+1767(Figure)X
+2002(7\).)X
+2135(If)X
+2215(there)X
+735 5248(were)N
+923(intersections,)X
+1379(a)X
+1446(little)X
+1623(more)X
+1819(sophisticated)X
+2269(use)X
+735 5344(of)N
+827(the)X
+5 f F
+950(eoclip)X
+1 f F
+1262(command)X
+1602(would)X
+1826(be)X
+1926(needed.)X
+2198(Relo-)X
+735 5440(cation)N
+970(of)X
+1076(the)X
+1214(erasing)X
+1486(paths)X
+1695(is)X
+1788(done)X
+1984(by)X
+2104(the)X
+2242(pro-)X
+735 5536(cedure)N
+5 f F
+970(doarrange)X
+1 f F
+(.)S
+2788 672 MXY
+1264
+560
+0.00
+0.00
+158.00
+70.00
+startFig
+%! Simon font
+%%%BoundingBox: 0 0 158 70
+%%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+%% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_letter_Q
+(
+newpath
+%%new path
+ 458 668 M
+ -38 0 -74 -18 -102 -44 c
+ -8 -8 -14 -18 -22 -26 c
+ -34 -52 -44 -114 -44 -176 c
+ 2 0 l
+ 0 -60 10 -122 44 -172 c
+ 8 -10 14 -18 22 -24 c
+ 28 -28 62 -46 102 -46 c
+ 0 2 l
+ 40 0 74 18 102 46 c
+ 8 6 14 14 22 24 c
+ 34 50 44 112 44 172 c
+ -2 0 l
+ 0 62 -10 124 -44 176 c
+ -8 8 -14 18 -22 26 c
+ -28 26 -64 44 -102 44 c
+closepath
+%%end path
+%%new path
+ 458 686 M
+ -60 0 -118 -26 -162 -68 c
+ -2 -4 -6 -6 -8 -10 c
+ -46 -50 -70 -118 -70 -186 c
+ 2 0 l
+ 0 -68 24 -134 70 -184 c
+ 2 -2 4 -4 8 -6 c
+ 42 -44 100 -68 162 -68 c
+ 0 2 l
+ 62 0 120 24 162 68 c
+ 4 2 6 4 8 6 c
+ 46 50 70 116 70 184 c
+ -2 0 l
+ 0 68 -24 136 -70 186 c
+ -2 4 -6 6 -8 10 c
+ -44 42 -102 68 -162 68 c
+closepath
+%%end path
+eofill
+%%new path
+ 466 178 M
+ -2 2 l
+ -4 0 l
+ -6 0 -12 2 -16 4 c
+ 0 -2 l
+ 2 0 l
+ -6 2 -14 8 -18 12 c
+ -2 0 l
+ 6 -4 l
+ 0 0 l
+ -2 2 l
+ -6 6 -10 12 -12 20 c
+ 2 -4 l
+ -2 2 l
+ -2 4 -2 10 -2 16 c
+ 2 0 l
+ -2 2 l
+ 2 -2 l
+ -2 -6 l
+ 2 4 l
+ 0 6 0 12 2 18 c
+ 0 -2 l
+ -2 -2 l
+ 2 0 l
+ 2 8 6 16 12 22 c
+ 0 -2 l
+ -8 -4 l
+ 2 0 l
+ 2 2 l
+ 2 0 l
+ 4 6 12 10 18 12 c
+ -4 -2 l
+ 2 2 l
+ 4 2 10 2 16 2 c
+ -2 -2 l
+ 4 2 l
+ 2 2 l
+ -8 -4 l
+ -6 4 l
+ 4 -2 l
+ 2 -2 l
+ 2 0 l
+ 8 0 16 -2 22 -4 c
+ -2 2 l
+ -2 0 l
+ 10 -4 16 -8 22 -14 c
+ 0 2 l
+ 2 -2 l
+ -6 4 l
+ 0 0 l
+ 2 0 l
+ 8 -10 16 -24 20 -38 c
+ 0 2 l
+ -2 2 l
+ 2 0 l
+ 12 -38 14 -84 26 -122 c
+ -2 2 l
+ 2 -4 l
+ 6 -14 12 -28 22 -38 c
+ -2 2 l
+ 4 -4 l
+ 6 -6 14 -10 22 -14 c
+ 0 2 l
+ 2 -2 l
+ 2 0 l
+ 6 -2 14 -4 22 -4 c
+ 2 0 l
+ 0 2 l
+ 8 0 14 2 20 4 c
+ 0 -2 l
+ 2 2 l
+ 2 0 l
+ 8 4 16 8 24 16 c
+ -2 -2 l
+ 4 4 l
+ 10 10 18 26 24 42 c
+ 0 2 l
+ 2 2 l
+ 6 20 10 46 10 70 c
+ -2 4 l
+ -2 2 l
+ -4 2 l
+ -2 0 l
+ 0 -2 l
+ -2 0 l
+ 2 2 l
+ -4 -2 l
+ -2 -2 l
+ -2 -4 l
+ 0 -8 -2 -16 -4 -22 c
+ 2 0 l
+ 0 2 l
+ -4 -10 -10 -20 -18 -28 c
+ 0 0 l
+ 8 4 l
+ -4 0 l
+ -2 -2 l
+ -8 -8 -18 -14 -28 -18 c
+ 0 2 l
+ 2 0 l
+ -6 -2 -14 -4 -22 -4 c
+ -2 0 l
+ -4 -4 l
+ 8 4 l
+ 6 -4 l
+ -2 4 l
+ -4 0 l
+ 0 2 l
+ -8 0 -14 0 -20 2 c
+ 4 -2 l
+ -2 2 l
+ -10 4 -16 8 -24 14 c
+ -2 0 l
+ 6 -4 l
+ 2 -2 l
+ -2 2 l
+ 0 2 l
+ -34 34 -42 100 -74 134 c
+ 0 -2 l
+ -2 4 l
+ -2 0 l
+ -6 8 -14 12 -24 16 c
+ 2 -2 l
+ -4 2 l
+ -6 2 -14 4 -20 4 c
+ -2 0 l
+ 0 -2 l
+ -6 0 -12 0 -16 -2 c
+ -2 0 l
+ -2 -2 l
+ -6 -2 -14 -6 -18 -12 c
+ 0 2 l
+ -2 -4 l
+ -2 0 l
+ -6 -6 -10 -14 -12 -22 c
+ 0 -2 l
+ -2 0 l
+ -2 -6 -2 -12 -2 -18 c
+ 2 2 l
+ 0 -4 l
+ 0 -6 0 -12 2 -16 c
+ 0 -2 l
+ 2 -2 l
+ 2 -8 6 -14 12 -20 c
+ 2 -2 l
+ 2 0 l
+ 4 -4 12 -10 18 -12 c
+ 0 2 l
+ 2 -2 l
+ 2 0 l
+ 4 -2 10 -4 16 -4 c
+ -2 2 l
+ 6 0 l
+ 2 4 l
+ 2 2 l
+ 0 2 l
+ -2 4 l
+closepath
+%%end path
+fill
+) def
+
+/The_letter_Y
+(
+gsave
+initclip
+newpath
+0 0 M
+0 1000 L
+1000 1000 L
+1000 0 L
+0 0 L
+%%new path
+ 180 670 0.8 add M
+ 28 -2 0.8 add 58 -2 0.8 add 88 -2 0.8 add c
+ 0 2 0.8 add l
+ 38 0 0.8 add 74 0 0.8 add 110 2 0.8 add c
+ -2 -2 0.8 add l
+-198 0 l
+closepath
+%%end path
+%%erase
+%%new path
+ 550 670 0.8 add M
+ 28 -2 0.8 add 56 -2 0.8 add 84 -2 0.8 add c
+ 0 2 0.8 add l
+ 24 0 0.8 add 46 0 0.8 add 68 2 0.8 add c
+ -2 -2 0.8 add l
+-152 0 l
+closepath
+%%end path
+%%erase
+%%new path
+ 334 180 0.8 sub M
+ 208 0 0.8 sub l
+ -34 2 0.8 sub -70 2 0.8 sub -104 2 0.8 sub c
+ 0 -2 0.8 sub l
+-106 0 l
+closepath
+%%end path
+%%erase
+eoclip
+newpath
+%%new path
+ 462 406 M
+ 54 86 106 172 160 258 c
+ 0 2 2 2 2 4 c
+ 4 2 8 4 12 4 c
+ 8 0 l
+ 0 -2 l
+ 0 0 2 0 2 -2 c
+ 2 0 2 -2 2 -4 c
+ -2 0 l
+ 0 -2 l
+ -60 -96 -118 -192 -178 -288 c
+ 0 -188 l
+ 0 -2 0 -4 -2 -6 c
+ -52 0 l
+ -2 0 -4 0 -6 2 c
+ -2 2 -2 4 -2 6 c
+ 2 0 l
+ 0 188 l
+ -2 0 l
+ -58 96 -118 192 -176 288 c
+ 0 2 l
+ 2 0 l
+ 0 2 0 4 2 4 c
+ 0 2 2 2 2 2 c
+ 54 0 l
+ 0 -2 l
+ 6 0 10 -2 12 -4 c
+ 2 -2 2 -2 4 -4 c
+ 52 -86 104 -172 156 -258 c
+closepath
+%%end path
+fill
+%%new path
+ 256 624 M
+ 36 0 l
+ -8 16 -18 32 -26 48 c
+ 0 -2 l
+ -88 0 l
+ 0 -22 l
+ 2 0 l
+ 16 0 40 0 54 -4 c
+ 4 -2 10 -6 14 -10 c
+ 2 -4 6 -8 8 -12 c
+closepath
+%%end path
+fill
+%%new path
+ 328 624 M
+ -2 2 -2 6 -2 8 c
+ 2 0 l
+ 0 4 0 8 2 10 c
+ 2 0 2 0 4 2 c
+ 12 6 28 6 44 6 c
+ 0 22 l
+ -2 -2 l
+ -108 0 l
+ 8 -16 18 -32 26 -48 c
+ 0 2 l
+ 36 0 l
+closepath
+%%end path
+fill
+%%new path
+ 584 604 M
+ 14 0 l
+ 12 22 24 46 36 68 c
+ -2 -2 l
+ -84 0 l
+ 0 -22 l
+ 2 0 l
+ 12 0 24 -2 32 -10 c
+ 2 -2 2 -2 4 -4 c
+ 2 -4 4 -8 4 -14 c
+ -2 0 l
+ 0 -6 -2 -12 -6 -18 c
+closepath
+%%end path
+fill
+%%new path
+ 610 604 M
+ 4 6 10 12 14 18 c
+ 8 6 14 12 24 16 c
+ 16 8 34 12 54 12 c
+ 0 22 l
+ -2 -2 l
+ -68 0 l
+ -12 -22 -24 -46 -36 -68 c
+ 2 2 l
+ 12 0 l
+closepath
+%%end path
+fill
+%%new path
+ 406 226 M
+ 0 -6 -2 -14 -6 -18 c
+ -2 -2 -4 -2 -6 -4 c
+ -12 -4 -42 -4 -62 -4 c
+ 0 -20 l
+ 108 0 l
+ 0 48 l
+ -2 -2 l
+-32 0 l
+closepath
+%%end path
+fill
+%%new path
+ 468 226 M
+ -30 0 l
+ 0 -46 l
+ 106 0 l
+ 0 22 l
+ -2 0 l
+ -20 0 -50 0 -62 4 c
+ -2 2 -4 2 -6 4 c
+ -4 4 -6 12 -6 18 c
+closepath
+%%end path
+fill
+grestore
+) def
+
+end % of CharDefs dictionary
+
+Encoding 81 /The_letter_Q put
+Encoding 89 /The_letter_Y put
+
+Metrics
+ begin
+/The_letter_Q 527 fudge add def
+/The_letter_Y 525 fudge add def
+/.notdef 400 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /M {moveto} def
+ /L {lineto} def
+ /l {rlineto} def
+ /C {curveto} def
+ /c {rcurveto} def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -178 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [178 fudge sub 40 704 688] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 70 scalefont setfont
+ 0 0 moveto (Q Y) show
+endFig
+3285 1376(Figure)N
+3514(7)X
+2679 1536(There)N
+2904(are)X
+3040(other)X
+3242(problems)X
+3577(caused)X
+3834(by)X
+3952(the)X
+4088(erasing)X
+2520 1632(paths.)N
+2730(Because)X
+3019(the)X
+3138(erasing)X
+3391(paths)X
+3581(have)X
+3754(segments)X
+4073(in)X
+4155(com-)X
+2520 1728(mon)N
+2695(with)X
+2870(paths)X
+3072(to)X
+3168(be)X
+3278(\256lled,)X
+3496(P)X
+8 s 8 xH F
+3540(OST)X
+10 s 10 xH F
+3661(S)X
+8 s 8 xH F
+3705(CRIPT)X
+10 s 10 xH F
+3921(must)X
+4110(decide)X
+2520 1824(whether)N
+2805(the)X
+2929(common)X
+3235(segments)X
+3559(are)X
+3684(in)X
+3772(the)X
+3895(clipping)X
+4182(path)X
+2520 1920(or)N
+2611(not.)X
+2777(P)X
+8 s 8 xH F
+2821(OST)X
+10 s 10 xH F
+2942(S)X
+8 s 8 xH F
+2986(CRIPT)X
+10 s 10 xH F
+3192(does)X
+3363(not)X
+3489(seem)X
+3678(to)X
+3764(have)X
+3940(a)X
+4000(consistent)X
+2520 2016(policy)N
+2754(on)X
+2868(that)X
+3022(and)X
+3172(it)X
+3250(seems)X
+3479(to)X
+3574(be)X
+3683(that)X
+3836(the)X
+3967(decision)X
+4267(is)X
+2520 2112(taken)N
+2714(arbitrarily)X
+3055(\(see)X
+3205(Figure)X
+3434(8\).)X
+3260 2208 MXY
+320
+320
+0.00
+0.00
+40.00
+40.00
+startFig
+%! Simon font
+%%%BoundingBox: 0 0 40 40
+%%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+%% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_letter_x
+(
+gsave
+initclip
+newpath
+0 0 M
+0 1000 L
+1000 1000 L
+1000 0 L
+0 0 L
+%%new path
+ 192 488 M
+ 22 -2 44 -2 66 -2 c
+ 0 2 l
+ 28 0 54 0 82 2 c
+ -2 -2 l
+-148 0 l
+closepath
+%%end path
+%%erase
+%%new path
+ 404 180 M
+ 146 0 l
+ -22 2 -44 2 -66 2 c
+ 0 -2 l
+-82 0 l
+closepath
+%%end path
+%%erase
+%%new path
+ 410 488 M
+ 24 -2 48 -2 72 -2 c
+ 0 2 l
+ 20 0 38 0 58 2 c
+ -2 -2 l
+-130 0 l
+closepath
+%%end path
+%%erase
+%%new path
+ 188 180 M
+ 128 0 l
+ -24 2 -48 2 -72 2 c
+ 0 -2 l
+-58 0 l
+closepath
+%%end path
+%%erase
+eoclip
+newpath
+%%new path
+ 280 486 M
+ -2 2 -6 4 -8 4 c
+ 0 -2 l
+ -38 0 l
+ -2 0 -2 0 -4 -2 c
+ 0 -2 l
+ 2 0 l
+ 0 -4 l
+ 76 -100 154 -198 230 -298 c
+ 2 -2 6 -2 8 -2 c
+ 38 0 l
+ 2 0 2 0 4 2 c
+ 0 2 l
+ -2 0 l
+ 0 4 l
+ -76 100 -154 198 -230 298 c
+closepath
+%%end path
+fill
+%%new path
+ 230 180 M
+ 10 0 l
+ 6 0 12 2 16 6 c
+ 0 0 2 2 2 2 c
+ 80 100 160 198 238 298 c
+ 2 0 2 2 2 2 c
+ -2 0 l
+ 0 0 0 0 -2 2 c
+ -2 0 l
+ 0 -2 l
+ -6 0 l
+ -6 0 -12 -2 -16 -6 c
+ 0 0 -2 -2 -2 -2 c
+ -80 -100 -160 -198 -238 -298 c
+ -2 0 -2 -2 -2 -2 c
+closepath
+%%end path
+fill
+%%new path
+ 264 442 M
+ 24 0 l
+ -10 16 -22 32 -32 48 c
+ 0 -2 l
+ -66 0 l
+ 0 -22 l
+ 2 0 l
+ 16 0 34 0 46 -4 c
+ 6 -2 10 -6 16 -10 c
+ 2 -4 6 -8 10 -12 c
+closepath
+%%end path
+fill
+%%new path
+ 314 442 M
+ -2 2 -2 6 -2 8 c
+ 2 0 l
+ 0 4 0 6 4 10 c
+ 6 6 14 8 22 8 c
+ 0 22 l
+ -2 -2 l
+ -80 0 l
+ 10 -16 22 -32 32 -48 c
+ 0 2 l
+ 26 0 l
+closepath
+%%end path
+fill
+%%new path
+ 428 226 M
+ 2 -2 2 -6 2 -8 c
+ -2 0 l
+ 0 -4 0 -6 -4 -10 c
+ -6 -6 -14 -8 -22 -8 c
+ 0 -20 l
+ 82 0 l
+ -10 16 -22 32 -32 48 c
+ 0 -2 l
+-26 0 l
+closepath
+%%end path
+fill
+%%new path
+ 478 226 M
+ -24 0 l
+ 10 -16 22 -32 32 -46 c
+ 66 0 l
+ 0 22 l
+ -2 0 l
+ -16 0 -34 0 -46 4 c
+ -6 2 -10 6 -16 10 c
+ -2 4 -6 8 -10 12 c
+closepath
+%%end path
+fill
+%%new path
+ 422 422 M
+ 12 0 l
+ 16 22 32 46 48 68 c
+ -2 -2 l
+ -72 0 l
+ 0 -22 l
+ 2 0 l
+ 6 0 12 -2 16 -6 c
+ 2 -2 4 -6 4 -10 c
+ 2 -2 2 -4 2 -6 c
+ -2 0 l
+ 0 -8 -4 -18 -10 -24 c
+closepath
+%%end path
+fill
+%%new path
+ 446 422 M
+ 2 4 6 8 10 12 c
+ 8 8 20 16 32 22 c
+ 16 8 34 12 52 12 c
+ 0 22 l
+ -2 -2 l
+ -58 0 l
+ -16 -22 -32 -46 -48 -68 c
+ 2 2 l
+ 12 0 l
+closepath
+%%end path
+fill
+%%new path
+ 280 246 M
+ -2 -4 -6 -8 -10 -12 c
+ -8 -8 -20 -16 -32 -22 c
+ -16 -8 -34 -12 -52 -12 c
+ 0 -20 l
+ 60 0 l
+ 16 22 32 46 48 68 c
+ -2 -2 l
+-12 0 l
+closepath
+%%end path
+fill
+%%new path
+ 304 246 M
+ -12 0 l
+ -16 -22 -32 -46 -48 -66 c
+ 74 0 l
+ 0 22 l
+ -2 0 l
+ -6 0 -12 2 -16 6 c
+ -2 2 -4 6 -4 10 c
+ -2 2 -2 4 -2 6 c
+ 2 0 l
+ 0 8 4 18 10 24 c
+closepath
+%%end path
+fill
+%%for fake line
+newpath
+160 180 M
+360 0 l
+0 .5 l
+-360 0 l
+0 -.5 l
+closepath
+fill
+grestore
+) def
+
+end % of CharDefs dictionary
+
+Encoding 120 /The_letter_x put
+
+Metrics
+ begin
+/The_letter_x 367 fudge add def
+/.notdef 0 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /M {moveto} def
+ /L {lineto} def
+ /l {rlineto} def
+ /C {curveto} def
+ /c {rcurveto} def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -186 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [186 fudge sub 180 552 490] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 40 scalefont setfont
+ 0 0 moveto (x) show
+endFig
+3285 2672(Figure)N
+3514(8)X
+2520 2832(An)N
+2645(attempt)X
+2912(to)X
+3001(resolve)X
+3260(the)X
+3385(clipping)X
+3674(path)X
+3839(problem)X
+4133(led)X
+4258(to)X
+2520 2928(the)N
+2653(\256rst)X
+2812(author)X
+3052(sending)X
+3336(the)X
+3468(following)X
+3813(electronic)X
+4164(mes-)X
+2520 3024(sage)N
+2695(\(obviously,)X
+3089(not)X
+3223(as)X
+3323(nicely)X
+3552(formatted)X
+3897(as)X
+3997(herein\))X
+4258(to)X
+2520 3120(Glenn)N
+2736(Reid)X
+2907(of)X
+2994(Adobe)X
+3228(Systems,)X
+3534(Inc.)X
+2679 3264(From)N
+2872(simon)X
+3087(Tue)X
+3232(Mar)X
+3386(21)X
+3486(13:22:32)X
+3790(1989)X
+2679 3360(To:)N
+2810(greid@adobe.com)X
+2679 3456(Subject:)N
+2961(Problem)X
+3252(in)X
+3334(PostScript)X
+2679 3648(Dear)N
+2856(Mr.)X
+2994(Reid)X
+2679 3840(I)N
+2746(have)X
+2938(got)X
+3080(a)X
+3157(problem)X
+3465(in)X
+3568(understanding)X
+4063(the)X
+2679 3936(PostScript)N
+3040(policy)X
+3273(in)X
+3368(determining)X
+3788(\252what)X
+4013(is)X
+4099(in)X
+2679 4032(the)N
+2802(clipping)X
+3089(path\272.)X
+3328(I)X
+3380(think)X
+3569(there)X
+3755(is)X
+3833(a)X
+3894(problem)X
+2679 4128(in)N
+2777(the)X
+2911(boundaries.)X
+3339(Here)X
+3532(is)X
+3621(an)X
+3733(example)X
+4041(that)X
+2679 4224(shows)N
+2899(that)X
+3039(problem:)X
+5 f F
+2886 4416(gsave)N
+2886 4512(initclip)N
+2886 4608(newpath)N
+2886 4800(0)N
+2982(0)X
+3078(moveto)X
+2886 4896(0)N
+2982(1000)X
+3222(lineto)X
+2886 4992(1000)N
+3126(1000)X
+3366(lineto)X
+2886 5088(1000)N
+3126(0)X
+3222(lineto)X
+2886 5184(0)N
+2982(0)X
+3078(lineto)X
+2886 5376(300)N
+3078(100)X
+3270(moveto)X
+2886 5472(700)N
+3078(100)X
+3270(lineto)X
+2886 5568(700)N
+3078(300)X
+3270(lineto)X
+2886 5664(300)N
+3078(300)X
+3270(lineto)X
+1 f F
+2465 6084(10)N
+
+%%Page: 10 11
+10 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+5 f F
+942 672(300)N
+1134(100)X
+1326(lineto)X
+942 864(700)N
+1134(900)X
+1326(moveto)X
+942 960(300)N
+1134(900)X
+1326(lineto)X
+942 1056(300)N
+1134(700)X
+1326(lineto)X
+942 1152(700)N
+1134(700)X
+1326(lineto)X
+942 1248(700)N
+1134(900)X
+1326(lineto)X
+942 1440(eoclip)N
+942 1632(newpath)N
+942 1728(100)N
+1134(100)X
+1326(moveto)X
+942 1824(900)N
+1134(100)X
+1326(lineto)X
+942 1920(900)N
+1134(900)X
+1326(lineto)X
+942 2016(100)N
+1134(900)X
+1326(lineto)X
+942 2112(100)N
+1134(100)X
+1326(lineto)X
+942 2208(fill)N
+942 2304(grestore)N
+1 f F
+735 2496(As)N
+850(you)X
+996(see,)X
+1145(the)X
+1269(problem)X
+1562(is)X
+1642(that)X
+1789(on)X
+1896(top)X
+2025(of)X
+2119(the)X
+735 2592(shape,)N
+977(the)X
+1114(line)X
+1273(which)X
+1508(belongs)X
+1796(to)X
+1897(the)X
+2034(upper)X
+735 2688(\252hole\272)N
+971(in)X
+1059(the)X
+1183(clipping)X
+1471(path)X
+1635(and)X
+1777(to)X
+1865(the)X
+1989(current)X
+735 2784(path)N
+894(\()X
+942(to)X
+1025(be)X
+1122(\256lled)X
+1307(\))X
+1354(is)X
+1427(drawn,)X
+1668(and)X
+1804(on)X
+1904(bottom)X
+2150(of)X
+735 2880(the)N
+853(shape)X
+1056(it)X
+1120(is)X
+1193(not.)X
+735 3072(This)N
+913(is)X
+1003(happening)X
+1374(both)X
+1553(on)X
+1670(the)X
+1805(Apple)X
+2038(Laser)X
+735 3168(printer)N
+969(and)X
+1105(on)X
+1205(the)X
+1323(QMS-80.)X
+735 3360(I)N
+782(would)X
+1002(be)X
+1098(glad)X
+1256(to)X
+1338(have)X
+1510(a)X
+1566(reply)X
+1751(from)X
+1927(you.)X
+735 3552(Thanks)N
+991(in)X
+1073(advance)X
+735 3648(Shimon)N
+1003(Yanai)X
+735 3744(C.S)N
+872(Dep.)X
+735 3840(Technion)N
+576 3984(What)N
+783(Mr.)X
+934(Reid)X
+1118(saw)X
+1276(when)X
+1483(he)X
+1592(printed)X
+1853(the)X
+1985(P)X
+8 s 8 xH F
+2029(OST)X
+10 s 10 xH F
+2150(S)X
+8 s 8 xH F
+2194(CRIPT)X
+10 s 10 xH F
+576 4080(commands)N
+957(contained)X
+1302(in)X
+1397(the)X
+1528(message)X
+1833(is)X
+1919(reproduced)X
+2314(in)X
+576 4176(Figure)N
+805(9.)X
+1316 4272 MXY
+320
+416
+0.00
+0.00
+40.00
+52.00
+startFig
+%! Simon font
+%%%BoundingBox: 0 0 40 52
+%%%Was: 0 0 40 40
+%%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+%% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_square
+(
+ gsave
+ initclip
+ newpath
+
+ 0 0 moveto
+ 0 1000 lineto
+ 1000 1000 lineto
+ 1000 0 lineto
+ 0 0 lineto
+
+ 300 100 moveto
+ 700 100 lineto
+ 700 300 lineto
+ 300 300 lineto
+ 300 100 lineto
+
+ 700 900 moveto
+ 300 900 lineto
+ 300 700 lineto
+ 700 700 lineto
+ 700 900 lineto
+
+ eoclip
+
+ newpath
+ 100 100 moveto
+ 900 100 lineto
+ 900 900 lineto
+ 100 900 lineto
+ 100 100 lineto
+ fill
+ grestore
+) def
+
+end % of CharDefs dictionary
+
+Encoding 120 /The_square put
+
+Metrics
+ begin
+/The_square 1000 fudge add def
+/.notdef 0 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /M {moveto} def
+ /L {lineto} def
+ /l {rlineto} def
+ /C {curveto} def
+ /c {rcurveto} def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -186 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [186 fudge sub 180 552 490] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 40 scalefont setfont
+ 0 0 moveto (x) show
+endFig
+1341 4832(Figure)N
+1570(9)X
+576 4992(Mr.)N
+714(Reid)X
+885(replied)X
+1128(with)X
+1290(the)X
+1408(following:)X
+735 5136(From:)N
+950(greid@adobe.com)X
+1559(\(Glenn)X
+1802(Reid\))X
+735 5232(To:)N
+866(Shimon)X
+1134(Yanai)X
+1346(<simon@techunix>)X
+735 5328(Cc:)N
+866(greid@adobe.com)X
+735 5424(Subject:)N
+1017(Re:)X
+1148(Problem)X
+1439(in)X
+1521(PostScript)X
+735 5520(In-Reply-To:)N
+1178(Your)X
+1363(message)X
+1655(of)X
+1742(Wed,)X
+1934(22)X
+2034(Mar)X
+2188(89)X
+2288(...)X
+735 5616(Date:)N
+929(Wed,)X
+1121(22)X
+1221(Mar)X
+1375(89)X
+1475(11:41:35)X
+1779(PST)X
+2679 672(The)N
+2838(problem)X
+3139(is)X
+3226(that)X
+3380(the)X
+3512(path)X
+3684(you)X
+3838(are)X
+3971(\256lling)X
+2679 768(falls)N
+2842(exactly)X
+3099(on)X
+3204(the)X
+3327(edge)X
+3504(of)X
+3595(the)X
+3717(clipping)X
+4003(path.)X
+2679 864(This)N
+2856(produces)X
+3181(a)X
+3252(zero-width)X
+3635(area)X
+3805(to)X
+3902(\256ll,)X
+4045(and)X
+2679 960(unfortunately)N
+3158(it)X
+3249(sometimes)X
+3638(\256lls)X
+3803(and)X
+3965(some-)X
+2679 1056(times)N
+2876(does)X
+3047(not)X
+3174(with)X
+3341(the)X
+3464(current)X
+3717(\256ll)X
+3830(algorithm.)X
+2679 1152(I)N
+2737(believe)X
+3000(that)X
+3151(it)X
+3226(is)X
+3310(related)X
+3559(to)X
+3651(the)X
+3779(direction)X
+4094(of)X
+2679 1248(the)N
+2809(paths;)X
+3033(if)X
+3115(the)X
+3246(paths)X
+3448(are)X
+3580(going)X
+3795(in)X
+3890(opposite)X
+2679 1344(directions)N
+3019(along)X
+3221(the)X
+3343(same)X
+3531(line,)X
+3694(it)X
+3761(will)X
+3908(\256ll)X
+4019(with)X
+2679 1440(a)N
+2743(one-pixel)X
+3074(area,)X
+3257(but)X
+3388(if)X
+3466(they)X
+3633(are)X
+3761(going)X
+3972(in)X
+4063(the)X
+2679 1536(same)N
+2874(direction,)X
+3209(it)X
+3283(will)X
+3437(not)X
+3569(\256ll.)X
+3727(I)X
+3784(believe)X
+4046(this)X
+2679 1632(has)N
+2840(been)X
+3046(\256xed)X
+3260(to)X
+3376(be)X
+3506(more)X
+3725(consistent)X
+4099(in)X
+2679 1728(Display)N
+2948(PostScript,)X
+3316(for)X
+3430(what)X
+3606(it's)X
+3728(worth.)X
+2679 1920(Glenn)N
+2895(Reid)X
+2679 2016(Adobe)N
+2913(Systems)X
+2679 2160(The)N
+2845(idea)X
+3020(of)X
+3128(using)X
+3342(opposite)X
+3654(directions)X
+4011(had)X
+4168(been)X
+2520 2256(checked)N
+2805(before)X
+3032(sending)X
+3302(the)X
+3421(letter,)X
+3626(so)X
+3717(the)X
+3835(problem)X
+4122(had)X
+4258(to)X
+2520 2352(be)N
+2627(solved)X
+2867(within)X
+3102(the)X
+3231(back)X
+3414(end)X
+3561(of)X
+9 f F
+3662(mf2ps)X
+1 f F
+3879(.)X
+3931(The)X
+4088(erasing)X
+2520 2448(paths)N
+2719(near)X
+2888(the)X
+3016(top)X
+3147(of)X
+3243(the)X
+3370(letter)X
+3564(had)X
+3709(their)X
+2 f F
+3885(y)X
+1 f F
+3950(coordinates)X
+2520 2544(increased)N
+2850(by)X
+2956(0.8)X
+3082(points,)X
+3323(and)X
+3465(those)X
+3660(near)X
+3826(the)X
+3951(bottom)X
+4204(had)X
+2520 2640(their)N
+2 f F
+2690(y)X
+1 f F
+2749(coordinates)X
+3142(decreased)X
+3483(by)X
+3586(the)X
+3707(same)X
+3895(amount.)X
+4178(This)X
+2520 2736(shift)N
+2701(is)X
+2793(invisible)X
+3108(to)X
+3210(the)X
+3348(human)X
+3606(eye)X
+3758(because)X
+4053(the)X
+4191(font)X
+2520 2832(de\256nitions)N
+2884(are)X
+3010(in)X
+3099(terms)X
+3304(of)X
+3397(hundreds)X
+3717(of)X
+3810(points)X
+4031(\(see)X
+4187(Fig-)X
+2520 2928(ure)N
+2649(10\).)X
+2802(This)X
+2970(solution)X
+3253(was)X
+3404(designed)X
+3715(to)X
+3804(work)X
+3996(with)X
+4165(most)X
+2520 3024(existing)N
+0 f F
+2794(METAFONT)X
+1 f F
+3155(fonts.)X
+3355(It)X
+3424(is)X
+3497(possible)X
+3779(that)X
+3919(there)X
+4100(will)X
+4244(be)X
+2520 3120(fonts)N
+2700(that)X
+2840(are)X
+2959(not)X
+3081(treated)X
+3320(well)X
+3478(by)X
+3578(this)X
+3713(solution.)X
+3260 3216 MXY
+320
+320
+0.00
+0.00
+40.00
+40.00
+startFig
+%! Simon font
+%%%BoundingBox: 0 0 40 40
+%%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+%% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_letter_x
+(
+gsave
+initclip
+newpath
+0 0 M
+0 1000 L
+1000 1000 L
+1000 0 L
+0 0 L
+%%new path
+ 192 488 0.8 add M
+ 22 -2 0.8 add 44 -2 0.8 add 66 -2 0.8 add c
+ 0 2 0.8 add l
+ 28 0 0.8 add 54 0 0.8 add 82 2 0.8 add c
+ -2 -2 0.8 add l
+-148 0 l
+closepath
+%%end path
+%%erase
+%%new path
+ 404 180 0.8 sub M
+ 146 0 0.8 sub l
+ -22 2 0.8 sub -44 2 0.8 sub -66 2 0.8 sub c
+ 0 -2 0.8 sub l
+-82 0 l
+closepath
+%%end path
+%%erase
+%%new path
+ 410 488 0.8 add M
+ 24 -2 0.8 add 48 -2 0.8 add 72 -2 0.8 add c
+ 0 2 0.8 add l
+ 20 0 0.8 add 38 0 0.8 add 58 2 0.8 add c
+ -2 -2 0.8 add l
+-130 0 l
+closepath
+%%end path
+%%erase
+%%new path
+ 188 180 0.8 sub M
+ 128 0 0.8 sub l
+ -24 2 0.8 sub -48 2 0.8 sub -72 2 0.8 sub c
+ 0 -2 0.8 sub l
+-58 0 l
+closepath
+%%end path
+%%erase
+eoclip
+newpath
+%%new path
+ 280 486 M
+ -2 2 -6 4 -8 4 c
+ 0 -2 l
+ -38 0 l
+ -2 0 -2 0 -4 -2 c
+ 0 -2 l
+ 2 0 l
+ 0 -4 l
+ 76 -100 154 -198 230 -298 c
+ 2 -2 6 -2 8 -2 c
+ 38 0 l
+ 2 0 2 0 4 2 c
+ 0 2 l
+ -2 0 l
+ 0 4 l
+ -76 100 -154 198 -230 298 c
+closepath
+%%end path
+fill
+%%new path
+ 230 180 M
+ 10 0 l
+ 6 0 12 2 16 6 c
+ 0 0 2 2 2 2 c
+ 80 100 160 198 238 298 c
+ 2 0 2 2 2 2 c
+ -2 0 l
+ 0 0 0 0 -2 2 c
+ -2 0 l
+ 0 -2 l
+ -6 0 l
+ -6 0 -12 -2 -16 -6 c
+ 0 0 -2 -2 -2 -2 c
+ -80 -100 -160 -198 -238 -298 c
+ -2 0 -2 -2 -2 -2 c
+closepath
+%%end path
+fill
+%%new path
+ 264 442 M
+ 24 0 l
+ -10 16 -22 32 -32 48 c
+ 0 -2 l
+ -66 0 l
+ 0 -22 l
+ 2 0 l
+ 16 0 34 0 46 -4 c
+ 6 -2 10 -6 16 -10 c
+ 2 -4 6 -8 10 -12 c
+closepath
+%%end path
+fill
+%%new path
+ 314 442 M
+ -2 2 -2 6 -2 8 c
+ 2 0 l
+ 0 4 0 6 4 10 c
+ 6 6 14 8 22 8 c
+ 0 22 l
+ -2 -2 l
+ -80 0 l
+ 10 -16 22 -32 32 -48 c
+ 0 2 l
+ 26 0 l
+closepath
+%%end path
+fill
+%%new path
+ 428 226 M
+ 2 -2 2 -6 2 -8 c
+ -2 0 l
+ 0 -4 0 -6 -4 -10 c
+ -6 -6 -14 -8 -22 -8 c
+ 0 -20 l
+ 82 0 l
+ -10 16 -22 32 -32 48 c
+ 0 -2 l
+-26 0 l
+closepath
+%%end path
+fill
+%%new path
+ 478 226 M
+ -24 0 l
+ 10 -16 22 -32 32 -46 c
+ 66 0 l
+ 0 22 l
+ -2 0 l
+ -16 0 -34 0 -46 4 c
+ -6 2 -10 6 -16 10 c
+ -2 4 -6 8 -10 12 c
+closepath
+%%end path
+fill
+%%new path
+ 422 422 M
+ 12 0 l
+ 16 22 32 46 48 68 c
+ -2 -2 l
+ -72 0 l
+ 0 -22 l
+ 2 0 l
+ 6 0 12 -2 16 -6 c
+ 2 -2 4 -6 4 -10 c
+ 2 -2 2 -4 2 -6 c
+ -2 0 l
+ 0 -8 -4 -18 -10 -24 c
+closepath
+%%end path
+fill
+%%new path
+ 446 422 M
+ 2 4 6 8 10 12 c
+ 8 8 20 16 32 22 c
+ 16 8 34 12 52 12 c
+ 0 22 l
+ -2 -2 l
+ -58 0 l
+ -16 -22 -32 -46 -48 -68 c
+ 2 2 l
+ 12 0 l
+closepath
+%%end path
+fill
+%%new path
+ 280 246 M
+ -2 -4 -6 -8 -10 -12 c
+ -8 -8 -20 -16 -32 -22 c
+ -16 -8 -34 -12 -52 -12 c
+ 0 -20 l
+ 60 0 l
+ 16 22 32 46 48 68 c
+ -2 -2 l
+-12 0 l
+closepath
+%%end path
+fill
+%%new path
+ 304 246 M
+ -12 0 l
+ -16 -22 -32 -46 -48 -66 c
+ 74 0 l
+ 0 22 l
+ -2 0 l
+ -6 0 -12 2 -16 6 c
+ -2 2 -4 6 -4 10 c
+ -2 2 -2 4 -2 6 c
+ 2 0 l
+ 0 8 4 18 10 24 c
+closepath
+%%end path
+fill
+grestore
+) def
+
+end % of CharDefs dictionary
+
+Encoding 120 /The_letter_x put
+
+Metrics
+ begin
+/The_letter_x 367 fudge add def
+/.notdef 0 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /M {moveto} def
+ /L {lineto} def
+ /l {rlineto} def
+ /C {curveto} def
+ /c {rcurveto} def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -186 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [186 fudge sub 180 552 490] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 40 scalefont setfont
+ 0 0 moveto (x) show
+endFig
+3265 3680(Figure)N
+3494(10)X
+3 f F
+2520 3936(4.6)N
+2680(Optimization.)X
+1 f F
+3210(Optimization)X
+3669(is)X
+3759(done)X
+3952(in)X
+4051(order)X
+4258(to)X
+2520 4032(make)N
+2728(the)X
+2860(description)X
+3250(of)X
+3351(the)X
+3483(fonts)X
+3677(shorter)X
+3933(and)X
+4082(to)X
+4177(save)X
+2520 4128(work)N
+2724(in)X
+2825(the)X
+2962(P)X
+8 s 8 xH F
+3006(OST)X
+10 s 10 xH F
+3127(S)X
+8 s 8 xH F
+3171(CRIPT)X
+10 s 10 xH F
+3392(interpreter.)X
+3787(This)X
+3969(is)X
+4062(done)X
+4258(in)X
+2520 4224(three)N
+2701(ways:)X
+2583 4368(1.)N
+2679(not)X
+2817(printing)X
+3106(lines)X
+3293(with)X
+3471(length)X
+3707(zero.)X
+3903(As)X
+4029(was)X
+4191(said)X
+2679 4464(earlier,)N
+2929(the)X
+0 f F
+3051(METAFONT)X
+1 f F
+3416(program)X
+3712(prints)X
+3918(lines)X
+4092(to)X
+4177(con-)X
+2679 4560(nect)N
+2834(o)X
+(ff)138 606 oc
+2922(set)X
+3032(points.)X
+3268(There)X
+3478(are)X
+3599(times)X
+3794(that)X
+3936(after)X
+4106(round-)X
+2679 4656(ing)N
+2818(or)X
+2922(truncating)X
+3284(the)X
+3418(output)X
+3658(data,)X
+3848(the)X
+3982(start)X
+4156(point)X
+2679 4752(and)N
+2815(the)X
+2933(end)X
+3069(point)X
+3253(are)X
+3372(equal.)X
+3586(In)X
+3673(such)X
+3840(cases,)X
+4050(the)X
+4169(lines)X
+2679 4848(are)N
+2798(eliminated.)X
+2583 4992(2.)N
+2679(checking)X
+2999(if)X
+3078(the)X
+3206(Be)X
+3264(\302zier)X
+3447(curve)X
+3656(acts)X
+3811(as)X
+3909(a)X
+3976(line.)X
+4147(From)X
+2679 5088(the)N
+2803(de\256nition)X
+3135(of)X
+3227(the)X
+3350(Be)X
+3408(\302zier)X
+3586(curve,)X
+3810(it)X
+3879(is)X
+3957(known)X
+4200(that)X
+2679 5184(if)N
+2759(the)X
+2888(two)X
+3039(control)X
+3297(points)X
+3523(lie)X
+3634(on)X
+3745(the)X
+3874(line)X
+4025(that)X
+4177(con-)X
+2679 5280(nects)N
+2868(the)X
+2990(start)X
+3151(point)X
+3338(and)X
+3477(the)X
+3598(end)X
+3737(point,)X
+3944(the)X
+4065(curve)X
+4267(is)X
+2679 5376(of)N
+2781(degree)X
+3031(one.)X
+3202(In)X
+3304(such)X
+3486(cases)X
+9 f F
+3693(mf2ps)X
+1 f F
+3945(generates)X
+4284(a)X
+2679 5472(command)N
+3019(to)X
+3105(print)X
+3280(a)X
+3340(line)X
+3484(from)X
+3664(the)X
+3786(start)X
+3948(point)X
+4136(to)X
+4222(the)X
+2679 5568(end)N
+2825(point,)X
+3039(thus)X
+3202(saving)X
+3442(space)X
+3652(and)X
+3799(avoiding)X
+4110(redun-)X
+2679 5664(dant)N
+2837(calculations)X
+3240(for)X
+3354(the)X
+3472(P)X
+8 s 8 xH F
+3516(OST)X
+10 s 10 xH F
+3637(S)X
+8 s 8 xH F
+3681(CRIPT)X
+10 s 10 xH F
+3883(interpreter.)X
+2445 6084(11)N
+
+%%Page: 11 12
+11 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+1 f F
+639 672(3.)N
+735(checking)X
+1056(if)X
+1136(a)X
+1203(series)X
+1417(of)X
+1515(consecutive)X
+1926(line)X
+2078(segments)X
+735 768(are)N
+865(in)X
+958(the)X
+1087(same)X
+1283(line.)X
+1474(This)X
+1647(is)X
+1730(done)X
+1916(by)X
+2026(storing)X
+2278(the)X
+735 864(segments)N
+1060(in)X
+1149(a)X
+1212(bu)X
+(ff)138 606 oc
+1340(er)X
+1430(and)X
+1573(checking)X
+1891(whether)X
+2178(a)X
+2242(new)X
+735 960(segment)N
+1022(is)X
+1095(collinear)X
+1396(with)X
+1558(the)X
+1676(last)X
+1807(stored.)X
+3 f F
+576 1152(4.7)N
+736(Changed)X
+1071(or)X
+1176(added)X
+1413(routines.)X
+1 f F
+1762(The)X
+1916(following)X
+2257(is)X
+2340(a)X
+576 1248(list)N
+701(of)X
+796(routines)X
+1082(that)X
+1230(were)X
+1415(changed)X
+1711(or)X
+1806(added)X
+2026(in)X
+2116(order)X
+2314(to)X
+576 1344(build)N
+9 f F
+762(mf2ps)X
+1 f F
+999(from)X
+0 f F
+1175(METAFONT)X
+1 f F
+1516(.)X
+2 f F
+672 1488(printchar)N
+1 f F
+994(was)X
+1139(modi\256ed)X
+1443(to)X
+1525(get)X
+1643(character)X
+1959(names.)X
+2 f F
+672 1632(\256xdateandtime)N
+1 f F
+1182(was)X
+1345(modi\256ed)X
+1667(to)X
+1767(initialize)X
+2086(variables)X
+672 1728(that)N
+812(were)X
+989(used)X
+1156(as)X
+1243(\257ags)X
+1414(in)X
+1496(the)X
+1614(macros.)X
+2 f F
+672 1872(\256llspec)N
+1 f F
+919(was)X
+1064(modi\256ed)X
+1368(to)X
+1450(send)X
+1617(out)X
+1739(data)X
+1893(on)X
+1993(splines.)X
+2 f F
+672 2016(skewlineedges)N
+1 f F
+1151(was)X
+1296(modi\256ed)X
+1600(to)X
+1682(send)X
+1849(out)X
+1971(o)X
+(ff)138 606 oc
+2059(set)X
+2168(lines.)X
+2 f F
+672 2160(dualmoves)N
+1 f F
+1035(was)X
+1180(modi\256ed)X
+1484(to)X
+1566(send)X
+1733(out)X
+1855(o)X
+(ff)138 606 oc
+1943(set)X
+2052(lines.)X
+2 f F
+672 2304(\256llenvelope)N
+1 f F
+1099(was)X
+1281(modi\256ed)X
+1622(to)X
+1741(send)X
+1945(out)X
+2104(data)X
+2296(on)X
+672 2400(splines.)N
+2 f F
+672 2544(dostatement)N
+1 f F
+1083(was)X
+1232(modi\256ed)X
+1540(to)X
+1626(identify)X
+1899(tokens)X
+2132(that)X
+2277(are)X
+672 2640(strings.)N
+2 f F
+672 2784(main)N
+1 f F
+864(was)X
+1021(modi\256ed)X
+1337(to)X
+1431(call)X
+1579(the)X
+9 f F
+1711(mf2ps)X
+1 f F
+1960(procedure)X
+2314(in)X
+672 2880(the)N
+790(beginning)X
+1130(and)X
+1266(ending)X
+1504(of)X
+1591(the)X
+1709(program.)X
+2 f F
+672 3024(sendcurve)N
+1 f F
+1020(was)X
+1167(added)X
+1381(to)X
+1465(unskew)X
+1733(spline)X
+1947(values)X
+2175(and)X
+2314(to)X
+672 3120(send)N
+839(them)X
+1019(to)X
+1101(the)X
+1219(next)X
+1377(process.)X
+2 f F
+672 3264(sendline)N
+1 f F
+977(was)X
+1140(added)X
+1371(to)X
+1472(unskew)X
+1756(line)X
+1915(values)X
+2159(and)X
+2314(to)X
+672 3360(send)N
+839(them)X
+1019(to)X
+1101(the)X
+1219(next)X
+1377(process.)X
+2 f F
+672 3504(ok)N
+1 f F
+768(was)X
+913(added)X
+1125(to)X
+1207(check)X
+1415(if)X
+1484(two)X
+1624(lines)X
+1795(are)X
+1914(collinear.)X
+2 f F
+672 3648(restore)N
+1 f F
+931(was)X
+1089(added)X
+1314(to)X
+1409(restore)X
+1661(the)X
+1792(parameters)X
+2178(of)X
+2278(the)X
+672 3744(last)N
+803(line.)X
+2 f F
+672 3888(recall)N
+1 f F
+879(was)X
+1024(added)X
+1236(to)X
+1318(recall)X
+1517(values)X
+1742(from)X
+1918(the)X
+2036(bu)X
+(ff)138 606 oc
+2164(er.)X
+2 f F
+672 4032(us)N
+1 f F
+767(was)X
+916(added)X
+1132(to)X
+1219(convert)X
+1485(the)X
+0 f F
+1608(METAFONT)X
+1 f F
+1974(scale)X
+2160(so)X
+2256(that)X
+672 4128(a)N
+744(letter)X
+945(would)X
+1181(\256t)X
+1283(the)X
+1416(Adobe)X
+1665(standard)X
+1972(1000)X
+47 f F
+2152(\264)X
+1 f F
+2216(1000)X
+672 4224(bounding)N
+994(box.)X
+2 f F
+672 4368(send_p_s)N
+1 f F
+999(was)X
+1153(added)X
+1375(to)X
+1467(create)X
+1690(a)X
+1756(P)X
+8 s 8 xH F
+1800(OST)X
+10 s 10 xH F
+1921(S)X
+8 s 8 xH F
+1965(CRIPT)X
+10 s 10 xH F
+2177(\256le)X
+2309(of)X
+672 4464(lines)N
+843(and)X
+979(curves.)X
+2 f F
+672 4608(makemoves)N
+1 f F
+1063(was)X
+1208(modi\256ed)X
+1512(to)X
+1594(send)X
+1761(out)X
+1883(spline)X
+2094(data.)X
+2 f F
+672 4752(dump)N
+1 f F
+872(was)X
+1019(added)X
+1233(to)X
+1318(append)X
+1573(information)X
+1974(from)X
+2153(the)X
+2274(\256le)X
+672 4848(named)N
+5 f F
+906(f)X
+1 f F
+974(to)X
+1056(the)X
+1174(\256le)X
+1296(named)X
+5 f F
+1530(g)X
+1 f F
+(.)S
+2 f F
+672 4992(checkerase)N
+1 f F
+1061(was)X
+1218(added)X
+1442(to)X
+1536(identify)X
+1817(the)X
+1947(\256le)X
+2081(that)X
+2233(con-)X
+672 5088(tains)N
+861(\252erase\272)X
+1137(commands,)X
+1541(and)X
+1694(their)X
+1878(position)X
+2172(within)X
+672 5184(the)N
+790(\256le.)X
+2 f F
+672 5328(doarrange)N
+1 f F
+1051(was)X
+1217(added)X
+1450(to)X
+1553(put)X
+1696(erasing)X
+1969(paths)X
+2179(at)X
+2278(the)X
+672 5424(beginning)N
+1012(of)X
+1099(the)X
+1217(\256le.)X
+2 f F
+672 5568(print_start)N
+1 f F
+1047(was)X
+1206(added)X
+1432(to)X
+1528(signal)X
+1753(the)X
+1885(beginning)X
+2239(of)X
+2340(a)X
+672 5664(new)N
+826(cyclic)X
+1038(path)X
+1196(to)X
+1278(be)X
+1374(processed.)X
+2 f F
+2616 672(print_end)N
+1 f F
+2951(was)X
+3100(added)X
+3316(to)X
+3402(signal)X
+3617(the)X
+3739(end)X
+3879(of)X
+3970(the)X
+4092(current)X
+2616 768(cyclic)N
+2828(path.)X
+2 f F
+2616 912(init_ps)N
+1 f F
+2853(was)X
+2998(added)X
+3210(to)X
+3292(make)X
+3486(initializations.)X
+2 f F
+2616 1056(makenewdef)N
+1 f F
+3037(was)X
+3186(added)X
+3402(to)X
+3488(make)X
+3686(initializations)X
+4146(when)X
+2616 1152(more)N
+2801(than)X
+2959(one)X
+3095(character)X
+3411(occurs)X
+3641(in)X
+3723(the)X
+3841(input.)X
+2 f F
+2616 1296(closeolddef)N
+1 f F
+3001(was)X
+3146(added)X
+3358(to)X
+3440(close)X
+3625(the)X
+3743(last)X
+3874(de\256nition.)X
+2 f F
+2616 1440(tini_ps)N
+1 f F
+2864(was)X
+3020(added)X
+3243(to)X
+3336(handle)X
+3581(the)X
+3710(ending)X
+3959(of)X
+4057(the)X
+4186(pro-)X
+2616 1536(cess.)N
+2 f F
+2616 1680(auxprintchar)N
+1 f F
+3054(was)X
+3199(added)X
+3411(to)X
+3493(print)X
+3664(characters.)X
+2 f F
+2616 1824(auxprint)N
+1 f F
+2907(was)X
+3052(added)X
+3264(to)X
+3346(print)X
+3517(strings.)X
+3 f F
+2520 2016(5)N
+2620(Operation)X
+2991(of)X
+9 f F
+3080(mf2ps)X
+3 f F
+3317(in)X
+3403(a)X
+9 f F
+3465(U)X
+8 s 8 xH F
+3523(NIX)X
+10 s 10 xH 3 f F
+3650(environment)X
+1 f F
+2520 2160(When)N
+2758(invoked,)X
+9 f F
+3084(mf2ps)X
+1 f F
+3347(\256rst)X
+3518(asks)X
+3703(for)X
+3844(an)X
+3967(output)X
+4218(\256le)X
+2520 2256(name.)N
+2746(For)X
+2888(the)X
+3017(example)X
+3320(this)X
+3466(\256le)X
+3599(is)X
+3683(called)X
+5 f F
+3906(ex1)X
+1 f F
+(.)S
+9 f F
+4103(mf2ps)X
+1 f F
+2520 2352(then)N
+2678(asks,)X
+5 f F
+2679 2544(\252Are)N
+2919(you)X
+3111(creating)X
+3543(the)X
+3735(whole)X
+4023(dic-)X
+2679 2640(tionary)N
+3063(\(y/n\)?\272.)X
+1 f F
+2520 2832(If)N
+2600(the)X
+2724(answer)X
+2978(is)X
+3057(other)X
+3248(than)X
+3413(\252)X
+5 f F
+3449(y)X
+1 f F
+(\272)S
+3560(or)X
+3654(\252)X
+5 f F
+3690(Y)X
+1 f F
+(\272,)S
+3821(it)X
+3892(is)X
+3972(considered)X
+2520 2928(\252)N
+5 f F
+2556(no)X
+1 f F
+(\272.)S
+2735(If)X
+2816(the)X
+2941(answer)X
+3196(is)X
+3276(\252)X
+5 f F
+3312(y)X
+1 f F
+(\272)S
+3423(or)X
+3517(\252)X
+5 f F
+3553(Y)X
+1 f F
+(\272,)S
+3684(then)X
+3849(the)X
+3973(whole)X
+4195(dic-)X
+2520 3024(tionary)N
+2787(is)X
+2880(created.)X
+3173(This)X
+3355(means)X
+3600(that)X
+9 f F
+3762(mf2ps)X
+1 f F
+4019(creates)X
+4284(a)X
+2520 3120(P)N
+8 s 8 xH F
+2564(OST)X
+10 s 10 xH F
+2685(S)X
+8 s 8 xH F
+2729(CRIPT)X
+10 s 10 xH F
+2942(dictionary)X
+3297(that)X
+3447(includes)X
+3744(entries)X
+3988(for)X
+4112(all)X
+4222(the)X
+2520 3216(characters)N
+2878(that)X
+3029(are)X
+3159(in)X
+3252(the)X
+3381(input,)X
+3597(e.g.,)X
+5 f F
+3765(cmr10)X
+1 f F
+4037(set.)X
+4178(This)X
+2520 3312(dictionary)N
+2873(needs)X
+3083(additional)X
+3430(de\256nitions)X
+3794(such)X
+3968(as)X
+2 f F
+4062(left)X
+4191(side)X
+2520 3408(bearing,)N
+2827(width,)X
+3063(bounding)X
+3404(box)X
+1 f F
+3520(,)X
+3579(etc.)X
+3752(These)X
+3983(de\256nitions)X
+2520 3504(need)N
+2693(information)X
+3092(on)X
+3193(character)X
+3510(features)X
+3786(that)X
+3927(must)X
+4103(be)X
+4199(cal-)X
+2520 3600(culated)N
+2781(within)X
+3014(the)X
+3141(program.)X
+3462(Otherwise,)X
+3841(the)X
+3969(whole)X
+4195(dic-)X
+2520 3696(tionary)N
+2777(is)X
+2860(not)X
+2991(created)X
+3253(and)X
+3398(the)X
+3525(program)X
+3826(treats)X
+4029(the)X
+4156(input)X
+2520 3792(as)N
+2618(a)X
+2685(single)X
+2907(character)X
+3234(de\256nition)X
+3571(that)X
+3722(is)X
+3806(to)X
+3900(be)X
+4008(translated)X
+2520 3888(into)N
+2693(a)X
+2778(P)X
+8 s 8 xH F
+2822(OST)X
+10 s 10 xH F
+2943(S)X
+8 s 8 xH F
+2987(CRIPT)X
+10 s 10 xH F
+3218(outline)X
+3489(de\256nition.)X
+3883(After)X
+9 f F
+4103(mf2ps)X
+1 f F
+2520 3984(prompts)N
+2815(\252)X
+5 f F
+2851(**)X
+1 f F
+(\272,)S
+3036(we)X
+3163(are)X
+3295(in)X
+3390(the)X
+0 f F
+3521(METAFONT)X
+1 f F
+3895(environment.)X
+2520 4080(Now)N
+2696(the)X
+2814(user)X
+2968(inputs)X
+9 s 9 xH 5 f F
+2679 4272(\\mode=hires;\\nodisplays;\\input)N
+4012(cmr10;)X
+47 f F
+4270(\277)X
+10 s 10 xH 1 f F
+2520 4464(After)N
+9 f F
+2735(mf2ps)X
+1 f F
+2995(has)X
+3146(\256nished,)X
+3463(the)X
+3605(resulting)X
+3929(P)X
+8 s 8 xH F
+3973(OST)X
+10 s 10 xH F
+4094(S)X
+8 s 8 xH F
+4138(CRIPT)X
+10 s 10 xH F
+2520 4560(font)N
+2685(dictionary)X
+3046(can)X
+3194(be)X
+3306(used)X
+3489(to)X
+3587(print)X
+3774(text.)X
+3950(In)X
+4053(order)X
+4258(to)X
+2520 4656(print)N
+2712(text,)X
+2894(the)X
+3034(font)X
+3205(dictionary)X
+3572(should)X
+3827(be)X
+3945(installed)X
+4258(in)X
+2520 4752(some)N
+2716(formatter's)X
+3100(font)X
+3256(source)X
+3493(directory,)X
+3830(and)X
+3973(then)X
+4138(it)X
+4208(can)X
+2520 4848(be)N
+2623(loaded)X
+2864(through)X
+3140(the)X
+3265(formatter's)X
+3649(commands.)X
+4043(The)X
+4195(dic-)X
+2520 4944(tionary)N
+2776(followed)X
+3090(by)X
+3199(appropriate)X
+9 f F
+3596(show)X
+1 f F
+3811(and)X
+9 f F
+3958(showpage)X
+1 f F
+2520 5040(commands)N
+2887(can)X
+3019(also)X
+3168(be)X
+3264(sent)X
+3413(directly)X
+3678(to)X
+3760(the)X
+3878(printer.)X
+3 f F
+2520 5232(6)N
+2620(Evaluation)X
+3012(of)X
+3099(results)X
+1 f F
+2520 5376(This)N
+2696(section)X
+2957(evaluates)X
+3290(the)X
+9 f F
+3424(mf2ps)X
+1 f F
+3675(program)X
+3982(relative)X
+4258(to)X
+2520 5472(goals)N
+2716(established)X
+3099(in)X
+3187(section)X
+3440(3.2.)X
+3586(The)X
+3737(program)X
+4035(was)X
+4186(pro-)X
+2520 5568(duced)N
+2745(as)X
+2845(a)X
+2914(variation)X
+3232(of)X
+0 f F
+3332(METAFONT)X
+1 f F
+3706(and)X
+3855(it)X
+3933(accepts)X
+4204(any)X
+0 f F
+2520 5664(METAFONT)N
+1 f F
+2893(font)X
+3054(de\256nition)X
+3392(and)X
+3540(produces)X
+3862(a)X
+3929(P)X
+8 s 8 xH F
+3973(OST)X
+10 s 10 xH F
+4094(S)X
+8 s 8 xH F
+4138(CRIPT)X
+10 s 10 xH F
+2445 6084(12)N
+
+%%Page: 12 13
+12 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+1 f F
+576 672(outline)N
+822(font)X
+975(scaleable)X
+1294(up)X
+1398(to)X
+1484(magni\256cation)X
+1948(8,)X
+2033(or)X
+2125(to)X
+2212(point)X
+576 768(size)N
+725(80)X
+829(if)X
+902(you)X
+1046(are)X
+1169(not)X
+1295(a)X
+1355(purist.)X
+1581(Thus)X
+1765(goals)X
+1958(6)X
+2022(and)X
+2161(1)X
+2224(have)X
+576 864(been)N
+756(entirely)X
+1029(met)X
+1177(and)X
+1321(goal)X
+1487(2)X
+1555(is)X
+1637(partially)X
+1933(met.)X
+2102(To)X
+2220(meet)X
+576 960(goal)N
+753(2)X
+832(fully)X
+1022(the)X
+1159(program)X
+1469(must)X
+1662(be)X
+1776(modi\256ed)X
+2098(to)X
+2198(allow)X
+576 1056(large)N
+782(enough)X
+1063(arrays)X
+1305(to)X
+1412(handle)X
+1671(magni\256cations)X
+2188(up)X
+2314(to)X
+576 1152(7200;)N
+778(this)X
+913(is)X
+986(left)X
+1113(to)X
+1195(future)X
+1407(work.)X
+735 1248(It)N
+810(remains)X
+1090(to)X
+1178(evaluate)X
+1472(the)X
+1596(appearance)X
+1985(and)X
+2127(sizes)X
+2309(of)X
+576 1344(the)N
+695(outline)X
+938(fonts)X
+1119(relative)X
+1381(to)X
+1464(the)X
+1583(bitmapped)X
+1942(fonts)X
+2122(to)X
+2204(see)X
+2327(if)X
+576 1440(goals)N
+765(3,)X
+845(4,)X
+925(and)X
+1061(5)X
+1121(have)X
+1293(been)X
+1465(met.)X
+3 f F
+576 1632(6.1)N
+736(Appearance.)X
+1 f F
+1229(In)X
+1335(order)X
+1544(to)X
+1645(compare)X
+1962(appearances,)X
+576 1728(the)N
+705(outline)X
+958(font)X
+1118(\(Subsub\256gure)X
+1598(P\))X
+1700(and)X
+1847(and)X
+1994(the)X
+2123(300)X
+2274(dpi)X
+576 1824(bitmapped)N
+950(font)X
+1115(\(Subsub\256gure)X
+1600(M\))X
+1735(generated)X
+2085(from)X
+2278(the)X
+576 1920(same)N
+0 f F
+763(METAFONT)X
+1 f F
+1126(de\256nition)X
+1454(are)X
+1575(used)X
+1744(to)X
+1827(print)X
+1999(similar)X
+2242(sen-)X
+576 2016(tences)N
+844(at)X
+970(one,)X
+1174(two,)X
+1382(or)X
+1517(three)X
+1746(di)X
+1808 MX
+(ff)138 606 oc
+1856(erent)X
+2085(sizes)X
+2309(or)X
+576 2112(magni\256cations)N
+1070(on)X
+1173(three)X
+1356(devices)X
+1619(of)X
+1708(di)X
+1770 MX
+(ff)138 606 oc
+1818(ering)X
+2005(resolutions.)X
+576 2208(The)N
+738(sentences)X
+1083(are)X
+1219(printed)X
+1483(in)X
+1582(the)X
+5 f F
+1718(cmr)X
+1 f F
+1900(\(Sub\256gure)X
+2276(R\),)X
+5 f F
+576 2304(cmtt)N
+1 f F
+845(\(Sub\256gure)X
+1259(T\),)X
+1431(and)X
+5 f F
+1623(lasy)X
+1 f F
+1891(\(Sub\256gure)X
+2305(S\))X
+576 2400(typefaces.)N
+967(The)X
+1139(bitmapped)X
+1525(fonts)X
+1733(may)X
+1919(be)X
+2043(printed)X
+2318(at)X
+576 2496(design)N
+814(sizes)X
+999(7,)X
+1088(8,)X
+1177(10,)X
+1306(or)X
+1402(12,)X
+1530(and)X
+1674(the)X
+1800(outline)X
+2050(fonts)X
+2238(may)X
+576 2592(be)N
+678(printed)X
+931(at)X
+1015(magni\256cations)X
+1512(.7,)X
+1618(.8,)X
+1724(1.0,)X
+1870(or)X
+1963(1.2.)X
+2130(Finally,)X
+576 2688(the)N
+700(three)X
+887(devices)X
+1153(are)X
+1277(the)X
+1400(300)X
+1545(dpi)X
+1672(LaserWriterII)X
+2140(\(Figure)X
+576 2784(11-LW300\),)N
+1001(the)X
+1125(600)X
+1271(dpi)X
+1399(Varityper)X
+1733(\(Figure)X
+1995(11-VT600\),)X
+576 2880(and)N
+724(the)X
+853(1270)X
+1044(dpi)X
+1177(Linotronic)X
+1546(300)X
+1697(\(Figure)X
+1964(11-LT1270\).)X
+576 2976(The)N
+731(bitmapped)X
+1099(font)X
+1258(examples)X
+1591(are)X
+1720(formatted)X
+2063(with)X
+2236(T)X
+2277 2992(E)N
+2318 2976(X)N
+576 3072(while)N
+784(the)X
+912(outline)X
+1164(font)X
+1323(examples)X
+1656(are)X
+1785(hand-coded)X
+2190(P)X
+8 s 8 xH F
+2234(OST-)X
+10 s 10 xH F
+576 3168(S)N
+8 s 8 xH F
+620(CRIPT)X
+10 s 10 xH F
+832(\256les)X
+995(sent)X
+1154(directly)X
+1430(to)X
+1523(the)X
+1652(printer.)X
+1917(Since)X
+2126(the)X
+2255(for-)X
+576 3264(matter)N
+802(with)X
+965(which)X
+1182(this)X
+1318(paper)X
+1518(is)X
+1592(printed)X
+1840(can)X
+1972(use)X
+2099(arbitrary)X
+576 3360(P)N
+8 s 8 xH F
+620(OST)X
+10 s 10 xH F
+741(S)X
+8 s 8 xH F
+785(CRIPT)X
+10 s 10 xH F
+1010(fonts,)X
+1233(half)X
+1402(of)X
+1513(the)X
+1655(examples)X
+2002(could)X
+2224(have)X
+576 3456(been)N
+751(done)X
+930(in-line)X
+1161(without)X
+1427(pasting)X
+1680(in.)X
+1784(However,)X
+2121(for)X
+2237(fair-)X
+576 3552(ness)N
+742(in)X
+832(the)X
+958(comparison,)X
+1380(all)X
+1488(examples)X
+1819(were)X
+2004(cut)X
+2130(out)X
+2260(and)X
+576 3648(pasted)N
+801(in.)X
+735 3744(There)N
+951(are)X
+1078(visible)X
+1319(di)X
+1381 MX
+(ff)138 606 oc
+1429(erences)X
+1699(due)X
+1843(to)X
+1933(di)X
+1995 MX
+(ff)138 606 oc
+2043(erences)X
+2314(in)X
+576 3840(the)N
+697(formatting)X
+1057(software.)X
+1376(T)X
+1417 3856(E)N
+1458 3840(X)N
+1538(squeezes)X
+1846(the)X
+1966(letters)X
+2184(closer)X
+576 3936(together)N
+871(than)X
+1041(does)X
+1220(the)X
+1350(P)X
+8 s 8 xH F
+1394(OST)X
+10 s 10 xH F
+1515(S)X
+8 s 8 xH F
+1559(CRIPT)X
+10 s 10 xH F
+1773(engine.)X
+2039(Moreover,)X
+576 4032(the)N
+701(interword)X
+1040(space)X
+1246(is)X
+1326(constant)X
+1620(in)X
+1709(the)X
+1834(P)X
+8 s 8 xH F
+1878(OST)X
+10 s 10 xH F
+1999(S)X
+8 s 8 xH F
+2043(CRIPT)X
+10 s 10 xH F
+2251(dic-)X
+576 4128(tionary)N
+824(but)X
+947(is)X
+1021(varied)X
+1244(by)X
+1346(T)X
+1387 4144(E)N
+1428 4128(X)N
+1508(according)X
+1847(to)X
+1931(the)X
+2051(line)X
+2193(struc-)X
+576 4224(ture.)N
+769(These)X
+989(di)X
+1051 MX
+(ff)138 606 oc
+1099(erences)X
+1369(are)X
+1496(not)X
+1626(the)X
+1751(di)X
+1813 MX
+(ff)138 606 oc
+1861(erences)X
+2130(that)X
+2277(are)X
+576 4320(at)N
+654(issue)X
+834(here.)X
+735 4416(On)N
+855(the)X
+975(300)X
+1117(dpi)X
+1241(device,)X
+1494(the)X
+1615(characters)X
+1965(from)X
+2144(the)X
+2265(bit-)X
+576 4512(mapped)N
+854(fonts)X
+1038(print)X
+1213(thinner)X
+1464(than)X
+1626(are)X
+1749(those)X
+1942(of)X
+2033(the)X
+2154(outline)X
+576 4608(fonts.)N
+801(However,)X
+1161(the)X
+1304(edges)X
+1532(of)X
+1644(both)X
+1831(sets)X
+1996(are)X
+2140(equally)X
+576 4704(smooth)N
+856(or)X
+968(jagged)X
+1227(as)X
+1339(the)X
+1482(case)X
+1666(may)X
+1849(be)X
+1970(in)X
+2076(all)X
+2200(sizes.)X
+576 4800(Overall,)N
+869(then,)X
+1060(the)X
+1191(appearance)X
+1587(of)X
+1687(the)X
+1818(characters)X
+2178(of)X
+2278(the)X
+576 4896(bitmapped)N
+937(fonts)X
+1120(is)X
+1196(crisper)X
+1438(than)X
+1599(that)X
+1742(of)X
+1832(the)X
+1952(outline)X
+2196(fonts.)X
+576 4992(On)N
+697(the)X
+818(higher)X
+1047(resolution)X
+1391(devices,)X
+1676(the)X
+1798(thicknesses)X
+2187(of)X
+2278(the)X
+576 5088(characters)N
+934(are)X
+1064(closer)X
+1287(to)X
+1380(being)X
+1588(equal)X
+1792(at)X
+1880(all)X
+1990(sizes.)X
+2196(Thus,)X
+576 5184(the)N
+0 f F
+702(METAFONT)X
+1 f F
+1071(program)X
+1371(does)X
+1546(a)X
+1610(better)X
+1821(job)X
+1951(of)X
+2046(building)X
+2340(a)X
+576 5280(correctly)N
+887(sized)X
+1077(bitmap)X
+1323(at)X
+1405(300)X
+1549(dpi)X
+1675(than)X
+1837(does)X
+2008(the)X
+2130(300)X
+2274(dpi)X
+576 5376(P)N
+8 s 8 xH F
+620(OST)X
+10 s 10 xH F
+741(S)X
+8 s 8 xH F
+785(CRIPT)X
+10 s 10 xH F
+1013(engine)X
+1273(of)X
+1386(the)X
+1530(LaserWriterII.)X
+2039(The)X
+2211(latter)X
+576 5472(seems)N
+805(to)X
+900(round)X
+1120(up)X
+1232(too)X
+1366(much.)X
+1596(However,)X
+1943(both)X
+2117(seem)X
+2314(to)X
+576 5568(get)N
+696(the)X
+816(edges)X
+1022(equally)X
+1281(smooth)X
+1539(even)X
+1714(at)X
+1795(low)X
+1938(sizes)X
+2117(and)X
+2256(low)X
+576 5664(resolutions.)N
+2679 672(At)N
+2782(the)X
+2903(two)X
+3046(higher)X
+3274(resolutions,)X
+3669(the)X
+3791(outline)X
+4037(fonts)X
+4221(are)X
+2520 768(signi\256cantly)N
+2941(better)X
+3150(than)X
+3313(the)X
+3436(outline)X
+3683(fonts)X
+3868(at)X
+3951(lower)X
+4159(reso-)X
+2520 864(lutions)N
+2767(and)X
+2914(are)X
+3044(signi\256cantly)X
+3470(better)X
+3684(than)X
+3853(the)X
+3982(bitmapped)X
+2520 960(fonts)N
+2709(at)X
+2796(the)X
+2923(same)X
+3117(resolution)X
+3466(of)X
+3561(printing.)X
+3862(However,)X
+4205(this)X
+2520 1056(latter)N
+2723(is)X
+2814(true)X
+2977(because)X
+3270(the)X
+3406(bitmapped)X
+3782(fonts)X
+3981(were)X
+4177(gen-)X
+2520 1152(erated)N
+2762(by)X
+2886(the)X
+0 f F
+3028(METAFONT)X
+1 f F
+3413(program)X
+3729(speci\256cally)X
+4138(to)X
+4244(be)X
+2520 1248(printed)N
+2777(at)X
+2865(300)X
+3015(dpi.)X
+3187(When)X
+3409(a)X
+3476(300-dpi)X
+3756(bitmap)X
+4009(is)X
+4093(printed)X
+2520 1344(with)N
+2684(no)X
+2786(scaling)X
+3035(at)X
+3115(600)X
+3257(or)X
+3346(1270)X
+3528(dpi,)X
+3672(it)X
+3738(remains)X
+4014(a)X
+4071(300-dpi)X
+2520 1440(bitmap.)N
+2785(As)X
+2898(expected,)X
+3228(the)X
+3350(300-dpi)X
+3623(bitmapped)X
+3985(fonts)X
+4169(print)X
+2520 1536(better)N
+2729(at)X
+2813(300)X
+2958(dpi)X
+3085(than)X
+3248(they)X
+3411(do)X
+3516(at)X
+3599(the)X
+3722(two)X
+3867(higher)X
+4097(resolu-)X
+2520 1632(tions.)N
+2679 1728(The)N
+2825(generated)X
+3159(outlines)X
+3434(are)X
+3555(not)X
+3679(\256ne-tuned)X
+4026(for)X
+4142(print-)X
+2520 1824(ing)N
+2641(at)X
+2718(low)X
+2857(resolutions,)X
+3247(such)X
+3413(as)X
+3499(300)X
+3638(dpi,)X
+3779(as)X
+3865(are)X
+3984(the)X
+0 f F
+4102(META-)X
+2520 1920(FONT)N
+1 f F
+2685(-generated)X
+3046(bitmaps.)X
+3340(It)X
+3410(might)X
+3617(be)X
+3715(useful)X
+3933(to)X
+4017(make)X
+4213(use)X
+2520 2016(of)N
+2615(the)X
+2741(P)X
+8 s 8 xH F
+2785(OST)X
+10 s 10 xH F
+2906(S)X
+8 s 8 xH F
+2950(CRIPT)X
+10 s 10 xH F
+3160(facilities)X
+3464(for)X
+3586(hinting)X
+3839(to)X
+3928(improve)X
+4222(the)X
+2520 2112(appearance)N
+2913(of)X
+3010(the)X
+3138(characters)X
+3495(printed)X
+3752(from)X
+3938(the)X
+4067(outlines)X
+2520 2208(at)N
+2598(low)X
+2738(resolutions.)X
+2679 2304(Figure)N
+2937(12)X
+3066(shows)X
+3315(samples)X
+3623(of)X
+3740(similar)X
+4012(sentences)X
+2520 2400(printed)N
+2783(on)X
+2899(the)X
+3033(same)X
+3234(three)X
+3431(devices)X
+3707(using)X
+3915(the)X
+4048(standard)X
+2520 2496(Helvetica,)N
+2871(Times)X
+3094(Roman,)X
+3368(and)X
+3507(Courier)X
+3776(P)X
+8 s 8 xH F
+3820(OST)X
+10 s 10 xH F
+3941(S)X
+8 s 8 xH F
+3985(CRIPT)X
+10 s 10 xH F
+4191(out-)X
+2520 2592(line)N
+2676(fonts)X
+2872(built)X
+3054(into)X
+3213(most)X
+3403(P)X
+8 s 8 xH F
+3447(OST)X
+10 s 10 xH F
+3568(S)X
+8 s 8 xH F
+3612(CRIPT)X
+10 s 10 xH F
+3794(-executing)X
+4168(laser)X
+2520 2688(printers.)N
+2838(It)X
+2920(appears)X
+3199(to)X
+3294(these)X
+3492(authors)X
+3762(that)X
+3916(the)X
+4048(standard)X
+2520 2784(P)N
+8 s 8 xH F
+2564(OST)X
+10 s 10 xH F
+2685(S)X
+8 s 8 xH F
+2729(CRIPT)X
+10 s 10 xH F
+2956(fonts)X
+3160(are)X
+3303(signi\256cantly)X
+3742(better)X
+3969(than)X
+4151(those)X
+2520 2880(generated)N
+2865(from)X
+0 f F
+3053(METAFONT)X
+1 f F
+3426(fonts.)X
+3638(However,)X
+3985(this)X
+4132(is)X
+4218(not)X
+2520 2976(surprising.)N
+2898(Adobe)X
+3150(uses)X
+3326(a)X
+3400(grid)X
+3567(of)X
+3672(1000)X
+47 f F
+3852(\264)X
+1 f F
+3916(1000)X
+4114(for)X
+4245(its)X
+2520 3072(character)N
+2847(de\256nitions,)X
+3235(resulting)X
+3547(in)X
+3641(a)X
+3709(resolution)X
+4061(of)X
+4160(7200)X
+2520 3168(dpi)N
+2650(for)X
+2772(characters)X
+3127(printed)X
+3382(at)X
+3468(point)X
+3659(size)X
+3811(10.)X
+3958(Because)X
+4253(of)X
+2520 3264(size)N
+2679(limitations)X
+3054(of)X
+3155(the)X
+0 f F
+3287(METAFONT)X
+1 f F
+3662(program)X
+3969(the)X
+0 f F
+4102(META-)X
+2520 3360(FONT)N
+1 f F
+2706(outline)X
+2949(fonts)X
+3130(are)X
+3249(using)X
+3442(a)X
+3498(resolution)X
+3838(of)X
+3925(3,000)X
+4125(points)X
+2520 3456(per)N
+2644(inch.)X
+2823(However,)X
+3159(when)X
+3354(using)X
+3548(the)X
+3667(letters)X
+3885(in)X
+3969(small)X
+4164(sizes)X
+2520 3552(such)N
+2702(as)X
+2804(from)X
+2995(10)X
+3110(to)X
+3206(70,)X
+3340(quality)X
+3596(di)X
+3658 MX
+(ff)138 606 oc
+3706(erences)X
+3982(are)X
+4115(hardly)X
+2520 3648(visible)N
+2756(especially)X
+3100(when)X
+3298(working)X
+3589(with)X
+3755(printers)X
+4024(that)X
+4168(have)X
+2520 3744(a)N
+2588(resolution)X
+2940(of)X
+3039(300)X
+3190(points)X
+3416(per)X
+3550(inch)X
+3719(such)X
+3897(as)X
+3995(the)X
+4124(Apple)X
+2520 3840(LaserWriter.)N
+2988(Moreover,)X
+3364(Adobe)X
+3617(makes)X
+3861(liberal)X
+4106(use)X
+4253(of)X
+2520 3936(hinting)N
+2780(to)X
+2876(improve)X
+3177(the)X
+3309(appearance)X
+3706(of)X
+3807(its)X
+3916(fonts)X
+4109(at)X
+4200(low)X
+2520 4032(resolutions.)N
+2937(We)X
+3075(completely)X
+3458(ignored)X
+3730(hinting,)X
+4003(as)X
+4097(we)X
+4218(did)X
+2520 4128(not)N
+2642(see)X
+2765(any)X
+2901(way)X
+3055(to)X
+3137(automatically)X
+3593(generate)X
+3886(the)X
+4004(hints.)X
+3 f F
+2520 4320(6.2)N
+2680(Sizes)X
+2874(of)X
+2967(fonts.)X
+1 f F
+3202(Recall)X
+3433(that)X
+3579(it)X
+3649(is)X
+3728(necessary)X
+4067(to)X
+4155(com-)X
+2520 4416(pare)N
+2687(the)X
+2812(size)X
+2964(of)X
+3058(the)X
+3183(P)X
+8 s 8 xH F
+3227(OST)X
+10 s 10 xH F
+3348(S)X
+8 s 8 xH F
+3392(CRIPT)X
+10 s 10 xH F
+3601(outline)X
+3850(font)X
+4006(for)X
+4127(a)X
+4190(par-)X
+2520 4512(ticular)N
+0 f F
+2769(METAFONT)X
+1 f F
+3154(de\256nition)X
+3504(to)X
+3610(the)X
+3753(sizes)X
+3954(of)X
+4066(the)X
+4209(bit-)X
+2520 4608(mapped)N
+2811(fonts)X
+3008(in)X
+3107(P)X
+8 s 8 xH F
+3151(OST)X
+10 s 10 xH F
+3272(S)X
+8 s 8 xH F
+3316(CRIPT)X
+10 s 10 xH F
+3535(fonts)X
+3732(for)X
+3862(the)X
+3996(individual)X
+2520 4704(and)N
+2656(all)X
+2756(magni\256cations.)X
+2679 4800(This)N
+2858(comparison)X
+3269(is)X
+3360(made)X
+3572(in)X
+3672(this)X
+3825(section)X
+4090(for)X
+4222(the)X
+5 f F
+2520 4896(cmr10)N
+1 f F
+2785(font)X
+2939(at)X
+3022(the)X
+3145(standard)X
+3442(set)X
+3556(of)X
+3648(six)X
+3765(magni\256cations)X
+4260(1,)X
+2520 4992(1.095,)N
+2741(1.2,)X
+2882(1.44,)X
+3063(1.728,)X
+3284(and)X
+3422(2.07)X
+3584(\(which)X
+3829(are)X
+3950(approxima-)X
+2520 5088(tions)N
+2706(of)X
+2804(1.2)X
+2935(raised)X
+3158(to)X
+3251(the)X
+3380(powers)X
+3643(0,)X
+3734(.5,)X
+3844(1,)X
+3934(2,)X
+4024(3,)X
+4114(and)X
+4260(4,)X
+2520 5184(respectively\).)N
+2978(In)X
+3068(addition,)X
+3373(as)X
+3464(a)X
+3524(gesture)X
+3780(to)X
+3866(those)X
+4059(who)X
+4221(are)X
+2520 5280(not)N
+2658(purists)X
+2907(and)X
+3059(accept)X
+3300(magni\256cations)X
+3806(of)X
+3908(the)X
+4041(10)X
+4156(point)X
+2520 5376(design)N
+2774(size)X
+2944(as)X
+3056(di)X
+3118 MX
+(ff)138 606 oc
+3166(erent)X
+3372(point)X
+3581(sizes,)X
+3802(the)X
+3946(comparison)X
+2520 5472(includes)N
+2812(the)X
+5 f F
+2935(cmr)X
+1 f F
+3104(font)X
+3257(at)X
+3339(point)X
+3527(size)X
+3676(5,)X
+3760(6,)X
+3844(7,)X
+3928(8,)X
+4012(9,)X
+4096(10,)X
+4220(12,)X
+2520 5568(and)N
+2665(17,)X
+2795(the)X
+2923(standard)X
+3225(eight)X
+3415(design)X
+3654(sizes)X
+3840(maintained)X
+4226(for)X
+2520 5664(use)N
+2647(with)X
+2809(T)X
+2850 5680(E)N
+2891 5664(X.)N
+2445 6084(13)N
+
+%%Page: 13 14
+13 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+1 f F
+735 672(Table)N
+947(1)X
+1017(shows)X
+1247(the)X
+1375(sizes)X
+1561(in)X
+1653(bytes.)X
+1872(Thus)X
+2062(it)X
+2136(is)X
+2219(clear)X
+576 768(that)N
+721(the)X
+843(P)X
+8 s 8 xH F
+887(OST)X
+10 s 10 xH F
+1008(S)X
+8 s 8 xH F
+1052(CRIPT)X
+10 s 10 xH F
+1258(outline)X
+1504(font)X
+1657(is)X
+1734(bigger)X
+1963(than)X
+2125(any)X
+2265(bit-)X
+576 864(mapped)N
+855(font)X
+1009(and)X
+1150(that)X
+1295(goal)X
+1458(4)X
+1523(fails.)X
+1707(Moreover,)X
+2070(it)X
+2140(is)X
+2219(clear)X
+576 960(that)N
+735(the)X
+871(outline)X
+1131(font)X
+1298(is)X
+1389(bigger)X
+1632(than)X
+1808(the)X
+1944(sum)X
+2115(over)X
+2296(all)X
+576 1056(magni\256cations)N
+1067(of)X
+1154(one)X
+1290(design)X
+1519(size)X
+1664(and)X
+1801(than)X
+1960(the)X
+2079(sum)X
+2233(over)X
+576 1152(all)N
+681(standard)X
+978(design)X
+1212(sizes.)X
+1413(Thus)X
+1597(goal)X
+1759(5)X
+1823(fails.)X
+2005(In)X
+2096(fact,)X
+2261(this)X
+576 1248(failure)N
+830(is)X
+927(the)X
+1069(reason)X
+1323(that)X
+1487(the)X
+1629(samples)X
+1931(of)X
+2042(Figure)X
+2296(11)X
+576 1344(involve)N
+841(only)X
+1008(upper)X
+1216(case)X
+1380(letters.)X
+1621(Samples)X
+1916(with)X
+2082(complete)X
+576 1440(fonts)N
+757(with)X
+920(both)X
+1083(cases)X
+1274(often)X
+1460(overloaded)X
+1838(the)X
+1957(printer)X
+2193(avail-)X
+576 1536(able)N
+730(to)X
+812(the)X
+930(students)X
+1212(at)X
+1290(the)X
+1408(time)X
+1570(this)X
+1705(work)X
+1890(was)X
+2035(done.)X
+650 1728(Font)N
+939(Design)X
+1286(Magni-)X
+1676(Bitmap)X
+2031(Outlines)X
+1041 1824(size)N
+1286(\256cation)X
+1677(\(size)X
+1849(in)X
+2031(\(size)X
+2203(in)X
+1715 1920(bytes\))N
+2031(bytes\))X
+48 f F
+650 1936(i)N
+662(i)X
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+5 f F
+650 2032(cmr)N
+1 f F
+1086(10)X
+1286(1.0)X
+1691(22,812)X
+2031(245,000)X
+690 2128(")N
+1086(10)X
+1286(1.095)X
+1691(24,231)X
+2111(")X
+690 2224(")N
+1086(10)X
+1286(1.2)X
+1691(26,044)X
+2111(")X
+690 2320(")N
+1086(10)X
+1286(1.44)X
+1691(31,892)X
+2111(")X
+690 2416(")N
+1086(10)X
+1286(1.728)X
+1691(39,614)X
+2111(")X
+690 2512(")N
+1086(10)X
+1286(2.07)X
+1691(50,578)X
+2111(")X
+5 f F
+650 2608(cmr)N
+1 f F
+1126(5)X
+1286(1.0)X
+1691(16,729)X
+2111(")X
+690 2704(")N
+1126(6)X
+1286(1.0)X
+1691(17,757)X
+2111(")X
+690 2800(")N
+1126(7)X
+1286(1.0)X
+1691(18,820)X
+2111(")X
+690 2896(")N
+1126(8)X
+1286(1.0)X
+1691(20,041)X
+2111(")X
+690 2992(")N
+1126(9)X
+1286(1.0)X
+1691(21,580)X
+2111(")X
+690 3088(")N
+1086(12)X
+1286(1.0)X
+1691(25,658)X
+2111(")X
+690 3184(")N
+1086(17)X
+1286(1.0)X
+1691(37,140)X
+2111(")X
+48 f F
+650 3200(i)N
+662(i)X
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+1 f F
+650 3296(Total)N
+1651(352,896)X
+2031(245,000)X
+1354 3416(Table)N
+1557(1)X
+735 3560(However,)N
+1081(do)X
+1192(note)X
+1361(that)X
+1512(the)X
+1641(outline)X
+1894(font)X
+2055(is)X
+2140(smaller)X
+576 3656(than)N
+746(the)X
+876(sum)X
+1041(over)X
+1216(all)X
+1328(design)X
+1569(sizes)X
+1757(and)X
+1905(magni\256cations)X
+576 3752(thereof.)N
+735 3848(So)N
+848(in)X
+939(terms)X
+1147(of)X
+1244(disk)X
+1407(space)X
+1616(for)X
+1740(the)X
+1868(non-purists,)X
+2278(the)X
+576 3944(outline)N
+825(font)X
+981(represents)X
+1334(a)X
+1397(savings.)X
+1684(Again)X
+1906(notice)X
+2128(that)X
+2274(not)X
+576 4040(all)N
+698(magni\256cations)X
+1212(of)X
+1322(the)X
+1463(bitmapped)X
+1844(fonts)X
+2047(are)X
+2189(main-)X
+576 4136(tained)N
+822(and)X
+988(the)X
+1136(outline)X
+1408(font)X
+1587(is)X
+1690(arbitrarily)X
+2061(scaleable.)X
+576 4232(Moreover,)N
+947(as)X
+1048(the)X
+1180(magni\256cation)X
+1654(grows)X
+1884(the)X
+2016(size)X
+2176(of)X
+2278(the)X
+576 4328(bitmap)N
+818(grows)X
+1034(even)X
+1206(more)X
+1391(rapidly.)X
+735 4424(The)N
+888(disappointment)X
+1409(with)X
+1579(respect)X
+1835(to)X
+1925(saving)X
+2162(printer)X
+576 4520(and)N
+713(disk)X
+867(memory)X
+1155(says)X
+1314(that)X
+1454(it)X
+1518(is)X
+1591(important)X
+1922(to)X
+2004(spend)X
+2211(more)X
+576 4616(e)N
+612 MX
+(ff)138 606 oc
+660(ort)X
+769(to)X
+851(optimize)X
+1151(the)X
+1269(outline)X
+1511(font.)X
+735 4712(All)N
+871(is)X
+959(not)X
+1096(lost,)X
+1266(though!)X
+1550(As)X
+1674(this)X
+1824(paper)X
+2038(was)X
+2198(being)X
+576 4808(prepared)N
+902(for)X
+1040(publication)X
+1444(in)X
+2 f F
+1550(TUGboat)X
+1 f F
+1852(,)X
+1915(one)X
+2074(reviewer,)X
+576 4904(Nelson)N
+829(Beebe,)X
+1076(pointed)X
+1342(out)X
+1470(something)X
+1829(that)X
+1975(we)X
+2095(can)X
+2234(only)X
+576 5000(kick)N
+735(ourselves)X
+1059(for)X
+1174(not)X
+1296(noticing.)X
+1598(The)X
+1743(P)X
+8 s 8 xH F
+1787(OST)X
+10 s 10 xH F
+1908(S)X
+8 s 8 xH F
+1952(CRIPT)X
+10 s 10 xH F
+2154(outline)X
+576 5096(fonts)N
+777(that)X
+938(are)X
+1078(generated)X
+1432(by)X
+9 f F
+1555(mf2ps)X
+1 f F
+1813(are)X
+1953(horrendously)X
+576 5192(wasteful)N
+873(in)X
+960(space.)X
+1184(They)X
+1374(use)X
+1506(original,)X
+1800(built-in)X
+2060(command)X
+576 5288(names)N
+802(and)X
+939(absolute)X
+1227(coordinates.)X
+1638(A)X
+1718(signi\256cant)X
+2073(reduction)X
+576 5384(in)N
+661(size)X
+809(can)X
+944(be)X
+1043(obtained)X
+1342(by)X
+1445(de\256nition)X
+1774(and)X
+1913(use)X
+2043(in)X
+2127(the)X
+2247(out-)X
+576 5480(lines)N
+752(of)X
+844(single-character)X
+1383(command)X
+1724(names,)X
+1974(e.g.,)X
+2136(\252)X
+5 f F
+2172(M)X
+1 f F
+(\272)S
+2282(for)X
+576 5576(\252)N
+5 f F
+612(moveto)X
+1 f F
+(\272,)S
+995(and)X
+1150(by)X
+1269(use)X
+1415(of)X
+1521(relative)X
+1801(versions)X
+2106(of)X
+2211(these)X
+576 5672(commands)N
+943(with)X
+1105(operands)X
+1415(of)X
+1502(fewer)X
+1706(digits)X
+1903(after)X
+2071(the)X
+2190(initial)X
+2520 672(absolute)N
+5 f F
+2812(moveto)X
+1 f F
+3125(of)X
+3217(any)X
+3358(character.)X
+3699(A)X
+3782(simple)X
+4020(\256lter)X
+4195(was)X
+2520 768(written)N
+2769(to)X
+2853(obtain)X
+3075(new)X
+3231(compressed)X
+3633(versions)X
+3923(of)X
+4013(the)X
+4134(P)X
+8 s 8 xH F
+4178(OST-)X
+10 s 10 xH F
+2520 864(S)N
+8 s 8 xH F
+2564(CRIPT)X
+10 s 10 xH F
+2787(outline)X
+3050(fonts.)X
+3271(The)X
+3437(appearances)X
+3871(of)X
+3978(the)X
+4116(output)X
+2520 960(when)N
+2728(printing)X
+3016(with)X
+3193(these)X
+3393(new)X
+3562(versions)X
+3864(is)X
+3952(unchanged,)X
+2520 1056(but)N
+2654(what)X
+2842(is)X
+2927(sent)X
+3087(to)X
+3180(the)X
+3309(printer)X
+3554(is)X
+3638(signi\256cantly)X
+4064(smaller,)X
+2520 1152(about)N
+2718(37.7%)X
+2945(smaller.)X
+3221(The)X
+3366(reduction)X
+3689(on)X
+3789(a)X
+3845(per-letter)X
+4160(basis)X
+2520 1248(is)N
+2599(about)X
+2803(45%.)X
+3016(Table)X
+3225(2)X
+3291(shows)X
+3517(the)X
+3641(information)X
+4045(of)X
+4137(Table)X
+2520 1344(1)N
+2580(for)X
+2694(the)X
+2812(new)X
+2966(versions)X
+3253(of)X
+3340(the)X
+3458(outline)X
+3700(fonts.)X
+2594 1536(Font)N
+2883(Design)X
+3230(Magni-)X
+3620(Bitmap)X
+3975(Outlines)X
+2985 1632(size)N
+3230(\256cation)X
+3621(\(size)X
+3793(in)X
+3975(\(size)X
+4147(in)X
+3659 1728(bytes\))N
+3975(bytes\))X
+48 f F
+2594 1744(i)N
+2606(i)X
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+5 f F
+2594 1840(cmr)N
+1 f F
+3030(10)X
+3230(1.0)X
+3635(22,812)X
+3975(152,670)X
+2634 1936(")N
+3030(10)X
+3230(1.095)X
+3635(24,231)X
+4055(")X
+2634 2032(")N
+3030(10)X
+3230(1.2)X
+3635(26,044)X
+4055(")X
+2634 2128(")N
+3030(10)X
+3230(1.44)X
+3635(31,892)X
+4055(")X
+2634 2224(")N
+3030(10)X
+3230(1.728)X
+3635(39,614)X
+4055(")X
+2634 2320(")N
+3030(10)X
+3230(2.07)X
+3635(50,578)X
+4055(")X
+5 f F
+2594 2416(cmr)N
+1 f F
+3070(5)X
+3230(1.0)X
+3635(16,729)X
+4055(")X
+2634 2512(")N
+3070(6)X
+3230(1.0)X
+3635(17,757)X
+4055(")X
+2634 2608(")N
+3070(7)X
+3230(1.0)X
+3635(18,820)X
+4055(")X
+2634 2704(")N
+3070(8)X
+3230(1.0)X
+3635(20,041)X
+4055(")X
+2634 2800(")N
+3070(9)X
+3230(1.0)X
+3635(21,580)X
+4055(")X
+2634 2896(")N
+3030(12)X
+3230(1.0)X
+3635(25,658)X
+4055(")X
+2634 2992(")N
+3030(17)X
+3230(1.0)X
+3635(37,140)X
+4055(")X
+48 f F
+2594 3008(i)N
+2606(i)X
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+(i)S
+1 f F
+2594 3104(Total)N
+3595(352,896)X
+3975(152,670)X
+3298 3224(Table)N
+3501(2)X
+2679 3368(There)N
+2911(are)X
+3054(still)X
+3217(better)X
+3444(compressions)X
+3924(that)X
+4088(can)X
+4244(be)X
+2520 3464(achieved.)N
+2865(According)X
+3243(to)X
+3344(Beebe)X
+3584([4],)X
+3736(Toal)X
+3921(and)X
+4075(Raine's)X
+2520 3560(outline)N
+2787(representation)X
+3287(of)X
+5 f F
+3400(cmr)X
+1 f F
+3590(at)X
+3694(10)X
+3820(points)X
+4061(requires)X
+2520 3656(about)N
+2726(twice)X
+2927(the)X
+3052(space)X
+3258(needed)X
+3513(for)X
+3634(bitmaps)X
+3914(of)X
+4008(the)X
+4133(same;)X
+2520 3752(at)N
+2603(14)X
+2708(to)X
+2795(16)X
+2900(points,)X
+3140(the)X
+3264(outlines)X
+3543(and)X
+3685(the)X
+3809(bitmaps)X
+4088(occupy)X
+2520 3848(about)N
+2728(the)X
+2856(same)X
+3051(amount)X
+3321(of)X
+3418(space;)X
+3648(above)X
+3869(16)X
+3978(points,)X
+4222(the)X
+2520 3944(outlines)N
+2809(are)X
+2944(smaller)X
+3216(than)X
+3390(the)X
+3524(bitmaps.)X
+3833(It)X
+3918(is)X
+4007(clear)X
+4200(that)X
+2520 4040(better)N
+2727(encodings)X
+3076(exist)X
+3251(than)X
+3413(we)X
+3531(explored)X
+3836(and)X
+3976(these)X
+4165(must)X
+2520 4136(be)N
+2616(explored)X
+2917(for)X
+3031(any)X
+3167(future)X
+3379(version)X
+3635(of)X
+9 f F
+3724(mf2ps)X
+1 f F
+3941(.)X
+2679 4232(One)N
+2842(such)X
+3018(better)X
+3230(encoding)X
+3553(appears)X
+3828(to)X
+3919(be)X
+4024(that)X
+4173(used)X
+2520 4328(by)N
+2629(Adobe)X
+2872(for)X
+2995(its)X
+3099(own)X
+3266(proprietary)X
+3652(fonts;)X
+3863(fonts)X
+4052(encoded)X
+2520 4424(this)N
+2655(way)X
+2809(have)X
+2981(a)X
+3037(FontType)X
+3368(of)X
+3456(1.)X
+3557(User)X
+3730(de\256ned)X
+3987(fonts)X
+4168(have)X
+2520 4520(a)N
+2587(FontType)X
+2929(of)X
+3027(3.)X
+3118(Beebe)X
+3350([4])X
+3475(says)X
+3643(that)X
+3793(type)X
+3961(1)X
+4031(fonts)X
+4221(are)X
+2520 4616(handled)N
+2813(with)X
+2994(greater)X
+3257(e)X
+3293 MX
+(Fi)139 825 oc
+(ciency)S
+3608(than)X
+3785(type)X
+3962(3)X
+4041(fonts)X
+4240(on)X
+2520 4712(most)N
+2700(existing)X
+2978(P)X
+8 s 8 xH F
+3022(OST)X
+10 s 10 xH F
+3143(S)X
+8 s 8 xH F
+3187(CRIPT)X
+10 s 10 xH F
+3394(interpreters,)X
+3805(especially)X
+4151(those)X
+2520 4808(that)N
+2683(are)X
+2825(based)X
+3051(on)X
+3174(Adobe-licensed)X
+3721(code.)X
+3956(Adobe)X
+4213(has)X
+2520 4904(recently)N
+2822(published)X
+3175(speci\256cations)X
+3653(for)X
+3789(the)X
+3929(type)X
+4109(1)X
+4191(font)X
+2520 5000(encoding)N
+2840([2],)X
+2980(thus)X
+3139(allowing)X
+3445(anyone)X
+3703(to)X
+3791(produced)X
+4116(type)X
+4280(1)X
+2520 5096(fonts.)N
+2729(Beebe)X
+2959(believes)X
+3251(that)X
+3400(the)X
+3527(market)X
+3778(forces)X
+4003(will)X
+4155(drive)X
+2520 5192(other)N
+2708(companies)X
+3074(to)X
+3159(encode)X
+3410(their)X
+3580(fonts)X
+3763(as)X
+3853(type)X
+4015(1.)X
+4119(More-)X
+2520 5288(over,)N
+2714(as)X
+2812(more)X
+3008(and)X
+3155(more)X
+3351(windowing)X
+3742(systems)X
+4026(based)X
+4240(on)X
+2520 5384(P)N
+8 s 8 xH F
+2564(OST)X
+10 s 10 xH F
+2685(S)X
+8 s 8 xH F
+2729(CRIPT)X
+10 s 10 xH F
+2911(,)X
+2954(e.g.,)X
+3113(NeWS)X
+3350(and)X
+3489(NeXT,)X
+3733(appear,)X
+3992(the)X
+4114(attrac-)X
+2520 5480(tion)N
+2672(of)X
+2767(P)X
+8 s 8 xH F
+2811(OST)X
+10 s 10 xH F
+2932(S)X
+8 s 8 xH F
+2976(CRIPT)X
+10 s 10 xH F
+3186(outline)X
+3436(fonts)X
+3624(will)X
+3776(increase,)X
+4088(as)X
+4182(then)X
+2520 5576(the)N
+2651(same)X
+2849(font)X
+3012(can)X
+3158(be)X
+3268(used)X
+3449(for)X
+3577(both)X
+3753(printing)X
+4040(and)X
+4190(pre-)X
+2520 5672(viewing.)N
+2827(Thus,)X
+3036(the)X
+3163(incentive)X
+3486(will)X
+3639(be)X
+3743(to)X
+3833(convert)X
+0 f F
+4102(META-)X
+1 f F
+2445 6084(16)N
+
+%%Page: 14 15
+14 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+576 672(FONT)N
+1 f F
+761(fonts)X
+941(into)X
+1085(type)X
+1243(1)X
+1303(P)X
+8 s 8 xH F
+1347(OST)X
+10 s 10 xH F
+1468(S)X
+8 s 8 xH F
+1512(CRIPT)X
+10 s 10 xH F
+1714(outline)X
+1956(fonts.)X
+735 768(Ultimately,)N
+1124(the)X
+1250(tradeo)X
+1451 MX
+(ff)138 606 oc
+1527(is)X
+1608(between)X
+1904(the)X
+2030(size)X
+2183(of)X
+2278(the)X
+576 864(font)N
+741(sent)X
+906(to)X
+1004(the)X
+1138(printer,)X
+1408(and)X
+1560(the)X
+1693(time)X
+1870(it)X
+1949(takes)X
+2149(for)X
+2278(the)X
+576 960(printer)N
+815(to)X
+902(decode)X
+1155(the)X
+1278(program)X
+1576(for)X
+1696(the)X
+1820(characters.)X
+2193(How-)X
+576 1056(ever,)N
+764(with)X
+934(proper)X
+1172(cacheing,)X
+1506(a)X
+1570(big)X
+1700(enough)X
+1964(cache,)X
+2196(and)X
+2340(a)X
+576 1152(not)N
+715(very)X
+895(fancy)X
+1111(document,)X
+1484(the)X
+1619(decoding)X
+1950(is)X
+2040(done)X
+2234(only)X
+576 1248(once)N
+748(per)X
+871(character)X
+1187(for)X
+1301(the)X
+1419(document!)X
+3 f F
+576 1440(7)N
+676(Future)X
+932(work)X
+1 f F
+576 1584(For)N
+708(the)X
+827(future,)X
+1060(there)X
+1242(are)X
+1362(a)X
+1420(number)X
+1687(of)X
+1776(improvements)X
+2256(that)X
+576 1680(can)N
+714(be)X
+816(made.)X
+1055(Currently,)X
+1407(each)X
+1580(letter)X
+1770(of)X
+1862(the)X
+1985(P)X
+8 s 8 xH F
+2029(OST)X
+10 s 10 xH F
+2150(S)X
+8 s 8 xH F
+2194(CRIPT)X
+10 s 10 xH F
+576 1776(outline)N
+820(fonts)X
+1002(is)X
+1077(described)X
+1407(as)X
+1496(a)X
+1555(set)X
+1667(of)X
+1757(cyclic)X
+1972(paths.)X
+2184(When)X
+576 1872(all)N
+698(are)X
+839(\256lled)X
+1045(or)X
+1154(stroked,)X
+1452(one)X
+1609(gets)X
+1779(the)X
+1918(desired)X
+2191(letter.)X
+576 1968(Some)N
+789(of)X
+887(those)X
+1087(cyclic)X
+1310(paths)X
+1510(have)X
+1693(a)X
+1761(common)X
+2073(boundary)X
+576 2064(that)N
+721(is)X
+799(inside)X
+1015(the)X
+1138(letter)X
+1327(and)X
+1467(is)X
+1544(not)X
+1670(necessary)X
+2007(for)X
+2125(the)X
+2247(out-)X
+576 2160(line)N
+733(description)X
+1126(of)X
+1230(the)X
+1365(letter)X
+1567(as)X
+1671(a)X
+1745(whole.)X
+1999(Eliminating)X
+576 2256(these)N
+772(paths)X
+972(and)X
+1118(creating)X
+1407(one)X
+1553(outline)X
+1805(for)X
+1929(the)X
+2057(letter)X
+2252(will)X
+576 2352(save)N
+753(space.)X
+986(Today)X
+1225(this)X
+1374(can)X
+1520(be)X
+1630(done)X
+1820(manually,)X
+2172(and)X
+2323(is)X
+576 2448(worth)N
+789(the)X
+912(e)X
+948 MX
+(ff)138 606 oc
+996(ort)X
+1110(because)X
+1390(the)X
+1513(translation)X
+1876(process)X
+2142(is)X
+2220(done)X
+576 2544(only)N
+738(once.)X
+930(From)X
+1123(that)X
+1263(time)X
+1426(on,)X
+1547(the)X
+1666(font)X
+1816(is)X
+1890(used)X
+2058(the)X
+2177(way)X
+2332(it)X
+576 2640(is.)N
+735 2736(As)N
+863(was)X
+1027(demonstrated)X
+1498(by)X
+1617(Beebe's)X
+1916(rescue)X
+2162(of)X
+2269(our)X
+576 2832(result,)N
+796(closer)X
+1010(attention)X
+1312(should)X
+1547(be)X
+1645(paid)X
+1805(to)X
+1888(obtaining)X
+2211(more)X
+576 2928(compact)N
+869(representations)X
+1376(of)X
+1464(character)X
+1781(outlines,)X
+2076(represen-)X
+576 3024(tations)N
+811(for)X
+927(which)X
+1145(P)X
+8 s 8 xH F
+1189(OST)X
+10 s 10 xH F
+1310(S)X
+8 s 8 xH F
+1354(CRIPT)X
+10 s 10 xH F
+1557(routines)X
+1836(can)X
+1969(be)X
+2066(written)X
+2314(to)X
+576 3120(interpret)N
+868(them)X
+1048(into)X
+1192(standard)X
+1484(outline)X
+1726(drawing)X
+2009(commands.)X
+576 3216(Collapsing)N
+952(commands)X
+1329(into)X
+1482(single)X
+1702(characters)X
+2058(and)X
+2203(using)X
+576 3312(relative)N
+839(movements)X
+1231(saved)X
+1437(signi\256cant)X
+1793(amounts)X
+2087(of)X
+2177(space.)X
+576 3408(Perhaps,)N
+882(even)X
+1066(more)X
+1263(dramatic)X
+1576(savings)X
+1848(can)X
+1992(be)X
+2100(obtained)X
+576 3504(by)N
+676(giving)X
+900(coordinates)X
+1290(and)X
+1426(distances)X
+1740(in)X
+1822(hexadecimal.)X
+735 3600(More)N
+945(e)X
+981 MX
+(ff)138 606 oc
+1029(ort)X
+1154(can)X
+1302(be)X
+1414(spent)X
+1620(on)X
+1737(modifying)X
+2107(the)X
+2242(pro-)X
+576 3696(gram)N
+790(in)X
+901(order)X
+1120(to)X
+1231(allow)X
+1458(magni\256cations)X
+1978(up)X
+2106(to)X
+2216(7200)X
+576 3792(points.)N
+824(Thus,)X
+1037(no)X
+1150(jaggies)X
+1410(will)X
+1567(be)X
+1677(seen,)X
+1874(as)X
+1975(occasionally)X
+576 3888(happens)N
+866(when)X
+1067(using)X
+1267(higher)X
+1499(magni\256cations,)X
+2017(e.g.,)X
+2180(in)X
+2269(our)X
+576 3984(translated)N
+915(fonts)X
+1102(at)X
+1187(magni\256cation)X
+1654(8.)X
+1741(This)X
+1910(could)X
+2116(be)X
+2220(done)X
+576 4080(by)N
+692(enlarging)X
+1031(the)X
+1164(program)X
+1471(arrays)X
+1703(to)X
+1800(handle)X
+2049(characters)X
+576 4176(based)N
+812(on)X
+945(7200)X
+1159(points.)X
+1428(A)X
+1540(sophisticated)X
+2012(solution)X
+2323(is)X
+576 4272(required)N
+867(if)X
+939(one)X
+1078(wants)X
+1288(to)X
+1373(save)X
+1539(room)X
+1731(while)X
+1932(compiling)X
+2278(the)X
+576 4368(input)N
+767(font.)X
+943(In)X
+1037(such)X
+1211(a)X
+1274(case,)X
+1460(any)X
+1603(linear)X
+1814(translation)X
+2180(which)X
+576 4464(is)N
+652(done)X
+831(within)X
+1058(the)X
+1179(P)X
+8 s 8 xH F
+1223(OST)X
+10 s 10 xH F
+1344(S)X
+8 s 8 xH F
+1388(CRIPT)X
+10 s 10 xH F
+1593(program)X
+1888(is)X
+1964(with)X
+2129(a)X
+2188(factor)X
+576 4560(less)N
+716(than)X
+874(1.)X
+0 f F
+735 4656(METAFONT)N
+1 f F
+1106(was)X
+1261(changed)X
+1559(for)X
+1684(T)X
+1725 4672(E)N
+1766 4656(X)N
+1855(3.0.)X
+2006(It)X
+2086(is)X
+2170(neces-)X
+576 4752(sary)N
+747(to)X
+846(build)X
+1047(a)X
+1120(new)X
+1291(version)X
+1564(of)X
+9 f F
+1670(mf2ps)X
+1 f F
+1924(based)X
+2144(on)X
+2261(this)X
+576 4848(latest)N
+790(version)X
+1071(of)X
+0 f F
+1183(METAFONT)X
+1 f F
+1524(.)X
+1589(As)X
+1723(the)X
+1866(changes)X
+2170(to)X
+2278(the)X
+0 f F
+576 4944(METAFONT)N
+1 f F
+967(program)X
+1289(deal)X
+1473(mainly)X
+1744(with)X
+1935(ligatures)X
+2260(and)X
+576 5040(kerning,)N
+877(the)X
+1011(calculation)X
+1400(of)X
+1504(envelopes)X
+1862(is)X
+1952(probably)X
+2274(not)X
+576 5136(a)N
+612 MX
+(ff)138 606 oc
+660(ected.)X
+869(Therefore,)X
+1226(it)X
+1289(is)X
+1361(likely)X
+1562(that)X
+1702(the)X
+1820(portion)X
+2071(of)X
+0 f F
+2158(META-)X
+576 5232(FONT)N
+1 f F
+769(up)X
+877(to)X
+967(the)X
+1093(calculation)X
+1473(of)X
+1568(the)X
+1694(envelope)X
+2012(can)X
+2152(still)X
+2300(be)X
+576 5328(used)N
+746(as)X
+836(a)X
+894(front)X
+1072(end)X
+1210(for)X
+9 f F
+1328(mf2ps)X
+1 f F
+1567(with)X
+1731(very)X
+1896(little)X
+2064(change)X
+2314(in)X
+576 5424(the)N
+694(portion)X
+945(of)X
+1032(the)X
+1150(program)X
+1442(we)X
+1556(wrote.)X
+735 5520(Finally,)N
+1018(it)X
+1099(might)X
+1323(be)X
+1437(worthwhile,)X
+1860(for)X
+1992(the)X
+2128(sake)X
+2309(of)X
+576 5616(portability)N
+932(to)X
+1017(other)X
+1205(systems)X
+1481(and)X
+1619(enhanceability)X
+2109(by)X
+2211(other)X
+2520 672(humans,)N
+2834(to)X
+2941(rewrite)X
+3214(or)X
+3326(to)X
+3433(write)X
+3643(the)X
+3787(next)X
+3971(version)X
+4253(of)X
+9 f F
+2520 768(mf2ps)N
+1 f F
+2757(with)X
+5 f F
+2919(WEB)X
+1 f F
+(.)S
+3 f F
+2520 960(Acknowledgments)N
+1 f F
+2520 1104(The)N
+2685(authors)X
+2961(thank)X
+3179(the)X
+2 f F
+3317(TUGboat)X
+1 f F
+3659(editors,)X
+3937(and)X
+4093(Nelson)X
+2520 1200(Beebe)N
+2742(for)X
+2857(their)X
+3025(help,)X
+3204(sharp)X
+3399(comments,)X
+3769(and)X
+3906(result-saving)X
+2520 1296(ideas.)N
+2751(Dealing)X
+3032(with)X
+3201(their)X
+3375(comments)X
+3731(made)X
+3932(this)X
+4074(a)X
+4137(better)X
+2520 1392(paper.)N
+3 f F
+2520 1584(References)N
+1 f F
+2600 1704(1.)N
+2 f F
+2760(P)X
+8 s 8 xH F
+2809(OST)X
+10 s 10 xH F
+2923(S)X
+8 s 8 xH F
+(CRIPT)S
+10 s 10 xH F
+3230(Language)X
+3639(Reference)X
+4051(Manual,)X
+1 f F
+2760 1800(Adobe)N
+3004(Systems)X
+3300(Incorporated,)X
+3761(Addison-Wesley,)X
+2760 1896(Reading,)N
+3067(MA)X
+3216(\(1985\).)X
+2600 2016(2.)N
+2760(\252Adobe)X
+3080(Type)X
+3316(1)X
+3427(Font)X
+3644(Format,\272)X
+4002(Part)X
+4202(No.)X
+2760 2112(LPS0064,)N
+3097(Adobe)X
+3331(Systems,)X
+3637(Inc.)X
+3780(\(March,)X
+4057(1990\).)X
+2600 2232(3.)N
+2760(S.)X
+2844(von)X
+2984(Bechtolsheim,)X
+3526(\252The)X
+3769(T)X
+3810 2248(E)N
+3851 2232(X)N
+3992(PostScript)X
+2760 2328(Software)N
+3088(Package,\272)X
+2 f F
+3450(TUGboat)X
+3 f F
+3790(10)X
+1 f F
+(\(1\),)S
+4022(p.)X
+4120(25\26127)X
+2760 2424(\(1989\).)N
+2600 2544(4.)N
+2760(N.)X
+2858(Beebe,)X
+3099(Private)X
+3346(communication,)X
+3884(via)X
+4003(electronic)X
+2760 2640(mail.)N
+2982(\(1990\).)X
+2600 2760(5.)N
+2760(L.)X
+2849(Carr,)X
+3110(\252Of)X
+3329(Metafont)X
+3721(and)X
+3936(PostScript,\272)X
+2 f F
+2760 2856(T)N
+2796 2872(E)N
+2845 2856(Xniques)N
+3 f F
+3123(5)X
+1 f F
+(,)S
+3203(p.)X
+3283(141\261152)X
+3583(\(August,)X
+3881(1987\).)X
+2600 2976(6.)N
+2760(D.)X
+2858(Henderson,)X
+3255(\252Outline)X
+3561(fonts)X
+3751(with)X
+0 f F
+3923(METAFONT)X
+1 f F
+4264(,\272)X
+2 f F
+2760 3072(TUGboat)N
+3 f F
+3082(10)X
+1 f F
+(\(1\),)S
+3296(p.)X
+3376(36\26138)X
+3596(\(1989\).)X
+2600 3192(7.)N
+2760(J.D.)X
+2909(Hobby,)X
+3200(\252A)X
+0 f F
+3347(METAFONT)X
+1 f F
+3688(-like)X
+3889(System)X
+4178(with)X
+2760 3288(PostScript)N
+3112(Output,\272)X
+2 f F
+3414(TUGboat)X
+3 f F
+3740(10)X
+1 f F
+(\(4\),)S
+3957(p.)X
+4040(505\261512)X
+2760 3384(\(1989\).)N
+2600 3504(8.)N
+2760(B.W.)X
+2949(Kernighan,)X
+3388(\252A)X
+3562(Typesetter-independent)X
+2760 3600(TROFF,\272)N
+3092(Computing)X
+3479(Science)X
+3757(Technical)X
+4102(Report)X
+2760 3696(No.)N
+2929(97,)X
+3080(Bell)X
+3264(Laboratories,)X
+3742(Murray)X
+4035(Hill,)X
+4231(NJ)X
+2760 3792(07974)N
+2980(\(March,)X
+3257(1982\).)X
+2600 3912(9.)N
+2760(D.E.)X
+2927(Knuth,)X
+2 f F
+3208(The)X
+3389(T)X
+3425 3928(E)N
+3474 3912(Xbook,)N
+1 f F
+3761(Addison-Wesley,)X
+2760 4008(Reading,)N
+3067(MA)X
+3216(\(1984\).)X
+2600 4128(10.)N
+2760(D.E.)X
+2927(Knuth,)X
+2 f F
+3226(The)X
+0 f F
+3425(METAFONT)X
+2 f F
+3766(book,)X
+1 f F
+4022(Addison-)X
+2760 4224(Wesley,)N
+3041(Reading,)X
+3348(MA)X
+3497(\(1986\).)X
+2600 4344(11.)N
+2760(D.E.)X
+2927(Knuth,)X
+0 f F
+3272(METAFONT)X
+2 f F
+3613(:)X
+3765(The)X
+4011(Program,)X
+1 f F
+2760 4440(Addison-Wesley,)N
+3339(Reading,)X
+3646(MA)X
+3795(\(1987\).)X
+2600 4560(12.)N
+2760(G.)X
+2858(Toal,)X
+3058(Private)X
+3319(communication,)X
+3871(via)X
+4003(electronic)X
+2760 4656(mail.)N
+2982(\(1990\).)X
+2600 4776(13.)N
+2760(J.)X
+2831(Ziv)X
+2974(and)X
+3122(A.)X
+3220(Lempel,)X
+3517(\252A)X
+3643(Universal)X
+3987(Algorithm)X
+2760 4872(for)N
+2877(Sequential)X
+3237(Data)X
+3411(Compression,\272)X
+2 f F
+3911(IEEE)X
+4107(Trans-)X
+2760 4968(actions)N
+3031(on)X
+3151(Information)X
+3573(Theory)X
+3 f F
+3840(3)X
+1 f F
+(,)S
+3940(p.)X
+4040(337\261343)X
+2760 5064(\(May,)N
+2974(1977\).)X
+9 s 9 xH 47 f F
+3000 5344(\340)N
+1 f F
+3096(Shimon)X
+3338(Yanai)X
+3096 5432(IBM)N
+3250(Science)X
+3492(and)X
+3614(Technology)X
+3192 5520(Center)N
+3096 5608(Technion)N
+3386(City)X
+10 s 10 xH F
+2445 6084(17)N
+
+%%Page: 15 16
+15 p
+0(MF-logo)xf 0 f F
+10 s 10 xH 0 xS 0 f F
+9 s 9 xH 1 f F
+1152 664(Haifa)N
+1330(32000)X
+1152 752(Israel)N
+1152 840(yanai@israearn.bitnet)N
+47 f F
+1056 1016(\340)N
+1 f F
+1152(Daniel)X
+1362(M.)X
+1462(Berry)X
+1152 1104(Computer)N
+1458(Science)X
+1152 1192(Technion)N
+1152 1280(Haifa)N
+1330(32000)X
+1152 1368(Israel)N
+1152 1456(dberry@cs.technion.ac.il)N
+10 s 10 xH F
+2445 6084(18)N
+
+%%Trailer
+xt
+
+xs
diff --git a/fonts/utilities/mf2ps/doc/paper.ref b/fonts/utilities/mf2ps/doc/paper.ref
new file mode 100644
index 0000000000..bbc5117845
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/paper.ref
@@ -0,0 +1,1890 @@
+.nr [W \w'10'
+.nr [W \w'10'
+.pl 11.125i
+.de rb
+.ta 2m +5m +5m
+.nr t1\\n(.i
+.ls \\n(sq
+.in \\n(sem
+..
+.de rf
+.br
+.ne \\n(scu+\\n(sdu
+.sp \\n(sdu
+.ti -2m
+..
+.de LE
+.sp .5v
+..
+.de SU
+.ne 2v
+.br
+.ti 1.66P
+\f3\\$1\fP
+..
+.de Su
+.ne 2v
+.sp 1v
+\fB\&\\$1\fP
+..
+.de su
+.ne 3v
+.sp 1v
+.na
+\fB\&\\$1\fP
+.br
+.ad
+..
+.de PP
+.sp .5v
+..
+.de qb
+.in +\\n(sju
+.LL -\\n(sju
+.sp .5v
+..
+.de qe
+.in -\\n(sju
+.LL +\\n(sju
+.sp .5v
+..
+.de cl
+.ta\\n(sou +5m +5m
+.in+\\n(snu
+..
+.de dl
+.br
+.in-\\n(snu
+..
+.de ES
+.ft C
+.sp
+.nf
+.in +1.66P
+..
+.de EE
+.fi
+.ft R
+.sp
+.in -1.66P
+..
+.dehd
+.HS
+.nrhe+1
+.ie\\n(cn>1\{\
+.ie\\nc>\\n(cn\{\
+'sp\\n(bhu-1v
+.nr 1F \\n(.f
+.nr 1S \\n(.s
+.ft
+.ps
+.nr 2F \\n(.f
+.nr 2S \\n(.s
+.ft 1
+.ps 10
+.iee .tl \\*(Te
+.el.tl \\*(To
+.ft \\n(2F
+.ps \\n(2S
+.ft \\n(1F
+.ps \\n(1S
+'sp|\\n(thu
+.nrc 1 1
+.mkmx\}
+.el\{\
+.po+\\n(cwu+\\n(csu
+'sp|\\n(mxu\}\}
+.el\{\
+.if\\n(f5\{\
+.nr% +\\n(f5
+.nrf50 1\}
+'sp\\n(bhu-1v
+.nr 1F \\n(.f
+.nr 1S \\n(.s
+.ft
+.ps
+.nr 2F \\n(.f
+.nr 2S \\n(.s
+.ft 1
+.ps 10
+.iee .tl \\*(Te
+.el.tl \\*(To
+.ft \\n(2F
+.ps \\n(2S
+.ft \\n(1F
+.ps \\n(1S
+'sp|\\n(thu\}
+.chfx -\\n(tfu
+.chfo -\\n(tfu
+.if\\n(z1 .fz
+.chfo -\\n(tfu
+.if!\\n(f0 .ns
+.if\\n(f0\{\
+.nrf5\\n(f6
+.nrf6\\n(f7
+.nrf70
+.Ff
+.ie\\n(fa\{\
+.nrfa0
+.nrh21\}
+.el\{\
+.ie\\nx\{.if (\\n(nlu+5v)>(\\n(.p+\\nyu) .nr h1 1\}
+.el\{.if \\n(.tu<6v .nr h1 1\}\}\}
+.if\\n(h1=1\{\
+.nrh10
+'bp\}
+.if\\n(h2=1\{\
+.nrh20
+.fo\}
+.chfo (\\nyu-1v)
+.nrhe-1
+.HE
+..
+.defo
+.FS
+.if!\\n(he\{.if \\nx .xf\}
+.nrfa0
+.ie\\n(fg\{\
+.nrfa1
+.diGA\}
+.el\{\
+.ie\\n(cn<2\{\
+'chfo 32000
+'chfx 32000
+'sp(\\n(.pu-\\n(nlu-\\n(tfu+\\n(bfu-1v)u
+.nr 1F \\n(.f
+.nr 1S \\n(.s
+.ft
+.ps
+.nr 2F \\n(.f
+.nr 2S \\n(.s
+.ft 1
+.ps 10
+.iee .tl \\*(Be
+.el.tl \\*(Bo
+.ft \\n(2F
+.ps \\n(2S
+.ft \\n(1F
+.ps \\n(1S
+'bp\}
+.el.mf\}
+.FE
+..
+.demf
+.ie\\n+c<=\\n(cn .hd
+.el\{\
+.po\\n(cou
+.lt 6.63i
+'chfo 32000
+'chfx 32000
+'sp(\\n(.pu-\\n(nlu-\\n(tfu+\\n(bfu-1v)u
+.nr 1F \\n(.f
+.nr 1S \\n(.s
+.ft
+.ps
+.nr 2F \\n(.f
+.nr 2S \\n(.s
+.ft 1
+.ps 10
+.iee .tl \\*(Be
+.el.tl \\*(Bo
+.ft \\n(2F
+.ps \\n(2S
+.ft \\n(1F
+.ps \\n(1S
+'bp\}
+..
+.defn
+.ie\\nx .ne \\n(rcv-2v
+.el.ne \\n(rcv
+.if\\n(fn .AB"Nesting of footnotes is a no no"
+.nrfn1
+.daFN
+.ev1
+.ie\\n+x=1\{\
+.sp 10p
+\s-5\l'5P\(ul'\s+5
+.br\}
+.el.sp \\n(srv
+.fi
+.ad
+..
+.\" REFER macros .... citations
+.nr se 3u \" space to indent in emms
+.de []
+.][ \\$1
+..
+.de ][
+.if \\$1>5 .tm Bad arg to []
+.if !"\\*([O"" .if !\\n([O .as [O .
+.[\\$1
+..
+.ds RB ".RE
+.ds [. " [
+.ds .] ]
+.if n .ds [o ""
+.if n .ds [c ""
+.if t .ds [o \(lq
+.if t .ds [c \(rq
+.\" the next lines deal with the problem of .[1] or [1].
+.\" refer will write "linexxx\*(<.[1]\*(>.
+.\" and either "<." or ">." should produce the .;
+.\" similarly for ,
+.ds >. .
+.ds >, ,
+.de [5 \" tm style
+\\*([A, \\f2\\*([T\\f1,
+.ie \\n(TN \\*([M.
+.el UCLA Computer Science Department internal memorandum (\\*([D).
+.br
+..
+.de [0 \" other
+.if !"\\*([A"" \\*([A,
+.if !"\\*([O"" \\*([O
+.if !"\\*([D"" \& (\\*([D).
+.br
+..
+.de [1 \" journal article
+.if !"\\*([A"" \\*([A,
+.if !"\\*([T"" \\*([o\\*([T,\\*([c
+\\f2\\*([J\\f1\c
+.if !"\\*([V"" .if n \& Vol.\&\c
+.if !"\\*([V"" \& \\f3\\*([V\\f1\c
+.if !"\\*([N"" (\\*([N)\c
+.if !"\\*([P"" \{\
+.ie \\n([P>0 , pp.\c
+.el , p.\c
+\& \\*([P\c\}
+.if !"\\*([I"" .if "\\*([R"" , \\*([I\c
+.if !"\\*([D"" \& (\\*([D)\c
+\&.
+.if !"\\*([O"" \\*([O
+.br
+..
+.de [2 \" book
+.if !"\\*([A"" \\*([A,
+.if !"\\*([T"" \\f2\\*([T,\\f1
+\\*([I\c
+.if !"\\*([C"" , \\*([C\c
+.if !"\\*([D"" \& (\\*([D)\c
+\&.
+.if !"\\*([G"" Gov't. ordering no. \\*([G.
+.if !"\\*([O"" \\*([O
+.br
+..
+.de [4 \" report
+.if !"\\*([A"" \\*([A,
+\\*([o\\*([T,\\*([c
+\\*([R\c
+.if !"\\*([G"" \& (\\*([G)\c
+.if !"\\*([I"" , \\*([I\c
+.if !"\\*([C"" , \\*([C\c
+.if !"\\*([D"" \& (\\*([D)\c
+\&.
+.if !"\\*([O"" \\*([O
+.br
+..
+.de [3 \" article in book
+.if !"\\*([A"" \\*([A,
+.if !"\\*([T"" \\*([o\\*([T,\\*([c
+.if !"\\*([P"" pp. \\*([P
+in \\f2\\*([B\\f1\c
+.if !"\\*([E"" , ed. \\*([E\c
+.if !"\\*([I"" , \\*([I\c
+.if !"\\*([C"" , \\*([C\c
+.if !"\\*([D"" \& (\\*([D)\c
+\&.
+.if !"\\*([O"" \\*([O
+.br
+..
+.\" define warning that mX does not support references as footnotes
+.de ]-
+.AB"Can't do references as footnotes. Use '-e' or '-s' option with 'refer'
+..
+.de ]<
+.\" define the real ]- next-reference macro
+. de ]-
+. rm [V [P [A [T
+. rm [N [C [B [O
+. rm [R [I [E [D
+. rf
+\\\\*([F. \c
+\\..
+.\"now start the reference subsection
+\\*(RB
+.rb
+..
+.de ]>
+.re
+..
+.de ]]
+this is never
+executed
+and just
+uses up an end-of-file
+bug.
+..
+.de TS
+.sp
+..
+.de TE
+.sp .25v
+.ce
+\\$1
+.sp .5v
+.ien .ta .8i +.8i +.8i +.8i +.8i +.8i +.8i +.8i +.8i +.8i
+.el.ta .5i +.5i +.5i +.5i +.5i +.5i +.5i +.5i +.5i +.5i
+..
+.de ca
+.sp .5v
+.ce
+\&\\$1
+.sp 8p
+..
+.de CT
+.if \\n(ff .F0 "\\$1" "\\n%"
+..
+.nr sd 1i/24u \" # of inches to space between references (used as u).
+.nr sf 1.66P \" space to indent for paragraph (used as u).
+.nr sg 1u \" # of spaces needed before trap to start paragraph(used as v).
+.nr sh 0u \" # of spaces done to start a new paragraph (used as v).
+.nr si 1u \" # of spaces used to start an example (used as v).
+.nr sj 1.66P \" space to indent for an example (used as u);
+.nr sn 1.66P \" amount of space to indent for list (used as u).
+.nr so 1P \" amount of space to temp indent for each list entry (used as u).
+.nr sp 1i/12u \" spacing for each element of list (or sublist) (used as u).
+.nr sa 1v \" # of spaces to do before subtitles (used as u).
+.nr se 3u \" # of spaces to indent for a reference (used as ems).
+.nr sm 1i \" # of spaces of need to do a subtitle (used as u).
+.nr fv 3 \" set font variable for subtitles to Helvetica
+.nr si 1u \" # of spaces used to start an example (used as v).
+.nr sk 1u \" # of spaces left at the end of an example (used as v);
+.deRT
+.ien .ta .8i +.8i +.8i +.8i +.8i +.8i +.8i +.8i +.8i +.8i
+.el.ta .25i +.25i +.25i +.25i +.25i +.25i +.25i +.25i +.25i +.25i
+..
+.RT
+.EQ
+delim $$
+.EN
+.ds MF \f(LGMETA\%FONT\fP
+.ds TB \fITUG\%boat\fP
+.ds BZ B\o'e\(aa'zier
+.ds TX T\v'+.2m'\h'-.1m'E\h'-.1m'\v'-.2m'X
+.ds LT L\v'-.15m'\h'-.3m'\s-2A\s+2\v'.15m'\h'-.1m'T\v'.2m'\h'-.10m'E\h'-.10m'\v'-.2m'X
+.ds BT B\\h'-0.05m'\\s-2I\\h'-0.025m'B\\s0\\h'-0.08m'\\*(TX
+.ds pS P\s-2OST\%\s0S\s-2CRIPT\s0
+.ds P1 \f2P\fP\v'.2m'\s-3\f11\fP\s+3\^\v'-.2m'
+.ds P2 \f2P\fP\v'.2m'\s-3\f12\fP\s+3\^\v'-.2m'
+.ds P3 \f2P\fP\v'.2m'\s-3\f13\fP\s+3\^\v'-.2m'
+.ds P4 \f2P\fP\v'.2m'\s-3\f14\fP\s+3\^\v'-.2m'
+.en
+.LL 39.00P
+.ls 1
+.ds BL ''%''
+.hy 14
+The next page begins the paper. The macro package I use cannot start
+double columning until AFTER some text is printed..
+.pn 1
+.bp
+.MC 2 18.75P 1.5P 1i
+.mk xx
+\v'-1v'\l'18.7P'
+.sp |\n(xxu
+\s+2Environment for Translating
+.br
+\*(MF to \*(pS\s0
+.sp 3p
+.ti 1.66P
+Shimon Yanai and Daniel M. Berry
+.sp 8p
+\fBAbstract\fP
+.PP
+This paper describes a program, \fHmf2ps\fP, that translates a
+\*(MF font definition into a definition for the same font in the
+\*(pS language. \fHmf2ps\fP is constructed out
+of the part of the \*(MF program that extracts the envelopes of the
+letters; these envelopes are converted into \*(pS outlines.
+.su "1\ \ \ Introduction"
+.PP
+This paper describes a program, \fHmf2ps\fP,
+that takes from a \*(MF\*([.10,\|11\*(.]
+program for a font all the necessary information in order to
+create an equivalent \*(pS\*([.1\*(.]
+font definition. The program makes use of the front end of the
+\*(MF program to extract the envelopes of the letters to produce the
+\*(pS outlines. What makes this process natural is that both \*(MF and
+\*(pS make liberal use of \*(BZ curves to describe non-circular
+curves.
+.pp
+By producing this translator, it is hoped to be able to produce from
+\*(MF fonts \*(pS outline fonts which are more compact than the
+bitmapped fonts produced by the \*(MF program. Certainly the outline
+fonts are more easily scaled to other magnifications and possibly even
+other design sizes than are bitmaps. Moreover, doing so makes fonts
+heretofore available only on \*(TX\*([.9\*(.]
+and other DVI-based formatters,
+available on \fHditroff\fR\*([.8\*(.]
+and other formatters which have evolved,
+or have been designed, for use with \*(pS printers. This paper, which is
+typeset by \fHditroff\fR, uses a \*(pS version of the
+logo font in order to print the word \(lq\*(MF\|\(rq in the same appearance as
+in \*(TX-generated documents.
+Moreover, these new \*(pS outline fonts can be used in \*(TX also! One
+needs only the
+T\v'+.2m'\h'-.1m'E\h'-.1m'\v'-.2m'X\v'+.2m'\h'-.1m'P\h'-.1m'\v'-.2m'S\*([.3\*(.]
+software.
+.pp
+The organization of this paper is as follows. Section 2 presents the
+background of this work. Section 3 explains the rationale behind
+building the translator and describes a previous attempt at writing the
+translator and an approach to avoid. The software engineering aspect of
+the translator is described also in Section 3. The details of the
+implementation are exposed in Section 4. Section 5 describes the
+operation of the program. Section 6 evaluates the results. Finally
+Section 7 describes improvements to the translator that are left for
+future work.
+.su "2\ \ \ Background"
+.PP
+Typesetter formatting systems such as \*(TX and \fHditroff\fP use fonts
+as raw material. The formatters accept mixed text and commands as input
+and produce output, which, if sent to the laser printers or typesetters,
+yields formatted text printed on pages. The laser printers and
+typesetters use fonts, i.e., sets of printable patterns, one per
+character, in various representations in order to cause the desired
+characters to appear on the printed form. For some printers, bitmaps
+are used, with 1's representing inked dots and 0's representing
+non-inked dots. Other printers accept commands that cause drawing of
+the characters, the printer providing the inked dots according to the
+drawing commands. One such popular command language is \*(pS, and its
+usual use is to specify the outline of the character with the
+interpreting printer filling in the outline with ink. One popular
+method of describing fonts is with the \*(MF language, in which
+declarative definitions of how to paint the characters are given in
+terms of pen path and pen shape. Another popular method is the same
+\*(pS that many printers accept. The prime difference is that the \*(MF
+program translates the font definitions into bitmaps prior to sending
+the font to the printer while a \*(pS printer translates the outlines
+into bitmaps at the time of printing. Interestingly, both the \*(MF
+language and the \*(pS language use \*(BZ curves for describing the
+curves followed by the pen or the outlines. As usually configured
+these days, \*(TX uses bitmapped fonts in the Computer Modern family
+generated by \*(MF, and \fHditroff\fP uses \*(pS outline fonts supplied
+by Adobe.
+.pp
+The subsequent subsections delve deeper into these issues in order to
+be able to state the goal of this paper in the next section.
+.Su "2.1\ \ \ Fonts, design sizes, and magnifications."
+As mentioned, fonts are the raw material of typesetting. A font is a
+set of printable patterns, one for each character, that causes printing
+of that character in a particular recognizable style on the page. As
+mentioned, these patterns can be represented by bitmaps or drawing
+instructions.
+.pp
+Characters come in various sizes. There are two independent notions of
+sizing for fonts, point size or design size and magnification. The
+\fIdesign size\fP is the size at which the character is designed to be used
+and is, in well-designed text, the size in which the character appears
+in final, printed copy. Design size is
+usually expressed in units of points, which are each approximately 1/72
+of an inch. Most normal text in books, newspapers, and magazines is
+printed in 10 point type. Headlines are larger, perhaps as large as 30
+points. The \fImagnification\fP of a font is the inverse of the ratio
+between the design size of the character and the size of the
+character as it emerges on the printer, the assumption being that the
+final copy is a photo reduction of the printed copy. Thus, if photo
+reduction halves linear dimensions, one prints with magnification 2.
+If everything is done right, then after reduction, the letter appears at
+its design size.
+.pp
+A 10 point design sized font printed at mag\%ni\%fi\%ca\%tion 2 is similar to
+but not quite the same as a 20 point version of the same font.
+For example, the serifs on a large point size are smaller than they would
+be if strict linear magnification were used. Other proportions, e.g., of
+x-height to cap-height and of width to height, are also
+different. While many purists, Knuth
+included, insist on using a different pattern for each design size,
+many people accept magnification as yielding acceptable fonts at other
+point sizes. If the unit of magnification is not too big the results
+are acceptable even to many purists.
+.Su "2.2\ \ \ Problems with bitmapped fonts."
+A bitmap for a character is a rectangular array of bits covering the
+so-called bounding box or frame that exactly contains a letter. Figure
+1 shows a low resolution bit map for the letter \(lqN\(rq in a sans
+serif font. The inked squares or pixels are denoted by \(lq1\(rq bits
+and the uninked pixels are denoted by \(lq0\(rq bits.
+.fs
+.F+
+figure fig1.ps
+.F-
+.ca "Figure 1"
+.fe
+The low resolution example of Figure 1 illustrates a major problem
+with bitmapped fonts. Curved lines and straight lines that are neither
+vertical nor horizontal cannot be represented exactly by a rectangular
+pattern of pixels. One is forced to approximate them with rectangular
+steps. At high resolution, e.g. above 1000 or so, the human eye cannot
+see the steps, but at low resolution the steps are quite apparent.
+Visible steps are called \(lqjaggies\(rq after the jagged edges.
+.pp
+Bitmaps for a font must be built for each design size, magnification,
+and resolution. If the resolution is fixed, as is the case on most
+printers, a bitmap must be built for each design size and
+magnification. An attempt to use a given bitmap at a larger design
+size or magnification by just enlarging the area of each dot yields a
+bad case of jaggies.
+.Su "2.3\ \ \ \*(MF and its environment."
+.ft 1
+\*(MF, a language for the specification of fonts or typefaces, has been
+used to provide fonts for the \*(TX family of typesetting systems. A
+\*(MF user writes a program for each letter or symbol of an alphabet.
+These programs are different from the usual computer programs, because
+they are essentially declarative rather than imperative, using an
+algebraic language to describe the center stroke or edges of the characters. The
+description of a letter in \*(MF is a set of equations describing the
+strokes. When combined with parameters describing the pen shape and
+size, one gets a full description of a letter. Sizes and shapes of pen
+nibs can be varied in \*(MF and the characters can be built up in such
+a way that the outlines of each stroke are precisely controlled. Herein
+lies the advantage of \*(MF; a font is easily specified and variations
+are obtained by varying parameters.
+.pp
+Currently, the program that converts a set of \*(MF font descriptions
+into a bitmapped font translates the description of a letter combined
+with a point size and a magnification into a bitmap. This bitmap can be
+sent to the printer to get a letter on the page. Herein lies a
+disadvantage of \*(MF; a bit map must be kept for each point size and
+magnification, and this can require a lot of space.
+.Su "2.4\ \ \ The \*(pS language."
+The \*(pS language is an interpretive programming language with
+graphics capabilities. \*(pS's extensive page description capabilities
+are embedded into a general-purpose programming language framework. The
+language includes a conventional set of data types such as numbers,
+arrays, and strings, control primitives such as conditionals, loops and
+procedures, and some unusual features such as dictionaries. In most
+\*(pS fonts, each letter is described by an imperative program tracing
+the outline of the letter. This tracing may include curves given as
+\*(BZ curves, straight lines, arcs, etc. A \*(pS printer interprets
+this outline program to draw and fill in the letters on the page. Some
+consider the imperative nature of \*(pS to be a disadvantage in
+comparison to \*(MF's declarative nature. The main advantage of \*(pS
+relative to \*(MF is that one needs to keep only the outline. If, as in
+the usual case, the outline is specified in terms of a fixed path
+through Euclidean two-space, this outline may be scaled arbitrarily to
+yield any magnification. The scaling is done by the \*(pS interpreter
+at the printer. Thus the different magnifications do not require any
+additional storage space. Actually, the outlines are kept as if they
+were for the Adobe-standard 1000 dots
+per emm, which at a design size of 10 points amounts to 7200 dpi.
+Because a typical phototypesetter has a maximum resolution of
+about 2500 dpi, the outlines are said to be arbitrarily
+scaleable. If the outlines are kept, as are many \*(MF definitions, as
+paths through points calculated by the outline program, then it is
+possible to, say, make serifs grow more slowly than linearly. It would
+then be possible to have one \*(pS font scaleable to all design sizes.
+Generally, outline fonts are not written this way, so that strictly
+speaking they are scaleable only to all magnifications.
+.pp
+In addition, the \*(pS language has a way to work with bitmapped fonts.
+While the \*(pS printer can scale them before printing, the end result
+is that each of the fixed number of dots in the bitmap is made larger
+or smaller. Since the human will see larger dots as jagged lines, such
+fonts are not really considered scaleable.
+.Su "2.5\ \ \ \*(BZ curves."
+Both \*(MF and \*(pS use \*(BZ cubics to specify curves. For the \*(BZ
+form, four points are used, the start point, the end point, and two
+control points, as shown in the top half of Figure 2.
+The tangent vectors of the
+endpoints are determined from the line segments \*(P1\*(P2 and
+\*(P3\*(P4. The mathematical introduction of the \*(BZ form
+when given four points \*(P1, \*(P2, \*(P3, and \*(P4 is
+.sp
+.in +.125i
+$z(t)~=~(1-t) sup 3 "\*(P1" ~+~3t(t-1) sup 2 "\*(P2" ~+~3t sup 2 (1-t) "\*(P3" ~+~t sup 3 "\*(P4" ,$
+.sp
+.in -.125i
+for $0~<=~t~<=~1$.
+.pp
+Two characteristics of the \*(BZ form tend to make it widely used in
+graphics. First, by choosing the control points one can easily mold the
+curve to a desired shape. Second, the four control points taken in another
+order define a convex polygon, \*(P1 \*(P2 \*(P4 \*(P3 \*(P1 in this case,
+the \fIconvex hull\fR\h'-.05m', which bounds the \*(BZ
+curve. The convex hull is useful in clipping a curve against a window.
+.pp
+When a \*(MF user specifies a path, \*(MF creates a list of knots and
+control points for the associated cubic spline curves.
+If the user has not specified the control points explicitly, \*(MF
+itself finds some for the splines of a curve, while \*(pS requires all
+the four points to be explicitly given.
+.fs
+.F+
+figure fig2.ps
+.F-
+.ca "Figure 2"
+.fe
+.su "3\ \ \ \*(MF to \*(pS compiler\(em why\ and\ how"
+.ft 1
+.PP
+This section describes a major performance problem with \*(MF-generated
+fonts that perhaps can be solved by translating them into \*(pS fonts.
+The goals of this translation are established. Based on these goals, a
+particular approach is adopted to engineer the software largely from
+existing components.
+.Su "3.1\ \ \ A problem with \*(MF-generated bitmapped fonts."
+.ft 1
+In \*(MF, one gets one bitmap per point size and magnification. The
+size of these bitmaps grows as the square of product of the design size
+and
+the magnification and requires a large storage space. Files that are
+sent to the printer will be large, especially if lots of different
+point sizes or magnifications are used. In \*(pS with outline fonts,
+there is one outline per character which can be scaled arbitrarily to
+any magnification that might be needed. Moreover, \*(pS outline fonts
+are generally more compact than bitmapped fonts. For example, an
+enclosed rectangle is represented by its four corner points rather than
+by all the bits enclosed by the rectangle.
+.pp
+Certainly the outline fonts are more easily scaled to other
+magnifications. By scaling the bitmapped fonts downward, too much
+information is lost, and scaling upward introduces the jaggies.
+Moreover, the pixel array is device dependent; it is valid for output
+devices of only one particular resolution and one choice of possible
+data values per pixel. Scaleable fonts have a great advantage \(em you
+need only one font description file for all magnifications of that font.
+Actually, \*(pS outline fonts are more scaleable even than the \*(MF
+originals for another reason. In\*(<,\*([.9\*(.]\*(>,
+it is said, \(lqCaution:
+before using this `\fBat\fR' feature (i.e. scaling downward or upward) you
+should check to make sure that your typesetter supports the font at the
+size in question; \*(TX will accept any \(L<desired size\(L> that is positive
+and less than 2048 points, but the final output will not be right
+unless the scaled font really is available on your printing
+device.\(rq Getting \*(pS outline versions of \*(MF fonts is possible
+since both are based on \*(BZ curves. Doing so makes fonts heretofore
+available only on \*(TX and other DVI-based formatters available on
+\fHditroff\fR and other formatters which have evolved to or have been
+designed for use with \*(pS printers.
+.Su "3.2\ \ \ Goals."
+Based on the observations of Section 3.1,
+the goal of this research is to produce a \*(MF to
+\*(pS compiler, \fHmf2ps\fP. Its operational requirements are items 1
+through 5:
+.l1 1
+.le
+It must be possible to translate any legitimate \*(MF font definition
+at any given design size into a \*(pS outline font.
+.le
+The resulting \*(pS outline font should be arbitrarily scaleable.
+.le
+The resulting fonts should look like the bitmapped fonts when printed
+on the same printer.
+.le
+The resulting \*(pS outline font should be more compact \fIwhen sent to
+the printer\fP than a \*(pS version of the \*(MF-generated bitmapped
+font.
+.e1
+.sp .5v
+The fourth requirement deserves a bit of explanation and qualification.
+First note that what is compared is what is sent to the printer.
+Certainly there are compressed versions of the bitmapped fonts that
+reduce the disk storage requirements of the bitmapped fonts. However,
+they must be uncompressed before sending them to most printers. It is the
+printer's storage that is limited; generally disk space is in
+abundance. However, since printers these days are general purpose
+computers, what a printer accepts may in fact be a compression that it
+has been programmed to undo.
+.pp
+Now for the case in which disk space is of concern, the comparison
+should still be relative to printable versions. There exist algorithms,
+e.g. that of Lempel and Ziv\*([.13\*(.]
+that can be used to compress \*(pS outline fonts which are, after all,
+just ASCII files. Therefore, in order not to have a contest between
+compression algorithms, the uncompressed versions are compared. Furthermore,
+in order not to have a contest between different kinds of printers that may
+have differing font representations, \*(pS outline fonts are compared to
+\*(pS bitmapped fonts. When
+considering disk space, the fact that one bitmapped font is needed for
+each magnification is taken into account. Thus, the interest is in
+comparing the size of a scaleable outline font to the total storage for
+the bitmapped fonts for all magnifications of a given design size.
+.cl
+.le
+The resulting \*(pS outline font should be more compact than the total
+of the sizes of the \*(pS versions of the \*(MF-generated bitmapped
+fonts at each available magnification. Even this comparison is not
+completely fair since only specific magnifications are provided, while
+the \*(pS font is arbitrarily scaleable.
+.dl
+.sp .5v
+.pp
+Observe finally, that the comparison is against mag\%ni\%fi\%ca\%tions
+of a single design size since purists would argue that there should
+be a different outline font for each design size.
+Since there are those that do not
+require this purity, the various design sizes will be compared also.
+.pp
+The software engineering goal is item 6.
+.cl
+.le
+\fHmf2ps\fP should be written as much as possible using the existing
+\*(MF program both to save work and to ensure that all \*(MF-acceptable
+font definitions are handled.
+.dl
+.sp .5v
+The evaluation of the results will be
+done relative to these goals.
+.Su "3.3\ \ \ Previous attempts."
+Leslie Carr wrote a collection of programs to produce \*(pS outline
+fonts from \*(MF fonts in 1987. Carr's programs take as input the
+\fIlog\fR output file of \*(MF which contains a description of all
+the paths that \*(MF traces out in drawing a character.
+.pp
+Carr has problems of information loss as a result of not having entered
+into the \*(MF program. This is the reason why Carr's characters are
+poor looking. In\*(<,\*([.5\*(.]\*(>,
+Carr observes, \(lqIn the \&\fCcmr10\fP font,
+the \fIcrisp\fP pen has diameter zero, so serifs have square corners. In
+the \&\fCcmtt10\fP font, \fIcrisp\fP is set to a larger value and the serifs
+end in semicircles. Because the shape of the current pen can NOT be
+taken into account in \*(pS, these differences in the characters shapes
+will not be seen. This is a \fBfundamental\fR problem: given a path $p$
+and a pen $q$ (whose shape is also an arbitrary path), \*(MF
+effectively envelopes $p$ with respect to the shape of $q$; \*(pS can
+do nothing other than stroke it to produce a line of constant width.
+This incompatibility comes to light when the width of the pen is
+significant to the shape of the character\(rq.
+.pp
+In order to avoid this problem, \fHmf2ps\fP finds the internally
+generated envelope, which is used as the boundaries of the inked
+region, and uses this envelope as the outline. It does not matter, then,
+what the pen path and the pen shape are.
+.pp
+More recently, during the time that the work described herein was being
+done, there were other efforts with similar goals.
+.pp
+Doug Henderson\*([.6\*(.]
+obtained outline font characters by modifying the \&\fCendchar\fP macro,
+which is called for each character after the bitmap is generated, to take
+the bitmap for the character and white out all but the bits on the edge.
+The number of bits left on the edge is varied according to the resolution
+of the bitmap. These outlines, being bitmapped, are just as unscaleable as
+are the bitmaps for the filled-in characters.
+.pp
+Neil Raine and Graham Toal\*([.12\*(.]
+have developed software that takes the bitmaps and rediscovers the
+outlines by tracing the pixels. The outlines that are used as the basis
+for \*(pS fonts are, for the most part, generated from bitmaps at 2400
+dpi. They first generate RISC OS outline fonts which are screen fonts
+for Acorn's Archimedes RISC computer. These are true scaleable
+outlines. Then, these outlines are converted into \*(pS format. Toal
+says that the the quality of the fonts produced is not too great at low
+resolutions because of shortcomings in Adobe's rendering algorithm. He
+adds that at 1200 dpi on a phototypesetter, they are indistinguishable
+from \*(MF-generated bitmapped fonts. These authors suspect that
+information that is critical for good appearance is lost when tracing
+an outline on a bitmap generated from a mathematically described
+envelope. Better results should be obtainable using the original
+envelope.
+.pp
+John Hobby\*([.7\*(.]
+has developed a program called MetaPost, which translates from an extension
+of \*(MF into \*(pS cubic splines and commands.
+His goal was to turn \*(MF into a system for
+typesetting general graphics, including embedded text. His approach,
+similar to ours, was to modify the \*(MF program into what he desired.
+Befitting his more general goals, besides modifying the output, he has
+added new commands to the input language. Moreover, his translation appears
+to be a direct mapping from a \*(MF command sequence to a
+\*(pS command sequence.
+The result is a program more powerful than \fHmf2ps\fP.
+It will be interesting to compare fonts produced by MetaPost and
+\fHmf2ps\fP for appearance and performance.
+.Su "3.4\ \ \ Methodology."
+There are a number of ways to build the compiler. They include
+.l1 1
+.le
+writing the whole compiler from \*(MF to \*(pS from scratch: This has
+the advantage that one does not have to get into another person's
+software, which is not very pleasant when the software is so big. On
+the other hand, one would have to treat the whole job of turning
+mathematical equations and any arbitrary pen shape into outlines.
+.le
+using the \*(MF output as was done by Leslie Carr\*([.5\*(.]:
+This has the advantage of not requiring delving into another's
+software, but the generated information is not enough if one wants no
+deviations from the originals.
+.le
+getting into the \*(MF program: This requires examining the internals
+of the \*(MF program. However, \*(MF and \*(pS make liberal use of
+\*(BZ curves to describe non-circular curves. This fact makes the
+translation process natural. For each specified path, \*(MF creates
+control points for the associated cubic spline curves before
+calculating the bit map. \*(MF also calculates the edge offsets implied
+by the pen shape. Using the necessary information one can get a new set
+of control points that define \*(BZ curves and lines that are needed to
+build the \*(pS outline fonts.
+.e1
+.Su "3.5\ \ \ Software engineering of solution."
+The idea is to split the \*(MF program into front end and back end. The
+front end takes \*(MF specification of a character, magnification, and
+point size, and produces the envelope, i.e., the outline of the
+character, and the back end fills the envelope with bits. Taking the
+existing front end and writing a new back end that converts the
+envelope into a \*(pS specification of an outline is our method of
+producing \fHmf2ps\fP. The bit-filling process will be done by the
+printer.
+.pp
+In order to make \*(pS fonts arbitrarily scaleable, we have to ask the
+\fHmf2ps\fP program to use a very large magnification, at least to try to
+match the grid on which Adobe plots the points of its outlines. Adobe plots
+its characters on a $1000~times~1000$ grid. Thus, Adobe's resolution is
+1000 dpm (dots per em), which for design size 10 points is 7200 dpi.
+Unfortunately, \*(MF, and thus \fHmf2ps\fP accepts resolutions only up to
+3000 dpi. The results should be sufficient to produce fonts scaleable
+up to magnification 7 or 8, which is a reasonable range in
+typesetting.
+.pp
+This approach helps meet goal 6 because the original unchanged \*(MF
+program is used. Thus, exactly the same input is accepted as in the
+\*(MF program. There is some extra frosting obtained by the chosen
+approach. The program for translating \*(MF to \*(pS is actually a bit
+of an interactive environment because the new back end is an extension
+of the existing one. This existing back-end provides an interpreter
+that executes a \*(MF character definition and displays the defined
+character on the screen. Figure 3
+shows the dump of a screen containing several windows, one showing a
+\*(MF definition, another showing the result of its interpretation, and
+a third containing the \*(pS translation of the definition in the first
+window. If software to interpret \*(pS definitions were available here,
+a fourth window could be set up showing the result of interpreting the
+translation of the third window. This would allow comparison of the
+character's appearances without having to print them on paper.
+.su "4\ \ \ The program"
+.PP
+In the following discussion, the \*(MF program is often called just
+\(lq\*(MF\|\(rq.
+.pp
+The \*(MF program has been written so that it can be made to run
+efficiently in a wide variety of operating environments by making
+comparatively few changes. Such flexibility is possible because the
+program is written in the \&\fCWEB\fR language which is at a higher level
+than Pascal. The preprocessing step that converts \&\fCWEB\fR to Pascal
+is able to introduce most of the necessary refinements. Semiautomatic
+translation to other languages is also feasible, because the program
+does not make extensive use of features that are peculiar to Pascal.
+.pp
+The program has two important variations: First, there is a long and slow
+version called \s-1\fHINIMF\fR\s0, which does the extra calculations needed to
+initialize \*(MF's internal tables. It has to be run first. It
+initializes everything from scratch without reading a base file, and it
+has the capability of dumping a base file. Secondly, there is a shorter and
+faster production version called \s-1\fHVIRMF\fR\s0, which cuts the
+initialization to a bare minimum. It is a virgin program that needs
+to input a base file in order to get started. \s-1\fHVIRMF\fR\s0 typically has
+more memory capacity than \s-1\fHINIMF\fR\s0, because it does not need the
+space consumed by the dumping and undumping routines, etc.
+.pp
+In order to generate a compiler that translates \*(MF to \*(pS,
+additional external procedures and functions were added to the \*(MF
+program so that it runs exactly the same except that when it asks for
+an output file name, it asks for an additional name, for the extra
+output file that is to contain the \*(pS outlines. Those changes were
+made on the Pascal version of the \s-1\fHVIRMF\fR\s0, and were compiled later
+with \*(MF's library files.
+(It was a complete oversight on our part not to have modified the
+\&\fCWEB\fP version of \s-1\fHVIRMF\fP\s0.)
+A few extra lines were added to the
+macro file, \&\fCplain.mf\fR. These act as flags, identifying that
+\*(MF has entered some of the macros.
+.Su "4.1\ \ \ Basic idea."
+To specify a character in \*(MF, one specifies either
+an envelope (outline) or
+a center-line path and a pen head.
+For the former, \*(MF just fills the envelope with bits.
+For the latter, \*(MF pretends that it is drawing the character
+with a pen of specified
+head shape following the specified path, i.e., the center of the head
+stays on the path. The distance from the center-line path and outer
+edge of ink trail left by pen head is called the \fIoffset\fR\h'-.1m'.
+So, for a character, \*(MF follows the center-line path to calculate the path
+of offset points, i.e., the envelope, and then fills the envelope with
+bits.
+In either case, \*(MF ends up filling an envelope.
+.pp
+We need to break \*(MF into a front end and a back end at the point
+just after the envelope has been calculated. Then we provide a new back
+end that converts the envelope into \*(pS instead of filling the
+envelope with bits. Note then that the \*(pS printer will fill in the
+envelope with bits as it fills the path obtained from the envelope.
+.pp
+The following subsections describe the data and the calculations
+involved in the new back end.
+.Su "4.2\ \ \ Data structures."
+The main data structures that \*(MF keeps for a character are the
+center-line path, the pen shape, and the envelope path. There are a few
+operations that can be performed on paths, called transformations.
+.SU "4.2.1\ \ \ \*(MF's path representation."
+.ft 1
+When a \*(MF user specifies a path, \*(MF creates a list of knots and
+control points for the associated cubic spline curves. If the knots are
+$z sub 0 ,~z sub 1 ,...,~z sub n$, there are control points $z sub k
+sup +$ and $z sub k+1 sup -$ such that the cubic splines between the
+knots $z sub k$ and $z sub {k+1}$ are defined by the \*(BZ formula
+.sp
+.in +.4375i
+$z(t)~=~B(z sub k, z sub k sup + , z sub k+1 sup - , z sub k+1 ;t)$
+.sp .2v
+\h'\w'$z(t)~$'u'$=~(1~-~t) sup 3 z sub k ~+~ 3t(t~-~1) sup 2 z sub k sup +$
+.sp .2v
+\h'5P'$+~ 3t sup 2 (1~-~t)z sub k+1 sup - ~+~ t sup 3 z sub k+1$,
+.sp
+.in -.4375i
+for $0~<=~t~<=~1$.
+.pp
+There is a 7-word node for each knot $z sub k$, containing one word of
+control information and six words for the $x$ and $y$ coordinates of $z
+sub k sup -$ and $z sub k$ and $z sub k sup +$. The control
+information appears in the \fIleft_type\fR and \fIright_type\fR
+fields and they specify properties of the curve as it enters and leaves
+the knot. There is also a \fIlink\fR field, which points to the
+following knot. Before the \*(BZ control points have been calculated,
+the memory space they will ultimately occupy is taken up by information
+that can be used to compute them. The \*(MF \fImake_choices\fR
+procedure chooses angles and control points for the splines of a curve
+when the user has not specified them explicitly.
+.SU "4.2.2\ \ \ \*(MF's path transformation."
+.ft 1
+When \*(MF digitizes a path, it reduces the problem to the special case
+of paths that travel in the \fIfirst octant\fR directions; i.e., each
+cubic $z(t)~=~(x(t),y(t))$ being digitized will have the property that
+$0~<=~y prime (t)~<=~x prime (t)$. This assumption makes digitizing
+simpler and faster than if the direction of motion has to be tested
+repeatedly. When $z(t)$ is cubic, $x prime (t)$ and $y prime (t)$ are
+quadratic, hence each of the four polynomials, $x prime (t)$, $y prime (t)$, $x
+prime (t) - y prime (t)$, and $x prime (t) + y prime (t)$, crosses
+through $0$ at most twice. If we subdivide the given cubic at these
+places, we get at most nine subintervals. In each of these intervals
+each of $x prime (t)$, $y prime (t)$, $x prime (t) - y prime (t)$, and
+$x prime (t) + y prime (t)$ has a constant sign. The curve can be
+transformed in each of these subintervals so that it travels entirely
+in first octant directions, if we exchange $x$ and $- x$, $y$ and $-
+y$, and $x$ and $y$ as necessary.
+.Su "4.3\ \ \ Pens and envelopes."
+There are two kinds of pen heads that may be used, polygonal and
+elliptic. There are a number of trade-offs involved in their use. The
+first subsection treats the case of an $n$-vertex polygonal pen shape
+and the second treats the case of an elliptical pen shape. Both
+describe the influence of pen shape on the envelope of the font.
+.SU "4.3.1\ \ \ Polygonal pens."
+Suppose that the vertices of a polygon are $w sub 0 ,~w sub 1 ,...,~w
+sub n-1 , ~w sub n ~=~ w sub 0$ in counterclockwise order. A convexity
+condition requires that each vertex turns left when one proceeds from
+$w sub 0$ to $w sub 1$ $...$ to $w sub n$. The envelope is obtained if we
+offset a given curve $z(t)$ by $w sub k$ when that curve is traveling
+in a direction $z prime (t)$ lying between the directions $w sub k - w
+sub k-1$ and $w sub k+1 - w sub k$. At times $t$ when the curve
+direction $z prime (t)$ increases past $w sub k+1 - w sub k$, \*(MF
+temporarily stops plotting the offset curve and inserts a straight line
+from $z(t) + w sub k$ to $z(t) + w sub k+1$; notice that this straight
+line is tangent to the offset curve. Similarly, when the curve
+direction decreases past $w sub k - w sub k-1$, \*(MF stops plotting
+and inserts a straight line from $z(t) + w sub k$ to $z(t) + w sub
+k-1$; the latter line is actually a retrograde step, which will not be
+part of the final envelope under \*(MF's assumptions. The result of
+this consideration is a continuous path that consists of alternating
+curves and straight line segments. The segments are usually so short,
+in practice, that they blend with the curves.
+.SU "4.3.2\ \ \ Elliptical pens."
+To get the envelope of a cyclic path with respect to an ellipse, \*(MF
+calculates the envelope with respect to a polygonal approximation to
+the ellipse. This has two important advantages over trying to obtain
+the exact envelope:
+.l1 1
+.le
+Polygonal envelopes give better results, because the polygon has
+been designed to counteract problems that arise from digitization; the
+polygon includes sub-pixel corrections to an exact ellipse that make
+the results essentially independent of where the path falls on the
+raster.
+.le
+Polygonal envelopes of cubic splines are cubic splines. Hence it is
+not necessary to introduce completely different routines. By contrast,
+exact envelopes of cubic splines with respect to ellipses are
+complicated curves, more difficult to plot than cubics.
+.e1
+.Su "4.4\ \ \ Taking out data."
+After \*(MF has calculated the paths and the offsets, it is ready to
+send the values to the \fImake_moves\fR procedure which generates
+discrete moves for any four points that represent a \*(BZ curve. This
+is done for each one of the cyclic paths from which the letter is built.
+When the offsets are zero, this is done by the \fIfill_spec\fR
+procedure. Otherwise this is done by the \fIfill_envelope\fR
+procedure. In the latter case, the line segments, which were discussed
+earlier, should be taken out also in order to get smooth connections
+between the different curves that the cyclic path is built from.
+Because \*(pS describes any shape in terms of curves and lines, this is
+the point to take advantage of \*(MF's calculations, i.e., when \*(MF
+calls the \fImake_moves\fR procedure and when \*(MF draws line
+segments for offset corrections.
+.Su "4.5\ \ \ Processing the data."
+The generated data are not ready yet to be used. First, we should
+unskew, i.e., transform from the first octant back to the original, the
+paths according to the octant that the paths were traveled in before
+they were skewed. This unskewing is done by taking out the octant
+number at the moment that the \fImake_moves\fR procedure is called
+and then using \*(MF's \fIunskew\fR procedure that sets values $x
+prime$ and $y prime$ to the original coordinate values of a point,
+given an octant code and coordinates $(x,y)$ after they have been
+mapped into the first octant and skewed; the new values are sent to the
+\fIsend_p_s\fR procedure. This procedure has eight formal parameters
+that are all used when sending a curve. When sending a line,
+only four parameters are used, two to denote the start point and two to
+denote the end point; the remaining four parameters are sent as zeros
+so \fIsend_p_s\fR can distinguish whether a line was sent or a curve.
+In the next step, \fIsend_p_s\fR unscales the numbers because \*(MF
+works with units of scaled points, of which there are $2 sup 16$ in an
+ordinary point. While unscaling, the values are
+transformed in order to send them to the \*(pS dictionary
+\&\fCFontBBox\fP command. After this pre-processing,
+the data are sent to a temporary file.
+.SU "4.5.1\ \ \ Getting more information."
+When \*(MF calls the \fImake_moves\fR procedure, it does not have any
+information on the role that this path is going to play, whether the
+current cyclic path is going to be \fIfilled\fP or whether it will act as
+a boundary of a region to be \fIerased\fP.
+.pp
+In order to distinguish between the cases, more information has to be
+taken. This is done by copying the \&\fCplain.mf\fR file into a new
+file named \&\fCmyplain.mf\fR and adding a few lines to it. The
+additional code was added in order to identify \*(MF's use of the
+macros. \*(MF uses the variables for date only once, when the program
+is started, so it was decided to use them in the rest of the
+program.
+The \&\fCyear\fR is changed to $-1$ when \*(MF's \&\fCpen_stroke\fR
+macro is applied on a cyclic path, i.e., in the characters such as
+\(lqo\(rq, \(lqO\(rq, and \(lqQ\(rq, and to $-2$ when the \&\fCerase\fR
+macro is called. The \&\fCmonth\fR is changed when the \&\fCfill\fR
+macro is called. There are three kinds of paths:
+.l1 1
+.le
+paths to be \fIfilled\fP are processed using the \*(pS \&\fCfill\fR
+command.
+.le
+paths to be \fIstroked\fP are processed using the \*(pS \&\fCeofill\fR
+command.
+.le
+paths to be \fIerased\fP are processed using specialized procedures
+which will be discussed later.
+.e1
+.sp .5v
+.pp
+A letter cannot always be treated as one unit by means of the
+\&\fCfill\fR and \&\fCeofill\fR commands. For instance, the letter
+\(lqQ\(rq is built of two different paths, the first of which is
+stroked and the second of which is filled. Generating the letter
+using the \*(pS \&\fCeofill\fR command causes a hole in the image (see
+Figure 4).
+.fs
+.F+
+figure fig4.ps
+.F-
+.ca "Figure 4"
+.fe
+So while generating a letter, fill mode can be changed for each cyclic
+path. Moreover, when generating a letter whose paths should be filled,
+it is not always possible to use just one \&\fCfill\fR command (see
+Figure 5).
+.fs
+.F+
+figure fig5.ps
+.F-
+.ca "Figure 5"
+.fe
+When a \*(pS \&\fCfill\fR command is applied to a path that is composed
+of more than one subpath, say two for the sake of simplicity, and one
+subpath is inside the other and is drawn in a direction opposite to the
+external one, the internal path is considered a hole and is not filled
+(see Figure 6).
+.fs
+.F+
+figure fig6.ps
+.F-
+.ca "Figure 6"
+.fe
+So, if several paths are to be filled in this manner, the description
+of each one of them should be ended with the \&\fCfill\fR command.
+There is one more benefit to using this strategy: The \*(pS \fCcurrent
+path\fR stack becomes empty after encountering any kind of \&\fCfill\fR
+command. Therefore, using the \&\fCfill\fR command after each path can
+help avoid \&\fCstack overflow error\fRs if all paths together are too
+long.
+.SU "4.5.2\ \ \ Treating erasing paths."
+There are three methods of handling the problem of paths that should be
+erased by \fHmf2ps\fP itself:
+.l1 1
+.le
+filling with white: Because erasing paths are built in order to erase
+an existing filled area and \*(pS overlaps paths (i.e., a region is
+shown in the color that was drawn last), erasing paths can be
+implemented by filling those paths with white. This solution is the
+easiest, but it works only if the background is white and the letter is
+drawn in some level of gray. If one wants to draw a letter with
+background other than white, the resulting appearance will not be correct.
+.pp
+.le
+calculating new paths resulting from subtracting the erasing paths from
+the previous filled paths: Such a solution can be global. However, it
+costs a lot in terms of processing time and accuracy, because paths are
+given implicitly by four points, and in order to calculate the new
+paths, one should find the intersection points of \*(BZ curves, i.e.,
+to find points that lie on both \*(BZ curves, and then calculate new
+curves, which are difficult to calculate from those points.
+.pp
+.le
+using the \*(pS \&\fCeoclip\fR command: Be\%cause the letters are bounded
+in a $1000~times 1000$ box, a primary square path whose segments are
+$1000$ units long should be declared and after it all the erasing paths
+should be listed. After relocating the erasing paths we are ready to
+declare \&\fCeoclip\fR, which means that the clipping path is the
+external primary one and the internal paths, the erasing paths, are
+holes. This is an elegant solution that uses the power of the language
+and is available in simple situations in which there is no intersection
+between the erasing paths (see Figure 7).
+If there were intersections, a little more
+sophisticated use of the \&\fCeoclip\fR command would be needed. Relocation
+of the erasing paths is done by the procedure \&\fCdoarrange\fR.
+.e1
+.fs
+.F+
+figure fig7.ps
+.F-
+.ca "Figure 7"
+.fe
+.pp
+There are other problems caused by the erasing paths. Because the
+erasing paths have segments in common with paths to be filled, \*(pS must
+decide whether the common segments are in the clipping path or not.
+\*(pS does not seem to have a consistent policy on that and it seems to
+be that the decision is taken arbitrarily (see Figure 8).
+.fs
+.F+
+figure fig8.ps
+.F-
+.ca "Figure 8"
+.fe
+An attempt to resolve the clipping path problem led to the first author
+sending the following electronic message (obviously, not as nicely
+formatted as herein) to Glenn Reid of Adobe Systems, Inc.
+.qb
+.nf
+From simon Tue Mar 21 13:22:32 1989
+To: greid@adobe.com
+Subject: Problem in PostScript
+.fi
+.sp
+Dear Mr. Reid
+.sp
+I have got a problem in understanding the PostScript
+policy in determining \(lqwhat is in the clipping path\(rq.
+I think there is a problem in the boundaries.
+Here is an example that shows that problem:
+.es
+.ft C
+ gsave
+ initclip
+ newpath
+
+ 0 0 moveto
+ 0 1000 lineto
+ 1000 1000 lineto
+ 1000 0 lineto
+ 0 0 lineto
+
+ 300 100 moveto
+ 700 100 lineto
+ 700 300 lineto
+ 300 300 lineto
+ 300 100 lineto
+
+ 700 900 moveto
+ 300 900 lineto
+ 300 700 lineto
+ 700 700 lineto
+ 700 900 lineto
+
+ eoclip
+
+ newpath
+ 100 100 moveto
+ 900 100 lineto
+ 900 900 lineto
+ 100 900 lineto
+ 100 100 lineto
+ fill
+ grestore
+.ee
+.ft R
+As you see, the problem is that on top of the shape, the line
+which belongs to the upper \(lqhole\(rq in the clipping path and to the
+current path ( to be filled ) is drawn, and on bottom of the
+shape it is not.
+.sp
+This is happening both on the Apple Laser printer and on the
+QMS-80.
+.sp
+I would be glad to have a reply from you.
+.sp
+.nf
+Thanks in advance
+Shimon Yanai
+C.S Dep.
+Technion
+.fi
+.qe
+What Mr. Reid saw when he printed the \*(pS commands contained in the
+message is reproduced in Figure 9.
+.fs
+.F+
+figure fig9.ps
+.F-
+.ca "Figure 9"
+.fe
+Mr. Reid replied with the following:
+.qb
+.nf
+From: greid@adobe.com (Glenn Reid)
+To: Shimon Yanai <simon@techunix>
+Cc: greid@adobe.com
+Subject: Re: Problem in PostScript
+In-Reply-To: Your message of Wed, 22 Mar 89 ...
+Date: Wed, 22 Mar 89 11:41:35 PST
+.fi
+.sp
+The problem is that the path you are filling falls exactly on the edge
+of the clipping path. This produces a zero-width area to fill, and
+unfortunately it sometimes fills and sometimes does not with the
+current fill algorithm. I believe that it is related to the direction
+of the paths; if the paths are going in opposite directions along the
+same line, it will fill with a one-pixel area, but if they are going in
+the same direction, it will not fill.
+I believe this has been fixed to be more consistent in Display
+PostScript, for what it's worth.
+.sp
+Glenn Reid
+.br
+Adobe Systems
+.qe
+.pp
+The idea of using opposite directions had been checked before sending
+the letter, so the problem had to be solved within the back end of
+\fHmf2ps\fP. The
+erasing paths near the top of the letter had their $y$ coordinates
+increased by 0.8 points, and those near the bottom had their $y$
+coordinates decreased by the same amount. This shift is invisible to
+the human eye because the font definitions are in terms of hundreds of
+points (see Figure 10). This solution was designed to work with most
+existing \*(MF fonts. It is possible that there will be fonts that are not
+treated well by this solution.
+.fs
+.F+
+figure fig10.ps
+.F-
+.ca "Figure 10"
+.fe
+.Su "4.6\ \ \ Optimization."
+Optimization is done in order to make the description of the fonts
+shorter and to save work in the \*(pS interpreter. This is done in
+three ways:
+.l1 1
+.le
+not printing lines with length zero. As was said earlier, the \*(MF
+program prints lines to connect offset points. There are times that
+after rounding or truncating the output data, the start point and the
+end point are equal. In such cases, the lines are eliminated.
+.le
+checking if the \*(BZ curve acts as a line. From the definition of the
+\*(BZ curve, it is known that if the two control points lie on the line
+that connects the start point and the end point, the curve is of degree
+one. In such cases \fHmf2ps\fP generates a command to print a line from
+the start point to the end point, thus saving space and avoiding
+redundant calculations for the \*(pS interpreter.
+.le
+checking if a series of consecutive line segments are in the same line.
+This is done by storing the segments in a buffer and checking whether a
+new segment is collinear with the last stored.
+.e1
+.Su "4.7\ \ \ Changed or added routines."
+The following is a list of routines that were changed or added in order
+to build \fHmf2ps\fP from \*(MF.
+.in +1P
+.LE
+\fIprintchar\fP was modified to get character names.
+.LE
+\fIfixdateandtime\fP was modified to initialize variables that were used as flags in the macros.
+.LE
+\fIfillspec\fP was modified to send out data on splines.
+.LE
+\fIskewlineedges\fP was modified to send out offset lines.
+.LE
+\fIdualmoves\fP was modified to send out offset lines.
+.LE
+\fIfillenvelope\fP was modified to send out data on splines.
+.LE
+\fIdostatement\fP was modified to identify tokens that are strings.
+.LE
+\fImain\fP was modified to call the \fHmf2ps\fP procedure in the beginning and ending of the program.
+.LE
+\fIsendcurve\fP was added to unskew spline values and to send them to the next process.
+.LE
+\fIsendline\fP was added to unskew line values and to send them to the next process.
+.LE
+\fIok\fP was added to check if two lines are collinear.
+.LE
+\fIrestore\fP was added to restore the parameters of the last line.
+.LE
+\fIrecall\fP was added to recall values from the buffer.
+.LE
+\fIus\fP was added to convert the \*(MF scale so that a letter would fit the
+Adobe standard $1000~times~1000$ bounding box.
+.LE
+\fIsend_p_s\fP was added to create a \*(pS file of lines and curves.
+.LE
+\fImakemoves\fP was modified to send out spline data.
+.LE
+\fIdump\fP was added to append information from the file named \&\fCf\fP to the file named \&\fCg\fP.
+.LE
+\fIcheckerase\fP was added to identify the file that contains \(lqerase\(rq commands, and their position within the file.
+.LE
+\fIdoarrange\fP was added to put erasing paths at the beginning of the file.
+.LE
+\fIprint_start\fP was added to signal the beginning of a new cyclic path to be processed.
+.LE
+\fIprint_end\fP was added to signal the end of the current cyclic path.
+.LE
+\fIinit_ps\fP was added to make initializations.
+.LE
+\fImakenewdef\fP was added to make initializations when more than one character
+occurs in the input.
+.LE
+\fIcloseolddef\fP was added to close the last definition.
+.LE
+\fItini_ps\fP was added to handle the ending of the process.
+.LE
+\fIauxprintchar\fP was added to print characters.
+.LE
+\fIauxprint\fP was added to print strings.
+.in -1P
+.su "5\ \ \ Operation of \fHmf2ps\fP in a \fHU\s-2NIX\s0\fP environment"
+.ft 1
+.PP
+When invoked,
+\fHmf2ps\fP
+first asks for an output file name. For the example this file is called
+\&\fCex1\fP. \fHmf2ps\fP then asks,
+.ES
+.fi
+.na
+\(lq\&\fCAre you creating the whole dictionary (y/n)?\fP\(rq.
+.EE
+.ad
+If the answer is other than \(lq\&\fCy\fP\(rq
+or \(lq\&\fCY\fP\(rq, it is considered \(lq\&\fCno\fP\(rq. If the
+answer is \(lq\&\fCy\fP\(rq or \(lq\&\fCY\fP\(rq, then the whole
+dictionary is created. This means that \fHmf2ps\fP creates a \*(pS
+dictionary that includes entries for all the characters that are in
+the input, e.g., \&\fCcmr10\fP set. This dictionary needs additional
+definitions such as \fIleft side bearing, width, bounding box\fP, etc.
+These definitions need information on character features that must be
+calculated within the program. Otherwise, the whole dictionary is not
+created and the program treats the input as a single character
+definition that is to be translated into a \*(pS outline definition.
+After \fHmf2ps\fP prompts \(lq\&\fC**\fP\(rq, we are in the \*(MF
+environment. Now the user inputs
+.ES
+\s-1\\mode=hires;\\nodisplays;\\input cmr10;\(cr\s0
+.EE
+After \fHmf2ps\fP has finished, the resulting \*(pS font dictionary can
+be used to print text. In order to print text, the font dictionary
+should be installed in some formatter's font source directory, and then
+it can be loaded through the formatter's commands. The dictionary
+followed by appropriate \fHshow\fP and \fHshowpage\fP commands can also
+be sent directly to the printer.
+.su "6\ \ \ Evaluation of results"
+.PP
+This section evaluates the \fHmf2ps\fP program relative to goals
+established in section 3.2. The program was produced as a variation of
+\*(MF and it accepts any \*(MF font definition and produces a \*(pS
+outline font scaleable up to magnification 8, or to point size 80 if
+you are not a purist. Thus goals 6 and 1 have been entirely met and
+goal 2 is partially met. To meet goal 2 fully the program must be
+modified to allow large enough arrays to handle magnifications up to
+7200; this is left to future work.
+.pp
+It remains to evaluate the appearance and sizes of the outline fonts
+relative to the bitmapped fonts to see if goals 3, 4, and 5 have been
+met.
+.Su "6.1\ \ \ Appearance."
+In order to compare appearances, the outline font (Sub\%sub\%fi\%gure P)
+and and the 300 dpi bitmapped font (Sub\%sub\%fi\%gure M) generated from
+the same \*(MF definition are used to
+print similar sentences at one, two, or three different sizes or
+magnifications on three devices of differing resolutions.
+The sentences are printed in the \&\fCcmr\fP (Sub\%fi\%gure R),
+\&\fCcmtt\fP (Sub\%fi\%gure T), and \&\fClasy\fP (Sub\%fi\%gure S) typefaces.
+The bitmapped fonts may be printed at design sizes 7, 8, 10, or 12, and
+the outline fonts may be printed at magnifications .7, .8, 1.0, or 1.2.
+Finally, the three devices are the 300 dpi LaserWriterII (Figure
+11-LW300), the 600 dpi Varityper (Figure 11-VT600), and the 1270 dpi
+Linotronic 300 (Figure 11-LT1270). The bitmapped font examples are
+formatted with \*(TX while the outline font examples are hand-coded \*(pS
+files sent directly to the printer. Since the
+formatter with which this paper is printed can use arbitrary \*(pS
+fonts, half of the examples could have been done in-line without
+pasting in. However, for fairness in the comparison, all examples were
+cut out and pasted in.
+.pp
+There are visible differences due to differences in the formatting
+software. \*(TX squeezes the letters closer together than does the \*(pS
+engine. Moreover, the interword space is constant in the \*(pS
+dictionary but is varied by \*(TX according to the line structure.
+These differences are not the differences that are at issue here.
+.pp
+On the 300 dpi device, the characters from the bitmapped fonts print thinner
+than are those of the outline fonts. However, the edges of both sets are
+equally smooth or jagged as the case may be in all sizes. Overall, then,
+the appearance of the characters of the bitmapped fonts is crisper than
+that of the outline fonts.
+On the higher resolution devices,
+the thicknesses of the characters are closer to being
+equal at all sizes. Thus, the \*(MF program does a better job of building a
+correctly sized bitmap at 300 dpi than does the 300 dpi \*(pS engine of the
+LaserWriterII. The latter seems to round up too much. However, both
+seem to get the edges equally smooth even at low sizes and low resolutions.
+.pp
+At the two higher resolutions, the outline fonts are significantly better
+than the outline fonts at lower resolutions and are significantly better
+than the bitmapped fonts at the same resolution of printing. However, this
+latter is true because the bitmapped fonts were generated by the \*(MF
+program specifically to be printed at 300 dpi.
+When a 300-dpi bitmap is printed with no scaling at 600 or 1270 dpi, it
+remains a 300-dpi bitmap. As expected, the 300-dpi bitmapped fonts print better
+at 300 dpi than they do at the two higher resolutions.
+.pp
+The generated outlines are not fine-tuned for printing at low resolutions,
+such as 300 dpi,
+as are the \*(MF-generated bitmaps. It might be useful to make use of
+the \*(pS facilities for hinting to improve the appearance of the
+characters printed from the outlines at low resolutions.
+.pp
+Figure 12 shows samples of similar sentences printed on the same three
+devices using the standard Helvetica, Times
+Roman, and Courier \*(pS outline fonts built into most \*(pS-executing
+laser printers.
+It appears to these authors that the standard \*(pS fonts are
+significantly better than those generated from \*(MF fonts. However,
+this is not surprising. Adobe uses a grid of $1000~times~1000$ for its
+character definitions, resulting in a resolution of 7200 dpi for characters
+printed at point size 10.
+Because of size limitations of the
+\*(MF program the \*(MF outline fonts are using a resolution of 3,000
+points per inch. However, when using the letters in small sizes such as
+from 10 to 70,
+quality differences are hardly visible especially when working
+with printers that have a resolution of 300 points per inch such as the
+Apple LaserWriter.
+Moreover, Adobe makes liberal use of hinting to
+improve the appearance of its fonts at low resolutions.
+We completely ignored hinting, as we did not see any way to
+automatically generate the hints.
+.Su "6.2\ \ \ Sizes of fonts."
+Recall that it is necessary to compare the size of the \*(pS outline
+font for a particular \*(MF definition to the sizes of the bitmapped
+fonts in \*(pS fonts for the individual and all magnifications.
+.pp
+This comparison is made in this section for the \&\fCcmr10\fP font at the
+standard set of six magnifications 1, 1.095, 1.2, 1.44, 1.728, and 2.07
+(which are approximations of 1.2 raised to the powers 0, .5, 1, 2, 3,
+and 4, respectively). In addition, as a gesture to those who are not
+purists and accept magnifications of the 10 point design size as
+different point sizes, the comparison includes the \&\fCcmr\fP font at
+point size 5, 6, 7, 8, 9, 10, 12, and 17, the standard eight design
+sizes maintained for use with \*(TX.
+.pp
+Table 1 shows the sizes in bytes. Thus it is clear that the
+\*(pS outline font is bigger than any bitmapped font and that goal 4
+fails. Moreover, it is clear that the outline font is bigger than the
+sum over all magnifications of one design size and than the sum over
+all standard design sizes. Thus goal 5 fails. In fact, this failure is the
+reason that the samples of Figure 11 involve only upper case letters. Samples
+with complete fonts with both cases often overloaded the printer available
+to the students at the time this work was done.
+.TS
+center;
+l r l r l.
+Font Design Magni- Bitmap Outlines
+ size fication (size in (size in
+ bytes) bytes)
+_
+\fCcmr\fP 10 1.0 22,812 245,000
+\ \ " 10 1.095 24,231 \ \ \ \ "
+\ \ " 10 1.2 26,044 \ \ \ \ "
+\ \ " 10 1.44 31,892 \ \ \ \ "
+\ \ " 10 1.728 39,614 \ \ \ \ "
+\ \ " 10 2.07 50,578 \ \ \ \ "
+\fCcmr\fP 5 1.0 16,729 \ \ \ \ "
+\ \ " 6 1.0 17,757 \ \ \ \ "
+\ \ " 7 1.0 18,820 \ \ \ \ "
+\ \ " 8 1.0 20,041 \ \ \ \ "
+\ \ " 9 1.0 21,580 \ \ \ \ "
+\ \ " 12 1.0 25,658 \ \ \ \ "
+\ \ " 17 1.0 37,140 \ \ \ \ "
+_
+Total 352,896 245,000
+.TE "Table 1"
+.br
+.RT
+.pp
+However, do note that the outline font is smaller than the sum over all
+design sizes and magnifications thereof.
+.pp
+So in terms of disk space for the non-purists, the outline font
+represents a savings. Again notice that not all magnifications of the
+bitmapped fonts are maintained and the outline font is arbitrarily
+scaleable. Moreover, as the magnification grows the size of the bitmap
+grows even more rapidly.
+.pp
+The disappointment with respect to saving printer and disk memory says
+that it is important to spend more effort to optimize the outline
+font.
+.pp
+All is not lost, though! As this paper was being prepared for publication
+in \*(TB,
+one reviewer, Nelson Beebe, pointed out something that we can only kick
+ourselves for not noticing. The \*(pS outline fonts that are generated by
+\fHmf2ps\fP are horrendously wasteful in space. They use original, built-in
+command names and absolute coordinates. A significant reduction in size can
+be obtained by definition and use in the outlines of single-character
+command names, e.g., \(lq\fCM\fP\(rq for \(lq\fCmoveto\fP\(rq, and by use
+of relative versions of these commands with operands of fewer digits after
+the initial absolute \&\fCmoveto\fP of any character. A simple filter was
+written to obtain new compressed versions of the \*(pS outline fonts. The
+appearances of the output when printing with these new versions is
+unchanged, but what is sent to the printer is significantly smaller, about
+37.7% smaller. The reduction on a per-letter basis is about 45%.
+Table 2 shows the information of Table 1 for the new versions of the
+outline fonts.
+.TS
+center;
+l r l r l.
+Font Design Magni- Bitmap Outlines
+ size fication (size in (size in
+ bytes) bytes)
+_
+\fCcmr\fP 10 1.0 22,812 152,670
+\ \ " 10 1.095 24,231 \ \ \ \ "
+\ \ " 10 1.2 26,044 \ \ \ \ "
+\ \ " 10 1.44 31,892 \ \ \ \ "
+\ \ " 10 1.728 39,614 \ \ \ \ "
+\ \ " 10 2.07 50,578 \ \ \ \ "
+\fCcmr\fP 5 1.0 16,729 \ \ \ \ "
+\ \ " 6 1.0 17,757 \ \ \ \ "
+\ \ " 7 1.0 18,820 \ \ \ \ "
+\ \ " 8 1.0 20,041 \ \ \ \ "
+\ \ " 9 1.0 21,580 \ \ \ \ "
+\ \ " 12 1.0 25,658 \ \ \ \ "
+\ \ " 17 1.0 37,140 \ \ \ \ "
+_
+Total 352,896 152,670
+.TE "Table 2"
+.br
+.RT
+.pp
+There are still better compressions that can be achieved. According to
+Beebe\*(<,\*([.4\*(.]\*(>,
+Toal and Raine's outline representation of \&\fCcmr\fP at 10 points
+requires about twice the space needed for bitmaps of the same; at 14 to
+16 points, the outlines and the bitmaps occupy about the same amount of
+space; above 16 points, the outlines are smaller than the bitmaps. It
+is clear that better encodings exist than we explored and these must be
+explored for any future version of \fHmf2ps\fP.
+.pp
+One such better encoding appears to be that used by Adobe for its own
+proprietary fonts; fonts encoded this way have a FontType of 1.
+User defined fonts have a FontType of 3. Beebe\*([.4\*(.]
+says that type 1 fonts are handled with greater efficiency than type 3
+fonts on most existing \*(pS interpreters, especially those that are based
+on Adobe-licensed code.
+Adobe has recently published specifications for the type 1 font encoding\*(<,\*([.2\*(.]\*(>,
+thus allowing anyone to produced type 1 fonts. Beebe believes that the
+market forces will drive other companies to encode their fonts as type 1.
+Moreover, as more and more windowing systems based on \*(pS, e.g., NeWS
+and NeXT, appear, the attraction of \*(pS outline fonts will increase, as
+then the same font can be used for both printing and previewing. Thus, the
+incentive will be to convert \*(MF fonts into type 1 \*(pS outline fonts.
+.pp
+Ultimately, the tradeoff is between the size of the font sent to the
+printer, and the time it takes for the printer to decode the program
+for the characters. However, with proper cacheing, a big enough cache,
+and a not very fancy document, the decoding is done only once per
+character for the document!
+.su "7\ \ \ Future work"
+.PP
+For the future, there are a number of improvements that can be made.
+Currently, each letter of the \*(pS outline fonts is described as a set
+of cyclic paths. When all are filled or stroked, one gets the desired
+letter. Some of those cyclic paths have a common boundary that is
+inside the letter and is not necessary for the outline description of
+the letter as a whole. Eliminating these paths and creating one
+outline for the letter will save space. Today this can be done
+manually, and is worth the effort because the translation process is
+done only once. From that time on, the font is used the way it is.
+.pp
+As was demonstrated by Beebe's rescue of our result, closer attention
+should be paid to obtaining more compact representations of character
+outlines, representations for which \*(pS routines can be written to
+interpret them into standard outline drawing commands.
+Collapsing commands into single characters and using relative movements
+saved significant amounts of space. Perhaps, even more dramatic savings can
+be obtained by giving coordinates and distances in hexadecimal.
+.pp
+More effort can be spent on modifying the program in order to allow
+magnifications up to 7200 points. Thus, no jaggies will be seen, as
+occasionally happens when using higher magnifications, e.g., in our
+translated fonts at magnification 8. This could be done by enlarging
+the program arrays to handle characters based on 7200 points. A
+sophisticated solution is required if one wants to save room while
+compiling the input font. In such a case, any linear translation which
+is done within the \*(pS program is with a factor less than 1.
+.pp
+\*(MF was changed for \*(TX 3.0. It is necessary to build a new version of
+\fHmf2ps\fP based on this latest version of \*(MF. As the changes to the
+\*(MF program deal mainly with ligatures and kerning, the calculation of
+envelopes is probably not affected. Therefore, it is likely that
+the portion of \*(MF up to the calculation of the envelope can still be
+used as a front end for \fHmf2ps\fP with very little change in the
+portion of the program we wrote.
+.pp
+Finally, it might be worthwhile, for the sake of portability to other
+systems and enhanceability by \pother
+.sp
+humans, to rewrite or to write the next
+version of \fHmf2ps\fP with \&\fCWEB\fP.
+.su "Acknowledgments"
+.PP
+The authors thank the
+\*(TB editors, and Nelson Beebe for their help, sharp comments, and
+result-saving ideas.
+Dealing with their comments made this a better paper.
+.su "References"
+.]<
+.\"1985-P\s-2OST\s0S\s-2CRIP-3
+.ds [F 1
+.]-
+.ds [L Adb85
+.ds [K PostScript
+.ds [T P\s-2OST\s0S\s-2CRIPT\s0 Language Reference Manual
+.ds [I Adobe Systems Incorporated, Addison-Wesley
+.ds [C Reading, MA
+.ds [D 1985
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 2 book
+.\"1990-Adobe-Type-1-Font-Fo-13
+.ds [F 2
+.]-
+.ds [L Adb90
+.ds [T Adobe Type 1 Font Format
+.ds [I Adobe Systems, Inc.
+.ds [D March, 1990
+.ds [R Part No. LPS0064
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 4 tech-report
+.\"Bechtolsheim.S.v.-1989-T\v'+.2m'\h'-.1m'E\h-6
+.ds [F 3
+.]-
+.ds [L Bec89
+.ds [A S.\ von\ Bechtolsheim
+.ds [T The T\v'+.2m'\h'-.1m'E\h'-.1m'\v'-.2m'X PostScript Software Package
+.ds [J TUGboat
+.ds [V 10
+.ds [N 1
+.ds [P 25\(en27
+.nr [P 0
+.ds [D 1989
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 1 journal-article
+.\"Beebe.N.-1990-12
+.ds [F 4
+.]-
+.ds [L Bee90
+.ds [A N.\ Beebe
+.ds [O Private communication, via electronic mail
+.ds [D 1990
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 0 other
+.\"Carr.L.-1987-Of-Metafont-and-Post-8
+.ds [F 5
+.]-
+.ds [L Car87
+.ds [A L.\ Carr
+.ds [T Of Metafont and PostScript
+.ds [J T\h'-.1m'\v'+.2m'E\v'-.2m'Xniques
+.ds [V 5
+.ds [P 141\(en152
+.nr [P 0
+.ds [C Seattle, WA
+.ds [D August, 1987
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 1 journal-article
+.\"Henderson.D.-1989-Outline-fonts-with-\-9
+.ds [F 6
+.]-
+.ds [L Hen89
+.ds [A D.\ Henderson
+.ds [T Outline fonts with \f(LGMETAFONT\fP
+.ds [J TUGboat
+.ds [V 10
+.ds [N 1
+.ds [P 36\(en38
+.nr [P 0
+.ds [D 1989
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 1 journal-article
+.\"Hobby.J.D.-1989-\f(LGMETAFONT\fP-lik-11
+.ds [F 7
+.]-
+.ds [L Hob89
+.ds [A J.D.\ Hobby
+.ds [T A \f(LGMETAFONT\fP-like System with PostScript Output
+.ds [J TUGboat
+.ds [V 10
+.ds [N 4
+.ds [P 505\(en512
+.nr [P 0
+.ds [D 1989
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 1 journal-article
+.\"Kernighan.B.W.-1982-Typesetter-independe-5
+.ds [F 8
+.]-
+.ds [L Ker82
+.ds [A B.W.\ Kernighan
+.ds [T A Typesetter-independent TROFF
+.ds [R Computing Science Technical Report No. 97
+.ds [I Bell Laboratories
+.ds [C Murray Hill, NJ 07974
+.ds [D March, 1982
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 4 tech-report
+.\"Knuth.D.E.-1984-T\h'-.1m'\v'+.2m'E\v-4
+.ds [F 9
+.]-
+.ds [L Knu84
+.ds [K T\dE\u\(*xbook
+.ds [A D.E.\ Knuth
+.ds [T The T\h'-.1m'\v'+.2m'E\v'-.2m'Xbook
+.ds [I Addison-Wesley
+.ds [C Reading, MA
+.ds [D 1984
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 2 book
+.\"Knuth.D.E.-1986-\f(LGMETAFONT\fPbook-1
+.ds [F 10
+.]-
+.ds [L Knu86
+.ds [A D.E.\ Knuth
+.ds [T The \f(LGMETAFONT\fPbook
+.ds [I Addison-Wesley
+.ds [C Reading, MA
+.ds [D 1986
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 2 book
+.\"Knuth.D.E.-1987-\f(LGMETAFONT\fP:-Th-2
+.ds [F 11
+.]-
+.ds [L Knu87
+.ds [A D.E.\ Knuth
+.ds [T \f(LGMETAFONT\fP: The Program
+.ds [I Addison-Wesley
+.ds [C Reading, MA
+.ds [D 1987
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 2 book
+.\"Toal.G.-1990-10
+.ds [F 12
+.]-
+.ds [L Toa90
+.ds [A G.\ Toal
+.ds [O Private communication, via electronic mail
+.ds [D 1990
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 0 other
+.\"Ziv.J.-1977-Universal-Algorithm--7
+.ds [F 13
+.]-
+.ds [L ZL77
+.ds [A J.\ Ziv
+.as [A " and A.\ Lempel
+.ds [T A Universal Algorithm for Sequential Data Compression
+.ds [J IEEE Trans\%actions on Information Theory
+.ds [V IT-23
+.ds [V 3
+.ds [P 337\(en343
+.nr [P 0
+.ds [D May, 1977
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 1 journal-article
+.]>
+.RT
+.sp 2
+.ta 1P +1P
+.in +6P
+.ps 9
+.vs 11
+.nf
+.ti -1P
+\(dm Shimon Yanai
+IBM Science and Technology
+ Center
+Technion City
+.sp
+Haifa 32000
+Israel
+yanai@israearn.bitnet
+.sp
+.ti -1P
+\(dm Daniel M. Berry
+Computer Science
+Technion
+Haifa 32000
+Israel
+dberry@cs.technion.ac.il
+.fi
+.in -6P
+.RT
diff --git a/fonts/utilities/mf2ps/doc/printsamples/README b/fonts/utilities/mf2ps/doc/printsamples/README
new file mode 100644
index 0000000000..a3c13aecac
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/README
@@ -0,0 +1,15 @@
+builtins.ps - to make figure 12 samples
+cm.ps - to make Figure 11 R M examples
+cm.tex - to make Figure 11 R M examples
+cm7.ps - to make Figure 11 7 R M examples
+cm7.tex - to make Figure 11 7 R M examples
+cmr.ps - to make Figure 11 R P examples
+cmtt.ps - to make Figure 11 T P examples
+lasy.ps - to make Figure 11 L P examples
+logo.ps - to make a sample of METAFONT in its own font
+sy.ps - to make Figure 11 L M examples
+sy.tex - to make Figure 11 L M examples
+tt.ps - to make Figure 11 T M examples
+tt.tex - to make Figure 11 T M examples
+tt7.ps - to make Figure 11 8 T M examples
+tt7.tex - to make Figure 11 8 T M examples
diff --git a/fonts/utilities/mf2ps/doc/printsamples/builtins.ps b/fonts/utilities/mf2ps/doc/printsamples/builtins.ps
new file mode 100644
index 0000000000..0b70fc607a
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/builtins.ps
@@ -0,0 +1,16 @@
+%!
+ /Helvetica findfont 10 scalefont setfont
+ 100 710 moveto (THIS IS HELVETICA TEN POINTS WRITTEN IN POSTSCRIPT) show
+ /Helvetica findfont 12 scalefont setfont
+ 100 698 moveto (THIS IS HELVETICA TWELVE POINTS WRITTEN IN POSTSCRIPT) show
+
+ /Times-Roman findfont 10 scalefont setfont
+ 100 674 moveto (THIS IS TIMES-ROMAN TEN POINTS WRITTEN IN POSTSCRIPT) show
+ /Times-Roman findfont 12 scalefont setfont
+ 100 662 moveto (THIS IS TIMES-ROMAN TWELVE POINTS WRITTEN IN POSTSCRIPT) show
+
+ /Courier findfont 10 scalefont setfont
+ 100 638 moveto (THIS IS COURIER TEN POINTS WRITTEN IN POSTSCRIPT) show
+ /Courier findfont 12 scalefont setfont
+ 100 626 moveto (THIS IS COURIER TWELVE POINTS WRITTEN IN POSTSCRIPT) show
+ showpage
diff --git a/fonts/utilities/mf2ps/doc/printsamples/cm.ps b/fonts/utilities/mf2ps/doc/printsamples/cm.ps
new file mode 100644
index 0000000000..e6c141fad0
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/cm.ps
@@ -0,0 +1,211 @@
+%!PS-Adobe-2.0
+%%Creator: dvips by Radical Eye Software
+%%Title: cm.dvi
+%%Pages: 1 -1
+%%BoundingBox: 0 0 612 792
+%%EndComments
+%%BeginDocument: tex.pro
+/TeXDict 200 dict def TeXDict begin /bdf{bind def}def /Inch{Resolution mul}
+bdf /Dots{72 div Resolution mul}bdf /dopage{72 Resolution div dup neg scale
+translate}bdf /@letter{Resolution dup -10 mul dopage}bdf /@note{@letter}bdf
+/@a4{Resolution dup -10.6929133858 mul dopage}bdf /@translate{translate}bdf
+/@scale{scale}bdf /@rotate{rotate}bdf /@landscape{[0 1 -1 0 0 0]concat
+Resolution dup dopage}bdf /@legal{Resolution dup -13 mul dopage}bdf
+/@manualfeed{statusdict /manualfeed true put}bdf /@copies{/#copies exch def}
+bdf /@FontMatrix[1 0 0 -1 0 0]def /@FontBBox[0 0 1 1]def /dmystr(ZZf@@)def
+/newname{dmystr cvn}bdf /df{/fontname exch def dmystr 2 fontname cvx(@@@)cvs
+putinterval newname 7 dict def newname load begin /FontType 3 def /FontMatrix
+@FontMatrix def /FontBBox @FontBBox def /BitMaps 256 array def /BuildChar{
+CharBuilder}def /Encoding TeXEncoding def end fontname{/foo setfont}2 array
+copy cvx def fontname load 0 dmystr 5 string copy cvn cvx put}bdf /dfe{
+newname newname load definefont setfont}bdf /ch-image{ch-data 0 get}bdf
+/ch-width{ch-data 1 get}bdf /ch-height{ch-data 2 get}bdf /ch-xoff{ch-data 3
+get}bdf /ch-yoff{ch-data 4 get}bdf /ch-tfmw{ch-data 5 get}bdf /CharBuilder{
+save 3 1 roll exch /BitMaps get exch get /ch-data exch def ch-data null ne{
+ch-tfmw 0 ch-xoff neg ch-yoff neg ch-width ch-xoff sub ch-height ch-yoff sub
+setcachedevice ch-width ch-height true[1 0 0 1 ch-xoff .1 sub ch-yoff .1 sub]{
+ch-image}imagemask}if restore}bdf /dc{/ch-code exch def dup 0 get length 1 lt{
+pop[<00>1 1 0 0 8.00]}if /ch-data exch def newname load /BitMaps get ch-code
+ch-data put}bdf /bop{gsave /SaveImage save def 0 0 moveto}bdf /eop{clear
+SaveImage restore showpage grestore}bdf /@start{/Resolution exch def
+/TeXEncoding 256 array def 0 1 255{TeXEncoding exch 1 string dup 0 3 index put
+cvn put}for}bdf /p{show}bdf /RuleMatrix[1 0 0 -1 -.1 -.1]def /BlackDots 8
+string def /v{gsave currentpoint translate false RuleMatrix{BlackDots}
+imagemask grestore}bdf /a{moveto}bdf /delta 0 def /tail{dup /delta exch def 0
+rmoveto}bdf /b{exch p tail}bdf /c{p delta 4 sub tail}bdf /d{p delta 3 sub tail
+}bdf /e{p delta 2 sub tail}bdf /f{p delta 1 sub tail}bdf /g{p delta 0 rmoveto}
+bdf /h{p delta 1 add tail}bdf /i{p delta 2 add tail}bdf /j{p delta 3 add tail}
+bdf /k{p delta 4 add tail}bdf /l{p -4 0 rmoveto}bdf /m{p -3 0 rmoveto}bdf /n{
+p -2 0 rmoveto}bdf /o{p -1 0 rmoveto}bdf /q{p 1 0 rmoveto}bdf /r{p 2 0 rmoveto
+}bdf /s{p 3 0 rmoveto}bdf /t{p 4 0 rmoveto}bdf /w{0 rmoveto}bdf /x{0 exch
+rmoveto}bdf /y{3 -1 roll p moveto}bdf /bos{/section save def}bdf /eos{clear
+section restore}bdf /SDict 200 dict def SDict begin /@SpecialDefaults{/hs 8.5
+Inch def /vs 11 Inch def /ho 0 def /vo 0 def /hsc 1 def /vsc 1 def /ang 0 def
+/CLIP false def /BBcalc false def}bdf /@hsize{/hs exch def /CLIP true def}bdf
+/@vsize{/vs exch def /CLIP true def}bdf /@hoffset{/ho exch def}bdf /@voffset{
+/vo exch def}bdf /@hscale{@scaleunit div /hsc exch def}bdf /@vscale{
+@scaleunit div /vsc exch def}bdf /@angle{/ang exch def}bdf /@scaleunit 100 def
+/@rwi{10 div /rwi exch def}bdf /@llx{/llx exch def}bdf /@lly{/lly exch def}
+bdf /@urx{/urx exch def}bdf /@ury{/ury exch def /BBcalc true def}bdf
+/@setclipper{BBcalc{rwi urx llx sub div dup scale llx neg lly neg translate}{
+hsc vsc scale}ifelse CLIP{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg
+0 rlineto closepath clip}{initclip}ifelse}bdf end /@MacSetUp{userdict /md
+known{userdict /md get type /dicttype eq{md begin /letter{}def /note{}def
+/legal{}def /od{txpose 1 0 mtx defaultmatrix dtransform exch atan/pa exch def
+newpath clippath mark{transform{itransform moveto}}{transform{itransform
+lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{
+itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{
+closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39 0 put
+10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}def /txpose{pxs pys
+scale ppr aload pop por{noflips{pop exch neg exch translate pop 1 -1 scale}if
+xflip yflip and{pop exch neg exch translate 180 rotate 1 -1 scale ppr 3 get
+ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg translate}if xflip yflip
+not and{pop exch neg exch translate pop 180 rotate ppr 3 get ppr 1 get neg sub
+neg 0 translate}if yflip xflip not and{ppr 1 get neg ppr 0 get neg translate}
+if}{noflips{translate pop pop 270 rotate 1 -1 scale}if xflip yflip and{
+translate pop pop 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2
+get ppr 0 get neg sub neg translate}if xflip yflip not and{translate pop pop
+90 rotate ppr 3 get ppr 1 get neg sub neg 0 translate}if yflip xflip not and{
+translate pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 exch translate}
+if}ifelse scaleby96{ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2
+copy translate .96 dup scale neg exch neg exch translate}if}def /cp{pop pop
+showpage pm restore}def end}if}if}def /psf$TeXscale{65536 div}def /startTexFig
+{/psf$SavedState save def userdict maxlength dict begin Resolution 72 div dup
+neg scale currentpoint translate /psf$ury exch psf$TeXscale def /psf$urx exch
+psf$TeXscale def /psf$lly exch psf$TeXscale def /psf$llx exch psf$TeXscale def
+/psf$y exch psf$TeXscale def /psf$x exch psf$TeXscale def currentpoint /psf$cy
+exch def /psf$cx exch def /psf$sx psf$x psf$urx psf$llx sub div def /psf$sy
+psf$y psf$ury psf$lly sub div def psf$sx psf$sy scale psf$cx psf$sx div
+psf$llx sub psf$cy psf$sy div psf$ury sub translate /showpage{}def /erasepage{
+}def /copypage{}def @MacSetUp}def /doclip{psf$llx psf$lly psf$urx psf$ury
+currentpoint 6 2 roll newpath 4 copy 4 2 roll moveto 6 -1 roll exch lineto
+exch lineto exch lineto closepath clip newpath moveto}def /endTexFig{end
+psf$SavedState restore}def /@beginspecial{SDict begin /SpecialSave save def
+gsave Resolution 72 div dup neg scale currentpoint translate @SpecialDefaults}
+bdf /@setspecial{ho vo translate @setclipper ang rotate /showpage{}def newpath
+}bdf /@endspecial{grestore clear SpecialSave restore end}bdf /@defspecial{
+SDict begin}bdf /@fedspecial{end}bdf /li{lineto}bdf /rl{rlineto}bdf /rc{
+rcurveto}bdf /np{/SaveX currentpoint /SaveY exch def def newpath}bdf /st{
+stroke SaveX SaveY moveto}bdf /fil{fill SaveX SaveY moveto}bdf /ellipse{
+/endangle exch def /startangle exch def /yrad exch def /xrad exch def
+/savematrix matrix currentmatrix def translate xrad yrad scale 0 0 1
+startangle endangle arc savematrix setmatrix}bdf end
+%%EndDocument
+TeXDict begin 300 @start /fa df[<FF800FFFFF800FFF1E0001F00C0001F0040001E00400
+01E0060003E0020003C0020003C0010007800100078001FFFF8000FFFF0000800F0000801F0000
+401E0000401E0000603E0000203C0000203C000010780000107800001078000008F0000008F000
+0009F0000005E0000005E0000007E0000003C0000003C000000180000001800000018000>32 34
+-2 0 37]65 dc[<000FF000003FFC0000FC0E0001E0010007C000800F8000400F0000201E0000
+203E0000103C0000107C0000107C00001078000000F8000000F8000000F8000000F8000000F800
+0000F8000000F8000000F8000000780000107C0000107C0000103C0000303E0000301E0000300F
+0000700F8000F007C001F001E0037000FC0E70003FF830000FE010>28 34 -3 0 35]67 dc[<FF
+FFFFE0FFFFFFE0078003E0078000F0078000700780003007800030078000100780001007800010
+0780000807802008078020080780200007802000078060000780E00007FFE00007FFE0000780E0
+000780600007802000078020200780202007802020078000200780006007800060078000400780
+00C0078001C0078007C0FFFFFFC0FFFFFFC0>29 34 -2 0 33]69 dc[<FFFE0000FFFE00000780
+000007800000078000000780000007800000078000000780000007800000078020000780200007
+80200007802000078060000780E00007FFE00007FFE0000780E000078060000780200007802000
+07802020078020200780002007800020078000600780006007800040078000C0078001C0078007
+C0FFFFFFC0FFFFFFC0>27 34 -2 0 32]70 dc[<FFFC3FFFFFFC3FFF078001E0078001E0078001
+E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E00780
+01E0078001E0078001E007FFFFE007FFFFE0078001E0078001E0078001E0078001E0078001E007
+8001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0FFFC3FFFFFFC3FFF
+>32 34 -2 0 37]72 dc[<FFFCFFFC078007800780078007800780078007800780078007800780
+078007800780078007800780078007800780078007800780078007800780078007800780FFFCFF
+FC>14 34 -2 0 18]73 dc[<FFFFFF00FFFFFF0007803F0007800F000780030007800300078001
+000780018007800180078000800780008007800080078000800780000007800000078000000780
+000007800000078000000780000007800000078000000780000007800000078000000780000007
+8000000780000007800000078000000780000007800000FFFE0000FFFE0000>25 34 -2 0 30]
+76 dc[<FFE0203FFFFFE0703FFF1F007001E004007001E00400F801E00400F801E00400F801E0
+0401E401E00401E401E00401E401E00403C201E00403C201E004078101E004078101E004078101
+E0040F0081E0040F0081E0040F0081E0041E0041E0041E0041E0043C0021E0043C0021E0043C00
+21E004780011E004780011E004780011E004F00009E004F00009E004F00009E005E00005E005E0
+0005E007C00003E0FFC00003FFFFC00003FF>40 34 -2 0 45]77 dc[<FFE00020FFE000601F00
+0060040000E0040001E0040001E0040003E0040003E0040007A004000F2004000F2004001E2004
+003E2004003C20040078200400F8200400F0200401E0200401E0200403C0200407802004078020
+040F0020041F0020041E0020043C0020047C00200478002004F0002004F0002005E0002007C000
+F8FFC007FFFF8007FF>32 34 -2 0 37]78 dc[<000FE00000783C0001E00F0003C00780078003
+C00F0001E01E0000F01E0000F03C0000783C0000787C00007C7C00007C7800003CF800003EF800
+003EF800003EF800003EF800003EF800003EF800003EF800003E7800003C7800003C7C00007C3C
+0000783C0000781E0000F01E0000F00F0001E0078003C00380038001E00F0000783C00000FE000
+>31 34 -3 0 38]79 dc[<FFFC0000FFFC00000780000007800000078000000780000007800000
+07800000078000000780000007800000078000000780000007800000078000000780000007FFF8
+0007803E0007800F0007800780078003C0078003C0078003E0078003E0078003E0078003E00780
+03E0078003C0078003C00780078007800F8007803F00FFFFFC00FFFFF000>27 34 -2 0 33]80
+dc[<FFFC007C00FFFC01E300078007C100078007C08007800F808007800F800007800F80000780
+0F800007800F000007800F000007800F000007800F000007800E000007801E000007801C000007
+80380000078070000007FFE0000007803C000007800F00000780078000078007C000078003C000
+078003E000078003E000078003E000078003E000078003E000078007C000078007800007800F00
+0007803E0000FFFFF80000FFFFE00000>33 34 -2 0 36]82 dc[<81FC00C7FF00FE0380F001C0
+E000E0C000E0C000708000708000708000700000700000F00000F00001E00003E0003FC003FF80
+0FFF001FFE003FF0007F0000780000F00000F00000E00020E00020E00020E000606000607000E0
+3801E01C0FE00FFC6003F020>20 34 -3 0 27]83 dc[<03FFFF0003FFFF000007800000078000
+000780000007800000078000000780000007800000078000000780000007800000078000000780
+000007800000078000000780000007800000078000000780000007800000078000800780048007
+80048007800480078004C007800CC007800C400780084007800860078018780780787FFFFFF87F
+FFFFF8>30 34 -2 0 35]84 dc[<0000C000000000C000000001E000000001E000000001E00000
+0003D000000003D000000003D0000000078800000007880000000F840000000F040000000F0400
+00001E020000001E020000003E030000003C010000003C0100000078008000007800800000F800
+C00000F000400000F000400001E000200001E000200001E000200003C000100003C000100007C0
+00080007800008000780000C000F80001E00FFF0007FC0FFF0007FC0>34 34 -1 0 37]86 dc[<
+00020000800000030001800000070001C00000070001C00000070001C000000F8003E000000F80
+03E000000F8003E000001E40079000001E40079000001E40079000003C200F0800003C200F0800
+003C200F08000078101E04000078101E04000078101E040000F0083C020000F0083C020000F008
+3C020001E00478010001E00478010001E00478010003C002F0008003C002F0008003C002F00080
+078001E00040078001E00040078001E000400F8003E000200F0003C000600F0003C000F0FFF03F
+FC03FEFFF03FFC03FE>47 34 -1 0 50]87 dc dfe /fb df[<FFF80F80070007000700070007
+000700070007000700070007000700070007000700070007000700070007000700C7003F000700
+0300>13 27 -4 0 21]49 dc[<FF80FFF01E001F000C001F0004001E0004001E0002003C000200
+3C0002003C000100780001FFF800010078000080F0000080F0000080F0000041E0000041E00000
+43E0000023C0000023C0000037C0000017800000178000000F0000000F0000000F000000060000
+0006000000060000>28 28 -1 0 31]65 dc[<001FC00000E0300003800800070004000E000200
+1C0001003C000100380000807800008070000080F0000000F0000000F0000000F0000000F00000
+00F0000000F0000000F00000007000008078000080380000803C0001801C0001800E0003800700
+078003800B8000E03180001FC080>25 28 -2 0 30]67 dc[<FFFFFC0F003C0F000C0F00060F00
+060F00020F00020F00020F00010F02010F02000F02000F02000F06000FFE000F06000F02000F02
+000F02000F02020F00020F00020F00060F00040F00040F000C0F003CFFFFFC>24 28 -2 0 28]
+69 dc[<FFF8000F80000F00000F00000F00000F00000F00000F00000F00000F02000F02000F02
+000F02000F06000FFE000F06000F02000F02000F02000F02040F00040F00040F000C0F00080F00
+080F00180F0078FFFFF8>22 28 -2 0 27]70 dc[<FFF3FFC00F003C000F003C000F003C000F00
+3C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F
+FFFC000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C00
+0F003C000F003C000F003C00FFF3FFC0>26 28 -2 0 31]72 dc[<FFF00F000F000F000F000F00
+0F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F
+000F00FFF0>12 28 -1 0 15]73 dc[<FF8307FF801C0300780008030078000807807800080780
+78000807807800080F407800080F407800081E207800081E207800081E207800083C107800083C
+107800083C10780008780878000878087800087808780008F004780008F004780008F004780009
+E002780009E00278000BC00178000BC00178000BC00178000F8000F8000F8000F800FF8000FF80
+>33 28 -2 0 38]77 dc[<FF8004001C000C0008000C0008001C0008003C0008003C0008007C00
+08007C000800F4000801E4000801E4000803C4000807C40008078400080F0400080F0400081E04
+00083C0400083C04000878040008F8040008F0040009E0040009E004000BC004000F8004000F80
+0E00FF007FC0>26 28 -2 0 31]78 dc[<003F800001E0F0000380380007001C000E000E001C00
+07003C00078038000380780003C0780003C0F00001E0F00001E0F00001E0F00001E0F00001E0F0
+0001E0F00001E0F00001E0700001C0780003C038000380380003801C0007000E000E0007001C00
+0380380001E0F000003F8000>27 28 -2 0 32]79 dc[<FFF0000F00000F00000F00000F00000F
+00000F00000F00000F00000F00000F00000F00000F00000FFF800F00E00F00780F003C0F001C0F
+001E0F001E0F001E0F001E0F001E0F001C0F003C0F00780F00E0FFFF80>23 28 -2 0 28]80 dc
+[<FFF007C00F001C200F0038100F0078100F0078100F0078000F0078000F0078000F0078000F00
+78000F0078000F00F0000F00E0000F03C0000FFF00000F01E0000F0078000F003C000F001C000F
+001E000F001E000F001E000F001E000F001C000F003C000F0078000F01E000FFFF0000>28 28
+-2 0 31]82 dc[<83F800CC0E00F00300C00300C001808001C08001C08001C00001C00003C000
+03C0000F8000FF8007FF001FFE003FF8007FC0007C0000F00000F00000E00080E00080E0008060
+01807003803007801C198007E080>18 28 -2 0 23]83 dc[<03FFFC00001F8000000F0000000F
+0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F000000
+0F0000000F0000000F0000000F0000000F0000000F0000800F0020800F0020800F0020C00F0020
+400F0040400F0040600F00C0700F01C07FFFFFC0>27 28 -1 0 30]84 dc[<0018001800001800
+18000018001800003C003C00003C003C00003C003C00007E007E00007A007A00007A007A000079
+00F20000F100F10000F100F10000F081E10001E081E08001E081E08001E043E08003C043C04003
+C043C04003C027C0400780278020078027802007803F80200F001F00100F001F00100F001F0010
+1E001E00181F001F003CFFE0FFE0FF>40 28 -1 0 43]87 dc dfe end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 300
+ TeXDict begin @letter
+%%EndSetup
+%%Page: 1 1
+ bop 83 42 a fb(THIS)14 b(IS)g(CMR)f(TEN)i(POINTS)f(WRITTEN)f(IN)h(MET)m(AF)o
+(ONT)83 91 y fa(THIS)i(IS)g(CMR)g(TWEL)-5 b(VE)16 b(POINTS)g(WRITTEN)g(IN)g
+(MET)l(AF)o(ONT)965 2770 y fb(1)g eop
+%%Trailer
+ end
+%%EOF
diff --git a/fonts/utilities/mf2ps/doc/printsamples/cm.tex b/fonts/utilities/mf2ps/doc/printsamples/cm.tex
new file mode 100644
index 0000000000..abdfdc1922
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/cm.tex
@@ -0,0 +1,8 @@
+\font\test=cmr10
+\test
+THIS IS CMR TEN POINTS WRITTEN IN METAFONT
+
+\font\test=cmr12
+\test
+THIS IS CMR TWELVE POINTS WRITTEN IN METAFONT
+\bye
diff --git a/fonts/utilities/mf2ps/doc/printsamples/cm7.ps b/fonts/utilities/mf2ps/doc/printsamples/cm7.ps
new file mode 100644
index 0000000000..916a98ccf9
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/cm7.ps
@@ -0,0 +1,503 @@
+%! for use by dvi2ps Version 2.00
+% a start (Ha!) at a TeX mode for PostScript.
+% The following defines procedures assumed and used by program "dvi2ps"
+% and must be downloaded or sent as a header file for all TeX jobs.
+
+% By: Neal Holtz, Carleton University, Ottawa, Canada
+% <holtz@cascade.carleton.cdn>
+% <holtz%cascade.carleton.cdn@ubc.csnet>
+% June, 1985
+% Last Modified: Aug 25/85
+% oystr 12-Feb-1986
+% Changed @dc macro to check for a badly formed bits in character
+% definitions. Can get a <> bit map if a character is not actually
+% in the font file. This is absolutely guaranteed to drive the
+% printer nuts - it will appear that you can no longer define a
+% new font, although the built-ins will still be there.
+
+% To convert this file into a downloaded file instead of a header
+% file, uncomment all of the lines beginning with %-%
+
+%-%0000000 % Server loop exit password
+%-%serverdict begin exitserver
+%-% systemdict /statusdict known
+%-% {statusdict begin 9 0 3 setsccinteractive /waittimeout 300 def end}
+%-% if
+
+/TeXDict 200 dict def % define a working dictionary
+TeXDict begin % start using it.
+
+ % units are in "dots" (300/inch)
+/Resolution 300 def
+/Inch {Resolution mul} def % converts inches to internal units
+
+/Mtrx 6 array def
+
+%%%%%%%%%%%%%%%%%%%%% Page setup (user) options %%%%%%%%%%%%%%%%%%%%%%%%
+
+% dvi2ps will output coordinates in the TeX system ([0,0] 1" down and in
+% from top left, with y +ive downward). The default PostScript system
+% is [0,0] at bottom left, y +ive up. The Many Matrix Machinations in
+% the following code are an attempt to reconcile that. The intent is to
+% specify the scaling as 1 and have only translations in the matrix to
+% properly position the text. Caution: the default device matrices are
+% *not* the same in all PostScript devices; that should not matter in most
+% of the code below (except for lanscape mode -- in that, rotations of
+% -90 degrees resulted in the the rotation matrix [ e 1 ]
+% [ 1 e ]
+% where the "e"s were almost exactly but not quite unlike zeros.
+
+/@letter
+ { letter initmatrix
+ 72 Resolution div dup neg scale % set scaling to 1.
+ 310 -3005 translate % move origin to top (these are not exactly 1"
+ Mtrx currentmatrix pop % and -10" because margins aren't set exactly right)
+ } def
+ % note mode is like letter, except it uses less VM
+/@note
+ { note initmatrix
+ 72 Resolution div dup neg scale % set scaling to 1.
+ 310 -3005 translate % move origin to top
+ Mtrx currentmatrix pop
+ } def
+
+/@landscape
+ { letter initmatrix
+ 72 Resolution div dup neg scale % set scaling to 1.
+% -90 rotate % it would be nice to be able to do this
+ Mtrx currentmatrix 0 0.0 put % but instead we have to do things like this because what
+ Mtrx 1 -1.0 put % should be zero terms aren't (and text comes out wobbly)
+ Mtrx 2 1.0 put % Fie! This likely will not work on QMS printers
+ Mtrx 3 0.0 put % (nor on others where the device matrix is not like
+ Mtrx setmatrix % like it is on the LaserWriter).
+ 300 310 translate % move origin to top
+ Mtrx currentmatrix pop
+ } def
+
+/@legal
+ { legal initmatrix
+ 72 Resolution div dup neg scale % set scaling to 1.
+ 295 -3880 translate % move origin to top
+ Mtrx currentmatrix pop
+ } def
+
+/@manualfeed
+ { statusdict /manualfeed true put
+ } def
+ % n @copies - set number of copies
+/@copies
+ { /#copies exch def
+ } def
+
+%%%%%%%%%%%%%%%%%%%% Procedure Defintions %%%%%%%%%%%%%%%%%%%%%%%%%%
+
+/@newfont % id @newfont - -- initialize a new font dictionary
+ { /newname exch def
+ pop
+ newname 7 dict def % allocate new font dictionary
+ newname load begin
+ /FontType 3 def
+ /FontMatrix [1 0 0 -1 0 0] def
+ /FontBBox [0 0 1 1] def
+ /BitMaps 128 array def
+ /BuildChar {CharBuilder} def
+ /Encoding 128 array def
+ 0 1 127 {Encoding exch /.undef put} for
+ end
+ newname newname load definefont pop
+ } def
+
+
+% the following is the only character builder we need. it looks up the
+% char data in the BitMaps array, and paints the character if possible.
+% char data -- a bitmap descriptor -- is an array of length 6, of
+% which the various slots are:
+
+/ch-image {ch-data 0 get} def % the hex string image
+/ch-width {ch-data 1 get} def % the number of pixels across
+/ch-height {ch-data 2 get} def % the number of pixels tall
+/ch-xoff {ch-data 3 get} def % number of pixels below origin
+/ch-yoff {ch-data 4 get} def % number of pixels to left of origin
+/ch-tfmw {ch-data 5 get} def % spacing to next character
+
+/CharBuilder % fontdict ch Charbuilder - -- image one character
+ { /ch-code exch def % save the char code
+ /font-dict exch def % and the font dict.
+ /ch-data font-dict /BitMaps get ch-code get def % get the bitmap descriptor for char
+ ch-data null eq not
+ { ch-tfmw 0 ch-xoff neg ch-yoff neg ch-width ch-xoff sub ch-height ch-yoff sub
+ setcachedevice
+ ch-width ch-height true [1 0 0 1 ch-xoff ch-yoff]
+ {ch-image} imagemask
+ }
+ if
+ } def
+
+
+/@sf % fontdict @sf - -- make that the current font
+ { setfont() pop
+ } def
+
+ % in the following, the font-cacheing mechanism requires that
+ % a name unique in the particular font be generated
+
+/@dc % char-data ch @dc - -- define a new character bitmap in current font
+ { /ch-code exch def
+% ++oystr 12-Feb-86++
+ dup 0 get
+ length 2 lt
+ { pop [ <00> 1 1 0 0 8.00 ] } % replace <> with null
+ if
+% --oystr 12-Feb-86--
+ /ch-data exch def
+ currentfont /BitMaps get ch-code ch-data put
+ currentfont /Encoding get ch-code
+ dup ( ) cvs cvn % generate a unique name simply from the character code
+ put
+ } def
+
+/@bop0 % n @bop0 - -- begin the char def section of a new page
+ {
+ } def
+
+/@bop1 % n @bop1 - -- begin a brand new page
+ { pop
+ erasepage initgraphics
+ Mtrx setmatrix
+ /SaveImage save def() pop
+ } def
+
+/@eop % - @eop - -- end a page
+ { showpage
+ SaveImage restore() pop
+ } def
+
+/@start % - @start - -- start everything
+ { @letter % (there is not much to do)
+ } def
+
+/@end % - @end - -- done the whole shebang
+ { end
+ } def
+
+/p % x y p - -- move to position
+ { moveto
+ } def
+
+/r % x r - -- move right
+ { 0 rmoveto
+ } def
+
+/s % string s - -- show the string
+ { show
+ } def
+
+/c % ch c - -- show the character (code given)
+ { c-string exch 0 exch put
+ c-string show
+ } def
+
+/c-string ( ) def
+
+/ru % dx dy ru - -- set a rule (rectangle)
+ { /dy exch neg def % because dy is height up from bottom
+ /dx exch def
+ /x currentpoint /y exch def def % remember current point
+ newpath x y moveto
+ dx 0 rlineto
+ 0 dy rlineto
+ dx neg 0 rlineto
+ closepath fill
+ x y moveto
+ } def
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% the \special command junk
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% The structure of the PostScript produced by dvi2ps for \special is:
+% @beginspecial
+% - any number of @hsize, @hoffset, @hscale, etc., commands
+% @setspecial
+% - the users file of PostScript commands
+% @endspecial
+
+% The @beginspecial command recognizes whether the Macintosh Laserprep
+% has been loaded or not, and redfines some Mac commands if so.
+% The @setspecial handles the users shifting, scaling, clipping commands
+
+
+% The following are user settable options from the \special command.
+
+/@SpecialDefaults
+ { /hs 8.5 Inch def
+ /vs 11 Inch def
+ /ho 0 def
+ /vo 0 def
+ /hsc 1 def
+ /vsc 1 def
+ /CLIP false def
+ } def
+
+% d @hsize - specify a horizontal clipping dimension
+% these 2 are executed before the MacDraw initializations
+/@hsize {/hs exch def /CLIP true def} def
+/@vsize {/vs exch def /CLIP true def} def
+% d @hoffset - specify a shift for the drwgs
+/@hoffset {/ho exch def} def
+/@voffset {/vo excl def} def
+% s @hscale - set scale factor
+/@hscale {/hsc exch def} def
+/@vscale {/vsc exch def} def
+
+/@setclipper
+ { hsc vsc scale
+ CLIP
+ { newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip }
+ if
+ } def
+
+% this will be invoked as the result of a \special command (for the
+% inclusion of PostScript graphics). The basic idea is to change all
+% scaling and graphics back to defaults, but to shift the origin
+% to the current position on the page. Due to TeXnical difficulties,
+% we only set the y-origin. The x-origin is set at the left edge of
+% the page.
+
+/@beginspecial % - @beginspecial - -- enter special mode
+ { gsave /SpecialSave save def
+ % the following magic incantation establishes the current point as
+ % the users origin, and reverts back to default scalings, rotations
+ currentpoint transform initgraphics itransform translate
+ @SpecialDefaults % setup default offsets, scales, sizes
+ @MacSetUp % fix up Mac stuff
+ } def
+
+/@setspecial % to setup user specified offsets, scales, sizes (for clipping)
+ {
+ MacDrwgs
+ {md begin /pxt ho def /pyt vo neg def end}
+ {ho vo translate @setclipper}
+ ifelse
+ } def
+
+/@endspecial % - @endspecial - -- leave special mode
+ { SpecialSave restore
+ grestore
+ } def
+
+/MacDrwgs false def % will get set if we think the Mac LaserPrep file has been loaded
+
+ % - @MacSetUp - turn-off/fix-up all the MacDraw stuff that might hurt us
+ % we depend on 'psu' being the first procedure executed
+ % by a Mac document. We redefine 'psu' to adjust page
+ % translations, and to do all other the fixups required.
+ % This stuff will not harm other included PS files
+/@MacSetUp
+ { userdict /md known % if md is defined
+ { userdict /md get type /dicttype eq % and if it is a dictionary
+ { /MacDrwgs true def
+ md begin % then redefine some stuff
+ /psu % redfine psu to set origins, etc.
+ /psu load
+ % this procedure contains almost all the fixup code
+ { /letter {} def % it is bad manners to execute the real
+ /note {} def % versions of these (clears page image, etc.)
+ /legal {} def
+ statusdict /waittimeout 300 put
+ /page {pop} def % no printing of pages
+ /pyt vo neg def % x & y pixel translations
+ /pxt ho def
+ }
+ concatprocs
+ def
+ /od % redefine od to set clipping region
+ /od load
+ { @setclipper }
+ concatprocs
+ def
+ end }
+ if }
+ if
+ } def
+
+% p1 p2 concatprocs p - concatenate procedures
+/concatprocs
+ { /p2 exch cvlit def
+ /p1 exch cvlit def
+ /p p1 length p2 length add array def
+ p 0 p1 putinterval
+ p p1 length p2 putinterval
+ p cvx
+ } def
+
+end % revert to previous dictionary
+TeXDict begin @start
+%%Title: cm7.dvi
+%%Creator: dvi2ps
+%%EndProlog
+1 @bop0
+[ 1500 ] /cmr7.1500 @newfont
+cmr7.1500 @sf
+[<07FF000070000070000070000070000070000070000070000070000070000070000070000070008070088070088070084070
+ 104070106070307FFFF0> 24 20 -1 0 23.695] 84 @dc
+[<FF87FC1C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01FFFE01C00E01C00E01C00E01C00E01C00E01C00
+ E01C00E01C00E0FF87FC> 24 20 -1 0 24.503] 72 @dc
+[<FF801C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C00FF80> 16 20 -1 0 11.992] 73 @dc
+[<8FC0F060C0308018801880180018003800F00FF03FC07F007000E000C010C010C030603030F01F10> 16 20 -2 0 18.334] 83 @dc
+[<00FC000703000C0080180040300020700020600020E00000E00000E00000E00000E00000E000006000207000203000601800
+ 600C00E007036000FC20> 24 20 -2 0 23.695] 67 @dc
+[<FE083FE0381C0700101C0700101C0700103A0700103A0700107107001071070010E0870010E0870010E0870011C0470011C0
+ 470013802700138027001700170017001700170017001E000F00FE000FE0> 32 20 -1 0 29.864] 77 @dc
+[<FF80F81C01CC1C03841C03841C03801C03801C03801C03801C07001C0E001FF8001C07001C03801C01C01C01C01C01C01C01
+ C01C03801C0700FFF800> 24 20 -1 0 24.099] 82 @dc
+[<FFFFC01C01C01C00C01C00401C00601C00201C00201C08201C08001C18001FF8001C18001C08001C08401C00401C00401C00
+ 801C00801C0380FFFF80> 24 20 -1 0 22.312] 69 @dc
+[<00300000300000780000780000FC0000E40000E40001C20001C2000381000381000781800700800700800E00400E00401C00
+ 201C00203C0030FF00FC> 24 20 -1 0 24.503] 86 @dc
+[<FE00203800601000E01000E01001E01003A0100720100F20100E20101C2010382010702010702010E02011C0201380201780
+ 201700201E0070FC01FC> 24 20 -1 0 24.503] 78 @dc
+[<FF80001C00001C00001C00001C00001C00001C00001C00001C00001FFC001C07001C03801C01C01C01C01C01C01C01C01C01
+ C01C03801C0700FFFC00> 24 20 -1 0 22.312] 80 @dc
+[<01F800070E001C03803801C03000C07000E07000E0E00070E00070E00070E00070E00070E000706000607000E03000C03801
+ C01C0380070E0001F800> 24 20 -2 0 25.483] 79 @dc
+[<00C00C0000C00C0000C00C0001E01E0001E01E0001F03E0003903900039039000388710007087080070870800704E0800E04
+ E0400E04E0401E03C0601C03C0201C03C0203803803038038030FF1FF0FC> 32 20 -1 0 33.439] 87 @dc
+[<FE07FC3800E01000E00801C00801C004038007FF80040380020700020700010E00010E00011E00009C00009C000078000078
+ 00007800003000003000> 24 20 -1 0 24.503] 65 @dc
+[<FFC0001C00001C00001C00001C00001C00001C00001C10001C10001C30001FF0001C30001C10001C10401C00401C00401C00
+ 801C00801C0380FFFF80> 24 20 -1 0 21.418] 70 @dc
+[ 1500 ] /cmr10.1500 @newfont
+cmr10.1500 @sf
+[<03FFFC00001F8000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F
+ 0000000F0000000F0000000F0000000F0000000F0000000F0000800F0020800F0020800F0020C00F0020400F0040400F0040
+ 600F00C0700F01C07FFFFFC0> 32 28 -1 0 29.979] 84 @dc
+[<FFF3FFC00F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F00
+ 3C000F003C000FFFFC000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C00
+ 0F003C000F003C00FFF3FFC0> 32 28 -2 0 31.133] 72 @dc
+[<FFF00F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F00
+ 0F000F00FFF0> 16 28 -1 0 14.990] 73 @dc
+[<83F800CC0E00F00300C00300C001808001C08001C08001C00001C00003C00003C0000F8000FF8007FF001FFE003FF8007FC0
+ 007C0000F00000F00000E00080E00080E000806001807003803007801C198007E080> 24 28 -2 0 23.061] 83 @dc
+[<001FC00000E0300003800800070004000E0002001C0001003C000100380000807800008070000080F0000000F0000000F000
+ 0000F0000000F0000000F0000000F0000000F00000007000008078000080380000803C0001801C0001800E00038007000780
+ 03800B8000E03180001FC080> 32 28 -2 0 29.979] 67 @dc
+[<FF8307FF801C030078000803007800080780780008078078000807807800080F407800080F407800081E207800081E207800
+ 081E207800083C107800083C107800083C10780008780878000878087800087808780008F004780008F004780008F0047800
+ 09E002780009E00278000BC00178000BC00178000BC00178000F8000F8000F8000F800FF8000FF80> 40 28 -2 0 38.051] 77 @dc
+[<FFF007C00F001C200F0038100F0078100F0078100F0078000F0078000F0078000F0078000F0078000F0078000F00F0000F00
+ E0000F03C0000FFF00000F01E0000F0078000F003C000F001C000F001E000F001E000F001E000F001E000F001C000F003C00
+ 0F0078000F01E000FFFF0000> 32 28 -2 0 30.556] 82 @dc
+[<FFFFFC0F003C0F000C0F00060F00060F00020F00020F00020F00010F02010F02000F02000F02000F06000FFE000F06000F02
+ 000F02000F02000F02020F00020F00020F00060F00040F00040F000C0F003CFFFFFC> 24 28 -2 0 28.250] 69 @dc
+[<FF8004001C000C0008000C0008001C0008003C0008003C0008007C0008007C000800F4000801E4000801E4000803C4000807
+ C40008078400080F0400080F0400081E0400083C0400083C04000878040008F8040008F0040009E0040009E004000BC00400
+ 0F8004000F800E00FF007FC0> 32 28 -2 0 31.133] 78 @dc
+[<FFF0000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000FFF800F00E00F00780F00
+ 3C0F001C0F001E0F001E0F001E0F001E0F001E0F001C0F003C0F00780F00E0FFFF80> 24 28 -2 0 28.250] 80 @dc
+[<003F800001E0F0000380380007001C000E000E001C0007003C00078038000380780003C0780003C0F00001E0F00001E0F000
+ 01E0F00001E0F00001E0F00001E0F00001E0F00001E0700001C0780003C038000380380003801C0007000E000E0007001C00
+ 0380380001E0F000003F8000> 32 28 -2 0 32.286] 79 @dc
+[<001800180000180018000018001800003C003C00003C003C00003C003C00007E007E00007A007A00007A007A00007900F200
+ 00F100F10000F100F10000F081E10001E081E08001E081E08001E043E08003C043C04003C043C04003C027C0400780278020
+ 078027802007803F80200F001F00100F001F00100F001F00101E001E00181F001F003CFFE0FFE0FF> 40 28 -1 0 42.663] 87 @dc
+[<FF80FFF01E001F000C001F0004001E0004001E0002003C0002003C0002003C000100780001FFF800010078000080F0000080
+ F0000080F0000041E0000041E0000043E0000023C0000023C0000037C0000017800000178000000F0000000F0000000F0000
+ 000600000006000000060000> 32 28 -1 0 31.133] 65 @dc
+[<FFF8000F80000F00000F00000F00000F00000F00000F00000F00000F02000F02000F02000F02000F06000FFE000F06000F02
+ 000F02000F02000F02040F00040F00040F000C0F00080F00080F00180F0078FFFFF8> 24 28 -2 0 27.097] 70 @dc
+[ 1500 ] /cmr12.1500 @newfont
+cmr12.1500 @sf
+[<03FFFF00000FC000000780000007800000078000000780000007800000078000000780000007800000078000000780000007
+ 8000000780000007800000078000000780000007800000078000000780000007800000078000000780008007800480078004
+ 8007800480078004C007800C40078008400780084007800860078018780780787FFFFFF8> 32 34 -2 0 35.225] 84 @dc
+[<FFFC3FFF0FC003F0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E00780
+ 01E0078001E0078001E0078001E0078001E007FFFFE0078001E0078001E0078001E0078001E0078001E0078001E0078001E0
+ 078001E0078001E0078001E0078001E0078001E0078001E0078001E00FC003F0FFFC3FFF> 32 34 -2 0 36.563] 72 @dc
+[<FFFC0FC007800780078007800780078007800780078007800780078007800780078007800780078007800780078007800780
+ 07800780078007800780078007800FC0FFFC> 16 34 -2 0 17.595] 73 @dc
+[<81FC00C60300F80180E000C0C000E0C000608000708000708000708000700000700000F00000F00001E00007E0003FC003FF
+ 800FFF001FFE003FF0007F0000780000F00000F00000E00020E00020E00020E000606000607000E03000E01803E00C0C6003
+ F020> 24 34 -3 0 27.097] 83 @dc
+[<000FF00000380C0000E0020001C00100078000800F0000400E0000201E0000203C0000103C0000107C000010780000107800
+ 0000F8000000F8000000F8000000F8000000F8000000F8000000F8000000F800000078000010780000107C0000103C000030
+ 3C0000301E0000300E0000700F000070078000F001C0017000E0067000381830000FE010> 32 34 -3 0 35.225] 67 @dc
+[<FFE0203FFF1F007003F00E007001E004007001E00400F801E00400F801E00400F801E00401E401E00401E401E00401E401E0
+ 0403C201E00403C201E004078101E004078101E004078101E0040F0081E0040F0081E0040F0081E0041E0041E0041E0041E0
+ 043C0021E0043C0021E0043C0021E004780011E004780011E004780011E004F00009E004F00009E004F00009E005E00005E0
+ 05E00005E007C00003E00FC00003F0FFC00003FF> 40 34 -2 0 44.692] 77 @dc
+[<FFFC007C000FC001E300078007C100078007C08007800F808007800F800007800F800007800F800007800F000007800F0000
+ 07800F000007800F000007800E000007801E000007801C00000780380000078070000007FFE0000007803C000007800E0000
+ 0780078000078007C000078003C000078003E000078003E000078003E000078003E000078003E000078003C000078007C000
+ 078007800007800E00000F803C0000FFFFE00000> 40 34 -2 0 35.894] 82 @dc
+[<00020000800000030001800000070001C00000070001C00000070001C000000F8003E000000F8003E000000F8003E000001E
+ 40079000001E40079000001E40079000003C200F0800003C200F0800003C200F08000078101E04000078101E04000078101E
+ 040000F0083C020000F0083C020000F0083C020001E00478010001E00478010001E00478010003C002F0008003C002F00080
+ 03C002F00080078001E00040078001E00040078001E000400F8003E000200F0003C000200F0003C000701F8007E000F8FFF0
+ 3FFC03FE> 48 34 -1 0 50.111] 87 @dc
+[<FFFFFFE00F8003E0078000E00780007007800030078000300780001007800010078000100780000807800008078020080780
+ 20000780200007802000078060000780E00007FFE0000780E000078060000780200007802000078020000780202007800020
+ 0780002007800020078000600780004007800040078000C0078001C00F8007C0FFFFFFC0> 32 34 -2 0 33.185] 69 @dc
+[<FFFFFF000F803F0007800F000780030007800300078001000780018007800180078000800780008007800080078000800780
+ 0000078000000780000007800000078000000780000007800000078000000780000007800000078000000780000007800000
+ 078000000780000007800000078000000780000007800000078000000FC00000FFFE0000> 32 34 -2 0 30.475] 76 @dc
+[<0000C000000000C000000001E000000001E000000001E000000003D000000003D000000003D0000000078800000007880000
+ 000F840000000F040000000F040000001E020000001E020000003E030000003C010000003C01000000780080000078008000
+ 00F800C00000F000400000F000400001E000200001E000200001E000200003C000100003C000100007C00008000780000800
+ 07800008000F80000C001F80001F00FFF0007FC0> 40 34 -1 0 36.563] 86 @dc
+[<FFFC00000FC00000078000000780000007800000078000000780000007800000078000000780000007800000078000000780
+ 000007800000078000000780000007FFF00007803C0007800F0007800780078007C0078003C0078003E0078003E0078003E0
+ 078003E0078003E0078003E0078003C0078007C00780078007800F000F803C00FFFFF000> 32 34 -2 0 33.185] 80 @dc
+[<000FE00000783C0001E00F0003C00780078003C00F0001E01E0000F01E0000F03C0000783C0000787C00007C7C00007C7800
+ 003CF800003EF800003EF800003EF800003EF800003EF800003EF800003EF800003E7800003C7800003C7C00007C3C000078
+ 3C0000781E0000F01E0000F00F0001E0078003C00380038001E00F0000783C00000FE000> 32 34 -3 0 37.935] 79 @dc
+[<FFE000201F0000600E000060040000E0040001E0040001E0040003E0040003E0040007A004000F2004000F2004001E200400
+ 3E2004003C20040078200400F8200400F0200401E0200401E0200403C0200407802004078020040F0020041F0020041E0020
+ 043C0020047C00200478002004F0002004F0002005E0002007C0007007C000F8FF8007FF> 32 34 -2 0 36.563] 78 @dc
+[<FF800FFF3E0001F80C0000F00C0001F0040001E0040001E0060003E0020003C0020003C0010007800100078001FFFF800080
+ 0F0000800F0000801F0000401E0000401E0000603E0000203C0000203C000010780000107800001078000008F0000008F000
+ 0009F0000005E0000005E0000007E0000003C0000003C000000180000001800000018000> 32 34 -2 0 36.563] 65 @dc
+[<FFFE00000FC00000078000000780000007800000078000000780000007800000078000000780000007800000078020000780
+ 20000780200007802000078060000780E00007FFE0000780E000078060000780200007802000078020000780202007800020
+ 0780002007800020078000600780004007800040078000C0078001C00F8007C0FFFFFFC0> 32 34 -2 0 31.830] 70 @dc
+cmr10.1500 @sf
+[<FFF80F80070007000700070007000700070007000700070007000700070007000700070007000700070007000700C7003F00
+ 07000300> 16 27 -4 0 20.755] 49 @dc
+1 @bop1
+cmr7.1500 @sf
+83 42 p (THIS) s
+11 r (IS) s
+11 r (CMR) s
+12 r (SEVEN) s
+11 r (POINTS) s
+11 r (WRITTEN) s
+11 r (IN) s
+11 r (MET) s
+-1 r (AF) s
+-1 r (ONT) s
+cmr10.1500 @sf
+83 91 p (THIS) s
+14 r (IS) s
+14 r (CMR) s
+14 r (TEN) s
+13 r (POINTS) s
+14 r (WRITTEN) s
+14 r (IN) s
+14 r (MET) s
+-3 r (AF) s
+-1 r (ONT) s
+cmr12.1500 @sf
+83 141 p (THIS) s
+16 r (IS) s
+17 r (CMR) s
+16 r (TWEL) s
+-5 r (VE) s
+16 r (POINTS) s
+16 r (WRITTEN) s
+16 r (IN) s
+16 r (MET) s
+-3 r (AF) s
+-1 r (ONT) s
+cmr10.1500 @sf
+965 2770 p 49 c
+@eop
+@end
diff --git a/fonts/utilities/mf2ps/doc/printsamples/cm7.tex b/fonts/utilities/mf2ps/doc/printsamples/cm7.tex
new file mode 100644
index 0000000000..d2a275b95a
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/cm7.tex
@@ -0,0 +1,12 @@
+\font\test=cmr7
+\test
+THIS IS CMR SEVEN POINTS WRITTEN IN METAFONT
+
+\font\test=cmr10
+\test
+THIS IS CMR TEN POINTS WRITTEN IN METAFONT
+
+\font\test=cmr12
+\test
+THIS IS CMR TWELVE POINTS WRITTEN IN METAFONT
+\bye
diff --git a/fonts/utilities/mf2ps/doc/printsamples/cmr.ps b/fonts/utilities/mf2ps/doc/printsamples/cmr.ps
new file mode 100644
index 0000000000..6237342ee7
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/cmr.ps
@@ -0,0 +1,4555 @@
+%! Simon font
+%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 40 def
+SimonFont begin
+%%
+ /FontType 3 def
+ /FontMatrix [0.000895 0 0 0.000895 0 0] def
+% /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_letter_A
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 194 180 0.5 sub moveto
+ 346 180 0.5 sub lineto
+ 318 182 0.5 sub 290 182 0.5 sub 262 182 0.5 sub curveto
+ 262 180 0.5 sub lineto
+ 192 180 0.5 sub lineto
+closepath
+%end path
+%erase
+%new path
+ 488 180 0.5 sub moveto
+ 684 180 0.5 sub lineto
+ 654 182 0.5 sub 624 182 0.5 sub 594 182 0.5 sub curveto
+ 594 180 0.5 sub lineto
+ 486 180 0.5 sub lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 418 600 moveto
+ 466 462 514 324 562 186 curveto
+ 562 184 564 182 566 182 curveto
+ 568 180 570 180 574 180 curveto
+ 622 180 lineto
+ 624 180 626 180 626 182 curveto
+ 628 182 628 184 628 186 curveto
+ 626 186 lineto
+ 626 188 lineto
+ 568 354 510 522 452 688 curveto
+ 452 690 450 692 450 692 curveto
+ 448 694 444 696 442 696 curveto
+ 442 694 lineto
+ 434 694 lineto
+ 432 694 428 692 426 690 curveto
+ 426 690 424 688 424 686 curveto
+ 366 520 308 352 250 186 curveto
+ 250 184 lineto
+ 252 184 lineto
+ 252 182 252 180 254 180 curveto
+ 264 180 lineto
+ 268 180 270 182 272 184 curveto
+ 274 184 274 186 276 188 curveto
+ 324 326 370 464 418 602 curveto
+closepath
+%end path
+fill
+%new path
+ 318 344 moveto
+ 538 344 lineto
+ 536 352 534 360 532 366 curveto
+ 532 364 lineto
+ 324 364 lineto
+ 322 358 318 350 316 342 curveto
+closepath
+%end path
+fill
+%new path
+ 270 246 moveto
+ 268 236 262 228 256 222 curveto
+ 252 218 248 214 242 212 curveto
+ 228 202 210 200 192 200 curveto
+ 192 180 lineto
+ 264 180 lineto
+ 270 202 278 226 284 248 curveto
+ 282 246 lineto
+ 270 246 lineto
+closepath
+%end path
+fill
+%new path
+ 294 246 moveto
+ 282 246 lineto
+ 276 224 268 200 262 180 curveto
+ 348 180 lineto
+ 348 202 lineto
+ 346 202 lineto
+ 332 202 316 206 304 216 curveto
+ 302 216 302 216 302 218 curveto
+ 296 224 292 232 292 240 curveto
+ 294 240 lineto
+ 294 242 294 246 296 248 curveto
+closepath
+%end path
+fill
+%new path
+ 548 226 moveto
+ 550 224 550 224 550 222 curveto
+ 548 222 lineto
+ 548 218 546 214 542 210 curveto
+ 540 210 538 208 536 206 curveto
+ 522 200 504 200 486 200 curveto
+ 486 180 lineto
+ 594 180 lineto
+ 588 196 584 212 580 228 curveto
+ 580 226 lineto
+ 546 226 lineto
+closepath
+%end path
+fill
+%new path
+ 612 226 moveto
+ 582 226 lineto
+ 586 210 590 194 596 180 curveto
+ 686 180 lineto
+ 686 202 lineto
+ 684 202 lineto
+ 666 202 642 202 630 206 curveto
+ 626 208 624 210 622 212 curveto
+ 618 216 614 222 612 228 curveto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_B
+(
+newpath
+%new path
+ 270 668 moveto
+ 270 664 lineto
+ 268 664 lineto
+ 268 188 lineto
+ 270 188 lineto
+ 270 184 lineto
+ 274 180 lineto
+ 326 180 lineto
+ 328 184 lineto
+ 330 186 lineto
+ 330 664 lineto
+ 328 668 lineto
+ 326 670 lineto
+ 322 672 lineto
+ 320 672 lineto
+ 320 670 lineto
+ 276 670 lineto
+ 276 672 lineto
+ 274 670 lineto
+ 270 668 lineto
+closepath
+%end path
+fill
+%new path
+ 300 650 moveto
+ 460 650 lineto
+ 460 648 lineto
+ 482 648 504 638 520 622 curveto
+ 522 622 522 620 524 618 curveto
+ 542 600 550 574 550 548 curveto
+ 548 548 lineto
+ 548 520 536 494 518 474 curveto
+ 516 474 516 474 516 472 curveto
+ 494 452 466 442 438 442 curveto
+ 298 442 lineto
+ 298 432 lineto
+ 300 434 lineto
+ 460 434 lineto
+ 500 434 540 444 574 468 curveto
+ 578 472 584 476 590 480 curveto
+ 608 500 620 524 620 550 curveto
+ 618 550 lineto
+ 618 578 604 604 584 624 curveto
+ 580 628 576 632 572 636 curveto
+ 538 660 498 672 458 672 curveto
+ 458 670 lineto
+ 298 670 lineto
+ 298 648 lineto
+closepath
+%end path
+fill
+%new path
+ 300 428 moveto
+ 470 428 lineto
+ 470 426 lineto
+ 494 426 516 416 534 398 curveto
+ 536 396 538 394 540 392 curveto
+ 558 370 568 340 568 310 curveto
+ 566 310 lineto
+ 566 280 554 252 534 232 curveto
+ 514 212 486 200 458 200 curveto
+ 298 200 lineto
+ 298 180 lineto
+ 480 180 lineto
+ 522 180 562 192 594 218 curveto
+ 596 222 600 224 604 228 curveto
+ 626 250 640 280 640 312 curveto
+ 638 312 lineto
+ 638 342 624 370 604 390 curveto
+ 600 394 596 398 592 402 curveto
+ 560 426 518 438 478 438 curveto
+ 478 436 lineto
+ 298 436 lineto
+ 298 426 lineto
+closepath
+%end path
+fill
+%new path
+ 270 624 moveto
+ 300 624 lineto
+ 300 672 lineto
+ 298 670 lineto
+ 194 670 lineto
+ 194 648 lineto
+ 196 648 lineto
+ 216 648 246 648 258 644 curveto
+ 260 642 262 642 264 640 curveto
+ 268 636 270 628 270 622 curveto
+closepath
+%end path
+fill
+%new path
+ 330 624 moveto
+ 330 632 330 640 334 644 curveto
+ 336 644 336 646 336 646 curveto
+ 342 650 356 650 368 650 curveto
+ 368 672 lineto
+ 366 670 lineto
+ 298 670 lineto
+ 298 622 lineto
+ 300 624 lineto
+ 330 624 lineto
+closepath
+%end path
+fill
+%new path
+ 268 226 moveto
+ 268 220 266 212 262 208 curveto
+ 260 206 258 206 256 204 curveto
+ 244 200 214 200 194 200 curveto
+ 194 180 lineto
+ 300 180 lineto
+ 300 228 lineto
+ 298 226 lineto
+ 268 226 lineto
+closepath
+%end path
+fill
+%new path
+ 328 226 moveto
+ 298 226 lineto
+ 298 180 lineto
+ 368 180 lineto
+ 368 202 lineto
+ 366 202 lineto
+ 354 202 340 202 334 206 curveto
+ 334 206 334 208 332 208 curveto
+ 328 212 328 220 328 228 curveto
+closepath
+%end path
+fill
+) def
+
+/The_letter_C
+(
+newpath
+%new path
+ 642 482 moveto
+ 656 482 lineto
+ 658 484 lineto
+ 660 486 lineto
+ 660 490 lineto
+ 658 492 lineto
+ 654 532 640 570 620 602 curveto
+ 618 604 lineto
+ 618 606 lineto
+ 610 616 602 626 592 636 curveto
+ 592 636 lineto
+ 592 638 lineto
+ 572 656 550 670 524 678 curveto
+ 522 678 lineto
+ 522 680 lineto
+ 506 686 490 688 472 688 curveto
+ 470 688 lineto
+ 470 686 lineto
+ 444 686 418 682 394 674 curveto
+ 392 674 lineto
+ 392 672 lineto
+ 356 660 324 640 296 614 curveto
+ 296 614 lineto
+ 296 612 lineto
+ 294 612 294 610 292 610 curveto
+ 282 598 272 586 264 574 curveto
+ 264 576 lineto
+ 262 572 lineto
+ 234 528 218 478 218 426 curveto
+ 220 428 lineto
+ 220 422 lineto
+ 220 370 236 320 264 276 curveto
+ 262 278 lineto
+ 264 274 lineto
+ 266 274 lineto
+ 274 262 284 250 294 238 curveto
+ 296 238 296 236 298 236 curveto
+ 298 236 lineto
+ 298 234 lineto
+ 326 208 358 188 394 178 curveto
+ 396 178 lineto
+ 396 176 lineto
+ 420 168 446 164 472 164 curveto
+ 472 164 lineto
+ 474 166 lineto
+ 494 166 512 170 530 176 curveto
+ 530 174 lineto
+ 532 176 lineto
+ 534 176 lineto
+ 560 184 584 198 604 218 curveto
+ 602 216 lineto
+ 604 218 lineto
+ 614 228 620 236 628 246 curveto
+ 626 246 lineto
+ 628 248 lineto
+ 630 250 lineto
+ 648 278 660 314 660 352 curveto
+ 660 354 lineto
+ 658 358 lineto
+ 656 358 lineto
+ 654 360 lineto
+ 652 360 lineto
+ 650 358 lineto
+ 646 358 lineto
+ 646 360 lineto
+ 644 358 lineto
+ 642 358 lineto
+ 640 354 lineto
+ 640 316 630 282 610 254 curveto
+ 612 256 lineto
+ 614 258 lineto
+ 612 258 lineto
+ 606 248 598 238 590 230 curveto
+ 592 232 lineto
+ 590 228 lineto
+ 590 224 lineto
+ 592 232 lineto
+ 598 234 lineto
+ 596 234 lineto
+ 592 232 lineto
+ 574 214 552 200 526 192 curveto
+ 528 192 lineto
+ 530 194 lineto
+ 530 192 lineto
+ 514 186 496 184 478 184 curveto
+ 478 186 lineto
+ 476 184 lineto
+ 474 184 lineto
+ 480 186 lineto
+ 484 184 lineto
+ 480 186 lineto
+ 460 186 440 190 422 196 curveto
+ 424 194 lineto
+ 426 194 lineto
+ 398 204 374 218 354 240 curveto
+ 354 238 lineto
+ 352 240 lineto
+ 356 238 lineto
+ 358 234 lineto
+ 356 238 lineto
+ 354 238 lineto
+ 350 244 344 250 340 256 curveto
+ 336 260 334 264 330 268 curveto
+ 332 266 lineto
+ 334 264 lineto
+ 332 264 lineto
+ 302 312 292 370 292 428 curveto
+ 294 428 lineto
+ 292 430 lineto
+ 294 428 lineto
+ 292 420 lineto
+ 294 424 lineto
+ 294 482 304 540 334 588 curveto
+ 334 586 lineto
+ 332 584 lineto
+ 336 588 338 592 342 596 curveto
+ 346 602 352 608 356 614 curveto
+ 358 616 lineto
+ 358 620 lineto
+ 356 614 lineto
+ 350 612 lineto
+ 354 612 lineto
+ 356 614 lineto
+ 376 634 400 648 428 658 curveto
+ 426 656 lineto
+ 424 656 lineto
+ 442 662 462 666 480 666 curveto
+ 482 666 lineto
+ 484 668 lineto
+ 478 666 lineto
+ 474 668 lineto
+ 474 666 lineto
+ 478 666 lineto
+ 478 664 lineto
+ 494 664 510 662 524 656 curveto
+ 522 658 lineto
+ 520 658 lineto
+ 542 650 562 638 580 620 curveto
+ 578 622 lineto
+ 582 620 lineto
+ 578 622 lineto
+ 576 626 lineto
+ 578 622 lineto
+ 588 612 594 604 602 592 curveto
+ 600 594 lineto
+ 598 596 lineto
+ 600 596 lineto
+ 620 564 634 526 638 486 curveto
+ 636 486 lineto
+ 638 484 lineto
+ 640 482 lineto
+ 642 482 lineto
+closepath
+%end path
+fill
+%new path
+ 658 484 moveto
+ 660 486 lineto
+ 660 682 lineto
+ 658 686 lineto
+ 656 686 lineto
+ 654 688 lineto
+ 652 688 lineto
+ 650 686 lineto
+ 648 686 lineto
+ 648 688 lineto
+ 646 686 lineto
+ 644 686 lineto
+ 644 684 lineto
+ 628 660 612 636 596 614 curveto
+ 594 612 lineto
+ 594 608 lineto
+ 596 604 lineto
+ 598 604 lineto
+ 600 600 604 596 606 590 curveto
+ 606 592 lineto
+ 604 594 lineto
+ 624 562 638 524 642 486 curveto
+ 640 486 lineto
+ 642 484 lineto
+ 644 482 lineto
+ 656 482 lineto
+ 658 484 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_D
+(
+newpath
+%new path
+ 270 668 moveto
+ 270 664 lineto
+ 268 664 lineto
+ 268 188 lineto
+ 270 188 lineto
+ 270 184 lineto
+ 274 180 lineto
+ 328 180 lineto
+ 330 184 lineto
+ 332 186 lineto
+ 332 664 lineto
+ 330 668 lineto
+ 328 670 lineto
+ 324 672 lineto
+ 322 672 lineto
+ 322 670 lineto
+ 276 670 lineto
+ 276 672 lineto
+ 274 670 lineto
+ 270 668 lineto
+closepath
+%end path
+fill
+%new path
+ 302 650 moveto
+ 442 650 lineto
+ 442 648 lineto
+ 484 648 524 632 552 602 curveto
+ 558 596 564 590 568 584 curveto
+ 602 536 608 478 608 420 curveto
+ 606 420 lineto
+ 606 364 600 306 566 262 curveto
+ 562 256 558 250 554 246 curveto
+ 524 216 482 200 440 200 curveto
+ 300 200 lineto
+ 300 180 lineto
+ 460 180 lineto
+ 516 180 568 204 608 244 curveto
+ 610 246 614 248 616 250 curveto
+ 658 298 680 358 680 422 curveto
+ 678 422 lineto
+ 678 486 656 550 614 598 curveto
+ 610 602 606 606 604 610 curveto
+ 564 648 512 672 458 672 curveto
+ 458 670 lineto
+ 300 670 lineto
+ 300 648 lineto
+closepath
+%end path
+fill
+%new path
+ 270 624 moveto
+ 302 624 lineto
+ 302 672 lineto
+ 300 670 lineto
+ 194 670 lineto
+ 194 648 lineto
+ 196 648 lineto
+ 216 648 246 648 258 644 curveto
+ 260 642 262 642 264 640 curveto
+ 268 636 270 628 270 622 curveto
+closepath
+%end path
+fill
+%new path
+ 332 624 moveto
+ 332 632 332 640 336 644 curveto
+ 338 644 338 646 338 646 curveto
+ 344 650 358 650 370 650 curveto
+ 370 672 lineto
+ 368 670 lineto
+ 300 670 lineto
+ 300 622 lineto
+ 302 624 lineto
+ 332 624 lineto
+closepath
+%end path
+fill
+%new path
+ 268 226 moveto
+ 268 220 266 212 262 208 curveto
+ 260 206 258 206 256 204 curveto
+ 244 200 214 200 194 200 curveto
+ 194 180 lineto
+ 302 180 lineto
+ 302 228 lineto
+ 300 226 lineto
+ 268 226 lineto
+closepath
+%end path
+fill
+%new path
+ 330 226 moveto
+ 300 226 lineto
+ 300 180 lineto
+ 370 180 lineto
+ 370 202 lineto
+ 368 202 lineto
+ 356 202 342 202 336 206 curveto
+ 336 206 336 208 334 208 curveto
+ 330 212 330 220 330 228 curveto
+closepath
+%end path
+fill
+) def
+
+/The_letter_E
+(
+newpath
+%new path
+ 268 666 moveto
+ 268 662 lineto
+ 266 662 lineto
+ 266 188 lineto
+ 268 188 lineto
+ 268 184 lineto
+ 272 180 lineto
+ 328 180 lineto
+ 330 184 lineto
+ 332 186 lineto
+ 332 662 lineto
+ 330 666 lineto
+ 328 668 lineto
+ 324 670 lineto
+ 322 670 lineto
+ 322 668 lineto
+ 274 668 lineto
+ 274 670 lineto
+ 272 668 lineto
+ 268 666 lineto
+closepath
+%end path
+fill
+%new path
+ 602 508 moveto
+ 618 508 lineto
+ 612 562 604 616 598 670 curveto
+ 598 668 lineto
+ 298 668 lineto
+ 298 646 lineto
+ 300 648 lineto
+ 442 648 lineto
+ 442 646 lineto
+ 484 646 532 646 562 620 curveto
+ 562 620 564 618 566 618 curveto
+ 592 590 598 546 602 506 curveto
+closepath
+%end path
+fill
+%new path
+ 472 528 moveto
+ 472 504 472 476 456 460 curveto
+ 440 444 410 444 386 444 curveto
+ 298 444 lineto
+ 298 422 lineto
+ 300 424 lineto
+ 492 424 lineto
+ 492 530 lineto
+ 490 528 lineto
+ 472 528 lineto
+closepath
+%end path
+fill
+%new path
+ 474 340 moveto
+ 492 340 lineto
+ 492 446 lineto
+ 490 444 lineto
+ 298 444 lineto
+ 298 422 lineto
+ 300 424 lineto
+ 388 424 lineto
+ 388 422 lineto
+ 412 422 442 422 458 406 curveto
+ 474 390 474 362 474 338 curveto
+closepath
+%end path
+fill
+%new path
+ 620 364 moveto
+ 612 318 604 262 574 234 curveto
+ 574 232 572 232 572 230 curveto
+ 538 200 490 200 446 200 curveto
+ 298 200 lineto
+ 298 180 lineto
+ 610 180 lineto
+ 620 242 630 304 640 366 curveto
+ 638 364 lineto
+ 620 364 lineto
+closepath
+%end path
+fill
+%new path
+ 268 622 moveto
+ 300 622 lineto
+ 300 670 lineto
+ 298 668 lineto
+ 192 668 lineto
+ 192 646 lineto
+ 194 646 lineto
+ 214 646 244 646 256 642 curveto
+ 258 640 260 640 262 638 curveto
+ 266 634 268 626 268 620 curveto
+closepath
+%end path
+fill
+%new path
+ 332 622 moveto
+ 332 630 332 638 336 642 curveto
+ 338 642 338 644 338 644 curveto
+ 344 648 358 648 370 648 curveto
+ 370 670 lineto
+ 368 668 lineto
+ 298 668 lineto
+ 298 620 lineto
+ 300 622 lineto
+ 332 622 lineto
+closepath
+%end path
+fill
+%new path
+ 266 226 moveto
+ 266 220 264 212 260 208 curveto
+ 258 206 256 206 254 204 curveto
+ 242 200 212 200 192 200 curveto
+ 192 180 lineto
+ 300 180 lineto
+ 300 228 lineto
+ 298 226 lineto
+ 266 226 lineto
+closepath
+%end path
+fill
+%new path
+ 330 226 moveto
+ 298 226 lineto
+ 298 180 lineto
+ 370 180 lineto
+ 370 202 lineto
+ 368 202 lineto
+ 356 202 342 202 336 206 curveto
+ 336 206 336 208 334 208 curveto
+ 330 212 330 220 330 228 curveto
+closepath
+%end path
+fill
+) def
+
+/The_letter_F
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 194 180 0.5 sub moveto
+ 422 180 0.5 sub lineto
+ 382 182 0.5 sub 340 182 0.5 sub 298 182 0.5 sub curveto
+ 298 180 0.5 sub lineto
+ 192 180 0.5 sub lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 268 666 moveto
+ 268 662 lineto
+ 266 662 lineto
+ 266 188 lineto
+ 268 188 lineto
+ 268 184 lineto
+ 272 180 lineto
+ 328 180 lineto
+ 330 184 lineto
+ 332 186 lineto
+ 332 662 lineto
+ 330 666 lineto
+ 328 668 lineto
+ 324 670 lineto
+ 322 670 lineto
+ 322 668 lineto
+ 274 668 lineto
+ 274 670 lineto
+ 272 668 lineto
+ 268 666 lineto
+closepath
+%end path
+fill
+%new path
+ 592 508 moveto
+ 608 508 lineto
+ 602 562 594 616 588 670 curveto
+ 588 668 lineto
+ 298 668 lineto
+ 298 646 lineto
+ 300 648 lineto
+ 438 648 lineto
+ 438 646 lineto
+ 478 646 524 646 552 620 curveto
+ 554 620 554 618 556 618 curveto
+ 582 592 588 546 592 506 curveto
+closepath
+%end path
+fill
+%new path
+ 468 518 moveto
+ 468 494 468 464 452 450 curveto
+ 436 434 408 434 384 434 curveto
+ 298 434 lineto
+ 298 412 lineto
+ 300 414 lineto
+ 488 414 lineto
+ 488 520 lineto
+ 486 518 lineto
+ 468 518 lineto
+closepath
+%end path
+fill
+%new path
+ 470 330 moveto
+ 488 330 lineto
+ 488 436 lineto
+ 486 434 lineto
+ 298 434 lineto
+ 298 412 lineto
+ 300 414 lineto
+ 386 414 lineto
+ 386 412 lineto
+ 410 412 438 412 454 396 curveto
+ 470 382 470 352 470 328 curveto
+closepath
+%end path
+fill
+%new path
+ 268 622 moveto
+ 300 622 lineto
+ 300 670 lineto
+ 298 668 lineto
+ 192 668 lineto
+ 192 646 lineto
+ 194 646 lineto
+ 214 646 244 646 256 642 curveto
+ 258 640 260 640 262 638 curveto
+ 266 634 268 626 268 620 curveto
+closepath
+%end path
+fill
+%new path
+ 332 622 moveto
+ 332 630 332 638 336 642 curveto
+ 338 642 338 644 338 644 curveto
+ 344 648 358 648 370 648 curveto
+ 370 670 lineto
+ 368 668 lineto
+ 298 668 lineto
+ 298 620 lineto
+ 300 622 lineto
+ 332 622 lineto
+closepath
+%end path
+fill
+%new path
+ 266 226 moveto
+ 266 220 264 212 260 208 curveto
+ 258 206 256 206 254 204 curveto
+ 242 200 212 200 192 200 curveto
+ 192 180 lineto
+ 300 180 lineto
+ 300 228 lineto
+ 298 226 lineto
+ 266 226 lineto
+closepath
+%end path
+fill
+%new path
+ 330 226 moveto
+ 298 226 lineto
+ 298 180 lineto
+ 424 180 lineto
+ 424 202 lineto
+ 422 202 lineto
+ 396 202 360 202 346 206 curveto
+ 342 208 340 210 336 212 curveto
+ 332 216 330 222 330 228 curveto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_G
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 508 376 0.5 add moveto
+ 548 374 0.5 add 590 374 0.5 add 630 374 0.5 add curveto
+ 630 376 0.5 add lineto
+ 658 376 0.5 add 684 376 0.5 add 712 378 0.5 add curveto
+ 710 376 0.5 add lineto
+ 506 376 0.5 add lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 596 264 moveto
+ 598 264 lineto
+ 598 248 604 234 612 220 curveto
+ 610 222 lineto
+ 612 218 lineto
+ 614 218 lineto
+ 618 210 624 204 632 196 curveto
+ 630 198 lineto
+ 632 196 lineto
+ 638 190 644 184 652 180 curveto
+ 658 180 lineto
+ 660 182 lineto
+ 662 184 lineto
+ 662 268 lineto
+ 660 272 lineto
+ 658 272 lineto
+ 656 274 lineto
+ 654 274 lineto
+ 652 272 lineto
+ 602 272 lineto
+ 602 274 lineto
+ 600 272 lineto
+ 598 272 lineto
+ 596 268 lineto
+ 596 264 lineto
+closepath
+%end path
+fill
+%new path
+ 644 482 moveto
+ 658 482 lineto
+ 660 484 lineto
+ 662 486 lineto
+ 662 490 lineto
+ 660 492 lineto
+ 656 532 642 570 622 602 curveto
+ 622 600 lineto
+ 620 604 lineto
+ 612 616 604 626 594 636 curveto
+ 596 634 lineto
+ 594 636 lineto
+ 574 656 552 670 526 678 curveto
+ 524 678 lineto
+ 524 680 lineto
+ 508 686 490 688 472 688 curveto
+ 472 688 lineto
+ 470 686 lineto
+ 444 686 420 682 396 674 curveto
+ 394 674 lineto
+ 392 672 lineto
+ 356 660 324 640 296 614 curveto
+ 296 614 lineto
+ 296 612 lineto
+ 294 612 294 610 292 610 curveto
+ 282 598 272 586 264 574 curveto
+ 262 572 lineto
+ 262 570 lineto
+ 234 528 218 478 218 426 curveto
+ 220 428 lineto
+ 220 422 lineto
+ 220 370 236 320 264 278 curveto
+ 262 278 lineto
+ 264 276 lineto
+ 266 274 lineto
+ 274 262 284 250 294 238 curveto
+ 296 238 296 236 298 236 curveto
+ 298 236 lineto
+ 298 234 lineto
+ 326 208 358 188 394 178 curveto
+ 396 178 lineto
+ 398 176 lineto
+ 422 168 446 164 472 164 curveto
+ 474 164 lineto
+ 474 166 lineto
+ 498 166 520 170 540 176 curveto
+ 542 176 lineto
+ 542 178 lineto
+ 562 182 580 192 594 204 curveto
+ 594 204 lineto
+ 594 206 lineto
+ 598 210 602 214 606 220 curveto
+ 604 218 lineto
+ 606 222 lineto
+ 608 222 lineto
+ 616 234 620 248 620 266 curveto
+ 620 268 lineto
+ 618 272 lineto
+ 616 272 lineto
+ 614 274 lineto
+ 612 274 lineto
+ 610 272 lineto
+ 602 272 lineto
+ 602 274 lineto
+ 600 272 lineto
+ 598 272 lineto
+ 596 268 lineto
+ 596 252 592 238 584 226 curveto
+ 584 228 lineto
+ 586 230 lineto
+ 582 226 580 222 576 218 curveto
+ 574 216 lineto
+ 574 212 lineto
+ 576 218 lineto
+ 582 220 lineto
+ 578 220 lineto
+ 576 218 lineto
+ 564 206 548 198 530 192 curveto
+ 532 192 lineto
+ 534 194 lineto
+ 534 192 lineto
+ 518 186 500 184 482 184 curveto
+ 482 186 lineto
+ 480 184 lineto
+ 478 184 lineto
+ 484 186 lineto
+ 488 184 lineto
+ 484 186 lineto
+ 464 186 444 190 424 196 curveto
+ 426 194 lineto
+ 428 194 lineto
+ 400 204 374 220 354 240 curveto
+ 352 240 lineto
+ 356 238 lineto
+ 358 236 lineto
+ 356 238 lineto
+ 354 240 lineto
+ 350 244 344 250 340 256 curveto
+ 336 260 334 264 330 268 curveto
+ 332 268 lineto
+ 334 264 lineto
+ 332 266 lineto
+ 302 312 292 370 292 428 curveto
+ 294 428 lineto
+ 292 430 lineto
+ 294 428 lineto
+ 292 420 lineto
+ 294 424 lineto
+ 294 482 304 540 334 588 curveto
+ 334 586 lineto
+ 332 584 lineto
+ 336 588 338 592 342 596 curveto
+ 346 602 352 608 356 614 curveto
+ 356 612 lineto
+ 358 616 lineto
+ 358 620 lineto
+ 356 612 lineto
+ 350 610 lineto
+ 352 610 lineto
+ 354 612 lineto
+ 356 612 lineto
+ 376 634 400 648 428 658 curveto
+ 428 656 lineto
+ 426 656 lineto
+ 444 662 462 666 482 666 curveto
+ 484 666 lineto
+ 484 668 lineto
+ 478 666 lineto
+ 474 668 lineto
+ 476 666 lineto
+ 478 666 lineto
+ 480 664 lineto
+ 496 664 510 662 524 656 curveto
+ 524 658 lineto
+ 522 658 lineto
+ 544 650 564 638 582 620 curveto
+ 580 622 lineto
+ 584 620 lineto
+ 580 622 lineto
+ 578 626 lineto
+ 580 622 lineto
+ 590 612 598 602 604 592 curveto
+ 604 594 lineto
+ 602 596 lineto
+ 622 564 636 526 640 486 curveto
+ 638 486 lineto
+ 640 484 lineto
+ 642 482 lineto
+ 644 482 lineto
+closepath
+%end path
+fill
+%new path
+ 660 484 moveto
+ 662 486 lineto
+ 662 682 lineto
+ 660 686 lineto
+ 658 686 lineto
+ 656 688 lineto
+ 654 688 lineto
+ 652 686 lineto
+ 650 686 lineto
+ 650 688 lineto
+ 648 686 lineto
+ 646 686 lineto
+ 646 684 lineto
+ 630 660 614 636 598 614 curveto
+ 596 612 lineto
+ 596 608 lineto
+ 598 604 lineto
+ 600 604 lineto
+ 602 600 606 594 608 590 curveto
+ 608 592 lineto
+ 606 594 lineto
+ 626 562 640 524 644 486 curveto
+ 642 486 lineto
+ 644 484 lineto
+ 646 482 lineto
+ 658 482 lineto
+ 660 484 lineto
+closepath
+%end path
+fill
+%new path
+ 598 374 moveto
+ 596 370 lineto
+ 596 266 lineto
+ 598 262 lineto
+ 600 260 lineto
+ 604 258 lineto
+ 606 258 lineto
+ 606 260 lineto
+ 656 260 lineto
+ 654 258 lineto
+ 658 260 lineto
+ 660 262 lineto
+ 662 266 lineto
+ 662 370 lineto
+ 660 374 lineto
+ 658 376 lineto
+ 654 378 lineto
+ 652 378 lineto
+ 652 376 lineto
+ 602 376 lineto
+ 604 378 lineto
+ 600 376 lineto
+ 598 374 lineto
+closepath
+%end path
+fill
+%new path
+ 598 330 moveto
+ 630 330 lineto
+ 630 378 lineto
+ 628 376 lineto
+ 506 376 lineto
+ 506 354 lineto
+ 508 354 lineto
+ 534 354 568 354 582 350 curveto
+ 586 348 590 346 592 344 curveto
+ 596 340 598 334 598 328 curveto
+closepath
+%end path
+fill
+%new path
+ 662 330 moveto
+ 662 338 662 344 668 350 curveto
+ 668 350 670 352 670 352 curveto
+ 678 356 698 356 712 356 curveto
+ 712 378 lineto
+ 710 376 lineto
+ 628 376 lineto
+ 628 328 lineto
+ 630 330 lineto
+ 662 330 lineto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_H
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 194 670 0.5 add moveto
+ 230 668 0.5 add 264 668 0.5 add 300 668 0.5 add curveto
+ 300 670 0.5 add lineto
+ 336 670 0.5 add 370 670 0.5 add 406 672 0.5 add curveto
+ 404 670 0.5 add lineto
+ 192 670 0.5 add lineto
+closepath
+%end path
+%erase
+%new path
+ 194 180 0.5 sub moveto
+ 404 180 0.5 sub lineto
+ 368 182 0.5 sub 334 182 0.5 sub 298 182 0.5 sub curveto
+ 298 180 0.5 sub lineto
+ 192 180 0.5 sub lineto
+closepath
+%end path
+%erase
+%new path
+ 474 670 0.5 add moveto
+ 510 668 0.5 add 544 668 0.5 add 580 668 0.5 add curveto
+ 580 670 0.5 add lineto
+ 616 670 0.5 add 650 670 0.5 add 686 672 0.5 add curveto
+ 684 670 0.5 add lineto
+ 472 670 0.5 add lineto
+closepath
+%end path
+%erase
+%new path
+ 474 180 0.5 sub moveto
+ 684 180 0.5 sub lineto
+ 648 182 0.5 sub 614 182 0.5 sub 578 182 0.5 sub curveto
+ 578 180 0.5 sub lineto
+ 472 180 0.5 sub lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 268 668 moveto
+ 268 664 lineto
+ 266 664 lineto
+ 266 188 lineto
+ 268 188 lineto
+ 268 184 lineto
+ 272 180 lineto
+ 328 180 lineto
+ 330 184 lineto
+ 332 186 lineto
+ 332 664 lineto
+ 330 668 lineto
+ 328 670 lineto
+ 324 672 lineto
+ 322 672 lineto
+ 322 670 lineto
+ 274 670 lineto
+ 274 672 lineto
+ 272 670 lineto
+ 268 668 lineto
+closepath
+%end path
+fill
+%new path
+ 548 668 moveto
+ 546 664 lineto
+ 546 186 lineto
+ 548 184 lineto
+ 550 180 lineto
+ 608 180 lineto
+ 610 184 lineto
+ 612 186 lineto
+ 612 664 lineto
+ 610 668 lineto
+ 608 670 lineto
+ 604 672 lineto
+ 602 672 lineto
+ 602 670 lineto
+ 552 670 lineto
+ 554 672 lineto
+ 550 670 lineto
+ 548 668 lineto
+closepath
+%end path
+fill
+%new path
+ 300 424 moveto
+ 580 424 lineto
+ 580 446 lineto
+ 578 444 lineto
+ 298 444 lineto
+ 298 422 lineto
+closepath
+%end path
+fill
+%new path
+ 268 624 moveto
+ 300 624 lineto
+ 300 672 lineto
+ 298 670 lineto
+ 192 670 lineto
+ 192 648 lineto
+ 194 648 lineto
+ 214 648 244 648 256 644 curveto
+ 258 642 260 642 262 640 curveto
+ 266 636 268 628 268 622 curveto
+closepath
+%end path
+fill
+%new path
+ 332 624 moveto
+ 332 630 334 638 338 642 curveto
+ 340 644 342 644 344 646 curveto
+ 356 650 386 650 406 650 curveto
+ 406 672 lineto
+ 404 670 lineto
+ 298 670 lineto
+ 298 622 lineto
+ 300 624 lineto
+ 332 624 lineto
+closepath
+%end path
+fill
+%new path
+ 266 226 moveto
+ 266 220 264 212 260 208 curveto
+ 258 206 256 206 254 204 curveto
+ 242 200 212 200 192 200 curveto
+ 192 180 lineto
+ 300 180 lineto
+ 300 228 lineto
+ 298 226 lineto
+ 266 226 lineto
+closepath
+%end path
+fill
+%new path
+ 330 226 moveto
+ 298 226 lineto
+ 298 180 lineto
+ 406 180 lineto
+ 406 202 lineto
+ 404 202 lineto
+ 384 202 354 202 342 206 curveto
+ 340 208 338 208 336 210 curveto
+ 332 214 330 222 330 228 curveto
+closepath
+%end path
+fill
+%new path
+ 548 624 moveto
+ 580 624 lineto
+ 580 672 lineto
+ 578 670 lineto
+ 472 670 lineto
+ 472 648 lineto
+ 474 648 lineto
+ 494 648 524 648 536 644 curveto
+ 538 642 540 642 542 640 curveto
+ 546 636 548 628 548 622 curveto
+closepath
+%end path
+fill
+%new path
+ 612 624 moveto
+ 612 630 614 638 618 642 curveto
+ 620 644 622 644 624 646 curveto
+ 636 650 666 650 686 650 curveto
+ 686 672 lineto
+ 684 670 lineto
+ 578 670 lineto
+ 578 622 lineto
+ 580 624 lineto
+ 612 624 lineto
+closepath
+%end path
+fill
+%new path
+ 546 226 moveto
+ 546 220 544 212 540 208 curveto
+ 538 206 536 206 534 204 curveto
+ 522 200 492 200 472 200 curveto
+ 472 180 lineto
+ 580 180 lineto
+ 580 228 lineto
+ 578 226 lineto
+ 546 226 lineto
+closepath
+%end path
+fill
+%new path
+ 610 226 moveto
+ 578 226 lineto
+ 578 180 lineto
+ 686 180 lineto
+ 686 202 lineto
+ 684 202 lineto
+ 664 202 634 202 622 206 curveto
+ 620 208 618 208 616 210 curveto
+ 612 214 610 222 610 228 curveto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_I
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 190 670 0.5 add moveto
+ 226 668 0.5 add 264 668 0.5 add 300 668 0.5 add curveto
+ 300 670 0.5 add lineto
+ 336 670 0.5 add 374 670 0.5 add 410 672 0.5 add curveto
+ 408 670 0.5 add lineto
+ 188 670 0.5 add lineto
+closepath
+%end path
+%erase
+%new path
+ 190 180 0.5 sub moveto
+ 408 180 0.5 sub lineto
+ 372 182 0.5 sub 334 182 0.5 sub 298 182 0.5 sub curveto
+ 298 180 0.5 sub lineto
+ 188 180 0.5 sub lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 268 668 moveto
+ 268 664 lineto
+ 266 664 lineto
+ 266 188 lineto
+ 268 188 lineto
+ 268 184 lineto
+ 272 180 lineto
+ 328 180 lineto
+ 330 184 lineto
+ 332 186 lineto
+ 332 664 lineto
+ 330 668 lineto
+ 328 670 lineto
+ 324 672 lineto
+ 322 672 lineto
+ 322 670 lineto
+ 274 670 lineto
+ 274 672 lineto
+ 272 670 lineto
+ 268 668 lineto
+closepath
+%end path
+fill
+%new path
+ 268 624 moveto
+ 300 624 lineto
+ 300 672 lineto
+ 298 670 lineto
+ 188 670 lineto
+ 188 648 lineto
+ 190 648 lineto
+ 212 648 242 648 256 644 curveto
+ 258 642 260 642 262 640 curveto
+ 266 636 268 628 268 622 curveto
+closepath
+%end path
+fill
+%new path
+ 332 624 moveto
+ 332 630 334 638 338 642 curveto
+ 340 644 342 644 344 646 curveto
+ 358 650 388 650 410 650 curveto
+ 410 672 lineto
+ 408 670 lineto
+ 298 670 lineto
+ 298 622 lineto
+ 300 624 lineto
+ 332 624 lineto
+closepath
+%end path
+fill
+%new path
+ 266 226 moveto
+ 266 220 264 212 260 208 curveto
+ 258 206 256 206 254 204 curveto
+ 240 200 210 200 188 200 curveto
+ 188 180 lineto
+ 300 180 lineto
+ 300 228 lineto
+ 298 226 lineto
+ 266 226 lineto
+closepath
+%end path
+fill
+%new path
+ 330 226 moveto
+ 298 226 lineto
+ 298 180 lineto
+ 410 180 lineto
+ 410 202 lineto
+ 408 202 lineto
+ 386 202 356 202 342 206 curveto
+ 340 208 338 208 336 210 curveto
+ 332 214 330 222 330 228 curveto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_J
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 302 670 0.5 add moveto
+ 344 668 0.5 add 386 668 0.5 add 428 668 0.5 add curveto
+ 428 670 0.5 add lineto
+ 458 670 0.5 add 486 670 0.5 add 516 672 0.5 add curveto
+ 514 670 0.5 add lineto
+ 300 670 0.5 add lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 398 668 moveto
+ 396 664 lineto
+ 396 282 lineto
+ 396 266 394 250 388 236 curveto
+ 390 238 lineto
+ 390 240 lineto
+ 386 228 380 216 374 206 curveto
+ 370 202 368 198 364 196 curveto
+ 364 196 lineto
+ 372 200 lineto
+ 368 200 lineto
+ 366 198 lineto
+ 358 190 348 184 338 180 curveto
+ 338 182 lineto
+ 340 182 lineto
+ 334 180 328 180 322 180 curveto
+ 320 180 lineto
+ 316 176 lineto
+ 316 174 lineto
+ 314 172 lineto
+ 316 174 lineto
+ 316 168 lineto
+ 320 166 lineto
+ 322 164 lineto
+ 324 164 lineto
+ 326 166 lineto
+ 342 166 356 168 372 174 curveto
+ 370 172 lineto
+ 374 174 lineto
+ 390 180 406 186 418 198 curveto
+ 420 200 422 202 424 202 curveto
+ 426 204 lineto
+ 428 206 lineto
+ 440 218 448 232 454 248 curveto
+ 452 248 lineto
+ 454 250 lineto
+ 454 252 lineto
+ 458 262 460 272 460 282 curveto
+ 460 664 lineto
+ 458 668 lineto
+ 456 670 lineto
+ 452 672 lineto
+ 450 672 lineto
+ 450 670 lineto
+ 402 670 lineto
+ 404 672 lineto
+ 400 670 lineto
+ 398 668 lineto
+closepath
+%end path
+fill
+%new path
+ 398 624 moveto
+ 428 624 lineto
+ 428 672 lineto
+ 426 670 lineto
+ 300 670 lineto
+ 300 648 lineto
+ 302 648 lineto
+ 328 648 366 648 382 644 curveto
+ 386 642 388 640 392 638 curveto
+ 396 634 398 628 398 622 curveto
+closepath
+%end path
+fill
+%new path
+ 460 624 moveto
+ 460 632 462 638 466 644 curveto
+ 466 644 468 644 470 646 curveto
+ 478 650 500 650 516 650 curveto
+ 516 672 lineto
+ 514 670 lineto
+ 426 670 lineto
+ 426 622 lineto
+ 428 624 lineto
+ 460 624 lineto
+closepath
+%end path
+fill
+%new path
+ 330 176 moveto
+ 328 180 lineto
+ 324 180 lineto
+ 312 180 300 182 288 186 curveto
+ 290 184 lineto
+ 292 184 lineto
+ 276 190 262 198 252 210 curveto
+ 252 208 lineto
+ 250 210 lineto
+ 256 206 lineto
+ 256 206 lineto
+ 254 206 lineto
+ 244 216 238 228 234 240 curveto
+ 234 238 lineto
+ 236 236 lineto
+ 234 236 lineto
+ 232 246 230 254 230 264 curveto
+ 232 262 lineto
+ 230 266 lineto
+ 228 268 lineto
+ 224 270 lineto
+ 222 270 lineto
+ 222 268 lineto
+ 214 268 lineto
+ 216 270 lineto
+ 212 268 lineto
+ 210 266 lineto
+ 208 262 lineto
+ 208 260 lineto
+ 210 260 lineto
+ 210 250 212 242 214 234 curveto
+ 214 232 lineto
+ 216 230 lineto
+ 220 218 226 208 236 198 curveto
+ 234 200 lineto
+ 238 196 lineto
+ 250 184 264 176 282 172 curveto
+ 284 172 lineto
+ 284 170 lineto
+ 296 166 310 164 324 164 curveto
+ 324 164 lineto
+ 328 166 lineto
+ 330 168 lineto
+ 332 172 lineto
+ 332 174 lineto
+ 330 176 lineto
+closepath
+%end path
+fill
+%new path
+ 290 262 moveto
+ 288 264 lineto
+ 288 268 288 272 286 274 curveto
+ 288 274 lineto
+ 286 276 lineto
+ 286 278 lineto
+ 284 282 282 286 278 288 curveto
+ 280 288 lineto
+ 276 290 lineto
+ 276 292 lineto
+ 272 296 268 298 264 300 curveto
+ 264 298 lineto
+ 262 300 lineto
+ 260 300 lineto
+ 256 302 252 302 248 302 curveto
+ 248 302 lineto
+ 246 300 lineto
+ 244 300 240 300 236 298 curveto
+ 236 300 lineto
+ 234 298 lineto
+ 232 298 lineto
+ 228 296 224 294 220 290 curveto
+ 222 290 lineto
+ 218 288 lineto
+ 218 286 lineto
+ 214 284 212 280 210 276 curveto
+ 212 276 lineto
+ 210 274 lineto
+ 210 272 lineto
+ 208 270 208 266 208 262 curveto
+ 208 260 lineto
+ 210 258 lineto
+ 210 256 lineto
+ 214 248 218 240 220 232 curveto
+ 220 234 lineto
+ 222 230 lineto
+ 224 230 lineto
+ 226 226 230 224 234 222 curveto
+ 234 224 lineto
+ 236 222 lineto
+ 238 222 lineto
+ 242 220 246 220 248 220 curveto
+ 250 220 lineto
+ 250 222 lineto
+ 254 222 258 222 262 224 curveto
+ 262 222 lineto
+ 264 224 lineto
+ 266 224 lineto
+ 270 226 274 228 278 232 curveto
+ 276 232 lineto
+ 280 234 lineto
+ 280 236 lineto
+ 284 238 286 242 288 246 curveto
+ 286 246 lineto
+ 288 248 lineto
+ 288 250 lineto
+ 290 252 290 256 290 262 curveto
+ 290 262 lineto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_K
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 194 670 0.5 add moveto
+ 230 668 0.5 add 264 668 0.5 add 300 668 0.5 add curveto
+ 300 670 0.5 add lineto
+ 336 670 0.5 add 370 670 0.5 add 406 672 0.5 add curveto
+ 404 670 0.5 add lineto
+ 192 670 0.5 add lineto
+closepath
+%end path
+%erase
+%new path
+ 194 180 0.5 sub moveto
+ 404 180 0.5 sub lineto
+ 368 182 0.5 sub 334 182 0.5 sub 298 182 0.5 sub curveto
+ 298 180 0.5 sub lineto
+ 192 180 0.5 sub lineto
+closepath
+%end path
+%erase
+%new path
+ 538 670 0.5 add moveto
+ 572 668 0.5 add 604 668 0.5 add 636 668 0.5 add curveto
+ 636 670 0.5 add lineto
+ 654 670 0.5 add 672 670 0.5 add 690 672 0.5 add curveto
+ 688 670 0.5 add lineto
+ 536 670 0.5 add lineto
+closepath
+%end path
+%erase
+%new path
+ 516 180 0.5 sub moveto
+ 698 180 0.5 sub lineto
+ 672 182 0.5 sub 646 182 0.5 sub 620 182 0.5 sub curveto
+ 620 180 0.5 sub lineto
+ 514 180 0.5 sub lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 268 668 moveto
+ 268 664 lineto
+ 266 664 lineto
+ 266 188 lineto
+ 268 188 lineto
+ 268 184 lineto
+ 272 180 lineto
+ 328 180 lineto
+ 330 184 lineto
+ 332 186 lineto
+ 332 664 lineto
+ 330 668 lineto
+ 328 670 lineto
+ 324 672 lineto
+ 322 672 lineto
+ 322 670 lineto
+ 274 670 lineto
+ 274 672 lineto
+ 272 670 lineto
+ 268 668 lineto
+closepath
+%end path
+fill
+%new path
+ 300 332 moveto
+ 416 442 532 554 650 664 curveto
+ 650 668 lineto
+ 648 668 lineto
+ 648 670 lineto
+ 646 672 646 672 644 672 curveto
+ 644 670 lineto
+ 636 670 lineto
+ 632 670 628 668 626 666 curveto
+ 516 562 408 458 298 354 curveto
+ 298 330 lineto
+closepath
+%end path
+fill
+%new path
+ 410 448 moveto
+ 470 358 530 270 590 182 curveto
+ 590 182 590 182 592 180 curveto
+ 654 180 lineto
+ 654 180 656 180 658 182 curveto
+ 658 186 lineto
+ 656 186 lineto
+ 656 188 lineto
+ 588 288 520 390 452 490 curveto
+ 452 488 lineto
+ 438 474 422 460 408 448 curveto
+closepath
+%end path
+fill
+%new path
+ 268 624 moveto
+ 300 624 lineto
+ 300 672 lineto
+ 298 670 lineto
+ 192 670 lineto
+ 192 648 lineto
+ 194 648 lineto
+ 214 648 244 648 256 644 curveto
+ 258 642 260 642 262 640 curveto
+ 266 636 268 628 268 622 curveto
+closepath
+%end path
+fill
+%new path
+ 332 624 moveto
+ 332 630 334 638 338 642 curveto
+ 340 644 342 644 344 646 curveto
+ 356 650 386 650 406 650 curveto
+ 406 672 lineto
+ 404 670 lineto
+ 298 670 lineto
+ 298 622 lineto
+ 300 624 lineto
+ 332 624 lineto
+closepath
+%end path
+fill
+%new path
+ 266 226 moveto
+ 266 220 264 212 260 208 curveto
+ 258 206 256 206 254 204 curveto
+ 242 200 212 200 192 200 curveto
+ 192 180 lineto
+ 300 180 lineto
+ 300 228 lineto
+ 298 226 lineto
+ 266 226 lineto
+closepath
+%end path
+fill
+%new path
+ 330 226 moveto
+ 298 226 lineto
+ 298 180 lineto
+ 406 180 lineto
+ 406 202 lineto
+ 404 202 lineto
+ 384 202 354 202 342 206 curveto
+ 340 208 338 208 336 210 curveto
+ 332 214 330 222 330 228 curveto
+closepath
+%end path
+fill
+%new path
+ 560 604 moveto
+ 574 604 lineto
+ 594 626 616 650 636 672 curveto
+ 634 670 lineto
+ 536 670 lineto
+ 536 648 lineto
+ 538 648 lineto
+ 548 648 558 646 564 638 curveto
+ 566 638 568 636 570 632 curveto
+ 570 630 572 626 572 624 curveto
+ 570 624 lineto
+ 570 616 566 608 560 602 curveto
+ 558 602 lineto
+closepath
+%end path
+fill
+%new path
+ 690 650 moveto
+ 690 672 lineto
+ 688 670 lineto
+ 634 670 lineto
+ 614 648 592 624 572 602 curveto
+ 574 604 lineto
+ 586 604 lineto
+ 602 618 618 630 636 638 curveto
+ 654 646 672 650 690 650 curveto
+closepath
+%end path
+fill
+%new path
+ 546 246 moveto
+ 552 238 558 230 558 222 curveto
+ 556 222 lineto
+ 556 218 554 214 552 212 curveto
+ 552 210 552 210 550 208 curveto
+ 542 200 526 200 514 200 curveto
+ 514 180 lineto
+ 620 180 lineto
+ 608 202 594 226 580 248 curveto
+ 580 246 lineto
+ 544 246 lineto
+closepath
+%end path
+fill
+%new path
+ 616 246 moveto
+ 582 246 lineto
+ 596 224 610 200 622 180 curveto
+ 700 180 lineto
+ 700 202 lineto
+ 698 202 lineto
+ 682 202 664 202 650 210 curveto
+ 646 212 640 216 636 220 curveto
+ 628 228 622 238 616 248 curveto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_L
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 194 670 0.5 add moveto
+ 230 668 0.5 add 264 668 0.5 add 300 668 0.5 add curveto
+ 300 670 0.5 add lineto
+ 342 670 0.5 add 384 670 0.5 add 424 672 0.5 add curveto
+ 422 670 0.5 add lineto
+ 192 670 0.5 add lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 268 668 moveto
+ 268 664 lineto
+ 266 664 lineto
+ 266 188 lineto
+ 268 188 lineto
+ 268 184 lineto
+ 272 180 lineto
+ 328 180 lineto
+ 330 184 lineto
+ 332 186 lineto
+ 332 664 lineto
+ 330 668 lineto
+ 328 670 lineto
+ 324 672 lineto
+ 322 672 lineto
+ 322 670 lineto
+ 274 670 lineto
+ 274 672 lineto
+ 272 670 lineto
+ 268 668 lineto
+closepath
+%end path
+fill
+%new path
+ 570 364 moveto
+ 566 318 560 268 528 236 curveto
+ 502 208 462 200 426 200 curveto
+ 298 200 lineto
+ 298 180 lineto
+ 570 180 lineto
+ 576 242 584 304 590 366 curveto
+ 588 364 lineto
+ 570 364 lineto
+closepath
+%end path
+fill
+%new path
+ 268 624 moveto
+ 300 624 lineto
+ 300 672 lineto
+ 298 670 lineto
+ 192 670 lineto
+ 192 648 lineto
+ 194 648 lineto
+ 214 648 244 648 256 644 curveto
+ 258 642 260 642 262 640 curveto
+ 266 636 268 628 268 622 curveto
+closepath
+%end path
+fill
+%new path
+ 332 624 moveto
+ 332 630 334 636 338 640 curveto
+ 342 642 344 644 348 646 curveto
+ 362 650 398 650 424 650 curveto
+ 424 672 lineto
+ 422 670 lineto
+ 298 670 lineto
+ 298 622 lineto
+ 300 624 lineto
+ 332 624 lineto
+closepath
+%end path
+fill
+%new path
+ 266 226 moveto
+ 266 220 264 212 260 208 curveto
+ 258 206 256 206 254 204 curveto
+ 242 200 212 200 192 200 curveto
+ 192 180 lineto
+ 300 180 lineto
+ 300 228 lineto
+ 298 226 lineto
+ 266 226 lineto
+closepath
+%end path
+fill
+%new path
+ 330 226 moveto
+ 298 226 lineto
+ 298 180 lineto
+ 370 180 lineto
+ 370 202 lineto
+ 368 202 lineto
+ 356 202 342 202 336 206 curveto
+ 336 206 336 208 334 208 curveto
+ 330 212 330 220 330 228 curveto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_M
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 198 180 0.5 sub moveto
+ 364 180 0.5 sub lineto
+ 336 182 0.5 sub 308 182 0.5 sub 280 182 0.5 sub curveto
+ 280 180 0.5 sub lineto
+ 196 180 0.5 sub lineto
+closepath
+%end path
+%erase
+%new path
+ 596 180 0.5 sub moveto
+ 800 180 0.5 sub lineto
+ 766 182 0.5 sub 732 182 0.5 sub 696 182 0.5 sub curveto
+ 696 180 0.5 sub lineto
+ 594 180 0.5 sub lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 272 668 moveto
+ 272 664 lineto
+ 270 664 lineto
+ 270 188 lineto
+ 272 188 lineto
+ 272 184 lineto
+ 276 180 lineto
+ 288 180 lineto
+ 290 184 lineto
+ 292 186 lineto
+ 292 664 lineto
+ 290 668 lineto
+ 288 670 lineto
+ 284 672 lineto
+ 282 672 lineto
+ 282 670 lineto
+ 278 670 lineto
+ 278 672 lineto
+ 276 670 lineto
+ 272 668 lineto
+closepath
+%end path
+fill
+%new path
+ 670 668 moveto
+ 668 664 lineto
+ 668 186 lineto
+ 670 184 lineto
+ 672 180 lineto
+ 724 180 lineto
+ 726 184 lineto
+ 728 186 lineto
+ 728 664 lineto
+ 726 668 lineto
+ 724 670 lineto
+ 720 672 lineto
+ 718 672 lineto
+ 718 670 lineto
+ 674 670 lineto
+ 676 672 lineto
+ 672 670 lineto
+ 670 668 lineto
+closepath
+%end path
+fill
+%new path
+ 282 670 moveto
+ 344 508 406 348 468 186 curveto
+ 470 184 470 182 472 182 curveto
+ 474 180 478 180 480 180 curveto
+ 480 180 lineto
+ 482 180 486 182 488 184 curveto
+ 490 184 490 186 492 188 curveto
+ 554 350 616 510 678 672 curveto
+ 676 670 lineto
+ 668 670 lineto
+ 666 670 662 668 660 666 curveto
+ 658 666 658 664 656 662 curveto
+ 604 524 550 388 498 250 curveto
+ 498 252 lineto
+ 446 390 392 526 340 664 curveto
+ 338 666 338 668 336 668 curveto
+ 334 670 330 672 328 672 curveto
+ 328 670 lineto
+ 280 670 lineto
+closepath
+%end path
+fill
+%new path
+ 272 624 moveto
+ 282 624 lineto
+ 282 672 lineto
+ 280 670 lineto
+ 196 670 lineto
+ 196 648 lineto
+ 198 648 lineto
+ 218 648 248 648 260 644 curveto
+ 262 642 264 642 266 640 curveto
+ 270 636 272 628 272 622 curveto
+closepath
+%end path
+fill
+%new path
+ 270 246 moveto
+ 270 234 266 224 258 216 curveto
+ 256 214 254 214 252 212 curveto
+ 236 202 216 200 196 200 curveto
+ 196 180 lineto
+ 282 180 lineto
+ 282 248 lineto
+ 280 246 lineto
+ 270 246 lineto
+closepath
+%end path
+fill
+%new path
+ 290 246 moveto
+ 280 246 lineto
+ 280 180 lineto
+ 366 180 lineto
+ 366 202 lineto
+ 364 202 lineto
+ 344 202 324 204 308 214 curveto
+ 306 216 304 216 302 218 curveto
+ 294 226 290 236 290 248 curveto
+closepath
+%end path
+fill
+%new path
+ 728 624 moveto
+ 728 630 730 638 734 642 curveto
+ 736 644 738 644 740 646 curveto
+ 752 650 782 650 802 650 curveto
+ 802 672 lineto
+ 800 670 lineto
+ 696 670 lineto
+ 696 622 lineto
+ 698 624 lineto
+ 728 624 lineto
+closepath
+%end path
+fill
+%new path
+ 668 226 moveto
+ 668 220 666 212 662 208 curveto
+ 660 206 658 206 656 204 curveto
+ 644 200 614 200 594 200 curveto
+ 594 180 lineto
+ 698 180 lineto
+ 698 228 lineto
+ 696 226 lineto
+ 668 226 lineto
+closepath
+%end path
+fill
+%new path
+ 726 226 moveto
+ 696 226 lineto
+ 696 180 lineto
+ 802 180 lineto
+ 802 202 lineto
+ 800 202 lineto
+ 780 202 750 202 738 206 curveto
+ 736 208 734 208 732 210 curveto
+ 728 214 726 222 726 228 curveto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_N
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 194 180 0.5 sub moveto
+ 360 180 0.5 sub lineto
+ 332 182 0.5 sub 304 182 0.5 sub 276 182 0.5 sub curveto
+ 276 180 0.5 sub lineto
+ 192 180 0.5 sub lineto
+closepath
+%end path
+%erase
+%new path
+ 518 670 0.5 add moveto
+ 546 668 0.5 add 574 668 0.5 add 602 668 0.5 add curveto
+ 602 670 0.5 add lineto
+ 630 670 0.5 add 658 670 0.5 add 686 672 0.5 add curveto
+ 684 670 0.5 add lineto
+ 516 670 0.5 add lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 268 668 moveto
+ 268 664 lineto
+ 266 664 lineto
+ 266 188 lineto
+ 268 188 lineto
+ 268 184 lineto
+ 272 180 lineto
+ 284 180 lineto
+ 286 184 lineto
+ 288 186 lineto
+ 288 664 lineto
+ 286 668 lineto
+ 284 670 lineto
+ 280 672 lineto
+ 278 672 lineto
+ 278 670 lineto
+ 274 670 lineto
+ 274 672 lineto
+ 272 670 lineto
+ 268 668 lineto
+closepath
+%end path
+fill
+%new path
+ 592 668 moveto
+ 590 664 lineto
+ 590 186 lineto
+ 592 184 lineto
+ 594 180 lineto
+ 608 180 lineto
+ 610 184 lineto
+ 612 186 lineto
+ 612 664 lineto
+ 610 668 lineto
+ 608 670 lineto
+ 604 672 lineto
+ 602 672 lineto
+ 602 670 lineto
+ 596 670 lineto
+ 598 672 lineto
+ 594 670 lineto
+ 592 668 lineto
+closepath
+%end path
+fill
+%new path
+ 268 662 moveto
+ 268 660 lineto
+ 270 658 lineto
+ 376 500 484 340 592 182 curveto
+ 592 184 lineto
+ 594 180 lineto
+ 602 180 lineto
+ 606 184 lineto
+ 606 186 lineto
+ 608 188 lineto
+ 608 262 lineto
+ 606 260 lineto
+ 606 266 lineto
+ 604 266 lineto
+ 514 400 422 534 332 668 curveto
+ 330 670 lineto
+ 326 672 lineto
+ 324 672 lineto
+ 324 670 lineto
+ 274 670 lineto
+ 274 672 lineto
+ 272 670 lineto
+ 268 668 lineto
+ 268 662 lineto
+closepath
+%end path
+fill
+%new path
+ 294 624 moveto
+ 326 624 lineto
+ 318 640 308 656 300 672 curveto
+ 300 670 lineto
+ 192 670 lineto
+ 192 648 lineto
+ 194 648 lineto
+ 218 648 248 648 266 644 curveto
+ 274 642 280 638 286 632 curveto
+ 288 628 292 626 294 622 curveto
+closepath
+%end path
+fill
+%new path
+ 266 246 moveto
+ 266 234 262 224 254 216 curveto
+ 252 214 250 214 248 212 curveto
+ 232 202 212 200 192 200 curveto
+ 192 180 lineto
+ 278 180 lineto
+ 278 248 lineto
+ 276 246 lineto
+ 266 246 lineto
+closepath
+%end path
+fill
+%new path
+ 286 246 moveto
+ 276 246 lineto
+ 276 180 lineto
+ 362 180 lineto
+ 362 202 lineto
+ 360 202 lineto
+ 340 202 320 204 304 214 curveto
+ 302 216 300 216 298 218 curveto
+ 290 226 286 236 286 248 curveto
+closepath
+%end path
+fill
+%new path
+ 592 604 moveto
+ 602 604 lineto
+ 602 672 lineto
+ 600 670 lineto
+ 516 670 lineto
+ 516 648 lineto
+ 518 648 lineto
+ 538 648 558 646 574 636 curveto
+ 576 634 578 634 580 632 curveto
+ 588 624 592 614 592 602 curveto
+closepath
+%end path
+fill
+%new path
+ 612 604 moveto
+ 612 616 616 626 624 634 curveto
+ 626 636 628 636 630 638 curveto
+ 646 648 666 650 686 650 curveto
+ 686 672 lineto
+ 684 670 lineto
+ 600 670 lineto
+ 600 602 lineto
+ 602 604 lineto
+ 612 604 lineto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_O
+(
+newpath
+%new path
+ 458 668 moveto
+ 418 668 382 650 356 624 curveto
+ 348 616 342 608 336 600 curveto
+ 302 552 292 492 292 434 curveto
+ 294 434 lineto
+ 294 370 304 306 338 252 curveto
+ 346 242 354 232 362 224 curveto
+ 388 198 422 180 460 180 curveto
+ 460 182 lineto
+ 498 182 532 200 558 226 curveto
+ 566 234 574 244 582 254 curveto
+ 616 308 626 372 626 436 curveto
+ 624 436 lineto
+ 624 494 614 554 580 602 curveto
+ 574 610 568 618 560 626 curveto
+ 534 652 498 670 458 670 curveto
+closepath
+%end path
+%new path
+ 458 686 moveto
+ 398 686 340 660 296 618 curveto
+ 294 614 290 612 288 608 curveto
+ 242 558 218 490 218 422 curveto
+ 220 422 lineto
+ 220 354 244 288 290 238 curveto
+ 292 236 294 234 298 232 curveto
+ 340 188 398 164 460 164 curveto
+ 460 166 lineto
+ 522 166 580 190 622 234 curveto
+ 626 236 628 238 630 240 curveto
+ 676 290 700 356 700 424 curveto
+ 698 424 lineto
+ 698 492 674 560 628 610 curveto
+ 626 614 622 616 620 620 curveto
+ 576 662 518 688 458 688 curveto
+closepath
+%end path
+eofill
+) def
+
+/The_letter_P
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 196 180 0.5 sub moveto
+ 406 180 0.5 sub lineto
+ 370 182 0.5 sub 336 182 0.5 sub 300 182 0.5 sub curveto
+ 300 180 0.5 sub lineto
+ 194 180 0.5 sub lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 270 668 moveto
+ 270 664 lineto
+ 268 664 lineto
+ 268 188 lineto
+ 270 188 lineto
+ 270 184 lineto
+ 274 180 lineto
+ 330 180 lineto
+ 332 184 lineto
+ 334 186 lineto
+ 334 416 lineto
+ 332 420 lineto
+ 330 422 lineto
+ 326 424 lineto
+ 324 424 lineto
+ 324 422 lineto
+ 322 422 lineto
+ 322 424 lineto
+ 320 422 lineto
+ 316 420 lineto
+ 324 424 lineto
+ 330 420 lineto
+ 328 422 lineto
+ 324 424 lineto
+ 330 420 lineto
+ 332 416 lineto
+ 330 420 lineto
+ 332 416 lineto
+ 330 412 lineto
+ 332 414 lineto
+ 332 664 lineto
+ 330 668 lineto
+ 328 670 lineto
+ 324 672 lineto
+ 322 672 lineto
+ 322 670 lineto
+ 276 670 lineto
+ 276 672 lineto
+ 274 670 lineto
+ 270 668 lineto
+closepath
+%end path
+fill
+%new path
+ 302 650 moveto
+ 432 650 lineto
+ 432 648 lineto
+ 464 648 498 640 522 618 curveto
+ 544 596 546 566 546 536 curveto
+ 544 536 lineto
+ 544 506 542 476 520 456 curveto
+ 520 454 lineto
+ 496 432 462 424 430 424 curveto
+ 300 424 lineto
+ 300 406 lineto
+ 302 408 lineto
+ 450 408 lineto
+ 494 408 536 418 570 446 curveto
+ 576 450 580 454 584 458 curveto
+ 606 480 620 508 620 538 curveto
+ 618 538 lineto
+ 618 570 604 598 582 622 curveto
+ 578 626 572 630 568 632 curveto
+ 534 660 492 672 448 672 curveto
+ 448 670 lineto
+ 300 670 lineto
+ 300 648 lineto
+closepath
+%end path
+fill
+%new path
+ 270 624 moveto
+ 302 624 lineto
+ 302 672 lineto
+ 300 670 lineto
+ 194 670 lineto
+ 194 648 lineto
+ 196 648 lineto
+ 216 648 246 648 258 644 curveto
+ 260 642 262 642 264 640 curveto
+ 268 636 270 628 270 622 curveto
+closepath
+%end path
+fill
+%new path
+ 332 624 moveto
+ 332 632 332 640 336 644 curveto
+ 338 644 338 646 338 646 curveto
+ 344 650 358 650 370 650 curveto
+ 370 672 lineto
+ 368 670 lineto
+ 300 670 lineto
+ 300 622 lineto
+ 302 624 lineto
+ 332 624 lineto
+closepath
+%end path
+fill
+%new path
+ 268 226 moveto
+ 268 220 266 212 262 208 curveto
+ 260 206 258 206 256 204 curveto
+ 244 200 214 200 194 200 curveto
+ 194 180 lineto
+ 302 180 lineto
+ 302 228 lineto
+ 300 226 lineto
+ 268 226 lineto
+closepath
+%end path
+fill
+%new path
+ 332 226 moveto
+ 300 226 lineto
+ 300 180 lineto
+ 408 180 lineto
+ 408 202 lineto
+ 406 202 lineto
+ 386 202 356 202 344 206 curveto
+ 342 208 340 208 338 210 curveto
+ 334 214 332 222 332 228 curveto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_Q
+(
+newpath
+%new path
+ 458 668 moveto
+ 420 668 384 650 356 624 curveto
+ 348 616 342 606 334 598 curveto
+ 300 546 290 484 290 422 curveto
+ 292 422 lineto
+ 292 362 302 300 336 250 curveto
+ 344 240 350 232 358 226 curveto
+ 386 198 420 180 460 180 curveto
+ 460 182 lineto
+ 500 182 534 200 562 228 curveto
+ 570 234 576 242 584 252 curveto
+ 618 302 628 364 628 424 curveto
+ 626 424 lineto
+ 626 486 616 548 582 600 curveto
+ 574 608 568 618 560 626 curveto
+ 532 652 496 670 458 670 curveto
+closepath
+%end path
+%new path
+ 458 686 moveto
+ 398 686 340 660 296 618 curveto
+ 294 614 290 612 288 608 curveto
+ 242 558 218 490 218 422 curveto
+ 220 422 lineto
+ 220 354 244 288 290 238 curveto
+ 292 236 294 234 298 232 curveto
+ 340 188 398 164 460 164 curveto
+ 460 166 lineto
+ 522 166 580 190 622 234 curveto
+ 626 236 628 238 630 240 curveto
+ 676 290 700 356 700 424 curveto
+ 698 424 lineto
+ 698 492 674 560 628 610 curveto
+ 626 614 622 616 620 620 curveto
+ 576 662 518 688 458 688 curveto
+closepath
+%end path
+eofill
+%new path
+ 466 178 moveto
+ 464 180 lineto
+ 460 180 lineto
+ 454 180 448 182 444 184 curveto
+ 444 182 lineto
+ 446 182 lineto
+ 440 184 432 190 428 194 curveto
+ 426 194 lineto
+ 432 190 lineto
+ 432 190 lineto
+ 430 192 lineto
+ 424 198 420 204 418 212 curveto
+ 420 208 lineto
+ 418 210 lineto
+ 416 214 416 220 416 226 curveto
+ 418 226 lineto
+ 416 228 lineto
+ 418 226 lineto
+ 416 220 lineto
+ 418 224 lineto
+ 418 230 418 236 420 242 curveto
+ 420 240 lineto
+ 418 238 lineto
+ 420 238 lineto
+ 422 246 426 254 432 260 curveto
+ 432 258 lineto
+ 424 254 lineto
+ 426 254 lineto
+ 428 256 lineto
+ 430 256 lineto
+ 434 262 442 266 448 268 curveto
+ 444 266 lineto
+ 446 268 lineto
+ 450 270 456 270 462 270 curveto
+ 460 268 lineto
+ 464 270 lineto
+ 466 272 lineto
+ 458 268 lineto
+ 452 272 lineto
+ 456 270 lineto
+ 458 268 lineto
+ 460 268 lineto
+ 468 268 476 266 482 264 curveto
+ 480 266 lineto
+ 478 266 lineto
+ 488 262 494 258 500 252 curveto
+ 500 254 lineto
+ 502 252 lineto
+ 496 256 lineto
+ 496 256 lineto
+ 498 256 lineto
+ 506 246 514 232 518 218 curveto
+ 518 220 lineto
+ 516 222 lineto
+ 518 222 lineto
+ 530 184 532 138 544 100 curveto
+ 542 102 lineto
+ 544 98 lineto
+ 550 84 556 70 566 60 curveto
+ 564 62 lineto
+ 568 58 lineto
+ 574 52 582 48 590 44 curveto
+ 590 46 lineto
+ 592 44 lineto
+ 594 44 lineto
+ 600 42 608 40 616 40 curveto
+ 618 40 lineto
+ 618 42 lineto
+ 626 42 632 44 638 46 curveto
+ 638 44 lineto
+ 640 46 lineto
+ 642 46 lineto
+ 650 50 658 54 666 62 curveto
+ 664 60 lineto
+ 668 64 lineto
+ 678 74 686 90 692 106 curveto
+ 692 108 lineto
+ 694 110 lineto
+ 700 130 704 156 704 180 curveto
+ 702 184 lineto
+ 700 186 lineto
+ 696 188 lineto
+ 694 188 lineto
+ 694 186 lineto
+ 692 186 lineto
+ 694 188 lineto
+ 690 186 lineto
+ 688 184 lineto
+ 686 180 lineto
+ 686 172 684 164 682 158 curveto
+ 684 158 lineto
+ 684 160 lineto
+ 680 150 674 140 666 132 curveto
+ 666 132 lineto
+ 674 136 lineto
+ 670 136 lineto
+ 668 134 lineto
+ 660 126 650 120 640 116 curveto
+ 640 118 lineto
+ 642 118 lineto
+ 636 116 628 114 620 114 curveto
+ 618 114 lineto
+ 614 110 lineto
+ 622 114 lineto
+ 628 110 lineto
+ 626 114 lineto
+ 622 114 lineto
+ 622 116 lineto
+ 614 116 608 116 602 118 curveto
+ 606 116 lineto
+ 604 118 lineto
+ 594 122 588 126 580 132 curveto
+ 578 132 lineto
+ 584 128 lineto
+ 586 126 lineto
+ 584 128 lineto
+ 584 130 lineto
+ 550 164 542 230 510 264 curveto
+ 510 262 lineto
+ 508 266 lineto
+ 506 266 lineto
+ 500 274 492 278 482 282 curveto
+ 484 280 lineto
+ 480 282 lineto
+ 474 284 466 286 460 286 curveto
+ 458 286 lineto
+ 458 284 lineto
+ 452 284 446 284 442 282 curveto
+ 440 282 lineto
+ 438 280 lineto
+ 432 278 424 274 420 268 curveto
+ 420 270 lineto
+ 418 266 lineto
+ 416 266 lineto
+ 410 260 406 252 404 244 curveto
+ 404 242 lineto
+ 402 242 lineto
+ 400 236 400 230 400 224 curveto
+ 402 226 lineto
+ 402 222 lineto
+ 402 216 402 210 404 206 curveto
+ 404 204 lineto
+ 406 202 lineto
+ 408 194 412 188 418 182 curveto
+ 420 180 lineto
+ 422 180 lineto
+ 426 176 434 170 440 168 curveto
+ 440 170 lineto
+ 442 168 lineto
+ 444 168 lineto
+ 448 166 454 164 460 164 curveto
+ 458 166 lineto
+ 464 166 lineto
+ 466 170 lineto
+ 468 172 lineto
+ 468 174 lineto
+ 466 178 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_R
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 196 180 0.5 sub moveto
+ 404 180 0.5 sub lineto
+ 370 182 0.5 sub 334 182 0.5 sub 300 182 0.5 sub curveto
+ 300 180 0.5 sub lineto
+ 194 180 0.5 sub lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 270 668 moveto
+ 270 664 lineto
+ 268 664 lineto
+ 268 188 lineto
+ 270 188 lineto
+ 270 184 lineto
+ 274 180 lineto
+ 328 180 lineto
+ 330 184 lineto
+ 332 186 lineto
+ 332 664 lineto
+ 330 668 lineto
+ 328 670 lineto
+ 324 672 lineto
+ 322 672 lineto
+ 322 670 lineto
+ 276 670 lineto
+ 276 672 lineto
+ 274 670 lineto
+ 270 668 lineto
+closepath
+%end path
+fill
+%new path
+ 302 650 moveto
+ 410 650 lineto
+ 410 648 lineto
+ 446 648 482 642 508 618 curveto
+ 510 618 510 616 512 616 curveto
+ 532 596 536 568 536 540 curveto
+ 534 540 lineto
+ 534 512 530 484 510 466 curveto
+ 508 464 508 462 506 462 curveto
+ 480 438 444 432 408 432 curveto
+ 300 432 lineto
+ 300 416 lineto
+ 302 418 lineto
+ 420 418 lineto
+ 468 418 514 428 554 454 curveto
+ 564 460 572 466 578 474 curveto
+ 598 492 610 516 610 542 curveto
+ 608 542 lineto
+ 608 570 594 596 574 616 curveto
+ 568 622 560 628 552 634 curveto
+ 514 660 466 672 418 672 curveto
+ 418 670 lineto
+ 300 670 lineto
+ 300 648 lineto
+closepath
+%end path
+fill
+%new path
+ 412 430 moveto
+ 410 426 lineto
+ 410 424 lineto
+ 412 420 lineto
+ 414 418 lineto
+ 418 416 lineto
+ 430 416 440 414 450 410 curveto
+ 450 412 lineto
+ 448 412 lineto
+ 462 406 476 398 486 388 curveto
+ 486 390 lineto
+ 488 388 lineto
+ 482 392 lineto
+ 482 392 lineto
+ 484 392 lineto
+ 494 380 502 368 506 354 curveto
+ 506 356 lineto
+ 504 358 lineto
+ 506 358 lineto
+ 508 348 510 338 510 328 curveto
+ 510 330 lineto
+ 508 330 lineto
+ 508 266 lineto
+ 510 268 lineto
+ 510 264 lineto
+ 510 252 512 242 514 232 curveto
+ 514 230 lineto
+ 516 228 lineto
+ 520 216 526 206 536 196 curveto
+ 534 198 lineto
+ 538 194 lineto
+ 550 184 562 178 578 172 curveto
+ 576 174 lineto
+ 580 172 lineto
+ 596 166 614 164 632 164 curveto
+ 634 164 lineto
+ 634 166 lineto
+ 640 166 644 166 650 168 curveto
+ 652 168 lineto
+ 652 170 lineto
+ 660 172 666 176 672 180 curveto
+ 670 180 lineto
+ 674 182 lineto
+ 682 190 688 200 692 212 curveto
+ 690 210 lineto
+ 692 214 lineto
+ 696 224 698 236 698 246 curveto
+ 698 248 lineto
+ 696 250 lineto
+ 694 254 lineto
+ 682 254 lineto
+ 680 250 lineto
+ 678 248 lineto
+ 678 246 lineto
+ 678 236 676 224 672 214 curveto
+ 674 214 lineto
+ 674 216 lineto
+ 670 206 664 196 656 188 curveto
+ 658 188 lineto
+ 656 186 lineto
+ 656 184 lineto
+ 658 188 lineto
+ 666 192 lineto
+ 660 192 lineto
+ 660 190 lineto
+ 654 186 648 182 642 180 curveto
+ 646 182 lineto
+ 644 180 lineto
+ 628 180 lineto
+ 626 176 lineto
+ 634 180 lineto
+ 640 176 lineto
+ 636 180 lineto
+ 632 180 lineto
+ 626 180 622 180 618 182 curveto
+ 622 180 lineto
+ 620 182 lineto
+ 614 184 610 186 606 190 curveto
+ 604 190 lineto
+ 610 186 lineto
+ 610 186 lineto
+ 608 188 lineto
+ 602 194 596 204 592 216 curveto
+ 594 214 lineto
+ 594 212 lineto
+ 588 228 586 248 582 268 curveto
+ 582 268 572 332 572 332 curveto
+ 572 338 570 342 568 348 curveto
+ 570 346 lineto
+ 568 350 lineto
+ 562 364 554 378 544 388 curveto
+ 544 386 lineto
+ 542 390 lineto
+ 540 390 lineto
+ 526 406 508 416 486 422 curveto
+ 484 422 lineto
+ 484 424 lineto
+ 464 430 442 434 418 434 curveto
+ 418 434 lineto
+ 414 432 lineto
+ 412 430 lineto
+closepath
+%end path
+fill
+%new path
+ 270 624 moveto
+ 302 624 lineto
+ 302 672 lineto
+ 300 670 lineto
+ 194 670 lineto
+ 194 648 lineto
+ 196 648 lineto
+ 216 648 246 648 258 644 curveto
+ 260 642 262 642 264 640 curveto
+ 268 636 270 628 270 622 curveto
+closepath
+%end path
+fill
+%new path
+ 332 624 moveto
+ 332 632 332 640 336 644 curveto
+ 338 644 338 646 338 646 curveto
+ 344 650 358 650 370 650 curveto
+ 370 672 lineto
+ 368 670 lineto
+ 300 670 lineto
+ 300 622 lineto
+ 302 624 lineto
+ 332 624 lineto
+closepath
+%end path
+fill
+%new path
+ 268 226 moveto
+ 268 220 266 212 262 208 curveto
+ 260 206 258 206 256 204 curveto
+ 244 200 214 200 194 200 curveto
+ 194 180 lineto
+ 302 180 lineto
+ 302 228 lineto
+ 300 226 lineto
+ 268 226 lineto
+closepath
+%end path
+fill
+%new path
+ 330 226 moveto
+ 300 226 lineto
+ 300 180 lineto
+ 406 180 lineto
+ 406 202 lineto
+ 404 202 lineto
+ 384 202 354 202 342 206 curveto
+ 340 208 338 208 336 210 curveto
+ 332 214 330 222 330 228 curveto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_S
+(
+newpath
+%new path
+ 360 688 moveto
+ 358 688 lineto
+ 356 686 lineto
+ 342 686 328 684 314 680 curveto
+ 312 680 lineto
+ 312 678 lineto
+ 292 672 274 660 260 646 curveto
+ 260 646 lineto
+ 258 646 lineto
+ 252 638 248 632 242 624 curveto
+ 244 626 lineto
+ 242 622 lineto
+ 240 622 lineto
+ 226 600 218 574 218 548 curveto
+ 220 550 lineto
+ 220 544 lineto
+ 220 518 228 492 242 472 curveto
+ 244 470 lineto
+ 244 468 lineto
+ 250 460 254 454 260 448 curveto
+ 262 446 lineto
+ 276 432 294 422 314 414 curveto
+ 312 416 lineto
+ 316 414 lineto
+ 320 412 324 412 328 410 curveto
+ 328 410 422 388 422 388 curveto
+ 424 386 426 386 428 386 curveto
+ 424 388 lineto
+ 426 386 lineto
+ 440 382 454 374 464 362 curveto
+ 464 364 lineto
+ 466 362 lineto
+ 462 364 lineto
+ 460 368 lineto
+ 462 364 lineto
+ 464 364 lineto
+ 468 358 472 354 476 348 curveto
+ 474 352 lineto
+ 474 350 lineto
+ 488 332 494 308 494 286 curveto
+ 492 286 lineto
+ 494 284 lineto
+ 492 286 lineto
+ 494 294 lineto
+ 492 290 lineto
+ 492 266 486 244 472 224 curveto
+ 474 226 lineto
+ 476 228 lineto
+ 474 228 lineto
+ 472 222 468 218 464 214 curveto
+ 464 214 462 212 462 212 curveto
+ 460 210 lineto
+ 460 206 lineto
+ 462 212 lineto
+ 468 214 lineto
+ 464 214 lineto
+ 462 212 lineto
+ 452 200 438 192 424 188 curveto
+ 428 190 lineto
+ 426 188 lineto
+ 418 186 408 184 398 184 curveto
+ 398 186 lineto
+ 396 184 lineto
+ 394 184 lineto
+ 392 180 lineto
+ 392 170 lineto
+ 394 166 lineto
+ 396 166 lineto
+ 398 164 lineto
+ 400 164 lineto
+ 402 166 lineto
+ 414 166 428 168 440 172 curveto
+ 442 172 lineto
+ 444 174 lineto
+ 462 180 480 188 494 204 curveto
+ 494 204 lineto
+ 496 204 lineto
+ 496 206 498 206 500 208 curveto
+ 504 214 510 220 514 226 curveto
+ 512 224 lineto
+ 514 228 lineto
+ 516 228 lineto
+ 532 254 540 282 540 312 curveto
+ 540 314 lineto
+ 538 316 lineto
+ 538 346 530 374 514 398 curveto
+ 512 400 lineto
+ 512 402 lineto
+ 506 410 500 416 494 422 curveto
+ 492 424 lineto
+ 478 438 462 448 442 456 curveto
+ 442 454 lineto
+ 440 456 lineto
+ 438 456 lineto
+ 436 458 432 458 428 460 curveto
+ 428 460 334 482 334 482 curveto
+ 332 484 330 484 328 484 curveto
+ 332 482 lineto
+ 330 484 lineto
+ 314 488 302 498 290 508 curveto
+ 288 508 lineto
+ 292 506 lineto
+ 294 504 lineto
+ 292 506 lineto
+ 292 508 lineto
+ 286 512 282 518 280 522 curveto
+ 282 518 lineto
+ 282 520 lineto
+ 270 536 264 556 264 576 curveto
+ 266 574 lineto
+ 264 578 lineto
+ 266 574 lineto
+ 264 568 lineto
+ 266 570 lineto
+ 266 572 lineto
+ 266 592 272 612 284 628 curveto
+ 282 628 lineto
+ 280 624 lineto
+ 282 626 lineto
+ 284 630 288 636 294 640 curveto
+ 292 640 lineto
+ 294 642 lineto
+ 294 646 lineto
+ 292 640 lineto
+ 286 638 lineto
+ 292 638 lineto
+ 292 640 lineto
+ 304 650 318 658 332 664 curveto
+ 332 662 lineto
+ 330 662 lineto
+ 340 666 350 668 360 668 curveto
+ 362 668 lineto
+ 364 670 lineto
+ 366 672 lineto
+ 366 682 lineto
+ 364 686 lineto
+ 362 686 lineto
+ 360 688 lineto
+closepath
+%end path
+fill
+%new path
+ 520 518 moveto
+ 518 520 lineto
+ 514 560 504 594 486 622 curveto
+ 486 620 lineto
+ 484 624 lineto
+ 478 632 472 640 466 646 curveto
+ 464 648 lineto
+ 450 662 434 672 414 680 curveto
+ 414 678 lineto
+ 412 680 lineto
+ 410 680 lineto
+ 394 686 378 688 358 688 curveto
+ 358 688 lineto
+ 354 686 lineto
+ 352 682 lineto
+ 350 682 lineto
+ 350 676 lineto
+ 352 676 lineto
+ 352 672 lineto
+ 354 670 lineto
+ 354 668 lineto
+ 358 668 lineto
+ 358 666 lineto
+ 378 666 394 664 410 658 curveto
+ 408 660 lineto
+ 406 660 lineto
+ 426 652 442 642 456 628 curveto
+ 456 630 lineto
+ 458 628 lineto
+ 454 630 lineto
+ 452 634 lineto
+ 454 630 lineto
+ 456 630 lineto
+ 462 624 468 616 472 608 curveto
+ 472 610 lineto
+ 470 612 lineto
+ 488 586 498 552 502 514 curveto
+ 500 514 lineto
+ 502 512 lineto
+ 504 510 lineto
+ 516 510 lineto
+ 518 512 lineto
+ 520 514 lineto
+ 520 518 lineto
+closepath
+%end path
+fill
+%new path
+ 404 184 moveto
+ 400 186 lineto
+ 374 186 350 190 330 196 curveto
+ 332 196 lineto
+ 334 194 lineto
+ 334 196 lineto
+ 310 204 290 216 274 230 curveto
+ 272 230 lineto
+ 276 228 lineto
+ 278 226 lineto
+ 276 228 lineto
+ 276 230 lineto
+ 270 236 264 242 258 250 curveto
+ 260 250 lineto
+ 262 246 lineto
+ 260 248 lineto
+ 244 272 236 302 236 338 curveto
+ 238 336 lineto
+ 236 340 lineto
+ 234 340 lineto
+ 232 342 lineto
+ 230 342 lineto
+ 228 340 lineto
+ 224 340 lineto
+ 226 342 lineto
+ 222 340 lineto
+ 220 336 lineto
+ 220 332 lineto
+ 220 294 230 260 246 236 curveto
+ 248 234 lineto
+ 248 232 lineto
+ 254 224 260 218 266 210 curveto
+ 264 212 lineto
+ 266 210 lineto
+ 284 194 304 182 328 176 curveto
+ 330 176 lineto
+ 330 174 lineto
+ 350 168 374 164 400 164 curveto
+ 400 164 lineto
+ 404 166 lineto
+ 406 170 lineto
+ 408 170 lineto
+ 408 178 lineto
+ 406 178 lineto
+ 406 180 lineto
+ 404 184 lineto
+closepath
+%end path
+fill
+%new path
+ 518 512 moveto
+ 520 514 lineto
+ 520 682 lineto
+ 518 686 lineto
+ 516 686 lineto
+ 514 688 lineto
+ 512 688 lineto
+ 510 686 lineto
+ 508 686 lineto
+ 508 688 lineto
+ 506 686 lineto
+ 504 686 lineto
+ 502 682 lineto
+ 490 662 478 642 466 624 curveto
+ 466 620 lineto
+ 468 618 lineto
+ 470 616 lineto
+ 472 614 472 612 474 610 curveto
+ 472 612 lineto
+ 470 614 lineto
+ 472 614 lineto
+ 490 586 500 552 504 514 curveto
+ 502 514 lineto
+ 504 512 lineto
+ 506 510 lineto
+ 516 510 lineto
+ 518 512 lineto
+closepath
+%end path
+fill
+%new path
+ 222 340 moveto
+ 220 336 lineto
+ 218 336 lineto
+ 218 172 lineto
+ 220 174 lineto
+ 220 170 lineto
+ 222 166 lineto
+ 226 164 lineto
+ 228 164 lineto
+ 228 166 lineto
+ 230 166 lineto
+ 230 164 lineto
+ 232 166 lineto
+ 234 166 lineto
+ 236 170 lineto
+ 248 188 260 208 272 226 curveto
+ 272 230 lineto
+ 270 232 lineto
+ 268 234 lineto
+ 264 238 260 242 258 248 curveto
+ 258 246 lineto
+ 260 244 lineto
+ 244 270 234 300 234 338 curveto
+ 236 336 lineto
+ 234 340 lineto
+ 232 340 lineto
+ 230 342 lineto
+ 228 342 lineto
+ 226 340 lineto
+ 224 340 lineto
+ 226 342 lineto
+ 222 340 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_T
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 304 180 0.5 sub moveto
+ 574 180 0.5 sub lineto
+ 530 182 0.5 sub 484 182 0.5 sub 438 182 0.5 sub curveto
+ 438 180 0.5 sub lineto
+ 302 180 0.5 sub lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 408 664 moveto
+ 408 660 lineto
+ 406 660 lineto
+ 406 188 lineto
+ 408 188 lineto
+ 408 184 lineto
+ 412 180 lineto
+ 468 180 lineto
+ 470 184 lineto
+ 472 186 lineto
+ 472 660 lineto
+ 470 664 lineto
+ 468 666 lineto
+ 464 668 lineto
+ 462 668 lineto
+ 462 666 lineto
+ 414 666 lineto
+ 414 668 lineto
+ 412 666 lineto
+ 408 664 lineto
+closepath
+%end path
+fill
+%new path
+ 656 506 moveto
+ 672 506 lineto
+ 668 560 662 614 658 668 curveto
+ 658 666 lineto
+ 438 666 lineto
+ 438 644 lineto
+ 440 646 lineto
+ 542 646 lineto
+ 542 644 lineto
+ 572 644 606 640 628 618 curveto
+ 648 598 652 544 656 504 curveto
+closepath
+%end path
+fill
+%new path
+ 224 506 moveto
+ 228 546 232 600 252 620 curveto
+ 274 642 308 646 338 646 curveto
+ 440 646 lineto
+ 440 668 lineto
+ 438 666 lineto
+ 218 666 lineto
+ 214 612 208 558 204 504 curveto
+ 206 506 lineto
+ 224 506 lineto
+closepath
+%end path
+fill
+%new path
+ 406 226 moveto
+ 406 220 404 214 400 210 curveto
+ 396 208 392 206 388 204 curveto
+ 372 200 330 200 302 200 curveto
+ 302 180 lineto
+ 440 180 lineto
+ 440 228 lineto
+ 438 226 lineto
+ 406 226 lineto
+closepath
+%end path
+fill
+%new path
+ 470 226 moveto
+ 438 226 lineto
+ 438 180 lineto
+ 576 180 lineto
+ 576 202 lineto
+ 574 202 lineto
+ 546 202 504 202 488 206 curveto
+ 484 208 480 210 476 212 curveto
+ 472 216 470 222 470 228 curveto
+closepath
+%end path
+fill
+%new path
+ 408 620 moveto
+ 440 620 lineto
+ 440 668 lineto
+ 438 666 lineto
+ 370 666 lineto
+ 370 644 lineto
+ 372 644 lineto
+ 382 644 396 644 402 640 curveto
+ 402 640 402 638 404 638 curveto
+ 408 634 408 626 408 618 curveto
+closepath
+%end path
+fill
+%new path
+ 472 620 moveto
+ 472 628 472 636 476 640 curveto
+ 478 640 478 642 478 642 curveto
+ 484 646 498 646 510 646 curveto
+ 510 668 lineto
+ 508 666 lineto
+ 438 666 lineto
+ 438 618 lineto
+ 440 620 lineto
+ 472 620 lineto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_U
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 194 670 0.5 add moveto
+ 230 668 0.5 add 264 668 0.5 add 300 668 0.5 add curveto
+ 300 670 0.5 add lineto
+ 336 670 0.5 add 370 670 0.5 add 406 672 0.5 add curveto
+ 404 670 0.5 add lineto
+ 192 670 0.5 add lineto
+closepath
+%end path
+%erase
+%new path
+ 516 670 0.5 add moveto
+ 544 668 0.5 add 572 668 0.5 add 600 668 0.5 add curveto
+ 600 670 0.5 add lineto
+ 630 670 0.5 add 658 670 0.5 add 686 672 0.5 add curveto
+ 684 670 0.5 add lineto
+ 514 670 0.5 add lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 268 668 moveto
+ 268 664 lineto
+ 266 664 lineto
+ 266 344 lineto
+ 268 344 lineto
+ 268 340 lineto
+ 272 336 lineto
+ 328 336 lineto
+ 330 340 lineto
+ 332 342 lineto
+ 332 664 lineto
+ 330 668 lineto
+ 328 670 lineto
+ 324 672 lineto
+ 322 672 lineto
+ 322 670 lineto
+ 274 670 lineto
+ 274 672 lineto
+ 272 670 lineto
+ 268 668 lineto
+closepath
+%end path
+fill
+%new path
+ 324 352 moveto
+ 322 352 lineto
+ 322 350 lineto
+ 274 350 lineto
+ 274 352 lineto
+ 272 350 lineto
+ 268 348 lineto
+ 268 342 lineto
+ 268 322 272 304 276 288 curveto
+ 276 286 lineto
+ 278 284 lineto
+ 286 260 300 236 320 218 curveto
+ 318 218 lineto
+ 322 216 lineto
+ 322 214 lineto
+ 324 214 lineto
+ 342 194 366 180 390 174 curveto
+ 390 176 lineto
+ 392 174 lineto
+ 394 174 lineto
+ 412 168 430 164 450 164 curveto
+ 450 164 lineto
+ 452 166 lineto
+ 466 166 482 168 496 174 curveto
+ 494 172 lineto
+ 498 174 lineto
+ 520 180 540 192 556 208 curveto
+ 558 210 lineto
+ 560 212 lineto
+ 562 214 564 216 566 218 curveto
+ 582 236 594 258 602 280 curveto
+ 600 278 lineto
+ 602 282 lineto
+ 608 302 612 322 612 344 curveto
+ 612 664 lineto
+ 610 668 lineto
+ 608 670 lineto
+ 604 672 lineto
+ 602 672 lineto
+ 602 670 lineto
+ 594 670 lineto
+ 596 672 lineto
+ 592 670 lineto
+ 590 668 lineto
+ 588 664 lineto
+ 588 344 lineto
+ 588 322 584 302 578 282 curveto
+ 580 284 lineto
+ 580 286 lineto
+ 572 264 562 244 546 228 curveto
+ 544 226 542 224 540 222 curveto
+ 542 222 lineto
+ 540 220 lineto
+ 540 218 lineto
+ 542 222 lineto
+ 550 226 lineto
+ 544 226 lineto
+ 544 224 lineto
+ 528 208 508 198 488 190 curveto
+ 488 192 lineto
+ 490 192 lineto
+ 478 186 462 184 448 184 curveto
+ 448 186 lineto
+ 446 184 lineto
+ 442 182 lineto
+ 450 186 lineto
+ 456 182 lineto
+ 454 184 lineto
+ 450 186 lineto
+ 436 186 424 188 412 192 curveto
+ 414 190 lineto
+ 416 190 lineto
+ 398 196 382 206 368 220 curveto
+ 366 220 lineto
+ 372 216 lineto
+ 374 214 lineto
+ 372 216 lineto
+ 372 218 lineto
+ 368 222 364 226 360 230 curveto
+ 352 242 344 256 340 270 curveto
+ 340 268 lineto
+ 342 266 lineto
+ 340 266 lineto
+ 332 292 330 318 330 346 curveto
+ 332 344 lineto
+ 330 348 lineto
+ 328 350 lineto
+ 324 352 lineto
+closepath
+%end path
+fill
+%new path
+ 268 624 moveto
+ 300 624 lineto
+ 300 672 lineto
+ 298 670 lineto
+ 192 670 lineto
+ 192 648 lineto
+ 194 648 lineto
+ 214 648 244 648 256 644 curveto
+ 258 642 260 642 262 640 curveto
+ 266 636 268 628 268 622 curveto
+closepath
+%end path
+fill
+%new path
+ 332 624 moveto
+ 332 630 334 638 338 642 curveto
+ 340 644 342 644 344 646 curveto
+ 356 650 386 650 406 650 curveto
+ 406 672 lineto
+ 404 670 lineto
+ 298 670 lineto
+ 298 622 lineto
+ 300 624 lineto
+ 332 624 lineto
+closepath
+%end path
+fill
+%new path
+ 590 604 moveto
+ 600 604 lineto
+ 600 672 lineto
+ 598 670 lineto
+ 514 670 lineto
+ 514 648 lineto
+ 516 648 lineto
+ 536 648 556 646 572 636 curveto
+ 574 634 576 634 578 632 curveto
+ 586 624 590 614 590 602 curveto
+closepath
+%end path
+fill
+%new path
+ 612 604 moveto
+ 612 616 616 626 624 634 curveto
+ 626 636 628 636 630 638 curveto
+ 646 648 666 650 686 650 curveto
+ 686 672 lineto
+ 684 670 lineto
+ 598 670 lineto
+ 598 602 lineto
+ 600 604 lineto
+ 612 604 lineto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_V
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 184 670 0.5 add moveto
+ 212 668 0.5 add 242 668 0.5 add 272 668 0.5 add curveto
+ 272 670 0.5 add lineto
+ 308 670 0.5 add 342 670 0.5 add 378 672 0.5 add curveto
+ 376 670 0.5 add lineto
+ 182 670 0.5 add lineto
+closepath
+%end path
+%erase
+%new path
+ 544 670 0.5 add moveto
+ 572 668 0.5 add 602 668 0.5 add 630 668 0.5 add curveto
+ 630 670 0.5 add lineto
+ 652 670 0.5 add 674 670 0.5 add 696 672 0.5 add curveto
+ 694 670 0.5 add lineto
+ 542 670 0.5 add lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 462 252 moveto
+ 514 388 566 526 618 664 curveto
+ 618 666 620 668 620 668 curveto
+ 624 670 626 672 630 672 curveto
+ 636 672 lineto
+ 636 670 lineto
+ 638 670 640 670 640 668 curveto
+ 642 668 642 666 642 664 curveto
+ 640 664 lineto
+ 640 662 lineto
+ 578 498 516 334 452 172 curveto
+ 452 170 452 168 450 168 curveto
+ 448 166 444 164 442 164 curveto
+ 434 164 lineto
+ 434 166 lineto
+ 432 166 428 168 426 170 curveto
+ 424 170 424 172 424 174 curveto
+ 360 336 298 500 236 664 curveto
+ 236 666 lineto
+ 238 666 lineto
+ 238 668 238 670 240 670 curveto
+ 240 672 242 672 244 672 curveto
+ 294 672 lineto
+ 294 670 lineto
+ 296 670 300 668 302 666 curveto
+ 304 666 304 664 304 662 curveto
+ 358 524 410 386 462 250 curveto
+closepath
+%end path
+fill
+%new path
+ 254 624 moveto
+ 284 624 lineto
+ 280 640 274 656 270 672 curveto
+ 270 670 lineto
+ 182 670 lineto
+ 182 648 lineto
+ 184 648 lineto
+ 202 648 224 648 236 644 curveto
+ 238 642 242 640 244 638 curveto
+ 248 634 252 628 254 622 curveto
+closepath
+%end path
+fill
+%new path
+ 318 624 moveto
+ 318 628 lineto
+ 320 628 lineto
+ 320 632 320 636 324 640 curveto
+ 326 642 328 642 330 644 curveto
+ 344 650 362 650 378 650 curveto
+ 378 672 lineto
+ 376 670 lineto
+ 272 670 lineto
+ 276 654 282 638 286 622 curveto
+ 286 624 lineto
+ 320 624 lineto
+closepath
+%end path
+fill
+%new path
+ 596 604 moveto
+ 606 604 lineto
+ 614 626 622 650 630 672 curveto
+ 628 670 lineto
+ 542 670 lineto
+ 542 648 lineto
+ 544 648 lineto
+ 560 648 576 644 586 634 curveto
+ 588 634 lineto
+ 594 628 598 620 598 612 curveto
+ 596 612 lineto
+ 596 608 594 606 594 602 curveto
+closepath
+%end path
+fill
+%new path
+ 618 604 moveto
+ 622 614 628 622 634 628 curveto
+ 638 632 642 636 646 638 curveto
+ 662 648 680 650 696 650 curveto
+ 696 672 lineto
+ 694 670 lineto
+ 628 670 lineto
+ 620 648 612 624 604 602 curveto
+ 606 604 lineto
+ 618 604 lineto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_W
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 450 670 0.5 add moveto
+ 478 668 0.5 add 506 668 0.5 add 534 668 0.5 add curveto
+ 534 670 0.5 add lineto
+ 570 670 0.5 add 606 670 0.5 add 640 672 0.5 add curveto
+ 638 670 0.5 add lineto
+ 448 670 0.5 add lineto
+closepath
+%end path
+%erase
+%new path
+ 184 670 0.5 add moveto
+ 210 668 0.5 add 238 668 0.5 add 268 668 0.5 add curveto
+ 268 670 0.5 add lineto
+ 302 670 0.5 add 338 670 0.5 add 374 672 0.5 add curveto
+ 372 670 0.5 add lineto
+ 182 670 0.5 add lineto
+closepath
+%end path
+%erase
+%new path
+ 746 670 0.5 add moveto
+ 776 668 0.5 add 806 668 0.5 add 836 668 0.5 add curveto
+ 836 670 0.5 add lineto
+ 856 670 0.5 add 876 670 0.5 add 896 672 0.5 add curveto
+ 894 670 0.5 add lineto
+ 744 670 0.5 add lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 398 168 moveto
+ 400 166 402 164 406 164 curveto
+ 406 166 lineto
+ 408 166 lineto
+ 410 166 414 168 416 170 curveto
+ 416 170 418 172 418 174 curveto
+ 458 296 500 422 540 546 curveto
+ 540 544 lineto
+ 580 420 622 294 662 172 curveto
+ 662 170 664 168 664 168 curveto
+ 666 166 670 164 672 164 curveto
+ 672 166 lineto
+ 674 166 lineto
+ 678 166 680 168 682 170 curveto
+ 684 170 686 172 686 174 curveto
+ 740 336 792 500 846 664 curveto
+ 846 666 lineto
+ 844 666 lineto
+ 844 668 844 670 842 670 curveto
+ 842 672 840 672 838 672 curveto
+ 838 670 lineto
+ 836 670 lineto
+ 832 670 830 668 828 666 curveto
+ 826 666 826 664 824 662 curveto
+ 782 528 738 396 694 262 curveto
+ 694 264 lineto
+ 652 398 608 530 566 664 curveto
+ 564 666 564 668 562 668 curveto
+ 560 670 558 672 554 672 curveto
+ 554 670 lineto
+ 506 670 lineto
+ 504 670 502 670 502 668 curveto
+ 500 668 500 666 500 664 curveto
+ 502 664 lineto
+ 502 662 lineto
+ 512 632 520 604 530 574 curveto
+ 528 574 lineto
+ 494 470 462 366 428 262 curveto
+ 428 264 lineto
+ 384 398 340 530 298 664 curveto
+ 298 666 296 668 294 668 curveto
+ 292 670 290 672 286 672 curveto
+ 286 670 lineto
+ 238 670 lineto
+ 236 670 234 670 234 668 curveto
+ 232 668 232 666 232 664 curveto
+ 234 664 lineto
+ 234 662 lineto
+ 288 498 340 334 394 172 curveto
+ 394 170 396 168 398 168 curveto
+closepath
+%end path
+fill
+%new path
+ 562 668 moveto
+ 560 670 558 672 554 672 curveto
+ 554 670 lineto
+ 506 670 lineto
+ 504 670 502 670 502 668 curveto
+ 500 668 500 666 500 664 curveto
+ 502 664 lineto
+ 502 662 lineto
+ 528 580 556 498 582 416 curveto
+ 582 418 lineto
+ 644 418 lineto
+ 618 500 592 582 566 664 curveto
+ 564 666 564 668 562 668 curveto
+closepath
+%end path
+fill
+%new path
+ 514 624 moveto
+ 546 624 lineto
+ 542 640 536 656 532 672 curveto
+ 532 670 lineto
+ 448 670 lineto
+ 448 648 lineto
+ 450 648 lineto
+ 466 648 488 648 498 644 curveto
+ 502 642 504 640 506 638 curveto
+ 510 634 512 628 514 622 curveto
+closepath
+%end path
+fill
+%new path
+ 578 624 moveto
+ 578 628 lineto
+ 580 628 lineto
+ 580 632 582 636 584 640 curveto
+ 586 640 588 642 590 644 curveto
+ 606 650 624 650 640 650 curveto
+ 640 672 lineto
+ 638 670 lineto
+ 534 670 lineto
+ 538 654 544 638 548 622 curveto
+ 548 624 lineto
+ 580 624 lineto
+closepath
+%end path
+fill
+%new path
+ 248 624 moveto
+ 278 624 lineto
+ 274 640 270 656 266 672 curveto
+ 266 670 lineto
+ 182 670 lineto
+ 182 648 lineto
+ 184 648 lineto
+ 200 648 220 648 232 644 curveto
+ 234 642 236 640 238 638 curveto
+ 242 634 246 628 248 622 curveto
+closepath
+%end path
+fill
+%new path
+ 310 624 moveto
+ 310 628 lineto
+ 312 628 lineto
+ 312 632 314 636 316 640 curveto
+ 318 640 320 642 324 644 curveto
+ 338 650 356 650 374 650 curveto
+ 374 672 lineto
+ 372 670 lineto
+ 268 670 lineto
+ 272 654 276 638 280 622 curveto
+ 280 624 lineto
+ 312 624 lineto
+closepath
+%end path
+fill
+%new path
+ 808 604 moveto
+ 816 604 lineto
+ 824 626 830 650 836 672 curveto
+ 834 670 lineto
+ 744 670 lineto
+ 744 648 lineto
+ 746 648 lineto
+ 764 648 780 644 794 634 curveto
+ 796 634 798 632 798 630 curveto
+ 804 624 808 618 808 610 curveto
+ 806 610 lineto
+ 806 602 lineto
+closepath
+%end path
+fill
+%new path
+ 826 604 moveto
+ 830 614 834 624 842 632 curveto
+ 844 634 848 636 852 638 curveto
+ 864 648 880 650 896 650 curveto
+ 896 672 lineto
+ 894 670 lineto
+ 834 670 lineto
+ 828 648 822 624 814 602 curveto
+ 816 604 lineto
+ 826 604 lineto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_X
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 196 670 0.5 add moveto
+ 226 668 0.5 add 256 668 0.5 add 286 668 0.5 add curveto
+ 286 670 0.5 add lineto
+ 322 670 0.5 add 360 670 0.5 add 396 672 0.5 add curveto
+ 394 670 0.5 add lineto
+ 194 670 0.5 add lineto
+closepath
+%end path
+%erase
+%new path
+ 494 180 0.5 sub moveto
+ 692 180 0.5 sub lineto
+ 662 182 0.5 sub 632 182 0.5 sub 602 182 0.5 sub curveto
+ 602 180 0.5 sub lineto
+ 492 180 0.5 sub lineto
+closepath
+%end path
+%erase
+%new path
+ 492 670 0.5 add moveto
+ 522 668 0.5 add 554 668 0.5 add 586 668 0.5 add curveto
+ 586 670 0.5 add lineto
+ 612 670 0.5 add 638 670 0.5 add 662 672 0.5 add curveto
+ 660 670 0.5 add lineto
+ 490 670 0.5 add lineto
+closepath
+%end path
+%erase
+%new path
+ 188 180 0.5 sub moveto
+ 356 180 0.5 sub lineto
+ 326 182 0.5 sub 294 182 0.5 sub 262 182 0.5 sub curveto
+ 262 180 0.5 sub lineto
+ 186 180 0.5 sub lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 318 670 moveto
+ 316 672 314 672 310 672 curveto
+ 310 670 lineto
+ 254 670 lineto
+ 252 670 250 670 250 668 curveto
+ 248 668 248 666 248 664 curveto
+ 250 664 lineto
+ 250 662 lineto
+ 358 502 464 342 570 182 curveto
+ 570 180 lineto
+ 634 180 lineto
+ 636 180 638 180 638 182 curveto
+ 640 182 640 184 640 186 curveto
+ 638 186 lineto
+ 638 188 lineto
+ 530 348 424 508 318 668 curveto
+ 318 670 lineto
+closepath
+%end path
+fill
+%new path
+ 248 180 moveto
+ 262 180 lineto
+ 266 180 272 182 274 186 curveto
+ 276 186 276 188 276 188 curveto
+ 386 348 494 508 602 668 curveto
+ 602 670 lineto
+ 600 670 lineto
+ 600 672 lineto
+ 598 672 lineto
+ 598 670 lineto
+ 586 670 lineto
+ 582 670 576 668 574 664 curveto
+ 572 664 572 662 572 662 curveto
+ 462 502 354 342 246 182 curveto
+ 246 180 lineto
+closepath
+%end path
+fill
+%new path
+ 278 624 moveto
+ 312 624 lineto
+ 302 640 294 656 284 672 curveto
+ 284 670 lineto
+ 194 670 lineto
+ 194 648 lineto
+ 196 648 lineto
+ 216 648 240 648 252 644 curveto
+ 258 642 264 638 268 634 curveto
+ 272 630 274 626 278 622 curveto
+closepath
+%end path
+fill
+%new path
+ 348 624 moveto
+ 346 626 346 626 346 628 curveto
+ 348 628 lineto
+ 348 630 350 634 352 636 curveto
+ 354 638 356 640 358 642 curveto
+ 370 648 382 650 396 650 curveto
+ 396 672 lineto
+ 394 670 lineto
+ 286 670 lineto
+ 296 654 304 638 314 622 curveto
+ 314 624 lineto
+ 350 624 lineto
+closepath
+%end path
+fill
+%new path
+ 540 226 moveto
+ 542 224 542 224 542 222 curveto
+ 540 222 lineto
+ 540 220 538 216 536 214 curveto
+ 534 212 532 210 530 208 curveto
+ 518 202 506 200 492 200 curveto
+ 492 180 lineto
+ 602 180 lineto
+ 592 196 584 212 574 228 curveto
+ 574 226 lineto
+ 538 226 lineto
+closepath
+%end path
+fill
+%new path
+ 610 226 moveto
+ 576 226 lineto
+ 586 210 594 194 604 180 curveto
+ 694 180 lineto
+ 694 202 lineto
+ 692 202 lineto
+ 672 202 648 202 636 206 curveto
+ 630 208 624 212 620 216 curveto
+ 616 220 614 224 610 228 curveto
+closepath
+%end path
+fill
+%new path
+ 532 604 moveto
+ 546 604 lineto
+ 560 626 572 650 586 672 curveto
+ 584 670 lineto
+ 490 670 lineto
+ 490 648 lineto
+ 492 648 lineto
+ 504 648 518 644 528 634 curveto
+ 528 632 lineto
+ 534 628 536 622 536 614 curveto
+ 534 614 lineto
+ 534 610 532 606 530 602 curveto
+closepath
+%end path
+fill
+%new path
+ 558 604 moveto
+ 562 610 566 614 570 618 curveto
+ 580 626 590 634 600 638 curveto
+ 620 648 642 650 662 650 curveto
+ 662 672 lineto
+ 660 670 lineto
+ 584 670 lineto
+ 570 648 558 624 544 602 curveto
+ 546 604 lineto
+ 558 604 lineto
+closepath
+%end path
+fill
+%new path
+ 290 246 moveto
+ 286 240 282 236 278 232 curveto
+ 268 224 258 216 248 212 curveto
+ 228 202 206 200 186 200 curveto
+ 186 180 lineto
+ 264 180 lineto
+ 278 202 290 226 304 248 curveto
+ 302 246 lineto
+ 290 246 lineto
+closepath
+%end path
+fill
+%new path
+ 316 246 moveto
+ 302 246 lineto
+ 288 224 276 200 262 180 curveto
+ 358 180 lineto
+ 358 202 lineto
+ 356 202 lineto
+ 344 202 330 206 320 216 curveto
+ 320 218 lineto
+ 314 222 312 228 312 236 curveto
+ 314 236 lineto
+ 314 240 316 244 318 248 curveto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_Y
+(
+gsave
+initclip
+newpath
+0 0 moveto
+0 1000 lineto
+1000 1000 lineto
+1000 0 lineto
+0 0 lineto
+%new path
+ 180 670 0.5 add moveto
+ 208 668 0.5 add 238 668 0.5 add 268 668 0.5 add curveto
+ 268 670 0.5 add lineto
+ 306 670 0.5 add 342 670 0.5 add 378 672 0.5 add curveto
+ 376 670 0.5 add lineto
+ 178 670 0.5 add lineto
+closepath
+%end path
+%erase
+%new path
+ 550 670 0.5 add moveto
+ 578 668 0.5 add 606 668 0.5 add 634 668 0.5 add curveto
+ 634 670 0.5 add lineto
+ 658 670 0.5 add 680 670 0.5 add 702 672 0.5 add curveto
+ 700 670 0.5 add lineto
+ 548 670 0.5 add lineto
+closepath
+%end path
+%erase
+%new path
+ 334 180 0.5 sub moveto
+ 542 180 0.5 sub lineto
+ 508 182 0.5 sub 472 182 0.5 sub 438 182 0.5 sub curveto
+ 438 180 0.5 sub lineto
+ 332 180 0.5 sub lineto
+closepath
+%end path
+%erase
+eoclip
+newpath
+%new path
+ 462 406 moveto
+ 516 492 568 578 622 664 curveto
+ 622 666 624 666 624 668 curveto
+ 628 670 632 672 636 672 curveto
+ 644 672 lineto
+ 644 670 lineto
+ 644 670 646 670 646 668 curveto
+ 648 668 648 666 648 664 curveto
+ 646 664 lineto
+ 646 662 lineto
+ 586 566 528 470 468 374 curveto
+ 468 186 lineto
+ 468 184 468 182 466 180 curveto
+ 414 180 lineto
+ 412 180 410 180 408 182 curveto
+ 406 184 406 186 406 188 curveto
+ 408 188 lineto
+ 408 376 lineto
+ 406 376 lineto
+ 348 472 288 568 230 664 curveto
+ 230 666 lineto
+ 232 666 lineto
+ 232 668 232 670 234 670 curveto
+ 234 672 236 672 236 672 curveto
+ 290 672 lineto
+ 290 670 lineto
+ 296 670 300 668 302 666 curveto
+ 304 664 304 664 306 662 curveto
+ 358 576 410 490 462 404 curveto
+closepath
+%end path
+fill
+%new path
+ 256 624 moveto
+ 292 624 lineto
+ 284 640 274 656 266 672 curveto
+ 266 670 lineto
+ 178 670 lineto
+ 178 648 lineto
+ 180 648 lineto
+ 196 648 220 648 234 644 curveto
+ 238 642 244 638 248 634 curveto
+ 250 630 254 626 256 622 curveto
+closepath
+%end path
+fill
+%new path
+ 328 624 moveto
+ 326 626 326 630 326 632 curveto
+ 328 632 lineto
+ 328 636 328 640 330 642 curveto
+ 332 642 332 642 334 644 curveto
+ 346 650 362 650 378 650 curveto
+ 378 672 lineto
+ 376 670 lineto
+ 268 670 lineto
+ 276 654 286 638 294 622 curveto
+ 294 624 lineto
+ 330 624 lineto
+closepath
+%end path
+fill
+%new path
+ 584 604 moveto
+ 598 604 lineto
+ 610 626 622 650 634 672 curveto
+ 632 670 lineto
+ 548 670 lineto
+ 548 648 lineto
+ 550 648 lineto
+ 562 648 574 646 582 638 curveto
+ 584 636 584 636 586 634 curveto
+ 588 630 590 626 590 620 curveto
+ 588 620 lineto
+ 588 614 586 608 582 602 curveto
+closepath
+%end path
+fill
+%new path
+ 610 604 moveto
+ 614 610 620 616 624 622 curveto
+ 632 628 638 634 648 638 curveto
+ 664 646 682 650 702 650 curveto
+ 702 672 lineto
+ 700 670 lineto
+ 632 670 lineto
+ 620 648 608 624 596 602 curveto
+ 598 604 lineto
+ 610 604 lineto
+closepath
+%end path
+fill
+%new path
+ 406 226 moveto
+ 406 220 404 212 400 208 curveto
+ 398 206 396 206 394 204 curveto
+ 382 200 352 200 332 200 curveto
+ 332 180 lineto
+ 440 180 lineto
+ 440 228 lineto
+ 438 226 lineto
+ 406 226 lineto
+closepath
+%end path
+fill
+%new path
+ 468 226 moveto
+ 438 226 lineto
+ 438 180 lineto
+ 544 180 lineto
+ 544 202 lineto
+ 542 202 lineto
+ 522 202 492 202 480 206 curveto
+ 478 208 476 208 474 210 curveto
+ 470 214 468 222 468 228 curveto
+closepath
+%end path
+fill
+grestore
+) def
+
+/The_letter_Z
+(
+newpath
+%new path
+ 512 670 moveto
+ 514 666 514 662 514 660 curveto
+ 512 660 lineto
+ 512 660 220 198 220 198 curveto
+ 218 196 218 196 218 194 curveto
+ 218 186 lineto
+ 220 186 lineto
+ 220 184 220 182 222 180 curveto
+ 286 180 lineto
+ 284 184 284 188 284 192 curveto
+ 286 192 lineto
+ 286 192 578 654 580 654 curveto
+ 580 664 lineto
+ 578 664 lineto
+ 578 666 578 668 576 670 curveto
+ 574 672 572 672 570 672 curveto
+ 570 670 lineto
+ 510 670 lineto
+closepath
+%end path
+fill
+%new path
+ 248 510 moveto
+ 250 548 256 590 284 616 curveto
+ 284 618 286 618 286 618 curveto
+ 316 646 360 650 400 650 curveto
+ 546 650 lineto
+ 546 672 lineto
+ 544 670 lineto
+ 236 670 lineto
+ 234 616 230 562 228 508 curveto
+ 230 510 lineto
+ 248 510 lineto
+closepath
+%end path
+fill
+%new path
+ 564 370 moveto
+ 562 322 558 268 526 236 curveto
+ 494 206 446 202 402 202 curveto
+ 252 202 lineto
+ 252 180 lineto
+ 572 180 lineto
+ 576 244 580 308 584 372 curveto
+ 582 370 lineto
+ 564 370 lineto
+closepath
+%end path
+fill
+) def
+
+end % of CharDefs dictionary
+
+Encoding 65 /The_letter_A put
+Encoding 66 /The_letter_B put
+Encoding 67 /The_letter_C put
+Encoding 68 /The_letter_D put
+Encoding 69 /The_letter_E put
+Encoding 70 /The_letter_F put
+Encoding 71 /The_letter_G put
+Encoding 72 /The_letter_H put
+Encoding 73 /The_letter_I put
+Encoding 74 /The_letter_J put
+Encoding 75 /The_letter_K put
+Encoding 76 /The_letter_L put
+Encoding 77 /The_letter_M put
+Encoding 78 /The_letter_N put
+Encoding 79 /The_letter_O put
+Encoding 80 /The_letter_P put
+Encoding 81 /The_letter_Q put
+Encoding 82 /The_letter_R put
+Encoding 83 /The_letter_S put
+Encoding 84 /The_letter_T put
+Encoding 85 /The_letter_U put
+Encoding 86 /The_letter_V put
+Encoding 87 /The_letter_W put
+Encoding 88 /The_letter_X put
+Encoding 89 /The_letter_Y put
+Encoding 90 /The_letter_Z put
+
+Metrics
+ begin
+/The_letter_A 509 fudge add def
+/The_letter_B 463 fudge add def
+/The_letter_C 483 fudge add def
+/The_letter_D 503 fudge add def
+/The_letter_E 463 fudge add def
+/The_letter_F 433 fudge add def
+/The_letter_G 535 fudge add def
+/The_letter_H 509 fudge add def
+/The_letter_I 233 fudge add def
+/The_letter_J 339 fudge add def
+/The_letter_K 523 fudge add def
+/The_letter_L 413 fudge add def
+/The_letter_M 625 fudge add def
+/The_letter_N 509 fudge add def
+/The_letter_O 523 fudge add def
+/The_letter_P 443 fudge add def
+/The_letter_Q 527 fudge add def
+/The_letter_R 521 fudge add def
+/The_letter_S 363 fudge add def
+/The_letter_T 497 fudge add def
+/The_letter_U 509 fudge add def
+/The_letter_V 519 fudge add def
+/The_letter_W 719 fudge add def
+/The_letter_X 517 fudge add def
+/The_letter_Y 525 fudge add def
+/The_letter_Z 407 fudge add def
+/.notdef 450 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.5 1.5 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -178 fudge add 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [178 fudge sub 40 896 696] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 7 scalefont setfont
+ 100 710 moveto (THIS IS CMR SEVEN POINTS WRITTEN IN POSTSCRIPT) show
+ /Simon findfont 10 scalefont setfont
+ 100 698 moveto (THIS IS CMR TEN POINTS WRITTEN IN POSTSCRIPT) show
+ /Simon findfont 12 scalefont setfont
+ 100 686 moveto (THIS IS CMR TWELVE POINTS WRITTEN IN POSTSCRIPT) show
+ showpage
diff --git a/fonts/utilities/mf2ps/doc/printsamples/cmtt.ps b/fonts/utilities/mf2ps/doc/printsamples/cmtt.ps
new file mode 100644
index 0000000000..de9f6624d3
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/cmtt.ps
@@ -0,0 +1,6993 @@
+%! Simon font
+%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 80 def
+SimonFont begin
+%%
+ /FontType 3 def
+ /FontMatrix [0.000895 0 0 0.000895 0 0] def
+% /FontMatrix [0.001 0 0 0.001 0 0] def
+
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/The_letter_A
+(
+newpath
+%new path
+ 370 568 moveto
+ 370 542 422 322 450 198 curveto
+ 450 194 454 188 456 186 curveto
+ 462 180 468 180 476 180 curveto
+ 486 180 lineto
+ 490 180 494 182 496 184 curveto
+ 500 188 502 192 502 196 curveto
+ 500 196 lineto
+ 500 200 lineto
+ 468 336 436 474 404 610 curveto
+ 404 614 400 620 398 622 curveto
+ 392 628 386 630 380 630 curveto
+ 380 628 lineto
+ 354 628 lineto
+ 348 628 342 626 336 620 curveto
+ 334 618 330 612 330 608 curveto
+ 298 472 266 334 234 198 curveto
+ 234 194 lineto
+ 236 194 lineto
+ 236 190 238 186 242 182 curveto
+ 244 180 248 180 252 180 curveto
+ 262 180 lineto
+ 270 180 276 182 282 188 curveto
+ 284 190 288 196 288 200 curveto
+ 316 324 368 544 368 570 curveto
+ 370 570 lineto
+closepath
+%end path
+fill
+%new path
+ 286 298 moveto
+ 450 298 lineto
+ 448 314 444 328 440 342 curveto
+ 440 340 lineto
+ 294 340 lineto
+ 290 326 286 312 284 296 curveto
+closepath
+%end path
+fill
+%new path
+ 202 216 moveto
+ 200 212 lineto
+ 198 206 lineto
+ 198 196 lineto
+ 200 190 lineto
+ 202 186 lineto
+ 206 182 lineto
+ 210 180 lineto
+ 270 180 lineto
+ 274 182 lineto
+ 278 186 lineto
+ 280 190 lineto
+ 282 196 lineto
+ 282 198 284 200 284 202 curveto
+ 282 200 lineto
+ 282 206 lineto
+ 280 212 lineto
+ 278 216 lineto
+ 274 220 lineto
+ 272 222 lineto
+ 266 224 lineto
+ 260 224 lineto
+ 258 222 lineto
+ 214 222 lineto
+ 216 224 lineto
+ 210 222 lineto
+ 206 220 lineto
+ 202 216 lineto
+closepath
+%end path
+fill
+%new path
+ 246 216 moveto
+ 244 212 lineto
+ 242 206 lineto
+ 242 204 240 202 240 200 curveto
+ 242 202 lineto
+ 242 196 lineto
+ 244 190 lineto
+ 246 186 lineto
+ 250 182 lineto
+ 252 180 lineto
+ 322 180 lineto
+ 326 182 lineto
+ 330 186 lineto
+ 332 190 lineto
+ 334 196 lineto
+ 334 206 lineto
+ 332 212 lineto
+ 330 216 lineto
+ 326 220 lineto
+ 322 222 lineto
+ 316 224 lineto
+ 310 224 lineto
+ 310 222 lineto
+ 258 222 lineto
+ 260 224 lineto
+ 254 222 lineto
+ 250 220 lineto
+ 246 216 lineto
+closepath
+%end path
+fill
+%new path
+ 406 216 moveto
+ 404 212 lineto
+ 402 206 lineto
+ 402 196 lineto
+ 404 190 lineto
+ 406 186 lineto
+ 410 182 lineto
+ 414 180 lineto
+ 484 180 lineto
+ 486 182 lineto
+ 490 186 lineto
+ 492 190 lineto
+ 494 196 lineto
+ 494 202 lineto
+ 494 204 492 206 492 208 curveto
+ 494 206 lineto
+ 492 212 lineto
+ 490 216 lineto
+ 486 220 lineto
+ 482 222 lineto
+ 476 224 lineto
+ 470 224 lineto
+ 470 222 lineto
+ 418 222 lineto
+ 420 224 lineto
+ 414 222 lineto
+ 410 220 lineto
+ 406 216 lineto
+closepath
+%end path
+fill
+%new path
+ 458 216 moveto
+ 456 212 lineto
+ 454 206 lineto
+ 454 200 lineto
+ 454 198 456 196 456 194 curveto
+ 454 196 lineto
+ 456 190 lineto
+ 458 186 lineto
+ 462 182 lineto
+ 466 180 lineto
+ 526 180 lineto
+ 530 182 lineto
+ 534 186 lineto
+ 536 190 lineto
+ 538 196 lineto
+ 538 206 lineto
+ 536 212 lineto
+ 534 216 lineto
+ 530 220 lineto
+ 526 222 lineto
+ 520 224 lineto
+ 514 224 lineto
+ 514 222 lineto
+ 470 222 lineto
+ 470 224 lineto
+ 464 222 lineto
+ 462 220 lineto
+ 458 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_B
+(
+newpath
+%new path
+ 250 612 moveto
+ 248 608 lineto
+ 246 602 lineto
+ 244 602 lineto
+ 244 202 lineto
+ 246 202 lineto
+ 246 196 lineto
+ 248 190 lineto
+ 250 188 lineto
+ 254 184 lineto
+ 256 182 lineto
+ 262 180 lineto
+ 278 180 lineto
+ 284 182 lineto
+ 288 184 lineto
+ 292 188 lineto
+ 294 190 lineto
+ 296 196 lineto
+ 296 602 lineto
+ 294 608 lineto
+ 292 612 lineto
+ 288 616 lineto
+ 284 618 lineto
+ 278 620 lineto
+ 272 620 lineto
+ 272 618 lineto
+ 262 618 lineto
+ 262 620 lineto
+ 256 618 lineto
+ 254 616 lineto
+ 250 612 lineto
+closepath
+%end path
+fill
+%new path
+ 272 576 moveto
+ 392 576 lineto
+ 392 574 lineto
+ 410 574 428 566 442 554 curveto
+ 454 540 462 524 462 506 curveto
+ 460 506 lineto
+ 460 486 452 468 438 454 curveto
+ 438 454 436 452 436 452 curveto
+ 418 436 396 428 374 428 curveto
+ 270 428 lineto
+ 270 402 lineto
+ 272 404 lineto
+ 392 404 lineto
+ 422 404 454 414 476 434 curveto
+ 478 436 480 438 482 440 curveto
+ 500 458 512 482 512 508 curveto
+ 510 508 lineto
+ 510 536 498 564 478 584 curveto
+ 476 586 476 586 474 588 curveto
+ 452 608 422 620 390 620 curveto
+ 390 618 lineto
+ 270 618 lineto
+ 270 574 lineto
+closepath
+%end path
+fill
+%new path
+ 272 386 moveto
+ 400 386 lineto
+ 400 384 lineto
+ 420 384 438 376 452 362 curveto
+ 454 362 454 360 454 360 curveto
+ 470 344 478 322 478 300 curveto
+ 476 300 lineto
+ 476 280 468 262 454 248 curveto
+ 452 246 452 246 450 244 curveto
+ 434 230 412 222 390 222 curveto
+ 270 222 lineto
+ 270 180 lineto
+ 406 180 lineto
+ 440 180 470 192 492 216 curveto
+ 516 238 528 270 528 302 curveto
+ 526 302 lineto
+ 526 330 514 358 494 378 curveto
+ 492 380 492 380 490 382 curveto
+ 468 402 436 414 404 414 curveto
+ 404 412 lineto
+ 270 412 lineto
+ 270 384 lineto
+closepath
+%end path
+fill
+%new path
+ 286 584 moveto
+ 288 586 lineto
+ 290 592 lineto
+ 292 594 lineto
+ 292 598 lineto
+ 290 596 lineto
+ 290 602 lineto
+ 288 608 lineto
+ 286 612 lineto
+ 282 616 lineto
+ 280 618 lineto
+ 274 620 lineto
+ 268 620 lineto
+ 266 618 lineto
+ 212 618 lineto
+ 214 620 lineto
+ 208 618 lineto
+ 204 616 lineto
+ 200 612 lineto
+ 198 608 lineto
+ 196 602 lineto
+ 196 592 lineto
+ 198 586 lineto
+ 200 584 lineto
+ 204 580 lineto
+ 208 578 lineto
+ 214 576 lineto
+ 274 576 lineto
+ 280 578 lineto
+ 282 580 lineto
+ 286 584 lineto
+closepath
+%end path
+fill
+%new path
+ 316 584 moveto
+ 318 586 lineto
+ 320 592 lineto
+ 320 602 lineto
+ 318 608 lineto
+ 316 612 lineto
+ 312 616 lineto
+ 308 618 lineto
+ 302 620 lineto
+ 296 620 lineto
+ 296 618 lineto
+ 266 618 lineto
+ 268 620 lineto
+ 262 618 lineto
+ 258 616 lineto
+ 254 612 lineto
+ 252 608 lineto
+ 250 602 lineto
+ 250 592 lineto
+ 252 586 lineto
+ 254 584 lineto
+ 258 580 lineto
+ 262 578 lineto
+ 268 576 lineto
+ 302 576 lineto
+ 308 578 lineto
+ 312 580 lineto
+ 316 584 lineto
+closepath
+%end path
+fill
+%new path
+ 200 216 moveto
+ 198 212 lineto
+ 196 206 lineto
+ 196 196 lineto
+ 198 190 lineto
+ 200 186 lineto
+ 204 182 lineto
+ 208 180 lineto
+ 280 180 lineto
+ 282 182 lineto
+ 286 186 lineto
+ 288 190 lineto
+ 290 196 lineto
+ 292 196 lineto
+ 292 202 lineto
+ 290 200 lineto
+ 290 206 lineto
+ 288 212 lineto
+ 286 216 lineto
+ 282 220 lineto
+ 280 222 lineto
+ 274 224 lineto
+ 268 224 lineto
+ 266 222 lineto
+ 212 222 lineto
+ 214 224 lineto
+ 208 222 lineto
+ 204 220 lineto
+ 200 216 lineto
+closepath
+%end path
+fill
+%new path
+ 254 216 moveto
+ 252 212 lineto
+ 250 206 lineto
+ 250 196 lineto
+ 252 190 lineto
+ 254 186 lineto
+ 258 182 lineto
+ 262 180 lineto
+ 308 180 lineto
+ 312 182 lineto
+ 316 186 lineto
+ 318 190 lineto
+ 320 196 lineto
+ 320 206 lineto
+ 318 212 lineto
+ 316 216 lineto
+ 312 220 lineto
+ 308 222 lineto
+ 302 224 lineto
+ 296 224 lineto
+ 296 222 lineto
+ 266 222 lineto
+ 268 224 lineto
+ 262 222 lineto
+ 258 220 lineto
+ 254 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_C
+(
+newpath
+%new path
+ 494 468 moveto
+ 510 468 lineto
+ 516 470 lineto
+ 520 472 lineto
+ 524 476 lineto
+ 526 478 lineto
+ 528 484 lineto
+ 528 490 lineto
+ 526 492 lineto
+ 524 502 522 512 520 522 curveto
+ 520 520 lineto
+ 518 526 lineto
+ 518 528 lineto
+ 514 540 508 550 502 560 curveto
+ 500 562 lineto
+ 500 564 lineto
+ 494 570 488 578 482 584 curveto
+ 484 582 lineto
+ 480 586 lineto
+ 478 588 lineto
+ 472 594 466 600 460 604 curveto
+ 460 602 lineto
+ 458 604 lineto
+ 456 606 lineto
+ 448 612 438 616 428 620 curveto
+ 428 618 lineto
+ 422 620 lineto
+ 422 622 lineto
+ 410 626 396 628 384 628 curveto
+ 378 628 lineto
+ 378 626 lineto
+ 364 626 352 624 342 620 curveto
+ 342 622 lineto
+ 336 620 lineto
+ 336 618 lineto
+ 324 614 314 610 304 602 curveto
+ 306 604 lineto
+ 302 602 lineto
+ 302 600 lineto
+ 294 596 286 588 278 582 curveto
+ 280 582 lineto
+ 276 578 lineto
+ 274 578 lineto
+ 268 572 262 564 256 558 curveto
+ 254 554 254 552 252 550 curveto
+ 250 548 lineto
+ 250 546 lineto
+ 238 530 230 512 224 494 curveto
+ 222 488 lineto
+ 212 460 208 430 208 402 curveto
+ 210 402 lineto
+ 210 396 lineto
+ 210 366 214 336 224 308 curveto
+ 222 310 lineto
+ 224 304 lineto
+ 226 302 lineto
+ 232 284 240 266 252 250 curveto
+ 250 250 lineto
+ 252 248 lineto
+ 254 246 lineto
+ 256 244 256 242 258 238 curveto
+ 264 232 270 224 276 218 curveto
+ 276 220 lineto
+ 280 216 lineto
+ 280 214 lineto
+ 288 208 296 200 304 196 curveto
+ 302 196 lineto
+ 306 194 lineto
+ 316 186 326 182 338 180 curveto
+ 336 180 lineto
+ 342 178 lineto
+ 344 178 lineto
+ 354 174 366 172 380 172 curveto
+ 384 172 lineto
+ 386 174 lineto
+ 400 174 416 176 428 180 curveto
+ 434 180 lineto
+ 446 184 456 190 466 196 curveto
+ 468 198 lineto
+ 470 198 lineto
+ 476 202 482 208 488 214 curveto
+ 486 212 lineto
+ 490 216 lineto
+ 492 218 lineto
+ 498 222 502 228 506 234 curveto
+ 508 236 lineto
+ 508 238 lineto
+ 514 246 518 254 520 264 curveto
+ 520 262 lineto
+ 522 268 lineto
+ 522 270 lineto
+ 526 280 528 292 528 304 curveto
+ 528 308 lineto
+ 526 314 lineto
+ 524 318 lineto
+ 520 322 lineto
+ 516 324 lineto
+ 510 326 lineto
+ 504 326 lineto
+ 504 324 lineto
+ 492 324 lineto
+ 494 326 lineto
+ 488 324 lineto
+ 484 322 lineto
+ 480 318 lineto
+ 478 314 lineto
+ 476 308 lineto
+ 476 294 474 284 470 272 curveto
+ 472 274 lineto
+ 474 280 lineto
+ 472 278 lineto
+ 470 270 466 260 460 252 curveto
+ 460 254 lineto
+ 462 256 lineto
+ 458 250 454 244 448 238 curveto
+ 448 240 lineto
+ 446 236 lineto
+ 444 230 lineto
+ 444 224 lineto
+ 448 240 lineto
+ 468 248 lineto
+ 462 248 lineto
+ 456 246 lineto
+ 452 244 lineto
+ 452 242 lineto
+ 446 238 442 232 434 228 curveto
+ 436 230 lineto
+ 438 232 lineto
+ 438 230 lineto
+ 430 226 420 220 412 218 curveto
+ 418 220 lineto
+ 406 216 394 214 382 214 curveto
+ 382 216 lineto
+ 376 214 lineto
+ 374 212 lineto
+ 370 208 lineto
+ 388 216 lineto
+ 402 208 lineto
+ 398 212 lineto
+ 394 214 lineto
+ 388 216 lineto
+ 376 216 364 218 354 222 curveto
+ 354 220 lineto
+ 360 218 lineto
+ 360 220 lineto
+ 350 224 340 228 330 234 curveto
+ 332 234 lineto
+ 334 232 lineto
+ 326 238 318 244 310 250 curveto
+ 312 250 lineto
+ 308 252 lineto
+ 302 254 lineto
+ 316 246 lineto
+ 320 236 lineto
+ 318 242 lineto
+ 316 246 lineto
+ 314 246 lineto
+ 308 254 302 260 296 268 curveto
+ 296 270 294 272 292 274 curveto
+ 294 272 lineto
+ 296 270 lineto
+ 294 270 lineto
+ 284 288 276 304 270 324 curveto
+ 270 322 lineto
+ 272 316 lineto
+ 272 318 lineto
+ 262 344 258 374 258 404 curveto
+ 260 402 lineto
+ 258 408 lineto
+ 256 412 lineto
+ 260 402 lineto
+ 256 388 lineto
+ 258 390 lineto
+ 260 396 lineto
+ 260 398 lineto
+ 260 426 264 456 274 482 curveto
+ 272 482 lineto
+ 270 476 lineto
+ 272 476 lineto
+ 278 496 286 514 296 530 curveto
+ 296 528 lineto
+ 294 526 lineto
+ 296 528 298 530 298 532 curveto
+ 304 540 310 546 316 554 curveto
+ 316 552 lineto
+ 318 556 lineto
+ 320 562 lineto
+ 320 568 lineto
+ 316 552 lineto
+ 296 544 lineto
+ 302 544 lineto
+ 308 546 lineto
+ 312 548 lineto
+ 312 550 lineto
+ 320 556 328 562 336 568 curveto
+ 334 566 lineto
+ 332 564 lineto
+ 332 566 lineto
+ 342 572 352 578 362 580 curveto
+ 360 580 lineto
+ 354 578 lineto
+ 356 578 lineto
+ 366 582 378 584 390 584 curveto
+ 388 584 lineto
+ 394 586 lineto
+ 398 588 lineto
+ 402 592 lineto
+ 382 584 lineto
+ 370 592 lineto
+ 374 588 lineto
+ 376 586 lineto
+ 382 584 lineto
+ 384 582 lineto
+ 394 582 404 580 414 576 curveto
+ 414 578 lineto
+ 408 580 lineto
+ 408 578 lineto
+ 418 576 426 572 432 566 curveto
+ 432 568 lineto
+ 428 570 lineto
+ 430 568 lineto
+ 436 564 442 560 448 554 curveto
+ 446 556 lineto
+ 450 554 lineto
+ 456 552 lineto
+ 442 560 lineto
+ 438 568 lineto
+ 440 562 lineto
+ 442 560 lineto
+ 444 558 lineto
+ 448 554 454 546 458 540 curveto
+ 456 544 lineto
+ 456 542 lineto
+ 464 532 470 522 474 510 curveto
+ 472 510 lineto
+ 470 516 lineto
+ 472 516 lineto
+ 474 504 476 494 478 484 curveto
+ 476 484 lineto
+ 478 478 lineto
+ 480 476 lineto
+ 484 472 lineto
+ 488 470 lineto
+ 494 468 lineto
+closepath
+%end path
+fill
+%new path
+ 524 476 moveto
+ 526 478 lineto
+ 528 484 lineto
+ 528 610 lineto
+ 526 616 lineto
+ 524 620 lineto
+ 520 624 lineto
+ 516 626 lineto
+ 510 628 lineto
+ 504 628 lineto
+ 504 626 lineto
+ 500 626 lineto
+ 500 628 lineto
+ 494 626 lineto
+ 492 624 lineto
+ 488 620 lineto
+ 486 616 lineto
+ 484 616 lineto
+ 476 596 468 578 460 560 curveto
+ 460 562 lineto
+ 458 556 lineto
+ 458 550 lineto
+ 460 544 lineto
+ 462 540 lineto
+ 464 540 lineto
+ 464 538 lineto
+ 462 542 lineto
+ 462 540 lineto
+ 470 530 474 520 478 508 curveto
+ 476 514 lineto
+ 480 504 482 494 482 484 curveto
+ 484 478 lineto
+ 486 476 lineto
+ 490 472 lineto
+ 492 470 lineto
+ 498 468 lineto
+ 510 468 lineto
+ 516 470 lineto
+ 520 472 lineto
+ 524 476 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_D
+(
+newpath
+%new path
+ 242 612 moveto
+ 240 608 lineto
+ 238 602 lineto
+ 236 602 lineto
+ 236 202 lineto
+ 238 202 lineto
+ 238 196 lineto
+ 240 190 lineto
+ 242 188 lineto
+ 246 184 lineto
+ 248 182 lineto
+ 254 180 lineto
+ 270 180 lineto
+ 276 182 lineto
+ 280 184 lineto
+ 284 188 lineto
+ 286 190 lineto
+ 288 196 lineto
+ 288 602 lineto
+ 286 608 lineto
+ 284 612 lineto
+ 280 616 lineto
+ 276 618 lineto
+ 270 620 lineto
+ 264 620 lineto
+ 264 618 lineto
+ 254 618 lineto
+ 254 620 lineto
+ 248 618 lineto
+ 246 616 lineto
+ 242 612 lineto
+closepath
+%end path
+fill
+%new path
+ 264 576 moveto
+ 364 576 lineto
+ 364 574 lineto
+ 388 574 410 562 426 544 curveto
+ 434 538 440 530 446 522 curveto
+ 470 484 480 438 480 394 curveto
+ 478 394 lineto
+ 478 350 468 308 444 272 curveto
+ 438 264 434 258 426 252 curveto
+ 410 234 386 222 362 222 curveto
+ 262 222 lineto
+ 262 180 lineto
+ 376 180 lineto
+ 410 180 442 196 466 220 curveto
+ 472 228 480 236 484 244 curveto
+ 516 288 530 342 530 396 curveto
+ 528 396 lineto
+ 528 452 514 508 482 554 curveto
+ 476 564 470 572 462 580 curveto
+ 438 604 408 620 374 620 curveto
+ 374 618 lineto
+ 262 618 lineto
+ 262 574 lineto
+closepath
+%end path
+fill
+%new path
+ 278 584 moveto
+ 280 586 lineto
+ 282 592 lineto
+ 284 594 lineto
+ 284 598 lineto
+ 282 596 lineto
+ 282 602 lineto
+ 280 608 lineto
+ 278 612 lineto
+ 274 616 lineto
+ 272 618 lineto
+ 266 620 lineto
+ 260 620 lineto
+ 258 618 lineto
+ 208 618 lineto
+ 208 620 lineto
+ 202 618 lineto
+ 200 616 lineto
+ 196 612 lineto
+ 194 608 lineto
+ 192 602 lineto
+ 190 602 lineto
+ 190 598 lineto
+ 192 598 lineto
+ 192 592 lineto
+ 194 586 lineto
+ 196 584 lineto
+ 200 580 lineto
+ 202 578 lineto
+ 208 576 lineto
+ 266 576 lineto
+ 272 578 lineto
+ 274 580 lineto
+ 278 584 lineto
+closepath
+%end path
+fill
+%new path
+ 306 584 moveto
+ 308 586 lineto
+ 310 592 lineto
+ 310 602 lineto
+ 308 608 lineto
+ 306 612 lineto
+ 302 616 lineto
+ 298 618 lineto
+ 292 620 lineto
+ 286 620 lineto
+ 286 618 lineto
+ 258 618 lineto
+ 260 620 lineto
+ 254 618 lineto
+ 250 616 lineto
+ 246 612 lineto
+ 244 608 lineto
+ 242 602 lineto
+ 242 592 lineto
+ 244 586 lineto
+ 246 584 lineto
+ 250 580 lineto
+ 254 578 lineto
+ 260 576 lineto
+ 292 576 lineto
+ 298 578 lineto
+ 302 580 lineto
+ 306 584 lineto
+closepath
+%end path
+fill
+%new path
+ 196 216 moveto
+ 194 212 lineto
+ 192 206 lineto
+ 190 206 lineto
+ 190 200 lineto
+ 192 202 lineto
+ 192 196 lineto
+ 194 190 lineto
+ 196 186 lineto
+ 200 182 lineto
+ 202 180 lineto
+ 272 180 lineto
+ 274 182 lineto
+ 278 186 lineto
+ 280 190 lineto
+ 282 196 lineto
+ 284 196 lineto
+ 284 202 lineto
+ 282 200 lineto
+ 282 206 lineto
+ 280 212 lineto
+ 278 216 lineto
+ 274 220 lineto
+ 272 222 lineto
+ 266 224 lineto
+ 260 224 lineto
+ 258 222 lineto
+ 208 222 lineto
+ 208 224 lineto
+ 202 222 lineto
+ 200 220 lineto
+ 196 216 lineto
+closepath
+%end path
+fill
+%new path
+ 246 216 moveto
+ 244 212 lineto
+ 242 206 lineto
+ 242 196 lineto
+ 244 190 lineto
+ 246 186 lineto
+ 250 182 lineto
+ 254 180 lineto
+ 298 180 lineto
+ 302 182 lineto
+ 306 186 lineto
+ 308 190 lineto
+ 310 196 lineto
+ 310 206 lineto
+ 308 212 lineto
+ 306 216 lineto
+ 302 220 lineto
+ 298 222 lineto
+ 292 224 lineto
+ 286 224 lineto
+ 286 222 lineto
+ 258 222 lineto
+ 260 224 lineto
+ 254 222 lineto
+ 250 220 lineto
+ 246 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_E
+(
+newpath
+%new path
+ 254 612 moveto
+ 252 608 lineto
+ 250 602 lineto
+ 248 602 lineto
+ 248 202 lineto
+ 250 202 lineto
+ 250 196 lineto
+ 252 190 lineto
+ 254 188 lineto
+ 258 184 lineto
+ 260 182 lineto
+ 266 180 lineto
+ 282 180 lineto
+ 288 182 lineto
+ 292 184 lineto
+ 296 188 lineto
+ 298 190 lineto
+ 300 196 lineto
+ 300 602 lineto
+ 298 608 lineto
+ 296 612 lineto
+ 292 616 lineto
+ 288 618 lineto
+ 282 620 lineto
+ 276 620 lineto
+ 276 618 lineto
+ 266 618 lineto
+ 266 620 lineto
+ 260 618 lineto
+ 258 616 lineto
+ 254 612 lineto
+closepath
+%end path
+fill
+%new path
+ 492 506 moveto
+ 498 506 lineto
+ 498 508 lineto
+ 510 508 lineto
+ 508 506 lineto
+ 514 508 lineto
+ 518 510 lineto
+ 522 514 lineto
+ 524 518 lineto
+ 526 524 lineto
+ 526 602 lineto
+ 524 608 lineto
+ 522 612 lineto
+ 518 616 lineto
+ 514 618 lineto
+ 508 620 lineto
+ 502 620 lineto
+ 502 618 lineto
+ 270 618 lineto
+ 272 620 lineto
+ 266 618 lineto
+ 262 616 lineto
+ 258 612 lineto
+ 256 608 lineto
+ 254 602 lineto
+ 254 592 lineto
+ 256 586 lineto
+ 258 582 lineto
+ 262 578 lineto
+ 266 576 lineto
+ 272 574 lineto
+ 278 574 lineto
+ 278 576 lineto
+ 498 576 lineto
+ 498 574 lineto
+ 504 576 lineto
+ 506 578 lineto
+ 510 582 lineto
+ 492 574 lineto
+ 478 582 lineto
+ 482 578 lineto
+ 486 576 lineto
+ 492 574 lineto
+ 478 582 lineto
+ 474 592 lineto
+ 476 586 lineto
+ 478 582 lineto
+ 474 592 lineto
+ 478 606 lineto
+ 476 604 lineto
+ 474 598 lineto
+ 474 524 lineto
+ 476 518 lineto
+ 478 514 lineto
+ 482 510 lineto
+ 486 508 lineto
+ 492 506 lineto
+closepath
+%end path
+fill
+%new path
+ 396 462 moveto
+ 394 458 lineto
+ 392 452 lineto
+ 392 406 lineto
+ 396 422 lineto
+ 416 430 lineto
+ 410 430 lineto
+ 408 428 lineto
+ 270 428 lineto
+ 272 430 lineto
+ 266 428 lineto
+ 262 426 lineto
+ 258 422 lineto
+ 256 418 lineto
+ 254 412 lineto
+ 254 402 lineto
+ 256 396 lineto
+ 258 392 lineto
+ 262 388 lineto
+ 266 386 lineto
+ 272 384 lineto
+ 278 384 lineto
+ 278 386 lineto
+ 428 386 lineto
+ 426 384 lineto
+ 432 386 lineto
+ 436 388 lineto
+ 440 392 lineto
+ 442 396 lineto
+ 444 402 lineto
+ 444 452 lineto
+ 442 458 lineto
+ 440 462 lineto
+ 436 466 lineto
+ 432 468 lineto
+ 426 470 lineto
+ 420 470 lineto
+ 420 468 lineto
+ 408 468 lineto
+ 410 470 lineto
+ 404 468 lineto
+ 400 466 lineto
+ 396 462 lineto
+closepath
+%end path
+fill
+%new path
+ 410 344 moveto
+ 416 344 lineto
+ 416 346 lineto
+ 428 346 lineto
+ 426 344 lineto
+ 432 346 lineto
+ 436 348 lineto
+ 440 352 lineto
+ 442 356 lineto
+ 444 362 lineto
+ 444 412 lineto
+ 442 418 lineto
+ 440 422 lineto
+ 436 426 lineto
+ 432 428 lineto
+ 426 430 lineto
+ 420 430 lineto
+ 420 428 lineto
+ 270 428 lineto
+ 272 430 lineto
+ 266 428 lineto
+ 262 426 lineto
+ 258 422 lineto
+ 256 418 lineto
+ 254 412 lineto
+ 254 402 lineto
+ 256 396 lineto
+ 258 392 lineto
+ 262 388 lineto
+ 266 386 lineto
+ 272 384 lineto
+ 278 384 lineto
+ 278 386 lineto
+ 416 386 lineto
+ 416 384 lineto
+ 422 386 lineto
+ 424 388 lineto
+ 428 392 lineto
+ 410 384 lineto
+ 396 392 lineto
+ 400 388 lineto
+ 404 386 lineto
+ 410 384 lineto
+ 396 392 lineto
+ 392 402 lineto
+ 394 396 lineto
+ 396 392 lineto
+ 392 402 lineto
+ 396 416 lineto
+ 394 414 lineto
+ 392 408 lineto
+ 392 362 lineto
+ 394 356 lineto
+ 396 352 lineto
+ 400 348 lineto
+ 404 346 lineto
+ 410 344 lineto
+closepath
+%end path
+fill
+%new path
+ 494 296 moveto
+ 492 292 lineto
+ 490 286 lineto
+ 490 200 lineto
+ 494 216 lineto
+ 514 224 lineto
+ 508 224 lineto
+ 506 222 lineto
+ 270 222 lineto
+ 272 224 lineto
+ 266 222 lineto
+ 262 220 lineto
+ 258 216 lineto
+ 256 212 lineto
+ 254 206 lineto
+ 254 196 lineto
+ 256 190 lineto
+ 258 188 lineto
+ 262 184 lineto
+ 266 182 lineto
+ 272 180 lineto
+ 524 180 lineto
+ 530 182 lineto
+ 534 184 lineto
+ 538 188 lineto
+ 540 190 lineto
+ 542 196 lineto
+ 542 286 lineto
+ 540 292 lineto
+ 538 296 lineto
+ 534 300 lineto
+ 530 302 lineto
+ 524 304 lineto
+ 518 304 lineto
+ 518 302 lineto
+ 506 302 lineto
+ 508 304 lineto
+ 502 302 lineto
+ 498 300 lineto
+ 494 296 lineto
+closepath
+%end path
+fill
+%new path
+ 290 584 moveto
+ 292 586 lineto
+ 294 592 lineto
+ 296 594 lineto
+ 296 598 lineto
+ 294 596 lineto
+ 294 602 lineto
+ 292 608 lineto
+ 290 612 lineto
+ 286 616 lineto
+ 284 618 lineto
+ 278 620 lineto
+ 272 620 lineto
+ 270 618 lineto
+ 214 618 lineto
+ 216 620 lineto
+ 210 618 lineto
+ 206 616 lineto
+ 202 612 lineto
+ 200 608 lineto
+ 198 602 lineto
+ 198 592 lineto
+ 200 586 lineto
+ 202 584 lineto
+ 206 580 lineto
+ 210 578 lineto
+ 216 576 lineto
+ 278 576 lineto
+ 284 578 lineto
+ 286 580 lineto
+ 290 584 lineto
+closepath
+%end path
+fill
+%new path
+ 320 584 moveto
+ 322 586 lineto
+ 324 592 lineto
+ 326 594 lineto
+ 326 598 lineto
+ 324 596 lineto
+ 324 602 lineto
+ 322 608 lineto
+ 320 612 lineto
+ 316 616 lineto
+ 314 618 lineto
+ 308 620 lineto
+ 302 620 lineto
+ 300 618 lineto
+ 270 618 lineto
+ 272 620 lineto
+ 266 618 lineto
+ 262 616 lineto
+ 258 612 lineto
+ 256 608 lineto
+ 254 602 lineto
+ 254 592 lineto
+ 256 586 lineto
+ 258 584 lineto
+ 262 580 lineto
+ 266 578 lineto
+ 272 576 lineto
+ 308 576 lineto
+ 314 578 lineto
+ 316 580 lineto
+ 320 584 lineto
+closepath
+%end path
+fill
+%new path
+ 202 216 moveto
+ 200 212 lineto
+ 198 206 lineto
+ 198 196 lineto
+ 200 190 lineto
+ 202 186 lineto
+ 206 182 lineto
+ 210 180 lineto
+ 284 180 lineto
+ 286 182 lineto
+ 290 186 lineto
+ 292 190 lineto
+ 294 196 lineto
+ 296 196 lineto
+ 296 202 lineto
+ 294 200 lineto
+ 294 206 lineto
+ 292 212 lineto
+ 290 216 lineto
+ 286 220 lineto
+ 284 222 lineto
+ 278 224 lineto
+ 272 224 lineto
+ 270 222 lineto
+ 214 222 lineto
+ 216 224 lineto
+ 210 222 lineto
+ 206 220 lineto
+ 202 216 lineto
+closepath
+%end path
+fill
+%new path
+ 258 216 moveto
+ 256 212 lineto
+ 254 206 lineto
+ 254 196 lineto
+ 256 190 lineto
+ 258 186 lineto
+ 262 182 lineto
+ 266 180 lineto
+ 314 180 lineto
+ 316 182 lineto
+ 320 186 lineto
+ 322 190 lineto
+ 324 196 lineto
+ 326 196 lineto
+ 326 202 lineto
+ 324 200 lineto
+ 324 206 lineto
+ 322 212 lineto
+ 320 216 lineto
+ 316 220 lineto
+ 314 222 lineto
+ 308 224 lineto
+ 302 224 lineto
+ 300 222 lineto
+ 270 222 lineto
+ 272 224 lineto
+ 266 222 lineto
+ 262 220 lineto
+ 258 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_F
+(
+newpath
+%new path
+ 258 612 moveto
+ 256 608 lineto
+ 254 602 lineto
+ 252 602 lineto
+ 252 202 lineto
+ 254 202 lineto
+ 254 196 lineto
+ 256 190 lineto
+ 258 188 lineto
+ 262 184 lineto
+ 264 182 lineto
+ 270 180 lineto
+ 286 180 lineto
+ 292 182 lineto
+ 296 184 lineto
+ 300 188 lineto
+ 302 190 lineto
+ 304 196 lineto
+ 304 602 lineto
+ 302 608 lineto
+ 300 612 lineto
+ 296 616 lineto
+ 292 618 lineto
+ 286 620 lineto
+ 280 620 lineto
+ 280 618 lineto
+ 270 618 lineto
+ 270 620 lineto
+ 264 618 lineto
+ 262 616 lineto
+ 258 612 lineto
+closepath
+%end path
+fill
+%new path
+ 500 506 moveto
+ 506 506 lineto
+ 506 508 lineto
+ 518 508 lineto
+ 516 506 lineto
+ 522 508 lineto
+ 526 510 lineto
+ 530 514 lineto
+ 532 518 lineto
+ 534 524 lineto
+ 534 602 lineto
+ 532 608 lineto
+ 530 612 lineto
+ 526 616 lineto
+ 522 618 lineto
+ 516 620 lineto
+ 510 620 lineto
+ 510 618 lineto
+ 274 618 lineto
+ 276 620 lineto
+ 270 618 lineto
+ 266 616 lineto
+ 262 612 lineto
+ 260 608 lineto
+ 258 602 lineto
+ 258 592 lineto
+ 260 586 lineto
+ 262 582 lineto
+ 266 578 lineto
+ 270 576 lineto
+ 276 574 lineto
+ 282 574 lineto
+ 282 576 lineto
+ 506 576 lineto
+ 506 574 lineto
+ 512 576 lineto
+ 514 578 lineto
+ 518 582 lineto
+ 500 574 lineto
+ 486 582 lineto
+ 490 578 lineto
+ 494 576 lineto
+ 500 574 lineto
+ 486 582 lineto
+ 482 592 lineto
+ 484 586 lineto
+ 486 582 lineto
+ 482 592 lineto
+ 486 606 lineto
+ 484 604 lineto
+ 482 598 lineto
+ 482 524 lineto
+ 484 518 lineto
+ 486 514 lineto
+ 490 510 lineto
+ 494 508 lineto
+ 500 506 lineto
+closepath
+%end path
+fill
+%new path
+ 404 454 moveto
+ 402 450 lineto
+ 400 444 lineto
+ 400 398 lineto
+ 404 414 lineto
+ 424 422 lineto
+ 418 422 lineto
+ 416 420 lineto
+ 274 420 lineto
+ 276 422 lineto
+ 270 420 lineto
+ 266 418 lineto
+ 262 414 lineto
+ 260 410 lineto
+ 258 404 lineto
+ 258 394 lineto
+ 260 388 lineto
+ 262 384 lineto
+ 266 380 lineto
+ 270 378 lineto
+ 276 376 lineto
+ 282 376 lineto
+ 282 378 lineto
+ 436 378 lineto
+ 434 376 lineto
+ 440 378 lineto
+ 444 380 lineto
+ 448 384 lineto
+ 450 388 lineto
+ 452 394 lineto
+ 452 444 lineto
+ 450 450 lineto
+ 448 454 lineto
+ 444 458 lineto
+ 440 460 lineto
+ 434 462 lineto
+ 428 462 lineto
+ 428 460 lineto
+ 416 460 lineto
+ 418 462 lineto
+ 412 460 lineto
+ 408 458 lineto
+ 404 454 lineto
+closepath
+%end path
+fill
+%new path
+ 418 336 moveto
+ 424 336 lineto
+ 424 338 lineto
+ 436 338 lineto
+ 434 336 lineto
+ 440 338 lineto
+ 444 340 lineto
+ 448 344 lineto
+ 450 348 lineto
+ 452 354 lineto
+ 452 404 lineto
+ 450 410 lineto
+ 448 414 lineto
+ 444 418 lineto
+ 440 420 lineto
+ 434 422 lineto
+ 428 422 lineto
+ 428 420 lineto
+ 274 420 lineto
+ 276 422 lineto
+ 270 420 lineto
+ 266 418 lineto
+ 262 414 lineto
+ 260 410 lineto
+ 258 404 lineto
+ 258 394 lineto
+ 260 388 lineto
+ 262 384 lineto
+ 266 380 lineto
+ 270 378 lineto
+ 276 376 lineto
+ 282 376 lineto
+ 282 378 lineto
+ 424 378 lineto
+ 424 376 lineto
+ 430 378 lineto
+ 432 380 lineto
+ 436 384 lineto
+ 418 376 lineto
+ 404 384 lineto
+ 408 380 lineto
+ 412 378 lineto
+ 418 376 lineto
+ 404 384 lineto
+ 400 394 lineto
+ 402 388 lineto
+ 404 384 lineto
+ 400 394 lineto
+ 404 408 lineto
+ 402 406 lineto
+ 400 400 lineto
+ 400 354 lineto
+ 402 348 lineto
+ 404 344 lineto
+ 408 340 lineto
+ 412 338 lineto
+ 418 336 lineto
+closepath
+%end path
+fill
+%new path
+ 294 584 moveto
+ 296 586 lineto
+ 298 592 lineto
+ 300 594 lineto
+ 300 598 lineto
+ 298 596 lineto
+ 298 602 lineto
+ 296 608 lineto
+ 294 612 lineto
+ 290 616 lineto
+ 288 618 lineto
+ 282 620 lineto
+ 276 620 lineto
+ 274 618 lineto
+ 216 618 lineto
+ 216 620 lineto
+ 210 618 lineto
+ 208 616 lineto
+ 204 612 lineto
+ 202 608 lineto
+ 200 602 lineto
+ 198 602 lineto
+ 198 598 lineto
+ 200 598 lineto
+ 200 592 lineto
+ 202 586 lineto
+ 204 584 lineto
+ 208 580 lineto
+ 210 578 lineto
+ 216 576 lineto
+ 282 576 lineto
+ 288 578 lineto
+ 290 580 lineto
+ 294 584 lineto
+closepath
+%end path
+fill
+%new path
+ 326 584 moveto
+ 328 586 lineto
+ 330 592 lineto
+ 330 602 lineto
+ 328 608 lineto
+ 326 612 lineto
+ 322 616 lineto
+ 318 618 lineto
+ 312 620 lineto
+ 306 620 lineto
+ 306 618 lineto
+ 274 618 lineto
+ 276 620 lineto
+ 270 618 lineto
+ 266 616 lineto
+ 262 612 lineto
+ 260 608 lineto
+ 258 602 lineto
+ 258 592 lineto
+ 260 586 lineto
+ 262 584 lineto
+ 266 580 lineto
+ 270 578 lineto
+ 276 576 lineto
+ 312 576 lineto
+ 318 578 lineto
+ 322 580 lineto
+ 326 584 lineto
+closepath
+%end path
+fill
+%new path
+ 204 216 moveto
+ 202 212 lineto
+ 200 206 lineto
+ 198 206 lineto
+ 198 200 lineto
+ 200 202 lineto
+ 200 196 lineto
+ 202 190 lineto
+ 204 186 lineto
+ 208 182 lineto
+ 210 180 lineto
+ 288 180 lineto
+ 290 182 lineto
+ 294 186 lineto
+ 296 190 lineto
+ 298 196 lineto
+ 300 196 lineto
+ 300 202 lineto
+ 298 200 lineto
+ 298 206 lineto
+ 296 212 lineto
+ 294 216 lineto
+ 290 220 lineto
+ 288 222 lineto
+ 282 224 lineto
+ 276 224 lineto
+ 274 222 lineto
+ 216 222 lineto
+ 216 224 lineto
+ 210 222 lineto
+ 208 220 lineto
+ 204 216 lineto
+closepath
+%end path
+fill
+%new path
+ 262 216 moveto
+ 260 212 lineto
+ 258 206 lineto
+ 258 196 lineto
+ 260 190 lineto
+ 262 186 lineto
+ 266 182 lineto
+ 270 180 lineto
+ 358 180 lineto
+ 362 182 lineto
+ 366 186 lineto
+ 368 190 lineto
+ 370 196 lineto
+ 370 206 lineto
+ 368 212 lineto
+ 366 216 lineto
+ 362 220 lineto
+ 358 222 lineto
+ 352 224 lineto
+ 346 224 lineto
+ 346 222 lineto
+ 274 222 lineto
+ 276 224 lineto
+ 270 222 lineto
+ 266 220 lineto
+ 262 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_G
+(
+newpath
+%new path
+ 470 468 moveto
+ 486 468 lineto
+ 492 470 lineto
+ 496 472 lineto
+ 500 476 lineto
+ 502 478 lineto
+ 504 484 lineto
+ 504 490 lineto
+ 502 492 lineto
+ 500 502 498 514 494 524 curveto
+ 496 524 lineto
+ 494 530 lineto
+ 492 530 lineto
+ 488 544 484 554 476 564 curveto
+ 478 564 lineto
+ 476 566 lineto
+ 474 568 lineto
+ 470 576 464 582 458 588 curveto
+ 460 586 lineto
+ 456 590 lineto
+ 454 592 lineto
+ 448 598 442 602 436 606 curveto
+ 438 606 lineto
+ 434 608 lineto
+ 426 614 418 618 408 620 curveto
+ 410 620 lineto
+ 404 622 lineto
+ 402 622 lineto
+ 392 626 380 628 370 628 curveto
+ 364 628 lineto
+ 364 626 lineto
+ 352 626 342 624 332 620 curveto
+ 334 622 lineto
+ 328 620 lineto
+ 326 618 lineto
+ 318 616 308 612 300 606 curveto
+ 298 604 lineto
+ 296 604 lineto
+ 290 598 282 592 276 586 curveto
+ 276 588 lineto
+ 272 584 lineto
+ 272 582 lineto
+ 264 574 258 566 252 558 curveto
+ 250 556 250 556 250 556 curveto
+ 252 558 lineto
+ 250 554 lineto
+ 248 554 lineto
+ 238 536 228 518 222 498 curveto
+ 224 500 lineto
+ 222 494 lineto
+ 220 492 lineto
+ 210 464 206 432 206 402 curveto
+ 208 402 lineto
+ 208 396 lineto
+ 208 364 212 332 222 304 curveto
+ 224 298 lineto
+ 230 278 240 260 250 242 curveto
+ 250 244 lineto
+ 252 240 lineto
+ 252 240 252 240 254 238 curveto
+ 260 230 266 222 274 214 curveto
+ 272 214 lineto
+ 276 210 lineto
+ 278 210 lineto
+ 284 204 292 198 298 192 curveto
+ 298 194 lineto
+ 300 192 lineto
+ 302 190 lineto
+ 310 184 320 180 328 180 curveto
+ 334 178 lineto
+ 344 174 354 172 366 172 curveto
+ 370 172 lineto
+ 372 174 lineto
+ 382 174 392 176 402 178 curveto
+ 400 178 lineto
+ 406 180 lineto
+ 408 180 lineto
+ 416 182 422 186 430 190 curveto
+ 428 188 lineto
+ 432 190 lineto
+ 432 192 lineto
+ 438 196 444 200 448 204 curveto
+ 452 208 lineto
+ 458 214 464 222 468 228 curveto
+ 470 230 lineto
+ 470 232 lineto
+ 478 244 486 258 490 272 curveto
+ 492 278 lineto
+ 500 302 504 328 504 354 curveto
+ 504 358 lineto
+ 502 364 lineto
+ 500 368 lineto
+ 496 372 lineto
+ 492 374 lineto
+ 486 376 lineto
+ 480 376 lineto
+ 480 374 lineto
+ 468 374 lineto
+ 470 376 lineto
+ 464 374 lineto
+ 460 372 lineto
+ 456 368 lineto
+ 454 364 lineto
+ 452 358 lineto
+ 452 330 448 302 440 276 curveto
+ 440 278 lineto
+ 442 284 lineto
+ 442 282 lineto
+ 438 268 432 256 424 244 curveto
+ 424 246 lineto
+ 426 248 lineto
+ 422 242 416 236 412 230 curveto
+ 412 232 lineto
+ 410 228 lineto
+ 408 222 lineto
+ 408 216 lineto
+ 412 232 lineto
+ 432 240 lineto
+ 426 240 lineto
+ 420 238 lineto
+ 416 236 lineto
+ 416 234 lineto
+ 412 230 406 226 402 224 curveto
+ 404 224 lineto
+ 406 226 lineto
+ 400 222 392 218 386 216 curveto
+ 388 218 lineto
+ 394 220 lineto
+ 392 218 lineto
+ 384 216 376 214 366 214 curveto
+ 366 216 lineto
+ 360 214 lineto
+ 358 212 lineto
+ 354 208 lineto
+ 372 216 lineto
+ 386 208 lineto
+ 382 212 lineto
+ 378 214 lineto
+ 372 216 lineto
+ 362 216 352 218 344 220 curveto
+ 350 218 lineto
+ 342 222 332 226 326 230 curveto
+ 330 228 lineto
+ 328 228 lineto
+ 322 234 314 240 308 246 curveto
+ 310 244 lineto
+ 306 246 lineto
+ 300 248 lineto
+ 314 240 lineto
+ 318 232 lineto
+ 316 238 lineto
+ 314 240 lineto
+ 312 242 lineto
+ 304 248 298 258 292 266 curveto
+ 294 262 lineto
+ 294 264 lineto
+ 292 264 lineto
+ 282 282 274 298 268 316 curveto
+ 270 316 lineto
+ 272 310 lineto
+ 270 310 lineto
+ 260 340 256 372 256 404 curveto
+ 258 402 lineto
+ 256 408 lineto
+ 254 412 lineto
+ 258 402 lineto
+ 254 388 lineto
+ 256 390 lineto
+ 258 396 lineto
+ 258 398 lineto
+ 258 428 262 460 272 488 curveto
+ 270 482 lineto
+ 276 502 284 518 296 536 curveto
+ 294 536 lineto
+ 292 532 lineto
+ 294 534 lineto
+ 300 542 306 550 314 558 curveto
+ 316 560 lineto
+ 318 566 lineto
+ 318 572 lineto
+ 314 558 lineto
+ 294 550 lineto
+ 300 550 lineto
+ 306 552 lineto
+ 310 554 lineto
+ 316 560 324 566 330 570 curveto
+ 326 568 lineto
+ 328 568 lineto
+ 336 574 344 578 352 582 curveto
+ 352 580 lineto
+ 346 578 lineto
+ 346 580 lineto
+ 356 582 364 584 374 584 curveto
+ 380 586 lineto
+ 382 588 lineto
+ 386 592 lineto
+ 368 584 lineto
+ 354 592 lineto
+ 358 588 lineto
+ 362 586 lineto
+ 368 584 lineto
+ 368 582 lineto
+ 378 582 388 580 396 578 curveto
+ 394 578 lineto
+ 388 580 lineto
+ 390 580 lineto
+ 398 578 404 574 410 570 curveto
+ 406 572 lineto
+ 408 572 lineto
+ 414 568 418 564 424 558 curveto
+ 422 560 lineto
+ 426 558 lineto
+ 432 556 lineto
+ 418 564 lineto
+ 414 572 lineto
+ 416 566 lineto
+ 418 564 lineto
+ 420 562 lineto
+ 424 558 430 552 434 544 curveto
+ 432 546 lineto
+ 430 548 lineto
+ 432 548 lineto
+ 438 538 444 526 448 514 curveto
+ 446 520 lineto
+ 450 508 452 496 454 484 curveto
+ 452 484 lineto
+ 454 478 lineto
+ 456 476 lineto
+ 460 472 lineto
+ 464 470 lineto
+ 470 468 lineto
+closepath
+%end path
+fill
+%new path
+ 500 476 moveto
+ 502 478 lineto
+ 504 484 lineto
+ 504 610 lineto
+ 502 616 lineto
+ 500 620 lineto
+ 496 624 lineto
+ 492 626 lineto
+ 486 628 lineto
+ 480 628 lineto
+ 480 626 lineto
+ 476 626 lineto
+ 476 628 lineto
+ 470 626 lineto
+ 468 624 lineto
+ 464 620 lineto
+ 462 616 lineto
+ 460 616 lineto
+ 452 598 444 580 436 562 curveto
+ 436 564 lineto
+ 434 558 lineto
+ 434 552 lineto
+ 436 546 lineto
+ 438 544 lineto
+ 444 534 450 524 454 512 curveto
+ 452 512 lineto
+ 450 518 lineto
+ 452 518 lineto
+ 456 506 458 494 458 484 curveto
+ 460 478 lineto
+ 462 476 lineto
+ 466 472 lineto
+ 468 470 lineto
+ 474 468 lineto
+ 486 468 lineto
+ 492 470 lineto
+ 496 472 lineto
+ 500 476 lineto
+closepath
+%end path
+fill
+%new path
+ 456 368 moveto
+ 454 364 lineto
+ 452 358 lineto
+ 452 196 lineto
+ 454 190 lineto
+ 456 188 lineto
+ 460 184 lineto
+ 464 182 lineto
+ 470 180 lineto
+ 486 180 lineto
+ 492 182 lineto
+ 496 184 lineto
+ 500 188 lineto
+ 502 190 lineto
+ 504 196 lineto
+ 504 358 lineto
+ 502 364 lineto
+ 500 368 lineto
+ 496 372 lineto
+ 492 374 lineto
+ 486 376 lineto
+ 480 376 lineto
+ 480 374 lineto
+ 468 374 lineto
+ 470 376 lineto
+ 464 374 lineto
+ 460 372 lineto
+ 456 368 lineto
+closepath
+%end path
+fill
+%new path
+ 494 340 moveto
+ 496 342 lineto
+ 498 348 lineto
+ 498 358 lineto
+ 496 364 lineto
+ 494 368 lineto
+ 490 372 lineto
+ 486 374 lineto
+ 480 376 lineto
+ 474 376 lineto
+ 474 374 lineto
+ 408 374 lineto
+ 410 376 lineto
+ 404 374 lineto
+ 400 372 lineto
+ 396 368 lineto
+ 394 364 lineto
+ 392 358 lineto
+ 392 348 lineto
+ 394 342 lineto
+ 396 340 lineto
+ 400 336 lineto
+ 404 334 lineto
+ 410 332 lineto
+ 480 332 lineto
+ 486 334 lineto
+ 490 336 lineto
+ 494 340 lineto
+closepath
+%end path
+fill
+%new path
+ 532 340 moveto
+ 534 342 lineto
+ 536 348 lineto
+ 538 350 lineto
+ 538 354 lineto
+ 536 352 lineto
+ 536 358 lineto
+ 534 364 lineto
+ 532 368 lineto
+ 528 372 lineto
+ 526 374 lineto
+ 520 376 lineto
+ 514 376 lineto
+ 512 374 lineto
+ 474 374 lineto
+ 474 376 lineto
+ 468 374 lineto
+ 466 372 lineto
+ 462 368 lineto
+ 460 364 lineto
+ 458 358 lineto
+ 456 358 lineto
+ 456 354 lineto
+ 458 354 lineto
+ 458 348 lineto
+ 460 342 lineto
+ 462 340 lineto
+ 466 336 lineto
+ 468 334 lineto
+ 474 332 lineto
+ 520 332 lineto
+ 526 334 lineto
+ 528 336 lineto
+ 532 340 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_H
+(
+newpath
+%new path
+ 246 612 moveto
+ 244 608 lineto
+ 242 602 lineto
+ 240 602 lineto
+ 240 202 lineto
+ 242 202 lineto
+ 242 196 lineto
+ 244 190 lineto
+ 246 188 lineto
+ 250 184 lineto
+ 252 182 lineto
+ 258 180 lineto
+ 274 180 lineto
+ 280 182 lineto
+ 284 184 lineto
+ 288 188 lineto
+ 290 190 lineto
+ 292 196 lineto
+ 292 602 lineto
+ 290 608 lineto
+ 288 612 lineto
+ 284 616 lineto
+ 280 618 lineto
+ 274 620 lineto
+ 268 620 lineto
+ 268 618 lineto
+ 258 618 lineto
+ 258 620 lineto
+ 252 618 lineto
+ 250 616 lineto
+ 246 612 lineto
+closepath
+%end path
+fill
+%new path
+ 448 612 moveto
+ 446 608 lineto
+ 444 602 lineto
+ 444 196 lineto
+ 446 190 lineto
+ 448 188 lineto
+ 452 184 lineto
+ 456 182 lineto
+ 462 180 lineto
+ 478 180 lineto
+ 484 182 lineto
+ 488 184 lineto
+ 492 188 lineto
+ 494 190 lineto
+ 496 196 lineto
+ 496 602 lineto
+ 494 608 lineto
+ 492 612 lineto
+ 488 616 lineto
+ 484 618 lineto
+ 478 620 lineto
+ 472 620 lineto
+ 472 618 lineto
+ 460 618 lineto
+ 462 620 lineto
+ 456 618 lineto
+ 452 616 lineto
+ 448 612 lineto
+closepath
+%end path
+fill
+%new path
+ 268 386 moveto
+ 470 386 lineto
+ 470 430 lineto
+ 468 428 lineto
+ 266 428 lineto
+ 266 384 lineto
+closepath
+%end path
+fill
+%new path
+ 282 584 moveto
+ 284 586 lineto
+ 286 592 lineto
+ 288 594 lineto
+ 288 598 lineto
+ 286 596 lineto
+ 286 602 lineto
+ 284 608 lineto
+ 282 612 lineto
+ 278 616 lineto
+ 276 618 lineto
+ 270 620 lineto
+ 264 620 lineto
+ 262 618 lineto
+ 210 618 lineto
+ 210 620 lineto
+ 204 618 lineto
+ 202 616 lineto
+ 198 612 lineto
+ 196 608 lineto
+ 194 602 lineto
+ 192 602 lineto
+ 192 598 lineto
+ 194 598 lineto
+ 194 592 lineto
+ 196 586 lineto
+ 198 584 lineto
+ 202 580 lineto
+ 204 578 lineto
+ 210 576 lineto
+ 270 576 lineto
+ 276 578 lineto
+ 278 580 lineto
+ 282 584 lineto
+closepath
+%end path
+fill
+%new path
+ 334 584 moveto
+ 336 586 lineto
+ 338 592 lineto
+ 340 594 lineto
+ 340 598 lineto
+ 338 596 lineto
+ 338 602 lineto
+ 336 608 lineto
+ 334 612 lineto
+ 330 616 lineto
+ 328 618 lineto
+ 322 620 lineto
+ 316 620 lineto
+ 314 618 lineto
+ 262 618 lineto
+ 264 620 lineto
+ 258 618 lineto
+ 254 616 lineto
+ 250 612 lineto
+ 248 608 lineto
+ 246 602 lineto
+ 246 592 lineto
+ 248 586 lineto
+ 250 584 lineto
+ 254 580 lineto
+ 258 578 lineto
+ 264 576 lineto
+ 322 576 lineto
+ 328 578 lineto
+ 330 580 lineto
+ 334 584 lineto
+closepath
+%end path
+fill
+%new path
+ 198 216 moveto
+ 196 212 lineto
+ 194 206 lineto
+ 192 206 lineto
+ 192 200 lineto
+ 194 202 lineto
+ 194 196 lineto
+ 196 190 lineto
+ 198 186 lineto
+ 202 182 lineto
+ 204 180 lineto
+ 276 180 lineto
+ 278 182 lineto
+ 282 186 lineto
+ 284 190 lineto
+ 286 196 lineto
+ 288 196 lineto
+ 288 202 lineto
+ 286 200 lineto
+ 286 206 lineto
+ 284 212 lineto
+ 282 216 lineto
+ 278 220 lineto
+ 276 222 lineto
+ 270 224 lineto
+ 264 224 lineto
+ 262 222 lineto
+ 210 222 lineto
+ 210 224 lineto
+ 204 222 lineto
+ 202 220 lineto
+ 198 216 lineto
+closepath
+%end path
+fill
+%new path
+ 250 216 moveto
+ 248 212 lineto
+ 246 206 lineto
+ 246 196 lineto
+ 248 190 lineto
+ 250 186 lineto
+ 254 182 lineto
+ 258 180 lineto
+ 328 180 lineto
+ 330 182 lineto
+ 334 186 lineto
+ 336 190 lineto
+ 338 196 lineto
+ 340 196 lineto
+ 340 202 lineto
+ 338 200 lineto
+ 338 206 lineto
+ 336 212 lineto
+ 334 216 lineto
+ 330 220 lineto
+ 328 222 lineto
+ 322 224 lineto
+ 316 224 lineto
+ 314 222 lineto
+ 262 222 lineto
+ 264 224 lineto
+ 258 222 lineto
+ 254 220 lineto
+ 250 216 lineto
+closepath
+%end path
+fill
+%new path
+ 486 584 moveto
+ 488 586 lineto
+ 490 592 lineto
+ 490 602 lineto
+ 488 608 lineto
+ 486 612 lineto
+ 482 616 lineto
+ 478 618 lineto
+ 472 620 lineto
+ 466 620 lineto
+ 466 618 lineto
+ 414 618 lineto
+ 414 620 lineto
+ 408 618 lineto
+ 406 616 lineto
+ 402 612 lineto
+ 400 608 lineto
+ 398 602 lineto
+ 396 602 lineto
+ 396 598 lineto
+ 398 598 lineto
+ 398 592 lineto
+ 400 586 lineto
+ 402 584 lineto
+ 406 580 lineto
+ 408 578 lineto
+ 414 576 lineto
+ 472 576 lineto
+ 478 578 lineto
+ 482 580 lineto
+ 486 584 lineto
+closepath
+%end path
+fill
+%new path
+ 538 584 moveto
+ 540 586 lineto
+ 542 592 lineto
+ 544 594 lineto
+ 544 598 lineto
+ 542 596 lineto
+ 542 602 lineto
+ 540 608 lineto
+ 538 612 lineto
+ 534 616 lineto
+ 532 618 lineto
+ 526 620 lineto
+ 520 620 lineto
+ 518 618 lineto
+ 466 618 lineto
+ 466 620 lineto
+ 460 618 lineto
+ 458 616 lineto
+ 454 612 lineto
+ 452 608 lineto
+ 450 602 lineto
+ 448 602 lineto
+ 448 598 lineto
+ 450 598 lineto
+ 450 592 lineto
+ 452 586 lineto
+ 454 584 lineto
+ 458 580 lineto
+ 460 578 lineto
+ 466 576 lineto
+ 526 576 lineto
+ 532 578 lineto
+ 534 580 lineto
+ 538 584 lineto
+closepath
+%end path
+fill
+%new path
+ 402 216 moveto
+ 400 212 lineto
+ 398 206 lineto
+ 396 206 lineto
+ 396 200 lineto
+ 398 202 lineto
+ 398 196 lineto
+ 400 190 lineto
+ 402 186 lineto
+ 406 182 lineto
+ 408 180 lineto
+ 478 180 lineto
+ 482 182 lineto
+ 486 186 lineto
+ 488 190 lineto
+ 490 196 lineto
+ 490 206 lineto
+ 488 212 lineto
+ 486 216 lineto
+ 482 220 lineto
+ 478 222 lineto
+ 472 224 lineto
+ 466 224 lineto
+ 466 222 lineto
+ 414 222 lineto
+ 414 224 lineto
+ 408 222 lineto
+ 406 220 lineto
+ 402 216 lineto
+closepath
+%end path
+fill
+%new path
+ 454 216 moveto
+ 452 212 lineto
+ 450 206 lineto
+ 448 206 lineto
+ 448 200 lineto
+ 450 202 lineto
+ 450 196 lineto
+ 452 190 lineto
+ 454 186 lineto
+ 458 182 lineto
+ 460 180 lineto
+ 532 180 lineto
+ 534 182 lineto
+ 538 186 lineto
+ 540 190 lineto
+ 542 196 lineto
+ 544 196 lineto
+ 544 202 lineto
+ 542 200 lineto
+ 542 206 lineto
+ 540 212 lineto
+ 538 216 lineto
+ 534 220 lineto
+ 532 222 lineto
+ 526 224 lineto
+ 520 224 lineto
+ 518 222 lineto
+ 466 222 lineto
+ 466 224 lineto
+ 460 222 lineto
+ 458 220 lineto
+ 454 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_I
+(
+newpath
+%new path
+ 348 612 moveto
+ 346 608 lineto
+ 344 602 lineto
+ 342 602 lineto
+ 342 202 lineto
+ 344 202 lineto
+ 344 196 lineto
+ 346 190 lineto
+ 348 188 lineto
+ 352 184 lineto
+ 354 182 lineto
+ 360 180 lineto
+ 376 180 lineto
+ 382 182 lineto
+ 386 184 lineto
+ 390 188 lineto
+ 392 190 lineto
+ 394 196 lineto
+ 394 602 lineto
+ 392 608 lineto
+ 390 612 lineto
+ 386 616 lineto
+ 382 618 lineto
+ 376 620 lineto
+ 370 620 lineto
+ 370 618 lineto
+ 360 618 lineto
+ 360 620 lineto
+ 354 618 lineto
+ 352 616 lineto
+ 348 612 lineto
+closepath
+%end path
+fill
+%new path
+ 384 584 moveto
+ 386 586 lineto
+ 388 592 lineto
+ 390 594 lineto
+ 390 598 lineto
+ 388 596 lineto
+ 388 602 lineto
+ 386 608 lineto
+ 384 612 lineto
+ 380 616 lineto
+ 378 618 lineto
+ 372 620 lineto
+ 366 620 lineto
+ 364 618 lineto
+ 252 618 lineto
+ 252 620 lineto
+ 246 618 lineto
+ 244 616 lineto
+ 240 612 lineto
+ 238 608 lineto
+ 236 602 lineto
+ 234 602 lineto
+ 234 598 lineto
+ 236 598 lineto
+ 236 592 lineto
+ 238 586 lineto
+ 240 584 lineto
+ 244 580 lineto
+ 246 578 lineto
+ 252 576 lineto
+ 372 576 lineto
+ 378 578 lineto
+ 380 580 lineto
+ 384 584 lineto
+closepath
+%end path
+fill
+%new path
+ 496 584 moveto
+ 498 586 lineto
+ 500 592 lineto
+ 502 594 lineto
+ 502 598 lineto
+ 500 596 lineto
+ 500 602 lineto
+ 498 608 lineto
+ 496 612 lineto
+ 492 616 lineto
+ 490 618 lineto
+ 484 620 lineto
+ 478 620 lineto
+ 476 618 lineto
+ 364 618 lineto
+ 366 620 lineto
+ 360 618 lineto
+ 356 616 lineto
+ 352 612 lineto
+ 350 608 lineto
+ 348 602 lineto
+ 348 592 lineto
+ 350 586 lineto
+ 352 584 lineto
+ 356 580 lineto
+ 360 578 lineto
+ 366 576 lineto
+ 484 576 lineto
+ 490 578 lineto
+ 492 580 lineto
+ 496 584 lineto
+closepath
+%end path
+fill
+%new path
+ 240 216 moveto
+ 238 212 lineto
+ 236 206 lineto
+ 234 206 lineto
+ 234 200 lineto
+ 236 202 lineto
+ 236 196 lineto
+ 238 190 lineto
+ 240 186 lineto
+ 244 182 lineto
+ 246 180 lineto
+ 378 180 lineto
+ 380 182 lineto
+ 384 186 lineto
+ 386 190 lineto
+ 388 196 lineto
+ 390 196 lineto
+ 390 202 lineto
+ 388 200 lineto
+ 388 206 lineto
+ 386 212 lineto
+ 384 216 lineto
+ 380 220 lineto
+ 378 222 lineto
+ 372 224 lineto
+ 366 224 lineto
+ 364 222 lineto
+ 252 222 lineto
+ 252 224 lineto
+ 246 222 lineto
+ 244 220 lineto
+ 240 216 lineto
+closepath
+%end path
+fill
+%new path
+ 352 216 moveto
+ 350 212 lineto
+ 348 206 lineto
+ 348 196 lineto
+ 350 190 lineto
+ 352 186 lineto
+ 356 182 lineto
+ 360 180 lineto
+ 490 180 lineto
+ 492 182 lineto
+ 496 186 lineto
+ 498 190 lineto
+ 500 196 lineto
+ 502 196 lineto
+ 502 202 lineto
+ 500 200 lineto
+ 500 206 lineto
+ 498 212 lineto
+ 496 216 lineto
+ 492 220 lineto
+ 490 222 lineto
+ 484 224 lineto
+ 478 224 lineto
+ 476 222 lineto
+ 364 222 lineto
+ 366 224 lineto
+ 360 222 lineto
+ 356 220 lineto
+ 352 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_J
+(
+newpath
+%new path
+ 426 612 moveto
+ 424 608 lineto
+ 422 602 lineto
+ 422 274 lineto
+ 422 266 420 260 418 252 curveto
+ 420 254 lineto
+ 422 260 lineto
+ 420 258 lineto
+ 418 252 416 248 412 242 curveto
+ 414 244 lineto
+ 416 246 lineto
+ 414 246 lineto
+ 412 240 408 236 404 234 curveto
+ 406 234 lineto
+ 404 232 lineto
+ 402 226 lineto
+ 402 220 lineto
+ 406 234 lineto
+ 424 242 lineto
+ 418 242 lineto
+ 412 240 lineto
+ 410 238 lineto
+ 408 238 lineto
+ 406 236 406 234 404 232 curveto
+ 400 230 398 228 396 226 curveto
+ 396 228 lineto
+ 400 230 lineto
+ 398 228 lineto
+ 392 224 384 220 376 218 curveto
+ 382 220 lineto
+ 370 216 360 214 348 214 curveto
+ 348 216 lineto
+ 342 214 lineto
+ 340 212 lineto
+ 336 208 lineto
+ 334 204 lineto
+ 332 198 lineto
+ 330 198 lineto
+ 330 192 lineto
+ 332 194 lineto
+ 332 188 lineto
+ 334 182 lineto
+ 336 180 lineto
+ 340 176 lineto
+ 342 174 lineto
+ 348 172 lineto
+ 354 172 lineto
+ 356 174 lineto
+ 370 174 382 176 396 180 curveto
+ 402 180 lineto
+ 410 184 418 188 426 192 curveto
+ 428 194 lineto
+ 430 194 lineto
+ 432 196 434 198 436 200 curveto
+ 440 202 442 204 444 206 curveto
+ 442 206 lineto
+ 446 210 lineto
+ 448 210 lineto
+ 452 214 456 218 458 222 curveto
+ 460 224 lineto
+ 460 226 lineto
+ 464 232 466 236 468 242 curveto
+ 470 248 lineto
+ 472 256 474 262 474 270 curveto
+ 474 602 lineto
+ 472 608 lineto
+ 470 612 lineto
+ 466 616 lineto
+ 462 618 lineto
+ 456 620 lineto
+ 450 620 lineto
+ 450 618 lineto
+ 438 618 lineto
+ 440 620 lineto
+ 434 618 lineto
+ 430 616 lineto
+ 426 612 lineto
+closepath
+%end path
+fill
+%new path
+ 464 584 moveto
+ 466 586 lineto
+ 468 592 lineto
+ 468 602 lineto
+ 466 608 lineto
+ 464 612 lineto
+ 460 616 lineto
+ 456 618 lineto
+ 450 620 lineto
+ 444 620 lineto
+ 444 618 lineto
+ 350 618 lineto
+ 352 620 lineto
+ 346 618 lineto
+ 342 616 lineto
+ 338 612 lineto
+ 336 608 lineto
+ 334 602 lineto
+ 334 592 lineto
+ 336 586 lineto
+ 338 584 lineto
+ 342 580 lineto
+ 346 578 lineto
+ 352 576 lineto
+ 450 576 lineto
+ 456 578 lineto
+ 460 580 lineto
+ 464 584 lineto
+closepath
+%end path
+fill
+%new path
+ 520 584 moveto
+ 522 586 lineto
+ 524 592 lineto
+ 524 602 lineto
+ 522 608 lineto
+ 520 612 lineto
+ 516 616 lineto
+ 512 618 lineto
+ 506 620 lineto
+ 500 620 lineto
+ 500 618 lineto
+ 444 618 lineto
+ 444 620 lineto
+ 438 618 lineto
+ 436 616 lineto
+ 432 612 lineto
+ 430 608 lineto
+ 428 602 lineto
+ 426 602 lineto
+ 426 598 lineto
+ 428 598 lineto
+ 428 592 lineto
+ 430 586 lineto
+ 432 584 lineto
+ 436 580 lineto
+ 438 578 lineto
+ 444 576 lineto
+ 506 576 lineto
+ 512 578 lineto
+ 516 580 lineto
+ 520 584 lineto
+closepath
+%end path
+fill
+%new path
+ 368 208 moveto
+ 364 212 lineto
+ 360 214 lineto
+ 354 216 lineto
+ 338 216 322 218 308 224 curveto
+ 308 222 lineto
+ 314 220 lineto
+ 314 222 lineto
+ 306 224 298 228 292 232 curveto
+ 292 230 lineto
+ 296 228 lineto
+ 294 230 lineto
+ 292 232 288 234 286 236 curveto
+ 284 238 lineto
+ 278 240 lineto
+ 290 232 lineto
+ 294 222 lineto
+ 292 228 lineto
+ 290 232 lineto
+ 288 236 286 238 284 240 curveto
+ 286 236 lineto
+ 286 238 lineto
+ 284 240 282 244 280 248 curveto
+ 282 246 lineto
+ 284 240 lineto
+ 282 242 lineto
+ 280 246 280 252 280 256 curveto
+ 282 256 lineto
+ 280 262 lineto
+ 278 264 lineto
+ 274 268 lineto
+ 270 270 lineto
+ 264 272 lineto
+ 248 272 lineto
+ 242 270 lineto
+ 238 268 lineto
+ 234 264 lineto
+ 232 262 lineto
+ 230 256 lineto
+ 230 250 lineto
+ 232 248 lineto
+ 232 242 232 238 234 232 curveto
+ 234 234 lineto
+ 236 228 lineto
+ 236 226 lineto
+ 238 222 240 220 242 216 curveto
+ 240 216 lineto
+ 242 214 lineto
+ 244 212 lineto
+ 246 210 248 208 250 204 curveto
+ 250 206 lineto
+ 254 202 lineto
+ 254 200 lineto
+ 258 198 260 196 264 192 curveto
+ 264 194 lineto
+ 266 192 lineto
+ 268 190 lineto
+ 274 186 282 182 290 180 curveto
+ 296 180 lineto
+ 312 174 332 172 350 172 curveto
+ 354 172 lineto
+ 360 174 lineto
+ 364 176 lineto
+ 368 180 lineto
+ 370 182 lineto
+ 372 188 lineto
+ 372 198 lineto
+ 370 204 lineto
+ 368 208 lineto
+closepath
+%end path
+fill
+%new path
+ 296 256 moveto
+ 294 256 lineto
+ 294 260 lineto
+ 292 266 lineto
+ 292 268 290 268 290 270 curveto
+ 292 268 lineto
+ 290 272 lineto
+ 288 272 lineto
+ 288 272 288 274 286 274 curveto
+ 288 272 lineto
+ 284 276 lineto
+ 282 278 lineto
+ 282 278 lineto
+ 280 280 lineto
+ 278 282 lineto
+ 276 282 lineto
+ 270 284 lineto
+ 268 286 266 286 264 286 curveto
+ 266 284 lineto
+ 258 284 lineto
+ 258 284 256 284 254 282 curveto
+ 256 284 lineto
+ 250 282 lineto
+ 248 280 lineto
+ 246 280 lineto
+ 244 278 lineto
+ 242 278 lineto
+ 242 276 lineto
+ 238 272 lineto
+ 236 272 236 270 236 270 curveto
+ 236 272 lineto
+ 234 268 lineto
+ 234 266 232 266 232 264 curveto
+ 234 266 lineto
+ 232 260 lineto
+ 230 258 lineto
+ 230 250 lineto
+ 232 244 lineto
+ 234 240 lineto
+ 236 240 lineto
+ 240 236 244 232 248 228 curveto
+ 246 228 lineto
+ 250 224 lineto
+ 254 222 lineto
+ 260 220 lineto
+ 266 220 lineto
+ 266 222 lineto
+ 270 222 lineto
+ 276 224 lineto
+ 278 224 lineto
+ 278 224 280 224 280 226 curveto
+ 280 224 lineto
+ 282 226 lineto
+ 284 228 lineto
+ 288 232 lineto
+ 290 234 290 234 290 234 curveto
+ 292 236 lineto
+ 292 238 lineto
+ 292 238 294 240 294 240 curveto
+ 292 240 lineto
+ 294 246 lineto
+ 296 246 lineto
+ 296 256 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_K
+(
+newpath
+%new path
+ 248 612 moveto
+ 246 608 lineto
+ 244 602 lineto
+ 242 602 lineto
+ 242 202 lineto
+ 244 202 lineto
+ 244 196 lineto
+ 246 190 lineto
+ 248 188 lineto
+ 252 184 lineto
+ 254 182 lineto
+ 260 180 lineto
+ 266 180 lineto
+ 272 182 lineto
+ 276 184 lineto
+ 280 188 lineto
+ 282 190 lineto
+ 284 196 lineto
+ 284 602 lineto
+ 282 608 lineto
+ 280 612 lineto
+ 276 616 lineto
+ 272 618 lineto
+ 266 620 lineto
+ 260 620 lineto
+ 260 620 lineto
+ 254 618 lineto
+ 252 616 lineto
+ 248 612 lineto
+closepath
+%end path
+fill
+%new path
+ 264 294 moveto
+ 346 396 426 498 508 600 curveto
+ 510 602 510 606 510 608 curveto
+ 508 608 lineto
+ 508 610 506 614 504 616 curveto
+ 502 618 500 620 496 620 curveto
+ 496 618 lineto
+ 484 618 lineto
+ 476 618 470 616 464 610 curveto
+ 464 610 464 608 462 608 curveto
+ 396 524 328 440 262 356 curveto
+ 262 292 lineto
+closepath
+%end path
+fill
+%new path
+ 340 422 moveto
+ 384 344 428 266 472 188 curveto
+ 474 186 474 186 476 184 curveto
+ 480 180 484 180 490 180 curveto
+ 502 180 lineto
+ 506 180 508 182 510 184 curveto
+ 514 186 514 190 514 194 curveto
+ 512 194 lineto
+ 512 200 lineto
+ 462 286 414 372 366 456 curveto
+ 366 454 lineto
+ 356 444 348 432 338 422 curveto
+closepath
+%end path
+fill
+%new path
+ 280 584 moveto
+ 282 586 lineto
+ 284 592 lineto
+ 284 598 lineto
+ 282 600 lineto
+ 282 604 lineto
+ 284 602 lineto
+ 282 608 lineto
+ 280 612 lineto
+ 276 616 lineto
+ 272 618 lineto
+ 266 620 lineto
+ 260 620 lineto
+ 260 618 lineto
+ 214 618 lineto
+ 214 620 lineto
+ 208 618 lineto
+ 206 616 lineto
+ 202 612 lineto
+ 200 608 lineto
+ 198 602 lineto
+ 196 602 lineto
+ 196 598 lineto
+ 198 598 lineto
+ 198 592 lineto
+ 200 586 lineto
+ 202 584 lineto
+ 206 580 lineto
+ 208 578 lineto
+ 214 576 lineto
+ 266 576 lineto
+ 272 578 lineto
+ 276 580 lineto
+ 280 584 lineto
+closepath
+%end path
+fill
+%new path
+ 324 584 moveto
+ 326 586 lineto
+ 328 592 lineto
+ 330 594 lineto
+ 330 598 lineto
+ 328 596 lineto
+ 328 602 lineto
+ 326 608 lineto
+ 324 612 lineto
+ 320 616 lineto
+ 318 618 lineto
+ 312 620 lineto
+ 306 620 lineto
+ 304 618 lineto
+ 260 618 lineto
+ 260 620 lineto
+ 254 618 lineto
+ 252 616 lineto
+ 248 612 lineto
+ 246 608 lineto
+ 244 602 lineto
+ 242 602 lineto
+ 242 598 lineto
+ 244 598 lineto
+ 244 592 lineto
+ 246 586 lineto
+ 248 584 lineto
+ 252 580 lineto
+ 254 578 lineto
+ 260 576 lineto
+ 312 576 lineto
+ 318 578 lineto
+ 320 580 lineto
+ 324 584 lineto
+closepath
+%end path
+fill
+%new path
+ 202 216 moveto
+ 200 212 lineto
+ 198 206 lineto
+ 196 206 lineto
+ 196 200 lineto
+ 198 202 lineto
+ 198 196 lineto
+ 200 190 lineto
+ 202 186 lineto
+ 206 182 lineto
+ 208 180 lineto
+ 272 180 lineto
+ 276 182 lineto
+ 280 186 lineto
+ 282 190 lineto
+ 284 196 lineto
+ 284 206 lineto
+ 282 212 lineto
+ 280 216 lineto
+ 276 220 lineto
+ 272 222 lineto
+ 266 224 lineto
+ 260 224 lineto
+ 260 222 lineto
+ 214 222 lineto
+ 214 224 lineto
+ 208 222 lineto
+ 206 220 lineto
+ 202 216 lineto
+closepath
+%end path
+fill
+%new path
+ 248 216 moveto
+ 246 212 lineto
+ 244 206 lineto
+ 244 196 lineto
+ 246 190 lineto
+ 248 186 lineto
+ 252 182 lineto
+ 254 180 lineto
+ 318 180 lineto
+ 320 182 lineto
+ 324 186 lineto
+ 326 190 lineto
+ 328 196 lineto
+ 330 196 lineto
+ 330 202 lineto
+ 328 200 lineto
+ 328 206 lineto
+ 326 212 lineto
+ 324 216 lineto
+ 320 220 lineto
+ 318 222 lineto
+ 312 224 lineto
+ 306 224 lineto
+ 304 222 lineto
+ 260 222 lineto
+ 260 224 lineto
+ 254 222 lineto
+ 252 220 lineto
+ 248 216 lineto
+closepath
+%end path
+fill
+%new path
+ 494 584 moveto
+ 496 586 496 586 498 588 curveto
+ 496 588 lineto
+ 498 590 lineto
+ 500 596 lineto
+ 500 602 lineto
+ 498 608 lineto
+ 496 612 lineto
+ 492 616 lineto
+ 490 618 lineto
+ 484 620 lineto
+ 478 620 lineto
+ 476 618 lineto
+ 422 618 lineto
+ 424 620 lineto
+ 418 618 lineto
+ 414 616 lineto
+ 410 612 lineto
+ 408 608 lineto
+ 406 602 lineto
+ 406 592 lineto
+ 408 586 lineto
+ 410 584 lineto
+ 414 580 lineto
+ 418 578 lineto
+ 424 576 lineto
+ 480 576 lineto
+ 486 578 lineto
+ 490 580 lineto
+ 494 584 lineto
+closepath
+%end path
+fill
+%new path
+ 524 584 moveto
+ 526 586 lineto
+ 528 592 lineto
+ 530 594 lineto
+ 530 598 lineto
+ 528 596 lineto
+ 528 602 lineto
+ 526 608 lineto
+ 524 612 lineto
+ 520 616 lineto
+ 518 618 lineto
+ 512 620 lineto
+ 506 620 lineto
+ 504 618 lineto
+ 476 618 lineto
+ 478 620 lineto
+ 472 618 lineto
+ 468 616 lineto
+ 464 612 lineto
+ 464 610 lineto
+ 462 608 462 608 460 606 curveto
+ 462 608 lineto
+ 460 604 lineto
+ 458 598 lineto
+ 458 592 lineto
+ 460 586 lineto
+ 462 584 lineto
+ 466 580 lineto
+ 468 578 lineto
+ 474 576 lineto
+ 512 576 lineto
+ 518 578 lineto
+ 520 580 lineto
+ 524 584 lineto
+closepath
+%end path
+fill
+%new path
+ 428 216 moveto
+ 426 212 lineto
+ 424 206 lineto
+ 422 206 lineto
+ 422 200 lineto
+ 424 202 lineto
+ 424 196 lineto
+ 426 190 lineto
+ 428 186 lineto
+ 432 182 lineto
+ 434 180 lineto
+ 498 180 lineto
+ 500 182 lineto
+ 504 186 lineto
+ 506 190 lineto
+ 508 196 lineto
+ 508 202 lineto
+ 506 208 lineto
+ 506 210 504 212 504 214 curveto
+ 504 212 lineto
+ 502 216 lineto
+ 498 220 lineto
+ 496 222 lineto
+ 490 224 lineto
+ 484 224 lineto
+ 482 222 lineto
+ 440 222 lineto
+ 440 224 lineto
+ 434 222 lineto
+ 432 220 lineto
+ 428 216 lineto
+closepath
+%end path
+fill
+%new path
+ 470 216 moveto
+ 468 212 lineto
+ 466 206 lineto
+ 466 200 lineto
+ 468 194 lineto
+ 470 194 lineto
+ 470 192 472 190 472 188 curveto
+ 470 190 lineto
+ 472 186 lineto
+ 476 182 lineto
+ 480 180 lineto
+ 526 180 lineto
+ 528 182 lineto
+ 532 186 lineto
+ 534 190 lineto
+ 536 196 lineto
+ 538 196 lineto
+ 538 202 lineto
+ 536 200 lineto
+ 536 206 lineto
+ 534 212 lineto
+ 532 216 lineto
+ 528 220 lineto
+ 526 222 lineto
+ 520 224 lineto
+ 514 224 lineto
+ 512 222 lineto
+ 482 222 lineto
+ 484 224 lineto
+ 478 222 lineto
+ 474 220 lineto
+ 470 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_L
+(
+newpath
+%new path
+ 262 612 moveto
+ 260 608 lineto
+ 258 602 lineto
+ 256 602 lineto
+ 256 202 lineto
+ 258 202 lineto
+ 258 196 lineto
+ 260 190 lineto
+ 262 188 lineto
+ 266 184 lineto
+ 268 182 lineto
+ 274 180 lineto
+ 290 180 lineto
+ 296 182 lineto
+ 300 184 lineto
+ 304 188 lineto
+ 306 190 lineto
+ 308 196 lineto
+ 308 602 lineto
+ 306 608 lineto
+ 304 612 lineto
+ 300 616 lineto
+ 296 618 lineto
+ 290 620 lineto
+ 284 620 lineto
+ 284 618 lineto
+ 274 618 lineto
+ 274 620 lineto
+ 268 618 lineto
+ 266 616 lineto
+ 262 612 lineto
+closepath
+%end path
+fill
+%new path
+ 484 294 moveto
+ 482 292 lineto
+ 480 286 lineto
+ 480 200 lineto
+ 484 216 lineto
+ 504 224 lineto
+ 498 224 lineto
+ 496 222 lineto
+ 278 222 lineto
+ 280 224 lineto
+ 274 222 lineto
+ 270 220 lineto
+ 266 216 lineto
+ 264 212 lineto
+ 262 206 lineto
+ 262 196 lineto
+ 264 190 lineto
+ 266 188 lineto
+ 270 184 lineto
+ 274 182 lineto
+ 280 180 lineto
+ 514 180 lineto
+ 520 182 lineto
+ 524 184 lineto
+ 528 188 lineto
+ 530 190 lineto
+ 532 196 lineto
+ 532 286 lineto
+ 530 292 lineto
+ 528 294 lineto
+ 524 298 lineto
+ 520 300 lineto
+ 514 302 lineto
+ 498 302 lineto
+ 492 300 lineto
+ 488 298 lineto
+ 484 294 lineto
+closepath
+%end path
+fill
+%new path
+ 298 584 moveto
+ 300 586 lineto
+ 302 592 lineto
+ 304 594 lineto
+ 304 598 lineto
+ 302 596 lineto
+ 302 602 lineto
+ 300 608 lineto
+ 298 612 lineto
+ 294 616 lineto
+ 292 618 lineto
+ 286 620 lineto
+ 280 620 lineto
+ 278 618 lineto
+ 218 618 lineto
+ 218 620 lineto
+ 212 618 lineto
+ 210 616 lineto
+ 206 612 lineto
+ 204 608 lineto
+ 202 602 lineto
+ 200 602 lineto
+ 200 598 lineto
+ 202 598 lineto
+ 202 592 lineto
+ 204 586 lineto
+ 206 584 lineto
+ 210 580 lineto
+ 212 578 lineto
+ 218 576 lineto
+ 286 576 lineto
+ 292 578 lineto
+ 294 580 lineto
+ 298 584 lineto
+closepath
+%end path
+fill
+%new path
+ 372 584 moveto
+ 374 586 lineto
+ 376 592 lineto
+ 378 594 lineto
+ 378 598 lineto
+ 376 596 lineto
+ 376 602 lineto
+ 374 608 lineto
+ 372 612 lineto
+ 368 616 lineto
+ 366 618 lineto
+ 360 620 lineto
+ 354 620 lineto
+ 352 618 lineto
+ 278 618 lineto
+ 280 620 lineto
+ 274 618 lineto
+ 270 616 lineto
+ 266 612 lineto
+ 264 608 lineto
+ 262 602 lineto
+ 262 592 lineto
+ 264 586 lineto
+ 266 584 lineto
+ 270 580 lineto
+ 274 578 lineto
+ 280 576 lineto
+ 360 576 lineto
+ 366 578 lineto
+ 368 580 lineto
+ 372 584 lineto
+closepath
+%end path
+fill
+%new path
+ 206 216 moveto
+ 204 212 lineto
+ 202 206 lineto
+ 200 206 lineto
+ 200 200 lineto
+ 202 202 lineto
+ 202 196 lineto
+ 204 190 lineto
+ 206 186 lineto
+ 210 182 lineto
+ 212 180 lineto
+ 292 180 lineto
+ 294 182 lineto
+ 298 186 lineto
+ 300 190 lineto
+ 302 196 lineto
+ 304 196 lineto
+ 304 202 lineto
+ 302 200 lineto
+ 302 206 lineto
+ 300 212 lineto
+ 298 216 lineto
+ 294 220 lineto
+ 292 222 lineto
+ 286 224 lineto
+ 280 224 lineto
+ 278 222 lineto
+ 218 222 lineto
+ 218 224 lineto
+ 212 222 lineto
+ 210 220 lineto
+ 206 216 lineto
+closepath
+%end path
+fill
+%new path
+ 266 216 moveto
+ 264 212 lineto
+ 262 206 lineto
+ 262 196 lineto
+ 264 190 lineto
+ 266 186 lineto
+ 270 182 lineto
+ 274 180 lineto
+ 324 180 lineto
+ 326 182 lineto
+ 330 186 lineto
+ 332 190 lineto
+ 334 196 lineto
+ 336 196 lineto
+ 336 202 lineto
+ 334 200 lineto
+ 334 206 lineto
+ 332 212 lineto
+ 330 216 lineto
+ 326 220 lineto
+ 324 222 lineto
+ 318 224 lineto
+ 312 224 lineto
+ 310 222 lineto
+ 278 222 lineto
+ 280 224 lineto
+ 274 222 lineto
+ 270 220 lineto
+ 266 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_M
+(
+newpath
+%new path
+ 234 612 moveto
+ 232 608 lineto
+ 230 602 lineto
+ 228 602 lineto
+ 228 202 lineto
+ 230 202 lineto
+ 230 196 lineto
+ 232 190 lineto
+ 234 188 lineto
+ 238 184 lineto
+ 240 182 lineto
+ 246 180 lineto
+ 252 180 lineto
+ 258 182 lineto
+ 262 184 lineto
+ 266 188 lineto
+ 268 190 lineto
+ 270 196 lineto
+ 270 602 lineto
+ 268 608 lineto
+ 266 612 lineto
+ 262 616 lineto
+ 258 618 lineto
+ 252 620 lineto
+ 246 620 lineto
+ 246 620 lineto
+ 240 618 lineto
+ 238 616 lineto
+ 234 612 lineto
+closepath
+%end path
+fill
+%new path
+ 470 612 moveto
+ 468 608 lineto
+ 466 602 lineto
+ 466 196 lineto
+ 468 190 lineto
+ 470 188 lineto
+ 474 184 lineto
+ 478 182 lineto
+ 484 180 lineto
+ 490 180 lineto
+ 496 182 lineto
+ 500 184 lineto
+ 504 188 lineto
+ 506 190 lineto
+ 508 196 lineto
+ 508 602 lineto
+ 506 608 lineto
+ 504 612 lineto
+ 500 616 lineto
+ 496 618 lineto
+ 490 620 lineto
+ 484 620 lineto
+ 484 618 lineto
+ 482 618 lineto
+ 484 620 lineto
+ 478 618 lineto
+ 474 616 lineto
+ 470 612 lineto
+closepath
+%end path
+fill
+%new path
+ 248 618 moveto
+ 242 612 240 604 240 598 curveto
+ 242 598 lineto
+ 242 590 246 582 252 576 curveto
+ 256 572 264 568 272 568 curveto
+ 272 552 318 418 342 344 curveto
+ 344 340 346 336 350 332 curveto
+ 354 328 362 324 370 324 curveto
+ 370 326 lineto
+ 372 326 lineto
+ 370 324 lineto
+ 364 324 lineto
+ 366 326 lineto
+ 368 326 lineto
+ 376 326 384 330 388 334 curveto
+ 392 338 394 342 396 346 curveto
+ 420 420 466 554 466 570 curveto
+ 474 570 482 574 486 578 curveto
+ 492 584 496 592 496 600 curveto
+ 494 600 lineto
+ 494 606 492 614 486 620 curveto
+ 486 618 lineto
+ 468 618 lineto
+ 460 618 452 614 446 610 curveto
+ 444 606 440 602 440 598 curveto
+ 414 524 368 386 368 374 curveto
+ 366 374 lineto
+ 366 376 lineto
+ 366 388 320 526 294 600 curveto
+ 294 604 290 608 288 612 curveto
+ 282 616 274 620 266 620 curveto
+ 266 618 lineto
+ 248 618 lineto
+closepath
+%end path
+fill
+%new path
+ 266 584 moveto
+ 268 586 lineto
+ 270 592 lineto
+ 270 598 lineto
+ 268 600 lineto
+ 268 604 lineto
+ 270 602 lineto
+ 268 608 lineto
+ 266 612 lineto
+ 262 616 lineto
+ 258 618 lineto
+ 252 620 lineto
+ 246 620 lineto
+ 246 618 lineto
+ 206 618 lineto
+ 208 620 lineto
+ 202 618 lineto
+ 198 616 lineto
+ 194 612 lineto
+ 192 608 lineto
+ 190 602 lineto
+ 190 592 lineto
+ 192 586 lineto
+ 194 584 lineto
+ 198 580 lineto
+ 202 578 lineto
+ 208 576 lineto
+ 252 576 lineto
+ 258 578 lineto
+ 262 580 lineto
+ 266 584 lineto
+closepath
+%end path
+fill
+%new path
+ 194 216 moveto
+ 192 212 lineto
+ 190 206 lineto
+ 190 196 lineto
+ 192 190 lineto
+ 194 186 lineto
+ 198 182 lineto
+ 202 180 lineto
+ 258 180 lineto
+ 262 182 lineto
+ 266 186 lineto
+ 268 190 lineto
+ 270 196 lineto
+ 270 206 lineto
+ 268 212 lineto
+ 266 216 lineto
+ 262 220 lineto
+ 258 222 lineto
+ 252 224 lineto
+ 246 224 lineto
+ 246 222 lineto
+ 206 222 lineto
+ 208 224 lineto
+ 202 222 lineto
+ 198 220 lineto
+ 194 216 lineto
+closepath
+%end path
+fill
+%new path
+ 234 216 moveto
+ 232 212 lineto
+ 230 206 lineto
+ 230 196 lineto
+ 232 190 lineto
+ 234 186 lineto
+ 238 182 lineto
+ 240 180 lineto
+ 296 180 lineto
+ 300 182 lineto
+ 304 186 lineto
+ 306 190 lineto
+ 308 196 lineto
+ 308 206 lineto
+ 306 212 lineto
+ 304 216 lineto
+ 300 220 lineto
+ 296 222 lineto
+ 290 224 lineto
+ 284 224 lineto
+ 284 222 lineto
+ 246 222 lineto
+ 246 224 lineto
+ 240 222 lineto
+ 238 220 lineto
+ 234 216 lineto
+closepath
+%end path
+fill
+%new path
+ 542 584 moveto
+ 544 586 lineto
+ 546 592 lineto
+ 546 602 lineto
+ 544 608 lineto
+ 542 612 lineto
+ 538 616 lineto
+ 534 618 lineto
+ 528 620 lineto
+ 522 620 lineto
+ 522 618 lineto
+ 482 618 lineto
+ 484 620 lineto
+ 478 618 lineto
+ 474 616 lineto
+ 470 612 lineto
+ 468 608 lineto
+ 466 602 lineto
+ 466 592 lineto
+ 468 586 lineto
+ 470 584 lineto
+ 474 580 lineto
+ 478 578 lineto
+ 484 576 lineto
+ 528 576 lineto
+ 534 578 lineto
+ 538 580 lineto
+ 542 584 lineto
+closepath
+%end path
+fill
+%new path
+ 432 216 moveto
+ 430 212 lineto
+ 428 206 lineto
+ 428 196 lineto
+ 430 190 lineto
+ 432 186 lineto
+ 436 182 lineto
+ 440 180 lineto
+ 496 180 lineto
+ 498 182 lineto
+ 502 186 lineto
+ 504 190 lineto
+ 506 196 lineto
+ 508 196 lineto
+ 508 206 lineto
+ 506 212 lineto
+ 504 216 lineto
+ 500 220 lineto
+ 496 222 lineto
+ 490 224 lineto
+ 484 224 lineto
+ 484 222 lineto
+ 444 222 lineto
+ 446 224 lineto
+ 440 222 lineto
+ 436 220 lineto
+ 432 216 lineto
+closepath
+%end path
+fill
+%new path
+ 470 216 moveto
+ 468 212 lineto
+ 466 206 lineto
+ 466 200 lineto
+ 468 200 lineto
+ 468 194 lineto
+ 466 196 lineto
+ 468 190 lineto
+ 470 186 lineto
+ 474 182 lineto
+ 478 180 lineto
+ 534 180 lineto
+ 538 182 lineto
+ 542 186 lineto
+ 544 190 lineto
+ 546 196 lineto
+ 546 206 lineto
+ 544 212 lineto
+ 542 216 lineto
+ 538 220 lineto
+ 534 222 lineto
+ 528 224 lineto
+ 522 224 lineto
+ 522 222 lineto
+ 482 222 lineto
+ 484 224 lineto
+ 478 222 lineto
+ 474 220 lineto
+ 470 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_N
+(
+newpath
+%new path
+ 252 612 moveto
+ 250 608 lineto
+ 248 602 lineto
+ 246 602 lineto
+ 246 202 lineto
+ 248 202 lineto
+ 248 196 lineto
+ 250 190 lineto
+ 252 188 lineto
+ 256 184 lineto
+ 258 182 lineto
+ 264 180 lineto
+ 270 180 lineto
+ 276 182 lineto
+ 280 184 lineto
+ 284 188 lineto
+ 286 190 lineto
+ 288 196 lineto
+ 288 602 lineto
+ 286 608 lineto
+ 284 612 lineto
+ 280 616 lineto
+ 276 618 lineto
+ 270 620 lineto
+ 264 620 lineto
+ 264 620 lineto
+ 258 618 lineto
+ 256 616 lineto
+ 252 612 lineto
+closepath
+%end path
+fill
+%new path
+ 452 612 moveto
+ 450 608 lineto
+ 448 602 lineto
+ 448 196 lineto
+ 450 190 lineto
+ 452 188 lineto
+ 456 184 lineto
+ 460 182 lineto
+ 466 180 lineto
+ 472 180 lineto
+ 478 182 lineto
+ 482 184 lineto
+ 486 188 lineto
+ 488 190 lineto
+ 490 196 lineto
+ 490 602 lineto
+ 488 608 lineto
+ 486 612 lineto
+ 482 616 lineto
+ 478 618 lineto
+ 472 620 lineto
+ 466 620 lineto
+ 466 618 lineto
+ 464 618 lineto
+ 466 620 lineto
+ 460 618 lineto
+ 456 616 lineto
+ 452 612 lineto
+closepath
+%end path
+fill
+%new path
+ 266 618 moveto
+ 260 612 258 604 258 598 curveto
+ 260 598 lineto
+ 260 590 264 582 270 576 curveto
+ 274 572 282 568 290 568 curveto
+ 290 558 376 322 422 198 curveto
+ 424 194 426 190 430 186 curveto
+ 436 182 444 180 452 180 curveto
+ 470 180 lineto
+ 476 186 478 194 478 200 curveto
+ 476 200 lineto
+ 476 208 472 216 466 222 curveto
+ 462 226 454 230 446 230 curveto
+ 446 240 360 476 314 600 curveto
+ 312 604 310 608 306 612 curveto
+ 300 616 292 620 284 620 curveto
+ 284 618 lineto
+ 266 618 lineto
+closepath
+%end path
+fill
+%new path
+ 284 584 moveto
+ 286 586 lineto
+ 288 592 lineto
+ 288 598 lineto
+ 286 600 lineto
+ 286 604 lineto
+ 288 602 lineto
+ 286 608 lineto
+ 284 612 lineto
+ 280 616 lineto
+ 276 618 lineto
+ 270 620 lineto
+ 264 620 lineto
+ 264 618 lineto
+ 216 618 lineto
+ 216 620 lineto
+ 210 618 lineto
+ 208 616 lineto
+ 204 612 lineto
+ 202 608 lineto
+ 200 602 lineto
+ 198 602 lineto
+ 198 598 lineto
+ 200 598 lineto
+ 200 592 lineto
+ 202 586 lineto
+ 204 584 lineto
+ 208 580 lineto
+ 210 578 lineto
+ 216 576 lineto
+ 270 576 lineto
+ 276 578 lineto
+ 280 580 lineto
+ 284 584 lineto
+closepath
+%end path
+fill
+%new path
+ 204 216 moveto
+ 202 212 lineto
+ 200 206 lineto
+ 198 206 lineto
+ 198 200 lineto
+ 200 202 lineto
+ 200 196 lineto
+ 202 190 lineto
+ 204 186 lineto
+ 208 182 lineto
+ 210 180 lineto
+ 276 180 lineto
+ 280 182 lineto
+ 284 186 lineto
+ 286 190 lineto
+ 288 196 lineto
+ 288 206 lineto
+ 286 212 lineto
+ 284 216 lineto
+ 280 220 lineto
+ 276 222 lineto
+ 270 224 lineto
+ 264 224 lineto
+ 264 222 lineto
+ 216 222 lineto
+ 216 224 lineto
+ 210 222 lineto
+ 208 220 lineto
+ 204 216 lineto
+closepath
+%end path
+fill
+%new path
+ 252 216 moveto
+ 250 212 lineto
+ 248 206 lineto
+ 248 196 lineto
+ 250 190 lineto
+ 252 186 lineto
+ 256 182 lineto
+ 258 180 lineto
+ 324 180 lineto
+ 326 182 lineto
+ 330 186 lineto
+ 332 190 lineto
+ 334 196 lineto
+ 336 196 lineto
+ 336 202 lineto
+ 334 200 lineto
+ 334 206 lineto
+ 332 212 lineto
+ 330 216 lineto
+ 326 220 lineto
+ 324 222 lineto
+ 318 224 lineto
+ 312 224 lineto
+ 310 222 lineto
+ 264 222 lineto
+ 264 224 lineto
+ 258 222 lineto
+ 256 220 lineto
+ 252 216 lineto
+closepath
+%end path
+fill
+%new path
+ 486 584 moveto
+ 488 586 lineto
+ 490 592 lineto
+ 490 598 lineto
+ 488 600 lineto
+ 488 602 lineto
+ 486 608 lineto
+ 484 612 lineto
+ 480 616 lineto
+ 478 618 lineto
+ 472 620 lineto
+ 466 620 lineto
+ 464 618 lineto
+ 418 618 lineto
+ 418 620 lineto
+ 412 618 lineto
+ 410 616 lineto
+ 406 612 lineto
+ 404 608 lineto
+ 402 602 lineto
+ 400 602 lineto
+ 400 598 lineto
+ 402 598 lineto
+ 402 592 lineto
+ 404 586 lineto
+ 406 584 lineto
+ 410 580 lineto
+ 412 578 lineto
+ 418 576 lineto
+ 472 576 lineto
+ 478 578 lineto
+ 482 580 lineto
+ 486 584 lineto
+closepath
+%end path
+fill
+%new path
+ 532 584 moveto
+ 534 586 lineto
+ 536 592 lineto
+ 538 594 lineto
+ 538 598 lineto
+ 536 596 lineto
+ 536 602 lineto
+ 534 608 lineto
+ 532 612 lineto
+ 528 616 lineto
+ 526 618 lineto
+ 520 620 lineto
+ 514 620 lineto
+ 512 618 lineto
+ 464 618 lineto
+ 466 620 lineto
+ 460 618 lineto
+ 456 616 lineto
+ 452 612 lineto
+ 450 608 lineto
+ 448 602 lineto
+ 448 592 lineto
+ 450 586 lineto
+ 452 584 lineto
+ 456 580 lineto
+ 460 578 lineto
+ 466 576 lineto
+ 520 576 lineto
+ 526 578 lineto
+ 528 580 lineto
+ 532 584 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_O
+(
+newpath
+%new path
+ 368 582 moveto
+ 340 582 308 582 292 564 curveto
+ 288 562 286 558 284 554 curveto
+ 268 526 268 458 268 406 curveto
+ 270 406 lineto
+ 270 352 270 276 286 244 curveto
+ 288 240 290 236 294 234 curveto
+ 312 216 342 214 370 214 curveto
+ 370 216 lineto
+ 396 216 426 218 444 236 curveto
+ 448 238 450 242 452 246 curveto
+ 468 278 468 354 468 408 curveto
+ 466 408 lineto
+ 466 460 466 528 450 556 curveto
+ 448 560 446 564 442 566 curveto
+ 426 584 394 584 368 584 curveto
+closepath
+%end path
+%new path
+ 368 626 moveto
+ 324 626 276 626 250 600 curveto
+ 246 596 244 594 242 590 curveto
+ 218 554 218 464 218 398 curveto
+ 220 398 lineto
+ 220 332 220 242 244 206 curveto
+ 246 202 248 200 252 196 curveto
+ 278 172 326 172 370 172 curveto
+ 370 174 lineto
+ 412 174 460 174 486 198 curveto
+ 490 202 492 204 494 208 curveto
+ 518 244 518 334 518 400 curveto
+ 516 400 lineto
+ 516 466 516 556 492 592 curveto
+ 490 596 488 598 484 602 curveto
+ 458 628 410 628 368 628 curveto
+closepath
+%end path
+eofill
+) def
+
+/The_letter_P
+(
+newpath
+%new path
+ 254 612 moveto
+ 252 608 lineto
+ 250 602 lineto
+ 248 602 lineto
+ 248 202 lineto
+ 250 202 lineto
+ 250 196 lineto
+ 252 190 lineto
+ 254 188 lineto
+ 258 184 lineto
+ 260 182 lineto
+ 266 180 lineto
+ 282 180 lineto
+ 288 182 lineto
+ 292 184 lineto
+ 296 188 lineto
+ 298 190 lineto
+ 300 196 lineto
+ 300 602 lineto
+ 298 608 lineto
+ 296 612 lineto
+ 292 616 lineto
+ 288 618 lineto
+ 282 620 lineto
+ 276 620 lineto
+ 276 618 lineto
+ 266 618 lineto
+ 266 620 lineto
+ 260 618 lineto
+ 258 616 lineto
+ 254 612 lineto
+closepath
+%end path
+fill
+%new path
+ 276 576 moveto
+ 380 576 lineto
+ 380 574 lineto
+ 406 574 430 566 448 548 curveto
+ 448 548 450 546 450 546 curveto
+ 466 530 476 508 476 486 curveto
+ 474 486 lineto
+ 474 464 464 442 448 426 curveto
+ 448 426 446 424 446 424 curveto
+ 428 406 404 398 378 398 curveto
+ 274 398 lineto
+ 274 354 lineto
+ 276 356 lineto
+ 392 356 lineto
+ 428 356 462 370 486 394 curveto
+ 488 394 488 394 488 396 curveto
+ 512 420 526 454 526 488 curveto
+ 524 488 lineto
+ 524 522 510 556 486 580 curveto
+ 486 582 486 582 484 582 curveto
+ 460 606 426 620 390 620 curveto
+ 390 618 lineto
+ 274 618 lineto
+ 274 574 lineto
+closepath
+%end path
+fill
+%new path
+ 290 584 moveto
+ 292 586 lineto
+ 294 592 lineto
+ 296 594 lineto
+ 296 598 lineto
+ 294 596 lineto
+ 294 602 lineto
+ 292 608 lineto
+ 290 612 lineto
+ 286 616 lineto
+ 284 618 lineto
+ 278 620 lineto
+ 272 620 lineto
+ 270 618 lineto
+ 214 618 lineto
+ 216 620 lineto
+ 210 618 lineto
+ 206 616 lineto
+ 202 612 lineto
+ 200 608 lineto
+ 198 602 lineto
+ 198 592 lineto
+ 200 586 lineto
+ 202 584 lineto
+ 206 580 lineto
+ 210 578 lineto
+ 216 576 lineto
+ 278 576 lineto
+ 284 578 lineto
+ 286 580 lineto
+ 290 584 lineto
+closepath
+%end path
+fill
+%new path
+ 320 584 moveto
+ 322 586 lineto
+ 324 592 lineto
+ 326 594 lineto
+ 326 598 lineto
+ 324 596 lineto
+ 324 602 lineto
+ 322 608 lineto
+ 320 612 lineto
+ 316 616 lineto
+ 314 618 lineto
+ 308 620 lineto
+ 302 620 lineto
+ 300 618 lineto
+ 270 618 lineto
+ 272 620 lineto
+ 266 618 lineto
+ 262 616 lineto
+ 258 612 lineto
+ 256 608 lineto
+ 254 602 lineto
+ 254 592 lineto
+ 256 586 lineto
+ 258 584 lineto
+ 262 580 lineto
+ 266 578 lineto
+ 272 576 lineto
+ 308 576 lineto
+ 314 578 lineto
+ 316 580 lineto
+ 320 584 lineto
+closepath
+%end path
+fill
+%new path
+ 202 216 moveto
+ 200 212 lineto
+ 198 206 lineto
+ 198 196 lineto
+ 200 190 lineto
+ 202 186 lineto
+ 206 182 lineto
+ 210 180 lineto
+ 284 180 lineto
+ 286 182 lineto
+ 290 186 lineto
+ 292 190 lineto
+ 294 196 lineto
+ 296 196 lineto
+ 296 202 lineto
+ 294 200 lineto
+ 294 206 lineto
+ 292 212 lineto
+ 290 216 lineto
+ 286 220 lineto
+ 284 222 lineto
+ 278 224 lineto
+ 272 224 lineto
+ 270 222 lineto
+ 214 222 lineto
+ 216 224 lineto
+ 210 222 lineto
+ 206 220 lineto
+ 202 216 lineto
+closepath
+%end path
+fill
+%new path
+ 258 216 moveto
+ 256 212 lineto
+ 254 206 lineto
+ 254 196 lineto
+ 256 190 lineto
+ 258 186 lineto
+ 262 182 lineto
+ 266 180 lineto
+ 340 180 lineto
+ 342 182 lineto
+ 346 186 lineto
+ 348 190 lineto
+ 350 196 lineto
+ 352 196 lineto
+ 352 202 lineto
+ 350 200 lineto
+ 350 206 lineto
+ 348 212 lineto
+ 346 216 lineto
+ 342 220 lineto
+ 340 222 lineto
+ 334 224 lineto
+ 328 224 lineto
+ 326 222 lineto
+ 270 222 lineto
+ 272 224 lineto
+ 266 222 lineto
+ 262 220 lineto
+ 258 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_Q
+(
+newpath
+%new path
+ 368 582 moveto
+ 340 582 310 580 292 564 curveto
+ 288 560 286 556 284 552 curveto
+ 268 524 268 450 268 398 curveto
+ 270 398 lineto
+ 270 346 270 272 286 244 curveto
+ 288 240 290 236 294 232 curveto
+ 312 216 342 214 370 214 curveto
+ 370 216 lineto
+ 396 216 426 218 444 234 curveto
+ 448 238 450 242 452 246 curveto
+ 468 274 468 348 468 400 curveto
+ 466 400 lineto
+ 466 452 466 526 450 554 curveto
+ 448 558 446 562 442 566 curveto
+ 424 582 394 584 368 584 curveto
+closepath
+%end path
+%new path
+ 368 626 moveto
+ 324 626 276 626 250 600 curveto
+ 246 596 244 594 242 590 curveto
+ 218 554 218 464 218 398 curveto
+ 220 398 lineto
+ 220 332 220 242 244 206 curveto
+ 246 202 248 200 252 196 curveto
+ 278 172 326 172 370 172 curveto
+ 370 174 lineto
+ 412 174 460 174 486 198 curveto
+ 490 202 492 204 494 208 curveto
+ 518 244 518 334 518 400 curveto
+ 516 400 lineto
+ 516 466 516 556 492 592 curveto
+ 490 596 488 598 484 602 curveto
+ 458 628 410 628 368 628 curveto
+closepath
+%end path
+eofill
+%new path
+ 396 302 moveto
+ 394 302 392 304 390 304 curveto
+ 390 302 lineto
+ 362 302 lineto
+ 358 302 354 300 352 298 curveto
+ 350 296 348 292 348 288 curveto
+ 350 288 lineto
+ 350 286 350 284 352 282 curveto
+ 386 218 418 154 452 90 curveto
+ 454 88 454 86 456 86 curveto
+ 460 82 464 80 470 80 curveto
+ 470 82 lineto
+ 496 82 lineto
+ 500 82 502 84 504 86 curveto
+ 508 88 508 92 508 96 curveto
+ 506 96 lineto
+ 506 102 lineto
+ 470 168 434 232 398 300 curveto
+ 398 300 396 300 396 302 curveto
+closepath
+%end path
+fill
+) def
+
+/The_letter_R
+(
+newpath
+%new path
+ 246 612 moveto
+ 244 608 lineto
+ 242 602 lineto
+ 240 602 lineto
+ 240 202 lineto
+ 242 202 lineto
+ 242 196 lineto
+ 244 190 lineto
+ 246 188 lineto
+ 250 184 lineto
+ 252 182 lineto
+ 258 180 lineto
+ 274 180 lineto
+ 280 182 lineto
+ 284 184 lineto
+ 288 188 lineto
+ 290 190 lineto
+ 292 196 lineto
+ 292 602 lineto
+ 290 608 lineto
+ 288 612 lineto
+ 284 616 lineto
+ 280 618 lineto
+ 274 620 lineto
+ 268 620 lineto
+ 268 618 lineto
+ 258 618 lineto
+ 258 620 lineto
+ 252 618 lineto
+ 250 616 lineto
+ 246 612 lineto
+closepath
+%end path
+fill
+%new path
+ 268 576 moveto
+ 348 576 lineto
+ 348 574 lineto
+ 372 574 396 566 414 552 curveto
+ 416 550 418 548 420 546 curveto
+ 434 532 442 516 442 498 curveto
+ 440 498 lineto
+ 440 478 432 462 418 448 curveto
+ 416 446 414 444 412 442 curveto
+ 394 428 370 420 346 420 curveto
+ 266 420 lineto
+ 266 376 lineto
+ 268 378 lineto
+ 354 378 lineto
+ 390 378 424 390 452 414 curveto
+ 454 416 456 418 458 418 curveto
+ 478 440 492 468 492 500 curveto
+ 490 500 lineto
+ 490 530 476 558 456 580 curveto
+ 454 580 452 582 450 584 curveto
+ 422 608 388 620 352 620 curveto
+ 352 618 lineto
+ 266 618 lineto
+ 266 574 lineto
+closepath
+%end path
+fill
+%new path
+ 338 414 moveto
+ 336 410 lineto
+ 334 404 lineto
+ 332 404 lineto
+ 332 398 lineto
+ 334 400 lineto
+ 334 394 lineto
+ 336 388 lineto
+ 338 384 lineto
+ 342 380 lineto
+ 344 378 lineto
+ 350 376 lineto
+ 352 376 lineto
+ 362 376 372 374 382 372 curveto
+ 376 374 lineto
+ 384 370 392 366 398 362 curveto
+ 398 364 lineto
+ 394 366 lineto
+ 396 364 lineto
+ 400 362 404 358 408 354 curveto
+ 410 352 lineto
+ 416 350 lineto
+ 404 358 lineto
+ 400 368 lineto
+ 402 362 lineto
+ 404 358 lineto
+ 408 354 412 350 414 346 curveto
+ 412 346 lineto
+ 410 350 lineto
+ 412 348 lineto
+ 416 344 418 338 420 332 curveto
+ 418 338 lineto
+ 420 330 422 322 422 316 curveto
+ 424 310 lineto
+ 426 308 lineto
+ 422 316 lineto
+ 426 332 lineto
+ 424 328 lineto
+ 422 322 lineto
+ 420 322 lineto
+ 420 268 lineto
+ 422 268 lineto
+ 422 262 lineto
+ 422 248 424 234 428 222 curveto
+ 426 224 lineto
+ 428 218 lineto
+ 430 216 lineto
+ 432 210 434 206 436 202 curveto
+ 438 200 lineto
+ 438 198 lineto
+ 440 196 442 192 444 190 curveto
+ 444 192 lineto
+ 448 188 lineto
+ 448 186 lineto
+ 450 184 454 182 456 182 curveto
+ 454 182 lineto
+ 458 180 lineto
+ 462 180 464 178 468 176 curveto
+ 468 178 lineto
+ 474 176 lineto
+ 474 174 lineto
+ 480 172 484 172 492 172 curveto
+ 496 172 lineto
+ 498 174 lineto
+ 500 174 504 174 508 176 curveto
+ 506 174 lineto
+ 512 176 lineto
+ 514 178 lineto
+ 516 178 520 180 522 180 curveto
+ 524 180 lineto
+ 526 182 lineto
+ 528 184 530 184 532 186 curveto
+ 530 186 lineto
+ 534 190 lineto
+ 536 190 lineto
+ 538 192 540 196 540 198 curveto
+ 540 196 lineto
+ 542 200 lineto
+ 546 206 548 210 550 216 curveto
+ 548 214 lineto
+ 550 220 lineto
+ 552 222 lineto
+ 554 230 556 238 556 248 curveto
+ 556 252 lineto
+ 554 258 lineto
+ 552 262 lineto
+ 548 266 lineto
+ 544 268 lineto
+ 538 270 lineto
+ 532 270 lineto
+ 532 268 lineto
+ 520 268 lineto
+ 522 270 lineto
+ 516 268 lineto
+ 512 266 lineto
+ 508 262 lineto
+ 506 258 lineto
+ 504 252 lineto
+ 504 240 502 230 500 222 curveto
+ 502 228 lineto
+ 500 224 498 220 496 216 curveto
+ 498 216 lineto
+ 500 220 lineto
+ 498 218 lineto
+ 496 216 496 214 494 214 curveto
+ 492 212 lineto
+ 490 206 lineto
+ 490 200 lineto
+ 494 214 lineto
+ 514 222 lineto
+ 508 222 lineto
+ 502 220 lineto
+ 498 218 lineto
+ 496 216 496 216 494 214 curveto
+ 494 216 lineto
+ 498 218 lineto
+ 496 216 lineto
+ 496 214 494 214 492 214 curveto
+ 498 216 lineto
+ 494 214 492 214 490 214 curveto
+ 490 216 lineto
+ 484 214 lineto
+ 482 212 lineto
+ 478 208 lineto
+ 496 216 lineto
+ 510 208 lineto
+ 506 212 lineto
+ 502 214 lineto
+ 496 216 lineto
+ 490 216 486 216 482 218 curveto
+ 482 216 lineto
+ 488 214 lineto
+ 488 216 lineto
+ 484 216 482 218 480 220 curveto
+ 482 218 lineto
+ 484 216 lineto
+ 484 218 lineto
+ 482 218 480 220 478 222 curveto
+ 480 220 lineto
+ 476 222 lineto
+ 470 224 lineto
+ 484 216 lineto
+ 488 208 lineto
+ 486 214 lineto
+ 484 216 lineto
+ 482 218 lineto
+ 480 220 478 222 478 224 curveto
+ 478 222 lineto
+ 480 220 lineto
+ 476 224 474 228 474 234 curveto
+ 474 232 lineto
+ 476 226 lineto
+ 476 228 lineto
+ 472 240 470 254 470 270 curveto
+ 472 268 lineto
+ 470 274 lineto
+ 468 278 lineto
+ 472 268 lineto
+ 468 254 lineto
+ 470 256 lineto
+ 472 262 lineto
+ 472 322 lineto
+ 470 324 lineto
+ 470 332 468 338 466 346 curveto
+ 468 344 lineto
+ 466 350 lineto
+ 464 352 lineto
+ 462 358 460 364 456 370 curveto
+ 456 368 lineto
+ 454 372 lineto
+ 450 376 448 380 444 384 curveto
+ 440 388 lineto
+ 436 392 430 396 426 400 curveto
+ 424 402 lineto
+ 422 402 lineto
+ 416 408 406 412 398 414 curveto
+ 392 416 lineto
+ 380 420 368 422 356 422 curveto
+ 350 422 lineto
+ 344 420 lineto
+ 342 418 lineto
+ 338 414 lineto
+closepath
+%end path
+fill
+%new path
+ 282 584 moveto
+ 284 586 lineto
+ 286 592 lineto
+ 288 594 lineto
+ 288 598 lineto
+ 286 596 lineto
+ 286 602 lineto
+ 284 608 lineto
+ 282 612 lineto
+ 278 616 lineto
+ 276 618 lineto
+ 270 620 lineto
+ 264 620 lineto
+ 262 618 lineto
+ 210 618 lineto
+ 210 620 lineto
+ 204 618 lineto
+ 202 616 lineto
+ 198 612 lineto
+ 196 608 lineto
+ 194 602 lineto
+ 192 602 lineto
+ 192 598 lineto
+ 194 598 lineto
+ 194 592 lineto
+ 196 586 lineto
+ 198 584 lineto
+ 202 580 lineto
+ 204 578 lineto
+ 210 576 lineto
+ 270 576 lineto
+ 276 578 lineto
+ 278 580 lineto
+ 282 584 lineto
+closepath
+%end path
+fill
+%new path
+ 310 584 moveto
+ 312 586 lineto
+ 314 592 lineto
+ 316 594 lineto
+ 316 598 lineto
+ 314 596 lineto
+ 314 602 lineto
+ 312 608 lineto
+ 310 612 lineto
+ 306 616 lineto
+ 304 618 lineto
+ 298 620 lineto
+ 292 620 lineto
+ 290 618 lineto
+ 262 618 lineto
+ 264 620 lineto
+ 258 618 lineto
+ 254 616 lineto
+ 250 612 lineto
+ 248 608 lineto
+ 246 602 lineto
+ 246 592 lineto
+ 248 586 lineto
+ 250 584 lineto
+ 254 580 lineto
+ 258 578 lineto
+ 264 576 lineto
+ 298 576 lineto
+ 304 578 lineto
+ 306 580 lineto
+ 310 584 lineto
+closepath
+%end path
+fill
+%new path
+ 198 216 moveto
+ 196 212 lineto
+ 194 206 lineto
+ 192 206 lineto
+ 192 200 lineto
+ 194 202 lineto
+ 194 196 lineto
+ 196 190 lineto
+ 198 186 lineto
+ 202 182 lineto
+ 204 180 lineto
+ 276 180 lineto
+ 278 182 lineto
+ 282 186 lineto
+ 284 190 lineto
+ 286 196 lineto
+ 288 196 lineto
+ 288 202 lineto
+ 286 200 lineto
+ 286 206 lineto
+ 284 212 lineto
+ 282 216 lineto
+ 278 220 lineto
+ 276 222 lineto
+ 270 224 lineto
+ 264 224 lineto
+ 262 222 lineto
+ 210 222 lineto
+ 210 224 lineto
+ 204 222 lineto
+ 202 220 lineto
+ 198 216 lineto
+closepath
+%end path
+fill
+%new path
+ 250 216 moveto
+ 248 212 lineto
+ 246 206 lineto
+ 246 196 lineto
+ 248 190 lineto
+ 250 186 lineto
+ 254 182 lineto
+ 258 180 lineto
+ 328 180 lineto
+ 330 182 lineto
+ 334 186 lineto
+ 336 190 lineto
+ 338 196 lineto
+ 340 196 lineto
+ 340 202 lineto
+ 338 200 lineto
+ 338 206 lineto
+ 336 212 lineto
+ 334 216 lineto
+ 330 220 lineto
+ 328 222 lineto
+ 322 224 lineto
+ 316 224 lineto
+ 314 222 lineto
+ 262 222 lineto
+ 264 224 lineto
+ 258 222 lineto
+ 254 220 lineto
+ 250 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_S
+(
+newpath
+%new path
+ 352 628 moveto
+ 346 628 lineto
+ 346 626 lineto
+ 332 626 318 624 306 620 curveto
+ 300 618 lineto
+ 290 614 280 610 272 604 curveto
+ 272 606 lineto
+ 270 604 lineto
+ 268 602 lineto
+ 264 600 260 596 256 594 curveto
+ 256 592 254 590 252 588 curveto
+ 252 590 lineto
+ 248 586 lineto
+ 248 584 lineto
+ 244 580 240 574 236 570 curveto
+ 234 568 lineto
+ 234 566 lineto
+ 228 560 226 552 222 544 curveto
+ 224 546 lineto
+ 222 540 lineto
+ 220 538 lineto
+ 218 530 216 520 216 510 curveto
+ 218 512 lineto
+ 218 504 lineto
+ 218 496 220 486 222 478 curveto
+ 224 472 lineto
+ 228 464 230 456 236 450 curveto
+ 234 450 lineto
+ 236 448 lineto
+ 238 446 lineto
+ 240 440 244 436 250 432 curveto
+ 248 432 lineto
+ 252 428 lineto
+ 254 428 lineto
+ 258 422 264 418 270 414 curveto
+ 272 412 lineto
+ 274 412 lineto
+ 282 406 292 402 302 398 curveto
+ 300 398 lineto
+ 306 396 lineto
+ 308 396 lineto
+ 312 394 314 394 318 392 curveto
+ 318 392 410 372 410 372 curveto
+ 412 370 416 370 418 368 curveto
+ 418 370 lineto
+ 412 372 lineto
+ 412 370 lineto
+ 422 368 430 364 438 358 curveto
+ 438 360 lineto
+ 434 362 lineto
+ 436 360 lineto
+ 440 356 446 352 450 348 curveto
+ 452 346 lineto
+ 458 344 lineto
+ 446 352 lineto
+ 442 362 lineto
+ 444 356 lineto
+ 446 352 lineto
+ 452 346 456 342 460 336 curveto
+ 458 338 lineto
+ 456 340 lineto
+ 458 340 lineto
+ 462 332 466 324 470 316 curveto
+ 468 316 lineto
+ 466 322 lineto
+ 468 322 lineto
+ 470 312 472 302 472 292 curveto
+ 470 292 lineto
+ 472 286 lineto
+ 474 284 lineto
+ 470 292 lineto
+ 474 308 lineto
+ 472 304 lineto
+ 470 298 lineto
+ 470 286 468 276 466 266 curveto
+ 466 268 lineto
+ 468 274 lineto
+ 468 272 lineto
+ 464 264 460 256 456 250 curveto
+ 458 254 lineto
+ 458 252 lineto
+ 454 246 450 242 444 236 curveto
+ 446 238 lineto
+ 444 234 lineto
+ 442 228 lineto
+ 442 222 lineto
+ 446 238 lineto
+ 464 246 lineto
+ 458 246 lineto
+ 452 244 lineto
+ 450 242 lineto
+ 448 240 lineto
+ 444 236 438 232 434 228 curveto
+ 438 230 lineto
+ 436 230 lineto
+ 428 224 420 220 412 218 curveto
+ 418 220 lineto
+ 406 216 394 214 382 214 curveto
+ 384 216 lineto
+ 378 214 lineto
+ 374 212 lineto
+ 370 208 lineto
+ 368 204 lineto
+ 366 198 lineto
+ 366 188 lineto
+ 368 182 lineto
+ 370 180 lineto
+ 374 176 lineto
+ 378 174 lineto
+ 384 172 lineto
+ 390 172 lineto
+ 390 174 lineto
+ 404 174 416 176 428 180 curveto
+ 426 178 lineto
+ 432 180 lineto
+ 434 180 lineto
+ 444 184 452 188 460 194 curveto
+ 460 192 lineto
+ 462 194 lineto
+ 464 196 lineto
+ 470 198 474 202 480 208 curveto
+ 480 208 lineto
+ 484 212 lineto
+ 484 214 lineto
+ 490 218 494 224 498 230 curveto
+ 498 228 lineto
+ 500 232 lineto
+ 506 240 510 248 512 258 curveto
+ 512 256 lineto
+ 514 262 lineto
+ 514 264 lineto
+ 518 274 520 286 520 296 curveto
+ 520 302 lineto
+ 518 302 lineto
+ 518 314 516 324 512 334 curveto
+ 514 334 lineto
+ 512 340 lineto
+ 510 340 lineto
+ 508 350 504 358 498 366 curveto
+ 500 364 lineto
+ 498 368 lineto
+ 496 368 lineto
+ 492 374 488 380 482 386 curveto
+ 484 384 lineto
+ 480 388 lineto
+ 478 390 lineto
+ 474 394 468 400 462 404 curveto
+ 462 402 lineto
+ 460 404 lineto
+ 458 406 lineto
+ 450 410 442 416 432 418 curveto
+ 426 420 lineto
+ 422 422 418 422 416 424 curveto
+ 416 424 324 444 324 444 curveto
+ 320 446 318 446 314 448 curveto
+ 316 446 lineto
+ 322 444 lineto
+ 320 446 lineto
+ 310 448 302 452 294 458 curveto
+ 296 458 lineto
+ 298 456 lineto
+ 292 460 286 464 282 468 curveto
+ 280 470 lineto
+ 274 472 lineto
+ 286 464 lineto
+ 290 454 lineto
+ 288 460 lineto
+ 286 464 lineto
+ 282 470 278 474 274 478 curveto
+ 276 478 lineto
+ 278 474 lineto
+ 276 476 lineto
+ 272 482 268 488 266 496 curveto
+ 268 496 lineto
+ 270 490 lineto
+ 268 490 lineto
+ 266 498 264 506 264 516 curveto
+ 266 514 lineto
+ 264 520 lineto
+ 262 524 lineto
+ 266 514 lineto
+ 262 500 lineto
+ 264 502 lineto
+ 266 508 lineto
+ 266 510 lineto
+ 266 518 268 528 270 536 curveto
+ 270 534 lineto
+ 268 528 lineto
+ 268 530 lineto
+ 270 536 274 544 278 550 curveto
+ 278 548 lineto
+ 276 546 lineto
+ 280 552 284 556 288 560 curveto
+ 286 560 lineto
+ 288 562 lineto
+ 290 568 lineto
+ 290 574 lineto
+ 286 560 lineto
+ 268 552 lineto
+ 274 552 lineto
+ 280 554 lineto
+ 282 556 lineto
+ 284 556 lineto
+ 286 558 286 560 288 562 curveto
+ 292 564 296 568 300 570 curveto
+ 298 568 lineto
+ 296 566 lineto
+ 296 568 lineto
+ 304 572 312 578 322 580 curveto
+ 316 578 lineto
+ 328 582 340 584 354 584 curveto
+ 352 584 lineto
+ 358 586 lineto
+ 362 588 lineto
+ 366 592 lineto
+ 368 594 lineto
+ 370 600 lineto
+ 370 610 lineto
+ 368 616 lineto
+ 366 620 lineto
+ 362 624 lineto
+ 358 626 lineto
+ 352 628 lineto
+closepath
+%end path
+fill
+%new path
+ 502 498 moveto
+ 500 500 lineto
+ 498 510 496 520 494 530 curveto
+ 492 536 lineto
+ 488 546 482 556 478 566 curveto
+ 478 564 lineto
+ 476 568 lineto
+ 472 574 466 580 462 584 curveto
+ 458 588 lineto
+ 452 594 448 598 442 602 curveto
+ 440 604 lineto
+ 438 604 lineto
+ 430 610 420 614 410 618 curveto
+ 404 620 lineto
+ 388 626 370 628 352 628 curveto
+ 346 628 lineto
+ 340 626 lineto
+ 338 624 lineto
+ 334 620 lineto
+ 332 616 lineto
+ 330 610 lineto
+ 328 610 lineto
+ 328 606 lineto
+ 330 606 lineto
+ 330 600 lineto
+ 332 594 lineto
+ 334 592 lineto
+ 338 588 lineto
+ 340 586 lineto
+ 346 584 lineto
+ 348 582 lineto
+ 364 582 380 580 394 574 curveto
+ 392 576 lineto
+ 386 578 lineto
+ 388 576 lineto
+ 398 574 406 570 414 564 curveto
+ 414 566 lineto
+ 410 568 lineto
+ 412 566 lineto
+ 416 562 422 558 426 554 curveto
+ 428 552 lineto
+ 434 550 lineto
+ 422 558 lineto
+ 418 568 lineto
+ 420 562 lineto
+ 422 558 lineto
+ 428 552 432 548 436 542 curveto
+ 434 542 lineto
+ 432 546 lineto
+ 434 544 lineto
+ 440 536 444 526 448 516 curveto
+ 446 518 lineto
+ 444 524 lineto
+ 446 522 lineto
+ 448 512 450 502 452 492 curveto
+ 450 492 lineto
+ 452 486 lineto
+ 454 484 lineto
+ 458 480 lineto
+ 462 478 lineto
+ 468 476 lineto
+ 484 476 lineto
+ 490 478 lineto
+ 494 480 lineto
+ 498 484 lineto
+ 500 486 lineto
+ 502 492 lineto
+ 502 498 lineto
+closepath
+%end path
+fill
+%new path
+ 402 208 moveto
+ 398 212 lineto
+ 396 214 lineto
+ 390 216 lineto
+ 388 216 lineto
+ 364 216 342 220 322 226 curveto
+ 324 224 lineto
+ 330 222 lineto
+ 328 224 lineto
+ 318 228 306 232 298 238 curveto
+ 302 236 lineto
+ 300 236 lineto
+ 296 240 290 244 286 248 curveto
+ 284 250 lineto
+ 278 252 lineto
+ 290 244 lineto
+ 294 234 lineto
+ 292 240 lineto
+ 290 244 lineto
+ 286 250 282 254 278 258 curveto
+ 280 254 lineto
+ 280 256 lineto
+ 276 262 272 270 270 278 curveto
+ 270 276 lineto
+ 272 270 lineto
+ 272 272 lineto
+ 268 282 266 294 266 308 curveto
+ 268 306 lineto
+ 266 312 lineto
+ 264 316 lineto
+ 260 320 lineto
+ 256 322 lineto
+ 250 324 lineto
+ 244 324 lineto
+ 244 322 lineto
+ 234 322 lineto
+ 234 324 lineto
+ 228 322 lineto
+ 226 320 lineto
+ 222 316 lineto
+ 220 312 lineto
+ 218 306 lineto
+ 218 300 lineto
+ 218 286 220 274 224 262 curveto
+ 222 264 lineto
+ 224 258 lineto
+ 226 256 lineto
+ 228 248 232 242 236 234 curveto
+ 236 236 lineto
+ 238 232 lineto
+ 242 226 246 222 250 218 curveto
+ 254 214 lineto
+ 258 208 264 204 270 200 curveto
+ 268 202 lineto
+ 272 200 lineto
+ 272 198 lineto
+ 282 192 294 186 306 182 curveto
+ 304 184 lineto
+ 310 182 lineto
+ 312 180 lineto
+ 334 176 358 172 384 172 curveto
+ 390 172 lineto
+ 396 174 lineto
+ 398 176 lineto
+ 402 180 lineto
+ 404 182 lineto
+ 406 188 lineto
+ 408 188 lineto
+ 408 194 lineto
+ 406 192 lineto
+ 406 198 lineto
+ 404 204 lineto
+ 402 208 lineto
+closepath
+%end path
+fill
+%new path
+ 498 484 moveto
+ 500 486 lineto
+ 502 492 lineto
+ 502 610 lineto
+ 500 616 lineto
+ 498 620 lineto
+ 494 624 lineto
+ 490 626 lineto
+ 484 628 lineto
+ 478 628 lineto
+ 478 626 lineto
+ 474 626 lineto
+ 474 628 lineto
+ 468 626 lineto
+ 466 624 lineto
+ 462 620 lineto
+ 460 616 lineto
+ 458 610 lineto
+ 456 610 lineto
+ 450 590 444 570 438 552 curveto
+ 438 546 lineto
+ 440 540 lineto
+ 442 540 lineto
+ 446 532 450 524 452 516 curveto
+ 452 518 lineto
+ 450 524 lineto
+ 450 522 lineto
+ 454 512 456 502 456 492 curveto
+ 458 486 lineto
+ 460 484 lineto
+ 464 480 lineto
+ 466 478 lineto
+ 472 476 lineto
+ 484 476 lineto
+ 490 478 lineto
+ 494 480 lineto
+ 498 484 lineto
+closepath
+%end path
+fill
+%new path
+ 222 316 moveto
+ 220 312 lineto
+ 218 306 lineto
+ 216 306 lineto
+ 216 192 lineto
+ 218 194 lineto
+ 218 188 lineto
+ 220 182 lineto
+ 222 180 lineto
+ 226 176 lineto
+ 228 174 lineto
+ 234 172 lineto
+ 240 172 lineto
+ 242 174 lineto
+ 244 174 lineto
+ 244 172 lineto
+ 250 174 lineto
+ 252 176 lineto
+ 256 180 lineto
+ 258 182 lineto
+ 260 188 lineto
+ 262 188 lineto
+ 266 208 272 226 278 244 curveto
+ 278 248 lineto
+ 276 254 lineto
+ 274 256 lineto
+ 270 262 268 270 264 278 curveto
+ 266 276 lineto
+ 268 270 lineto
+ 266 272 lineto
+ 262 282 262 294 262 308 curveto
+ 262 306 lineto
+ 260 312 lineto
+ 258 316 lineto
+ 254 320 lineto
+ 252 322 lineto
+ 246 324 lineto
+ 240 324 lineto
+ 238 322 lineto
+ 234 322 lineto
+ 234 324 lineto
+ 228 322 lineto
+ 226 320 lineto
+ 222 316 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_T
+(
+newpath
+%new path
+ 348 612 moveto
+ 346 608 lineto
+ 344 602 lineto
+ 342 602 lineto
+ 342 202 lineto
+ 344 202 lineto
+ 344 196 lineto
+ 346 190 lineto
+ 348 188 lineto
+ 352 184 lineto
+ 354 182 lineto
+ 360 180 lineto
+ 376 180 lineto
+ 382 182 lineto
+ 386 184 lineto
+ 390 188 lineto
+ 392 190 lineto
+ 394 196 lineto
+ 394 602 lineto
+ 392 608 lineto
+ 390 612 lineto
+ 386 616 lineto
+ 382 618 lineto
+ 376 620 lineto
+ 370 620 lineto
+ 370 618 lineto
+ 360 618 lineto
+ 360 620 lineto
+ 354 618 lineto
+ 352 616 lineto
+ 348 612 lineto
+closepath
+%end path
+fill
+%new path
+ 506 506 moveto
+ 512 506 lineto
+ 512 508 lineto
+ 524 508 lineto
+ 522 506 lineto
+ 528 508 lineto
+ 532 510 lineto
+ 536 514 lineto
+ 538 518 lineto
+ 540 524 lineto
+ 540 602 lineto
+ 538 608 lineto
+ 536 612 lineto
+ 532 616 lineto
+ 528 618 lineto
+ 522 620 lineto
+ 516 620 lineto
+ 516 618 lineto
+ 364 618 lineto
+ 366 620 lineto
+ 360 618 lineto
+ 356 616 lineto
+ 352 612 lineto
+ 350 608 lineto
+ 348 602 lineto
+ 348 592 lineto
+ 350 586 lineto
+ 352 582 lineto
+ 356 578 lineto
+ 360 576 lineto
+ 366 574 lineto
+ 372 574 lineto
+ 372 576 lineto
+ 512 576 lineto
+ 512 574 lineto
+ 518 576 lineto
+ 520 578 lineto
+ 524 582 lineto
+ 506 574 lineto
+ 492 582 lineto
+ 496 578 lineto
+ 500 576 lineto
+ 506 574 lineto
+ 492 582 lineto
+ 488 592 lineto
+ 490 586 lineto
+ 492 582 lineto
+ 488 592 lineto
+ 492 606 lineto
+ 490 604 lineto
+ 488 598 lineto
+ 488 524 lineto
+ 490 518 lineto
+ 492 514 lineto
+ 496 510 lineto
+ 500 508 lineto
+ 506 506 lineto
+closepath
+%end path
+fill
+%new path
+ 244 514 moveto
+ 246 518 lineto
+ 248 524 lineto
+ 248 598 lineto
+ 244 582 lineto
+ 224 574 lineto
+ 230 574 lineto
+ 232 576 lineto
+ 372 576 lineto
+ 372 574 lineto
+ 378 576 lineto
+ 380 578 lineto
+ 384 582 lineto
+ 386 586 lineto
+ 388 592 lineto
+ 390 592 lineto
+ 390 598 lineto
+ 388 596 lineto
+ 388 602 lineto
+ 386 608 lineto
+ 384 612 lineto
+ 380 616 lineto
+ 378 618 lineto
+ 372 620 lineto
+ 366 620 lineto
+ 364 618 lineto
+ 214 618 lineto
+ 214 620 lineto
+ 208 618 lineto
+ 206 616 lineto
+ 202 612 lineto
+ 200 608 lineto
+ 198 602 lineto
+ 196 602 lineto
+ 196 528 lineto
+ 198 530 lineto
+ 198 524 lineto
+ 200 518 lineto
+ 202 514 lineto
+ 206 510 lineto
+ 208 508 lineto
+ 214 506 lineto
+ 220 506 lineto
+ 222 508 lineto
+ 232 508 lineto
+ 230 506 lineto
+ 236 508 lineto
+ 240 510 lineto
+ 244 514 lineto
+closepath
+%end path
+fill
+%new path
+ 280 216 moveto
+ 278 212 lineto
+ 276 206 lineto
+ 276 196 lineto
+ 278 190 lineto
+ 280 186 lineto
+ 284 182 lineto
+ 288 180 lineto
+ 378 180 lineto
+ 380 182 lineto
+ 384 186 lineto
+ 386 190 lineto
+ 388 196 lineto
+ 390 196 lineto
+ 390 202 lineto
+ 388 200 lineto
+ 388 206 lineto
+ 386 212 lineto
+ 384 216 lineto
+ 380 220 lineto
+ 378 222 lineto
+ 372 224 lineto
+ 366 224 lineto
+ 364 222 lineto
+ 292 222 lineto
+ 294 224 lineto
+ 288 222 lineto
+ 284 220 lineto
+ 280 216 lineto
+closepath
+%end path
+fill
+%new path
+ 352 216 moveto
+ 350 212 lineto
+ 348 206 lineto
+ 348 196 lineto
+ 350 190 lineto
+ 352 186 lineto
+ 356 182 lineto
+ 360 180 lineto
+ 448 180 lineto
+ 452 182 lineto
+ 456 186 lineto
+ 458 190 lineto
+ 460 196 lineto
+ 460 206 lineto
+ 458 212 lineto
+ 456 216 lineto
+ 452 220 lineto
+ 448 222 lineto
+ 442 224 lineto
+ 436 224 lineto
+ 436 222 lineto
+ 364 222 lineto
+ 366 224 lineto
+ 360 222 lineto
+ 356 220 lineto
+ 352 216 lineto
+closepath
+%end path
+fill
+%new path
+ 384 584 moveto
+ 386 586 lineto
+ 388 592 lineto
+ 390 594 lineto
+ 390 598 lineto
+ 388 596 lineto
+ 388 602 lineto
+ 386 608 lineto
+ 384 612 lineto
+ 380 616 lineto
+ 378 618 lineto
+ 372 620 lineto
+ 366 620 lineto
+ 364 618 lineto
+ 336 618 lineto
+ 336 620 lineto
+ 330 618 lineto
+ 328 616 lineto
+ 324 612 lineto
+ 322 608 lineto
+ 320 602 lineto
+ 318 602 lineto
+ 318 598 lineto
+ 320 598 lineto
+ 320 592 lineto
+ 322 586 lineto
+ 324 584 lineto
+ 328 580 lineto
+ 330 578 lineto
+ 336 576 lineto
+ 372 576 lineto
+ 378 578 lineto
+ 380 580 lineto
+ 384 584 lineto
+closepath
+%end path
+fill
+%new path
+ 412 584 moveto
+ 414 586 lineto
+ 416 592 lineto
+ 418 594 lineto
+ 418 598 lineto
+ 416 596 lineto
+ 416 602 lineto
+ 414 608 lineto
+ 412 612 lineto
+ 408 616 lineto
+ 406 618 lineto
+ 400 620 lineto
+ 394 620 lineto
+ 392 618 lineto
+ 364 618 lineto
+ 366 620 lineto
+ 360 618 lineto
+ 356 616 lineto
+ 352 612 lineto
+ 350 608 lineto
+ 348 602 lineto
+ 348 592 lineto
+ 350 586 lineto
+ 352 584 lineto
+ 356 580 lineto
+ 360 578 lineto
+ 366 576 lineto
+ 400 576 lineto
+ 406 578 lineto
+ 408 580 lineto
+ 412 584 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_U
+(
+newpath
+%new path
+ 254 612 moveto
+ 252 608 lineto
+ 250 602 lineto
+ 248 602 lineto
+ 248 328 lineto
+ 250 328 lineto
+ 250 322 lineto
+ 252 316 lineto
+ 254 314 lineto
+ 258 310 lineto
+ 260 308 lineto
+ 266 306 lineto
+ 282 306 lineto
+ 288 308 lineto
+ 292 310 lineto
+ 296 314 lineto
+ 298 316 lineto
+ 300 322 lineto
+ 300 602 lineto
+ 298 608 lineto
+ 296 612 lineto
+ 292 616 lineto
+ 288 618 lineto
+ 282 620 lineto
+ 276 620 lineto
+ 276 618 lineto
+ 266 618 lineto
+ 266 620 lineto
+ 260 618 lineto
+ 258 616 lineto
+ 254 612 lineto
+closepath
+%end path
+fill
+%new path
+ 282 346 moveto
+ 276 346 lineto
+ 276 344 lineto
+ 266 344 lineto
+ 266 346 lineto
+ 260 344 lineto
+ 258 342 lineto
+ 254 338 lineto
+ 252 334 lineto
+ 250 328 lineto
+ 250 322 lineto
+ 250 304 252 288 258 272 curveto
+ 256 274 lineto
+ 258 268 lineto
+ 260 266 lineto
+ 264 254 270 244 276 234 curveto
+ 278 232 lineto
+ 278 230 lineto
+ 282 226 284 222 288 218 curveto
+ 290 216 292 212 294 210 curveto
+ 294 212 lineto
+ 298 208 lineto
+ 298 206 lineto
+ 304 200 310 196 316 192 curveto
+ 318 190 lineto
+ 320 190 lineto
+ 328 184 336 180 344 180 curveto
+ 350 178 lineto
+ 360 174 372 172 382 172 curveto
+ 388 172 lineto
+ 388 174 lineto
+ 398 174 410 176 420 180 curveto
+ 418 178 lineto
+ 424 180 lineto
+ 426 180 lineto
+ 434 182 442 186 450 192 curveto
+ 450 190 lineto
+ 452 192 lineto
+ 454 194 lineto
+ 460 198 466 202 472 208 curveto
+ 470 208 lineto
+ 474 212 lineto
+ 476 212 lineto
+ 478 214 480 218 482 220 curveto
+ 486 224 488 228 492 232 curveto
+ 490 232 lineto
+ 492 234 lineto
+ 494 236 lineto
+ 500 246 506 256 510 268 curveto
+ 512 274 lineto
+ 518 290 520 306 520 324 curveto
+ 520 602 lineto
+ 518 608 lineto
+ 516 612 lineto
+ 512 616 lineto
+ 508 618 lineto
+ 502 620 lineto
+ 496 620 lineto
+ 496 618 lineto
+ 484 618 lineto
+ 486 620 lineto
+ 480 618 lineto
+ 476 616 lineto
+ 472 612 lineto
+ 470 608 lineto
+ 468 602 lineto
+ 468 328 lineto
+ 468 310 466 294 460 278 curveto
+ 462 278 lineto
+ 464 284 lineto
+ 462 284 lineto
+ 458 272 452 260 446 250 curveto
+ 448 252 lineto
+ 450 254 lineto
+ 448 254 lineto
+ 446 250 444 248 442 244 curveto
+ 438 242 436 238 432 236 curveto
+ 434 236 lineto
+ 432 234 lineto
+ 430 228 lineto
+ 430 222 lineto
+ 434 236 lineto
+ 452 244 lineto
+ 446 244 lineto
+ 440 242 lineto
+ 438 240 lineto
+ 436 240 lineto
+ 432 234 426 230 420 226 curveto
+ 422 226 lineto
+ 424 228 lineto
+ 416 222 408 220 400 216 curveto
+ 402 218 lineto
+ 408 220 lineto
+ 406 218 lineto
+ 398 216 390 214 380 214 curveto
+ 382 216 lineto
+ 376 214 lineto
+ 372 212 lineto
+ 368 208 lineto
+ 388 216 lineto
+ 400 208 lineto
+ 396 212 lineto
+ 394 214 lineto
+ 388 216 lineto
+ 386 216 lineto
+ 376 216 368 218 360 220 curveto
+ 366 218 lineto
+ 358 222 350 224 342 230 curveto
+ 344 228 lineto
+ 346 226 lineto
+ 346 228 lineto
+ 340 232 334 236 330 242 curveto
+ 330 240 lineto
+ 328 242 lineto
+ 322 244 lineto
+ 334 236 lineto
+ 338 228 lineto
+ 336 234 lineto
+ 334 236 lineto
+ 334 238 lineto
+ 330 240 328 244 324 246 curveto
+ 322 250 320 252 318 256 curveto
+ 318 254 lineto
+ 320 252 lineto
+ 314 262 308 274 304 286 curveto
+ 304 284 lineto
+ 306 278 lineto
+ 306 280 lineto
+ 300 296 298 312 298 330 curveto
+ 300 328 lineto
+ 298 334 lineto
+ 296 338 lineto
+ 292 342 lineto
+ 288 344 lineto
+ 282 346 lineto
+closepath
+%end path
+fill
+%new path
+ 290 584 moveto
+ 292 586 lineto
+ 294 592 lineto
+ 296 594 lineto
+ 296 598 lineto
+ 294 596 lineto
+ 294 602 lineto
+ 292 608 lineto
+ 290 612 lineto
+ 286 616 lineto
+ 284 618 lineto
+ 278 620 lineto
+ 272 620 lineto
+ 270 618 lineto
+ 214 618 lineto
+ 216 620 lineto
+ 210 618 lineto
+ 206 616 lineto
+ 202 612 lineto
+ 200 608 lineto
+ 198 602 lineto
+ 198 592 lineto
+ 200 586 lineto
+ 202 584 lineto
+ 206 580 lineto
+ 210 578 lineto
+ 216 576 lineto
+ 278 576 lineto
+ 284 578 lineto
+ 286 580 lineto
+ 290 584 lineto
+closepath
+%end path
+fill
+%new path
+ 346 584 moveto
+ 348 586 lineto
+ 350 592 lineto
+ 352 594 lineto
+ 352 598 lineto
+ 350 596 lineto
+ 350 602 lineto
+ 348 608 lineto
+ 346 612 lineto
+ 342 616 lineto
+ 340 618 lineto
+ 334 620 lineto
+ 328 620 lineto
+ 326 618 lineto
+ 270 618 lineto
+ 272 620 lineto
+ 266 618 lineto
+ 262 616 lineto
+ 258 612 lineto
+ 256 608 lineto
+ 254 602 lineto
+ 254 592 lineto
+ 256 586 lineto
+ 258 584 lineto
+ 262 580 lineto
+ 266 578 lineto
+ 272 576 lineto
+ 334 576 lineto
+ 340 578 lineto
+ 342 580 lineto
+ 346 584 lineto
+closepath
+%end path
+fill
+%new path
+ 510 584 moveto
+ 512 586 lineto
+ 514 592 lineto
+ 514 602 lineto
+ 512 608 lineto
+ 510 612 lineto
+ 506 616 lineto
+ 502 618 lineto
+ 496 620 lineto
+ 490 620 lineto
+ 490 618 lineto
+ 434 618 lineto
+ 434 620 lineto
+ 428 618 lineto
+ 426 616 lineto
+ 422 612 lineto
+ 420 608 lineto
+ 418 602 lineto
+ 416 602 lineto
+ 416 598 lineto
+ 418 598 lineto
+ 418 592 lineto
+ 420 586 lineto
+ 422 584 lineto
+ 426 580 lineto
+ 428 578 lineto
+ 434 576 lineto
+ 496 576 lineto
+ 502 578 lineto
+ 506 580 lineto
+ 510 584 lineto
+closepath
+%end path
+fill
+%new path
+ 566 584 moveto
+ 568 586 lineto
+ 570 592 lineto
+ 570 602 lineto
+ 568 608 lineto
+ 566 612 lineto
+ 562 616 lineto
+ 558 618 lineto
+ 552 620 lineto
+ 546 620 lineto
+ 546 618 lineto
+ 490 618 lineto
+ 490 620 lineto
+ 484 618 lineto
+ 482 616 lineto
+ 478 612 lineto
+ 476 608 lineto
+ 474 602 lineto
+ 472 602 lineto
+ 472 598 lineto
+ 474 598 lineto
+ 474 592 lineto
+ 476 586 lineto
+ 478 584 lineto
+ 482 580 lineto
+ 484 578 lineto
+ 490 576 lineto
+ 552 576 lineto
+ 558 578 lineto
+ 562 580 lineto
+ 566 584 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_V
+(
+newpath
+%new path
+ 370 230 moveto
+ 370 252 428 476 458 600 curveto
+ 460 604 462 608 466 612 curveto
+ 470 618 478 620 484 620 curveto
+ 494 620 lineto
+ 494 618 lineto
+ 500 618 504 616 506 614 curveto
+ 510 610 510 606 510 602 curveto
+ 508 602 lineto
+ 508 598 lineto
+ 474 462 440 328 404 192 curveto
+ 404 188 402 184 398 180 curveto
+ 394 176 386 174 380 174 curveto
+ 354 174 lineto
+ 354 176 lineto
+ 348 176 340 178 336 182 curveto
+ 332 186 330 190 330 194 curveto
+ 294 330 260 464 226 600 curveto
+ 226 604 lineto
+ 228 604 lineto
+ 228 608 228 612 232 616 curveto
+ 234 618 238 620 244 620 curveto
+ 254 620 lineto
+ 254 618 lineto
+ 260 618 268 616 272 610 curveto
+ 276 606 278 602 280 598 curveto
+ 310 474 368 250 368 228 curveto
+ 368 230 lineto
+ 370 230 lineto
+closepath
+%end path
+fill
+%new path
+ 270 584 moveto
+ 272 586 lineto
+ 274 592 lineto
+ 274 598 lineto
+ 272 600 lineto
+ 272 602 lineto
+ 270 608 lineto
+ 268 612 lineto
+ 264 616 lineto
+ 262 618 lineto
+ 256 620 lineto
+ 250 620 lineto
+ 248 618 lineto
+ 208 618 lineto
+ 210 620 lineto
+ 204 618 lineto
+ 200 616 lineto
+ 196 612 lineto
+ 194 608 lineto
+ 192 602 lineto
+ 192 592 lineto
+ 194 586 lineto
+ 196 584 lineto
+ 200 580 lineto
+ 204 578 lineto
+ 210 576 lineto
+ 256 576 lineto
+ 262 578 lineto
+ 266 580 lineto
+ 270 584 lineto
+closepath
+%end path
+fill
+%new path
+ 320 584 moveto
+ 322 586 lineto
+ 324 592 lineto
+ 326 594 lineto
+ 326 598 lineto
+ 324 596 lineto
+ 324 602 lineto
+ 322 608 lineto
+ 320 612 lineto
+ 316 616 lineto
+ 314 618 lineto
+ 308 620 lineto
+ 302 620 lineto
+ 300 618 lineto
+ 248 618 lineto
+ 250 620 lineto
+ 244 618 lineto
+ 240 616 lineto
+ 236 612 lineto
+ 234 608 lineto
+ 232 602 lineto
+ 232 596 lineto
+ 234 596 lineto
+ 234 592 lineto
+ 236 586 lineto
+ 238 584 lineto
+ 242 580 lineto
+ 244 578 lineto
+ 250 576 lineto
+ 308 576 lineto
+ 314 578 lineto
+ 316 580 lineto
+ 320 584 lineto
+closepath
+%end path
+fill
+%new path
+ 498 584 moveto
+ 500 586 lineto
+ 502 592 lineto
+ 504 594 lineto
+ 504 602 lineto
+ 502 608 lineto
+ 500 612 lineto
+ 496 616 lineto
+ 492 618 lineto
+ 486 620 lineto
+ 480 620 lineto
+ 480 618 lineto
+ 428 618 lineto
+ 428 620 lineto
+ 422 618 lineto
+ 420 616 lineto
+ 416 612 lineto
+ 414 608 lineto
+ 412 602 lineto
+ 410 602 lineto
+ 410 598 lineto
+ 412 598 lineto
+ 412 592 lineto
+ 414 586 lineto
+ 416 584 lineto
+ 420 580 lineto
+ 422 578 lineto
+ 428 576 lineto
+ 486 576 lineto
+ 492 578 lineto
+ 494 580 lineto
+ 498 584 lineto
+closepath
+%end path
+fill
+%new path
+ 540 584 moveto
+ 542 586 lineto
+ 544 592 lineto
+ 544 602 lineto
+ 542 608 lineto
+ 540 612 lineto
+ 536 616 lineto
+ 532 618 lineto
+ 526 620 lineto
+ 520 620 lineto
+ 520 618 lineto
+ 480 618 lineto
+ 480 620 lineto
+ 474 618 lineto
+ 472 616 lineto
+ 468 612 lineto
+ 466 608 lineto
+ 464 602 lineto
+ 462 602 lineto
+ 462 592 lineto
+ 464 586 lineto
+ 466 584 lineto
+ 470 580 lineto
+ 474 578 lineto
+ 480 576 lineto
+ 526 576 lineto
+ 532 578 lineto
+ 536 580 lineto
+ 540 584 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_W
+(
+newpath
+%new path
+ 274 180 moveto
+ 280 176 284 174 292 174 curveto
+ 292 176 lineto
+ 300 176 lineto
+ 308 176 314 178 320 182 curveto
+ 322 184 324 190 326 194 curveto
+ 342 260 368 376 368 394 curveto
+ 370 394 lineto
+ 370 392 lineto
+ 370 374 396 258 412 192 curveto
+ 414 188 416 182 418 180 curveto
+ 424 176 430 174 438 174 curveto
+ 438 176 lineto
+ 446 176 lineto
+ 454 176 458 178 464 180 curveto
+ 466 184 470 188 470 194 curveto
+ 488 330 508 464 526 600 curveto
+ 526 602 lineto
+ 524 602 lineto
+ 524 608 522 612 520 614 curveto
+ 516 618 512 620 506 620 curveto
+ 506 618 lineto
+ 500 618 494 616 490 612 curveto
+ 486 608 484 604 484 598 curveto
+ 466 474 438 262 438 228 curveto
+ 436 228 lineto
+ 436 230 lineto
+ 436 260 412 360 398 424 curveto
+ 396 428 394 434 390 436 curveto
+ 386 442 380 444 372 444 curveto
+ 372 442 lineto
+ 362 442 lineto
+ 354 442 348 440 344 434 curveto
+ 340 432 338 426 336 422 curveto
+ 322 358 298 258 298 228 curveto
+ 296 228 lineto
+ 296 230 lineto
+ 296 264 268 476 250 600 curveto
+ 250 606 248 610 244 614 curveto
+ 240 618 234 620 228 620 curveto
+ 228 618 lineto
+ 222 618 218 616 214 612 curveto
+ 212 610 210 606 210 600 curveto
+ 212 600 lineto
+ 212 598 lineto
+ 230 462 250 328 268 192 curveto
+ 268 186 272 182 274 180 curveto
+closepath
+%end path
+fill
+%new path
+ 248 584 moveto
+ 250 586 lineto
+ 252 592 lineto
+ 252 598 lineto
+ 250 600 lineto
+ 250 604 lineto
+ 252 602 lineto
+ 250 608 lineto
+ 248 612 lineto
+ 244 616 lineto
+ 240 618 lineto
+ 234 620 lineto
+ 228 620 lineto
+ 228 618 lineto
+ 204 618 lineto
+ 204 620 lineto
+ 198 618 lineto
+ 196 616 lineto
+ 192 612 lineto
+ 190 608 lineto
+ 188 602 lineto
+ 186 602 lineto
+ 186 598 lineto
+ 188 598 lineto
+ 188 592 lineto
+ 190 586 lineto
+ 192 584 lineto
+ 196 580 lineto
+ 198 578 lineto
+ 204 576 lineto
+ 234 576 lineto
+ 240 578 lineto
+ 244 580 lineto
+ 248 584 lineto
+closepath
+%end path
+fill
+%new path
+ 298 584 moveto
+ 300 586 lineto
+ 302 592 lineto
+ 304 594 lineto
+ 304 598 lineto
+ 302 596 lineto
+ 302 602 lineto
+ 300 608 lineto
+ 298 612 lineto
+ 294 616 lineto
+ 292 618 lineto
+ 286 620 lineto
+ 280 620 lineto
+ 278 618 lineto
+ 228 618 lineto
+ 228 620 lineto
+ 222 618 lineto
+ 220 616 lineto
+ 216 612 lineto
+ 214 608 lineto
+ 212 602 lineto
+ 212 592 lineto
+ 214 586 lineto
+ 216 584 lineto
+ 220 580 lineto
+ 222 578 lineto
+ 228 576 lineto
+ 286 576 lineto
+ 292 578 lineto
+ 294 580 lineto
+ 298 584 lineto
+closepath
+%end path
+fill
+%new path
+ 520 584 moveto
+ 522 586 lineto
+ 524 592 lineto
+ 526 594 lineto
+ 526 598 lineto
+ 524 596 lineto
+ 524 602 lineto
+ 522 608 lineto
+ 520 612 lineto
+ 516 616 lineto
+ 514 618 lineto
+ 508 620 lineto
+ 502 620 lineto
+ 500 618 lineto
+ 450 618 lineto
+ 450 620 lineto
+ 444 618 lineto
+ 442 616 lineto
+ 438 612 lineto
+ 436 608 lineto
+ 434 602 lineto
+ 432 602 lineto
+ 432 598 lineto
+ 434 598 lineto
+ 434 592 lineto
+ 436 586 lineto
+ 438 584 lineto
+ 442 580 lineto
+ 444 578 lineto
+ 450 576 lineto
+ 508 576 lineto
+ 514 578 lineto
+ 516 580 lineto
+ 520 584 lineto
+closepath
+%end path
+fill
+%new path
+ 544 584 moveto
+ 546 586 lineto
+ 548 592 lineto
+ 550 594 lineto
+ 550 598 lineto
+ 548 596 lineto
+ 548 602 lineto
+ 546 608 lineto
+ 544 612 lineto
+ 540 616 lineto
+ 538 618 lineto
+ 532 620 lineto
+ 526 620 lineto
+ 524 618 lineto
+ 500 618 lineto
+ 502 620 lineto
+ 496 618 lineto
+ 492 616 lineto
+ 488 612 lineto
+ 486 608 lineto
+ 484 602 lineto
+ 484 592 lineto
+ 486 586 lineto
+ 488 584 lineto
+ 492 580 lineto
+ 496 578 lineto
+ 502 576 lineto
+ 532 576 lineto
+ 538 578 lineto
+ 540 580 lineto
+ 544 584 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_X
+(
+newpath
+%new path
+ 286 614 moveto
+ 282 618 278 620 272 620 curveto
+ 272 618 lineto
+ 250 618 lineto
+ 246 618 244 616 240 614 curveto
+ 238 612 236 608 236 604 curveto
+ 238 604 lineto
+ 238 602 240 600 240 598 curveto
+ 274 536 306 474 340 412 curveto
+ 338 412 lineto
+ 302 340 266 270 230 198 curveto
+ 230 192 lineto
+ 232 192 lineto
+ 232 188 232 184 236 182 curveto
+ 238 180 242 180 244 180 curveto
+ 268 180 lineto
+ 272 180 276 182 280 186 curveto
+ 280 186 282 188 282 190 curveto
+ 310 248 338 306 366 364 curveto
+ 366 362 lineto
+ 394 304 424 246 454 188 curveto
+ 454 186 456 184 458 184 curveto
+ 460 180 466 180 470 180 curveto
+ 492 180 lineto
+ 496 180 500 182 502 184 curveto
+ 504 186 506 190 506 194 curveto
+ 504 194 lineto
+ 504 196 504 198 502 200 curveto
+ 464 272 426 342 388 414 curveto
+ 390 414 lineto
+ 422 476 452 538 484 600 curveto
+ 484 602 486 604 486 606 curveto
+ 484 606 lineto
+ 484 610 482 614 478 616 curveto
+ 476 618 474 620 470 620 curveto
+ 470 618 lineto
+ 448 618 lineto
+ 442 618 438 616 434 612 curveto
+ 434 612 432 610 432 608 curveto
+ 408 562 386 516 364 470 curveto
+ 364 472 lineto
+ 338 518 314 564 290 610 curveto
+ 288 612 288 614 286 614 curveto
+closepath
+%end path
+fill
+%new path
+ 286 584 moveto
+ 288 586 lineto
+ 290 592 lineto
+ 290 598 lineto
+ 288 604 lineto
+ 286 606 lineto
+ 286 606 286 608 284 610 curveto
+ 286 608 lineto
+ 284 612 lineto
+ 280 616 lineto
+ 276 618 lineto
+ 270 620 lineto
+ 264 620 lineto
+ 264 618 lineto
+ 222 618 lineto
+ 224 620 lineto
+ 218 618 lineto
+ 214 616 lineto
+ 210 612 lineto
+ 208 608 lineto
+ 206 602 lineto
+ 206 592 lineto
+ 208 586 lineto
+ 210 584 lineto
+ 214 580 lineto
+ 218 578 lineto
+ 224 576 lineto
+ 272 576 lineto
+ 278 578 lineto
+ 282 580 lineto
+ 286 584 lineto
+closepath
+%end path
+fill
+%new path
+ 336 584 moveto
+ 338 586 lineto
+ 340 592 lineto
+ 342 594 lineto
+ 342 598 lineto
+ 340 596 lineto
+ 340 602 lineto
+ 338 608 lineto
+ 336 612 lineto
+ 332 616 lineto
+ 330 618 lineto
+ 324 620 lineto
+ 318 620 lineto
+ 316 618 lineto
+ 264 618 lineto
+ 264 620 lineto
+ 258 618 lineto
+ 256 616 lineto
+ 252 612 lineto
+ 250 608 lineto
+ 248 602 lineto
+ 248 596 lineto
+ 250 590 lineto
+ 252 588 252 586 252 586 curveto
+ 254 584 lineto
+ 258 580 lineto
+ 260 578 lineto
+ 266 576 lineto
+ 324 576 lineto
+ 330 578 lineto
+ 332 580 lineto
+ 336 584 lineto
+closepath
+%end path
+fill
+%new path
+ 408 216 moveto
+ 406 212 lineto
+ 404 206 lineto
+ 402 206 lineto
+ 402 200 lineto
+ 404 202 lineto
+ 404 196 lineto
+ 406 190 lineto
+ 408 186 lineto
+ 412 182 lineto
+ 414 180 lineto
+ 484 180 lineto
+ 488 182 lineto
+ 492 186 lineto
+ 494 190 lineto
+ 496 196 lineto
+ 496 202 lineto
+ 494 208 lineto
+ 492 208 lineto
+ 492 210 492 212 490 214 curveto
+ 492 212 lineto
+ 490 216 lineto
+ 486 220 lineto
+ 482 222 lineto
+ 476 224 lineto
+ 470 224 lineto
+ 470 222 lineto
+ 420 222 lineto
+ 420 224 lineto
+ 414 222 lineto
+ 412 220 lineto
+ 408 216 lineto
+closepath
+%end path
+fill
+%new path
+ 458 216 moveto
+ 456 212 lineto
+ 454 206 lineto
+ 454 200 lineto
+ 456 194 lineto
+ 458 192 458 190 458 188 curveto
+ 458 190 lineto
+ 460 186 lineto
+ 464 182 lineto
+ 466 180 lineto
+ 526 180 lineto
+ 528 182 lineto
+ 532 186 lineto
+ 534 190 lineto
+ 536 196 lineto
+ 538 196 lineto
+ 538 202 lineto
+ 536 200 lineto
+ 536 206 lineto
+ 534 212 lineto
+ 532 216 lineto
+ 528 220 lineto
+ 526 222 lineto
+ 520 224 lineto
+ 514 224 lineto
+ 512 222 lineto
+ 470 222 lineto
+ 470 224 lineto
+ 464 222 lineto
+ 462 220 lineto
+ 458 216 lineto
+closepath
+%end path
+fill
+%new path
+ 470 584 moveto
+ 472 586 lineto
+ 472 588 lineto
+ 472 588 474 590 474 592 curveto
+ 472 590 lineto
+ 474 596 lineto
+ 474 602 lineto
+ 472 608 lineto
+ 470 612 lineto
+ 466 616 lineto
+ 464 618 lineto
+ 458 620 lineto
+ 452 620 lineto
+ 450 618 lineto
+ 398 618 lineto
+ 400 620 lineto
+ 394 618 lineto
+ 390 616 lineto
+ 386 612 lineto
+ 384 608 lineto
+ 382 602 lineto
+ 382 592 lineto
+ 384 586 lineto
+ 386 584 lineto
+ 390 580 lineto
+ 394 578 lineto
+ 400 576 lineto
+ 456 576 lineto
+ 462 578 lineto
+ 466 580 lineto
+ 470 584 lineto
+closepath
+%end path
+fill
+%new path
+ 512 584 moveto
+ 514 586 lineto
+ 516 592 lineto
+ 516 602 lineto
+ 514 608 lineto
+ 512 612 lineto
+ 508 616 lineto
+ 504 618 lineto
+ 498 620 lineto
+ 492 620 lineto
+ 492 618 lineto
+ 450 618 lineto
+ 452 620 lineto
+ 446 618 lineto
+ 442 616 lineto
+ 438 612 lineto
+ 436 608 lineto
+ 436 606 434 604 434 604 curveto
+ 436 604 lineto
+ 434 598 lineto
+ 434 592 lineto
+ 436 586 lineto
+ 438 584 lineto
+ 442 580 lineto
+ 444 578 lineto
+ 450 576 lineto
+ 498 576 lineto
+ 504 578 lineto
+ 508 580 lineto
+ 512 584 lineto
+closepath
+%end path
+fill
+%new path
+ 202 216 moveto
+ 200 212 lineto
+ 198 206 lineto
+ 198 196 lineto
+ 200 190 lineto
+ 202 186 lineto
+ 206 182 lineto
+ 210 180 lineto
+ 268 180 lineto
+ 272 182 lineto
+ 276 186 lineto
+ 278 190 lineto
+ 278 192 280 194 280 196 curveto
+ 280 194 lineto
+ 282 200 lineto
+ 282 206 lineto
+ 280 212 lineto
+ 278 216 lineto
+ 274 220 lineto
+ 270 222 lineto
+ 264 224 lineto
+ 258 224 lineto
+ 258 222 lineto
+ 214 222 lineto
+ 216 224 lineto
+ 210 222 lineto
+ 206 220 lineto
+ 202 216 lineto
+closepath
+%end path
+fill
+%new path
+ 246 216 moveto
+ 244 212 lineto
+ 242 212 lineto
+ 242 210 240 208 240 206 curveto
+ 242 208 lineto
+ 240 202 lineto
+ 240 196 lineto
+ 242 190 lineto
+ 244 186 lineto
+ 248 182 lineto
+ 250 180 lineto
+ 320 180 lineto
+ 324 182 lineto
+ 328 186 lineto
+ 330 190 lineto
+ 332 196 lineto
+ 332 206 lineto
+ 330 212 lineto
+ 328 216 lineto
+ 324 220 lineto
+ 320 222 lineto
+ 314 224 lineto
+ 308 224 lineto
+ 308 222 lineto
+ 258 222 lineto
+ 258 224 lineto
+ 252 222 lineto
+ 250 220 lineto
+ 246 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_Y
+(
+newpath
+%new path
+ 370 406 moveto
+ 370 422 424 536 456 600 curveto
+ 458 604 460 606 462 610 curveto
+ 470 616 478 620 488 620 curveto
+ 500 620 lineto
+ 500 618 lineto
+ 502 618 506 616 508 614 curveto
+ 512 612 512 608 512 604 curveto
+ 510 604 lineto
+ 510 598 lineto
+ 470 516 432 436 392 354 curveto
+ 392 198 lineto
+ 392 192 390 188 386 184 curveto
+ 382 180 378 180 372 180 curveto
+ 362 180 lineto
+ 356 180 352 182 348 186 curveto
+ 344 190 342 194 342 200 curveto
+ 344 200 lineto
+ 344 356 lineto
+ 342 356 lineto
+ 302 438 264 518 224 600 curveto
+ 224 602 222 604 222 606 curveto
+ 224 606 lineto
+ 224 610 226 614 230 616 curveto
+ 232 618 236 620 238 620 curveto
+ 250 620 lineto
+ 250 618 lineto
+ 260 618 268 614 276 608 curveto
+ 278 604 280 602 282 598 curveto
+ 314 534 368 420 368 404 curveto
+ 368 406 lineto
+ 370 406 lineto
+closepath
+%end path
+fill
+%new path
+ 272 584 moveto
+ 274 586 lineto
+ 276 592 lineto
+ 276 598 lineto
+ 274 604 lineto
+ 272 606 lineto
+ 272 606 270 608 270 610 curveto
+ 272 608 lineto
+ 270 612 lineto
+ 266 616 lineto
+ 262 618 lineto
+ 256 620 lineto
+ 250 620 lineto
+ 250 618 lineto
+ 208 618 lineto
+ 210 620 lineto
+ 204 618 lineto
+ 200 616 lineto
+ 196 612 lineto
+ 194 608 lineto
+ 192 602 lineto
+ 192 592 lineto
+ 194 586 lineto
+ 196 584 lineto
+ 200 580 lineto
+ 204 578 lineto
+ 210 576 lineto
+ 258 576 lineto
+ 264 578 lineto
+ 268 580 lineto
+ 272 584 lineto
+closepath
+%end path
+fill
+%new path
+ 322 584 moveto
+ 324 586 lineto
+ 326 592 lineto
+ 326 602 lineto
+ 324 608 lineto
+ 322 612 lineto
+ 318 616 lineto
+ 314 618 lineto
+ 308 620 lineto
+ 302 620 lineto
+ 302 618 lineto
+ 250 618 lineto
+ 250 620 lineto
+ 244 618 lineto
+ 242 616 lineto
+ 238 612 lineto
+ 236 608 lineto
+ 234 602 lineto
+ 234 596 lineto
+ 236 590 lineto
+ 236 588 238 586 238 586 curveto
+ 240 584 lineto
+ 244 580 lineto
+ 246 578 lineto
+ 252 576 lineto
+ 308 576 lineto
+ 314 578 lineto
+ 318 580 lineto
+ 322 584 lineto
+closepath
+%end path
+fill
+%new path
+ 496 584 moveto
+ 498 586 lineto
+ 500 588 lineto
+ 500 588 502 590 502 592 curveto
+ 500 590 lineto
+ 502 596 lineto
+ 502 602 lineto
+ 500 608 lineto
+ 498 612 lineto
+ 494 616 lineto
+ 492 618 lineto
+ 486 620 lineto
+ 480 620 lineto
+ 478 618 lineto
+ 426 618 lineto
+ 428 620 lineto
+ 422 618 lineto
+ 418 616 lineto
+ 414 612 lineto
+ 412 608 lineto
+ 410 602 lineto
+ 410 592 lineto
+ 412 586 lineto
+ 414 584 lineto
+ 418 580 lineto
+ 422 578 lineto
+ 428 576 lineto
+ 484 576 lineto
+ 490 578 lineto
+ 492 580 lineto
+ 496 584 lineto
+closepath
+%end path
+fill
+%new path
+ 540 584 moveto
+ 542 586 lineto
+ 544 592 lineto
+ 544 602 lineto
+ 542 608 lineto
+ 540 612 lineto
+ 536 616 lineto
+ 532 618 lineto
+ 526 620 lineto
+ 520 620 lineto
+ 520 618 lineto
+ 478 618 lineto
+ 480 620 lineto
+ 474 618 lineto
+ 470 616 lineto
+ 466 612 lineto
+ 464 608 lineto
+ 464 606 462 604 462 604 curveto
+ 460 598 lineto
+ 460 592 lineto
+ 462 586 lineto
+ 464 584 lineto
+ 468 580 lineto
+ 472 578 lineto
+ 478 576 lineto
+ 526 576 lineto
+ 532 578 lineto
+ 536 580 lineto
+ 540 584 lineto
+closepath
+%end path
+fill
+%new path
+ 300 216 moveto
+ 298 212 lineto
+ 296 206 lineto
+ 294 206 lineto
+ 294 200 lineto
+ 296 202 lineto
+ 296 196 lineto
+ 298 190 lineto
+ 300 186 lineto
+ 304 182 lineto
+ 306 180 lineto
+ 378 180 lineto
+ 380 182 lineto
+ 384 186 lineto
+ 386 190 lineto
+ 388 196 lineto
+ 390 196 lineto
+ 390 202 lineto
+ 388 200 lineto
+ 388 206 lineto
+ 386 212 lineto
+ 384 216 lineto
+ 380 220 lineto
+ 378 222 lineto
+ 372 224 lineto
+ 366 224 lineto
+ 364 222 lineto
+ 312 222 lineto
+ 312 224 lineto
+ 306 222 lineto
+ 304 220 lineto
+ 300 216 lineto
+closepath
+%end path
+fill
+%new path
+ 352 216 moveto
+ 350 212 lineto
+ 348 206 lineto
+ 348 196 lineto
+ 350 190 lineto
+ 352 186 lineto
+ 356 182 lineto
+ 360 180 lineto
+ 430 180 lineto
+ 432 182 lineto
+ 436 186 lineto
+ 438 190 lineto
+ 440 196 lineto
+ 442 196 lineto
+ 442 202 lineto
+ 440 200 lineto
+ 440 206 lineto
+ 438 212 lineto
+ 436 216 lineto
+ 432 220 lineto
+ 430 222 lineto
+ 424 224 lineto
+ 418 224 lineto
+ 416 222 lineto
+ 364 222 lineto
+ 366 224 lineto
+ 360 222 lineto
+ 356 220 lineto
+ 352 216 lineto
+closepath
+%end path
+fill
+) def
+
+/The_letter_Z
+(
+newpath
+%new path
+ 474 618 moveto
+ 474 612 476 606 478 600 curveto
+ 476 600 lineto
+ 476 600 216 220 216 220 curveto
+ 214 216 212 212 212 208 curveto
+ 212 198 lineto
+ 214 198 lineto
+ 214 192 216 188 220 184 curveto
+ 224 180 228 180 234 180 curveto
+ 262 180 lineto
+ 262 186 260 192 258 198 curveto
+ 260 198 lineto
+ 260 198 520 578 520 578 curveto
+ 522 582 524 586 524 590 curveto
+ 524 600 lineto
+ 522 600 lineto
+ 522 606 520 610 516 614 curveto
+ 512 618 508 620 502 620 curveto
+ 502 618 lineto
+ 472 618 lineto
+closepath
+%end path
+fill
+%new path
+ 268 514 moveto
+ 270 518 lineto
+ 272 524 lineto
+ 272 598 lineto
+ 268 582 lineto
+ 248 574 lineto
+ 254 574 lineto
+ 256 576 lineto
+ 502 576 lineto
+ 500 574 lineto
+ 506 576 lineto
+ 510 578 lineto
+ 514 582 lineto
+ 516 586 lineto
+ 518 592 lineto
+ 518 602 lineto
+ 516 608 lineto
+ 514 612 lineto
+ 510 616 lineto
+ 506 618 lineto
+ 500 620 lineto
+ 494 620 lineto
+ 494 618 lineto
+ 238 618 lineto
+ 238 620 lineto
+ 232 618 lineto
+ 230 616 lineto
+ 226 612 lineto
+ 224 608 lineto
+ 222 602 lineto
+ 220 602 lineto
+ 220 528 lineto
+ 222 530 lineto
+ 222 524 lineto
+ 224 518 lineto
+ 226 514 lineto
+ 230 510 lineto
+ 232 508 lineto
+ 238 506 lineto
+ 244 506 lineto
+ 246 508 lineto
+ 256 508 lineto
+ 254 506 lineto
+ 260 508 lineto
+ 264 510 lineto
+ 268 514 lineto
+closepath
+%end path
+fill
+%new path
+ 480 298 moveto
+ 478 294 lineto
+ 476 288 lineto
+ 476 200 lineto
+ 480 216 lineto
+ 500 224 lineto
+ 494 224 lineto
+ 492 222 lineto
+ 234 222 lineto
+ 236 224 lineto
+ 230 222 lineto
+ 226 220 lineto
+ 222 216 lineto
+ 220 212 lineto
+ 218 206 lineto
+ 218 196 lineto
+ 220 190 lineto
+ 222 188 lineto
+ 226 184 lineto
+ 230 182 lineto
+ 236 180 lineto
+ 510 180 lineto
+ 516 182 lineto
+ 520 184 lineto
+ 524 188 lineto
+ 526 190 lineto
+ 528 196 lineto
+ 528 288 lineto
+ 526 294 lineto
+ 524 298 lineto
+ 520 302 lineto
+ 516 304 lineto
+ 510 306 lineto
+ 504 306 lineto
+ 504 304 lineto
+ 492 304 lineto
+ 494 306 lineto
+ 488 304 lineto
+ 484 302 lineto
+ 480 298 lineto
+closepath
+%end path
+fill
+) def
+
+end % of CharDefs dictionary
+
+Encoding 65 /The_letter_A put
+Encoding 66 /The_letter_B put
+Encoding 67 /The_letter_C put
+Encoding 68 /The_letter_D put
+Encoding 69 /The_letter_E put
+Encoding 70 /The_letter_F put
+Encoding 71 /The_letter_G put
+Encoding 72 /The_letter_H put
+Encoding 73 /The_letter_I put
+Encoding 74 /The_letter_J put
+Encoding 75 /The_letter_K put
+Encoding 76 /The_letter_L put
+Encoding 77 /The_letter_M put
+Encoding 78 /The_letter_N put
+Encoding 79 /The_letter_O put
+Encoding 80 /The_letter_P put
+Encoding 81 /The_letter_Q put
+Encoding 82 /The_letter_R put
+Encoding 83 /The_letter_S put
+Encoding 84 /The_letter_T put
+Encoding 85 /The_letter_U put
+Encoding 86 /The_letter_V put
+Encoding 87 /The_letter_W put
+Encoding 88 /The_letter_X put
+Encoding 89 /The_letter_Y put
+Encoding 90 /The_letter_Z put
+
+Metrics
+ begin
+/The_letter_A 353 fudge add def
+/The_letter_B 343 fudge add def
+/The_letter_C 343 fudge add def
+/The_letter_D 345 fudge add def
+/The_letter_E 357 fudge add def
+/The_letter_F 349 fudge add def
+/The_letter_G 353 fudge add def
+/The_letter_H 359 fudge add def
+/The_letter_I 317 fudge add def
+/The_letter_J 339 fudge add def
+/The_letter_K 353 fudge add def
+/The_letter_L 347 fudge add def
+/The_letter_M 361 fudge add def
+/The_letter_N 353 fudge add def
+/The_letter_O 333 fudge add def
+/The_letter_P 341 fudge add def
+/The_letter_Q 333 fudge add def
+/The_letter_R 371 fudge add def
+/The_letter_S 335 fudge add def
+/The_letter_T 355 fudge add def
+/The_letter_U 385 fudge add def
+/The_letter_V 359 fudge add def
+/The_letter_W 365 fudge add def
+/The_letter_X 353 fudge add def
+/The_letter_Y 359 fudge add def
+/The_letter_Z 343 fudge add def
+/.notdef 450 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.5 1.5 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 0
+ 0 -180
+ charwdth 1000
+ setcachedevice
+ -186 fudge add -180 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [186 fudge sub 80 570 630] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 8 scalefont setfont
+ 100 710 moveto (THIS IS CMTT EIGHT POINTS WRITTEN IN POSTSCRIPT) show
+ /Simon findfont 10 scalefont setfont
+ 100 698 moveto (THIS IS CMTT TEN POINTS WRITTEN IN POSTSCRIPT) show
+ /Simon findfont 12 scalefont setfont
+ 100 686 moveto (THIS IS CMTT TWELVE POINTS WRITTEN IN POSTSCRIPT) show
+ showpage
diff --git a/fonts/utilities/mf2ps/doc/printsamples/lasy.ps b/fonts/utilities/mf2ps/doc/printsamples/lasy.ps
new file mode 100644
index 0000000000..294ddac973
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/lasy.ps
@@ -0,0 +1,1715 @@
+%! Simon font
+%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 110 def
+SimonFont begin
+%%
+ /FontType 3 def
+ /FontMatrix [0.000895 0 0 0.000895 0 0] def
+% /FontMatrix [0.001 0 0 0.001 0 0] def
+
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+
+/Leftward_arrowhead
+(
+newpath
+%new path
+ 220 356 moveto
+ 224 354 lineto
+ 224 352 lineto
+ 250 342 274 326 294 306 curveto
+ 292 308 lineto
+ 296 306 lineto
+ 290 310 lineto
+ 288 314 lineto
+ 290 310 lineto
+ 310 288 328 264 338 234 curveto
+ 338 236 lineto
+ 340 232 lineto
+ 354 232 lineto
+ 358 236 lineto
+ 358 244 lineto
+ 356 244 lineto
+ 344 274 328 300 306 322 curveto
+ 304 324 lineto
+ 302 326 lineto
+ 286 342 266 358 244 368 curveto
+ 244 366 lineto
+ 242 368 lineto
+ 248 364 lineto
+ 248 358 lineto
+ 250 360 lineto
+ 248 360 lineto
+ 248 356 lineto
+ 240 352 lineto
+ 242 352 lineto
+ 244 354 lineto
+ 246 354 lineto
+ 268 364 288 380 304 396 curveto
+ 306 398 lineto
+ 308 400 lineto
+ 330 422 346 448 358 478 curveto
+ 358 484 lineto
+ 354 488 lineto
+ 340 488 lineto
+ 338 484 lineto
+ 336 484 lineto
+ 326 454 308 430 288 408 curveto
+ 290 410 lineto
+ 288 406 lineto
+ 288 404 lineto
+ 290 410 lineto
+ 298 414 lineto
+ 296 414 lineto
+ 292 412 lineto
+ 272 392 248 376 222 366 curveto
+ 224 368 lineto
+ 220 364 lineto
+ 220 356 lineto
+closepath
+%end path
+fill
+) def
+
+/Rightward_arrowhead
+(
+newpath
+%new path
+ 378 364 moveto
+ 376 368 lineto
+ 374 368 lineto
+ 348 378 324 394 304 414 curveto
+ 306 412 lineto
+ 302 414 lineto
+ 308 410 lineto
+ 310 406 lineto
+ 308 410 lineto
+ 288 432 270 456 260 486 curveto
+ 260 484 lineto
+ 258 488 lineto
+ 244 488 lineto
+ 240 484 lineto
+ 240 476 lineto
+ 242 476 lineto
+ 254 446 270 420 292 398 curveto
+ 294 396 lineto
+ 296 394 lineto
+ 312 378 332 362 354 352 curveto
+ 354 354 lineto
+ 356 352 lineto
+ 350 356 lineto
+ 350 362 lineto
+ 348 360 lineto
+ 350 360 lineto
+ 350 364 lineto
+ 358 368 lineto
+ 356 368 lineto
+ 354 366 lineto
+ 352 366 lineto
+ 330 356 310 340 294 324 curveto
+ 292 322 lineto
+ 290 320 lineto
+ 268 298 252 272 240 242 curveto
+ 240 236 lineto
+ 244 232 lineto
+ 258 232 lineto
+ 260 236 lineto
+ 262 236 lineto
+ 272 266 290 290 310 312 curveto
+ 308 310 lineto
+ 310 314 lineto
+ 310 316 lineto
+ 308 310 lineto
+ 300 306 lineto
+ 302 306 lineto
+ 306 308 lineto
+ 326 328 350 344 376 354 curveto
+ 378 356 lineto
+ 380 360 lineto
+ 380 362 lineto
+ 378 364 lineto
+closepath
+%end path
+fill
+) def
+
+/Upward_arrowhead
+(
+newpath
+%new path
+ 352 176 moveto
+ 340 150 324 126 306 106 curveto
+ 306 108 lineto
+ 314 112 lineto
+ 312 112 lineto
+ 310 110 lineto
+ 308 110 lineto
+ 288 90 262 72 234 62 curveto
+ 232 60 lineto
+ 230 56 lineto
+ 230 48 lineto
+ 232 46 lineto
+ 234 42 lineto
+ 242 42 lineto
+ 244 44 lineto
+ 274 56 300 72 322 94 curveto
+ 320 94 lineto
+ 324 96 lineto
+ 324 98 lineto
+ 342 114 356 134 366 156 curveto
+ 366 156 lineto
+ 358 152 lineto
+ 364 152 lineto
+ 366 156 lineto
+ 358 152 lineto
+ 352 156 lineto
+ 356 152 lineto
+ 358 152 lineto
+ 352 156 lineto
+ 352 156 lineto
+ 354 154 lineto
+ 364 132 378 112 396 96 curveto
+ 394 96 lineto
+ 398 94 lineto
+ 398 92 lineto
+ 420 70 446 54 476 42 curveto
+ 484 42 lineto
+ 486 46 lineto
+ 488 48 lineto
+ 488 56 lineto
+ 486 60 lineto
+ 484 62 lineto
+ 482 64 lineto
+ 454 74 428 92 408 112 curveto
+ 408 110 lineto
+ 406 112 lineto
+ 412 108 lineto
+ 412 108 lineto
+ 410 108 lineto
+ 392 128 376 152 366 178 curveto
+ 366 176 lineto
+ 364 180 lineto
+ 356 180 lineto
+ 352 176 lineto
+closepath
+%end path
+fill
+) def
+
+/Downward_arrowhead
+(
+newpath
+%new path
+ 366 184 moveto
+ 368 184 lineto
+ 378 210 394 234 412 254 curveto
+ 412 252 lineto
+ 404 248 lineto
+ 406 248 lineto
+ 408 250 lineto
+ 410 250 lineto
+ 430 270 456 288 484 298 curveto
+ 486 300 lineto
+ 488 304 lineto
+ 488 312 lineto
+ 486 314 lineto
+ 484 318 lineto
+ 476 318 lineto
+ 474 316 lineto
+ 444 304 418 288 396 266 curveto
+ 398 266 lineto
+ 394 264 lineto
+ 394 262 lineto
+ 376 246 362 226 352 204 curveto
+ 352 204 lineto
+ 360 208 lineto
+ 354 208 lineto
+ 352 204 lineto
+ 360 208 lineto
+ 366 204 lineto
+ 362 208 lineto
+ 360 208 lineto
+ 366 204 lineto
+ 366 204 lineto
+ 364 206 lineto
+ 354 228 340 248 322 264 curveto
+ 324 264 lineto
+ 320 266 lineto
+ 320 268 lineto
+ 298 290 272 306 242 318 curveto
+ 234 318 lineto
+ 232 314 lineto
+ 230 312 lineto
+ 230 304 lineto
+ 232 300 lineto
+ 234 298 lineto
+ 236 296 lineto
+ 264 286 290 268 310 248 curveto
+ 310 250 lineto
+ 312 248 lineto
+ 306 252 lineto
+ 306 252 lineto
+ 308 252 lineto
+ 326 232 342 208 354 182 curveto
+ 352 184 lineto
+ 356 180 lineto
+ 364 180 lineto
+ 366 184 lineto
+closepath
+%end path
+fill
+) def
+
+/Square_subset_sign
+(
+newpath
+%new path
+ 682 570 moveto
+ 678 570 lineto
+ 676 568 lineto
+ 260 568 lineto
+ 260 570 lineto
+ 254 568 lineto
+ 250 564 lineto
+ 248 560 lineto
+ 248 556 lineto
+ 246 556 lineto
+ 246 168 lineto
+ 248 170 lineto
+ 248 162 lineto
+ 250 158 lineto
+ 254 154 lineto
+ 260 152 lineto
+ 264 152 lineto
+ 266 154 lineto
+ 682 154 lineto
+ 682 152 lineto
+ 688 154 lineto
+ 692 158 lineto
+ 694 162 lineto
+ 694 174 lineto
+ 692 176 lineto
+ 688 180 lineto
+ 254 180 lineto
+ 250 176 lineto
+ 264 180 lineto
+ 274 176 lineto
+ 270 180 lineto
+ 264 180 lineto
+ 274 176 lineto
+ 278 170 lineto
+ 276 174 lineto
+ 274 176 lineto
+ 278 170 lineto
+ 274 158 lineto
+ 276 162 lineto
+ 278 166 lineto
+ 278 556 lineto
+ 274 546 lineto
+ 260 540 lineto
+ 682 540 lineto
+ 688 542 lineto
+ 692 546 lineto
+ 694 548 lineto
+ 694 560 lineto
+ 692 564 lineto
+ 688 568 lineto
+ 682 570 lineto
+closepath
+%end path
+fill
+) def
+
+/Square_superset_sign
+(
+newpath
+%new path
+ 236 540 moveto
+ 658 540 lineto
+ 664 542 lineto
+ 668 546 lineto
+ 654 540 lineto
+ 644 546 lineto
+ 648 542 lineto
+ 654 540 lineto
+ 644 546 lineto
+ 642 552 lineto
+ 642 548 lineto
+ 644 546 lineto
+ 642 552 lineto
+ 644 564 lineto
+ 642 560 lineto
+ 642 556 lineto
+ 640 556 lineto
+ 640 168 lineto
+ 642 170 lineto
+ 642 166 lineto
+ 644 176 lineto
+ 658 180 lineto
+ 230 180 lineto
+ 226 176 lineto
+ 224 174 lineto
+ 224 162 lineto
+ 226 158 lineto
+ 230 154 lineto
+ 236 152 lineto
+ 240 152 lineto
+ 242 154 lineto
+ 660 154 lineto
+ 658 152 lineto
+ 664 154 lineto
+ 668 158 lineto
+ 670 162 lineto
+ 672 166 lineto
+ 672 556 lineto
+ 670 560 lineto
+ 668 564 lineto
+ 664 568 lineto
+ 658 570 lineto
+ 654 570 lineto
+ 654 568 lineto
+ 236 568 lineto
+ 236 570 lineto
+ 230 568 lineto
+ 226 564 lineto
+ 224 560 lineto
+ 224 548 lineto
+ 226 546 lineto
+ 230 542 lineto
+ 236 540 lineto
+closepath
+%end path
+fill
+) def
+
+/Diamond
+(
+newpath
+%new path
+ 678 424 moveto
+ 682 434 lineto
+ 680 434 lineto
+ 604 356 528 280 452 204 curveto
+ 450 202 lineto
+ 450 194 lineto
+ 452 204 lineto
+ 466 210 lineto
+ 462 210 lineto
+ 456 208 lineto
+ 452 204 lineto
+ 466 210 lineto
+ 476 204 lineto
+ 472 208 lineto
+ 466 210 lineto
+ 476 204 lineto
+ 480 198 lineto
+ 478 202 lineto
+ 476 204 lineto
+ 476 206 lineto
+ 398 282 322 358 246 436 curveto
+ 248 434 lineto
+ 250 428 lineto
+ 248 416 lineto
+ 248 418 lineto
+ 324 494 400 570 478 648 curveto
+ 476 646 lineto
+ 478 650 lineto
+ 480 654 lineto
+ 480 658 lineto
+ 476 646 lineto
+ 462 640 lineto
+ 466 640 lineto
+ 472 642 lineto
+ 476 646 lineto
+ 462 640 lineto
+ 452 646 lineto
+ 456 642 lineto
+ 462 640 lineto
+ 452 646 lineto
+ 450 654 lineto
+ 450 650 lineto
+ 452 646 lineto
+ 454 646 lineto
+ 530 568 606 492 682 416 curveto
+ 678 424 lineto
+closepath
+%end path
+%new path
+ 708 428 moveto
+ 708 432 lineto
+ 706 434 lineto
+ 704 436 lineto
+ 628 512 552 588 476 666 curveto
+ 476 664 lineto
+ 472 668 lineto
+ 466 670 lineto
+ 462 670 lineto
+ 456 668 lineto
+ 452 664 lineto
+ 374 586 298 510 222 434 curveto
+ 224 434 lineto
+ 222 432 lineto
+ 220 428 lineto
+ 220 424 lineto
+ 222 420 lineto
+ 224 416 lineto
+ 300 338 376 262 454 186 curveto
+ 452 186 lineto
+ 456 182 lineto
+ 462 180 lineto
+ 466 180 lineto
+ 472 182 lineto
+ 476 186 lineto
+ 478 188 lineto
+ 554 264 630 340 706 418 curveto
+ 706 416 lineto
+ 708 420 lineto
+ 708 428 lineto
+closepath
+%end path
+fill
+) def
+
+/Square
+(
+newpath
+%new path
+ 272 606 moveto
+ 258 600 lineto
+ 262 600 lineto
+ 264 602 lineto
+ 644 602 lineto
+ 642 600 lineto
+ 648 602 lineto
+ 652 606 lineto
+ 638 600 lineto
+ 628 606 lineto
+ 632 602 lineto
+ 638 600 lineto
+ 628 606 lineto
+ 626 614 lineto
+ 626 610 lineto
+ 628 606 lineto
+ 626 614 lineto
+ 628 624 lineto
+ 626 622 lineto
+ 626 618 lineto
+ 624 616 lineto
+ 624 236 lineto
+ 626 238 lineto
+ 626 234 lineto
+ 628 244 lineto
+ 642 250 lineto
+ 258 250 lineto
+ 252 248 lineto
+ 248 244 lineto
+ 262 250 lineto
+ 272 244 lineto
+ 268 248 lineto
+ 262 250 lineto
+ 272 244 lineto
+ 276 238 lineto
+ 274 242 lineto
+ 272 244 lineto
+ 276 238 lineto
+ 272 226 lineto
+ 274 230 lineto
+ 276 234 lineto
+ 276 618 lineto
+ 272 606 lineto
+closepath
+%end path
+%new path
+ 248 624 moveto
+ 246 622 lineto
+ 246 618 lineto
+ 244 616 lineto
+ 244 236 lineto
+ 246 238 lineto
+ 246 230 lineto
+ 248 226 lineto
+ 252 222 lineto
+ 258 220 lineto
+ 262 220 lineto
+ 264 222 lineto
+ 644 222 lineto
+ 642 220 lineto
+ 648 222 lineto
+ 652 226 lineto
+ 654 230 lineto
+ 656 234 lineto
+ 656 618 lineto
+ 654 622 lineto
+ 652 624 lineto
+ 648 628 lineto
+ 642 630 lineto
+ 258 630 lineto
+ 252 628 lineto
+ 248 624 lineto
+closepath
+%end path
+fill
+) def
+
+/Bowtie_operator
+(
+newpath
+%new path
+ 252 218 moveto
+ 254 218 lineto
+ 386 352 518 484 652 618 curveto
+ 650 618 lineto
+ 652 620 lineto
+ 654 624 lineto
+ 654 628 lineto
+ 650 618 lineto
+ 636 612 lineto
+ 640 612 lineto
+ 646 614 lineto
+ 650 618 lineto
+ 636 612 lineto
+ 626 618 lineto
+ 630 614 lineto
+ 636 612 lineto
+ 626 618 lineto
+ 624 624 lineto
+ 624 620 lineto
+ 626 618 lineto
+ 624 624 lineto
+ 626 636 lineto
+ 624 632 lineto
+ 624 628 lineto
+ 622 628 lineto
+ 622 228 lineto
+ 624 228 lineto
+ 624 224 lineto
+ 626 236 lineto
+ 640 242 lineto
+ 636 242 lineto
+ 630 240 lineto
+ 626 236 lineto
+ 640 242 lineto
+ 650 236 lineto
+ 646 240 lineto
+ 640 242 lineto
+ 650 236 lineto
+ 654 228 lineto
+ 652 232 lineto
+ 650 236 lineto
+ 516 370 384 502 252 636 curveto
+ 248 640 lineto
+ 242 642 lineto
+ 238 642 lineto
+ 232 640 lineto
+ 228 636 lineto
+ 226 632 lineto
+ 226 628 lineto
+ 224 628 lineto
+ 224 228 lineto
+ 226 228 lineto
+ 226 220 lineto
+ 228 218 lineto
+ 232 214 lineto
+ 238 212 lineto
+ 242 212 lineto
+ 248 214 lineto
+ 252 218 lineto
+closepath
+%end path
+%new path
+ 256 228 moveto
+ 252 218 lineto
+ 254 220 lineto
+ 256 224 lineto
+ 256 628 lineto
+ 252 618 lineto
+ 238 612 lineto
+ 242 612 lineto
+ 248 614 lineto
+ 252 618 lineto
+ 238 612 lineto
+ 228 618 lineto
+ 232 614 lineto
+ 238 612 lineto
+ 228 618 lineto
+ 226 624 lineto
+ 226 620 lineto
+ 228 618 lineto
+ 230 616 lineto
+ 362 482 494 350 628 216 curveto
+ 626 218 lineto
+ 630 214 lineto
+ 636 212 lineto
+ 640 212 lineto
+ 646 214 lineto
+ 650 218 lineto
+ 652 220 lineto
+ 654 224 lineto
+ 654 628 lineto
+ 652 632 lineto
+ 650 636 lineto
+ 646 640 lineto
+ 640 642 lineto
+ 636 642 lineto
+ 630 640 lineto
+ 626 636 lineto
+ 626 634 lineto
+ 492 500 360 368 228 234 curveto
+ 228 236 lineto
+ 226 232 lineto
+ 226 224 lineto
+ 228 236 lineto
+ 242 242 lineto
+ 238 242 lineto
+ 232 240 lineto
+ 228 236 lineto
+ 242 242 lineto
+ 252 236 lineto
+ 248 240 lineto
+ 242 242 lineto
+ 252 236 lineto
+ 256 228 lineto
+ 254 232 lineto
+ 252 236 lineto
+ 256 228 lineto
+closepath
+%end path
+fill
+) def
+
+/Upside-down_Uppercase_Greek_Omega
+(
+newpath
+%new path
+ 510 662 moveto
+ 510 624 518 590 530 556 curveto
+ 528 558 lineto
+ 530 554 lineto
+ 544 516 558 480 572 442 curveto
+ 570 444 lineto
+ 570 446 lineto
+ 582 412 590 378 590 342 curveto
+ 588 342 lineto
+ 590 340 lineto
+ 588 342 lineto
+ 590 348 lineto
+ 588 344 lineto
+ 588 320 584 300 578 278 curveto
+ 578 280 lineto
+ 580 282 lineto
+ 578 282 lineto
+ 572 260 562 240 546 224 curveto
+ 544 222 542 222 542 220 curveto
+ 542 220 lineto
+ 550 224 lineto
+ 546 224 lineto
+ 544 222 lineto
+ 528 206 506 192 484 186 curveto
+ 488 188 lineto
+ 486 186 lineto
+ 470 180 454 180 438 180 curveto
+ 436 180 lineto
+ 432 176 lineto
+ 440 180 lineto
+ 446 176 lineto
+ 444 180 lineto
+ 440 180 lineto
+ 422 180 406 182 390 188 curveto
+ 394 186 lineto
+ 392 188 lineto
+ 370 194 348 208 332 224 curveto
+ 330 224 lineto
+ 336 220 lineto
+ 336 220 lineto
+ 334 222 lineto
+ 334 224 332 224 330 226 curveto
+ 314 242 304 262 298 284 curveto
+ 298 282 lineto
+ 300 280 lineto
+ 298 280 lineto
+ 292 302 288 322 288 346 curveto
+ 290 344 lineto
+ 288 348 lineto
+ 290 344 lineto
+ 288 340 lineto
+ 290 342 lineto
+ 290 344 lineto
+ 290 380 298 414 310 448 curveto
+ 308 446 lineto
+ 308 444 lineto
+ 322 482 336 518 350 556 curveto
+ 348 554 lineto
+ 350 558 lineto
+ 362 592 370 626 370 664 curveto
+ 370 664 lineto
+ 368 668 lineto
+ 366 670 lineto
+ 362 672 lineto
+ 360 672 lineto
+ 360 670 lineto
+ 358 670 lineto
+ 360 672 lineto
+ 356 670 lineto
+ 354 668 lineto
+ 352 664 lineto
+ 352 644 348 626 342 608 curveto
+ 344 608 lineto
+ 344 610 lineto
+ 318 536 254 476 228 402 curveto
+ 230 402 lineto
+ 228 400 lineto
+ 228 398 lineto
+ 222 380 218 362 218 344 curveto
+ 220 344 lineto
+ 220 342 lineto
+ 220 326 222 310 228 296 curveto
+ 226 298 lineto
+ 228 294 lineto
+ 236 270 250 248 268 230 curveto
+ 270 228 lineto
+ 272 226 lineto
+ 276 222 282 218 286 214 curveto
+ 306 196 330 184 356 178 curveto
+ 358 178 lineto
+ 358 176 lineto
+ 384 168 412 164 440 164 curveto
+ 440 164 lineto
+ 442 166 lineto
+ 468 166 496 170 522 178 curveto
+ 524 178 lineto
+ 524 180 lineto
+ 550 186 574 198 594 216 curveto
+ 598 220 604 224 608 228 curveto
+ 610 230 lineto
+ 612 232 lineto
+ 630 250 644 272 652 296 curveto
+ 650 294 lineto
+ 652 298 lineto
+ 658 312 660 328 660 344 curveto
+ 660 344 lineto
+ 658 346 lineto
+ 658 364 654 382 648 400 curveto
+ 650 400 lineto
+ 648 402 lineto
+ 648 404 lineto
+ 622 478 558 538 532 612 curveto
+ 534 612 lineto
+ 534 610 lineto
+ 528 628 524 646 524 666 curveto
+ 526 664 lineto
+ 524 668 lineto
+ 522 670 lineto
+ 518 672 lineto
+ 516 672 lineto
+ 516 672 lineto
+ 514 670 lineto
+ 510 668 lineto
+ 510 662 lineto
+closepath
+%end path
+fill
+%new path
+ 656 558 moveto
+ 664 558 lineto
+ 666 562 lineto
+ 668 564 lineto
+ 668 566 lineto
+ 666 568 lineto
+ 658 600 650 632 642 666 curveto
+ 644 664 lineto
+ 642 668 lineto
+ 640 670 lineto
+ 636 672 lineto
+ 634 672 lineto
+ 634 670 lineto
+ 516 670 lineto
+ 516 672 lineto
+ 514 670 lineto
+ 510 668 lineto
+ 510 662 lineto
+ 510 652 512 642 512 632 curveto
+ 512 630 lineto
+ 516 628 lineto
+ 518 626 lineto
+ 520 626 lineto
+ 522 628 lineto
+ 582 628 lineto
+ 580 626 lineto
+ 584 628 lineto
+ 586 630 lineto
+ 578 626 lineto
+ 572 630 lineto
+ 576 628 lineto
+ 578 626 lineto
+ 580 626 lineto
+ 596 626 620 626 630 622 curveto
+ 630 624 lineto
+ 628 624 lineto
+ 630 622 632 622 632 620 curveto
+ 634 620 lineto
+ 632 622 lineto
+ 636 620 lineto
+ 630 624 lineto
+ 628 628 lineto
+ 630 624 lineto
+ 634 620 636 614 638 606 curveto
+ 636 610 lineto
+ 638 608 lineto
+ 642 594 646 576 650 564 curveto
+ 648 564 lineto
+ 650 562 lineto
+ 652 558 lineto
+ 656 558 lineto
+closepath
+%end path
+fill
+%new path
+ 228 562 moveto
+ 230 564 lineto
+ 230 566 lineto
+ 234 578 238 596 242 610 curveto
+ 240 606 lineto
+ 242 608 lineto
+ 244 616 246 622 250 626 curveto
+ 248 624 lineto
+ 250 628 lineto
+ 250 630 lineto
+ 248 624 lineto
+ 240 620 lineto
+ 242 620 lineto
+ 246 622 lineto
+ 248 622 lineto
+ 248 624 250 624 252 626 curveto
+ 252 624 lineto
+ 250 624 lineto
+ 260 628 284 628 300 628 curveto
+ 360 628 lineto
+ 360 626 lineto
+ 362 628 lineto
+ 366 630 lineto
+ 366 634 lineto
+ 368 634 lineto
+ 368 644 370 654 370 664 curveto
+ 368 662 lineto
+ 368 668 lineto
+ 364 670 lineto
+ 362 672 lineto
+ 360 672 lineto
+ 358 670 lineto
+ 242 670 lineto
+ 242 672 lineto
+ 240 670 lineto
+ 236 668 lineto
+ 236 664 lineto
+ 234 664 lineto
+ 226 630 218 598 210 566 curveto
+ 212 566 lineto
+ 212 562 lineto
+ 216 558 lineto
+ 226 558 lineto
+ 228 562 lineto
+closepath
+%end path
+fill
+) def
+
+/Leads_to_character_extension
+(
+newpath
+%new path
+ 192 352 moveto
+ 202 366 214 380 226 392 curveto
+ 226 390 lineto
+ 228 394 lineto
+ 228 402 lineto
+ 226 390 lineto
+ 212 384 lineto
+ 216 384 lineto
+ 222 386 lineto
+ 222 388 lineto
+ 240 404 258 418 278 426 curveto
+ 278 424 lineto
+ 272 422 lineto
+ 272 424 lineto
+ 282 426 292 428 302 428 curveto
+ 308 430 lineto
+ 312 434 lineto
+ 298 428 lineto
+ 288 434 lineto
+ 292 430 lineto
+ 298 428 lineto
+ 298 426 lineto
+ 308 426 318 424 328 422 curveto
+ 326 422 lineto
+ 320 424 lineto
+ 322 424 lineto
+ 342 416 360 402 378 386 curveto
+ 376 386 lineto
+ 382 384 lineto
+ 372 390 lineto
+ 370 398 lineto
+ 370 394 lineto
+ 372 390 lineto
+ 374 390 lineto
+ 386 378 398 364 408 350 curveto
+ 418 336 430 322 442 310 curveto
+ 442 312 lineto
+ 446 308 lineto
+ 446 306 lineto
+ 464 290 482 276 502 268 curveto
+ 502 270 lineto
+ 508 268 lineto
+ 508 266 lineto
+ 518 264 528 262 538 262 curveto
+ 538 264 lineto
+ 542 264 lineto
+ 552 264 562 266 572 268 curveto
+ 570 268 lineto
+ 576 270 lineto
+ 578 270 lineto
+ 598 278 616 292 634 308 curveto
+ 632 308 lineto
+ 636 312 lineto
+ 638 312 lineto
+ 650 324 662 338 672 352 curveto
+ 674 354 lineto
+ 674 366 lineto
+ 672 370 lineto
+ 668 374 lineto
+ 662 376 lineto
+ 658 376 lineto
+ 652 374 lineto
+ 648 370 lineto
+ 646 368 lineto
+ 636 354 624 340 612 328 curveto
+ 612 330 lineto
+ 610 326 lineto
+ 610 318 lineto
+ 612 330 lineto
+ 626 336 lineto
+ 622 336 lineto
+ 616 334 lineto
+ 616 332 lineto
+ 598 316 580 302 560 294 curveto
+ 560 296 lineto
+ 566 298 lineto
+ 566 296 lineto
+ 556 294 546 292 536 292 curveto
+ 538 294 lineto
+ 532 292 lineto
+ 528 288 lineto
+ 542 294 lineto
+ 552 288 lineto
+ 548 292 lineto
+ 542 294 lineto
+ 540 294 lineto
+ 530 294 520 296 510 298 curveto
+ 512 298 lineto
+ 518 296 lineto
+ 516 296 lineto
+ 496 304 478 318 460 334 curveto
+ 462 334 lineto
+ 456 336 lineto
+ 466 330 lineto
+ 468 322 lineto
+ 468 326 lineto
+ 466 330 lineto
+ 464 330 lineto
+ 452 342 440 356 430 370 curveto
+ 420 384 408 398 396 410 curveto
+ 396 408 lineto
+ 392 412 lineto
+ 392 414 lineto
+ 374 430 356 444 336 452 curveto
+ 336 450 lineto
+ 330 452 lineto
+ 330 454 lineto
+ 320 456 310 458 300 458 curveto
+ 298 458 lineto
+ 296 456 lineto
+ 286 456 276 454 266 452 curveto
+ 268 452 lineto
+ 262 450 lineto
+ 260 450 lineto
+ 240 442 222 428 204 412 curveto
+ 206 412 lineto
+ 202 408 lineto
+ 200 408 lineto
+ 188 396 178 382 168 368 curveto
+ 168 370 lineto
+ 166 366 lineto
+ 166 354 lineto
+ 168 352 lineto
+ 172 348 lineto
+ 178 346 lineto
+ 182 346 lineto
+ 188 348 lineto
+ 192 352 lineto
+closepath
+%end path
+fill
+) def
+
+/Leads_to_character_with_arrowhead
+(
+newpath
+%new path
+ 858 364 moveto
+ 856 368 lineto
+ 854 368 lineto
+ 828 378 804 394 784 414 curveto
+ 786 412 lineto
+ 782 414 lineto
+ 788 410 lineto
+ 790 406 lineto
+ 788 410 lineto
+ 768 432 750 456 740 486 curveto
+ 740 484 lineto
+ 738 488 lineto
+ 724 488 lineto
+ 720 484 lineto
+ 720 476 lineto
+ 722 476 lineto
+ 734 446 750 420 772 398 curveto
+ 774 396 lineto
+ 776 394 lineto
+ 792 378 812 362 834 352 curveto
+ 834 354 lineto
+ 836 352 lineto
+ 830 356 lineto
+ 830 362 lineto
+ 828 360 lineto
+ 830 360 lineto
+ 830 364 lineto
+ 838 368 lineto
+ 836 368 lineto
+ 834 366 lineto
+ 832 366 lineto
+ 810 356 790 340 774 324 curveto
+ 772 322 lineto
+ 770 320 lineto
+ 748 298 732 272 720 242 curveto
+ 720 236 lineto
+ 724 232 lineto
+ 738 232 lineto
+ 740 236 lineto
+ 742 236 lineto
+ 752 266 770 290 790 312 curveto
+ 788 310 lineto
+ 790 314 lineto
+ 790 316 lineto
+ 788 310 lineto
+ 780 306 lineto
+ 782 306 lineto
+ 786 308 lineto
+ 806 328 830 344 856 354 curveto
+ 858 356 lineto
+ 860 360 lineto
+ 860 362 lineto
+ 858 364 lineto
+closepath
+%end path
+%new path
+ 192 352 moveto
+ 202 366 214 380 226 392 curveto
+ 226 390 lineto
+ 228 394 lineto
+ 228 402 lineto
+ 226 390 lineto
+ 212 384 lineto
+ 216 384 lineto
+ 222 386 lineto
+ 222 388 lineto
+ 240 404 258 418 278 426 curveto
+ 278 424 lineto
+ 272 422 lineto
+ 272 424 lineto
+ 282 426 292 428 302 428 curveto
+ 308 430 lineto
+ 312 434 lineto
+ 298 428 lineto
+ 288 434 lineto
+ 292 430 lineto
+ 298 428 lineto
+ 298 426 lineto
+ 308 426 318 424 328 422 curveto
+ 326 422 lineto
+ 320 424 lineto
+ 322 424 lineto
+ 342 416 360 402 378 386 curveto
+ 376 386 lineto
+ 382 384 lineto
+ 372 390 lineto
+ 370 398 lineto
+ 370 394 lineto
+ 372 390 lineto
+ 374 390 lineto
+ 386 378 398 364 408 350 curveto
+ 418 336 430 322 442 310 curveto
+ 442 312 lineto
+ 446 308 lineto
+ 446 306 lineto
+ 464 290 482 276 502 268 curveto
+ 502 270 lineto
+ 508 268 lineto
+ 508 266 lineto
+ 518 264 528 262 538 262 curveto
+ 538 264 lineto
+ 542 264 lineto
+ 552 264 562 266 570 268 curveto
+ 576 270 lineto
+ 620 286 654 328 698 344 curveto
+ 696 342 lineto
+ 690 340 lineto
+ 692 342 lineto
+ 700 344 710 346 720 346 curveto
+ 824 346 lineto
+ 830 348 lineto
+ 834 352 lineto
+ 836 354 lineto
+ 838 358 lineto
+ 838 362 lineto
+ 836 366 lineto
+ 834 370 lineto
+ 830 374 lineto
+ 824 376 lineto
+ 820 376 lineto
+ 820 374 lineto
+ 714 374 lineto
+ 704 374 694 372 686 370 curveto
+ 680 368 lineto
+ 636 352 602 310 558 294 curveto
+ 560 296 lineto
+ 566 298 lineto
+ 564 296 lineto
+ 556 294 546 292 536 292 curveto
+ 538 294 lineto
+ 532 292 lineto
+ 528 288 lineto
+ 542 294 lineto
+ 552 288 lineto
+ 548 292 lineto
+ 542 294 lineto
+ 540 294 lineto
+ 530 294 520 296 510 298 curveto
+ 512 298 lineto
+ 518 296 lineto
+ 516 296 lineto
+ 496 304 478 318 460 334 curveto
+ 462 334 lineto
+ 456 336 lineto
+ 466 330 lineto
+ 468 322 lineto
+ 468 326 lineto
+ 466 330 lineto
+ 464 330 lineto
+ 452 342 440 356 430 370 curveto
+ 420 384 408 398 396 410 curveto
+ 396 408 lineto
+ 392 412 lineto
+ 392 414 lineto
+ 374 430 356 444 336 452 curveto
+ 336 450 lineto
+ 330 452 lineto
+ 330 454 lineto
+ 320 456 310 458 300 458 curveto
+ 298 458 lineto
+ 296 456 lineto
+ 286 456 276 454 266 452 curveto
+ 268 452 lineto
+ 262 450 lineto
+ 260 450 lineto
+ 240 442 222 428 204 412 curveto
+ 206 412 lineto
+ 202 408 lineto
+ 200 408 lineto
+ 188 396 178 382 168 368 curveto
+ 168 370 lineto
+ 166 366 lineto
+ 166 354 lineto
+ 168 352 lineto
+ 172 348 lineto
+ 178 346 lineto
+ 182 346 lineto
+ 188 348 lineto
+ 192 352 lineto
+closepath
+%end path
+fill
+) def
+
+/LASY_lhd_triangle
+(
+newpath
+%new path
+ 666 570 moveto
+ 662 570 lineto
+ 656 568 lineto
+ 656 566 lineto
+ 518 502 382 436 244 372 curveto
+ 246 374 lineto
+ 242 370 lineto
+ 240 366 lineto
+ 238 362 lineto
+ 238 358 lineto
+ 240 354 lineto
+ 242 352 lineto
+ 246 348 lineto
+ 246 346 lineto
+ 384 282 520 216 658 154 curveto
+ 656 154 lineto
+ 662 152 lineto
+ 666 152 lineto
+ 672 154 lineto
+ 676 158 lineto
+ 678 162 lineto
+ 680 166 lineto
+ 680 556 lineto
+ 678 560 lineto
+ 676 564 lineto
+ 672 568 lineto
+ 666 570 lineto
+closepath
+%end path
+%new path
+ 650 552 moveto
+ 652 564 lineto
+ 650 560 lineto
+ 650 556 lineto
+ 648 556 lineto
+ 648 168 lineto
+ 650 170 lineto
+ 650 166 lineto
+ 652 176 lineto
+ 666 180 lineto
+ 656 180 lineto
+ 652 176 lineto
+ 666 180 lineto
+ 676 176 lineto
+ 672 180 lineto
+ 534 244 398 310 260 374 curveto
+ 262 374 lineto
+ 256 376 lineto
+ 266 370 lineto
+ 268 362 lineto
+ 268 366 lineto
+ 266 370 lineto
+ 268 362 lineto
+ 266 352 lineto
+ 268 354 lineto
+ 268 362 lineto
+ 266 352 lineto
+ 252 346 lineto
+ 256 346 lineto
+ 262 348 lineto
+ 400 412 536 478 674 542 curveto
+ 672 542 lineto
+ 676 546 lineto
+ 662 540 lineto
+ 652 546 lineto
+ 656 542 lineto
+ 662 540 lineto
+ 652 546 lineto
+ 650 552 lineto
+ 650 548 lineto
+ 652 546 lineto
+ 650 552 lineto
+closepath
+%end path
+fill
+) def
+
+/LASY_unlhd_triangle
+(
+newpath
+%new path
+ 666 638 moveto
+ 662 638 lineto
+ 656 636 lineto
+ 656 634 lineto
+ 518 570 382 504 244 440 curveto
+ 246 440 lineto
+ 242 436 lineto
+ 240 434 lineto
+ 238 430 lineto
+ 238 426 lineto
+ 240 422 lineto
+ 242 418 lineto
+ 246 414 lineto
+ 384 350 520 284 658 220 curveto
+ 656 220 lineto
+ 662 218 lineto
+ 666 218 lineto
+ 672 220 lineto
+ 676 224 lineto
+ 678 228 lineto
+ 680 232 lineto
+ 680 624 lineto
+ 678 628 lineto
+ 676 632 lineto
+ 672 636 lineto
+ 666 638 lineto
+closepath
+%end path
+%new path
+ 650 620 moveto
+ 652 632 lineto
+ 650 628 lineto
+ 650 624 lineto
+ 648 624 lineto
+ 648 234 lineto
+ 650 236 lineto
+ 650 232 lineto
+ 652 242 lineto
+ 666 248 lineto
+ 662 248 lineto
+ 656 246 lineto
+ 652 242 lineto
+ 666 248 lineto
+ 676 242 lineto
+ 672 246 lineto
+ 672 248 lineto
+ 534 312 398 378 260 442 curveto
+ 262 440 lineto
+ 256 442 lineto
+ 266 436 lineto
+ 268 430 lineto
+ 268 434 lineto
+ 266 436 lineto
+ 268 430 lineto
+ 266 418 lineto
+ 268 422 lineto
+ 268 430 lineto
+ 266 418 lineto
+ 252 412 lineto
+ 256 412 lineto
+ 262 414 lineto
+ 262 416 lineto
+ 400 480 536 546 674 610 curveto
+ 672 610 lineto
+ 676 614 lineto
+ 662 608 lineto
+ 652 614 lineto
+ 656 610 lineto
+ 662 608 lineto
+ 652 614 lineto
+ 650 620 lineto
+ 650 616 lineto
+ 652 614 lineto
+ 650 620 lineto
+closepath
+%end path
+%new path
+ 666 110 moveto
+ 252 110 lineto
+ 246 108 lineto
+ 242 104 lineto
+ 240 102 lineto
+ 238 98 lineto
+ 238 94 lineto
+ 240 90 lineto
+ 242 86 lineto
+ 246 82 lineto
+ 252 80 lineto
+ 256 80 lineto
+ 256 82 lineto
+ 668 82 lineto
+ 666 80 lineto
+ 672 82 lineto
+ 676 86 lineto
+ 678 90 lineto
+ 680 94 lineto
+ 680 98 lineto
+ 678 102 lineto
+ 676 104 lineto
+ 672 108 lineto
+ 666 110 lineto
+closepath
+%end path
+fill
+) def
+
+/LASY_rhd_triangle
+(
+newpath
+%new path
+ 252 540 moveto
+ 242 546 lineto
+ 246 542 lineto
+ 246 540 lineto
+ 384 476 520 410 658 346 curveto
+ 656 348 lineto
+ 662 346 lineto
+ 652 352 lineto
+ 650 358 lineto
+ 650 354 lineto
+ 652 352 lineto
+ 650 358 lineto
+ 652 370 lineto
+ 650 366 lineto
+ 650 358 lineto
+ 652 370 lineto
+ 666 376 lineto
+ 662 376 lineto
+ 656 374 lineto
+ 656 372 lineto
+ 518 308 382 242 244 180 curveto
+ 246 180 lineto
+ 242 176 lineto
+ 256 180 lineto
+ 266 176 lineto
+ 262 180 lineto
+ 256 180 lineto
+ 266 176 lineto
+ 268 170 lineto
+ 268 174 lineto
+ 266 176 lineto
+ 268 170 lineto
+ 266 158 lineto
+ 268 162 lineto
+ 268 166 lineto
+ 270 166 lineto
+ 270 554 lineto
+ 268 552 lineto
+ 268 556 lineto
+ 266 546 lineto
+ 252 540 lineto
+ 256 540 lineto
+ 262 542 lineto
+ 266 546 lineto
+ 252 540 lineto
+closepath
+%end path
+%new path
+ 242 564 moveto
+ 240 560 lineto
+ 238 556 lineto
+ 238 166 lineto
+ 240 162 lineto
+ 242 158 lineto
+ 246 154 lineto
+ 252 152 lineto
+ 256 152 lineto
+ 262 154 lineto
+ 262 156 lineto
+ 400 218 536 284 674 348 curveto
+ 672 348 lineto
+ 676 352 lineto
+ 678 354 lineto
+ 680 358 lineto
+ 680 362 lineto
+ 678 366 lineto
+ 676 370 lineto
+ 672 374 lineto
+ 534 438 398 504 260 568 curveto
+ 262 568 lineto
+ 256 570 lineto
+ 252 570 lineto
+ 246 568 lineto
+ 242 564 lineto
+closepath
+%end path
+fill
+) def
+
+/LASY_unrhd_triangle
+(
+newpath
+%new path
+ 252 608 moveto
+ 242 614 lineto
+ 246 610 lineto
+ 246 608 lineto
+ 384 544 520 478 658 414 curveto
+ 656 414 lineto
+ 662 412 lineto
+ 652 418 lineto
+ 650 426 lineto
+ 650 422 lineto
+ 652 418 lineto
+ 650 426 lineto
+ 652 436 lineto
+ 650 434 lineto
+ 650 426 lineto
+ 652 436 lineto
+ 666 442 lineto
+ 662 442 lineto
+ 656 440 lineto
+ 518 376 382 310 244 246 curveto
+ 246 246 lineto
+ 242 242 lineto
+ 256 248 lineto
+ 266 242 lineto
+ 262 246 lineto
+ 256 248 lineto
+ 266 242 lineto
+ 268 236 lineto
+ 268 240 lineto
+ 266 242 lineto
+ 268 236 lineto
+ 266 224 lineto
+ 268 228 lineto
+ 268 232 lineto
+ 270 232 lineto
+ 270 622 lineto
+ 268 620 lineto
+ 268 624 lineto
+ 266 614 lineto
+ 252 608 lineto
+ 256 608 lineto
+ 262 610 lineto
+ 266 614 lineto
+ 252 608 lineto
+closepath
+%end path
+%new path
+ 242 632 moveto
+ 240 628 lineto
+ 238 624 lineto
+ 238 232 lineto
+ 240 228 lineto
+ 242 224 lineto
+ 246 220 lineto
+ 252 218 lineto
+ 256 218 lineto
+ 262 220 lineto
+ 262 222 lineto
+ 400 286 536 352 674 416 curveto
+ 672 414 lineto
+ 676 418 lineto
+ 678 422 lineto
+ 680 426 lineto
+ 680 430 lineto
+ 678 434 lineto
+ 676 436 lineto
+ 672 440 lineto
+ 672 442 lineto
+ 534 506 398 572 260 636 curveto
+ 262 636 lineto
+ 256 638 lineto
+ 252 638 lineto
+ 246 636 lineto
+ 242 632 lineto
+closepath
+%end path
+%new path
+ 252 80 moveto
+ 256 80 lineto
+ 256 82 lineto
+ 668 82 lineto
+ 666 80 lineto
+ 672 82 lineto
+ 676 86 lineto
+ 678 90 lineto
+ 680 94 lineto
+ 680 98 lineto
+ 678 102 lineto
+ 676 104 lineto
+ 672 108 lineto
+ 666 110 lineto
+ 252 110 lineto
+ 246 108 lineto
+ 242 104 lineto
+ 240 102 lineto
+ 238 98 lineto
+ 238 94 lineto
+ 240 90 lineto
+ 242 86 lineto
+ 246 82 lineto
+ 252 80 lineto
+closepath
+%end path
+fill
+) def
+
+end % of CharDefs dictionary
+
+Encoding 65 /Leftward_arrowhead put
+Encoding 66 /Rightward_arrowhead put
+Encoding 67 /Upward_arrowhead put
+Encoding 68 /Downward_arrowhead put
+Encoding 69 /Square_subset_sign put
+Encoding 70 /Square_superset_sign put
+Encoding 71 /Diamond put
+Encoding 72 /Square put
+Encoding 73 /Bowtie_operator put
+Encoding 74 /Upside-down_Uppercase_Greek_Omega put
+Encoding 75 /Leads_to_character_extension put
+Encoding 76 /Leads_to_character_with_arrowhead put
+Encoding 77 /LASY_lhd_triangle put
+Encoding 78 /LASY_unlhd_triangle put
+Encoding 79 /LASY_rhd_triangle put
+Encoding 80 /LASY_unrhd_triangle put
+
+Metrics
+ begin
+/Leftward_arrowhead 139 fudge add def
+/Rightward_arrowhead 141 fudge add def
+/Upward_arrowhead 259 fudge add def
+/Downward_arrowhead 259 fudge add def
+/Square_subset_sign 449 fudge add def
+/Square_superset_sign 449 fudge add def
+/Diamond 489 fudge add def
+/Square 413 fudge add def
+/Bowtie_operator 431 fudge add def
+/Upside-down_Uppercase_Greek_Omega 459 fudge add def
+/Leads_to_character_extension 509 fudge add def
+/Leads_to_character_with_arrowhead 695 fudge add def
+/LASY_lhd_triangle 443 fudge add def
+/LASY_unlhd_triangle 443 fudge add def
+/LASY_rhd_triangle 443 fudge add def
+/LASY_unrhd_triangle 443 fudge add def
+/.notdef 225 def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.3 1.3 scale
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 10
+ 0 -100
+ charwdth 1000
+ setcachedevice
+ -166 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [166 fudge sub 42 860 672]
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 13 scalefont setfont
+ 100 710 moveto (EF GH IKL M N O P) show
+ showpage
diff --git a/fonts/utilities/mf2ps/doc/printsamples/logo.ps b/fonts/utilities/mf2ps/doc/printsamples/logo.ps
new file mode 100644
index 0000000000..fbd242302b
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/logo.ps
@@ -0,0 +1,1096 @@
+%! Simon font
+%0 serverdict begin exitserver
+/TBuildCharDict 10 dict def
+/SimonFont 10 dict def
+/fudge 150 def
+SimonFont begin
+%%
+ /FontType 3 def
+ /FontMatrix [0.001 0 0 0.001 0 0] def
+ /Encoding 256 array def
+
+ 0 1 255 {Encoding exch /.notdef put} for
+
+% Character definitions
+
+/Metrics 130 dict def
+
+/CharDefs 130 dict def
+
+CharDefs begin
+
+/.notdef
+ () def
+
+/M
+(
+newpath
+%new path
+ 280 180 moveto
+ 282 186 lineto
+ 284 190 lineto
+ 284 600 lineto
+ 280 586 lineto
+ 260 576 lineto
+ 266 576 lineto
+ 268 578 lineto
+ 274 580 lineto
+ 280 586 lineto
+ 260 576 lineto
+ 240 586 lineto
+ 244 580 lineto
+ 250 578 lineto
+ 254 576 lineto
+ 260 576 lineto
+ 240 586 lineto
+ 236 596 lineto
+ 236 590 lineto
+ 238 590 lineto
+ 306 470 376 348 446 228 curveto
+ 444 230 lineto
+ 448 224 lineto
+ 452 220 lineto
+ 458 216 lineto
+ 462 216 lineto
+ 468 214 lineto
+ 474 216 lineto
+ 476 216 lineto
+ 482 220 lineto
+ 488 224 lineto
+ 490 230 lineto
+ 492 230 lineto
+ 560 350 630 472 700 592 curveto
+ 698 590 lineto
+ 700 596 lineto
+ 700 600 lineto
+ 696 586 lineto
+ 676 576 lineto
+ 682 576 lineto
+ 684 578 lineto
+ 690 580 lineto
+ 696 586 lineto
+ 676 576 lineto
+ 656 586 lineto
+ 660 580 lineto
+ 666 578 lineto
+ 670 576 lineto
+ 676 576 lineto
+ 656 586 lineto
+ 652 596 lineto
+ 652 590 lineto
+ 656 586 lineto
+ 652 596 lineto
+ 656 610 lineto
+ 652 604 lineto
+ 652 600 lineto
+ 650 598 lineto
+ 650 194 lineto
+ 652 194 lineto
+ 652 186 lineto
+ 656 180 lineto
+ 660 178 lineto
+ 666 174 lineto
+ 670 174 lineto
+ 676 172 lineto
+ 682 174 lineto
+ 684 174 lineto
+ 690 178 lineto
+ 696 180 lineto
+ 698 186 lineto
+ 700 190 lineto
+ 700 600 lineto
+ 698 604 lineto
+ 696 610 lineto
+ 690 614 lineto
+ 684 618 lineto
+ 682 618 lineto
+ 676 620 lineto
+ 670 618 lineto
+ 666 618 lineto
+ 660 614 lineto
+ 656 610 lineto
+ 652 604 lineto
+ 582 484 512 362 444 242 curveto
+ 444 234 lineto
+ 448 248 lineto
+ 468 258 lineto
+ 462 258 lineto
+ 458 256 lineto
+ 452 254 lineto
+ 448 248 lineto
+ 468 258 lineto
+ 488 248 lineto
+ 482 254 lineto
+ 476 256 lineto
+ 474 258 lineto
+ 468 258 lineto
+ 488 248 lineto
+ 492 238 lineto
+ 490 244 lineto
+ 420 364 350 486 282 606 curveto
+ 282 604 lineto
+ 280 610 lineto
+ 274 614 lineto
+ 268 618 lineto
+ 266 618 lineto
+ 260 620 lineto
+ 254 618 lineto
+ 250 618 lineto
+ 244 614 lineto
+ 240 610 lineto
+ 236 604 lineto
+ 236 600 lineto
+ 234 598 lineto
+ 234 194 lineto
+ 236 194 lineto
+ 236 186 lineto
+ 240 180 lineto
+ 244 178 lineto
+ 250 174 lineto
+ 254 174 lineto
+ 260 172 lineto
+ 266 174 lineto
+ 268 174 lineto
+ 274 178 lineto
+ 280 180 lineto
+closepath
+%end path
+fill
+) def
+
+/E
+(
+newpath
+%new path
+ 556 224 moveto
+ 554 222 lineto
+ 258 222 lineto
+ 260 224 lineto
+ 254 222 lineto
+ 250 222 lineto
+ 244 218 lineto
+ 240 214 lineto
+ 260 224 lineto
+ 280 214 lineto
+ 274 218 lineto
+ 268 222 lineto
+ 266 222 lineto
+ 260 224 lineto
+ 280 214 lineto
+ 284 204 lineto
+ 282 208 lineto
+ 280 214 lineto
+ 284 204 lineto
+ 280 190 lineto
+ 282 194 lineto
+ 284 200 lineto
+ 284 592 lineto
+ 280 578 lineto
+ 260 568 lineto
+ 562 568 lineto
+ 564 570 lineto
+ 570 572 lineto
+ 576 578 lineto
+ 578 582 lineto
+ 580 588 lineto
+ 580 592 lineto
+ 578 596 lineto
+ 576 602 lineto
+ 570 606 lineto
+ 564 610 lineto
+ 562 610 lineto
+ 556 612 lineto
+ 554 610 lineto
+ 258 610 lineto
+ 260 612 lineto
+ 254 610 lineto
+ 250 610 lineto
+ 244 606 lineto
+ 240 602 lineto
+ 236 596 lineto
+ 236 592 lineto
+ 234 590 lineto
+ 234 202 lineto
+ 236 204 lineto
+ 236 194 lineto
+ 240 190 lineto
+ 244 184 lineto
+ 250 182 lineto
+ 254 180 lineto
+ 562 180 lineto
+ 564 182 lineto
+ 570 184 lineto
+ 576 190 lineto
+ 578 194 lineto
+ 580 200 lineto
+ 580 204 lineto
+ 578 208 lineto
+ 576 214 lineto
+ 570 218 lineto
+ 564 222 lineto
+ 562 222 lineto
+ 556 224 lineto
+closepath
+%end path
+%new path
+ 260 352 moveto
+ 518 352 lineto
+ 520 354 lineto
+ 526 356 lineto
+ 532 362 lineto
+ 534 366 lineto
+ 536 372 lineto
+ 536 376 lineto
+ 534 380 lineto
+ 532 386 lineto
+ 526 390 lineto
+ 520 394 lineto
+ 518 394 lineto
+ 512 396 lineto
+ 510 394 lineto
+ 258 394 lineto
+ 260 396 lineto
+ 254 394 lineto
+ 250 394 lineto
+ 244 390 lineto
+ 240 386 lineto
+ 236 380 lineto
+ 236 366 lineto
+ 240 362 lineto
+ 244 356 lineto
+ 250 354 lineto
+ 254 352 lineto
+ 260 352 lineto
+closepath
+%end path
+fill
+) def
+
+/T
+(
+newpath
+%new path
+ 202 568 moveto
+ 578 568 lineto
+ 580 570 lineto
+ 586 572 lineto
+ 592 578 lineto
+ 594 582 lineto
+ 596 588 lineto
+ 596 592 lineto
+ 594 596 lineto
+ 592 602 lineto
+ 586 606 lineto
+ 580 610 lineto
+ 578 610 lineto
+ 572 612 lineto
+ 570 610 lineto
+ 202 610 lineto
+ 202 612 lineto
+ 196 610 lineto
+ 194 610 lineto
+ 188 606 lineto
+ 182 602 lineto
+ 180 596 lineto
+ 180 582 lineto
+ 182 578 lineto
+ 188 572 lineto
+ 194 570 lineto
+ 196 568 lineto
+ 202 568 lineto
+closepath
+%end path
+%new path
+ 368 602 moveto
+ 364 596 lineto
+ 364 592 lineto
+ 362 590 lineto
+ 362 194 lineto
+ 364 194 lineto
+ 364 186 lineto
+ 368 180 lineto
+ 372 178 lineto
+ 378 174 lineto
+ 382 174 lineto
+ 388 172 lineto
+ 394 174 lineto
+ 396 174 lineto
+ 402 178 lineto
+ 408 180 lineto
+ 410 186 lineto
+ 412 190 lineto
+ 412 592 lineto
+ 410 596 lineto
+ 408 602 lineto
+ 402 606 lineto
+ 396 610 lineto
+ 394 610 lineto
+ 388 612 lineto
+ 382 610 lineto
+ 378 610 lineto
+ 372 606 lineto
+ 368 602 lineto
+closepath
+%end path
+fill
+) def
+
+/A
+(
+newpath
+%new path
+ 280 180 moveto
+ 282 186 lineto
+ 284 190 lineto
+ 284 376 lineto
+ 280 362 lineto
+ 260 352 lineto
+ 586 352 lineto
+ 588 354 lineto
+ 594 356 lineto
+ 600 362 lineto
+ 580 352 lineto
+ 560 362 lineto
+ 564 356 lineto
+ 570 354 lineto
+ 574 352 lineto
+ 580 352 lineto
+ 560 362 lineto
+ 556 372 lineto
+ 556 366 lineto
+ 560 362 lineto
+ 556 372 lineto
+ 560 386 lineto
+ 556 380 lineto
+ 556 376 lineto
+ 554 374 lineto
+ 554 194 lineto
+ 556 194 lineto
+ 556 186 lineto
+ 560 180 lineto
+ 564 178 lineto
+ 570 174 lineto
+ 574 174 lineto
+ 580 172 lineto
+ 586 174 lineto
+ 588 174 lineto
+ 594 178 lineto
+ 600 180 lineto
+ 602 186 lineto
+ 604 190 lineto
+ 604 376 lineto
+ 602 380 lineto
+ 600 386 lineto
+ 594 390 lineto
+ 588 394 lineto
+ 586 394 lineto
+ 580 396 lineto
+ 578 394 lineto
+ 258 394 lineto
+ 260 396 lineto
+ 254 394 lineto
+ 250 394 lineto
+ 244 390 lineto
+ 240 386 lineto
+ 236 380 lineto
+ 236 376 lineto
+ 234 374 lineto
+ 234 194 lineto
+ 236 194 lineto
+ 236 186 lineto
+ 240 180 lineto
+ 244 178 lineto
+ 250 174 lineto
+ 254 174 lineto
+ 260 172 lineto
+ 266 174 lineto
+ 268 174 lineto
+ 274 178 lineto
+ 280 180 lineto
+closepath
+%end path
+%new path
+ 280 362 moveto
+ 282 366 lineto
+ 284 372 lineto
+ 284 410 284 452 292 490 curveto
+ 290 488 lineto
+ 290 484 lineto
+ 294 504 300 522 310 538 curveto
+ 306 532 lineto
+ 308 534 lineto
+ 308 536 310 538 312 542 curveto
+ 314 546 318 548 322 552 curveto
+ 320 552 lineto
+ 324 556 lineto
+ 324 566 lineto
+ 320 552 lineto
+ 300 542 lineto
+ 306 542 lineto
+ 310 544 lineto
+ 316 546 lineto
+ 316 548 lineto
+ 324 554 332 560 340 564 curveto
+ 334 560 lineto
+ 334 562 lineto
+ 340 564 346 566 350 568 curveto
+ 346 566 lineto
+ 348 568 lineto
+ 356 570 364 572 374 574 curveto
+ 372 572 lineto
+ 368 572 lineto
+ 384 576 402 576 420 576 curveto
+ 426 576 lineto
+ 428 578 lineto
+ 434 580 lineto
+ 440 586 lineto
+ 420 576 lineto
+ 400 586 lineto
+ 404 580 lineto
+ 410 578 lineto
+ 414 576 lineto
+ 420 576 lineto
+ 420 574 lineto
+ 438 574 456 574 472 570 curveto
+ 472 572 lineto
+ 466 572 lineto
+ 476 570 484 568 492 566 curveto
+ 488 568 lineto
+ 490 566 lineto
+ 494 564 500 562 506 560 curveto
+ 504 560 lineto
+ 498 564 lineto
+ 500 562 lineto
+ 508 558 516 552 524 546 curveto
+ 522 546 lineto
+ 528 544 lineto
+ 532 542 lineto
+ 538 542 lineto
+ 518 552 lineto
+ 514 562 lineto
+ 514 556 lineto
+ 518 552 lineto
+ 518 550 lineto
+ 522 546 526 544 528 540 curveto
+ 530 536 532 534 532 532 curveto
+ 528 538 lineto
+ 530 536 lineto
+ 540 520 546 502 550 482 curveto
+ 548 484 lineto
+ 548 488 lineto
+ 556 450 556 408 556 370 curveto
+ 556 366 lineto
+ 560 362 lineto
+ 564 356 lineto
+ 570 354 lineto
+ 574 352 lineto
+ 586 352 lineto
+ 588 354 lineto
+ 594 356 lineto
+ 600 362 lineto
+ 602 366 lineto
+ 604 372 lineto
+ 604 376 lineto
+ 602 376 lineto
+ 602 414 602 456 594 494 curveto
+ 596 492 lineto
+ 594 498 lineto
+ 590 518 584 536 574 552 curveto
+ 572 556 lineto
+ 570 558 lineto
+ 570 560 568 562 566 566 curveto
+ 564 570 560 572 556 576 curveto
+ 558 576 lineto
+ 552 580 lineto
+ 552 582 lineto
+ 544 588 536 594 528 598 curveto
+ 522 600 lineto
+ 522 602 lineto
+ 516 604 510 606 506 608 curveto
+ 504 608 lineto
+ 502 610 lineto
+ 494 612 486 614 476 616 curveto
+ 478 614 lineto
+ 472 616 lineto
+ 470 616 lineto
+ 454 620 436 620 418 620 curveto
+ 420 620 lineto
+ 418 618 lineto
+ 400 618 382 618 366 614 curveto
+ 366 616 lineto
+ 360 614 lineto
+ 350 612 342 610 334 608 curveto
+ 332 608 lineto
+ 330 606 lineto
+ 326 604 320 602 314 600 curveto
+ 316 600 lineto
+ 310 598 lineto
+ 308 596 lineto
+ 300 592 292 586 284 580 curveto
+ 286 580 lineto
+ 280 576 lineto
+ 280 574 lineto
+ 276 570 272 568 270 564 curveto
+ 268 560 266 558 266 556 curveto
+ 264 552 lineto
+ 262 550 lineto
+ 252 534 246 516 242 496 curveto
+ 244 498 lineto
+ 242 492 lineto
+ 234 454 234 412 234 374 curveto
+ 236 376 lineto
+ 236 366 lineto
+ 240 362 lineto
+ 244 356 lineto
+ 250 354 lineto
+ 254 352 lineto
+ 266 352 lineto
+ 268 354 lineto
+ 274 356 lineto
+ 280 362 lineto
+closepath
+%end path
+fill
+) def
+
+/F
+(
+newpath
+%new path
+ 280 180 moveto
+ 282 186 lineto
+ 284 190 lineto
+ 284 592 lineto
+ 280 578 lineto
+ 260 568 lineto
+ 562 568 lineto
+ 564 570 lineto
+ 570 572 lineto
+ 576 578 lineto
+ 578 582 lineto
+ 580 588 lineto
+ 580 592 lineto
+ 578 596 lineto
+ 576 602 lineto
+ 570 606 lineto
+ 564 610 lineto
+ 562 610 lineto
+ 556 612 lineto
+ 554 610 lineto
+ 258 610 lineto
+ 260 612 lineto
+ 254 610 lineto
+ 250 610 lineto
+ 244 606 lineto
+ 240 602 lineto
+ 236 596 lineto
+ 236 592 lineto
+ 234 590 lineto
+ 234 194 lineto
+ 236 194 lineto
+ 236 186 lineto
+ 240 180 lineto
+ 244 178 lineto
+ 250 174 lineto
+ 254 174 lineto
+ 260 172 lineto
+ 266 174 lineto
+ 268 174 lineto
+ 274 178 lineto
+ 280 180 lineto
+closepath
+%end path
+%new path
+ 260 352 moveto
+ 518 352 lineto
+ 520 354 lineto
+ 526 356 lineto
+ 532 362 lineto
+ 534 366 lineto
+ 536 372 lineto
+ 536 376 lineto
+ 534 380 lineto
+ 532 386 lineto
+ 526 390 lineto
+ 520 394 lineto
+ 518 394 lineto
+ 512 396 lineto
+ 510 394 lineto
+ 258 394 lineto
+ 260 396 lineto
+ 254 394 lineto
+ 250 394 lineto
+ 244 390 lineto
+ 240 386 lineto
+ 236 380 lineto
+ 236 366 lineto
+ 240 362 lineto
+ 244 356 lineto
+ 250 354 lineto
+ 254 352 lineto
+ 260 352 lineto
+closepath
+%end path
+fill
+) def
+
+/O
+(
+newpath
+%new path
+ 248 362 moveto
+ 250 366 lineto
+ 252 372 lineto
+ 252 408 252 446 258 480 curveto
+ 256 474 lineto
+ 258 476 lineto
+ 262 494 268 514 278 530 curveto
+ 276 528 lineto
+ 274 524 lineto
+ 278 530 282 536 286 542 curveto
+ 288 544 290 546 292 546 curveto
+ 290 546 lineto
+ 294 550 lineto
+ 294 560 lineto
+ 290 546 lineto
+ 270 536 lineto
+ 276 536 lineto
+ 280 538 lineto
+ 286 540 lineto
+ 286 542 lineto
+ 296 550 306 558 316 562 curveto
+ 314 562 lineto
+ 308 558 lineto
+ 310 560 lineto
+ 316 562 322 564 328 566 curveto
+ 326 566 lineto
+ 324 564 lineto
+ 324 566 lineto
+ 334 568 344 570 352 572 curveto
+ 346 570 lineto
+ 346 572 lineto
+ 370 576 396 576 420 576 curveto
+ 426 576 lineto
+ 428 578 lineto
+ 434 580 lineto
+ 440 586 lineto
+ 420 576 lineto
+ 400 586 lineto
+ 404 580 lineto
+ 410 578 lineto
+ 414 576 lineto
+ 420 576 lineto
+ 420 574 lineto
+ 444 574 470 574 494 570 curveto
+ 492 570 lineto
+ 486 572 lineto
+ 488 570 lineto
+ 496 568 506 566 516 564 curveto
+ 514 564 lineto
+ 512 566 lineto
+ 512 564 lineto
+ 518 562 524 560 530 558 curveto
+ 524 562 lineto
+ 524 560 lineto
+ 534 556 544 548 554 540 curveto
+ 552 540 lineto
+ 558 538 lineto
+ 562 536 lineto
+ 568 536 lineto
+ 548 546 lineto
+ 544 556 lineto
+ 544 550 lineto
+ 548 546 lineto
+ 548 544 lineto
+ 550 544 552 542 554 540 curveto
+ 558 534 562 528 566 522 curveto
+ 564 524 lineto
+ 562 528 lineto
+ 572 512 578 492 582 474 curveto
+ 580 480 lineto
+ 582 478 lineto
+ 588 444 588 406 588 370 curveto
+ 588 366 lineto
+ 592 362 lineto
+ 596 356 lineto
+ 602 354 lineto
+ 606 352 lineto
+ 618 352 lineto
+ 620 354 lineto
+ 626 356 lineto
+ 632 362 lineto
+ 634 366 lineto
+ 636 372 lineto
+ 636 376 lineto
+ 634 376 lineto
+ 634 412 634 450 628 484 curveto
+ 628 488 lineto
+ 626 490 lineto
+ 622 508 616 528 606 544 curveto
+ 608 542 lineto
+ 604 548 lineto
+ 600 554 596 560 592 566 curveto
+ 590 568 588 570 586 570 curveto
+ 588 570 lineto
+ 582 574 lineto
+ 582 576 lineto
+ 572 584 562 592 552 596 curveto
+ 554 596 lineto
+ 548 598 lineto
+ 546 600 lineto
+ 540 602 534 604 528 606 curveto
+ 526 606 lineto
+ 526 608 lineto
+ 516 610 506 612 498 614 curveto
+ 492 614 lineto
+ 492 616 lineto
+ 468 620 442 620 418 620 curveto
+ 420 620 lineto
+ 418 618 lineto
+ 394 618 368 618 344 614 curveto
+ 340 614 lineto
+ 338 612 lineto
+ 330 610 320 608 310 606 curveto
+ 308 606 lineto
+ 308 604 lineto
+ 302 602 296 600 290 598 curveto
+ 284 596 lineto
+ 284 594 lineto
+ 274 590 264 582 254 574 curveto
+ 256 574 lineto
+ 250 570 lineto
+ 250 568 lineto
+ 248 568 246 566 244 564 curveto
+ 240 558 236 552 232 546 curveto
+ 234 548 lineto
+ 230 542 lineto
+ 220 526 214 506 210 488 curveto
+ 210 484 lineto
+ 208 482 lineto
+ 202 448 202 410 202 374 curveto
+ 204 376 lineto
+ 204 366 lineto
+ 208 362 lineto
+ 212 356 lineto
+ 218 354 lineto
+ 222 352 lineto
+ 234 352 lineto
+ 236 354 lineto
+ 242 356 lineto
+ 248 362 lineto
+closepath
+%end path
+%new path
+ 204 372 moveto
+ 204 370 lineto
+ 204 344 204 316 210 292 curveto
+ 208 292 lineto
+ 210 288 lineto
+ 210 286 lineto
+ 214 272 218 256 226 244 curveto
+ 228 240 lineto
+ 230 238 lineto
+ 234 232 238 224 244 218 curveto
+ 244 220 lineto
+ 248 214 lineto
+ 250 214 lineto
+ 250 212 250 212 252 212 curveto
+ 260 204 268 198 278 194 curveto
+ 276 194 lineto
+ 282 192 lineto
+ 284 190 lineto
+ 290 188 296 186 302 184 curveto
+ 304 184 lineto
+ 304 182 lineto
+ 314 180 322 180 332 178 curveto
+ 338 178 lineto
+ 338 176 lineto
+ 364 172 394 172 420 172 curveto
+ 420 174 lineto
+ 446 174 476 174 502 178 curveto
+ 506 178 lineto
+ 508 180 lineto
+ 518 180 526 182 536 184 curveto
+ 538 184 lineto
+ 538 186 lineto
+ 544 188 550 190 556 192 curveto
+ 562 194 lineto
+ 562 196 lineto
+ 572 200 580 206 588 214 curveto
+ 590 214 590 214 590 216 curveto
+ 590 214 lineto
+ 594 220 lineto
+ 596 220 lineto
+ 602 226 606 234 610 240 curveto
+ 612 244 lineto
+ 614 246 lineto
+ 622 258 626 274 630 288 curveto
+ 628 288 lineto
+ 630 292 lineto
+ 630 294 lineto
+ 636 318 636 346 636 372 curveto
+ 636 376 lineto
+ 634 380 lineto
+ 632 386 lineto
+ 626 390 lineto
+ 620 394 lineto
+ 618 394 lineto
+ 612 396 lineto
+ 606 394 lineto
+ 602 394 lineto
+ 596 390 lineto
+ 592 386 lineto
+ 588 380 lineto
+ 588 376 lineto
+ 586 374 lineto
+ 586 348 586 320 580 296 curveto
+ 582 296 lineto
+ 582 300 lineto
+ 578 286 574 270 566 258 curveto
+ 570 264 lineto
+ 568 262 lineto
+ 564 256 560 248 554 242 curveto
+ 554 244 lineto
+ 552 238 lineto
+ 550 234 lineto
+ 550 230 lineto
+ 554 244 lineto
+ 574 254 lineto
+ 568 252 lineto
+ 566 252 lineto
+ 560 248 lineto
+ 558 248 lineto
+ 558 246 558 246 556 246 curveto
+ 548 238 540 232 530 228 curveto
+ 532 228 lineto
+ 538 232 lineto
+ 536 230 lineto
+ 530 228 524 226 518 224 curveto
+ 520 224 lineto
+ 522 226 lineto
+ 522 224 lineto
+ 512 222 504 220 494 218 curveto
+ 500 220 lineto
+ 500 218 lineto
+ 474 214 444 214 418 214 curveto
+ 420 216 lineto
+ 414 214 lineto
+ 410 214 lineto
+ 404 210 lineto
+ 400 206 lineto
+ 420 216 lineto
+ 440 206 lineto
+ 434 210 lineto
+ 428 214 lineto
+ 426 214 lineto
+ 420 216 lineto
+ 418 216 lineto
+ 392 216 362 216 336 220 curveto
+ 338 220 lineto
+ 344 218 lineto
+ 342 220 lineto
+ 332 222 324 224 314 226 curveto
+ 316 226 lineto
+ 318 224 lineto
+ 318 226 lineto
+ 312 228 306 230 300 232 curveto
+ 306 228 lineto
+ 306 230 lineto
+ 296 234 288 240 280 248 curveto
+ 278 248 278 248 278 250 curveto
+ 278 248 lineto
+ 272 252 lineto
+ 270 252 lineto
+ 264 254 lineto
+ 284 244 lineto
+ 288 234 lineto
+ 286 238 lineto
+ 284 244 lineto
+ 282 244 lineto
+ 276 250 272 258 268 264 curveto
+ 272 258 lineto
+ 270 260 lineto
+ 262 272 258 288 254 302 curveto
+ 256 302 lineto
+ 256 298 lineto
+ 250 322 250 350 250 376 curveto
+ 252 376 lineto
+ 250 380 lineto
+ 248 386 lineto
+ 242 390 lineto
+ 236 394 lineto
+ 234 394 lineto
+ 228 396 lineto
+ 222 394 lineto
+ 218 394 lineto
+ 212 390 lineto
+ 208 386 lineto
+ 204 380 lineto
+ 204 372 lineto
+closepath
+%end path
+fill
+) def
+
+/N
+(
+newpath
+%new path
+ 280 180 moveto
+ 282 186 lineto
+ 284 190 lineto
+ 284 600 lineto
+ 280 586 lineto
+ 260 576 lineto
+ 266 576 lineto
+ 268 578 lineto
+ 274 580 lineto
+ 280 586 lineto
+ 260 576 lineto
+ 240 586 lineto
+ 244 580 lineto
+ 250 578 lineto
+ 254 576 lineto
+ 260 576 lineto
+ 240 586 lineto
+ 236 596 lineto
+ 236 590 lineto
+ 240 586 lineto
+ 240 584 lineto
+ 346 464 454 344 560 224 curveto
+ 564 220 lineto
+ 570 216 lineto
+ 574 216 lineto
+ 580 214 lineto
+ 586 216 lineto
+ 588 216 lineto
+ 594 220 lineto
+ 600 224 lineto
+ 602 230 lineto
+ 604 234 lineto
+ 604 238 lineto
+ 602 244 lineto
+ 600 248 lineto
+ 598 250 lineto
+ 492 370 384 490 278 610 curveto
+ 280 610 lineto
+ 274 614 lineto
+ 268 618 lineto
+ 266 618 lineto
+ 260 620 lineto
+ 254 618 lineto
+ 250 618 lineto
+ 244 614 lineto
+ 240 610 lineto
+ 236 604 lineto
+ 236 600 lineto
+ 234 598 lineto
+ 234 194 lineto
+ 236 194 lineto
+ 236 186 lineto
+ 240 180 lineto
+ 244 178 lineto
+ 250 174 lineto
+ 254 174 lineto
+ 260 172 lineto
+ 266 174 lineto
+ 268 174 lineto
+ 274 178 lineto
+ 280 180 lineto
+closepath
+%end path
+%new path
+ 600 180 moveto
+ 602 186 lineto
+ 604 190 lineto
+ 604 600 lineto
+ 602 604 lineto
+ 600 610 lineto
+ 594 614 lineto
+ 588 618 lineto
+ 586 618 lineto
+ 580 620 lineto
+ 574 618 lineto
+ 570 618 lineto
+ 564 614 lineto
+ 560 610 lineto
+ 556 604 lineto
+ 556 600 lineto
+ 554 598 lineto
+ 554 194 lineto
+ 556 194 lineto
+ 556 186 lineto
+ 560 180 lineto
+ 564 178 lineto
+ 570 174 lineto
+ 574 174 lineto
+ 580 172 lineto
+ 586 174 lineto
+ 588 174 lineto
+ 594 178 lineto
+ 600 180 lineto
+closepath
+%end path
+fill
+) def
+
+end % of CharDefs dictionary
+
+Encoding 77 /M put
+Encoding 69 /E put
+Encoding 84 /T put
+Encoding 65 /A put
+Encoding 70 /F put
+Encoding 79 /O put
+Encoding 78 /N put
+
+Metrics
+ begin
+/.notdef 0 def
+/M 466 fudge add def
+/E 346 fudge add def
+/T 414 fudge 80 sub add def
+/A 370 fudge add def
+/F 346 fudge add def
+/O 434 fudge add def
+/N 370 fudge add def
+ end
+
+ /BuildChar
+ { TBuildCharDict begin
+ %%
+ /char exch def
+ /fontdict exch def
+
+ /charname fontdict /Encoding get
+ char get def
+ %%
+ /charproc fontdict /CharDefs get
+ charname get def
+
+ /charwdth fontdict /Metrics get charname get def
+ %%
+ gsave
+ 1.1 1.3 scale
+ % bounding box : [180 180 700 700]
+ 0.2 setflat
+ 0.2 setlinewidth
+ charwdth 10
+ 0 -100
+ charwdth 80 add 1000
+ setcachedevice
+ -182 0 translate
+ charproc cvx exec
+ grestore
+ end
+ } def
+ /FontBBox [182 fudge sub 180 700 620] def
+
+ end
+
+ /Simon SimonFont definefont pop
+
+ /Simon findfont 11 scalefont setfont
+ 100 210 moveto (METAFONT) show
+ showpage
+
diff --git a/fonts/utilities/mf2ps/doc/printsamples/sy.ps b/fonts/utilities/mf2ps/doc/printsamples/sy.ps
new file mode 100644
index 0000000000..1e020e5833
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/sy.ps
@@ -0,0 +1,415 @@
+%! for use by dvi2ps Version 2.00
+% a start (Ha!) at a TeX mode for PostScript.
+% The following defines procedures assumed and used by program "dvi2ps"
+% and must be downloaded or sent as a header file for all TeX jobs.
+
+% By: Neal Holtz, Carleton University, Ottawa, Canada
+% <holtz@cascade.carleton.cdn>
+% <holtz%cascade.carleton.cdn@ubc.csnet>
+% June, 1985
+% Last Modified: Aug 25/85
+% oystr 12-Feb-1986
+% Changed @dc macro to check for a badly formed bits in character
+% definitions. Can get a <> bit map if a character is not actually
+% in the font file. This is absolutely guaranteed to drive the
+% printer nuts - it will appear that you can no longer define a
+% new font, although the built-ins will still be there.
+% pam 5-Jan-1988
+% Expanded arrays for 256 character gf fonts.
+
+% To convert this file into a downloaded file instead of a header
+% file, uncomment all of the lines beginning with %-%
+
+%-%0000000 % Server loop exit password
+%-%serverdict begin exitserver
+%-% systemdict /statusdict known
+%-% {statusdict begin 9 0 3 setsccinteractive /waittimeout 300 def end}
+%-% if
+
+/TeXDict 200 dict def % define a working dictionary
+TeXDict begin % start using it.
+
+ % units are in "dots" (300/inch)
+/Resolution 300 def
+/Inch {Resolution mul} def % converts inches to internal units
+
+/Mtrx 6 array def
+
+%%%%%%%%%%%%%%%%%%%%% Page setup (user) options %%%%%%%%%%%%%%%%%%%%%%%%
+
+% dvi2ps will output coordinates in the TeX system ([0,0] 1" down and in
+% from top left, with y +ive downward). The default PostScript system
+% is [0,0] at bottom left, y +ive up. The Many Matrix Machinations in
+% the following code are an attempt to reconcile that. The intent is to
+% specify the scaling as 1 and have only translations in the matrix to
+% properly position the text. Caution: the default device matrices are
+% *not* the same in all PostScript devices; that should not matter in most
+% of the code below (except for lanscape mode -- in that, rotations of
+% -90 degrees resulted in the the rotation matrix [ e 1 ]
+% [ 1 e ]
+% where the "e"s were almost exactly but not quite unlike zeros.
+
+/@letter
+ { letter initmatrix
+ 72 Resolution div dup neg scale % set scaling to 1.
+ 310 -3005 translate % move origin to top (these are not exactly 1"
+ Mtrx currentmatrix pop % and -10" because margins aren't set exactly right)
+ } def
+ % note mode is like letter, except it uses less VM
+/@note
+ { note initmatrix
+ 72 Resolution div dup neg scale % set scaling to 1.
+ 310 -3005 translate % move origin to top
+ Mtrx currentmatrix pop
+ } def
+
+/@landscape
+ { letter initmatrix
+ 72 Resolution div dup neg scale % set scaling to 1.
+% -90 rotate % it would be nice to be able to do this
+ Mtrx currentmatrix 0 0.0 put % but instead we have to do things like this because what
+ Mtrx 1 -1.0 put % should be zero terms aren't (and text comes out wobbly)
+ Mtrx 2 1.0 put % Fie! This likely will not work on QMS printers
+ Mtrx 3 0.0 put % (nor on others where the device matrix is not like
+ Mtrx setmatrix % like it is on the LaserWriter).
+ 300 310 translate % move origin to top
+ Mtrx currentmatrix pop
+ } def
+
+/@legal
+ { legal initmatrix
+ 72 Resolution div dup neg scale % set scaling to 1.
+ 295 -3880 translate % move origin to top
+ Mtrx currentmatrix pop
+ } def
+
+/@manualfeed
+ { statusdict /manualfeed true put
+ } def
+ % n @copies - set number of copies
+/@copies
+ { /#copies exch def
+ } def
+
+%%%%%%%%%%%%%%%%%%%% Procedure Defintions %%%%%%%%%%%%%%%%%%%%%%%%%%
+
+/@newfont % id @newfont - -- initialize a new font dictionary
+ { /newname exch def
+ pop
+ newname 7 dict def % allocate new font dictionary
+ newname load begin
+ /FontType 3 def
+ /FontMatrix [1 0 0 -1 0 0] def
+ /FontBBox [0 0 1 1] def
+% pam 5-Jan-1988 array enlarged for gf fonts
+ /BitMaps 256 array def
+ /BuildChar {CharBuilder} def
+ /Encoding 256 array def
+ 0 1 255 {Encoding exch /.undef put} for
+ end
+ newname newname load definefont pop
+ } def
+
+
+% the following is the only character builder we need. it looks up the
+% char data in the BitMaps array, and paints the character if possible.
+% char data -- a bitmap descriptor -- is an array of length 6, of
+% which the various slots are:
+
+/ch-image {ch-data 0 get} def % the hex string image
+/ch-width {ch-data 1 get} def % the number of pixels across
+/ch-height {ch-data 2 get} def % the number of pixels tall
+/ch-xoff {ch-data 3 get} def % number of pixels below origin
+/ch-yoff {ch-data 4 get} def % number of pixels to left of origin
+/ch-tfmw {ch-data 5 get} def % spacing to next character
+
+/CharBuilder % fontdict ch Charbuilder - -- image one character
+ { /ch-code exch def % save the char code
+ /font-dict exch def % and the font dict.
+ /ch-data font-dict /BitMaps get ch-code get def % get the bitmap descriptor for char
+ ch-data null eq not
+ { ch-tfmw 0 ch-xoff neg ch-yoff neg ch-width ch-xoff sub ch-height ch-yoff sub
+ setcachedevice
+ ch-width ch-height true [1 0 0 1 ch-xoff ch-yoff]
+ {ch-image} imagemask
+ }
+ if
+ } def
+
+
+/@sf % fontdict @sf - -- make that the current font
+ { setfont() pop
+ } def
+
+ % in the following, the font-cacheing mechanism requires that
+ % a name unique in the particular font be generated
+
+/@dc % char-data ch @dc - -- define a new character bitmap in current font
+ { /ch-code exch def
+% ++oystr 12-Feb-86++
+ dup 0 get
+ length 2 lt
+ { pop [ <00> 1 1 0 0 8.00 ] } % replace <> with null
+ if
+% --oystr 12-Feb-86--
+ /ch-data exch def
+ currentfont /BitMaps get ch-code ch-data put
+ currentfont /Encoding get ch-code
+ dup ( ) cvs cvn % generate a unique name simply from the character code
+ put
+ } def
+
+/@bop0 % n @bop0 - -- begin the char def section of a new page
+ {
+ } def
+
+/@bop1 % n @bop1 - -- begin a brand new page
+ { pop
+ erasepage initgraphics
+ Mtrx setmatrix
+ /SaveImage save def() pop
+ } def
+
+/@eop % - @eop - -- end a page
+ { showpage
+ SaveImage restore() pop
+ } def
+
+/@start % - @start - -- start everything
+ { @letter % (there is not much to do)
+ } def
+
+/@end % - @end - -- done the whole shebang
+ { end
+ } def
+
+/p % x y p - -- move to position
+ { moveto
+ } def
+
+/r % x r - -- move right
+ { 0 rmoveto
+ } def
+
+/s % string s - -- show the string
+ { show
+ } def
+
+/c % ch c - -- show the character (code given)
+ { c-string exch 0 exch put
+ c-string show
+ } def
+
+/c-string ( ) def
+
+/ru % dx dy ru - -- set a rule (rectangle)
+ { /dy exch neg def % because dy is height up from bottom
+ /dx exch def
+ /x currentpoint /y exch def def % remember current point
+ newpath x y moveto
+ dx 0 rlineto
+ 0 dy rlineto
+ dx neg 0 rlineto
+ closepath fill
+ x y moveto
+ } def
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% the \special command junk
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% The structure of the PostScript produced by dvi2ps for \special is:
+% @beginspecial
+% - any number of @hsize, @hoffset, @hscale, etc., commands
+% @setspecial
+% - the users file of PostScript commands
+% @endspecial
+
+% The @beginspecial command recognizes whether the Macintosh Laserprep
+% has been loaded or not, and redfines some Mac commands if so.
+% The @setspecial handles the users shifting, scaling, clipping commands
+
+
+% The following are user settable options from the \special command.
+
+/@SpecialDefaults
+ { /hs 8.5 Inch def
+ /vs 11 Inch def
+ /ho 0 def
+ /vo 0 def
+ /hsc 1 def
+ /vsc 1 def
+ /CLIP false def
+ } def
+
+% d @hsize - specify a horizontal clipping dimension
+% these 2 are executed before the MacDraw initializations
+/@hsize {/hs exch def /CLIP true def} def
+/@vsize {/vs exch def /CLIP true def} def
+% d @hoffset - specify a shift for the drwgs
+/@hoffset {/ho exch def} def
+/@voffset {/vo excl def} def
+% s @hscale - set scale factor
+/@hscale {/hsc exch def} def
+/@vscale {/vsc exch def} def
+
+/@setclipper
+ { hsc vsc scale
+ CLIP
+ { newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip }
+ if
+ } def
+
+% this will be invoked as the result of a \special command (for the
+% inclusion of PostScript graphics). The basic idea is to change all
+% scaling and graphics back to defaults, but to shift the origin
+% to the current position on the page. Due to TeXnical difficulties,
+% we only set the y-origin. The x-origin is set at the left edge of
+% the page.
+
+/@beginspecial % - @beginspecial - -- enter special mode
+ { gsave /SpecialSave save def
+ % the following magic incantation establishes the current point as
+ % the users origin, and reverts back to default scalings, rotations
+ currentpoint transform initgraphics itransform translate
+ @SpecialDefaults % setup default offsets, scales, sizes
+ @MacSetUp % fix up Mac stuff
+ } def
+
+/@setspecial % to setup user specified offsets, scales, sizes (for clipping)
+ {
+ MacDrwgs
+ {md begin /pxt ho def /pyt vo neg def end}
+ {ho vo translate @setclipper}
+ ifelse
+ } def
+
+/@endspecial % - @endspecial - -- leave special mode
+ { SpecialSave restore
+ grestore
+ } def
+
+/MacDrwgs false def % will get set if we think the Mac LaserPrep file has been loaded
+
+ % - @MacSetUp - turn-off/fix-up all the MacDraw stuff that might hurt us
+ % we depend on 'psu' being the first procedure executed
+ % by a Mac document. We redefine 'psu' to adjust page
+ % translations, and to do all other the fixups required.
+ % This stuff will not harm other included PS files
+/@MacSetUp
+ { userdict /md known % if md is defined
+ { userdict /md get type /dicttype eq % and if it is a dictionary
+ { /MacDrwgs true def
+ md begin % then redefine some stuff
+ /psu % redfine psu to set origins, etc.
+ /psu load
+ % this procedure contains almost all the fixup code
+ { /letter {} def % it is bad manners to execute the real
+ /note {} def % versions of these (clears page image, etc.)
+ /legal {} def
+ statusdict /waittimeout 300 put
+ /page {pop} def % no printing of pages
+ /pyt vo neg def % x & y pixel translations
+ /pxt ho def
+ }
+ concatprocs
+ def
+ /od % redefine od to set clipping region
+ /od load
+ { @setclipper }
+ concatprocs
+ def
+ end }
+ if }
+ if
+ } def
+
+% p1 p2 concatprocs p - concatenate procedures
+/concatprocs
+ { /p2 exch cvlit def
+ /p1 exch cvlit def
+ /p p1 length p2 length add array def
+ p 0 p1 putinterval
+ p p1 length p2 putinterval
+ p cvx
+ } def
+
+end % revert to previous dictionary
+TeXDict begin @start
+%%Title: sy.dvi
+%%Creator: dvi2ps
+%%EndProlog
+1 @bop0
+[ 360 ] /lasy10.360 @newfont
+lasy10.360 @sf
+[<7FFFFFFCFFFFFFFEC0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C000
+ 0000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000C0000000
+ C0000000C0000000C0000000FFFFFFFE7FFFFFFC> 32 30 -4 3 38.743] 60 @dc
+[<7FFFFFFCFFFFFFFE000000060000000600000006000000060000000600000006000000060000000600000006000000060000
+ 0006000000060000000600000006000000060000000600000006000000060000000600000006000000060000000600000006
+ 000000060000000600000006FFFFFFFE7FFFFFFC> 32 30 -3 3 38.743] 61 @dc
+[<000020000000007000000000D8000000018C000000030600000006030000000C018000001800C00000300060000060003000
+ 00C00018000180000C00030000060006000003000C0000018018000000C03000000060600000003060000000303000000060
+ 18000000C00C00000180060000030003000006000180000C0000C000180000600030000030006000001800C000000C018000
+ 0006030000000306000000018C00000000D8000000007000000000200000> 40 36 -1 1 39.435] 51 @dc
+[<FFFFFFE0FFFFFFE0C0000060C0000060C0000060C0000060C0000060C0000060C0000060C0000060C0000060C0000060C000
+ 0060C0000060C0000060C0000060C0000060C0000060C0000060C0000060C0000060C0000060C0000060C0000060C0000060
+ FFFFFFE07FFFFFC0> 32 27 -5 -4 37.221] 50 @dc
+[<40000018E0000038F0000078D80000D8CC000198C6000318C3000618C1800C18C0C01818C0603018C0306018C018C018C00D
+ 8018C0070018C0070018C00D8018C018C018C0306018C0603018C0C01818C1800C18C3000618C6000318CC000198D80000D8
+ F0000078E000003840000018> 32 28 -3 -3 35.975] 49 @dc
+[ 360 ] /cmsy10.360 @newfont
+cmsy10.360 @sf
+[<800007E00080001FF00080003FF800C000781C00C001E00E006003C006007007800300381E0003001FFC0001000FF8000100
+ 07E0000100> 40 11 -3 -7 38.743] 24 @dc
+lasy10.360 @sf
+[<000000000600000000000300000000000300000001F00180000007FC018000000E0F00C000001803806000003000E0384000
+ 60007FFCC000C0001FFE7001800000383803000000600E0E000000C007FC0000018001F00000018000000000030000000000
+ 0300000000000600> 48 18 1 -3 49.812] 59 @dc
+[ 300 ] /cmmi12.300 @newfont
+cmmi12.300 @sf
+[<0000001800000078000001E00000078000001E00000078000003E000000F8000003C000000F0000003C000000F0000003C00
+ 0000F0000000F00000003C0000000F00000003C0000000F00000003C0000000F80000003E0000000780000001E0000000780
+ 000001E00000007800000018> 32 28 -4 2 37.935] 60 @dc
+cmsy10.360 @sf
+[<FFFFFFFC7FFFFFF800000000000000000000000000000000000000000000000000000000000000000000000C0000003C0000
+ 00F0000003C000000F0000003C000000F0000007C000001F00000078000001E00000078000001E00000078000000E0000000
+ 780000001E0000000780000001E0000000780000001F00000007C0000000F00000003C0000000F00000003C0000000F00000
+ 003C0000000C> 32 39 -4 7 38.743] 20 @dc
+cmmi12.300 @sf
+[<C0000000F00000003C0000000F00000003C0000000F00000003E0000000F80000001E0000000780000001E00000007800000
+ 01E00000007800000078000001E00000078000001E00000078000001E000000F8000003E000000F0000003C000000F000000
+ 3C000000F0000000C0000000> 32 28 -4 2 37.935] 62 @dc
+cmsy10.360 @sf
+[<FFFFFFFC7FFFFFF80000000000000000000000000000000000000000000000000000000000000000C0000000700000003C00
+ 00000F00000003C0000000F00000003C0000000F80000003E0000000780000001E0000000780000001E0000000780000001C
+ 00000078000001E00000078000001E00000078000003E000000F8000003C000000F0000003C000000F0000003C000000F000
+ 0000C0000000> 32 39 -4 7 38.743] 21 @dc
+[ 300 ] /cmr12.300 @newfont
+cmr12.300 @sf
+[<FFFE07C003800380038003800380038003800380038003800380038003800380038003800380038003800380038003800380
+ 0380038003800380F3800F8003800080> 16 33 -4 0 24.387] 49 @dc
+1 @bop1
+lasy10.360 @sf
+73 45 p (<=) s
+14 r (32) s
+14 r 49 c
+cmsy10.360 @sf
+0 r 24 c
+lasy10.360 @sf
+0 r 59 c
+cmmi12.300 @sf
+14 r 60 c
+424 48 p 3 29 ru
+cmsy10.360 @sf
+448 45 p 20 c
+480 41 p 3 27 ru
+518 48 p 3 29 ru
+cmmi12.300 @sf
+514 45 p 62 c
+567 41 p 3 27 ru
+cmsy10.360 @sf
+563 45 p 21 c
+cmr12.300 @sf
+963 2828 p 49 c
+@eop
+@end
diff --git a/fonts/utilities/mf2ps/doc/printsamples/sy.tex b/fonts/utilities/mf2ps/doc/printsamples/sy.tex
new file mode 100644
index 0000000000..7cb83ed5f3
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/sy.tex
@@ -0,0 +1,11 @@
+\documentstyle [12pt] {article}
+
+\oddsidemargin 0in
+\evensidemargin 0in
+\topmargin -0.5in
+\textheight 9.0in
+\textwidth 6.5in
+
+\begin{document}
+$ \sqsubset \sqsupset \Diamond \Box \Join \sim \leadsto \lhd \unlhd \rhd \unrhd $
+\end{document}
diff --git a/fonts/utilities/mf2ps/doc/printsamples/tt.ps b/fonts/utilities/mf2ps/doc/printsamples/tt.ps
new file mode 100644
index 0000000000..3989da772a
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/tt.ps
@@ -0,0 +1,180 @@
+%!PS-Adobe-2.0
+%%Creator: dvips by Radical Eye Software
+%%Title: tt.dvi
+%%Pages: 1 -1
+%%BoundingBox: 0 0 612 792
+%%EndComments
+%%BeginDocument: tex.pro
+/TeXDict 200 dict def TeXDict begin /bdf{bind def}def /Inch{Resolution mul}
+bdf /Dots{72 div Resolution mul}bdf /dopage{72 Resolution div dup neg scale
+translate}bdf /@letter{Resolution dup -10 mul dopage}bdf /@note{@letter}bdf
+/@a4{Resolution dup -10.6929133858 mul dopage}bdf /@translate{translate}bdf
+/@scale{scale}bdf /@rotate{rotate}bdf /@landscape{[0 1 -1 0 0 0]concat
+Resolution dup dopage}bdf /@legal{Resolution dup -13 mul dopage}bdf
+/@manualfeed{statusdict /manualfeed true put}bdf /@copies{/#copies exch def}
+bdf /@FontMatrix[1 0 0 -1 0 0]def /@FontBBox[0 0 1 1]def /dmystr(ZZf@@)def
+/newname{dmystr cvn}bdf /df{/fontname exch def dmystr 2 fontname cvx(@@@)cvs
+putinterval newname 7 dict def newname load begin /FontType 3 def /FontMatrix
+@FontMatrix def /FontBBox @FontBBox def /BitMaps 256 array def /BuildChar{
+CharBuilder}def /Encoding TeXEncoding def end fontname{/foo setfont}2 array
+copy cvx def fontname load 0 dmystr 5 string copy cvn cvx put}bdf /dfe{
+newname newname load definefont setfont}bdf /ch-image{ch-data 0 get}bdf
+/ch-width{ch-data 1 get}bdf /ch-height{ch-data 2 get}bdf /ch-xoff{ch-data 3
+get}bdf /ch-yoff{ch-data 4 get}bdf /ch-tfmw{ch-data 5 get}bdf /CharBuilder{
+save 3 1 roll exch /BitMaps get exch get /ch-data exch def ch-data null ne{
+ch-tfmw 0 ch-xoff neg ch-yoff neg ch-width ch-xoff sub ch-height ch-yoff sub
+setcachedevice ch-width ch-height true[1 0 0 1 ch-xoff .1 sub ch-yoff .1 sub]{
+ch-image}imagemask}if restore}bdf /dc{/ch-code exch def dup 0 get length 1 lt{
+pop[<00>1 1 0 0 8.00]}if /ch-data exch def newname load /BitMaps get ch-code
+ch-data put}bdf /bop{gsave /SaveImage save def 0 0 moveto}bdf /eop{clear
+SaveImage restore showpage grestore}bdf /@start{/Resolution exch def
+/TeXEncoding 256 array def 0 1 255{TeXEncoding exch 1 string dup 0 3 index put
+cvn put}for}bdf /p{show}bdf /RuleMatrix[1 0 0 -1 -.1 -.1]def /BlackDots 8
+string def /v{gsave currentpoint translate false RuleMatrix{BlackDots}
+imagemask grestore}bdf /a{moveto}bdf /delta 0 def /tail{dup /delta exch def 0
+rmoveto}bdf /b{exch p tail}bdf /c{p delta 4 sub tail}bdf /d{p delta 3 sub tail
+}bdf /e{p delta 2 sub tail}bdf /f{p delta 1 sub tail}bdf /g{p delta 0 rmoveto}
+bdf /h{p delta 1 add tail}bdf /i{p delta 2 add tail}bdf /j{p delta 3 add tail}
+bdf /k{p delta 4 add tail}bdf /l{p -4 0 rmoveto}bdf /m{p -3 0 rmoveto}bdf /n{
+p -2 0 rmoveto}bdf /o{p -1 0 rmoveto}bdf /q{p 1 0 rmoveto}bdf /r{p 2 0 rmoveto
+}bdf /s{p 3 0 rmoveto}bdf /t{p 4 0 rmoveto}bdf /w{0 rmoveto}bdf /x{0 exch
+rmoveto}bdf /y{3 -1 roll p moveto}bdf /bos{/section save def}bdf /eos{clear
+section restore}bdf /SDict 200 dict def SDict begin /@SpecialDefaults{/hs 8.5
+Inch def /vs 11 Inch def /ho 0 def /vo 0 def /hsc 1 def /vsc 1 def /ang 0 def
+/CLIP false def /BBcalc false def}bdf /@hsize{/hs exch def /CLIP true def}bdf
+/@vsize{/vs exch def /CLIP true def}bdf /@hoffset{/ho exch def}bdf /@voffset{
+/vo exch def}bdf /@hscale{@scaleunit div /hsc exch def}bdf /@vscale{
+@scaleunit div /vsc exch def}bdf /@angle{/ang exch def}bdf /@scaleunit 100 def
+/@rwi{10 div /rwi exch def}bdf /@llx{/llx exch def}bdf /@lly{/lly exch def}
+bdf /@urx{/urx exch def}bdf /@ury{/ury exch def /BBcalc true def}bdf
+/@setclipper{BBcalc{rwi urx llx sub div dup scale llx neg lly neg translate}{
+hsc vsc scale}ifelse CLIP{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg
+0 rlineto closepath clip}{initclip}ifelse}bdf end /@MacSetUp{userdict /md
+known{userdict /md get type /dicttype eq{md begin /letter{}def /note{}def
+/legal{}def /od{txpose 1 0 mtx defaultmatrix dtransform exch atan/pa exch def
+newpath clippath mark{transform{itransform moveto}}{transform{itransform
+lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{
+itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{
+closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39 0 put
+10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}def /txpose{pxs pys
+scale ppr aload pop por{noflips{pop exch neg exch translate pop 1 -1 scale}if
+xflip yflip and{pop exch neg exch translate 180 rotate 1 -1 scale ppr 3 get
+ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg translate}if xflip yflip
+not and{pop exch neg exch translate pop 180 rotate ppr 3 get ppr 1 get neg sub
+neg 0 translate}if yflip xflip not and{ppr 1 get neg ppr 0 get neg translate}
+if}{noflips{translate pop pop 270 rotate 1 -1 scale}if xflip yflip and{
+translate pop pop 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2
+get ppr 0 get neg sub neg translate}if xflip yflip not and{translate pop pop
+90 rotate ppr 3 get ppr 1 get neg sub neg 0 translate}if yflip xflip not and{
+translate pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 exch translate}
+if}ifelse scaleby96{ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2
+copy translate .96 dup scale neg exch neg exch translate}if}def /cp{pop pop
+showpage pm restore}def end}if}if}def /psf$TeXscale{65536 div}def /startTexFig
+{/psf$SavedState save def userdict maxlength dict begin Resolution 72 div dup
+neg scale currentpoint translate /psf$ury exch psf$TeXscale def /psf$urx exch
+psf$TeXscale def /psf$lly exch psf$TeXscale def /psf$llx exch psf$TeXscale def
+/psf$y exch psf$TeXscale def /psf$x exch psf$TeXscale def currentpoint /psf$cy
+exch def /psf$cx exch def /psf$sx psf$x psf$urx psf$llx sub div def /psf$sy
+psf$y psf$ury psf$lly sub div def psf$sx psf$sy scale psf$cx psf$sx div
+psf$llx sub psf$cy psf$sy div psf$ury sub translate /showpage{}def /erasepage{
+}def /copypage{}def @MacSetUp}def /doclip{psf$llx psf$lly psf$urx psf$ury
+currentpoint 6 2 roll newpath 4 copy 4 2 roll moveto 6 -1 roll exch lineto
+exch lineto exch lineto closepath clip newpath moveto}def /endTexFig{end
+psf$SavedState restore}def /@beginspecial{SDict begin /SpecialSave save def
+gsave Resolution 72 div dup neg scale currentpoint translate @SpecialDefaults}
+bdf /@setspecial{ho vo translate @setclipper ang rotate /showpage{}def newpath
+}bdf /@endspecial{grestore clear SpecialSave restore end}bdf /@defspecial{
+SDict begin}bdf /@fedspecial{end}bdf /li{lineto}bdf /rl{rlineto}bdf /rc{
+rcurveto}bdf /np{/SaveX currentpoint /SaveY exch def def newpath}bdf /st{
+stroke SaveX SaveY moveto}bdf /fil{fill SaveX SaveY moveto}bdf /ellipse{
+/endangle exch def /startangle exch def /yrad exch def /xrad exch def
+/savematrix matrix currentmatrix def translate xrad yrad scale 0 0 1
+startangle endangle arc savematrix setmatrix}bdf end
+%%EndDocument
+TeXDict begin 300 @start /fa df[<7F01FCFF83FE7F01FC1C00700E00E00E00E00E00E00E
+00E00FFFE007FFC007FFC00701C00701C003838003838003838003838001C70001C70001C70001
+C70000C60000C60000EE0000EE0000EE00006C00007C00007C00003800>23 30 -1 0 26]65 dc
+[<00FE0003FF8007FFC00F83E01E00F01C00703C0078780038700038700038F00000E00000E000
+00E00000E00000E00000E00000E00000E00000F000007000387000387800383C00781C00781E00
+F80F83F807FFF803FFB800FE38>21 30 -2 0 26]67 dc[<FFFFFCFFFFFCFFFFFC1C001C1C001C
+1C001C1C001C1C001C1C00001C00001C00001C0E001C0E001C0E001FFE001FFE001FFE001C0E00
+1C0E001C0E001C00001C00001C00001C00381C00381C00381C0038FFFFF8FFFFF8FFFFF8>22 30
+-2 0 26]69 dc[<7FE000FFE0007FE0000E00000E00000E00000E00000E00000E00000E00000E
+00000E03800E03800E03800FFF800FFF800FFF800E03800E03800E03800E00000E00000E00000E
+001C0E001C0E001C0E001C7FFFFCFFFFFC7FFFFC>22 30 -1 0 26]70 dc[<FF83FEFF83FEFF83
+FE1C00701C00701C00701C00701C00701C00701C00701C00701C00701C00701C00701FFFF01FFF
+F01FFFF01C00701C00701C00701C00701C00701C00701C00701C00701C00701C0070FF83FEFF83
+FEFF83FE>23 30 -1 0 26]72 dc[<FFFF80FFFF80FFFF8001C00001C00001C00001C00001C000
+01C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C000
+01C00001C00001C00001C00001C00001C000FFFF80FFFF80FFFF80>17 30 -4 0 26]73 dc[<7F
+FFFCFFFFFC7FFFFC0E001C0E001C0E001C0E001C0E001C0E00000E00000E00000E00000E00000E
+00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E
+00007FE000FFF0007FE000>22 30 -1 0 26]76 dc[<7F007F00FF80FF807F007F001C001C001C
+001C001C001C001C001C001C001C001C001C001C001C001C1C1C001C1C1C001C3E1C001C361C00
+1C361C001C771C001C771C001C631C001CE39C001CE39C001CC19C001CC19C001DC1DC001DC1DC
+001D80DC001D80DC001D80DC007F007F00FF007F807E003F00>25 30 0 0 26]77 dc[<FF80F0
+FF81F0FF81F01C03701C03701C07701C06701C06701C0E701C0E701C0C701C1C701C1C701C1870
+1C38701C38701C30701C70701C70701C60701CE0701CE0701CC0701CC0701DC0701D80701D8070
+FF03FEFF03FEFE03FE>23 30 -1 0 26]78 dc[<0FFE003FFF807FFFC07C07C07001C0F001E0F0
+01E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E0
+00E0E000E0E000E0E000E0E000E0F001E07001C07C07C07FFFC03FFF800FFE00>19 30 -3 0 26
+]79 dc[<FF8000FF8000FF80001C00001C00001C00001C00001C00001C00001C00001C00001C00
+001FFE001FFF801FFFC01C03E01C00F01C00701C00781C00381C00381C00381C00381C00781C00
+701C00F01C03E0FFFFC0FFFF80FFFE00>21 30 -2 0 26]80 dc[<FF803CFF807EFF80FF1C00E7
+1C00E71C00E71C00E21C00E01C00E01C00E01C00E01C00E01C01E01C07C01FFF801FFF001FFF80
+1C07C01C01E01C00F01C00701C00701C00701C00701C00F01C01E01C07C0FFFF80FFFF00FFFC00
+>24 30 -1 0 26]82 dc[<E3FC00FFFE00FFFF80FE0780F003C0F001E0E000E0E000E06000E000
+00E00001E00001C00003C0000F8001FF000FFE001FF8003F0000780000F00000E00000E001C0E0
+01C0E001C0F003C07007C07C1FC03FFFC01FFDC007F1C0>19 30 -3 0 26]83 dc[<03FF8003FF
+8003FF800038000038000038000038000038000038000038000038000038000038000038000038
+00003800003800003800003800003800003800003800003800E0380EE0380EE0380EE0380EFFFF
+FEFFFFFE7FFFFE>23 30 -1 0 26]84 dc[<003800007C00007C00006C0000EE0000EE0000EE00
+00C60001C70001C70001C70001C7000383800383800383800383800701C00701C00701C00701C0
+0E00E00E00E00E00E01E00F01C00701C00701C0070FF01FEFF01FEFF01FE>23 30 -1 0 26]86
+dc[<0701C00F83E00F83E00D83600D83600D83600DC7600DC7600DC7601CC6701CC6701CEE701C
+EE701CEE701CEE701CEE701C7C70387C3838003838003838003838003838003838003838003878
+003C70001CFE00FEFF01FEFE00FE>23 30 -1 0 26]87 dc dfe /fb df[<7F1FC0FF1FE07F1F
+C01C07001C07001C07001FFF000FFE000FFE000E0E000E0E00071C00071C00071C00071C00071C
+0003180003B80003B80003B80001B00001B00001F00001F00000E000>19 25 -1 0 22]65 dc[<
+01F00007FC000FFE001F0F003C0780780380780380700380F00000E00000E00000E00000E00000
+E00000E00000E00000F000007003807803807807803C07801F0F800FFF8007FF8001F180>17 25
+-2 0 22]67 dc[<7FFFE0FFFFE07FFFE01C00E01C00E01C00E01C00E01C00E01C00001C1C001C
+1C001FFC001FFC001FFC001C1C001C1C001C00001C00001C01C01C01C01C01C01C01C07FFFC0FF
+FFC07FFFC0>19 25 -1 0 22]69 dc[<FF8000FFC000FF80001C00001C00001C00001C00001C00
+001C00001C1C001C1C001FFC001FFC001FFC001C1C001C1C001C00001C00001C00E01C00E01C00
+E01C00E0FFFFE0FFFFE0FFFFE0>19 25 -1 0 22]70 dc[<7F1FC0FFBFE07F1FC01C07001C0700
+1C07001C07001C07001C07001C07001C07001C07001FFF001FFF001FFF001C07001C07001C0700
+1C07001C07001C07001C07007F1FC0FFBFE07F1FC0>19 25 -1 0 22]72 dc[<FFFEFFFEFFFE03
+80038003800380038003800380038003800380038003800380038003800380038003800380FFFE
+FFFEFFFE>15 25 -3 0 22]73 dc[<FE0FE0FE0FE0FE0FE0380380380380380380380380380380
+38E38038E38039F38039B38039B38039B38039B3803BBB803BBB803B1B803B1B803B1B803B1B80
+3A0B80FE0FE0FE0FE0FC07E0>19 25 -1 0 22]77 dc[<7F0F00FF9F007F1F001C17001C37001C
+37001C37001C77001C77001C67001C67001CE7001CE7001CE7001CC7001CC7001DC7001DC7001D
+87001D87001D87001D07007F1FC0FF3FE07E1FC0>19 25 -1 0 22]78 dc[<1FFC003FFE007FFF
+00780F00F00780F00780E00380E00380E00380E00380E00380E00380E00380E00380E00380E003
+80E00380E00380E00380E00380F00780780F007FFF003FFE001FFC00>17 25 -2 0 22]79 dc[<
+7F0000FF80007F00001C00001C00001C00001C00001C00001C00001C00001FF8001FFE001FFF00
+1C0F801C03801C03C01C01C01C01C01C01C01C03C01C03801C0F807FFF00FFFE007FF800>18 25
+-1 0 22]80 dc[<7F03C0FF87E07F0FF01C0E701C0E701C0E201C0E001C0E001C0E001C0E001C
+3E001FFC001FF8001FFC001C1E001C0F001C07001C07001C07001C07001C0F001C1E007FFC00FF
+F8007FE000>20 25 -1 0 22]82 dc[<C7F000FFFC00FFFE00F80F00F00780E00380E003800003
+80000380000780000F0000FE0007FC001FF0007F8000780000F00000E00000E00700E00700F00F
+00781F007FFF001FFF0007E300>17 25 -2 0 22]83 dc[<07FC000FFE0007FC0000E00000E000
+00E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E000
+E0E0E0E0E0E0E0E0E0E0E0E0FFFFE0FFFFE07FFFE0>19 25 -1 0 22]84 dc[<0E0E000F1E000F
+1E001B1B0019130019B30019B30019B30019B30019B30019B30039B38039F38039F38038E38038
+03803803803803803001807001C07001C07001C0FC07E0FE0FE0FC07E0>19 25 -1 0 22]87 dc
+dfe /fc df[<FFF80F800700070007000700070007000700070007000700070007000700070007
+00070007000700070007000700C7003F0007000300>13 27 -4 0 21]49 dc dfe end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 300
+ TeXDict begin @letter
+%%EndSetup
+%%Page: 1 1
+ bop 83 42 a fb(THIS)21 b(IS)g(CMTT)g(TEN)h(POINTS)e(WRITTEN)g(IN)i(METAFONT)
+83 91 y fa(THIS)i(IS)h(CMTT)f(TWELVE)g(POINTS)f(WRITTEN)g(IN)i(METAFONT)965
+2770 y fc(1)g eop
+%%Trailer
+ end
+%%EOF
diff --git a/fonts/utilities/mf2ps/doc/printsamples/tt.tex b/fonts/utilities/mf2ps/doc/printsamples/tt.tex
new file mode 100644
index 0000000000..9eaad5ce86
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/tt.tex
@@ -0,0 +1,8 @@
+\font\test=cmtt10
+\test
+THIS IS CMTT TEN POINTS WRITTEN IN METAFONT
+
+\font\test=cmtt12
+\test
+THIS IS CMTT TWELVE POINTS WRITTEN IN METAFONT
+\bye
diff --git a/fonts/utilities/mf2ps/doc/printsamples/tt7.ps b/fonts/utilities/mf2ps/doc/printsamples/tt7.ps
new file mode 100644
index 0000000000..a61024be70
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/tt7.ps
@@ -0,0 +1,457 @@
+%! for use by dvi2ps Version 2.00
+% a start (Ha!) at a TeX mode for PostScript.
+% The following defines procedures assumed and used by program "dvi2ps"
+% and must be downloaded or sent as a header file for all TeX jobs.
+
+% By: Neal Holtz, Carleton University, Ottawa, Canada
+% <holtz@cascade.carleton.cdn>
+% <holtz%cascade.carleton.cdn@ubc.csnet>
+% June, 1985
+% Last Modified: Aug 25/85
+% oystr 12-Feb-1986
+% Changed @dc macro to check for a badly formed bits in character
+% definitions. Can get a <> bit map if a character is not actually
+% in the font file. This is absolutely guaranteed to drive the
+% printer nuts - it will appear that you can no longer define a
+% new font, although the built-ins will still be there.
+
+% To convert this file into a downloaded file instead of a header
+% file, uncomment all of the lines beginning with %-%
+
+%-%0000000 % Server loop exit password
+%-%serverdict begin exitserver
+%-% systemdict /statusdict known
+%-% {statusdict begin 9 0 3 setsccinteractive /waittimeout 300 def end}
+%-% if
+
+/TeXDict 200 dict def % define a working dictionary
+TeXDict begin % start using it.
+
+ % units are in "dots" (300/inch)
+/Resolution 300 def
+/Inch {Resolution mul} def % converts inches to internal units
+
+/Mtrx 6 array def
+
+%%%%%%%%%%%%%%%%%%%%% Page setup (user) options %%%%%%%%%%%%%%%%%%%%%%%%
+
+% dvi2ps will output coordinates in the TeX system ([0,0] 1" down and in
+% from top left, with y +ive downward). The default PostScript system
+% is [0,0] at bottom left, y +ive up. The Many Matrix Machinations in
+% the following code are an attempt to reconcile that. The intent is to
+% specify the scaling as 1 and have only translations in the matrix to
+% properly position the text. Caution: the default device matrices are
+% *not* the same in all PostScript devices; that should not matter in most
+% of the code below (except for lanscape mode -- in that, rotations of
+% -90 degrees resulted in the the rotation matrix [ e 1 ]
+% [ 1 e ]
+% where the "e"s were almost exactly but not quite unlike zeros.
+
+/@letter
+ { letter initmatrix
+ 72 Resolution div dup neg scale % set scaling to 1.
+ 310 -3005 translate % move origin to top (these are not exactly 1"
+ Mtrx currentmatrix pop % and -10" because margins aren't set exactly right)
+ } def
+ % note mode is like letter, except it uses less VM
+/@note
+ { note initmatrix
+ 72 Resolution div dup neg scale % set scaling to 1.
+ 310 -3005 translate % move origin to top
+ Mtrx currentmatrix pop
+ } def
+
+/@landscape
+ { letter initmatrix
+ 72 Resolution div dup neg scale % set scaling to 1.
+% -90 rotate % it would be nice to be able to do this
+ Mtrx currentmatrix 0 0.0 put % but instead we have to do things like this because what
+ Mtrx 1 -1.0 put % should be zero terms aren't (and text comes out wobbly)
+ Mtrx 2 1.0 put % Fie! This likely will not work on QMS printers
+ Mtrx 3 0.0 put % (nor on others where the device matrix is not like
+ Mtrx setmatrix % like it is on the LaserWriter).
+ 300 310 translate % move origin to top
+ Mtrx currentmatrix pop
+ } def
+
+/@legal
+ { legal initmatrix
+ 72 Resolution div dup neg scale % set scaling to 1.
+ 295 -3880 translate % move origin to top
+ Mtrx currentmatrix pop
+ } def
+
+/@manualfeed
+ { statusdict /manualfeed true put
+ } def
+ % n @copies - set number of copies
+/@copies
+ { /#copies exch def
+ } def
+
+%%%%%%%%%%%%%%%%%%%% Procedure Defintions %%%%%%%%%%%%%%%%%%%%%%%%%%
+
+/@newfont % id @newfont - -- initialize a new font dictionary
+ { /newname exch def
+ pop
+ newname 7 dict def % allocate new font dictionary
+ newname load begin
+ /FontType 3 def
+ /FontMatrix [1 0 0 -1 0 0] def
+ /FontBBox [0 0 1 1] def
+ /BitMaps 128 array def
+ /BuildChar {CharBuilder} def
+ /Encoding 128 array def
+ 0 1 127 {Encoding exch /.undef put} for
+ end
+ newname newname load definefont pop
+ } def
+
+
+% the following is the only character builder we need. it looks up the
+% char data in the BitMaps array, and paints the character if possible.
+% char data -- a bitmap descriptor -- is an array of length 6, of
+% which the various slots are:
+
+/ch-image {ch-data 0 get} def % the hex string image
+/ch-width {ch-data 1 get} def % the number of pixels across
+/ch-height {ch-data 2 get} def % the number of pixels tall
+/ch-xoff {ch-data 3 get} def % number of pixels below origin
+/ch-yoff {ch-data 4 get} def % number of pixels to left of origin
+/ch-tfmw {ch-data 5 get} def % spacing to next character
+
+/CharBuilder % fontdict ch Charbuilder - -- image one character
+ { /ch-code exch def % save the char code
+ /font-dict exch def % and the font dict.
+ /ch-data font-dict /BitMaps get ch-code get def % get the bitmap descriptor for char
+ ch-data null eq not
+ { ch-tfmw 0 ch-xoff neg ch-yoff neg ch-width ch-xoff sub ch-height ch-yoff sub
+ setcachedevice
+ ch-width ch-height true [1 0 0 1 ch-xoff ch-yoff]
+ {ch-image} imagemask
+ }
+ if
+ } def
+
+
+/@sf % fontdict @sf - -- make that the current font
+ { setfont() pop
+ } def
+
+ % in the following, the font-cacheing mechanism requires that
+ % a name unique in the particular font be generated
+
+/@dc % char-data ch @dc - -- define a new character bitmap in current font
+ { /ch-code exch def
+% ++oystr 12-Feb-86++
+ dup 0 get
+ length 2 lt
+ { pop [ <00> 1 1 0 0 8.00 ] } % replace <> with null
+ if
+% --oystr 12-Feb-86--
+ /ch-data exch def
+ currentfont /BitMaps get ch-code ch-data put
+ currentfont /Encoding get ch-code
+ dup ( ) cvs cvn % generate a unique name simply from the character code
+ put
+ } def
+
+/@bop0 % n @bop0 - -- begin the char def section of a new page
+ {
+ } def
+
+/@bop1 % n @bop1 - -- begin a brand new page
+ { pop
+ erasepage initgraphics
+ Mtrx setmatrix
+ /SaveImage save def() pop
+ } def
+
+/@eop % - @eop - -- end a page
+ { showpage
+ SaveImage restore() pop
+ } def
+
+/@start % - @start - -- start everything
+ { @letter % (there is not much to do)
+ } def
+
+/@end % - @end - -- done the whole shebang
+ { end
+ } def
+
+/p % x y p - -- move to position
+ { moveto
+ } def
+
+/r % x r - -- move right
+ { 0 rmoveto
+ } def
+
+/s % string s - -- show the string
+ { show
+ } def
+
+/c % ch c - -- show the character (code given)
+ { c-string exch 0 exch put
+ c-string show
+ } def
+
+/c-string ( ) def
+
+/ru % dx dy ru - -- set a rule (rectangle)
+ { /dy exch neg def % because dy is height up from bottom
+ /dx exch def
+ /x currentpoint /y exch def def % remember current point
+ newpath x y moveto
+ dx 0 rlineto
+ 0 dy rlineto
+ dx neg 0 rlineto
+ closepath fill
+ x y moveto
+ } def
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% the \special command junk
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% The structure of the PostScript produced by dvi2ps for \special is:
+% @beginspecial
+% - any number of @hsize, @hoffset, @hscale, etc., commands
+% @setspecial
+% - the users file of PostScript commands
+% @endspecial
+
+% The @beginspecial command recognizes whether the Macintosh Laserprep
+% has been loaded or not, and redfines some Mac commands if so.
+% The @setspecial handles the users shifting, scaling, clipping commands
+
+
+% The following are user settable options from the \special command.
+
+/@SpecialDefaults
+ { /hs 8.5 Inch def
+ /vs 11 Inch def
+ /ho 0 def
+ /vo 0 def
+ /hsc 1 def
+ /vsc 1 def
+ /CLIP false def
+ } def
+
+% d @hsize - specify a horizontal clipping dimension
+% these 2 are executed before the MacDraw initializations
+/@hsize {/hs exch def /CLIP true def} def
+/@vsize {/vs exch def /CLIP true def} def
+% d @hoffset - specify a shift for the drwgs
+/@hoffset {/ho exch def} def
+/@voffset {/vo excl def} def
+% s @hscale - set scale factor
+/@hscale {/hsc exch def} def
+/@vscale {/vsc exch def} def
+
+/@setclipper
+ { hsc vsc scale
+ CLIP
+ { newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip }
+ if
+ } def
+
+% this will be invoked as the result of a \special command (for the
+% inclusion of PostScript graphics). The basic idea is to change all
+% scaling and graphics back to defaults, but to shift the origin
+% to the current position on the page. Due to TeXnical difficulties,
+% we only set the y-origin. The x-origin is set at the left edge of
+% the page.
+
+/@beginspecial % - @beginspecial - -- enter special mode
+ { gsave /SpecialSave save def
+ % the following magic incantation establishes the current point as
+ % the users origin, and reverts back to default scalings, rotations
+ currentpoint transform initgraphics itransform translate
+ @SpecialDefaults % setup default offsets, scales, sizes
+ @MacSetUp % fix up Mac stuff
+ } def
+
+/@setspecial % to setup user specified offsets, scales, sizes (for clipping)
+ {
+ MacDrwgs
+ {md begin /pxt ho def /pyt vo neg def end}
+ {ho vo translate @setclipper}
+ ifelse
+ } def
+
+/@endspecial % - @endspecial - -- leave special mode
+ { SpecialSave restore
+ grestore
+ } def
+
+/MacDrwgs false def % will get set if we think the Mac LaserPrep file has been loaded
+
+ % - @MacSetUp - turn-off/fix-up all the MacDraw stuff that might hurt us
+ % we depend on 'psu' being the first procedure executed
+ % by a Mac document. We redefine 'psu' to adjust page
+ % translations, and to do all other the fixups required.
+ % This stuff will not harm other included PS files
+/@MacSetUp
+ { userdict /md known % if md is defined
+ { userdict /md get type /dicttype eq % and if it is a dictionary
+ { /MacDrwgs true def
+ md begin % then redefine some stuff
+ /psu % redfine psu to set origins, etc.
+ /psu load
+ % this procedure contains almost all the fixup code
+ { /letter {} def % it is bad manners to execute the real
+ /note {} def % versions of these (clears page image, etc.)
+ /legal {} def
+ statusdict /waittimeout 300 put
+ /page {pop} def % no printing of pages
+ /pyt vo neg def % x & y pixel translations
+ /pxt ho def
+ }
+ concatprocs
+ def
+ /od % redefine od to set clipping region
+ /od load
+ { @setclipper }
+ concatprocs
+ def
+ end }
+ if }
+ if
+ } def
+
+% p1 p2 concatprocs p - concatenate procedures
+/concatprocs
+ { /p2 exch cvlit def
+ /p1 exch cvlit def
+ /p p1 length p2 length add array def
+ p 0 p1 putinterval
+ p p1 length p2 putinterval
+ p cvx
+ } def
+
+end % revert to previous dictionary
+TeXDict begin @start
+%%Title: tt7.dvi
+%%Creator: dvi2ps
+%%EndProlog
+1 @bop0
+[ 1500 ] /cmtt8.1500 @newfont
+cmtt8.1500 @sf
+[<1FF01FF00380038003800380038003800380038003800380038003800380E38EE38EE38EFFFEFFFE> 16 20 -1 0 17.642] 84 @dc
+[<FEFEFEFE38383838383838383838383838383FF83FF83838383838383838383838383838FEFEFEFE> 16 20 -1 0 17.642] 72 @dc
+[<FFF8FFF80700070007000700070007000700070007000700070007000700070007000700FFF8FFF8> 16 20 -2 0 17.642] 73 @dc
+[<CF80FFE0F070F078E038E0380038007800F00FF03FE07F00F000F000E070E070E0F070F03FF01F30> 16 20 -2 0 17.642] 83 @dc
+[<03E00FF81C3C381E780E700EF00EE000E000E000E000E000E000F00E700E781E381E1C3E0FFE03E6> 16 20 -1 0 17.642] 67 @dc
+[<FE3F80FE3F80380E00380E00380E00380E00380E0039CE0039CE003BEE003B6E003B6E003B6E003B6E003B6E003B6E003A2E
+ 003A2E00FE3F80FE3F80> 24 20 0 0 17.642] 77 @dc
+[<FFFEFFFE380E380E380E380E380038E038E03FE03FE038E038E038003800380E380E380EFFFEFFFE> 16 20 -1 0 17.642] 69 @dc
+[<07B81FF83CF8387870787038F038E038E1FEE1FEE000E000E000F0387038703838783CF81FF80798> 16 20 -1 0 17.642] 71 @dc
+[<FE00FE003800380038003800380038003FE03FF8383C381C380E380E380E380E381C383CFFF8FFE0> 16 20 -1 0 17.642] 80 @dc
+[<3FE07FF07070E038E038E038E038E038E038E038E038E038E038E038E038E038E03870707FF03FE0> 16 20 -2 0 17.642] 79 @dc
+[<FEF8FEF838B838B839B839B839B839B839B839B83B383B383B383B383B383B383A383A38FEFEFEFE> 16 20 -1 0 17.642] 78 @dc
+[<0E38001E3C001F7C001B6C001B6C001B6C001B6C001B6C001B6C001BEC003BEE003BEE00380E00380E00380E00380E00380E
+ 00380E00FE3F80FE3F80> 24 20 0 0 17.642] 87 @dc
+[<FE1CFE3F38773877387038703870387038F03FE03FE038F03878383838383838387838F0FFE0FF80> 16 20 -1 0 17.642] 82 @dc
+[<FEFEFEFE3838383838381FF01FF01C701C701C700C600EE00EE00EE00EE006C006C007C007C00380> 16 20 -1 0 17.642] 65 @dc
+[<FF00FF003800380038003800380038E038E03FE03FE038E038E038003800380E380E380EFFFEFFFE> 16 20 -1 0 17.642] 70 @dc
+[ 1500 ] /cmtt10.1500 @newfont
+cmtt10.1500 @sf
+[<07FC000FFE0007FC0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0
+ 0000E000E0E0E0E0E0E0E0E0E0E0E0E0FFFFE0FFFFE07FFFE0> 24 25 -1 0 21.793] 84 @dc
+[<7F1FC0FFBFE07F1FC01C07001C07001C07001C07001C07001C07001C07001C07001C07001FFF001FFF001FFF001C07001C07
+ 001C07001C07001C07001C07001C07007F1FC0FFBFE07F1FC0> 24 25 -1 0 21.793] 72 @dc
+[<FFFEFFFEFFFE0380038003800380038003800380038003800380038003800380038003800380038003800380FFFEFFFEFFFE> 16 25 -3 0 21.793] 73 @dc
+[<C7F000FFFC00FFFE00F80F00F00780E00380E00380000380000380000780000F0000FE0007FC001FF0007F8000780000F000
+ 00E00000E00700E00700F00F00781F007FFF001FFF0007E300> 24 25 -2 0 21.793] 83 @dc
+[<01F00007FC000FFE001F0F003C0780780380780380700380F00000E00000E00000E00000E00000E00000E00000E00000F000
+ 007003807803807807803C07801F0F800FFF8007FF8001F180> 24 25 -2 0 21.793] 67 @dc
+[<FE0FE0FE0FE0FE0FE038038038038038038038038038038038E38038E38039F38039B38039B38039B38039B3803BBB803B1B
+ 803B1B803B1B803B1B803B1B803A0B80FE0FE0FE0FE0FC07E0> 24 25 -1 0 21.793] 77 @dc
+[<7FFFE0FFFFE07FFFE01C00E01C00E01C00E01C00E01C00E01C00001C1C001C1C001FFC001FFC001FFC001C1C001C1C001C00
+ 001C00001C01C01C01C01C01C01C01C07FFFC0FFFFC07FFFC0> 24 25 -1 0 21.793] 69 @dc
+[<7F0F00FF9F007F1F001C17001C37001C37001C37001C77001C77001C67001C67001CE7001CE7001CE7001CC7001CC7001DC7
+ 001DC7001D87001D87001D87001D07007F1FC0FF3FE07E1FC0> 24 25 -1 0 21.793] 78 @dc
+[<7F0000FF80007F00001C00001C00001C00001C00001C00001C00001C00001FF8001FFE001FFF001C0F801C03801C03C01C01
+ C01C01C01C01C01C03C01C03801C0F807FFF00FFFE007FF800> 24 25 -1 0 21.793] 80 @dc
+[<1FFC003FFE007FFF00780F00F00780F00780E00380E00380E00380E00380E00380E00380E00380E00380E00380E00380E003
+ 80E00380E00380E00380F00780780F007FFF003FFE001FFC00> 24 25 -2 0 21.793] 79 @dc
+[<0E0E000F1E000F1E001B1B0019130019B30019B30019B30019B30019B30019B30039B38039F38039F38038E3803803803803
+ 803803803001807001C07001C07001C0FC07E0FE0FE0FC07E0> 24 25 -1 0 21.793] 87 @dc
+[<7F03C0FF87E07F0FF01C0E701C0E701C0E201C0E001C0E001C0E001C0E001C3E001FFC001FF8001FFC001C1E001C0F001C07
+ 001C07001C07001C07001C0F001C1E007FFC00FFF8007FE000> 24 25 -1 0 21.793] 82 @dc
+[<7F1FC0FF1FE07F1FC01C07001C07001C07001FFF000FFE000FFE000E0E000E0E00071C00071C00071C00071C00071C000318
+ 0003B80003B80003B80001B00001B00001F00001F00000E000> 24 25 -1 0 21.793] 65 @dc
+[<FF8000FFC000FF80001C00001C00001C00001C00001C00001C00001C1C001C1C001FFC001FFC001FFC001C1C001C1C001C00
+ 001C00001C00E01C00E01C00E01C00E0FFFFE0FFFFE0FFFFE0> 24 25 -1 0 21.793] 70 @dc
+[ 1500 ] /cmtt12.1500 @newfont
+cmtt12.1500 @sf
+[<03FF8003FF8003FF800038000038000038000038000038000038000038000038000038000038000038000038000038000038
+ 00003800003800003800003800003800003800E0380EE0380EE0380EE0380EFFFFFEFFFFFE7FFFFE> 24 30 -1 0 25.632] 84 @dc
+[<FF83FEFF83FEFF83FE1C00701C00701C00701C00701C00701C00701C00701C00701C00701C00701C00701FFFF01FFFF01FFF
+ F01C00701C00701C00701C00701C00701C00701C00701C00701C00701C0070FF83FEFF83FEFF83FE> 24 30 -1 0 25.632] 72 @dc
+[<FFFF80FFFF80FFFF8001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C0
+ 0001C00001C00001C00001C00001C00001C00001C00001C00001C00001C000FFFF80FFFF80FFFF80> 24 30 -4 0 25.632] 73 @dc
+[<E3FC00FFFE00FFFF80FE0780F003C0F001E0E000E0E000E06000E00000E00001E00001C00003C0000F8001FF000FFE001FF8
+ 003F0000780000F00000E00000E001C0E001C0E001C0F003C07007C07C1FC03FFFC01FFDC007F1C0> 24 30 -3 0 25.632] 83 @dc
+[<00FE0003FF8007FFC00F83E01E00F01C00703C0078780038700038700038F00000E00000E00000E00000E00000E00000E000
+ 00E00000E00000F000007000387000387800383C00781C00781E00F80F83F807FFF803FFB800FE38> 24 30 -2 0 25.632] 67 @dc
+[<7F007F00FF80FF807F007F001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C1C1C001C1C1C001C3E
+ 1C001C361C001C361C001C771C001C771C001C631C001CE39C001CE39C001CC19C001CC19C001DC1DC001DC1DC001D80DC00
+ 1D80DC001D80DC007F007F00FF007F807E003F00> 32 30 0 0 25.632] 77 @dc
+[<0701C00F83E00F83E00D83600D83600D83600DC7600DC7600DC7601CC6701CC6701CEE701CEE701CEE701CEE701CEE701C7C
+ 70387C3838003838003838003838003838003838003838003878003C70001CFE00FEFF01FEFE00FE> 24 30 -1 0 25.632] 87 @dc
+[<FFFFFCFFFFFCFFFFFC1C001C1C001C1C001C1C001C1C001C1C00001C00001C00001C0E001C0E001C0E001FFE001FFE001FFE
+ 001C0E001C0E001C0E001C00001C00001C00001C00381C00381C00381C0038FFFFF8FFFFF8FFFFF8> 24 30 -2 0 25.632] 69 @dc
+[<7FFFFCFFFFFC7FFFFC0E001C0E001C0E001C0E001C0E001C0E00000E00000E00000E00000E00000E00000E00000E00000E00
+ 000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00007FE000FFF0007FE000> 24 30 -1 0 25.632] 76 @dc
+[<003800007C00007C00006C0000EE0000EE0000EE0000C60001C70001C70001C70001C7000383800383800383800383800701
+ C00701C00701C00701C00E00E00E00E00E00E01E00F01C00701C00701C0070FF01FEFF01FEFF01FE> 24 30 -1 0 25.632] 86 @dc
+[<FF8000FF8000FF80001C00001C00001C00001C00001C00001C00001C00001C00001C00001FFE001FFF801FFFC01C03E01C00
+ F01C00701C00781C00381C00381C00381C00381C00781C00701C00F01C03E0FFFFC0FFFF80FFFE00> 24 30 -2 0 25.632] 80 @dc
+[<0FFE003FFF807FFFC07C07C07001C0F001E0F001E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000
+ E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0F001E07001C07C07C07FFFC03FFF800FFE00> 24 30 -3 0 25.632] 79 @dc
+[<FF80F0FF81F0FF81F01C03701C03701C07701C06701C06701C0E701C0E701C0C701C1C701C1C701C18701C38701C38701C30
+ 701C70701C70701C60701CE0701CE0701CC0701CC0701DC0701D80701D8070FF03FEFF03FEFE03FE> 24 30 -1 0 25.632] 78 @dc
+[<FF803CFF807EFF80FF1C00E71C00E71C00E71C00E21C00E01C00E01C00E01C00E01C00E01C01E01C07C01FFF801FFF001FFF
+ 801C07C01C01E01C00F01C00701C00701C00701C00701C00F01C01E01C07C0FFFF80FFFF00FFFC00> 24 30 -1 0 25.632] 82 @dc
+[<7F01FCFF83FE7F01FC1C00700E00E00E00E00E00E00E00E00FFFE007FFC007FFC00701C00701C00383800383800383800383
+ 8001C70001C70001C70001C70000C60000C60000EE0000EE0000EE00006C00007C00007C00003800> 24 30 -1 0 25.632] 65 @dc
+[<7FE000FFE0007FE0000E00000E00000E00000E00000E00000E00000E00000E00000E03800E03800E03800FFF800FFF800FFF
+ 800E03800E03800E03800E00000E00000E00000E001C0E001C0E001C0E001C7FFFFCFFFFFC7FFFFC> 24 30 -1 0 25.632] 70 @dc
+[ 1500 ] /cmr10.1500 @newfont
+cmr10.1500 @sf
+[<FFF80F80070007000700070007000700070007000700070007000700070007000700070007000700070007000700C7003F00
+ 07000300> 16 27 -4 0 20.755] 49 @dc
+1 @bop1
+cmtt8.1500 @sf
+83 42 p (THIS) s
+18 r (IS) s
+17 r (CMTT) s
+18 r (EIGHT) s
+18 r (POINTS) s
+17 r (WRITTEN) s
+18 r (IN) s
+18 r (METAFONT) s
+cmtt10.1500 @sf
+83 91 p (THIS) s
+22 r (IS) s
+22 r (CMTT) s
+21 r (TEN) s
+22 r (POINTS) s
+22 r (WRITTEN) s
+22 r (IN) s
+22 r (METAFONT) s
+cmtt12.1500 @sf
+83 141 p (THIS) s
+26 r (IS) s
+25 r (CMTT) s
+26 r (TWELVE) s
+26 r (POINTS) s
+25 r (WRITTEN) s
+26 r (IN) s
+25 r (METAFONT) s
+cmr10.1500 @sf
+965 2770 p 49 c
+@eop
+@end
diff --git a/fonts/utilities/mf2ps/doc/printsamples/tt7.tex b/fonts/utilities/mf2ps/doc/printsamples/tt7.tex
new file mode 100644
index 0000000000..093783b32b
--- /dev/null
+++ b/fonts/utilities/mf2ps/doc/printsamples/tt7.tex
@@ -0,0 +1,12 @@
+\font\test=cmtt8
+\test
+THIS IS CMTT EIGHT POINTS WRITTEN IN METAFONT
+
+\font\test=cmtt10
+\test
+THIS IS CMTT TEN POINTS WRITTEN IN METAFONT
+
+\font\test=cmtt12
+\test
+THIS IS CMTT TWELVE POINTS WRITTEN IN METAFONT
+\bye
diff --git a/fonts/utilities/mf2ps/mf2ps/.make b/fonts/utilities/mf2ps/mf2ps/.make
new file mode 100644
index 0000000000..8f75a458be
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/.make
@@ -0,0 +1,3 @@
+date
+make
+date
diff --git a/fonts/utilities/mf2ps/mf2ps/Makefile b/fonts/utilities/mf2ps/mf2ps/Makefile
new file mode 100644
index 0000000000..521429e821
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/Makefile
@@ -0,0 +1,24 @@
+MFLIB = ../MFlib/mflib.a
+LIBS = -lsuntool -lsunwindow -lpixrect
+#
+mf2psv : mf2psv.o mf2ps1.o mf2ps2.o mf2ps3.o ${MFLIB}
+# pc -g -w -o mf2psv mf2psv.o mf2ps1.o mf2ps2.o mf2ps3.o ${MFLIB} ${LIBS}
+ pc -w -o mf2psv mf2psv.o mf2ps1.o mf2ps2.o mf2ps3.o ${MFLIB} ${LIBS}
+mf2ps :mf2psv
+ strip mf2psv
+ mv mf2psv mf2ps
+#
+mf2psv.o : mf2psv.p mf2ps1.h
+ pc -g -w -c mf2psv.p
+#
+mf2ps1.o : mf2ps1.p mf2ps1.h mf2ps2.h
+ pc -g -w -c mf2ps1.p
+#
+mf2ps2.o : mf2ps2.p mf2ps1.h mf2ps2.h
+ pc -g -w -c mf2ps2.p
+#
+mf2ps3.o : mf2ps3.p mf2ps1.h mf2ps2.h
+ pc -g -w -c mf2ps3.p
+#
+../MFfonts/bases/myplain.base : ../MFfonts/bases/myplain.mf
+ ../inimf < ini.put
diff --git a/fonts/utilities/mf2ps/mf2ps/README b/fonts/utilities/mf2ps/mf2ps/README
new file mode 100644
index 0000000000..4d702ebd9a
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/README
@@ -0,0 +1,8 @@
+This directory contains almost all the modules to make mf2ps. If you have
+METAFONT84, you will see that these modules are modifications of those of
+mf84. This directory should be put parallel to that of mf84 so that the
+include of the ../MFlib/mflib.a works. Also it works only on the sun
+because of the use of suntool.
+
+The version of mf2ps here is after the modifications that yield more compact
+output. The directory uncompressing contains the old versions of these modules.
diff --git a/fonts/utilities/mf2ps/mf2ps/mf2ps1.h b/fonts/utilities/mf2ps/mf2ps/mf2ps1.h
new file mode 100644
index 0000000000..ee416b3464
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/mf2ps1.h
@@ -0,0 +1,388 @@
+label
+ 1, 9998, 9999;
+{:6} {11:}
+const
+ memmax = 30000;
+ maxinternal = 100;
+ bufsize = 500;
+ errorline = 79;
+ halferrorline = 50;
+ maxprintline = 79;
+ screenwidth = 1024;
+ screendepth = 1024;
+ stacksize = 30;
+ maxstrings = 2000;
+ stringvacancies = 8000;
+ poolsize = 32000;
+ movesize = 5000;
+ maxwiggle = 300;
+ gfbufsize = 800;
+ filenamesize = 256;
+ poolname = 'mf.pool';
+ pathsize = 300;
+ bistacksize = 785;
+ headersize = 100;
+ ligtablesize = 300;
+ maxfontdimen = 50; {:11} {18:}
+type
+ ASCIIcode = 0..127; {:18}
+{24:}
+ eightbits = 0..255;
+ alphafile = text;
+ {------------------}
+ postscript = text;
+ {------------------}
+ UNIXfilename = packed array [1..filenamesize] of char;
+ bytefile =
+ record
+ stdioptr: ^ integer;
+ locptr: ^ integer;
+ filename: UNIXfilename
+ end; {:24} {37:}
+ poolpointer = 0..poolsize;
+ strnumber = 0..maxstrings; {:37}
+{101:}
+ scaled = integer;
+ smallnumber = 0..63; {:101} {105:}
+ fraction = integer;
+{:105}
+ {106:}
+ angle = integer; {:106} {156:}
+ quarterword = -128..127;
+ halfword = -32768..32767;
+ twochoices = 1..2;
+ threechoices = 1..3;
+ twohalves = packed
+ record
+ rh: halfword;
+ case twochoices of
+ 1: (
+ lh: halfword
+ );
+ 2: (
+ b0: quarterword;
+ b1: quarterword
+ )
+ end;
+ fourquarters = packed
+ record
+ b0: quarterword;
+ b1: quarterword;
+ b2: quarterword;
+ b3: quarterword
+ end;
+ memoryword =
+ record
+ case threechoices of
+ 1: (
+ int: integer
+ );
+ 2: (
+ hh: twohalves
+ );
+ 3: (
+ qqqq: fourquarters
+ )
+ end;
+ wordfile = file of memoryword; {:156} {186:}
+ commandcode = 1..82; {:186} {565:}
+ screenrow = 0..screendepth;
+ screencol = 0..screenwidth;
+ transspec = array [screencol] of screencol;
+ pixelcolor = 0..1; {:565} {571:}
+ windownumber = 0..15; {:571} {627:}
+ instaterecord =
+ record
+ indexfield: quarterword;
+ startfield, locfield, limitfield, namefield: halfword
+ end; {:627} {1151:}
+ gfindex = 0..gfbufsize;
+ gfbuftype = array [gfindex] of eightbits; {:1151} {13:}
+var
+ bad: integer; {:13} {20:}
+ xord: array [char] of ASCIIcode;
+ xchr: array [ASCIIcode] of char; {:20} {25:}
+ nameoffile, realnameoffile: UNIXfilename;
+ namelength: 0..filenamesize; {:25}
+{29:}
+ buffer: array [0..bufsize] of ASCIIcode;
+ first: 0..bufsize;
+ last: 0..bufsize;
+ maxbufstack: 0..bufsize; {:29} {38:}
+ strpool: packed array [poolpointer] of ASCIIcode;
+ strstart: array [strnumber] of poolpointer;
+ poolptr: poolpointer;
+ strptr: strnumber;
+ initpoolptr: poolpointer;
+ initstrptr: strnumber;
+ maxpoolptr: poolpointer;
+ maxstrptr: strnumber; {:38} {42:}
+ strref: array [strnumber] of 0..127; {:42} {50:}
+ poolfile: alphafile; {:50} {54:}
+ logfile: alphafile;
+ {-------------------------------------------------------------}
+ psfile :postscript; { the PostScript code }
+ g :postscript; { holds the character information after re-arrange}
+ lastx0 , lasty0 :real ; { last point in sunpath }
+ lastx3 , lasty3 :real ; { make optimization on commands }
+ prevtox3 , prevtoy3 :real;
+ lastyearval , { mark entering to macros }
+ lastmonthval :integer; { STROKE , FILL , and ERASE }
+ { in MY plain.mf }
+ my_xx , my_yy :integer; { hold the values of xx & yy }
+ LineSource : integer; { Identifier for sendline source }
+ CurveSource : integer; { Identifier for makemoves source }
+ foundnew : boolean; { true while xchr[s]='[' until ']' }
+ ascval : integer; { holds the ascii of curr. letter }
+ ascii_on : boolean; { reading ascval is 'on' }
+ {-------------------------------------------------------------}
+ selector: 0..5;
+ dig: array [0..22] of 0..15;
+ tally: integer;
+ termoffset: 0..maxprintline;
+ fileoffset: 0..maxprintline;
+ trickbuf: array [0..errorline] of ASCIIcode;
+ trickcount: integer;
+ firstcount: integer; {:54} {68:}
+ interaction: 0..3; {:68} {71:}
+ deletionsallowed: boolean;
+ history: 0..3;
+ errorcount: -1..100; {:71} {74:}
+ helpline: array [0..5] of strnumber;
+ helpptr: 0..6;
+ useerrhelp: boolean;
+ errhelp: strnumber; {:74} {91:}
+ interrupt: integer;
+ OKtointerrupt: boolean;
+{:91}
+ {97:}
+ aritherror: boolean; {:97} {129:}
+ twotothe: array [0..30] of integer;
+ speclog: array [1..28] of integer; {:129} {137:}
+ specatan: array [1..26] of angle; {:137} {144:}
+ nsin, ncos: fraction; {:144}
+{148:}
+ randoms: array [0..54] of fraction;
+ jrandom: 0..54; {:148} {158:}
+ tempptr: halfword; {:158} {159:}
+ mem: array [-30000..memmax] of memoryword;
+ lomemmax: halfword;
+ himemmin: halfword; {:159} {160:}
+ varused, dynused: integer;
+{:160}
+ {161:}
+ avail: halfword;
+ memend: halfword; {:161} {166:}
+ rover: halfword;
+{:166}
+ {178:}
+ freearr: packed array [-30000..memmax] of boolean;
+ wasfree: packed array [-30000..memmax] of boolean;
+ wasmemend, waslomax, washimin: halfword;
+ panicking: boolean; {:178} {190:}
+ internal: array [1..maxinternal] of scaled;
+ intname: array [1..maxinternal] of strnumber;
+ intptr: 40..maxinternal; {:190}
+{196:}
+ oldsetting: 0..5; {:196} {198:}
+ charclass: array [ASCIIcode] of 0..20;
+{:198}
+ {200:}
+ hashused: halfword;
+ stcount: integer; {:200} {201:}
+ hash: array [1..2241] of twohalves;
+ eqtb: array [1..2241] of twohalves; {:201}
+{225:}
+ gpointer: halfword; {:225} {230:}
+ bignodesize: array [13..14] of smallnumber; {:230} {250:}
+ saveptr: halfword;
+{:250}
+ {267:}
+ pathtail: halfword; {:267} {279:}
+ deltax, deltay, delta: array [0..pathsize] of scaled;
+ psi: array [1..pathsize] of angle; {:279} {283:}
+ theta: array [0..pathsize] of angle;
+ uu: array [0..pathsize] of fraction;
+ vv: array [0..pathsize] of angle;
+ ww: array [0..pathsize] of fraction; {:283}
+{298:}
+ st, ct, sf, cf: fraction; {:298} {308:}
+ move: array [0..movesize] of integer;
+ moveptr: 0..movesize; {:308} {309:}
+ bisectstack: array [0..bistacksize] of integer;
+ bisectptr: 0..bistacksize;
+{:309}
+ {327:}
+ curedges: halfword;
+ curwt: integer; {:327} {371:}
+ tracex: integer;
+ tracey: integer;
+ traceyy: integer; {:371} {379:}
+ octant: 1..8; {:379} {389:}
+ curx, cury: scaled; {:389} {395:}
+ octantdir: array [1..8] of strnumber; {:395}
+{403:}
+ curspec: halfword;
+ turningnumber: integer;
+ curpen: halfword;
+ curpathtype: 0..2;
+ maxallowed: scaled; {:403} {427:}
+ before, after: array [0..maxwiggle] of scaled;
+ nodetoround: array [0..maxwiggle] of halfword;
+ curroundingptr: 0..maxwiggle;
+ maxroundingptr: 0..maxwiggle; {:427} {430:}
+ curgran: scaled; {:430} {448:}
+ octantnumber: array [1..8] of 1..8;
+ octantcode: array [1..8] of 1..8; {:448}
+{455:}
+ revturns: boolean; {:455} {461:}
+ ycorr, xycorr, zcorr: array [1..8] of 0..1;
+ xcorr: array [1..8] of -1..1; {:461}
+{464:}
+ m0, n0, m1, n1: integer;
+ d0, d1: 0..1; {:464} {507:}
+ envmove: array [0..movesize] of integer; {:507} {552:}
+ tolstep: 0..6; {:552}
+{555:}
+ curt, curtt: integer;
+ timetogo: integer;
+ maxt: integer; {:555} {557:}
+ delx, dely: integer;
+ tol: integer;
+ uv, xy: 0..bistacksize;
+ threel: integer;
+ apprt, apprtt: integer; {:557} {566:}
+{screenpixel:array[screenrow,screencol]of pixelcolor;}
+ {:566}
+ {569:}
+ screenstarted: boolean;
+ screenOK: boolean; {:569} {572:}
+ windowopen: array [windownumber] of boolean;
+ leftcol: array [windownumber] of screencol;
+ rightcol: array [windownumber] of screencol;
+ toprow: array [windownumber] of screenrow;
+ botrow: array [windownumber] of screenrow;
+ mwindow: array [windownumber] of integer;
+ nwindow: array [windownumber] of integer;
+ windowtime: array [windownumber] of integer; {:572} {579:}
+ rowtransition: transspec; {:579} {585:}
+ serialno: integer; {:585} {592:}
+ fixneeded: boolean;
+ watchcoefs: boolean;
+ depfinal: halfword; {:592} {624:}
+ curcmd: eightbits;
+ curmod: integer;
+ cursym: halfword; {:624} {628:}
+ inputstack: array [0..stacksize] of instaterecord;
+ inputptr: 0..stacksize;
+ maxinstack: 0..stacksize;
+ curinput: instaterecord; {:628} {631:}
+ inopen: 0..6;
+ inputfile: array [1..6] of alphafile;
+ line: integer;
+ linestack: array [1..6] of integer; {:631} {633:}
+ paramstack: array [0..150] of halfword;
+ paramptr: 0..150;
+ maxparamstack: integer; {:633} {634:}
+ fileptr: 0..stacksize; {:634} {659:}
+ scannerstatus: 0..6;
+ warninginfo: integer; {:659} {680:}
+ forceeof: boolean;
+{:680}
+ {699:}
+ bgloc, egloc: 1..2241; {:699} {738:}
+ condptr: halfword;
+ iflimit: 0..4;
+ curif: smallnumber;
+ ifline: integer; {:738} {752:}
+ loopptr: halfword; {:752} {767:}
+ curname: strnumber;
+ curarea: strnumber;
+ curext: strnumber; {:767} {768:}
+ areadelimiter: poolpointer;
+ extdelimiter: poolpointer; {:768} {775:}
+ MFbasedefault: packed array [1..10] of char; {:775} {782:}
+ jobname: strnumber;
+ logname: strnumber; {:782} {785:}
+ gfext: strnumber; {:785} {791:}
+ gffile: bytefile;
+ outputfilename: strnumber; {:791} {796:}
+ curtype: smallnumber;
+ curexp: integer; {:796} {813:}
+ maxc: array [17..18] of integer;
+ maxptr: array [17..18] of halfword;
+ maxlink: array [17..18] of halfword; {:813} {821:}
+ varflag: 0..82; {:821} {954:}
+ txx, txy, tyx, tyy, tx, ty: scaled; {:954} {1077:}
+ startsym: halfword; {:1077}
+{1084:}
+ longhelpseen: boolean; {:1084} {1087:}
+ tfmfile: bytefile;
+ metricfilename: strnumber; {:1087} {1096:}
+ bc, ec: eightbits;
+ tfmwidth: array [eightbits] of scaled;
+ tfmheight: array [eightbits] of scaled;
+ tfmdepth: array [eightbits] of scaled;
+ tfmitalcorr: array [eightbits] of scaled;
+ charexists: array [eightbits] of boolean;
+ chartag: array [eightbits] of 0..3;
+ charremainder: array [eightbits] of eightbits;
+ headerbyte: array [1..headersize] of -1..255;
+ ligkern: array [0..ligtablesize] of fourquarters;
+ nl: 0..ligtablesize;
+ kern: array [eightbits] of scaled;
+ nk: 0..256;
+ exten: array [eightbits] of fourquarters;
+ ne: 0..256;
+ param: array [1..maxfontdimen] of scaled;
+ np: 0..maxfontdimen;
+ nw, nh, nd, ni: 0..256; {:1096} {1119:}
+ perturbation: scaled; {:1119} {1125:}
+ dimenhead: array [1..4] of halfword; {:1125} {1130:}
+ maxtfmdimen: scaled;
+ tfmchanged: integer; {:1130} {1149:}
+ gfminm, gfmaxm, gfminn, gfmaxn: integer;
+ gfprevptr: integer;
+ totalchars: integer;
+ charptr: array [eightbits] of integer;
+ gfdx, gfdy: array [eightbits] of integer; {:1149} {1152:}
+ gfbuf: gfbuftype;
+ halfbuf: gfindex;
+ gflimit: gfindex;
+ gfptr: gfindex;
+ gfoffset: integer; {:1152}
+{1162:}
+ bocc, bocp: integer; {:1162} {1183:}
+ baseident: strnumber; {:1183}
+{1188:}
+ basefile: wordfile; {:1188} {1203:}
+ readyalready: integer; {:1203}
+{1214:}
+ editnamestart: poolpointer;
+ editnamelength, editline: integer; {:1214}
+
+procedure unskew(x, y: scaled; octant: smallnumber);external;
+
+procedure sendcurve(x0,x1,x2,x3,y0,y1,y2,y3,octant:integer);external;
+
+procedure sendline(x0,y0,x1,y1,octant,LineSource:integer);external;
+
+procedure confusion(s: strnumber);external;
+
+function abvscd(a, b, c, d: integer): integer;external;
+
+procedure makemoves(xx0, xx1, xx2, xx3, yy0, yy1, yy2, yy3: scaled; xicorr, etacorr: smallnumber;CurveSource:integer;oc:smallnumber);external;
+
+procedure print_start(var f:postscript);external;
+
+procedure print_end(var f:postscript);external;
+
+procedure init_ps(var f:postscript);external;
+
+procedure tini_ps(var f:postscript);external;
+
+procedure auxslowprint(s: integer);external;
+
+procedure auxprintnl(s: strnumber);external;
+
+procedure sendascii(asc: integer);external;
diff --git a/fonts/utilities/mf2ps/mf2ps/mf2ps1.p b/fonts/utilities/mf2ps/mf2ps/mf2ps1.p
new file mode 100644
index 0000000000..f5e4ac033a
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/mf2ps1.p
@@ -0,0 +1,95 @@
+#include "mf2ps1.h" {contain the declarations}
+#include "mf2ps2.h" {contain external for send_p_s}
+
+procedure unskew;
+ begin
+ case octant of
+ 1:
+ begin
+ curx := x + y;
+ cury := y
+ end;
+ 5:
+ begin
+ curx := y;
+ cury := x + y
+ end;
+ 6:
+ begin
+ curx := -y;
+ cury := x + y
+ end;
+ 2:
+ begin
+ curx := (-x) - y;
+ cury := y
+ end;
+ 4:
+ begin
+ curx := (-x) - y;
+ cury := -y
+ end;
+ 8:
+ begin
+ curx := -y;
+ cury := (-x) - y
+ end;
+ 7:
+ begin
+ curx := y;
+ cury := (-x) - y
+ end;
+ 3:
+ begin
+ curx := x + y;
+ cury := -y
+ end
+ end
+end; { unskew }
+{:388}
+ {473:}
+
+procedure sendcurve;
+{ unskews the values and sends a curve to be proccessed by
+ send_p_s procedure. }
+var tmpx,tmpy:scaled;
+ x0s,y0s,x1s,y1s,x2s,y2s,x3s,y3s:integer;
+begin
+ tmpx := curx;
+ tmpy := cury;
+ unskew(x0,y0,octant);
+ x0s := curx;
+ y0s := cury;
+ unskew(x1,y1,octant);
+ x1s := curx;
+ y1s := cury;
+ unskew(x2,y2,octant);
+ x2s := curx;
+ y2s := cury;
+ unskew(x3,y3,octant);
+ x3s := curx;
+ y3s := cury;
+ curx := tmpx;
+ cury := tmpy;
+ send_p_s(x0s,y0s,x1s,y1s,x2s,y2s,x3s,y3s);
+end;
+
+procedure sendline;
+{ unskews the values and sends a line to be proccessed by
+ send_p_s procedure. }
+var tmpx,tmpy:scaled;
+ x0s,y0s,x1s,y1s:integer;
+begin
+ tmpx := curx;
+ tmpy := cury;
+ unskew(x0,y0,octant);
+ x0s := curx;
+ y0s := cury;
+ unskew(x1,y1,octant);
+ x1s := curx;
+ y1s := cury;
+ if (LineSource = 510)
+ or (LineSource = 515)
+ or (LineSource = 521)
+ then send_p_s(x0s,y0s,x1s,y1s,0,0,0,0);
+end;
diff --git a/fonts/utilities/mf2ps/mf2ps/mf2ps2.h b/fonts/utilities/mf2ps/mf2ps/mf2ps2.h
new file mode 100644
index 0000000000..728d18f93c
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/mf2ps2.h
@@ -0,0 +1,25 @@
+const maxletters = 150;
+type currentletter = array [0..64] of char;
+ C = (x,y);
+ XandYval = array [x..y] of real;
+var new , fillexist : boolean;
+ lastfill : char; { marks last kind of filling stroke, fill or erase }
+ ans : char;
+ dict : 0..1; { 1 ==> creating dictionary }
+ direction : char; { for optimization of connected ( horizontals, verticals ) lines. }
+ lastwasline : boolean; { true if last line in the beffer}
+ erasein : boolean; { marks existing of path to be erased }
+ fout : packed array [1..15] of char; { output file name }
+ curletter : currentletter;
+ all_letters : array [1..maxletters] of currentletter;
+ all_ascii : array [1..maxletters] of integer;
+ all_metrics : array [1..maxletters] of integer; { holds the width of each letter }
+ no_of_letter : integer;
+ name_length : integer;
+ minbox,maxbox : XandYval;
+ lmin_x,lmax_x : real; { local min and max for each letter }
+ doscale : XandYval;
+ dotranslate : XandYval;
+ needtransform : boolean; { true if cur_box <> 0,1000 }
+
+procedure send_p_s(x0,y0,x1,y1,x2,y2,x3,y3:integer);external;
diff --git a/fonts/utilities/mf2ps/mf2ps/mf2ps2.p b/fonts/utilities/mf2ps/mf2ps/mf2ps2.p
new file mode 100644
index 0000000000..3b219c5a26
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/mf2ps2.p
@@ -0,0 +1,143 @@
+#include "mf2ps1.h"
+#include "mf2ps2.h"
+
+
+function ok (x,y : real):boolean;
+{ gives back true if direction is kept by x,y values }
+begin
+ if direction = 'h' then
+ if x = lastx3 then ok := true
+ else ok := false
+ else if direction = 'v' then
+ if y = lasty3 then ok := true
+ else ok := false
+ else ok := false;
+end;
+
+procedure restore (x,y : real);
+{ keeps direction if deals with lines, and last point values
+ for optimization on vertical and horizontal lines. }
+begin
+ if x = lastx3 then direction := 'h'
+ else if y = lasty3 then direction := 'v'
+ else direction := 'm';
+ lastx3 := x;
+ lasty3 := y;
+ lastwasline := true;
+end;
+
+procedure recall;
+{ taking values from the buffer. }
+const WORTH = 100;
+begin
+ if ((lastx3-prevtox3 < WORTH) or (lasty3-prevtoy3 < WORTH)) and
+ (prevtox3 <> -9999) and (prevtoy3 <> -9999) then
+ writeln(psfile, ' ', lastx3-prevtox3:3:0, ' ', lasty3-prevtoy3:3:0, ' l@')
+ else
+ writeln(psfile,' ', lastx3:3:0,' ',lasty3:3:0,' L@');
+ lastwasline := false;
+ prevtox3 := lastx3;
+ prevtoy3 := lasty3;
+end;
+
+
+function us(n: scaled;c:char): real;
+{ gets a number which every unit of it is 2 in the 16 power
+ and changes it to normal units.
+ in addition scales and transforms the number in order to
+ use it in PostScript dictionary.
+ it is also determining the bounding box. }
+const s = 2; { Scale & Translate before sending to PostScript file }
+ t = 180;
+var tmp : real;
+begin
+ tmp := trunc(n/65536)*s+t;
+ us := tmp;
+ if (c = 'x') and (tmp <> t) then
+ begin
+ if tmp>maxbox[x] then maxbox[x] := tmp
+ else if tmp<minbox[x] then minbox[x] := tmp;
+ if tmp>lmax_x then lmax_x := tmp
+ else if tmp<lmin_x then lmin_x := tmp;
+ end
+ else if tmp>maxbox[y] then maxbox[y] := tmp
+ else if tmp<minbox[y] then minbox[y] := tmp;
+end; { unscaled }
+
+
+procedure send_p_s;
+{ creates the PostScript file, by sending lines and curves,
+ using the optimization ability on lines. }
+const WORTH=100;
+
+var x0_,x1_,x2_,x3_,y0_,y1_,y2_,y3_:real;
+begin
+ x0_ := us(x0,'x');
+ x1_ := us(x1,'x');
+ x2_ := us(x2,'x');
+ x3_ := us(x3,'x');
+ y0_ := us(y0,'y');
+ y1_ := us(y1,'y');
+ y2_ := us(y2,'y');
+ y3_ := us(y3,'y');
+
+ if (x0_<>lastx0) or (y0_<>lasty0) then
+ begin
+ if new then
+ begin
+ writeln(psfile,' ', x0_:3:0,' ',y0_:3:0,' M@');
+ new := false;
+ lastwasline := false;
+ prevtox3 := x0_;
+ prevtoy3 := y0_;
+ lastx3 := x0_; lasty3 := y0_;
+ end
+ else begin
+ if (lastwasline) and (not ok(x0_,y0_)) then
+ begin
+ recall;
+ end;
+ restore(x0_,y0_);
+ end;
+ end;
+ if (x3=0) and (x2=0) and (y3=0) and (y2=0) then { line }
+ begin
+ if (x0_<>x1_) or (y0_<>y1_) then
+ begin
+ if (lastwasline) and (not ok(x1_,y1_)) then
+ begin
+ recall;
+ end;
+ restore(x1_,y1_);
+ end;
+ lastx0 := x1_; lasty0 := y1_;
+ end
+ else begin
+ if ((x0_=x1_) and (x1_=x2_) and (x2_=x3_)) or
+ ((y0_=y1_) and (y1_=y2_) and (y2_=y3_)) then
+ begin
+ if (x0_<>x3_) or (y0_<>y3_) then
+ begin
+ if (lastwasline) and (not ok(x3_,y3_)) then
+ begin
+ recall;
+ end;
+ restore(x3_,y3_);
+ end;
+ end
+ else begin
+ if lastwasline then recall;
+ if ((x1_-lastx3<WORTH) or (x2_-lastx3<WORTH) or (x3_-lastx3<WORTH) or (y1_-lasty3<WORTH) or (y2_-lasty3<WORTH) or (y3_-lasty3<WORTH)) and
+ (prevtox3 <> -9999) and (prevtoy3 <> -9999) then
+ writeln(psfile,' ', x1_-lastx3:3:0,' ',y1_-lasty3:3:0,' ',x2_-lastx3:3:0,' ',y2_-lasty3:3:0,' ',x3_-lastx3:3:0,' ',y3_-lasty3:3:0,' c@')
+ else
+ writeln(psfile,' ', x1_:3:0,' ',y1_:3:0,' ',x2_:3:0,' ',y2_:3:0,' ',x3_:3:0,' ',y3_:3:0,' C@');
+ prevtox3 := x3_;
+ prevtoy3 := y3_;
+ lastx3 := x3_; lasty3 := y3_;
+ end;
+ lastx0 := x3_; lasty0 := y3_;
+ end; { else curve }
+end; { send_p_s }
+
+
diff --git a/fonts/utilities/mf2ps/mf2ps/mf2ps3.p b/fonts/utilities/mf2ps/mf2ps/mf2ps3.p
new file mode 100644
index 0000000000..f082b45f4f
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/mf2ps3.p
@@ -0,0 +1,657 @@
+#include "mf2ps1.h"
+#include "mf2ps2.h"
+
+ procedure makemoves;
+ label
+ 22, 30, 10;
+ var
+ x1, x2, x3, m, r, y1, y2, y3, n, s, l: integer;
+ q, t, u, x2a, x3a, y2a, y3a: integer;
+ begin
+ {---------------------------------------------------------}
+ if (CurveSource=465) { from fillspec - no offset }
+ or (CurveSource=512) { from fillenvelope - with offset }
+ or (CurveSource=518) { -------- " -------- }
+ then
+ sendcurve(xx0,xx1,xx2,xx3,yy0,yy1,yy2,yy3,oc);
+ {---------------------------------------------------------}
+ if (xx3 < xx0) or (yy3 < yy0) then
+ confusion(109);
+ l := 16;
+ bisectptr := 0;
+ x1 := xx1 - xx0;
+ x2 := xx2 - xx1;
+ x3 := xx3 - xx2;
+ if xx0 >= xicorr then
+ r := (xx0 - xicorr) mod 65536
+ else
+ r := 65535 - ((((-xx0) + xicorr) - 1) mod 65536);
+ m := ((xx3 - xx0) + r) div 65536;
+ y1 := yy1 - yy0;
+ y2 := yy2 - yy1;
+ y3 := yy3 - yy2;
+ if yy0 >= etacorr then
+ s := (yy0 - etacorr) mod 65536
+ else
+ s := 65535 - ((((-yy0) + etacorr) - 1) mod 65536);
+ n := ((yy3 - yy0) + s) div 65536;
+ if ((xx3 - xx0) >= 268435456) or ((yy3 - yy0) >= 268435456) then begin {313:}
+ x1 := (x1 + xicorr) div 2;
+ x2 := (x2 + xicorr) div 2;
+ x3 := (x3 + xicorr) div 2;
+ r := (r + xicorr) div 2;
+ y1 := (y1 + etacorr) div 2;
+ y2 := (y2 + etacorr) div 2;
+ y3 := (y3 + etacorr) div 2;
+ s := (s + etacorr) div 2;
+ l := 15
+ end {:313};
+ while true do begin
+ 22: {314:}
+ if m = 0 then {315:}
+ while n > 0 do begin
+ moveptr := moveptr + 1;
+ move[moveptr] := 1;
+ n := n - 1
+ end {:315}
+ else if n = 0 then {316:}
+ move[moveptr] := move[moveptr] + m {:316}
+ else if (m + n) = 2 then begin {317:}
+ r := twotothe[l] - r;
+ s := twotothe[l] - s;
+ while l < 30 do begin
+ x3a := x3;
+ x2a := ((x2 + x3) + xicorr) div 2;
+ x2 := ((x1 + x2) + xicorr) div 2;
+ x3 := ((x2 + x2a) + xicorr) div 2;
+ t := (x1 + x2) + x3;
+ r := (r + r) - xicorr;
+ y3a := y3;
+ y2a := ((y2 + y3) + etacorr) div 2;
+ y2 := ((y1 + y2) + etacorr) div 2;
+ y3 := ((y2 + y2a) + etacorr) div 2;
+ u := (y1 + y2) + y3;
+ s := (s + s) - etacorr;
+ if t < r then
+ if u < s then begin {318:}
+ x1 := x3;
+ x2 := x2a;
+ x3 := x3a;
+ r := r - t;
+ y1 := y3;
+ y2 := y2a;
+ y3 := y3a;
+ s := s - u
+ end else begin {:318} {320:}
+ begin
+ moveptr := moveptr + 1;
+ move[moveptr] := 2
+ end {:320};
+ goto 30
+ end
+ else if u < s then begin {319:}
+ begin
+ move[moveptr] := move[moveptr] + 1;
+ moveptr := moveptr + 1;
+ move[moveptr] := 1
+ end {:319};
+ goto 30
+ end;
+ l := l + 1
+ end;
+ r := r - xicorr;
+ s := s - etacorr;
+ if (abvscd((x1 + x2) + x3, s, (y1 + y2) + y3, r) - xicorr) >= 0 then begin {319:}
+ move[moveptr] := move[moveptr] + 1;
+ moveptr := moveptr + 1;
+ move[moveptr] := 1
+ end else begin {:319} {320:}
+ moveptr := moveptr + 1;
+ move[moveptr] := 2
+ end {:320};
+ 30: {:317}
+ null
+ end else begin
+ l := l + 1;
+ bisectstack[bisectptr + 10] := l;
+ bisectstack[bisectptr + 2] := x3;
+ bisectstack[bisectptr + 1] := ((x2 + x3) + xicorr) div 2;
+ x2 := ((x1 + x2) + xicorr) div 2;
+ x3 := ((x2 + bisectstack[bisectptr + 1]) + xicorr) div 2;
+ bisectstack[bisectptr] := x3;
+ r := (r + r) + xicorr;
+ t := ((x1 + x2) + x3) + r;
+ q := t div twotothe[l];
+ bisectstack[bisectptr + 3] := t mod twotothe[l];
+ bisectstack[bisectptr + 4] := m - q;
+ m := q;
+ bisectstack[bisectptr + 7] := y3;
+ bisectstack[bisectptr + 6] := ((y2 + y3) + etacorr) div 2;
+ y2 := ((y1 + y2) + etacorr) div 2;
+ y3 := ((y2 + bisectstack[bisectptr + 6]) + etacorr) div 2;
+ bisectstack[bisectptr + 5] := y3;
+ s := (s + s) + etacorr;
+ u := ((y1 + y2) + y3) + s;
+ q := u div twotothe[l];
+ bisectstack[bisectptr + 8] := u mod twotothe[l];
+ bisectstack[bisectptr + 9] := n - q;
+ n := q;
+ bisectptr := bisectptr + 11;
+ goto 22
+ end {:314};
+ if bisectptr = 0 then
+ goto 10; {312:}
+ bisectptr := bisectptr - 11;
+ x1 := bisectstack[bisectptr];
+ x2 := bisectstack[bisectptr + 1];
+ x3 := bisectstack[bisectptr + 2];
+ r := bisectstack[bisectptr + 3];
+ m := bisectstack[bisectptr + 4];
+ y1 := bisectstack[bisectptr + 5];
+ y2 := bisectstack[bisectptr + 6];
+ y3 := bisectstack[bisectptr + 7];
+ s := bisectstack[bisectptr + 8];
+ n := bisectstack[bisectptr + 9];
+ l := bisectstack[bisectptr + 10] {:312}
+ end;
+ 10:
+ null
+ end; {:311} {321:}
+
+
+ procedure dump(var f,g:text;ignore:boolean;addy:integer);
+ { dumps file named f to file named g. if ignore=true
+ then @ sign won't be copied to g.
+ addy=1, means this is "erase" path lower than 300
+ so 0.8 is subtracted from all y-s. if addy=2 it is
+ higher than 300, and 0.8 is added. }
+ var c : char;
+ even_n : boolean;
+ begin
+ reset(f);
+ while not eof(f) do
+ begin
+ even_n := true;
+ read(f,c);
+ case c of
+ ' ' : repeat
+ while c = ' ' do
+ begin
+ write(g,c);
+ read(f,c);
+ end;
+ even_n := not even_n;
+ while (c<>' ') and (c<>'@') do
+ begin
+ write(g,c);
+ read(f,c);
+ end;
+ if even_n then
+ if addy = 2 then write(g,' 0.8 add')
+ else if addy = 1 then write(g,' 0.8 sub');
+ until c = '@';
+ otherwise while c<>'@' do
+ begin
+ write(g,c);
+ read(f,c);
+ end;
+ end; (* case *)
+ readln(f);
+ if ignore then writeln(g)
+ else writeln(g,'@');
+ end;
+ end;
+
+ function checkerase(var efile:text) : integer;
+ { this function checks files that contains "erase" paths.
+ if the path is higher than 300 its value is 2 else 1.
+ this value goes to 'dump' procedure, to determine if
+ 0.8 should be added or substracted. }
+ const limit = 300;
+ var no : real;
+ c : char;
+ begin
+ reset(efile);
+ checkerase := 1;
+ while not eof(efile) do
+ begin
+ read(efile,c);
+ case c of
+ ' ' : begin
+ read(efile,no);
+ read(efile,no);
+ if no > limit then checkerase := 2;
+ end;
+ otherwise ;
+ end;
+ readln(efile);
+ end;
+ end;
+
+
+ procedure doarrange(var f,g:text);
+ { gets file named f whose "fill" and "stroke" paths are mixed
+ together with "erase" paths, and gives back file named g
+ which has "erase" paths on top in order to determine the
+ clip path, and afterward the rest paths. }
+ var c : char;
+ tmp,fills : text;
+ erase_top : integer;
+
+ begin
+ if not erasein then begin
+ writeln(g,'newpath');
+ dump(f,g,true,0);
+ end
+ else begin
+ rewrite(fills);
+ writeln(g,'gsave');
+ writeln(g,'initclip');
+ writeln(g,'newpath');
+ writeln(g,'0 0 M');
+ writeln(g,'0 1000 L');
+ writeln(g,'1000 1000 L');
+ writeln(g,'1000 0 L');
+ writeln(g,'0 0 L');
+ rewrite(tmp);
+ reset(f);
+ while not eof(f) do
+ begin
+ read(f,c);
+ while (c<>'*') and (c<>'f') and (c<>'e') do
+ begin
+ while c<>'@' do
+ begin
+ write(tmp,c);
+ read(f,c);
+ end;
+ readln(f);
+ writeln(tmp,'@');
+ read(f,c);
+ end;
+ case c of
+ '*' : begin
+ erase_top := checkerase(tmp);
+ dump(tmp,g,true,erase_top);
+ writeln(g,'%erase');
+ end;
+ 'f' : begin
+ dump(tmp,fills,false,0);
+ writeln(fills,'fill@');
+ end;
+ 'e' : begin
+ dump(tmp,fills,false,0);
+ writeln(fills,'eofill@');
+ end;
+ end;
+ rewrite(tmp);
+ readln(f);
+ end;
+ writeln(g,'eoclip');
+ writeln(g,'newpath');
+ dump(fills,g,true,0);
+ writeln(g,'grestore');
+ end;
+ end;
+
+
+
+ procedure print_start;
+ { print_start is called when a new cyclic path is identified.
+ it checks if drawing status was kept, else it changes it
+ respectively. the values are changed when getting into
+ another drawing macro.
+ it is also resets values of lastx0 lasty0 for not being
+ horizonable, because we need a 'moveto' move in the
+ PostScript file in the beginning of the new path. }
+ begin
+ if (internal[14]<>lastyearval) or
+ (internal[15]<>lastmonthval) then
+ begin
+ if lastyearval<>internal[14] then
+ begin
+ if internal[14] = -65536 then
+ begin
+ writeln(f,'eofill@');
+ lastfill := 's';
+ end
+ else begin
+ writeln(f,'*erase@');
+ lastfill := 'e';
+ erasein := true;
+ end;
+ internal[14] := lastyearval ;
+ end
+ else begin
+ internal[15] := lastmonthval ;
+ if lastfill <> 'i' then writeln(f,'fill@');
+ lastfill := 'f';
+ end;
+ end;
+
+ writeln(f,'%new path@');
+ new := true;
+ lastx0 := -99999999; lasty0 := -99999999; { unhorizonable values }
+ end;
+
+ procedure print_end;
+ { print_end is called when end of cyclic path is identified.
+ it takes out the buffer values which were kept there for
+ optimization purposes.
+ In addition it writes 'closepath' in order to close
+ the current cyclic path. }
+ begin
+ if lastwasline then
+ writeln(f,lastx3-prevtox3:3:0,' ',lasty3-prevtoy3:3:0,' l@');
+ if not new then
+ writeln(f,'closepath@');
+ writeln(f,'%end path@');
+ end;
+
+ procedure init_ps;
+ { this procedure is called, right after entering the main loop
+ in METAFONT, and this is the place to give initial values
+ to variables, to open new files and ... to ask questions }
+ var i:integer;
+ begin
+ rewrite(f);
+ no_of_letter := 0;
+ ascii_on := false;
+ lastfill := 'i'; { i=init , no last fill }
+ erasein := false;
+ foundnew := false; { for new letter defs }
+ minbox[x] := 9999; { initial min. value of x }
+ minbox[y] := 9999; { -----"------- y }
+ maxbox[x] := -9999; { initial max. value of x }
+ maxbox[y] := -9999; { -----"------- y }
+ prevtox3 := -9999;
+ prevtoy3 := -9999;
+
+ write('Enter name of OUTPUT file: ');
+ i := 1;
+ while not eoln do
+ begin
+ read(fout[i]);
+ i := i+1;
+ end;
+ readln;
+ writeln;
+ write('Are you creating the whole dictionary (y/n) ?');
+ readln(ans);
+ if (ans='y') or (ans='Y') then dict := 1 else dict := 0;
+ writeln;
+ rewrite(g,fout);
+ if dict = 1 then
+ begin
+ writeln(g,'%! Simon font');
+ writeln(g,'%0 serverdict begin exitserver');
+ writeln(g,'/TBuildCharDict 10 dict def');
+ writeln(g,'/SimonFont 10 dict def');
+ writeln(g,'/fudge 110 def');
+ writeln(g,'SimonFont begin');
+ writeln(g,'%%');
+ writeln(g,' /FontType 3 def');
+ writeln(g,' /FontMatrix [0.001 0 0 0.001 0 0] def');
+ writeln(g,' /Encoding 256 array def');
+ writeln(g);
+ writeln(g,' 0 1 255 {Encoding exch /.notdef put} for');
+ writeln(g);
+ writeln(g,'% Character definitions');
+ writeln(g);
+ writeln(g,'/Metrics 130 dict def');
+ writeln(g);
+ writeln(g,'/CharDefs 130 dict def');
+ writeln(g,' ');
+ writeln(g,'CharDefs begin');
+ writeln(g);
+ writeln(g,'/.notdef');
+ writeln(g,' () def');
+ writeln(g);
+ end;
+ end;
+
+
+ procedure makenewdef;
+ { in case of several letters proccessing, while start
+ working on a new letter a few initials should be done }
+ var i : integer;
+ begin
+ rewrite(psfile);
+ lastfill := 'i'; { i=init , no last fill }
+ erasein := false;
+ if dict = 1 then
+ begin
+ lmin_x := 9999;
+ lmax_x := -9999;
+ writeln(g);
+ write(g,'/');
+ for i := 1 to ord(curletter[0]) do
+ if curletter[i]<>' ' then write(g,curletter[i])
+ else write(g,'_');
+ writeln(g);
+ writeln(g,'(');
+ end;
+ end;
+
+
+ procedure closeolddef(sub_n:integer);
+ { after one letter proccessing is finished, it gives the
+ last path the right kind of filling, and then call to
+ doarrange in order to make some order! }
+ begin
+ if internal[15] <> lastmonthval then
+ begin
+ writeln(psfile,'fill@');
+ internal[15] := lastmonthval;
+ end
+ else if internal[14] <> lastyearval then
+ begin
+ if internal[14] = -65536 then writeln(psfile,'eofill@')
+ else begin
+ writeln(psfile,'*erase@');
+ erasein := true;
+ end;
+ internal[14] := lastyearval
+ end
+ else case lastfill of
+ 'e' : begin
+ writeln(psfile,'*erase@');
+ erasein := true;
+ end;
+ 's' : writeln(psfile,'eofill@');
+ 'f','i' : writeln(psfile,'fill@');
+ end;
+ doarrange(psfile,g);
+ if dict = 1 then
+ begin
+ writeln(g,') def');
+ all_metrics[no_of_letter-sub_n] := trunc(lmax_x) + 1;
+ end;
+ end;
+
+
+ procedure tini_ps;
+ { prepares to leave... closing the last path, and in case
+ of creating a dictionary, entering all the necessary
+ information needed by the Postscript program }
+ const lowlimit = 50; { if need transform do it to }
+ highlimit = 900; { the box [50,50,900,900] }
+ fix2one = 1.3; { correction to one point size }
+ var j,jj : integer;
+ c_l : currentletter;
+ begin
+ closeolddef(0);
+ if dict = 1 then
+ begin
+ if (minbox[x] < 0) or (minbox[y] < 0) or
+ (maxbox[x] > 1000) or (maxbox[y] > 1000)
+ then begin
+ needtransform := true;
+ doscale[x] := ((highlimit-lowlimit)/(maxbox[x]-minbox[x]))/fix2one;
+ dotranslate[x] := lowlimit - minbox[x]*doscale[x];
+ doscale[y] := ((highlimit-lowlimit)/(maxbox[y]-minbox[y]))/fix2one;
+ dotranslate[y] := lowlimit - minbox[y]*doscale[y];
+ end
+ else needtransform := false;
+ writeln(f);
+ writeln(f,'end % of CharDefs dictionary');
+ writeln(f);
+ for j := 1 to no_of_letter do
+ begin
+ c_l := all_letters[j];
+ write(f,'Encoding ',all_ascii[j],' /');
+ for jj := 1 to ord(c_l[0]) do
+ if c_l[jj]<>' ' then write(f,c_l[jj])
+ else write(f,'_');
+ writeln(f,' put');
+ end;
+ writeln(f);
+ writeln(f,'Metrics');
+ writeln(f,' begin');
+ for j := 1 to no_of_letter do
+ begin
+ c_l := all_letters[j];
+ write(f,'/');
+ for jj := 1 to ord(c_l[0]) do
+ if c_l[jj]<>' ' then write(f,c_l[jj])
+ else write(f,'_');
+ if needtransform then writeln(f,' 1000 def')
+ else writeln(f,' ',all_metrics[j]-minbox[x]:3:0,' fudge add def');
+ end;
+ writeln(f,'/.notdef 0 def');
+ writeln(f,' end');
+ writeln(f);
+ writeln(f,' /BuildChar');
+ writeln(f,' { TBuildCharDict begin');
+ writeln(f,' %%');
+ writeln(f,' /char exch def');
+ writeln(f,' /fontdict exch def');
+ writeln(f);
+ writeln(f, ' /M {moveto} def');
+ writeln(f, ' /L {lineto} def');
+ writeln(f, ' /l {rlineto} def');
+ writeln(f, ' /C {curveto} def');
+ writeln(f, ' /c {rcurveto} def');
+ writeln(f);
+ writeln(f,' /charname fontdict /Encoding get');
+ writeln(f,' char get def');
+ writeln(f,' %%');
+ writeln(f,' /charproc fontdict /CharDefs get');
+ writeln(f,' charname get def');
+ writeln(f,' ');
+ writeln(f,' /charwdth fontdict /Metrics get charname get def');
+ writeln(f,' %%');
+ writeln(f,' gsave');
+ writeln(f,' ',fix2one:3:1,fix2one:10:1,' scale');
+ writeln(f,' 0.2 setflat');
+ writeln(f,' 0.2 setlinewidth');
+ writeln(f,' charwdth 0');
+ writeln(f,' 0 -180');
+ writeln(f,' charwdth 1000');
+ writeln(f,' setcachedevice');
+ if needtransform then
+ begin
+ writeln(f,' ',doscale[x]:7:3,doscale[y]:11:3,' scale');
+ writeln(f,' ',dotranslate[x]:7:3,dotranslate[y]:11:3,' translate');
+ end
+ else writeln(f,' -',minbox[x]:3:0,' fudge add 0 translate');
+ writeln(f,' charproc cvx exec');
+ writeln(f,' grestore');
+ writeln(f,' end');
+ writeln(f,' } def');
+ if needtransform then writeln(f,' /FontBBox [0 0 1000 1000] def')
+ else writeln(f,' /FontBBox [',minbox[x]:3:0,' fudge sub ',minbox[y]:3:0,' ',maxbox[x]:3:0,' ',maxbox[y]:3:0,'] def');
+ writeln(f);
+ writeln(f,' end ');
+ writeln(f);
+ writeln(f,' /Simon SimonFont definefont pop');
+ writeln(f);
+ writeln(f,' /Simon findfont 10 scalefont setfont');
+ writeln(f,' 100 210 moveto () show');
+ writeln(f,' showpage');
+ end;
+ end;
+
+
+
+ procedure auxprintchar(s: ASCIIcode);
+ { puts in string a character whose ascii is s }
+ begin
+ curletter[name_length] := xchr[s];
+ end;
+
+
+ procedure auxprint(s: integer);
+ { equivalent to METAFONT's print, accept changing global
+ variables, and writing is done into a local string.
+ it is also counts the string's length }
+ var
+ j: poolpointer;
+ begin
+ if (s < 0) or (s >= strptr) then
+ s := 131;
+ j := strstart[s];
+ while j < strstart[s + 1] do begin
+ name_length := name_length + 1;
+ auxprintchar(strpool[j]);
+ j := j + 1
+ end
+ end; {:59}
+{60:}
+
+
+ procedure auxslowprint;
+ { equivalent to METAFONT's slowprint, accept changing
+ global variables. }
+ var
+ j: poolpointer;
+ begin
+ if dict = 1 then
+ begin
+ name_length := 0;
+ if (s < 0) or (s >= strptr) then
+ s := 131;
+ j := strstart[s];
+ while j < strstart[s + 1] do begin
+ auxprint(strpool[j]);
+ j := j + 1
+ end;
+ if name_length>0 then
+ begin
+ curletter[0] := chr(name_length);
+ no_of_letter := no_of_letter + 1;
+ all_letters[no_of_letter] := curletter;
+ if foundnew then closeolddef(1);
+ foundnew := true;
+ makenewdef;
+ end;
+ end;
+ end; {:60}
+{62:}
+
+
+procedure auxprintnl;
+begin
+ if dict = 1 then
+ begin
+ name_length := 0;
+ auxprint(s);
+ if name_length>0 then
+ begin
+ curletter[0] := chr(name_length);
+ no_of_letter := no_of_letter + 1;
+ all_letters[no_of_letter] := curletter;
+ if foundnew then closeolddef(1);
+ foundnew := true;
+ makenewdef;
+ end;
+ end;
+end; {:62} {63:}
+
+
+procedure sendascii;
+{ puts in array of ascii values the ascii of letter whose
+ number is no_of_letter. }
+begin
+ all_ascii[no_of_letter] := asc;
+end;
diff --git a/fonts/utilities/mf2ps/mf2ps/mf2psv.p b/fonts/utilities/mf2ps/mf2ps/mf2psv.p
new file mode 100644
index 0000000000..14af0943a1
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/mf2psv.p
@@ -0,0 +1,19049 @@
+{4:}
+{9:}
+(*$C-*)
+{(*$C+*)}
+{:9}
+
+program MF(input, output); {6:}
+
+{------------------------------}
+{ declarations are in mf2ps1.h }
+{------------------------------}
+#include "mf2ps1.h"
+{------------------------------}
+#include "mf_ext.h"
+#include "mf_window.h"
+
+ procedure initialize; {19:}
+ var
+ i: 0..127; {:19} {130:}
+ k: integer; {:130} {21:}
+ begin
+ xchr[32] := ' ';
+ xchr[33] := '!';
+ xchr[34] := '"';
+ xchr[35] := '#';
+ xchr[36] := '$';
+ xchr[37] := '%';
+ xchr[38] := '&';
+ xchr[39] := '''';
+ xchr[40] := '(';
+ xchr[41] := ')';
+ xchr[42] := '*';
+ xchr[43] := '+';
+ xchr[44] := ',';
+ xchr[45] := '-';
+ xchr[46] := '.';
+ xchr[47] := '/';
+ xchr[48] := '0';
+ xchr[49] := '1';
+ xchr[50] := '2';
+ xchr[51] := '3';
+ xchr[52] := '4';
+ xchr[53] := '5';
+ xchr[54] := '6';
+ xchr[55] := '7';
+ xchr[56] := '8';
+ xchr[57] := '9';
+ xchr[58] := ':';
+ xchr[59] := ';';
+ xchr[60] := '<';
+ xchr[61] := '=';
+ xchr[62] := '>';
+ xchr[63] := '?';
+ xchr[64] := '@';
+ xchr[65] := 'A';
+ xchr[66] := 'B';
+ xchr[67] := 'C';
+ xchr[68] := 'D';
+ xchr[69] := 'E';
+ xchr[70] := 'F';
+ xchr[71] := 'G';
+ xchr[72] := 'H';
+ xchr[73] := 'I';
+ xchr[74] := 'J';
+ xchr[75] := 'K';
+ xchr[76] := 'L';
+ xchr[77] := 'M';
+ xchr[78] := 'N';
+ xchr[79] := 'O';
+ xchr[80] := 'P';
+ xchr[81] := 'Q';
+ xchr[82] := 'R';
+ xchr[83] := 'S';
+ xchr[84] := 'T';
+ xchr[85] := 'U';
+ xchr[86] := 'V';
+ xchr[87] := 'W';
+ xchr[88] := 'X';
+ xchr[89] := 'Y';
+ xchr[90] := 'Z';
+ xchr[91] := '[';
+ xchr[92] := '\';
+ xchr[93] := ']';
+ xchr[94] := '^';
+ xchr[95] := '_';
+ xchr[96] := '`';
+ xchr[97] := 'a';
+ xchr[98] := 'b';
+ xchr[99] := 'c';
+ xchr[100] := 'd';
+ xchr[101] := 'e';
+ xchr[102] := 'f';
+ xchr[103] := 'g';
+ xchr[104] := 'h';
+ xchr[105] := 'i';
+ xchr[106] := 'j';
+ xchr[107] := 'k';
+ xchr[108] := 'l';
+ xchr[109] := 'm';
+ xchr[110] := 'n';
+ xchr[111] := 'o';
+ xchr[112] := 'p';
+ xchr[113] := 'q';
+ xchr[114] := 'r';
+ xchr[115] := 's';
+ xchr[116] := 't';
+ xchr[117] := 'u';
+ xchr[118] := 'v';
+ xchr[119] := 'w';
+ xchr[120] := 'x';
+ xchr[121] := 'y';
+ xchr[122] := 'z';
+ xchr[123] := '{';
+ xchr[124] := '|';
+ xchr[125] := '}';
+ xchr[126] := '~';
+ xchr[0] := ' ';
+ xchr[127] := ' '; {:21} {22:}
+ for i := 1 to 31 do
+ xchr[i] := ' ';
+ xchr[9] := chr(9);
+ xchr[12] := chr(12); {:22}
+{23:}
+ for i := 0 to 127 do
+ xord[chr(i)] := 127;
+ for i := 1 to 126 do
+ xord[xchr[i]] := i; {:23} {69:}
+ interaction := 3; {:69} {72:}
+ deletionsallowed := true;
+ errorcount := 0; {:72} {75:}
+ helpptr := 0;
+ useerrhelp := false;
+ errhelp := 0; {:75} {92:}
+ interrupt := 0;
+ OKtointerrupt := true;
+{:92}
+ {98:}
+ aritherror := false; {:98} {131:}
+ twotothe[0] := 1;
+ for k := 1 to 30 do
+ twotothe[k] := 2 * twotothe[k - 1];
+ speclog[1] := 93032640;
+ speclog[2] := 38612034;
+ speclog[3] := 17922280;
+ speclog[4] := 8662214;
+ speclog[5] := 4261238;
+ speclog[6] := 2113709;
+ speclog[7] := 1052693;
+ speclog[8] := 525315;
+ speclog[9] := 262400;
+ speclog[10] := 131136;
+ speclog[11] := 65552;
+ speclog[12] := 32772;
+ speclog[13] := 16385;
+ for k := 14 to 27 do
+ speclog[k] := twotothe[27 - k];
+ speclog[28] := 1; {:131}
+{138:}
+ specatan[1] := 27855475;
+ specatan[2] := 14718068;
+ specatan[3] := 7471121;
+ specatan[4] := 3750058;
+ specatan[5] := 1876857;
+ specatan[6] := 938658;
+ specatan[7] := 469357;
+ specatan[8] := 234682;
+ specatan[9] := 117342;
+ specatan[10] := 58671;
+ specatan[11] := 29335;
+ specatan[12] := 14668;
+ specatan[13] := 7334;
+ specatan[14] := 3667;
+ specatan[15] := 1833;
+ specatan[16] := 917;
+ specatan[17] := 458;
+ specatan[18] := 229;
+ specatan[19] := 115;
+ specatan[20] := 57;
+ specatan[21] := 29;
+ specatan[22] := 14;
+ specatan[23] := 7;
+ specatan[24] := 4;
+ specatan[25] := 2;
+ specatan[26] := 1; {:138} {179:}
+{wasmemend:=-30000;waslomax:=-30000;washimin:=memmax;panicking:=false;}
+{:179}
+ {191:}
+ for k := 1 to 40 do
+ internal[k] := 0;
+ intptr := 40; {:191} {199:}
+ for k := 48 to 57 do
+ charclass[k] := 0;
+ charclass[46] := 1;
+ charclass[32] := 2;
+ charclass[37] := 3;
+ charclass[34] := 4;
+ charclass[44] := 5;
+ charclass[59] := 6;
+ charclass[40] := 7;
+ charclass[41] := 8;
+ for k := 65 to 90 do
+ charclass[k] := 9;
+ for k := 97 to 122 do
+ charclass[k] := 9;
+ charclass[95] := 9;
+ charclass[60] := 10;
+ charclass[61] := 10;
+ charclass[62] := 10;
+ charclass[58] := 10;
+ charclass[124] := 10;
+ charclass[96] := 11;
+ charclass[39] := 11;
+ charclass[43] := 12;
+ charclass[45] := 12;
+ charclass[47] := 13;
+ charclass[42] := 13;
+ charclass[92] := 13;
+ charclass[33] := 14;
+ charclass[63] := 14;
+ charclass[35] := 15;
+ charclass[38] := 15;
+ charclass[64] := 15;
+ charclass[36] := 15;
+ charclass[94] := 16;
+ charclass[126] := 16;
+ charclass[91] := 17;
+ charclass[93] := 18;
+ charclass[123] := 19;
+ charclass[125] := 19;
+ for k := 0 to 31 do
+ charclass[k] := 20;
+ charclass[127] := 20;
+ charclass[9] := 2;
+ charclass[12] := 2; {:199} {202:}
+ hash[1].lh := 0;
+ hash[1].rh := 0;
+ eqtb[1].lh := 41;
+ eqtb[1].rh := -30000;
+ for k := 2 to 2241 do begin
+ hash[k] := hash[1];
+ eqtb[k] := eqtb[1]
+ end; {:202} {231:}
+ bignodesize[13] := 12;
+ bignodesize[14] := 4;
+{:231}
+ {251:}
+ saveptr := -30000; {:251} {396:}
+ octantdir[1] := 415;
+ octantdir[5] := 416;
+ octantdir[6] := 417;
+ octantdir[2] := 418;
+ octantdir[4] := 419;
+ octantdir[8] := 420;
+ octantdir[7] := 421;
+ octantdir[3] := 422; {:396} {428:}
+ maxroundingptr := 0; {:428} {449:}
+ octantcode[1] := 1;
+ octantcode[2] := 5;
+ octantcode[3] := 6;
+ octantcode[4] := 2;
+ octantcode[5] := 4;
+ octantcode[6] := 8;
+ octantcode[7] := 7;
+ octantcode[8] := 3;
+ for k := 1 to 8 do
+ octantnumber[octantcode[k]] := k; {:449} {456:}
+ revturns := false; {:456} {462:}
+ xcorr[1] := 0;
+ ycorr[1] := 0;
+ xycorr[1] := 0;
+ xcorr[5] := 0;
+ ycorr[5] := 0;
+ xycorr[5] := 1;
+ xcorr[6] := -1;
+ ycorr[6] := 1;
+ xycorr[6] := 0;
+ xcorr[2] := 1;
+ ycorr[2] := 0;
+ xycorr[2] := 1;
+ xcorr[4] := 0;
+ ycorr[4] := 1;
+ xycorr[4] := 1;
+ xcorr[8] := 0;
+ ycorr[8] := 1;
+ xycorr[8] := 0;
+ xcorr[7] := 1;
+ ycorr[7] := 0;
+ xycorr[7] := 1;
+ xcorr[3] := -1;
+ ycorr[3] := 1;
+ xycorr[3] := 0;
+ for k := 1 to 8 do
+ zcorr[k] := xycorr[k] - xcorr[k]; {:462} {570:}
+ screenstarted := false;
+ screenOK := false; {:570} {573:}
+ for k := 0 to 15 do begin
+ windowopen[k] := false;
+ windowtime[k] := 0
+ end; {:573}
+{593:}
+ fixneeded := false;
+ watchcoefs := true; {:593} {739:}
+ condptr := -30000;
+ iflimit := 0;
+ curif := 0;
+ ifline := 0; {:739} {753:}
+ loopptr := -30000; {:753} {776:}
+ MFbasedefault := 'plain.base'; {:776} {797:}
+ curexp := 0; {:797} {822:}
+ varflag := 0; {:822} {1078:}
+ startsym := 0; {:1078} {1085:}
+ longhelpseen := false;
+{:1085}
+ {1097:}
+ for k := 0 to 255 do begin
+ tfmwidth[k] := 0;
+ tfmheight[k] := 0;
+ tfmdepth[k] := 0;
+ tfmitalcorr[k] := 0;
+ charexists[k] := false;
+ chartag[k] := 0;
+ charremainder[k] := 0
+ end;
+ for k := 1 to headersize do
+ headerbyte[k] := -1;
+ bc := 255;
+ ec := 0;
+ nl := 0;
+ nk := 0;
+ ne := 0;
+ np := 0; {:1097} {1150:}
+ gfprevptr := 0;
+ totalchars := 0; {:1150} {1153:}
+ halfbuf := gfbufsize div 2;
+ gflimit := gfbufsize;
+ gfptr := 0;
+ gfoffset := 0; {:1153} {1184:}
+ baseident := 0; {:1184} {1215:}
+ editnamestart := 0
+ end; {:1215} {57:}
+
+ procedure println;
+ begin
+ case selector of
+ 3:
+ begin
+ writeln(output);
+ writeln(logfile);
+ termoffset := 0;
+ fileoffset := 0
+ end;
+ 2:
+ begin
+ writeln(logfile);
+ fileoffset := 0
+ end;
+ 1:
+ begin
+ writeln(output);
+ termoffset := 0
+ end;
+ 0, 4, 5:
+ null
+ end
+ end; {:57} {58:}
+
+ procedure printchar(s: ASCIIcode);
+ var tmp : integer;
+ begin
+ case selector of
+ 3:
+ begin
+ {----------------------------------}
+ if xchr[s] = '[' then
+ begin
+ ascii_on := true;
+ ascval := 0;
+ end
+ else if xchr[s] = ']' then
+ begin
+ ascii_on := false;
+ sendascii(ascval);
+ end
+ else if ascii_on then
+ begin
+ tmp := s - ord('0');
+ ascval := ascval*10+tmp;
+ end;
+ {-------------------------------------}
+ write(output, xchr[s]);
+ write(logfile, xchr[s]);
+ termoffset := termoffset + 1;
+ fileoffset := fileoffset + 1;
+ if termoffset = maxprintline then begin
+ writeln(output);
+ termoffset := 0
+ end;
+ if fileoffset = maxprintline then begin
+ writeln(logfile);
+ fileoffset := 0
+ end
+ end;
+ 2:
+ begin
+ write(logfile, xchr[s]);
+ fileoffset := fileoffset + 1;
+ if fileoffset = maxprintline then
+ println
+ end;
+ 1:
+ begin
+ write(output, xchr[s]);
+ termoffset := termoffset + 1;
+ if termoffset = maxprintline then
+ println
+ end;
+ 0:
+ null;
+ 4:
+ if tally < trickcount then
+ trickbuf[tally mod errorline] := s;
+ 5:
+ begin
+ if poolptr < poolsize then begin
+ strpool[poolptr] := s;
+ poolptr := poolptr + 1
+ end
+ end
+ end;
+ tally := tally + 1
+ end; {:58} {59:}
+
+ procedure print(s: integer);
+ var
+ j: poolpointer;
+ begin
+ if (s < 0) or (s >= strptr) then
+ s := 131;
+ j := strstart[s];
+ while j < strstart[s + 1] do begin
+ printchar(strpool[j]);
+ j := j + 1
+ end
+ end; {:59}
+{60:}
+
+ procedure slowprint(s: integer);
+ var
+ j: poolpointer;
+ begin
+ if (s < 0) or (s >= strptr) then
+ s := 131;
+ j := strstart[s];
+ while j < strstart[s + 1] do begin
+ print(strpool[j]);
+ j := j + 1
+ end
+ end; {:60}
+{62:}
+
+ procedure printnl(s: strnumber);
+ begin
+ if ((termoffset > 0) and odd(selector)) or ((fileoffset > 0) and (selector >= 2)) then
+ println;
+ print(s)
+ end; {:62} {63:}
+
+ procedure printthedigs(k: eightbits);
+ begin
+ while k > 0 do begin
+ k := k - 1;
+ printchar(48 + dig[k])
+ end
+ end; {:63} {64:}
+
+ procedure printint(n: integer);
+ var
+ k: 0..23;
+ m: integer;
+ begin
+ k := 0;
+ if n < 0 then begin
+ printchar(45);
+ if n > (-100000000) then
+ n := -n
+ else begin
+ m := (-1) - n;
+ n := m div 10;
+ m := (m mod 10) + 1;
+ k := 1;
+ if m < 10 then
+ dig[0] := m
+ else begin
+ dig[0] := 0;
+ n := n + 1
+ end
+ end
+ end;
+ repeat
+ dig[k] := n mod 10;
+ n := n div 10;
+ k := k + 1
+ until n = 0;
+ printthedigs(k)
+ end; {:64} {103:}
+
+ procedure printscaled(s: scaled);
+ var
+ delta: scaled;
+ begin
+ if s < 0 then begin
+ printchar(45);
+ s := -s
+ end;
+ printint(s div 65536);
+ s := (10 * (s mod 65536)) + 5;
+ if s <> 5 then begin
+ delta := 10;
+ printchar(46);
+ repeat
+ if delta > 65536 then
+ s := (s + 32768) - (delta div 2);
+ printchar(48 + (s div 65536));
+ s := 10 * (s mod 65536);
+ delta := delta * 10
+ until s <= delta
+ end
+ end; {:103} {104:}
+
+ procedure printtwo(x, y: scaled);
+ begin
+ printchar(40);
+ printscaled(x);
+ printchar(44);
+ printscaled(y);
+ printchar(41)
+ end; {:104} {187:}
+
+ procedure printtype(t: smallnumber);
+ begin
+ if t in
+ [1, 2, 3, 4, 5, 6, 7, 8,
+ 9, 10, 11, 12, 13, 14, 16, 17,
+ 18, 15, 19, 20, 21, 22, 23] then
+ case t of
+ 1:
+ print(194);
+ 2:
+ print(195);
+ 3:
+ print(196);
+ 4:
+ print(197);
+ 5:
+ print(198);
+ 6:
+ print(199);
+ 7:
+ print(200);
+ 8:
+ print(201);
+ 9:
+ print(202);
+ 10:
+ print(203);
+ 11:
+ print(204);
+ 12:
+ print(205);
+ 13:
+ print(206);
+ 14:
+ print(207);
+ 16:
+ print(208);
+ 17:
+ print(209);
+ 18:
+ print(210);
+ 15:
+ print(211);
+ 19:
+ print(212);
+ 20:
+ print(213);
+ 21:
+ print(214);
+ 22:
+ print(215);
+ 23:
+ print(216)
+ end
+ else
+ print(217)
+ end; {:187} {195:}
+
+ procedure begindiagnostic;
+ begin
+ oldsetting := selector;
+ if (internal[13] <= 0) and (selector = 3) then begin
+ selector := selector - 1;
+ if history = 0 then
+ history := 1
+ end
+ end; { begindiagnostic }
+
+ procedure enddiagnostic(blankline: boolean);
+ begin
+ printnl(155);
+ if blankline then
+ println;
+ selector := oldsetting
+ end; {:195} {197:}
+
+ procedure printdiagnostic(s, t: strnumber; nuline: boolean);
+ begin
+ begindiagnostic;
+ if nuline then
+ printnl(s)
+ else
+ print(s);
+ print(320);
+ printint(line);
+ print(t);
+ printchar(58)
+ end; {:197} {773:}
+
+ procedure printfilename(n, a, e: integer);
+ begin
+ print(a);
+ print(n);
+ print(e)
+ end; {:773} {73:}
+
+ procedure normalizeselector;
+ forward;
+
+ procedure getnext;
+ forward;
+
+ procedure terminput;
+ forward;
+
+ procedure showcontext;
+ forward;
+
+ procedure beginfilereading;
+ forward;
+
+ procedure openlogfile;
+ forward;
+
+ procedure closefilesandtermina;
+ forward;
+
+ procedure clearforerrorprompt;
+ forward; {procedure debughelp;forward;} {43:}
+
+ procedure flushstring(s: strnumber);
+ begin
+ if s < (strptr - 1) then
+ strref[s] := 0
+ else
+ repeat
+ strptr := strptr - 1
+ until strref[strptr - 1] <> 0;
+ poolptr := strstart[strptr]
+ end; {:43} {:73} {76:}
+
+ procedure jumpout;
+ begin
+ goto 9998
+ end; {:76} {77:}
+
+ procedure error;
+ label
+ 22, 10;
+ var
+ c: ASCIIcode;
+ s1, s2, s3: integer;
+ j: poolpointer;
+ begin
+ if history < 2 then
+ history := 2;
+ printchar(46);
+ showcontext;
+ if interaction = 3 then {78:}
+ while true do begin
+ 22:
+ clearforerrorprompt;
+ begin
+ print(135);
+ terminput
+ end;
+ if last = first then
+ goto 10;
+ c := buffer[first];
+ if c >= 97 then
+ c := c - 32; {79:}
+ if c in
+ [48, 49, 50, 51, 52, 53, 54, 55,
+ 56, 57, 69, 72, 73, 81, 82, 83,
+ 88] then
+ case c of
+ 48, 49, 50, 51, 52, 53, 54,
+ 55, 56, 57:
+ if deletionsallowed then begin {83:}
+ s1 := curcmd;
+ s2 := curmod;
+ s3 := cursym;
+ OKtointerrupt := false;
+ if ((last > (first + 1)) and (buffer[first + 1] >= 48)) and (buffer[first + 1] <= 57) then
+ c := ((c * 10) + buffer[first + 1]) - (48 * 11)
+ else
+ c := c - 48;
+ while c > 0 do begin
+ getnext;
+{743:}
+ if curcmd = 39 then begin
+ if strref[curmod] < 127 then
+ if strref[curmod] > 1 then
+ strref[curmod] := strref[curmod] - 1
+ else
+ flushstring(curmod)
+ end {:743};
+ c := c - 1
+ end;
+ curcmd := s1;
+ curmod := s2;
+ cursym := s3;
+ OKtointerrupt := true;
+ begin
+ helpptr := 2;
+ helpline[1] := 148;
+ helpline[0] := 149
+ end;
+ showcontext;
+ goto 22
+ end {:83}; {68:begin debughelp;goto 22;end;}
+ 69:
+ if fileptr > 0 then begin
+ editnamestart := strstart[inputstack[fileptr].namefield];
+ editnamelength := strstart[inputstack[fileptr].namefield + 1] - strstart[inputstack[fileptr].namefield];
+ editline := line;
+ jumpout
+ end;
+ 72:
+ begin {84:}
+ if useerrhelp then begin {85:}
+ j := strstart[errhelp];
+ while j < strstart[errhelp + 1] do begin
+ if strpool[j] <> 37 then
+ print(strpool[j])
+ else if (j + 1) = strstart[errhelp + 1] then
+ println
+ else if strpool[j + 1] <> 37 then
+ println
+ else begin
+ j := j + 1;
+ printchar(37)
+ end;
+ j := j + 1
+ end {:85};
+ useerrhelp := false
+ end else begin
+ if helpptr = 0 then begin
+ helpptr := 2;
+ helpline[1] := 150;
+ helpline[0] := 151
+ end;
+ repeat
+ helpptr := helpptr - 1;
+ print(helpline[helpptr]);
+ println
+ until helpptr = 0
+ end;
+ begin
+ helpptr := 4;
+ helpline[3] := 152;
+ helpline[2] := 151;
+ helpline[1] := 153;
+ helpline[0] := 154
+ end;
+ goto 22
+ end; {:84}
+ 73:
+ begin {82:}
+ beginfilereading;
+ if last > (first + 1) then begin
+ curinput.locfield := first + 1;
+ buffer[first] := 32
+ end else begin
+ begin
+ print(147);
+ terminput
+ end;
+ curinput.locfield := first
+ end;
+ first := last + 1;
+ curinput.limitfield := last;
+ goto 10
+ end; {:82}
+ 81, 82, 83:
+ begin {81:}
+ errorcount := 0;
+ interaction := (0 + c) - 81;
+ print(142);
+ case c of
+ 81:
+ begin
+ print(143);
+ selector := selector - 1
+ end;
+ 82:
+ print(144);
+ 83:
+ print(145)
+ end;
+ print(146);
+ println;
+ flush(output);
+ goto 10
+ end; {:81}
+ 88:
+ begin
+ interaction := 2;
+ jumpout
+ end
+ end
+ else
+ null; {80:}
+ begin
+ print(136);
+ printnl(137);
+ printnl(138);
+ if fileptr > 0 then
+ print(139);
+ if deletionsallowed then
+ printnl(140);
+ printnl(141)
+ end {:80} {:79}
+ end {:78};
+ errorcount := errorcount + 1;
+ if errorcount = 100 then begin
+ printnl(134);
+ history := 3;
+ jumpout
+ end; {86:}
+ if interaction > 0 then
+ selector := selector - 1;
+ if useerrhelp then begin
+ printnl(155); {85:}
+ j := strstart[errhelp];
+ while j < strstart[errhelp + 1] do begin
+ if strpool[j] <> 37 then
+ print(strpool[j])
+ else if (j + 1) = strstart[errhelp + 1] then
+ println
+ else if strpool[j + 1] <> 37 then
+ println
+ else begin
+ j := j + 1;
+ printchar(37)
+ end;
+ j := j + 1
+ end {:85}
+ end else
+ while helpptr > 0 do begin
+ helpptr := helpptr - 1;
+ printnl(helpline[helpptr])
+ end;
+ println;
+ if interaction > 0 then
+ selector := selector + 1; {:86}
+ println;
+ 10:
+ null
+ end; {:77}
+{88:}
+
+ procedure fatalerror(s: strnumber);
+ begin
+ normalizeselector;
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(156)
+ end;
+ begin
+ helpptr := 1;
+ helpline[0] := s
+ end;
+ begin
+ if interaction = 3 then
+ interaction := 2;
+ error;
+{if interaction>0 then debughelp;}
+ history := 3;
+ jumpout
+ end
+ end; {:88} {89:}
+
+ procedure overflow(s: strnumber; n: integer);
+ begin
+ normalizeselector;
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(157)
+ end;
+ print(s);
+ printchar(61);
+ printint(n);
+ printchar(93);
+ begin
+ helpptr := 2;
+ helpline[1] := 158;
+ helpline[0] := 159
+ end;
+ begin
+ if interaction = 3 then
+ interaction := 2;
+ error;
+{if interaction>0 then debughelp;}
+ history := 3;
+ jumpout
+ end
+ end; {:89} {90:}
+
+ procedure confusion;
+ begin
+ normalizeselector;
+ if history < 2 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(160)
+ end;
+ print(s);
+ printchar(41);
+ begin
+ helpptr := 1;
+ helpline[0] := 161
+ end
+ end else begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(162)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 163;
+ helpline[0] := 164
+ end
+ end;
+ begin
+ if interaction = 3 then
+ interaction := 2;
+ error;
+{if interaction>0 then debughelp;}
+ history := 3;
+ jumpout
+ end
+ end; {:90} {:4}
+
+
+{26:}
+
+ function aopenin(var f: alphafile; pathspecifier: integer): boolean;
+ var
+ ok: boolean;
+ begin
+ if testaccess(nameoffile, realnameoffile, 4, pathspecifier) then begin
+ reset(f, realnameoffile);
+ ok := true
+ end else
+ ok := false;
+ aopenin := ok
+ end; { aopenin }
+
+ function aopenout(var f: alphafile): boolean;
+ var
+ ok: boolean;
+ begin
+ if testaccess(nameoffile, realnameoffile, 2, 0) then begin
+ rewrite(f, realnameoffile);
+ ok := true
+ end else
+ ok := false;
+ aopenout := ok
+ end; { aopenout }
+
+ function wopenin(var f: wordfile): boolean;
+ var
+ ok: boolean;
+ begin
+ if testaccess(nameoffile, realnameoffile, 4, 7) then begin
+ reset(f, realnameoffile);
+ ok := true
+ end else
+ ok := false;
+ wopenin := ok
+ end; { wopenin }
+
+ function wopenout(var f: wordfile): boolean;
+ var
+ ok: boolean;
+ begin
+ if testaccess(nameoffile, realnameoffile, 2, 0) then begin
+ rewrite(f, nameoffile);
+ ok := true
+ end else
+ ok := false;
+ wopenout := ok
+ end; {:26} {27:}
+
+ procedure aclose(var f: alphafile);
+ begin
+ closea(f)
+ end; { aclose }
+
+ procedure wclose(var f: wordfile);
+ begin
+ closew(f)
+ end; {:27} {30:}
+
+ function inputln(var f: alphafile; bypasseoln: boolean): boolean;
+ var
+ lastnonblank: 0..bufsize;
+ begin
+ if bypasseoln then
+ if not eof(f) then
+ if eoln(f) then
+ get(f);
+ last := first;
+ if eof(f) then
+ inputln := false
+ else begin
+ lastnonblank := first;
+ while not eoln(f) do begin
+ if last >= maxbufstack then begin
+ maxbufstack := last + 1;
+ if maxbufstack = bufsize then
+ overflow(128, bufsize)
+ end;
+ buffer[last] := xord[f^];
+ get(f);
+ last := last + 1;
+ if buffer[last - 1] <> 32 then
+ lastnonblank := last
+ end;
+ last := lastnonblank;
+ inputln := true
+ end
+ end; {:30} {36:}
+
+ function initterminal: boolean;
+ label
+ 10;
+ var
+ dummy, i, j, k: integer;
+ arg: packed array [1..100] of char;
+ begin
+ if argc > 1 then begin
+ last := first;
+ for i := 1 to argc - 1 do begin
+ argv(i, arg);
+ j := 1;
+ k := 100;
+ while (k > 1) and (arg[k] = ' ') do
+ k := k - 1;
+ while j <= k do begin
+ buffer[last] := xord[arg[j]];
+ j := j + 1;
+ last := last + 1
+ end;
+ if k > 1 then begin
+ buffer[last] := xord[' '];
+ last := last + 1
+ end
+ end;
+ if last > first then begin
+ curinput.locfield := first;
+ initterminal := true;
+ goto 10
+ end
+ end;
+ while true do begin
+ write(output, '**');
+ flush(output);
+ if not inputln(input, true) then begin
+ writeln(output);
+ writeln(output, '! End of file on the terminal... why?');
+ initterminal := false;
+ goto 10
+ end;
+ curinput.locfield := first;
+ while (curinput.locfield < last) and (buffer[curinput.locfield] = 32) do
+ curinput.locfield := curinput.locfield + 1;
+ if curinput.locfield < last then begin
+ initterminal := true;
+ goto 10
+ end;
+ writeln(output, 'Please type the name of your input file.')
+ end;
+ 10:
+ null
+ end; { initterminal }
+{:36}
+ {44:}
+
+ function makestring: strnumber;
+ begin
+ if strptr = maxstrptr then begin
+ if strptr = maxstrings then
+ overflow(130, maxstrings - initstrptr);
+ maxstrptr := maxstrptr + 1
+ end;
+ strref[strptr] := 1;
+ strptr := strptr + 1;
+ strstart[strptr] := poolptr;
+ makestring := strptr - 1
+ end; { makestring }
+{:44}
+ {45:}
+
+ function streqbuf(s: strnumber; k: integer): boolean;
+ label
+ 45;
+ var
+ j: poolpointer;
+ result: boolean;
+ begin
+ j := strstart[s];
+ while j < strstart[s + 1] do begin
+ if strpool[j] <> buffer[k] then begin
+ result := false;
+ goto 45
+ end;
+ j := j + 1;
+ k := k + 1
+ end;
+ result := true;
+ 45:
+ streqbuf := result
+ end; {:45} {46:}
+
+ function strvsstr(s, t: strnumber): integer;
+ label
+ 10;
+ var
+ j, k: poolpointer;
+ ls, lt: integer;
+ l: integer;
+ begin
+ ls := strstart[s + 1] - strstart[s];
+ lt := strstart[t + 1] - strstart[t];
+ if ls <= lt then
+ l := ls
+ else
+ l := lt;
+ j := strstart[s];
+ k := strstart[t];
+ while l > 0 do begin
+ if strpool[j] <> strpool[k] then begin
+ strvsstr := strpool[j] - strpool[k];
+ goto 10
+ end;
+ j := j + 1;
+ k := k + 1;
+ l := l - 1
+ end;
+ strvsstr := ls - lt;
+ 10:
+ null
+ end; {:46} {47:}
+ {function getstringsstarted:boolean;label 30,10;
+ var k,l:0..127;m,n:char;g:strnumber;a:integer;c:boolean;
+ begin poolptr:=0;strptr:=0;maxpoolptr:=0;maxstrptr:=0;strstart[0]:=0;
+ [48:]for k:=0 to 127 do begin if([49:](k<32)or(k>126)[:49])then begin
+ begin strpool[poolptr]:=94;poolptr:=poolptr+1;end;
+ begin strpool[poolptr]:=94;poolptr:=poolptr+1;end;
+ if k<64 then begin strpool[poolptr]:=k+64;poolptr:=poolptr+1;
+ end else begin strpool[poolptr]:=k-64;poolptr:=poolptr+1;end;
+ end else begin strpool[poolptr]:=k;poolptr:=poolptr+1;end;g:=makestring;
+ strref[g]:=127;end[:48];[51:]nameoffile:=poolname;
+ if aopenin(poolfile,8)then begin c:=false;
+ repeat[52:]begin if eof(poolfile)then begin;
+ writeln(output,'! mf.pool has no check sum.');aclose(poolfile);
+ getstringsstarted:=false;goto 10;end;read(poolfile,m,n);
+ if m='*'then[53:]begin a:=0;k:=1;
+ while true do begin if(xord[n]<48)or(xord[n]>57)then begin;
+ writeln(output,'! mf.pool check sum doesn''t have nine digits.');
+ aclose(poolfile);getstringsstarted:=false;goto 10;end;
+ a:=10*a+xord[n]-48;if k=9 then goto 30;k:=k+1;read(poolfile,n);end;
+ 30:if a<>503742536 then begin;
+ writeln(output,'! mf.pool doesn''t match; tangle me again.');
+ aclose(poolfile);getstringsstarted:=false;goto 10;end;c:=true;
+ end[:53]else begin if(xord[m]<48)or(xord[m]>57)or(xord[n]<48)or(xord[n]>
+ 57)then begin;
+ writeln(output,'! mf.pool line doesn''t begin with two digits.');
+ aclose(poolfile);getstringsstarted:=false;goto 10;end;
+ l:=xord[m]*10+xord[n]-48*11;
+ if poolptr+l+stringvacancies>poolsize then begin;
+ writeln(output,'! You have to increase POOLSIZE.');aclose(poolfile);
+ getstringsstarted:=false;goto 10;end;
+ for k:=1 to l do begin if eoln(poolfile)then m:=' 'else read(poolfile,m)
+ ;begin strpool[poolptr]:=xord[m];poolptr:=poolptr+1;end;end;
+ readln(poolfile);g:=makestring;strref[g]:=127;end;end[:52];until c;
+ aclose(poolfile);getstringsstarted:=true;end else begin;
+ writeln(output,'! I can''t read mf.pool.');aclose(poolfile);
+ getstringsstarted:=false;goto 10;end[:51];10:end;}
+ {:47}
+ {65:}
+
+ procedure printdd(n: integer);
+ begin
+ n := abs(n) mod 100;
+ printchar(48 + (n div 10));
+ printchar(48 + (n mod 10))
+ end; {:65} {66:}
+
+ procedure terminput;
+ var
+ k: 0..bufsize;
+ begin
+ flush(output);
+ if not inputln(input, true) then
+ fatalerror(132);
+ termoffset := 0;
+ selector := selector - 1;
+ if last <> first then
+ for k := first to last - 1 do
+ print(buffer[k]);
+ println;
+ buffer[last] := 37;
+ selector := selector + 1
+ end; {:66} {87:}
+
+ procedure normalizeselector;
+ begin
+ if jobname > 0 then
+ selector := 3
+ else
+ selector := 1;
+ if jobname = 0 then
+ openlogfile;
+ if interaction = 0 then
+ selector := selector - 1
+ end; {:87} {93:}
+
+ procedure pauseforinstructions;
+ begin
+ if OKtointerrupt then begin
+ interaction := 3;
+ if (selector = 2) or (selector = 0) then
+ selector := selector + 1;
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(165)
+ end;
+ begin
+ helpptr := 3;
+ helpline[2] := 166;
+ helpline[1] := 167;
+ helpline[0] := 168
+ end;
+ deletionsallowed := false;
+ error;
+ deletionsallowed := true;
+ interrupt := 0
+ end
+ end; {:93} {94:}
+
+ procedure missingerr(s: strnumber);
+ begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(169)
+ end;
+ print(s);
+ print(170)
+ end; {:94} {99:}
+
+ procedure cleararith;
+ begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(171)
+ end;
+ begin
+ helpptr := 4;
+ helpline[3] := 172;
+ helpline[2] := 173;
+ helpline[1] := 174;
+ helpline[0] := 175
+ end;
+ error;
+ aritherror := false
+ end; {:99} {100:}
+
+ function slowadd(x, y: integer): integer;
+ begin
+ if x >= 0 then
+ if y <= (2147483647 - x) then
+ slowadd := x + y
+ else begin
+ aritherror := true;
+ slowadd := 2147483647
+ end
+ else if (-y) <= (2147483647 + x) then
+ slowadd := x + y
+ else begin
+ aritherror := true;
+ slowadd := -2147483647
+ end
+ end; {:100} {102:}
+
+ function rounddecimals(k: smallnumber): scaled;
+ var
+ a: integer;
+ begin
+ a := 0;
+ while k > 0 do begin
+ k := k - 1;
+ a := (a + (dig[k] * 131072)) div 10
+ end;
+ rounddecimals := (a + 1) div 2
+ end; {:102} {112:}
+
+ function takescaled(q: integer; f: scaled): integer;
+ var
+ p: integer;
+ negative: boolean;
+ n: integer;
+ becareful: integer; {110:}
+ begin
+ if f >= 0 then
+ negative := false
+ else begin
+ f := -f;
+ negative := true
+ end;
+ if q < 0 then begin
+ q := -q;
+ negative := not negative
+ end; {:110}
+ if f < 65536 then
+ n := 0
+ else begin
+ n := f div 65536;
+ f := f mod 65536;
+ if q <= (2147483647 div n) then
+ n := n * q
+ else begin
+ aritherror := true;
+ n := 2147483647
+ end
+ end;
+ f := f + 65536; {113:}
+ p := 32768;
+ if q < 1073741824 then
+ repeat
+ if odd(f) then
+ p := (p + q) div 2
+ else
+ p := p div 2;
+ f := f div 2
+ until f = 1
+ else
+ repeat
+ if odd(f) then
+ p := p + ((q - p) div 2)
+ else
+ p := p div 2;
+ f := f div 2
+ until f = 1 {:113};
+ becareful := n - 2147483647;
+ if (becareful + p) > 0 then begin
+ aritherror := true;
+ n := 2147483647 - p
+ end;
+ if negative then
+ takescaled := -(n + p)
+ else
+ takescaled := n + p
+ end; {:112} {114:}
+
+ function makescaled(p, q: integer): scaled;
+ var
+ f: integer;
+ n: integer;
+ negative: boolean;
+ becareful: integer;
+ begin
+ if p >= 0 then
+ negative := false
+ else begin
+ p := -p;
+ negative := true
+ end;
+ if q <= 0 then begin {if q=0 then confusion(47);}
+ q := -q;
+ negative := not negative
+ end;
+ n := p div q;
+ p := p mod q;
+ if n >= 32768 then begin
+ aritherror := true;
+ if negative then
+ makescaled := -2147483647
+ else
+ makescaled := 2147483647
+ end else begin
+ n := (n - 1) * 65536; {115:}
+ f := 1;
+ repeat
+ becareful := p - q;
+ p := becareful + p;
+ if p >= 0 then
+ f := (f + f) + 1
+ else begin
+ f := f + f;
+ p := p + q
+ end
+ until f >= 65536;
+ becareful := p - q;
+ if (becareful + p) >= 0 then
+ f := f + 1 {:115};
+ if negative then
+ makescaled := -(f + n)
+ else
+ makescaled := f + n
+ end
+ end; {:114}
+{116:}
+
+ function velocity(st, ct, sf, cf: fraction; t: scaled): fraction;
+ var
+ acc, num, denom: integer;
+ begin
+ acc := takefraction(st - (sf div 16), sf - (st div 16));
+ acc := takefraction(acc, ct - cf);
+ num := 536870912 + takefraction(acc, 379625062);
+ denom := (805306368 + takefraction(ct, 497706707)) + takefraction(cf, 307599661);
+ if t <> 65536 then
+ num := makescaled(num, t);
+ if (num div 4) >= denom then
+ velocity := 1073741824
+ else
+ velocity := makefraction(num, denom)
+ end; {:116} {117:}
+
+ function abvscd ;
+ label
+ 10;
+ var
+ q, r: integer; {118:}
+ begin
+ if a < 0 then begin
+ a := -a;
+ b := -b
+ end;
+ if c < 0 then begin
+ c := -c;
+ d := -d
+ end;
+ if d <= 0 then begin
+ if b >= 0 then
+ if ((a = 0) or (b = 0)) and ((c = 0) or (d = 0)) then begin
+ abvscd := 0;
+ goto 10
+ end else begin
+ abvscd := 1;
+ goto 10
+ end;
+ if d = 0 then
+ if a = 0 then begin
+ abvscd := 0;
+ goto 10
+ end else begin
+ abvscd := -1;
+ goto 10
+ end;
+ q := a;
+ a := c;
+ c := q;
+ q := -b;
+ b := -d;
+ d := q
+ end else if b <= 0 then begin
+ if b < 0 then
+ if a > 0 then begin
+ abvscd := -1;
+ goto 10
+ end;
+ if c = 0 then begin
+ abvscd := 0;
+ goto 10
+ end else begin
+ abvscd := -1;
+ goto 10
+ end
+ end {:118};
+ while true do begin
+ q := a div d;
+ r := c div b;
+ if q <> r then
+ if q > r then begin
+ abvscd := 1;
+ goto 10
+ end else begin
+ abvscd := -1;
+ goto 10
+ end;
+ q := a mod d;
+ r := c mod b;
+ if r = 0 then
+ if q = 0 then begin
+ abvscd := 0;
+ goto 10
+ end else begin
+ abvscd := 1;
+ goto 10
+ end;
+ if q = 0 then begin
+ abvscd := -1;
+ goto 10
+ end;
+ a := b;
+ b := q;
+ c := d;
+ d := r
+ end;
+ 10:
+ null
+ end; {:117} {119:}
+
+ function floorscaled(x: scaled): scaled;
+ var
+ becareful: integer;
+ begin
+ if x >= 0 then
+ floorscaled := x - (x mod 65536)
+ else begin
+ becareful := x + 1;
+ floorscaled := (x + ((-becareful) mod 65536)) - 65535
+ end
+ end; { floorscaled }
+
+ function floorunscaled(x: scaled): integer;
+ var
+ becareful: integer;
+ begin
+ if x >= 0 then
+ floorunscaled := x div 65536
+ else begin
+ becareful := x + 1;
+ floorunscaled := -(1 + ((-becareful) div 65536))
+ end
+ end; { floorunscaled }
+
+ function roundunscaled(x: scaled): integer;
+ var
+ becareful: integer;
+ begin
+ if x >= 32768 then
+ roundunscaled := 1 + ((x - 32768) div 65536)
+ else if x >= (-32768) then
+ roundunscaled := 0
+ else begin
+ becareful := x + 1;
+ roundunscaled := -(1 + (((-becareful) - 32768) div 65536))
+ end
+ end; { roundunscaled }
+
+ function roundfraction(x: fraction): scaled;
+ var
+ becareful: integer;
+ begin
+ if x >= 2048 then
+ roundfraction := 1 + ((x - 2048) div 4096)
+ else if x >= (-2048) then
+ roundfraction := 0
+ else begin
+ becareful := x + 1;
+ roundfraction := -(1 + (((-becareful) - 2048) div 4096))
+ end
+ end; {:119} {121:}
+
+ function squarert(x: scaled): scaled;
+ var
+ k: smallnumber;
+ y, q: integer;
+ begin
+ if x <= 0 then begin {122:}
+ if x < 0 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(176)
+ end;
+ printscaled(x);
+ print(177);
+ begin
+ helpptr := 2;
+ helpline[1] := 178;
+ helpline[0] := 179
+ end;
+ error
+ end;
+ squarert := 0
+ end else begin {:122}
+ k := 23;
+ q := 2;
+ while x < 536870912 do begin
+ k := k - 1;
+ x := ((x + x) + x) + x
+ end;
+ if x < 1073741824 then
+ y := 0
+ else begin
+ x := x - 1073741824;
+ y := 1
+ end; {123:}
+ repeat
+ x := x + x;
+ y := y + y;
+ if x >= 1073741824 then begin
+ x := x - 1073741824;
+ y := y + 1
+ end;
+ x := x + x;
+ y := (y + y) - q;
+ q := q + q;
+ if x >= 1073741824 then begin
+ x := x - 1073741824;
+ y := y + 1
+ end;
+ if y > q then begin
+ y := y - q;
+ q := q + 2
+ end else if y <= 0 then begin
+ q := q - 2;
+ y := y + q
+ end;
+ k := k - 1 {:123}
+ until k = 0;
+ squarert := q div 2
+ end
+ end; {:121}
+{124:}
+
+ function pythadd(a, b: integer): integer;
+ label
+ 30;
+ var
+ r: fraction;
+ big: boolean;
+ begin
+ a := abs(a);
+ b := abs(b);
+ if a < b then begin
+ r := b;
+ b := a;
+ a := r
+ end;
+ if a > 0 then begin
+ if a < 536870912 then
+ big := false
+ else begin
+ a := a div 4;
+ b := b div 4;
+ big := true
+ end; {125:}
+ while true do begin
+ r := makefraction(b, a);
+ r := takefraction(r, r);
+ if r = 0 then
+ goto 30;
+ r := makefraction(r, 1073741824 + r);
+ a := a + takefraction(a + a, r);
+ b := takefraction(b, r)
+ end;
+ 30: {:125}
+ null;
+ if big then
+ if a < 536870912 then
+ a := ((a + a) + a) + a
+ else begin
+ aritherror := true;
+ a := 2147483647
+ end
+ end;
+ pythadd := a
+ end; {:124} {126:}
+
+ function pythsub(a, b: integer): integer;
+ label
+ 30;
+ var
+ r: fraction;
+ big: boolean;
+ begin
+ a := abs(a);
+ b := abs(b);
+ if a <= b then begin {128:}
+ if a < b then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(180)
+ end;
+ printscaled(a);
+ print(181);
+ printscaled(b);
+ print(177);
+ begin
+ helpptr := 2;
+ helpline[1] := 178;
+ helpline[0] := 179
+ end;
+ error
+ end;
+ a := 0
+ end else begin {:128}
+ if a < 1073741824 then
+ big := false
+ else begin
+ a := a div 2;
+ b := b div 2;
+ big := true
+ end; {127:}
+ while true do begin
+ r := makefraction(b, a);
+ r := takefraction(r, r);
+ if r = 0 then
+ goto 30;
+ r := makefraction(r, 1073741824 - r);
+ a := a - takefraction(a + a, r);
+ b := takefraction(b, r)
+ end;
+ 30: {:127}
+ null;
+ if big then
+ a := a + a
+ end;
+ pythsub := a
+ end; {:126} {132:}
+
+ function mlog(x: scaled): scaled;
+ var
+ y, z: integer;
+ k: integer;
+ begin
+ if x <= 0 then begin {134:}
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(182)
+ end;
+ printscaled(x);
+ print(177);
+ begin
+ helpptr := 2;
+ helpline[1] := 183;
+ helpline[0] := 179
+ end;
+ error;
+ mlog := 0
+ end else begin {:134}
+ y := 1302456860;
+ z := 6581195;
+ while x < 1073741824 do begin
+ x := x + x;
+ y := y - 93032639;
+ z := z - 48782
+ end;
+ y := y + (z div 65536);
+ k := 2;
+ while x > 1073741828 do begin {133:}
+ z := ((x - 1) div twotothe[k]) + 1;
+ while x < (1073741824 + z) do begin
+ z := (z + 1) div 2;
+ k := k + 1
+ end;
+ y := y + speclog[k];
+ x := x - z
+ end {:133};
+ mlog := y div 8
+ end
+ end; {:132} {135:}
+
+ function mexp(x: scaled): scaled;
+ var
+ k: smallnumber;
+ y, z: integer;
+ begin
+ if x > 174436200 then begin
+ aritherror := true;
+ mexp := 2147483647
+ end else if x < (-197694359) then
+ mexp := 0
+ else begin
+ if x <= 0 then begin
+ z := -(8 * x);
+ y := 1048576
+ end else begin
+ if x <= 127919879 then
+ z := 1023359037 - (8 * x)
+ else
+ z := 8 * (174436200 - x);
+ y := 2147483647
+ end; {136:}
+ k := 1;
+ while z > 0 do begin
+ while z >= speclog[k] do begin
+ z := z - speclog[k];
+ y := (y - 1) - ((y - twotothe[k - 1]) div twotothe[k])
+ end;
+ k := k + 1
+ end {:136};
+ if x <= 127919879 then
+ mexp := (y + 8) div 16
+ else
+ mexp := y
+ end
+ end; {:135} {139:}
+
+ function narg(x, y: integer): angle;
+ var
+ z: angle;
+ t: integer;
+ k: smallnumber;
+ octant: 1..8;
+ begin
+ if x >= 0 then
+ octant := 1
+ else begin
+ x := -x;
+ octant := 2
+ end;
+ if y < 0 then begin
+ y := -y;
+ octant := octant + 2
+ end;
+ if x < y then begin
+ t := y;
+ y := x;
+ x := t;
+ octant := octant + 4
+ end;
+ if x = 0 then begin {140:}
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(184)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 185;
+ helpline[0] := 179
+ end;
+ error;
+ narg := 0
+ end else begin {:140} {142:}
+ while x >= 536870912 do begin
+ x := x div 2;
+ y := y div 2
+ end;
+ z := 0;
+ if y > 0 then begin
+ while x < 268435456 do begin
+ x := x + x;
+ y := y + y
+ end; {143:}
+ k := 0;
+ repeat
+ y := y + y;
+ k := k + 1;
+ if y > x then begin
+ z := z + specatan[k];
+ t := x;
+ x := x + (y div twotothe[k + k]);
+ y := y - t
+ end
+ until k = 15;
+ repeat
+ y := y + y;
+ k := k + 1;
+ if y > x then begin
+ z := z + specatan[k];
+ y := y - x
+ end
+ until k = 26 {:143}
+ end {:142}; {141:}
+ case octant of
+ 1:
+ narg := z;
+ 5:
+ narg := 94371840 - z;
+ 6:
+ narg := 94371840 + z;
+ 2:
+ narg := 188743680 - z;
+ 4:
+ narg := z - 188743680;
+ 8:
+ narg := (-z) - 94371840;
+ 7:
+ narg := z - 94371840;
+ 3:
+ narg := -z
+ end {:141}
+ end
+ end; {:139} {145:}
+
+ procedure nsincos(z: angle);
+ var
+ k: smallnumber;
+ q: 0..7;
+ r: fraction;
+ x, y, t: integer;
+ begin
+ while z < 0 do
+ z := z + 377487360;
+ z := z mod 377487360;
+ q := z div 47185920;
+ z := z mod 47185920;
+ x := 268435456;
+ y := x;
+ if not odd(q) then
+ z := 47185920 - z; {147:}
+ k := 1;
+ while z > 0 do begin
+ if z >= specatan[k] then begin
+ z := z - specatan[k];
+ t := x;
+ x := t + (y div twotothe[k]);
+ y := y - (t div twotothe[k])
+ end;
+ k := k + 1
+ end;
+ if y < 0 then
+ y := 0 {:147}; {146:}
+ case q of
+ 0:
+ null;
+ 1:
+ begin
+ t := x;
+ x := y;
+ y := t
+ end;
+ 2:
+ begin
+ t := x;
+ x := -y;
+ y := t
+ end;
+ 3:
+ x := -x;
+ 4:
+ begin
+ x := -x;
+ y := -y
+ end;
+ 5:
+ begin
+ t := x;
+ x := -y;
+ y := -t
+ end;
+ 6:
+ begin
+ t := x;
+ x := y;
+ y := -t
+ end;
+ 7:
+ y := -y
+ end {:146};
+ r := pythadd(x, y);
+ ncos := makefraction(x, r);
+ nsin := makefraction(y, r)
+ end; {:145} {149:}
+
+ procedure newrandoms;
+ var
+ k: 0..54;
+ x: fraction;
+ begin
+ for k := 0 to 23 do begin
+ x := randoms[k] - randoms[k + 31];
+ if x < 0 then
+ x := x + 268435456;
+ randoms[k] := x
+ end;
+ for k := 24 to 54 do begin
+ x := randoms[k] - randoms[k - 24];
+ if x < 0 then
+ x := x + 268435456;
+ randoms[k] := x
+ end;
+ jrandom := 54
+ end; {:149}
+{150:}
+
+ procedure initrandoms(seed: scaled);
+ var
+ j, jj, k: fraction;
+ i: 0..54;
+ begin
+ j := abs(seed);
+ while j >= 268435456 do
+ j := j div 2;
+ k := 1;
+ for i := 0 to 54 do begin
+ jj := k;
+ k := j - k;
+ j := jj;
+ if k < 0 then
+ k := k + 268435456;
+ randoms[(i * 21) mod 55] := j
+ end;
+ newrandoms;
+ newrandoms;
+ newrandoms
+ end; {:150}
+{151:}
+
+ function unifrand(x: scaled): scaled;
+ var
+ y: scaled;
+ begin
+ if jrandom = 0 then
+ newrandoms
+ else
+ jrandom := jrandom - 1;
+ y := takefraction(abs(x), randoms[jrandom]);
+ if y = abs(x) then
+ unifrand := 0
+ else if x > 0 then
+ unifrand := y
+ else
+ unifrand := -y
+ end; {:151} {152:}
+
+ function normrand: scaled;
+ var
+ x, u, l: integer;
+ begin
+ repeat
+ repeat
+ if jrandom = 0 then
+ newrandoms
+ else
+ jrandom := jrandom - 1;
+ x := takefraction(112429, randoms[jrandom] - 134217728);
+ if jrandom = 0 then
+ newrandoms
+ else
+ jrandom := jrandom - 1;
+ u := randoms[jrandom]
+ until abs(x) < u;
+ x := makefraction(x, u);
+ l := 139548960 - mlog(u)
+ until abvscd(1024, l, x, x) >= 0;
+ normrand := x
+ end; {:152}
+{157:}
+ {procedure printword(w:memoryword);begin printint(w.int);
+ printchar(32);printscaled(w.int);printchar(32);
+ printscaled(w.int div 4096);println;printint(w.hh.lh);printchar(61);
+ printint(w.hh.b0);printchar(58);printint(w.hh.b1);printchar(59);
+ printint(w.hh.rh);printchar(32);printint(w.qqqq.b0);printchar(58);
+ printint(w.qqqq.b1);printchar(58);printint(w.qqqq.b2);printchar(58);
+ printint(w.qqqq.b3);end;}
+ {:157}
+ {162:}
+ {217:}
+
+ procedure printcapsule;
+ forward;
+
+ procedure showtokenlist(p, q: integer; l, nulltally: integer);
+ label
+ 10;
+ var
+ class, c: smallnumber;
+ r, v: integer;
+ begin
+ class := 3;
+ tally := nulltally;
+ while (p <> (-30000)) and (tally < l) do begin
+ if p = q then begin {646:}
+ firstcount := tally;
+ trickcount := ((tally + 1) + errorline) - halferrorline;
+ if trickcount < errorline then
+ trickcount := errorline
+ end {:646}; {218:}
+ c := 9;
+ if (p < (-30000)) or (p > memend) then begin
+ print(360);
+ goto 10
+ end;
+ if p < himemmin then {219:}
+ if mem[p].hh.b1 = 12 then
+ if mem[p].hh.b0 = 16 then begin {220:}
+ if class = 0 then
+ printchar(32);
+ v := mem[p + 1].int;
+ if v < 0 then begin
+ if class = 17 then
+ printchar(32);
+ printchar(91);
+ printscaled(v);
+ printchar(93);
+ c := 18
+ end else begin
+ printscaled(v);
+ c := 0
+ end
+ end else if mem[p].hh.b0 <> 4 then {:220}
+ print(363)
+ else begin
+ printchar(34);
+ slowprint(mem[p + 1].int);
+ printchar(34);
+ c := 4
+ end
+ else if ((mem[p].hh.b1 <> 11) or (mem[p].hh.b0 < 1)) or (mem[p].hh.b0 > 19) then
+ print(363)
+ else begin
+ gpointer := p;
+ printcapsule;
+ c := 8
+ end {:219}
+ else begin
+ r := mem[p].hh.lh;
+ if r >= 2242 then begin {222:}
+ if r < 2392 then begin
+ print(365);
+ r := r - 2242
+ end else if r < 2542 then begin
+ print(366);
+ r := r - 2392
+ end else begin
+ print(367);
+ r := r - 2542
+ end;
+ printint(r);
+ printchar(41);
+ c := 8
+ end else if r < 1 then {:222}
+ if r = 0 then begin {221:}
+ if class = 17 then
+ printchar(32);
+ print(364);
+ c := 18
+ end else {:221}
+ print(361)
+ else begin
+ r := hash[r].rh;
+ if (r < 0) or (r >= strptr) then
+ print(362) {223:}
+ else begin
+ c := charclass[strpool[strstart[r]]];
+ if c = class then
+ if c in
+ [9, 5, 6, 7, 8] then
+ case c of
+ 9:
+ printchar(46);
+ 5, 6, 7, 8:
+ null
+ end
+ else
+ printchar(32);
+ print(r)
+ end {:223}
+ end
+ end {:218};
+ class := c;
+ p := mem[p].hh.rh
+ end;
+ if p <> (-30000) then
+ print(359);
+ 10:
+ null
+ end; {:217} {665:}
+
+ procedure runaway;
+ begin
+ if scannerstatus > 2 then begin
+ printnl(503);
+ case scannerstatus of
+ 3:
+ print(504);
+ 4, 5:
+ print(505);
+ 6:
+ print(506)
+ end;
+ println;
+ showtokenlist(mem[29998].hh.rh, -30000, errorline - 10, 0)
+ end
+ end; { runaway }
+{:665}
+ {:162}
+ {163:}
+
+ function getavail: halfword;
+ var
+ p: halfword;
+ begin
+ p := avail;
+ if p <> (-30000) then
+ avail := mem[avail].hh.rh
+ else if memend < memmax then begin
+ memend := memend + 1;
+ p := memend
+ end else begin
+ himemmin := himemmin - 1;
+ p := himemmin;
+ if himemmin <= lomemmax then begin
+ runaway;
+ overflow(186, memmax + 30001)
+ end
+ end;
+ mem[p].hh.rh := -30000;
+{dynused:=dynused+1;}
+ getavail := p
+ end; {:163} {167:}
+
+ function getnode(s: integer): halfword;
+ label
+ 40, 10, 20;
+ var
+ p: halfword;
+ q: halfword;
+ r: integer;
+ t, tt: integer;
+ begin
+ 20:
+ p := rover; {169:}
+ repeat
+ q := p + mem[p].hh.lh;
+ while mem[q].hh.rh = 32767 do begin
+ t := mem[q + 1].hh.rh;
+ tt := mem[q + 1].hh.lh;
+ if q = rover then
+ rover := t;
+ mem[t + 1].hh.lh := tt;
+ mem[tt + 1].hh.rh := t;
+ q := q + mem[q].hh.lh
+ end;
+ r := q - s;
+ if r > (p + 1) then begin {170:}
+ mem[p].hh.lh := r - p;
+ rover := p;
+ goto 40
+ end {:170};
+ {171
+ :}
+ if r = p then
+ if (mem[p + 1].hh.rh <> rover) or (mem[p + 1].hh.lh <> rover) then begin
+ rover := mem[p + 1].hh.rh;
+ t := mem[p + 1].hh.lh;
+ mem[rover + 1].hh.lh := t;
+ mem[t + 1].hh.rh := rover;
+ goto 40
+ end {:171};
+ mem[p].hh.lh := q - p {:169};
+ p := mem[p + 1].hh.rh
+ until p = rover;
+ if s = 1073741824 then begin
+ getnode := 32767;
+ goto 10
+ end;
+ if (lomemmax + 2) < himemmin then
+ if (lomemmax + 2) <= 2767 then begin {168:}
+ if (lomemmax + 1000) < himemmin then
+ t := lomemmax + 1000
+ else
+ t := ((lomemmax + himemmin) + 2) div 2;
+ if t > 2767 then
+ t := 2767;
+ p := mem[rover + 1].hh.lh;
+ q := lomemmax;
+ mem[p + 1].hh.rh := q;
+ mem[rover + 1].hh.lh := q;
+ mem[q + 1].hh.rh := rover;
+ mem[q + 1].hh.lh := p;
+ mem[q].hh.rh := 32767;
+ mem[q].hh.lh := t - lomemmax;
+ lomemmax := t;
+ mem[lomemmax].hh.rh := -30000;
+ mem[lomemmax].hh.lh := -30000;
+ rover := q;
+ goto 20
+ end {:168};
+ overflow(186, memmax + 30001);
+ 40:
+ mem[r].hh.rh := -30000; {varused:=varused+s;}
+ getnode := r;
+ 10:
+ null
+ end; {:167} {172:}
+
+ procedure freenode(p: halfword; s: halfword);
+ var
+ q: halfword;
+ begin
+ mem[p].hh.lh := s;
+ mem[p].hh.rh := 32767;
+ q := mem[rover + 1].hh.lh;
+ mem[p + 1].hh.lh := q;
+ mem[p + 1].hh.rh := rover;
+ mem[rover + 1].hh.lh := p;
+ mem[q + 1].hh.rh := p
+ end; {varused:=varused-s;} {:172}
+{173:}
+ {procedure sortavail;var p,q,r:halfword;oldrover:halfword;
+ begin p:=getnode(1073741824);p:=mem[rover+1].hh.rh;
+ mem[rover+1].hh.rh:=32767;oldrover:=rover;
+ while p<>oldrover do[174:]if p<rover then begin q:=p;p:=mem[q+1].hh.rh;
+ mem[q+1].hh.rh:=rover;rover:=q;end else begin q:=rover;
+ while mem[q+1].hh.rh<p do q:=mem[q+1].hh.rh;r:=mem[p+1].hh.rh;
+ mem[p+1].hh.rh:=mem[q+1].hh.rh;mem[q+1].hh.rh:=p;p:=r;end[:174];
+ p:=rover;
+ while mem[p+1].hh.rh<>32767 do begin mem[mem[p+1].hh.rh+1].hh.lh:=p;
+ p:=mem[p+1].hh.rh;end;mem[p+1].hh.rh:=rover;mem[rover+1].hh.lh:=p;end;}
+{:173}
+ {177:}
+
+ procedure flushlist(p: halfword);
+ label
+ 30;
+ var
+ q, r: halfword;
+ begin
+ if p >= himemmin then
+ if p <> 30000 then begin
+ r := p;
+ repeat
+ q := r;
+ r := mem[r].hh.rh; {dynused:=dynused-1;}
+ if r < himemmin then
+ goto 30
+ until r = 30000;
+ 30:
+ mem[q].hh.rh := avail;
+ avail := p
+ end
+ end; { flushlist }
+
+ procedure flushnodelist(p: halfword);
+ var
+ q: halfword;
+ begin
+ while p <> (-30000) do begin
+ q := p;
+ p := mem[p].hh.rh;
+ if q < himemmin then
+ freenode(q, 2)
+ else begin
+ mem[q].hh.rh := avail;
+ avail := q
+ end
+{dynused:=dynused-1;}
+ end
+ end; {:177} {180:}
+{procedure checkmem(printlocs:boolean);label 31,32;var p,q,r:halfword;
+clobbered:boolean;begin for p:=-30000 to lomemmax do freearr[p]:=false;
+for p:=himemmin to memend do freearr[p]:=false;[181:]p:=avail;q:=-30000;
+clobbered:=false;
+while p<>-30000 do begin if(p>memend)or(p<himemmin)then clobbered:=true
+else if freearr[p]then clobbered:=true;
+if clobbered then begin printnl(187);printint(q);goto 31;end;
+freearr[p]:=true;q:=p;p:=mem[q].hh.rh;end;31:[:181];[182:]p:=rover;
+q:=-30000;clobbered:=false;
+repeat if(p>=lomemmax)or(p<-30000)then clobbered:=true else if(mem[p+1].
+hh.rh>=lomemmax)or(mem[p+1].hh.rh<-30000)then clobbered:=true else if
+not((mem[p].hh.rh=32767))or(mem[p].hh.lh<2)or(p+mem[p].hh.lh>lomemmax)or
+(mem[mem[p+1].hh.rh+1].hh.lh<>p)then clobbered:=true;
+if clobbered then begin printnl(188);printint(q);goto 32;end;
+for q:=p to p+mem[p].hh.lh-1 do begin if freearr[q]then begin printnl(
+189);printint(q);goto 32;end;freearr[q]:=true;end;q:=p;
+p:=mem[p+1].hh.rh;until p=rover;32:[:182];[183:]p:=-30000;
+while p<=lomemmax do begin if(mem[p].hh.rh=32767)then begin printnl(190)
+;printint(p);end;while(p<=lomemmax)and not freearr[p]do p:=p+1;
+while(p<=lomemmax)and freearr[p]do p:=p+1;end[:183];[617:]q:=-29987;
+p:=mem[q].hh.rh;
+while p<>-29987 do begin if mem[p+1].hh.lh<>q then begin printnl(463);
+printint(p);end;p:=mem[p+1].hh.rh;r:=himemmin;
+repeat if mem[p].hh.lh>=r then begin printnl(464);printint(p);end;
+r:=mem[p].hh.lh;q:=p;p:=mem[q].hh.rh;until r=-30000;end[:617];
+if printlocs then[184:]begin printnl(191);
+for p:=-30000 to lomemmax do if not freearr[p]and((p>waslomax)or wasfree
+[p])then begin printchar(32);printint(p);end;
+for p:=himemmin to memend do if not freearr[p]and((p<washimin)or(p>
+wasmemend)or wasfree[p])then begin printchar(32);printint(p);end;
+end[:184];for p:=-30000 to lomemmax do wasfree[p]:=freearr[p];
+for p:=himemmin to memend do wasfree[p]:=freearr[p];wasmemend:=memend;
+waslomax:=lomemmax;washimin:=himemmin;end;}
+ {:180}
+ {185:}
+{procedure searchmem(p:halfword);var q:integer;
+begin for q:=-30000 to lomemmax do begin if mem[q].hh.rh=p then begin
+printnl(192);printint(q);printchar(41);end;
+if mem[q].hh.lh=p then begin printnl(193);printint(q);printchar(41);end;
+end;
+for q:=himemmin to memend do begin if mem[q].hh.rh=p then begin printnl(
+192);printint(q);printchar(41);end;
+if mem[q].hh.lh=p then begin printnl(193);printint(q);printchar(41);end;
+end;
+[209:]for q:=1 to 2241 do begin if eqtb[q].rh=p then begin printnl(328);
+printint(q);printchar(41);end;end[:209];end;}
+ {:185}
+ {189:}
+
+ procedure printop(c: quarterword);
+ begin
+ if c <= 15 then
+ printtype(c)
+ else
+ if c in
+ [30, 31, 32, 33, 34, 35, 36, 37,
+ 38, 39, 40, 41, 42, 43, 44, 45,
+ 46, 47, 48, 49, 50, 51, 52, 53,
+ 54, 55, 56, 57, 58, 59, 60, 61,
+ 62, 63, 64, 65, 66, 67, 68, 69,
+ 70, 71, 72, 73, 74, 75, 76, 77,
+ 78, 79, 80, 81, 82, 83, 84, 85,
+ 86, 87, 88, 89, 90, 91, 92, 94,
+ 95, 96, 97, 98, 99, 100] then
+ case c of
+ 30:
+ print(218);
+ 31:
+ print(219);
+ 32:
+ print(220);
+ 33:
+ print(221);
+ 34:
+ print(222);
+ 35:
+ print(223);
+ 36:
+ print(224);
+ 37:
+ print(225);
+ 38:
+ print(226);
+ 39:
+ print(227);
+ 40:
+ print(228);
+ 41:
+ print(229);
+ 42:
+ print(230);
+ 43:
+ print(231);
+ 44:
+ print(232);
+ 45:
+ print(233);
+ 46:
+ print(234);
+ 47:
+ print(235);
+ 48:
+ print(236);
+ 49:
+ print(237);
+ 50:
+ print(238);
+ 51:
+ print(239);
+ 52:
+ print(240);
+ 53:
+ print(241);
+ 54:
+ print(242);
+ 55:
+ print(243);
+ 56:
+ print(244);
+ 57:
+ print(245);
+ 58:
+ print(246);
+ 59:
+ print(247);
+ 60:
+ print(248);
+ 61:
+ print(249);
+ 62:
+ print(250);
+ 63:
+ print(251);
+ 64:
+ print(252);
+ 65:
+ print(253);
+ 66:
+ print(254);
+ 67:
+ print(255);
+ 68:
+ print(256);
+ 69:
+ printchar(43);
+ 70:
+ printchar(45);
+ 71:
+ printchar(42);
+ 72:
+ printchar(47);
+ 73:
+ print(257);
+ 74:
+ print(181);
+ 75:
+ print(258);
+ 76:
+ print(259);
+ 77:
+ printchar(60);
+ 78:
+ print(260);
+ 79:
+ printchar(62);
+ 80:
+ print(261);
+ 81:
+ printchar(61);
+ 82:
+ print(262);
+ 83:
+ print(38);
+ 84:
+ print(263);
+ 85:
+ print(264);
+ 86:
+ print(265);
+ 87:
+ print(266);
+ 88:
+ print(267);
+ 89:
+ print(268);
+ 90:
+ print(269);
+ 91:
+ print(270);
+ 92:
+ print(271);
+ 94:
+ print(272);
+ 95:
+ print(273);
+ 96:
+ print(274);
+ 97:
+ print(275);
+ 98:
+ print(276);
+ 99:
+ print(277);
+ 100:
+ print(278)
+ end
+ else
+ print(279)
+ end; { printop }
+{:189}
+ {194:}
+
+ procedure fixdateandtime;
+ begin
+ dateandtime(internal[17], internal[16], internal[15], internal[14]);
+ internal[17] := internal[17] * 65536;
+ internal[16] := internal[16] * 65536;
+ internal[15] := internal[15] * 65536;
+ internal[14] := internal[14] * 65536;
+ {----------------------------------}
+ lastyearval := internal[14];
+ lastmonthval:= internal[15];
+ {----------------------------------}
+ end; { fixdateandtime }
+{:194}
+ {205:}
+
+ function idlookup(j, l: integer): halfword;
+ label
+ 40;
+ var
+ h: integer;
+ p: halfword;
+ k: halfword;
+ begin
+ if l = 1 then begin {206:}
+ p := buffer[j] + 1;
+ hash[p].rh := p - 1;
+ goto 40
+ end {:206}; {208:}
+ h := buffer[j];
+ for k := j + 1 to (j + l) - 1 do begin
+ h := (h + h) + buffer[k];
+ while h >= 1777 do
+ h := h - 1777
+ end {:208};
+ p := h + 129;
+ while true do begin
+ if hash[p].rh > 0 then
+ if (strstart[hash[p].rh + 1] - strstart[hash[p].rh]) = l then
+ if streqbuf(hash[p].rh, j) then
+ goto 40;
+ if hash[p].lh = 0 then begin {207:}
+ if hash[p].rh > 0 then begin
+ repeat
+ if hashused = 1 then
+ overflow(327, 2100);
+ hashused := hashused - 1
+ until hash[hashused].rh = 0;
+ hash[p].lh := hashused;
+ p := hashused
+ end;
+ begin
+ if (poolptr + l) > maxpoolptr then begin
+ if (poolptr + l) > poolsize then
+ overflow(129, poolsize - initpoolptr);
+ maxpoolptr := poolptr + l
+ end
+ end;
+ for k := j to (j + l) - 1 do begin
+ strpool[poolptr] := buffer[k];
+ poolptr := poolptr + 1
+ end;
+ hash[p].rh := makestring;
+ strref[hash[p].rh] := 127;
+{stcount:=stcount+1;}
+ goto 40
+ end {:207};
+ p := hash[p].lh
+ end;
+ 40:
+ idlookup := p
+ end; {:205} {210:}
+ {procedure primitive(s:strnumber;c:halfword;o:halfword);
+ var k:poolpointer;j:smallnumber;l:smallnumber;begin k:=strstart[s];
+ l:=strstart[s+1]-k;for j:=0 to l-1 do buffer[j]:=strpool[k+j];
+ cursym:=idlookup(0,l);if s>=128 then begin flushstring(strptr-1);
+ hash[cursym].rh:=s;end;eqtb[cursym].lh:=c;eqtb[cursym].rh:=o;end;}
+ {:210}
+{215:}
+
+ function newnumtok(v: scaled): halfword;
+ var
+ p: halfword;
+ begin
+ p := getnode(2);
+ mem[p + 1].int := v;
+ mem[p].hh.b0 := 16;
+ mem[p].hh.b1 := 12;
+ newnumtok := p
+ end; {:215} {216:}
+
+ procedure tokenrecycle;
+ forward;
+
+ procedure flushtokenlist(p: halfword);
+ var
+ q: halfword;
+ begin
+ while p <> (-30000) do begin
+ q := p;
+ p := mem[p].hh.rh;
+ if q >= himemmin then begin
+ mem[q].hh.rh := avail;
+ avail := q
+ end else begin
+{dynused:=dynused-1;}
+ if mem[q].hh.b0 in
+ [1, 2, 16, 4, 3, 5, 7, 12,
+ 10, 6, 9, 8, 11, 14, 13, 17,
+ 18, 19] then
+ case mem[q].hh.b0 of
+ 1, 2, 16:
+ null;
+ 4:
+ begin
+ if strref[mem[q + 1].int] < 127 then
+ if strref[mem[q + 1].int] > 1 then
+ strref[mem[q + 1].int] := strref[mem[q + 1].int] - 1
+ else
+ flushstring(mem[q + 1].int)
+ end;
+ 3, 5, 7, 12, 10, 6, 9,
+ 8, 11, 14, 13, 17, 18, 19:
+ begin
+ gpointer := q;
+ tokenrecycle
+ end
+ end
+ else
+ confusion(358);
+ freenode(q, 2)
+ end
+ end
+ end; { flushtokenlist }
+{:216}
+ {226:}
+
+ procedure deletemacref(p: halfword);
+ begin
+ if mem[p].hh.lh = (-30000) then
+ flushtokenlist(p)
+ else
+ mem[p].hh.lh := mem[p].hh.lh - 1
+ end; {:226} {227:} {625:}
+
+ procedure printcmdmod(c, m: integer);
+ begin
+ if c in
+ [18, 77, 59, 72, 32, 78, 79, 57,
+ 19, 60, 27, 11, 81, 26, 6, 9,
+ 70, 73, 13, 46, 63, 14, 15, 69,
+ 28, 47, 24, 7, 65, 64, 12, 8,
+ 80, 17, 74, 35, 58, 71, 75, 16,
+ 4, 61, 56, 3, 1, 2, 33, 34,
+ 37, 55, 45, 50, 36, 43, 54, 48,
+ 51, 52, 30, 82, 23, 21, 22, 31,
+ 62, 41, 10, 53, 44, 49, 5, 40,
+ 68, 66, 67, 25, 20, 76, 29] then
+ case c of {212:}
+ 18:
+ print(330);
+ 77:
+ print(329);
+ 59:
+ print(332);
+ 72:
+ print(331);
+ 32:
+ print(333);
+ 78:
+ print(58);
+ 79:
+ print(44);
+ 57:
+ print(334);
+ 19:
+ print(335);
+ 60:
+ print(336);
+ 27:
+ print(337);
+ 11:
+ print(338);
+ 81:
+ print(323);
+ 26:
+ print(339);
+ 6:
+ print(340);
+ 9:
+ print(341);
+ 70:
+ print(342);
+ 73:
+ print(343);
+ 13:
+ print(344);
+ 46:
+ print(123);
+ 63:
+ print(91);
+ 14:
+ print(345);
+ 15:
+ print(346);
+ 69:
+ print(347);
+ 28:
+ print(348);
+ 47:
+ print(279);
+ 24:
+ print(349);
+ 7:
+ printchar(92);
+ 65:
+ print(125);
+ 64:
+ print(93);
+ 12:
+ print(350);
+ 8:
+ print(351);
+ 80:
+ print(59);
+ 17:
+ print(352);
+ 74:
+ print(353);
+ 35:
+ print(354);
+ 58:
+ print(355);
+ 71:
+ print(356);
+ 75:
+ print(357); {:212} {684:}
+ 16:
+ if m <= 2 then
+ if m = 1 then
+ print(520)
+ else if m < 1 then
+ print(324)
+ else
+ print(521)
+ else if m = 53 then
+ print(522)
+ else if m = 44 then
+ print(523)
+ else
+ print(524);
+ 4:
+ if m <= 1 then
+ if m = 1 then
+ print(527)
+ else
+ print(325)
+ else if m = 2242 then
+ print(525)
+ else
+ print(526); {:684} {689:}
+ 61:
+ if m in
+ [1, 2, 3] then
+ case m of
+ 1:
+ print(529);
+ 2:
+ printchar(64);
+ 3:
+ print(530)
+ end
+ else
+ print(528); {:689} {696:}
+ 56:
+ if m >= 2242 then
+ if m = 2242 then
+ print(541)
+ else if m = 2392 then
+ print(542)
+ else
+ print(543)
+ else if m < 2 then
+ print(544)
+ else if m = 2 then
+ print(545)
+ else
+ print(546); {:696} {710:}
+ 3:
+ if m = 0 then
+ print(556)
+ else
+ print(482);
+{:710}
+ {741:}
+ 1, 2:
+ if m in
+ [1, 2, 3] then
+ case m of
+ 1:
+ print(583);
+ 2:
+ print(322);
+ 3:
+ print(584)
+ end
+ else
+ print(585); {:741} {894:}
+ 33, 34, 37, 55, 45, 50, 36,
+ 43, 54, 48, 51, 52:
+ printop(m); {:894} {1014:}
+ 30:
+ printtype(m); {:1014} {1019:}
+ 82:
+ if m = 0 then
+ print(776)
+ else
+ print(777);
+{:1019}
+ {1025:}
+ 23:
+ if m in
+ [0, 1, 2] then
+ case m of
+ 0:
+ print(143);
+ 1:
+ print(144);
+ 2:
+ print(145)
+ end
+ else
+ print(783); {:1025} {1028:}
+ 21:
+ if m = 0 then
+ print(784)
+ else
+ print(785); {:1028} {1038:}
+ 22:
+ if m in
+ [0, 1, 2, 3] then
+ case m of
+ 0:
+ print(799);
+ 1:
+ print(800);
+ 2:
+ print(801);
+ 3:
+ print(802)
+ end
+ else
+ print(803); {:1038} {1043:}
+ 31, 62:
+ begin
+ if c = 31 then
+ print(806)
+ else
+ print(807);
+ print(808);
+ print(hash[m].rh)
+ end;
+ 41:
+ if m = (-30000) then
+ print(809)
+ else
+ print(810);
+ 10:
+ print(811);
+ 53, 44, 49:
+ begin
+ printcmdmod(16, c);
+ print(812);
+ println;
+ showtokenlist(mem[mem[m].hh.rh].hh.rh, -30000, 1000, 0)
+ end;
+ 5:
+ print(813);
+ 40:
+ print(intname[m]); {:1043} {1053:}
+ 68:
+ if m = 1 then
+ print(820)
+ else if m = 0 then
+ print(821)
+ else
+ print(822);
+ 66:
+ if m = 6 then
+ print(823)
+ else
+ print(824);
+ 67:
+ if m = 0 then
+ print(825)
+ else
+ print(826); {:1053} {1080:}
+ 25:
+ if m < 1 then
+ print(856)
+ else if m = 1 then
+ print(857)
+ else
+ print(858);
+{:1080}
+ {1102:}
+ 20:
+ if m in
+ [0, 1, 2, 3] then
+ case m of
+ 0:
+ print(868);
+ 1:
+ print(869);
+ 2:
+ print(870);
+ 3:
+ print(871)
+ end
+ else
+ print(872); {:1102} {1110:}
+ 76:
+ if m = 0 then
+ print(889)
+ else
+ print(890); {:1110} {1180:}
+ 29:
+ if m = 16 then
+ print(913)
+ else
+ print(912)
+ end
+ else {:1180}
+ print(468)
+ end; {:625}
+
+ procedure showmacro(p: halfword; q, l: integer);
+ label
+ 10;
+ var
+ r: halfword;
+ begin
+ p := mem[p].hh.rh;
+ while mem[p].hh.lh > 7 do begin
+ r := mem[p].hh.rh;
+ mem[p].hh.rh := -30000;
+ showtokenlist(p, -30000, l, 0);
+ mem[p].hh.rh := r;
+ p := r;
+ if l > 0 then
+ l := l - tally
+ else
+ goto 10
+ end;
+ tally := 0;
+ case mem[p].hh.lh of
+ 0:
+ print(368);
+ 1, 2, 3:
+ begin
+ printchar(60);
+ printcmdmod(56, mem[p].hh.lh);
+ print(369)
+ end;
+ 4:
+ print(370);
+ 5:
+ print(371);
+ 6:
+ print(372);
+ 7:
+ print(373)
+ end;
+ showtokenlist(mem[p].hh.rh, q, l - tally, 0);
+ 10:
+ null
+ end; {:227} {232:}
+
+ procedure initbignode(p: halfword);
+ var
+ q: halfword;
+ s: smallnumber;
+ begin
+ s := bignodesize[mem[p].hh.b0];
+ q := getnode(s);
+ repeat
+ s := s - 2; {586:}
+ begin
+ mem[q + s].hh.b0 := 19;
+ serialno := serialno + 64;
+ mem[(q + s) + 1].int := serialno
+ end {:586};
+ mem[q + s].hh.b1 := (s div 2) + 5;
+ mem[q + s].hh.rh := -30000
+ until s = 0;
+ mem[q].hh.rh := p;
+ mem[p + 1].int := q
+ end; { initbignode }
+{:232}
+ {233:}
+
+ function idtransform: halfword;
+ var
+ p, q, r: halfword;
+ begin
+ p := getnode(2);
+ mem[p].hh.b0 := 13;
+ mem[p].hh.b1 := 11;
+ mem[p + 1].int := -30000;
+ initbignode(p);
+ q := mem[p + 1].int;
+ r := q + 12;
+ repeat
+ r := r - 2;
+ mem[r].hh.b0 := 16;
+ mem[r + 1].int := 0
+ until r = q;
+ mem[q + 5].int := 65536;
+ mem[q + 11].int := 65536;
+ idtransform := p
+ end; {:233} {234:}
+
+ procedure newroot(x: halfword);
+ var
+ p: halfword;
+ begin
+ p := getnode(2);
+ mem[p].hh.b0 := 0;
+ mem[p].hh.b1 := 0;
+ mem[p].hh.rh := x;
+ eqtb[x].rh := p
+ end; {:234}
+{235:}
+
+ procedure printvariablename(p: halfword);
+ label
+ 40, 10;
+ var
+ q: halfword;
+ r: halfword;
+ begin
+ while mem[p].hh.b1 >= 5 do begin {237:}
+ case mem[p].hh.b1 of
+ 5:
+ printchar(120);
+ 6:
+ printchar(121);
+ 7:
+ print(376);
+ 8:
+ print(377);
+ 9:
+ print(378);
+ 10:
+ print(379);
+ 11:
+ begin
+ print(380);
+ printint(p + 30000);
+ goto 10
+ end
+ end;
+ print(381);
+ p := mem[p - (2 * (mem[p].hh.b1 - 5))].hh.rh
+ end {:237};
+ q := -30000;
+ while mem[p].hh.b1 > 1 do begin {236:}
+ if mem[p].hh.b1 = 3 then begin
+ r := newnumtok(mem[p + 2].int);
+ repeat
+ p := mem[p].hh.rh
+ until mem[p].hh.b1 = 4
+ end else if mem[p].hh.b1 = 2 then begin
+ p := mem[p].hh.rh;
+ goto 40
+ end else begin
+ if mem[p].hh.b1 <> 4 then
+ confusion(375);
+ r := getavail;
+ mem[r].hh.lh := mem[p + 2].hh.lh
+ end;
+ mem[r].hh.rh := q;
+ q := r;
+ 40:
+ p := mem[p + 2].hh.rh
+ end {:236};
+ r := getavail;
+ mem[r].hh.lh := mem[p].hh.rh;
+ mem[r].hh.rh := q;
+ if mem[p].hh.b1 = 1 then
+ print(374);
+ showtokenlist(r, -30000, 2147483647, tally);
+ flushtokenlist(r);
+ 10:
+ null
+ end; {:235}
+{238:}
+
+ function interesting(p: halfword): boolean;
+ var
+ t: smallnumber;
+ begin
+ if internal[3] > 0 then
+ interesting := true
+ else begin
+ t := mem[p].hh.b1;
+ if t >= 5 then
+ if t <> 11 then
+ t := mem[mem[p - (2 * (t - 5))].hh.rh].hh.b1;
+ interesting := t <> 11
+ end
+ end; {:238} {239:}
+
+ function newstructure(p: halfword): halfword;
+ var
+ q, r: halfword;
+ begin
+ if mem[p].hh.b1 in
+ [0, 3, 4] then
+ case mem[p].hh.b1 of
+ 0:
+ begin
+ q := mem[p].hh.rh;
+ r := getnode(2);
+ eqtb[q].rh := r
+ end;
+ 3:
+ begin {240:}
+ q := p;
+ repeat
+ q := mem[q].hh.rh
+ until mem[q].hh.b1 = 4;
+ q := mem[q + 2].hh.rh;
+ r := q + 1;
+ repeat
+ q := r;
+ r := mem[r].hh.rh
+ until r = p;
+ r := getnode(3);
+ mem[q].hh.rh := r;
+ mem[r + 2].int := mem[p + 2].int
+ end; {:240}
+ 4:
+ begin {241:}
+ q := mem[p + 2].hh.rh;
+ r := mem[q + 1].hh.lh;
+ repeat
+ q := r;
+ r := mem[r].hh.rh
+ until r = p;
+ r := getnode(3);
+ mem[q].hh.rh := r;
+ mem[r + 2] := mem[p + 2];
+ if mem[p + 2].hh.lh = 0 then begin
+ q := mem[p + 2].hh.rh + 1;
+ while mem[q].hh.rh <> p do
+ q := mem[q].hh.rh;
+ mem[q].hh.rh := r
+ end
+ end
+ end
+ else {:241}
+ confusion(382);
+ mem[r].hh.rh := mem[p].hh.rh;
+ mem[r].hh.b0 := 21;
+ mem[r].hh.b1 := mem[p].hh.b1;
+ mem[r + 1].hh.lh := p;
+ mem[p].hh.b1 := 2;
+ q := getnode(3);
+ mem[p].hh.rh := q;
+ mem[r + 1].hh.rh := q;
+ mem[q + 2].hh.rh := r;
+ mem[q].hh.b0 := 0;
+ mem[q].hh.b1 := 4;
+ mem[q].hh.rh := -29983;
+ mem[q + 2].hh.lh := 0;
+ newstructure := r
+ end; {:239} {242:}
+
+ function findvariable(t: halfword): halfword;
+ label
+ 10;
+ var
+ p, q, r, s: halfword;
+ pp, qq, rr, ss: halfword;
+ n: integer;
+ saveword: memoryword;
+ begin
+ p := mem[t].hh.lh;
+ t := mem[t].hh.rh;
+ if (eqtb[p].lh mod 83) <> 41 then begin
+ findvariable := -30000;
+ goto 10
+ end;
+ if eqtb[p].rh = (-30000) then
+ newroot(p);
+ p := eqtb[p].rh;
+ pp := p;
+ while t <> (-30000) do begin {243:}
+ if mem[pp].hh.b0 <> 21 then begin
+ if mem[pp].hh.b0 > 21 then begin
+ findvariable := -30000;
+ goto 10
+ end;
+ ss := newstructure(pp);
+ if p = pp then
+ p := ss;
+ pp := ss
+ end;
+ if mem[p].hh.b0 <> 21 then
+ p := newstructure(p) {:243};
+ if t < himemmin then begin {244:}
+ n := mem[t + 1].int;
+ pp := mem[mem[pp + 1].hh.lh].hh.rh;
+ q := mem[mem[p + 1].hh.lh].hh.rh;
+ saveword := mem[q + 2];
+ mem[q + 2].int := 2147483647;
+ s := p + 1;
+ repeat
+ r := s;
+ s := mem[s].hh.rh
+ until n <= mem[s + 2].int;
+ if n = mem[s + 2].int then
+ p := s
+ else begin
+ p := getnode(3);
+ mem[r].hh.rh := p;
+ mem[p].hh.rh := s;
+ mem[p + 2].int := n;
+ mem[p].hh.b1 := 3;
+ mem[p].hh.b0 := 0
+ end;
+ mem[q + 2] := saveword
+ end else begin {:244} {245:}
+ n := mem[t].hh.lh;
+ ss := mem[pp + 1].hh.lh;
+ repeat
+ rr := ss;
+ ss := mem[ss].hh.rh
+ until n <= mem[ss + 2].hh.lh;
+ if n < mem[ss + 2].hh.lh then begin
+ qq := getnode(3);
+ mem[rr].hh.rh := qq;
+ mem[qq].hh.rh := ss;
+ mem[qq + 2].hh.lh := n;
+ mem[qq].hh.b1 := 4;
+ mem[qq].hh.b0 := 0;
+ mem[qq + 2].hh.rh := pp;
+ ss := qq
+ end;
+ if p = pp then begin
+ p := ss;
+ pp := ss
+ end else begin
+ pp := ss;
+ s := mem[p + 1].hh.lh;
+ repeat
+ r := s;
+ s := mem[s].hh.rh
+ until n <= mem[s + 2].hh.lh;
+ if n = mem[s + 2].hh.lh then
+ p := s
+ else begin
+ q := getnode(3);
+ mem[r].hh.rh := q;
+ mem[q].hh.rh := s;
+ mem[q + 2].hh.lh := n;
+ mem[q].hh.b1 := 4;
+ mem[q].hh.b0 := 0;
+ mem[q + 2].hh.rh := p;
+ p := q
+ end
+ end
+ end {:245};
+ t := mem[t].hh.rh
+ end;
+ if mem[pp].hh.b0 >= 21 then
+ if mem[pp].hh.b0 = 21 then
+ pp := mem[pp + 1].hh.lh
+ else begin
+ findvariable := -30000;
+ goto 10
+ end;
+ if mem[p].hh.b0 = 21 then
+ p := mem[p + 1].hh.lh;
+ if mem[p].hh.b0 = 0 then begin
+ if mem[pp].hh.b0 = 0 then begin
+ mem[pp].hh.b0 := 15;
+ mem[pp + 1].int := -30000
+ end;
+ mem[p].hh.b0 := mem[pp].hh.b0;
+ mem[p + 1].int := -30000
+ end;
+ findvariable := p;
+ 10:
+ null
+ end; {:242} {246:} {257:}
+
+ procedure printpath(h: halfword; s: strnumber; nuline: boolean);
+ label
+ 30, 31;
+ var
+ p, q: halfword;
+ begin
+ printdiagnostic(384, s, nuline);
+ println;
+ p := h;
+ repeat
+ q := mem[p].hh.rh;
+ if (p = (-30000)) or (q = (-30000)) then begin
+ printnl(131);
+ goto 30
+ end; {258:}
+ printtwo(mem[p + 1].int, mem[p + 2].int);
+ if mem[p].hh.b1 in
+ [0, 1, 4, 3, 2] then
+ case mem[p].hh.b1 of
+ 0:
+ begin
+ if mem[p].hh.b0 = 4 then
+ print(385);
+ if (mem[q].hh.b0 <> 0) or (q <> h) then
+ q := -30000;
+ goto 31
+ end;
+ 1:
+ begin {261:}
+ print(391);
+ printtwo(mem[p + 5].int, mem[p + 6].int);
+ print(390);
+ if mem[q].hh.b0 <> 1 then
+ print(392)
+ else
+ printtwo(mem[q + 3].int, mem[q + 4].int);
+ goto 31
+ end; {:261}
+ 4: {262:}
+ if (mem[p].hh.b0 <> 1) and (mem[p].hh.b0 <> 4) then
+ print(385) {:262};
+ 3, 2:
+ begin {263:}
+ if mem[p].hh.b0 = 4 then
+ print(392);
+ if mem[p].hh.b1 = 3 then begin
+ print(388);
+ printscaled(mem[p + 5].int)
+ end else begin
+ nsincos(mem[p + 5].int);
+ printchar(123);
+ printscaled(ncos);
+ printchar(44);
+ printscaled(nsin)
+ end;
+ printchar(125)
+ end
+ end
+ else {:263}
+ print(131);
+ if mem[q].hh.b0 <= 1 then
+ print(386)
+ else if (mem[p + 6].int <> 65536) or (mem[q + 4].int <> 65536) then begin {260:}
+ print(389);
+ if mem[p + 6].int < 0 then
+ print(332);
+ printscaled(abs(mem[p + 6].int));
+ if mem[p + 6].int <> mem[q + 4].int then begin
+ print(390);
+ if mem[q + 4].int < 0 then
+ print(332);
+ printscaled(abs(mem[q + 4].int))
+ end
+ end {:260};
+ 31: {:258}
+ null;
+ p := q;
+ if (p <> h) or (mem[h].hh.b0 <> 0) then begin {259:}
+ printnl(387);
+ if mem[p].hh.b0 = 2 then begin
+ nsincos(mem[p + 3].int);
+ printchar(123);
+ printscaled(ncos);
+ printchar(44);
+ printscaled(nsin);
+ printchar(125)
+ end else if mem[p].hh.b0 = 3 then begin
+ print(388);
+ printscaled(mem[p + 3].int);
+ printchar(125)
+ end
+ end {:259}
+ until p = h;
+ if mem[h].hh.b0 <> 0 then
+ print(256);
+ 30:
+ enddiagnostic(true)
+ end; {:257}
+{332:}
+ {333:}
+
+ procedure printweight(q: halfword; xoff: integer);
+ var
+ w, m: integer;
+ d: integer;
+ begin
+ d := mem[q].hh.lh + 32768;
+ w := d mod 8;
+ m := (d div 8) - mem[curedges + 3].hh.lh;
+ if fileoffset > (maxprintline - 9) then
+ printnl(32)
+ else
+ printchar(32);
+ printint(m + xoff);
+ while w > 4 do begin
+ printchar(43);
+ w := w - 1
+ end;
+ while w < 4 do begin
+ printchar(45);
+ w := w + 1
+ end
+ end; {:333}
+
+ procedure printedges(s: strnumber; nuline: boolean; xoff, yoff: integer);
+ var
+ p, q, r: halfword;
+ n: integer;
+ begin
+ printdiagnostic(399, s, nuline);
+ p := mem[curedges].hh.lh;
+ n := mem[curedges + 1].hh.rh - 4096;
+ while p <> curedges do begin
+ q := mem[p + 1].hh.lh;
+ r := mem[p + 1].hh.rh;
+ if (q > (-29999)) or (r <> 30000) then begin
+ printnl(400);
+ printint(n + yoff);
+ printchar(58);
+ while q > (-29999) do begin
+ printweight(q, xoff);
+ q := mem[q].hh.rh
+ end;
+ print(401);
+ while r <> 30000 do begin
+ printweight(r, xoff);
+ r := mem[r].hh.rh
+ end
+ end;
+ p := mem[p].hh.lh;
+ n := n - 1
+ end;
+ enddiagnostic(true)
+ end; {:332} {388:}
+
+ {---------------------------------------------------
+ procedure unskew(x, y: scaled; octant: smallnumber);
+
+ moved to mf2ps1.p
+ ---------------------------------------------------}
+
+ procedure printpen(p: halfword; s: strnumber; nuline: boolean);
+ var
+ nothingprinted: boolean;
+ k: 1..8;
+ h: halfword;
+ m, n: integer;
+ w, ww: halfword;
+ begin
+ printdiagnostic(436, s, nuline);
+ nothingprinted := true;
+ println;
+ for k := 1 to 8 do begin
+ octant := octantcode[k];
+ h := p + octant;
+ n := mem[h].hh.lh;
+ w := mem[h].hh.rh;
+ if not odd(k) then
+ w := mem[w].hh.lh;
+ for m := 1 to n + 1 do begin
+ if odd(k) then
+ ww := mem[w].hh.rh
+ else
+ ww := mem[w].hh.lh;
+ if (mem[ww + 1].int <> mem[w + 1].int) or (mem[ww + 2].int <> mem[w + 2].int) then begin {474:}
+ if nothingprinted then
+ nothingprinted := false
+ else
+ printnl(438);
+ unskew(mem[ww + 1].int, mem[ww + 2].int, octant);
+ printtwo(curx, cury)
+ end {:474};
+ w := ww
+ end
+ end;
+ if nothingprinted then begin
+ w := mem[p + 1].hh.rh;
+ printtwo(mem[w + 1].int + mem[w + 2].int, mem[w + 2].int)
+ end;
+ printnl(437);
+ enddiagnostic(true)
+ end; {:473} {589:}
+
+ procedure printdependency(p: halfword; t: smallnumber);
+ label
+ 10;
+ var
+ v: integer;
+ pp, q: halfword;
+ begin
+ pp := p;
+ while true do begin
+ v := abs(mem[p + 1].int);
+ q := mem[p].hh.lh;
+ if q = (-30000) then begin
+ if (v <> 0) or (p = pp) then begin
+ if mem[p + 1].int > 0 then
+ if p <> pp then
+ printchar(43);
+ printscaled(mem[p + 1].int)
+ end;
+ goto 10
+ end;
+{590:}
+ if mem[p + 1].int < 0 then
+ printchar(45)
+ else if p <> pp then
+ printchar(43);
+ if t = 17 then
+ v := roundfraction(v);
+ if v <> 65536 then
+ printscaled(v) {:590};
+ if mem[q].hh.b0 <> 19 then
+ confusion(454);
+ printvariablename(q);
+ v := mem[q + 1].int mod 64;
+ while v > 0 do begin
+ print(455);
+ v := v - 2
+ end;
+ p := mem[p].hh.rh
+ end;
+ 10:
+ null
+ end; {:589} {801:} {805:}
+
+ procedure printdp(t: smallnumber; p: halfword; verbosity: smallnumber);
+ var
+ q: halfword;
+ begin
+ q := mem[p].hh.rh;
+ if (mem[q].hh.lh = (-30000)) or (verbosity > 0) then
+ printdependency(p, t)
+ else
+ print(628)
+ end; {:805} {799:}
+
+ function stashcurexp: halfword;
+ var
+ p: halfword;
+ begin
+ if curtype in
+ [3, 5, 7, 12, 10, 13, 14, 17,
+ 18, 19] then
+ case curtype of
+ 3, 5, 7, 12, 10, 13, 14,
+ 17, 18, 19:
+ p := curexp
+ end
+ else
+ begin
+ p := getnode(2);
+ mem[p].hh.b1 := 11;
+ mem[p].hh.b0 := curtype;
+ mem[p + 1].int := curexp
+ end;
+ curtype := 1;
+ mem[p].hh.rh := -29999;
+ stashcurexp := p
+ end; {:799} {800:}
+
+ procedure unstashcurexp(p: halfword);
+ begin
+ curtype := mem[p].hh.b0;
+ if curtype in
+ [3, 5, 7, 12, 10, 13, 14, 17,
+ 18, 19] then
+ case curtype of
+ 3, 5, 7, 12, 10, 13, 14,
+ 17, 18, 19:
+ curexp := p
+ end
+ else
+ begin
+ curexp := mem[p + 1].int;
+ freenode(p, 2)
+ end
+ end; {:800}
+
+ procedure printexp(p: halfword; verbosity: smallnumber);
+ var
+ restorecurexp: boolean;
+ t: smallnumber;
+ v: integer;
+ q: halfword;
+ begin
+ if p <> (-30000) then
+ restorecurexp := false
+ else begin
+ p := stashcurexp;
+ restorecurexp := true
+ end;
+ t := mem[p].hh.b0;
+ if t < 17 then
+ v := mem[p + 1].int
+ else if t < 19 then
+ v := mem[p + 1].hh.rh; {802:}
+ if t in
+ [1, 2, 3, 5, 7, 12, 10, 15,
+ 4, 6, 8, 9, 11, 13, 14, 16,
+ 17, 18, 19] then
+ case t of
+ 1:
+ print(194);
+ 2:
+ if v = 30 then
+ print(218)
+ else
+ print(219);
+ 3, 5, 7, 12, 10, 15:
+ begin {806:}
+ printtype(t);
+ if v <> (-30000) then begin
+ printchar(32);
+ while (mem[v].hh.b1 = 11) and (v <> p) do
+ v := mem[v + 1].int;
+ printvariablename(v)
+ end
+ end; {:806}
+ 4:
+ begin
+ printchar(34);
+ slowprint(v);
+ printchar(34)
+ end;
+ 6, 8, 9, 11: {804:}
+ if verbosity <= 1 then
+ printtype(t)
+ else begin
+ if selector = 3 then
+ if internal[13] <= 0 then begin
+ selector := 1;
+ printtype(t);
+ print(626);
+ selector := 3
+ end;
+ case t of
+ 6:
+ printpen(v, 155, false);
+ 8:
+ printpath(v, 627, false);
+ 9:
+ printpath(v, 155, false);
+ 11:
+ begin
+ curedges := v;
+ printedges(155, false, 0, 0)
+ end
+ end
+ end {:804};
+ 13, 14:
+ if v = (-30000) then
+ printtype(t) {803:}
+ else begin
+ printchar(40);
+ q := v + bignodesize[t];
+ repeat
+ if mem[v].hh.b0 = 16 then
+ printscaled(mem[v + 1].int)
+ else if mem[v].hh.b0 = 19 then
+ printvariablename(v)
+ else
+ printdp(mem[v].hh.b0, mem[v + 1].hh.rh, verbosity);
+ v := v + 2;
+ if v <> q then
+ printchar(44)
+ until v = q;
+ printchar(41)
+ end {:803};
+ 16:
+ printscaled(v);
+ 17, 18:
+ printdp(t, v, verbosity);
+ 19:
+ printvariablename(p)
+ end
+ else
+ confusion(625) {:802};
+ if restorecurexp then
+ unstashcurexp(p)
+ end; {:801} {807:}
+
+ procedure disperr(p: halfword; s: strnumber);
+ begin
+ if interaction = 3 then
+ null;
+ printnl(629);
+ printexp(p, 1);
+ if s <> 155 then begin
+ printnl(133);
+ print(s)
+ end
+ end; {:807} {594:}
+
+ function pplusfq(p: halfword; f: integer; q: halfword; t, tt: smallnumber): halfword;
+ label
+ 30;
+ var
+ pp, qq: halfword;
+ r, s: halfword;
+ threshold: integer;
+ v: integer;
+ begin
+ if t = 17 then
+ threshold := 2685
+ else
+ threshold := 8;
+ r := 29999;
+ pp := mem[p].hh.lh;
+ qq := mem[q].hh.lh;
+ while true do
+ if pp = qq then
+ if pp = (-30000) then
+ goto 30 {595:}
+ else begin
+ if tt = 17 then
+ v := mem[p + 1].int + takefraction(f, mem[q + 1].int)
+ else
+ v := mem[p + 1].int + takescaled(f, mem[q + 1].int);
+ mem[p + 1].int := v;
+ s := p;
+ p := mem[p].hh.rh;
+ if abs(v) < threshold then
+ freenode(s, 2)
+ else begin
+ if abs(v) >= 626349397 then
+ if watchcoefs then begin
+ mem[qq].hh.b0 := 0;
+ fixneeded := true
+ end;
+ mem[r].hh.rh := s;
+ r := s
+ end;
+ pp := mem[p].hh.lh;
+ q := mem[q].hh.rh;
+ qq := mem[q].hh.lh
+ end {:595}
+ else if mem[pp + 1].int < mem[qq + 1].int then begin {596:}
+ if tt = 17 then
+ v := takefraction(f, mem[q + 1].int)
+ else
+ v := takescaled(f, mem[q + 1].int);
+ if abs(v) > (threshold div 2) then begin
+ s := getnode(2);
+ mem[s].hh.lh := qq;
+ mem[s + 1].int := v;
+ if abs(v) >= 626349397 then
+ if watchcoefs then begin
+ mem[qq].hh.b0 := 0;
+ fixneeded := true
+ end;
+ mem[r].hh.rh := s;
+ r := s
+ end;
+ q := mem[q].hh.rh;
+ qq := mem[q].hh.lh
+ end else begin {:596}
+ mem[r].hh.rh := p;
+ r := p;
+ p := mem[p].hh.rh;
+ pp := mem[p].hh.lh
+ end;
+ 30:
+ if t = 17 then
+ mem[p + 1].int := slowadd(mem[p + 1].int, takefraction(mem[q + 1].int, f))
+ else
+ mem[p + 1].int := slowadd(mem[p + 1].int, takescaled(mem[q + 1].int, f));
+ mem[r].hh.rh := p;
+ depfinal := p;
+ pplusfq := mem[29999].hh.rh
+ end; {:594}
+{600:}
+
+ function poverv(p: halfword; v: scaled; t0, t1: smallnumber): halfword;
+ var
+ r, s: halfword;
+ w: integer;
+ threshold: integer;
+ scalingdown: boolean;
+ begin
+ if t0 <> t1 then
+ scalingdown := true
+ else
+ scalingdown := false;
+ if t1 = 17 then
+ threshold := 1342
+ else
+ threshold := 4;
+ r := 29999;
+ while mem[p].hh.lh <> (-30000) do begin
+ if scalingdown then
+ if abs(v) < 524288 then
+ w := makescaled(mem[p + 1].int, v * 4096)
+ else
+ w := makescaled(roundfraction(mem[p + 1].int), v)
+ else
+ w := makescaled(mem[p + 1].int, v);
+ if abs(w) <= threshold then begin
+ s := mem[p].hh.rh;
+ freenode(p, 2);
+ p := s
+ end else begin
+ if abs(w) >= 626349397 then begin
+ fixneeded := true;
+ mem[mem[p].hh.lh].hh.b0 := 0
+ end;
+ mem[r].hh.rh := p;
+ r := p;
+ mem[p + 1].int := w;
+ p := mem[p].hh.rh
+ end
+ end;
+ mem[r].hh.rh := p;
+ mem[p + 1].int := makescaled(mem[p + 1].int, v);
+ poverv := mem[29999].hh.rh
+ end; { poverv }
+{:600}
+ {602:}
+
+ procedure valtoobig(x: scaled);
+ begin
+ if internal[40] > 0 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(456)
+ end;
+ printscaled(x);
+ printchar(41);
+ begin
+ helpptr := 4;
+ helpline[3] := 457;
+ helpline[2] := 458;
+ helpline[1] := 459;
+ helpline[0] := 460
+ end;
+ error
+ end
+ end; {:602} {603:}
+
+ procedure makeknown(p, q: halfword);
+ var
+ t: 17..18;
+ begin
+ mem[mem[q].hh.rh + 1].hh.lh := mem[p + 1].hh.lh;
+ mem[mem[p + 1].hh.lh].hh.rh := mem[q].hh.rh;
+ t := mem[p].hh.b0;
+ mem[p].hh.b0 := 16;
+ mem[p + 1].int := mem[q + 1].int;
+ freenode(q, 2);
+ if abs(mem[p + 1].int) >= 268435456 then
+ valtoobig(mem[p + 1].int);
+ if internal[2] > 0 then
+ if interesting(p) then begin
+ begindiagnostic;
+ printnl(461);
+ printvariablename(p);
+ printchar(61);
+ printscaled(mem[p + 1].int);
+ enddiagnostic(false)
+ end;
+ if curexp = p then
+ if curtype = t then begin
+ curtype := 16;
+ curexp := mem[p + 1].int;
+ freenode(p, 2)
+ end
+ end; {:603} {604:}
+
+ procedure fixdependencies;
+ label
+ 30;
+ var
+ p, q, r, s, t: halfword;
+ x: halfword;
+ begin
+ r := mem[-29987].hh.rh;
+ s := -30000;
+ while r <> (-29987) do begin
+ t := r;
+{605:}
+ r := t + 1;
+ while true do begin
+ q := mem[r].hh.rh;
+ x := mem[q].hh.lh;
+ if x = (-30000) then
+ goto 30;
+ if mem[x].hh.b0 <= 1 then begin
+ if mem[x].hh.b0 < 1 then begin
+ p := getavail;
+ mem[p].hh.rh := s;
+ s := p;
+ mem[s].hh.lh := x;
+ mem[x].hh.b0 := 1
+ end;
+ mem[q + 1].int := mem[q + 1].int div 4;
+ if mem[q + 1].int = 0 then begin
+ mem[r].hh.rh := mem[q].hh.rh;
+ freenode(q, 2);
+ q := r
+ end
+ end;
+ r := q
+ end;
+ 30: {:605}
+ null;
+ r := mem[q].hh.rh;
+ if q = mem[t + 1].hh.rh then
+ makeknown(t, q)
+ end;
+ while s <> (-30000) do begin
+ p := mem[s].hh.rh;
+ x := mem[s].hh.lh;
+ begin
+ mem[s].hh.rh := avail;
+ avail := s
+ end {dynused:=dynused-1;};
+ s := p;
+ mem[x].hh.b0 := 19;
+ mem[x + 1].int := mem[x + 1].int + 2
+ end;
+ fixneeded := false
+ end; { fixdependencies }
+{:604}
+ {268:}
+
+ procedure tossknotlist(p: halfword);
+ var
+ q: halfword;
+ r: halfword;
+ begin
+ q := p;
+ repeat
+ r := mem[q].hh.rh;
+ freenode(q, 7);
+ q := r
+ until q = p
+ end; {:268} {385:}
+
+ procedure tossedges(h: halfword);
+ var
+ p, q: halfword;
+ begin
+ q := mem[h].hh.rh;
+ while q <> h do begin
+ flushlist(mem[q + 1].hh.rh);
+ if mem[q + 1].hh.lh > (-29999) then
+ flushlist(mem[q + 1].hh.lh);
+ p := q;
+ q := mem[q].hh.rh;
+ freenode(p, 2)
+ end;
+ freenode(h, 6)
+ end; {:385} {487:}
+
+ procedure tosspen(p: halfword);
+ var
+ k: 1..8;
+ w, ww: halfword;
+ begin
+ if p <> (-29997) then begin
+ for k := 1 to 8 do begin
+ w := mem[p + k].hh.rh;
+ repeat
+ ww := mem[w].hh.rh;
+ freenode(w, 3);
+ w := ww
+ until w = mem[p + k].hh.rh
+ end;
+ freenode(p, 10)
+ end
+ end; {:487} {620:}
+
+ procedure ringdelete(p: halfword);
+ var
+ q: halfword;
+ begin
+ q := mem[p + 1].int;
+ if q <> (-30000) then
+ if q <> p then begin
+ while mem[q + 1].int <> p do
+ q := mem[q + 1].int;
+ mem[q + 1].int := mem[p + 1].int
+ end
+ end; {:620} {809:}
+
+ procedure recyclevalue(p: halfword);
+ label
+ 30;
+ var
+ t: smallnumber;
+ v: integer;
+ vv: integer;
+ q, r, s, pp: halfword;
+ begin
+ t := mem[p].hh.b0;
+ if t < 17 then
+ v := mem[p + 1].int;
+ case t of
+ 0, 1, 2, 16, 15:
+ null;
+ 3, 5, 7, 12, 10:
+ ringdelete(p);
+ 4:
+ begin
+ if strref[v] < 127 then
+ if strref[v] > 1 then
+ strref[v] := strref[v] - 1
+ else
+ flushstring(v)
+ end;
+ 6:
+ if mem[v].hh.lh = (-30000) then
+ tosspen(v)
+ else
+ mem[v].hh.lh := mem[v].hh.lh - 1;
+ 9, 8:
+ tossknotlist(v);
+ 11:
+ tossedges(v);
+ 14, 13: {810:}
+ if v <> (-30000) then begin
+ q := v + bignodesize[t];
+ repeat
+ q := q - 2;
+ recyclevalue(q)
+ until q = v;
+ freenode(v, bignodesize[t])
+ end {:810};
+ 17, 18:
+ begin {811:}
+ q := mem[p + 1].hh.rh;
+ while mem[q].hh.lh <> (-30000) do
+ q := mem[q].hh.rh;
+ mem[mem[p + 1].hh.lh].hh.rh := mem[q].hh.rh;
+ mem[mem[q].hh.rh + 1].hh.lh := mem[p + 1].hh.lh;
+ mem[q].hh.rh := -30000;
+ flushnodelist(mem[p + 1].hh.rh)
+ end; {:811}
+ 19:
+ begin {812:}
+ maxc[17] := 0;
+ maxc[18] := 0;
+ maxlink[17] := -30000;
+ maxlink[18] := -30000;
+ q := mem[-29987].hh.rh;
+ while q <> (-29987) do begin
+ s := q + 1;
+ while true do begin
+ r := mem[s].hh.rh;
+ if mem[r].hh.lh = (-30000) then
+ goto 30;
+ if mem[r].hh.lh <> p then
+ s := r
+ else begin
+ t := mem[q].hh.b0;
+ mem[s].hh.rh := mem[r].hh.rh;
+ mem[r].hh.lh := q;
+ if abs(mem[r + 1].int) > maxc[t] then begin {814:}
+ if maxc[t] > 0 then begin
+ mem[maxptr[t]].hh.rh := maxlink[t];
+ maxlink[t] := maxptr[t]
+ end;
+ maxc[t] := abs(mem[r + 1].int);
+ maxptr[t] := r
+ end else begin {:814}
+ mem[r].hh.rh := maxlink[t];
+ maxlink[t] := r
+ end
+ end
+ end;
+ 30:
+ q := mem[r].hh.rh
+ end;
+ if (maxc[17] > 0) or (maxc[18] > 0) then begin {815:}
+ if (maxc[17] >= 268435456) or ((maxc[17] div 4096) >= maxc[18]) then
+ t := 17
+ else
+ t := 18; {816:}
+ s := maxptr[t];
+ pp := mem[s].hh.lh;
+ v := mem[s + 1].int;
+ if t = 17 then
+ mem[s + 1].int := -268435456
+ else
+ mem[s + 1].int := -65536;
+ r := mem[pp + 1].hh.rh;
+ mem[s].hh.rh := r;
+ while mem[r].hh.lh <> (-30000) do
+ r := mem[r].hh.rh;
+ q := mem[r].hh.rh;
+ mem[r].hh.rh := -30000;
+ mem[q + 1].hh.lh := mem[pp + 1].hh.lh;
+ mem[mem[pp + 1].hh.lh].hh.rh := q;
+ begin
+ mem[pp].hh.b0 := 19;
+ serialno := serialno + 64;
+ mem[pp + 1].int := serialno
+ end;
+ if curexp = pp then
+ if curtype = t then
+ curtype := 19;
+ if internal[2] > 0 then {817:}
+ if interesting(p) then begin
+ begindiagnostic;
+ printnl(631);
+ if v > 0 then
+ printchar(45);
+ if t = 17 then
+ vv := roundfraction(maxc[17])
+ else
+ vv := maxc[18];
+ if vv <> 65536 then
+ printscaled(vv);
+ printvariablename(p);
+ while (mem[p + 1].int mod 64) > 0 do begin
+ print(455);
+ mem[p + 1].int := mem[p + 1].int - 2
+ end;
+ if t = 17 then
+ printchar(61)
+ else
+ print(632);
+ printdependency(s, t);
+ enddiagnostic(false)
+ end {:817} {:816};
+ t := 35 - t;
+ if maxc[t] > 0 then begin
+ mem[maxptr[t]].hh.rh := maxlink[t];
+ maxlink[t] := maxptr[t]
+ end;
+ if t <> 17 then {818:}
+ for t := 17 to 18 do begin
+ r := maxlink[t];
+ while r <> (-30000) do begin
+ q := mem[r].hh.lh;
+ mem[q + 1].hh.rh := pplusfq(mem[q + 1].hh.rh, makefraction(mem[r + 1].int, -v), s, t, 17);
+ if mem[q + 1].hh.rh = depfinal then
+ makeknown(q, depfinal);
+ q := r;
+ r := mem[r].hh.rh;
+ freenode(q, 2)
+ end
+ end {:818} {819:}
+ else
+ for t := 17 to 18 do begin
+ r := maxlink[t];
+ while r <> (-30000) do begin
+ q := mem[r].hh.lh;
+ if t = 17 then begin
+ if curexp = q then
+ if curtype = 17 then
+ curtype := 18;
+ mem[q + 1].hh.rh := poverv(mem[q + 1].hh.rh, 65536, 17, 18);
+ mem[q].hh.b0 := 18;
+ mem[r + 1].int := roundfraction(mem[r + 1].int)
+ end;
+ mem[q + 1].hh.rh := pplusfq(mem[q + 1].hh.rh, makescaled(mem[r + 1].int, -v), s, 18, 18);
+ if mem[q + 1].hh.rh = depfinal then
+ makeknown(q, depfinal);
+ q := r;
+ r := mem[r].hh.rh;
+ freenode(q, 2)
+ end
+ end {:819};
+ flushnodelist(s);
+ if fixneeded then
+ fixdependencies;
+ begin
+ if aritherror then
+ cleararith
+ end
+ end {:815}
+ end; {:812}
+ 20, 21:
+ confusion(630);
+ 22, 23:
+ deletemacref(mem[p + 1].int)
+ end;
+ mem[p].hh.b0 := 0
+ end; {:809} {808:}
+
+ procedure flushcurexp(v: scaled);
+ begin
+ if curtype in
+ [3, 5, 7, 12, 10, 13, 14, 17,
+ 18, 19, 6, 4, 8, 9, 11] then
+ case curtype of
+ 3, 5, 7, 12, 10, 13, 14,
+ 17, 18, 19:
+ begin
+ recyclevalue(curexp);
+ freenode(curexp, 2)
+ end;
+ 6:
+ if mem[curexp].hh.lh = (-30000) then
+ tosspen(curexp)
+ else
+ mem[curexp].hh.lh := mem[curexp].hh.lh - 1;
+ 4:
+ begin
+ if strref[curexp] < 127 then
+ if strref[curexp] > 1 then
+ strref[curexp] := strref[curexp] - 1
+ else
+ flushstring(curexp)
+ end;
+ 8, 9:
+ tossknotlist(curexp);
+ 11:
+ tossedges(curexp)
+ end
+ else
+ null;
+ curtype := 16;
+ curexp := v
+ end; {:808} {820:}
+
+ procedure flusherror(v: scaled);
+ begin
+ error;
+ flushcurexp(v)
+ end;
+
+ procedure backerror;
+ forward;
+
+ procedure getxnext;
+ forward;
+
+ procedure putgeterror;
+ begin
+ backerror;
+ getxnext
+ end; { putgeterror }
+
+ procedure putgetflusherror(v: scaled);
+ begin
+ putgeterror;
+ flushcurexp(v)
+ end; {:820} {247:}
+
+ procedure flushbelowvariable(p: halfword);
+ var
+ q, r: halfword;
+ begin
+ if mem[p].hh.b0 <> 21 then
+ recyclevalue(p)
+ else begin
+ q := mem[p + 1].hh.rh;
+ while mem[q].hh.b1 = 3 do begin
+ flushbelowvariable(q);
+ r := q;
+ q := mem[q].hh.rh;
+ freenode(r, 3)
+ end;
+ r := mem[p + 1].hh.lh;
+ q := mem[r].hh.rh;
+ recyclevalue(r);
+ if mem[p].hh.b1 <= 1 then
+ freenode(r, 2)
+ else
+ freenode(r, 3);
+ repeat
+ flushbelowvariable(q);
+ r := q;
+ q := mem[q].hh.rh;
+ freenode(r, 3)
+ until q = (-29983);
+ mem[p].hh.b0 := 0
+ end
+ end; {:247}
+
+ procedure flushvariable(p, t: halfword; discardsuffixes: boolean);
+ label
+ 10;
+ var
+ q, r: halfword;
+ n: halfword;
+ begin
+ while t <> (-30000) do begin
+ if mem[p].hh.b0 <> 21 then
+ goto 10;
+ n := mem[t].hh.lh;
+ t := mem[t].hh.rh;
+ if n = 0 then begin
+ r := p + 1;
+ q := mem[r].hh.rh;
+ while mem[q].hh.b1 = 3 do begin
+ flushvariable(q, t, discardsuffixes);
+ if t = (-30000) then
+ if mem[q].hh.b0 = 21 then
+ r := q
+ else begin
+ mem[r].hh.rh := mem[q].hh.rh;
+ freenode(q, 3)
+ end
+ else
+ r := q;
+ q := mem[r].hh.rh
+ end
+ end;
+ p := mem[p + 1].hh.lh;
+ repeat
+ r := p;
+ p := mem[p].hh.rh
+ until mem[p + 2].hh.lh >= n;
+ if mem[p + 2].hh.lh <> n then
+ goto 10
+ end;
+ if discardsuffixes then
+ flushbelowvariable(p)
+ else begin
+ if mem[p].hh.b0 = 21 then
+ p := mem[p + 1].hh.lh;
+ recyclevalue(p)
+ end;
+ 10:
+ null
+ end; {:246} {248:}
+
+ function undtype(p: halfword): smallnumber;
+ begin
+ case mem[p].hh.b0 of
+ 0, 1:
+ undtype := 0;
+ 2, 3:
+ undtype := 3;
+ 4, 5:
+ undtype := 5;
+ 6, 7, 8:
+ undtype := 7;
+ 9, 10:
+ undtype := 10;
+ 11, 12:
+ undtype := 12;
+ 13, 14, 15:
+ undtype := mem[p].hh.b0;
+ 16, 17, 18, 19:
+ undtype := 15
+ end
+ end; {:248}
+{249:}
+
+ procedure clearsymbol(p: halfword; saving: boolean);
+ var
+ q: halfword;
+ begin
+ q := eqtb[p].rh;
+ if eqtb[p].lh mod 83 in
+ [10, 53, 44, 49, 41] then
+ case eqtb[p].lh mod 83 of
+ 10, 53, 44, 49:
+ if not saving then
+ deletemacref(q);
+ 41:
+ if q <> (-30000) then
+ if saving then
+ mem[q].hh.b1 := 1
+ else begin
+ flushbelowvariable(q);
+ freenode(q, 2)
+ end
+ end
+ else
+ null;
+ eqtb[p] := eqtb[2241]
+ end; {:249} {252:}
+
+ procedure savevariable(q: halfword);
+ var
+ p: halfword;
+ begin
+ if saveptr <> (-30000) then begin
+ p := getnode(2);
+ mem[p].hh.lh := q;
+ mem[p].hh.rh := saveptr;
+ mem[p + 1].hh := eqtb[q];
+ saveptr := p
+ end;
+ clearsymbol(q, saveptr <> (-30000))
+ end; {:252} {253:}
+
+ procedure saveinternal(q: halfword);
+ var
+ p: halfword;
+ begin
+ if saveptr <> (-30000) then begin
+ p := getnode(2);
+ mem[p].hh.lh := 2241 + q;
+ mem[p].hh.rh := saveptr;
+ mem[p + 1].int := internal[q];
+ saveptr := p
+ end
+ end; { saveinternal }
+{:253}
+ {254:}
+
+ procedure unsave;
+ var
+ q: halfword;
+ p: halfword;
+ begin
+ while mem[saveptr].hh.lh <> 0 do begin
+ q := mem[saveptr].hh.lh;
+ if q > 2241 then begin
+ if internal[8] > 0 then begin
+ begindiagnostic;
+ printnl(383);
+ print(intname[q - 2241]);
+ printchar(61);
+ printscaled(mem[saveptr + 1].int);
+ printchar(125);
+ enddiagnostic(false)
+ end;
+ internal[q - 2241] := mem[saveptr + 1].int
+ end else begin
+ if internal[8] > 0 then begin
+ begindiagnostic;
+ printnl(383);
+ print(hash[q].rh);
+ printchar(125);
+ enddiagnostic(false)
+ end;
+ clearsymbol(q, false);
+ eqtb[q] := mem[saveptr + 1].hh;
+ if (eqtb[q].lh mod 83) = 41 then begin
+ p := eqtb[q].rh;
+ if p <> (-30000) then
+ mem[p].hh.b1 := 0
+ end
+ end;
+ p := mem[saveptr].hh.rh;
+ freenode(saveptr, 2);
+ saveptr := p
+ end;
+ p := mem[saveptr].hh.rh;
+ begin
+ mem[saveptr].hh.rh := avail;
+ avail := saveptr
+ end {dynused:=dynused-1;};
+ saveptr := p
+ end; {:254} {264:}
+
+ function copyknot(p: halfword): halfword;
+ var
+ q: halfword;
+ k: 0..6;
+ begin
+ q := getnode(7);
+ for k := 0 to 6 do
+ mem[q + k] := mem[p + k];
+ copyknot := q
+ end; {:264} {265:}
+
+ function copypath(p: halfword): halfword;
+ label
+ 10;
+ var
+ q, pp, qq: halfword;
+ begin
+ q := getnode(7);
+ qq := q;
+ pp := p;
+ while true do begin
+ mem[qq].hh.b0 := mem[pp].hh.b0;
+ mem[qq].hh.b1 := mem[pp].hh.b1;
+ mem[qq + 1].int := mem[pp + 1].int;
+ mem[qq + 2].int := mem[pp + 2].int;
+ mem[qq + 3].int := mem[pp + 3].int;
+ mem[qq + 4].int := mem[pp + 4].int;
+ mem[qq + 5].int := mem[pp + 5].int;
+ mem[qq + 6].int := mem[pp + 6].int;
+ if mem[pp].hh.rh = p then begin
+ mem[qq].hh.rh := q;
+ copypath := q;
+ goto 10
+ end;
+ mem[qq].hh.rh := getnode(7);
+ qq := mem[qq].hh.rh;
+ pp := mem[pp].hh.rh
+ end;
+ 10:
+ null
+ end; {:265} {266:}
+
+ function htapypoc(p: halfword): halfword;
+ label
+ 10;
+ var
+ q, pp, qq, rr: halfword;
+ begin
+ q := getnode(7);
+ qq := q;
+ pp := p;
+ while true do begin
+ mem[qq].hh.b1 := mem[pp].hh.b0;
+ mem[qq].hh.b0 := mem[pp].hh.b1;
+ mem[qq + 1].int := mem[pp + 1].int;
+ mem[qq + 2].int := mem[pp + 2].int;
+ mem[qq + 5].int := mem[pp + 3].int;
+ mem[qq + 6].int := mem[pp + 4].int;
+ mem[qq + 3].int := mem[pp + 5].int;
+ mem[qq + 4].int := mem[pp + 6].int;
+ if mem[pp].hh.rh = p then begin
+ mem[q].hh.rh := qq;
+ pathtail := pp;
+ htapypoc := q;
+ goto 10
+ end;
+ rr := getnode(7);
+ mem[rr].hh.rh := qq;
+ qq := rr;
+ pp := mem[pp].hh.rh
+ end;
+ 10:
+ null
+ end; {:266} {269:} {284:} {296:}
+
+ function curlratio(gamma, atension, btension: scaled): fraction;
+ var
+ alpha, beta, num, denom, ff: fraction;
+ begin
+ alpha := makefraction(65536, atension);
+ beta := makefraction(65536, btension);
+ if alpha <= beta then begin
+ ff := makefraction(alpha, beta);
+ ff := takefraction(ff, ff);
+ gamma := takefraction(gamma, ff);
+ beta := beta div 4096;
+ denom := (takefraction(gamma, alpha) + 196608) - beta;
+ num := takefraction(gamma, 805306368 - alpha) + beta
+ end else begin
+ ff := makefraction(beta, alpha);
+ ff := takefraction(ff, ff);
+ beta := takefraction(beta, ff) div 4096;
+ denom := (takefraction(gamma, alpha) + (ff div 1365)) - beta;
+ num := takefraction(gamma, 805306368 - alpha) + beta
+ end;
+ if num >= (((denom + denom) + denom) + denom) then
+ curlratio := 1073741824
+ else
+ curlratio := makefraction(num, denom)
+ end; {:296} {299:}
+
+ procedure setcontrols(p, q: halfword; k: integer);
+ var
+ rr, ss: fraction;
+ lt, rt: scaled;
+ sine: fraction;
+ begin
+ lt := abs(mem[q + 4].int);
+ rt := abs(mem[p + 6].int);
+ rr := velocity(st, ct, sf, cf, rt);
+ ss := velocity(sf, cf, st, ct, lt);
+ if (mem[p + 6].int < 0) or (mem[q + 4].int < 0) then {300:}
+ if ((st >= 0) and (sf >= 0)) or ((st <= 0) and (sf <= 0)) then begin
+ sine := takefraction(abs(st), cf) + takefraction(abs(sf), ct);
+ if sine > 0 then begin
+ sine := takefraction(sine, 268500992);
+ if mem[p + 6].int < 0 then
+ if abvscd(abs(sf), 268435456, rr, sine) < 0 then
+ rr := makefraction(abs(sf), sine);
+ if mem[q + 4].int < 0 then
+ if abvscd(abs(st), 268435456, ss, sine) < 0 then
+ ss := makefraction(abs(st), sine)
+ end
+ end {:300};
+ mem[p + 5].int := mem[p + 1].int + takefraction(takefraction(deltax[k], ct) - takefraction(deltay[k], st), rr);
+ mem[p + 6].int := mem[p + 2].int + takefraction(takefraction(deltay[k], ct) + takefraction(deltax[k], st), rr);
+ mem[q + 3].int := mem[q + 1].int - takefraction(takefraction(deltax[k], cf) + takefraction(deltay[k], sf), ss);
+ mem[q + 4].int := mem[q + 2].int - takefraction(takefraction(deltay[k], cf) - takefraction(deltax[k], sf), ss);
+ mem[p].hh.b1 := 1;
+ mem[q].hh.b0 := 1
+ end; { setcontrols }
+{:299}
+
+ procedure solvechoices(p, q: halfword; n: halfword);
+ label
+ 40, 10;
+ var
+ k: 0..pathsize;
+ r, s, t: halfword;
+ sine, cosine: fraction; {286:}
+ aa, bb, cc, ff, acc: fraction;
+ dd, ee: scaled;
+ lt, rt: scaled; {:286}
+ begin
+ k := 0;
+ s := p;
+ while true do begin
+ t := mem[s].hh.rh;
+ if k = 0 then {285:}
+ case mem[s].hh.b1 of
+ 2:
+ if mem[t].hh.b0 = 2 then begin {301:}
+ aa := narg(deltax[0], deltay[0]);
+ nsincos(mem[p + 5].int - aa);
+ ct := ncos;
+ st := nsin;
+ nsincos(mem[q + 3].int - aa);
+ cf := ncos;
+ sf := -nsin;
+ setcontrols(p, q, 0);
+ goto 10
+ end else begin {:301} {293:}
+ vv[0] := mem[s + 5].int - narg(deltax[0], deltay[0]);
+ if abs(vv[0]) > 188743680 then
+ if vv[0] > 0 then
+ vv[0] := vv[0] - 377487360
+ else
+ vv[0] := vv[0] + 377487360;
+ uu[0] := 0;
+ ww[0] := 0
+ end {:293};
+ 3:
+ if mem[t].hh.b0 = 3 then begin {302:}
+ mem[p].hh.b1 := 1;
+ mem[q].hh.b0 := 1;
+ lt := abs(mem[q + 4].int);
+ rt := abs(mem[p + 6].int);
+ if rt = 65536 then begin
+ if deltax[0] >= 0 then
+ mem[p + 5].int := mem[p + 1].int + ((deltax[0] + 1) div 3)
+ else
+ mem[p + 5].int := mem[p + 1].int + ((deltax[0] - 1) div 3);
+ if deltay[0] >= 0 then
+ mem[p + 6].int := mem[p + 2].int + ((deltay[0] + 1) div 3)
+ else
+ mem[p + 6].int := mem[p + 2].int + ((deltay[0] - 1) div 3)
+ end else begin
+ ff := makefraction(65536, 3 * rt);
+ mem[p + 5].int := mem[p + 1].int + takefraction(deltax[0], ff);
+ mem[p + 6].int := mem[p + 2].int + takefraction(deltay[0], ff)
+ end;
+ if lt = 65536 then begin
+ if deltax[0] >= 0 then
+ mem[q + 3].int := mem[q + 1].int - ((deltax[0] + 1) div 3)
+ else
+ mem[q + 3].int := mem[q + 1].int - ((deltax[0] - 1) div 3);
+ if deltay[0] >= 0 then
+ mem[q + 4].int := mem[q + 2].int - ((deltay[0] + 1) div 3)
+ else
+ mem[q + 4].int := mem[q + 2].int - ((deltay[0] - 1) div 3)
+ end else begin
+ ff := makefraction(65536, 3 * lt);
+ mem[q + 3].int := mem[q + 1].int - takefraction(deltax[0], ff);
+ mem[q + 4].int := mem[q + 2].int - takefraction(deltay[0], ff)
+ end;
+ goto 10
+ end else begin {:302} {294:}
+ cc := mem[s + 5].int;
+ lt := abs(mem[t + 4].int);
+ rt := abs(mem[s + 6].int);
+ if (rt = 65536) and (lt = 65536) then
+ uu[0] := makefraction((cc + cc) + 65536, cc + 131072)
+ else
+ uu[0] := curlratio(cc, rt, lt);
+ vv[0] := -takefraction(psi[1], uu[0]);
+ ww[0] := 0
+ end {:294};
+ 4:
+ begin
+ uu[0] := 0;
+ vv[0] := 0;
+ ww[0] := 268435456
+ end
+ end {:285}
+ else
+ case mem[s].hh.b0 of
+ 5, 4:
+ begin {287:} {288:}
+ if abs(mem[r + 6].int) = 65536 then begin
+ aa := 134217728;
+ dd := 2 * delta[k]
+ end else begin
+ aa := makefraction(65536, (3 * abs(mem[r + 6].int)) - 65536);
+ dd := takefraction(delta[k], 805306368 - makefraction(65536, abs(mem[r + 6].int)))
+ end;
+ if abs(mem[t + 4].int) = 65536 then begin
+ bb := 134217728;
+ ee := 2 * delta[k - 1]
+ end else begin
+ bb := makefraction(65536, (3 * abs(mem[t + 4].int)) - 65536);
+ ee := takefraction(delta[k - 1], 805306368 - makefraction(65536, abs(mem[t + 4].int)))
+ end;
+ cc := 268435456 - takefraction(uu[k - 1], aa) {:288}; {289:}
+ dd := takefraction(dd, cc);
+ lt := abs(mem[s + 4].int);
+ rt := abs(mem[s + 6].int);
+ if lt <> rt then
+ if lt < rt then begin
+ ff := makefraction(lt, rt);
+ ff := takefraction(ff, ff);
+ dd := takefraction(dd, ff)
+ end else begin
+ ff := makefraction(rt, lt);
+ ff := takefraction(ff, ff);
+ ee := takefraction(ee, ff)
+ end;
+ ff := makefraction(ee, ee + dd) {:289};
+ uu[k] := takefraction(ff, bb); {290:}
+ acc := -takefraction(psi[k + 1], uu[k]);
+ if mem[r].hh.b1 = 3 then begin
+ ww[k] := 0;
+ vv[k] := acc - takefraction(psi[1], 268435456 - ff)
+ end else begin
+ ff := makefraction(268435456 - ff, cc);
+ acc := acc - takefraction(psi[k], ff);
+ ff := takefraction(ff, aa);
+ vv[k] := acc - takefraction(vv[k - 1], ff);
+ if ww[k - 1] = 0 then
+ ww[k] := 0
+ else
+ ww[k] := -takefraction(ww[k - 1], ff)
+ end {:290};
+ if mem[s].hh.b0 = 5 then begin {291:}
+ aa := 0;
+ bb := 268435456;
+ repeat
+ k := k - 1;
+ if k = 0 then
+ k := n;
+ aa := vv[k] - takefraction(aa, uu[k]);
+ bb := ww[k] - takefraction(bb, uu[k])
+ until k = n;
+ aa := makefraction(aa, 268435456 - bb);
+ theta[n] := aa;
+ vv[0] := aa;
+ for k := 1 to n - 1 do
+ vv[k] := vv[k] + takefraction(aa, ww[k]);
+ goto 40
+ end {:291}
+ end; {:287}
+ 3:
+ begin {295:}
+ cc := mem[s + 3].int;
+ lt := abs(mem[s + 4].int);
+ rt := abs(mem[r + 6].int);
+ if (rt = 65536) and (lt = 65536) then
+ ff := makefraction((cc + cc) + 65536, cc + 131072)
+ else
+ ff := curlratio(cc, lt, rt);
+ theta[n] := -makefraction(takefraction(vv[n - 1], ff), 268435456 - takefraction(ff, uu[n - 1]));
+ goto 40
+ end; {:295}
+ 2:
+ begin {292:}
+ theta[n] := mem[s + 3].int - narg(deltax[n - 1], deltay[n - 1]);
+ if abs(theta[n]) > 188743680 then
+ if theta[n] > 0 then
+ theta[n] := theta[n] - 377487360
+ else
+ theta[n] := theta[n] + 377487360;
+ goto 40
+ end
+ end {:292};
+ r := s;
+ s := t;
+ k := k + 1
+ end;
+ 40: {297:}
+ for k := n - 1 downto 0 do
+ theta[k] := vv[k] - takefraction(theta[k + 1], uu[k]);
+ s := p;
+ k := 0;
+ repeat
+ t := mem[s].hh.rh;
+ nsincos(theta[k]);
+ st := nsin;
+ ct := ncos;
+ nsincos((-psi[k + 1]) - theta[k + 1]);
+ sf := nsin;
+ cf := ncos;
+ setcontrols(s, t, k);
+ k := k + 1;
+ s := t
+ until k = n {:297};
+ 10:
+ null
+ end; {:284}
+
+ procedure makechoices(knots: halfword);
+ label
+ 30;
+ var
+ h: halfword;
+ p, q: halfword; {280:}
+ k, n: 0..pathsize;
+ r, s, t: halfword;
+ delx, dely: scaled;
+ sine, cosine: fraction; {:280}
+ begin
+ begin
+ if aritherror then
+ cleararith
+ end;
+ if internal[4] > 0 then
+ printpath(knots, 393, true); {271:}
+ p := knots;
+ repeat
+ q := mem[p].hh.rh;
+ if mem[p + 1].int = mem[q + 1].int then
+ if mem[p + 2].int = mem[q + 2].int then
+ if mem[p].hh.b1 > 1 then begin
+ mem[p].hh.b1 := 1;
+ if mem[p].hh.b0 = 4 then begin
+ mem[p].hh.b0 := 3;
+ mem[p + 3].int := 65536
+ end;
+ mem[q].hh.b0 := 1;
+ if mem[q].hh.b1 = 4 then begin
+ mem[q].hh.b1 := 3;
+ mem[q + 5].int := 65536
+ end;
+ mem[p + 5].int := mem[p + 1].int;
+ mem[q + 3].int := mem[p + 1].int;
+ mem[p + 6].int := mem[p + 2].int;
+ mem[q + 4].int := mem[p + 2].int
+ end;
+ p := q
+ until p = knots {:271}; {272:}
+ h := knots;
+ while true do begin
+ if mem[h].hh.b0 <> 4 then
+ goto 30;
+ if mem[h].hh.b1 <> 4 then
+ goto 30;
+ h := mem[h].hh.rh;
+ if h = knots then begin
+ mem[h].hh.b0 := 5;
+ goto 30
+ end
+ end;
+ 30: {:272}
+ null;
+ p := h; {273:}
+ repeat
+ q := mem[p].hh.rh;
+ if mem[p].hh.b1 >= 2 then begin
+ while (mem[q].hh.b0 = 4) and (mem[q].hh.b1 = 4) do
+ q := mem[q].hh.rh; {278:} {281:}
+ k := 0;
+ s := p;
+ n := pathsize;
+ repeat
+ t := mem[s].hh.rh;
+ deltax[k] := mem[t + 1].int - mem[s + 1].int;
+ deltay[k] := mem[t + 2].int - mem[s + 2].int;
+ delta[k] := pythadd(deltax[k], deltay[k]);
+ if k > 0 then begin
+ sine := makefraction(deltay[k - 1], delta[k - 1]);
+ cosine := makefraction(deltax[k - 1], delta[k - 1]);
+ psi[k] := narg(takefraction(deltax[k], cosine) + takefraction(deltay[k], sine), takefraction(deltay[k], cosine) - takefraction(deltax[k], sine))
+ end;
+ k := k + 1;
+ s := t;
+ if k = pathsize then
+ overflow(398, pathsize);
+ if s = q then
+ n := k
+ until (k >= n) and (mem[s].hh.b0 <> 5);
+ if k = n then
+ psi[n] := 0
+ else
+ psi[k] := psi[1] {:281}; {282:}
+ if mem[q].hh.b0 = 4 then begin
+ delx := mem[q + 5].int - mem[q + 1].int;
+ dely := mem[q + 6].int - mem[q + 2].int;
+ if (delx = 0) and (dely = 0) then begin
+ mem[q].hh.b0 := 3;
+ mem[q + 3].int := 65536
+ end else begin
+ mem[q].hh.b0 := 2;
+ mem[q + 3].int := narg(delx, dely)
+ end
+ end;
+ if (mem[p].hh.b1 = 4) and (mem[p].hh.b0 = 1) then begin
+ delx := mem[p + 1].int - mem[p + 3].int;
+ dely := mem[p + 2].int - mem[p + 4].int;
+ if (delx = 0) and (dely = 0) then begin
+ mem[p].hh.b1 := 3;
+ mem[p + 5].int := 65536
+ end else begin
+ mem[p].hh.b1 := 2;
+ mem[p + 5].int := narg(delx, dely)
+ end
+ end {:282};
+ solvechoices(p, q, n) {:278}
+ end;
+ p := q {:273}
+ until p = h;
+ if internal[4] > 0 then
+ printpath(knots, 394, true);
+ if aritherror then begin {270:}
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(395)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 396;
+ helpline[0] := 397
+ end;
+ putgeterror;
+ aritherror := false
+ end {:270}
+ end; {:269} {311:}
+
+ {-------------------------------------------------------------------
+ procedure makemoves(xx0, xx1, xx2, xx3, yy0, yy1, yy2, yy3: scaled; xicorr, etacorr: smallnumber);
+
+ moved to mf2ps3.p
+ -------------------------------------------------------------------}
+
+ procedure smoothmoves(b, t: integer);
+ var
+ k: 1..movesize;
+ a, aa, aaa: integer;
+ begin
+ if (t - b) >= 3 then begin
+ k := b + 2;
+ aa := move[k - 1];
+ aaa := move[k - 2];
+ repeat
+ a := move[k];
+ if abs(a - aa) > 1 then {322:}
+ if a > aa then begin
+ if aaa >= aa then
+ if a >= move[k + 1] then begin
+ move[k - 1] := move[k - 1] + 1;
+ move[k] := a - 1
+ end
+ end else begin
+ if aaa <= aa then
+ if a <= move[k + 1] then begin
+ move[k - 1] := move[k - 1] - 1;
+ move[k] := a + 1
+ end
+ end {:322};
+ k := k + 1;
+ aaa := aa;
+ aa := a
+ until k = t
+ end
+ end; {:321} {326:}
+
+ procedure initedges(h: halfword);
+ begin
+ mem[h].hh.lh := h;
+ mem[h].hh.rh := h;
+ mem[h + 1].hh.lh := 8191;
+ mem[h + 1].hh.rh := 1;
+ mem[h + 2].hh.lh := 8191;
+ mem[h + 2].hh.rh := 1;
+ mem[h + 3].hh.lh := 4096;
+ mem[h + 3].hh.rh := 0;
+ mem[h + 4].int := 0;
+ mem[h + 5].hh.rh := h;
+ mem[h + 5].hh.lh := 0
+ end; {:326} {328:}
+
+ procedure fixoffset;
+ var
+ p, q: halfword;
+ delta: integer;
+ begin
+ delta := 8 * (mem[curedges + 3].hh.lh - 4096);
+ mem[curedges + 3].hh.lh := 4096;
+ q := mem[curedges].hh.rh;
+ while q <> curedges do begin
+ p := mem[q + 1].hh.rh;
+ while p <> 30000 do begin
+ mem[p].hh.lh := mem[p].hh.lh - delta;
+ p := mem[p].hh.rh
+ end;
+ p := mem[q + 1].hh.lh;
+ while p > (-29999) do begin
+ mem[p].hh.lh := mem[p].hh.lh - delta;
+ p := mem[p].hh.rh
+ end;
+ q := mem[q].hh.rh
+ end
+ end; {:328} {329:}
+
+ procedure edgeprep(ml, mr, nl, nr: integer);
+ var
+ delta: halfword;
+ p, q: halfword;
+ begin
+ ml := ml + 4096;
+ mr := mr + 4096;
+ nl := nl + 4096;
+ nr := nr + 4095;
+ if ml < mem[curedges + 2].hh.lh then
+ mem[curedges + 2].hh.lh := ml;
+ if mr > mem[curedges + 2].hh.rh then
+ mem[curedges + 2].hh.rh := mr;
+ if (not (abs((mem[curedges + 2].hh.lh + mem[curedges + 3].hh.lh) - 8192) < 4096)) or (not (abs((mem[curedges + 2].hh.rh + mem[curedges + 3].hh.lh) - 8192) < 4096)) then
+ fixoffset;
+ if mem[curedges].hh.rh = curedges then begin
+ mem[curedges + 1].hh.lh := nr + 1;
+ mem[curedges + 1].hh.rh := nr
+ end;
+ if nl < mem[curedges + 1].hh.lh then begin {330:}
+ delta := mem[curedges + 1].hh.lh - nl;
+ mem[curedges + 1].hh.lh := nl;
+ p := mem[curedges].hh.rh;
+ repeat
+ q := getnode(2);
+ mem[q + 1].hh.rh := 30000;
+ mem[q + 1].hh.lh := -29999;
+ mem[p].hh.lh := q;
+ mem[q].hh.rh := p;
+ p := q;
+ delta := delta - 1
+ until delta = 0;
+ mem[p].hh.lh := curedges;
+ mem[curedges].hh.rh := p;
+ if mem[curedges + 5].hh.rh = curedges then
+ mem[curedges + 5].hh.lh := nl - 1
+ end {:330};
+ if nr > mem[curedges + 1].hh.rh then begin {331:}
+ delta := nr - mem[curedges + 1].hh.rh;
+ mem[curedges + 1].hh.rh := nr;
+ p := mem[curedges].hh.lh;
+ repeat
+ q := getnode(2);
+ mem[q + 1].hh.rh := 30000;
+ mem[q + 1].hh.lh := -29999;
+ mem[p].hh.rh := q;
+ mem[q].hh.lh := p;
+ p := q;
+ delta := delta - 1
+ until delta = 0;
+ mem[p].hh.rh := curedges;
+ mem[curedges].hh.lh := p;
+ if mem[curedges + 5].hh.rh = curedges then
+ mem[curedges + 5].hh.lh := nr + 1
+ end {:331}
+ end; {:329} {334:}
+
+ function copyedges(h: halfword): halfword;
+ var
+ p, r: halfword;
+ hh, pp, qq, rr, ss: halfword;
+ begin
+ hh := getnode(6);
+ mem[hh + 1] := mem[h + 1];
+ mem[hh + 2] := mem[h + 2];
+ mem[hh + 3] := mem[h + 3];
+ mem[hh + 4] := mem[h + 4];
+ mem[hh + 5].hh.lh := mem[hh + 1].hh.rh + 1;
+ mem[hh + 5].hh.rh := hh;
+ p := mem[h].hh.rh;
+ qq := hh;
+ while p <> h do begin
+ pp := getnode(2);
+ mem[qq].hh.rh := pp;
+ mem[pp].hh.lh := qq;
+{335:}
+ r := mem[p + 1].hh.rh;
+ rr := pp + 1;
+ while r <> 30000 do begin
+ ss := getavail;
+ mem[rr].hh.rh := ss;
+ rr := ss;
+ mem[rr].hh.lh := mem[r].hh.lh;
+ r := mem[r].hh.rh
+ end;
+ mem[rr].hh.rh := 30000;
+ r := mem[p + 1].hh.lh;
+ rr := 29999;
+ while r > (-29999) do begin
+ ss := getavail;
+ mem[rr].hh.rh := ss;
+ rr := ss;
+ mem[rr].hh.lh := mem[r].hh.lh;
+ r := mem[r].hh.rh
+ end;
+ mem[rr].hh.rh := r;
+ mem[pp + 1].hh.lh := mem[29999].hh.rh {:335};
+ p := mem[p].hh.rh;
+ qq := pp
+ end;
+ mem[qq].hh.rh := hh;
+ mem[hh].hh.lh := qq;
+ copyedges := hh
+ end; {:334} {336:}
+
+ procedure yreflectedges;
+ var
+ p, q, r: halfword;
+ begin
+ p := mem[curedges + 1].hh.lh;
+ mem[curedges + 1].hh.lh := 8191 - mem[curedges + 1].hh.rh;
+ mem[curedges + 1].hh.rh := 8191 - p;
+ mem[curedges + 5].hh.lh := 8191 - mem[curedges + 5].hh.lh;
+ p := mem[curedges].hh.rh;
+ q := curedges;
+ repeat
+ r := mem[p].hh.rh;
+ mem[p].hh.rh := q;
+ mem[q].hh.lh := p;
+ q := p;
+ p := r
+ until q = curedges;
+ mem[curedges + 4].int := 0
+ end; {:336} {337:}
+
+ procedure xreflectedges;
+ var
+ p, q, r, s: halfword;
+ m: integer;
+ begin
+ p := mem[curedges + 2].hh.lh;
+ mem[curedges + 2].hh.lh := 8192 - mem[curedges + 2].hh.rh;
+ mem[curedges + 2].hh.rh := 8192 - p;
+ m := ((4096 + mem[curedges + 3].hh.lh) * 8) - 65528;
+ mem[curedges + 3].hh.lh := 4096;
+ p := mem[curedges].hh.rh; {339:}
+ repeat
+ q := mem[p + 1].hh.rh;
+ r := 30000;
+ while q <> 30000 do begin
+ s := mem[q].hh.rh;
+ mem[q].hh.rh := r;
+ r := q;
+ mem[r].hh.lh := m - mem[q].hh.lh;
+ q := s
+ end;
+ mem[p + 1].hh.rh := r {:339}; {338:}
+ q := mem[p + 1].hh.lh;
+ while q > (-29999) do begin
+ mem[q].hh.lh := m - mem[q].hh.lh;
+ q := mem[q].hh.rh
+ end {:338};
+ p := mem[p].hh.rh
+ until p = curedges;
+ mem[curedges + 4].int := 0
+ end; { xreflectedges }
+{:337}
+ {340:}
+
+ procedure yscaleedges(s: integer);
+ var
+ p, q, pp, r, rr, ss: halfword;
+ t: integer;
+ begin
+ if ((s * (mem[curedges + 1].hh.rh - 4095)) >= 4096) or ((s * (mem[curedges + 1].hh.lh - 4096)) <= (-4096)) then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(402)
+ end;
+ begin
+ helpptr := 3;
+ helpline[2] := 403;
+ helpline[1] := 404;
+ helpline[0] := 405
+ end;
+ putgeterror
+ end else begin
+ mem[curedges + 1].hh.rh := (s * (mem[curedges + 1].hh.rh - 4095)) + 4095;
+ mem[curedges + 1].hh.lh := (s * (mem[curedges + 1].hh.lh - 4096)) + 4096; {341:}
+ p := curedges;
+ repeat
+ q := p;
+ p := mem[p].hh.rh;
+ for t := 2 to s do begin
+ pp := getnode(2);
+ mem[q].hh.rh := pp;
+ mem[p].hh.lh := pp;
+ mem[pp].hh.rh := p;
+ mem[pp].hh.lh := q;
+ q := pp; {335:}
+ r := mem[p + 1].hh.rh;
+ rr := pp + 1;
+ while r <> 30000 do begin
+ ss := getavail;
+ mem[rr].hh.rh := ss;
+ rr := ss;
+ mem[rr].hh.lh := mem[r].hh.lh;
+ r := mem[r].hh.rh
+ end;
+ mem[rr].hh.rh := 30000;
+ r := mem[p + 1].hh.lh;
+ rr := 29999;
+ while r > (-29999) do begin
+ ss := getavail;
+ mem[rr].hh.rh := ss;
+ rr := ss;
+ mem[rr].hh.lh := mem[r].hh.lh;
+ r := mem[r].hh.rh
+ end;
+ mem[rr].hh.rh := r;
+ mem[pp + 1].hh.lh := mem[29999].hh.rh {:335}
+ end
+ until mem[p].hh.rh = curedges {:341};
+ mem[curedges + 4].int := 0
+ end
+ end; {:340}
+{342:}
+
+ procedure xscaleedges(s: integer);
+ var
+ p, q: halfword;
+ t: 0..65535;
+ w: 0..7;
+ delta: integer;
+ begin
+ if ((s * (mem[curedges + 2].hh.rh - 4096)) >= 4096) or ((s * (mem[curedges + 2].hh.lh - 4096)) <= (-4096)) then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(402)
+ end;
+ begin
+ helpptr := 3;
+ helpline[2] := 406;
+ helpline[1] := 404;
+ helpline[0] := 405
+ end;
+ putgeterror
+ end else if (mem[curedges + 2].hh.rh <> 4096) or (mem[curedges + 2].hh.lh <> 4096) then begin
+ mem[curedges + 2].hh.rh := (s * (mem[curedges + 2].hh.rh - 4096)) + 4096;
+ mem[curedges + 2].hh.lh := (s * (mem[curedges + 2].hh.lh - 4096)) + 4096;
+ delta := (8 * (4096 - (s * mem[curedges + 3].hh.lh))) - 32768;
+ mem[curedges + 3].hh.lh := 4096; {343:}
+ q := mem[curedges].hh.rh;
+ repeat
+ p := mem[q + 1].hh.rh;
+ while p <> 30000 do begin
+ t := mem[p].hh.lh + 32768;
+ w := t mod 8;
+ mem[p].hh.lh := (((t - w) * s) + w) + delta;
+ p := mem[p].hh.rh
+ end;
+ p := mem[q + 1].hh.lh;
+ while p > (-29999) do begin
+ t := mem[p].hh.lh + 32768;
+ w := t mod 8;
+ mem[p].hh.lh := (((t - w) * s) + w) + delta;
+ p := mem[p].hh.rh
+ end;
+ q := mem[q].hh.rh
+ until q = curedges {:343};
+ mem[curedges + 4].int := 0
+ end
+ end; { xscaleedges }
+{:342}
+ {344:}
+
+ procedure negateedges(h: halfword);
+ label
+ 30;
+ var
+ p, q, r, s, t, u: halfword;
+ begin
+ p := mem[h].hh.rh;
+ while p <> h do begin
+ q := mem[p + 1].hh.lh;
+ while q > (-29999) do begin
+ mem[q].hh.lh := (8 - (2 * ((mem[q].hh.lh + 32768) mod 8))) + mem[q].hh.lh;
+ q := mem[q].hh.rh
+ end;
+ q := mem[p + 1].hh.rh;
+ if q <> 30000 then begin
+ repeat
+ mem[q].hh.lh := (8 - (2 * ((mem[q].hh.lh + 32768) mod 8))) + mem[q].hh.lh;
+ q := mem[q].hh.rh
+ until q = 30000; {345:}
+ u := p + 1;
+ q := mem[u].hh.rh;
+ r := q;
+ s := mem[r].hh.rh;
+ while true do
+ if mem[s].hh.lh > mem[r].hh.lh then begin
+ mem[u].hh.rh := q;
+ if s = 30000 then
+ goto 30;
+ u := r;
+ q := s;
+ r := q;
+ s := mem[r].hh.rh
+ end else begin
+ t := s;
+ s := mem[t].hh.rh;
+ mem[t].hh.rh := q;
+ q := t
+ end;
+ 30:
+ mem[r].hh.rh := 30000 {:345}
+ end;
+ p := mem[p].hh.rh
+ end;
+ mem[h + 4].int := 0
+ end; {:344} {346:}
+
+ procedure sortedges(h: halfword);
+ label
+ 30;
+ var
+ k: halfword;
+ p, q, r, s: halfword;
+ begin
+ r := mem[h + 1].hh.lh;
+ mem[h + 1].hh.lh := -30000;
+ p := mem[r].hh.rh;
+ mem[r].hh.rh := 30000;
+ mem[29999].hh.rh := r;
+ while p > (-29999) do begin
+ k := mem[p].hh.lh;
+ q := 29999;
+ repeat
+ r := q;
+ q := mem[r].hh.rh
+ until k <= mem[q].hh.lh;
+ mem[r].hh.rh := p;
+ r := mem[p].hh.rh;
+ mem[p].hh.rh := q;
+ p := r
+ end; {347:}
+ begin
+ r := h + 1;
+ q := mem[r].hh.rh;
+ p := mem[29999].hh.rh;
+ while true do begin
+ k := mem[p].hh.lh;
+ while k > mem[q].hh.lh do begin
+ r := q;
+ q := mem[r].hh.rh
+ end;
+ mem[r].hh.rh := p;
+ s := mem[p].hh.rh;
+ mem[p].hh.rh := q;
+ if s = 30000 then
+ goto 30;
+ r := p;
+ p := s
+ end;
+ 30: {:347}
+ null
+ end
+ end; {:346} {348:}
+
+ procedure culledges(wlo, whi, wout, win: integer);
+ label
+ 30;
+ var
+ p, q, r, s: halfword;
+ w: integer;
+ d: integer;
+ m: integer;
+ mm: integer;
+ ww: integer;
+ prevw: integer;
+ n, minn, maxn: halfword;
+ mind, maxd: halfword;
+ begin
+ mind := 32767;
+ maxd := -32768;
+ minn := 32767;
+ maxn := -32768;
+ p := mem[curedges].hh.rh;
+ n := mem[curedges + 1].hh.lh;
+ while p <> curedges do begin
+ if mem[p + 1].hh.lh > (-29999) then
+ sortedges(p);
+ if mem[p + 1].hh.rh <> 30000 then begin {349:}
+ r := 29999;
+ q := mem[p + 1].hh.rh;
+ ww := 0;
+ m := 1000000;
+ prevw := 0;
+ while true do begin
+ if q = 30000 then
+ mm := 1000000
+ else begin
+ d := mem[q].hh.lh + 32768;
+ mm := d div 8;
+ ww := (ww + (d mod 8)) - 4
+ end;
+ if mm > m then begin {350:}
+ if w <> prevw then begin
+ s := getavail;
+ mem[r].hh.rh := s;
+ mem[s].hh.lh := (((8 * m) - 32764) + w) - prevw;
+ r := s;
+ prevw := w
+ end {:350};
+ if q = 30000 then
+ goto 30
+ end;
+ m := mm;
+ if ww >= wlo then
+ if ww <= whi then
+ w := win
+ else
+ w := wout
+ else
+ w := wout;
+ s := mem[q].hh.rh;
+ begin
+ mem[q].hh.rh := avail;
+ avail := q
+ end {dynused:=dynused-1;};
+ q := s
+ end;
+ 30:
+ mem[r].hh.rh := 30000;
+ mem[p + 1].hh.rh := mem[29999].hh.rh;
+ if r <> 29999 then begin {351:}
+ if minn = 32767 then
+ minn := n;
+ maxn := n;
+ if mind > mem[mem[29999].hh.rh].hh.lh then
+ mind := mem[mem[29999].hh.rh].hh.lh;
+ if maxd < mem[r].hh.lh then
+ maxd := mem[r].hh.lh
+ end {:351}
+ end {:349};
+ p := mem[p].hh.rh;
+ n := n + 1
+ end; {352:}
+ if minn > maxn then begin {353:}
+ p := mem[curedges].hh.rh;
+ while p <> curedges do begin
+ q := mem[p].hh.rh;
+ freenode(p, 2);
+ p := q
+ end;
+ initedges(curedges)
+ end else begin {:353}
+ n := mem[curedges + 1].hh.lh;
+ mem[curedges + 1].hh.lh := minn;
+ while minn > n do begin
+ p := mem[curedges].hh.rh;
+ mem[curedges].hh.rh := mem[p].hh.rh;
+ mem[mem[p].hh.rh].hh.lh := curedges;
+ freenode(p, 2);
+ n := n + 1
+ end;
+ n := mem[curedges + 1].hh.rh;
+ mem[curedges + 1].hh.rh := maxn;
+ mem[curedges + 5].hh.lh := maxn + 1;
+ mem[curedges + 5].hh.rh := curedges;
+ while maxn < n do begin
+ p := mem[curedges].hh.lh;
+ mem[curedges].hh.lh := mem[p].hh.lh;
+ mem[mem[p].hh.lh].hh.rh := curedges;
+ freenode(p, 2);
+ n := n - 1
+ end;
+ mem[curedges + 2].hh.lh := (((mind + 32768) div 8) - mem[curedges + 3].hh.lh) + 4096;
+ mem[curedges + 2].hh.rh := (((maxd + 32768) div 8) - mem[curedges + 3].hh.lh) + 4096
+ end {:352};
+ mem[curedges + 4].int := 0
+ end; {:348} {354:}
+
+ procedure xyswapedges;
+ label
+ 30;
+ var
+ mmagic, nmagic: integer;
+ p, q, r, s: halfword; {357:}
+ mspread: integer;
+ j, jj: 0..movesize;
+ m, mm: integer;
+ pd, rd: integer;
+ pm, rm: integer;
+ w: integer;
+ ww: integer;
+ dw: integer; {:357} {363:}
+ extras: integer;
+ xw: -3..3;
+ k: integer; {:363} {356:}
+ begin
+ mspread := mem[curedges + 2].hh.rh - mem[curedges + 2].hh.lh;
+ if mspread > movesize then
+ overflow(407, movesize);
+ for j := 0 to mspread do
+ move[j] := 30000 {:356}; {355:}
+ p := getnode(2);
+ mem[p + 1].hh.rh := 30000;
+ mem[p + 1].hh.lh := -30000;
+ mem[p].hh.lh := curedges;
+ mem[mem[curedges].hh.rh].hh.lh := p;
+ p := getnode(2);
+ mem[p + 1].hh.rh := 30000;
+ mem[p].hh.lh := mem[curedges].hh.lh; {:355} {365:}
+ mmagic := (mem[curedges + 2].hh.lh + mem[curedges + 3].hh.lh) - 4096;
+ nmagic := (8 * mem[curedges + 1].hh.rh) - 32756 {:365};
+ repeat
+ q := mem[p].hh.lh;
+ if mem[q + 1].hh.lh > (-29999) then
+ sortedges(q); {358:}
+ r := mem[p + 1].hh.rh;
+ freenode(p, 2);
+ p := r;
+ pd := mem[p].hh.lh + 32768;
+ pm := pd div 8;
+ r := mem[q + 1].hh.rh;
+ rd := mem[r].hh.lh + 32768;
+ rm := rd div 8;
+ w := 0;
+ while true do begin
+ if pm < rm then
+ mm := pm
+ else
+ mm := rm;
+ if w <> 0 then {362:}
+ if m <> mm then begin
+ if (mm - mmagic) >= movesize then
+ confusion(377);
+ extras := (abs(w) - 1) div 3;
+ if extras > 0 then begin
+ if w > 0 then
+ xw := +3
+ else
+ xw := -3;
+ ww := w - (extras * xw)
+ end else
+ ww := w;
+ repeat
+ j := m - mmagic;
+ for k := 1 to extras do begin
+ s := getavail;
+ mem[s].hh.lh := nmagic + xw;
+ mem[s].hh.rh := move[j];
+ move[j] := s
+ end;
+ s := getavail;
+ mem[s].hh.lh := nmagic + ww;
+ mem[s].hh.rh := move[j];
+ move[j] := s;
+ m := m + 1
+ until m = mm
+ end {:362};
+ if pd < rd then begin
+ dw := (pd mod 8) - 4; {360:}
+ s := mem[p].hh.rh;
+ begin
+ mem[p].hh.rh := avail;
+ avail := p
+ end {dynused:=dynused-1;};
+ p := s;
+ pd := mem[p].hh.lh + 32768;
+ pm := pd div 8 {:360}
+ end else begin
+ if r = 30000 then
+ goto 30;
+ dw := -((rd mod 8) - 4); {359:}
+ r := mem[r].hh.rh;
+ rd := mem[r].hh.lh + 32768;
+ rm := rd div 8 {:359}
+ end;
+ m := mm;
+ w := w + dw
+ end;
+ 30: {:358}
+ null;
+ p := q;
+ nmagic := nmagic - 8
+ until mem[p].hh.lh = curedges;
+ freenode(p, 2); {364:}
+ move[mspread] := 0;
+ j := 0;
+ while move[j] = 30000 do
+ j := j + 1;
+ if j = mspread then
+ initedges(curedges)
+ else begin
+ mm := mem[curedges + 2].hh.lh;
+ mem[curedges + 2].hh.lh := mem[curedges + 1].hh.lh;
+ mem[curedges + 2].hh.rh := mem[curedges + 1].hh.rh + 1;
+ mem[curedges + 3].hh.lh := 4096;
+ jj := mspread - 1;
+ while move[jj] = 30000 do
+ jj := jj - 1;
+ mem[curedges + 1].hh.lh := j + mm;
+ mem[curedges + 1].hh.rh := jj + mm;
+ q := curedges;
+ repeat
+ p := getnode(2);
+ mem[q].hh.rh := p;
+ mem[p].hh.lh := q;
+ mem[p + 1].hh.rh := move[j];
+ mem[p + 1].hh.lh := -30000;
+ j := j + 1;
+ q := p
+ until j > jj;
+ mem[q].hh.rh := curedges;
+ mem[curedges].hh.lh := q;
+ mem[curedges + 5].hh.lh := mem[curedges + 1].hh.rh + 1;
+ mem[curedges + 5].hh.rh := curedges;
+ mem[curedges + 4].int := 0
+ end
+ end; {:364}
+{:354}
+ {366:}
+
+ procedure mergeedges(h: halfword);
+ label
+ 30;
+ var
+ p, q, r, pp, qq, rr: halfword;
+ n: integer;
+ k: halfword;
+ delta: integer;
+ begin
+ if mem[h].hh.rh <> h then begin
+ if (((mem[h + 2].hh.lh < mem[curedges + 2].hh.lh) or (mem[h + 2].hh.rh > mem[curedges + 2].hh.rh)) or (mem[h + 1].hh.lh < mem[curedges + 1].hh.lh)) or (mem[h + 1].hh.rh > mem[curedges + 1].hh.rh) then
+ edgeprep(mem[h + 2].hh.lh - 4096, mem[h + 2].hh.rh - 4096, mem[h + 1].hh.lh - 4096, mem[h + 1].hh.rh - 4095);
+ if mem[h + 3].hh.lh <> mem[curedges + 3].hh.lh then begin {367:}
+ pp := mem[h].hh.rh;
+ delta := 8 * (mem[curedges + 3].hh.lh - mem[h + 3].hh.lh);
+ repeat
+ qq := mem[pp + 1].hh.rh;
+ while qq <> 30000 do begin
+ mem[qq].hh.lh := mem[qq].hh.lh + delta;
+ qq := mem[qq].hh.rh
+ end;
+ qq := mem[pp + 1].hh.lh;
+ while qq > (-29999) do begin
+ mem[qq].hh.lh := mem[qq].hh.lh + delta;
+ qq := mem[qq].hh.rh
+ end;
+ pp := mem[pp].hh.rh
+ until pp = h
+ end {:367};
+ n := mem[curedges + 1].hh.lh;
+ p := mem[curedges].hh.rh;
+ pp := mem[h].hh.rh;
+ while n < mem[h + 1].hh.lh do begin
+ n := n + 1;
+ p := mem[p].hh.rh
+ end; {368:}
+ repeat
+ qq := mem[pp + 1].hh.lh;
+ if qq > (-29999) then
+ if mem[p + 1].hh.lh <= (-29999) then
+ mem[p + 1].hh.lh := qq
+ else begin
+ while mem[qq].hh.rh > (-29999) do
+ qq := mem[qq].hh.rh;
+ mem[qq].hh.rh := mem[p + 1].hh.lh;
+ mem[p + 1].hh.lh := mem[pp + 1].hh.lh
+ end;
+ mem[pp + 1].hh.lh := -30000;
+ qq := mem[pp + 1].hh.rh;
+ if qq <> 30000 then begin
+ if mem[p + 1].hh.lh = (-29999) then
+ mem[p + 1].hh.lh := -30000;
+ mem[pp + 1].hh.rh := 30000;
+ r := p + 1;
+ q := mem[r].hh.rh;
+ if q = 30000 then
+ mem[p + 1].hh.rh := qq
+ else
+ while true do begin
+ k := mem[qq].hh.lh;
+ while k > mem[q].hh.lh do begin
+ r := q;
+ q := mem[r].hh.rh
+ end;
+ mem[r].hh.rh := qq;
+ rr := mem[qq].hh.rh;
+ mem[qq].hh.rh := q;
+ if rr = 30000 then
+ goto 30;
+ r := qq;
+ qq := rr
+ end
+ end;
+ 30: {:368}
+ null;
+ pp := mem[pp].hh.rh;
+ p := mem[p].hh.rh
+ until pp = h
+ end
+ end; {:366} {369:}
+
+ function totalweight(h: halfword): integer;
+ var
+ p, q: halfword;
+ n: integer;
+ m: 0..65535;
+ begin
+ n := 0;
+ p := mem[h].hh.rh;
+ while p <> h do begin
+ q := mem[p + 1].hh.rh;
+ while q <> 30000 do begin {370:}
+ m := mem[q].hh.lh + 32768;
+ n := n - (((m mod 8) - 4) * (m div 8));
+ q := mem[q].hh.rh
+ end {:370};
+ q := mem[p + 1].hh.lh;
+ while q > (-29999) do begin {370:}
+ m := mem[q].hh.lh + 32768;
+ n := n - (((m mod 8) - 4) * (m div 8));
+ q := mem[q].hh.rh
+ end {:370};
+ p := mem[p].hh.rh
+ end;
+ totalweight := n
+ end; {:369}
+{372:}
+
+ procedure beginedgetracing;
+ begin
+ printdiagnostic(408, 155, true);
+ print(409);
+ printint(curwt);
+ printchar(41);
+ tracex := -4096
+ end; { beginedgetracing }
+
+ procedure traceacorner;
+ begin
+ if fileoffset > (maxprintline - 13) then
+ printnl(155);
+ printchar(40);
+ printint(tracex);
+ printchar(44);
+ printint(traceyy);
+ printchar(41);
+ tracey := traceyy
+ end;
+
+ procedure endedgetracing;
+ begin
+ if tracex = (-4096) then
+ printnl(410)
+ else begin
+ traceacorner;
+ printchar(46)
+ end;
+ enddiagnostic(true)
+ end; {:372} {373:}
+
+ procedure tracenewedge(r: halfword; n: integer);
+ var
+ d: integer;
+ w: -3..3;
+ m, n0, n1: integer;
+ begin
+ d := mem[r].hh.lh + 32768;
+ w := (d mod 8) - 4;
+ m := (d div 8) - mem[curedges + 3].hh.lh;
+ if w = curwt then begin
+ n0 := n + 1;
+ n1 := n
+ end else begin
+ n0 := n;
+ n1 := n + 1
+ end;
+ if m <> tracex then begin
+ if tracex = (-4096) then begin
+ printnl(155);
+ traceyy := n0
+ end else if traceyy <> n0 then
+ printchar(63)
+ else
+ traceacorner;
+ tracex := m;
+ traceacorner
+ end else begin
+ if n0 <> traceyy then
+ printchar(33);
+ if ((n0 < n1) and (tracey > traceyy)) or ((n0 > n1) and (tracey < traceyy)) then
+ traceacorner
+ end;
+ traceyy := n1
+ end; {:373} {374:}
+
+ procedure lineedges(x0, y0, x1, y1: scaled);
+ label
+ 30, 31;
+ var
+ m0, n0, m1, n1: integer;
+ delx, dely: scaled;
+ yt: scaled;
+ tx: scaled;
+ p, r: halfword;
+ base: integer;
+ n: integer;
+ begin
+ n0 := roundunscaled(y0);
+ n1 := roundunscaled(y1);
+ if n0 <> n1 then begin
+ m0 := roundunscaled(x0);
+ m1 := roundunscaled(x1);
+ delx := x1 - x0;
+ dely := y1 - y0;
+ yt := (n0 * 65536) - 32768;
+ y0 := y0 - yt;
+ y1 := y1 - yt;
+ if n0 < n1 then begin {375:}
+ base := ((8 * mem[curedges + 3].hh.lh) - 32764) - curwt;
+ if m0 <= m1 then
+ edgeprep(m0, m1, n0, n1)
+ else
+ edgeprep(m1, m0, n0, n1); {377:}
+ n := mem[curedges + 5].hh.lh - 4096;
+ p := mem[curedges + 5].hh.rh;
+ if n <> n0 then
+ if n < n0 then
+ repeat
+ n := n + 1;
+ p := mem[p].hh.rh
+ until n = n0
+ else
+ repeat
+ n := n - 1;
+ p := mem[p].hh.lh
+ until n = n0 {:377};
+ y0 := 65536 - y0;
+ while true do begin
+ r := getavail;
+ mem[r].hh.rh := mem[p + 1].hh.lh;
+ mem[p + 1].hh.lh := r;
+ tx := takefraction(delx, makefraction(y0, dely));
+ if abvscd(delx, y0, dely, tx) < 0 then
+ tx := tx - 1;
+ mem[r].hh.lh := (8 * roundunscaled(x0 + tx)) + base;
+ y1 := y1 - 65536;
+ if internal[10] > 0 then
+ tracenewedge(r, n);
+ if y1 < 65536 then
+ goto 30;
+ p := mem[p].hh.rh;
+ y0 := y0 + 65536;
+ n := n + 1
+ end;
+ 30: {:375}
+ null
+ end else begin {376:}
+ base := ((8 * mem[curedges + 3].hh.lh) - 32764) + curwt;
+ if m0 <= m1 then
+ edgeprep(m0, m1, n1, n0)
+ else
+ edgeprep(m1, m0, n1, n0);
+ n0 := n0 - 1;
+{377:}
+ n := mem[curedges + 5].hh.lh - 4096;
+ p := mem[curedges + 5].hh.rh;
+ if n <> n0 then
+ if n < n0 then
+ repeat
+ n := n + 1;
+ p := mem[p].hh.rh
+ until n = n0
+ else
+ repeat
+ n := n - 1;
+ p := mem[p].hh.lh
+ until n = n0 {:377};
+ while true do begin
+ r := getavail;
+ mem[r].hh.rh := mem[p + 1].hh.lh;
+ mem[p + 1].hh.lh := r;
+ tx := takefraction(delx, makefraction(y0, dely));
+ if abvscd(delx, y0, dely, tx) < 0 then
+ tx := tx + 1;
+ mem[r].hh.lh := (8 * roundunscaled(x0 - tx)) + base;
+ y1 := y1 + 65536;
+ if internal[10] > 0 then
+ tracenewedge(r, n);
+ if y1 >= 0 then
+ goto 31;
+ p := mem[p].hh.lh;
+ y0 := y0 + 65536;
+ n := n - 1
+ end;
+ 31: {:376}
+ null
+ end;
+ mem[curedges + 5].hh.rh := p;
+ mem[curedges + 5].hh.lh := n + 4096
+ end
+ end; {:374}
+{378:}
+
+ procedure movetoedges(m0, n0, m1, n1: integer);
+ label
+ 60, 61, 62, 63, 30;
+ var
+ delta: 0..movesize;
+ k: 0..movesize;
+ p, r: halfword;
+ dx: integer;
+ edgeandweight: integer;
+ j: integer;
+ n: integer; {sum:integer;}
+ {sum:=move[0];
+ for k:=1 to delta do sum:=sum+abs(move[k]);
+ if sum<>m1-m0 then confusion(48);}
+ begin
+ delta := n1 - n0;
+ {380:}
+ case octant of
+ 1:
+ begin
+ dx := 8;
+ edgeprep(m0, m1, n0, n1);
+ goto 60
+ end;
+ 5:
+ begin
+ dx := 8;
+ edgeprep(n0, n1, m0, m1);
+ goto 62
+ end;
+ 6:
+ begin
+ dx := -8;
+ edgeprep(-n1, -n0, m0, m1);
+ n0 := -n0;
+ goto 62
+ end;
+ 2:
+ begin
+ dx := -8;
+ edgeprep(-m1, -m0, n0, n1);
+ m0 := -m0;
+ goto 60
+ end;
+ 4:
+ begin
+ dx := -8;
+ edgeprep(-m1, -m0, -n1, -n0);
+ m0 := -m0;
+ goto 61
+ end;
+ 8:
+ begin
+ dx := -8;
+ edgeprep(-n1, -n0, -m1, -m0);
+ n0 := -n0;
+ goto 63
+ end;
+ 7:
+ begin
+ dx := 8;
+ edgeprep(n0, n1, -m1, -m0);
+ goto 63
+ end;
+ 3:
+ begin
+ dx := 8;
+ edgeprep(m0, m1, -n1, -n0);
+ goto 61
+ end
+ end; {:380}
+ 60: {381:} {377:}
+ n := mem[curedges + 5].hh.lh - 4096;
+ p := mem[curedges + 5].hh.rh;
+ if n <> n0 then
+ if n < n0 then
+ repeat
+ n := n + 1;
+ p := mem[p].hh.rh
+ until n = n0
+ else
+ repeat
+ n := n - 1;
+ p := mem[p].hh.lh
+ until n = n0 {:377};
+ if delta > 0 then begin
+ k := 0;
+ edgeandweight := ((8 * (m0 + mem[curedges + 3].hh.lh)) - 32764) - curwt;
+ repeat
+ edgeandweight := edgeandweight + (dx * move[k]);
+ begin
+ r := avail;
+ if r = (-30000) then
+ r := getavail
+ else begin
+ avail := mem[r].hh.rh;
+ mem[r].hh.rh := -30000
+ end {dynused:=dynused+1;}
+ end;
+ mem[r].hh.rh := mem[p + 1].hh.lh;
+ mem[r].hh.lh := edgeandweight;
+ if internal[10] > 0 then
+ tracenewedge(r, n);
+ mem[p + 1].hh.lh := r;
+ p := mem[p].hh.rh;
+ k := k + 1;
+ n := n + 1
+ until k = delta
+ end;
+ goto 30 {:381};
+ 61: {382:}
+ n0 := (-n0) - 1; {377:}
+ n := mem[curedges + 5].hh.lh - 4096;
+ p := mem[curedges + 5].hh.rh;
+ if n <> n0 then
+ if n < n0 then
+ repeat
+ n := n + 1;
+ p := mem[p].hh.rh
+ until n = n0
+ else
+ repeat
+ n := n - 1;
+ p := mem[p].hh.lh
+ until n = n0 {:377};
+ if delta > 0 then begin
+ k := 0;
+ edgeandweight := ((8 * (m0 + mem[curedges + 3].hh.lh)) - 32764) + curwt;
+ repeat
+ edgeandweight := edgeandweight + (dx * move[k]);
+ begin
+ r := avail;
+ if r = (-30000) then
+ r := getavail
+ else begin
+ avail := mem[r].hh.rh;
+ mem[r].hh.rh := -30000
+ end {dynused:=dynused+1;}
+ end;
+ mem[r].hh.rh := mem[p + 1].hh.lh;
+ mem[r].hh.lh := edgeandweight;
+ if internal[10] > 0 then
+ tracenewedge(r, n);
+ mem[p + 1].hh.lh := r;
+ p := mem[p].hh.lh;
+ k := k + 1;
+ n := n - 1
+ until k = delta
+ end;
+ goto 30 {:382};
+ 62: {383:}
+ edgeandweight := ((8 * (n0 + mem[curedges + 3].hh.lh)) - 32764) - curwt;
+ n0 := m0;
+ k := 0;
+{377:}
+ n := mem[curedges + 5].hh.lh - 4096;
+ p := mem[curedges + 5].hh.rh;
+ if n <> n0 then
+ if n < n0 then
+ repeat
+ n := n + 1;
+ p := mem[p].hh.rh
+ until n = n0
+ else
+ repeat
+ n := n - 1;
+ p := mem[p].hh.lh
+ until n = n0 {:377};
+ repeat
+ j := move[k];
+ while j > 0 do begin
+ begin
+ r := avail;
+ if r = (-30000) then
+ r := getavail
+ else begin
+ avail := mem[r].hh.rh;
+ mem[r].hh.rh := -30000
+ end {dynused:=dynused+1;}
+ end;
+ mem[r].hh.rh := mem[p + 1].hh.lh;
+ mem[r].hh.lh := edgeandweight;
+ if internal[10] > 0 then
+ tracenewedge(r, n);
+ mem[p + 1].hh.lh := r;
+ p := mem[p].hh.rh;
+ j := j - 1;
+ n := n + 1
+ end;
+ edgeandweight := edgeandweight + dx;
+ k := k + 1
+ until k > delta;
+ goto 30 {:383};
+ 63: {384:}
+ edgeandweight := ((8 * (n0 + mem[curedges + 3].hh.lh)) - 32764) + curwt;
+ n0 := (-m0) - 1;
+ k := 0;
+{377:}
+ n := mem[curedges + 5].hh.lh - 4096;
+ p := mem[curedges + 5].hh.rh;
+ if n <> n0 then
+ if n < n0 then
+ repeat
+ n := n + 1;
+ p := mem[p].hh.rh
+ until n = n0
+ else
+ repeat
+ n := n - 1;
+ p := mem[p].hh.lh
+ until n = n0 {:377};
+ repeat
+ j := move[k];
+ while j > 0 do begin
+ begin
+ r := avail;
+ if r = (-30000) then
+ r := getavail
+ else begin
+ avail := mem[r].hh.rh;
+ mem[r].hh.rh := -30000
+ end {dynused:=dynused+1;}
+ end;
+ mem[r].hh.rh := mem[p + 1].hh.lh;
+ mem[r].hh.lh := edgeandweight;
+ if internal[10] > 0 then
+ tracenewedge(r, n);
+ mem[p + 1].hh.lh := r;
+ p := mem[p].hh.lh;
+ j := j - 1;
+ n := n - 1
+ end;
+ edgeandweight := edgeandweight + dx;
+ k := k + 1
+ until k > delta;
+ goto 30 {:384};
+ 30:
+ mem[curedges + 5].hh.lh := n + 4096;
+ mem[curedges + 5].hh.rh := p
+ end; {:378} {387:}
+
+ procedure skew(x, y: scaled; octant: smallnumber);
+ begin
+ case octant of
+ 1:
+ begin
+ curx := x - y;
+ cury := y
+ end;
+ 5:
+ begin
+ curx := y - x;
+ cury := x
+ end;
+ 6:
+ begin
+ curx := y + x;
+ cury := -x
+ end;
+ 2:
+ begin
+ curx := (-x) - y;
+ cury := y
+ end;
+ 4:
+ begin
+ curx := (-x) + y;
+ cury := -y
+ end;
+ 8:
+ begin
+ curx := (-y) + x;
+ cury := -x
+ end;
+ 7:
+ begin
+ curx := (-y) - x;
+ cury := x
+ end;
+ 3:
+ begin
+ curx := x + y;
+ cury := -y
+ end
+ end
+ end; {:387} {390:}
+
+ procedure abnegate(x, y: scaled; octantbefore, octantafter: smallnumber);
+ begin
+ if odd(octantbefore) = odd(octantafter) then
+ curx := x
+ else
+ curx := -x;
+ if (octantbefore > 2) = (octantafter > 2) then
+ cury := y
+ else
+ cury := -y
+ end; {:390}
+{391:}
+
+ function crossingpoint(a, b, c: integer): fraction;
+ label
+ 10;
+ var
+ d: integer;
+ x, xx, x0, x1, x2: integer;
+ begin
+ if a < 0 then begin
+ crossingpoint := 0;
+ goto 10
+ end;
+ if c >= 0 then begin
+ if b >= 0 then
+ if c > 0 then begin
+ crossingpoint := 268435457;
+ goto 10
+ end else if (a = 0) and (b = 0) then begin
+ crossingpoint := 268435457;
+ goto 10
+ end else begin
+ crossingpoint := 268435456;
+ goto 10
+ end;
+ if a = 0 then begin
+ crossingpoint := 0;
+ goto 10
+ end
+ end else if a = 0 then
+ if b <= 0 then begin
+ crossingpoint := 0;
+ goto 10
+ end;
+{392:}
+ d := 1;
+ x0 := a;
+ x1 := a - b;
+ x2 := b - c;
+ repeat
+ x := (x1 + x2) div 2;
+ if (x1 - x0) > x0 then begin
+ x2 := x;
+ x0 := x0 + x0;
+ d := d + d
+ end else begin
+ xx := (x1 + x) - x0;
+ if xx > x0 then begin
+ x2 := x;
+ x0 := x0 + x0;
+ d := d + d
+ end else begin
+ x0 := x0 - xx;
+ if x <= x0 then
+ if (x + x2) <= x0 then begin
+ crossingpoint := 268435457;
+ goto 10
+ end;
+ x1 := x;
+ d := (d + d) + 1
+ end
+ end
+ until d >= 268435456;
+ crossingpoint := d - 268435456 {:392};
+ 10:
+ null
+ end; {:391} {394:}
+
+ procedure printspec(s: strnumber);
+ label
+ 45, 30;
+ var
+ p, q: halfword;
+ octant: smallnumber;
+ begin
+ printdiagnostic(411, s, true);
+ p := curspec;
+ octant := mem[p + 3].int;
+ println;
+ unskew(mem[curspec + 1].int, mem[curspec + 2].int, octant);
+ printtwo(curx, cury);
+ print(412);
+ while true do begin
+ print(octantdir[octant]);
+ printchar(39);
+ while true do begin
+ q := mem[p].hh.rh;
+ if mem[p].hh.b1 = 0 then
+ goto 45;
+{397:}
+ begin
+ printnl(423);
+ unskew(mem[p + 5].int, mem[p + 6].int, octant);
+ printtwo(curx, cury);
+ print(390);
+ unskew(mem[q + 3].int, mem[q + 4].int, octant);
+ printtwo(curx, cury);
+ printnl(387);
+ unskew(mem[q + 1].int, mem[q + 2].int, octant);
+ printtwo(curx, cury);
+ print(424);
+ printint(mem[q].hh.b0 - 1)
+ end {:397};
+ p := q
+ end;
+ 45:
+ if q = curspec then
+ goto 30;
+ p := q;
+ octant := mem[p + 3].int;
+ printnl(413)
+ end;
+ 30:
+ printnl(414);
+ enddiagnostic(true)
+ end; {:394} {398:}
+
+ procedure printstrange(s: strnumber);
+ var
+ p: halfword;
+ f: halfword;
+ q: halfword;
+ t: integer;
+ begin
+ if interaction = 3 then
+ null;
+ printnl(62); {399:}
+ p := curspec;
+ t := 128;
+ repeat
+ p := mem[p].hh.rh;
+ if mem[p].hh.b0 <> 0 then begin
+ if mem[p].hh.b0 < t then
+ f := p;
+ t := mem[p].hh.b0
+ end
+ until p = curspec {:399}; {400:}
+ p := curspec;
+ q := p;
+ repeat
+ p := mem[p].hh.rh;
+ if mem[p].hh.b0 = 0 then
+ q := p
+ until p = f {:400};
+ t := 0;
+ repeat
+ if mem[p].hh.b0 <> 0 then begin
+ if mem[p].hh.b0 <> t then begin
+ t := mem[p].hh.b0;
+ printchar(32);
+ printint(t - 1)
+ end;
+ if q <> (-30000) then begin {401:}
+ if mem[mem[q].hh.rh].hh.b0 = 0 then begin
+ print(425);
+ print(octantdir[mem[q + 3].int]);
+ q := mem[q].hh.rh;
+ while mem[mem[q].hh.rh].hh.b0 = 0 do begin
+ printchar(32);
+ print(octantdir[mem[q + 3].int]);
+ q := mem[q].hh.rh
+ end;
+ printchar(41)
+ end {:401};
+ printchar(32);
+ print(octantdir[mem[q + 3].int]);
+ q := -30000
+ end
+ end else if q = (-30000) then
+ q := p;
+ p := mem[p].hh.rh
+ until p = f;
+ printchar(32);
+ printint(mem[p].hh.b0 - 1);
+ if q <> (-30000) then {401:}
+ if mem[mem[q].hh.rh].hh.b0 = 0 then begin
+ print(425);
+ print(octantdir[mem[q + 3].int]);
+ q := mem[q].hh.rh;
+ while mem[mem[q].hh.rh].hh.b0 = 0 do begin
+ printchar(32);
+ print(octantdir[mem[q + 3].int]);
+ q := mem[q].hh.rh
+ end;
+ printchar(41)
+ end {:401};
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(s)
+ end
+ end; { printstrange }
+{:398}
+ {402:}
+ {405:}
+
+ procedure removecubic(p: halfword);
+ var
+ q: halfword;
+ begin
+ q := mem[p].hh.rh;
+ mem[p].hh.b1 := mem[q].hh.b1;
+ mem[p].hh.rh := mem[q].hh.rh;
+ mem[p + 1].int := mem[q + 1].int;
+ mem[p + 2].int := mem[q + 2].int;
+ mem[p + 5].int := mem[q + 5].int;
+ mem[p + 6].int := mem[q + 6].int;
+ freenode(q, 7)
+ end; {:405} {406:} {410:}
+
+ procedure splitcubic(p: halfword; t: fraction; xq, yq: scaled);
+ var
+ v: scaled;
+ q, r: halfword;
+ begin
+ q := mem[p].hh.rh;
+ r := getnode(7);
+ mem[p].hh.rh := r;
+ mem[r].hh.rh := q;
+ mem[r].hh.b0 := mem[q].hh.b0;
+ mem[r].hh.b1 := mem[p].hh.b1;
+ v := mem[p + 5].int - takefraction(mem[p + 5].int - mem[q + 3].int, t);
+ mem[p + 5].int := mem[p + 1].int - takefraction(mem[p + 1].int - mem[p + 5].int, t);
+ mem[q + 3].int := mem[q + 3].int - takefraction(mem[q + 3].int - xq, t);
+ mem[r + 3].int := mem[p + 5].int - takefraction(mem[p + 5].int - v, t);
+ mem[r + 5].int := v - takefraction(v - mem[q + 3].int, t);
+ mem[r + 1].int := mem[r + 3].int - takefraction(mem[r + 3].int - mem[r + 5].int, t);
+ v := mem[p + 6].int - takefraction(mem[p + 6].int - mem[q + 4].int, t);
+ mem[p + 6].int := mem[p + 2].int - takefraction(mem[p + 2].int - mem[p + 6].int, t);
+ mem[q + 4].int := mem[q + 4].int - takefraction(mem[q + 4].int - yq, t);
+ mem[r + 4].int := mem[p + 6].int - takefraction(mem[p + 6].int - v, t);
+ mem[r + 6].int := v - takefraction(v - mem[q + 4].int, t);
+ mem[r + 2].int := mem[r + 4].int - takefraction(mem[r + 4].int - mem[r + 6].int, t)
+ end; {:410}
+
+ procedure quadrantsubdivide;
+ label
+ 22, 10;
+ var
+ p, q, r, s, pp, qq: halfword;
+ firstx, firsty: scaled;
+ del1, del2, del3, del, dmax: scaled;
+ t: fraction;
+ destx, desty: scaled;
+ constantx: boolean;
+ begin
+ p := curspec;
+ firstx := mem[curspec + 1].int;
+ firsty := mem[curspec + 2].int;
+ repeat
+ 22:
+ q := mem[p].hh.rh; {407:}
+ if q = curspec then begin
+ destx := firstx;
+ desty := firsty
+ end else begin
+ destx := mem[q + 1].int;
+ desty := mem[q + 2].int
+ end;
+ del1 := mem[p + 5].int - mem[p + 1].int;
+ del2 := mem[q + 3].int - mem[p + 5].int;
+ del3 := destx - mem[q + 3].int; {408:}
+ if del1 <> 0 then
+ del := del1
+ else if del2 <> 0 then
+ del := del2
+ else
+ del := del3;
+ if del <> 0 then begin
+ dmax := abs(del1);
+ if abs(del2) > dmax then
+ dmax := abs(del2);
+ if abs(del3) > dmax then
+ dmax := abs(del3);
+ while dmax < 134217728 do begin
+ dmax := dmax + dmax;
+ del1 := del1 + del1;
+ del2 := del2 + del2;
+ del3 := del3 + del3
+ end
+ end {:408};
+ if del = 0 then
+ constantx := true
+ else begin
+ constantx := false;
+ if del < 0 then begin {409:}
+ mem[p + 1].int := -mem[p + 1].int;
+ mem[p + 5].int := -mem[p + 5].int;
+ mem[q + 3].int := -mem[q + 3].int;
+ del1 := -del1;
+ del2 := -del2;
+ del3 := -del3;
+ destx := -destx;
+ mem[p].hh.b1 := 2
+ end {:409};
+ t := crossingpoint(del1, del2, del3);
+ if t < 268435456 then begin {411:}
+ splitcubic(p, t, destx, desty);
+ r := mem[p].hh.rh;
+ if mem[r].hh.b1 > 1 then
+ mem[r].hh.b1 := 1
+ else
+ mem[r].hh.b1 := 2;
+ if mem[r + 1].int < mem[p + 1].int then
+ mem[r + 1].int := mem[p + 1].int;
+ mem[r + 3].int := mem[r + 1].int;
+ mem[r + 1].int := -mem[r + 1].int;
+ mem[r + 5].int := mem[r + 1].int;
+ mem[q + 3].int := -mem[q + 3].int;
+ destx := -destx;
+ del2 := del2 - takefraction(del2 - del3, t);
+ if del2 > 0 then
+ del2 := 0;
+ t := crossingpoint(0, -del2, -del3);
+ if t < 268435456 then begin {412:}
+ splitcubic(r, t, destx, desty);
+ s := mem[r].hh.rh;
+ if mem[s + 1].int < destx then
+ mem[s + 1].int := destx;
+ if mem[s + 1].int < mem[r + 1].int then
+ mem[s + 1].int := mem[r + 1].int;
+ mem[s].hh.b1 := mem[p].hh.b1;
+ mem[s + 3].int := mem[s + 1].int;
+ mem[s + 1].int := -mem[s + 1].int;
+ mem[s + 5].int := mem[s + 1].int;
+ mem[q + 3].int := -mem[q + 3].int
+ end else if mem[r + 1].int > destx then {:412}
+ mem[r + 1].int := destx
+ end {:411}
+ end {:407};
+{413:}
+ pp := p;
+ repeat
+ qq := mem[pp].hh.rh;
+ abnegate(mem[qq + 1].int, mem[qq + 2].int, mem[qq].hh.b1, mem[pp].hh.b1);
+ destx := curx;
+ desty := cury;
+ del1 := mem[pp + 6].int - mem[pp + 2].int;
+ del2 := mem[qq + 4].int - mem[pp + 6].int;
+ del3 := desty - mem[qq + 4].int; {408:}
+ if del1 <> 0 then
+ del := del1
+ else if del2 <> 0 then
+ del := del2
+ else
+ del := del3;
+ if del <> 0 then begin
+ dmax := abs(del1);
+ if abs(del2) > dmax then
+ dmax := abs(del2);
+ if abs(del3) > dmax then
+ dmax := abs(del3);
+ while dmax < 134217728 do begin
+ dmax := dmax + dmax;
+ del1 := del1 + del1;
+ del2 := del2 + del2;
+ del3 := del3 + del3
+ end
+ end {:408};
+ if del <> 0 then begin
+ if del < 0 then begin {414:}
+ mem[pp + 2].int := -mem[pp + 2].int;
+ mem[pp + 6].int := -mem[pp + 6].int;
+ mem[qq + 4].int := -mem[qq + 4].int;
+ del1 := -del1;
+ del2 := -del2;
+ del3 := -del3;
+ desty := -desty;
+ mem[pp].hh.b1 := mem[pp].hh.b1 + 2
+ end {:414};
+ t := crossingpoint(del1, del2, del3);
+ if t < 268435456 then begin {415:}
+ splitcubic(pp, t, destx, desty);
+ r := mem[pp].hh.rh;
+ if mem[r].hh.b1 > 2 then
+ mem[r].hh.b1 := mem[r].hh.b1 - 2
+ else
+ mem[r].hh.b1 := mem[r].hh.b1 + 2;
+ if mem[r + 1].int > destx then
+ mem[r + 1].int := destx
+ else if mem[r + 1].int < mem[pp + 1].int then
+ mem[r + 1].int := mem[pp + 1].int;
+ if mem[r + 2].int < mem[pp + 2].int then
+ mem[r + 2].int := mem[pp + 2].int;
+ mem[r + 4].int := mem[r + 2].int;
+ mem[r + 2].int := -mem[r + 2].int;
+ mem[r + 6].int := mem[r + 2].int;
+ mem[qq + 4].int := -mem[qq + 4].int;
+ desty := -desty;
+ del2 := del2 - takefraction(del2 - del3, t);
+ if del2 > 0 then
+ del2 := 0;
+ t := crossingpoint(0, -del2, -del3);
+ if t < 268435456 then begin {416:}
+ splitcubic(r, t, destx, desty);
+ s := mem[r].hh.rh;
+ if mem[s + 1].int > destx then
+ mem[s + 1].int := destx
+ else if mem[s + 1].int < mem[r + 1].int then
+ mem[s + 1].int := mem[r + 1].int;
+ if mem[s + 2].int < desty then
+ mem[s + 2].int := desty;
+ if mem[s + 2].int < mem[r + 2].int then
+ mem[s + 2].int := mem[r + 2].int;
+ mem[s].hh.b1 := mem[pp].hh.b1;
+ mem[s + 4].int := mem[s + 2].int;
+ mem[s + 2].int := -mem[s + 2].int;
+ mem[s + 6].int := mem[s + 2].int;
+ mem[qq + 4].int := -mem[qq + 4].int
+ end else if mem[r + 2].int > desty then {:416}
+ mem[r + 2].int := desty
+ end {:415}
+ end else if constantx then begin {417:}
+ if q <> p then begin
+ removecubic(p);
+ if curspec <> q then
+ goto 22
+ else begin
+ curspec := p;
+ goto 10
+ end
+ end
+ end else if not odd(mem[pp].hh.b1) then begin {414:}
+ mem[pp + 2].int := -mem[pp + 2].int;
+ mem[pp + 6].int := -mem[pp + 6].int;
+ mem[qq + 4].int := -mem[qq + 4].int;
+ del1 := -del1;
+ del2 := -del2;
+ del3 := -del3;
+ desty := -desty;
+ mem[pp].hh.b1 := mem[pp].hh.b1 + 2
+ end {:414} {:417};
+ pp := qq
+ until pp = q;
+ if constantx then begin {418:}
+ pp := p;
+ repeat
+ qq := mem[pp].hh.rh;
+ if mem[pp].hh.b1 > 2 then begin
+ mem[pp].hh.b1 := mem[pp].hh.b1 + 1;
+ mem[pp + 1].int := -mem[pp + 1].int;
+ mem[pp + 5].int := -mem[pp + 5].int;
+ mem[qq + 3].int := -mem[qq + 3].int
+ end;
+ pp := qq
+ until pp = q
+ end {:418} {:413};
+ p := q
+ until p = curspec;
+ 10:
+ null
+ end; {:406} {419:}
+
+ procedure octantsubdivide;
+ var
+ p, q, r, s: halfword;
+ del1, del2, del3, del, dmax: scaled;
+ t: fraction;
+ destx, desty: scaled;
+ begin
+ p := curspec;
+ repeat
+ q := mem[p].hh.rh;
+ mem[p + 1].int := mem[p + 1].int - mem[p + 2].int;
+ mem[p + 5].int := mem[p + 5].int - mem[p + 6].int;
+ mem[q + 3].int := mem[q + 3].int - mem[q + 4].int; {420:} {421:}
+ if q = curspec then begin
+ unskew(mem[q + 1].int, mem[q + 2].int, mem[q].hh.b1);
+ skew(curx, cury, mem[p].hh.b1);
+ destx := curx;
+ desty := cury
+ end else begin
+ abnegate(mem[q + 1].int, mem[q + 2].int, mem[q].hh.b1, mem[p].hh.b1);
+ destx := curx - cury;
+ desty := cury
+ end;
+ del1 := mem[p + 5].int - mem[p + 1].int;
+ del2 := mem[q + 3].int - mem[p + 5].int;
+ del3 := destx - mem[q + 3].int {:421}; {408:}
+ if del1 <> 0 then
+ del := del1
+ else if del2 <> 0 then
+ del := del2
+ else
+ del := del3;
+ if del <> 0 then begin
+ dmax := abs(del1);
+ if abs(del2) > dmax then
+ dmax := abs(del2);
+ if abs(del3) > dmax then
+ dmax := abs(del3);
+ while dmax < 134217728 do begin
+ dmax := dmax + dmax;
+ del1 := del1 + del1;
+ del2 := del2 + del2;
+ del3 := del3 + del3
+ end
+ end {:408};
+ if del <> 0 then begin
+ if del < 0 then begin {423:}
+ mem[p + 2].int := mem[p + 1].int + mem[p + 2].int;
+ mem[p + 1].int := -mem[p + 1].int;
+ mem[p + 6].int := mem[p + 5].int + mem[p + 6].int;
+ mem[p + 5].int := -mem[p + 5].int;
+ mem[q + 4].int := mem[q + 3].int + mem[q + 4].int;
+ mem[q + 3].int := -mem[q + 3].int;
+ del1 := -del1;
+ del2 := -del2;
+ del3 := -del3;
+ desty := destx + desty;
+ destx := -destx;
+ mem[p].hh.b1 := mem[p].hh.b1 + 4
+ end {:423};
+ t := crossingpoint(del1, del2, del3);
+ if t < 268435456 then begin {424:}
+ splitcubic(p, t, destx, desty);
+ r := mem[p].hh.rh;
+ if mem[r].hh.b1 > 4 then
+ mem[r].hh.b1 := mem[r].hh.b1 - 4
+ else
+ mem[r].hh.b1 := mem[r].hh.b1 + 4;
+ if mem[r + 2].int > desty then
+ mem[r + 2].int := desty
+ else if mem[r + 2].int < mem[p + 2].int then
+ mem[r + 2].int := mem[p + 2].int;
+ if mem[r + 1].int < mem[p + 1].int then
+ mem[r + 1].int := mem[p + 1].int;
+ mem[r + 3].int := mem[r + 1].int;
+ mem[r + 2].int := mem[r + 2].int + mem[r + 1].int;
+ mem[r + 1].int := -mem[r + 1].int;
+ mem[r + 5].int := mem[r + 1].int;
+ mem[r + 6].int := mem[r + 6].int - mem[r + 5].int;
+ mem[q + 4].int := mem[q + 4].int + mem[q + 3].int;
+ mem[q + 3].int := -mem[q + 3].int;
+ desty := desty + destx;
+ destx := -destx;
+ del2 := del2 - takefraction(del2 - del3, t);
+ if del2 > 0 then
+ del2 := 0;
+ t := crossingpoint(0, -del2, -del3);
+ if t < 268435456 then begin {425:}
+ splitcubic(r, t, destx, desty);
+ s := mem[r].hh.rh;
+ if mem[s + 2].int > desty then
+ mem[s + 2].int := desty
+ else if mem[s + 2].int < mem[r + 2].int then
+ mem[s + 2].int := mem[r + 2].int;
+ if mem[s + 1].int < destx then
+ mem[s + 1].int := destx;
+ if mem[s + 1].int < mem[r + 1].int then
+ mem[s + 1].int := mem[r + 1].int;
+ mem[s].hh.b1 := mem[p].hh.b1;
+ mem[s + 3].int := mem[s + 1].int;
+ mem[s + 2].int := mem[s + 2].int + mem[s + 1].int;
+ mem[s + 1].int := -mem[s + 1].int;
+ mem[s + 6].int := mem[s + 6].int - mem[s + 1].int;
+ mem[s + 5].int := mem[s + 1].int;
+ mem[q + 4].int := mem[q + 4].int + mem[q + 3].int;
+ mem[q + 3].int := -mem[q + 3].int
+ end else if mem[r + 1].int > destx then {:425}
+ mem[r + 1].int := destx {:424}
+ end
+ end {:420};
+ p := q
+ until p = curspec
+ end; {:419} {426:}
+
+ procedure makesafe;
+ var
+ k: 0..maxwiggle;
+ allsafe: boolean;
+ nexta: scaled;
+ deltaa, deltab: scaled;
+ begin
+ before[curroundingptr] := before[0];
+ nodetoround[curroundingptr] := nodetoround[0];
+ repeat
+ after[curroundingptr] := after[0];
+ allsafe := true;
+ nexta := after[0];
+ for k := 0 to curroundingptr - 1 do begin
+ deltab := before[k + 1] - before[k];
+ if deltab >= 0 then
+ deltaa := after[k + 1] - nexta
+ else
+ deltaa := nexta - after[k + 1];
+ nexta := after[k + 1];
+ if (deltaa < 0) or (deltaa > abs(deltab + deltab)) then begin
+ allsafe := false;
+ after[k] := before[k];
+ if k = (curroundingptr - 1) then
+ after[0] := before[0]
+ else
+ after[k + 1] := before[k + 1]
+ end
+ end
+ until allsafe
+ end; {:426} {429:}
+
+ procedure beforeandafter(b, a: scaled; p: halfword);
+ begin
+ if curroundingptr = maxroundingptr then
+ if maxroundingptr < maxwiggle then
+ maxroundingptr := maxroundingptr + 1
+ else
+ overflow(435, maxwiggle);
+ after[curroundingptr] := a;
+ before[curroundingptr] := b;
+ nodetoround[curroundingptr] := p;
+ curroundingptr := curroundingptr + 1
+ end; { beforeandafter }
+{:429}
+ {431:}
+
+ function goodval(b, o: scaled): scaled;
+ var
+ a: scaled;
+ begin
+ a := b + o;
+ if a >= 0 then
+ a := (a - (a mod curgran)) - o
+ else
+ a := (((a + ((-(a + 1)) mod curgran)) - curgran) + 1) - o;
+ if (b - a) < ((a + curgran) - b) then
+ goodval := a
+ else
+ goodval := a + curgran
+ end; {:431} {432:}
+
+ function compromise(u, v: scaled): scaled;
+ begin
+ compromise := goodval(u + u, (-u) - v) div 2
+ end; {:432} {433:}
+
+ procedure xyround;
+ var
+ p, q: halfword;
+ b, a: scaled;
+ penedge: scaled;
+ alpha: fraction;
+ begin
+ curgran := abs(internal[37]);
+ if curgran = 0 then
+ curgran := 65536;
+ p := curspec;
+ curroundingptr := 0;
+ repeat
+ q := mem[p].hh.rh; {434:}
+ if odd(mem[p].hh.b1) <> odd(mem[q].hh.b1) then begin
+ if odd(mem[q].hh.b1) then
+ b := mem[q + 1].int
+ else
+ b := -mem[q + 1].int;
+ if (abs(mem[q + 1].int - mem[q + 5].int) < 655) or (abs(mem[q + 1].int + mem[q + 3].int) < 655) then begin {435:}
+ if curpen = (-29997) then
+ penedge := 0
+ else if curpathtype = 0 then
+ penedge := compromise(mem[mem[curpen + 5].hh.rh + 2].int, mem[mem[curpen + 7].hh.rh + 2].int)
+ else if odd(mem[q].hh.b1) then
+ penedge := mem[mem[curpen + 7].hh.rh + 2].int
+ else
+ penedge := mem[mem[curpen + 5].hh.rh + 2].int;
+ a := goodval(b, penedge)
+ end else {:435}
+ a := b;
+ if abs(a) > maxallowed then
+ if a > 0 then
+ a := maxallowed
+ else
+ a := -maxallowed;
+ beforeandafter(b, a, q)
+ end {:434};
+ p := q
+ until p = curspec;
+ if curroundingptr > 0 then begin {436:}
+ makesafe;
+ repeat
+ curroundingptr := curroundingptr - 1;
+ if (after[curroundingptr] <> before[curroundingptr]) or (after[curroundingptr + 1] <> before[curroundingptr + 1]) then begin
+ p := nodetoround[curroundingptr];
+ if odd(mem[p].hh.b1) then begin
+ b := before[curroundingptr];
+ a := after[curroundingptr]
+ end else begin
+ b := -before[curroundingptr];
+ a := -after[curroundingptr]
+ end;
+ if before[curroundingptr] = before[curroundingptr + 1] then
+ alpha := 268435456
+ else
+ alpha := makefraction(after[curroundingptr + 1] - after[curroundingptr], before[curroundingptr + 1] - before[curroundingptr]);
+ repeat
+ mem[p + 1].int := takefraction(alpha, mem[p + 1].int - b) + a;
+ mem[p + 5].int := takefraction(alpha, mem[p + 5].int - b) + a;
+ p := mem[p].hh.rh;
+ mem[p + 3].int := takefraction(alpha, mem[p + 3].int - b) + a
+ until p = nodetoround[curroundingptr + 1]
+ end
+ until curroundingptr = 0
+ end {:436};
+ p := curspec;
+ curroundingptr := 0;
+ repeat
+ q := mem[p].hh.rh; {437:}
+ if (mem[p].hh.b1 > 2) <> (mem[q].hh.b1 > 2) then begin
+ if mem[q].hh.b1 <= 2 then
+ b := mem[q + 2].int
+ else
+ b := -mem[q + 2].int;
+ if (abs(mem[q + 2].int - mem[q + 6].int) < 655) or (abs(mem[q + 2].int + mem[q + 4].int) < 655) then begin {438:}
+ if curpen = (-29997) then
+ penedge := 0
+ else if curpathtype = 0 then
+ penedge := compromise(mem[mem[curpen + 2].hh.rh + 2].int, mem[mem[curpen + 1].hh.rh + 2].int)
+ else if mem[q].hh.b1 <= 2 then
+ penedge := mem[mem[curpen + 1].hh.rh + 2].int
+ else
+ penedge := mem[mem[curpen + 2].hh.rh + 2].int;
+ a := goodval(b, penedge)
+ end else {:438}
+ a := b;
+ if abs(a) > maxallowed then
+ if a > 0 then
+ a := maxallowed
+ else
+ a := -maxallowed;
+ beforeandafter(b, a, q)
+ end {:437};
+ p := q
+ until p = curspec;
+ if curroundingptr > 0 then begin {439:}
+ makesafe;
+ repeat
+ curroundingptr := curroundingptr - 1;
+ if (after[curroundingptr] <> before[curroundingptr]) or (after[curroundingptr + 1] <> before[curroundingptr + 1]) then begin
+ p := nodetoround[curroundingptr];
+ if mem[p].hh.b1 <= 2 then begin
+ b := before[curroundingptr];
+ a := after[curroundingptr]
+ end else begin
+ b := -before[curroundingptr];
+ a := -after[curroundingptr]
+ end;
+ if before[curroundingptr] = before[curroundingptr + 1] then
+ alpha := 268435456
+ else
+ alpha := makefraction(after[curroundingptr + 1] - after[curroundingptr], before[curroundingptr + 1] - before[curroundingptr]);
+ repeat
+ mem[p + 2].int := takefraction(alpha, mem[p + 2].int - b) + a;
+ mem[p + 6].int := takefraction(alpha, mem[p + 6].int - b) + a;
+ p := mem[p].hh.rh;
+ mem[p + 4].int := takefraction(alpha, mem[p + 4].int - b) + a
+ until p = nodetoround[curroundingptr + 1]
+ end
+ until curroundingptr = 0
+ end {:439}
+ end; {:433} {440:}
+
+ procedure diaground;
+ var
+ p, q, pp: halfword;
+ b, a, bb, aa, d, c, dd, cc: scaled;
+ penedge: scaled;
+ alpha, beta: fraction;
+ nexta: scaled;
+ allsafe: boolean;
+ k: 0..maxwiggle;
+ firstx, firsty: scaled;
+ begin
+ p := curspec;
+ curroundingptr := 0;
+ repeat
+ q := mem[p].hh.rh; {441:}
+ if mem[p].hh.b1 <> mem[q].hh.b1 then begin
+ if mem[q].hh.b1 > 4 then
+ b := -mem[q + 1].int
+ else
+ b := mem[q + 1].int;
+ if abs(mem[q].hh.b1 - mem[p].hh.b1) = 4 then
+ if (abs(mem[q + 1].int - mem[q + 5].int) < 655) or (abs(mem[q + 1].int + mem[q + 3].int) < 655) then begin {442:}
+ if curpen = (-29997) then
+ penedge := 0
+ else if curpathtype = 0 then {443:}
+ case mem[q].hh.b1 of
+ 1, 5:
+ penedge := compromise(mem[mem[mem[curpen + 1].hh.rh].hh.lh + 1].int, -mem[mem[mem[curpen + 4].hh.rh].hh.lh + 1].int);
+ 4, 8:
+ penedge := -compromise(mem[mem[mem[curpen + 1].hh.rh].hh.lh + 1].int, -mem[mem[mem[curpen + 4].hh.rh].hh.lh + 1].int);
+ 6, 2:
+ penedge := compromise(mem[mem[mem[curpen + 2].hh.rh].hh.lh + 1].int, -mem[mem[mem[curpen + 3].hh.rh].hh.lh + 1].int);
+ 7, 3:
+ penedge := -compromise(mem[mem[mem[curpen + 2].hh.rh].hh.lh + 1].int, -mem[mem[mem[curpen + 3].hh.rh].hh.lh + 1].int)
+ end {:443}
+ else if mem[q].hh.b1 <= 4 then
+ penedge := mem[mem[mem[curpen + mem[q].hh.b1].hh.rh].hh.lh + 1].int
+ else
+ penedge := -mem[mem[mem[curpen + mem[q].hh.b1].hh.rh].hh.lh + 1].int;
+ if odd(mem[q].hh.b1) then
+ a := goodval(b, penedge + (curgran div 2))
+ else
+ a := goodval(b - 1, penedge + (curgran div 2))
+ end else {:442}
+ a := b
+ else
+ a := b;
+ beforeandafter(b, a, q)
+ end {:441};
+ p := q
+ until p = curspec;
+ if curroundingptr > 0 then begin {444:}
+ p := nodetoround[0];
+ firstx := mem[p + 1].int;
+ firsty := mem[p + 2].int; {446:}
+ before[curroundingptr] := before[0];
+ nodetoround[curroundingptr] := nodetoround[0];
+ repeat
+ after[curroundingptr] := after[0];
+ allsafe := true;
+ nexta := after[0];
+ for k := 0 to curroundingptr - 1 do begin
+ a := nexta;
+ b := before[k];
+ nexta := after[k + 1];
+ aa := nexta;
+ bb := before[k + 1];
+ if (a <> b) or (aa <> bb) then begin
+ p := nodetoround[k];
+ pp := nodetoround[k + 1];
+{445:}
+ if aa = bb then begin
+ if pp = nodetoround[0] then
+ unskew(firstx, firsty, mem[pp].hh.b1)
+ else
+ unskew(mem[pp + 1].int, mem[pp + 2].int, mem[pp].hh.b1);
+ skew(curx, cury, mem[p].hh.b1);
+ bb := curx;
+ aa := bb;
+ dd := cury;
+ cc := dd;
+ if mem[p].hh.b1 > 4 then begin
+ b := -b;
+ a := -a
+ end
+ end else begin
+ if mem[p].hh.b1 > 4 then begin
+ bb := -bb;
+ aa := -aa;
+ b := -b;
+ a := -a
+ end;
+ if pp = nodetoround[0] then
+ dd := firsty - bb
+ else
+ dd := mem[pp + 2].int - bb;
+ if odd(aa - bb) then
+ if mem[p].hh.b1 > 4 then
+ cc := dd - (((aa - bb) + 1) div 2)
+ else
+ cc := dd - (((aa - bb) - 1) div 2)
+ else
+ cc := dd - ((aa - bb) div 2)
+ end;
+ d := mem[p + 2].int;
+ if odd(a - b) then
+ if mem[p].hh.b1 > 4 then
+ c := d - (((a - b) - 1) div 2)
+ else
+ c := d - (((a - b) + 1) div 2)
+ else
+ c := d - ((a - b) div 2) {:445};
+ if (((aa < a) or (cc < c)) or ((aa - a) > (2 * (bb - b)))) or ((cc - c) > (2 * (dd - d))) then begin
+ allsafe := false;
+ after[k] := before[k];
+ if k = (curroundingptr - 1) then
+ after[0] := before[0]
+ else
+ after[k + 1] := before[k + 1]
+ end
+ end
+ end
+ until allsafe {:446};
+ for k := 0 to curroundingptr - 1 do begin
+ a := after[k];
+ b := before[k];
+ aa := after[k + 1];
+ bb := before[k + 1];
+ if (a <> b) or (aa <> bb) then begin
+ p := nodetoround[k];
+ pp := nodetoround[k + 1];
+{445:}
+ if aa = bb then begin
+ if pp = nodetoround[0] then
+ unskew(firstx, firsty, mem[pp].hh.b1)
+ else
+ unskew(mem[pp + 1].int, mem[pp + 2].int, mem[pp].hh.b1);
+ skew(curx, cury, mem[p].hh.b1);
+ bb := curx;
+ aa := bb;
+ dd := cury;
+ cc := dd;
+ if mem[p].hh.b1 > 4 then begin
+ b := -b;
+ a := -a
+ end
+ end else begin
+ if mem[p].hh.b1 > 4 then begin
+ bb := -bb;
+ aa := -aa;
+ b := -b;
+ a := -a
+ end;
+ if pp = nodetoround[0] then
+ dd := firsty - bb
+ else
+ dd := mem[pp + 2].int - bb;
+ if odd(aa - bb) then
+ if mem[p].hh.b1 > 4 then
+ cc := dd - (((aa - bb) + 1) div 2)
+ else
+ cc := dd - (((aa - bb) - 1) div 2)
+ else
+ cc := dd - ((aa - bb) div 2)
+ end;
+ d := mem[p + 2].int;
+ if odd(a - b) then
+ if mem[p].hh.b1 > 4 then
+ c := d - (((a - b) - 1) div 2)
+ else
+ c := d - (((a - b) + 1) div 2)
+ else
+ c := d - ((a - b) div 2) {:445};
+ if b = bb then
+ alpha := 268435456
+ else
+ alpha := makefraction(aa - a, bb - b);
+ if d = dd then
+ beta := 268435456
+ else
+ beta := makefraction(cc - c, dd - d);
+ repeat
+ mem[p + 1].int := takefraction(alpha, mem[p + 1].int - b) + a;
+ mem[p + 2].int := takefraction(beta, mem[p + 2].int - d) + c;
+ mem[p + 5].int := takefraction(alpha, mem[p + 5].int - b) + a;
+ mem[p + 6].int := takefraction(beta, mem[p + 6].int - d) + c;
+ p := mem[p].hh.rh;
+ mem[p + 3].int := takefraction(alpha, mem[p + 3].int - b) + a;
+ mem[p + 4].int := takefraction(beta, mem[p + 4].int - d) + c
+ until p = pp
+ end
+ end
+ end {:444}
+ end; {:440} {451:}
+
+ procedure newboundary(p: halfword; octant: smallnumber);
+ var
+ q, r: halfword;
+ begin
+ q := mem[p].hh.rh;
+ r := getnode(7);
+ mem[r].hh.rh := q;
+ mem[p].hh.rh := r;
+ mem[r].hh.b0 := mem[q].hh.b0;
+ mem[r + 3].int := mem[q + 3].int;
+ mem[r + 4].int := mem[q + 4].int;
+ mem[r].hh.b1 := 0;
+ mem[q].hh.b0 := 0;
+ mem[r + 5].int := octant;
+ mem[q + 3].int := mem[q].hh.b1;
+ unskew(mem[q + 1].int, mem[q + 2].int, mem[q].hh.b1);
+ skew(curx, cury, octant);
+ mem[r + 1].int := curx;
+ mem[r + 2].int := cury
+ end; {:451}
+
+ function makespec(h: halfword; safetymargin: scaled; tracing: integer): halfword;
+ label
+ 22, 30;
+ var
+ p, q, r, s: halfword;
+ k: integer;
+ chopped: boolean; {453:}
+ o1, o2: smallnumber;
+ clockwise: boolean;
+ dx1, dy1, dx2, dy2: integer;
+ dmax, del: integer; {:453}
+ begin
+ curspec := h;
+ if tracing > 0 then
+ printpath(curspec, 426, true);
+ maxallowed := 268402687 - safetymargin; {404:}
+ p := curspec;
+ k := 1;
+ chopped := false;
+ repeat
+ if abs(mem[p + 3].int) > maxallowed then begin
+ chopped := true;
+ if mem[p + 3].int > 0 then
+ mem[p + 3].int := maxallowed
+ else
+ mem[p + 3].int := -maxallowed
+ end;
+ if abs(mem[p + 4].int) > maxallowed then begin
+ chopped := true;
+ if mem[p + 4].int > 0 then
+ mem[p + 4].int := maxallowed
+ else
+ mem[p + 4].int := -maxallowed
+ end;
+ if abs(mem[p + 1].int) > maxallowed then begin
+ chopped := true;
+ if mem[p + 1].int > 0 then
+ mem[p + 1].int := maxallowed
+ else
+ mem[p + 1].int := -maxallowed
+ end;
+ if abs(mem[p + 2].int) > maxallowed then begin
+ chopped := true;
+ if mem[p + 2].int > 0 then
+ mem[p + 2].int := maxallowed
+ else
+ mem[p + 2].int := -maxallowed
+ end;
+ if abs(mem[p + 5].int) > maxallowed then begin
+ chopped := true;
+ if mem[p + 5].int > 0 then
+ mem[p + 5].int := maxallowed
+ else
+ mem[p + 5].int := -maxallowed
+ end;
+ if abs(mem[p + 6].int) > maxallowed then begin
+ chopped := true;
+ if mem[p + 6].int > 0 then
+ mem[p + 6].int := maxallowed
+ else
+ mem[p + 6].int := -maxallowed
+ end;
+ p := mem[p].hh.rh;
+ mem[p].hh.b0 := k;
+ if k < 127 then
+ k := k + 1
+ else
+ k := 1
+ until p = curspec;
+ if chopped then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(430)
+ end;
+ begin
+ helpptr := 4;
+ helpline[3] := 431;
+ helpline[2] := 432;
+ helpline[1] := 433;
+ helpline[0] := 434
+ end;
+ putgeterror
+ end {:404};
+ quadrantsubdivide;
+ if internal[36] > 0 then
+ xyround;
+ octantsubdivide;
+ if internal[36] > 65536 then
+ diaground; {447:}
+ p := curspec;
+ repeat
+ 22:
+ q := mem[p].hh.rh;
+ if p <> q then begin
+ if mem[p + 1].int = mem[p + 5].int then
+ if mem[p + 2].int = mem[p + 6].int then
+ if mem[p + 1].int = mem[q + 3].int then
+ if mem[p + 2].int = mem[q + 4].int then begin
+ unskew(mem[q + 1].int, mem[q + 2].int, mem[q].hh.b1);
+ skew(curx, cury, mem[p].hh.b1);
+ if mem[p + 1].int = curx then
+ if mem[p + 2].int = cury then begin
+ removecubic(p);
+ if q <> curspec then
+ goto 22;
+ curspec := p;
+ q := p
+ end
+ end
+ end;
+ p := q
+ until p = curspec; {:447} {450:}
+ turningnumber := 0;
+ p := curspec;
+ q := mem[p].hh.rh;
+ repeat
+ r := mem[q].hh.rh;
+ if (mem[p].hh.b1 <> mem[q].hh.b1) or (q = r) then begin {452:}
+ newboundary(p, mem[p].hh.b1);
+ s := mem[p].hh.rh;
+ o1 := octantnumber[mem[p].hh.b1];
+ o2 := octantnumber[mem[q].hh.b1];
+ case o2 - o1 of
+ 1, -7, 7, -1:
+ goto 30;
+ 2, -6:
+ clockwise := false;
+ 3, -5, 4, -4, 5, -3:
+ begin {454:} {457:}
+ dx1 := mem[s + 1].int - mem[s + 3].int;
+ dy1 := mem[s + 2].int - mem[s + 4].int;
+ if dx1 = 0 then
+ if dy1 = 0 then begin
+ dx1 := mem[s + 1].int - mem[p + 5].int;
+ dy1 := mem[s + 2].int - mem[p + 6].int;
+ if dx1 = 0 then
+ if dy1 = 0 then begin
+ dx1 := mem[s + 1].int - mem[p + 1].int;
+ dy1 := mem[s + 2].int - mem[p + 2].int
+ end
+ end;
+ dmax := abs(dx1);
+ if abs(dy1) > dmax then
+ dmax := abs(dy1);
+ while dmax < 268435456 do begin
+ dmax := dmax + dmax;
+ dx1 := dx1 + dx1;
+ dy1 := dy1 + dy1
+ end;
+ dx2 := mem[q + 5].int - mem[q + 1].int;
+ dy2 := mem[q + 6].int - mem[q + 2].int;
+ if dx2 = 0 then
+ if dy2 = 0 then begin
+ dx2 := mem[r + 3].int - mem[q + 1].int;
+ dy2 := mem[r + 4].int - mem[q + 2].int;
+ if dx2 = 0 then
+ if dy2 = 0 then begin
+ if mem[r].hh.b1 = 0 then begin
+ curx := mem[r + 1].int;
+ cury := mem[r + 2].int
+ end else begin
+ unskew(mem[r + 1].int, mem[r + 2].int, mem[r].hh.b1);
+ skew(curx, cury, mem[q].hh.b1)
+ end;
+ dx2 := curx - mem[q + 1].int;
+ dy2 := cury - mem[q + 2].int
+ end
+ end;
+ dmax := abs(dx2);
+ if abs(dy2) > dmax then
+ dmax := abs(dy2);
+ while dmax < 268435456 do begin
+ dmax := dmax + dmax;
+ dx2 := dx2 + dx2;
+ dy2 := dy2 + dy2
+ end {:457};
+ unskew(dx1, dy1, mem[p].hh.b1);
+ del := pythadd(curx, cury);
+ dx1 := makefraction(curx, del);
+ dy1 := makefraction(cury, del);
+ unskew(dx2, dy2, mem[q].hh.b1);
+ del := pythadd(curx, cury);
+ dx2 := makefraction(curx, del);
+ dy2 := makefraction(cury, del);
+ del := takefraction(dx1, dy2) - takefraction(dx2, dy1);
+ if del > 4684844 then
+ clockwise := false
+ else if del < (-4684844) then
+ clockwise := true
+ else
+ clockwise := revturns
+ end; {:454}
+ 6, -2:
+ clockwise := true;
+ 0:
+ clockwise := revturns
+ end; {458:}
+ while true do begin
+ if clockwise then
+ if o1 = 1 then
+ o1 := 8
+ else
+ o1 := o1 - 1
+ else if o1 = 8 then
+ o1 := 1
+ else
+ o1 := o1 + 1;
+ if o1 = o2 then
+ goto 30;
+ newboundary(s, octantcode[o1]);
+ s := mem[s].hh.rh;
+ mem[s + 3].int := mem[s + 5].int
+ end {:458};
+ 30:
+ if q = r then begin
+ q := mem[q].hh.rh;
+ r := q;
+ p := s;
+ mem[s].hh.rh := q;
+ mem[q + 3].int := mem[q + 5].int;
+ mem[q].hh.b0 := 0;
+ freenode(curspec, 7);
+ curspec := q
+ end; {459:}
+ p := mem[p].hh.rh;
+ repeat
+ s := mem[p].hh.rh;
+ o1 := octantnumber[mem[p + 5].int];
+ o2 := octantnumber[mem[s + 3].int];
+ if abs(o1 - o2) = 1 then begin
+ if o2 < o1 then
+ o2 := o1;
+ if odd(o2) then
+ mem[p + 6].int := 0
+ else
+ mem[p + 6].int := 1
+ end else begin
+ if o1 = 8 then
+ turningnumber := turningnumber + 1
+ else
+ turningnumber := turningnumber - 1;
+ mem[p + 6].int := 0
+ end;
+ mem[s + 4].int := mem[p + 6].int;
+ p := s
+ until p = q {:459}
+ end {:452};
+ p := q;
+ q := r
+ until p = curspec; {:450}
+ while mem[curspec].hh.b0 <> 0 do
+ curspec := mem[curspec].hh.rh;
+ if tracing > 0 then
+ if internal[36] <= 0 then
+ printspec(427)
+ else if internal[36] > 65536 then
+ printspec(428)
+ else
+ printspec(429);
+ makespec := curspec
+ end; { makespec }
+{:402}
+ {463:}
+
+ procedure endround(x, y: scaled);
+ begin
+ y := (y + 32768) - ycorr[octant];
+ x := (x + y) - xcorr[octant];
+ m1 := floorunscaled(x);
+ n1 := floorunscaled(y);
+ if (x - (65536 * m1)) >= ((y - (65536 * n1)) + zcorr[octant]) then
+ d1 := 1
+ else
+ d1 := 0
+ end; {:463}
+{465:}
+
+ procedure fillspec(h: halfword);
+ var
+ p, q, r, s: halfword;
+ begin
+ if internal[10] > 0 then
+ beginedgetracing;
+ p := h;
+ {------------------------------------}
+ print_start(psfile); { Start cycle }
+ {------------------------------------}
+ repeat
+ octant := mem[p + 3].int; {466:}
+ q := p;
+ while mem[q].hh.b1 <> 0 do
+ q := mem[q].hh.rh {:466};
+ if q <> p then begin {467:}
+ endround(mem[p + 1].int, mem[p + 2].int);
+ m0 := m1;
+ n0 := n1;
+ d0 := d1;
+ endround(mem[q + 1].int, mem[q + 2].int) {:467}; {468:}
+ if (n1 - n0) >= movesize then
+ overflow(407, movesize);
+ move[0] := d0;
+ moveptr := 0;
+ r := p;
+ repeat
+ s := mem[r].hh.rh;
+ makemoves(mem[r + 1].int, mem[r + 5].int, mem[s + 3].int, mem[s + 1].int, mem[r + 2].int + 32768, mem[r + 6].int + 32768, mem[s + 4].int + 32768, mem[s + 2].int + 32768, xycorr[octant], ycorr[octant],465,octant);
+ r := s
+ until r = q;
+ move[moveptr] := move[moveptr] - d1;
+ if internal[35] > 0 then
+ smoothmoves(0, moveptr) {:468};
+ movetoedges(m0, n0, m1, n1)
+ end;
+ p := mem[q].hh.rh
+ until p = h;
+ {------------------------------------}
+ print_end(psfile); { End cycle }
+ {------------------------------------}
+ tossknotlist(h);
+ if internal[10] > 0 then
+ endedgetracing
+ end; {:465} {476:}
+
+ procedure dupoffset(w: halfword);
+ var
+ r: halfword;
+ begin
+ r := getnode(3);
+ mem[r + 1].int := mem[w + 1].int;
+ mem[r + 2].int := mem[w + 2].int;
+ mem[r].hh.rh := mem[w].hh.rh;
+ mem[mem[w].hh.rh].hh.lh := r;
+ mem[r].hh.lh := w;
+ mem[w].hh.rh := r
+ end; {:476} {477:}
+
+ function makepen(h: halfword): halfword;
+ label
+ 30, 31, 45, 40;
+ var
+ o, oo, k: smallnumber;
+ p: halfword;
+ q, r, s, w, hh: halfword;
+ n: integer;
+ dx, dy: scaled;
+ mc: scaled; {479:}
+ begin
+ q := h;
+ r := mem[q].hh.rh;
+ mc := abs(mem[h + 1].int);
+ if q = r then begin
+ hh := h;
+ mem[h].hh.b1 := 0;
+ if mc < abs(mem[h + 2].int) then
+ mc := abs(mem[h + 2].int)
+ end else begin
+ o := 0;
+ hh := -30000;
+ while true do begin
+ s := mem[r].hh.rh;
+ if mc < abs(mem[r + 1].int) then
+ mc := abs(mem[r + 1].int);
+ if mc < abs(mem[r + 2].int) then
+ mc := abs(mem[r + 2].int);
+ dx := mem[r + 1].int - mem[q + 1].int;
+ dy := mem[r + 2].int - mem[q + 2].int;
+ if dx = 0 then
+ if dy = 0 then
+ goto 45;
+ if abvscd(dx, mem[s + 2].int - mem[r + 2].int, dy, mem[s + 1].int - mem[r + 1].int) < 0 then
+ goto 45; {480:}
+ if dx > 0 then
+ octant := 1
+ else if dx = 0 then
+ if dy > 0 then
+ octant := 1
+ else
+ octant := 2
+ else begin
+ dx := -dx;
+ octant := 2
+ end;
+ if dy < 0 then begin
+ dy := -dy;
+ octant := octant + 2
+ end else if dy = 0 then
+ if octant > 1 then
+ octant := 4;
+ if dx < dy then
+ octant := octant + 4 {:480};
+ mem[q].hh.b1 := octant;
+ oo := octantnumber[octant];
+ if o > oo then begin
+ if hh <> (-30000) then
+ goto 45;
+ hh := q
+ end;
+ o := oo;
+ if (q = h) and (hh <> (-30000)) then
+ goto 30;
+ q := r;
+ r := s
+ end;
+ 30: {:479}
+ null
+ end;
+ if mc >= 268402688 then
+ goto 45;
+ p := getnode(10);
+ q := hh;
+ mem[p + 9].int := mc;
+ mem[p].hh.lh := -30000;
+ if mem[q].hh.rh <> q then
+ mem[p].hh.rh := -29999;
+ for k := 1 to 8 do begin {481:}
+ octant := octantcode[k];
+ n := 0;
+ h := p + octant;
+ while true do begin
+ r := getnode(3);
+ skew(mem[q + 1].int, mem[q + 2].int, octant);
+ mem[r + 1].int := curx;
+ mem[r + 2].int := cury;
+ if n = 0 then
+ mem[h].hh.rh := r {482:}
+ else if odd(k) then begin
+ mem[w].hh.rh := r;
+ mem[r].hh.lh := w
+ end else begin
+ mem[w].hh.lh := r;
+ mem[r].hh.rh := w
+ end {:482};
+ w := r;
+ if mem[q].hh.b1 <> octant then
+ goto 31;
+ q := mem[q].hh.rh;
+ n := n + 1
+ end;
+ 31: {483:}
+ r := mem[h].hh.rh;
+ if odd(k) then begin
+ mem[w].hh.rh := r;
+ mem[r].hh.lh := w
+ end else begin
+ mem[w].hh.lh := r;
+ mem[r].hh.rh := w;
+ mem[h].hh.rh := w;
+ r := w
+ end;
+ if (mem[r + 2].int <> mem[mem[r].hh.rh + 2].int) or (n = 0) then begin
+ dupoffset(r);
+ n := n + 1
+ end;
+ r := mem[r].hh.lh;
+ {:
+ 483}
+ if mem[r + 1].int <> mem[mem[r].hh.lh + 1].int then
+ dupoffset(r)
+ else
+ n := n - 1;
+ if n >= 127 then
+ overflow(446, 127);
+ mem[h].hh.lh := n
+ end {:481};
+ goto 40;
+ 45:
+ p := -29997; {478:}
+ if mc >= 268402688 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(440)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 441;
+ helpline[0] := 442
+ end
+ end else begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(443)
+ end;
+ begin
+ helpptr := 3;
+ helpline[2] := 444;
+ helpline[1] := 445;
+ helpline[0] := 442
+ end
+ end; {:478}
+ putgeterror;
+ 40:
+ if internal[6] > 0 then
+ printpen(p, 439, true);
+ makepen := p
+ end; {:477} {484:} {486:}
+
+ function trivialknot(x, y: scaled): halfword;
+ var
+ p: halfword;
+ begin
+ p := getnode(7);
+ mem[p].hh.b0 := 1;
+ mem[p].hh.b1 := 1;
+ mem[p + 1].int := x;
+ mem[p + 3].int := x;
+ mem[p + 5].int := x;
+ mem[p + 2].int := y;
+ mem[p + 4].int := y;
+ mem[p + 6].int := y;
+ trivialknot := p
+ end; {:486}
+
+ function makepath(penhead: halfword): halfword;
+ var
+ p: halfword;
+ k: 1..8;
+ h: halfword;
+ m, n: integer;
+ w, ww: halfword;
+ begin
+ p := 29999;
+ for k := 1 to 8 do begin
+ octant := octantcode[k];
+ h := penhead + octant;
+ n := mem[h].hh.lh;
+ w := mem[h].hh.rh;
+ if not odd(k) then
+ w := mem[w].hh.lh;
+ for m := 1 to n + 1 do begin
+ if odd(k) then
+ ww := mem[w].hh.rh
+ else
+ ww := mem[w].hh.lh;
+ if (mem[ww + 1].int <> mem[w + 1].int) or (mem[ww + 2].int <> mem[w + 2].int) then begin {485:}
+ unskew(mem[ww + 1].int, mem[ww + 2].int, octant);
+ mem[p].hh.rh := trivialknot(curx, cury);
+ p := mem[p].hh.rh
+ end {:485};
+ w := ww
+ end
+ end;
+ if p = 29999 then begin
+ w := mem[penhead + 1].hh.rh;
+ p := trivialknot(mem[w + 1].int + mem[w + 2].int, mem[w + 2].int);
+ mem[29999].hh.rh := p
+ end;
+ mem[p].hh.rh := mem[29999].hh.rh;
+ makepath := mem[29999].hh.rh
+ end; {:484} {488:}
+
+ procedure findoffset(x, y: scaled; p: halfword);
+ label
+ 30, 10;
+ var
+ octant: 1..8;
+ s: -1..+1;
+ n: integer;
+ h, w, ww: halfword; {489:}
+ begin
+ if x > 0 then
+ octant := 1
+ else if x = 0 then
+ if y <= 0 then
+ if y = 0 then begin
+ curx := 0;
+ cury := 0;
+ goto 10
+ end else
+ octant := 2
+ else
+ octant := 1
+ else begin
+ x := -x;
+ if y = 0 then
+ octant := 4
+ else
+ octant := 2
+ end;
+ if y < 0 then begin
+ octant := octant + 2;
+ y := -y
+ end;
+ if x >= y then
+ x := x - y
+ else begin
+ octant := octant + 4;
+ x := y - x;
+ y := y - x
+ end {:489};
+ if odd(octantnumber[octant]) then
+ s := -1
+ else
+ s := +1;
+ h := p + octant;
+ w := mem[mem[h].hh.rh].hh.rh;
+ ww := mem[w].hh.rh;
+ n := mem[h].hh.lh;
+ while n > 1 do begin
+ if abvscd(x, mem[ww + 2].int - mem[w + 2].int, y, mem[ww + 1].int - mem[w + 1].int) <> s then
+ goto 30;
+ w := ww;
+ ww := mem[w].hh.rh;
+ n := n - 1
+ end;
+ 30:
+ unskew(mem[w + 1].int, mem[w + 2].int, octant);
+ 10:
+ null
+ end; {:488} {491:} {493:}
+
+ procedure splitforoffset(p: halfword; t: fraction);
+ var
+ q: halfword;
+ r: halfword;
+ begin
+ q := mem[p].hh.rh;
+ splitcubic(p, t, mem[q + 1].int, mem[q + 2].int);
+ r := mem[p].hh.rh;
+ if mem[r + 2].int < mem[p + 2].int then
+ mem[r + 2].int := mem[p + 2].int
+ else if mem[r + 2].int > mem[q + 2].int then
+ mem[r + 2].int := mem[q + 2].int;
+ if mem[r + 1].int < mem[p + 1].int then
+ mem[r + 1].int := mem[p + 1].int
+ else if mem[r + 1].int > mem[q + 1].int then
+ mem[r + 1].int := mem[q + 1].int
+ end; {:493} {497:}
+
+ procedure finoffsetprep(p: halfword; k: halfword; w: halfword; x0, x1, x2, y0, y1, y2: integer; rising: boolean; n: integer);
+ label
+ 10;
+ var
+ q, ww: halfword;
+ du, dv: scaled;
+ t0, t1, t2: integer;
+ t: fraction;
+ s: fraction;
+ v: integer;
+ begin
+ while true do begin
+ q := mem[p].hh.rh;
+ mem[p].hh.b1 := k;
+ if rising then
+ if k = n then
+ goto 10
+ else
+ ww := mem[w].hh.rh
+ else if k = 1 then
+ goto 10
+ else
+ ww := mem[w].hh.lh; {498:}
+ du := mem[ww + 1].int - mem[w + 1].int;
+ dv := mem[ww + 2].int - mem[w + 2].int;
+ if abs(du) >= abs(dv) then begin
+ s := makefraction(dv, du);
+ t0 := takefraction(x0, s) - y0;
+ t1 := takefraction(x1, s) - y1;
+ t2 := takefraction(x2, s) - y2
+ end else begin
+ s := makefraction(du, dv);
+ t0 := x0 - takefraction(y0, s);
+ t1 := x1 - takefraction(y1, s);
+ t2 := x2 - takefraction(y2, s)
+ end {:498};
+ t := crossingpoint(t0, t1, t2);
+ if t >= 268435456 then
+ goto 10; {499:}
+ begin
+ splitforoffset(p, t);
+ mem[p].hh.b1 := k;
+ p := mem[p].hh.rh;
+ v := x0 - takefraction(x0 - x1, t);
+ x1 := x1 - takefraction(x1 - x2, t);
+ x0 := v - takefraction(v - x1, t);
+ v := y0 - takefraction(y0 - y1, t);
+ y1 := y1 - takefraction(y1 - y2, t);
+ y0 := v - takefraction(v - y1, t);
+ t1 := t1 - takefraction(t1 - t2, t);
+ if t1 > 0 then
+ t1 := 0;
+ t := crossingpoint(0, -t1, -t2);
+ if t < 268435456 then begin
+ splitforoffset(p, t);
+ mem[mem[p].hh.rh].hh.b1 := k;
+ v := x1 - takefraction(x1 - x2, t);
+ x1 := x0 - takefraction(x0 - x1, t);
+ x2 := x1 - takefraction(x1 - v, t);
+ v := y1 - takefraction(y1 - y2, t);
+ y1 := y0 - takefraction(y0 - y1, t);
+ y2 := y1 - takefraction(y1 - v, t)
+ end
+ end {:499};
+ if rising then
+ k := k + 1
+ else
+ k := k - 1;
+ w := ww
+ end;
+ 10:
+ null
+ end; {:497}
+
+ procedure offsetprep(c, h: halfword);
+ label
+ 30, 45;
+ var
+ n: halfword;
+ p, q, r, lh, ww: halfword;
+ k: halfword;
+ w: halfword; {495:}
+ x0, x1, x2, y0, y1, y2: integer;
+ t0, t1, t2: integer;
+ du, dv, dx, dy: integer;
+ maxcoef: integer;
+ x0a, x1a, x2a, y0a, y1a, y2a: integer;
+ t: fraction;
+ s: fraction;
+{:495}
+ begin
+ p := c;
+ n := mem[h].hh.lh;
+ lh := mem[h].hh.rh;
+ while mem[p].hh.b1 <> 0 do begin
+ q := mem[p].hh.rh; {494:}
+ if n <= 1 then
+ mem[p].hh.b1 := 1
+ else begin {496:}
+ x0 := mem[p + 5].int - mem[p + 1].int;
+ x2 := mem[q + 1].int - mem[q + 3].int;
+ x1 := mem[q + 3].int - mem[p + 5].int;
+ y0 := mem[p + 6].int - mem[p + 2].int;
+ y2 := mem[q + 2].int - mem[q + 4].int;
+ y1 := mem[q + 4].int - mem[p + 6].int;
+ maxcoef := abs(x0);
+ if abs(x1) > maxcoef then
+ maxcoef := abs(x1);
+ if abs(x2) > maxcoef then
+ maxcoef := abs(x2);
+ if abs(y0) > maxcoef then
+ maxcoef := abs(y0);
+ if abs(y1) > maxcoef then
+ maxcoef := abs(y1);
+ if abs(y2) > maxcoef then
+ maxcoef := abs(y2);
+ if maxcoef = 0 then
+ goto 45;
+ while maxcoef < 268435456 do begin
+ maxcoef := maxcoef + maxcoef;
+ x0 := x0 + x0;
+ x1 := x1 + x1;
+ x2 := x2 + x2;
+ y0 := y0 + y0;
+ y1 := y1 + y1;
+ y2 := y2 + y2
+ end {:496}; {501:}
+ dx := x0;
+ dy := y0;
+ if dx = 0 then
+ if dy = 0 then begin
+ dx := x1;
+ dy := y1;
+ if dx = 0 then
+ if dy = 0 then begin
+ dx := x2;
+ dy := y2
+ end
+ end {:501};
+ if dx = 0 then {505:}
+ finoffsetprep(p, n, mem[mem[lh].hh.lh].hh.lh, -x0, -x1, -x2, -y0, -y1, -y2, false, n) {:505}
+ else begin {502:}
+ k := 1;
+ w := mem[lh].hh.rh;
+ while true do begin
+ if k = n then
+ goto 30;
+ ww := mem[w].hh.rh;
+ if abvscd(dy, abs(mem[ww + 1].int - mem[w + 1].int), dx, abs(mem[ww + 2].int - mem[w + 2].int)) >= 0 then begin
+ k := k + 1;
+ w := ww
+ end else
+ goto 30
+ end;
+ 30: {:502}
+ null;
+{503:}
+ if k = 1 then
+ t := 268435457
+ else begin
+ ww := mem[w].hh.lh; {498:}
+ du := mem[ww + 1].int - mem[w + 1].int;
+ dv := mem[ww + 2].int - mem[w + 2].int;
+ if abs(du) >= abs(dv) then begin
+ s := makefraction(dv, du);
+ t0 := takefraction(x0, s) - y0;
+ t1 := takefraction(x1, s) - y1;
+ t2 := takefraction(x2, s) - y2
+ end else begin
+ s := makefraction(du, dv);
+ t0 := x0 - takefraction(y0, s);
+ t1 := x1 - takefraction(y1, s);
+ t2 := x2 - takefraction(y2, s)
+ end {:498};
+ t := crossingpoint(-t0, -t1, -t2)
+ end;
+ if t >= 268435456 then
+ finoffsetprep(p, k, w, x0, x1, x2, y0, y1, y2, true, n)
+ else begin
+ splitforoffset(p, t);
+ r := mem[p].hh.rh;
+ x1a := x0 - takefraction(x0 - x1, t);
+ x1 := x1 - takefraction(x1 - x2, t);
+ x2a := x1a - takefraction(x1a - x1, t);
+ y1a := y0 - takefraction(y0 - y1, t);
+ y1 := y1 - takefraction(y1 - y2, t);
+ y2a := y1a - takefraction(y1a - y1, t);
+ finoffsetprep(p, k, w, x0, x1a, x2a, y0, y1a, y2a, true, n);
+ x0 := x2a;
+ y0 := y2a;
+ t1 := t1 - takefraction(t1 - t2, t);
+ if t1 < 0 then
+ t1 := 0;
+ t := crossingpoint(0, t1, t2);
+ if t < 268435456 then begin {504:}
+ splitforoffset(r, t);
+ x1a := x1 - takefraction(x1 - x2, t);
+ x1 := x0 - takefraction(x0 - x1, t);
+ x0a := x1 - takefraction(x1 - x1a, t);
+ y1a := y1 - takefraction(y1 - y2, t);
+ y1 := y0 - takefraction(y0 - y1, t);
+ y0a := y1 - takefraction(y1 - y1a, t);
+ finoffsetprep(mem[r].hh.rh, k, w, x0a, x1a, x2, y0a, y1a, y2, true, n);
+ x2 := x0a;
+ y2 := y0a
+ end {:504};
+ finoffsetprep(r, k - 1, ww, -x0, -x1, -x2, -y0, -y1, -y2, false, n)
+ end {:503}
+ end;
+ 45: {:494}
+ null
+ end; {492:}
+ repeat
+ r := mem[p].hh.rh;
+ if mem[p + 1].int = mem[p + 5].int then
+ if mem[p + 2].int = mem[p + 6].int then
+ if mem[p + 1].int = mem[r + 3].int then
+ if mem[p + 2].int = mem[r + 4].int then
+ if mem[p + 1].int = mem[r + 1].int then
+ if mem[p + 2].int = mem[r + 2].int then begin
+ removecubic(p);
+ if r = q then
+ q := p;
+ r := p
+ end;
+ p := r
+ until p = q {:492}
+ end
+ end; { offsetprep }
+{:491}
+ {506:}
+ {510:}
+
+ procedure skewlineedges(p, w, ww: halfword);
+ var
+ x0, y0, x1, y1: scaled;
+ begin
+ if (mem[w + 1].int <> mem[ww + 1].int) or (mem[w + 2].int <> mem[ww + 2].int) then begin
+ x0 := mem[p + 1].int + mem[w + 1].int;
+ y0 := mem[p + 2].int + mem[w + 2].int;
+ x1 := mem[p + 1].int + mem[ww + 1].int;
+ y1 := mem[p + 2].int + mem[ww + 2].int;
+ {-------------------------------------}
+ sendline(x0,y0,x1,y1,octant,510);
+ {-------------------------------------}
+ unskew(x0, y0, octant);
+ x0 := curx;
+ y0 := cury;
+ unskew(x1, y1, octant);
+{if internal[10]>65536 then begin printnl(451);printtwo(x0,y0);
+print(450);printtwo(curx,cury);printnl(155);end;}
+ lineedges(x0, y0, curx, cury)
+ end
+ end; {:510} {518:}
+
+ procedure dualmoves(h, p, q: halfword);
+ label
+ 30, 31;
+ var
+ r, s: halfword; {511:}
+ m, n: integer;
+ mm0, mm1: integer;
+ k: integer;
+ w, ww: halfword;
+ smoothbot, smoothtop: 0..movesize;
+ xx, yy, xp, yp, delx, dely, tx, ty: scaled;
+{:511} {519:}
+ begin
+ k := mem[h].hh.lh + 1;
+ ww := mem[h].hh.rh;
+ w := mem[ww].hh.lh;
+ mm0 := floorunscaled((mem[p + 1].int + mem[w + 1].int) - xycorr[octant]);
+ mm1 := floorunscaled((mem[q + 1].int + mem[ww + 1].int) - xycorr[octant]);
+ for n := 1 to (n1 - n0) + 1 do
+ envmove[n] := mm1;
+ envmove[0] := mm0;
+ moveptr := 0;
+ m := mm0 {:519};
+ r := p;
+ while true do begin
+ if r = q then
+ smoothtop := moveptr;
+ while mem[r].hh.b1 <> k do begin {521:}
+ xx := mem[r + 1].int + mem[w + 1].int;
+ yy := (mem[r + 2].int + mem[w + 2].int) + 32768;
+{if internal[10]>65536 then begin printnl(452);printint(k);print(453);
+unskew(xx,yy-32768,octant);printtwo(curx,cury);end;}
+ {------------}
+ my_xx := xx;
+ my_yy := yy;
+ {------------}
+ if mem[r].hh.b1 < k then begin
+ k := k - 1;
+ w := mem[w].hh.lh;
+ xp := mem[r + 1].int + mem[w + 1].int;
+ yp := (mem[r + 2].int + mem[w + 2].int) + 32768;
+ if yp <> yy then begin {522:}
+ ty := floorscaled(yy - ycorr[octant]);
+ dely := yp - yy;
+ yy := yy - ty;
+ ty := (yp - ycorr[octant]) - ty;
+ if ty >= 65536 then begin
+ delx := xp - xx;
+ yy := 65536 - yy;
+ while true do begin
+ if m < envmove[moveptr] then
+ envmove[moveptr] := m;
+ tx := takefraction(delx, makefraction(yy, dely));
+ if (abvscd(tx, dely, delx, yy) + xycorr[octant]) > 0 then
+ tx := tx - 1;
+ m := floorunscaled(xx + tx);
+ ty := ty - 65536;
+ moveptr := moveptr + 1;
+ if ty < 65536 then
+ goto 31;
+ yy := yy + 65536
+ end;
+ 31:
+ if m < envmove[moveptr] then
+ envmove[moveptr] := m
+ end
+ end {:522}
+ end else begin
+ k := k + 1;
+ w := mem[w].hh.rh;
+ xp := mem[r + 1].int + mem[w + 1].int;
+ yp := (mem[r + 2].int + mem[w + 2].int) + 32768;
+ end;
+{if internal[10]>65536 then begin print(450);unskew(xp,yp-32768,octant);
+printtwo(curx,cury);printnl(155);end;}
+ {---------------------------------------------------}
+ sendline(my_xx,my_yy-32768,xp,yp-32768,octant,521);
+ {---------------------------------------------------}
+ m := floorunscaled(xp - xycorr[octant]);
+ moveptr := floorunscaled(yp - ycorr[octant]) - n0;
+ if m < envmove[moveptr] then
+ envmove[moveptr] := m
+ end {:521};
+ if r = p then
+ smoothbot := moveptr;
+ if r = q then
+ goto 30;
+ move[moveptr] := 1;
+ n := moveptr;
+ s := mem[r].hh.rh;
+ makemoves(mem[r + 1].int + mem[w + 1].int, mem[r + 5].int + mem[w + 1].int, mem[s + 3].int + mem[w + 1].int, mem[s + 1].int + mem[w + 1].int, (mem[r + 2].int + mem[w + 2].int) + 32768, (mem[r + 6].int + mem[w + 2].int) + 32768, (mem[s + 4].int + mem[w + 2].int) + 32768, (mem[s + 2].int + mem[w + 2].int) + 32768, xycorr[octant], ycorr[octant],518,octant); {520:}
+ repeat
+ if m < envmove[n] then
+ envmove[n] := m;
+ m := (m + move[n]) - 1;
+ n := n + 1
+ until n > moveptr {:520};
+ r := s
+ end;
+ 30: {523:}
+{if(m<>mm1)or(moveptr<>n1-n0)then confusion(50);}
+ move[0] := (d0 + envmove[1]) - mm0;
+ for n := 1 to moveptr do
+ move[n] := (envmove[n + 1] - envmove[n]) + 1;
+ move[moveptr] := move[moveptr] - d1;
+ if internal[35] > 0 then
+ smoothmoves(smoothbot, smoothtop);
+ movetoedges(m0, n0, m1, n1);
+ if mem[q + 6].int = 1 then begin
+ w := mem[h].hh.rh;
+ skewlineedges(q, w, mem[w].hh.lh)
+ end {:523}
+ end; {:518}
+
+ procedure fillenvelope(spechead: halfword);
+ label
+ 30, 31;
+ var
+ p, q, r, s: halfword;
+ h: halfword;
+ www: halfword; {511:}
+ m, n: integer;
+ mm0, mm1: integer;
+ k: integer;
+ w, ww: halfword;
+ smoothbot, smoothtop: 0..movesize;
+ xx, yy, xp, yp, delx, dely, tx, ty: scaled; {:511}
+ begin
+ if internal[10] > 0 then
+ beginedgetracing;
+ {------------------------------------}
+ print_start(psfile); { Start cycle }
+ {------------------------------------}
+ p := spechead;
+ repeat
+ octant := mem[p + 3].int;
+ h := curpen + octant; {466:}
+ q := p;
+ while mem[q].hh.b1 <> 0 do
+ q := mem[q].hh.rh {:466}; {508:}
+ w := mem[h].hh.rh;
+ if mem[p + 4].int = 1 then
+ w := mem[w].hh.lh;
+{if internal[10]>65536 then[509:]begin printnl(447);
+print(octantdir[octant]);print(425);printint(mem[h].hh.lh);print(448);
+if mem[h].hh.lh<>1 then printchar(115);print(449);
+unskew(mem[p+1].int+mem[w+1].int,mem[p+2].int+mem[w+2].int,octant);
+printtwo(curx,cury);ww:=mem[h].hh.rh;
+if mem[q+6].int=1 then ww:=mem[ww].hh.lh;print(450);
+unskew(mem[q+1].int+mem[ww+1].int,mem[q+2].int+mem[ww+2].int,octant);
+printtwo(curx,cury);end[:509];}
+ ww := mem[h].hh.rh;
+ www := ww;
+ if odd(octantnumber[octant]) then
+ www := mem[www].hh.lh
+ else
+ ww := mem[ww].hh.lh;
+ if w <> ww then
+ skewlineedges(p, w, ww);
+ endround(mem[p + 1].int + mem[ww + 1].int, mem[p + 2].int + mem[ww + 2].int);
+ m0 := m1;
+ n0 := n1;
+ d0 := d1;
+ endround(mem[q + 1].int + mem[www + 1].int, mem[q + 2].int + mem[www + 2].int);
+ if (n1 - n0) >= movesize then
+ overflow(407, movesize) {:508};
+ offsetprep(p, h);
+{466:}
+ q := p;
+ while mem[q].hh.b1 <> 0 do
+ q := mem[q].hh.rh {:466}; {512:}
+ if odd(octantnumber[octant]) then begin {513:}
+ k := 0;
+ w := mem[h].hh.rh;
+ ww := mem[w].hh.lh;
+ mm0 := floorunscaled((mem[p + 1].int + mem[w + 1].int) - xycorr[octant]);
+ mm1 := floorunscaled((mem[q + 1].int + mem[ww + 1].int) - xycorr[octant]);
+ for n := 0 to n1 - n0 do
+ envmove[n] := mm0;
+ envmove[n1 - n0] := mm1;
+ moveptr := 0;
+ m := mm0 {:513};
+ r := p;
+ mem[q].hh.b1 := mem[h].hh.lh + 1;
+ while true do begin
+ if r = q then
+ smoothtop := moveptr;
+ while mem[r].hh.b1 <> k do begin {515:}
+ xx := mem[r + 1].int + mem[w + 1].int;
+ yy := (mem[r + 2].int + mem[w + 2].int) + 32768;
+{if internal[10]>65536 then begin printnl(452);printint(k);print(453);
+unskew(xx,yy-32768,octant);printtwo(curx,cury);end;}
+ {------------}
+ my_xx := xx;
+ my_yy := yy;
+ {------------}
+ if mem[r].hh.b1 > k then begin
+ k := k + 1;
+ w := mem[w].hh.rh;
+ xp := mem[r + 1].int + mem[w + 1].int;
+ yp := (mem[r + 2].int + mem[w + 2].int) + 32768;
+ if yp <> yy then begin {516:}
+ ty := floorscaled(yy - ycorr[octant]);
+ dely := yp - yy;
+ yy := yy - ty;
+ ty := (yp - ycorr[octant]) - ty;
+ if ty >= 65536 then begin
+ delx := xp - xx;
+ yy := 65536 - yy;
+ while true do begin
+ tx := takefraction(delx, makefraction(yy, dely));
+ if (abvscd(tx, dely, delx, yy) + xycorr[octant]) > 0 then
+ tx := tx - 1;
+ m := floorunscaled(xx + tx);
+ if m > envmove[moveptr] then
+ envmove[moveptr] := m;
+ ty := ty - 65536;
+ if ty < 65536 then
+ goto 31;
+ yy := yy + 65536;
+ moveptr := moveptr + 1
+ end;
+ 31:
+ null
+ end
+ end {:516}
+ end else begin
+ k := k - 1;
+ w := mem[w].hh.lh;
+ xp := mem[r + 1].int + mem[w + 1].int;
+ yp := (mem[r + 2].int + mem[w + 2].int) + 32768;
+ end;
+{if internal[10]>65536 then begin print(450);unskew(xp,yp-32768,octant);
+printtwo(curx,cury);printnl(155);end;}
+ {---------------------------------------------------}
+ sendline(my_xx,my_yy-32768,xp,yp-32768,octant,515);
+ {---------------------------------------------------}
+ m := floorunscaled(xp - xycorr[octant]);
+ moveptr := floorunscaled(yp - ycorr[octant]) - n0;
+ if m > envmove[moveptr] then
+ envmove[moveptr] := m
+ end {:515};
+ if r = p then
+ smoothbot := moveptr;
+ if r = q then
+ goto 30;
+ move[moveptr] := 1;
+ n := moveptr;
+ s := mem[r].hh.rh;
+ makemoves(mem[r + 1].int + mem[w + 1].int, mem[r + 5].int + mem[w + 1].int, mem[s + 3].int + mem[w + 1].int, mem[s + 1].int + mem[w + 1].int, (mem[r + 2].int + mem[w + 2].int) + 32768, (mem[r + 6].int + mem[w + 2].int) + 32768, (mem[s + 4].int + mem[w + 2].int) + 32768, (mem[s + 2].int + mem[w + 2].int) + 32768, xycorr[octant], ycorr[octant],512,octant); {514:}
+ repeat
+ m := (m + move[n]) - 1;
+ if m > envmove[n] then
+ envmove[n] := m;
+ n := n + 1
+ until n > moveptr {:514};
+ r := s
+ end;
+ 30: {517:}
+{if(m<>mm1)or(moveptr<>n1-n0)then confusion(49);}
+ move[0] := (d0 + envmove[0]) - mm0;
+ for n := 1 to moveptr do
+ move[n] := (envmove[n] - envmove[n - 1]) + 1;
+ move[moveptr] := move[moveptr] - d1;
+ if internal[35] > 0 then
+ smoothmoves(smoothbot, smoothtop);
+ movetoedges(m0, n0, m1, n1);
+ if mem[q + 6].int = 0 then begin
+ w := mem[h].hh.rh;
+ skewlineedges(q, mem[w].hh.lh, w)
+ end {:517}
+ end else
+ dualmoves(h, p, q);
+ mem[q].hh.b1 := 0 {:512};
+ p := mem[q].hh.rh
+ until p = spechead;
+ {------------------------------------}
+ print_end(psfile); { End cycle }
+ {------------------------------------}
+ if internal[10] > 0 then
+ endedgetracing;
+ tossknotlist(spechead)
+ end; {:506}
+{527:}
+
+ function makeellipse(majoraxis, minoraxis: scaled; theta: angle): halfword;
+ label
+ 30, 31, 40;
+ var
+ p, q, r, s: halfword;
+ h: halfword;
+ alpha, beta, gamma, delta: integer;
+ c, d: integer;
+ u, v: integer;
+ symmetric: boolean; {528:}
+ begin {530:}
+ if (majoraxis = minoraxis) or ((theta mod 94371840) = 0) then begin
+ symmetric := true;
+ alpha := 0;
+ if odd(theta div 94371840) then begin
+ beta := majoraxis;
+ gamma := minoraxis;
+ nsin := 268435456;
+ ncos := 0
+ end else begin
+ beta := minoraxis;
+ gamma := majoraxis
+ end
+ end else begin
+ symmetric := false;
+ nsincos(theta);
+ gamma := takefraction(majoraxis, nsin);
+ delta := takefraction(minoraxis, ncos);
+ beta := pythadd(gamma, delta);
+ alpha := takefraction(takefraction(majoraxis, makefraction(gamma, beta)), ncos) - takefraction(takefraction(minoraxis, makefraction(delta, beta)), nsin);
+ alpha := (alpha + 32768) div 65536;
+ gamma := pythadd(takefraction(majoraxis, ncos), takefraction(minoraxis, nsin))
+ end;
+ beta := (beta + 32768) div 65536;
+ gamma := (gamma + 32768) div 65536 {:530};
+ p := getnode(7);
+ q := getnode(7);
+ r := getnode(7);
+ if symmetric then
+ s := -30000
+ else
+ s := getnode(7);
+ h := p;
+ mem[p].hh.rh := q;
+ mem[q].hh.rh := r;
+ mem[r].hh.rh := s; {529:}
+ if beta = 0 then
+ beta := 1;
+ if gamma = 0 then
+ gamma := 1;
+ if gamma <= abs(alpha) then
+ if alpha > 0 then
+ alpha := gamma - 1
+ else
+ alpha := 1 - gamma {:529};
+ mem[p + 1].int := -(alpha * 32768);
+ mem[p + 2].int := -(beta * 32768);
+ mem[q + 1].int := gamma * 32768;
+ mem[q + 2].int := mem[p + 2].int;
+ mem[r + 1].int := mem[q + 1].int;
+ mem[p + 5].int := 0;
+ mem[q + 3].int := -32768;
+ mem[q + 5].int := 32768;
+ mem[r + 3].int := 0;
+ mem[r + 5].int := 0;
+ mem[p + 6].int := beta;
+ mem[q + 6].int := gamma;
+ mem[r + 6].int := beta;
+ mem[q + 4].int := gamma + alpha;
+ if symmetric then begin
+ mem[r + 2].int := 0;
+ mem[r + 4].int := beta
+ end else begin
+ mem[r + 2].int := -mem[p + 2].int;
+ mem[r + 4].int := beta + beta;
+ mem[s + 1].int := -mem[p + 1].int;
+ mem[s + 2].int := mem[r + 2].int;
+ mem[s + 3].int := 32768;
+ mem[s + 4].int := gamma - alpha
+ end {:528}; {531:}
+ while true do begin
+ u := mem[p + 5].int + mem[q + 5].int;
+ v := mem[q + 3].int + mem[r + 3].int;
+ c := mem[p + 6].int + mem[q + 6].int; {533:}
+ delta := pythadd(u, v);
+ if majoraxis = minoraxis then
+ d := majoraxis
+ else begin
+ if theta = 0 then begin
+ alpha := u;
+ beta := v
+ end else begin
+ alpha := takefraction(u, ncos) + takefraction(v, nsin);
+ beta := takefraction(v, ncos) - takefraction(u, nsin)
+ end;
+ alpha := makefraction(alpha, delta);
+ beta := makefraction(beta, delta);
+ d := pythadd(takefraction(majoraxis, alpha), takefraction(minoraxis, beta))
+ end;
+ d := takefraction(d, delta);
+ alpha := abs(u);
+ beta := abs(v);
+ if alpha < beta then begin
+ delta := alpha;
+ alpha := beta;
+ beta := delta
+ end;
+ if internal[38] <> 0 then
+ d := d - takefraction(internal[38], beta + beta);
+ d := (d + 4) div 8;
+ alpha := alpha div 32768;
+ if d < alpha then
+ d := alpha {:533};
+ delta := c - d;
+ if delta > 0 then begin
+ if delta > mem[r + 4].int then
+ delta := mem[r + 4].int;
+ if delta >= mem[q + 4].int then begin {534:}
+ delta := mem[q + 4].int;
+ mem[p + 6].int := c - delta;
+ mem[p + 5].int := u;
+ mem[q + 3].int := v;
+ mem[q + 1].int := mem[q + 1].int - (delta * mem[r + 3].int);
+ mem[q + 2].int := mem[q + 2].int + (delta * mem[q + 5].int);
+ mem[r + 4].int := mem[r + 4].int - delta
+ end else begin {:534} {535:}
+ s := getnode(7);
+ mem[p].hh.rh := s;
+ mem[s].hh.rh := q;
+ mem[s + 1].int := mem[q + 1].int + (delta * mem[q + 3].int);
+ mem[s + 2].int := mem[q + 2].int - (delta * mem[p + 5].int);
+ mem[q + 1].int := mem[q + 1].int - (delta * mem[r + 3].int);
+ mem[q + 2].int := mem[q + 2].int + (delta * mem[q + 5].int);
+ mem[s + 3].int := mem[q + 3].int;
+ mem[s + 5].int := u;
+ mem[q + 3].int := v;
+ mem[s + 6].int := c - delta;
+ mem[s + 4].int := mem[q + 4].int - delta;
+ mem[q + 4].int := delta;
+ mem[r + 4].int := mem[r + 4].int - delta
+ end {:535}
+ end else
+ p := q; {532:}
+ while true do begin
+ q := mem[p].hh.rh;
+ if q = (-30000) then
+ goto 30;
+ if mem[q + 4].int = 0 then begin
+ mem[p].hh.rh := mem[q].hh.rh;
+ mem[p + 6].int := mem[q + 6].int;
+ mem[p + 5].int := mem[q + 5].int;
+ freenode(q, 7)
+ end else begin
+ r := mem[q].hh.rh;
+ if r = (-30000) then
+ goto 30;
+ if mem[r + 4].int = 0 then begin
+ mem[p].hh.rh := r;
+ freenode(q, 7);
+ p := r
+ end else
+ goto 40
+ end
+ end;
+ 40: {:532}
+ null
+ end;
+ 30: {:531}
+ null;
+ if symmetric then begin {536:}
+ s := -30000;
+ q := h;
+ while true do begin
+ r := getnode(7);
+ mem[r].hh.rh := s;
+ s := r;
+ mem[s + 1].int := mem[q + 1].int;
+ mem[s + 2].int := -mem[q + 2].int;
+ if q = p then
+ goto 31;
+ q := mem[q].hh.rh;
+ if mem[q + 2].int = 0 then
+ goto 31
+ end;
+ 31:
+ mem[p].hh.rh := s;
+ beta := -mem[h + 2].int;
+ while mem[p + 2].int <> beta do
+ p := mem[p].hh.rh;
+ q := mem[p].hh.rh
+ end {:536};
+{537:}
+ if q <> (-30000) then begin
+ if mem[h + 5].int = 0 then begin
+ p := h;
+ h := mem[h].hh.rh;
+ freenode(p, 7);
+ mem[q + 1].int := -mem[h + 1].int
+ end;
+ p := q
+ end else
+ q := p;
+ r := mem[h].hh.rh;
+ repeat
+ s := getnode(7);
+ mem[p].hh.rh := s;
+ p := s;
+ mem[p + 1].int := -mem[r + 1].int;
+ mem[p + 2].int := -mem[r + 2].int;
+ r := mem[r].hh.rh
+ until r = q;
+ mem[p].hh.rh := h {:537};
+ makeellipse := h
+ end; {:527} {539:}
+
+ function finddirectiontime(x, y: scaled; h: halfword): scaled;
+ label
+ 10, 40, 45, 30;
+ var
+ max: scaled;
+ p, q: halfword;
+ n: scaled;
+ tt: scaled; {542:}
+ x1, x2, x3, y1, y2, y3: scaled;
+ theta, phi: angle;
+ t: fraction; {:542} {540:}
+ begin
+ if abs(x) < abs(y) then begin
+ x := makefraction(x, abs(y));
+ if y > 0 then
+ y := 268435456
+ else
+ y := -268435456
+ end else if x = 0 then begin
+ finddirectiontime := 0;
+ goto 10
+ end else begin
+ y := makefraction(y, abs(x));
+ if x > 0 then
+ x := 268435456
+ else
+ x := -268435456
+ end {:540};
+ n := 0;
+ p := h;
+ while true do begin
+ if mem[p].hh.b1 = 0 then
+ goto 45;
+ q := mem[p].hh.rh;
+{541:}
+ tt := 0; {543:}
+ x1 := mem[p + 5].int - mem[p + 1].int;
+ x2 := mem[q + 3].int - mem[p + 5].int;
+ x3 := mem[q + 1].int - mem[q + 3].int;
+ y1 := mem[p + 6].int - mem[p + 2].int;
+ y2 := mem[q + 4].int - mem[p + 6].int;
+ y3 := mem[q + 2].int - mem[q + 4].int;
+ max := abs(x1);
+ if abs(x2) > max then
+ max := abs(x2);
+ if abs(x3) > max then
+ max := abs(x3);
+ if abs(y1) > max then
+ max := abs(y1);
+ if abs(y2) > max then
+ max := abs(y2);
+ if abs(y3) > max then
+ max := abs(y3);
+ if max = 0 then
+ goto 40;
+ while max < 134217728 do begin
+ max := max + max;
+ x1 := x1 + x1;
+ x2 := x2 + x2;
+ x3 := x3 + x3;
+ y1 := y1 + y1;
+ y2 := y2 + y2;
+ y3 := y3 + y3
+ end;
+ t := x1;
+ x1 := takefraction(x1, x) + takefraction(y1, y);
+ y1 := takefraction(y1, x) - takefraction(t, y);
+ t := x2;
+ x2 := takefraction(x2, x) + takefraction(y2, y);
+ y2 := takefraction(y2, x) - takefraction(t, y);
+ t := x3;
+ x3 := takefraction(x3, x) + takefraction(y3, y);
+ y3 := takefraction(y3, x) - takefraction(t, y) {:543};
+ if y1 = 0 then
+ if x1 >= 0 then
+ goto 40;
+ if n > 0 then begin {544:}
+ theta := narg(x1, y1);
+ if theta >= 0 then
+ if phi <= 0 then
+ if phi >= (theta - 188743680) then
+ goto 40;
+ {:
+ 544}
+ if theta <= 0 then
+ if phi >= 0 then
+ if phi <= (theta + 188743680) then
+ goto 40;
+ if p = h then
+ goto 45
+ end;
+ if (x3 <> 0) or (y3 <> 0) then
+ phi := narg(x3, y3);
+{546:}
+ if x1 < 0 then
+ if x2 < 0 then
+ if x3 < 0 then
+ goto 30;
+ if abvscd(y1, y3, y2, y2) = 0 then begin {548:}
+ if abvscd(y1, y2, 0, 0) < 0 then begin
+ t := makefraction(y1, y1 - y2);
+ x1 := x1 - takefraction(x1 - x2, t);
+ x2 := x2 - takefraction(x2 - x3, t);
+ if (x1 - takefraction(x1 - x2, t)) >= 0 then begin
+ tt := (t + 2048) div 4096;
+ goto 40
+ end
+ end else if y3 = 0 then
+ if y1 = 0 then begin {549:}
+ t := crossingpoint(-x1, -x2, -x3);
+ if t <= 268435456 then begin
+ tt := (t + 2048) div 4096;
+ goto 40
+ end;
+ if abvscd(x1, x3, x2, x2) <= 0 then begin
+ t := makefraction(x1, x1 - x2);
+ begin
+ tt := (t + 2048) div 4096;
+ goto 40
+ end
+ end
+ end else if x3 >= 0 then begin {:549}
+ tt := 65536;
+ goto 40
+ end;
+ goto 30
+ end {:548};
+ if y1 <= 0 then
+ if y1 < 0 then begin
+ y1 := -y1;
+ y2 := -y2;
+ y3 := -y3
+ end else if y2 > 0 then begin
+ y2 := -y2;
+ y3 := -y3
+ end; {547:}
+ t := crossingpoint(y1, y2, y3);
+ if t > 268435456 then
+ goto 30;
+ y2 := y2 - takefraction(y2 - y3, t);
+ x1 := x1 - takefraction(x1 - x2, t);
+ x2 := x2 - takefraction(x2 - x3, t);
+ x1 := x1 - takefraction(x1 - x2, t);
+ if x1 >= 0 then begin
+ tt := (t + 2048) div 4096;
+ goto 40
+ end;
+ if y2 > 0 then
+ y2 := 0;
+ tt := t;
+ t := crossingpoint(0, -y2, -y3);
+ if t > 268435456 then
+ goto 30;
+ x1 := x1 - takefraction(x1 - x2, t);
+ x2 := x2 - takefraction(x2 - x3, t);
+ if (x1 - takefraction(x1 - x2, t)) >= 0 then begin
+ t := tt - takefraction(tt - 268435456, t);
+ begin
+ tt := (t + 2048) div 4096;
+ goto 40
+ end
+ end {:547};
+ 30: {:546}
+{:541}
+ null;
+ p := q;
+ n := n + 65536
+ end;
+ 45:
+ finddirectiontime := -65536;
+ goto 10;
+ 40:
+ finddirectiontime := n + tt;
+ 10:
+ null
+ end; {:539} {556:}
+
+ procedure cubicintersection(p, pp: halfword);
+ label
+ 22, 45, 10;
+ var
+ q, qq: halfword;
+ begin
+ timetogo := 5000;
+ maxt := 2; {558:}
+ q := mem[p].hh.rh;
+ qq := mem[pp].hh.rh;
+ bisectptr := 20;
+ bisectstack[bisectptr - 5] := mem[p + 5].int - mem[p + 1].int;
+ bisectstack[bisectptr - 4] := mem[q + 3].int - mem[p + 5].int;
+ bisectstack[bisectptr - 3] := mem[q + 1].int - mem[q + 3].int;
+ if bisectstack[bisectptr - 5] < 0 then
+ if bisectstack[bisectptr - 3] >= 0 then begin
+ if bisectstack[bisectptr - 4] < 0 then
+ bisectstack[bisectptr - 2] := bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]
+ else
+ bisectstack[bisectptr - 2] := bisectstack[bisectptr - 5];
+ bisectstack[bisectptr - 1] := (bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]) + bisectstack[bisectptr - 3];
+ if bisectstack[bisectptr - 1] < 0 then
+ bisectstack[bisectptr - 1] := 0
+ end else begin
+ bisectstack[bisectptr - 2] := (bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]) + bisectstack[bisectptr - 3];
+ if bisectstack[bisectptr - 2] > bisectstack[bisectptr - 5] then
+ bisectstack[bisectptr - 2] := bisectstack[bisectptr - 5];
+ bisectstack[bisectptr - 1] := bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4];
+ if bisectstack[bisectptr - 1] < 0 then
+ bisectstack[bisectptr - 1] := 0
+ end
+ else if bisectstack[bisectptr - 3] <= 0 then begin
+ if bisectstack[bisectptr - 4] > 0 then
+ bisectstack[bisectptr - 1] := bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]
+ else
+ bisectstack[bisectptr - 1] := bisectstack[bisectptr - 5];
+ bisectstack[bisectptr - 2] := (bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]) + bisectstack[bisectptr - 3];
+ if bisectstack[bisectptr - 2] > 0 then
+ bisectstack[bisectptr - 2] := 0
+ end else begin
+ bisectstack[bisectptr - 1] := (bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]) + bisectstack[bisectptr - 3];
+ if bisectstack[bisectptr - 1] < bisectstack[bisectptr - 5] then
+ bisectstack[bisectptr - 1] := bisectstack[bisectptr - 5];
+ bisectstack[bisectptr - 2] := bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4];
+ if bisectstack[bisectptr - 2] > 0 then
+ bisectstack[bisectptr - 2] := 0
+ end;
+ bisectstack[bisectptr - 10] := mem[p + 6].int - mem[p + 2].int;
+ bisectstack[bisectptr - 9] := mem[q + 4].int - mem[p + 6].int;
+ bisectstack[bisectptr - 8] := mem[q + 2].int - mem[q + 4].int;
+ if bisectstack[bisectptr - 10] < 0 then
+ if bisectstack[bisectptr - 8] >= 0 then begin
+ if bisectstack[bisectptr - 9] < 0 then
+ bisectstack[bisectptr - 7] := bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]
+ else
+ bisectstack[bisectptr - 7] := bisectstack[bisectptr - 10];
+ bisectstack[bisectptr - 6] := (bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]) + bisectstack[bisectptr - 8];
+ if bisectstack[bisectptr - 6] < 0 then
+ bisectstack[bisectptr - 6] := 0
+ end else begin
+ bisectstack[bisectptr - 7] := (bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]) + bisectstack[bisectptr - 8];
+ if bisectstack[bisectptr - 7] > bisectstack[bisectptr - 10] then
+ bisectstack[bisectptr - 7] := bisectstack[bisectptr - 10];
+ bisectstack[bisectptr - 6] := bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9];
+ if bisectstack[bisectptr - 6] < 0 then
+ bisectstack[bisectptr - 6] := 0
+ end
+ else if bisectstack[bisectptr - 8] <= 0 then begin
+ if bisectstack[bisectptr - 9] > 0 then
+ bisectstack[bisectptr - 6] := bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]
+ else
+ bisectstack[bisectptr - 6] := bisectstack[bisectptr - 10];
+ bisectstack[bisectptr - 7] := (bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]) + bisectstack[bisectptr - 8];
+ if bisectstack[bisectptr - 7] > 0 then
+ bisectstack[bisectptr - 7] := 0
+ end else begin
+ bisectstack[bisectptr - 6] := (bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]) + bisectstack[bisectptr - 8];
+ if bisectstack[bisectptr - 6] < bisectstack[bisectptr - 10] then
+ bisectstack[bisectptr - 6] := bisectstack[bisectptr - 10];
+ bisectstack[bisectptr - 7] := bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9];
+ if bisectstack[bisectptr - 7] > 0 then
+ bisectstack[bisectptr - 7] := 0
+ end;
+ bisectstack[bisectptr - 15] := mem[pp + 5].int - mem[pp + 1].int;
+ bisectstack[bisectptr - 14] := mem[qq + 3].int - mem[pp + 5].int;
+ bisectstack[bisectptr - 13] := mem[qq + 1].int - mem[qq + 3].int;
+ if bisectstack[bisectptr - 15] < 0 then
+ if bisectstack[bisectptr - 13] >= 0 then begin
+ if bisectstack[bisectptr - 14] < 0 then
+ bisectstack[bisectptr - 12] := bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]
+ else
+ bisectstack[bisectptr - 12] := bisectstack[bisectptr - 15];
+ bisectstack[bisectptr - 11] := (bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]) + bisectstack[bisectptr - 13];
+ if bisectstack[bisectptr - 11] < 0 then
+ bisectstack[bisectptr - 11] := 0
+ end else begin
+ bisectstack[bisectptr - 12] := (bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]) + bisectstack[bisectptr - 13];
+ if bisectstack[bisectptr - 12] > bisectstack[bisectptr - 15] then
+ bisectstack[bisectptr - 12] := bisectstack[bisectptr - 15];
+ bisectstack[bisectptr - 11] := bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14];
+ if bisectstack[bisectptr - 11] < 0 then
+ bisectstack[bisectptr - 11] := 0
+ end
+ else if bisectstack[bisectptr - 13] <= 0 then begin
+ if bisectstack[bisectptr - 14] > 0 then
+ bisectstack[bisectptr - 11] := bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]
+ else
+ bisectstack[bisectptr - 11] := bisectstack[bisectptr - 15];
+ bisectstack[bisectptr - 12] := (bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]) + bisectstack[bisectptr - 13];
+ if bisectstack[bisectptr - 12] > 0 then
+ bisectstack[bisectptr - 12] := 0
+ end else begin
+ bisectstack[bisectptr - 11] := (bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]) + bisectstack[bisectptr - 13];
+ if bisectstack[bisectptr - 11] < bisectstack[bisectptr - 15] then
+ bisectstack[bisectptr - 11] := bisectstack[bisectptr - 15];
+ bisectstack[bisectptr - 12] := bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14];
+ if bisectstack[bisectptr - 12] > 0 then
+ bisectstack[bisectptr - 12] := 0
+ end;
+ bisectstack[bisectptr - 20] := mem[pp + 6].int - mem[pp + 2].int;
+ bisectstack[bisectptr - 19] := mem[qq + 4].int - mem[pp + 6].int;
+ bisectstack[bisectptr - 18] := mem[qq + 2].int - mem[qq + 4].int;
+ if bisectstack[bisectptr - 20] < 0 then
+ if bisectstack[bisectptr - 18] >= 0 then begin
+ if bisectstack[bisectptr - 19] < 0 then
+ bisectstack[bisectptr - 17] := bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]
+ else
+ bisectstack[bisectptr - 17] := bisectstack[bisectptr - 20];
+ bisectstack[bisectptr - 16] := (bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]) + bisectstack[bisectptr - 18];
+ if bisectstack[bisectptr - 16] < 0 then
+ bisectstack[bisectptr - 16] := 0
+ end else begin
+ bisectstack[bisectptr - 17] := (bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]) + bisectstack[bisectptr - 18];
+ if bisectstack[bisectptr - 17] > bisectstack[bisectptr - 20] then
+ bisectstack[bisectptr - 17] := bisectstack[bisectptr - 20];
+ bisectstack[bisectptr - 16] := bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19];
+ if bisectstack[bisectptr - 16] < 0 then
+ bisectstack[bisectptr - 16] := 0
+ end
+ else if bisectstack[bisectptr - 18] <= 0 then begin
+ if bisectstack[bisectptr - 19] > 0 then
+ bisectstack[bisectptr - 16] := bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]
+ else
+ bisectstack[bisectptr - 16] := bisectstack[bisectptr - 20];
+ bisectstack[bisectptr - 17] := (bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]) + bisectstack[bisectptr - 18];
+ if bisectstack[bisectptr - 17] > 0 then
+ bisectstack[bisectptr - 17] := 0
+ end else begin
+ bisectstack[bisectptr - 16] := (bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]) + bisectstack[bisectptr - 18];
+ if bisectstack[bisectptr - 16] < bisectstack[bisectptr - 20] then
+ bisectstack[bisectptr - 16] := bisectstack[bisectptr - 20];
+ bisectstack[bisectptr - 17] := bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19];
+ if bisectstack[bisectptr - 17] > 0 then
+ bisectstack[bisectptr - 17] := 0
+ end;
+ delx := mem[p + 1].int - mem[pp + 1].int;
+ dely := mem[p + 2].int - mem[pp + 2].int;
+ tol := 0;
+ uv := bisectptr;
+ xy := bisectptr;
+ threel := 0;
+ curt := 1;
+ curtt := 1 {:558};
+ while true do begin
+ 22:
+ if (delx - tol) <= (bisectstack[xy - 11] - bisectstack[uv - 2]) then
+ if (delx + tol) >= (bisectstack[xy - 12] - bisectstack[uv - 1]) then
+ if (dely - tol) <= (bisectstack[xy - 16] - bisectstack[uv - 7]) then
+ if (dely + tol) >= (bisectstack[xy - 17] - bisectstack[uv - 6]) then begin
+ if curt >= maxt then begin
+ if maxt = 131072 then begin
+ curt := (curt + 1) div 2;
+ curtt := (curtt + 1) div 2;
+ goto 10
+ end;
+ maxt := maxt + maxt;
+ apprt := curt;
+ apprtt := curtt
+ end; {559:}
+ bisectstack[bisectptr] := delx;
+ bisectstack[bisectptr + 1] := dely;
+ bisectstack[bisectptr + 2] := tol;
+ bisectstack[bisectptr + 3] := uv;
+ bisectstack[bisectptr + 4] := xy;
+ bisectptr := bisectptr + 45;
+ curt := curt + curt;
+ curtt := curtt + curtt;
+ bisectstack[bisectptr - 25] := bisectstack[uv - 5];
+ bisectstack[bisectptr - 3] := bisectstack[uv - 3];
+ bisectstack[bisectptr - 24] := (bisectstack[bisectptr - 25] + bisectstack[uv - 4]) div 2;
+ bisectstack[bisectptr - 4] := (bisectstack[bisectptr - 3] + bisectstack[uv - 4]) div 2;
+ bisectstack[bisectptr - 23] := (bisectstack[bisectptr - 24] + bisectstack[bisectptr - 4]) div 2;
+ bisectstack[bisectptr - 5] := bisectstack[bisectptr - 23];
+ if bisectstack[bisectptr - 25] < 0 then
+ if bisectstack[bisectptr - 23] >= 0 then begin
+ if bisectstack[bisectptr - 24] < 0 then
+ bisectstack[bisectptr - 22] := bisectstack[bisectptr - 25] + bisectstack[bisectptr - 24]
+ else
+ bisectstack[bisectptr - 22] := bisectstack[bisectptr - 25];
+ bisectstack[bisectptr - 21] := (bisectstack[bisectptr - 25] + bisectstack[bisectptr - 24]) + bisectstack[bisectptr - 23];
+ if bisectstack[bisectptr - 21] < 0 then
+ bisectstack[bisectptr - 21] := 0
+ end else begin
+ bisectstack[bisectptr - 22] := (bisectstack[bisectptr - 25] + bisectstack[bisectptr - 24]) + bisectstack[bisectptr - 23];
+ if bisectstack[bisectptr - 22] > bisectstack[bisectptr - 25] then
+ bisectstack[bisectptr - 22] := bisectstack[bisectptr - 25];
+ bisectstack[bisectptr - 21] := bisectstack[bisectptr - 25] + bisectstack[bisectptr - 24];
+ if bisectstack[bisectptr - 21] < 0 then
+ bisectstack[bisectptr - 21] := 0
+ end
+ else if bisectstack[bisectptr - 23] <= 0 then begin
+ if bisectstack[bisectptr - 24] > 0 then
+ bisectstack[bisectptr - 21] := bisectstack[bisectptr - 25] + bisectstack[bisectptr - 24]
+ else
+ bisectstack[bisectptr - 21] := bisectstack[bisectptr - 25];
+ bisectstack[bisectptr - 22] := (bisectstack[bisectptr - 25] + bisectstack[bisectptr - 24]) + bisectstack[bisectptr - 23];
+ if bisectstack[bisectptr - 22] > 0 then
+ bisectstack[bisectptr - 22] := 0
+ end else begin
+ bisectstack[bisectptr - 21] := (bisectstack[bisectptr - 25] + bisectstack[bisectptr - 24]) + bisectstack[bisectptr - 23];
+ if bisectstack[bisectptr - 21] < bisectstack[bisectptr - 25] then
+ bisectstack[bisectptr - 21] := bisectstack[bisectptr - 25];
+ bisectstack[bisectptr - 22] := bisectstack[bisectptr - 25] + bisectstack[bisectptr - 24];
+ if bisectstack[bisectptr - 22] > 0 then
+ bisectstack[bisectptr - 22] := 0
+ end;
+ if bisectstack[bisectptr - 5] < 0 then
+ if bisectstack[bisectptr - 3] >= 0 then begin
+ if bisectstack[bisectptr - 4] < 0 then
+ bisectstack[bisectptr - 2] := bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]
+ else
+ bisectstack[bisectptr - 2] := bisectstack[bisectptr - 5];
+ bisectstack[bisectptr - 1] := (bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]) + bisectstack[bisectptr - 3];
+ if bisectstack[bisectptr - 1] < 0 then
+ bisectstack[bisectptr - 1] := 0
+ end else begin
+ bisectstack[bisectptr - 2] := (bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]) + bisectstack[bisectptr - 3];
+ if bisectstack[bisectptr - 2] > bisectstack[bisectptr - 5] then
+ bisectstack[bisectptr - 2] := bisectstack[bisectptr - 5];
+ bisectstack[bisectptr - 1] := bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4];
+ if bisectstack[bisectptr - 1] < 0 then
+ bisectstack[bisectptr - 1] := 0
+ end
+ else if bisectstack[bisectptr - 3] <= 0 then begin
+ if bisectstack[bisectptr - 4] > 0 then
+ bisectstack[bisectptr - 1] := bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]
+ else
+ bisectstack[bisectptr - 1] := bisectstack[bisectptr - 5];
+ bisectstack[bisectptr - 2] := (bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]) + bisectstack[bisectptr - 3];
+ if bisectstack[bisectptr - 2] > 0 then
+ bisectstack[bisectptr - 2] := 0
+ end else begin
+ bisectstack[bisectptr - 1] := (bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4]) + bisectstack[bisectptr - 3];
+ if bisectstack[bisectptr - 1] < bisectstack[bisectptr - 5] then
+ bisectstack[bisectptr - 1] := bisectstack[bisectptr - 5];
+ bisectstack[bisectptr - 2] := bisectstack[bisectptr - 5] + bisectstack[bisectptr - 4];
+ if bisectstack[bisectptr - 2] > 0 then
+ bisectstack[bisectptr - 2] := 0
+ end;
+ bisectstack[bisectptr - 30] := bisectstack[uv - 10];
+ bisectstack[bisectptr - 8] := bisectstack[uv - 8];
+ bisectstack[bisectptr - 29] := (bisectstack[bisectptr - 30] + bisectstack[uv - 9]) div 2;
+ bisectstack[bisectptr - 9] := (bisectstack[bisectptr - 8] + bisectstack[uv - 9]) div 2;
+ bisectstack[bisectptr - 28] := (bisectstack[bisectptr - 29] + bisectstack[bisectptr - 9]) div 2;
+ bisectstack[bisectptr - 10] := bisectstack[bisectptr - 28];
+ if bisectstack[bisectptr - 30] < 0 then
+ if bisectstack[bisectptr - 28] >= 0 then begin
+ if bisectstack[bisectptr - 29] < 0 then
+ bisectstack[bisectptr - 27] := bisectstack[bisectptr - 30] + bisectstack[bisectptr - 29]
+ else
+ bisectstack[bisectptr - 27] := bisectstack[bisectptr - 30];
+ bisectstack[bisectptr - 26] := (bisectstack[bisectptr - 30] + bisectstack[bisectptr - 29]) + bisectstack[bisectptr - 28];
+ if bisectstack[bisectptr - 26] < 0 then
+ bisectstack[bisectptr - 26] := 0
+ end else begin
+ bisectstack[bisectptr - 27] := (bisectstack[bisectptr - 30] + bisectstack[bisectptr - 29]) + bisectstack[bisectptr - 28];
+ if bisectstack[bisectptr - 27] > bisectstack[bisectptr - 30] then
+ bisectstack[bisectptr - 27] := bisectstack[bisectptr - 30];
+ bisectstack[bisectptr - 26] := bisectstack[bisectptr - 30] + bisectstack[bisectptr - 29];
+ if bisectstack[bisectptr - 26] < 0 then
+ bisectstack[bisectptr - 26] := 0
+ end
+ else if bisectstack[bisectptr - 28] <= 0 then begin
+ if bisectstack[bisectptr - 29] > 0 then
+ bisectstack[bisectptr - 26] := bisectstack[bisectptr - 30] + bisectstack[bisectptr - 29]
+ else
+ bisectstack[bisectptr - 26] := bisectstack[bisectptr - 30];
+ bisectstack[bisectptr - 27] := (bisectstack[bisectptr - 30] + bisectstack[bisectptr - 29]) + bisectstack[bisectptr - 28];
+ if bisectstack[bisectptr - 27] > 0 then
+ bisectstack[bisectptr - 27] := 0
+ end else begin
+ bisectstack[bisectptr - 26] := (bisectstack[bisectptr - 30] + bisectstack[bisectptr - 29]) + bisectstack[bisectptr - 28];
+ if bisectstack[bisectptr - 26] < bisectstack[bisectptr - 30] then
+ bisectstack[bisectptr - 26] := bisectstack[bisectptr - 30];
+ bisectstack[bisectptr - 27] := bisectstack[bisectptr - 30] + bisectstack[bisectptr - 29];
+ if bisectstack[bisectptr - 27] > 0 then
+ bisectstack[bisectptr - 27] := 0
+ end;
+ if bisectstack[bisectptr - 10] < 0 then
+ if bisectstack[bisectptr - 8] >= 0 then begin
+ if bisectstack[bisectptr - 9] < 0 then
+ bisectstack[bisectptr - 7] := bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]
+ else
+ bisectstack[bisectptr - 7] := bisectstack[bisectptr - 10];
+ bisectstack[bisectptr - 6] := (bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]) + bisectstack[bisectptr - 8];
+ if bisectstack[bisectptr - 6] < 0 then
+ bisectstack[bisectptr - 6] := 0
+ end else begin
+ bisectstack[bisectptr - 7] := (bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]) + bisectstack[bisectptr - 8];
+ if bisectstack[bisectptr - 7] > bisectstack[bisectptr - 10] then
+ bisectstack[bisectptr - 7] := bisectstack[bisectptr - 10];
+ bisectstack[bisectptr - 6] := bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9];
+ if bisectstack[bisectptr - 6] < 0 then
+ bisectstack[bisectptr - 6] := 0
+ end
+ else if bisectstack[bisectptr - 8] <= 0 then begin
+ if bisectstack[bisectptr - 9] > 0 then
+ bisectstack[bisectptr - 6] := bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]
+ else
+ bisectstack[bisectptr - 6] := bisectstack[bisectptr - 10];
+ bisectstack[bisectptr - 7] := (bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]) + bisectstack[bisectptr - 8];
+ if bisectstack[bisectptr - 7] > 0 then
+ bisectstack[bisectptr - 7] := 0
+ end else begin
+ bisectstack[bisectptr - 6] := (bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9]) + bisectstack[bisectptr - 8];
+ if bisectstack[bisectptr - 6] < bisectstack[bisectptr - 10] then
+ bisectstack[bisectptr - 6] := bisectstack[bisectptr - 10];
+ bisectstack[bisectptr - 7] := bisectstack[bisectptr - 10] + bisectstack[bisectptr - 9];
+ if bisectstack[bisectptr - 7] > 0 then
+ bisectstack[bisectptr - 7] := 0
+ end;
+ bisectstack[bisectptr - 35] := bisectstack[xy - 15];
+ bisectstack[bisectptr - 13] := bisectstack[xy - 13];
+ bisectstack[bisectptr - 34] := (bisectstack[bisectptr - 35] + bisectstack[xy - 14]) div 2;
+ bisectstack[bisectptr - 14] := (bisectstack[bisectptr - 13] + bisectstack[xy - 14]) div 2;
+ bisectstack[bisectptr - 33] := (bisectstack[bisectptr - 34] + bisectstack[bisectptr - 14]) div 2;
+ bisectstack[bisectptr - 15] := bisectstack[bisectptr - 33];
+ if bisectstack[bisectptr - 35] < 0 then
+ if bisectstack[bisectptr - 33] >= 0 then begin
+ if bisectstack[bisectptr - 34] < 0 then
+ bisectstack[bisectptr - 32] := bisectstack[bisectptr - 35] + bisectstack[bisectptr - 34]
+ else
+ bisectstack[bisectptr - 32] := bisectstack[bisectptr - 35];
+ bisectstack[bisectptr - 31] := (bisectstack[bisectptr - 35] + bisectstack[bisectptr - 34]) + bisectstack[bisectptr - 33];
+ if bisectstack[bisectptr - 31] < 0 then
+ bisectstack[bisectptr - 31] := 0
+ end else begin
+ bisectstack[bisectptr - 32] := (bisectstack[bisectptr - 35] + bisectstack[bisectptr - 34]) + bisectstack[bisectptr - 33];
+ if bisectstack[bisectptr - 32] > bisectstack[bisectptr - 35] then
+ bisectstack[bisectptr - 32] := bisectstack[bisectptr - 35];
+ bisectstack[bisectptr - 31] := bisectstack[bisectptr - 35] + bisectstack[bisectptr - 34];
+ if bisectstack[bisectptr - 31] < 0 then
+ bisectstack[bisectptr - 31] := 0
+ end
+ else if bisectstack[bisectptr - 33] <= 0 then begin
+ if bisectstack[bisectptr - 34] > 0 then
+ bisectstack[bisectptr - 31] := bisectstack[bisectptr - 35] + bisectstack[bisectptr - 34]
+ else
+ bisectstack[bisectptr - 31] := bisectstack[bisectptr - 35];
+ bisectstack[bisectptr - 32] := (bisectstack[bisectptr - 35] + bisectstack[bisectptr - 34]) + bisectstack[bisectptr - 33];
+ if bisectstack[bisectptr - 32] > 0 then
+ bisectstack[bisectptr - 32] := 0
+ end else begin
+ bisectstack[bisectptr - 31] := (bisectstack[bisectptr - 35] + bisectstack[bisectptr - 34]) + bisectstack[bisectptr - 33];
+ if bisectstack[bisectptr - 31] < bisectstack[bisectptr - 35] then
+ bisectstack[bisectptr - 31] := bisectstack[bisectptr - 35];
+ bisectstack[bisectptr - 32] := bisectstack[bisectptr - 35] + bisectstack[bisectptr - 34];
+ if bisectstack[bisectptr - 32] > 0 then
+ bisectstack[bisectptr - 32] := 0
+ end;
+ if bisectstack[bisectptr - 15] < 0 then
+ if bisectstack[bisectptr - 13] >= 0 then begin
+ if bisectstack[bisectptr - 14] < 0 then
+ bisectstack[bisectptr - 12] := bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]
+ else
+ bisectstack[bisectptr - 12] := bisectstack[bisectptr - 15];
+ bisectstack[bisectptr - 11] := (bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]) + bisectstack[bisectptr - 13];
+ if bisectstack[bisectptr - 11] < 0 then
+ bisectstack[bisectptr - 11] := 0
+ end else begin
+ bisectstack[bisectptr - 12] := (bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]) + bisectstack[bisectptr - 13];
+ if bisectstack[bisectptr - 12] > bisectstack[bisectptr - 15] then
+ bisectstack[bisectptr - 12] := bisectstack[bisectptr - 15];
+ bisectstack[bisectptr - 11] := bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14];
+ if bisectstack[bisectptr - 11] < 0 then
+ bisectstack[bisectptr - 11] := 0
+ end
+ else if bisectstack[bisectptr - 13] <= 0 then begin
+ if bisectstack[bisectptr - 14] > 0 then
+ bisectstack[bisectptr - 11] := bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]
+ else
+ bisectstack[bisectptr - 11] := bisectstack[bisectptr - 15];
+ bisectstack[bisectptr - 12] := (bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]) + bisectstack[bisectptr - 13];
+ if bisectstack[bisectptr - 12] > 0 then
+ bisectstack[bisectptr - 12] := 0
+ end else begin
+ bisectstack[bisectptr - 11] := (bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14]) + bisectstack[bisectptr - 13];
+ if bisectstack[bisectptr - 11] < bisectstack[bisectptr - 15] then
+ bisectstack[bisectptr - 11] := bisectstack[bisectptr - 15];
+ bisectstack[bisectptr - 12] := bisectstack[bisectptr - 15] + bisectstack[bisectptr - 14];
+ if bisectstack[bisectptr - 12] > 0 then
+ bisectstack[bisectptr - 12] := 0
+ end;
+ bisectstack[bisectptr - 40] := bisectstack[xy - 20];
+ bisectstack[bisectptr - 18] := bisectstack[xy - 18];
+ bisectstack[bisectptr - 39] := (bisectstack[bisectptr - 40] + bisectstack[xy - 19]) div 2;
+ bisectstack[bisectptr - 19] := (bisectstack[bisectptr - 18] + bisectstack[xy - 19]) div 2;
+ bisectstack[bisectptr - 38] := (bisectstack[bisectptr - 39] + bisectstack[bisectptr - 19]) div 2;
+ bisectstack[bisectptr - 20] := bisectstack[bisectptr - 38];
+ if bisectstack[bisectptr - 40] < 0 then
+ if bisectstack[bisectptr - 38] >= 0 then begin
+ if bisectstack[bisectptr - 39] < 0 then
+ bisectstack[bisectptr - 37] := bisectstack[bisectptr - 40] + bisectstack[bisectptr - 39]
+ else
+ bisectstack[bisectptr - 37] := bisectstack[bisectptr - 40];
+ bisectstack[bisectptr - 36] := (bisectstack[bisectptr - 40] + bisectstack[bisectptr - 39]) + bisectstack[bisectptr - 38];
+ if bisectstack[bisectptr - 36] < 0 then
+ bisectstack[bisectptr - 36] := 0
+ end else begin
+ bisectstack[bisectptr - 37] := (bisectstack[bisectptr - 40] + bisectstack[bisectptr - 39]) + bisectstack[bisectptr - 38];
+ if bisectstack[bisectptr - 37] > bisectstack[bisectptr - 40] then
+ bisectstack[bisectptr - 37] := bisectstack[bisectptr - 40];
+ bisectstack[bisectptr - 36] := bisectstack[bisectptr - 40] + bisectstack[bisectptr - 39];
+ if bisectstack[bisectptr - 36] < 0 then
+ bisectstack[bisectptr - 36] := 0
+ end
+ else if bisectstack[bisectptr - 38] <= 0 then begin
+ if bisectstack[bisectptr - 39] > 0 then
+ bisectstack[bisectptr - 36] := bisectstack[bisectptr - 40] + bisectstack[bisectptr - 39]
+ else
+ bisectstack[bisectptr - 36] := bisectstack[bisectptr - 40];
+ bisectstack[bisectptr - 37] := (bisectstack[bisectptr - 40] + bisectstack[bisectptr - 39]) + bisectstack[bisectptr - 38];
+ if bisectstack[bisectptr - 37] > 0 then
+ bisectstack[bisectptr - 37] := 0
+ end else begin
+ bisectstack[bisectptr - 36] := (bisectstack[bisectptr - 40] + bisectstack[bisectptr - 39]) + bisectstack[bisectptr - 38];
+ if bisectstack[bisectptr - 36] < bisectstack[bisectptr - 40] then
+ bisectstack[bisectptr - 36] := bisectstack[bisectptr - 40];
+ bisectstack[bisectptr - 37] := bisectstack[bisectptr - 40] + bisectstack[bisectptr - 39];
+ if bisectstack[bisectptr - 37] > 0 then
+ bisectstack[bisectptr - 37] := 0
+ end;
+ if bisectstack[bisectptr - 20] < 0 then
+ if bisectstack[bisectptr - 18] >= 0 then begin
+ if bisectstack[bisectptr - 19] < 0 then
+ bisectstack[bisectptr - 17] := bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]
+ else
+ bisectstack[bisectptr - 17] := bisectstack[bisectptr - 20];
+ bisectstack[bisectptr - 16] := (bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]) + bisectstack[bisectptr - 18];
+ if bisectstack[bisectptr - 16] < 0 then
+ bisectstack[bisectptr - 16] := 0
+ end else begin
+ bisectstack[bisectptr - 17] := (bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]) + bisectstack[bisectptr - 18];
+ if bisectstack[bisectptr - 17] > bisectstack[bisectptr - 20] then
+ bisectstack[bisectptr - 17] := bisectstack[bisectptr - 20];
+ bisectstack[bisectptr - 16] := bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19];
+ if bisectstack[bisectptr - 16] < 0 then
+ bisectstack[bisectptr - 16] := 0
+ end
+ else if bisectstack[bisectptr - 18] <= 0 then begin
+ if bisectstack[bisectptr - 19] > 0 then
+ bisectstack[bisectptr - 16] := bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]
+ else
+ bisectstack[bisectptr - 16] := bisectstack[bisectptr - 20];
+ bisectstack[bisectptr - 17] := (bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]) + bisectstack[bisectptr - 18];
+ if bisectstack[bisectptr - 17] > 0 then
+ bisectstack[bisectptr - 17] := 0
+ end else begin
+ bisectstack[bisectptr - 16] := (bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19]) + bisectstack[bisectptr - 18];
+ if bisectstack[bisectptr - 16] < bisectstack[bisectptr - 20] then
+ bisectstack[bisectptr - 16] := bisectstack[bisectptr - 20];
+ bisectstack[bisectptr - 17] := bisectstack[bisectptr - 20] + bisectstack[bisectptr - 19];
+ if bisectstack[bisectptr - 17] > 0 then
+ bisectstack[bisectptr - 17] := 0
+ end;
+ uv := bisectptr - 20;
+ xy := bisectptr - 20;
+ delx := delx + delx;
+ dely := dely + dely;
+ tol := (tol - threel) + tolstep;
+ tol := tol + tol;
+ threel := threel + tolstep {:559};
+ goto 22
+ end;
+ if timetogo > 0 then
+ timetogo := timetogo - 1
+ else begin
+ while apprt < 65536 do begin
+ apprt := apprt + apprt;
+ apprtt := apprtt + apprtt
+ end;
+ curt := apprt;
+ curtt := apprtt;
+ goto 10
+ end; {560:}
+ 45:
+ if odd(curtt) then
+ if odd(curt) then begin {561:}
+ curt := curt div 2;
+ curtt := curtt div 2;
+ if curt = 0 then
+ goto 10;
+ bisectptr := bisectptr - 45;
+ threel := threel - tolstep;
+ delx := bisectstack[bisectptr];
+ dely := bisectstack[bisectptr + 1];
+ tol := bisectstack[bisectptr + 2];
+ uv := bisectstack[bisectptr + 3];
+ xy := bisectstack[bisectptr + 4];
+ goto 45
+ end else begin {:561}
+ curt := curt + 1;
+ delx := ((delx + bisectstack[uv - 5]) + bisectstack[uv - 4]) + bisectstack[uv - 3];
+ dely := ((dely + bisectstack[uv - 10]) + bisectstack[uv - 9]) + bisectstack[uv - 8];
+ uv := uv + 20;
+ curtt := curtt - 1;
+ xy := xy - 20;
+ delx := ((delx + bisectstack[xy - 15]) + bisectstack[xy - 14]) + bisectstack[xy - 13];
+ dely := ((dely + bisectstack[xy - 20]) + bisectstack[xy - 19]) + bisectstack[xy - 18]
+ end
+ else begin
+ curtt := curtt + 1;
+ tol := tol + threel;
+ delx := ((delx - bisectstack[xy - 15]) - bisectstack[xy - 14]) - bisectstack[xy - 13];
+ dely := ((dely - bisectstack[xy - 20]) - bisectstack[xy - 19]) - bisectstack[xy - 18];
+ xy := xy + 20
+ end {:560}
+ end;
+ 10:
+ null
+ end; {:556} {562:}
+
+ procedure pathintersection(h, hh: halfword);
+ label
+ 10;
+ var
+ p, pp: halfword;
+ n, nn: integer; {563:}
+ begin
+ if mem[h].hh.b1 = 0 then begin
+ mem[h + 5].int := mem[h + 1].int;
+ mem[h + 3].int := mem[h + 1].int;
+ mem[h + 6].int := mem[h + 2].int;
+ mem[h + 4].int := mem[h + 2].int;
+ mem[h].hh.b1 := 1
+ end;
+ if mem[hh].hh.b1 = 0 then begin
+ mem[hh + 5].int := mem[hh + 1].int;
+ mem[hh + 3].int := mem[hh + 1].int;
+ mem[hh + 6].int := mem[hh + 2].int;
+ mem[hh + 4].int := mem[hh + 2].int;
+ mem[hh].hh.b1 := 1
+ end; {:563}
+ tolstep := 0;
+ repeat
+ n := -65536;
+ p := h;
+ repeat
+ if mem[p].hh.b1 <> 0 then begin
+ nn := -65536;
+ pp := hh;
+ repeat
+ if mem[pp].hh.b1 <> 0 then begin
+ cubicintersection(p, pp);
+ if curt > 0 then begin
+ curt := curt + n;
+ curtt := curtt + nn;
+ goto 10
+ end
+ end;
+ nn := nn + 65536;
+ pp := mem[pp].hh.rh
+ until pp = hh
+ end;
+ n := n + 65536;
+ p := mem[p].hh.rh
+ until p = h;
+ tolstep := tolstep + 3
+ until tolstep > 3;
+ curt := -65536;
+ curtt := -65536;
+ 10:
+ null
+ end; {:562} {574:}
+
+ procedure openawindow(k: windownumber; r0, c0, r1, c1: scaled; x, y: scaled);
+ var
+ m, n: integer; {575:}
+ begin
+ if r0 < 0 then
+ r0 := 0
+ else
+ r0 := roundunscaled(r0);
+ r1 := roundunscaled(r1);
+ if r1 > screendepth then
+ r1 := screendepth;
+ if r1 < r0 then
+ if r0 > screendepth then
+ r0 := r1
+ else
+ r1 := r0;
+ if c0 < 0 then
+ c0 := 0
+ else
+ c0 := roundunscaled(c0);
+ c1 := roundunscaled(c1);
+ if c1 > screenwidth then
+ c1 := screenwidth;
+ if c1 < c0 then
+ if c0 > screenwidth then
+ c0 := c1
+ else
+ c1 := c0 {:575};
+ windowopen[k] := true;
+ windowtime[k] := windowtime[k] + 1;
+ leftcol[k] := c0;
+ rightcol[k] := c1;
+ toprow[k] := r0;
+ botrow[k] := r1; {576:}
+ m := roundunscaled(x);
+ n := roundunscaled(y) - 1;
+ mwindow[k] := c0 - m;
+ nwindow[k] := r0 + n {:576};
+ begin
+ if not screenstarted then begin
+ screenOK := initscreen;
+ screenstarted := true
+ end
+ end;
+ if screenOK then begin
+ blankrectangle(c0, c1, r0, r1);
+ updatescreen
+ end
+ end; { openawindow }
+{:574}
+ {577:}
+
+ procedure dispedges(k: windownumber);
+ label
+ 30, 40;
+ var
+ p, q: halfword;
+ alreadythere: boolean;
+ r: integer; {580:}
+ n: screencol;
+ w, ww: integer;
+ b: pixelcolor;
+ m, mm: integer;
+ d: integer;
+ madjustment: integer;
+ rightedge: integer;
+ mincol: screencol; {:580}
+ begin
+ if screenOK then
+ if leftcol[k] < rightcol[k] then
+ if toprow[k] < botrow[k] then begin
+ alreadythere := false;
+ if mem[curedges + 3].hh.rh = k then
+ if mem[curedges + 4].int = windowtime[k] then
+ alreadythere := true;
+ if not alreadythere then
+ blankrectangle(leftcol[k], rightcol[k], toprow[k], botrow[k]); {581:}
+ madjustment := mwindow[k] - mem[curedges + 3].hh.lh;
+ rightedge := 8 * (rightcol[k] - madjustment);
+ mincol := leftcol[k] {:581};
+ p := mem[curedges].hh.rh;
+ r := nwindow[k] - (mem[curedges + 1].hh.lh - 4096);
+ while (p <> curedges) and (r >= toprow[k]) do begin
+ if r < botrow[k] then begin {578:}
+ if mem[p + 1].hh.lh > (-29999) then
+ sortedges(p)
+ else if mem[p + 1].hh.lh = (-29999) then
+ if alreadythere then
+ goto 30;
+ mem[p + 1].hh.lh := -29999; {582:}
+ n := 0;
+ ww := 0;
+ m := -1;
+ w := 0;
+ q := mem[p + 1].hh.rh;
+ rowtransition[0] := mincol;
+ while true do begin
+ if q = 30000 then
+ d := rightedge
+ else
+ d := mem[q].hh.lh + 32768;
+ mm := (d div 8) + madjustment;
+ if mm <> m then begin {583:}
+ if w <= 0 then begin
+ if ww > 0 then
+ if m > mincol then begin
+ if n = 0 then
+ if alreadythere then begin
+ b := 0;
+ n := n + 1
+ end else
+ b := 1
+ else
+ n := n + 1;
+ rowtransition[n] := m
+ end
+ end else if ww <= 0 then
+ if m > mincol then begin
+ if n = 0 then
+ b := 1;
+ n := n + 1;
+ rowtransition[n] := m
+ end {:583};
+ m := mm;
+ w := ww
+ end;
+ if d >= rightedge then
+ goto 40;
+ ww := (ww + (d mod 8)) - 4;
+ q := mem[q].hh.rh
+ end;
+ 40: {584:}
+ if alreadythere or (ww > 0) then begin
+ if n = 0 then
+ if ww > 0 then
+ b := 1
+ else
+ b := 0;
+ n := n + 1;
+ rowtransition[n] := rightcol[k]
+ end else if n = 0 then
+ goto 30 {:584}; {:582}
+ paintrow(r, b, rowtransition, n);
+ 30: {:578}
+ null
+ end;
+ p := mem[p].hh.rh;
+ r := r - 1
+ end;
+ updatescreen;
+ windowtime[k] := windowtime[k] + 1;
+ mem[curedges + 3].hh.rh := k;
+ mem[curedges + 4].int := windowtime[k]
+ end
+ end; {:577} {591:}
+
+ function maxcoef(p: halfword): fraction;
+ var
+ x: fraction;
+ begin
+ x := 0;
+ while mem[p].hh.lh <> (-30000) do begin
+ if abs(mem[p + 1].int) > x then
+ x := abs(mem[p + 1].int);
+ p := mem[p].hh.rh
+ end;
+ maxcoef := x
+ end; {:591} {597:}
+
+ function pplusq(p: halfword; q: halfword; t: smallnumber): halfword;
+ label
+ 30;
+ var
+ pp, qq: halfword;
+ r, s: halfword;
+ threshold: integer;
+ v: integer;
+ begin
+ if t = 17 then
+ threshold := 2685
+ else
+ threshold := 8;
+ r := 29999;
+ pp := mem[p].hh.lh;
+ qq := mem[q].hh.lh;
+ while true do
+ if pp = qq then
+ if pp = (-30000) then
+ goto 30 {598:}
+ else begin
+ v := mem[p + 1].int + mem[q + 1].int;
+ mem[p + 1].int := v;
+ s := p;
+ p := mem[p].hh.rh;
+ pp := mem[p].hh.lh;
+ if abs(v) < threshold then
+ freenode(s, 2)
+ else begin
+ if abs(v) >= 626349397 then
+ if watchcoefs then begin
+ mem[qq].hh.b0 := 0;
+ fixneeded := true
+ end;
+ mem[r].hh.rh := s;
+ r := s
+ end;
+ q := mem[q].hh.rh;
+ qq := mem[q].hh.lh
+ end {:598}
+ else if mem[pp + 1].int < mem[qq + 1].int then begin
+ s := getnode(2);
+ mem[s].hh.lh := qq;
+ mem[s + 1].int := mem[q + 1].int;
+ q := mem[q].hh.rh;
+ qq := mem[q].hh.lh;
+ mem[r].hh.rh := s;
+ r := s
+ end else begin
+ mem[r].hh.rh := p;
+ r := p;
+ p := mem[p].hh.rh;
+ pp := mem[p].hh.lh
+ end;
+ 30:
+ mem[p + 1].int := slowadd(mem[p + 1].int, mem[q + 1].int);
+ mem[r].hh.rh := p;
+ depfinal := p;
+ pplusq := mem[29999].hh.rh
+ end; {:597} {599:}
+
+ function ptimesv(p: halfword; v: integer; t0, t1: smallnumber; visscaled: boolean): halfword;
+ var
+ r, s: halfword;
+ w: integer;
+ threshold: integer;
+ scalingdown: boolean;
+ begin
+ if t0 <> t1 then
+ scalingdown := true
+ else
+ scalingdown := not visscaled;
+ if t1 = 17 then
+ threshold := 1342
+ else
+ threshold := 4;
+ r := 29999;
+ while mem[p].hh.lh <> (-30000) do begin
+ if scalingdown then
+ w := takefraction(v, mem[p + 1].int)
+ else
+ w := takescaled(v, mem[p + 1].int);
+ if abs(w) <= threshold then begin
+ s := mem[p].hh.rh;
+ freenode(p, 2);
+ p := s
+ end else begin
+ if abs(w) >= 626349397 then begin
+ fixneeded := true;
+ mem[mem[p].hh.lh].hh.b0 := 0
+ end;
+ mem[r].hh.rh := p;
+ r := p;
+ mem[p + 1].int := w;
+ p := mem[p].hh.rh
+ end
+ end;
+ mem[r].hh.rh := p;
+ if visscaled then
+ mem[p + 1].int := takescaled(mem[p + 1].int, v)
+ else
+ mem[p + 1].int := takefraction(mem[p + 1].int, v);
+ ptimesv := mem[29999].hh.rh
+ end; {:599}
+{601:}
+
+ function pwithxbecomingq(p, x, q: halfword; t: smallnumber): halfword;
+ var
+ r, s: halfword;
+ v: integer;
+ sx: integer;
+ begin
+ s := p;
+ r := 29999;
+ sx := mem[x + 1].int;
+ while mem[mem[s].hh.lh + 1].int > sx do begin
+ r := s;
+ s := mem[s].hh.rh
+ end;
+ if mem[s].hh.lh <> x then
+ pwithxbecomingq := p
+ else begin
+ mem[29999].hh.rh := p;
+ mem[r].hh.rh := mem[s].hh.rh;
+ v := mem[s + 1].int;
+ freenode(s, 2);
+ pwithxbecomingq := pplusfq(mem[29999].hh.rh, v, q, t, 17)
+ end
+ end; {:601} {606:}
+
+ procedure newdep(q, p: halfword);
+ var
+ r: halfword;
+ begin
+ mem[q + 1].hh.rh := p;
+ mem[q + 1].hh.lh := -29987;
+ r := mem[-29987].hh.rh;
+ mem[depfinal].hh.rh := r;
+ mem[r + 1].hh.lh := depfinal;
+ mem[-29987].hh.rh := q
+ end; {:606} {607:}
+
+ function constdependency(v: scaled): halfword;
+ begin
+ depfinal := getnode(2);
+ mem[depfinal + 1].int := v;
+ mem[depfinal].hh.lh := -30000;
+ constdependency := depfinal
+ end; {:607} {608:}
+
+ function singledependency(p: halfword): halfword;
+ var
+ q: halfword;
+ m: integer;
+ begin
+ m := mem[p + 1].int mod 64;
+ if m > 28 then
+ singledependency := constdependency(0)
+ else begin
+ q := getnode(2);
+ mem[q + 1].int := twotothe[28 - m];
+ mem[q].hh.lh := p;
+ mem[q].hh.rh := constdependency(0);
+ singledependency := q
+ end
+ end; {:608}
+{609:}
+
+ function copydeplist(p: halfword): halfword;
+ label
+ 30;
+ var
+ q: halfword;
+ begin
+ q := getnode(2);
+ depfinal := q;
+ while true do begin
+ mem[depfinal].hh.lh := mem[p].hh.lh;
+ mem[depfinal + 1].int := mem[p + 1].int;
+ if mem[depfinal].hh.lh = (-30000) then
+ goto 30;
+ mem[depfinal].hh.rh := getnode(2);
+ depfinal := mem[depfinal].hh.rh;
+ p := mem[p].hh.rh
+ end;
+ 30:
+ copydeplist := q
+ end; {:609} {610:}
+
+ procedure lineareq(p: halfword; t: smallnumber);
+ var
+ q, r, s: halfword;
+ x: halfword;
+ n: integer;
+ v: integer;
+ prevr: halfword;
+ finalnode: halfword;
+ w: integer; {611:}
+ begin
+ q := p;
+ r := mem[p].hh.rh;
+ v := mem[q + 1].int;
+ while mem[r].hh.lh <> (-30000) do begin
+ if abs(mem[r + 1].int) > abs(v) then begin
+ q := r;
+ v := mem[r + 1].int
+ end;
+ r := mem[r].hh.rh
+ end {:611};
+ x := mem[q].hh.lh;
+ n := mem[x + 1].int mod 64; {612:}
+ s := 29999;
+ mem[s].hh.rh := p;
+ r := p;
+ repeat
+ if r = q then begin
+ mem[s].hh.rh := mem[r].hh.rh;
+ freenode(r, 2)
+ end else begin
+ w := makefraction(mem[r + 1].int, v);
+ if abs(w) <= 1342 then begin
+ mem[s].hh.rh := mem[r].hh.rh;
+ freenode(r, 2)
+ end else begin
+ mem[r + 1].int := -w;
+ s := r
+ end
+ end;
+ r := mem[s].hh.rh
+ until mem[r].hh.lh = (-30000);
+ if t = 18 then
+ mem[r + 1].int := -makescaled(mem[r + 1].int, v)
+ else if v <> (-268435456) then
+ mem[r + 1].int := -makefraction(mem[r + 1].int, v);
+ finalnode := r;
+ p := mem[29999].hh.rh {:612};
+ if internal[2] > 0 then {613:}
+ if interesting(x) then begin
+ begindiagnostic;
+ printnl(462);
+ printvariablename(x);
+ w := n;
+ while w > 0 do begin
+ print(455);
+ w := w - 2
+ end;
+ printchar(61);
+ printdependency(p, 17);
+ enddiagnostic(false)
+ end {:613};
+{614:}
+ prevr := -29987;
+ r := mem[-29987].hh.rh;
+ while r <> (-29987) do begin
+ s := mem[r + 1].hh.rh;
+ q := pwithxbecomingq(s, x, p, mem[r].hh.b0);
+ if mem[q].hh.lh = (-30000) then
+ makeknown(r, q)
+ else begin
+ mem[r + 1].hh.rh := q;
+ repeat
+ q := mem[q].hh.rh
+ until mem[q].hh.lh = (-30000);
+ prevr := q
+ end;
+ r := mem[prevr].hh.rh
+ end {:614}; {615:}
+ if n > 0 then begin {616:}
+ s := 29999;
+ mem[29999].hh.rh := p;
+ r := p;
+ repeat
+ if n > 30 then
+ w := 0
+ else
+ w := mem[r + 1].int div twotothe[n];
+ if (abs(w) <= 1342) and (mem[r].hh.lh <> (-30000)) then begin
+ mem[s].hh.rh := mem[r].hh.rh;
+ freenode(r, 2)
+ end else begin
+ mem[r + 1].int := w;
+ s := r
+ end;
+ r := mem[s].hh.rh
+ until mem[s].hh.lh = (-30000);
+ p := mem[29999].hh.rh
+ end {:616};
+ if mem[p].hh.lh = (-30000) then begin
+ mem[x].hh.b0 := 16;
+ mem[x + 1].int := mem[p + 1].int;
+ if abs(mem[x + 1].int) >= 268435456 then
+ valtoobig(mem[x + 1].int);
+ freenode(p, 2);
+ if curexp = x then
+ if curtype = 19 then begin
+ curexp := mem[x + 1].int;
+ curtype := 16;
+ freenode(x, 2)
+ end
+ end else begin
+ mem[x].hh.b0 := 17;
+ depfinal := finalnode;
+ newdep(x, p);
+ if curexp = x then
+ if curtype = 19 then
+ curtype := 17
+ end {:615};
+ if fixneeded then
+ fixdependencies
+ end; {:610} {619:}
+
+ function newringentry(p: halfword): halfword;
+ var
+ q: halfword;
+ begin
+ q := getnode(2);
+ mem[q].hh.b1 := 11;
+ mem[q].hh.b0 := mem[p].hh.b0;
+ if mem[p + 1].int = (-30000) then
+ mem[q + 1].int := p
+ else
+ mem[q + 1].int := mem[p + 1].int;
+ mem[p + 1].int := q;
+ newringentry := q
+ end; {:619} {621:}
+
+ procedure nonlineareq(v: integer; p: halfword; flushp: boolean);
+ var
+ t: smallnumber;
+ q, r: halfword;
+ begin
+ t := mem[p].hh.b0 - 1;
+ q := mem[p + 1].int;
+ if flushp then
+ mem[p].hh.b0 := 1
+ else
+ p := q;
+ repeat
+ r := mem[q + 1].int;
+ mem[q].hh.b0 := t;
+ case t of
+ 2:
+ mem[q + 1].int := v;
+ 4:
+ begin
+ mem[q + 1].int := v;
+ begin
+ if strref[v] < 127 then
+ strref[v] := strref[v] + 1
+ end
+ end;
+ 6:
+ begin
+ mem[q + 1].int := v;
+ mem[v].hh.lh := mem[v].hh.lh + 1
+ end;
+ 9:
+ mem[q + 1].int := copypath(v);
+ 11:
+ mem[q + 1].int := copyedges(v)
+ end;
+ q := r
+ until q = p
+ end; {:621} {622:}
+
+ procedure ringmerge(p, q: halfword);
+ label
+ 10;
+ var
+ r: halfword;
+ begin
+ r := mem[p + 1].int;
+ while r <> p do begin
+ if r = q then begin {623:}
+ begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(465)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 466;
+ helpline[0] := 467
+ end;
+ putgeterror
+ end {:623};
+ goto 10
+ end;
+ r := mem[r + 1].int
+ end;
+ r := mem[p + 1].int;
+ mem[p + 1].int := mem[q + 1].int;
+ mem[q + 1].int := r;
+ 10:
+ null
+ end; {:622} {626:}
+
+ procedure showcmdmod(c, m: integer);
+ begin
+ begindiagnostic;
+ printnl(123);
+ printcmdmod(c, m);
+ printchar(125);
+ enddiagnostic(false)
+ end; {:626} {635:}
+
+ procedure showcontext;
+ label
+ 30;
+ var
+ oldsetting: 0..5; {641:}
+ i: 0..bufsize;
+ l: integer;
+ m: integer;
+ n: 0..errorline;
+ p: integer;
+ q: integer; {:641}
+ begin
+ fileptr := inputptr;
+ inputstack[fileptr] := curinput;
+ while true do begin
+ curinput := inputstack[fileptr]; {636:}
+ if (((fileptr = inputptr) or (curinput.indexfield <= 6)) or (curinput.indexfield <> 10)) or (curinput.locfield <> (-30000)) then begin
+ tally := 0;
+ oldsetting := selector;
+ if curinput.indexfield <= 6 then begin {637:}
+ if curinput.namefield <= 1 then
+ if (curinput.namefield = 0) and (fileptr = 0) then
+ printnl(469)
+ else
+ printnl(470)
+ else if curinput.namefield = 2 then
+ printnl(471)
+ else begin
+ printnl(472);
+ printint(line)
+ end;
+ printchar(32) {:637};
+{644:}
+ begin
+ l := tally;
+ tally := 0;
+ selector := 4;
+ trickcount := 1000000
+ end;
+ if curinput.limitfield > 0 then
+ for i := curinput.startfield to curinput.limitfield - 1 do begin
+ if i = curinput.locfield then begin
+ firstcount := tally;
+ trickcount := ((tally + 1) + errorline) - halferrorline;
+ if trickcount < errorline then
+ trickcount := errorline
+ end;
+ print(buffer[i])
+ end {:644}
+ end else begin {638:}
+ if curinput.indexfield in
+ [7, 8, 9, 10, 11, 12] then
+ case curinput.indexfield of
+ 7:
+ printnl(473);
+ 8:
+ begin {639:}
+ printnl(478);
+ p := paramstack[curinput.limitfield];
+ if p <> (-30000) then
+ if mem[p].hh.rh = (-29999) then
+ printexp(p, 0)
+ else
+ showtokenlist(p, -30000, 20, tally);
+ print(479)
+ end; {:639}
+ 9:
+ printnl(474);
+ 10:
+ if curinput.locfield = (-30000) then
+ printnl(475)
+ else
+ printnl(476);
+ 11:
+ printnl(477);
+ 12:
+ begin
+ println;
+ if curinput.namefield <> (-30000) then
+ print(hash[curinput.namefield].rh) {640:}
+ else begin
+ p := paramstack[curinput.limitfield];
+ if p = (-30000) then
+ showtokenlist(paramstack[curinput.limitfield + 1], -30000, 20, tally)
+ else begin
+ q := p;
+ while mem[q].hh.rh <> (-30000) do
+ q := mem[q].hh.rh;
+ mem[q].hh.rh := paramstack[curinput.limitfield + 1];
+ showtokenlist(p, -30000, 20, tally);
+ mem[q].hh.rh := -30000
+ end
+ end {:640};
+ print(368)
+ end
+ end
+ else
+ printnl(63) {:638}; {645:}
+ begin
+ l := tally;
+ tally := 0;
+ selector := 4;
+ trickcount := 1000000
+ end;
+ if curinput.indexfield <> 12 then
+ showtokenlist(curinput.startfield, curinput.locfield, 100000, 0)
+ else
+ showmacro(curinput.startfield, curinput.locfield, 100000) {:645}
+ end;
+ selector := oldsetting; {643:}
+ if trickcount = 1000000 then begin
+ firstcount := tally;
+ trickcount := ((tally + 1) + errorline) - halferrorline;
+ if trickcount < errorline then
+ trickcount := errorline
+ end;
+ if tally < trickcount then
+ m := tally - firstcount
+ else
+ m := trickcount - firstcount;
+ if (l + firstcount) <= halferrorline then begin
+ p := 0;
+ n := l + firstcount
+ end else begin
+ print(146);
+ p := ((l + firstcount) - halferrorline) + 3;
+ n := halferrorline
+ end;
+ for q := p to firstcount - 1 do
+ printchar(trickbuf[q mod errorline]);
+ println;
+ for q := 1 to n do
+ printchar(32);
+ if (m + n) <= errorline then
+ p := firstcount + m
+ else
+ p := firstcount + ((errorline - n) - 3);
+ for q := firstcount to p - 1 do
+ printchar(trickbuf[q mod errorline]);
+ if (m + n) > errorline then
+ print(146) {:643}
+ end {:636};
+ if curinput.indexfield <= 6 then
+ if (curinput.namefield > 2) or (fileptr = 0) then
+ goto 30;
+ fileptr := fileptr - 1
+ end;
+ 30:
+ curinput := inputstack[inputptr]
+ end; { showcontext }
+{:635}
+ {649:}
+
+ procedure begintokenlist(p: halfword; t: quarterword);
+ begin
+ begin
+ if inputptr > maxinstack then begin
+ maxinstack := inputptr;
+ if inputptr = stacksize then
+ overflow(480, stacksize)
+ end;
+ inputstack[inputptr] := curinput;
+ inputptr := inputptr + 1
+ end;
+ curinput.startfield := p;
+ curinput.indexfield := t;
+ curinput.limitfield := paramptr;
+ curinput.locfield := p
+ end; {:649} {650:}
+
+ procedure endtokenlist;
+ label
+ 30;
+ var
+ p: halfword;
+ begin
+ if curinput.indexfield >= 10 then
+ if curinput.indexfield <= 11 then begin
+ flushtokenlist(curinput.startfield);
+ goto 30
+ end else
+ deletemacref(curinput.startfield);
+ while paramptr > curinput.limitfield do begin
+ paramptr := paramptr - 1;
+ p := paramstack[paramptr];
+ if p <> (-30000) then
+ if mem[p].hh.rh = (-29999) then begin
+ recyclevalue(p);
+ freenode(p, 2)
+ end else
+ flushtokenlist(p)
+ end;
+ 30:
+ begin
+ inputptr := inputptr - 1;
+ curinput := inputstack[inputptr]
+ end;
+ begin
+ if interrupt <> 0 then
+ pauseforinstructions
+ end
+ end; {:650} {651:}
+{855:}
+ {856:}
+
+ procedure encapsulate(p: halfword);
+ begin
+ curexp := getnode(2);
+ mem[curexp].hh.b0 := curtype;
+ mem[curexp].hh.b1 := 11;
+ newdep(curexp, p)
+ end; { encapsulate }
+{:856}
+ {858:}
+
+ procedure install(r, q: halfword);
+ var
+ p: halfword;
+ begin
+ if mem[q].hh.b0 = 16 then begin
+ mem[r + 1].int := mem[q + 1].int;
+ mem[r].hh.b0 := 16
+ end else if mem[q].hh.b0 = 19 then begin
+ p := singledependency(q);
+ if p = depfinal then begin
+ mem[r].hh.b0 := 16;
+ mem[r + 1].int := 0;
+ freenode(p, 2)
+ end else begin
+ mem[r].hh.b0 := 17;
+ newdep(r, p)
+ end
+ end else begin
+ mem[r].hh.b0 := mem[q].hh.b0;
+ newdep(r, copydeplist(mem[q + 1].hh.rh))
+ end
+ end; {:858}
+
+ procedure makeexpcopy(p: halfword);
+ label
+ 20;
+ var
+ q, r, t: halfword;
+ begin
+ 20:
+ curtype := mem[p].hh.b0;
+ if curtype in
+ [1, 2, 16, 3, 5, 7, 12, 10,
+ 4, 6, 11, 9, 8, 13, 14, 17,
+ 18, 15, 19] then
+ case curtype of
+ 1, 2, 16:
+ curexp := mem[p + 1].int;
+ 3, 5, 7, 12, 10:
+ curexp := newringentry(p);
+ 4:
+ begin
+ curexp := mem[p + 1].int;
+ begin
+ if strref[curexp] < 127 then
+ strref[curexp] := strref[curexp] + 1
+ end
+ end;
+ 6:
+ begin
+ curexp := mem[p + 1].int;
+ mem[curexp].hh.lh := mem[curexp].hh.lh + 1
+ end;
+ 11:
+ curexp := copyedges(mem[p + 1].int);
+ 9, 8:
+ curexp := copypath(mem[p + 1].int);
+ 13, 14:
+ begin {857:}
+ if mem[p + 1].int = (-30000) then
+ initbignode(p);
+ t := getnode(2);
+ mem[t].hh.b1 := 11;
+ mem[t].hh.b0 := curtype;
+ initbignode(t);
+ q := mem[p + 1].int + bignodesize[curtype];
+ r := mem[t + 1].int + bignodesize[curtype];
+ repeat
+ q := q - 2;
+ r := r - 2;
+ install(r, q)
+ until q = mem[p + 1].int;
+ curexp := t
+ end; {:857}
+ 17, 18:
+ encapsulate(copydeplist(mem[p + 1].hh.rh));
+ 15:
+ begin
+ begin
+ mem[p].hh.b0 := 19;
+ serialno := serialno + 64;
+ mem[p + 1].int := serialno
+ end;
+ goto 20
+ end;
+ 19:
+ begin
+ q := singledependency(p);
+ if q = depfinal then begin
+ curtype := 16;
+ curexp := 0;
+ freenode(q, 2)
+ end else begin
+ curtype := 17;
+ encapsulate(q)
+ end
+ end
+ end
+ else
+ confusion(664)
+ end; {:855}
+
+ function curtok: halfword;
+ var
+ p: halfword;
+ savetype: smallnumber;
+ saveexp: integer;
+ begin
+ if cursym = 0 then
+ if curcmd = 38 then begin
+ savetype := curtype;
+ saveexp := curexp;
+ makeexpcopy(curmod);
+ p := stashcurexp;
+ mem[p].hh.rh := -30000;
+ curtype := savetype;
+ curexp := saveexp
+ end else begin
+ p := getnode(2);
+ mem[p + 1].int := curmod;
+ mem[p].hh.b1 := 12;
+ if curcmd = 42 then
+ mem[p].hh.b0 := 16
+ else
+ mem[p].hh.b0 := 4
+ end
+ else begin
+ begin
+ p := avail;
+ if p = (-30000) then
+ p := getavail
+ else begin
+ avail := mem[p].hh.rh;
+ mem[p].hh.rh := -30000
+ end {dynused:=dynused+1;}
+ end;
+ mem[p].hh.lh := cursym
+ end;
+ curtok := p
+ end; {:651} {652:}
+
+ procedure backinput;
+ var
+ p: halfword;
+ s: 0..150;
+ begin
+ p := curtok;
+ while (curinput.indexfield > 6) and (curinput.locfield = (-30000)) do
+ endtokenlist;
+ begintokenlist(p, 10)
+ end; {:652} {653:}
+
+ procedure backerror;
+ begin
+ OKtointerrupt := false;
+ backinput;
+ OKtointerrupt := true;
+ error
+ end; { backerror }
+
+ procedure inserror;
+ begin
+ OKtointerrupt := false;
+ backinput;
+ curinput.indexfield := 11;
+ OKtointerrupt := true;
+ error
+ end; {:653} {654:}
+
+ procedure beginfilereading;
+ begin
+ if inopen = 6 then
+ overflow(481, 6);
+ if first = bufsize then
+ overflow(128, bufsize);
+ inopen := inopen + 1;
+ begin
+ if inputptr > maxinstack then begin
+ maxinstack := inputptr;
+ if inputptr = stacksize then
+ overflow(480, stacksize)
+ end;
+ inputstack[inputptr] := curinput;
+ inputptr := inputptr + 1
+ end;
+ curinput.indexfield := inopen;
+ linestack[curinput.indexfield] := line;
+ curinput.startfield := first;
+ curinput.namefield := 0
+ end; {:654} {655:}
+
+ procedure endfilereading;
+ begin
+ first := curinput.startfield;
+ line := linestack[curinput.indexfield];
+ if curinput.indexfield <> inopen then
+ confusion(482);
+ if curinput.namefield > 2 then
+ aclose(inputfile[curinput.indexfield]);
+ begin
+ inputptr := inputptr - 1;
+ curinput := inputstack[inputptr]
+ end;
+ inopen := inopen - 1
+ end; {:655} {656:}
+
+ procedure clearforerrorprompt;
+ begin
+ while (((curinput.indexfield <= 6) and (curinput.namefield = 0)) and (inputptr > 0)) and (curinput.locfield = curinput.limitfield) do
+ endfilereading;
+ println
+ end; {:656} {661:}
+
+ function checkoutervalidity: boolean;
+ var
+ p: halfword;
+ begin
+ if scannerstatus = 0 then
+ checkoutervalidity := true
+ else begin
+ deletionsallowed := false; {662:}
+ if cursym <> 0 then begin
+ p := getavail;
+ mem[p].hh.lh := cursym;
+ begintokenlist(p, 10)
+ end {:662};
+ if scannerstatus > 1 then begin {663:}
+ runaway;
+ if cursym = 0 then begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(488)
+ end else begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(489)
+ end
+ end;
+ print(490);
+ begin
+ helpptr := 4;
+ helpline[3] := 491;
+ helpline[2] := 492;
+ helpline[1] := 493;
+ helpline[0] := 494
+ end;
+ case scannerstatus of {664:}
+ 2:
+ begin
+ print(495);
+ helpline[3] := 496;
+ cursym := 2235
+ end;
+ 3:
+ begin
+ print(497);
+ helpline[3] := 498;
+ if warninginfo = 0 then
+ cursym := 2239
+ else begin
+ cursym := 2231;
+ eqtb[2231].rh := warninginfo
+ end
+ end;
+ 4, 5:
+ begin
+ print(499);
+ if scannerstatus = 5 then
+ print(hash[warninginfo].rh)
+ else
+ printvariablename(warninginfo);
+ cursym := 2237
+ end;
+ 6:
+ begin
+ print(500);
+ print(hash[warninginfo].rh);
+ print(501);
+ helpline[3] := 502;
+ cursym := 2236
+ end
+ end {:664};
+ inserror
+ end else begin {:663}
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(483)
+ end;
+ printint(warninginfo);
+ begin
+ helpptr := 3;
+ helpline[2] := 484;
+ helpline[1] := 485;
+ helpline[0] := 486
+ end;
+ if cursym = 0 then
+ helpline[2] := 487;
+ cursym := 2238;
+ inserror
+ end;
+ deletionsallowed := true;
+ checkoutervalidity := false
+ end
+ end; {:661} {666:}
+
+ procedure firmuptheline;
+ forward; {:666} {667:}
+
+ procedure getnext;
+ label
+ 20, 10, 40, 25, 85, 86, 87, 30;
+ var
+ k: 0..bufsize;
+ c: ASCIIcode;
+ class: ASCIIcode;
+ n, f: integer;
+ begin
+ 20:
+ cursym := 0;
+ if curinput.indexfield <= 6 then begin {669:}
+ 25:
+ c := buffer[curinput.locfield];
+ curinput.locfield := curinput.locfield + 1;
+ class := charclass[c];
+ if class in
+ [0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 20] then
+ case class of
+ 0:
+ goto 85;
+ 1:
+ begin
+ class := charclass[buffer[curinput.locfield]];
+ if class > 1 then
+ goto 25
+ else if class < 1 then begin
+ n := 0;
+ goto 86
+ end
+ end;
+ 2:
+ goto 25;
+ 3:
+ begin {679:}
+ if curinput.namefield > 2 then begin {681:}
+ line := line + 1;
+ first := curinput.startfield;
+ if not forceeof then begin
+ if inputln(inputfile[curinput.indexfield], true) then
+ firmuptheline
+ else
+ forceeof := true
+ end;
+ if forceeof then begin
+ printchar(41);
+ forceeof := false;
+ flush(output);
+ endfilereading;
+ if checkoutervalidity then
+ goto 20
+ else
+ goto 20
+ end;
+ buffer[curinput.limitfield] := 37;
+ first := curinput.limitfield + 1;
+ curinput.locfield := curinput.startfield
+ end else begin {:681}
+ if inputptr > 0 then begin
+ endfilereading;
+ goto 20
+ end;
+ if selector < 2 then
+ openlogfile;
+ if interaction > 1 then begin
+ if curinput.limitfield = curinput.startfield then
+ printnl(517);
+ println;
+ first := curinput.startfield;
+ begin
+ print(42);
+ terminput
+ end;
+ curinput.limitfield := last;
+ buffer[curinput.limitfield] := 37;
+ first := curinput.limitfield + 1;
+ curinput.locfield := curinput.startfield
+ end else
+ fatalerror(518)
+ end {:679};
+ begin
+ if interrupt <> 0 then
+ pauseforinstructions
+ end;
+ goto 25
+ end;
+ 4:
+ begin {671:}
+ if buffer[curinput.locfield] = 34 then
+ curmod := 155
+ else begin
+ k := curinput.locfield;
+ buffer[curinput.limitfield + 1] := 34;
+ repeat
+ curinput.locfield := curinput.locfield + 1
+ until buffer[curinput.locfield] = 34;
+ if curinput.locfield > curinput.limitfield then begin {672:}
+ curinput.locfield := curinput.limitfield;
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(510)
+ end;
+ begin
+ helpptr := 3;
+ helpline[2] := 511;
+ helpline[1] := 512;
+ helpline[0] := 513
+ end;
+ deletionsallowed := false;
+ error;
+ deletionsallowed := true;
+ goto 20
+ end {:672};
+ if curinput.locfield = (k + 1) then
+ curmod := buffer[k]
+ else begin
+ begin
+ if ((poolptr + curinput.locfield) - k) > maxpoolptr then begin
+ if ((poolptr + curinput.locfield) - k) > poolsize then
+ overflow(129, poolsize - initpoolptr);
+ maxpoolptr := (poolptr + curinput.locfield) - k
+ end
+ end;
+ repeat
+ begin
+ strpool[poolptr] := buffer[k];
+ poolptr := poolptr + 1
+ end;
+ k := k + 1
+ until k = curinput.locfield;
+ curmod := makestring
+ end
+ end;
+ curinput.locfield := curinput.locfield + 1;
+ curcmd := 39;
+ goto 10
+ end; {:671}
+ 5, 6, 7, 8:
+ begin
+ k := curinput.locfield - 1;
+ goto 40
+ end;
+ 20:
+ begin {670:}
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(507)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 508;
+ helpline[0] := 509
+ end;
+ deletionsallowed := false;
+ error;
+ deletionsallowed := true;
+ goto 20
+ end
+ end
+ else
+ null {:670};
+ k := curinput.locfield - 1;
+ while charclass[buffer[curinput.locfield]] = class do
+ curinput.locfield := curinput.locfield + 1;
+ goto 40;
+ 85: {673:}
+ n := c - 48;
+ while charclass[buffer[curinput.locfield]] = 0 do begin
+ if n < 4096 then
+ n := ((10 * n) + buffer[curinput.locfield]) - 48;
+ curinput.locfield := curinput.locfield + 1
+ end;
+ if buffer[curinput.locfield] = 46 then
+ if charclass[buffer[curinput.locfield + 1]] = 0 then
+ goto 30;
+ f := 0;
+ goto 87;
+ 30:
+ curinput.locfield := curinput.locfield + 1 {:673};
+ 86: {674:}
+ k := 0;
+ repeat
+ if k < 17 then begin
+ dig[k] := buffer[curinput.locfield] - 48;
+ k := k + 1
+ end;
+ curinput.locfield := curinput.locfield + 1
+ until charclass[buffer[curinput.locfield]] <> 0;
+ f := rounddecimals(k);
+ if f = 65536 then begin
+ n := n + 1;
+ f := 0
+ end {:674};
+ 87: {675:}
+ if n < 4096 then
+ curmod := (n * 65536) + f
+ else begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(514)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 515;
+ helpline[0] := 516
+ end;
+ deletionsallowed := false;
+ error;
+ deletionsallowed := true;
+ curmod := 268435455
+ end;
+ curcmd := 42;
+ goto 10 {:675};
+ 40:
+ cursym := idlookup(k, curinput.locfield - k)
+ end else if curinput.locfield >= himemmin then begin {:669} {676:}
+ cursym := mem[curinput.locfield].hh.lh;
+ curinput.locfield := mem[curinput.locfield].hh.rh;
+ if cursym >= 2242 then
+ if cursym >= 2392 then begin {677:}
+ if cursym >= 2542 then
+ cursym := cursym - 150;
+ begintokenlist(paramstack[(curinput.limitfield + cursym) - 2392], 9);
+ goto 20
+ end else begin {:677}
+ curcmd := 38;
+ curmod := paramstack[(curinput.limitfield + cursym) - 2242];
+ cursym := 0;
+ goto 10
+ end
+ end else if curinput.locfield > (-30000) then begin {678:}
+ if mem[curinput.locfield].hh.b1 = 12 then begin
+ curmod := mem[curinput.locfield + 1].int;
+ if mem[curinput.locfield].hh.b0 = 16 then
+ curcmd := 42
+ else begin
+ curcmd := 39;
+ begin
+ if strref[curmod] < 127 then
+ strref[curmod] := strref[curmod] + 1
+ end
+ end
+ end else begin
+ curmod := curinput.locfield;
+ curcmd := 38
+ end;
+ curinput.locfield := mem[curinput.locfield].hh.rh;
+ goto 10
+ end else begin {:678}
+ endtokenlist;
+ goto 20
+ end {:676}; {668:}
+ curcmd := eqtb[cursym].lh;
+ curmod := eqtb[cursym].rh;
+ if curcmd >= 83 then
+ if checkoutervalidity then
+ curcmd := curcmd - 83
+ else
+ goto 20 {:668};
+ 10:
+ null
+ end; {:667} {682:}
+
+ procedure firmuptheline;
+ var
+ k: 0..bufsize;
+ begin
+ curinput.limitfield := last;
+ if internal[31] > 0 then
+ if interaction > 1 then begin
+ println;
+ if curinput.startfield < curinput.limitfield then
+ for k := curinput.startfield to curinput.limitfield - 1 do
+ print(buffer[k]);
+ first := curinput.limitfield;
+ begin
+ print(519);
+ terminput
+ end;
+ if last > first then begin
+ for k := first to last - 1 do
+ buffer[(k + curinput.startfield) - first] := buffer[k];
+ curinput.limitfield := (curinput.startfield + last) - first
+ end
+ end
+ end; {:682}
+{685:}
+
+ function scantoks(terminator: commandcode; substlist, tailend: halfword; suffixcount: smallnumber): halfword;
+ label
+ 30, 40;
+ var
+ p: halfword;
+ q: halfword;
+ balance: integer;
+ begin
+ p := 29998;
+ balance := 1;
+ mem[29998].hh.rh := -30000;
+ while true do begin
+ getnext;
+ if cursym > 0 then begin {686:}
+ begin
+ q := substlist;
+ while q <> (-30000) do begin
+ if mem[q].hh.lh = cursym then begin
+ cursym := mem[q + 1].int;
+ curcmd := 7;
+ goto 40
+ end;
+ q := mem[q].hh.rh
+ end;
+ 40: {:686}
+ null
+ end;
+ if curcmd = terminator then {687:}
+ if curmod > 0 then
+ balance := balance + 1
+ else begin
+ balance := balance - 1;
+ if balance = 0 then
+ goto 30
+ end {:687}
+ else if curcmd = 61 then begin {690:}
+ if curmod = 0 then
+ getnext
+ else if curmod <= suffixcount then
+ cursym := 2391 + curmod
+ end {:690}
+ end;
+ mem[p].hh.rh := curtok;
+ p := mem[p].hh.rh
+ end;
+ 30:
+ mem[p].hh.rh := tailend;
+ flushnodelist(substlist);
+ scantoks := mem[29998].hh.rh
+ end; {:685} {691:}
+
+ procedure getsymbol;
+ label
+ 20;
+ begin
+ 20:
+ getnext;
+ if (cursym = 0) or (cursym > 2229) then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(531)
+ end;
+ begin
+ helpptr := 3;
+ helpline[2] := 532;
+ helpline[1] := 533;
+ helpline[0] := 534
+ end;
+ if cursym > 0 then
+ helpline[2] := 535
+ else if curcmd = 39 then begin
+ if strref[curmod] < 127 then
+ if strref[curmod] > 1 then
+ strref[curmod] := strref[curmod] - 1
+ else
+ flushstring(curmod)
+ end;
+ cursym := 2229;
+ inserror;
+ goto 20
+ end
+ end; { getsymbol }
+{:691}
+ {692:}
+
+ procedure getclearsymbol;
+ begin
+ getsymbol;
+ clearsymbol(cursym, false)
+ end; {:692} {693:}
+
+ procedure checkequals;
+ begin
+ if curcmd <> 51 then
+ if curcmd <> 77 then begin
+ missingerr(61);
+ begin
+ helpptr := 5;
+ helpline[4] := 536;
+ helpline[3] := 537;
+ helpline[2] := 538;
+ helpline[1] := 539;
+ helpline[0] := 540
+ end;
+ backerror
+ end
+ end; {:693} {694:}
+
+ procedure makeopdef;
+ var
+ m: commandcode;
+ p, q, r: halfword;
+ begin
+ m := curmod;
+ getsymbol;
+ q := getnode(2);
+ mem[q].hh.lh := cursym;
+ mem[q + 1].int := 2242;
+ getclearsymbol;
+ warninginfo := cursym;
+ getsymbol;
+ p := getnode(2);
+ mem[p].hh.lh := cursym;
+ mem[p + 1].int := 2243;
+ mem[p].hh.rh := q;
+ getnext;
+ checkequals;
+ scannerstatus := 5;
+ q := getavail;
+ mem[q].hh.lh := -30000;
+ r := getavail;
+ mem[q].hh.rh := r;
+ mem[r].hh.lh := 0;
+ mem[r].hh.rh := scantoks(16, p, -30000, 0);
+ scannerstatus := 0;
+ eqtb[warninginfo].lh := m;
+ eqtb[warninginfo].rh := q;
+ getxnext
+ end; {:694}
+{697:}
+ {1032:}
+
+ procedure checkdelimiter(ldelim, rdelim: halfword);
+ label
+ 10;
+ begin
+ if curcmd = 62 then
+ if curmod = ldelim then
+ goto 10;
+ if cursym <> rdelim then begin
+ missingerr(hash[rdelim].rh);
+ begin
+ helpptr := 2;
+ helpline[1] := 786;
+ helpline[0] := 787
+ end;
+ backerror
+ end else begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(788)
+ end;
+ print(hash[rdelim].rh);
+ print(789);
+ begin
+ helpptr := 3;
+ helpline[2] := 790;
+ helpline[1] := 791;
+ helpline[0] := 792
+ end;
+ error
+ end;
+ 10:
+ null
+ end; {:1032} {1011:}
+
+ function scandeclaredvariable: halfword;
+ label
+ 30;
+ var
+ x: halfword;
+ h, t: halfword;
+ l: halfword;
+ begin
+ getsymbol;
+ x := cursym;
+ if curcmd <> 41 then
+ clearsymbol(x, false);
+ if eqtb[x].rh = (-30000) then
+ newroot(x);
+ h := getavail;
+ mem[h].hh.lh := x;
+ t := h;
+ while true do begin
+ getxnext;
+ if cursym = 0 then
+ goto 30;
+ if curcmd <> 41 then
+ if curcmd <> 40 then
+ if curcmd = 63 then begin {1012:}
+ l := cursym;
+ getxnext;
+ if curcmd <> 64 then begin
+ backinput;
+ cursym := l;
+ curcmd := 63;
+ goto 30
+ end else
+ cursym := 0
+ end else {:1012}
+ goto 30;
+ mem[t].hh.rh := getavail;
+ t := mem[t].hh.rh;
+ mem[t].hh.lh := cursym
+ end;
+ 30:
+ scandeclaredvariable := h
+ end; {:1011}
+
+ procedure scandef;
+ var
+ m: 1..2;
+ n: 0..3;
+ k: 0..150;
+ c: 0..7;
+ r: halfword;
+ q: halfword;
+ p: halfword;
+ base: halfword;
+ ldelim, rdelim: halfword;
+ begin
+ m := curmod;
+ c := 0;
+ mem[29998].hh.rh := -30000;
+ q := getavail;
+ mem[q].hh.lh := -30000;
+ r := -30000; {700:}
+ if m = 1 then begin
+ getclearsymbol;
+ warninginfo := cursym;
+ getnext;
+ scannerstatus := 5;
+ n := 0;
+ eqtb[warninginfo].lh := 10;
+ eqtb[warninginfo].rh := q
+ end else begin
+ p := scandeclaredvariable;
+ flushvariable(eqtb[mem[p].hh.lh].rh, mem[p].hh.rh, true);
+ warninginfo := findvariable(p);
+ flushlist(p);
+ if warninginfo = (-30000) then begin {701:}
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(547)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 548;
+ helpline[0] := 549
+ end;
+ error;
+ warninginfo := -29979
+ end {:701};
+ scannerstatus := 4;
+ n := 2;
+ if curcmd = 61 then
+ if curmod = 3 then begin
+ n := 3;
+ getnext
+ end;
+ mem[warninginfo].hh.b0 := 20 + n;
+ mem[warninginfo + 1].int := q
+ end {:700};
+ k := n;
+ if curcmd = 31 then {703:}
+ repeat
+ ldelim := cursym;
+ rdelim := curmod;
+ getnext;
+ if (curcmd = 56) and (curmod >= 2242) then
+ base := curmod
+ else begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(550)
+ end;
+ begin
+ helpptr := 1;
+ helpline[0] := 551
+ end;
+ backerror;
+ base := 2242
+ end; {704:}
+ repeat
+ mem[q].hh.rh := getavail;
+ q := mem[q].hh.rh;
+ mem[q].hh.lh := base + k;
+ getsymbol;
+ p := getnode(2);
+ mem[p + 1].int := base + k;
+ mem[p].hh.lh := cursym;
+ if k = 150 then
+ overflow(552, 150);
+ k := k + 1;
+ mem[p].hh.rh := r;
+ r := p;
+ getnext
+ until curcmd <> 79 {:704};
+ checkdelimiter(ldelim, rdelim);
+ getnext
+ until curcmd <> 31 {:703};
+ if curcmd = 56 then begin {705:}
+ p := getnode(2);
+ if curmod < 2242 then begin
+ c := curmod;
+ mem[p + 1].int := 2242 + k
+ end else begin
+ mem[p + 1].int := curmod + k;
+ if curmod = 2242 then
+ c := 4
+ else if curmod = 2392 then
+ c := 6
+ else
+ c := 7
+ end;
+ if k = 150 then
+ overflow(552, 150);
+ k := k + 1;
+ getsymbol;
+ mem[p].hh.lh := cursym;
+ mem[p].hh.rh := r;
+ r := p;
+ getnext;
+ if c = 4 then
+ if curcmd = 69 then begin
+ c := 5;
+ p := getnode(2);
+ if k = 150 then
+ overflow(552, 150);
+ mem[p + 1].int := 2242 + k;
+ getsymbol;
+ mem[p].hh.lh := cursym;
+ mem[p].hh.rh := r;
+ r := p;
+ getnext
+ end
+ end {:705};
+ checkequals;
+ p := getavail;
+ mem[p].hh.lh := c;
+ mem[q].hh.rh := p; {698:}
+ if m = 1 then
+ mem[p].hh.rh := scantoks(16, r, -30000, n)
+ else begin
+ q := getavail;
+ mem[q].hh.lh := bgloc;
+ mem[p].hh.rh := q;
+ p := getavail;
+ mem[p].hh.lh := egloc;
+ mem[q].hh.rh := scantoks(16, r, p, n)
+ end;
+ if warninginfo = (-29979) then
+ flushtokenlist(mem[-29978].int) {:698};
+ scannerstatus := 0;
+ getxnext
+ end; {:697} {706:}
+
+ procedure scanprimary;
+ forward;
+
+ procedure scansecondary;
+ forward;
+
+ procedure scantertiary;
+ forward;
+
+ procedure scanexpression;
+ forward;
+
+ procedure scansuffix;
+ forward; {720:}
+{722:}
+
+ procedure printmacroname(a, n: halfword);
+ var
+ p, q: halfword;
+ begin
+ if n <> (-30000) then
+ print(hash[n].rh)
+ else begin
+ p := mem[a].hh.lh;
+ if p = (-30000) then
+ print(hash[mem[mem[mem[a].hh.rh].hh.lh].hh.lh].rh)
+ else begin
+ q := p;
+ while mem[q].hh.rh <> (-30000) do
+ q := mem[q].hh.rh;
+ mem[q].hh.rh := mem[mem[a].hh.rh].hh.lh;
+ showtokenlist(p, -30000, 1000, 0);
+ mem[q].hh.rh := -30000
+ end
+ end
+ end; {:722} {723:}
+
+ procedure printarg(q: halfword; n: integer; b: halfword);
+ begin
+ if mem[q].hh.rh = (-29999) then
+ printnl(365)
+ else if (b < 2542) and (b <> 7) then
+ printnl(366)
+ else
+ printnl(367);
+ printint(n);
+ print(568);
+ if mem[q].hh.rh = (-29999) then
+ printexp(q, 1)
+ else
+ showtokenlist(q, -30000, 1000, 0)
+ end; {:723} {730:}
+
+ procedure scantextarg(ldelim, rdelim: halfword);
+ label
+ 30;
+ var
+ balance: integer;
+ p: halfword;
+ begin
+ warninginfo := ldelim;
+ scannerstatus := 3;
+ p := 29998;
+ balance := 1;
+ mem[29998].hh.rh := -30000;
+ while true do begin
+ getnext;
+ if ldelim = 0 then begin {732:}
+ if curcmd > 79 then begin
+ if balance = 1 then
+ goto 30
+ else if curcmd = 81 then
+ balance := balance - 1
+ end else if curcmd = 32 then
+ balance := balance + 1
+ end else begin {:732} {731:}
+ if curcmd = 62 then begin
+ if curmod = ldelim then begin
+ balance := balance - 1;
+ if balance = 0 then
+ goto 30
+ end
+ end else if curcmd = 31 then
+ if curmod = rdelim then
+ balance := balance + 1
+ end {:731};
+ mem[p].hh.rh := curtok;
+ p := mem[p].hh.rh
+ end;
+ 30:
+ curexp := mem[29998].hh.rh;
+ curtype := 20;
+ scannerstatus := 0
+ end; {:730}
+
+ procedure macrocall(defref, arglist, macroname: halfword);
+ label
+ 40;
+ var
+ r: halfword;
+ p, q: halfword;
+ n: integer;
+ ldelim, rdelim: halfword;
+ tail: halfword;
+ begin
+ r := mem[defref].hh.rh;
+ mem[defref].hh.lh := mem[defref].hh.lh + 1;
+ if arglist = (-30000) then
+ n := 0 {724:}
+ else begin
+ n := 1;
+ tail := arglist;
+ while mem[tail].hh.rh <> (-30000) do begin
+ n := n + 1;
+ tail := mem[tail].hh.rh
+ end
+ end {:724};
+ if internal[9] > 0 then begin {721:}
+ begindiagnostic;
+ println;
+ printmacroname(arglist, macroname);
+ if n = 3 then
+ print(530);
+ showmacro(defref, -30000, 100000);
+ if arglist <> (-30000) then begin
+ n := 0;
+ p := arglist;
+ repeat
+ q := mem[p].hh.lh;
+ printarg(q, n, 0);
+ n := n + 1;
+ p := mem[p].hh.rh
+ until p = (-30000)
+ end;
+ enddiagnostic(false)
+ end {:721}; {725:}
+ curcmd := 80;
+ while mem[r].hh.lh >= 2242 do begin {726:}
+ if curcmd <> 79 then begin
+ getxnext;
+ if curcmd <> 31 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(574)
+ end;
+ printmacroname(arglist, macroname);
+ begin
+ helpptr := 3;
+ helpline[2] := 575;
+ helpline[1] := 576;
+ helpline[0] := 577
+ end;
+ if mem[r].hh.lh >= 2392 then begin
+ curexp := -30000;
+ curtype := 20
+ end else begin
+ curexp := 0;
+ curtype := 16
+ end;
+ backerror;
+ curcmd := 62;
+ goto 40
+ end;
+ ldelim := cursym;
+ rdelim := curmod
+ end; {729:}
+ if mem[r].hh.lh >= 2542 then
+ scantextarg(ldelim, rdelim)
+ else begin
+ getxnext;
+ if mem[r].hh.lh >= 2392 then
+ scansuffix
+ else
+ scanexpression
+ end {:729};
+ if curcmd <> 79 then {727:}
+ if (curcmd <> 62) or (curmod <> ldelim) then
+ if mem[mem[r].hh.rh].hh.lh >= 2242 then begin
+ missingerr(44);
+ begin
+ helpptr := 3;
+ helpline[2] := 578;
+ helpline[1] := 579;
+ helpline[0] := 573
+ end;
+ backerror;
+ curcmd := 79
+ end else begin
+ missingerr(hash[rdelim].rh);
+ begin
+ helpptr := 2;
+ helpline[1] := 580;
+ helpline[0] := 573
+ end;
+ backerror
+ end {:727};
+ 40: {728:}
+ begin
+ p := getavail;
+ if curtype = 20 then
+ mem[p].hh.lh := curexp
+ else
+ mem[p].hh.lh := stashcurexp;
+ if internal[9] > 0 then begin
+ begindiagnostic;
+ printarg(mem[p].hh.lh, n, mem[r].hh.lh);
+ enddiagnostic(false)
+ end;
+ if arglist = (-30000) then
+ arglist := p
+ else
+ mem[tail].hh.rh := p;
+ tail := p;
+ n := n + 1
+ end {:728} {:726};
+ r := mem[r].hh.rh
+ end;
+ if curcmd = 79 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(569)
+ end;
+ printmacroname(arglist, macroname);
+ printchar(59);
+ printnl(570);
+ print(hash[rdelim].rh);
+ print(170);
+ begin
+ helpptr := 3;
+ helpline[2] := 571;
+ helpline[1] := 572;
+ helpline[0] := 573
+ end;
+ error
+ end;
+ if mem[r].hh.lh <> 0 then begin {733:}
+ if mem[r].hh.lh < 7 then begin
+ getxnext;
+ if mem[r].hh.lh <> 6 then
+ if (curcmd = 51) or (curcmd = 77) then
+ getxnext
+ end;
+ case mem[r].hh.lh of
+ 1:
+ scanprimary;
+ 2:
+ scansecondary;
+ 3:
+ scantertiary;
+ 4:
+ scanexpression;
+ 5:
+ begin {734:}
+ scanexpression;
+ p := getavail;
+ mem[p].hh.lh := stashcurexp;
+ if internal[9] > 0 then begin
+ begindiagnostic;
+ printarg(mem[p].hh.lh, n, 0);
+ enddiagnostic(false)
+ end;
+ if arglist = (-30000) then
+ arglist := p
+ else
+ mem[tail].hh.rh := p;
+ tail := p;
+ n := n + 1;
+ if curcmd <> 69 then begin
+ missingerr(347);
+ print(581);
+ printmacroname(arglist, macroname);
+ begin
+ helpptr := 1;
+ helpline[0] := 582
+ end;
+ backerror
+ end;
+ getxnext;
+ scanprimary
+ end; {:734}
+ 6:
+ begin {735:}
+ if curcmd <> 31 then
+ ldelim := -30000
+ else begin
+ ldelim := cursym;
+ rdelim := curmod;
+ getxnext
+ end;
+ scansuffix;
+ if ldelim <> (-30000) then begin
+ if (curcmd <> 62) or (curmod <> ldelim) then begin
+ missingerr(hash[rdelim].rh);
+ begin
+ helpptr := 2;
+ helpline[1] := 580;
+ helpline[0] := 573
+ end;
+ backerror
+ end;
+ getxnext
+ end
+ end; {:735}
+ 7:
+ scantextarg(0, 0)
+ end;
+ backinput; {728:}
+ begin
+ p := getavail;
+ if curtype = 20 then
+ mem[p].hh.lh := curexp
+ else
+ mem[p].hh.lh := stashcurexp;
+ if internal[9] > 0 then begin
+ begindiagnostic;
+ printarg(mem[p].hh.lh, n, mem[r].hh.lh);
+ enddiagnostic(false)
+ end;
+ if arglist = (-30000) then
+ arglist := p
+ else
+ mem[tail].hh.rh := p;
+ tail := p;
+ n := n + 1
+ end {:728}
+ end {:733};
+ r := mem[r].hh.rh {:725}; {736:}
+ while (curinput.indexfield > 6) and (curinput.locfield = (-30000)) do
+ endtokenlist;
+ if (paramptr + n) > maxparamstack then begin
+ maxparamstack := paramptr + n;
+ if maxparamstack > 150 then
+ overflow(552, 150)
+ end;
+ begintokenlist(defref, 12);
+ curinput.namefield := macroname;
+ curinput.locfield := r;
+ if n > 0 then begin
+ p := arglist;
+ repeat
+ paramstack[paramptr] := mem[p].hh.lh;
+ paramptr := paramptr + 1;
+ p := mem[p].hh.rh
+ until p = (-30000);
+ flushlist(arglist)
+ end {:736}
+ end; {:720}
+
+ procedure getboolean;
+ forward;
+
+ procedure passtext;
+ forward;
+
+ procedure conditional;
+ forward;
+
+ procedure startinput;
+ forward;
+
+ procedure beginiteration;
+ forward;
+
+ procedure resumeiteration;
+ forward;
+
+ procedure stopiteration;
+ forward; {:706} {707:}
+
+ procedure expand;
+ var
+ p: halfword;
+ k: integer;
+ j: poolpointer;
+ begin
+ if internal[7] > 65536 then
+ if curcmd <> 10 then
+ showcmdmod(curcmd, curmod);
+ case curcmd of
+ 1:
+ conditional;
+ 2: {751:}
+ if curmod > iflimit then
+ if iflimit = 1 then begin
+ missingerr(58);
+ backinput;
+ cursym := 2234;
+ inserror
+ end else begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(589)
+ end;
+ printcmdmod(2, curmod);
+ begin
+ helpptr := 1;
+ helpline[0] := 590
+ end;
+ error
+ end
+ else begin
+ while curmod <> 2 do
+ passtext;
+{745:}
+ begin
+ p := condptr;
+ ifline := mem[p + 1].int;
+ curif := mem[p].hh.b1;
+ iflimit := mem[p].hh.b0;
+ condptr := mem[p].hh.rh;
+ freenode(p, 2)
+ end {:745}
+ end {:751};
+ 3: {711:}
+ if curmod > 0 then
+ forceeof := true
+ else {:711}
+ startinput;
+ 4:
+ if curmod = 0 then begin {708:}
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(553)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 554;
+ helpline[0] := 555
+ end;
+ error
+ end else {:708}
+ beginiteration;
+ 5:
+ begin {712:}
+ while (curinput.indexfield > 6) and (curinput.locfield = (-30000)) do
+ endtokenlist;
+ if loopptr = (-30000) then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(557)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 558;
+ helpline[0] := 559
+ end;
+ error
+ end else
+ resumeiteration
+ end; {:712}
+ 6:
+ begin {713:}
+ getboolean;
+ if internal[7] > 65536 then
+ showcmdmod(33, curexp);
+ if curexp = 30 then
+ if loopptr = (-30000) then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(560)
+ end;
+ begin
+ helpptr := 1;
+ helpline[0] := 561
+ end;
+ if curcmd = 80 then
+ error
+ else
+ backerror
+ end else begin {714:}
+ p := -30000;
+ repeat
+ if curinput.indexfield <= 6 then
+ endfilereading
+ else begin
+ if curinput.indexfield <= 8 then
+ p := curinput.startfield;
+ endtokenlist
+ end
+ until p <> (-30000);
+ if p <> mem[loopptr].hh.lh then
+ fatalerror(564);
+ stopiteration
+ end {:714}
+ else if curcmd <> 80 then begin
+ missingerr(59);
+ begin
+ helpptr := 2;
+ helpline[1] := 562;
+ helpline[0] := 563
+ end;
+ backerror
+ end
+ end; {:713}
+ 7:
+ null;
+ 9:
+ begin {715:}
+ getnext;
+ p := curtok;
+ getnext;
+ if curcmd < 11 then
+ expand
+ else
+ backinput;
+ begintokenlist(p, 10)
+ end; {:715}
+ 8:
+ begin {716:}
+ getxnext;
+ scanprimary;
+ if curtype <> 4 then begin
+ disperr(-30000, 565);
+ begin
+ helpptr := 2;
+ helpline[1] := 566;
+ helpline[0] := 567
+ end;
+ putgetflusherror(0)
+ end else begin
+ backinput;
+ if (strstart[curexp + 1] - strstart[curexp]) > 0 then begin {717:}
+ beginfilereading;
+ curinput.namefield := 2;
+ k := first + (strstart[curexp + 1] - strstart[curexp]);
+ if k >= maxbufstack then begin
+ if k >= bufsize then begin
+ maxbufstack := bufsize;
+ overflow(128, bufsize)
+ end;
+ maxbufstack := k + 1
+ end;
+ j := strstart[curexp];
+ curinput.limitfield := k;
+ while first < curinput.limitfield do begin
+ buffer[first] := strpool[j];
+ j := j + 1;
+ first := first + 1
+ end;
+ buffer[curinput.limitfield] := 37;
+ first := curinput.limitfield + 1;
+ curinput.locfield := curinput.startfield;
+ flushcurexp(0)
+ end {:717}
+ end
+ end; {:716}
+ 10:
+ macrocall(curmod, -30000, cursym)
+ end
+ end; {:707} {718:}
+
+ procedure getxnext;
+ var
+ saveexp: halfword;
+ begin
+ getnext;
+ if curcmd < 11 then begin
+ saveexp := stashcurexp;
+ repeat
+ if curcmd = 10 then
+ macrocall(curmod, -30000, cursym)
+ else
+ expand;
+ getnext
+ until curcmd >= 11;
+ unstashcurexp(saveexp)
+ end
+ end; {:718} {737:}
+
+ procedure stackargument(p: halfword);
+ begin
+ if paramptr = maxparamstack then begin
+ maxparamstack := maxparamstack + 1;
+ if maxparamstack > 150 then
+ overflow(552, 150)
+ end;
+ paramstack[paramptr] := p;
+ paramptr := paramptr + 1
+ end; {:737} {742:}
+
+ procedure passtext;
+ label
+ 30;
+ var
+ l: integer;
+ begin
+ scannerstatus := 1;
+ l := 0;
+ warninginfo := line;
+ while true do begin
+ getnext;
+ if curcmd <= 2 then
+ if curcmd < 2 then
+ l := l + 1
+ else begin
+ if l = 0 then
+ goto 30;
+ if curmod = 2 then
+ l := l - 1
+ end {743:}
+ else if curcmd = 39 then begin
+ if strref[curmod] < 127 then
+ if strref[curmod] > 1 then
+ strref[curmod] := strref[curmod] - 1
+ else
+ flushstring(curmod)
+ end {:743}
+ end;
+ 30:
+ scannerstatus := 0
+ end; {:742} {746:}
+
+ procedure changeiflimit(l: smallnumber; p: halfword);
+ label
+ 10;
+ var
+ q: halfword;
+ begin
+ if p = condptr then
+ iflimit := l
+ else begin
+ q := condptr;
+ while true do begin
+ if q = (-30000) then
+ confusion(583);
+ if mem[q].hh.rh = p then begin
+ mem[q].hh.b0 := l;
+ goto 10
+ end;
+ q := mem[q].hh.rh
+ end
+ end;
+ 10:
+ null
+ end; {:746} {747:}
+
+ procedure checkcolon;
+ begin
+ if curcmd <> 78 then begin
+ missingerr(58);
+ begin
+ helpptr := 2;
+ helpline[1] := 586;
+ helpline[0] := 563
+ end;
+ backerror
+ end
+ end; {:747} {748:}
+
+ procedure conditional;
+ label
+ 10, 30, 21, 40;
+ var
+ savecondptr: halfword;
+ newiflimit: 2..4;
+ p: halfword; {744:}
+ begin
+ begin
+ p := getnode(2);
+ mem[p].hh.rh := condptr;
+ mem[p].hh.b0 := iflimit;
+ mem[p].hh.b1 := curif;
+ mem[p + 1].int := ifline;
+ condptr := p;
+ iflimit := 1;
+ ifline := line;
+ curif := 1
+ end {:744};
+ savecondptr := condptr;
+ 21:
+ getboolean;
+ newiflimit := 4;
+ if internal[7] > 65536 then begin {750:}
+ begindiagnostic;
+ if curexp = 30 then
+ print(587)
+ else
+ print(588);
+ enddiagnostic(false)
+ end {:750};
+ 40:
+ checkcolon;
+ if curexp = 30 then begin
+ changeiflimit(newiflimit, savecondptr);
+ goto 10
+ end; {749:}
+ while true do begin
+ passtext;
+ if condptr = savecondptr then
+ goto 30
+ else if curmod = 2 then begin {745:}
+ p := condptr;
+ ifline := mem[p + 1].int;
+ curif := mem[p].hh.b1;
+ iflimit := mem[p].hh.b0;
+ condptr := mem[p].hh.rh;
+ freenode(p, 2)
+ end {:745}
+ end {:749};
+ 30:
+ curif := curmod;
+ ifline := line;
+ if curmod = 2 then begin {745:}
+ p := condptr;
+ ifline := mem[p + 1].int;
+ curif := mem[p].hh.b1;
+ iflimit := mem[p].hh.b0;
+ condptr := mem[p].hh.rh;
+ freenode(p, 2)
+ end else if curmod = 4 then {:745}
+ goto 21
+ else begin
+ curexp := 30;
+ newiflimit := 2;
+ getxnext;
+ goto 40
+ end;
+ 10:
+ null
+ end; {:748} {754:}
+
+ procedure badfor(s: strnumber);
+ begin
+ disperr(-30000, 591);
+ print(s);
+ print(177);
+ begin
+ helpptr := 4;
+ helpline[3] := 592;
+ helpline[2] := 593;
+ helpline[1] := 594;
+ helpline[0] := 179
+ end;
+ putgetflusherror(0)
+ end; {:754} {755:}
+
+ procedure beginiteration;
+ label
+ 22, 30, 40;
+ var
+ m: halfword;
+ n: halfword;
+ p, q, s, pp: halfword;
+ begin
+ m := curmod;
+ n := cursym;
+ s := getnode(2);
+ if m = 1 then begin
+ mem[s + 1].hh.lh := -29999;
+ p := -30000;
+ getxnext;
+ goto 40
+ end;
+ getsymbol;
+ p := getnode(2);
+ mem[p].hh.lh := cursym;
+ mem[p + 1].int := m;
+ getxnext;
+ if (curcmd <> 51) and (curcmd <> 77) then begin
+ missingerr(61);
+ begin
+ helpptr := 3;
+ helpline[2] := 595;
+ helpline[1] := 538;
+ helpline[0] := 596
+ end;
+ backerror
+ end;
+{764:}
+ mem[s + 1].hh.lh := -30000;
+ q := s + 1;
+ mem[q].hh.rh := -30000;
+ repeat
+ getxnext;
+ if m <> 2242 then
+ scansuffix
+ else begin
+ if curcmd >= 78 then
+ if curcmd <= 79 then
+ goto 22;
+ scanexpression;
+ if curcmd = 74 then
+ if q = (s + 1) then begin {765:}
+ if curtype <> 16 then
+ badfor(602);
+ pp := getnode(4);
+ mem[pp + 1].int := curexp;
+ getxnext;
+ scanexpression;
+ if curtype <> 16 then
+ badfor(603);
+ mem[pp + 2].int := curexp;
+ if curcmd <> 75 then begin
+ missingerr(357);
+ begin
+ helpptr := 2;
+ helpline[1] := 604;
+ helpline[0] := 605
+ end;
+ backerror
+ end;
+ getxnext;
+ scanexpression;
+ if curtype <> 16 then
+ badfor(606);
+ mem[pp + 3].int := curexp;
+ mem[s + 1].hh.lh := pp;
+ goto 30
+ end {:765};
+ curexp := stashcurexp
+ end;
+ mem[q].hh.rh := getavail;
+ q := mem[q].hh.rh;
+ mem[q].hh.lh := curexp;
+ curtype := 1;
+ 22:
+ null
+ until curcmd <> 79;
+ 30: {:764}
+ null;
+ 40: {756:}
+ if curcmd <> 78 then begin
+ missingerr(58);
+ begin
+ helpptr := 3;
+ helpline[2] := 597;
+ helpline[1] := 598;
+ helpline[0] := 599
+ end;
+ backerror
+ end {:756}; {758:}
+ q := getavail;
+ mem[q].hh.lh := 2230;
+ scannerstatus := 6;
+ warninginfo := n;
+ mem[s].hh.lh := scantoks(4, p, q, 0);
+ scannerstatus := 0;
+ mem[s].hh.rh := loopptr;
+ loopptr := s {:758};
+ resumeiteration
+ end; {:755} {760:}
+
+ procedure resumeiteration;
+ label
+ 45, 10;
+ var
+ p, q: halfword;
+ begin
+ p := mem[loopptr + 1].hh.lh;
+ if p > (-29999) then begin
+ curexp := mem[p + 1].int; {761:}
+ if ((mem[p + 2].int > 0) and (curexp > mem[p + 3].int)) or ((mem[p + 2].int < 0) and (curexp < mem[p + 3].int)) then {:761}
+ goto 45;
+ curtype := 16;
+ q := stashcurexp;
+ mem[p + 1].int := curexp + mem[p + 2].int
+ end else if p < (-29999) then begin
+ p := mem[loopptr + 1].hh.rh;
+ if p = (-30000) then
+ goto 45;
+ mem[loopptr + 1].hh.rh := mem[p].hh.rh;
+ q := mem[p].hh.lh;
+ begin
+ mem[p].hh.rh := avail;
+ avail := p
+ end {dynused:=dynused-1;}
+ end else begin
+ begintokenlist(mem[loopptr].hh.lh, 7);
+ goto 10
+ end;
+ begintokenlist(mem[loopptr].hh.lh, 8);
+ stackargument(q);
+ if internal[7] > 65536 then begin {762:}
+ begindiagnostic;
+ printnl(601);
+ if (q <> (-30000)) and (mem[q].hh.rh = (-29999)) then
+ printexp(q, 1)
+ else
+ showtokenlist(q, -30000, 50, 0);
+ printchar(125);
+ enddiagnostic(false)
+ end {:762};
+ goto 10;
+ 45:
+ stopiteration;
+ 10:
+ null
+ end; {:760} {763:}
+
+ procedure stopiteration;
+ var
+ p, q: halfword;
+ begin
+ p := mem[loopptr + 1].hh.lh;
+ if p > (-29999) then
+ freenode(p, 4)
+ else if p < (-29999) then begin
+ q := mem[loopptr + 1].hh.rh;
+ while q <> (-30000) do begin
+ p := mem[q].hh.lh;
+ if p <> (-30000) then
+ if mem[p].hh.rh = (-29999) then begin
+ recyclevalue(p);
+ freenode(p, 2)
+ end else
+ flushtokenlist(p);
+ p := q;
+ q := mem[q].hh.rh;
+ begin
+ mem[p].hh.rh := avail;
+ avail := p
+ end {dynused:=dynused-1;}
+ end
+ end;
+ p := loopptr;
+ loopptr := mem[p].hh.rh;
+ flushtokenlist(mem[p].hh.lh);
+ freenode(p, 2)
+ end; {:763} {770:}
+
+ procedure beginname;
+ begin
+ areadelimiter := 0;
+ extdelimiter := 0
+ end; {:770} {771:}
+
+ function morename(c: ASCIIcode): boolean;
+ begin
+ if (c = 32) or (c = 9) then
+ morename := false
+ else begin
+ if c = 47 then begin
+ areadelimiter := poolptr;
+ extdelimiter := 0
+ end else if (c = 46) and (extdelimiter = 0) then
+ extdelimiter := poolptr;
+ begin
+ if (poolptr + 1) > maxpoolptr then begin
+ if (poolptr + 1) > poolsize then
+ overflow(129, poolsize - initpoolptr);
+ maxpoolptr := poolptr + 1
+ end
+ end;
+ begin
+ strpool[poolptr] := c;
+ poolptr := poolptr + 1
+ end;
+ morename := true
+ end
+ end; { morename }
+{:771}
+ {772:}
+
+ procedure endname;
+ begin
+ if (strptr + 3) > maxstrptr then begin
+ if (strptr + 3) > maxstrings then
+ overflow(130, maxstrings - initstrptr);
+ maxstrptr := strptr + 3
+ end;
+ if areadelimiter = 0 then
+ curarea := 155
+ else begin
+ curarea := strptr;
+ strptr := strptr + 1;
+ strstart[strptr] := areadelimiter + 1
+ end;
+ if extdelimiter = 0 then begin
+ curext := 155;
+ curname := makestring
+ end else begin
+ curname := strptr;
+ strptr := strptr + 1;
+ strstart[strptr] := extdelimiter;
+ curext := makestring
+ end
+ end; {:772} {774:}
+
+ procedure packfilename(n, a, e: strnumber);
+ var
+ k: integer;
+ c: ASCIIcode;
+ j: poolpointer;
+ begin
+ k := 0;
+ for j := strstart[a] to strstart[a + 1] - 1 do begin
+ c := strpool[j];
+ k := k + 1;
+ if k <= filenamesize then
+ nameoffile[k] := xchr[c]
+ end;
+ for j := strstart[n] to strstart[n + 1] - 1 do begin
+ c := strpool[j];
+ k := k + 1;
+ if k <= filenamesize then
+ nameoffile[k] := xchr[c]
+ end;
+ for j := strstart[e] to strstart[e + 1] - 1 do begin
+ c := strpool[j];
+ k := k + 1;
+ if k <= filenamesize then
+ nameoffile[k] := xchr[c]
+ end;
+ if k <= filenamesize then
+ namelength := k
+ else
+ namelength := filenamesize;
+ for k := namelength + 1 to filenamesize do
+ nameoffile[k] := ' '
+ end; {:774}
+{778:}
+
+ procedure packbufferedname(n: smallnumber; a, b: integer);
+ var
+ k: integer;
+ c: ASCIIcode;
+ j: integer;
+ begin
+ if (((n + b) - a) + 6) > filenamesize then
+ b := ((a + filenamesize) - n) - 6;
+ k := 0;
+ for j := 1 to n do begin
+ c := xord[MFbasedefault[j]];
+ k := k + 1;
+ if k <= filenamesize then
+ nameoffile[k] := xchr[c]
+ end;
+ for j := a to b do begin
+ c := buffer[j];
+ k := k + 1;
+ if k <= filenamesize then
+ nameoffile[k] := xchr[c]
+ end;
+ for j := 6 to 10 do begin
+ c := xord[MFbasedefault[j]];
+ k := k + 1;
+ if k <= filenamesize then
+ nameoffile[k] := xchr[c]
+ end;
+ if k <= filenamesize then
+ namelength := k
+ else
+ namelength := filenamesize;
+ for k := namelength + 1 to filenamesize do
+ nameoffile[k] := ' '
+ end; {:778}
+{780:}
+
+ function makenamestring: strnumber;
+ var
+ k, kstart: 1..filenamesize;
+ begin
+ k := 1;
+ while (k < filenamesize) and (xord[realnameoffile[k]] <> 32) do
+ k := k + 1;
+ namelength := k - 1;
+ if ((poolptr + namelength) > poolsize) or (strptr = maxstrings) then
+ makenamestring := 63
+ else begin
+ if (xord[realnameoffile[1]] = 46) and (xord[realnameoffile[2]] = 47) then
+ kstart := 3
+ else
+ kstart := 1;
+ for k := kstart to namelength do begin
+ strpool[poolptr] := xord[realnameoffile[k]];
+ poolptr := poolptr + 1
+ end;
+ makenamestring := makestring
+ end
+ end;
+
+ function amakenamestring(var f: alphafile): strnumber;
+ begin
+ amakenamestring := makenamestring
+ end; { amakenamestring }
+
+ function bmakenamestring(var f: bytefile): strnumber;
+ begin
+ bgetname(f, realnameoffile);
+ bmakenamestring := makenamestring
+ end; { bmakenamestring }
+
+ function wmakenamestring(var f: wordfile): strnumber;
+ begin
+ wmakenamestring := makenamestring
+ end; {:780} {781:}
+
+ procedure scanfilename;
+ label
+ 30;
+ begin
+ beginname;
+ while (buffer[curinput.locfield] = 32) or (buffer[curinput.locfield] = 9) do
+ curinput.locfield := curinput.locfield + 1;
+ while true do begin
+ if (buffer[curinput.locfield] = 59) or (buffer[curinput.locfield] = 37) then
+ goto 30;
+ if not morename(buffer[curinput.locfield]) then
+ goto 30;
+ curinput.locfield := curinput.locfield + 1
+ end;
+ 30:
+ endname
+ end; {:781} {784:}
+
+ procedure packjobname(s: strnumber);
+ begin
+ curarea := 155;
+ curext := s;
+ curname := jobname;
+ packfilename(curname, curarea, curext)
+ end; {:784} {786:}
+
+ procedure promptfilename(s, e: strnumber);
+ label
+ 30;
+ var
+ k: 0..bufsize;
+ begin
+ if interaction = 2 then
+ null;
+ if s = 607 then begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(608)
+ end else begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(609)
+ end;
+ printfilename(curname, curarea, curext);
+ print(610);
+ if e = 611 then
+ showcontext;
+ printnl(612);
+ print(s);
+ if interaction < 2 then
+ fatalerror(613);
+ begin
+ print(614);
+ terminput
+ end;
+{787:}
+ begin
+ beginname;
+ k := first;
+ while ((buffer[k] = 32) or (buffer[k] = 9)) and (k < last) do
+ k := k + 1;
+ while true do begin
+ if k = last then
+ goto 30;
+ if not morename(buffer[k]) then
+ goto 30;
+ k := k + 1
+ end;
+ 30:
+ endname
+ end {:787};
+ if curext = 155 then
+ curext := e;
+ packfilename(curname, curarea, curext)
+ end; { promptfilename }
+{:786}
+ {788:}
+
+ procedure openlogfile;
+ var
+ oldsetting: 0..5;
+ k: 0..bufsize;
+ l: 0..bufsize;
+ m: integer;
+ months: packed array [1..36] of char;
+ begin
+ oldsetting := selector;
+ if jobname = 0 then
+ jobname := 615;
+ packjobname(616);
+ while not aopenout(logfile) do begin {789:}
+ if interaction < 2 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(609)
+ end;
+ printfilename(curname, curarea, curext);
+ print(610);
+ jobname := 0;
+ history := 3;
+ jumpout
+ end;
+ promptfilename(618, 616)
+ end {:789};
+ logname := amakenamestring(logfile);
+ selector := 2; {790:}
+ begin
+ write(logfile, 'This is METAFONT, Version 1.0 for Berkeley UNIX');
+ print(baseident);
+ print(619);
+ printint(roundunscaled(internal[16]));
+ printchar(32);
+ months := 'JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
+ m := roundunscaled(internal[15]);
+ for k := (3 * m) - 2 to 3 * m do
+ write(logfile, months[k]);
+ printchar(32);
+ printint(roundunscaled(internal[14]));
+ printchar(32);
+ m := roundunscaled(internal[17]);
+ printdd(m div 60);
+ printchar(58);
+ printdd(m mod 60)
+ end {:790};
+ inputstack[inputptr] := curinput;
+ printnl(617);
+ l := inputstack[0].limitfield - 1;
+ for k := 1 to l do
+ print(buffer[k]);
+ println;
+ selector := oldsetting + 2
+ end; {:788} {793:}
+
+ procedure startinput;
+ label
+ 30; {795:}
+ begin
+ while (curinput.indexfield > 6) and (curinput.locfield = (-30000)) do
+ endtokenlist;
+ if curinput.indexfield > 6 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(621)
+ end;
+ begin
+ helpptr := 3;
+ helpline[2] := 622;
+ helpline[1] := 623;
+ helpline[0] := 624
+ end;
+ error
+ end;
+ if curinput.indexfield <= 6 then
+ scanfilename
+ else begin
+ curname := 155;
+ curext := 155;
+ curarea := 155
+ end {:795};
+ if curext = 155 then
+ curext := 611;
+ packfilename(curname, curarea, curext);
+ while true do begin
+ beginfilereading;
+ if aopenin(inputfile[curinput.indexfield], 6) then
+ goto 30;
+ endfilereading;
+ promptfilename(607, 611)
+ end;
+ 30:
+ curinput.namefield := amakenamestring(inputfile[curinput.indexfield]);
+ strref[curname] := 127;
+ if jobname = 0 then begin
+ jobname := curname;
+ openlogfile
+ end;
+ if (termoffset + (strstart[curinput.namefield + 1] - strstart[curinput.namefield])) > (maxprintline - 2) then
+ println
+ else if (termoffset > 0) or (fileoffset > 0) then
+ printchar(32);
+ printchar(40);
+ print(curinput.namefield);
+ flush(output); {794:}
+ begin
+ if not inputln(inputfile[curinput.indexfield], false) then
+ null;
+ firmuptheline;
+ buffer[curinput.limitfield] := 37;
+ first := curinput.limitfield + 1;
+ curinput.locfield := curinput.startfield;
+ line := 1
+ end {:794}
+ end; {:793} {824:}
+
+ procedure badexp(s: strnumber);
+ var
+ saveflag: 0..82;
+ begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(s)
+ end;
+ print(634);
+ printcmdmod(curcmd, curmod);
+ printchar(39);
+ begin
+ helpptr := 4;
+ helpline[3] := 635;
+ helpline[2] := 636;
+ helpline[1] := 637;
+ helpline[0] := 638
+ end;
+ backinput;
+ cursym := 0;
+ curcmd := 42;
+ curmod := 0;
+ inserror;
+ saveflag := varflag;
+ varflag := 0;
+ getxnext;
+ varflag := saveflag
+ end; {:824} {827:}
+
+ procedure stashin(p: halfword);
+ var
+ q: halfword;
+ begin
+ mem[p].hh.b0 := curtype;
+ {
+ 829:}
+ if curtype = 16 then
+ mem[p + 1].int := curexp
+ else begin
+ if curtype = 19 then begin
+ q := singledependency(curexp);
+ if q = depfinal then begin
+ mem[p].hh.b0 := 16;
+ mem[p + 1].int := 0;
+ freenode(q, 2)
+ end else begin
+ mem[p].hh.b0 := 17;
+ newdep(p, q)
+ end;
+ recyclevalue(curexp)
+ end else begin {:829}
+ mem[p + 1] := mem[curexp + 1];
+ mem[mem[p + 1].hh.lh].hh.rh := p
+ end;
+ freenode(curexp, 2)
+ end;
+ curtype := 1
+ end; { stashin }
+{:827}
+ {848:}
+
+ procedure backexpr;
+ var
+ p: halfword;
+ begin
+ p := stashcurexp;
+ mem[p].hh.rh := -30000;
+ begintokenlist(p, 10)
+ end; {:848} {849:}
+
+ procedure badsubscript;
+ begin
+ disperr(-30000, 650);
+ begin
+ helpptr := 3;
+ helpline[2] := 651;
+ helpline[1] := 652;
+ helpline[0] := 653
+ end;
+ flusherror(0)
+ end; {:849} {851:}
+
+ procedure obliterated(q: halfword);
+ begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(654)
+ end;
+ showtokenlist(q, -30000, 1000, 0);
+ print(655);
+ begin
+ helpptr := 5;
+ helpline[4] := 656;
+ helpline[3] := 657;
+ helpline[2] := 658;
+ helpline[1] := 659;
+ helpline[0] := 660
+ end
+ end; {:851} {863:}
+
+ procedure binarymac(p, c, n: halfword);
+ var
+ q, r: halfword;
+ begin
+ q := getavail;
+ r := getavail;
+ mem[q].hh.rh := r;
+ mem[q].hh.lh := p;
+ mem[r].hh.lh := stashcurexp;
+ macrocall(c, q, n)
+ end; {:863} {865:}
+
+ procedure materializepen;
+ label
+ 50;
+ var
+ aminusb, aplusb, majoraxis, minoraxis: scaled;
+ theta: angle;
+ p: halfword;
+ q: halfword;
+ begin
+ q := curexp;
+ if mem[q].hh.b0 = 0 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(670)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 671;
+ helpline[0] := 442
+ end;
+ putgeterror;
+ curexp := -29997;
+ goto 50
+ end else if mem[q].hh.b0 = 4 then begin {866:}
+ tx := mem[q + 1].int;
+ ty := mem[q + 2].int;
+ txx := mem[q + 3].int - tx;
+ tyx := mem[q + 4].int - ty;
+ txy := mem[q + 5].int - tx;
+ tyy := mem[q + 6].int - ty;
+ aminusb := pythadd(txx - tyy, tyx + txy);
+ aplusb := pythadd(txx + tyy, tyx - txy);
+ majoraxis := (aminusb + aplusb) div 2;
+ minoraxis := abs(aplusb - aminusb) div 2;
+ if majoraxis = minoraxis then
+ theta := 0
+ else
+ theta := (narg(txx - tyy, tyx + txy) + narg(txx + tyy, tyx - txy)) div 2;
+ freenode(q, 7);
+ q := makeellipse(majoraxis, minoraxis, theta);
+ if (tx <> 0) or (ty <> 0) then begin {867:}
+ p := q;
+ repeat
+ mem[p + 1].int := mem[p + 1].int + tx;
+ mem[p + 2].int := mem[p + 2].int + ty;
+ p := mem[p].hh.rh
+ until p = q
+ end {:867}
+ end {:866};
+ curexp := makepen(q);
+ 50:
+ tossknotlist(q);
+ curtype := 6
+ end; {:865}
+{871:}
+ {872:}
+
+ procedure knownpair;
+ var
+ p: halfword;
+ begin
+ if curtype <> 14 then begin
+ disperr(-30000, 673);
+ begin
+ helpptr := 5;
+ helpline[4] := 674;
+ helpline[3] := 675;
+ helpline[2] := 676;
+ helpline[1] := 677;
+ helpline[0] := 678
+ end;
+ putgetflusherror(0);
+ curx := 0;
+ cury := 0
+ end else begin
+ p := mem[curexp + 1].int; {873:}
+ if mem[p].hh.b0 = 16 then
+ curx := mem[p + 1].int
+ else begin
+ disperr(p, 679);
+ begin
+ helpptr := 5;
+ helpline[4] := 680;
+ helpline[3] := 675;
+ helpline[2] := 676;
+ helpline[1] := 677;
+ helpline[0] := 678
+ end;
+ putgeterror;
+ recyclevalue(p);
+ curx := 0
+ end;
+ if mem[p + 2].hh.b0 = 16 then
+ cury := mem[p + 3].int
+ else begin
+ disperr(p + 2, 681);
+ begin
+ helpptr := 5;
+ helpline[4] := 682;
+ helpline[3] := 675;
+ helpline[2] := 676;
+ helpline[1] := 677;
+ helpline[0] := 678
+ end;
+ putgeterror;
+ recyclevalue(p + 2);
+ cury := 0
+ end {:873};
+ flushcurexp(0)
+ end
+ end; {:872}
+
+ function newknot: halfword;
+ var
+ q: halfword;
+ begin
+ q := getnode(7);
+ mem[q].hh.b0 := 0;
+ mem[q].hh.b1 := 0;
+ mem[q].hh.rh := q;
+ knownpair;
+ mem[q + 1].int := curx;
+ mem[q + 2].int := cury;
+ newknot := q
+ end; {:871} {875:}
+
+ function scandirection: smallnumber;
+ var
+ t: 2..4;
+ x: scaled;
+ begin
+ getxnext;
+ if curcmd = 60 then begin {876:}
+ getxnext;
+ scanexpression;
+ if (curtype <> 16) or (curexp < 0) then begin
+ disperr(-30000, 685);
+ begin
+ helpptr := 1;
+ helpline[0] := 686
+ end;
+ putgetflusherror(65536)
+ end;
+ t := 3
+ end else begin {:876} {877:}
+ scanexpression;
+ if curtype > 14 then begin {878:}
+ if curtype <> 16 then begin
+ disperr(-30000, 679);
+ begin
+ helpptr := 5;
+ helpline[4] := 680;
+ helpline[3] := 675;
+ helpline[2] := 676;
+ helpline[1] := 677;
+ helpline[0] := 678
+ end;
+ putgetflusherror(0)
+ end;
+ x := curexp;
+ if curcmd <> 79 then begin
+ missingerr(44);
+ begin
+ helpptr := 2;
+ helpline[1] := 687;
+ helpline[0] := 688
+ end;
+ backerror
+ end;
+ getxnext;
+ scanexpression;
+ if curtype <> 16 then begin
+ disperr(-30000, 681);
+ begin
+ helpptr := 5;
+ helpline[4] := 682;
+ helpline[3] := 675;
+ helpline[2] := 676;
+ helpline[1] := 677;
+ helpline[0] := 678
+ end;
+ putgetflusherror(0)
+ end;
+ cury := curexp;
+ curx := x
+ end else {:878}
+ knownpair;
+ if (curx = 0) and (cury = 0) then
+ t := 4
+ else begin
+ t := 2;
+ curexp := narg(curx, cury)
+ end
+ end {:877};
+ if curcmd <> 65 then begin
+ missingerr(125);
+ begin
+ helpptr := 3;
+ helpline[2] := 683;
+ helpline[1] := 684;
+ helpline[0] := 563
+ end;
+ backerror
+ end;
+ getxnext;
+ scandirection := t
+ end; {:875} {895:}
+
+ procedure donullary(c: quarterword);
+ var
+ k: integer;
+ begin
+ begin
+ if aritherror then
+ cleararith
+ end;
+ if internal[7] > 131072 then
+ showcmdmod(33, c);
+ case c of
+ 30, 31:
+ begin
+ curtype := 2;
+ curexp := c
+ end;
+ 32:
+ begin
+ curtype := 11;
+ curexp := getnode(6);
+ initedges(curexp)
+ end;
+ 33:
+ begin
+ curtype := 6;
+ curexp := -29997
+ end;
+ 37:
+ begin
+ curtype := 16;
+ curexp := normrand
+ end;
+ 36:
+ begin {896:}
+ curtype := 8;
+ curexp := getnode(7);
+ mem[curexp].hh.b0 := 4;
+ mem[curexp].hh.b1 := 4;
+ mem[curexp].hh.rh := curexp;
+ mem[curexp + 1].int := 0;
+ mem[curexp + 2].int := 0;
+ mem[curexp + 3].int := 65536;
+ mem[curexp + 4].int := 0;
+ mem[curexp + 5].int := 0;
+ mem[curexp + 6].int := 65536
+ end; {:896}
+ 34:
+ begin
+ if jobname = 0 then
+ openlogfile;
+ curtype := 4;
+ curexp := jobname
+ end;
+ 35:
+ begin {897:}
+ if interaction <= 1 then
+ fatalerror(699);
+ beginfilereading;
+ curinput.namefield := 1;
+ begin
+ print(155);
+ terminput
+ end;
+ begin
+ if ((poolptr + last) - curinput.startfield) > maxpoolptr then begin
+ if ((poolptr + last) - curinput.startfield) > poolsize then
+ overflow(129, poolsize - initpoolptr);
+ maxpoolptr := (poolptr + last) - curinput.startfield
+ end
+ end;
+ for k := curinput.startfield to last - 1 do begin
+ strpool[poolptr] := buffer[k];
+ poolptr := poolptr + 1
+ end;
+ endfilereading;
+ curtype := 4;
+ curexp := makestring
+ end
+ end {:897};
+ begin
+ if aritherror then
+ cleararith
+ end
+ end; {:895} {898:}
+{899:}
+
+ function nicepair(p: integer; t: quarterword): boolean;
+ label
+ 10;
+ begin
+ if t = 14 then begin
+ p := mem[p + 1].int;
+ if mem[p].hh.b0 = 16 then
+ if mem[p + 2].hh.b0 = 16 then begin
+ nicepair := true;
+ goto 10
+ end
+ end;
+ nicepair := false;
+ 10:
+ null
+ end; {:899} {900:}
+
+ procedure printknownorunknownt(t: smallnumber; v: integer);
+ begin
+ printchar(40);
+ if t < 17 then
+ if t <> 14 then
+ printtype(t)
+ else if nicepair(v, 14) then
+ print(207)
+ else
+ print(700)
+ else
+ print(701);
+ printchar(41)
+ end; {:900} {901:}
+
+ procedure badunary(c: quarterword);
+ begin
+ disperr(-30000, 702);
+ printop(c);
+ printknownorunknownt(curtype, curexp);
+ begin
+ helpptr := 3;
+ helpline[2] := 703;
+ helpline[1] := 704;
+ helpline[0] := 705
+ end;
+ putgeterror
+ end; {:901} {904:}
+
+ procedure negatedeplist(p: halfword);
+ label
+ 10;
+ begin
+ while true do begin
+ mem[p + 1].int := -mem[p + 1].int;
+ if mem[p].hh.lh = (-30000) then
+ goto 10;
+ p := mem[p].hh.rh
+ end;
+ 10:
+ null
+ end; {:904}
+{908:}
+
+ procedure pairtopath;
+ begin
+ curexp := newknot;
+ curtype := 9
+ end; {:908}
+{910:}
+
+ procedure takepart(c: quarterword);
+ var
+ p: halfword;
+ begin
+ p := mem[curexp + 1].int;
+ mem[-29982].int := p;
+ mem[-29983].hh.b0 := curtype;
+ mem[p].hh.rh := -29983;
+ freenode(curexp, 2);
+ makeexpcopy(p + (2 * (c - 53)));
+ recyclevalue(-29983)
+ end; {:910} {913:}
+
+ procedure strtonum(c: quarterword);
+ var
+ n: integer;
+ m: ASCIIcode;
+ k: poolpointer;
+ b: 8..16;
+ badchar: boolean;
+ begin
+ if c = 49 then
+ if (strstart[curexp + 1] - strstart[curexp]) = 0 then
+ n := -1
+ else
+ n := strpool[strstart[curexp]]
+ else begin
+ if c = 47 then
+ b := 8
+ else
+ b := 16;
+ n := 0;
+ badchar := false;
+ for k := strstart[curexp] to strstart[curexp + 1] - 1 do begin
+ m := strpool[k];
+ if (m >= 48) and (m <= 57) then
+ m := m - 48
+ else if (m >= 65) and (m <= 70) then
+ m := m - 55
+ else if (m >= 97) and (m <= 102) then
+ m := m - 87
+ else begin
+ badchar := true;
+ m := 0
+ end;
+ if m >= b then begin
+ badchar := true;
+ m := 0
+ end;
+ if n < (32768 div b) then
+ n := (n * b) + m
+ else
+ n := 32767
+ end; {914:}
+ if badchar then begin
+ disperr(-30000, 707);
+ if c = 47 then begin
+ helpptr := 1;
+ helpline[0] := 708
+ end else begin
+ helpptr := 1;
+ helpline[0] := 709
+ end;
+ putgeterror
+ end;
+ if n > 4095 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(710)
+ end;
+ printint(n);
+ printchar(41);
+ begin
+ helpptr := 1;
+ helpline[0] := 711
+ end;
+ putgeterror
+ end {:914}
+ end;
+ flushcurexp(n * 65536)
+ end; { strtonum }
+{:913}
+ {916:}
+
+ function pathlength: scaled;
+ var
+ n: scaled;
+ p: halfword;
+ begin
+ p := curexp;
+ if mem[p].hh.b0 = 0 then
+ n := -65536
+ else
+ n := 0;
+ repeat
+ p := mem[p].hh.rh;
+ n := n + 65536
+ until p = curexp;
+ pathlength := n
+ end; { pathlength }
+{:916}
+ {919:}
+
+ procedure testknown(c: quarterword);
+ label
+ 30;
+ var
+ b: 30..31;
+ p, q: halfword;
+ begin
+ b := 31;
+ if curtype in
+ [1, 2, 4, 6, 8, 9, 11, 16,
+ 13, 14] then
+ case curtype of
+ 1, 2, 4, 6, 8, 9, 11,
+ 16:
+ b := 30;
+ 13, 14:
+ begin
+ p := mem[curexp + 1].int;
+ q := p + bignodesize[curtype];
+ repeat
+ q := q - 2;
+ if mem[q].hh.b0 <> 16 then
+ goto 30
+ until q = p;
+ b := 30;
+ 30:
+ null
+ end
+ end
+ else
+ null;
+ if c = 39 then
+ flushcurexp(b)
+ else
+ flushcurexp(61 - b);
+ curtype := 2
+ end; {:919}
+
+ procedure dounary(c: quarterword);
+ var
+ p, q: halfword;
+ x: integer;
+ begin
+ begin
+ if aritherror then
+ cleararith
+ end;
+ if internal[7] > 131072 then begin {902:}
+ begindiagnostic;
+ printnl(123);
+ printop(c);
+ printchar(40);
+ printexp(-30000, 0);
+ print(706);
+ enddiagnostic(false)
+ end {:902};
+ case c of
+ 69:
+ if curtype < 14 then
+ if curtype <> 11 then
+ badunary(69);
+ 70: {903:}
+ if curtype in
+ [14, 19, 17, 18, 16, 11] then
+ case curtype of
+ 14, 19:
+ begin
+ q := curexp;
+ makeexpcopy(q);
+ if curtype = 17 then
+ negatedeplist(mem[curexp + 1].hh.rh)
+ else if curtype = 14 then begin
+ p := mem[curexp + 1].int;
+ if mem[p].hh.b0 = 16 then
+ mem[p + 1].int := -mem[p + 1].int
+ else
+ negatedeplist(mem[p + 1].hh.rh);
+ if mem[p + 2].hh.b0 = 16 then
+ mem[p + 3].int := -mem[p + 3].int
+ else
+ negatedeplist(mem[p + 3].hh.rh)
+ end;
+ recyclevalue(q);
+ freenode(q, 2)
+ end;
+ 17, 18:
+ negatedeplist(mem[curexp + 1].hh.rh);
+ 16:
+ curexp := -curexp;
+ 11:
+ negateedges(curexp)
+ end
+ else
+ badunary(70) {:903}; {905:}
+ 41:
+ if curtype <> 2 then
+ badunary(41)
+ else
+ curexp := 61 - curexp; {:905} {906:}
+ 59, 60, 61, 62, 63, 64, 65,
+ 38, 66:
+ if curtype <> 16 then
+ badunary(c)
+ else
+ case c of
+ 59:
+ curexp := squarert(curexp);
+ 60:
+ curexp := mexp(curexp);
+ 61:
+ curexp := mlog(curexp);
+ 62, 63:
+ begin
+ nsincos((curexp mod 23592960) * 16);
+ if c = 62 then
+ curexp := roundfraction(nsin)
+ else
+ curexp := roundfraction(ncos)
+ end;
+ 64:
+ curexp := floorscaled(curexp);
+ 65:
+ curexp := unifrand(curexp);
+ 38:
+ begin
+ if odd(roundunscaled(curexp)) then
+ curexp := 30
+ else
+ curexp := 31;
+ curtype := 2
+ end;
+ 66:
+ begin {1181:}
+ curexp := roundunscaled(curexp) mod 256;
+ if curexp < 0 then
+ curexp := curexp + 256;
+ if charexists[curexp] then
+ curexp := 30
+ else
+ curexp := 31;
+ curtype := 2
+ end
+ end {:1181}; {:906} {907:}
+ 67:
+ if nicepair(curexp, curtype) then begin
+ p := mem[curexp + 1].int;
+ x := narg(mem[p + 1].int, mem[p + 3].int);
+ if x >= 0 then
+ flushcurexp((x + 8) div 16)
+ else
+ flushcurexp(-(((-x) + 8) div 16))
+ end else
+ badunary(67); {:907} {909:}
+ 53, 54:
+ if (curtype <= 14) and (curtype >= 13) then
+ takepart(c)
+ else
+ badunary(c);
+ 55, 56, 57, 58:
+ if curtype = 13 then
+ takepart(c)
+ else
+ badunary(c); {:909} {912:}
+ 50:
+ if curtype <> 16 then
+ badunary(50)
+ else begin
+ curexp := roundunscaled(curexp) mod 128;
+ curtype := 4;
+ if curexp < 0 then
+ curexp := curexp + 128;
+ if (strstart[curexp + 1] - strstart[curexp]) <> 1 then begin
+ begin
+ if (poolptr + 1) > maxpoolptr then begin
+ if (poolptr + 1) > poolsize then
+ overflow(129, poolsize - initpoolptr);
+ maxpoolptr := poolptr + 1
+ end
+ end;
+ begin
+ strpool[poolptr] := curexp;
+ poolptr := poolptr + 1
+ end;
+ curexp := makestring
+ end
+ end;
+ 42:
+ if curtype <> 16 then
+ badunary(42)
+ else begin
+ oldsetting := selector;
+ selector := 5;
+ printscaled(curexp);
+ curexp := makestring;
+ selector := oldsetting;
+ curtype := 4
+ end;
+ 47, 48, 49:
+ if curtype <> 4 then
+ badunary(c)
+ else
+ strtonum(c);
+{:912}
+ {915:}
+ 51:
+ if curtype = 4 then
+ flushcurexp((strstart[curexp + 1] - strstart[curexp]) * 65536)
+ else if curtype = 9 then
+ flushcurexp(pathlength)
+ else if curtype = 16 then
+ curexp := abs(curexp)
+ else if nicepair(curexp, curtype) then
+ flushcurexp(pythadd(mem[mem[curexp + 1].int + 1].int, mem[mem[curexp + 1].int + 3].int))
+ else
+ badunary(c); {:915} {917:}
+ 52:
+ if curtype = 14 then
+ flushcurexp(0)
+ else if curtype <> 9 then
+ badunary(52)
+ else if mem[curexp].hh.b0 = 0 then
+ flushcurexp(0)
+ else begin
+ curpen := -29997;
+ curpathtype := 1;
+ curexp := makespec(curexp, -1879080960, 0);
+ flushcurexp(turningnumber * 65536)
+ end; {:917} {918:}
+ 2:
+ begin
+ if (curtype >= 2) and (curtype <= 3) then
+ flushcurexp(30)
+ else
+ flushcurexp(31);
+ curtype := 2
+ end;
+ 4:
+ begin
+ if (curtype >= 4) and (curtype <= 5) then
+ flushcurexp(30)
+ else
+ flushcurexp(31);
+ curtype := 2
+ end;
+ 6:
+ begin
+ if (curtype >= 6) and (curtype <= 8) then
+ flushcurexp(30)
+ else
+ flushcurexp(31);
+ curtype := 2
+ end;
+ 9:
+ begin
+ if (curtype >= 9) and (curtype <= 10) then
+ flushcurexp(30)
+ else
+ flushcurexp(31);
+ curtype := 2
+ end;
+ 11:
+ begin
+ if (curtype >= 11) and (curtype <= 12) then
+ flushcurexp(30)
+ else
+ flushcurexp(31);
+ curtype := 2
+ end;
+ 13, 14:
+ begin
+ if curtype = c then
+ flushcurexp(30)
+ else
+ flushcurexp(31);
+ curtype := 2
+ end;
+ 15:
+ begin
+ if (curtype >= 16) and (curtype <= 19) then
+ flushcurexp(30)
+ else
+ flushcurexp(31);
+ curtype := 2
+ end;
+ 39, 40:
+ testknown(c); {:918} {920:}
+ 68:
+ begin
+ if curtype <> 9 then
+ flushcurexp(31)
+ else if mem[curexp].hh.b0 <> 0 then
+ flushcurexp(30)
+ else
+ flushcurexp(31);
+ curtype := 2
+ end; {:920} {921:}
+ 45:
+ begin
+ if curtype = 14 then
+ pairtopath;
+ if curtype = 9 then
+ curtype := 8
+ else
+ badunary(45)
+ end;
+ 44:
+ begin
+ if curtype = 8 then
+ materializepen;
+ if curtype <> 6 then
+ badunary(44)
+ else begin
+ flushcurexp(makepath(curexp));
+ curtype := 9
+ end
+ end;
+ 46:
+ if curtype <> 11 then
+ badunary(46)
+ else
+ flushcurexp(totalweight(curexp));
+ 43:
+ if curtype = 9 then begin
+ p := htapypoc(curexp);
+ if mem[p].hh.b1 = 0 then
+ p := mem[p].hh.rh;
+ tossknotlist(curexp);
+ curexp := p
+ end else if curtype = 14 then
+ pairtopath
+ else
+ badunary(43)
+ end {:921};
+ begin
+ if aritherror then
+ cleararith
+ end
+ end; {:898} {922:} {923:}
+
+ procedure badbinary(p: halfword; c: quarterword);
+ begin
+ disperr(p, 155);
+ disperr(-30000, 702);
+ if c >= 94 then
+ printop(c);
+ printknownorunknownt(mem[p].hh.b0, p);
+ if c >= 94 then
+ print(347)
+ else
+ printop(c);
+ printknownorunknownt(curtype, curexp);
+ begin
+ helpptr := 3;
+ helpline[2] := 703;
+ helpline[1] := 712;
+ helpline[0] := 713
+ end;
+ putgeterror
+ end; {:923} {928:}
+
+ function tarnished(p: halfword): halfword;
+ label
+ 10;
+ var
+ q: halfword;
+ r: halfword;
+ begin
+ q := mem[p + 1].int;
+ r := q + bignodesize[mem[p].hh.b0];
+ repeat
+ r := r - 2;
+ if mem[r].hh.b0 = 19 then begin
+ tarnished := -29999;
+ goto 10
+ end
+ until r = q;
+ tarnished := -30000;
+ 10:
+ null
+ end; {:928} {930:} {935:}
+
+ procedure depfinish(v, q: halfword; t: smallnumber);
+ var
+ p: halfword;
+ vv: scaled;
+ begin
+ if q = (-30000) then
+ p := curexp
+ else
+ p := q;
+ mem[p + 1].hh.rh := v;
+ mem[p].hh.b0 := t;
+ if mem[v].hh.lh = (-30000) then begin
+ vv := mem[v + 1].int;
+ if q = (-30000) then
+ flushcurexp(vv)
+ else begin
+ recyclevalue(p);
+ mem[q].hh.b0 := 16;
+ mem[q + 1].int := vv
+ end
+ end else if q = (-30000) then
+ curtype := t;
+ if fixneeded then
+ fixdependencies
+ end; {:935}
+
+ procedure addorsubtract(p, q: halfword; c: quarterword);
+ label
+ 30, 10;
+ var
+ s, t: smallnumber;
+ r: halfword;
+ v: integer;
+ begin
+ if q = (-30000) then begin
+ t := curtype;
+ if t < 17 then
+ v := curexp
+ else
+ v := mem[curexp + 1].hh.rh
+ end else begin
+ t := mem[q].hh.b0;
+ if t < 17 then
+ v := mem[q + 1].int
+ else
+ v := mem[q + 1].hh.rh
+ end;
+ if t = 16 then begin
+ if c = 70 then
+ v := -v;
+ if mem[p].hh.b0 = 16 then begin
+ v := slowadd(mem[p + 1].int, v);
+ if q = (-30000) then
+ curexp := v
+ else
+ mem[q + 1].int := v;
+ goto 10
+ end; {931:}
+ r := mem[p + 1].hh.rh;
+ while mem[r].hh.lh <> (-30000) do
+ r := mem[r].hh.rh;
+ mem[r + 1].int := slowadd(mem[r + 1].int, v);
+ if q = (-30000) then begin
+ q := getnode(2);
+ curexp := q;
+ curtype := mem[p].hh.b0;
+ mem[q].hh.b1 := 11
+ end;
+ mem[q + 1].hh.rh := mem[p + 1].hh.rh;
+ mem[q].hh.b0 := mem[p].hh.b0;
+ mem[q + 1].hh.lh := mem[p + 1].hh.lh;
+ mem[mem[p + 1].hh.lh].hh.rh := q;
+ mem[p].hh.b0 := 16
+ end else begin {:931}
+ if c = 70 then
+ negatedeplist(v); {932:}
+ if mem[p].hh.b0 = 16 then begin {933:}
+ while mem[v].hh.lh <> (-30000) do
+ v := mem[v].hh.rh;
+ mem[v + 1].int := slowadd(mem[p + 1].int, mem[v + 1].int)
+ end else begin {:933}
+ s := mem[p].hh.b0;
+ r := mem[p + 1].hh.rh;
+ if t = 17 then begin
+ if s = 17 then
+ if (maxcoef(r) + maxcoef(v)) < 626349397 then begin
+ v := pplusq(v, r, 17);
+ goto 30
+ end;
+ t := 18;
+ v := poverv(v, 65536, 17, 18)
+ end;
+ if s = 18 then
+ v := pplusq(v, r, 18)
+ else
+ v := pplusfq(v, 65536, r, 18, 17);
+ 30: {934:}
+ if q <> (-30000) then
+ depfinish(v, q, t)
+ else begin
+ curtype := t;
+ depfinish(v, -30000, t)
+ end {:934}
+ end {:932}
+ end;
+ 10:
+ null
+ end; {:930} {943:}
+
+ procedure depmult(p: halfword; v: integer; visscaled: boolean);
+ label
+ 10;
+ var
+ q: halfword;
+ s, t: smallnumber;
+ begin
+ if p = (-30000) then
+ q := curexp
+ else if mem[p].hh.b0 <> 16 then
+ q := p
+ else begin
+ if visscaled then
+ mem[p + 1].int := takescaled(mem[p + 1].int, v)
+ else
+ mem[p + 1].int := takefraction(mem[p + 1].int, v);
+ goto 10
+ end;
+ t := mem[q].hh.b0;
+ q := mem[q + 1].hh.rh;
+ s := t;
+ if t = 17 then
+ if visscaled then
+ if abvscd(maxcoef(q), abs(v), 626349396, 65536) >= 0 then
+ t := 18;
+ q := ptimesv(q, v, s, t, visscaled);
+ depfinish(q, p, t);
+ 10:
+ null
+ end; {:943} {946:}
+
+ procedure hardtimes(p: halfword);
+ var
+ q: halfword;
+ r: halfword;
+ u, v: scaled;
+ begin
+ if mem[p].hh.b0 = 14 then begin
+ q := stashcurexp;
+ unstashcurexp(p);
+ p := q
+ end;
+ r := mem[curexp + 1].int;
+ u := mem[r + 1].int;
+ v := mem[r + 3].int; {947:}
+ mem[r + 2].hh.b0 := mem[p].hh.b0;
+ newdep(r + 2, copydeplist(mem[p + 1].hh.rh));
+ mem[r].hh.b0 := mem[p].hh.b0;
+ mem[r + 1] := mem[p + 1];
+ mem[mem[p + 1].hh.lh].hh.rh := r;
+ freenode(p, 2) {:947};
+ depmult(r, u, true);
+ depmult(r + 2, v, true)
+ end; {:946} {949:}
+
+ procedure depdiv(p: halfword; v: scaled);
+ label
+ 10;
+ var
+ q: halfword;
+ s, t: smallnumber;
+ begin
+ if p = (-30000) then
+ q := curexp
+ else if mem[p].hh.b0 <> 16 then
+ q := p
+ else begin
+ mem[p + 1].int := makescaled(mem[p + 1].int, v);
+ goto 10
+ end;
+ t := mem[q].hh.b0;
+ q := mem[q + 1].hh.rh;
+ s := t;
+ if t = 17 then
+ if abvscd(maxcoef(q), 65536, 626349396, abs(v)) >= 0 then
+ t := 18;
+ q := poverv(q, v, s, t);
+ depfinish(q, p, t);
+ 10:
+ null
+ end; {:949} {953:}
+
+ procedure setuptrans(c: quarterword);
+ label
+ 30, 10;
+ var
+ p, q, r: halfword;
+ begin
+ if (c <> 88) or (curtype <> 13) then begin {955:}
+ p := stashcurexp;
+ curexp := idtransform;
+ curtype := 13;
+ q := mem[curexp + 1].int;
+ case c of {957:}
+ 84:
+ if mem[p].hh.b0 = 16 then begin {958:}
+ nsincos((mem[p + 1].int mod 23592960) * 16);
+ mem[q + 5].int := roundfraction(ncos);
+ mem[q + 9].int := roundfraction(nsin);
+ mem[q + 7].int := -mem[q + 9].int;
+ mem[q + 11].int := mem[q + 5].int;
+ goto 30
+ end {:958};
+ 85:
+ if mem[p].hh.b0 > 14 then begin
+ install(q + 6, p);
+ goto 30
+ end;
+ 86:
+ if mem[p].hh.b0 > 14 then begin
+ install(q + 4, p);
+ install(q + 10, p);
+ goto 30
+ end;
+ 87:
+ if mem[p].hh.b0 = 14 then begin
+ r := mem[p + 1].int;
+ install(q, r);
+ install(q + 2, r + 2);
+ goto 30
+ end;
+ 89:
+ if mem[p].hh.b0 > 14 then begin
+ install(q + 4, p);
+ goto 30
+ end;
+ 90:
+ if mem[p].hh.b0 > 14 then begin
+ install(q + 10, p);
+ goto 30
+ end;
+ 91:
+ if mem[p].hh.b0 = 14 then begin {959:}
+ r := mem[p + 1].int;
+ install(q + 4, r);
+ install(q + 10, r);
+ install(q + 8, r + 2);
+ if mem[r + 2].hh.b0 = 16 then
+ mem[r + 3].int := -mem[r + 3].int
+ else
+ negatedeplist(mem[r + 3].hh.rh);
+ install(q + 6, r + 2);
+ goto 30
+ end {:959};
+ 88:
+ null
+ end {:957};
+ disperr(p, 722);
+ begin
+ helpptr := 3;
+ helpline[2] := 723;
+ helpline[1] := 724;
+ helpline[0] := 405
+ end;
+ putgeterror;
+ 30:
+ recyclevalue(p);
+ freenode(p, 2)
+ end {:955}; {956:}
+ q := mem[curexp + 1].int;
+ r := q + 12;
+ repeat
+ r := r - 2;
+ if mem[r].hh.b0 <> 16 then
+ goto 10
+ until r = q;
+ txx := mem[q + 5].int;
+ txy := mem[q + 7].int;
+ tyx := mem[q + 9].int;
+ tyy := mem[q + 11].int;
+ tx := mem[q + 1].int;
+ ty := mem[q + 3].int;
+ flushcurexp(0) {:956};
+ 10:
+ null
+ end; {:953} {960:}
+
+ procedure setupknowntrans(c: quarterword);
+ begin
+ setuptrans(c);
+ if curtype <> 16 then begin
+ disperr(-30000, 725);
+ begin
+ helpptr := 3;
+ helpline[2] := 726;
+ helpline[1] := 727;
+ helpline[0] := 405
+ end;
+ putgetflusherror(0);
+ txx := 65536;
+ txy := 0;
+ tyx := 0;
+ tyy := 65536;
+ tx := 0;
+ ty := 0
+ end
+ end; {:960} {961:}
+
+ procedure trans(p, q: halfword);
+ var
+ v: scaled;
+ begin
+ v := (takescaled(mem[p].int, txx) + takescaled(mem[q].int, txy)) + tx;
+ mem[q].int := (takescaled(mem[p].int, tyx) + takescaled(mem[q].int, tyy)) + ty;
+ mem[p].int := v
+ end; {:961} {962:}
+
+ procedure pathtrans(p: halfword; c: quarterword);
+ label
+ 10;
+ var
+ q: halfword;
+ begin
+ setupknowntrans(c);
+ unstashcurexp(p);
+ if curtype = 6 then begin
+ if mem[curexp + 9].int = 0 then
+ if tx = 0 then
+ if ty = 0 then
+ goto 10;
+ flushcurexp(makepath(curexp));
+ curtype := 8
+ end;
+ q := curexp;
+ repeat
+ if mem[q].hh.b0 <> 0 then
+ trans(q + 3, q + 4);
+ trans(q + 1, q + 2);
+ if mem[q].hh.b1 <> 0 then
+ trans(q + 5, q + 6);
+ q := mem[q].hh.rh
+ until q = curexp;
+ 10:
+ null
+ end; {:962} {963:}
+
+ procedure edgestrans(p: halfword; c: quarterword);
+ label
+ 10;
+ begin
+ setupknowntrans(c);
+ unstashcurexp(p);
+ curedges := curexp;
+ if mem[curedges].hh.rh = curedges then
+ goto 10;
+ if txx = 0 then
+ if tyy = 0 then
+ if (txy mod 65536) = 0 then
+ if (tyx mod 65536) = 0 then begin
+ xyswapedges;
+ txx := txy;
+ tyy := tyx;
+ txy := 0;
+ tyx := 0;
+ if mem[curedges].hh.rh = curedges then
+ goto 10
+ end;
+ if txy = 0 then
+ if tyx = 0 then
+ if (txy mod 65536) = 0 then
+ if (tyy mod 65536) = 0 then begin {964:}
+ if (txx = 0) or (tyy = 0) then begin
+ tossedges(curedges);
+ curexp := getnode(6);
+ initedges(curexp)
+ end else begin
+ if txx < 0 then begin
+ xreflectedges;
+ txx := -txx
+ end;
+ if tyy < 0 then begin
+ yreflectedges;
+ tyy := -tyy
+ end;
+ if txx <> 65536 then
+ xscaleedges(txx div 65536);
+ if tyy <> 65536 then
+ yscaleedges(tyy div 65536); {965:}
+ tx := roundunscaled(tx);
+ ty := roundunscaled(ty);
+ if ((((((mem[curedges + 2].hh.lh + tx) <= 0) or ((mem[curedges + 2].hh.rh + tx) >= 8192)) or ((mem[curedges + 1].hh.lh + ty) <= 0)) or ((mem[curedges + 1].hh.rh + ty) >= 8191)) or (abs(tx) >= 4096)) or (abs(ty) >= 4096) then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(731)
+ end;
+ begin
+ helpptr := 3;
+ helpline[2] := 732;
+ helpline[1] := 404;
+ helpline[0] := 405
+ end;
+ putgeterror
+ end else begin
+ if tx <> 0 then begin
+ if not (abs((mem[curedges + 3].hh.lh - tx) - 4096) < 4096) then
+ fixoffset;
+ mem[curedges + 2].hh.lh := mem[curedges + 2].hh.lh + tx;
+ mem[curedges + 2].hh.rh := mem[curedges + 2].hh.rh + tx;
+ mem[curedges + 3].hh.lh := mem[curedges + 3].hh.lh - tx;
+ mem[curedges + 4].int := 0
+ end;
+ if ty <> 0 then begin
+ mem[curedges + 1].hh.lh := mem[curedges + 1].hh.lh + ty;
+ mem[curedges + 1].hh.rh := mem[curedges + 1].hh.rh + ty;
+ mem[curedges + 5].hh.lh := mem[curedges + 5].hh.lh + ty;
+ mem[curedges + 4].int := 0
+ end
+ end {:965}
+ end;
+ goto 10
+ end {:964};
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(728)
+ end;
+ begin
+ helpptr := 3;
+ helpline[2] := 729;
+ helpline[1] := 730;
+ helpline[0] := 405
+ end;
+ putgeterror;
+ 10:
+ null
+ end; {:963} {966:}
+{968:}
+
+ procedure bilin1(p: halfword; t: scaled; q: halfword; u, delta: scaled);
+ var
+ r: halfword;
+ begin
+ if t <> 65536 then
+ depmult(p, t, true);
+ if u <> 0 then
+ if mem[q].hh.b0 = 16 then
+ delta := delta + takescaled(mem[q + 1].int, u)
+ else begin {969:}
+ if mem[p].hh.b0 <> 18 then begin
+ if mem[p].hh.b0 = 16 then
+ newdep(p, constdependency(mem[p + 1].int))
+ else
+ mem[p + 1].hh.rh := ptimesv(mem[p + 1].hh.rh, 65536, 17, 18, true);
+ mem[p].hh.b0 := 18
+ end {:969};
+ mem[p + 1].hh.rh := pplusfq(mem[p + 1].hh.rh, u, mem[q + 1].hh.rh, 18, mem[q].hh.b0)
+ end;
+ if mem[p].hh.b0 = 16 then
+ mem[p + 1].int := mem[p + 1].int + delta
+ else begin
+ r := mem[p + 1].hh.rh;
+ while mem[r].hh.lh <> (-30000) do
+ r := mem[r].hh.rh;
+ delta := mem[r + 1].int + delta;
+ if r <> mem[p + 1].hh.rh then
+ mem[r + 1].int := delta
+ else begin
+ recyclevalue(p);
+ mem[p].hh.b0 := 16;
+ mem[p + 1].int := delta
+ end
+ end;
+ if fixneeded then
+ fixdependencies
+ end; {:968} {971:}
+
+ procedure addmultdep(p: halfword; v: scaled; r: halfword);
+ begin
+ if mem[r].hh.b0 = 16 then
+ mem[depfinal + 1].int := mem[depfinal + 1].int + takescaled(mem[r + 1].int, v)
+ else begin
+ mem[p + 1].hh.rh := pplusfq(mem[p + 1].hh.rh, v, mem[r + 1].hh.rh, 18, mem[r].hh.b0);
+ if fixneeded then
+ fixdependencies
+ end
+ end; {:971} {972:}
+
+ procedure bilin2(p, t: halfword; v: scaled; u, q: halfword);
+ var
+ vv: scaled;
+ begin
+ vv := mem[p + 1].int;
+ mem[p].hh.b0 := 18;
+ newdep(p, constdependency(0));
+ if vv <> 0 then
+ addmultdep(p, vv, t);
+ if v <> 0 then
+ addmultdep(p, v, u);
+ if q <> (-30000) then
+ addmultdep(p, 65536, q);
+ if mem[p + 1].hh.rh = depfinal then begin
+ vv := mem[depfinal + 1].int;
+ recyclevalue(p);
+ mem[p].hh.b0 := 16;
+ mem[p + 1].int := vv
+ end
+ end; {:972} {974:}
+
+ procedure bilin3(p: halfword; t, v, u, delta: scaled);
+ begin
+ if t <> 65536 then
+ delta := delta + takescaled(mem[p + 1].int, t)
+ else
+ delta := delta + mem[p + 1].int;
+ if u <> 0 then
+ mem[p + 1].int := delta + takescaled(v, u)
+ else
+ mem[p + 1].int := delta
+ end; {:974}
+
+ procedure bigtrans(p: halfword; c: quarterword);
+ label
+ 10;
+ var
+ q, r, pp, qq: halfword;
+ s: smallnumber;
+ begin
+ s := bignodesize[mem[p].hh.b0];
+ q := mem[p + 1].int;
+ r := q + s;
+ repeat
+ r := r - 2;
+ if mem[r].hh.b0 <> 16 then begin {967:}
+ setupknowntrans(c);
+ makeexpcopy(p);
+ r := mem[curexp + 1].int;
+ if curtype = 13 then begin
+ bilin1(r + 10, tyy, q + 6, tyx, 0);
+ bilin1(r + 8, tyy, q + 4, tyx, 0);
+ bilin1(r + 6, txx, q + 10, txy, 0);
+ bilin1(r + 4, txx, q + 8, txy, 0)
+ end;
+ bilin1(r + 2, tyy, q, tyx, ty);
+ bilin1(r, txx, q + 2, txy, tx);
+ goto 10
+ end {:967}
+ until r = q; {970:}
+ setuptrans(c);
+ if curtype = 16 then begin {973:}
+ makeexpcopy(p);
+ r := mem[curexp + 1].int;
+ if curtype = 13 then begin
+ bilin3(r + 10, tyy, mem[q + 7].int, tyx, 0);
+ bilin3(r + 8, tyy, mem[q + 5].int, tyx, 0);
+ bilin3(r + 6, txx, mem[q + 11].int, txy, 0);
+ bilin3(r + 4, txx, mem[q + 9].int, txy, 0)
+ end;
+ bilin3(r + 2, tyy, mem[q + 1].int, tyx, ty);
+ bilin3(r, txx, mem[q + 3].int, txy, tx)
+ end else begin {:973}
+ pp := stashcurexp;
+ qq := mem[pp + 1].int;
+ makeexpcopy(p);
+ r := mem[curexp + 1].int;
+ if curtype = 13 then begin
+ bilin2(r + 10, qq + 10, mem[q + 7].int, qq + 8, -30000);
+ bilin2(r + 8, qq + 10, mem[q + 5].int, qq + 8, -30000);
+ bilin2(r + 6, qq + 4, mem[q + 11].int, qq + 6, -30000);
+ bilin2(r + 4, qq + 4, mem[q + 9].int, qq + 6, -30000)
+ end;
+ bilin2(r + 2, qq + 10, mem[q + 1].int, qq + 8, qq + 2);
+ bilin2(r, qq + 4, mem[q + 3].int, qq + 6, qq);
+ recyclevalue(pp);
+ freenode(pp, 2)
+ end;
+{:970}
+ 10:
+ null
+ end; {:966} {976:}
+
+ procedure cat(p: halfword);
+ var
+ a, b: strnumber;
+ k: poolpointer;
+ begin
+ a := mem[p + 1].int;
+ b := curexp;
+ begin
+ if ((poolptr + (strstart[a + 1] - strstart[a])) + (strstart[b + 1] - strstart[b])) > maxpoolptr then begin
+ if ((poolptr + (strstart[a + 1] - strstart[a])) + (strstart[b + 1] - strstart[b])) > poolsize then
+ overflow(129, poolsize - initpoolptr);
+ maxpoolptr := (poolptr + (strstart[a + 1] - strstart[a])) + (strstart[b + 1] - strstart[b])
+ end
+ end;
+ for k := strstart[a] to strstart[a + 1] - 1 do begin
+ strpool[poolptr] := strpool[k];
+ poolptr := poolptr + 1
+ end;
+ for k := strstart[b] to strstart[b + 1] - 1 do begin
+ strpool[poolptr] := strpool[k];
+ poolptr := poolptr + 1
+ end;
+ curexp := makestring;
+ begin
+ if strref[b] < 127 then
+ if strref[b] > 1 then
+ strref[b] := strref[b] - 1
+ else
+ flushstring(b)
+ end
+ end; {:976} {977:}
+
+ procedure chopstring(p: halfword);
+ var
+ a, b: integer;
+ l: integer;
+ k: integer;
+ s: strnumber;
+ reversed: boolean;
+ begin
+ a := roundunscaled(mem[p + 1].int);
+ b := roundunscaled(mem[p + 3].int);
+ if a <= b then
+ reversed := false
+ else begin
+ reversed := true;
+ k := a;
+ a := b;
+ b := k
+ end;
+ s := curexp;
+ l := strstart[s + 1] - strstart[s];
+ if a < 0 then begin
+ a := 0;
+ if b < 0 then
+ b := 0
+ end;
+ if b > l then begin
+ b := l;
+ if a > l then
+ a := l
+ end;
+ begin
+ if ((poolptr + b) - a) > maxpoolptr then begin
+ if ((poolptr + b) - a) > poolsize then
+ overflow(129, poolsize - initpoolptr);
+ maxpoolptr := (poolptr + b) - a
+ end
+ end;
+ if reversed then
+ for k := (strstart[s] + b) - 1 downto strstart[s] + a do begin
+ strpool[poolptr] := strpool[k];
+ poolptr := poolptr + 1
+ end
+ else
+ for k := strstart[s] + a to (strstart[s] + b) - 1 do begin
+ strpool[poolptr] := strpool[k];
+ poolptr := poolptr + 1
+ end;
+ curexp := makestring;
+ begin
+ if strref[s] < 127 then
+ if strref[s] > 1 then
+ strref[s] := strref[s] - 1
+ else
+ flushstring(s)
+ end
+ end; {:977} {978:}
+
+ procedure choppath(p: halfword);
+ var
+ q: halfword;
+ pp, qq, rr, ss: halfword;
+ a, b, k, l: scaled;
+ reversed: boolean;
+ begin
+ l := pathlength;
+ a := mem[p + 1].int;
+ b := mem[p + 3].int;
+ if a <= b then
+ reversed := false
+ else begin
+ reversed := true;
+ k := a;
+ a := b;
+ b := k
+ end; {979:}
+ if a < 0 then
+ if mem[curexp].hh.b0 = 0 then begin
+ a := 0;
+ if b < 0 then
+ b := 0
+ end else
+ repeat
+ a := a + l;
+ b := b + l
+ until a >= 0;
+ if b > l then
+ if mem[curexp].hh.b0 = 0 then begin
+ b := l;
+ if a > l then
+ a := l
+ end else
+ while a >= l do begin
+ a := a - l;
+ b := b - l
+ end {:979};
+ q := curexp;
+ while a >= 65536 do begin
+ q := mem[q].hh.rh;
+ a := a - 65536;
+ b := b - 65536
+ end;
+ if b = a then begin {981:}
+ if a > 0 then begin
+ qq := mem[q].hh.rh;
+ splitcubic(q, a * 4096, mem[qq + 1].int, mem[qq + 2].int);
+ q := mem[q].hh.rh
+ end;
+ pp := copyknot(q);
+ qq := pp
+ end else begin {:981} {980:}
+ pp := copyknot(q);
+ qq := pp;
+ repeat
+ q := mem[q].hh.rh;
+ rr := qq;
+ qq := copyknot(q);
+ mem[rr].hh.rh := qq;
+ b := b - 65536
+ until b <= 0;
+ if a > 0 then begin
+ ss := pp;
+ pp := mem[pp].hh.rh;
+ splitcubic(ss, a * 4096, mem[pp + 1].int, mem[pp + 2].int);
+ pp := mem[ss].hh.rh;
+ freenode(ss, 7);
+ if rr = ss then begin
+ b := makescaled(b, 65536 - a);
+ rr := pp
+ end
+ end;
+ if b < 0 then begin
+ splitcubic(rr, (b + 65536) * 4096, mem[qq + 1].int, mem[qq + 2].int);
+ freenode(qq, 7);
+ qq := mem[rr].hh.rh
+ end
+ end {:980};
+ mem[pp].hh.b0 := 0;
+ mem[qq].hh.b1 := 0;
+ mem[qq].hh.rh := pp;
+ tossknotlist(curexp);
+ if reversed then begin
+ curexp := mem[htapypoc(pp)].hh.rh;
+ tossknotlist(pp)
+ end else
+ curexp := pp
+ end; {:978} {982:}
+
+ procedure pairvalue(x, y: scaled);
+ var
+ p: halfword;
+ begin
+ p := getnode(2);
+ flushcurexp(p);
+ curtype := 14;
+ mem[p].hh.b0 := 14;
+ mem[p].hh.b1 := 11;
+ initbignode(p);
+ p := mem[p + 1].int;
+ mem[p].hh.b0 := 16;
+ mem[p + 1].int := x;
+ mem[p + 2].hh.b0 := 16;
+ mem[p + 3].int := y
+ end; { pairvalue }
+{:982}
+ {984:}
+
+ procedure setupoffset(p: halfword);
+ begin
+ findoffset(mem[p + 1].int, mem[p + 3].int, curexp);
+ pairvalue(curx, cury)
+ end;
+
+ procedure setupdirectiontime(p: halfword);
+ begin
+ flushcurexp(finddirectiontime(mem[p + 1].int, mem[p + 3].int, curexp))
+ end; {:984} {985:}
+
+ procedure findpoint(v: scaled; c: quarterword);
+ var
+ p: halfword;
+ n: scaled;
+ vv: scaled;
+ q: halfword;
+ begin
+ vv := v;
+ p := curexp;
+ if mem[p].hh.b0 = 0 then
+ n := -65536
+ else
+ n := 0;
+ repeat
+ p := mem[p].hh.rh;
+ n := n + 65536
+ until p = curexp;
+ if n = 0 then
+ v := 0
+ else if v < 0 then
+ if mem[p].hh.b0 = 0 then
+ v := 0
+ else
+ v := (n - 1) - (((-v) - 1) mod n)
+ else if v > n then
+ if mem[p].hh.b0 = 0 then
+ v := n
+ else
+ v := v mod n;
+ p := curexp;
+ while v >= 65536 do begin
+ p := mem[p].hh.rh;
+ v := v - 65536
+ end;
+ if v <> 0 then begin {986:}
+ q := mem[p].hh.rh;
+ splitcubic(p, v * 4096, mem[q + 1].int, mem[q + 2].int);
+ p := mem[p].hh.rh
+ end {:986}; {987:}
+ case c of
+ 97:
+ pairvalue(mem[p + 1].int, mem[p + 2].int);
+ 98:
+ if mem[p].hh.b0 = 0 then
+ pairvalue(mem[p + 1].int, mem[p + 2].int)
+ else
+ pairvalue(mem[p + 3].int, mem[p + 4].int);
+ 99:
+ if mem[p].hh.b1 = 0 then
+ pairvalue(mem[p + 1].int, mem[p + 2].int)
+ else
+ pairvalue(mem[p + 5].int, mem[p + 6].int)
+ end {:987}
+ end; {:985}
+
+ procedure dobinary(p: halfword; c: quarterword);
+ label
+ 30, 31, 10;
+ var
+ q, r, rr: halfword;
+ oldp, oldexp: halfword;
+ v: integer;
+ begin
+ begin
+ if aritherror then
+ cleararith
+ end;
+ if internal[7] > 131072 then begin {924:}
+ begindiagnostic;
+ printnl(714);
+ printexp(p, 0);
+ printchar(41);
+ printop(c);
+ printchar(40);
+ printexp(-30000, 0);
+ print(706);
+ enddiagnostic(false)
+ end {:924}; {926:}
+ if mem[p].hh.b0 in
+ [13, 14, 19] then
+ case mem[p].hh.b0 of
+ 13, 14:
+ oldp := tarnished(p);
+ 19:
+ oldp := -29999
+ end
+ else
+ oldp := -30000;
+ if oldp <> (-30000) then begin
+ q := stashcurexp;
+ oldp := p;
+ makeexpcopy(oldp);
+ p := stashcurexp;
+ unstashcurexp(q)
+ end; {:926}
+{927:}
+ if curtype in
+ [13, 14, 19] then
+ case curtype of
+ 13, 14:
+ oldexp := tarnished(curexp);
+ 19:
+ oldexp := -29999
+ end
+ else
+ oldexp := -30000;
+ if oldexp <> (-30000) then begin
+ oldexp := curexp;
+ makeexpcopy(oldexp)
+ end {:927};
+ case c of
+ 69, 70: {929:}
+ if (curtype < 14) or (mem[p].hh.b0 < 14) then
+ if (curtype = 11) and (mem[p].hh.b0 = 11) then begin
+ if c = 70 then
+ negateedges(curexp);
+ curedges := curexp;
+ mergeedges(mem[p + 1].int)
+ end else
+ badbinary(p, c)
+ else if curtype = 14 then
+ if mem[p].hh.b0 <> 14 then
+ badbinary(p, c)
+ else begin
+ q := mem[p + 1].int;
+ r := mem[curexp + 1].int;
+ addorsubtract(q, r, c);
+ addorsubtract(q + 2, r + 2, c)
+ end
+ else if mem[p].hh.b0 = 14 then
+ badbinary(p, c)
+ else
+ addorsubtract(p, -30000, c) {:929}; {936:}
+ 77, 78, 79, 80, 81, 82:
+ begin
+ if (curtype > 14) and (mem[p].hh.b0 > 14) then
+ addorsubtract(p, -30000, 70)
+ else if curtype <> mem[p].hh.b0 then begin
+ badbinary(p, c);
+ goto 30
+ end else if curtype = 4 then
+ flushcurexp(strvsstr(mem[p + 1].int, curexp))
+ else if (curtype = 5) or (curtype = 3) then begin {938:}
+ q := mem[curexp + 1].int;
+ while (q <> curexp) and (q <> p) do
+ q := mem[q + 1].int;
+ if q = p then
+ flushcurexp(0)
+ end else if (curtype = 14) or (curtype = 13) then begin {:938} {939:}
+ q := mem[p + 1].int;
+ r := mem[curexp + 1].int;
+ rr := (r + bignodesize[curtype]) - 2;
+ while true do begin
+ addorsubtract(q, r, 70);
+ if mem[r].hh.b0 <> 16 then
+ goto 31;
+ if mem[r + 1].int <> 0 then
+ goto 31;
+ if r = rr then
+ goto 31;
+ q := q + 2;
+ r := r + 2
+ end;
+ 31:
+ takepart(53 + ((r - mem[curexp + 1].int) div 2))
+ end else if curtype = 2 then {:939}
+ flushcurexp(curexp - mem[p + 1].int)
+ else begin
+ badbinary(p, c);
+ goto 30
+ end; {937:}
+ if curtype <> 16 then begin
+ if curtype < 16 then begin
+ disperr(p, 155);
+ begin
+ helpptr := 1;
+ helpline[0] := 715
+ end
+ end else begin
+ helpptr := 2;
+ helpline[1] := 716;
+ helpline[0] := 717
+ end;
+ disperr(-30000, 718);
+ putgetflusherror(31)
+ end else
+ case c of
+ 77:
+ if curexp < 0 then
+ curexp := 30
+ else
+ curexp := 31;
+ 78:
+ if curexp <= 0 then
+ curexp := 30
+ else
+ curexp := 31;
+ 79:
+ if curexp > 0 then
+ curexp := 30
+ else
+ curexp := 31;
+ 80:
+ if curexp >= 0 then
+ curexp := 30
+ else
+ curexp := 31;
+ 81:
+ if curexp = 0 then
+ curexp := 30
+ else
+ curexp := 31;
+ 82:
+ if curexp <> 0 then
+ curexp := 30
+ else
+ curexp := 31
+ end;
+ curtype := 2 {:937};
+ 30:
+ null
+ end; {:936} {940:}
+ 76, 75:
+ if (mem[p].hh.b0 <> 2) or (curtype <> 2) then
+ badbinary(p, c)
+ else if mem[p + 1].int = (c - 45) then
+ curexp := mem[p + 1].int; {:940} {941:}
+ 71:
+ if (curtype < 14) or (mem[p].hh.b0 < 14) then
+ badbinary(p, 71)
+ else if (curtype = 16) or (mem[p].hh.b0 = 16) then begin {942:}
+ if mem[p].hh.b0 = 16 then begin
+ v := mem[p + 1].int;
+ freenode(p, 2)
+ end else begin
+ v := curexp;
+ unstashcurexp(p)
+ end;
+ if curtype = 16 then
+ curexp := takescaled(curexp, v)
+ else if curtype = 14 then begin
+ p := mem[curexp + 1].int;
+ depmult(p, v, true);
+ depmult(p + 2, v, true)
+ end else
+ depmult(-30000, v, true);
+ goto 10
+ end else if (nicepair(p, mem[p].hh.b0) and (curtype > 14)) or (nicepair(curexp, curtype) and (mem[p].hh.b0 > 14)) then begin {:942}
+ hardtimes(p);
+ goto 10
+ end else
+ badbinary(p, 71); {:941} {948:}
+ 72:
+ if (curtype <> 16) or (mem[p].hh.b0 < 14) then
+ badbinary(p, 72)
+ else begin
+ v := curexp;
+ unstashcurexp(p);
+ if v = 0 then begin {950:}
+ disperr(-30000, 648);
+ begin
+ helpptr := 2;
+ helpline[1] := 720;
+ helpline[0] := 721
+ end;
+ putgeterror
+ end else begin {:950}
+ if curtype = 16 then
+ curexp := makescaled(curexp, v)
+ else if curtype = 14 then begin
+ p := mem[curexp + 1].int;
+ depdiv(p, v);
+ depdiv(p + 2, v)
+ end else
+ depdiv(-30000, v)
+ end;
+ goto 10
+ end; {:948} {951:}
+ 73, 74:
+ if (curtype = 16) and (mem[p].hh.b0 = 16) then
+ if c = 73 then
+ curexp := pythadd(mem[p + 1].int, curexp)
+ else
+ curexp := pythsub(mem[p + 1].int, curexp)
+ else
+ badbinary(p, c); {:951} {952:}
+ 84, 85, 86, 87, 88, 89, 90,
+ 91:
+ if ((mem[p].hh.b0 = 9) or (mem[p].hh.b0 = 8)) or (mem[p].hh.b0 = 6) then begin
+ pathtrans(p, c);
+ goto 10
+ end else if (mem[p].hh.b0 = 14) or (mem[p].hh.b0 = 13) then
+ bigtrans(p, c)
+ else if mem[p].hh.b0 = 11 then begin
+ edgestrans(p, c);
+ goto 10
+ end else
+ badbinary(p, c); {:952} {975:}
+ 83:
+ if (curtype = 4) and (mem[p].hh.b0 = 4) then
+ cat(p)
+ else
+ badbinary(p, 83);
+ 94:
+ if nicepair(p, mem[p].hh.b0) and (curtype = 4) then
+ chopstring(mem[p + 1].int)
+ else
+ badbinary(p, 94);
+ 95:
+ begin
+ if curtype = 14 then
+ pairtopath;
+ if nicepair(p, mem[p].hh.b0) and (curtype = 9) then
+ choppath(mem[p + 1].int)
+ else
+ badbinary(p, 95)
+ end; {:975} {983:}
+ 97, 98, 99:
+ begin
+ if curtype = 14 then
+ pairtopath;
+ if (curtype = 9) and (mem[p].hh.b0 = 16) then
+ findpoint(mem[p + 1].int, c)
+ else
+ badbinary(p, c)
+ end;
+ 100:
+ begin
+ if curtype = 8 then
+ materializepen;
+ if (curtype = 6) and nicepair(p, mem[p].hh.b0) then
+ setupoffset(mem[p + 1].int)
+ else
+ badbinary(p, 100)
+ end;
+ 96:
+ begin
+ if curtype = 14 then
+ pairtopath;
+ if (curtype = 9) and nicepair(p, mem[p].hh.b0) then
+ setupdirectiontime(mem[p + 1].int)
+ else
+ badbinary(p, 96)
+ end; {:983} {988:}
+ 92:
+ begin
+ if mem[p].hh.b0 = 14 then begin
+ q := stashcurexp;
+ unstashcurexp(p);
+ pairtopath;
+ p := stashcurexp;
+ unstashcurexp(q)
+ end;
+ if curtype = 14 then
+ pairtopath;
+ if (curtype = 9) and (mem[p].hh.b0 = 9) then begin
+ pathintersection(mem[p + 1].int, curexp);
+ pairvalue(curt, curtt)
+ end else
+ badbinary(p, 92)
+ end
+ end {:988};
+ recyclevalue(p);
+ freenode(p, 2);
+ 10:
+ begin
+ if aritherror then
+ cleararith
+ end; {925:}
+ if oldp <> (-30000) then begin
+ recyclevalue(oldp);
+ freenode(oldp, 2)
+ end;
+ if oldexp <> (-30000) then begin
+ recyclevalue(oldexp);
+ freenode(oldexp, 2)
+ end {:925}
+ end; {:922} {944:}
+
+ procedure fracmult(n, d: scaled);
+ var
+ p: halfword;
+ oldexp: halfword;
+ v: fraction;
+ begin
+ if internal[7] > 131072 then begin {945:}
+ begindiagnostic;
+ printnl(714);
+ printscaled(n);
+ printchar(47);
+ printscaled(d);
+ print(719);
+ printexp(-30000, 0);
+ print(706);
+ enddiagnostic(false)
+ end {:945};
+ if curtype in
+ [13, 14, 19] then
+ case curtype of
+ 13, 14:
+ oldexp := tarnished(curexp);
+ 19:
+ oldexp := -29999
+ end
+ else
+ oldexp := -30000;
+ if oldexp <> (-30000) then begin
+ oldexp := curexp;
+ makeexpcopy(oldexp)
+ end;
+ v := makefraction(n, d);
+ if curtype = 16 then
+ curexp := takefraction(curexp, v)
+ else if curtype = 14 then begin
+ p := mem[curexp + 1].int;
+ depmult(p, v, false);
+ depmult(p + 2, v, false)
+ end else
+ depmult(-30000, v, false);
+ if oldexp <> (-30000) then begin
+ recyclevalue(oldexp);
+ freenode(oldexp, 2)
+ end
+ end; {:944} {989:} {1155:}
+
+ procedure gfswap;
+ begin
+ if gflimit = gfbufsize then begin
+ bwritebuf(gffile, gfbuf, 0, halfbuf - 1);
+ gflimit := halfbuf;
+ gfoffset := gfoffset + gfbufsize;
+ gfptr := 0
+ end else begin
+ bwritebuf(gffile, gfbuf, halfbuf, gfbufsize - 1);
+ gflimit := gfbufsize
+ end
+ end; {:1155} {1157:}
+
+ procedure gffour(x: integer);
+ begin
+ if x >= 0 then begin
+ gfbuf[gfptr] := x div 16777216;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end else begin
+ x := x + 1073741824;
+ x := x + 1073741824;
+ begin
+ gfbuf[gfptr] := (x div 16777216) + 128;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end
+ end;
+ x := x mod 16777216;
+ begin
+ gfbuf[gfptr] := x div 65536;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ x := x mod 65536;
+ begin
+ gfbuf[gfptr] := x div 256;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := x mod 256;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end
+ end; {:1157} {1158:}
+
+ procedure gftwo(x: integer);
+ begin
+ begin
+ gfbuf[gfptr] := x div 256;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := x mod 256;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end
+ end;
+
+ procedure gfthree(x: integer);
+ begin
+ begin
+ gfbuf[gfptr] := x div 65536;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := (x mod 65536) div 256;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := x mod 256;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end
+ end; {:1158} {1159:}
+
+ procedure gfpaint(d: integer);
+ begin
+ if d < 64 then begin
+ gfbuf[gfptr] := 0 + d;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end else if d < 256 then begin
+ begin
+ gfbuf[gfptr] := 64;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := d;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end
+ end else begin
+ begin
+ gfbuf[gfptr] := 65;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ gftwo(d)
+ end
+ end; {:1159}
+{1160:}
+
+ procedure gfstring(s, t: strnumber);
+ var
+ k: poolpointer;
+ l: integer;
+ begin
+ if s <> 0 then begin
+ l := strstart[s + 1] - strstart[s];
+ if t <> 0 then
+ l := l + (strstart[t + 1] - strstart[t]);
+ if l <= 255 then begin
+ begin
+ gfbuf[gfptr] := 239;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := l;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end
+ end else begin
+ begin
+ gfbuf[gfptr] := 241;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ gfthree(l)
+ end;
+ for k := strstart[s] to strstart[s + 1] - 1 do begin
+ gfbuf[gfptr] := strpool[k];
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end
+ end;
+ if t <> 0 then
+ for k := strstart[t] to strstart[t + 1] - 1 do begin
+ gfbuf[gfptr] := strpool[k];
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end
+ end; {:1160}
+{1161:}
+
+ procedure gfboc(minm, maxm, minn, maxn: integer);
+ label
+ 10;
+ begin
+ if minm < gfminm then
+ gfminm := minm;
+ if maxn > gfmaxn then
+ gfmaxn := maxn;
+ if bocp = (-1) then
+ if bocc >= 0 then
+ if bocc < 256 then
+ if (maxm - minm) >= 0 then
+ if (maxm - minm) < 256 then
+ if maxm >= 0 then
+ if maxm < 256 then
+ if (maxn - minn) >= 0 then
+ if (maxn - minn) < 256 then
+ if maxn >= 0 then
+ if maxn < 256 then begin
+ begin
+ gfbuf[gfptr] := 68;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := bocc;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := maxm - minm;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := maxm;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := maxn - minn;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := maxn;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ goto 10
+ end;
+ begin
+ gfbuf[gfptr] := 67;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ gffour(bocc);
+ gffour(bocp);
+ gffour(minm);
+ gffour(maxm);
+ gffour(minn);
+ gffour(maxn);
+ 10:
+ null
+ end; {:1161} {1163:}
+
+ procedure initgf;
+ var
+ k: eightbits;
+ t: integer;
+ begin
+ gfminm := 4096;
+ gfmaxm := -4096;
+ gfminn := 4096;
+ gfmaxn := -4096;
+ for k := 0 to 255 do
+ charptr[k] := -1; {1164:}
+ if internal[27] <= 0 then
+ gfext := 908
+ else begin
+ oldsetting := selector;
+ selector := 5;
+ printchar(46);
+ printint(makescaled(internal[27], 59429463));
+ print(909);
+ gfext := makestring;
+ selector := oldsetting
+ end {:1164};
+ begin
+ if jobname = 0 then
+ openlogfile;
+ packjobname(gfext);
+ while not bopenout(gffile, nameoffile) do
+ promptfilename(620, gfext);
+ outputfilename := bmakenamestring(gffile)
+ end;
+ begin
+ gfbuf[gfptr] := 247;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := 131;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ oldsetting := selector;
+ selector := 5;
+ print(907);
+ printint(roundunscaled(internal[14]));
+ printchar(46);
+ printdd(roundunscaled(internal[15]));
+ printchar(46);
+ printdd(roundunscaled(internal[16]));
+ printchar(58);
+ t := roundunscaled(internal[17]);
+ printdd(t div 60);
+ printdd(t mod 60);
+ selector := oldsetting;
+ begin
+ gfbuf[gfptr] := poolptr - strstart[strptr];
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ strstart[strptr + 1] := poolptr;
+ gfstring(0, strptr);
+ poolptr := strstart[strptr];
+ gfprevptr := gfoffset + gfptr
+ end; {:1163} {1165:}
+
+ procedure shipout(c: eightbits);
+ label
+ 30;
+ var
+ f: integer;
+ prevm, m, mm: integer;
+ prevn, n: integer;
+ p, q: halfword;
+ prevw, w, ww: integer;
+ d: integer;
+ delta: integer;
+ curminm: integer;
+ xoff, yoff: integer;
+ begin
+ if outputfilename = 0 then
+ initgf;
+ f := roundunscaled(internal[19]);
+ xoff := roundunscaled(internal[29]);
+ yoff := roundunscaled(internal[30]);
+ if termoffset > (maxprintline - 9) then
+ println
+ else if (termoffset > 0) or (fileoffset > 0) then
+ printchar(32);
+ printchar(91);
+ printint(c);
+ if f <> 0 then begin
+ printchar(46);
+ printint(f)
+ end;
+ flush(output);
+ bocc := (256 * f) + c;
+ bocp := charptr[c];
+ charptr[c] := gfprevptr;
+ if internal[34] > 0 then begin {1166:}
+ if xoff <> 0 then begin
+ gfstring(308, 0);
+ begin
+ gfbuf[gfptr] := 243;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ gffour(xoff * 65536)
+ end;
+ if yoff <> 0 then begin
+ gfstring(309, 0);
+ begin
+ gfbuf[gfptr] := 243;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ gffour(yoff * 65536)
+ end
+ end {:1166}; {1167:}
+ prevn := 4096;
+ p := mem[curedges].hh.lh;
+ n := mem[curedges + 1].hh.rh - 4096;
+ while p <> curedges do begin {1169:}
+ if mem[p + 1].hh.lh > (-29999) then
+ sortedges(p);
+ q := mem[p + 1].hh.rh;
+ w := 0;
+ prevm := -268435456;
+ ww := 0;
+ prevw := 0;
+ m := prevm;
+ repeat
+ if q = 30000 then
+ mm := 268435456
+ else begin
+ d := mem[q].hh.lh + 32768;
+ mm := d div 8;
+ ww := (ww + (d mod 8)) - 4
+ end;
+ if mm <> m then begin
+ if prevw <= 0 then begin
+ if w > 0 then begin {1170:}
+ if prevm = (-268435456) then begin {1172:}
+ if prevn = 4096 then begin
+ gfboc((mem[curedges + 2].hh.lh + xoff) - 4096, (mem[curedges + 2].hh.rh + xoff) - 4096, (mem[curedges + 1].hh.lh + yoff) - 4096, n + yoff);
+ curminm := (mem[curedges + 2].hh.lh - 4096) + mem[curedges + 3].hh.lh
+ end else if prevn > (n + 1) then begin {1174:}
+ delta := (prevn - n) - 1;
+ if delta < 256 then
+ if delta = 0 then begin
+ gfbuf[gfptr] := 70;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end else begin
+ begin
+ gfbuf[gfptr] := 71;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := delta;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end
+ end
+ else begin
+ begin
+ gfbuf[gfptr] := 72;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ gftwo(delta)
+ end
+ end else begin {:1174} {1173:}
+ delta := m - curminm;
+ if delta > 164 then begin
+ gfbuf[gfptr] := 70;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end else begin
+ begin
+ gfbuf[gfptr] := 74 + delta;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ goto 30
+ end
+ end {:1173};
+ gfpaint(m - curminm);
+ 30:
+ prevn := n
+ end else {:1172}
+ gfpaint(m - prevm);
+ prevm := m;
+ prevw := w
+ end {:1170}
+ end else if w <= 0 then begin {1171:}
+ gfpaint(m - prevm);
+ prevm := m;
+ prevw := w
+ end {:1171};
+ m := mm
+ end;
+ w := ww;
+ q := mem[q].hh.rh
+ until mm = 268435456;
+ if w <> 0 then
+ printnl(911);
+ if ((prevm - mem[curedges + 3].hh.lh) + xoff) > gfmaxm then
+ gfmaxm := (prevm - mem[curedges + 3].hh.lh) + xoff {:1169};
+ p := mem[p].hh.lh;
+ n := n - 1
+ end;
+ if prevn = 4096 then begin {1168:}
+ gfboc(0, 0, 0, 0);
+ if gfmaxm < 0 then
+ gfmaxm := 0;
+ if gfminn > 0 then
+ gfminn := 0
+ end else if (prevn + yoff) < gfminn then {:1168}
+ gfminn := prevn + yoff {:1167};
+ begin
+ gfbuf[gfptr] := 69;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ gfprevptr := gfoffset + gfptr;
+ totalchars := totalchars + 1;
+ printchar(93);
+ flush(output);
+ if internal[11] > 0 then
+ printedges(910, true, xoff, yoff)
+ end; { shipout }
+{:1165}
+ {995:}
+ {1006:}
+
+ procedure tryeq(l, r: halfword);
+ label
+ 30, 31;
+ var
+ p: halfword;
+ t: 16..19;
+ q: halfword;
+ pp: halfword;
+ tt: 17..19;
+ copied: boolean; {1007:}
+ begin
+ t := mem[l].hh.b0;
+ if t = 16 then begin
+ t := 17;
+ p := constdependency(-mem[l + 1].int);
+ q := p
+ end else if t = 19 then begin
+ t := 17;
+ p := singledependency(l);
+ mem[p + 1].int := -mem[p + 1].int;
+ q := depfinal
+ end else begin
+ p := mem[l + 1].hh.rh;
+ q := p;
+ while true do begin
+ mem[q + 1].int := -mem[q + 1].int;
+ if mem[q].hh.lh = (-30000) then
+ goto 30;
+ q := mem[q].hh.rh
+ end;
+ 30:
+ mem[mem[l + 1].hh.lh].hh.rh := mem[q].hh.rh;
+ mem[mem[q].hh.rh + 1].hh.lh := mem[l + 1].hh.lh;
+ mem[l].hh.b0 := 16
+ end {:1007};
+{1009:}
+ if r = (-30000) then
+ if curtype = 16 then begin
+ mem[q + 1].int := mem[q + 1].int + curexp;
+ goto 31
+ end else begin
+ tt := curtype;
+ if tt = 19 then
+ pp := singledependency(curexp)
+ else
+ pp := mem[curexp + 1].hh.rh
+ end
+ else if mem[r].hh.b0 = 16 then begin
+ mem[q + 1].int := mem[q + 1].int + mem[r + 1].int;
+ goto 31
+ end else begin
+ tt := mem[r].hh.b0;
+ if tt = 19 then
+ pp := singledependency(r)
+ else
+ pp := mem[r + 1].hh.rh
+ end;
+ if tt <> 19 then
+ copied := false
+ else begin
+ copied := true;
+ tt := 17
+ end; {1010:}
+ watchcoefs := false;
+ if t = tt then
+ p := pplusq(p, pp, t)
+ else if t = 18 then
+ p := pplusfq(p, 65536, pp, 18, 17)
+ else begin
+ q := p;
+ while mem[q].hh.lh <> (-30000) do begin
+ mem[q + 1].int := roundfraction(mem[q + 1].int);
+ q := mem[q].hh.rh
+ end;
+ t := 18;
+ p := pplusq(p, pp, t)
+ end;
+ watchcoefs := true;
+{:1010}
+ if copied then
+ flushnodelist(pp);
+ 31: {:1009}
+ null;
+ if mem[p].hh.lh = (-30000) then begin {1008:}
+ if abs(mem[p + 1].int) > 64 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(761)
+ end;
+ print(763);
+ printscaled(mem[p + 1].int);
+ printchar(41);
+ begin
+ helpptr := 2;
+ helpline[1] := 762;
+ helpline[0] := 760
+ end;
+ putgeterror
+ end else if r = (-30000) then begin {623:}
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(465)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 466;
+ helpline[0] := 467
+ end;
+ putgeterror
+ end {:623};
+ freenode(p, 2)
+ end else begin {:1008}
+ lineareq(p, t);
+ if r = (-30000) then
+ if curtype <> 16 then
+ if mem[curexp].hh.b0 = 16 then begin
+ pp := curexp;
+ curexp := mem[curexp + 1].int;
+ curtype := 16;
+ freenode(pp, 2)
+ end
+ end
+ end; {:1006} {1001:}
+
+ procedure makeeq(lhs: halfword);
+ label
+ 20, 30, 45;
+ var
+ t: smallnumber;
+ v: integer;
+ p, q: halfword;
+ begin
+ 20:
+ t := mem[lhs].hh.b0;
+ if t <= 14 then
+ v := mem[lhs + 1].int;
+ case t of {1003:}
+ 2, 4, 6, 9, 11:
+ if curtype = (t + 1) then begin
+ nonlineareq(v, curexp, false);
+ goto 30
+ end else if curtype = t then begin {1004:}
+ if curtype <= 4 then begin
+ if curtype = 4 then begin
+ if strvsstr(v, curexp) <> 0 then
+ goto 45
+ end else if v <> curexp then
+ goto 45; {623:}
+ begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(465)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 466;
+ helpline[0] := 467
+ end;
+ putgeterror
+ end {:623};
+ goto 30
+ end;
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(758)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 759;
+ helpline[0] := 760
+ end;
+ putgeterror;
+ goto 30;
+ 45:
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(761)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 762;
+ helpline[0] := 760
+ end;
+ putgeterror;
+ goto 30
+ end {:1004};
+ 3, 5, 7, 12, 10:
+ if curtype = (t - 1) then begin
+ nonlineareq(curexp, lhs, true);
+ goto 30
+ end else if curtype = t then begin
+ ringmerge(lhs, curexp);
+ goto 30
+ end else if curtype = 14 then
+ if t = 10 then begin
+ pairtopath;
+ goto 20
+ end;
+ 13, 14:
+ if curtype = t then begin {1005:}
+ p := v + bignodesize[t];
+ q := mem[curexp + 1].int + bignodesize[t];
+ repeat
+ p := p - 2;
+ q := q - 2;
+ tryeq(p, q)
+ until p = v;
+ goto 30
+ end {:1005};
+ 16, 17, 18, 19:
+ if curtype >= 16 then begin
+ tryeq(lhs, -30000);
+ goto 30
+ end;
+ 1:
+ null
+ end
+{:1003}; {1002:}
+ disperr(lhs, 155);
+ disperr(-30000, 755);
+ if mem[lhs].hh.b0 <= 14 then
+ printtype(mem[lhs].hh.b0)
+ else
+ print(211);
+ printchar(61);
+ if curtype <= 14 then
+ printtype(curtype)
+ else
+ print(211);
+ printchar(41);
+ begin
+ helpptr := 2;
+ helpline[1] := 756;
+ helpline[0] := 757
+ end; {:1002}
+ putgeterror;
+ 30:
+ begin
+ if aritherror then
+ cleararith
+ end;
+ recyclevalue(lhs);
+ freenode(lhs, 2)
+ end; {:1001}
+
+ procedure doassignment;
+ forward;
+
+ procedure doequation;
+ var
+ lhs: halfword;
+ p: halfword;
+ begin
+ lhs := stashcurexp;
+ getxnext;
+ varflag := 77;
+ scanexpression;
+ if curcmd = 51 then
+ doequation
+ else if curcmd = 77 then
+ doassignment;
+ if internal[7] > 131072 then begin {997:}
+ begindiagnostic;
+ printnl(714);
+ printexp(lhs, 0);
+ print(750);
+ printexp(-30000, 0);
+ print(706);
+ enddiagnostic(false)
+ end {:997};
+ if curtype = 10 then
+ if mem[lhs].hh.b0 = 14 then begin
+ p := stashcurexp;
+ unstashcurexp(lhs);
+ lhs := p
+ end;
+ makeeq(lhs)
+ end; {:995} {996:}
+
+ procedure doassignment;
+ var
+ lhs: halfword;
+ p: halfword;
+ q: halfword;
+ begin
+ if curtype <> 20 then begin
+ disperr(-30000, 747);
+ begin
+ helpptr := 2;
+ helpline[1] := 748;
+ helpline[0] := 749
+ end;
+ error;
+ doequation
+ end else begin
+ lhs := curexp;
+ curtype := 1;
+ getxnext;
+ varflag := 77;
+ scanexpression;
+ if curcmd = 51 then
+ doequation
+ else if curcmd = 77 then
+ doassignment;
+ if internal[7] > 131072 then begin {998:}
+ begindiagnostic;
+ printnl(123);
+ if mem[lhs].hh.lh > 2241 then
+ print(intname[mem[lhs].hh.lh - 2241])
+ else
+ showtokenlist(lhs, -30000, 1000, 0);
+ print(329);
+ printexp(-30000, 0);
+ printchar(125);
+ enddiagnostic(false)
+ end {:998};
+ if mem[lhs].hh.lh > 2241 then {999:}
+ if curtype = 16 then
+ internal[mem[lhs].hh.lh - 2241] := curexp
+ else begin
+ disperr(-30000, 751);
+ print(intname[mem[lhs].hh.lh - 2241]);
+ print(752);
+ begin
+ helpptr := 2;
+ helpline[1] := 753;
+ helpline[0] := 754
+ end;
+ putgeterror
+ end {:999} {1000:}
+ else begin
+ p := findvariable(lhs);
+ if p <> (-30000) then begin
+ q := stashcurexp;
+ curtype := undtype(p);
+ recyclevalue(p);
+ mem[p].hh.b0 := curtype;
+ mem[p + 1].int := -30000;
+ makeexpcopy(p);
+ p := stashcurexp;
+ unstashcurexp(q);
+ makeeq(p)
+ end else begin
+ obliterated(lhs);
+ putgeterror
+ end
+ end {:1000};
+ flushnodelist(lhs)
+ end
+ end; {:996} {1015:}
+
+ procedure dotypedeclaration;
+ var
+ t: smallnumber;
+ p: halfword;
+ q: halfword;
+ begin
+ if curmod >= 13 then
+ t := curmod
+ else
+ t := curmod + 1;
+ repeat
+ p := scandeclaredvariable;
+ flushvariable(eqtb[mem[p].hh.lh].rh, mem[p].hh.rh, false);
+ q := findvariable(p);
+ if q <> (-30000) then begin
+ mem[q].hh.b0 := t;
+ mem[q + 1].int := -30000
+ end else begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(764)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 765;
+ helpline[0] := 766
+ end;
+ putgeterror
+ end;
+ flushlist(p);
+ if curcmd < 79 then begin {1016:}
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(767)
+ end;
+ begin
+ helpptr := 5;
+ helpline[4] := 768;
+ helpline[3] := 769;
+ helpline[2] := 770;
+ helpline[1] := 771;
+ helpline[0] := 772
+ end;
+ if curcmd = 42 then
+ helpline[2] := 773;
+ putgeterror;
+ scannerstatus := 2;
+ repeat
+ getnext; {743:}
+ if curcmd = 39 then begin
+ if strref[curmod] < 127 then
+ if strref[curmod] > 1 then
+ strref[curmod] := strref[curmod] - 1
+ else
+ flushstring(curmod)
+ end {:743}
+ until curcmd >= 79;
+ scannerstatus := 0
+ end {:1016}
+ until curcmd > 79
+ end; { dotypedeclaration }
+{:1015}
+ {1021:}
+
+ procedure dorandomseed;
+ begin
+ getxnext;
+ if curcmd <> 77 then begin
+ missingerr(329);
+ begin
+ helpptr := 1;
+ helpline[0] := 778
+ end;
+ backerror
+ end;
+ getxnext;
+ scanexpression;
+ if curtype <> 16 then begin
+ disperr(-30000, 779);
+ begin
+ helpptr := 2;
+ helpline[1] := 780;
+ helpline[0] := 781
+ end;
+ putgetflusherror(0)
+ end else begin {1022:}
+ initrandoms(curexp);
+ if selector >= 2 then begin
+ oldsetting := selector;
+ selector := 2;
+ printnl(782);
+ printscaled(curexp);
+ printchar(125);
+ printnl(155);
+ selector := oldsetting
+ end
+ end {:1022}
+ end; {:1021} {1029:}
+
+ procedure doprotection;
+ var
+ m: 0..1;
+ t: halfword;
+ begin
+ m := curmod;
+ repeat
+ getsymbol;
+ t := eqtb[cursym].lh;
+ if m = 0 then begin
+ if t >= 83 then
+ eqtb[cursym].lh := t - 83
+ end else if t < 83 then
+ eqtb[cursym].lh := t + 83;
+ getxnext
+ until curcmd <> 79
+ end; {:1029} {1031:}
+
+ procedure defdelims;
+ var
+ ldelim, rdelim: halfword;
+ begin
+ getclearsymbol;
+ ldelim := cursym;
+ getclearsymbol;
+ rdelim := cursym;
+ eqtb[ldelim].lh := 31;
+ eqtb[ldelim].rh := rdelim;
+ eqtb[rdelim].lh := 62;
+ eqtb[rdelim].rh := ldelim;
+ getxnext
+ end; {:1031} {1034:}
+
+ procedure dostatement;
+ forward;
+
+ procedure dointerim;
+ begin
+ getxnext;
+ if curcmd <> 40 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(788)
+ end;
+ if cursym = 0 then
+ print(793)
+ else
+ print(hash[cursym].rh);
+ print(794);
+ begin
+ helpptr := 1;
+ helpline[0] := 795
+ end;
+ backerror
+ end else begin
+ saveinternal(curmod);
+ backinput
+ end;
+ dostatement
+ end; { dointerim }
+{:1034}
+ {1035:}
+
+ procedure dolet;
+ var
+ l: halfword;
+ begin
+ getsymbol;
+ l := cursym;
+ getxnext;
+ if curcmd <> 51 then
+ if curcmd <> 77 then begin
+ missingerr(61);
+ begin
+ helpptr := 3;
+ helpline[2] := 796;
+ helpline[1] := 538;
+ helpline[0] := 797
+ end;
+ backerror
+ end;
+ getsymbol;
+ if curcmd in
+ [10, 53, 44, 49] then
+ case curcmd of
+ 10, 53, 44, 49:
+ mem[curmod].hh.lh := mem[curmod].hh.lh + 1
+ end
+ else
+ null;
+ clearsymbol(l, false);
+ eqtb[l].lh := curcmd;
+ if curcmd = 41 then
+ eqtb[l].rh := -30000
+ else
+ eqtb[l].rh := curmod;
+ getxnext
+ end; {:1035} {1036:}
+
+ procedure donewinternal;
+ begin
+ repeat
+ if intptr = maxinternal then
+ overflow(798, maxinternal);
+ getclearsymbol;
+ intptr := intptr + 1;
+ eqtb[cursym].lh := 40;
+ eqtb[cursym].rh := intptr;
+ intname[intptr] := hash[cursym].rh;
+ internal[intptr] := 0;
+ getxnext
+ until curcmd <> 79
+ end; {:1036} {1040:}
+
+ procedure doshow;
+ begin
+ repeat
+ getxnext;
+ scanexpression;
+ printnl(629);
+ printexp(-30000, 2);
+ flushcurexp(0)
+ until curcmd <> 79
+ end; {:1040} {1041:}
+
+ procedure disptoken;
+ begin
+ printnl(804);
+ if cursym = 0 then begin {1042:}
+ if curcmd = 42 then
+ printscaled(curmod)
+ else if curcmd = 38 then begin
+ gpointer := curmod;
+ printcapsule
+ end else begin
+ printchar(34);
+ print(curmod);
+ printchar(34);
+ begin
+ if strref[curmod] < 127 then
+ if strref[curmod] > 1 then
+ strref[curmod] := strref[curmod] - 1
+ else
+ flushstring(curmod)
+ end
+ end
+ end else begin {:1042}
+ print(hash[cursym].rh);
+ printchar(61);
+ if eqtb[cursym].lh >= 83 then
+ print(805);
+ printcmdmod(curcmd, curmod);
+ if curcmd = 10 then begin
+ println;
+ showmacro(curmod, -30000, 100000)
+ end
+ end
+ end; {:1041} {1044:}
+
+ procedure doshowtoken;
+ begin
+ repeat
+ getnext;
+ disptoken;
+ getxnext
+ until curcmd <> 79
+ end; {:1044} {1045:}
+
+ procedure doshowstats;
+ {printint(varused);printchar(38);printint(dynused);
+ if false then}
+ begin
+ printnl(814);
+ print(228);
+ print(425);
+ printint((himemmin - lomemmax) - 1);
+ print(815);
+ println;
+ printnl(816);
+ printint(strptr - initstrptr);
+ printchar(38);
+ printint(poolptr - initpoolptr);
+ print(425);
+ printint(maxstrings - maxstrptr);
+ printchar(38);
+ printint(poolsize - maxpoolptr);
+ print(815);
+ println;
+ getxnext
+ end; {:1045}
+{1046:}
+
+ procedure dispvar(p: halfword);
+ var
+ q: halfword;
+ n: 0..maxprintline;
+ begin
+ if mem[p].hh.b0 = 21 then begin {1047:}
+ q := mem[p + 1].hh.lh;
+ repeat
+ dispvar(q);
+ q := mem[q].hh.rh
+ until q = (-29983);
+ q := mem[p + 1].hh.rh;
+ while mem[q].hh.b1 = 3 do begin
+ dispvar(q);
+ q := mem[q].hh.rh
+ end
+ end else if mem[p].hh.b0 >= 22 then begin {:1047} {1048:}
+ printnl(155);
+ printvariablename(p);
+ if mem[p].hh.b0 > 22 then
+ print(530);
+ print(817);
+ if fileoffset >= (maxprintline - 20) then
+ n := 5
+ else
+ n := (maxprintline - fileoffset) - 15;
+ showmacro(mem[p + 1].int, -30000, n)
+ end else if mem[p].hh.b0 <> 0 then begin {:1048}
+ printnl(155);
+ printvariablename(p);
+ printchar(61);
+ printexp(p, 0)
+ end
+ end; {:1046} {1049:}
+
+ procedure doshowvar;
+ label
+ 30;
+ begin
+ repeat
+ getnext;
+ if cursym > 0 then
+ if cursym <= 2241 then
+ if curcmd = 41 then
+ if curmod <> (-30000) then begin
+ dispvar(curmod);
+ goto 30
+ end;
+ disptoken;
+ 30:
+ getxnext
+ until curcmd <> 79
+ end; {:1049} {1050:}
+
+ procedure doshowdependencies;
+ var
+ p: halfword;
+ begin
+ p := mem[-29987].hh.rh;
+ while p <> (-29987) do begin
+ if interesting(p) then begin
+ printnl(155);
+ printvariablename(p);
+ if mem[p].hh.b0 = 17 then
+ printchar(61)
+ else
+ print(632);
+ printdependency(mem[p + 1].hh.rh, mem[p].hh.b0)
+ end;
+ p := mem[p + 1].hh.rh;
+ while mem[p].hh.lh <> (-30000) do
+ p := mem[p].hh.rh;
+ p := mem[p].hh.rh
+ end;
+ getxnext
+ end; {:1050} {1051:}
+
+ procedure doshowwhatever;
+ begin
+ if interaction = 3 then
+ null;
+ case curmod of
+ 0:
+ doshowtoken;
+ 1:
+ doshowstats;
+ 2:
+ doshow;
+ 3:
+ doshowvar;
+ 4:
+ doshowdependencies
+ end;
+ if internal[32] > 0 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(818)
+ end;
+ if interaction < 3 then begin
+ helpptr := 0;
+ errorcount := errorcount - 1
+ end else begin
+ helpptr := 1;
+ helpline[0] := 819
+ end;
+ if curcmd = 80 then
+ error
+ else
+ putgeterror
+ end
+ end; {:1051} {1054:}
+
+ function scanwith: boolean;
+ var
+ t: smallnumber;
+ result: boolean;
+ begin
+ t := curmod;
+ curtype := 1;
+ getxnext;
+ scanexpression;
+ result := false;
+ if curtype <> t then begin {1055:}
+ disperr(-30000, 827);
+ begin
+ helpptr := 2;
+ helpline[1] := 828;
+ helpline[0] := 829
+ end;
+ if t = 6 then
+ helpline[1] := 830;
+ putgetflusherror(0)
+ end else if curtype = 6 then {:1055}
+ result := true {1056:}
+ else begin
+ curexp := roundunscaled(curexp);
+ if (abs(curexp) < 4) and (curexp <> 0) then
+ result := true
+ else begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(831)
+ end;
+ begin
+ helpptr := 1;
+ helpline[0] := 829
+ end;
+ putgetflusherror(0)
+ end
+ end {:1056};
+ scanwith := result
+ end; {:1054} {1057:}
+
+ procedure findedgesvar(t: halfword);
+ var
+ p: halfword;
+ begin
+ p := findvariable(t);
+ curedges := -30000;
+ if p = (-30000) then begin
+ obliterated(t);
+ putgeterror
+ end else if mem[p].hh.b0 <> 11 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(654)
+ end;
+ showtokenlist(t, -30000, 1000, 0);
+ print(832);
+ printtype(mem[p].hh.b0);
+ printchar(41);
+ begin
+ helpptr := 2;
+ helpline[1] := 833;
+ helpline[0] := 834
+ end;
+ putgeterror
+ end else
+ curedges := mem[p + 1].int;
+ flushnodelist(t)
+ end; {:1057} {1059:}
+
+ procedure doaddto;
+ label
+ 30, 45;
+ var
+ lhs, rhs: halfword;
+ t: smallnumber;
+ w: integer;
+ p: halfword;
+ q: halfword;
+ begin
+ getxnext;
+ varflag := 68;
+ scanprimary;
+ if curtype <> 20 then begin {1060:}
+ disperr(-30000, 835);
+ begin
+ helpptr := 4;
+ helpline[3] := 836;
+ helpline[2] := 837;
+ helpline[1] := 838;
+ helpline[0] := 834
+ end;
+ putgetflusherror(0)
+ end else begin {:1060}
+ lhs := curexp;
+ curpathtype := curmod;
+ curtype := 1;
+ getxnext;
+ scanexpression;
+ if curpathtype = 2 then begin {1061:}
+ findedgesvar(lhs);
+ if curedges = (-30000) then
+ flushcurexp(0)
+ else if curtype <> 11 then begin
+ disperr(-30000, 839);
+ begin
+ helpptr := 2;
+ helpline[1] := 840;
+ helpline[0] := 834
+ end;
+ putgetflusherror(0)
+ end else begin
+ mergeedges(curexp);
+ flushcurexp(0)
+ end
+ end else begin {:1061} {1062:}
+ if curtype = 14 then
+ pairtopath;
+ if curtype <> 9 then begin
+ disperr(-30000, 839);
+ begin
+ helpptr := 2;
+ helpline[1] := 841;
+ helpline[0] := 834
+ end;
+ putgetflusherror(0);
+ flushtokenlist(lhs)
+ end else begin
+ rhs := curexp;
+ w := 1;
+ curpen := -29997;
+ {
+ 1063:}
+ while curcmd = 66 do
+ if scanwith then
+ if curtype = 16 then
+ w := curexp
+ else begin
+ if mem[curpen].hh.lh = (-30000) then
+ tosspen(curpen)
+ else
+ mem[curpen].hh.lh := mem[curpen].hh.lh - 1;
+ curpen := curexp
+ end {:1063}; {1064:}
+ findedgesvar(lhs);
+ if curedges = (-30000) then
+ tossknotlist(rhs)
+ else begin
+ lhs := -30000;
+ if mem[rhs].hh.b0 = 0 then
+ if curpathtype = 0 then {1065:}
+ if mem[rhs].hh.rh = rhs then begin {1066:}
+ mem[rhs + 5].int := mem[rhs + 1].int;
+ mem[rhs + 6].int := mem[rhs + 2].int;
+ mem[rhs + 3].int := mem[rhs + 1].int;
+ mem[rhs + 4].int := mem[rhs + 2].int;
+ mem[rhs].hh.b0 := 1;
+ mem[rhs].hh.b1 := 1
+ end else begin {:1066}
+ p := htapypoc(rhs);
+ q := mem[p].hh.rh;
+ mem[pathtail + 5].int := mem[q + 5].int;
+ mem[pathtail + 6].int := mem[q + 6].int;
+ mem[pathtail].hh.b1 := mem[q].hh.b1;
+ mem[pathtail].hh.rh := mem[q].hh.rh;
+ freenode(q, 7);
+ mem[p + 5].int := mem[rhs + 5].int;
+ mem[p + 6].int := mem[rhs + 6].int;
+ mem[p].hh.b1 := mem[rhs].hh.b1;
+ mem[p].hh.rh := mem[rhs].hh.rh;
+ freenode(rhs, 7);
+ rhs := p
+ end {:1065} {1067:}
+ else begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(842)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 843;
+ helpline[0] := 834
+ end;
+ putgeterror;
+ tossknotlist(rhs);
+ goto 45
+ end {:1067}
+ else if curpathtype = 0 then
+ lhs := htapypoc(rhs);
+ curwt := w;
+ rhs := makespec(rhs, mem[curpen + 9].int, internal[5]); {1068:}
+ if turningnumber <= 0 then
+ if curpathtype <> 0 then
+ if internal[39] > 0 then
+ if (turningnumber < 0) and (mem[curpen].hh.rh = (-30000)) then
+ curwt := -curwt
+ else begin
+ if turningnumber = 0 then
+ if (internal[39] <= 65536) and (mem[curpen].hh.rh = (-30000)) then
+ goto 30
+ else
+ printstrange(844)
+ else
+ printstrange(845);
+ begin
+ helpptr := 3;
+ helpline[2] := 846;
+ helpline[1] := 847;
+ helpline[0] := 848
+ end;
+ putgeterror
+ end;
+ 30: {:1068}
+ null;
+ if mem[curpen + 9].int = 0 then
+ fillspec(rhs)
+ else
+ fillenvelope(rhs);
+ if lhs <> (-30000) then begin
+ revturns := true;
+ lhs := makespec(lhs, mem[curpen + 9].int, internal[5]);
+ revturns := false;
+ if mem[curpen + 9].int = 0 then
+ fillspec(lhs)
+ else
+ fillenvelope(lhs)
+ end;
+ 45: {:1064}
+ null
+ end;
+ if mem[curpen].hh.lh = (-30000) then
+ tosspen(curpen)
+ else
+ mem[curpen].hh.lh := mem[curpen].hh.lh - 1
+ end
+ end {:1062}
+ end
+ end; {:1059} {1070:} {1098:}
+
+ function tfmcheck(m: smallnumber): scaled;
+ begin
+ if abs(internal[m]) >= 134217728 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(865)
+ end;
+ print(intname[m]);
+ print(866);
+ begin
+ helpptr := 1;
+ helpline[0] := 867
+ end;
+ putgeterror;
+ if internal[m] > 0 then
+ tfmcheck := 134217727
+ else
+ tfmcheck := -134217727
+ end else
+ tfmcheck := internal[m]
+ end; {:1098}
+
+ procedure doshipout;
+ label
+ 10;
+ var
+ c: integer;
+ begin
+ getxnext;
+ varflag := 80;
+ scanexpression;
+ {1060:
+ }
+ if curtype <> 20 then
+ if curtype = 11 then
+ curedges := curexp
+ else begin
+ begin
+ disperr(-30000, 835);
+ begin
+ helpptr := 4;
+ helpline[3] := 836;
+ helpline[2] := 837;
+ helpline[1] := 838;
+ helpline[0] := 834
+ end;
+ putgetflusherror(0)
+ end {:1060};
+ goto 10
+ end
+ else begin
+ findedgesvar(curexp);
+ curtype := 1
+ end;
+ if curedges <> (-30000) then begin
+ c := roundunscaled(internal[18]) mod 256;
+ if c < 0 then
+ c := c + 256; {1099:}
+ if c < bc then
+ bc := c;
+ if c > ec then
+ ec := c;
+ charexists[c] := true;
+ gfdx[c] := internal[24];
+ gfdy[c] := internal[25];
+ tfmwidth[c] := tfmcheck(20);
+ tfmheight[c] := tfmcheck(21);
+ tfmdepth[c] := tfmcheck(22);
+ tfmitalcorr[c] := tfmcheck(23) {:1099};
+ if internal[34] >= 0 then
+ shipout(c)
+ end;
+ flushcurexp(0);
+ 10:
+ null
+ end; {:1070}
+{1071:}
+
+ procedure dodisplay;
+ label
+ 45, 50, 10;
+ var
+ e: halfword;
+ begin
+ getxnext;
+ varflag := 73;
+ scanprimary;
+ if curtype <> 20 then begin {1060:}
+ disperr(-30000, 835);
+ begin
+ helpptr := 4;
+ helpline[3] := 836;
+ helpline[2] := 837;
+ helpline[1] := 838;
+ helpline[0] := 834
+ end;
+ putgetflusherror(0)
+ end else begin {:1060}
+ e := curexp;
+ curtype := 1;
+ getxnext;
+ scanexpression;
+ if curtype <> 16 then
+ goto 50;
+ curexp := roundunscaled(curexp);
+ if curexp < 0 then
+ goto 45;
+ if curexp > 15 then
+ goto 45;
+ if not windowopen[curexp] then
+ goto 45;
+ findedgesvar(e);
+ if curedges <> (-30000) then
+ dispedges(curexp);
+ goto 10;
+ 45:
+ curexp := curexp * 65536;
+ 50:
+ disperr(-30000, 849);
+ begin
+ helpptr := 1;
+ helpline[0] := 850
+ end;
+ putgetflusherror(0);
+ flushtokenlist(e)
+ end;
+ 10:
+ null
+ end; { dodisplay }
+{:1071}
+ {1072:}
+
+ function getpair(c: commandcode): boolean;
+ var
+ p: halfword;
+ b: boolean;
+ begin
+ if curcmd <> c then
+ getpair := false
+ else begin
+ getxnext;
+ scanexpression;
+ if nicepair(curexp, curtype) then begin
+ p := mem[curexp + 1].int;
+ curx := mem[p + 1].int;
+ cury := mem[p + 3].int;
+ b := true
+ end else
+ b := false;
+ flushcurexp(0);
+ getpair := b
+ end
+ end; {:1072} {1073:}
+
+ procedure doopenwindow;
+ label
+ 45, 10;
+ var
+ k: integer;
+ r0, c0, r1, c1: scaled;
+ begin
+ getxnext;
+ scanexpression;
+ if curtype <> 16 then
+ goto 45;
+ k := roundunscaled(curexp);
+ if k < 0 then
+ goto 45;
+ if k > 15 then
+ goto 45;
+ if not getpair(70) then
+ goto 45;
+ r0 := curx;
+ c0 := cury;
+ if not getpair(71) then
+ goto 45;
+ r1 := curx;
+ c1 := cury;
+ if not getpair(72) then
+ goto 45;
+ openawindow(k, r0, c0, r1, c1, curx, cury);
+ goto 10;
+ 45:
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(851)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 852;
+ helpline[0] := 853
+ end;
+ putgeterror;
+ 10:
+ null
+ end; {:1073} {1074:}
+
+ procedure docull;
+ label
+ 45, 10;
+ var
+ e: halfword;
+ keeping: 0..1;
+ w, win, wout: integer;
+ begin
+ w := 1;
+ getxnext;
+ varflag := 67;
+ scanprimary;
+ if curtype <> 20 then begin {1060:}
+ disperr(-30000, 835);
+ begin
+ helpptr := 4;
+ helpline[3] := 836;
+ helpline[2] := 837;
+ helpline[1] := 838;
+ helpline[0] := 834
+ end;
+ putgetflusherror(0)
+ end else begin {:1060}
+ e := curexp;
+ curtype := 1;
+ keeping := curmod;
+ if not getpair(67) then
+ goto 45;
+ while (curcmd = 66) and (curmod = 16) do
+ if scanwith then
+ w := curexp; {1075:}
+ if curx > cury then
+ goto 45;
+ if keeping = 0 then begin
+ if (curx > 0) or (cury < 0) then
+ goto 45;
+ wout := w;
+ win := 0
+ end else begin
+ if (curx <= 0) and (cury >= 0) then
+ goto 45;
+ wout := 0;
+ win := w
+ end {:1075};
+ findedgesvar(e);
+ if curedges <> (-30000) then
+ culledges(floorunscaled(curx + 65535), floorunscaled(cury), wout, win);
+ goto 10;
+ 45:
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(854)
+ end;
+ begin
+ helpptr := 1;
+ helpline[0] := 855
+ end;
+ putgeterror;
+ flushtokenlist(e)
+ end;
+ 10:
+ null
+ end; {:1074} {1082:}
+
+ procedure domessage;
+ var
+ m: 0..2;
+ begin
+ m := curmod;
+ getxnext;
+ scanexpression;
+ if curtype <> 4 then begin
+ disperr(-30000, 565);
+ begin
+ helpptr := 1;
+ helpline[0] := 859
+ end;
+ putgeterror
+ end else
+ case m of
+ 0:
+ begin
+ printnl(155);
+ slowprint(curexp)
+ end;
+ 1:
+ begin {1086:}
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(155)
+ end;
+ slowprint(curexp);
+ if errhelp <> 0 then
+ useerrhelp := true
+ else if longhelpseen then begin
+ helpptr := 1;
+ helpline[0] := 860
+ end else begin
+ if interaction < 3 then
+ longhelpseen := true;
+ begin
+ helpptr := 4;
+ helpline[3] := 861;
+ helpline[2] := 862;
+ helpline[1] := 863;
+ helpline[0] := 864
+ end
+ end;
+ putgeterror;
+ useerrhelp := false
+ end; {:1086}
+ 2:
+ begin {1083:}
+ if errhelp <> 0 then begin
+ if strref[errhelp] < 127 then
+ if strref[errhelp] > 1 then
+ strref[errhelp] := strref[errhelp] - 1
+ else
+ flushstring(errhelp)
+ end;
+ if (strstart[curexp + 1] - strstart[curexp]) = 0 then
+ errhelp := 0
+ else begin
+ errhelp := curexp;
+ begin
+ if strref[errhelp] < 127 then
+ strref[errhelp] := strref[errhelp] + 1
+ end
+ end
+ end
+ end {:1083};
+ flushcurexp(0)
+ end; {:1082} {1103:}
+
+ function getcode: eightbits;
+ label
+ 40;
+ var
+ c: integer;
+ begin
+ getxnext;
+ scanexpression;
+ if curtype = 16 then begin
+ c := roundunscaled(curexp);
+ if c >= 0 then
+ if c < 256 then
+ goto 40
+ end else if curtype = 4 then
+ if (strstart[curexp + 1] - strstart[curexp]) = 1 then begin
+ c := strpool[strstart[curexp]];
+ goto 40
+ end;
+ disperr(-30000, 873);
+ begin
+ helpptr := 2;
+ helpline[1] := 874;
+ helpline[0] := 875
+ end;
+ putgetflusherror(0);
+ c := 0;
+ 40:
+ getcode := c
+ end; {:1103} {1104:}
+
+ procedure settag(c: eightbits; t: smallnumber; r: eightbits);
+ begin
+ if chartag[c] = 0 then begin
+ chartag[c] := t;
+ charremainder[c] := r
+ end else begin {1105:}
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(876)
+ end;
+ if (c > 32) and (c < 128) then
+ print(c)
+ else begin
+ print(877);
+ printint(c)
+ end;
+ print(878);
+ case chartag[c] of
+ 1:
+ print(879);
+ 2:
+ print(880);
+ 3:
+ print(870)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 881;
+ helpline[0] := 834
+ end;
+ putgeterror
+ end {:1105}
+ end; {:1104} {1106:}
+
+ procedure dotfmcommand;
+ label
+ 22;
+ var
+ c, cc: eightbits;
+ k: 0..256;
+ j: integer;
+ begin
+ case curmod of
+ 0:
+ begin {1107:}
+ c := getcode;
+ while curcmd = 78 do begin
+ cc := getcode;
+ settag(c, 2, cc);
+ c := cc
+ end
+ end; {:1107}
+ 1:
+ begin {1108:}
+ 22:
+ c := getcode;
+ if curcmd = 78 then begin {1111:}
+ if nl < 256 then
+ settag(c, 1, nl)
+ else begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(891)
+ end;
+ begin
+ helpptr := 1;
+ helpline[0] := 892
+ end;
+ error
+ end;
+ goto 22
+ end {:1111};
+ if curcmd = 76 then begin {1112:}
+ ligkern[nl].b1 := c - 128;
+ ligkern[nl].b2 := curmod - 128;
+ ligkern[nl].b0 := -128;
+ if curmod = 0 then
+ ligkern[nl].b3 := getcode - 128
+ else begin
+ getxnext;
+ scanexpression;
+ if curtype <> 16 then begin
+ disperr(-30000, 893);
+ begin
+ helpptr := 2;
+ helpline[1] := 894;
+ helpline[0] := 179
+ end;
+ putgetflusherror(0)
+ end;
+ kern[nk] := curexp;
+ k := 0;
+ while kern[k] <> curexp do
+ k := k + 1;
+ if k = nk then begin
+ if nk = 256 then
+ overflow(890, 256);
+ nk := nk + 1
+ end;
+ ligkern[nl].b3 := k - 128
+ end {:1112};
+ if nl = ligtablesize then
+ overflow(886, ligtablesize);
+ nl := nl + 1;
+ if curcmd = 79 then
+ goto 22
+ end else begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(887)
+ end;
+ begin
+ helpptr := 1;
+ helpline[0] := 888
+ end;
+ backerror
+ end;
+ if nl > 0 then
+ ligkern[nl - 1].b0 := 0
+ end; {:1108}
+ 2:
+ begin {1113:}
+ if ne = 256 then
+ overflow(870, 256);
+ c := getcode;
+ settag(c, 3, ne);
+ if curcmd <> 78 then begin
+ missingerr(58);
+ begin
+ helpptr := 1;
+ helpline[0] := 895
+ end;
+ backerror
+ end;
+ exten[ne].b0 := getcode - 128;
+ if curcmd <> 79 then begin
+ missingerr(44);
+ begin
+ helpptr := 1;
+ helpline[0] := 895
+ end;
+ backerror
+ end;
+ exten[ne].b1 := getcode - 128;
+ if curcmd <> 79 then begin
+ missingerr(44);
+ begin
+ helpptr := 1;
+ helpline[0] := 895
+ end;
+ backerror
+ end;
+ exten[ne].b2 := getcode - 128;
+ if curcmd <> 79 then begin
+ missingerr(44);
+ begin
+ helpptr := 1;
+ helpline[0] := 895
+ end;
+ backerror
+ end;
+ exten[ne].b3 := getcode - 128;
+ ne := ne + 1
+ end; {:1113}
+ 3, 4:
+ begin
+ c := curmod;
+ getxnext;
+ scanexpression;
+ if (curtype <> 16) or (curexp < 32768) then begin
+ disperr(-30000, 882);
+ begin
+ helpptr := 2;
+ helpline[1] := 883;
+ helpline[0] := 884
+ end;
+ putgeterror
+ end else begin
+ j := roundunscaled(curexp);
+ if curcmd <> 78 then begin
+ missingerr(58);
+ begin
+ helpptr := 1;
+ helpline[0] := 885
+ end;
+ backerror
+ end;
+ if c = 3 then {1114:}
+ repeat
+ if j > headersize then
+ overflow(871, headersize);
+ headerbyte[j] := getcode;
+ j := j + 1
+ until curcmd <> 79 {:1114} {1115:}
+ else
+ repeat
+ if j > maxfontdimen then
+ overflow(872, maxfontdimen);
+ while j > np do begin
+ np := np + 1;
+ param[np] := 0
+ end;
+ getxnext;
+ scanexpression;
+ if curtype <> 16 then begin
+ disperr(-30000, 896);
+ begin
+ helpptr := 1;
+ helpline[0] := 179
+ end;
+ putgetflusherror(0)
+ end;
+ param[j] := curexp;
+ j := j + 1
+ until curcmd <> 79 {:1115}
+ end
+ end
+ end
+ end; {:1106} {1177:}
+
+ procedure dospecial;
+ var
+ m: smallnumber;
+ begin
+ m := curmod;
+ getxnext;
+ scanexpression;
+ if internal[34] >= 0 then
+ if curtype <> m then begin {1178:}
+ disperr(-30000, 914);
+ begin
+ helpptr := 1;
+ helpline[0] := 915
+ end;
+ putgeterror
+ end else begin {:1178}
+ if outputfilename = 0 then
+ initgf;
+ if m = 4 then
+ gfstring(curexp, 0)
+ else begin
+ begin
+ gfbuf[gfptr] := 243;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ gffour(curexp)
+ end
+ end;
+ flushcurexp(0)
+ end; {:1177} {1186:}
+ {procedure storebasefile;var k:integer;
+ p,q:halfword;x:integer;w:fourquarters;begin[1200:]selector:=5;
+ print(925);print(jobname);printchar(32);
+ printint(roundunscaled(internal[14])mod 100);printchar(46);
+ printint(roundunscaled(internal[15]));printchar(46);
+ printint(roundunscaled(internal[16]));printchar(41);
+ if interaction=0 then selector:=2 else selector:=3;
+ begin if poolptr+1>maxpoolptr then begin if poolptr+1>poolsize then
+ overflow(129,poolsize-initpoolptr);maxpoolptr:=poolptr+1;end;end;
+ baseident:=makestring;strref[baseident]:=127;packjobname(926);
+ while not wopenout(basefile)do promptfilename(927,926);printnl(928);
+ print(wmakenamestring(basefile));flushstring(strptr-1);
+ printnl(baseident)[:1200];[1190:]begin basefile^.int:=503742536;
+ put(basefile);end;begin basefile^.int:=-30000;put(basefile);end;
+ begin basefile^.int:=30000;put(basefile);end;begin basefile^.int:=2100;
+ put(basefile);end;begin basefile^.int:=1777;put(basefile);end;
+ begin basefile^.int:=6;put(basefile);end[:1190];
+ [1192:]begin basefile^.int:=poolptr;put(basefile);end;
+ begin basefile^.int:=strptr;put(basefile);end;
+ for k:=0 to strptr do begin basefile^.int:=strstart[k];put(basefile);
+ end;k:=0;while k+4<poolptr do begin w.b0:=strpool[k];w.b1:=strpool[k+1];
+ w.b2:=strpool[k+2];w.b3:=strpool[k+3];begin basefile^.qqqq:=w;
+ put(basefile);end;k:=k+4;end;k:=poolptr-4;w.b0:=strpool[k];
+ w.b1:=strpool[k+1];w.b2:=strpool[k+2];w.b3:=strpool[k+3];
+ begin basefile^.qqqq:=w;put(basefile);end;println;printint(strptr);
+ print(922);printint(poolptr)[:1192];[1194:]sortavail;varused:=0;
+ begin basefile^.int:=lomemmax;put(basefile);end;
+ begin basefile^.int:=rover;put(basefile);end;p:=-30000;q:=rover;x:=0;
+ repeat for k:=p to q+1 do begin basefile^:=mem[k];put(basefile);end;
+ x:=x+q+2-p;varused:=varused+q-p;p:=q+mem[q].hh.lh;q:=mem[q+1].hh.rh;
+ until q=rover;varused:=varused+lomemmax-p;dynused:=memend+1-himemmin;
+ for k:=p to lomemmax do begin basefile^:=mem[k];put(basefile);end;
+ x:=x+lomemmax+1-p;begin basefile^.int:=himemmin;put(basefile);end;
+ begin basefile^.int:=avail;put(basefile);end;
+ for k:=himemmin to memend do begin basefile^:=mem[k];put(basefile);end;
+ x:=x+memend+1-himemmin;p:=avail;
+ while p<>-30000 do begin dynused:=dynused-1;p:=mem[p].hh.rh;end;
+ begin basefile^.int:=varused;put(basefile);end;
+ begin basefile^.int:=dynused;put(basefile);end;println;printint(x);
+ print(923);printint(varused);printchar(38);printint(dynused)[:1194];
+ [1196:]begin basefile^.int:=hashused;put(basefile);end;
+ stcount:=2228-hashused;
+ for p:=1 to hashused do if hash[p].rh<>0 then begin begin basefile^.int
+ :=p;put(basefile);end;begin basefile^.hh:=hash[p];put(basefile);end;
+ begin basefile^.hh:=eqtb[p];put(basefile);end;stcount:=stcount+1;end;
+ for p:=hashused+1 to 2241 do begin begin basefile^.hh:=hash[p];
+ put(basefile);end;begin basefile^.hh:=eqtb[p];put(basefile);end;end;
+ begin basefile^.int:=stcount;put(basefile);end;println;
+ printint(stcount);print(924)[:1196];[1198:]begin basefile^.int:=intptr;
+ put(basefile);end;
+ for k:=1 to intptr do begin begin basefile^.int:=internal[k];
+ put(basefile);end;begin basefile^.int:=intname[k];put(basefile);end;end;
+ begin basefile^.int:=startsym;put(basefile);end;
+ begin basefile^.int:=interaction;put(basefile);end;
+ begin basefile^.int:=baseident;put(basefile);end;
+ begin basefile^.int:=bgloc;put(basefile);end;begin basefile^.int:=egloc;
+ put(basefile);end;begin basefile^.int:=serialno;put(basefile);end;
+ begin basefile^.int:=69069;put(basefile);end;internal[12]:=0[:1198];
+ [1201:]wclose(basefile)[:1201];end;}
+ {:1186}
+
+ procedure dostatement;
+ begin
+ curtype := 1;
+ getxnext;
+ if curcmd > 43 then begin {990:}
+ if curcmd < 80 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(733)
+ end;
+ printcmdmod(curcmd, curmod);
+ printchar(39);
+ begin
+ helpptr := 5;
+ helpline[4] := 734;
+ helpline[3] := 735;
+ helpline[2] := 736;
+ helpline[1] := 737;
+ helpline[0] := 738
+ end;
+ backerror;
+ getxnext
+ end
+ end else if curcmd > 30 then begin {:990} {993:}
+ varflag := 77;
+ scanexpression;
+ if curcmd < 81 then begin
+ if curcmd = 51 then
+ doequation
+ else if curcmd = 77 then
+ doassignment
+ else if curtype = 4 then begin {994:}
+ if internal[1] > 0 then begin
+ printnl(155);
+ slowprint(curexp);
+ {---------------------}
+ auxprintnl(155);
+ auxslowprint(curexp);
+ {---------------------}
+ flush(output)
+ end;
+ if internal[34] > 0 then begin {1179:}
+ if outputfilename = 0 then
+ initgf;
+ gfstring(916, curexp)
+ end {:1179}
+ end else if curtype <> 1 then begin {:994}
+ disperr(-30000, 743);
+ begin
+ helpptr := 3;
+ helpline[2] := 744;
+ helpline[1] := 745;
+ helpline[0] := 746
+ end;
+ putgeterror
+ end;
+ flushcurexp(0);
+ curtype := 1
+ end
+ end else begin {:993} {992:}
+ if internal[7] > 0 then
+ showcmdmod(curcmd, curmod);
+ case curcmd of
+ 30:
+ dotypedeclaration;
+ 16:
+ if curmod > 2 then
+ makeopdef
+ else if curmod > 0 then
+ scandef; {1020:}
+ 24:
+ dorandomseed; {:1020} {1023:}
+ 23:
+ begin
+ println;
+ interaction := curmod; {70:}
+ if interaction = 0 then
+ selector := 0
+ else
+ selector := 1 {:70};
+ if jobname <> 0 then
+ selector := selector + 2;
+ getxnext
+ end; {:1023} {1026:}
+ 21:
+ doprotection; {:1026} {1030:}
+ 27:
+ defdelims; {:1030} {1033:}
+ 12:
+ repeat
+ getsymbol;
+ savevariable(cursym);
+ getxnext
+ until curcmd <> 79;
+ 13:
+ dointerim;
+ 14:
+ dolet;
+ 15:
+ donewinternal; {:1033} {1039:}
+ 22:
+ doshowwhatever;
+{:1039}
+ {1058:}
+ 18:
+ doaddto; {:1058} {1069:}
+ 17:
+ doshipout;
+ 11:
+ dodisplay;
+ 28:
+ doopenwindow;
+ 19:
+ docull; {:1069} {1076:}
+ 26:
+ begin
+ getsymbol;
+ startsym := cursym;
+ getxnext
+ end; {:1076} {1081:}
+ 25:
+ domessage; {:1081} {1100:}
+ 20:
+ dotfmcommand; {:1100} {1175:}
+ 29:
+ dospecial
+ end {:1175};
+ curtype := 1
+ end {:992};
+ if curcmd < 80 then begin {991:}
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(739)
+ end;
+ begin
+ helpptr := 6;
+ helpline[5] := 740;
+ helpline[4] := 741;
+ helpline[3] := 742;
+ helpline[2] := 736;
+ helpline[1] := 737;
+ helpline[0] := 738
+ end;
+ backerror;
+ scannerstatus := 2;
+ repeat
+ getnext; {743:}
+ if curcmd = 39 then begin
+ if strref[curmod] < 127 then
+ if strref[curmod] > 1 then
+ strref[curmod] := strref[curmod] - 1
+ else
+ flushstring(curmod)
+ end {:743}
+ until curcmd > 79;
+ scannerstatus := 0
+ end {:991};
+ errorcount := 0
+ end; {:989}
+{1017:}
+
+ procedure maincontrol;
+ begin
+ repeat
+ dostatement;
+ if curcmd = 81 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(774)
+ end;
+ begin
+ helpptr := 2;
+ helpline[1] := 775;
+ helpline[0] := 555
+ end;
+ flusherror(0)
+ end
+ until curcmd = 82
+ end; {:1017} {1117:}
+
+ function sortin(v: scaled): halfword;
+ label
+ 40;
+ var
+ p, q, r: halfword;
+ begin
+ p := 29999;
+ while true do begin
+ q := mem[p].hh.rh;
+ if v <= mem[q + 1].int then
+ goto 40;
+ p := q
+ end;
+ 40:
+ if v < mem[q + 1].int then begin
+ r := getnode(2);
+ mem[r + 1].int := v;
+ mem[r].hh.rh := q;
+ mem[p].hh.rh := r
+ end;
+ sortin := mem[p].hh.rh
+ end; {:1117}
+{1118:}
+
+ function mincover(d: scaled): integer;
+ var
+ p: halfword;
+ l: scaled;
+ m: integer;
+ begin
+ m := 0;
+ p := mem[29999].hh.rh;
+ perturbation := 2147483647;
+ while p <> (-29981) do begin
+ m := m + 1;
+ l := mem[p + 1].int;
+ repeat
+ p := mem[p].hh.rh
+ until mem[p + 1].int > (l + d);
+ if (mem[p + 1].int - l) < perturbation then
+ perturbation := mem[p + 1].int - l
+ end;
+ mincover := m
+ end; {:1118} {1120:}
+
+ function threshold(m: integer): scaled;
+ var
+ d: scaled;
+ begin
+ if mincover(0) <= m then
+ threshold := 0
+ else begin
+ repeat
+ d := perturbation
+ until mincover(d + d) <= m;
+ while mincover(d) > m do
+ d := perturbation;
+ threshold := d
+ end
+ end; {:1120}
+{1121:}
+
+ function skimp(m: integer): integer;
+ var
+ d: scaled;
+ p, q, r: halfword;
+ l: scaled;
+ v: scaled;
+ begin
+ d := threshold(m);
+ perturbation := 0;
+ q := 29999;
+ m := 0;
+ p := mem[29999].hh.rh;
+ while p <> (-29981) do begin
+ m := m + 1;
+ l := mem[p + 1].int;
+ mem[p].hh.lh := m;
+ if mem[mem[p].hh.rh + 1].int <= (l + d) then begin {1122:}
+ repeat
+ p := mem[p].hh.rh;
+ mem[p].hh.lh := m
+ until mem[mem[p].hh.rh + 1].int > (l + d);
+ v := (l + mem[p + 1].int) div 2;
+ if (mem[p + 1].int - v) > perturbation then
+ perturbation := mem[p + 1].int - v;
+ r := q;
+ repeat
+ r := mem[r].hh.rh;
+ mem[r + 1].int := v
+ until r = p;
+ mem[q].hh.rh := p
+ end {:1122};
+ q := p;
+ p := mem[p].hh.rh
+ end;
+ skimp := m
+ end; {:1121} {1123:}
+
+ procedure tfmwarning(m: smallnumber);
+ begin
+ printnl(897);
+ print(intname[m]);
+ print(898);
+ printscaled(perturbation);
+ print(899)
+ end; { tfmwarning }
+{:1123}
+ {1128:}
+
+ procedure fixdesignsize;
+ var
+ d: scaled;
+ begin
+ d := internal[26];
+ if (d < 65536) or (d >= 134217728) then begin
+ if d <> 0 then
+ printnl(900);
+ d := 8388608;
+ internal[26] := d
+ end;
+ if headerbyte[5] < 0 then
+ if headerbyte[6] < 0 then
+ if headerbyte[7] < 0 then
+ if headerbyte[8] < 0 then begin
+ headerbyte[5] := d div 1048576;
+ headerbyte[6] := (d div 4096) mod 256;
+ headerbyte[7] := (d div 16) mod 256;
+ headerbyte[8] := (d mod 16) * 16
+ end;
+ maxtfmdimen := (16 * internal[26]) - (internal[26] div 2097152);
+ if maxtfmdimen >= 134217728 then
+ maxtfmdimen := 134217727
+ end; {:1128} {1129:}
+
+ function dimenout(x: scaled): integer;
+ begin
+ if abs(x) > maxtfmdimen then begin
+ tfmchanged := tfmchanged + 1;
+ if x > 0 then
+ x := 16777215
+ else
+ x := -16777215
+ end else
+ x := makescaled(x * 16, internal[26]);
+ dimenout := x
+ end; {:1129} {1131:}
+
+ procedure fixchecksum;
+ label
+ 10;
+ var
+ k: eightbits;
+ b1, b2, b3, b4: eightbits;
+ x: integer;
+ begin
+ if headerbyte[1] < 0 then
+ if headerbyte[2] < 0 then
+ if headerbyte[3] < 0 then
+ if headerbyte[4] < 0 then begin {1132:}
+ b1 := bc;
+ b2 := ec;
+ b3 := bc;
+ b4 := ec;
+ tfmchanged := 0;
+ for k := bc to ec do
+ if charexists[k] then begin
+ x := dimenout(mem[tfmwidth[k] + 1].int) + ((k + 4) * 4194304);
+ b1 := ((b1 + b1) + x) mod 255;
+ b2 := ((b2 + b2) + x) mod 253;
+ b3 := ((b3 + b3) + x) mod 251;
+ b4 := ((b4 + b4) + x) mod 247
+ end {:1132};
+ headerbyte[1] := b1;
+ headerbyte[2] := b2;
+ headerbyte[3] := b3;
+ headerbyte[4] := b4;
+ goto 10
+ end;
+ for k := 1 to 4 do
+ if headerbyte[k] < 0 then
+ headerbyte[k] := 0;
+ 10:
+ null
+ end; {:1131}
+{1133:}
+
+ procedure tfmqqqq(x: fourquarters);
+ begin
+ bwritebyte(tfmfile, x.b0 + 128);
+ bwritebyte(tfmfile, x.b1 + 128);
+ bwritebyte(tfmfile, x.b2 + 128);
+ bwritebyte(tfmfile, x.b3 + 128)
+ end; {:1133}
+{1187:}
+ {779:}
+
+ function openbasefile: boolean;
+ label
+ 40, 10;
+ var
+ j: 0..bufsize;
+ begin
+ j := curinput.locfield;
+ if buffer[curinput.locfield] = 38 then begin
+ curinput.locfield := curinput.locfield + 1;
+ j := curinput.locfield;
+ buffer[last] := 32;
+ while buffer[j] <> 32 do
+ j := j + 1;
+ packbufferedname(0, curinput.locfield, j - 1);
+ if wopenin(basefile) then
+ goto 40;
+ writeln(output, 'Sorry, I can''t find that base;', ' will try PLAIN.');
+ flush(output)
+ end;
+ packbufferedname(5, 1, 0);
+ if not wopenin(basefile) then begin
+ writeln(output, 'I can''t find the PLAIN base file!');
+ openbasefile := false;
+ goto 10
+ end;
+ 40:
+ curinput.locfield := j;
+ openbasefile := true;
+ 10:
+ null
+ end; {:779}
+
+ function loadbasefile: boolean;
+ label
+ 6666, 10;
+ var
+ k: integer;
+ p, q: halfword;
+ x: integer;
+ w: fourquarters; {1191:}
+ begin
+ x := basefile^.int;
+ if x <> 503742536 then
+ goto 6666;
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if x <> (-30000) then
+ goto 6666;
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if x <> 30000 then
+ goto 6666;
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if x <> 2100 then
+ goto 6666;
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if x <> 1777 then
+ goto 6666;
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if x <> 6 then
+ goto 6666 {:1191};
+{1193:}
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if x < 0 then
+ goto 6666;
+ if x > poolsize then begin
+ writeln(output, '---! Must increase the ', 'string pool size');
+ goto 6666
+ end else
+ poolptr := x
+ end;
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if x < 0 then
+ goto 6666;
+ if x > maxstrings then begin
+ writeln(output, '---! Must increase the ', 'max strings');
+ goto 6666
+ end else
+ strptr := x
+ end;
+ for k := 0 to strptr do begin
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < 0) or (x > poolptr) then
+ goto 6666
+ else
+ strstart[k] := x
+ end;
+ strref[k] := 127
+ end;
+ k := 0;
+ while (k + 4) < poolptr do begin
+ begin
+ get(basefile);
+ w := basefile^.qqqq
+ end;
+ strpool[k] := w.b0;
+ strpool[k + 1] := w.b1;
+ strpool[k + 2] := w.b2;
+ strpool[k + 3] := w.b3;
+ k := k + 4
+ end;
+ k := poolptr - 4;
+ begin
+ get(basefile);
+ w := basefile^.qqqq
+ end;
+ strpool[k] := w.b0;
+ strpool[k + 1] := w.b1;
+ strpool[k + 2] := w.b2;
+ strpool[k + 3] := w.b3 {:1193}; {1195:}
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < (-28978)) or (x > 29997) then
+ goto 6666
+ else
+ lomemmax := x
+ end;
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < (-29977)) or (x > lomemmax) then
+ goto 6666
+ else
+ rover := x
+ end;
+ p := -30000;
+ q := rover;
+ x := 0;
+ repeat
+ for k := p to q + 1 do begin
+ get(basefile);
+ mem[k] := basefile^
+ end;
+ p := q + mem[q].hh.lh;
+ if (p > lomemmax) or ((q >= mem[q + 1].hh.rh) and (mem[q + 1].hh.rh <> rover)) then
+ goto 6666;
+ q := mem[q + 1].hh.rh
+ until q = rover;
+ for k := p to lomemmax do begin
+ get(basefile);
+ mem[k] := basefile^
+ end;
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < (lomemmax + 1)) or (x > 29998) then
+ goto 6666
+ else
+ himemmin := x
+ end;
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < (-30000)) or (x > 30000) then
+ goto 6666
+ else
+ avail := x
+ end;
+ memend := 30000;
+ for k := himemmin to memend do begin
+ get(basefile);
+ mem[k] := basefile^
+ end;
+ begin
+ get(basefile);
+ varused := basefile^.int
+ end;
+ begin
+ get(basefile);
+ dynused := basefile^.int
+ end {:1195}; {1197:}
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < 1) or (x > 2229) then
+ goto 6666
+ else
+ hashused := x
+ end;
+ p := 0;
+ repeat
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < (p + 1)) or (x > hashused) then
+ goto 6666
+ else
+ p := x
+ end;
+ begin
+ get(basefile);
+ hash[p] := basefile^.hh
+ end;
+ begin
+ get(basefile);
+ eqtb[p] := basefile^.hh
+ end
+ until p = hashused;
+ for p := hashused + 1 to 2241 do begin
+ begin
+ get(basefile);
+ hash[p] := basefile^.hh
+ end;
+ begin
+ get(basefile);
+ eqtb[p] := basefile^.hh
+ end
+ end;
+ begin
+ get(basefile);
+ stcount := basefile^.int
+ end {:1197}; {1199:}
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < 40) or (x > maxinternal) then
+ goto 6666
+ else
+ intptr := x
+ end;
+ for k := 1 to intptr do begin
+ begin
+ get(basefile);
+ internal[k] := basefile^.int
+ end;
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < 0) or (x > strptr) then
+ goto 6666
+ else
+ intname[k] := x
+ end
+ end;
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < 0) or (x > 2229) then
+ goto 6666
+ else
+ startsym := x
+ end;
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < 0) or (x > 3) then
+ goto 6666
+ else
+ interaction := x
+ end;
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < 0) or (x > strptr) then
+ goto 6666
+ else
+ baseident := x
+ end;
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < 1) or (x > 2241) then
+ goto 6666
+ else
+ bgloc := x
+ end;
+ begin
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x < 1) or (x > 2241) then
+ goto 6666
+ else
+ egloc := x
+ end;
+ begin
+ get(basefile);
+ serialno := basefile^.int
+ end;
+ begin
+ get(basefile);
+ x := basefile^.int
+ end;
+ if (x <> 69069) or eof(basefile) then
+ goto 6666 {:1199};
+ loadbasefile := true;
+ goto 10;
+ 6666:
+ null;
+ writeln(output, '(Fatal base file error; I''m stymied)');
+ loadbasefile := false;
+ 10:
+ null
+ end; {:1187} {1202:} {823:}
+
+ procedure scanprimary;
+ label
+ 20, 30, 31, 32;
+ var
+ p, q, r: halfword;
+ c: quarterword;
+ myvarflag: 0..82;
+ ldelim, rdelim: halfword; {831:}
+ groupline: integer; {:831} {836:}
+ num, denom: scaled; {:836} {843:}
+ prehead, posthead, tail: halfword;
+ tt: smallnumber;
+ t: halfword;
+ macroref: halfword; {:843}
+ begin
+ myvarflag := varflag;
+ varflag := 0;
+ 20:
+ begin
+ if aritherror then
+ cleararith
+ end; {825:}
+{if panicking then checkmem(false);}
+ if interrupt <> 0 then
+ if OKtointerrupt then begin
+ backinput;
+ begin
+ if interrupt <> 0 then
+ pauseforinstructions
+ end;
+ getxnext
+ end {:825};
+ if curcmd in
+ [31, 32, 39, 42, 33, 34, 30, 36,
+ 43, 37, 35, 40, 38, 41] then
+ case curcmd of
+ 31:
+ begin {826:}
+ ldelim := cursym;
+ rdelim := curmod;
+ getxnext;
+ scanexpression;
+ if (curcmd = 79) and (curtype >= 16) then begin {830:}
+ p := getnode(2);
+ mem[p].hh.b0 := 14;
+ mem[p].hh.b1 := 11;
+ initbignode(p);
+ q := mem[p + 1].int;
+ stashin(q);
+ getxnext;
+ scanexpression;
+ if curtype < 16 then begin
+ disperr(-30000, 639);
+ begin
+ helpptr := 4;
+ helpline[3] := 640;
+ helpline[2] := 641;
+ helpline[1] := 642;
+ helpline[0] := 643
+ end;
+ putgetflusherror(0)
+ end;
+ stashin(q + 2);
+ checkdelimiter(ldelim, rdelim);
+ curtype := 14;
+ curexp := p
+ end else {:830}
+ checkdelimiter(ldelim, rdelim)
+ end; {:826}
+ 32:
+ begin {832:}
+ groupline := line;
+ if internal[7] > 0 then
+ showcmdmod(curcmd, curmod);
+ begin
+ p := getavail;
+ mem[p].hh.lh := 0;
+ mem[p].hh.rh := saveptr;
+ saveptr := p
+ end;
+ repeat
+ dostatement
+ until curcmd <> 80;
+ if curcmd <> 81 then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(644)
+ end;
+ printint(groupline);
+ print(645);
+ begin
+ helpptr := 2;
+ helpline[1] := 646;
+ helpline[0] := 647
+ end;
+ backerror;
+ curcmd := 81
+ end;
+ unsave;
+ if internal[7] > 0 then
+ showcmdmod(curcmd, curmod)
+ end; {:832}
+ 39:
+ begin {833:}
+ curtype := 4;
+ curexp := curmod
+ end; {:833}
+ 42:
+ begin {837:}
+ curexp := curmod;
+ curtype := 16;
+ getxnext;
+ if curcmd <> 54 then begin
+ num := 0;
+ denom := 0
+ end else begin
+ getxnext;
+ if curcmd <> 42 then begin
+ backinput;
+ curcmd := 54;
+ curmod := 72;
+ cursym := 2233;
+ goto 30
+ end;
+ num := curexp;
+ denom := curmod;
+ if denom = 0 then begin {838:}
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(648)
+ end;
+ begin
+ helpptr := 1;
+ helpline[0] := 649
+ end;
+ error
+ end else {:838}
+ curexp := makescaled(num, denom);
+ begin
+ if aritherror then
+ cleararith
+ end;
+ getxnext
+ end;
+ if curcmd >= 30 then
+ if curcmd < 42 then begin
+ p := stashcurexp;
+ scanprimary;
+ if (abs(num) >= abs(denom)) or (curtype < 14) then
+ dobinary(p, 71)
+ else begin
+ fracmult(num, denom);
+ freenode(p, 2)
+ end
+ end;
+ goto 30
+ end; {:837}
+ 33: {834:}
+ donullary(curmod) {:834};
+ 34, 30, 36, 43:
+ begin {835:}
+ c := curmod;
+ getxnext;
+ scanprimary;
+ dounary(c);
+ goto 30
+ end; {:835}
+ 37:
+ begin {839:}
+ c := curmod;
+ getxnext;
+ scanexpression;
+ if curcmd <> 69 then begin
+ missingerr(347);
+ print(581);
+ printcmdmod(37, c);
+ begin
+ helpptr := 1;
+ helpline[0] := 582
+ end;
+ backerror
+ end;
+ p := stashcurexp;
+ getxnext;
+ scanprimary;
+ dobinary(p, c);
+ goto 30
+ end; {:839}
+ 35:
+ begin {840:}
+ getxnext;
+ scansuffix;
+ oldsetting := selector;
+ selector := 5;
+ showtokenlist(curexp, -30000, 100000, 0);
+ flushtokenlist(curexp);
+ curexp := makestring;
+ selector := oldsetting;
+ curtype := 4;
+ goto 30
+ end; {:840}
+ 40:
+ begin {841:}
+ q := curmod;
+ if myvarflag = 77 then begin
+ getxnext;
+ if curcmd = 77 then begin
+ curexp := getavail;
+ mem[curexp].hh.lh := q + 2241;
+ curtype := 20;
+ goto 30
+ end;
+ backinput
+ end;
+ curtype := 16;
+ curexp := internal[q]
+ end; {:841}
+ 38:
+ makeexpcopy(curmod);
+ 41:
+ begin {844:}
+ begin
+ prehead := avail;
+ if prehead = (-30000) then
+ prehead := getavail
+ else begin
+ avail := mem[prehead].hh.rh;
+ mem[prehead].hh.rh := -30000
+ end {dynused:=dynused+1;}
+ end;
+ tail := prehead;
+ posthead := -30000;
+ tt := 1;
+ while true do begin
+ t := curtok;
+ mem[tail].hh.rh := t;
+ if tt <> 0 then begin {850:}
+ begin
+ p := mem[prehead].hh.rh;
+ q := mem[p].hh.lh;
+ tt := 0;
+ if (eqtb[q].lh mod 83) = 41 then begin
+ q := eqtb[q].rh;
+ if q = (-30000) then
+ goto 32;
+ while true do begin
+ p := mem[p].hh.rh;
+ if p = (-30000) then begin
+ tt := mem[q].hh.b0;
+ goto 32
+ end;
+ if mem[q].hh.b0 <> 21 then
+ goto 32;
+ q := mem[mem[q + 1].hh.lh].hh.rh;
+ if p >= himemmin then begin
+ repeat
+ q := mem[q].hh.rh
+ until mem[q + 2].hh.lh >= mem[p].hh.lh;
+ if mem[q + 2].hh.lh > mem[p].hh.lh then
+ goto 32
+ end
+ end
+ end;
+ 32: {:850}
+ null
+ end;
+ if tt >= 22 then begin {845:}
+ mem[tail].hh.rh := -30000;
+ if tt > 22 then begin
+ posthead := getavail;
+ tail := posthead;
+ mem[tail].hh.rh := t;
+ tt := 0;
+ macroref := mem[q + 1].int;
+ mem[macroref].hh.lh := mem[macroref].hh.lh + 1
+ end else begin {853:}
+ p := getavail;
+ mem[prehead].hh.lh := mem[prehead].hh.rh;
+ mem[prehead].hh.rh := p;
+ mem[p].hh.lh := t;
+ macrocall(mem[q + 1].int, prehead, -30000);
+ getxnext;
+ goto 20
+ end {:853}
+ end {:845}
+ end;
+ getxnext;
+ tail := t;
+ if curcmd = 63 then begin {846:}
+ getxnext;
+ scanexpression;
+ if curcmd <> 64 then begin {847:}
+ backinput;
+ backexpr;
+ curcmd := 63;
+ curmod := 0;
+ cursym := 2232
+ end else begin {:847}
+ if curtype <> 16 then
+ badsubscript;
+ curcmd := 42;
+ curmod := curexp;
+ cursym := 0
+ end
+ end {:846};
+ if curcmd > 42 then
+ goto 31;
+ if curcmd < 40 then
+ goto 31
+ end;
+ 31: {852:}
+ if posthead <> (-30000) then begin {854:}
+ backinput;
+ p := getavail;
+ q := mem[posthead].hh.rh;
+ mem[prehead].hh.lh := mem[prehead].hh.rh;
+ mem[prehead].hh.rh := posthead;
+ mem[posthead].hh.lh := q;
+ mem[posthead].hh.rh := p;
+ mem[p].hh.lh := mem[q].hh.rh;
+ mem[q].hh.rh := -30000;
+ macrocall(macroref, prehead, -30000);
+ mem[macroref].hh.lh := mem[macroref].hh.lh - 1;
+ getxnext;
+ goto 20
+ end {:854};
+ q := mem[prehead].hh.rh;
+ begin
+ mem[prehead].hh.rh := avail;
+ avail := prehead
+ end
+{dynused:=dynused-1;};
+ if curcmd = myvarflag then begin
+ curtype := 20;
+ curexp := q;
+ goto 30
+ end;
+ p := findvariable(q);
+ if p <> (-30000) then
+ makeexpcopy(p)
+ else begin
+ obliterated(q);
+ helpline[2] := 661;
+ helpline[1] := 662;
+ helpline[0] := 663;
+ putgetflusherror(0)
+ end;
+ flushnodelist(q);
+ goto 30 {:852}
+ end
+ end
+ else
+ begin {:844}
+ badexp(633);
+ goto 20
+ end;
+ getxnext;
+ 30:
+ if curcmd = 63 then
+ if curtype >= 16 then begin {859:}
+ p := stashcurexp;
+ getxnext;
+ scanexpression;
+ if curcmd <> 79 then begin {847:}
+ begin
+ backinput;
+ backexpr;
+ curcmd := 63;
+ curmod := 0;
+ cursym := 2232
+ end {:847};
+ unstashcurexp(p)
+ end else begin
+ q := stashcurexp;
+ getxnext;
+ scanexpression;
+ if curcmd <> 64 then begin
+ missingerr(93);
+ begin
+ helpptr := 3;
+ helpline[2] := 665;
+ helpline[1] := 666;
+ helpline[0] := 563
+ end;
+ backerror
+ end;
+ r := stashcurexp;
+ makeexpcopy(q);
+ dobinary(r, 70);
+ dobinary(p, 71);
+ dobinary(q, 69);
+ getxnext
+ end
+ end {:859}
+ end; {:823} {860:}
+
+ procedure scansuffix;
+ label
+ 30;
+ var
+ h, t: halfword;
+ p: halfword;
+ begin
+ h := getavail;
+ t := h;
+ while true do begin
+ if curcmd = 63 then begin {861:}
+ getxnext;
+ scanexpression;
+ if curtype <> 16 then
+ badsubscript;
+ if curcmd <> 64 then begin
+ missingerr(93);
+ begin
+ helpptr := 3;
+ helpline[2] := 667;
+ helpline[1] := 666;
+ helpline[0] := 563
+ end;
+ backerror
+ end;
+ curcmd := 42;
+ curmod := curexp
+ end {:861};
+ if curcmd = 42 then
+ p := newnumtok(curmod)
+ else if (curcmd = 41) or (curcmd = 40) then begin
+ p := getavail;
+ mem[p].hh.lh := cursym
+ end else
+ goto 30;
+ mem[t].hh.rh := p;
+ t := p;
+ getxnext
+ end;
+ 30:
+ curexp := mem[h].hh.rh;
+ begin
+ mem[h].hh.rh := avail;
+ avail := h
+ end {dynused:=dynused-1;};
+ curtype := 20
+ end; {:860} {862:}
+
+ procedure scansecondary;
+ label
+ 20, 22;
+ var
+ p, q, r: halfword;
+ c, d: halfword;
+ macname: halfword;
+ begin
+ 20:
+ if (curcmd < 30) or (curcmd > 43) then
+ badexp(668);
+ scanprimary;
+ 22:
+ if curcmd <= 55 then
+ if curcmd >= 52 then begin
+ p := stashcurexp;
+ c := curmod;
+ d := curcmd;
+ if d = 53 then begin
+ macname := cursym;
+ mem[c].hh.lh := mem[c].hh.lh + 1
+ end;
+ getxnext;
+ scanprimary;
+ if d <> 53 then
+ dobinary(p, c)
+ else begin
+ backinput;
+ binarymac(p, c, macname);
+ mem[c].hh.lh := mem[c].hh.lh - 1;
+ getxnext;
+ goto 20
+ end;
+ goto 22
+ end
+ end; {:862}
+{864:}
+
+ procedure scantertiary;
+ label
+ 20, 22;
+ var
+ p: halfword;
+ c, d: halfword;
+ macname: halfword;
+ begin
+ 20:
+ if (curcmd < 30) or (curcmd > 43) then
+ badexp(669);
+ scansecondary;
+ if curtype = 8 then
+ materializepen;
+ 22:
+ if curcmd <= 45 then
+ if curcmd >= 43 then begin
+ p := stashcurexp;
+ c := curmod;
+ d := curcmd;
+ if d = 44 then begin
+ macname := cursym;
+ mem[c].hh.lh := mem[c].hh.lh + 1
+ end;
+ getxnext;
+ scansecondary;
+ if d <> 44 then
+ dobinary(p, c)
+ else begin
+ backinput;
+ binarymac(p, c, macname);
+ mem[c].hh.lh := mem[c].hh.lh - 1;
+ getxnext;
+ goto 20
+ end;
+ goto 22
+ end
+ end; {:864}
+{868:}
+
+ procedure scanexpression;
+ label
+ 20, 30, 22, 25, 26, 10;
+ var
+ p, q, r, pp, qq: halfword;
+ c, d: halfword;
+ myvarflag: 0..82;
+ macname: halfword;
+ cyclehit: boolean;
+ x, y: scaled;
+ t: 0..4;
+ begin
+ myvarflag := varflag;
+ 20:
+ if (curcmd < 30) or (curcmd > 43) then
+ badexp(672);
+ scantertiary;
+ 22:
+ if curcmd <= 51 then
+ if curcmd >= 46 then
+ if (curcmd <> 51) or (myvarflag <> 77) then begin
+ p := stashcurexp;
+ c := curmod;
+ d := curcmd;
+ if d = 49 then begin
+ macname := cursym;
+ mem[c].hh.lh := mem[c].hh.lh + 1
+ end;
+ if (d < 48) or ((d = 48) and ((mem[p].hh.b0 = 14) or (mem[p].hh.b0 = 9))) then begin {869:}
+ cyclehit := false; {870:}
+ begin
+ unstashcurexp(p);
+ if curtype = 14 then
+ p := newknot
+ else if curtype = 9 then
+ p := curexp
+ else
+ goto 10;
+ q := p;
+ while mem[q].hh.rh <> p do
+ q := mem[q].hh.rh;
+ if mem[p].hh.b0 <> 0 then begin
+ r := copyknot(p);
+ mem[q].hh.rh := r;
+ q := r
+ end;
+ mem[p].hh.b0 := 4;
+ mem[q].hh.b1 := 4
+ end {:870};
+ 25: {874:}
+ if curcmd = 46 then begin {879:}
+ t := scandirection;
+ if t <> 4 then begin
+ mem[q].hh.b1 := t;
+ mem[q + 5].int := curexp;
+ if mem[q].hh.b0 = 4 then begin
+ mem[q].hh.b0 := t;
+ mem[q + 3].int := curexp
+ end
+ end
+ end {:879};
+ d := curcmd;
+ if d = 47 then begin {881:}
+ getxnext;
+ if curcmd = 58 then begin {882:}
+ getxnext;
+ y := curcmd;
+ if curcmd = 59 then
+ getxnext;
+ scanprimary; {883:}
+ if (curtype <> 16) or (curexp < 49152) then begin
+ disperr(-30000, 690);
+ begin
+ helpptr := 1;
+ helpline[0] := 691
+ end;
+ putgetflusherror(65536)
+ end {:883};
+ if y = 59 then
+ curexp := -curexp;
+ mem[q + 6].int := curexp;
+ if curcmd = 52 then begin
+ getxnext;
+ y := curcmd;
+ if curcmd = 59 then
+ getxnext;
+ scanprimary; {883:}
+ if (curtype <> 16) or (curexp < 49152) then begin
+ disperr(-30000, 690);
+ begin
+ helpptr := 1;
+ helpline[0] := 691
+ end;
+ putgetflusherror(65536)
+ end {:883};
+ if y = 59 then
+ curexp := -curexp
+ end;
+ y := curexp
+ end else if curcmd = 57 then begin {:882} {884:}
+ mem[q].hh.b1 := 1;
+ t := 1;
+ getxnext;
+ scanprimary;
+ knownpair;
+ mem[q + 5].int := curx;
+ mem[q + 6].int := cury;
+ if curcmd <> 52 then begin
+ x := mem[q + 5].int;
+ y := mem[q + 6].int
+ end else begin
+ getxnext;
+ scanprimary;
+ knownpair;
+ x := curx;
+ y := cury
+ end
+ end else begin {:884}
+ mem[q + 6].int := 65536;
+ y := 65536;
+ backinput;
+ goto 30
+ end;
+ if curcmd <> 47 then begin
+ missingerr(279);
+ begin
+ helpptr := 1;
+ helpline[0] := 689
+ end;
+ backerror
+ end;
+ 30: {:881}
+ null
+ end else if d <> 48 then
+ goto 26;
+ getxnext;
+ if curcmd = 46 then begin {880:}
+ t := scandirection;
+ if mem[q].hh.b1 <> 1 then
+ x := curexp
+ else
+ t := 1
+ end else if mem[q].hh.b1 <> 1 then begin {:880}
+ t := 4;
+ x := 0
+ end {:874};
+ if curcmd = 36 then begin {886:}
+ cyclehit := true;
+ getxnext;
+ pp := p;
+ qq := p;
+ if d = 48 then
+ if p = q then begin
+ d := 47;
+ mem[q + 6].int := 65536;
+ y := 65536
+ end
+ end else begin {:886}
+ scantertiary; {885:}
+ begin
+ if curtype <> 9 then
+ pp := newknot
+ else
+ pp := curexp;
+ qq := pp;
+ while mem[qq].hh.rh <> pp do
+ qq := mem[qq].hh.rh;
+ if mem[pp].hh.b0 <> 0 then begin
+ r := copyknot(pp);
+ mem[qq].hh.rh := r;
+ qq := r
+ end;
+ mem[pp].hh.b0 := 4;
+ mem[qq].hh.b1 := 4
+ end {:885}
+ end; {887:}
+ begin
+ if d = 48 then
+ if (mem[q + 1].int <> mem[pp + 1].int) or (mem[q + 2].int <> mem[pp + 2].int) then begin
+ begin
+ if interaction = 3 then
+ null;
+ printnl(133);
+ print(692)
+ end;
+ begin
+ helpptr := 3;
+ helpline[2] := 693;
+ helpline[1] := 694;
+ helpline[0] := 695
+ end;
+ putgeterror;
+ d := 47;
+ mem[q + 6].int := 65536;
+ y := 65536
+ end;
+{889:}
+ if mem[pp].hh.b1 = 4 then
+ if (t = 3) or (t = 2) then begin
+ mem[pp].hh.b1 := t;
+ mem[pp + 5].int := x
+ end {:889};
+ if d = 48 then begin {890:}
+ if mem[q].hh.b0 = 4 then
+ if mem[q].hh.b1 = 4 then begin
+ mem[q].hh.b0 := 3;
+ mem[q + 3].int := 65536
+ end;
+ if mem[pp].hh.b1 = 4 then
+ if t = 4 then begin
+ mem[pp].hh.b1 := 3;
+ mem[pp + 5].int := 65536
+ end;
+ mem[q].hh.b1 := mem[pp].hh.b1;
+ mem[q].hh.rh := mem[pp].hh.rh;
+ mem[q + 5].int := mem[pp + 5].int;
+ mem[q + 6].int := mem[pp + 6].int;
+ freenode(pp, 7);
+ if qq = pp then
+ qq := q
+ end else begin {:890} {888:}
+ if mem[q].hh.b1 = 4 then
+ if (mem[q].hh.b0 = 3) or (mem[q].hh.b0 = 2) then begin
+ mem[q].hh.b1 := mem[q].hh.b0;
+ mem[q + 5].int := mem[q + 3].int
+ end {:888};
+ mem[q].hh.rh := pp;
+ mem[pp + 4].int := y;
+ if t <> 4 then begin
+ mem[pp + 3].int := x;
+ mem[pp].hh.b0 := t
+ end
+ end;
+ q := qq
+ end {:887};
+ if curcmd >= 46 then
+ if curcmd <= 48 then
+ if not cyclehit then
+ goto 25;
+ 26: {891:}
+ if cyclehit then begin
+ if d = 48 then
+ p := q
+ end else begin
+ mem[p].hh.b0 := 0;
+ if mem[p].hh.b1 = 4 then begin
+ mem[p].hh.b1 := 3;
+ mem[p + 5].int := 65536
+ end;
+ mem[q].hh.b1 := 0;
+ if mem[q].hh.b0 = 4 then begin
+ mem[q].hh.b0 := 3;
+ mem[q + 3].int := 65536
+ end;
+ mem[q].hh.rh := p
+ end;
+ makechoices(p);
+ curtype := 9;
+ curexp := p {:891}
+ end else begin {:869}
+ getxnext;
+ scantertiary;
+ if d <> 49 then
+ dobinary(p, c)
+ else begin
+ backinput;
+ binarymac(p, c, macname);
+ mem[c].hh.lh := mem[c].hh.lh - 1;
+ getxnext;
+ goto 20
+ end
+ end;
+ goto 22
+ end;
+ 10:
+ null
+ end; {:868} {892:}
+
+ procedure getboolean;
+ begin
+ getxnext;
+ scanexpression;
+ if curtype <> 2 then begin
+ disperr(-30000, 696);
+ begin
+ helpptr := 2;
+ helpline[1] := 697;
+ helpline[0] := 698
+ end;
+ putgetflusherror(31);
+ curtype := 2
+ end
+ end; {:892} {224:}
+
+ procedure printcapsule;
+ begin
+ printchar(40);
+ printexp(gpointer, 0);
+ printchar(41)
+ end;
+
+ procedure tokenrecycle;
+ begin
+ recyclevalue(gpointer)
+ end; {:224} {1205:}
+
+ procedure closefilesandtermina;
+ var
+ k: integer;
+ lh: integer;
+ p: halfword;
+ x: scaled;
+ {if internal[12]>0 then[1208:]if jobname>0 then begin writeln(
+ logfile,' ');
+ writeln(logfile,'Here is how much of METAFONT''s memory',' you used:');
+ write(logfile,' ',maxstrptr-initstrptr:1,' string');
+ if maxstrptr<>initstrptr+1 then write(logfile,'s');
+ writeln(logfile,' out of ',maxstrings-initstrptr:1);
+ writeln(logfile,' ',maxpoolptr-initpoolptr:1,
+ ' string characters out of ',poolsize-initpoolptr:1);
+ writeln(logfile,' ',lomemmax+30000+memend-himemmin+2:1,
+ ' words of memory out of ',memend+30001:1);
+ writeln(logfile,' ',stcount:1,' symbolic tokens out of ',2100:1);
+ writeln(logfile,' ',maxinstack:1,'i,',intptr:1,'n,',maxroundingptr:1,
+ 'r,',maxparamstack:1,'p,',maxbufstack+1:1,'b stack positions out of ',
+ stacksize:1,'i,',maxinternal:1,'n,',maxwiggle:1,'r,',150:1,'p,',bufsize:
+ 1,'b');end[:1208];}
+ begin
+ {1206:}
+ if (gfprevptr > 0) or (internal[33] > 0) then begin {1207:}
+ rover := -29977;
+ mem[rover].hh.rh := 32767;
+ lomemmax := himemmin - 1;
+ if (lomemmax - rover) > 32767 then
+ lomemmax := 32767 + rover;
+ mem[rover].hh.lh := lomemmax - rover;
+ mem[rover + 1].hh.lh := rover;
+ mem[rover + 1].hh.rh := rover;
+ mem[lomemmax].hh.rh := -30000;
+ mem[lomemmax].hh.lh := -30000 {:1207}; {1124:}
+ mem[29999].hh.rh := -29981;
+ for k := bc to ec do
+ if charexists[k] then
+ tfmwidth[k] := sortin(tfmwidth[k]);
+ nw := skimp(255) + 1;
+ dimenhead[1] := mem[29999].hh.rh;
+ if perturbation >= 4096 then
+ tfmwarning(20) {:1124};
+ fixdesignsize;
+ fixchecksum;
+ if internal[33] > 0 then begin {1126:}
+ mem[29999].hh.rh := -29981;
+ for k := bc to ec do
+ if charexists[k] then
+ if tfmheight[k] = 0 then
+ tfmheight[k] := -29985
+ else
+ tfmheight[k] := sortin(tfmheight[k]);
+ nh := skimp(15) + 1;
+ dimenhead[2] := mem[29999].hh.rh;
+ if perturbation >= 4096 then
+ tfmwarning(21);
+ mem[29999].hh.rh := -29981;
+ for k := bc to ec do
+ if charexists[k] then
+ if tfmdepth[k] = 0 then
+ tfmdepth[k] := -29985
+ else
+ tfmdepth[k] := sortin(tfmdepth[k]);
+ nd := skimp(15) + 1;
+ dimenhead[3] := mem[29999].hh.rh;
+ if perturbation >= 4096 then
+ tfmwarning(22);
+ mem[29999].hh.rh := -29981;
+ for k := bc to ec do
+ if charexists[k] then
+ if tfmitalcorr[k] = 0 then
+ tfmitalcorr[k] := -29985
+ else
+ tfmitalcorr[k] := sortin(tfmitalcorr[k]);
+ ni := skimp(63) + 1;
+ dimenhead[4] := mem[29999].hh.rh;
+ if perturbation >= 4096 then
+ tfmwarning(23) {:1126}; {1134:}
+ if jobname = 0 then
+ openlogfile;
+ packjobname(901);
+ while not bopenout(tfmfile, nameoffile) do
+ promptfilename(902, 901);
+ metricfilename := bmakenamestring(tfmfile); {1135:}
+ k := headersize;
+ while headerbyte[k] < 0 do
+ k := k - 1;
+ lh := (k + 3) div 4;
+ if bc > ec then
+ bc := 1;
+ bwrite2bytes(tfmfile, (((((((((6 + lh) + ((ec - bc) + 1)) + nw) + nh) + nd) + ni) + nl) + nk) + ne) + np);
+ bwrite2bytes(tfmfile, lh);
+ bwrite2bytes(tfmfile, bc);
+ bwrite2bytes(tfmfile, ec);
+ bwrite2bytes(tfmfile, nw);
+ bwrite2bytes(tfmfile, nh);
+ bwrite2bytes(tfmfile, nd);
+ bwrite2bytes(tfmfile, ni);
+ bwrite2bytes(tfmfile, nl);
+ bwrite2bytes(tfmfile, nk);
+ bwrite2bytes(tfmfile, ne);
+ bwrite2bytes(tfmfile, np);
+ for k := 1 to 4 * lh do begin
+ if headerbyte[k] < 0 then
+ headerbyte[k] := 0;
+ bwritebyte(tfmfile, headerbyte[k])
+ end {:1135}; {1137:}
+ for k := bc to ec do
+ if not charexists[k] then
+ bwrite4bytes(tfmfile, 0)
+ else begin
+ bwritebyte(tfmfile, mem[tfmwidth[k]].hh.lh);
+ bwritebyte(tfmfile, (mem[tfmheight[k]].hh.lh * 16) + mem[tfmdepth[k]].hh.lh);
+ bwritebyte(tfmfile, (mem[tfmitalcorr[k]].hh.lh * 4) + chartag[k]);
+ bwritebyte(tfmfile, charremainder[k])
+ end {:1137}; {1138:}
+ tfmchanged := 0;
+ for k := 1 to 4 do begin
+ bwrite4bytes(tfmfile, 0);
+ p := dimenhead[k];
+ while p <> (-29981) do begin
+ bwrite4bytes(tfmfile, dimenout(mem[p + 1].int));
+ p := mem[p].hh.rh
+ end
+ end {:1138}; {1139:}
+ for k := 0 to nl - 1 do
+ tfmqqqq(ligkern[k]);
+ for k := 0 to nk - 1 do
+ bwrite4bytes(tfmfile, dimenout(kern[k])) {:1139};
+{1140:}
+ for k := 0 to ne - 1 do
+ tfmqqqq(exten[k]) {:1140}; {1141:}
+ for k := 1 to np do
+ if k = 1 then
+ if abs(param[1]) < 134217728 then
+ bwrite4bytes(tfmfile, param[1] * 16)
+ else begin
+ tfmchanged := tfmchanged + 1;
+ if param[1] > 0 then
+ bwrite4bytes(tfmfile, 2147483647)
+ else
+ bwrite4bytes(tfmfile, -2147483647)
+ end
+ else
+ bwrite4bytes(tfmfile, dimenout(param[k]));
+ if tfmchanged > 0 then begin
+ if tfmchanged = 1 then
+ printnl(904)
+ else begin
+ printnl(40);
+ printint(tfmchanged);
+ print(905)
+ end;
+ print(906)
+ end {:1141};
+{if internal[12]>0 then[1136:]begin writeln(logfile,' ');
+writeln(logfile,'(You used ',nw:1,'w,',nh:1,'h,',nd:1,'d,',ni:1,'i,',nl:
+1,'l,',nk:1,'k,',ne:1,'e,',np:1,'p metric file positions');
+writeln(logfile,' out of ','256w,16h,16d,64i,',ligtablesize:1,
+'l,256k,256e,',maxfontdimen:1,'p)');end[:1136];}
+ printnl(903);
+ print(metricfilename);
+ bclose(tfmfile) {:1134}
+ end;
+ if gfprevptr > 0 then begin {1182:}
+ begin
+ gfbuf[gfptr] := 248;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ gffour(gfprevptr);
+ gfprevptr := (gfoffset + gfptr) - 5;
+ gffour(internal[26] * 16);
+ for k := 1 to 4 do begin
+ gfbuf[gfptr] := headerbyte[k];
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ gffour(internal[27]);
+ gffour(internal[28]);
+ gffour(gfminm);
+ gffour(gfmaxm);
+ gffour(gfminn);
+ gffour(gfmaxn);
+ for k := 0 to 255 do
+ if charexists[k] then begin
+ x := gfdx[k] div 65536;
+ if (((gfdy[k] = 0) and (x >= 0)) and (x < 256)) and (gfdx[k] = (x * 65536)) then begin
+ begin
+ gfbuf[gfptr] := 246;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := k;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := x;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end
+ end else begin
+ begin
+ gfbuf[gfptr] := 245;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ begin
+ gfbuf[gfptr] := k;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ gffour(gfdx[k]);
+ gffour(gfdy[k])
+ end;
+ x := mem[tfmwidth[k] + 1].int;
+ if abs(x) > maxtfmdimen then
+ if x > 0 then
+ x := 16777215
+ else
+ x := -16777215
+ else
+ x := makescaled(x * 16, internal[26]);
+ gffour(x);
+ gffour(charptr[k])
+ end;
+ begin
+ gfbuf[gfptr] := 249;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ gffour(gfprevptr);
+ begin
+ gfbuf[gfptr] := 131;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ k := 4 + ((gfbufsize - gfptr) mod 4);
+ while k > 0 do begin
+ begin
+ gfbuf[gfptr] := 223;
+ gfptr := gfptr + 1;
+ if gfptr = gflimit then
+ gfswap
+ end;
+ k := k - 1
+ end; {1156:}
+ if gflimit = halfbuf then
+ bwritebuf(gffile, gfbuf, halfbuf, gfbufsize - 1);
+ if gfptr > 0 then
+ bwritebuf(gffile, gfbuf, 0, gfptr - 1) {:1156};
+ printnl(917);
+ print(outputfilename);
+ print(425);
+ printint(totalchars);
+ print(918);
+ if totalchars <> 1 then
+ printchar(115);
+ print(919);
+ printint(gfoffset + gfptr);
+ print(920);
+ bclose(gffile)
+ end {:1182}
+ end {:1206};
+ if jobname > 0 then begin
+ writeln(logfile);
+ aclose(logfile);
+ selector := selector - 2;
+ if selector = 1 then begin
+ printnl(929);
+ print(logname);
+ printchar(46)
+ end
+ end;
+ println;
+ if (editnamestart <> 0) and (interaction > 0) then
+ calledit(strpool[editnamestart], editnamelength, editline)
+ end; {:1205} {1209:}
+
+ procedure finalcleanup;
+ label
+ 10;
+ var
+ c: smallnumber;
+ begin
+ c := curmod;
+ if jobname = 0 then
+ openlogfile;
+ while condptr <> (-30000) do begin
+ printnl(930);
+ printcmdmod(2, curif);
+ if ifline <> 0 then begin
+ print(931);
+ printint(ifline)
+ end;
+ print(932);
+ ifline := mem[condptr + 1].int;
+ curif := mem[condptr].hh.b1;
+ condptr := mem[condptr].hh.rh
+ end;
+ if history <> 0 then
+ if (history = 1) or (interaction < 3) then
+ if selector = 3 then begin
+ selector := 1;
+ printnl(933);
+ selector := 3
+ end;
+ if c = 1 then begin {storebasefile;goto 10;}
+ printnl(934);
+ goto 10
+ end;
+ 10:
+ null
+ end; {:1209} {1210:}
+ {procedure initprim;begin[192:]primitive(280,40,1);
+ primitive(281,40,2);primitive(282,40,3);primitive(283,40,4);
+ primitive(284,40,5);primitive(285,40,6);primitive(286,40,7);
+ primitive(287,40,8);primitive(288,40,9);primitive(289,40,10);
+ primitive(290,40,11);primitive(291,40,12);primitive(292,40,13);
+ primitive(293,40,14);primitive(294,40,15);primitive(295,40,16);
+ primitive(296,40,17);primitive(297,40,18);primitive(298,40,19);
+ primitive(299,40,20);primitive(300,40,21);primitive(301,40,22);
+ primitive(302,40,23);primitive(303,40,24);primitive(304,40,25);
+ primitive(305,40,26);primitive(306,40,27);primitive(307,40,28);
+ primitive(308,40,29);primitive(309,40,30);primitive(310,40,31);
+ primitive(311,40,32);primitive(312,40,33);primitive(313,40,34);
+ primitive(314,40,35);primitive(315,40,36);primitive(316,40,37);
+ primitive(317,40,38);primitive(318,40,39);primitive(319,40,40);
+ [:192][211:]primitive(279,47,0);primitive(91,63,0);
+ eqtb[2232]:=eqtb[cursym];primitive(93,64,0);primitive(125,65,0);
+ primitive(123,46,0);primitive(58,78,0);eqtb[2234]:=eqtb[cursym];
+ primitive(329,77,0);primitive(44,79,0);primitive(59,80,0);
+ eqtb[2235]:=eqtb[cursym];primitive(92,7,0);primitive(330,18,0);
+ primitive(331,72,0);primitive(332,59,0);primitive(333,32,0);
+ bgloc:=cursym;primitive(334,57,0);primitive(335,19,0);
+ primitive(336,60,0);primitive(337,27,0);primitive(338,11,0);
+ primitive(323,81,0);eqtb[2239]:=eqtb[cursym];egloc:=cursym;
+ primitive(339,26,0);primitive(340,6,0);primitive(341,9,0);
+ primitive(342,70,0);primitive(343,73,0);primitive(344,13,0);
+ primitive(345,14,0);primitive(346,15,0);primitive(347,69,0);
+ primitive(348,28,0);primitive(349,24,0);primitive(350,12,0);
+ primitive(351,8,0);primitive(352,17,0);primitive(353,74,0);
+ primitive(354,35,0);primitive(355,58,0);primitive(356,71,0);
+ primitive(357,75,0);[:211][683:]primitive(520,16,1);primitive(521,16,2);
+ primitive(522,16,53);primitive(523,16,44);primitive(524,16,49);
+ primitive(324,16,0);eqtb[2237]:=eqtb[cursym];primitive(525,4,2242);
+ primitive(526,4,2392);primitive(527,4,1);primitive(325,4,0);
+ eqtb[2236]:=eqtb[cursym];[:683][688:]primitive(528,61,0);
+ primitive(529,61,1);primitive(64,61,2);primitive(530,61,3);
+ [:688][695:]primitive(541,56,2242);primitive(542,56,2392);
+ primitive(543,56,2542);primitive(544,56,1);primitive(545,56,2);
+ primitive(546,56,3);[:695][709:]primitive(556,3,0);primitive(482,3,1);
+ [:709][740:]primitive(583,1,1);primitive(322,2,2);
+ eqtb[2238]:=eqtb[cursym];primitive(584,2,3);primitive(585,2,4);
+ [:740][893:]primitive(218,33,30);primitive(219,33,31);
+ primitive(220,33,32);primitive(221,33,33);primitive(222,33,34);
+ primitive(223,33,35);primitive(224,33,36);primitive(225,33,37);
+ primitive(226,34,38);primitive(227,34,39);primitive(228,34,40);
+ primitive(229,34,41);primitive(230,34,42);primitive(231,34,43);
+ primitive(232,34,44);primitive(233,34,45);primitive(234,34,46);
+ primitive(235,34,47);primitive(236,34,48);primitive(237,34,49);
+ primitive(238,34,50);primitive(239,34,51);primitive(240,34,52);
+ primitive(241,34,53);primitive(242,34,54);primitive(243,34,55);
+ primitive(244,34,56);primitive(245,34,57);primitive(246,34,58);
+ primitive(247,34,59);primitive(248,34,60);primitive(249,34,61);
+ primitive(250,34,62);primitive(251,34,63);primitive(252,34,64);
+ primitive(253,34,65);primitive(254,34,66);primitive(255,34,67);
+ primitive(256,36,68);primitive(43,43,69);primitive(45,43,70);
+ primitive(42,55,71);primitive(47,54,72);eqtb[2233]:=eqtb[cursym];
+ primitive(257,45,73);primitive(181,45,74);primitive(259,52,76);
+ primitive(258,45,75);primitive(60,50,77);primitive(260,50,78);
+ primitive(62,50,79);primitive(261,50,80);primitive(61,51,81);
+ primitive(262,50,82);primitive(272,37,94);primitive(273,37,95);
+ primitive(274,37,96);primitive(275,37,97);primitive(276,37,98);
+ primitive(277,37,99);primitive(278,37,100);primitive(38,48,83);
+ primitive(263,55,84);primitive(264,55,85);primitive(265,55,86);
+ primitive(266,55,87);primitive(267,55,88);primitive(268,55,89);
+ primitive(269,55,90);primitive(270,55,91);primitive(271,45,92);
+ [:893][1013:]primitive(211,30,15);primitive(197,30,4);
+ primitive(195,30,2);primitive(202,30,9);primitive(199,30,6);
+ primitive(204,30,11);primitive(206,30,13);primitive(207,30,14);
+ [:1013][1018:]primitive(776,82,0);primitive(777,82,1);
+ [:1018][1024:]primitive(143,23,0);primitive(144,23,1);
+ primitive(145,23,2);primitive(783,23,3);
+ [:1024][1027:]primitive(784,21,0);primitive(785,21,1);
+ [:1027][1037:]primitive(799,22,0);primitive(800,22,1);
+ primitive(801,22,2);primitive(802,22,3);primitive(803,22,4);
+ [:1037][1052:]primitive(820,68,1);primitive(821,68,0);
+ primitive(822,68,2);primitive(823,66,6);primitive(824,66,16);
+ primitive(825,67,0);primitive(826,67,1);
+ [:1052][1079:]primitive(856,25,0);primitive(857,25,1);
+ primitive(858,25,2);[:1079][1101:]primitive(868,20,0);
+ primitive(869,20,1);primitive(870,20,2);primitive(871,20,3);
+ primitive(872,20,4);[:1101][1109:]primitive(889,76,0);
+ primitive(890,76,128);[:1109][1176:]primitive(912,29,4);
+ primitive(913,29,16);[:1176];end;procedure inittab;var k:integer;
+ begin[176:]rover:=-29977;mem[rover].hh.rh:=32767;mem[rover].hh.lh:=1000;
+ mem[rover+1].hh.lh:=rover;mem[rover+1].hh.rh:=rover;
+ lomemmax:=rover+1000;mem[lomemmax].hh.rh:=-30000;
+ mem[lomemmax].hh.lh:=-30000;
+ for k:=29998 to 30000 do mem[k]:=mem[lomemmax];avail:=-30000;
+ memend:=30000;himemmin:=29998;varused:=23;dynused:=-1;
+ [:176][193:]intname[1]:=280;intname[2]:=281;intname[3]:=282;
+ intname[4]:=283;intname[5]:=284;intname[6]:=285;intname[7]:=286;
+ intname[8]:=287;intname[9]:=288;intname[10]:=289;intname[11]:=290;
+ intname[12]:=291;intname[13]:=292;intname[14]:=293;intname[15]:=294;
+ intname[16]:=295;intname[17]:=296;intname[18]:=297;intname[19]:=298;
+ intname[20]:=299;intname[21]:=300;intname[22]:=301;intname[23]:=302;
+ intname[24]:=303;intname[25]:=304;intname[26]:=305;intname[27]:=306;
+ intname[28]:=307;intname[29]:=308;intname[30]:=309;intname[31]:=310;
+ intname[32]:=311;intname[33]:=312;intname[34]:=313;intname[35]:=314;
+ intname[36]:=315;intname[37]:=316;intname[38]:=317;intname[39]:=318;
+ intname[40]:=319;[:193][203:]hashused:=2229;stcount:=0;
+ hash[2240].rh:=321;hash[2238].rh:=322;hash[2239].rh:=323;
+ hash[2237].rh:=324;hash[2236].rh:=325;hash[2235].rh:=59;
+ hash[2234].rh:=58;hash[2233].rh:=47;hash[2232].rh:=91;hash[2231].rh:=41;
+ hash[2229].rh:=326;eqtb[2231].lh:=62;
+ [:203][229:]mem[-29981].hh.lh:=2242;mem[-29981].hh.rh:=-30000;
+ [:229][324:]mem[30000].hh.lh:=32767;
+ [:324][475:]mem[-29997].hh.lh:=-30000;mem[-29997].hh.rh:=-30000;
+ mem[-29996].hh.lh:=1;mem[-29996].hh.rh:=-30000;
+ for k:=-29995 to-29989 do mem[k]:=mem[-29996];mem[-29988].int:=0;
+ mem[-30000].hh.rh:=-30000;mem[-30000].hh.lh:=-30000;mem[-29999].int:=0;
+ mem[-29998].int:=0;[:475][587:]serialno:=0;mem[-29987].hh.rh:=-29987;
+ mem[-29986].hh.lh:=-29987;mem[-29987].hh.lh:=-30000;
+ mem[-29986].hh.rh:=-30000;[:587][702:]mem[-29979].hh.b1:=0;
+ mem[-29979].hh.rh:=2240;eqtb[2240].rh:=-29979;eqtb[2240].lh:=41;
+ [:702][759:]eqtb[2230].lh:=88;hash[2230].rh:=600;
+ [:759][911:]mem[-29983].hh.b1:=11;
+ [:911][1116:]mem[-29980].int:=1073741824;
+ [:1116][1127:]mem[-29984].int:=0;mem[-29985].hh.lh:=0;
+ [:1127][1185:]baseident:=921;[:1185]end;}
+{:1210}
+{1212:}
+{procedure debughelp;label 888,10;var k,l,m,n:integer;
+begin while true do begin;printnl(935);flush(output);read(input,m);
+if m<0 then goto 10 else if m=0 then begin goto 888;
+888:m:=0;
+['BREAKPOINT']
+end else begin read(input,n);case m of[1213:]1:printword(mem[n]);
+2:printint(mem[n].hh.lh);3:printint(mem[n].hh.rh);
+4:begin printint(eqtb[n].lh);printchar(58);printint(eqtb[n].rh);end;
+5:printvariablename(n);6:printint(internal[n]);7:doshowdependencies;
+9:showtokenlist(n,-30000,100000,0);10:print(n);11:checkmem(n>0);
+12:searchmem(n);13:begin read(input,l);printcmdmod(n,l);end;
+14:for k:=0 to n do print(buffer[k]);15:panicking:=not panicking;
+[:1213]others:print(63)end;end;end;10:end;}
+{:1212}
+{:1202}
+{1204:}
+
+begin
+{-----------------------------------}
+ init_ps(psfile);
+{-----------------------------------}
+ history := 3;
+ setpaths;
+ if readyalready = 314159 then
+ goto 1; {14:}
+ bad := 0;
+ if (halferrorline < 30) or (halferrorline > (errorline - 15)) then
+ bad := 1;
+ if maxprintline < 60 then
+ bad := 2;
+ if (gfbufsize mod 8) <> 0 then
+ bad := 3;
+ if (-28900) > 30000 then
+ bad := 4;
+ if 1777 > 2100 then
+ bad := 5;
+ if (headersize mod 4) <> 0 then
+ bad := 6; {:14} {154:}
+{if memmax<>30000 then bad:=10;}
+ if memmax < 30000 then
+ bad := 10;
+ if ((-128) > 0) or (127 < 127) then
+ bad := 11;
+ if ((-32768) > 0) or (32767 < 32767) then
+ bad := 12;
+ if ((-128) < (-32768)) or (127 > 32767) then
+ bad := 13;
+ if ((-30000) < (-32768)) or (memmax >= 32767) then
+ bad := 14;
+ if maxstrings > 32767 then
+ bad := 15;
+ if bufsize > 32767 then
+ bad := 16;
+ if (255 < 255) or (65535 < 65535) then
+ bad := 17; {:154} {204:}
+ if (2241 + maxinternal) > 32767 then
+ bad := 21; {:204} {214:}
+ if 2692 > 32767 then
+ bad := 22; {:214} {310:}
+ if (15 * 11) > bistacksize then
+ bad := 31; {:310} {553:}
+ if (20 + (17 * 45)) > bistacksize then
+ bad := 32; {:553} {777:}
+ if 10 > filenamesize then
+ bad := 41; {:777}
+ if bad > 0 then begin
+ writeln(output, 'Ouch---my internal constants have been clobbered!', '---case ', bad: 1);
+ {if not getstringsstarted then goto 9999;
+ inittab;initprim;}
+ goto 9999
+ end;
+ initialize;
+ readyalready := 314159;
+1: {55:}
+ selector := 1;
+ tally := 0;
+ termoffset := 0;
+ fileoffset := 0; {:55} {61:}
+ write(output, 'This is METAFONT, Version 1.0 for Berkeley UNIX');
+ {-----------------------------------------------------------------}
+ writeln(output);
+ writeln(output,'*** embedded METAFONT to PostScript Compiler ***');
+ {-----------------------------------------------------------------}
+ if baseident = 0 then
+ writeln(output, ' (no base preloaded)')
+ else begin
+ print(baseident);
+ println
+ end;
+ flush(output); {:61} {783:}
+ jobname := 0; {:783}
+{792:}
+ outputfilename := 0; {:792} {1211:} {657:}
+ begin
+ begin
+ inputptr := 0;
+ maxinstack := 0;
+ inopen := 0;
+ maxbufstack := 0;
+ paramptr := 0;
+ maxparamstack := 0;
+ first := 1;
+ curinput.startfield := 1;
+ curinput.indexfield := 0;
+ line := 0;
+ curinput.namefield := 0;
+ forceeof := false;
+ if not initterminal then
+ goto 9999;
+ curinput.limitfield := last;
+ first := last + 1
+ end; {:657} {660:}
+ scannerstatus := 0; {:660}
+ if (baseident = 0) or (buffer[curinput.locfield] = 38) then begin
+ if baseident <> 0 then
+ initialize;
+ if not openbasefile then
+ goto 9999;
+ if not loadbasefile then begin
+ wclose(basefile);
+ goto 9999
+ end;
+ wclose(basefile);
+ while (curinput.locfield < curinput.limitfield) and (buffer[curinput.locfield] = 32) do
+ curinput.locfield := curinput.locfield + 1
+ end;
+ buffer[curinput.limitfield] := 37;
+ fixdateandtime;
+ initrandoms((internal[17] div 65536) + internal[16]); {70:}
+ if interaction = 0 then
+ selector := 0
+ else
+ selector := 1 {:70};
+ if curinput.locfield < curinput.limitfield then
+ if buffer[curinput.locfield] <> 92 then
+ startinput
+ end {:1211};
+ initstrptr := strptr;
+ initpoolptr := poolptr;
+ maxstrptr := strptr;
+ maxpoolptr := poolptr;
+ history := 0;
+ if startsym > 0 then begin
+ cursym := startsym;
+ backinput
+ end;
+ maincontrol;
+ finalcleanup;
+9998:
+ closefilesandtermina;
+9999:
+ readyalready := 0;
+{---------------------------------}
+tini_ps(g);
+{---------------------------------}
+ if (history <> 0) and (history <> 1) then
+ exit(1)
+ else
+ exit(0);
+end. {:1204}
+
diff --git a/fonts/utilities/mf2ps/mf2ps/mf_ext.h b/fonts/utilities/mf2ps/mf2ps/mf_ext.h
new file mode 100644
index 0000000000..a875583488
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/mf_ext.h
@@ -0,0 +1,54 @@
+{ $Header: mf_ext.h,v 1.0 86/01/31 16:42:56 richards Released $ }
+
+{ declarations for external C assist routines for MetaFont }
+
+procedure exit(x : integer);
+ external;
+
+procedure closea(var f:text);
+ external;
+
+procedure closew(var f:wordfile);
+ external;
+
+procedure dateandtime(var minutes, day, month, year : integer);
+ external;
+
+procedure setpaths;
+ external;
+
+function testaccess(var nameoffile, realnameoffile: UNIXfilename;
+ accessmode:integer; filepath:integer): boolean;
+ external;
+
+procedure calledit(var filename: ASCIIcode; fnlength, linenumber: integer);
+ external;
+
+function bopenout(var f: bytefile; var name: UNIXfilename): boolean;
+ external;
+
+procedure bclose(var f: bytefile);
+ external;
+
+procedure bgetname(var f: bytefile; var name: UNIXfilename);
+ external;
+
+procedure bwritebuf(var f: bytefile; var buf: gfbuftype;
+ first, last: integer);
+ external;
+
+procedure bwritebyte(var f: bytefile; b: integer);
+ external;
+
+procedure bwrite2bytes(var f: bytefile; b: integer);
+ external;
+
+procedure bwrite4bytes(var f: bytefile; b: integer);
+ external;
+
+function makefraction(p, q: integer): fraction;
+ external;
+
+function takefraction(q: integer; f: fraction): integer;
+ external;
+
diff --git a/fonts/utilities/mf2ps/mf2ps/mf_window.h b/fonts/utilities/mf2ps/mf2ps/mf_window.h
new file mode 100644
index 0000000000..761cf006c9
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/mf_window.h
@@ -0,0 +1,15 @@
+{ $Header: mf_window.h,v 0.999999 86/01/13 00:43:56 richards Released $ }
+
+{ External procedures for UNIX MetaFont VIRMF for display graphics }
+
+function initscreen: boolean;
+ external;
+
+procedure updatescreen;
+ external;
+
+procedure blankrectangle(leftcol, rightcol: screencol; toprow, botrow: screenrow);
+ external;
+
+procedure paintrow(r: screenrow; b: pixelcolor; var a: transspec; n: screencol);
+ external;
diff --git a/fonts/utilities/mf2ps/mf2ps/uncompressing/README b/fonts/utilities/mf2ps/mf2ps/uncompressing/README
new file mode 100644
index 0000000000..b7f9e732c4
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/uncompressing/README
@@ -0,0 +1,3 @@
+These are the versions of the modules that did not apply the compression
+in which commands are made single letters and all non-first commands
+are made relative rather than absolute
diff --git a/fonts/utilities/mf2ps/mf2ps/uncompressing/mf2ps1.p b/fonts/utilities/mf2ps/mf2ps/uncompressing/mf2ps1.p
new file mode 100644
index 0000000000..f5e4ac033a
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/uncompressing/mf2ps1.p
@@ -0,0 +1,95 @@
+#include "mf2ps1.h" {contain the declarations}
+#include "mf2ps2.h" {contain external for send_p_s}
+
+procedure unskew;
+ begin
+ case octant of
+ 1:
+ begin
+ curx := x + y;
+ cury := y
+ end;
+ 5:
+ begin
+ curx := y;
+ cury := x + y
+ end;
+ 6:
+ begin
+ curx := -y;
+ cury := x + y
+ end;
+ 2:
+ begin
+ curx := (-x) - y;
+ cury := y
+ end;
+ 4:
+ begin
+ curx := (-x) - y;
+ cury := -y
+ end;
+ 8:
+ begin
+ curx := -y;
+ cury := (-x) - y
+ end;
+ 7:
+ begin
+ curx := y;
+ cury := (-x) - y
+ end;
+ 3:
+ begin
+ curx := x + y;
+ cury := -y
+ end
+ end
+end; { unskew }
+{:388}
+ {473:}
+
+procedure sendcurve;
+{ unskews the values and sends a curve to be proccessed by
+ send_p_s procedure. }
+var tmpx,tmpy:scaled;
+ x0s,y0s,x1s,y1s,x2s,y2s,x3s,y3s:integer;
+begin
+ tmpx := curx;
+ tmpy := cury;
+ unskew(x0,y0,octant);
+ x0s := curx;
+ y0s := cury;
+ unskew(x1,y1,octant);
+ x1s := curx;
+ y1s := cury;
+ unskew(x2,y2,octant);
+ x2s := curx;
+ y2s := cury;
+ unskew(x3,y3,octant);
+ x3s := curx;
+ y3s := cury;
+ curx := tmpx;
+ cury := tmpy;
+ send_p_s(x0s,y0s,x1s,y1s,x2s,y2s,x3s,y3s);
+end;
+
+procedure sendline;
+{ unskews the values and sends a line to be proccessed by
+ send_p_s procedure. }
+var tmpx,tmpy:scaled;
+ x0s,y0s,x1s,y1s:integer;
+begin
+ tmpx := curx;
+ tmpy := cury;
+ unskew(x0,y0,octant);
+ x0s := curx;
+ y0s := cury;
+ unskew(x1,y1,octant);
+ x1s := curx;
+ y1s := cury;
+ if (LineSource = 510)
+ or (LineSource = 515)
+ or (LineSource = 521)
+ then send_p_s(x0s,y0s,x1s,y1s,0,0,0,0);
+end;
diff --git a/fonts/utilities/mf2ps/mf2ps/uncompressing/mf2ps2.p b/fonts/utilities/mf2ps/mf2ps/uncompressing/mf2ps2.p
new file mode 100644
index 0000000000..4b12b0f593
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/uncompressing/mf2ps2.p
@@ -0,0 +1,117 @@
+#include "mf2ps1.h"
+#include "mf2ps2.h"
+
+
+function ok (x,y : real):boolean;
+{ gives back true if direction is kept by x,y values }
+begin
+ if direction = 'h' then
+ if x = lastx3 then ok := true
+ else ok := false
+ else if direction = 'v' then
+ if y = lasty3 then ok := true
+ else ok := false
+ else ok := false;
+end;
+
+procedure restore (x,y : real);
+{ kepps direction, if dealing with lines and last point values
+ for optimaztion on vertical and horizontal lines. }
+begin
+ if x = lastx3 then direction := 'h'
+ else if y = lasty3 then direction := 'v'
+ else direction := 'm';
+ lastx3 := x;
+ lasty3 := y;
+ lastwasline := true;
+end;
+
+procedure recall;
+{ taking values from the buffer. }
+begin
+ writeln(psfile,lastx3:6:0,lasty3:6:0,' lineto@');
+ lastwasline := false;
+end;
+
+
+function us(n: scaled;c:char): real;
+{ gets a number which every unit of it is 2 in the 16 power
+ and changes it to normal units.
+ in addition scales and transforms the number in order to
+ use it in PostScript dictionary.
+ it is also determining the bounding box. }
+const s = 2; { Scale & Translate before sending to PostScript file }
+ t = 180;
+var tmp : real;
+begin
+ tmp := trunc(n/65536)*s+t;
+ us := tmp;
+ if (c = 'x') and (tmp <> t) then
+ begin
+ if tmp>maxbox[x] then maxbox[x] := tmp
+ else if tmp<minbox[x] then minbox[x] := tmp;
+ if tmp>lmax_x then lmax_x := tmp
+ else if tmp<lmin_x then lmin_x := tmp;
+ end
+ else if tmp>maxbox[y] then maxbox[y] := tmp
+ else if tmp<minbox[y] then minbox[y] := tmp;
+end; { unscaled }
+
+
+procedure send_p_s;
+{ creates the PostScript file, by sending lines and curves,
+ using the optimization ability on lines. }
+var x0_,x1_,x2_,x3_,y0_,y1_,y2_,y3_:real;
+begin
+ x0_ := us(x0,'x');
+ x1_ := us(x1,'x');
+ x2_ := us(x2,'x');
+ x3_ := us(x3,'x');
+ y0_ := us(y0,'y');
+ y1_ := us(y1,'y');
+ y2_ := us(y2,'y');
+ y3_ := us(y3,'y');
+
+ if (x0_<>lastx0) or (y0_<>lasty0) then
+ begin
+ if new then
+ begin
+ writeln(psfile,x0_:6:0,y0_:6:0,' moveto@');
+ new := false;
+ lastwasline := false;
+ lastx3 := x0_; lasty3 := y0_;
+ end
+ else begin
+ if (lastwasline) and (not ok(x0_,y0_)) then recall;
+ restore(x0_,y0_);
+ end;
+ end;
+ if (x3=0) and (x2=0) and (y3=0) and (y2=0) then { line }
+ begin
+ if (x0_<>x1_) or (y0_<>y1_) then
+ begin
+ if (lastwasline) and (not ok(x1_,y1_)) then recall;
+ restore(x1_,y1_);
+ end;
+ lastx0 := x1_; lasty0 := y1_;
+ end
+ else begin
+ if ((x0_=x1_) and (x1_=x2_) and (x2_=x3_)) or
+ ((y0_=y1_) and (y1_=y2_) and (y2_=y3_)) then
+ begin
+ if (x0_<>x3_) or (y0_<>y3_) then
+ begin
+ if (lastwasline) and (not ok(x3_,y3_)) then recall;
+ restore(x3_,y3_);
+ end;
+ end
+ else begin
+ if lastwasline then recall;
+ writeln(psfile,x1_:6:0,y1_:6:0,x2_:6:0,y2_:6:0,x3_:6:0,y3_:6:0,' curveto@');
+ lastx3 := x3_; lasty3 := y3_;
+ end;
+ lastx0 := x3_; lasty0 := y3_;
+ end; { else curve }
+end; { send_p_s }
+
+
diff --git a/fonts/utilities/mf2ps/mf2ps/uncompressing/mf2ps3.p b/fonts/utilities/mf2ps/mf2ps/uncompressing/mf2ps3.p
new file mode 100644
index 0000000000..324fac33fd
--- /dev/null
+++ b/fonts/utilities/mf2ps/mf2ps/uncompressing/mf2ps3.p
@@ -0,0 +1,649 @@
+#include "mf2ps1.h"
+#include "mf2ps2.h"
+
+ procedure makemoves;
+ label
+ 22, 30, 10;
+ var
+ x1, x2, x3, m, r, y1, y2, y3, n, s, l: integer;
+ q, t, u, x2a, x3a, y2a, y3a: integer;
+ begin
+ {---------------------------------------------------------}
+ if (CurveSource=465) { from fillspec - no offset }
+ or (CurveSource=512) { from fillenvelope - with offset }
+ or (CurveSource=518) { -------- " -------- }
+ then
+ sendcurve(xx0,xx1,xx2,xx3,yy0,yy1,yy2,yy3,oc);
+ {---------------------------------------------------------}
+ if (xx3 < xx0) or (yy3 < yy0) then
+ confusion(109);
+ l := 16;
+ bisectptr := 0;
+ x1 := xx1 - xx0;
+ x2 := xx2 - xx1;
+ x3 := xx3 - xx2;
+ if xx0 >= xicorr then
+ r := (xx0 - xicorr) mod 65536
+ else
+ r := 65535 - ((((-xx0) + xicorr) - 1) mod 65536);
+ m := ((xx3 - xx0) + r) div 65536;
+ y1 := yy1 - yy0;
+ y2 := yy2 - yy1;
+ y3 := yy3 - yy2;
+ if yy0 >= etacorr then
+ s := (yy0 - etacorr) mod 65536
+ else
+ s := 65535 - ((((-yy0) + etacorr) - 1) mod 65536);
+ n := ((yy3 - yy0) + s) div 65536;
+ if ((xx3 - xx0) >= 268435456) or ((yy3 - yy0) >= 268435456) then begin {313:}
+ x1 := (x1 + xicorr) div 2;
+ x2 := (x2 + xicorr) div 2;
+ x3 := (x3 + xicorr) div 2;
+ r := (r + xicorr) div 2;
+ y1 := (y1 + etacorr) div 2;
+ y2 := (y2 + etacorr) div 2;
+ y3 := (y3 + etacorr) div 2;
+ s := (s + etacorr) div 2;
+ l := 15
+ end {:313};
+ while true do begin
+ 22: {314:}
+ if m = 0 then {315:}
+ while n > 0 do begin
+ moveptr := moveptr + 1;
+ move[moveptr] := 1;
+ n := n - 1
+ end {:315}
+ else if n = 0 then {316:}
+ move[moveptr] := move[moveptr] + m {:316}
+ else if (m + n) = 2 then begin {317:}
+ r := twotothe[l] - r;
+ s := twotothe[l] - s;
+ while l < 30 do begin
+ x3a := x3;
+ x2a := ((x2 + x3) + xicorr) div 2;
+ x2 := ((x1 + x2) + xicorr) div 2;
+ x3 := ((x2 + x2a) + xicorr) div 2;
+ t := (x1 + x2) + x3;
+ r := (r + r) - xicorr;
+ y3a := y3;
+ y2a := ((y2 + y3) + etacorr) div 2;
+ y2 := ((y1 + y2) + etacorr) div 2;
+ y3 := ((y2 + y2a) + etacorr) div 2;
+ u := (y1 + y2) + y3;
+ s := (s + s) - etacorr;
+ if t < r then
+ if u < s then begin {318:}
+ x1 := x3;
+ x2 := x2a;
+ x3 := x3a;
+ r := r - t;
+ y1 := y3;
+ y2 := y2a;
+ y3 := y3a;
+ s := s - u
+ end else begin {:318} {320:}
+ begin
+ moveptr := moveptr + 1;
+ move[moveptr] := 2
+ end {:320};
+ goto 30
+ end
+ else if u < s then begin {319:}
+ begin
+ move[moveptr] := move[moveptr] + 1;
+ moveptr := moveptr + 1;
+ move[moveptr] := 1
+ end {:319};
+ goto 30
+ end;
+ l := l + 1
+ end;
+ r := r - xicorr;
+ s := s - etacorr;
+ if (abvscd((x1 + x2) + x3, s, (y1 + y2) + y3, r) - xicorr) >= 0 then begin {319:}
+ move[moveptr] := move[moveptr] + 1;
+ moveptr := moveptr + 1;
+ move[moveptr] := 1
+ end else begin {:319} {320:}
+ moveptr := moveptr + 1;
+ move[moveptr] := 2
+ end {:320};
+ 30: {:317}
+ null
+ end else begin
+ l := l + 1;
+ bisectstack[bisectptr + 10] := l;
+ bisectstack[bisectptr + 2] := x3;
+ bisectstack[bisectptr + 1] := ((x2 + x3) + xicorr) div 2;
+ x2 := ((x1 + x2) + xicorr) div 2;
+ x3 := ((x2 + bisectstack[bisectptr + 1]) + xicorr) div 2;
+ bisectstack[bisectptr] := x3;
+ r := (r + r) + xicorr;
+ t := ((x1 + x2) + x3) + r;
+ q := t div twotothe[l];
+ bisectstack[bisectptr + 3] := t mod twotothe[l];
+ bisectstack[bisectptr + 4] := m - q;
+ m := q;
+ bisectstack[bisectptr + 7] := y3;
+ bisectstack[bisectptr + 6] := ((y2 + y3) + etacorr) div 2;
+ y2 := ((y1 + y2) + etacorr) div 2;
+ y3 := ((y2 + bisectstack[bisectptr + 6]) + etacorr) div 2;
+ bisectstack[bisectptr + 5] := y3;
+ s := (s + s) + etacorr;
+ u := ((y1 + y2) + y3) + s;
+ q := u div twotothe[l];
+ bisectstack[bisectptr + 8] := u mod twotothe[l];
+ bisectstack[bisectptr + 9] := n - q;
+ n := q;
+ bisectptr := bisectptr + 11;
+ goto 22
+ end {:314};
+ if bisectptr = 0 then
+ goto 10; {312:}
+ bisectptr := bisectptr - 11;
+ x1 := bisectstack[bisectptr];
+ x2 := bisectstack[bisectptr + 1];
+ x3 := bisectstack[bisectptr + 2];
+ r := bisectstack[bisectptr + 3];
+ m := bisectstack[bisectptr + 4];
+ y1 := bisectstack[bisectptr + 5];
+ y2 := bisectstack[bisectptr + 6];
+ y3 := bisectstack[bisectptr + 7];
+ s := bisectstack[bisectptr + 8];
+ n := bisectstack[bisectptr + 9];
+ l := bisectstack[bisectptr + 10] {:312}
+ end;
+ 10:
+ null
+ end; {:311} {321:}
+
+
+ procedure dump(var f,g:text;ignore:boolean;addy:integer);
+ { dumps file named f to file named g. if ignore=true
+ then @ sign won't be copied to g.
+ addy=1, means this is "erase" path lower than 300
+ so 0.5 is subtracted from all y-s. if addy=2 it is
+ higher than 300, and 0.5 is added. }
+ var c : char;
+ even_n : boolean;
+ begin
+ reset(f);
+ while not eof(f) do
+ begin
+ even_n := true;
+ read(f,c);
+ case c of
+ ' ' : repeat
+ while c = ' ' do
+ begin
+ write(g,c);
+ read(f,c);
+ end;
+ even_n := not even_n;
+ while (c<>' ') and (c<>'@') do
+ begin
+ write(g,c);
+ read(f,c);
+ end;
+ if even_n then
+ if addy = 2 then write(g,' 0.5 add')
+ else if addy = 1 then write(g,' 0.5 sub');
+ until c = '@';
+ otherwise while c<>'@' do
+ begin
+ write(g,c);
+ read(f,c);
+ end;
+ end; (* case *)
+ readln(f);
+ if ignore then writeln(g)
+ else writeln(g,'@');
+ end;
+ end;
+
+ function checkerase(var efile:text) : integer;
+ { this function checks files that contains "erase" paths.
+ if the path is higher than 300 its value is 2 else 1.
+ this value goes to 'dump' procedure, to determine if
+ 0.5 should be added or substracted. }
+ const limit = 300;
+ var no : real;
+ c : char;
+ begin
+ reset(efile);
+ checkerase := 1;
+ while not eof(efile) do
+ begin
+ read(efile,c);
+ case c of
+ ' ' : begin
+ read(efile,no);
+ read(efile,no);
+ if no > limit then checkerase := 2;
+ end;
+ otherwise ;
+ end;
+ readln(efile);
+ end;
+ end;
+
+
+ procedure doarrange(var f,g:text);
+ { gets file named f whose "fill" and "stroke" paths are mixed
+ together with "erase" paths, and gives back file named g
+ which has "erase" paths on top in order to determine the
+ clip path, and afterward the rest paths. }
+ var c : char;
+ tmp,fills : text;
+ erase_top : integer;
+
+ begin
+ if not erasein then begin
+ writeln(g,'newpath');
+ dump(f,g,true,0);
+ end
+ else begin
+ rewrite(fills);
+ writeln(g,'gsave');
+ writeln(g,'initclip');
+ writeln(g,'newpath');
+ writeln(g,'0 0 moveto');
+ writeln(g,'0 1000 lineto');
+ writeln(g,'1000 1000 lineto');
+ writeln(g,'1000 0 lineto');
+ writeln(g,'0 0 lineto');
+ rewrite(tmp);
+ reset(f);
+ while not eof(f) do
+ begin
+ read(f,c);
+ while (c<>'*') and (c<>'f') and (c<>'e') do
+ begin
+ while c<>'@' do
+ begin
+ write(tmp,c);
+ read(f,c);
+ end;
+ readln(f);
+ writeln(tmp,'@');
+ read(f,c);
+ end;
+ case c of
+ '*' : begin
+ erase_top := checkerase(tmp);
+ dump(tmp,g,true,erase_top);
+ writeln(g,'%erase');
+ end;
+ 'f' : begin
+ dump(tmp,fills,false,0);
+ writeln(fills,'fill@');
+ end;
+ 'e' : begin
+ dump(tmp,fills,false,0);
+ writeln(fills,'eofill@');
+ end;
+ end;
+ rewrite(tmp);
+ readln(f);
+ end;
+ writeln(g,'eoclip');
+ writeln(g,'newpath');
+ dump(fills,g,true,0);
+ writeln(g,'grestore');
+ end;
+ end;
+
+
+
+ procedure print_start;
+ { print_start is called when a new cyclic path is identified.
+ it checks if drawing status was kept, else it changes it
+ respectively. the values are changed when getting into
+ another drawing macro.
+ it is also resets values of lastx0 lasty0 for not being
+ horizonable, because we need a 'moveto' move in the
+ PostScript file in the beginning of the new path. }
+ begin
+ if (internal[14]<>lastyearval) or
+ (internal[15]<>lastmonthval) then
+ begin
+ if lastyearval<>internal[14] then
+ begin
+ if internal[14] = -65536 then
+ begin
+ writeln(f,'eofill@');
+ lastfill := 's';
+ end
+ else begin
+ writeln(f,'*erase@');
+ lastfill := 'e';
+ erasein := true;
+ end;
+ internal[14] := lastyearval ;
+ end
+ else begin
+ internal[15] := lastmonthval ;
+ if lastfill <> 'i' then writeln(f,'fill@');
+ lastfill := 'f';
+ end;
+ end;
+
+ writeln(f,'%new path@');
+ new := true;
+ lastx0 := -99999999; lasty0 := -99999999; { unhorizonable values }
+ end;
+
+ procedure print_end;
+ { print_end is called when end of cyclic path is identified.
+ it takes out the buffer values which were kept there for
+ optimization purposes.
+ In addition it writes 'closepath' in order to close
+ the current cyclic path. }
+ begin
+ if lastwasline then
+ writeln(f,lastx3:6:0,lasty3:6:0,' lineto@');
+ if not new then
+ writeln(f,'closepath@');
+ writeln(f,'%end path@');
+ end;
+
+ procedure init_ps;
+ { this procedure is called, right after entering the main loop
+ in METAFONT, and this is the place to give initial values
+ to variables, to open new files and ... to ask questions }
+ var i:integer;
+ begin
+ rewrite(f);
+ no_of_letter := 0;
+ ascii_on := false;
+ lastfill := 'i'; { i=init , no last fill }
+ erasein := false;
+ foundnew := false; { for new letter defs }
+ minbox[x] := 9999; { initial min. value of x }
+ minbox[y] := 9999; { -----"------- y }
+ maxbox[x] := -9999; { initial max. value of x }
+ maxbox[y] := -9999; { -----"------- y }
+
+ write('Enter name of OUTPUT file: ');
+ i := 1;
+ while not eoln do
+ begin
+ read(fout[i]);
+ i := i+1;
+ end;
+ readln;
+ writeln;
+ write('Are you creating the whole dictionary (y/n) ?');
+ readln(ans);
+ if (ans='y') or (ans='Y') then dict := 1 else dict := 0;
+ writeln;
+ rewrite(g,fout);
+ if dict = 1 then
+ begin
+ writeln(g,'%! Simon font');
+ writeln(g,'%0 serverdict begin exitserver');
+ writeln(g,'/TBuildCharDict 10 dict def');
+ writeln(g,'/SimonFont 10 dict def');
+ writeln(g,'/fudge 110 def');
+ writeln(g,'SimonFont begin');
+ writeln(g,'%%');
+ writeln(g,' /FontType 3 def');
+ writeln(g,' /FontMatrix [0.001 0 0 0.001 0 0] def');
+ writeln(g,' /Encoding 256 array def');
+ writeln(g);
+ writeln(g,' 0 1 255 {Encoding exch /.notdef put} for');
+ writeln(g);
+ writeln(g,'% Character definitions');
+ writeln(g);
+ writeln(g,'/Metrics 130 dict def');
+ writeln(g);
+ writeln(g,'/CharDefs 130 dict def');
+ writeln(g,' ');
+ writeln(g,'CharDefs begin');
+ writeln(g);
+ writeln(g,'/.notdef');
+ writeln(g,' () def');
+ writeln(g);
+ end;
+ end;
+
+
+ procedure makenewdef;
+ { in case of several letters proccessing, while start
+ working on a new letter a few initials should be done }
+ var i : integer;
+ begin
+ rewrite(psfile);
+ lastfill := 'i'; { i=init , no last fill }
+ erasein := false;
+ if dict = 1 then
+ begin
+ lmin_x := 9999;
+ lmax_x := -9999;
+ writeln(g);
+ write(g,'/');
+ for i := 1 to ord(curletter[0]) do
+ if curletter[i]<>' ' then write(g,curletter[i])
+ else write(g,'_');
+ writeln(g);
+ writeln(g,'(');
+ end;
+ end;
+
+
+ procedure closeolddef(sub_n:integer);
+ { after one letter proccessing is finished, it gives the
+ last path the right kind of filling, and then call to
+ doarrange in order to make some order! }
+ begin
+ if internal[15] <> lastmonthval then
+ begin
+ writeln(psfile,'fill@');
+ internal[15] := lastmonthval;
+ end
+ else if internal[14] <> lastyearval then
+ begin
+ if internal[14] = -65536 then writeln(psfile,'eofill@')
+ else begin
+ writeln(psfile,'*erase@');
+ erasein := true;
+ end;
+ internal[14] := lastyearval
+ end
+ else case lastfill of
+ 'e' : begin
+ writeln(psfile,'*erase@');
+ erasein := true;
+ end;
+ 's' : writeln(psfile,'eofill@');
+ 'f','i' : writeln(psfile,'fill@');
+ end;
+ doarrange(psfile,g);
+ if dict = 1 then
+ begin
+ writeln(g,') def');
+ all_metrics[no_of_letter-sub_n] := trunc(lmax_x) + 1;
+ end;
+ end;
+
+
+ procedure tini_ps;
+ { prepares to leave... closing the last path, and in case
+ of creating a dictionary, entering all the necessary
+ information needed by the Postscript program }
+ const lowlimit = 50; { if need transform do it to }
+ highlimit = 900; { the box [50,50,900,900] }
+ fix2one = 1.3; { correction to one point size }
+ var j,jj : integer;
+ c_l : currentletter;
+ begin
+ closeolddef(0);
+ if dict = 1 then
+ begin
+ if (minbox[x] < 0) or (minbox[y] < 0) or
+ (maxbox[x] > 1000) or (maxbox[y] > 1000)
+ then begin
+ needtransform := true;
+ doscale[x] := ((highlimit-lowlimit)/(maxbox[x]-minbox[x]))/fix2one;
+ dotranslate[x] := lowlimit - minbox[x]*doscale[x];
+ doscale[y] := ((highlimit-lowlimit)/(maxbox[y]-minbox[y]))/fix2one;
+ dotranslate[y] := lowlimit - minbox[y]*doscale[y];
+ end
+ else needtransform := false;
+ writeln(f);
+ writeln(f,'end % of CharDefs dictionary');
+ writeln(f);
+ for j := 1 to no_of_letter do
+ begin
+ c_l := all_letters[j];
+ write(f,'Encoding ',all_ascii[j],' /');
+ for jj := 1 to ord(c_l[0]) do
+ if c_l[jj]<>' ' then write(f,c_l[jj])
+ else write(f,'_');
+ writeln(f,' put');
+ end;
+ writeln(f);
+ writeln(f,'Metrics');
+ writeln(f,' begin');
+ for j := 1 to no_of_letter do
+ begin
+ c_l := all_letters[j];
+ write(f,'/');
+ for jj := 1 to ord(c_l[0]) do
+ if c_l[jj]<>' ' then write(f,c_l[jj])
+ else write(f,'_');
+ if needtransform then writeln(f,' 1000 def')
+ else writeln(f,' ',all_metrics[j]-minbox[x]:3:0,' fudge add def');
+ end;
+ writeln(f,'/.notdef 0 def');
+ writeln(f,' end');
+ writeln(f);
+ writeln(f,' /BuildChar');
+ writeln(f,' { TBuildCharDict begin');
+ writeln(f,' %%');
+ writeln(f,' /char exch def');
+ writeln(f,' /fontdict exch def');
+ writeln(f);
+ writeln(f,' /charname fontdict /Encoding get');
+ writeln(f,' char get def');
+ writeln(f,' %%');
+ writeln(f,' /charproc fontdict /CharDefs get');
+ writeln(f,' charname get def');
+ writeln(f,' ');
+ writeln(f,' /charwdth fontdict /Metrics get charname get def');
+ writeln(f,' %%');
+ writeln(f,' gsave');
+ writeln(f,' ',fix2one:3:1,fix2one:10:1,' scale');
+ writeln(f,' 0.2 setflat');
+ writeln(f,' 0.2 setlinewidth');
+ writeln(f,' charwdth 0');
+ writeln(f,' 0 -180');
+ writeln(f,' charwdth 1000');
+ writeln(f,' setcachedevice');
+ if needtransform then
+ begin
+ writeln(f,' ',doscale[x]:7:3,doscale[y]:11:3,' scale');
+ writeln(f,' ',dotranslate[x]:7:3,dotranslate[y]:11:3,' translate');
+ end
+ else writeln(f,' -',minbox[x]:3:0,' fudge add 0 translate');
+ writeln(f,' charproc cvx exec');
+ writeln(f,' grestore');
+ writeln(f,' end');
+ writeln(f,' } def');
+ if needtransform then writeln(f,' /FontBBox [0 0 1000 1000] def')
+ else writeln(f,' /FontBBox [',minbox[x]:3:0,' fudge sub ',minbox[y]:3:0,' ',maxbox[x]:3:0,' ',maxbox[y]:3:0,'] def');
+ writeln(f);
+ writeln(f,' end ');
+ writeln(f);
+ writeln(f,' /Simon SimonFont definefont pop');
+ writeln(f);
+ writeln(f,' /Simon findfont 10 scalefont setfont');
+ writeln(f,' 100 210 moveto () show');
+ writeln(f,' showpage');
+ end;
+ end;
+
+
+
+ procedure auxprintchar(s: ASCIIcode);
+ { puts in string a character whose ascii is s }
+ begin
+ curletter[name_length] := xchr[s];
+ end;
+
+
+ procedure auxprint(s: integer);
+ { equivalent to METAFONT's print, accept changing global
+ variables, and writing is done into a local string.
+ it is also counts the string's length }
+ var
+ j: poolpointer;
+ begin
+ if (s < 0) or (s >= strptr) then
+ s := 131;
+ j := strstart[s];
+ while j < strstart[s + 1] do begin
+ name_length := name_length + 1;
+ auxprintchar(strpool[j]);
+ j := j + 1
+ end
+ end; {:59}
+{60:}
+
+
+ procedure auxslowprint;
+ { equivalent to METAFONT's slowprint, accept changing
+ global variables. }
+ var
+ j: poolpointer;
+ begin
+ if dict = 1 then
+ begin
+ name_length := 0;
+ if (s < 0) or (s >= strptr) then
+ s := 131;
+ j := strstart[s];
+ while j < strstart[s + 1] do begin
+ auxprint(strpool[j]);
+ j := j + 1
+ end;
+ if name_length>0 then
+ begin
+ curletter[0] := chr(name_length);
+ no_of_letter := no_of_letter + 1;
+ all_letters[no_of_letter] := curletter;
+ if foundnew then closeolddef(1);
+ foundnew := true;
+ makenewdef;
+ end;
+ end;
+ end; {:60}
+{62:}
+
+
+procedure auxprintnl;
+begin
+ if dict = 1 then
+ begin
+ name_length := 0;
+ auxprint(s);
+ if name_length>0 then
+ begin
+ curletter[0] := chr(name_length);
+ no_of_letter := no_of_letter + 1;
+ all_letters[no_of_letter] := curletter;
+ if foundnew then closeolddef(1);
+ foundnew := true;
+ makenewdef;
+ end;
+ end;
+end; {:62} {63:}
+
+
+procedure sendascii;
+{ puts in array of ascii values the ascii of letter whose
+ number is no_of_letter. }
+begin
+ all_ascii[no_of_letter] := asc;
+end;